docs: def ParseFileset(self, fileset=None):
      """Process linux system group and gshadow files.
  
      Orchestrates collection of account entries from /etc/group and /etc/gshadow.
      The group and gshadow entries are reconciled and member users are added to
      the entry.
  
      Args:
        fileset: A dict of files mapped from path to an open file.
  
      Yields:
        - A series of Group entries, each of which is populated with group
          [memberships and indications of the shadow state of any group password.
        - A series of anomalies in cases where there are mismatches between group
          and gshadow states.
      """
      # Get relevant shadow attributes.
      gshadow = fileset.get("/etc/gshadow")
      if gshadow:
        self._ParseFile(gshadow, self.ParseGshadowEntry)
      else:
        logging.debug("No /etc/gshadow file.")
      group = fileset.get("/etc/group")
      if group:
        self._ParseFile(group, self.ParseGroupEntry)
      else:
        logging.debug("No /etc/group file.")
      self.ReconcileShadow(self.shadow_store)
      # Identify any anomalous group/shadow entries.
      # This needs to be done before memberships are merged: merged memberships
      # are the *effective* membership regardless of wierd configurations.
      for anom in self.FindAnomalies():
        yield anom
      # Then add shadow group members to the group membership.
      self.MergeMembers()
      for group in itervalues(self.entry):
        yield group