code: def ParseLine(self, line):
      
      kv = line.split(None, 1)
      keyword = kv[0].lower()
      # Safely set the argument string if it wasn't found.
      values = kv[1:] or [""]
      # Then split any parameters that are actually repeated items.
      separators = self._repeated.get(keyword)
      if separators:
        repeated = []
        for v in values:
          repeated.extend(re.split(separators, v))
        # Remove empty matches.
        values = [v for v in repeated if v]
  
      # Now convert the values to the right types.
      if keyword in self._integers:
        values = [int(v) for v in values]
      elif keyword in self._booleans:
        values = [v.lower() in self._true for v in values]
      else:
        values = [v.lower() for v in values]
      # Only repeated arguments should be treated as a list.
      if keyword not in self._repeated:
        values = values[0]
      # Switch sections for new match blocks.
      if keyword == "match":
        self._NewMatchSection(values)
      # If it's an alias, resolve it.
      if keyword in self._aliases:
        keyword = self._aliases[keyword]
      # Add the keyword/values to the section.
      self.processor(keyword, values)
docs: Extracts keyword/value settings from the sshd config.
  
      The keyword is always the first string item.
      Values are the remainder of the string. In cases where an sshd config
      allows multiple values, these are split according to whatever separator(s)
      sshd_config permits for that value.
  
      Keywords and values are normalized. Keywords are converted to lowercase.
      Values are converted into integers, booleans or strings. Strings are always
      lowercased.
  
      Args:
        line: A line of the configuration file.