code: def classifyGlyphs(unicodeFunc, cmap, gsub=None):
      
      glyphSets = {}
      neutralGlyphs = set()
      for uv, glyphName in cmap.items():
          key = unicodeFunc(uv)
          if key is None:
              neutralGlyphs.add(glyphName)
          else:
              glyphSets.setdefault(key, set()).add(glyphName)
  
      if gsub is not None:
          if neutralGlyphs:
              closeGlyphsOverGSUB(gsub, neutralGlyphs)
  
          for glyphs in glyphSets.values():
              s = glyphs | neutralGlyphs
              closeGlyphsOverGSUB(gsub, s)
              glyphs.update(s - neutralGlyphs)
  
      return glyphSets
docs: 'unicodeFunc' is a callable that takes a Unicode codepoint and
      returns a string denoting some Unicode property associated with the
      given character (or None if a character is considered 'neutral').
      'cmap' is a dictionary mapping Unicode codepoints to glyph names.
      'gsub' is an (optional) fonttools GSUB table object, used to find all
      the glyphs that are "reachable" via substitutions from the initial
      sets of glyphs defined in the cmap.
  
      Returns a dictionary of glyph sets associated with the given Unicode
      properties.