diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8078821
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+# Dependency
+node_modules
+
+# Settings
+.settings
+.vscode
+
+# Build artifacts
+.build
+dist
+
+# Platform specified files
+.DS_store
+
+bin/nerdfont/bin/scripts/name_parser/__pycache__/*
+bin/nerdfont/bin/scripts/name_parser/log
diff --git a/IOSEVKA-Custom-NF/nerdfont.bat b/IOSEVKA-Custom-NF/nerdfont.bat
index 8f1cec3..83c9701 100644
--- a/IOSEVKA-Custom-NF/nerdfont.bat
+++ b/IOSEVKA-Custom-NF/nerdfont.bat
@@ -1,26 +1,35 @@
+:: Copyright
+:: Saumyajyoti Mukherjee
+:: 2024
+
+
 @echo off
 setlocal
 ::  prerequisites in comments
 :: tested in Windows11 setup
 
-:: install nodejs, ttfautohint, fontforge python 3 as mentioned in 
+:: install nodejs, fontforge python 3 as mentioned in 
 :: - https://github.com/be5invis/Iosevka/blob/main/doc/custom-build.md#building
-:: - https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/FontPatcher.zip
 
-SET IOSEVKA_PATH="D:\SOURCE\github\Iosevka"
-SET "PATH=C:\Program Files (x86)\FontForgeBuilds\bin;%PATH%"
+SET IOSEVKA_PATH="%temp%\Iosevka"
+SET "PATH=C:\Program Files (x86)\FontForgeBuilds\bin;%~dp0\..\bin;%PATH%"
 SET FFPYTHON_EXE="C:\Program Files (x86)\FontForgeBuilds\bin\ffpython.exe"
-SET FONTVERNUM=9
+SET FONTVERNUM=10
 SET OUTPATH="D:\Font\Miosevka%FONTVERNUM%"
-:: SET NERDFONT_PATCHER_PATH [ download from path above]
-SET NERDFONT_PATCHER_PATH="D:\SETUP.tmp\nerdfont\font-patcher"
+SET NERDFONT_PATCHER_PATH="%~dp0\..\bin\nerdfont\font-patcher"
 SET FONTVER=Miosevka%FONTVERNUM%
 echo =======================================================
-echo Sync Iosevka
-cd /d %IOSEVKA_PATH%
-rmdir /S /Q "%IOSEVKA_PATH%\dist"
 
-git pull --depth=1
+if exist %IOSEVKA_PATH%\ (
+  echo Sync Iosevka 
+  cd /d %IOSEVKA_PATH%
+  rmdir /S /Q "%IOSEVKA_PATH%\dist"
+  git pull --depth=1
+) else (
+  echo Clone Iosevka
+  git clone https://github.com/be5invis/Iosevka.git %IOSEVKA_PATH% --depth=1
+  cd /d %IOSEVKA_PATH%
+)
 
 call npm install
 echo =======================================================
@@ -47,11 +56,21 @@ echo patch fonts
 %FFPYTHON_EXE% %NERDFONT_PATCHER_PATH% -c "%IOSEVKA_PATH%\dist\riosevka\ttf\riosevka-boldItalic.ttf"
 echo =======================================================
 echo Copy Files
-copy /Y %~dp0\..\license.* %OUTPATH%
+copy /Y %~dp0\..\*license.* %OUTPATH%
 copy /Y "%IOSEVKA_PATH%\dist\miosevka\ttf\*.ttf" %OUTPATH%
 copy /Y "%IOSEVKA_PATH%\dist\riosevka\ttf\*.ttf" %OUTPATH%
 cd ..
 echo create %FONTVER%.zip 
 tar.exe -a -c -f "%FONTVER%.zip" %OUTPATH%
 
+REM :PROMPT
+REM SET /P INSTALL=Install Fonts (yes/[no])?
+REM IF /I "%INSTALL%" NEQ "yes" GOTO END
+
+REM echo installing fonts
+REM cd /d %OUTPATH%
+REM start FontReg.exe /copy
+REM cd ..
+REM :END
+
 explorer .
diff --git a/LICENSE.md b/IOSEVKA-LICENSE.md
similarity index 100%
rename from LICENSE.md
rename to IOSEVKA-LICENSE.md
diff --git a/LICENSE.txt b/NERDFONT-LICENSE.txt
similarity index 100%
rename from LICENSE.txt
rename to NERDFONT-LICENSE.txt
diff --git a/README.md b/README.md
index c63c061..daa3f0d 100644
--- a/README.md
+++ b/README.md
@@ -16,5 +16,7 @@ Added
 ![Sample Miosevka](Miosevka-Sample.png)
 
 ## License
-- Nerdfont License : See License.txt
-- Iosevka License : See License.md
+- Nerdfont License : See NERDFONT-License.txt
+- Iosevka License : See IOSEVKA-License.md
+- TTF Autohint License: See TTFAH-LICENSE.txt
+
diff --git a/TTFAH-LICENSE.txt b/TTFAH-LICENSE.txt
new file mode 100644
index 0000000..226ab96
--- /dev/null
+++ b/TTFAH-LICENSE.txt
@@ -0,0 +1,3 @@
+The ttfautohint library contains a copy of FreeType's ā€˜autofitā€™ module, reformatted and using a different function prefix, and with slight extensions for hooks into hinting actions. It therefore inherits the same dual-licensing as FreeType; you can choose between the GNU Public License (GPL) Version 2 and the FreeType License (FTL).
+
+v 1.8.4
\ No newline at end of file
diff --git a/bin/FontReg.exe b/bin/FontReg.exe
new file mode 100644
index 0000000..f466f6f
Binary files /dev/null and b/bin/FontReg.exe differ
diff --git a/bin/nerdfont/bin/scripts/name_parser/FontnameParser.py b/bin/nerdfont/bin/scripts/name_parser/FontnameParser.py
new file mode 100644
index 0000000..dc279fd
--- /dev/null
+++ b/bin/nerdfont/bin/scripts/name_parser/FontnameParser.py
@@ -0,0 +1,384 @@
+#!/usr/bin/env python
+# coding=utf8
+
+import re
+from FontnameTools import FontnameTools
+
+class FontnameParser:
+    """Parse a font name and generate all kinds of names"""
+
+    def __init__(self, fontname, logger):
+        """Parse a fontname and store the results"""
+        self.parse_ok = False
+        self.use_short_families = (False, False, False) # ( camelcase name, short styles, aggressive )
+        self.keep_regular_in_family = None # None = auto, True, False
+        self.suppress_preferred_if_identical = True
+        self.family_suff = ''
+        self.ps_fontname_suff = ''
+        self.short_family_suff = ''
+        self.name_subst = []
+        [ self.parse_ok, self._basename, self.weight_token, self.style_token, self.other_token, self._rest ] = FontnameTools.parse_font_name(fontname)
+        self.basename = self._basename
+        self.rest = self._rest
+        self.add_name_substitution_table(FontnameTools.SIL_TABLE)
+        self.rename_oblique = True
+        self.logger = logger
+
+    def _make_ps_name(self, n, is_family):
+        """Helper to limit font name length in PS names"""
+        fam = 'family ' if is_family else ''
+        limit = 31 if is_family else 63
+        if len(n) <= limit:
+            return n
+        r = re.search('(.*)(-.*)', n)
+        if not r:
+            new_n = n[:limit]
+        else:
+            q = limit - len(r.groups()[1])
+            if q < 1:
+                q = 1
+                self.logger.error('====-< Shortening too long PS {}name: Garbage warning'. format(fam))
+            new_n = r.groups()[0][:q] + r.groups()[1]
+        if new_n != n:
+            self.logger.error('====-< Shortening too long PS {}name: {} -> {}'.format(fam, n, new_n))
+        return new_n
+
+    def _shortened_name(self):
+        """Return a blank free basename-rest combination"""
+        if not self.use_short_families[0]:
+            return (self.basename, self.rest)
+        else:
+            return (FontnameTools.concat(self.basename, self.rest).replace(' ', ''), '')
+
+    def set_keep_regular_in_family(self, keep):
+        """Familyname may contain 'Regular' where it should normally be suppressed"""
+        self.keep_regular_in_family = keep
+
+    def set_expect_no_italic(self, noitalic):
+        """Prevents rewriting Oblique as family name part"""
+        # To prevent naming clashes usually Oblique is moved out in the family name
+        # because some fonts have Italic and Oblique, and we want to generate pure
+        # RIBBI families in ID1/2.
+        # But some fonts have Oblique instead of Italic, here the prevential movement
+        # is not needed, or rather contraproductive. This can not be detected on a
+        # font file level but needs to be specified per family from the outside.
+        # Returns true if setting was successful.
+        if 'Italic' in self.style_token:
+            self.rename_oblique = True
+            return not noitalic
+        self.rename_oblique = not noitalic
+        return True
+
+    def set_suppress_preferred(self, suppress):
+        """Suppress ID16/17 if it is identical to ID1/2 (True is default)"""
+        self.suppress_preferred_if_identical = suppress
+
+    def inject_suffix(self, family, ps_fontname, short_family):
+        """Add a custom additonal string that shows up in the resulting names"""
+        self.family_suff = family.strip()
+        self.ps_fontname_suff = ps_fontname.replace(' ', '')
+        self.short_family_suff = short_family.strip()
+        return self
+
+    def enable_short_families(self, camelcase_name, prefix, aggressive):
+        """Enable short styles in Family when (original) font name starts with prefix; enable CamelCase basename in (Typog.) Family"""
+        # camelcase_name is boolean
+        # prefix is either a string or False/True
+        if isinstance(prefix, str):
+            prefix = self._basename.startswith(prefix)
+        self.use_short_families = ( camelcase_name, prefix, aggressive )
+        return self
+
+    def add_name_substitution_table(self, table):
+        """Have some fonts renamed, takes list of tuples (regex, replacement)"""
+        # The regex will be anchored to name begin and used case insensitive
+        # Replacement can have regex matches, mind to catch the correct source case
+        self.name_subst = table
+        self.basename = self._basename
+        self.rest = self._rest
+        for regex, replacement in self.name_subst:
+            base_and_rest = self.basename + (' ' + self.rest if len(self.rest) else '')
+            m = re.match(regex, base_and_rest, re.IGNORECASE)
+            if not m:
+                continue
+            i = len(self.basename) - len(m.group(0))
+            if i < 0:
+                self.basename = m.expand(replacement).rstrip()
+                self.rest = self.rest[-(i+1):].lstrip()
+            else:
+                self.basename = m.expand(replacement) + self.basename[len(m.group(0)):]
+        return self
+
+    def drop_for_powerline(self):
+        """Remove 'for Powerline' from all names (can not be undone)"""
+        if 'Powerline' in self.other_token:
+            idx = self.other_token.index('Powerline')
+            self.other_token.pop(idx)
+            if idx > 0 and self.other_token[idx - 1] == 'For':
+                self.other_token.pop(idx - 1)
+        self._basename = re.sub(r'(\b|for\s?)?powerline\b', '', self._basename, 1, re.IGNORECASE).strip()
+        self.add_name_substitution_table(self.name_subst) # re-evaluate
+        return self
+
+    ### Following the creation of the name parts:
+    #
+    # Relevant websites
+    # https://www.fonttutorials.com/how-to-name-font-family/
+    # https://docs.microsoft.com/en-us/typography/opentype/spec/name#name-ids
+    # https://docs.microsoft.com/en-us/typography/opentype/spec/os2#fss
+    # https://docs.microsoft.com/en-us/typography/opentype/spec/head#macstyle
+
+    # Example (mind that they group 'semibold' as classic-group-of-4 Bold, while we will always only take bold as Bold):
+    # Adobe Caslon Pro Regular            ID1: Adobe Caslon Pro         ID2: Regular
+    # Adobe Caslon Pro Italic             ID1: Adobe Caslon Pro         ID2: Italic
+    # Adobe Caslon Pro Semibold           ID1: Adobe Caslon Pro         ID2: Bold           ID16: Adobe Caslon Pro    ID17: Semibold
+    # Adobe Caslon Pro Semibold Italic    ID1: Adobe Caslon Pro         ID2: Bold Italic    ID16: Adobe Caslon Pro    ID17: Semibold Italic
+    # Adobe Caslon Pro Bold               ID1: Adobe Caslon Pro Bold    ID2: Regular        ID16: Adobe Caslon Pro    ID17: Bold
+    # Adobe Caslon Pro Bold Italic        ID1: Adobe Caslon Pro Bold    ID2: Italic         ID16: Adobe Caslon Pro    ID17: Bold Italic
+
+    # fontname === preferred_family + preferred_styles
+    # fontname === family + subfamily
+    #
+    # familybase = basename + rest + other (+ suffix)
+    # ID 1/2 just have self.style in the subfamily, all the rest ends up in the family
+    # ID 16/17 have self.style and self.weight in the subfamily, the rest ends up in the family
+
+    def fullname(self):
+        """Get the SFNT Fullname (ID 4)"""
+        styles = self.style_token
+        weights = self.weight_token
+        if self.keep_regular_in_family == None:
+            keep_regular = FontnameTools.is_keep_regular(self._basename + ' ' + self._rest)
+        else:
+            keep_regular = self.keep_regular_in_family
+        if ('Regular' in styles
+                and (not keep_regular
+                    or FontnameTools.check_contains_weight(self.weight_token))): # This is actually a malformed font name
+            styles = list(self.style_token)
+            styles.remove('Regular')
+        # For naming purposes we want Oblique to be part of the styles
+        (weights, styles) = FontnameTools.make_oblique_style(weights, styles)
+        (name, rest) = self._shortened_name()
+        if self.use_short_families[1]:
+            [ weights, styles ] = FontnameTools.short_styles([ weights, styles ], self.use_short_families[2])
+        return FontnameTools.concat(name, rest, self.other_token, self.short_family_suff, weights, styles)
+
+    def psname(self):
+        """Get the SFNT PostScriptName (ID 6)"""
+        # This is almost self.family() + '-' + self.subfamily()
+        (name, rest) = self._shortened_name()
+        styles = self.style_token
+        weights = self.weight_token
+        if self.use_short_families[1]:
+            styles = FontnameTools.short_styles(styles, self.use_short_families[2])
+            weights = FontnameTools.short_styles(weights, self.use_short_families[2])
+        fam = FontnameTools.camel_casify(FontnameTools.concat(name, rest, self.other_token, self.ps_fontname_suff))
+        sub = FontnameTools.camel_casify(FontnameTools.concat(weights, styles))
+        if len(sub) > 0:
+            sub = '-' + sub
+        fam = FontnameTools.postscript_char_filter(fam)
+        sub = FontnameTools.postscript_char_filter(sub)
+        return self._make_ps_name(fam + sub, False)
+
+    def preferred_family(self, short_alternative = False):
+        """Get the SFNT Preferred Familyname (ID 16)"""
+        # When short_alternative we get the short named alternative needed for some Windows applications
+        (name, rest) = self._shortened_name()
+        if short_alternative:
+            # Try to come up with a shortened family name
+            # This is in principle the code from family() but without including weights
+            # because weights shall still end up in ID 17
+            other = self.other_token
+            if self.use_short_families[1]:
+                [ other ] = FontnameTools.short_styles([ other ], self.use_short_families[2])
+            pfn = FontnameTools.concat(name, rest, other, self.short_family_suff)
+            # Only return something if it is different to our standard behavior
+            if pfn == self.preferred_family(False):
+                return ''
+            return pfn
+        pfn = FontnameTools.concat(name, rest, self.other_token, self.family_suff)
+        if self.suppress_preferred_if_identical and pfn == self.family():
+            # Do not set if identical to ID 1
+            return ''
+        return pfn
+
+    def preferred_styles(self, _ = False):
+        """Get the SFNT Preferred Styles (ID 17)"""
+        styles = self.style_token
+        weights = self.weight_token
+        # For naming purposes we want Oblique to be part of the styles
+        (weights, styles) = FontnameTools.make_oblique_style(weights, styles)
+        pfs = FontnameTools.concat(weights, styles)
+        if self.suppress_preferred_if_identical and pfs == self.subfamily():
+            # Do not set if identical to ID 2
+            return ''
+        return pfs
+
+    def family(self):
+        """Get the SFNT Familyname (ID 1)"""
+        # We use the short form of the styles to save on number of chars
+        (name, rest) = self._shortened_name()
+        other = self.other_token
+        weights = self.weight_token
+        aggressive = self.use_short_families[2]
+        if not self.rename_oblique:
+            (weights, styles) = FontnameTools.make_oblique_style(weights, [])
+        if self.use_short_families[1]:
+            [ other, weights ] = FontnameTools.short_styles([ other, weights ], aggressive)
+        weights = [ w if w != 'Oblique' else 'Obl' for w in weights ]
+        return FontnameTools.concat(name, rest, other, self.short_family_suff, weights)
+
+    def subfamily(self):
+        """Get the SFNT SubFamily (ID 2)"""
+        styles = self.style_token
+        weights = self.weight_token
+        if not self.rename_oblique:
+            (weights, styles) = FontnameTools.make_oblique_style(weights, styles)
+        if len(styles) == 0:
+            if 'Oblique' in weights:
+                return FontnameTools.concat(styles, 'Italic')
+            return 'Regular'
+        if 'Oblique' in weights and not 'Italic' in styles:
+                return FontnameTools.concat(styles, 'Italic')
+        return FontnameTools.concat(styles)
+
+    def ps_familyname(self):
+        """Get the PS Familyname"""
+        fam = self.preferred_family(False)
+        if len(fam) < 1:
+            fam = self.family()
+        return self._make_ps_name(fam, True)
+
+    def macstyle(self, style):
+        """Modify a given macStyle value for current name, just bits 0 and 1 touched"""
+        b = style & (~3)
+        b |= 1 if 'Bold' in self.style_token else 0
+        b |= 2 if 'Italic' in self.style_token else 0
+        return b
+
+    def fs_selection(self, fs):
+        """Modify a given fsSelection value for current name, bits 0, 5, 6, 8, 9 touched"""
+        ITALIC = 1 << 0; BOLD = 1 << 5; REGULAR = 1 << 6; WWS = 1 << 8; OBLIQUE = 1 << 9
+        b = fs & (~(ITALIC | BOLD | REGULAR | WWS | OBLIQUE))
+        if 'Bold' in self.style_token:
+            b |= BOLD
+        # Ignore Italic if we have Oblique
+        if 'Oblique' in self.weight_token:
+            b |= OBLIQUE
+            if not self.rename_oblique:
+                # If we have no dedicated italic, than oblique = italic
+                b |= ITALIC
+        elif 'Italic' in self.style_token:
+            b |= ITALIC
+        # Regular is just the basic weight
+        if len(self.weight_token) == 0 and not b & (ITALIC | BOLD | OBLIQUE):
+            b |= REGULAR
+        b |= WWS # We assert this by our naming process
+        return b
+
+    def checklen(self, max_len, entry_id, name):
+        """Check the length of a name string and report violations"""
+        if len(name) <= max_len:
+            self.logger.debug('=====> {:18} ok       ({:2} <={:2}): {}'.format(entry_id, len(name), max_len, name))
+        else:
+            self.logger.error('====-< {:18} too long ({:2} > {:2}): {}'.format(entry_id, len(name), max_len, name))
+        return name
+
+    def check_weights(self, font):
+        """ Check weight metadata for consistency """
+        # Some weights are hidden in styles
+        ignore_token = list(FontnameTools.known_widths) + list(FontnameTools.known_slopes)
+        ignore_token += [ m + s
+                        for s in list(FontnameTools.known_widths)
+                        for m in list(FontnameTools.known_modifiers) ]
+        restored_weight_token = [ w for w in self.style_token + self.weight_token if w not in ignore_token ]
+        weight = ''.join(restored_weight_token)
+        os2_weight = font.os2_weight
+        ps_weight = FontnameTools.weight_string_to_number(font.weight)
+        name_weight = FontnameTools.weight_string_to_number(weight)
+        weightproblem = False
+        if ps_weight is None:
+            self.logger.warn('Can not parse PS-weight: {}'.format(font.weight))
+            weightproblem = True
+        if name_weight is None:
+            self.logger.warn('Can not parse name for weight: {}'.format(weight))
+            weightproblem = True
+        if weightproblem or abs(os2_weight - ps_weight) > 50 or abs(os2_weight - name_weight) > 50:
+            self.logger.warning('Possible problem with the weight metadata detected, check with --debug')
+        self.logger.debug('Weight approximations: OS2/PS/Name: {}/{}/{} (from {}/\'{}\'/\'{}\')'.format(
+            os2_weight, ps_weight, name_weight,
+            font.os2_weight, font.weight, weight))
+
+    def pfam_to_sfnt(self, name_function, entry, message, maxnum = 2):
+        """Prepare SFNT entries for short and long form as two different languages"""
+        languages = [ 'English (US)', 'English (British)' ]
+        names = [ name_function(False), name_function(True) ]
+        ret = [ ]
+        for i in range(maxnum):
+            if len(names[i]):
+                ret += [( languages[i], entry, self.checklen(31, message, names[i]) )]
+            else:
+                break
+        return ret
+
+    def rename_font(self, font):
+        """Rename the font to include all information we found (font is fontforge font object)"""
+        font.fondname = None
+        font.fontname = self.psname()
+        font.fullname = self.fullname()
+        font.familyname = self.ps_familyname()
+        self.check_weights(font)
+
+        # We have to work around several issues in fontforge:
+        #
+        # a. Remove some entries from SFNT table; fontforge has no API function for that
+        #
+        # b. Fontforge does not allow to set SubFamily (and other) to any value:
+        #
+        #    Fontforge lets you set any value, unless it is the default value. If it
+        #    is the default value it does not set anything. It also does not remove
+        #    a previously existing non-default value. Why it is done this way is
+        #    unclear:
+        #      fontforge/python.c SetSFNTName() line 11431
+        #        return( 1 ); /* If they set it to the default, there's nothing to do */
+        #
+        #    Then is the question: What is the default? It is taken from the
+        #    currently set fontname (??!). The fontname is parsed and everything
+        #    behind the dash is the default SubFamily:
+        #      fontforge/tottf.c DefaultTTFEnglishNames()
+        #      fontforge/splinefont.c _GetModifiers()
+        #
+        #    To fix this without touching Fontforge we need to set the SubFamily
+        #    directly in the SFNT table:
+        #
+        # c. Fontforge has the bug that it allows to write empty-string to a SFNT field
+        #    and it is actually embedded as empty string, but empty strings are not
+        #    shown if you query the sfnt_names *rolleyes*
+
+        version_tag = ''
+        sfnt_list = []
+        TO_DEL = ['Family', 'SubFamily', 'Fullname', 'PostScriptName', 'Preferred Family',
+                'Preferred Styles', 'Compatible Full', 'WWS Family', 'WWS Subfamily',
+                'UniqueID', 'CID findfont Name']
+        # Remove these entries in all languages and add (at least the vital ones) some
+        # back, but only as 'English (US)'. This makes sure we do not leave contradicting
+        # names over different languages.
+        for l, k, v in list(font.sfnt_names):
+            if not k in TO_DEL and l == 'English (US)':
+                sfnt_list += [( l, k, v )]
+                if k == 'Version':
+                    version_tag = ' ' + v.split()[-1]
+
+        sfnt_list += [( 'English (US)', 'Family', self.checklen(31, 'Family (ID 1)', self.family()) )] # 1
+        sfnt_list += [( 'English (US)', 'SubFamily', self.checklen(31, 'SubFamily (ID 2)', self.subfamily()) )] # 2
+        sfnt_list += [( 'English (US)', 'UniqueID', self.fullname() + version_tag )] # 3
+        sfnt_list += [( 'English (US)', 'Fullname', self.checklen(63, 'Fullname (ID 4)', self.fullname()) )] # 4
+        sfnt_list += [( 'English (US)', 'PostScriptName', self.checklen(63, 'PSN (ID 6)', self.psname()) )] # 6
+        sfnt_plus  = self.pfam_to_sfnt(self.preferred_family, 'Preferred Family', 'PrefFamily (ID 16)') # 16
+        sfnt_plus += self.pfam_to_sfnt(self.preferred_styles, 'Preferred Styles', 'PrefStyles (ID 17)', len(sfnt_plus)) # 17
+        sfnt_list += sfnt_plus
+
+        font.sfnt_names = tuple(sfnt_list)
+
+        font.macstyle = self.macstyle(0)
+        font.os2_stylemap = self.fs_selection(0)
diff --git a/bin/nerdfont/bin/scripts/name_parser/FontnameTools.py b/bin/nerdfont/bin/scripts/name_parser/FontnameTools.py
new file mode 100644
index 0000000..5537bfa
--- /dev/null
+++ b/bin/nerdfont/bin/scripts/name_parser/FontnameTools.py
@@ -0,0 +1,448 @@
+#!/usr/bin/env python
+# coding=utf8
+
+import re
+import sys
+
+class FontnameTools:
+    """Deconstruct a fontname to get standardized name parts"""
+
+    @staticmethod
+    def front_upper(word):
+        """Capitalize a string (but keep case of subsequent chars)"""
+        return word[:1].upper() + word[1:]
+
+    @staticmethod
+    def camel_casify(word):
+        """Remove blanks and use CamelCase for the new word"""
+        return ''.join(map(FontnameTools.front_upper, word.split(' ')))
+
+    @staticmethod
+    def camel_explode(word):
+        """Explode CamelCase -> Camel Case"""
+        # But do not explode "JetBrains" etc at string start...
+        excludes = [
+                'JetBrains',
+                'DejaVu',
+                'OpenDyslexicAlta',
+                'OpenDyslexicMono',
+                'OpenDyslexic',
+                'DaddyTimeMono',
+                'InconsolataGo',
+                'ProFontWindows',
+                'ProFont',
+                'ProggyClean',
+                ]
+        m = re.match('(' + '|'.join(excludes) + ')(.*)', word)
+        (prefix, word) = m.group(1,2) if m != None else ('', word)
+        if len(word) == 0:
+            return prefix
+        parts = re.split('(?<=[a-z0-9])(?=[A-Z])', word)
+        if len(prefix):
+            parts.insert(0, prefix)
+        return ' '.join(parts)
+
+    @staticmethod
+    def drop_empty(l):
+        """Remove empty strings from list of strings"""
+        return [x for x in l if len(x) > 0]
+
+    @staticmethod
+    def concat(*all_things):
+        """Flatten list of (strings or lists of strings) to a blank-separated string"""
+        all = []
+        for thing in all_things:
+            if type(thing) is not list:
+                all.append(thing)
+            else:
+                all += thing
+        return ' '.join(FontnameTools.drop_empty(all))
+
+    @staticmethod
+    def unify_style_names(style_name):
+        """Substitude some known token with standard wording"""
+        known_names = {
+            # Source of the table is the current sourcefonts
+            # Left side needs to be lower case
+            'book':         '',
+            'ce':           'CE',
+            'normal':       'Regular',
+        }
+        return known_names.get(style_name.lower(), style_name)
+
+    @staticmethod
+    def find_in_dicts(key, dicts):
+        """Find an entry in a list of dicts, return entry and in which list it was"""
+        for i, d in enumerate(dicts):
+            if key in d:
+                return ( d[key], i )
+        return (None, 0)
+
+    @staticmethod
+    def get_shorten_form_idx(aggressive, prefix, form_if_prefixed):
+        """Get the tuple index of known_* data tables"""
+        if aggressive:
+            return 0
+        if len(prefix):
+            return form_if_prefixed
+        return 1
+
+    @staticmethod
+    def shorten_style_name(name, aggressive):
+        """Substitude some known styles to short form"""
+        # If aggressive is False create the mild short form
+        # aggressive == True: Always use first form of everything
+        # aggressive == False:
+        #               - has no modifier: use the second form
+        #               - has modifier: use second form of mod plus first form of weights2
+        #               - has modifier: use second form of mod plus second form of widths
+        name_rest = name
+        name_pre = ''
+        form = FontnameTools.get_shorten_form_idx(aggressive, '', 0)
+        for mod in FontnameTools.known_modifiers:
+            if name.startswith(mod) and len(name) > len(mod): # Second condition specifically for 'Demi'
+                name_pre = FontnameTools.known_modifiers[mod][form]
+                name_rest = name[len(mod):]
+                break
+        subst, i = FontnameTools.find_in_dicts(name_rest, [ FontnameTools.known_weights2, FontnameTools.known_widths ])
+        form = FontnameTools.get_shorten_form_idx(aggressive, name_pre, i)
+        if isinstance(subst, tuple):
+            return name_pre + subst[form]
+        if not len(name_pre):
+            # The following sets do not allow modifiers
+            subst, _ = FontnameTools.find_in_dicts(name_rest, [ FontnameTools.known_weights1, FontnameTools.known_slopes ])
+            if isinstance(subst, tuple):
+                return subst[form]
+        return name
+
+    @staticmethod
+    def short_styles(lists, aggressive):
+        """Shorten all style names in a list or a list of lists"""
+        if not len(lists) or not isinstance(lists[0], list):
+            return list(map(lambda x: FontnameTools.shorten_style_name(x, aggressive), lists))
+        return [ list(map(lambda x: FontnameTools.shorten_style_name(x, aggressive), styles)) for styles in lists ]
+
+    @staticmethod
+    def make_oblique_style(weights, styles):
+        """Move "Oblique" from weights to styles for font naming purposes"""
+        if 'Oblique' in weights:
+            weights = list(weights)
+            weights.remove('Oblique')
+            styles = list(styles)
+            styles.append('Oblique')
+        return (weights, styles)
+
+    @staticmethod
+    def get_name_token(name, tokens):
+        """Try to find any case insensitive token from tokens in the name, return tuple with found token-list and rest"""
+        # The default mode (allow_regex_token = False) will try to find any verbatim string in the
+        # tokens list (case insensitive matching) and give that tokens list item back with
+        # unchanged case (i.e. [ 'Bold' ] will match "bold" and return it as [ 'Bold', ]
+        # In the regex mode (allow_regex_token = True) it will use the tokens elements as
+        # regexes and return the original (i.e. from name) case.
+        #
+        # Token are always used in a regex and may not capture, use non capturing
+        # grouping if needed (?: ... )
+        lower_tokens = [ t.lower() for t in tokens ]
+        not_matched = ""
+        all_tokens = []
+        j = 1
+        token_regex = '|'.join(tokens)
+        # Allow a dash between CamelCase token word parts, i.e. Camel-Case
+        # This allows for styles like Extra-Bold
+        token_regex = re.sub(r'(?<=[a-z])(?=[A-Z])', '-?', token_regex)
+        regex = re.compile('(.*?)(' + token_regex + ')(.*)', re.IGNORECASE)
+        while j:
+            j = regex.match(name)
+            if not j:
+                break
+            if len(j.groups()) != 3:
+                sys.exit('Malformed regex in FontnameTools.get_name_token()')
+            not_matched += ' ' + j.groups()[0] # Blanc prevents unwanted concatenation of unmatched substrings
+            tok = j.groups()[1].lower()
+            tok = tok.replace('-', '') # Remove dashes between CamelCase token words
+            if tok in lower_tokens:
+                tok = tokens[lower_tokens.index(tok)]
+            tok = FontnameTools.unify_style_names(tok)
+            if len(tok):
+                all_tokens.append(tok)
+            name = j.groups()[2] # Recurse rest
+        not_matched += ' ' + name
+        return ( not_matched.strip(), all_tokens )
+
+    @staticmethod
+    def postscript_char_filter(name):
+        """Filter out characters that are not allowed in Postscript names"""
+        # The name string must be restricted to the printable ASCII subset, codes 33 to 126,
+        # except for the 10 characters '[', ']', '(', ')', '{', '}', '<', '>', '/', '%'
+        out = ''
+        for c in name:
+            if c in '[](){}<>/%' or ord(c) < 33 or ord(c) > 126:
+                continue
+            out += c
+        return out
+
+    SIL_TABLE = [
+        ( '(a)nka/(c)oder',             r'\1na\2onder' ),
+        ( '(a)nonymous',                r'\1nonymice' ),
+        ( '(b)itstream( ?)(v)era( ?sans ?mono)?', r'\1itstrom\2Wera' ),
+        ( '(c)ascadia( ?)(c)ode',       r'\1askaydia\2\3ove' ),
+        ( '(c)ascadia( ?)(m)ono',       r'\1askaydia\2\3ono' ),
+        ( 'Gohufont',                   r'GohuFont'), # Correct to CamelCase
+        ( '(h)ermit',                   r'\1urmit' ),
+        ( '(h)asklig',                  r'\1asklug' ),
+        ( 'iA([- ]?)writer',            r'iM\1Writing' ),
+        ( 'IBM[- ]?plex',               r'Blex' ), # We do not keep the case here
+        ( '(i)ntel( ?)(o)ne',           r'\1ntone' ),
+        ( '(l)iberation',               r'\1iteration' ),
+        ( '(m)onaspace',                r'\1onaspice' ),
+        ( '(m)( ?)plus',                r'\1+'), # Added this, because they use a plus symbol :->
+        ( '(s)hare',                    r'\1hure' ),
+        ( '(s)ource',                   r'\1auce' ),
+        ( '(t)erminus',                 r'\1erminess' ),
+        # Noone cares that font names starting with a digit are forbidden:
+        ( 'IBM 3270',                   r'3270'), # for historical reasons and 'IBM' is a TM or something
+        # Some name parts that are too long for us
+        ( '^(?!ubuntu)(.*sans ?m)ono',  r'\1'), # Various SomenameSansMono fonts
+        ( '(.*code ?lat)in',            r'\1'), # for 'M PLUS Code Latin'
+        ( '(b)ig( ?)(b)lue( ?)(t)erminal', r'\1ig\3lue\5erm'), # Shorten BigBlueTerminal
+        ( '(.*)437TT',                  r'\g<1>437'), # Shorten BigBlueTerminal 437 TT even further
+        ( '(.*dyslexic ?alt)a',         r'\1'), # Open Dyslexic Alta -> Open Dyslexic Alt
+        ( '(.*dyslexic ?m)ono',         r'\1'), # Open Dyslexic Mono -> Open Dyslexic M
+        ( '(overpass ?m)ono',           r'\1'), # Overpass Mono -> Overpass M
+        ( '(proggyclean) ?tt',          r'\1'), # Remove TT from ProggyClean
+        ( '(terminess) ?\(ttf\)',       r'\1'), # Remove TTF from Terminus (after renamed to Terminess)
+        ( '(.*ne)on',                   r'\1'), # Monaspace shorten face name
+        ( '(.*ar)gon',                  r'\1'), # Monaspace shorten face name
+        ( '(.*kr)ypton',                r'\1'), # Monaspace shorten face name
+        ( '(.*xe)non',                  r'\1'), # Monaspace shorten face name
+        ( '(.*r)adon',                  r'\1n'), # Monaspace shorten face name
+        ( '(im ?writing ?q)uattro',     r'\1uat'), # Rename iM Writing Quattro to Quat
+        ( '(im ?writing ?(mono|duo|quat)) ?s', r'\1'), # Remove S from all iM Writing styles
+        ( '(r)ec( ?)(m)ono( ?)(s)emicasual', r'\1ec\3ono\5mCasual'), # Shorten RecMonoSemicausal
+    ]
+
+    # From https://adobe-type-tools.github.io/font-tech-notes/pdfs/5088.FontNames.pdf
+    # The first short variant is from the linked table.
+    # The second (longer) short variant is from diverse fonts like Noto.
+    # We can
+    # - use the long form
+    # - use the very short form (first)
+    # - use mild short form:
+    #   - has no modifier: use the second form
+    #   - has modifier: use second form of mod plus first form of weights2
+    #   - has modifier: use second form of mod plus second form of widths
+    # This is encoded in get_shorten_form_idx()
+    known_weights1 = { # can not take modifiers
+        'Medium': ('Md', 'Med'),
+        'Nord': ('Nd', 'Nord'),
+        'Book': ('Bk', 'Book'),
+        'Text': ('Txt', 'Text'),
+        'Poster': ('Po', 'Poster'),
+        'Demi': ('Dm', 'Demi'), # Demi is sometimes used as a weight, sometimes as a modifier
+        'Regular': ('Rg', 'Reg'),
+        'Display': ('DS', 'Disp'),
+        'Super': ('Su', 'Sup'),
+        'Retina': ('Rt', 'Ret'),
+    }
+    known_weights2 = { # can take modifiers
+        'Black': ('Blk', 'Black'),
+        'Bold': ('Bd', 'Bold'),
+        'Heavy': ('Hv', 'Heavy'),
+        'Thin': ('Th', 'Thin'),
+        'Thick': ('Tk', 'Thck'),
+        'Light': ('Lt', 'Light'),
+    }
+    known_styles = [ # Keywords that end up as style (i.e. a RIBBI set)
+        'Bold', 'Italic', 'Regular', 'Normal'
+    ]
+    known_widths = { # can take modifiers
+        'Compressed': ('Cm', 'Comp'),
+        'Extended': ('Ex', 'Extd'),
+        'Condensed': ('Cn', 'Cond'),
+        'Narrow': ('Nr', 'Narrow'),
+        'Compact': ('Ct', 'Compact'),
+    }
+    known_slopes = { # can not take modifiers
+        'Inclined': ('Ic', 'Incl'),
+        'Oblique': ('Obl', 'Obl'),
+        'Italic': ('It', 'Italic'),
+        'Upright': ('Up', 'Uprght'),
+        'Kursiv': ('Ks', 'Kurs'),
+        'Sloped': ('Sl', 'Slop'),
+    }
+    known_modifiers = {
+        'Demi': ('Dm', 'Dem'),
+        'Ultra': ('Ult', 'Ult'),
+        'Semi': ('Sm', 'Sem'),
+        'Extra': ('X', 'Ext'),
+    }
+    equivalent_weights = {
+        100: ('thin', 'hairline'),
+        200: ('extralight', 'ultralight'),
+        300: ('light', ),
+        350: ('semilight', ),
+        400: ('regular', 'normal', 'book', 'text', 'nord', 'retina'),
+        500: ('medium', ),
+        600: ('semibold', 'demibold', 'demi'),
+        700: ('bold', ),
+        800: ('extrabold', 'ultrabold'),
+        900: ('black', 'heavy', 'poster', 'extrablack', 'ultrablack'),
+    }
+
+    @staticmethod
+    def weight_permutations():
+        """ All the weight modifiers we know """
+        return [ m + s
+                for s in list(FontnameTools.known_weights2)
+                for m in list(FontnameTools.known_modifiers) + [''] if m != s
+            ] + list(FontnameTools.known_weights1)
+
+    @staticmethod
+    def check_contains_weight(token):
+        """ Check if a token set contains a Weight specifier or just Widths or Slopes """
+        weights = FontnameTools.weight_permutations()
+        for t in token:
+            if t in weights:
+                return True
+        return False
+
+    @staticmethod
+    def weight_string_to_number(w):
+        """ Convert a common string approximation to a PS/2 weight value """
+        if not isinstance(w, str) or len(w) < 1:
+            return 400
+        w = w.lower().replace('-', '').replace(' ', '')
+        for num, strs in FontnameTools.equivalent_weights.items():
+            if w in strs:
+                return num
+        return None
+
+    @staticmethod
+    def weight_to_string(w):
+        """ Convert a PS/2 weight value to the common string approximation """
+        if w < 150:
+            str = 'Thin'
+        elif w < 250:
+            str = 'Extra-Light'
+        elif w < 350:
+            str = 'Light'
+        elif w < 450:
+            str = 'Regular'
+        elif w < 550:
+            str = 'Medium'
+        elif w < 650:
+            str = 'Semi-Bold'
+        elif w < 750:
+            str = 'Bold'
+        elif w < 850:
+            str = 'Extra-Bold'
+        else:
+            str = 'Black'
+        return str
+
+    @staticmethod
+    def is_keep_regular(basename):
+        """This has been decided by the font designers, we need to mimic that (for comparison purposes)"""
+        KEEP_REGULAR = [
+            'Agave',
+            'Arimo',
+            'Aurulent',
+            'Cascadia',
+            'Cousine',
+            'Fantasque',
+            'Fira',
+
+            'Overpass',
+            'Lilex',
+            'Inconsolata$', # not InconsolataGo
+            'IAWriter',
+            'Meslo',
+            'Monoid',
+            'Mononoki',
+            'Hack',
+            'JetBrains Mono',
+            'Noto Sans',
+            'Noto Serif',
+            'Victor',
+        ]
+        for kr in KEEP_REGULAR:
+            if (basename.rstrip() + '$').startswith(kr): return True
+        return False
+
+    @staticmethod
+    def _parse_simple_font_name(name):
+        """Parse a fontname that does not follow the 'FontFamilyName-FontStyle' pattern"""
+        # This is the usual case, because the font-patcher usually uses the fullname and
+        # not the PS name
+        if ' ' in name:
+            return FontnameTools.parse_font_name(name.replace(' ', '-'))
+        # Do we have a number-name boundary?
+        p = re.split('(?<=[0-9])(?=[a-zA-Z])', name)
+        if len(p) > 1:
+            return FontnameTools.parse_font_name('-'.join(p))
+        # Or do we have CamelCase?
+        n = FontnameTools.camel_explode(name)
+        if n != name:
+            return FontnameTools.parse_font_name(n.replace(' ', '-'))
+        return (False, FontnameTools.camel_casify(name), [], [], [], '')
+
+    @staticmethod
+    def parse_font_name(name):
+        """Expects a fontname following the 'FontFamilyName-FontStyle' pattern and returns ... parts"""
+        # This could parse filenames in the beginning but that was never used in production; code removed with this commit
+        for special in [
+                ('ExtLt', 'ExtraLight'), # IBM-Plex
+                ('Medm', 'Medium'), # IBM-Plex
+                ('Semi-Condensed', 'SemiCondensed'), # 3270
+                ('SmBld', 'SemiBold'), # IBM-Plex
+                ('Bold-Italic', 'BoldItalic'), # Terminus
+            ]:
+            name = re.sub(r'\b' + special[0] + r'\b', special[1], name, 1, re.IGNORECASE)
+        name = re.sub('[_\s]+', ' ', name)
+        matches = re.match(r'([^-]+)(?:-(.*))?', name)
+        familyname = FontnameTools.camel_casify(matches.group(1))
+        style = matches.group(2)
+
+        if not style:
+            return FontnameTools._parse_simple_font_name(name)
+
+        # These are the FontStyle keywords we know, in three categories
+        # Weights end up as Typographic Family parts ('after the dash')
+        # Styles end up as Family parts (for classic grouping of four)
+        # Others also end up in Typographic Family ('before the dash')
+        widths = [ m + s
+                for s in list(FontnameTools.known_widths)
+                for m in list(FontnameTools.known_modifiers) + ['']
+            ]
+        weights = FontnameTools.weight_permutations() + list(FontnameTools.known_slopes)
+        weights = [ w for w in weights if w not in FontnameTools.known_styles ]
+        # Some font specialities:
+        other = [
+            '-', 'Book', 'For', 'Powerline',
+            'IIx',              # Profont IIx
+            'LGC',              # Inconsolata LGC
+            r'\bCE\b',          # ProggycleanTT CE
+            r'[12][cmp]n?',     # MPlus
+            r'(?:uni-)?1[14]',  # GohuFont uni
+        ]
+
+        ( style, width_token ) = FontnameTools.get_name_token(style, widths)
+        ( style, weight_token ) = FontnameTools.get_name_token(style, weights)
+        ( style, style_token ) = FontnameTools.get_name_token(style, FontnameTools.known_styles)
+        ( style, other_token ) = FontnameTools.get_name_token(style, other)
+        weight_token = width_token + weight_token
+        while 'Regular' in style_token and len(style_token) > 1:
+            # Correct situation where "Regular" and something else is given
+            style_token.remove('Regular')
+
+        # Recurse to see if unmatched stuff between dashes can belong to familyname
+        matches2 = re.match(r'(\w+)-(.*)', style)
+        if matches2:
+            return FontnameTools.parse_font_name(familyname + matches2.group(1) + '-' + matches2.group(2))
+
+        style = re.sub(r'(^|\s)\d+(\.\d+)+(\s|$)', r'\1\3', style) # Remove (free standing) version numbers
+        style_parts = FontnameTools.drop_empty(style.split(' '))
+        style = ' '.join(map(FontnameTools.front_upper, style_parts))
+        familyname = FontnameTools.camel_explode(familyname)
+        return (True, familyname, weight_token, style_token, other_token, style)
diff --git a/bin/nerdfont/font-patcher b/bin/nerdfont/font-patcher
new file mode 100644
index 0000000..c2535a1
--- /dev/null
+++ b/bin/nerdfont/font-patcher
@@ -0,0 +1,2114 @@
+#!/usr/bin/env python
+# coding=utf8
+# Nerd Fonts Version: 3.2.1
+# Script version is further down
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+# Change the script version when you edit this script:
+script_version = "4.13.1"
+
+version = "3.2.1"
+projectName = "Nerd Fonts"
+projectNameAbbreviation = "NF"
+projectNameSingular = projectName[:-1]
+
+import sys
+import re
+import os
+import argparse
+from argparse import RawTextHelpFormatter
+import errno
+import subprocess
+import json
+from enum import Enum
+import logging
+try:
+    import configparser
+except ImportError:
+    sys.exit(projectName + ": configparser module is probably not installed. Try `pip install configparser` or equivalent")
+try:
+    import psMat
+    import fontforge
+except ImportError:
+    sys.exit(
+        projectName + (
+            ": FontForge module could not be loaded. Try installing fontforge python bindings "
+            "[e.g. on Linux Debian or Ubuntu: `sudo apt install fontforge python3-fontforge`]"
+        )
+    )
+
+sys.path.insert(0, os.path.abspath(os.path.dirname(sys.argv[0])) + '/bin/scripts/name_parser/')
+try:
+    from FontnameParser import FontnameParser
+    from FontnameTools import FontnameTools
+    FontnameParserOK = True
+except ImportError:
+    FontnameParserOK = False
+
+class TableHEADWriter:
+    """ Access to the HEAD table without external dependencies """
+    def getlong(self, pos = None):
+        """ Get four bytes from the font file as integer number """
+        if pos:
+            self.goto(pos)
+        return (ord(self.f.read(1)) << 24) + (ord(self.f.read(1)) << 16) + (ord(self.f.read(1)) << 8) + ord(self.f.read(1))
+
+    def getshort(self, pos = None):
+        """ Get two bytes from the font file as integer number """
+        if pos:
+            self.goto(pos)
+        return (ord(self.f.read(1)) << 8) + ord(self.f.read(1))
+
+    def putlong(self, num, pos = None):
+        """ Put number as four bytes into font file """
+        if pos:
+            self.goto(pos)
+        self.f.write(bytearray([(num >> 24) & 0xFF, (num >> 16) & 0xFF ,(num >> 8) & 0xFF, num & 0xFF]))
+        self.modified = True
+
+    def putshort(self, num, pos = None):
+        """ Put number as two bytes into font file """
+        if pos:
+            self.goto(pos)
+        self.f.write(bytearray([(num >> 8) & 0xFF, num & 0xFF]))
+        self.modified = True
+
+    def calc_checksum(self, start, end, checksum = 0):
+        """ Calculate a font table checksum, optionally ignoring another embedded checksum value (for table 'head') """
+        self.f.seek(start)
+        for i in range(start, end - 4, 4):
+            checksum += self.getlong()
+            checksum &= 0xFFFFFFFF
+        i += 4
+        extra = 0
+        for j in range(4):
+            extra = extra << 8
+            if i + j <= end:
+                extra += ord(self.f.read(1))
+        checksum = (checksum + extra) & 0xFFFFFFFF
+        return checksum
+
+    def find_table(self, tablenames, idx):
+        """ Search all tables for one of the tables in tablenames and store its metadata """
+        # Use font with index idx if this is a font collection file
+        self.f.seek(0, 0)
+        tag = self.f.read(4)
+        if tag == b'ttcf':
+            self.f.seek(2*2, 1)
+            self.num_fonts = self.getlong()
+            if (idx >= self.num_fonts):
+                raise Exception('Trying to access subfont index {} but have only {} fonts'.format(idx, num_fonts))
+            for _ in range(idx + 1):
+                offset = self.getlong()
+            self.f.seek(offset, 0)
+        elif idx != 0:
+            raise Exception('Trying to access subfont but file is no collection')
+        else:
+            self.f.seek(0, 0)
+            self.num_fonts = 1
+
+        self.f.seek(4, 1)
+        numtables = self.getshort()
+        self.f.seek(3*2, 1)
+
+        for i in range(numtables):
+            tab_name = self.f.read(4)
+            self.tab_check_offset = self.f.tell()
+            self.tab_check = self.getlong()
+            self.tab_offset = self.getlong()
+            self.tab_length = self.getlong()
+            if tab_name in tablenames:
+                return True
+        return False
+
+    def find_head_table(self, idx):
+        """ Search all tables for the HEAD table and store its metadata """
+        # Use font with index idx if this is a font collection file
+        found = self.find_table([ b'head' ], idx)
+        if not found:
+            raise Exception('No HEAD table found in font idx {}'.format(idx))
+
+
+    def goto(self, where):
+        """ Go to a named location in the file or to the specified index """
+        if isinstance(where, str):
+            positions = {'checksumAdjustment': 2+2+4,
+                         'flags': 2+2+4+4+4,
+                         'lowestRecPPEM': 2+2+4+4+4+2+2+8+8+2+2+2+2+2,
+                         'avgWidth': 2,
+                }
+            where = self.tab_offset + positions[where]
+        self.f.seek(where)
+
+
+    def calc_full_checksum(self, check = False):
+        """ Calculate the whole file's checksum """
+        self.f.seek(0, 2)
+        self.end = self.f.tell()
+        full_check = self.calc_checksum(0, self.end, (-self.checksum_adj) & 0xFFFFFFFF)
+        if check and (0xB1B0AFBA - full_check) & 0xFFFFFFFF != self.checksum_adj:
+            sys.exit("Checksum of whole font is bad")
+        return full_check
+
+    def calc_table_checksum(self, check = False):
+        tab_check_new = self.calc_checksum(self.tab_offset, self.tab_offset + self.tab_length - 1, (-self.checksum_adj) & 0xFFFFFFFF)
+        if check and tab_check_new != self.tab_check:
+            sys.exit("Checksum of 'head' in font is bad")
+        return tab_check_new
+
+    def reset_table_checksum(self):
+        new_check = self.calc_table_checksum()
+        self.putlong(new_check, self.tab_check_offset)
+
+    def reset_full_checksum(self):
+        new_adj = (0xB1B0AFBA - self.calc_full_checksum()) & 0xFFFFFFFF
+        self.putlong(new_adj, 'checksumAdjustment')
+
+    def close(self):
+        self.f.close()
+
+
+    def __init__(self, filename):
+        self.modified = False
+        self.f = open(filename, 'r+b')
+
+        self.find_head_table(0)
+
+        self.flags = self.getshort('flags')
+        self.lowppem = self.getshort('lowestRecPPEM')
+        self.checksum_adj = self.getlong('checksumAdjustment')
+
+def check_panose_monospaced(font):
+    """ Check if the font's Panose flags say it is monospaced """
+    # https://forum.high-logic.com/postedfiles/Panose.pdf
+    panose = list(font.os2_panose)
+    if panose[0] < 2 or panose[0] > 5:
+        return -1 # invalid Panose info
+    panose_mono = ((panose[0] == 2 and panose[3] == 9) or
+                   (panose[0] == 3 and panose[3] == 3))
+    return 1 if panose_mono else 0
+
+def panose_check_to_text(value, panose = False):
+    """ Convert value from check_panose_monospaced() to human readable string """
+    if value == 0:
+        return "Panose says \"not monospaced\""
+    if value == 1:
+        return "Panose says \"monospaced\""
+    return "Panose is invalid" + (" ({})".format(list(panose)) if panose else "")
+
+def panose_proportion_to_text(value):
+    """ Interpret a Panose proportion value (4th value) for family 2 (latin text) """
+    proportion = {
+            0: "Any", 1: "No Fit", 2: "Old Style", 3: "Modern", 4: "Even Width",
+            5: "Extended", 6: "Condensed", 7: "Very Extended", 8: "Very Condensed",
+            9: "Monospaced" }
+    return proportion.get(value, "??? {}".format(value))
+
+def is_monospaced(font):
+    """ Check if a font is probably monospaced """
+    # Some fonts lie (or have not any Panose flag set), spot check monospaced:
+    width = -1
+    width_mono = True
+    for glyph in [ 0x49, 0x4D, 0x57, 0x61, 0x69, 0x6d, 0x2E ]: # wide and slim glyphs 'I', 'M', 'W', 'a', 'i', 'm', '.'
+        if not glyph in font:
+            # A 'strange' font, believe Panose
+            return (check_panose_monospaced(font) == 1, None)
+        # print(" -> {} {}".format(glyph, font[glyph].width))
+        if width < 0:
+            width = font[glyph].width
+            continue
+        if font[glyph].width != width:
+            # Exception for fonts like Code New Roman Regular or Hermit Light/Bold:
+            # Allow small 'i' and dot to be smaller than normal
+            # I believe the source fonts are buggy
+            if glyph in [ 0x69, 0x2E ]:
+                if width > font[glyph].width:
+                    continue
+                (xmin, _, xmax, _) = font[glyph].boundingBox()
+                if width > xmax - xmin:
+                    continue
+            width_mono = False
+            break
+    # We believe our own check more then Panose ;-D
+    return (width_mono, None if width_mono else glyph)
+
+def force_panose_monospaced(font):
+    """ Forces the Panose flag to monospaced if they are unset or halfway ok already """
+    # For some Windows applications (e.g. 'cmd'), they seem to honour the Panose table
+    # https://forum.high-logic.com/postedfiles/Panose.pdf
+    panose = list(font.os2_panose)
+    if panose[0] == 0: # 0 (1st value) = family kind; 0 = any (default)
+        panose[0] = 2 # make kind latin text and display
+        logger.info("Setting Panose 'Family Kind' to 'Latin Text and Display' (was 'Any')")
+        font.os2_panose = tuple(panose)
+    if panose[0] == 2 and panose[3] != 9:
+        logger.info("Setting Panose 'Proportion' to 'Monospaced' (was '%s')", panose_proportion_to_text(panose[3]))
+        panose[3] = 9 # 3 (4th value) = proportion; 9 = monospaced
+        font.os2_panose = tuple(panose)
+
+def get_advance_width(font, extended, minimum):
+    """ Get the maximum/minimum advance width in the extended(?) range """
+    width = 0
+    if not extended:
+        r = range(0x021, 0x07e)
+    else:
+        r = range(0x07f, 0x17f)
+    for glyph in r:
+        if not glyph in font:
+            continue
+        if glyph in range(0x7F, 0xBF):
+            continue # ignore special characters like '1/4' etc
+        if width == 0:
+            width = font[glyph].width
+            continue
+        if not minimum and width < font[glyph].width:
+            width = font[glyph].width
+        elif minimum and width > font[glyph].width:
+            width = font[glyph].width
+    return width
+
+def report_advance_widths(font):
+    return "Advance widths (base/extended): {} - {} / {} - {}".format(
+        get_advance_width(font, False, True), get_advance_width(font, False, False),
+        get_advance_width(font, True, True), get_advance_width(font, True, False))
+
+def get_btb_metrics(font):
+    """ Get the baseline to baseline distance for all three metrics """
+    hhea_height = font.hhea_ascent - font.hhea_descent
+    typo_height = font.os2_typoascent - font.os2_typodescent
+    win_height = font.os2_winascent + font.os2_windescent
+    win_gap = max(0, font.hhea_linegap - win_height + hhea_height)
+    hhea_btb = hhea_height + font.hhea_linegap
+    typo_btb = typo_height + font.os2_typolinegap
+    win_btb = win_height + win_gap
+    return (hhea_btb, typo_btb, win_btb, win_gap)
+
+def get_metrics_names():
+    """ Helper to get the line metrics names consistent """
+    return ['HHEA','TYPO','WIN']
+
+def get_old_average_x_width(font):
+    """ Determine xAvgCharWidth of the OS/2 table """
+    # Fontforge can not create fonts with old (i.e. prior to OS/2 version 3)
+    # table values, but some very old applications do need them sometimes
+    # https://learn.microsoft.com/en-us/typography/opentype/spec/os2#xavgcharwidth
+    s = 0
+    weights = {
+        'a': 64, 'b': 14, 'c': 27, 'd': 35, 'e': 100, 'f': 20, 'g': 14, 'h': 42, 'i': 63,
+        'j': 3, 'k': 6, 'l': 35, 'm': 20, 'n': 56, 'o': 56, 'p': 17, 'q': 4, 'r': 49,
+        's': 56, 't': 71, 'u': 31, 'v': 10, 'w': 18, 'x': 3, 'y': 18, 'z': 2, 32: 166,
+    }
+    for g in weights:
+        if g not in font:
+            logger.critical("Can not determine ancient style xAvgCharWidth")
+            sys.exit(1)
+        s += font[g].width * weights[g]
+    return int(s / 1000)
+
+def create_filename(fonts):
+    """ Determine filename from font object(s) """
+    # Only consider the standard (i.e. English-US) names
+    sfnt = { k: v for l, k, v in fonts[0].sfnt_names if l == 'English (US)' }
+    sfnt_pfam = sfnt.get('Preferred Family', sfnt['Family'])
+    sfnt_psubfam = sfnt.get('Preferred Styles', sfnt['SubFamily'])
+    if len(fonts) > 1:
+        return sfnt_pfam
+    if len(sfnt_psubfam) > 0:
+        sfnt_psubfam = '-' + sfnt_psubfam
+    return (sfnt_pfam + sfnt_psubfam).replace(' ', '')
+
+
+class font_patcher:
+    def __init__(self, args):
+        self.args = args  # class 'argparse.Namespace'
+        self.sym_font_args = []
+        self.config = None  # class 'configparser.ConfigParser'
+        self.sourceFont = None  # class 'fontforge.font'
+        self.patch_set = None  # class 'list'
+        self.font_dim = None  # class 'dict'
+        self.font_extrawide = False
+        self.source_monospaced = None # Later True or False
+        self.symbolsonly = False # Are we generating the SymbolsOnly font?
+        self.onlybitmaps = 0
+        self.essential = set()
+        self.config = configparser.ConfigParser(empty_lines_in_values=False, allow_no_value=True)
+        self.xavgwidth = [] # list of ints
+
+    def patch(self, font):
+        self.sourceFont = font
+        self.setup_version()
+        self.assert_monospace()
+        self.remove_ligatures()
+        self.get_essential_references()
+        self.get_sourcefont_dimensions()
+        self.setup_patch_set()
+        self.improve_line_dimensions()
+        self.sourceFont.encoding = 'UnicodeFull'  # Update the font encoding to ensure that the Unicode glyphs are available
+        self.onlybitmaps = self.sourceFont.onlybitmaps  # Fetch this property before adding outlines. NOTE self.onlybitmaps initialized and never used
+
+        if self.args.single:
+            # Force width to be equal on all glyphs to ensure the font is considered monospaced on Windows.
+            # This needs to be done on all characters, as some information seems to be lost from the original font file.
+            self.set_sourcefont_glyph_widths()
+
+        # For very wide (almost square or wider) fonts we do not want to generate 2 cell wide Powerline glyphs
+        if self.font_dim['height'] * 1.8 < self.font_dim['width'] * 2:
+            logger.warning("Very wide and short font, disabling 2 cell Powerline glyphs")
+            self.font_extrawide = True
+
+        # Prevent opening and closing the fontforge font. Makes things faster when patching
+        # multiple ranges using the same symbol font.
+        PreviousSymbolFilename = ""
+        symfont = None
+
+        if not os.path.isdir(self.args.glyphdir):
+            logger.critical("Can not find symbol glyph directory %s "
+                "(probably you need to download the src/glyphs/ directory?)", self.args.glyphdir)
+            sys.exit(1)
+
+        if self.args.dry_run:
+            return
+
+        for patch in self.patch_set:
+            if patch['Enabled']:
+                if PreviousSymbolFilename != patch['Filename']:
+                    # We have a new symbol font, so close the previous one if it exists
+                    if symfont:
+                        symfont.close()
+                        symfont = None
+                    symfont_file = os.path.join(self.args.glyphdir, patch['Filename'])
+                    if not os.path.isfile(symfont_file):
+                        logger.critical("Can not find symbol source for '%s' (i.e. %s)",
+                            patch['Name'], symfont_file)
+                        sys.exit(1)
+                    if not os.access(symfont_file, os.R_OK):
+                        logger.critical("Can not open symbol source for '%s' (i.e. %s)",
+                            patch['Name'], symfont_file)
+                        sys.exit(1)
+                    symfont = fontforge.open(symfont_file)
+                    symfont.encoding = 'UnicodeFull'
+
+                    # Match the symbol font size to the source font size
+                    symfont.em = self.sourceFont.em
+                    PreviousSymbolFilename = patch['Filename']
+
+                # If patch table doesn't include a source start, re-use the symbol font values
+                SrcStart = patch['SrcStart']
+                if not SrcStart:
+                    SrcStart = patch['SymStart']
+                self.copy_glyphs(SrcStart, symfont, patch['SymStart'], patch['SymEnd'], patch['Exact'], patch['ScaleRules'], patch['Name'], patch['Attributes'])
+
+        if symfont:
+            symfont.close()
+
+        # The grave accent and fontforge:
+        # If the type is 'auto' fontforge changes it to 'mark' on export.
+        # We can not prevent this. So set it to 'baseglyph' instead, as
+        # that resembles the most common expectations.
+        # This is not needed with fontforge March 2022 Release anymore.
+        if "grave" in self.sourceFont:
+            self.sourceFont["grave"].glyphclass="baseglyph"
+
+
+    def generate(self, sourceFonts):
+        sourceFont = sourceFonts[0]
+        # the `PfEd-comments` flag is required for Fontforge to save '.comment' and '.fontlog'.
+        if int(fontforge.version()) >= 20201107:
+            gen_flags = (str('opentype'), str('PfEd-comments'), str('no-FFTM-table'))
+        else:
+            gen_flags = (str('opentype'), str('PfEd-comments'))
+        if len(sourceFonts) > 1:
+            layer = None
+            # use first non-background layer
+            for l in sourceFont.layers:
+                if not sourceFont.layers[l].is_background:
+                    layer = l
+                    break
+            outfile = os.path.normpath(os.path.join(
+                sanitize_filename(self.args.outputdir, True),
+                sanitize_filename(create_filename(sourceFonts)) + ".ttc"))
+            sourceFonts[0].generateTtc(outfile, sourceFonts[1:], flags=gen_flags, layer=layer)
+            message = "   Generated {} fonts\n   \===> '{}'".format(len(sourceFonts), outfile)
+        else:
+            fontname = create_filename(sourceFonts)
+            if not fontname:
+                fontname = sourceFont.cidfontname
+            outfile = os.path.normpath(os.path.join(
+                sanitize_filename(self.args.outputdir, True),
+                sanitize_filename(fontname) + self.args.extension))
+            bitmaps = str()
+            if len(sourceFont.bitmapSizes):
+                logger.debug("Preserving bitmaps %s", repr(sourceFont.bitmapSizes))
+                bitmaps = str('otf') # otf/ttf, both is bf_ttf
+            if self.args.dry_run:
+                logger.debug("=====> Filename '%s'", outfile)
+                return
+            sourceFont.generate(outfile, bitmap_type=bitmaps, flags=gen_flags)
+            message = "   {}\n   \===> '{}'".format(sourceFont.fullname, outfile)
+
+        # Adjust flags that can not be changed via fontforge
+        if re.search('\\.[ot]tf$', self.args.font, re.IGNORECASE) and re.search('\\.[ot]tf$', outfile, re.IGNORECASE):
+            if not os.path.isfile(outfile) or os.path.getsize(outfile) < 1:
+                logger.critical("Something went wrong and Fontforge did not generate the new font - look for messages above")
+                sys.exit(1)
+            try:
+                source_font = TableHEADWriter(self.args.font)
+                dest_font = TableHEADWriter(outfile)
+                for idx in range(source_font.num_fonts):
+                    logger.debug("Tweaking %d/%d", idx + 1, source_font.num_fonts)
+                    xwidth_s = ''
+                    xwidth = self.xavgwidth[idx] if len(self.xavgwidth) > idx else None
+                    if isinstance(xwidth, int):
+                        if isinstance(xwidth, bool) and xwidth:
+                            source_font.find_table([b'OS/2'], idx)
+                            xwidth = source_font.getshort('avgWidth')
+                            xwidth_s = ' (copied from source)'
+                        dest_font.find_table([b'OS/2'], idx)
+                        d_xwidth = dest_font.getshort('avgWidth')
+                        if d_xwidth != xwidth:
+                            logger.debug("Changing xAvgCharWidth from %d to %d%s", d_xwidth, xwidth, xwidth_s)
+                            dest_font.putshort(xwidth, 'avgWidth')
+                            dest_font.reset_table_checksum()
+                    source_font.find_head_table(idx)
+                    dest_font.find_head_table(idx)
+                    if source_font.flags & 0x08 == 0 and dest_font.flags & 0x08 != 0:
+                        logger.debug("Changing flags from 0x%X to 0x%X", dest_font.flags, dest_font.flags & ~0x08)
+                        dest_font.putshort(dest_font.flags & ~0x08, 'flags') # clear 'ppem_to_int'
+                    if source_font.lowppem != dest_font.lowppem:
+                        logger.debug("Changing lowestRecPPEM from %d to %d", dest_font.lowppem, source_font.lowppem)
+                        dest_font.putshort(source_font.lowppem, 'lowestRecPPEM')
+                    if dest_font.modified:
+                        dest_font.reset_table_checksum()
+                if dest_font.modified:
+                    dest_font.reset_full_checksum()
+            except Exception as error:
+                logger.error("Can not handle font flags (%s)", repr(error))
+            finally:
+                try:
+                    source_font.close()
+                    dest_font.close()
+                except:
+                    pass
+        if self.args.is_variable:
+            logger.critical("Source font is a variable open type font (VF) and the patch results will most likely not be what you want")
+        print(message)
+
+        if self.args.postprocess:
+            subprocess.call([self.args.postprocess, outfile])
+            print("\n")
+            logger.info("Post Processed: %s", outfile)
+
+
+    def setup_name_backup(self, font):
+        """ Store the original font names to be able to rename the font multiple times """
+        font.persistent = {
+            "fontname": font.fontname,
+            "fullname": font.fullname,
+            "familyname": font.familyname,
+        }
+
+
+    def setup_font_names(self, font):
+        font.fontname = font.persistent["fontname"]
+        if isinstance(font.persistent["fullname"], str):
+            font.fullname = font.persistent["fullname"]
+        if isinstance(font.persistent["familyname"], str):
+            font.familyname = font.persistent["familyname"]
+        verboseAdditionalFontNameSuffix = ""
+        additionalFontNameSuffix = ""
+        if not self.args.complete:
+            # NOTE not all symbol fonts have appended their suffix here
+            if self.args.fontawesome:
+                additionalFontNameSuffix += " A"
+                verboseAdditionalFontNameSuffix += " Plus Font Awesome"
+            if self.args.fontawesomeextension:
+                additionalFontNameSuffix += " AE"
+                verboseAdditionalFontNameSuffix += " Plus Font Awesome Extension"
+            if self.args.octicons:
+                additionalFontNameSuffix += " O"
+                verboseAdditionalFontNameSuffix += " Plus Octicons"
+            if self.args.powersymbols:
+                additionalFontNameSuffix += " PS"
+                verboseAdditionalFontNameSuffix += " Plus Power Symbols"
+            if self.args.codicons:
+                additionalFontNameSuffix += " C"
+                verboseAdditionalFontNameSuffix += " Plus Codicons"
+            if self.args.pomicons:
+                additionalFontNameSuffix += " P"
+                verboseAdditionalFontNameSuffix += " Plus Pomicons"
+            if self.args.fontlogos:
+                additionalFontNameSuffix += " L"
+                verboseAdditionalFontNameSuffix += " Plus Font Logos"
+            if self.args.material:
+                additionalFontNameSuffix += " MDI"
+                verboseAdditionalFontNameSuffix += " Plus Material Design Icons"
+            if self.args.weather:
+                additionalFontNameSuffix += " WEA"
+                verboseAdditionalFontNameSuffix += " Plus Weather Icons"
+
+        # add mono signifier to beginning of name suffix
+        if self.args.single:
+            variant_abbrev = "M"
+            variant_full = " Mono"
+        elif self.args.nonmono and not self.symbolsonly:
+            variant_abbrev = "P"
+            variant_full = " Propo"
+        else:
+            variant_abbrev = ""
+            variant_full = ""
+
+        ps_suffix = projectNameAbbreviation + variant_abbrev + additionalFontNameSuffix
+
+        # add 'Nerd Font' to beginning of name suffix
+        verboseAdditionalFontNameSuffix = " " + projectNameSingular + variant_full + verboseAdditionalFontNameSuffix
+        additionalFontNameSuffix = " " + projectNameSingular + variant_full + additionalFontNameSuffix
+
+        if FontnameParserOK and self.args.makegroups > 0:
+            user_supplied_name = False # User supplied names are kept unchanged
+            if not isinstance(self.args.force_name, str):
+                use_fullname = isinstance(font.fullname, str) # Usually the fullname is better to parse
+                # Use fullname if it is 'equal' to the fontname
+                if font.fullname:
+                    use_fullname |= font.fontname.lower() == FontnameTools.postscript_char_filter(font.fullname).lower()
+                # Use fullname for any of these source fonts (that are impossible to disentangle from the fontname, we need the blanks)
+                for hit in [ 'Meslo' ]:
+                    use_fullname |= font.fontname.lower().startswith(hit.lower())
+                parser_name = font.fullname if use_fullname else font.fontname
+                # Gohu fontnames hide the weight, but the file names are ok...
+                if parser_name.startswith('Gohu'):
+                    parser_name = os.path.splitext(os.path.basename(self.args.font))[0]
+            else:
+                if self.args.force_name == 'full':
+                    parser_name = font.fullname
+                elif self.args.force_name == 'postscript':
+                    parser_name = font.fontname
+                elif self.args.force_name == 'filename':
+                    parser_name = os.path.basename(font.path).split('.')[0]
+                else:
+                    parser_name = self.args.force_name
+                    user_supplied_name = True
+                if not isinstance(parser_name, str) or len(parser_name) < 1:
+                    logger.critical("Specified --name not usable because the name will be empty")
+                    sys.exit(2)
+            n = FontnameParser(parser_name, logger)
+            if not n.parse_ok:
+                logger.warning("Have only minimal naming information, check resulting name. Maybe specify --makegroups 0")
+            n.drop_for_powerline()
+            n.enable_short_families(not user_supplied_name, self.args.makegroups in [ 2, 3, 5, 6, ], self.args.makegroups in [ 3, 6, ])
+            if not n.set_expect_no_italic(self.args.noitalic):
+                logger.critical("Detected 'Italic' slant but --has-no-italic specified")
+                sys.exit(1)
+
+            # All the following stuff is ignored in makegroups-mode
+
+        # basically split the font name around the dash "-" to get the fontname and the style (e.g. Bold)
+        # this does not seem very reliable so only use the style here as a fallback if the font does not
+        # have an internal style defined (in sfnt_names)
+        # using '([^-]*?)' to get the item before the first dash "-"
+        # using '([^-]*(?!.*-))' to get the item after the last dash "-"
+        fontname, fallbackStyle = re.match("^([^-]*).*?([^-]*(?!.*-))$", font.fontname).groups()
+
+        # dont trust 'font.familyname'
+        familyname = fontname
+
+        # fullname (filename) can always use long/verbose font name, even in windows
+        if font.fullname != None:
+            fullname = font.fullname + verboseAdditionalFontNameSuffix
+        else:
+            fullname = font.cidfontname + verboseAdditionalFontNameSuffix
+
+        fontname = fontname + additionalFontNameSuffix.replace(" ", "")
+
+        # let us try to get the 'style' from the font info in sfnt_names and fallback to the
+        # parse fontname if it fails:
+        try:
+            # search tuple:
+            subFamilyTupleIndex = [x[1] for x in font.sfnt_names].index("SubFamily")
+
+            # String ID is at the second index in the Tuple lists
+            sfntNamesStringIDIndex = 2
+
+            # now we have the correct item:
+            subFamily = font.sfnt_names[subFamilyTupleIndex][sfntNamesStringIDIndex]
+        except IndexError:
+            sys.stderr.write("{}: Could not find 'SubFamily' for given font, falling back to parsed fontname\n".format(projectName))
+            subFamily = fallbackStyle
+
+        # some fonts have inaccurate 'SubFamily', if it is Regular let us trust the filename more:
+        if subFamily == "Regular" and len(fallbackStyle):
+            subFamily = fallbackStyle
+
+        # This is meant to cover the case where the SubFamily is "Italic" and the filename is *-BoldItalic.
+        if  len(subFamily) < len(fallbackStyle):
+            subFamily = fallbackStyle
+
+        if len(subFamily) == 0:
+            subFamily = "Regular"
+
+        familyname += " " + projectNameSingular + variant_full
+
+        # Don't truncate the subfamily to keep fontname unique.  MacOS treats fonts with
+        # the same name as the same font, even if subFamily is different. Make sure to
+        # keep the resulting fontname (PostScript name) valid by removing spaces.
+        fontname += '-' + subFamily.replace(' ', '')
+
+        # rename font
+        #
+        # comply with SIL Open Font License (OFL)
+        reservedFontNameReplacements = {
+            'source'         : 'sauce',
+            'Source'         : 'Sauce',
+            'Bitstream Vera Sans Mono' : 'Bitstrom Wera',
+            'BitstreamVeraSansMono' : 'BitstromWera',
+            'bitstream vera sans mono' : 'bitstrom wera',
+            'bitstreamverasansmono' : 'bitstromwera',
+            'hermit'         : 'hurmit',
+            'Hermit'         : 'Hurmit',
+            'hasklig'        : 'hasklug',
+            'Hasklig'        : 'Hasklug',
+            'Share'          : 'Shure',
+            'share'          : 'shure',
+            'IBMPlex'        : 'Blex',
+            'ibmplex'        : 'blex',
+            'IBM-Plex'       : 'Blex',
+            'IBM Plex'       : 'Blex',
+            'terminus'       : 'terminess',
+            'Terminus'       : 'Terminess',
+            'liberation'     : 'literation',
+            'Liberation'     : 'Literation',
+            'iAWriter'       : 'iMWriting',
+            'iA Writer'      : 'iM Writing',
+            'iA-Writer'      : 'iM-Writing',
+            'Anka/Coder'     : 'AnaConder',
+            'anka/coder'     : 'anaconder',
+            'Cascadia Code'  : 'Caskaydia Cove',
+            'cascadia code'  : 'caskaydia cove',
+            'CascadiaCode'   : 'CaskaydiaCove',
+            'cascadiacode'   : 'caskaydiacove',
+            'Cascadia Mono'  : 'Caskaydia Mono',
+            'cascadia mono'  : 'caskaydia mono',
+            'CascadiaMono'   : 'CaskaydiaMono',
+            'cascadiamono'   : 'caskaydiamono',
+            'Fira Mono'      : 'Fura Mono',
+            'Fira Sans'      : 'Fura Sans',
+            'FiraMono'       : 'FuraMono',
+            'FiraSans'       : 'FuraSans',
+            'fira mono'      : 'fura mono',
+            'fira sans'      : 'fura sans',
+            'firamono'       : 'furamono',
+            'firasans'       : 'furasans',
+            'IntelOneMono'   : 'IntoneMono',
+            'IntelOne Mono'  : 'Intone Mono',
+            'Intel One Mono' : 'Intone Mono',
+        }
+
+        # remove overly verbose font names
+        # particularly regarding Powerline sourced Fonts (https://github.com/powerline/fonts)
+        additionalFontNameReplacements = {
+            'for Powerline': '',
+            'ForPowerline': ''
+        }
+
+        additionalFontNameReplacements2 = {
+            'Powerline': ''
+        }
+
+        projectInfo = (
+            "Patched with '" + projectName + " Patcher' (https://github.com/ryanoasis/nerd-fonts)\n\n"
+            "* Website: https://www.nerdfonts.com\n"
+            "* Version: " + version + "\n"
+            "* Development Website: https://github.com/ryanoasis/nerd-fonts\n"
+            "* Changelog: https://github.com/ryanoasis/nerd-fonts/blob/-/changelog.md"
+        )
+
+        familyname = replace_font_name(familyname, reservedFontNameReplacements)
+        fullname   = replace_font_name(fullname,   reservedFontNameReplacements)
+        fontname   = replace_font_name(fontname,   reservedFontNameReplacements)
+        familyname = replace_font_name(familyname, additionalFontNameReplacements)
+        fullname   = replace_font_name(fullname,   additionalFontNameReplacements)
+        fontname   = replace_font_name(fontname,   additionalFontNameReplacements)
+        familyname = replace_font_name(familyname, additionalFontNameReplacements2)
+        fullname   = replace_font_name(fullname,   additionalFontNameReplacements2)
+        fontname   = replace_font_name(fontname,   additionalFontNameReplacements2)
+
+        if self.args.makegroups < 0:
+            logger.warning("Renaming disabled! Make sure to comply with font license, esp RFN clause!")
+        elif not (FontnameParserOK and self.args.makegroups > 0):
+            # replace any extra whitespace characters:
+            font.familyname = " ".join(familyname.split())
+            font.fullname   = " ".join(fullname.split())
+            font.fontname   = " ".join(fontname.split())
+
+            font.appendSFNTName(str('English (US)'), str('Preferred Family'), font.familyname)
+            font.appendSFNTName(str('English (US)'), str('Family'), font.familyname)
+            font.appendSFNTName(str('English (US)'), str('Compatible Full'), font.fullname)
+            font.appendSFNTName(str('English (US)'), str('SubFamily'), subFamily)
+        else:
+            # Add Nerd Font suffix unless user specifically asked for some excplicit name via --name
+            if not user_supplied_name:
+                short_family = projectNameAbbreviation + variant_abbrev if self.args.makegroups >= 4 else projectNameSingular + variant_full
+                # inject_suffix(family, ps_fontname, short_family)
+                n.inject_suffix(verboseAdditionalFontNameSuffix, ps_suffix, short_family)
+            n.rename_font(font)
+
+        font.comment = projectInfo
+        font.fontlog = projectInfo
+
+
+    def setup_version(self):
+        """ Add the Nerd Font version to the original version """
+        # print("Version was {}".format(sourceFont.version))
+        if self.sourceFont.version != None:
+            self.sourceFont.version += ";" + projectName + " " + version
+        else:
+            self.sourceFont.version = str(self.sourceFont.cidversion) + ";" + projectName + " " + version
+        self.sourceFont.sfntRevision = None # Auto-set (refreshed) by fontforge
+        self.sourceFont.appendSFNTName(str('English (US)'), str('Version'), "Version " + self.sourceFont.version)
+        # The Version SFNT name is later reused by the NameParser for UniqueID
+        # print("Version now is {}".format(sourceFont.version))
+
+
+    def remove_ligatures(self):
+        # let's deal with ligatures (mostly for monospaced fonts)
+        # Usually removes 'fi' ligs that end up being only one cell wide, and 'ldot'
+        if self.args.configfile and self.config.read(self.args.configfile):
+            if self.args.removeligatures:
+                logger.info("Removing ligatures from configfile `Subtables` section")
+                ligature_subtables = json.loads(self.config.get("Subtables", "ligatures"))
+                for subtable in ligature_subtables:
+                    logger.debug("Removing subtable: %s", subtable)
+                    try:
+                        self.sourceFont.removeLookupSubtable(subtable)
+                        logger.debug("Successfully removed subtable: %s", subtable)
+                    except Exception:
+                        logger.error("Failed to remove subtable: %s", subtable)
+        elif self.args.removeligatures:
+            logger.error("Unable to read configfile, unable to remove ligatures")
+
+
+    def assert_monospace(self):
+        # Check if the sourcefont is monospaced
+        width_mono, offending_char = is_monospaced(self.sourceFont)
+        self.source_monospaced = width_mono
+        if self.args.nonmono:
+            return
+        panose_mono = check_panose_monospaced(self.sourceFont)
+        logger.debug("Monospace check: %s; glyph-width-mono %s",
+            panose_check_to_text(panose_mono, self.sourceFont.os2_panose), repr(width_mono))
+        # The following is in fact "width_mono != panose_mono", but only if panose_mono is not 'unknown'
+        if (width_mono and panose_mono == 0) or (not width_mono and panose_mono == 1):
+            logger.warning("Monospaced check: Panose assumed to be wrong")
+            logger.warning("Monospaced check: %s and %s",
+                report_advance_widths(self.sourceFont),
+                panose_check_to_text(panose_mono, self.sourceFont.os2_panose))
+        if self.args.single and not width_mono:
+            logger.warning("Sourcefont is not monospaced - forcing to monospace not advisable, "
+                "results might be useless%s",
+                " - offending char: {:X}".format(offending_char) if offending_char is not None else "")
+            if self.args.single <= 1:
+                logger.critical("Font will not be patched! Give --mono (or -s, or --use-single-width-glyphs) twice to force patching")
+                sys.exit(1)
+        if width_mono:
+            force_panose_monospaced(self.sourceFont)
+
+
+    def setup_patch_set(self):
+        """ Creates list of dicts to with instructions on copying glyphs from each symbol font into self.sourceFont """
+
+        box_enabled = self.source_monospaced and not self.symbolsonly # Box glyph only for monospaced and not for Symbols Only
+        box_keep = False
+        if box_enabled or self.args.forcebox:
+            self.sourceFont.selection.select(("ranges",), 0x2500, 0x259f)
+            box_glyphs_target = len(list(self.sourceFont.selection))
+            box_glyphs_current = len(list(self.sourceFont.selection.byGlyphs))
+            if box_glyphs_target > box_glyphs_current or self.args.forcebox:
+                # Sourcefont does not have all of these glyphs, do not mix sets (overwrite existing)
+                if box_glyphs_current > 0:
+                    logger.debug("%d/%d box drawing glyphs will be replaced",
+                        box_glyphs_current, box_glyphs_target)
+                box_enabled = True
+            else:
+                # Sourcefont does have all of these glyphs
+                # box_keep = True # just scale do not copy (need to scale to fit new cell size)
+                box_enabled = False # Cowardly not scaling existing glyphs, although the code would allow this
+
+        # Stretch 'xz' or 'pa' (preserve aspect ratio)
+        # Supported params: overlap | careful | xy-ratio | dont_copy | ypadding
+        # Overlap value is used horizontally but vertically limited to 0.01
+        # Careful does not overwrite/modify existing glyphs
+        # The xy-ratio limits the x-scale for a given y-scale to make the ratio <= this value (to prevent over-wide glyphs)
+        # '1' means occupu 1 cell (default for 'xy')
+        # '2' means occupy 2 cells (default for 'pa')
+        # '!' means do the 'pa' scaling even with non mono fonts (else it just scales down, never up)
+        # '^' means that scaling shall fill the whole cell and not only the icon-cap-height (for mono fonts, other always use the whole cell)
+        # Dont_copy does not overwrite existing glyphs but rescales the preexisting ones
+        #
+        # Be careful, stretch may not change within a ScaleRule!
+
+        SYM_ATTR_DEFAULT = {
+            'default': {'align': 'c', 'valign': 'c', 'stretch': 'pa', 'params': {}}
+        }
+        SYM_ATTR_POWERLINE = {
+            'default': {'align': 'c', 'valign': 'c', 'stretch': '^pa', 'params': {}},
+
+            # Arrow tips
+            0xe0b0: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.06, 'xy-ratio': 0.7}},
+            0xe0b1: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {'xy-ratio': 0.7}},
+            0xe0b2: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.06, 'xy-ratio': 0.7}},
+            0xe0b3: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {'xy-ratio': 0.7}},
+
+            # Inverse arrow tips
+            0xe0d6: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.05, 'xy-ratio': 0.7}},
+            0xe0d7: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.05, 'xy-ratio': 0.7}},
+
+            # Rounded arcs
+            0xe0b4: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.06, 'xy-ratio': 0.59}},
+            0xe0b5: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {'xy-ratio': 0.5}},
+            0xe0b6: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.06, 'xy-ratio': 0.59}},
+            0xe0b7: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {'xy-ratio': 0.5}},
+
+            # Bottom Triangles
+            0xe0b8: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.02}},
+            0xe0b9: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {}},
+            0xe0ba: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.02}},
+            0xe0bb: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {}},
+
+            # Top Triangles
+            0xe0bc: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.02}},
+            0xe0bd: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {}},
+            0xe0be: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.02}},
+            0xe0bf: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {}},
+
+            # Flames
+            0xe0c0: {'align': 'l', 'valign': 'c', 'stretch': '^xy2', 'params': {'overlap': 0.01}},
+            0xe0c1: {'align': 'l', 'valign': 'c', 'stretch': '^xy2', 'params': {}},
+            0xe0c2: {'align': 'r', 'valign': 'c', 'stretch': '^xy2', 'params': {'overlap': 0.01}},
+            0xe0c3: {'align': 'r', 'valign': 'c', 'stretch': '^xy2', 'params': {}},
+
+            # Small squares
+            0xe0c4: {'align': 'l', 'valign': 'c', 'stretch': '^xy2', 'params': {'overlap': -0.03, 'xy-ratio': 0.86}},
+            0xe0c5: {'align': 'r', 'valign': 'c', 'stretch': '^xy2', 'params': {'overlap': -0.03, 'xy-ratio': 0.86}},
+
+            # Bigger squares
+            0xe0c6: {'align': 'l', 'valign': 'c', 'stretch': '^xy2', 'params': {'overlap': -0.03, 'xy-ratio': 0.78}},
+            0xe0c7: {'align': 'r', 'valign': 'c', 'stretch': '^xy2', 'params': {'overlap': -0.03, 'xy-ratio': 0.78}},
+
+            # Waveform
+            0xe0c8: {'align': 'l', 'valign': 'c', 'stretch': '^xy2', 'params': {'overlap': 0.01}},
+            0xe0ca: {'align': 'r', 'valign': 'c', 'stretch': '^xy2', 'params': {'overlap': 0.01}},
+
+            # Hexagons
+            0xe0cc: {'align': 'l', 'valign': 'c', 'stretch': '^xy2', 'params': {'overlap': 0.02, 'xy-ratio': 0.85}},
+            0xe0cd: {'align': 'l', 'valign': 'c', 'stretch': '^xy2', 'params': {'xy-ratio': 0.865}},
+
+            # Legos
+            0xe0ce: {'align': 'l', 'valign': 'c', 'stretch': '^pa', 'params': {}},
+            0xe0cf: {'align': 'c', 'valign': 'c', 'stretch': '^pa', 'params': {}},
+            0xe0d0: {'align': 'l', 'valign': 'c', 'stretch': '^pa', 'params': {}},
+            0xe0d1: {'align': 'l', 'valign': 'c', 'stretch': '^pa', 'params': {}},
+
+            # Top and bottom trapezoid
+            0xe0d2: {'align': 'l', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.02, 'xy-ratio': 0.7}},
+            0xe0d4: {'align': 'r', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.02, 'xy-ratio': 0.7}}
+        }
+        SYM_ATTR_TRIGRAPH = {
+            'default': {'align': 'c', 'valign': 'c', 'stretch': 'pa1!', 'params': {'overlap': -0.10, 'careful': True}}
+        }
+        SYM_ATTR_FONTA = {
+            # 'pa' == preserve aspect ratio
+            'default': {'align': 'c', 'valign': 'c', 'stretch': 'pa', 'params': {}},
+
+            # Don't center these arrows vertically
+            0xf0dc: {'align': 'c', 'valign': '', 'stretch': 'pa', 'params': {}},
+            0xf0dd: {'align': 'c', 'valign': '', 'stretch': 'pa', 'params': {}},
+            0xf0de: {'align': 'c', 'valign': '', 'stretch': 'pa', 'params': {}}
+        }
+        SYM_ATTR_HEAVYBRACKETS = {
+            'default': {'align': 'c', 'valign': 'c', 'stretch': 'pa1!', 'params': {'ypadding': 0.3, 'careful': True}}
+        }
+        SYM_ATTR_BOX = {
+            'default': {'align': 'c', 'valign': 'c', 'stretch': '^xy', 'params': {'overlap': 0.02, 'dont_copy': box_keep}},
+            # No overlap with checkered greys (commented out because that raises problems on rescaling clients)
+            # 0x2591: {'align': 'c', 'valign': 'c', 'stretch': 'xy', 'params': {'dont_copy': box_keep}},
+            # 0x2592: {'align': 'c', 'valign': 'c', 'stretch': 'xy', 'params': {'dont_copy': box_keep}},
+            # 0x2593: {'align': 'c', 'valign': 'c', 'stretch': 'xy', 'params': {'dont_copy': box_keep}},
+        }
+        CUSTOM_ATTR = {
+            # previous custom scaling => do not touch the icons
+            # 'default': {'align': 'c', 'valign': '', 'stretch': '', 'params': {}}
+            'default': {'align': 'c', 'valign': 'c', 'stretch': 'pa', 'params': {'careful': self.args.careful}}
+        }
+
+        # Most glyphs we want to maximize (individually) during the scale
+        # However, there are some that need to be small or stay relative in
+        # size to each other.
+        # The glyph-specific behavior can be given as ScaleRules in the patch-set.
+        #
+        # ScaleRules can contain two different kind of rules (possibly in parallel):
+        #   - ScaleGlyph:
+        #       Here one specific glyph is used as 'scale blueprint'. Other glyphs are
+        #       scaled by the same factor as this glyph. This is useful if you have one
+        #       'biggest' glyph and all others should stay relatively in size.
+        #       Shifting in addition to scaling can be selected too (see below).
+        #   - ScaleGroups:
+        #       Here you specify a group of glyphs that should be handled together
+        #       with the same scaling and shifting. The basis for it is a 'combined
+        #       bounding box' of all glyphs in that group. All glyphs are handled as
+        #       if they fill that combined bounding box.
+        #  (- ScaleGroupsVert: Removed with this commit)
+        #
+        # The ScaleGlyph method: You set 'ScaleGlyph' to the unicode of the reference glyph.
+        # Note that there can be only one per patch-set.
+        # Additionally you set 'GlyphsToScale' that contains all the glyphs that shall be
+        # handled (scaled) like the reference glyph.
+        # It is a List of: ((glyph code) or (tuple of two glyph codes that form a closed range))
+        #    'GlyphsToScale': [
+        #        0x0100, 0x0300, 0x0400,  # The single glyphs 0x0100, 0x0300, and 0x0400
+        #        (0x0200, 0x0210),        # All glyphs 0x0200 to 0x0210 including both 0x0200 and 0x0210
+        #    ]}
+        # If you want to not only scale but also shift as the refenerce glyph you give the
+        # data as 'GlyphsToScale+'. Note that only one set is used and the plus version is preferred.
+        #
+        # For the ScaleGroup method you define any number groups of glyphs and each group is
+        # handled separately. The combined bounding box of all glyphs in the group is determined
+        # and based on that the scale and shift for all the glyphs in the group.
+        # You define the groups as value of 'ScaleGroups'.
+        # It is a List of: ((lists of glyph codes) or (ranges of glyph codes))
+        #    'ScaleGroups': [
+        #        [0x0100, 0x0300, 0x0400],  # One group consists of glyphs 0x0100, 0x0300, and 0x0400
+        #        range(0x0200, 0x0210 + 1), # Another group contains glyphs 0x0200 to 0x0210 incl.
+        #
+        # Note the subtle differences: tuple vs. range; closed vs open range; etc
+        # See prepareScaleRules() for some more details.
+        # For historic reasons ScaleGroups is sometimes called 'new method' and ScaleGlyph 'old'.
+        # The codepoints mentioned here are symbol-font-codepoints.
+
+        BOX_SCALE_LIST = {'ScaleGroups': [
+            [*range(0x2500, 0x2570 + 1), *range(0x2574, 0x257f + 1)], # box drawing
+            range(0x2571, 0x2573 + 1), # diagonals
+            [*range(0x2580, 0x2590 + 1), 0x2594, 0x2595], # blocks
+            range(0x2591, 0x2593 + 1), # greys
+            range(0x2594, 0x259f + 1), # quards (Note: quard 2597 in Hack is wrong, scales like block!)
+        ]}
+        CODI_SCALE_LIST = {'ScaleGroups': [
+            [0xea61, 0xeb13], # lightbulb
+            range(0xeab4, 0xeab7 + 1), # chevrons
+            [0xea7d, *range(0xea99, 0xeaa1 + 1), 0xebcb], # arrows
+            [0xeaa2, 0xeb9a, 0xec08, 0xec09], # bells
+            range(0xead4, 0xead6 + 1), # dot and arrow
+            [0xeb43, 0xec0b, 0xec0c], # (pull) request changes
+            range(0xeb6e, 0xeb71 + 1), # triangles
+            [*range(0xeb89, 0xeb8b + 1), 0xec07], # smallish dots
+            range(0xebd5, 0xebd7 + 1), # compasses
+        ]}
+        DEVI_SCALE_LIST = {'ScaleGlyph': 0xE60E, # Android logo
+            'GlyphsToScale': [
+                (0xe6bd, 0xe6c3) # very small things
+        ]}
+        FONTA_SCALE_LIST = {'ScaleGroups': [
+            [0xf005, 0xf006, 0xf089], # star, star empty, half star
+            range(0xf026, 0xf028 + 1), # volume off, down, up
+            range(0xf02b, 0xf02c + 1), # tag, tags
+            range(0xf031, 0xf035 + 1), # font et al
+            range(0xf044, 0xf046 + 1), # edit, share, check (boxes)
+            range(0xf048, 0xf052 + 1), # multimedia buttons
+            range(0xf060, 0xf063 + 1), # arrows
+            [0xf053, 0xf054, 0xf077, 0xf078], # chevron all directions
+            range(0xf07d, 0xf07e + 1), # resize
+            range(0xf0a4, 0xf0a7 + 1), # pointing hands
+            [0xf0d7, 0xf0d8, 0xf0d9, 0xf0da, 0xf0dc, 0xf0dd, 0xf0de], # caret all directions and same looking sort
+            range(0xf100, 0xf107 + 1), # angle
+            range(0xf130, 0xf131 + 1), # mic
+            range(0xf141, 0xf142 + 1), # ellipsis
+            range(0xf153, 0xf15a + 1), # currencies
+            range(0xf175, 0xf178 + 1), # long arrows
+            range(0xf182, 0xf183 + 1), # male and female
+            range(0xf221, 0xf22d + 1), # gender or so
+            range(0xf255, 0xf25b + 1), # hand symbols
+        ]}
+        HEAVY_SCALE_LIST = {'ScaleGlyph': 0x2771, # widest bracket, horizontally
+            'GlyphsToScale': [
+                (0x276c, 0x2771) # all
+        ]}
+        OCTI_SCALE_LIST = {'ScaleGroups': [
+                [*range(0xf03d, 0xf040 + 1), 0xf019, 0xf030, 0xf04a, 0xf051,  0xf071, 0xf08c ], # arrows
+                [0xF0E7, # Smily and ...
+                    0xf044, 0xf05a, 0xf05b, 0xf0aa, # triangles
+                    0xf052, 0xf053, 0xf296, 0xf2f0, # small stuff
+                    0xf078, 0xf0a2, 0xf0a3, 0xf0a4, # chevrons
+                    0xf0ca, 0xf081, 0xf092, # dash, X, github-text
+                ],
+                [0xf09c, 0xf09f, 0xf0de], # bells
+                range(0xf2c2, 0xf2c5 + 1), # move to
+                [0xf07b, 0xf0a1, 0xf0d6, 0xf306], # bookmarks
+        ]}
+        WEATH_SCALE_LIST = {'ScaleGroups': [
+            [0xf03c, 0xf042, 0xf045 ], # degree signs
+            [0xf043, 0xf044, 0xf048, 0xf04b, 0xf04c, 0xf04d, 0xf057, 0xf058, 0xf087, 0xf088], # arrows
+            range(0xf053, 0xf055 + 1), # thermometers
+            [*range(0xf059, 0xf061 + 1), 0xf0b1], # wind directions
+            range(0xf089, 0xf094 + 1), # clocks
+            range(0xf095, 0xf0b0 + 1), # moon phases
+            range(0xf0b7, 0xf0c3 + 1), # wind strengths
+            [0xf06e, 0xf070 ], # solar/lunar eclipse
+            # Note: Codepoints listed before that are also in the following range
+            # will take the scaling of the previous group (the ScaleGroups are
+            # searched through in definition order).
+            # But be careful, the combined bounding box for the following group
+            # _will_ include all glyphs in its definition: Make sure the exempt
+            # glyphs from above are smaller (do not extend) the combined bounding
+            # box of this range:
+            range(0xf000, 0xf0cb + 1), # lots of clouds and other (Please read note above!)
+        ]}
+        MDI_SCALE_LIST = None # Maybe later add some selected ScaleGroups
+
+
+        # Define the character ranges
+        # Symbol font ranges
+        self.patch_set = [
+            {'Enabled': True,                           'Name': "Seti-UI + Custom",        'Filename': "original-source.otf",                            'Exact': False, 'SymStart': 0xE4FA, 'SymEnd': 0xE5FF, 'SrcStart': 0xE5FA, 'ScaleRules': None,             'Attributes': SYM_ATTR_DEFAULT},
+            {'Enabled': True,                           'Name': "Heavy Angle Brackets",    'Filename': "extraglyphs.sfd",                                'Exact': True,  'SymStart': 0x276C, 'SymEnd': 0x2771, 'SrcStart': None,   'ScaleRules': HEAVY_SCALE_LIST, 'Attributes': SYM_ATTR_HEAVYBRACKETS},
+            {'Enabled': box_enabled,                    'Name': "Box Drawing",             'Filename': "extraglyphs.sfd",                                'Exact': True,  'SymStart': 0x2500, 'SymEnd': 0x259F, 'SrcStart': None,   'ScaleRules': BOX_SCALE_LIST,   'Attributes': SYM_ATTR_BOX},
+            {'Enabled': True,                           'Name': "Devicons",                'Filename': "devicons/devicons.ttf",                          'Exact': False, 'SymStart': 0xE600, 'SymEnd': 0xE6C5, 'SrcStart': 0xE700, 'ScaleRules': DEVI_SCALE_LIST,  'Attributes': SYM_ATTR_DEFAULT},
+            {'Enabled': self.args.powerline,            'Name': "Powerline Symbols",       'Filename': "powerline-symbols/PowerlineSymbols.otf",         'Exact': True,  'SymStart': 0xE0A0, 'SymEnd': 0xE0A2, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_POWERLINE},
+            {'Enabled': self.args.powerline,            'Name': "Powerline Symbols",       'Filename': "powerline-symbols/PowerlineSymbols.otf",         'Exact': True,  'SymStart': 0xE0B0, 'SymEnd': 0xE0B3, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_POWERLINE},
+            {'Enabled': self.args.powerlineextra,       'Name': "Powerline Extra Symbols", 'Filename': "powerline-extra/PowerlineExtraSymbols.otf",      'Exact': True,  'SymStart': 0xE0A3, 'SymEnd': 0xE0A3, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_POWERLINE},
+            {'Enabled': self.args.powerlineextra,       'Name': "Powerline Extra Symbols", 'Filename': "powerline-extra/PowerlineExtraSymbols.otf",      'Exact': True,  'SymStart': 0xE0B4, 'SymEnd': 0xE0C8, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_POWERLINE},
+            {'Enabled': self.args.powerlineextra,       'Name': "Powerline Extra Symbols", 'Filename': "powerline-extra/PowerlineExtraSymbols.otf",      'Exact': True,  'SymStart': 0xE0CA, 'SymEnd': 0xE0CA, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_POWERLINE},
+            {'Enabled': self.args.powerlineextra,       'Name': "Powerline Extra Symbols", 'Filename': "powerline-extra/PowerlineExtraSymbols.otf",      'Exact': True,  'SymStart': 0xE0CC, 'SymEnd': 0xE0D7, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_POWERLINE},
+            {'Enabled': self.args.powerlineextra,       'Name': "Powerline Extra Symbols", 'Filename': "powerline-extra/PowerlineExtraSymbols.otf",      'Exact': True,  'SymStart': 0x2630, 'SymEnd': 0x2630, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_TRIGRAPH},
+            {'Enabled': self.args.pomicons,             'Name': "Pomicons",                'Filename': "pomicons/Pomicons.otf",                          'Exact': True,  'SymStart': 0xE000, 'SymEnd': 0xE00A, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_DEFAULT},
+            {'Enabled': self.args.fontawesome,          'Name': "Font Awesome",            'Filename': "font-awesome/FontAwesome.otf",                   'Exact': True,  'SymStart': 0xED00, 'SymEnd': 0xF2FF, 'SrcStart': None,   'ScaleRules': FONTA_SCALE_LIST, 'Attributes': SYM_ATTR_FONTA},
+            {'Enabled': self.args.fontawesomeextension, 'Name': "Font Awesome Extension",  'Filename': "font-awesome-extension.ttf",                     'Exact': False, 'SymStart': 0xE000, 'SymEnd': 0xE0A9, 'SrcStart': 0xE200, 'ScaleRules': None,             'Attributes': SYM_ATTR_DEFAULT},  # Maximize
+            {'Enabled': self.args.powersymbols,         'Name': "Power Symbols",           'Filename': "Unicode_IEC_symbol_font.otf",                    'Exact': True,  'SymStart': 0x23FB, 'SymEnd': 0x23FE, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_DEFAULT},  # Power, Power On/Off, Power On, Sleep
+            {'Enabled': self.args.powersymbols,         'Name': "Power Symbols",           'Filename': "Unicode_IEC_symbol_font.otf",                    'Exact': True,  'SymStart': 0x2B58, 'SymEnd': 0x2B58, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_DEFAULT},  # Heavy Circle (aka Power Off)
+            {'Enabled': False             ,             'Name': "Material legacy",         'Filename': "materialdesign/materialdesignicons-webfont.ttf", 'Exact': False, 'SymStart': 0xF001, 'SymEnd': 0xF847, 'SrcStart': 0xF500, 'ScaleRules': None,             'Attributes': SYM_ATTR_DEFAULT},
+            {'Enabled': self.args.material,             'Name': "Material",                'Filename': "materialdesign/MaterialDesignIconsDesktop.ttf",  'Exact': True,  'SymStart': 0xF0001,'SymEnd': 0xF1AF0,'SrcStart': None,   'ScaleRules': MDI_SCALE_LIST,   'Attributes': SYM_ATTR_DEFAULT},
+            {'Enabled': self.args.weather,              'Name': "Weather Icons",           'Filename': "weather-icons/weathericons-regular-webfont.ttf", 'Exact': False, 'SymStart': 0xF000, 'SymEnd': 0xF0EB, 'SrcStart': 0xE300, 'ScaleRules': WEATH_SCALE_LIST, 'Attributes': SYM_ATTR_DEFAULT},
+            {'Enabled': self.args.fontlogos,            'Name': "Font Logos",              'Filename': "font-logos.ttf",                                 'Exact': True,  'SymStart': 0xF300, 'SymEnd': 0xF375, 'SrcStart': None,   'ScaleRules': None,             'Attributes': SYM_ATTR_DEFAULT},
+            {'Enabled': self.args.octicons,             'Name': "Octicons",                'Filename': "octicons/octicons.ttf",                          'Exact': False, 'SymStart': 0xF000, 'SymEnd': 0xF105, 'SrcStart': 0xF400, 'ScaleRules': OCTI_SCALE_LIST,  'Attributes': SYM_ATTR_DEFAULT},  # Magnifying glass
+            {'Enabled': self.args.octicons,             'Name': "Octicons",                'Filename': "octicons/octicons.ttf",                          'Exact': True,  'SymStart': 0x2665, 'SymEnd': 0x2665, 'SrcStart': None,   'ScaleRules': OCTI_SCALE_LIST,  'Attributes': SYM_ATTR_DEFAULT},  # Heart
+            {'Enabled': self.args.octicons,             'Name': "Octicons",                'Filename': "octicons/octicons.ttf",                          'Exact': True,  'SymStart': 0X26A1, 'SymEnd': 0X26A1, 'SrcStart': None,   'ScaleRules': OCTI_SCALE_LIST,  'Attributes': SYM_ATTR_DEFAULT},  # Zap
+            {'Enabled': self.args.octicons,             'Name': "Octicons",                'Filename': "octicons/octicons.ttf",                          'Exact': False, 'SymStart': 0xF27C, 'SymEnd': 0xF306, 'SrcStart': 0xF4A9, 'ScaleRules': OCTI_SCALE_LIST,  'Attributes': SYM_ATTR_DEFAULT},
+            {'Enabled': self.args.codicons,             'Name': "Codicons",                'Filename': "codicons/codicon.ttf",                           'Exact': True,  'SymStart': 0xEA60, 'SymEnd': 0xEC1E, 'SrcStart': None,   'ScaleRules': CODI_SCALE_LIST,  'Attributes': SYM_ATTR_DEFAULT},
+            {'Enabled': self.args.custom,               'Name': "Custom",                  'Filename': self.args.custom,                                 'Exact': True,  'SymStart': 0x0000, 'SymEnd': 0x0000, 'SrcStart': None,   'ScaleRules': None,             'Attributes': CUSTOM_ATTR}
+        ]
+
+    def improve_line_dimensions(self):
+        # Make the total line size even.  This seems to make the powerline separators
+        # center more evenly.
+        if self.args.adjustLineHeight:
+            if (self.sourceFont.os2_winascent + self.sourceFont.os2_windescent) % 2 != 0:
+                # All three are equal before due to get_sourcefont_dimensions()
+                self.sourceFont.hhea_ascent += 1
+                self.sourceFont.os2_typoascent += 1
+                self.sourceFont.os2_winascent += 1
+
+    def add_glyphrefs_to_essential(self, unicode):
+        self.essential.add(unicode)
+        # According to fontforge spec, altuni is either None or a tuple of tuples
+        # Those tuples contained in altuni are of the following "format":
+        # (unicode-value, variation-selector, reserved-field)
+        altuni = self.sourceFont[unicode].altuni
+        if altuni is not None:
+            for altcode in [ v for v, s, r in altuni if v >= 0 ]:
+                # If alternate unicode already exists in self.essential,
+                # that means it has gone through this function before.
+                # Therefore we skip it to avoid infinite loop.
+                # A unicode value of -1 basically means unused and is also worth skipping.
+                if altcode not in self.essential:
+                    self.add_glyphrefs_to_essential(altcode)
+        # From fontforge documentation:
+        # glyph.references return a tuple of tuples containing, for each reference in foreground,
+        # a glyph name, a transformation matrix, and (depending on ff version) whether the
+        # reference is currently selected.
+        references = self.sourceFont[unicode].references
+        for refcode in [ self.sourceFont[n].unicode for n, *_ in references ]: # tuple of 2 or 3 depending on ff version
+            if refcode not in self.essential and refcode >= 0:
+                self.add_glyphrefs_to_essential(refcode)
+
+    def get_essential_references(self):
+        """Find glyphs that are needed for the basic glyphs"""
+        # Sometimes basic glyphs are constructed from multiple other glyphs.
+        # Find out which other glyphs are also needed to keep the basic
+        # glyphs intact.
+        # 0x0000-0x017f is the Latin Extended-A range
+        # 0xfb00-0xfb06 are 'fi' and other ligatures
+        basic_glyphs = { c for c in range(0x21, 0x17f + 1) if c in self.sourceFont }
+        # Collect substitution destinations
+        for glyph in list(basic_glyphs) + [*range(0xfb00, 0xfb06 + 1)]:
+            if not glyph in self.sourceFont:
+                continue
+            for possub in self.sourceFont[glyph].getPosSub('*'):
+                if possub[1] == 'Substitution' or possub[1] == 'Ligature':
+                    basic_glyphs.add(glyph)
+                    basic_glyphs.add(self.sourceFont[possub[2]].unicode)
+        basic_glyphs.discard(-1) # the .notdef glyph
+        for glyph in basic_glyphs:
+            self.add_glyphrefs_to_essential(glyph)
+
+    def get_sourcefont_dimensions(self):
+        """ This gets the font dimensions (cell width and height), and makes them equal on all platforms """
+        # Step 1
+        # There are three ways to discribe the baseline to baseline distance
+        # (a.k.a. line spacing) of a font. That is all a kuddelmuddel
+        # and we try to sort this out here
+        # See also https://glyphsapp.com/learn/vertical-metrics
+        # See also https://github.com/source-foundry/font-line
+        (hhea_btb, typo_btb, win_btb, win_gap) = get_btb_metrics(self.sourceFont)
+        use_typo = self.sourceFont.os2_use_typo_metrics != 0
+
+        Metric = Enum('Metric', get_metrics_names())
+
+        if not self.args.metrics:
+            # We use either TYPO (1) or WIN (2) and compare with HHEA
+            # and use HHEA (0) if the fonts seems broken - no WIN, see #1056
+            our_btb = typo_btb if use_typo else win_btb
+            if our_btb == hhea_btb:
+                metrics = Metric.TYPO if use_typo else Metric.WIN # conforming font
+            elif abs(our_btb - hhea_btb) / our_btb < 0.03:
+                logger.info("Font vertical metrics slightly off (%.1f%%)", (our_btb - hhea_btb) / our_btb * 100.0)
+                metrics = Metric.TYPO if use_typo else Metric.WIN
+            else:
+                # Try the other metric
+                our_btb = typo_btb if not use_typo else win_btb
+                if our_btb == hhea_btb:
+                    use_typo = not use_typo
+                    logger.warning("Font vertical metrics probably wrong USE TYPO METRICS, assume opposite (i.e. %s)", repr(use_typo))
+                    self.sourceFont.os2_use_typo_metrics = 1 if use_typo else 0
+                    metrics = Metric.TYPO if use_typo else Metric.WIN
+                else:
+                    # We trust the WIN metric more, see experiments in #1056
+                    logger.warning("Font vertical metrics inconsistent (HHEA %d / TYPO %d / WIN %d), using WIN", hhea_btb, typo_btb, win_btb)
+                    our_btb = win_btb
+                    metrics = Metric.WIN
+        else:
+            metrics = Metric[self.args.metrics]
+            logger.debug("Metrics in the font: HHEA %d / TYPO %d / WIN %d", hhea_btb, typo_btb, win_btb)
+            if metrics == Metric.HHEA:
+                our_btb = hhea_btb
+            elif metrics == Metric.TYPO:
+                our_btb = typo_btb
+            else:
+                our_btb = win_btb
+            logger.info("Manually selected metrics: %s (%d)", self.args.metrics, our_btb)
+
+        # print("FINI hhea {} typo {} win {} use {}     {}      {}".format(hhea_btb, typo_btb, win_btb, use_typo, our_btb != hhea_btb, self.sourceFont.fontname))
+
+        self.font_dim = {'xmin': 0, 'ymin': 0, 'xmax': 0, 'ymax': 0, 'width' : 0, 'height': 0, 'iconheight': 0, 'ypadding': 0}
+
+        if metrics == Metric.HHEA:
+            self.font_dim['ymin'] = self.sourceFont.hhea_descent - half_gap(self.sourceFont.hhea_linegap, False)
+            self.font_dim['ymax'] = self.sourceFont.hhea_ascent + half_gap(self.sourceFont.hhea_linegap, True)
+        elif metrics == Metric.TYPO:
+            self.font_dim['ymin'] = self.sourceFont.os2_typodescent - half_gap(self.sourceFont.os2_typolinegap, False)
+            self.font_dim['ymax'] = self.sourceFont.os2_typoascent + half_gap(self.sourceFont.os2_typolinegap, True)
+        elif metrics == Metric.WIN:
+            self.font_dim['ymin'] = -self.sourceFont.os2_windescent - half_gap(win_gap, False)
+            self.font_dim['ymax'] = self.sourceFont.os2_winascent + half_gap(win_gap, True)
+        else:
+            logger.debug("Metrics is strange")
+            pass # Will fail the metrics check some line later
+
+        # Calculate font height
+        self.font_dim['height'] = -self.font_dim['ymin'] + self.font_dim['ymax']
+        if self.font_dim['height'] == 0:
+            # This can only happen if the input font is empty
+            # Assume we are using our prepared templates
+            self.symbolsonly = True
+            self.font_dim = {
+                'xmin'      : 0,
+                'ymin'      : -self.sourceFont.descent,
+                'xmax'      : self.sourceFont.em,
+                'ymax'      : self.sourceFont.ascent,
+                'width'     : self.sourceFont.em,
+                'height'    : self.sourceFont.descent + self.sourceFont.ascent,
+                'iconheight': self.sourceFont.descent + self.sourceFont.ascent,
+                'ypadding'  : 0,
+            }
+            our_btb = self.sourceFont.descent + self.sourceFont.ascent
+        if self.font_dim['height'] <= 0:
+            logger.critical("Can not detect sane font height")
+            sys.exit(1)
+
+        self.font_dim['iconheight'] = self.font_dim['height']
+        if self.args.single and self.sourceFont.capHeight > 0:
+            # Limit the icon height on monospaced fonts because very slender and tall icons render
+            # excessivly tall otherwise. We ignore that effect for the other variants because it
+            # does not look so much out of place there.
+            # Icons can be bigger than the letter capitals, but not the whole cell:
+            self.font_dim['iconheight'] = (self.sourceFont.capHeight * 2 + self.font_dim['height']) / 3
+
+        # Make all metrics equal
+        self.sourceFont.os2_typolinegap = 0
+        self.sourceFont.os2_typoascent = self.font_dim['ymax']
+        self.sourceFont.os2_typodescent = self.font_dim['ymin']
+        self.sourceFont.os2_winascent = self.sourceFont.os2_typoascent
+        self.sourceFont.os2_windescent = -self.sourceFont.os2_typodescent
+        self.sourceFont.hhea_ascent = self.sourceFont.os2_typoascent
+        self.sourceFont.hhea_descent = self.sourceFont.os2_typodescent
+        self.sourceFont.hhea_linegap = self.sourceFont.os2_typolinegap
+        self.sourceFont.os2_use_typo_metrics = 1
+        (check_hhea_btb, check_typo_btb, check_win_btb, _) = get_btb_metrics(self.sourceFont)
+        if check_hhea_btb != check_typo_btb or check_typo_btb != check_win_btb or check_win_btb != our_btb:
+            logger.critical("Error in baseline to baseline code detected")
+            sys.exit(1)
+
+        # Step 2
+        # Find the biggest char width and advance width
+        # 0x00-0x17f is the Latin Extended-A range
+        warned1 = self.args.nonmono # Do not warn if proportional target
+        warned2 = warned1
+        for glyph in range(0x21, 0x17f):
+            if glyph in range(0x7F, 0xBF) or glyph in [
+                    0x132, 0x133, # IJ, ij (in Overpass Mono)
+                    0x022, 0x027, 0x060, # Single and double quotes in Inconsolata LGC
+                    0x0D0, 0x10F, 0x110, 0x111, 0x127, 0x13E, 0x140, 0x165, # Eth and others with stroke or caron in RobotoMono
+                    0x149, # napostrophe in DaddyTimeMono
+                    0x02D, # hyphen for Monofur
+                    ]:
+                continue # ignore special characters like '1/4' etc and some specifics
+            try:
+                (_, _, xmax, _) = self.sourceFont[glyph].boundingBox()
+            except TypeError:
+                continue
+            # print("WIDTH {:X} {} ({} {})".format(glyph, self.sourceFont[glyph].width, self.font_dim['width'], xmax))
+            if self.font_dim['width'] < self.sourceFont[glyph].width:
+                self.font_dim['width'] = self.sourceFont[glyph].width
+                if not warned1 and glyph > 0x7a: # NOT 'basic' glyph, which includes a-zA-Z
+                    logger.debug("Extended glyphs wider than basic glyphs, results might be useless")
+                    logger.debug("%s", report_advance_widths(self.sourceFont))
+                    warned1 = True
+                # print("New MAXWIDTH-A {:X} {} -> {} {}".format(glyph, self.sourceFont[glyph].width, self.font_dim['width'], xmax))
+            if xmax > self.font_dim['xmax']:
+                self.font_dim['xmax'] = xmax
+                if not warned2 and glyph > 0x7a: # NOT 'basic' glyph, which includes a-zA-Z
+                    logger.debug("Extended glyphs wider bounding box than basic glyphs")
+                    warned2 = True
+                # print("New MAXWIDTH-B {:X} {} -> {} {}".format(glyph, self.sourceFont[glyph].width, self.font_dim['width'], xmax))
+        if self.font_dim['width'] < self.font_dim['xmax']:
+            logger.debug("Font has negative right side bearing in extended glyphs")
+            self.font_dim['xmax'] = self.font_dim['width'] # In fact 'xmax' is never used
+        if self.font_dim['width'] <= 0:
+            logger.critical("Can not detect sane font width")
+            sys.exit(1)
+        logger.debug("Final font cell dimensions %d w x %d h%s",
+            self.font_dim['width'], self.font_dim['height'],
+            ' (with icon cell {} h)'.format(int(self.font_dim['iconheight'])) if self.font_dim['iconheight'] != self.font_dim['height'] else '')
+
+        self.xavgwidth.append(self.args.xavgwidth)
+        if isinstance(self.xavgwidth[-1], int) and self.xavgwidth[-1] == 0:
+            self.xavgwidth[-1] = get_old_average_x_width(self.sourceFont)
+
+
+    def get_target_width(self, stretch):
+        """ Get the target width (1 or 2 'cell') for a given stretch parameter """
+        # For monospaced fonts all chars need to be maximum 'one' space wide
+        # other fonts allows double width glyphs for 'pa' or if requested with '2'
+        if self.args.single or ('pa' not in stretch and '2' not in stretch) or '1' in stretch:
+            return 1
+        return 2
+
+    def get_scale_factors(self, sym_dim, stretch):
+        """ Get scale in x and y as tuple """
+        # It is possible to have empty glyphs, so we need to skip those.
+        if not sym_dim['width'] or not sym_dim['height']:
+            return (1.0, 1.0)
+
+        target_width = self.font_dim['width'] * self.get_target_width(stretch)
+        scale_ratio_x = target_width / sym_dim['width']
+
+        # font_dim['height'] represents total line height, keep our symbols sized based upon font's em
+        # Use the font_dim['height'] only for explicit 'y' scaling (not 'pa')
+        target_height = self.font_dim['height'] if '^' in stretch else self.font_dim['iconheight']
+        target_height *= 1.0 - self.font_dim['ypadding']
+        scale_ratio_y = target_height / sym_dim['height']
+
+        if 'pa' in stretch:
+            # We want to preserve x/y aspect ratio, so find biggest scale factor that allows symbol to fit
+            scale_ratio_x = min(scale_ratio_x, scale_ratio_y)
+            if not self.args.single and not '!' in stretch:
+                # non monospaced fonts just scale down on 'pa', not up
+                scale_ratio_x = min(scale_ratio_x, 1.0)
+            scale_ratio_y = scale_ratio_x
+        else:
+            # Keep the not-stretched direction
+            if not 'x' in stretch:
+                scale_ratio_x = 1.0
+            if not 'y' in stretch:
+                scale_ratio_y = 1.0
+
+        return (scale_ratio_x, scale_ratio_y)
+
+
+    def copy_glyphs(self, sourceFontStart, symbolFont, symbolFontStart, symbolFontEnd, exactEncoding, scaleRules, setName, attributes):
+        """ Copies symbol glyphs into self.sourceFont """
+        progressText = ''
+        careful = False
+        sourceFontCounter = 0
+
+        if self.args.careful:
+            careful = True
+
+        # Create glyphs from symbol font
+        #
+        # If we are going to copy all Glyphs, then assume we want to be careful
+        # and only copy those that are not already contained in the source font
+        if symbolFontStart == 0:
+            symbolFont.selection.all()
+            careful = True
+        else:
+            symbolFont.selection.select((str("ranges"), str("unicode")), symbolFontStart, symbolFontEnd)
+
+        # Get number of selected non-empty glyphs with codes >=0 (i.e. not -1 == notdef)
+        symbolFontSelection = [ x for x in symbolFont.selection.byGlyphs if x.unicode >= 0 ]
+        glyphSetLength = len(symbolFontSelection)
+
+        if not self.args.quiet:
+            modify = attributes['default']['params'].get('dont_copy')
+            sys.stdout.write("{} {} Glyphs from {} Set\n".format(
+                "Adding" if not modify else "Rescaling", glyphSetLength, setName))
+
+        currentSourceFontGlyph = -1 # initialize for the exactEncoding case
+        width_warning = False
+
+        for index, sym_glyph in enumerate(symbolFontSelection):
+            sym_attr = attributes.get(sym_glyph.unicode)
+            if sym_attr is None:
+                sym_attr = attributes['default']
+
+            if self.font_extrawide:
+                # Do not allow 'xy2' scaling
+                sym_attr['stretch'] = sym_attr['stretch'].replace('2', '')
+
+            if exactEncoding:
+                # Use the exact same hex values for the source font as for the symbol font.
+                # Problem is we do not know the codepoint of the sym_glyph and because it
+                # came from a selection.byGlyphs there might be skipped over glyphs.
+                # The iteration is still in the order of the selection by codepoint,
+                # so we take the next allowed codepoint of the current glyph
+                possible_codes = [ ]
+                if sym_glyph.unicode > currentSourceFontGlyph:
+                    possible_codes += [ sym_glyph.unicode ]
+                if sym_glyph.altuni:
+                    possible_codes += [ v for v, s, r in sym_glyph.altuni if v > currentSourceFontGlyph ]
+                if len(possible_codes) == 0:
+                    logger.warning("Can not determine codepoint of %X. Skipping...", sym_glyph.unicode)
+                    continue
+                currentSourceFontGlyph = min(possible_codes)
+            else:
+                # use source font defined hex values based on passed in start (fills gaps; symbols are packed)
+                currentSourceFontGlyph = sourceFontStart + sourceFontCounter
+                sourceFontCounter += 1
+
+            # For debugging process only limited glyphs
+            # if currentSourceFontGlyph != 0xe7bd:
+            #     continue
+
+            ypadding = sym_attr['params'].get('ypadding')
+            self.font_dim['ypadding'] = ypadding or 0.0
+
+            if not self.args.quiet:
+                if self.args.progressbars:
+                    update_progress(round(float(index + 1) / glyphSetLength, 2))
+                else:
+                    progressText = "\nUpdating glyph: {} {} putting at: {:X}".format(sym_glyph, sym_glyph.glyphname, currentSourceFontGlyph)
+                    sys.stdout.write(progressText)
+                    sys.stdout.flush()
+
+            # check if a glyph already exists in this location
+            do_careful = sym_attr['params'].get('careful', careful) # params take precedence
+            if do_careful or currentSourceFontGlyph in self.essential:
+                if currentSourceFontGlyph in self.sourceFont:
+                    careful_type = 'essential' if currentSourceFontGlyph in self.essential else 'existing'
+                    logger.debug("Found %s Glyph at %X. Skipping...", careful_type, currentSourceFontGlyph)
+                    # We don't want to touch anything so move to next Glyph
+                    continue
+            else:
+                # If we overwrite an existing glyph all subtable entries regarding it will be wrong
+                # (Probably; at least if we add a symbol and do not substitude a ligature or such)
+                if currentSourceFontGlyph in self.sourceFont:
+                    self.sourceFont[currentSourceFontGlyph].removePosSub("*")
+
+            stretch = sym_attr['stretch']
+            dont_copy = sym_attr['params'].get('dont_copy')
+
+            if dont_copy:
+                # Just prepare scaling of existing glyphs
+                glyph_scale_data = self.get_glyph_scale(sym_glyph.encoding, scaleRules, stretch, self.sourceFont, currentSourceFontGlyph) if scaleRules is not None else None
+            else:
+                # Break apart multiple unicodes linking to one glyph
+                if currentSourceFontGlyph in self.sourceFont:
+                    altuni = self.sourceFont[currentSourceFontGlyph].altuni
+                    if altuni:
+                        codes = { v for v, s, r in altuni if v >= 0 }
+                        codes.add(self.sourceFont[currentSourceFontGlyph].unicode)
+                        codes.remove(currentSourceFontGlyph)
+                        codes = [ "{:04X}".format(c) for c in sorted(list(codes)) ]
+                        logger.debug("Removing alternate unicode on %X (%s)", currentSourceFontGlyph, ' '.join(codes));
+                        self.sourceFont[currentSourceFontGlyph].altuni = None
+                        self.sourceFont.encoding = 'UnicodeFull' # Rebuild encoding table (needed after altuni changes)
+
+                # This will destroy any content currently in currentSourceFontGlyph, so do it first
+                glyph_scale_data = self.get_glyph_scale(sym_glyph.encoding, scaleRules, stretch, symbolFont, currentSourceFontGlyph) if scaleRules is not None else None
+
+                # Select and copy symbol from its encoding point
+                # We need to do this select after the careful check, this way we don't
+                # reset our selection before starting the next loop
+                symbolFont.selection.select(sym_glyph.encoding)
+                symbolFont.copy()
+
+                # Paste it
+                self.sourceFont.selection.select(currentSourceFontGlyph)
+                self.sourceFont.paste()
+                self.sourceFont[currentSourceFontGlyph].glyphname = sym_glyph.glyphname
+                self.sourceFont[currentSourceFontGlyph].manualHints = True # No autohints for symbols
+
+            # Prepare symbol glyph dimensions
+            sym_dim = get_glyph_dimensions(self.sourceFont[currentSourceFontGlyph])
+            if glyph_scale_data is not None:
+                if glyph_scale_data[1] is not None:
+                    sym_dim = glyph_scale_data[1] # Use combined bounding box
+                    (scale_ratio_x, scale_ratio_y) = self.get_scale_factors(sym_dim, stretch)
+                else:
+                    # This is roughly alike get_scale_factors(glyph_scale_data[1], 'pa')
+                    # Except we do not have glyph_scale_data[1] always...
+                    (scale_ratio_x, scale_ratio_y) = (glyph_scale_data[0], glyph_scale_data[0])
+            else:
+                (scale_ratio_x, scale_ratio_y) = self.get_scale_factors(sym_dim, stretch)
+
+            overlap = sym_attr['params'].get('overlap')
+            if overlap and ypadding:
+                logger.critical("Conflicting params: overlap and ypadding")
+                sys.exit(1)
+            if overlap:
+                scale_ratio_x *= 1.0 + (self.font_dim['width'] / (sym_dim['width'] * scale_ratio_x)) * overlap
+                y_overlap = min(0.01, overlap) # never aggressive vertical overlap
+                scale_ratio_y *= 1.0 + (self.font_dim['height'] / (sym_dim['height'] * scale_ratio_y)) * y_overlap
+
+            # Size in x to size in y ratio limit (to prevent over-wide glyphs)
+            xy_ratio_max = sym_attr['params'].get('xy-ratio')
+            if (xy_ratio_max):
+                xy_ratio = sym_dim['width'] * scale_ratio_x / (sym_dim['height'] * scale_ratio_y)
+                if xy_ratio > xy_ratio_max:
+                    scale_ratio_x = scale_ratio_x * xy_ratio_max / xy_ratio
+
+            if scale_ratio_x != 1.0 or scale_ratio_y != 1.0:
+                self.sourceFont[currentSourceFontGlyph].transform(psMat.scale(scale_ratio_x, scale_ratio_y))
+
+            # We pasted and scaled now we want to align/move
+            # Use the dimensions from the newly pasted and stretched glyph to avoid any rounding errors
+            sym_dim = get_glyph_dimensions(self.sourceFont[currentSourceFontGlyph])
+            # Use combined bounding box?
+            if glyph_scale_data is not None and glyph_scale_data[1] is not None:
+                scaleglyph_dim = scale_bounding_box(glyph_scale_data[1], scale_ratio_x, scale_ratio_y)
+                if scaleglyph_dim['advance'] is None:
+                    # On monospaced symbol collections use their advance with, otherwise align horizontally individually
+                    scaleglyph_dim['xmin'] = sym_dim['xmin']
+                    scaleglyph_dim['xmax'] = sym_dim['xmax']
+                    scaleglyph_dim['width'] = sym_dim['width']
+                sym_dim = scaleglyph_dim
+
+            y_align_distance = 0
+            if sym_attr['valign'] == 'c':
+                # Center the symbol vertically by matching the center of the line height and center of symbol
+                sym_ycenter = sym_dim['ymax'] - (sym_dim['height'] / 2)
+                font_ycenter = self.font_dim['ymax'] - (self.font_dim['height'] / 2)
+                y_align_distance = font_ycenter - sym_ycenter
+
+            # Handle glyph l/r/c alignment
+            x_align_distance = 0
+            if self.args.nonmono and sym_dim['advance'] is None:
+                # Remove left side bearing
+                # (i.e. do not remove left side bearing when combined BB is in use)
+                x_align_distance = -self.sourceFont[currentSourceFontGlyph].left_side_bearing
+            elif sym_attr['align']:
+                # First find the baseline x-alignment (left alignment amount)
+                x_align_distance = self.font_dim['xmin'] - sym_dim['xmin']
+                if sym_attr['align'] == 'c':
+                    # Center align
+                    x_align_distance += (self.font_dim['width'] / 2) - (sym_dim['width'] / 2)
+                elif sym_attr['align'] == 'r':
+                    # Right align
+                    x_align_distance += self.font_dim['width'] * self.get_target_width(stretch) - sym_dim['width']
+                # If symbol glyph is wider than target font cell, just left-align
+                x_align_distance = max(self.font_dim['xmin'] - sym_dim['xmin'], x_align_distance)
+
+            if overlap:
+                overlap_width = self.font_dim['width'] * overlap
+                if sym_attr['align'] == 'l':
+                    x_align_distance -= overlap_width
+                elif sym_attr['align'] == 'c':
+                    if overlap_width > 0:
+                        x_align_distance -= overlap_width / 2
+                elif sym_attr['align'] == 'r':
+                    # Check and correct overlap; it can go wrong if we have a xy-ratio limit
+                    target_xmax = (self.font_dim['xmin'] + self.font_dim['width']) * self.get_target_width(stretch)
+                    target_xmax += overlap_width
+                    glyph_xmax = sym_dim['xmax'] + x_align_distance
+                    correction = target_xmax - glyph_xmax
+                    x_align_distance += correction
+
+            align_matrix = psMat.translate(x_align_distance, y_align_distance)
+            self.sourceFont[currentSourceFontGlyph].transform(align_matrix)
+
+            # Ensure after horizontal adjustments and centering that the glyph
+            # does not overlap the bearings (edges)
+            if not overlap:
+                self.remove_glyph_neg_bearings(self.sourceFont[currentSourceFontGlyph])
+
+            # Needed for setting 'advance width' on each glyph so they do not overlap,
+            # also ensures the font is considered monospaced on Windows by setting the
+            # same width for all character glyphs. This needs to be done for all glyphs,
+            # even the ones that are empty and didn't go through the scaling operations.
+            # It should come after setting the glyph bearings
+            if not self.args.nonmono:
+                self.set_glyph_width_mono(self.sourceFont[currentSourceFontGlyph])
+            else:
+                # Target font with variable advance width get the icons with their native widths
+                # and keeping possible (right and/or negative) bearings in effect
+                if sym_dim['advance'] is not None:
+                    # 'Width' from monospaced scale group
+                    width = sym_dim['advance']
+                else:
+                    width = sym_dim['width']
+                # If we have overlap we need to subtract that to keep/get negative bearings
+                if overlap and (sym_attr['align'] == 'l' or sym_attr['align'] == 'r'):
+                    width -= overlap_width
+                # Fontforge handles the width change like this:
+                # - Keep existing left_side_bearing
+                # - Set width
+                # - Calculate and set new right_side_bearing
+                self.sourceFont[currentSourceFontGlyph].width = int(width)
+
+            # Check if the inserted glyph is scaled correctly for monospace
+            if self.args.single:
+                (xmin, _, xmax, _) = self.sourceFont[currentSourceFontGlyph].boundingBox()
+                if int(xmax - xmin) > self.font_dim['width'] * (1 + (overlap or 0)):
+                    logger.warning("Scaled glyph %X wider than one monospace width (%d / %d (overlap %s))",
+                        currentSourceFontGlyph, int(xmax - xmin), self.font_dim['width'], repr(overlap))
+
+        # end for
+
+        if not self.args.quiet:
+            sys.stdout.write("\n")
+
+
+    def set_sourcefont_glyph_widths(self):
+        """ Makes self.sourceFont monospace compliant """
+
+        for glyph in self.sourceFont.glyphs():
+            if (glyph.width == self.font_dim['width']):
+                # Don't touch the (negative) bearings if the width is ok
+                # Ligartures will have these.
+                continue
+
+            if (glyph.width != 0):
+                # If the width is zero this glyph is intened to be printed on top of another one.
+                # In this case we need to keep the negative bearings to shift it 'left'.
+                # Things like &Auml; have these: composed of U+0041 'A' and U+0308 'double dot above'
+                #
+                # If width is not zero, correct the bearings such that they are within the width:
+                self.remove_glyph_neg_bearings(glyph)
+
+            self.set_glyph_width_mono(glyph)
+
+
+    def remove_glyph_neg_bearings(self, glyph):
+        """ Sets passed glyph's bearings 0 if they are negative. """
+        try:
+            if glyph.left_side_bearing < 0:
+                glyph.left_side_bearing = 0
+            if glyph.right_side_bearing < 0:
+                glyph.right_side_bearing = 0
+        except:
+            pass
+
+
+    def set_glyph_width_mono(self, glyph):
+        """ Sets passed glyph.width to self.font_dim.width.
+
+        self.font_dim.width is set with self.get_sourcefont_dimensions().
+        """
+        try:
+            # Fontforge handles the width change like this:
+            # - Keep existing left_side_bearing
+            # - Set width
+            # - Calculate and set new right_side_bearing
+            glyph.width = self.font_dim['width']
+        except:
+            pass
+
+    def prepareScaleRules(self, scaleRules, stretch, symbolFont, destGlyph):
+        """ Prepare raw ScaleRules data for use """
+        # The scaleRules is/will be a dict with these (possible) entries:
+        # 'ScaleGroups': List of ((lists of glyph codes) or (ranges of glyph codes)) that shall be scaled
+        # 'scales': List of associated scale factors, one for each entry in 'ScaleGroups' (generated by this function)
+        # 'bbdims': List of associated sym_dim dicts, one for each entry in 'ScaleGroups' (generated by this function)
+        #           Each dim_dict describes the combined bounding box of all glyphs in one ScaleGroups group
+        # Example:
+        # { 'ScaleGroups': [ range(1, 3), [ 7, 10 ], ],
+        #   'scales':      [ 1.23,        1.33,      ],
+        #   'bbdims':      [ dim_dict1,   dim_dict2, ] }
+        #
+        # Each item in 'ScaleGroups' (a range or an explicit list) forms a group of glyphs that shall be
+        # as rescaled all with the same and maximum possible (for the included glyphs) 'pa' factor.
+        # If the 'bbdims' is present they all shall be shifted in the same way.
+        #
+        # Previously this structure has been used:
+        #   'ScaleGlyph' Lead glyph, which scaling factor is taken
+        #   'GlyphsToScale': List of ((glyph code) or (tuple of two glyph codes that form a closed range)) that shall be scaled
+        #   Note that this allows only one group for the whle symbol font, and that the scaling factor is defined by
+        #   a specific character, which needs to be manually selected (on each symbol font update).
+        #   Previous entries are automatically rewritten to the new style.
+        #
+        # Note that scaleRules is overwritten with the added data.
+        if 'scales' in scaleRules:
+            # Already prepared... must not happen, ignore call
+            return
+
+        scaleRules['scales'] = []
+        scaleRules['bbdims'] = []
+        if 'ScaleGroups' not in scaleRules:
+            scaleRules['ScaleGroups'] = []
+        for group in scaleRules['ScaleGroups']:
+            sym_dim = get_multiglyph_boundingBox([ symbolFont[g] if g in symbolFont else None for g in group ], destGlyph)
+            scale = self.get_scale_factors(sym_dim, stretch)[0]
+            scaleRules['scales'].append(scale)
+            scaleRules['bbdims'].append(sym_dim)
+
+        if 'ScaleGlyph' in scaleRules:
+            # Rewrite to equivalent ScaleGroup
+            group_list = []
+            if 'GlyphsToScale+' in scaleRules:
+                key = 'GlyphsToScale+'
+                plus = True
+            else:
+                key = 'GlyphsToScale'
+                plus = False
+            for i in scaleRules[key]:
+                if isinstance(i, tuple):
+                    group_list.append(range(i[0], i[1] + 1))
+                else:
+                    group_list.append(i)
+            sym_dim = get_glyph_dimensions(symbolFont[scaleRules['ScaleGlyph']])
+            scale = self.get_scale_factors(sym_dim, stretch)[0]
+            scaleRules['ScaleGroups'].append(group_list)
+            scaleRules['scales'].append(scale)
+            if plus:
+                scaleRules['bbdims'].append(sym_dim)
+            else:
+                scaleRules['bbdims'].append(None) # The 'old' style keeps just the scale, not the positioning
+
+    def get_glyph_scale(self, symbol_unicode, scaleRules, stretch, symbolFont, dest_unicode):
+        """ Determines whether or not to use scaled glyphs for glyph in passed symbol_unicode """
+        # Potentially destorys the contents of self.sourceFont[dest_unicode]
+        if not 'scales' in scaleRules:
+            if not dest_unicode in self.sourceFont:
+                self.sourceFont.createChar(dest_unicode)
+            self.prepareScaleRules(scaleRules, stretch, symbolFont, self.sourceFont[dest_unicode])
+        for glyph_list, scale, box in zip(scaleRules['ScaleGroups'], scaleRules['scales'], scaleRules['bbdims']):
+            for e in glyph_list:
+                if isinstance(e, range):
+                    if symbol_unicode in e:
+                        return (scale, box)
+                elif symbol_unicode == e:
+                    return (scale, box)
+        return None
+
+
+def half_gap(gap, top):
+    """ Divides integer value into two new integers """
+    # Line gap add extra space on the bottom of the line which
+    # doesn't allow the powerline glyphs to fill the entire line.
+    # Put half of the gap into the 'cell', each top and bottom
+    if gap <= 0:
+        return 0
+    gap_top = int(gap / 2)
+    gap_bottom = gap - gap_top
+    if top:
+        logger.info("Redistributing line gap of %d (%d top and %d bottom)", gap, gap_top, gap_bottom)
+        return gap_top
+    return gap_bottom
+
+def replace_font_name(font_name, replacement_dict):
+    """ Replaces all keys with vals from replacement_dict in font_name. """
+    for key, val in replacement_dict.items():
+        font_name = font_name.replace(key, val)
+    return font_name
+
+
+def make_sure_path_exists(path):
+    """ Verifies path passed to it exists. """
+    try:
+        os.makedirs(path)
+    except OSError as exception:
+        if exception.errno != errno.EEXIST:
+            raise
+
+def sanitize_filename(filename, allow_dirs = False):
+    """ Enforces to not use forbitten characters in a filename/path. """
+    if filename == '.' and not allow_dirs:
+        return '_'
+    trans = filename.maketrans('<>:"|?*', '_______')
+    for i in range(0x00, 0x20):
+        trans[i] = ord('_')
+    if not allow_dirs:
+        trans[ord('/')] = ord('_')
+        trans[ord('\\')] = ord('_')
+    else:
+        trans[ord('\\')] = ord('/') # We use posix paths
+    return filename.translate(trans)
+
+def get_multiglyph_boundingBox(glyphs, destGlyph = None):
+    """ Returns dict of the dimensions of multiple glyphs combined(, as if they are copied into destGlyph) """
+    # If destGlyph is given the glyph(s) are first copied over into that
+    # glyph and measured in that font (to avoid rounding errors)
+    # Leaves the destGlyph in unknown state!
+    bbox = [ None, None, None, None, None ]
+    for glyph in glyphs:
+        if glyph is None:
+            # Glyph has been in defining range but is not in the actual font
+            continue
+        if destGlyph and glyph.font != destGlyph.font:
+            glyph.font.selection.select(glyph)
+            glyph.font.copy()
+            destGlyph.font.selection.select(destGlyph)
+            destGlyph.font.paste()
+            glyph = destGlyph
+        gbb = glyph.boundingBox()
+        gadvance = glyph.width
+        if len(glyphs) > 1 and gbb[0] == gbb[2] and gbb[1] == gbb[3]:
+            # Ignore empty glyphs if we examine more than one glyph
+            continue
+        bbox[0] = gbb[0] if bbox[0] is None or bbox[0] > gbb[0] else bbox[0]
+        bbox[1] = gbb[1] if bbox[1] is None or bbox[1] > gbb[1] else bbox[1]
+        bbox[2] = gbb[2] if bbox[2] is None or bbox[2] < gbb[2] else bbox[2]
+        bbox[3] = gbb[3] if bbox[3] is None or bbox[3] < gbb[3] else bbox[3]
+        if not bbox[4]:
+            bbox[4] = -gadvance # Negative for one/first glyph
+        else:
+            if abs(bbox[4]) != gadvance:
+                bbox[4] = -1 # Marker for not-monospaced
+            else:
+                bbox[4] = gadvance # Positive for 2 or more glyphs
+    if bbox[4] and bbox[4] < 0:
+        # Not monospaced when only one glyph is used or multiple glyphs with different advance widths
+        bbox[4] = None
+    return {
+        'xmin'   : bbox[0],
+        'ymin'   : bbox[1],
+        'xmax'   : bbox[2],
+        'ymax'   : bbox[3],
+        'width'  : bbox[2] + (-bbox[0]),
+        'height' : bbox[3] + (-bbox[1]),
+        'advance': bbox[4], # advance width if monospaced
+    }
+
+def get_glyph_dimensions(glyph):
+    """ Returns dict of the dimesions of the glyph passed to it. """
+    return get_multiglyph_boundingBox([ glyph ])
+
+def scale_bounding_box(bbox, scale_x, scale_y):
+    """ Return a scaled version of a glyph dimensions dict """
+    # Simulate scaling on combined bounding box, round values for better simulation
+    new_dim = {
+        'xmin'   : int(bbox['xmin'] * scale_x),
+        'ymin'   : int(bbox['ymin'] * scale_y),
+        'xmax'   : int(bbox['xmax'] * scale_x),
+        'ymax'   : int(bbox['ymax'] * scale_y),
+        'advance': int(bbox['advance'] * scale_x) if bbox['advance'] is not None else None,
+        }
+    new_dim['width'] = new_dim['xmax'] + (-new_dim['xmin'])
+    new_dim['height'] = new_dim['ymax'] + (-new_dim['ymin'])
+    return new_dim
+
+def update_progress(progress):
+    """ Updates progress bar length.
+
+    Accepts a float between 0.0 and 1.0. Any int will be converted to a float.
+    A value at 1 or bigger represents 100%
+    modified from: https://stackoverflow.com/questions/3160699/python-progress-bar
+    """
+    barLength = 40  # Modify this to change the length of the progress bar
+    if isinstance(progress, int):
+        progress = float(progress)
+    if progress >= 1:
+        progress = 1
+        status = "Done...\r\n"  # NOTE: status initialized and never used
+    block = int(round(barLength * progress))
+    text = "\r╢{0}╟ {1}%".format("█" * block + "░" * (barLength - block), int(progress * 100))
+    sys.stdout.write(text)
+    sys.stdout.flush()
+
+
+def check_fontforge_min_version():
+    """ Verifies installed FontForge version meets minimum requirement. """
+    minimumVersion = 20141231
+    actualVersion = int(fontforge.version())
+
+    # un-comment following line for testing invalid version error handling
+    # actualVersion = 20120731
+
+    # versions tested: 20150612, 20150824
+    if actualVersion < minimumVersion:
+        logger.critical("You seem to be using an unsupported (old) version of fontforge: %d", actualVersion)
+        logger.critical("Please use at least version: %d", minimumVersion)
+        sys.exit(1)
+
+def check_version_with_git(version):
+    """ Upgraded the version to the current git tag version (starting with 'v') """
+    git = subprocess.run("git describe --tags",
+            cwd=os.path.dirname(__file__),
+            shell=True,
+            stdout=subprocess.PIPE, stderr=subprocess.DEVNULL
+        ).stdout.decode('utf-8')
+    if len(git) == 0:
+        return False
+    tag = git.strip()
+    if len(tag) == 0 or not tag.startswith('v'):
+        return False
+    tag = tag[1:]
+    r = re.search('(.*?)(-[0-9]+)-g[0-9a-fA-F]+$', tag)
+    if r:
+        tag = r.group(1)
+        patchlevel = r.group(2)
+    else:
+        patchlevel = ""
+    # Inspired by Phaxmohdem's versiontuple https://stackoverflow.com/a/28568003
+
+    versiontuple = lambda v: tuple( p.zfill(8) for p in v.split(".") )
+    if versiontuple(tag) > versiontuple(version):
+        return tag + patchlevel
+    if versiontuple(tag) == versiontuple(version) and len(patchlevel) > 0:
+        return tag + patchlevel
+    return False
+
+def setup_arguments():
+    parser = argparse.ArgumentParser(
+        description=(
+            'Nerd Fonts Font Patcher: patches a given font with programming and development related glyphs\n\n'
+            '* Website: https://www.nerdfonts.com\n'
+            '* Version: ' + version + '\n'
+            '* Development Website: https://github.com/ryanoasis/nerd-fonts\n'
+            '* Changelog: https://github.com/ryanoasis/nerd-fonts/blob/-/changelog.md'),
+        formatter_class=RawTextHelpFormatter
+    )
+
+    # optional arguments
+    parser.add_argument('font',                                      help='The path to the font to patch (e.g., Inconsolata.otf)')
+    parser.add_argument('-v', '--version',                           action='version',        version=projectName + ": %(prog)s (" + version + ")")
+    parser.add_argument('-s', '--mono', '--use-single-width-glyphs', dest='single',           default=False, action='count',      help='Whether to generate the glyphs as single-width not double-width (default is double-width) (Nerd Font Mono)')
+    parser.add_argument('--variable-width-glyphs',                   dest='nonmono',          default=False, action='store_true', help='Do not adjust advance width (no "overhang") (Nerd Font Propo)')
+    parser.add_argument('--debug',                                   dest='debugmode',        default=0,     type=int, nargs='?', help='Verbose mode (optional: 1=just to file; 2*=just to terminal; 3=display and file)', const=2, choices=range(0, 3 + 1))
+    parser.add_argument('-q', '--quiet',                             dest='quiet',            default=False, action='store_true', help='Do not generate verbose output')
+    parser.add_argument('--careful',                                 dest='careful',          default=False, action='store_true', help='Do not overwrite existing glyphs if detected')
+    parser.add_argument('-ext', '--extension',                       dest='extension',        default="",    type=str,            help='Change font file type to create (e.g., ttf, otf)')
+    parser.add_argument('-out', '--outputdir',                       dest='outputdir',        default=".",   type=str,            help='The directory to output the patched font file to')
+    parser.add_argument('--makegroups',                              dest='makegroups',       default=1,     type=int, nargs='?', help='Use alternative method to name patched fonts (default=1)', const=1, choices=range(-1, 6 + 1))
+    # --makegroup has an additional undocumented numeric specifier. '--makegroup' is in fact '--makegroup 1'.
+    # Original font name: Hugo Sans Mono ExtraCondensed Light Italic
+    #                                                              NF  Fam agg.
+    # -1  no renaming at all (keep old names and versions etc)     --- --- ---
+    #  0  turned off, use old naming scheme                        [-] [-] [-]
+    #  1  HugoSansMono Nerd Font ExtraCondensed Light Italic       [ ] [ ] [ ]
+    #  2  HugoSansMono Nerd Font ExtCn Light Italic                [ ] [X] [ ]
+    #  3  HugoSansMono Nerd Font XCn Lt It                         [ ] [X] [X]
+    #  4  HugoSansMono NF ExtraCondensed Light Italic              [X] [ ] [ ]
+    #  5  HugoSansMono NF ExtCn Light Italic                       [X] [X] [ ]
+    #  6  HugoSansMono NF XCn Lt It                                [X] [X] [X]
+
+    sym_font_group = parser.add_argument_group('Symbol Fonts')
+    sym_font_group.add_argument('-c', '--complete',                             dest='complete',             default=False, action='store_true', help='Add all available Glyphs')
+    sym_font_group.add_argument('--codicons',                                   dest='codicons',             default=False, action='store_true', help='Add Codicons Glyphs (https://github.com/microsoft/vscode-codicons)')
+    sym_font_group.add_argument('--fontawesome',                                dest='fontawesome',          default=False, action='store_true', help='Add Font Awesome Glyphs (http://fontawesome.io/)')
+    sym_font_group.add_argument('--fontawesomeext',                             dest='fontawesomeextension', default=False, action='store_true', help='Add Font Awesome Extension Glyphs (https://andrelzgava.github.io/font-awesome-extension/)')
+    sym_font_group.add_argument('--fontlogos',                                  dest='fontlogos',            default=False, action='store_true', help='Add Font Logos Glyphs (https://github.com/Lukas-W/font-logos)')
+    sym_font_group.add_argument('--material', '--mdi',                          dest='material',             default=False, action='store_true', help='Add Material Design Icons (https://github.com/templarian/MaterialDesign)')
+    sym_font_group.add_argument('--octicons',                                   dest='octicons',             default=False, action='store_true', help='Add Octicons Glyphs (https://octicons.github.com)')
+    sym_font_group.add_argument('--powersymbols',                               dest='powersymbols',         default=False, action='store_true', help='Add IEC Power Symbols (https://unicodepowersymbol.com/)')
+    sym_font_group.add_argument('--pomicons',                                   dest='pomicons',             default=False, action='store_true', help='Add Pomicon Glyphs (https://github.com/gabrielelana/pomicons)')
+    sym_font_group.add_argument('--powerline',                                  dest='powerline',            default=False, action='store_true', help='Add Powerline Glyphs')
+    sym_font_group.add_argument('--powerlineextra',                             dest='powerlineextra',       default=False, action='store_true', help='Add Powerline Extra Glyphs (https://github.com/ryanoasis/powerline-extra-symbols)')
+    sym_font_group.add_argument('--weather',                                    dest='weather',              default=False, action='store_true', help='Add Weather Icons (https://github.com/erikflowers/weather-icons)')
+
+    expert_group = parser.add_argument_group('Expert Options')
+    expert_group.add_argument('--boxdrawing',                              dest='forcebox',         default=False, action='store_true', help='Force patching in (over existing) box drawing glyphs')
+    expert_group.add_argument('--configfile',                              dest='configfile',       default=False, type=str,            help='Specify a file path for JSON configuration file (see sample: src/config.sample.json)')
+    expert_group.add_argument('--custom',                                  dest='custom',           default=False, type=str,            help='Specify a custom symbol font, all glyphs will be copied; absolute path suggested')
+
+    expert_group.add_argument('--dry',                                     dest='dry_run',          default=False, action='store_true', help='Do neither patch nor store the font, to check naming')
+    expert_group.add_argument('--glyphdir',                                dest='glyphdir',         default=__dir__ + "/src/glyphs/", type=str, help='Path to glyphs to be used for patching')
+    expert_group.add_argument('--has-no-italic',                           dest='noitalic',         default=False, action='store_true', help='Font family does not have Italic (but Oblique), to help create correct RIBBI set')
+    expert_group.add_argument('-l', '--adjust-line-height',                dest='adjustLineHeight', default=False, action='store_true', help='Whether to adjust line heights (attempt to center powerline separators more evenly)')
+    expert_group.add_argument('--metrics',                                 dest='metrics',          default=None, choices=get_metrics_names(), help='Select vertical metrics source (for problematic cases)')
+    expert_group.add_argument('--name',                                    dest='force_name',       default=None, type=str,             help='Specify naming source (\'full\', \'postscript\', \'filename\', or concrete free name-string)')
+    expert_group.add_argument('--postprocess',                             dest='postprocess',      default=False, type=str,            help='Specify a Script for Post Processing')
+    progressbars_group_parser = expert_group.add_mutually_exclusive_group(required=False)
+    expert_group.add_argument('--removeligs', '--removeligatures',         dest='removeligatures',  default=False, action='store_true', help='Removes ligatures specificed in JSON configuration file (needs --configfile)')
+    expert_group.add_argument('--xavgcharwidth',                           dest='xavgwidth',        default=None,  type=int, nargs='?', help='Adjust xAvgCharWidth (optional: concrete value)', const=True)
+    # --xavgcharwidth for compatibility with old applications like notepad and non-latin fonts
+    # Possible values with examples:
+    # <none>  - copy from sourcefont (default)
+    # 0       - calculate from font according to OS/2-version-2
+    # 500     - set to 500
+
+    # progress bar arguments - https://stackoverflow.com/questions/15008758/parsing-boolean-values-with-argparse
+    progressbars_group_parser.add_argument('--progressbars',         dest='progressbars',     action='store_true',                help='Show percentage completion progress bars per Glyph Set (default)')
+    progressbars_group_parser.add_argument('--no-progressbars',      dest='progressbars',     action='store_false',               help='Don\'t show percentage completion progress bars per Glyph Set')
+    expert_group.set_defaults(progressbars=True)
+
+    args = parser.parse_args()
+
+    if args.makegroups > 0 and not FontnameParserOK:
+        logger.critical("FontnameParser module missing (bin/scripts/name_parser/Fontname*), specify --makegroups 0")
+        sys.exit(1)
+
+    # if you add a new font, set it to True here inside the if condition
+    if args.complete:
+        args.fontawesome = True
+        args.fontawesomeextension = True
+        args.fontlogos = True
+        args.octicons = True
+        args.codicons = True
+        args.powersymbols = True
+        args.pomicons = True
+        args.powerline = True
+        args.powerlineextra = True
+        args.material = True
+        args.weather = True
+
+    if not args.complete:
+        sym_font_args = []
+        # add the list of arguments for each symbol font to the list sym_font_args
+        for action in sym_font_group._group_actions:
+            sym_font_args.append(action.__dict__['option_strings'])
+
+        # determine whether or not all symbol fonts are to be used
+        font_complete = True
+        for sym_font_arg_aliases in sym_font_args:
+            found = False
+            for alias in sym_font_arg_aliases:
+                if alias in sys.argv:
+                    found = True
+            if not found:
+                font_complete = False
+        args.complete = font_complete
+
+    if args.nonmono and args.single:
+        logger.warning("Specified contradicting --variable-width-glyphs and --use-single-width-glyph. Ignoring --variable-width-glyphs.")
+        args.nonmono = False
+
+    make_sure_path_exists(args.outputdir)
+    if not os.path.isfile(args.font):
+        logger.critical("Font file does not exist: %s", args.font)
+        sys.exit(1)
+    if not os.access(args.font, os.R_OK):
+        logger.critical("Can not open font file for reading: %s", args.font)
+        sys.exit(1)
+    is_ttc = len(fontforge.fontsInFile(args.font)) > 1
+    try:
+        source_font_test = TableHEADWriter(args.font)
+        args.is_variable = source_font_test.find_table([b'avar', b'cvar', b'fvar', b'gvarb', b'HVAR', b'MVAR', b'VVAR'], 0)
+        if args.is_variable:
+            logger.warning("Source font is a variable open type font (VF), opening might fail...")
+    except:
+        args.is_variable = False
+    finally:
+        try:
+            source_font_test.close()
+        except:
+            pass
+
+    if args.extension == "":
+        args.extension = os.path.splitext(args.font)[1]
+    else:
+        args.extension = '.' + args.extension
+    if re.match("\.ttc$", args.extension, re.IGNORECASE):
+        if not is_ttc:
+            logger.critical("Can not create True Type Collections from single font files")
+            sys.exit(1)
+    else:
+        if is_ttc:
+            logger.critical("Can not create single font files from True Type Collections")
+            sys.exit(1)
+
+    if isinstance(args.xavgwidth, int) and not isinstance(args.xavgwidth, bool):
+        if args.xavgwidth < 0:
+            logger.critical("--xavgcharwidth takes no negative numbers")
+            sys.exit(2)
+        if args.xavgwidth > 16384:
+            logger.critical("--xavgcharwidth takes only numbers up to 16384")
+            sys.exit(2)
+
+    return args
+
+def main():
+    global logger
+    logger = logging.getLogger("start") # Use start logger until we can set up something sane
+    s_handler = logging.StreamHandler(stream=sys.stdout)
+    s_handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
+    logger.addHandler(s_handler)
+
+    global version
+    git_version = check_version_with_git(version)
+    allversions = "Patcher v{} ({}) (ff {})".format(
+        git_version if git_version else version, script_version, fontforge.version())
+    print("{} {}".format(projectName, allversions))
+    if git_version:
+        version = git_version
+    check_fontforge_min_version()
+    args = setup_arguments()
+
+    logger = logging.getLogger(os.path.basename(args.font))
+    logger.setLevel(logging.DEBUG)
+    log_to_file = (args.debugmode & 1 == 1)
+    if log_to_file:
+        try:
+            f_handler = logging.FileHandler('font-patcher-log.txt')
+            f_handler.setFormatter(logging.Formatter('%(levelname)s: %(name)s %(message)s'))
+            logger.addHandler(f_handler)
+        except:
+            log_to_file = False
+        logger.debug(allversions)
+        logger.debug("Options %s", repr(sys.argv[1:]))
+    c_handler = logging.StreamHandler(stream=sys.stdout)
+    c_handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
+    if not (args.debugmode & 2 == 2):
+        c_handler.setLevel(logging.INFO)
+    logger.addHandler(c_handler)
+    if (args.debugmode & 1 == 1) and not log_to_file:
+        logger.info("Can not write logfile, disabling")
+    logger.debug("Naming mode %d", args.makegroups)
+
+    patcher = font_patcher(args)
+
+    sourceFonts = []
+    all_fonts = fontforge.fontsInFile(args.font)
+    for i, subfont in enumerate(all_fonts):
+        if len(all_fonts) > 1:
+          print("\n")
+          logger.info("Processing %s (%d/%d)", subfont, i + 1, len(all_fonts))
+        try:
+            sourceFonts.append(fontforge.open("{}({})".format(args.font, subfont), 1)) # 1 = ("fstypepermitted",))
+        except Exception:
+            logger.critical("Can not open font '%s', try to open with fontforge interactively to get more information",
+                subfont)
+            sys.exit(1)
+
+        patcher.setup_name_backup(sourceFonts[-1])
+        patcher.patch(sourceFonts[-1])
+
+    print("Done with Patch Sets, generating font...")
+    for f in sourceFonts:
+        patcher.setup_font_names(f)
+    patcher.generate(sourceFonts)
+
+    for f in sourceFonts:
+        f.close()
+
+
+if __name__ == "__main__":
+    __dir__ = os.path.dirname(os.path.abspath(__file__))
+    main()
diff --git a/bin/nerdfont/readme.md b/bin/nerdfont/readme.md
new file mode 100644
index 0000000..e782333
--- /dev/null
+++ b/bin/nerdfont/readme.md
@@ -0,0 +1,15 @@
+
+# Nerd Fonts
+
+This is font-patcher python script (and required source files) from a Nerd Fonts release.
+
+## Running
+
+* To execute run: `fontforge --script ./font-patcher --complete <YOUR FONT FILE>`
+* For more CLI options and help: `fontforge --script ./font-patcher --help`
+
+## Further info
+
+For more information see:
+* https://github.com/ryanoasis/nerd-fonts/
+* https://github.com/ryanoasis/nerd-fonts/releases/latest/
diff --git a/bin/nerdfont/src/glyphs/README.md b/bin/nerdfont/src/glyphs/README.md
new file mode 100644
index 0000000..34801ba
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/README.md
@@ -0,0 +1,8 @@
+### Contents
+
+This directory contains all the glyphs (glyph sets) that the `font-patcher` puts into the fonts.
+
+If a icon font here is updated, do not forget to update the database file in `bin/script/libs`.
+
+The 'Seti and Original' icons (in `original-source.otf`) is automatically generated from the glyphs in `src/svgs`.
+Do not edit and commit changes to that font directly.
diff --git a/bin/nerdfont/src/glyphs/Unicode_IEC_symbol_font.otf b/bin/nerdfont/src/glyphs/Unicode_IEC_symbol_font.otf
new file mode 100644
index 0000000..4b84f61
Binary files /dev/null and b/bin/nerdfont/src/glyphs/Unicode_IEC_symbol_font.otf differ
diff --git a/bin/nerdfont/src/glyphs/codicons/LICENSE.txt b/bin/nerdfont/src/glyphs/codicons/LICENSE.txt
new file mode 100644
index 0000000..a2c95fc
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/codicons/LICENSE.txt
@@ -0,0 +1,395 @@
+Attribution 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+     Considerations for licensors: Our public licenses are
+     intended for use by those authorized to give the public
+     permission to use material in ways otherwise restricted by
+     copyright and certain other rights. Our licenses are
+     irrevocable. Licensors should read and understand the terms
+     and conditions of the license they choose before applying it.
+     Licensors should also secure all rights necessary before
+     applying our licenses so that the public can reuse the
+     material as expected. Licensors should clearly mark any
+     material not subject to the license. This includes other CC-
+     licensed material, or material used under an exception or
+     limitation to copyright. More considerations for licensors:
+	wiki.creativecommons.org/Considerations_for_licensors
+
+     Considerations for the public: By using one of our public
+     licenses, a licensor grants the public permission to use the
+     licensed material under specified terms and conditions. If
+     the licensor's permission is not necessary for any reason--for
+     example, because of any applicable exception or limitation to
+     copyright--then that use is not regulated by the license. Our
+     licenses grant only permissions under copyright and certain
+     other rights that a licensor has authority to grant. Use of
+     the licensed material may still be restricted for other
+     reasons, including because others have copyright or other
+     rights in the material. A licensor may make special requests,
+     such as asking that all changes be marked or described.
+     Although not required by our licenses, you are encouraged to
+     respect those requests where reasonable. More_considerations
+     for the public: 
+	wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution 4.0 International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution 4.0 International Public License ("Public License"). To the
+extent this Public License may be interpreted as a contract, You are
+granted the Licensed Rights in consideration of Your acceptance of
+these terms and conditions, and the Licensor grants You such rights in
+consideration of benefits the Licensor receives from making the
+Licensed Material available under these terms and conditions.
+
+
+Section 1 -- Definitions.
+
+  a. Adapted Material means material subject to Copyright and Similar
+     Rights that is derived from or based upon the Licensed Material
+     and in which the Licensed Material is translated, altered,
+     arranged, transformed, or otherwise modified in a manner requiring
+     permission under the Copyright and Similar Rights held by the
+     Licensor. For purposes of this Public License, where the Licensed
+     Material is a musical work, performance, or sound recording,
+     Adapted Material is always produced where the Licensed Material is
+     synched in timed relation with a moving image.
+
+  b. Adapter's License means the license You apply to Your Copyright
+     and Similar Rights in Your contributions to Adapted Material in
+     accordance with the terms and conditions of this Public License.
+
+  c. Copyright and Similar Rights means copyright and/or similar rights
+     closely related to copyright including, without limitation,
+     performance, broadcast, sound recording, and Sui Generis Database
+     Rights, without regard to how the rights are labeled or
+     categorized. For purposes of this Public License, the rights
+     specified in Section 2(b)(1)-(2) are not Copyright and Similar
+     Rights.
+
+  d. Effective Technological Measures means those measures that, in the
+     absence of proper authority, may not be circumvented under laws
+     fulfilling obligations under Article 11 of the WIPO Copyright
+     Treaty adopted on December 20, 1996, and/or similar international
+     agreements.
+
+  e. Exceptions and Limitations means fair use, fair dealing, and/or
+     any other exception or limitation to Copyright and Similar Rights
+     that applies to Your use of the Licensed Material.
+
+  f. Licensed Material means the artistic or literary work, database,
+     or other material to which the Licensor applied this Public
+     License.
+
+  g. Licensed Rights means the rights granted to You subject to the
+     terms and conditions of this Public License, which are limited to
+     all Copyright and Similar Rights that apply to Your use of the
+     Licensed Material and that the Licensor has authority to license.
+
+  h. Licensor means the individual(s) or entity(ies) granting rights
+     under this Public License.
+
+  i. Share means to provide material to the public by any means or
+     process that requires permission under the Licensed Rights, such
+     as reproduction, public display, public performance, distribution,
+     dissemination, communication, or importation, and to make material
+     available to the public including in ways that members of the
+     public may access the material from a place and at a time
+     individually chosen by them.
+
+  j. Sui Generis Database Rights means rights other than copyright
+     resulting from Directive 96/9/EC of the European Parliament and of
+     the Council of 11 March 1996 on the legal protection of databases,
+     as amended and/or succeeded, as well as other essentially
+     equivalent rights anywhere in the world.
+
+  k. You means the individual or entity exercising the Licensed Rights
+     under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+  a. License grant.
+
+       1. Subject to the terms and conditions of this Public License,
+          the Licensor hereby grants You a worldwide, royalty-free,
+          non-sublicensable, non-exclusive, irrevocable license to
+          exercise the Licensed Rights in the Licensed Material to:
+
+            a. reproduce and Share the Licensed Material, in whole or
+               in part; and
+
+            b. produce, reproduce, and Share Adapted Material.
+
+       2. Exceptions and Limitations. For the avoidance of doubt, where
+          Exceptions and Limitations apply to Your use, this Public
+          License does not apply, and You do not need to comply with
+          its terms and conditions.
+
+       3. Term. The term of this Public License is specified in Section
+          6(a).
+
+       4. Media and formats; technical modifications allowed. The
+          Licensor authorizes You to exercise the Licensed Rights in
+          all media and formats whether now known or hereafter created,
+          and to make technical modifications necessary to do so. The
+          Licensor waives and/or agrees not to assert any right or
+          authority to forbid You from making technical modifications
+          necessary to exercise the Licensed Rights, including
+          technical modifications necessary to circumvent Effective
+          Technological Measures. For purposes of this Public License,
+          simply making modifications authorized by this Section 2(a)
+          (4) never produces Adapted Material.
+
+       5. Downstream recipients.
+
+            a. Offer from the Licensor -- Licensed Material. Every
+               recipient of the Licensed Material automatically
+               receives an offer from the Licensor to exercise the
+               Licensed Rights under the terms and conditions of this
+               Public License.
+
+            b. No downstream restrictions. You may not offer or impose
+               any additional or different terms or conditions on, or
+               apply any Effective Technological Measures to, the
+               Licensed Material if doing so restricts exercise of the
+               Licensed Rights by any recipient of the Licensed
+               Material.
+
+       6. No endorsement. Nothing in this Public License constitutes or
+          may be construed as permission to assert or imply that You
+          are, or that Your use of the Licensed Material is, connected
+          with, or sponsored, endorsed, or granted official status by,
+          the Licensor or others designated to receive attribution as
+          provided in Section 3(a)(1)(A)(i).
+
+  b. Other rights.
+
+       1. Moral rights, such as the right of integrity, are not
+          licensed under this Public License, nor are publicity,
+          privacy, and/or other similar personality rights; however, to
+          the extent possible, the Licensor waives and/or agrees not to
+          assert any such rights held by the Licensor to the limited
+          extent necessary to allow You to exercise the Licensed
+          Rights, but not otherwise.
+
+       2. Patent and trademark rights are not licensed under this
+          Public License.
+
+       3. To the extent possible, the Licensor waives any right to
+          collect royalties from You for the exercise of the Licensed
+          Rights, whether directly or through a collecting society
+          under any voluntary or waivable statutory or compulsory
+          licensing scheme. In all other cases the Licensor expressly
+          reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+  a. Attribution.
+
+       1. If You Share the Licensed Material (including in modified
+          form), You must:
+
+            a. retain the following if it is supplied by the Licensor
+               with the Licensed Material:
+
+                 i. identification of the creator(s) of the Licensed
+                    Material and any others designated to receive
+                    attribution, in any reasonable manner requested by
+                    the Licensor (including by pseudonym if
+                    designated);
+
+                ii. a copyright notice;
+
+               iii. a notice that refers to this Public License;
+
+                iv. a notice that refers to the disclaimer of
+                    warranties;
+
+                 v. a URI or hyperlink to the Licensed Material to the
+                    extent reasonably practicable;
+
+            b. indicate if You modified the Licensed Material and
+               retain an indication of any previous modifications; and
+
+            c. indicate the Licensed Material is licensed under this
+               Public License, and include the text of, or the URI or
+               hyperlink to, this Public License.
+
+       2. You may satisfy the conditions in Section 3(a)(1) in any
+          reasonable manner based on the medium, means, and context in
+          which You Share the Licensed Material. For example, it may be
+          reasonable to satisfy the conditions by providing a URI or
+          hyperlink to a resource that includes the required
+          information.
+
+       3. If requested by the Licensor, You must remove any of the
+          information required by Section 3(a)(1)(A) to the extent
+          reasonably practicable.
+
+       4. If You Share Adapted Material You produce, the Adapter's
+          License You apply must not prevent recipients of the Adapted
+          Material from complying with this Public License.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+  a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+     to extract, reuse, reproduce, and Share all or a substantial
+     portion of the contents of the database;
+
+  b. if You include all or a substantial portion of the database
+     contents in a database in which You have Sui Generis Database
+     Rights, then the database in which You have Sui Generis Database
+     Rights (but not its individual contents) is Adapted Material; and
+
+  c. You must comply with the conditions in Section 3(a) if You Share
+     all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+  c. The disclaimer of warranties and limitation of liability provided
+     above shall be interpreted in a manner that, to the extent
+     possible, most closely approximates an absolute disclaimer and
+     waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+  a. This Public License applies for the term of the Copyright and
+     Similar Rights licensed here. However, if You fail to comply with
+     this Public License, then Your rights under this Public License
+     terminate automatically.
+
+  b. Where Your right to use the Licensed Material has terminated under
+     Section 6(a), it reinstates:
+
+       1. automatically as of the date the violation is cured, provided
+          it is cured within 30 days of Your discovery of the
+          violation; or
+
+       2. upon express reinstatement by the Licensor.
+
+     For the avoidance of doubt, this Section 6(b) does not affect any
+     right the Licensor may have to seek remedies for Your violations
+     of this Public License.
+
+  c. For the avoidance of doubt, the Licensor may also offer the
+     Licensed Material under separate terms or conditions or stop
+     distributing the Licensed Material at any time; however, doing so
+     will not terminate this Public License.
+
+  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+     License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+  a. The Licensor shall not be bound by any additional or different
+     terms or conditions communicated by You unless expressly agreed.
+
+  b. Any arrangements, understandings, or agreements regarding the
+     Licensed Material not stated herein are separate from and
+     independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+  a. For the avoidance of doubt, this Public License does not, and
+     shall not be interpreted to, reduce, limit, restrict, or impose
+     conditions on any use of the Licensed Material that could lawfully
+     be made without permission under this Public License.
+
+  b. To the extent possible, if any provision of this Public License is
+     deemed unenforceable, it shall be automatically reformed to the
+     minimum extent necessary to make it enforceable. If the provision
+     cannot be reformed, it shall be severed from this Public License
+     without affecting the enforceability of the remaining terms and
+     conditions.
+
+  c. No term or condition of this Public License will be waived and no
+     failure to comply consented to unless expressly agreed to by the
+     Licensor.
+
+  d. Nothing in this Public License constitutes or may be interpreted
+     as a limitation upon, or waiver of, any privileges and immunities
+     that apply to the Licensor or You, including from the legal
+     processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public
+licenses. Notwithstanding, Creative Commons may elect to apply one of
+its public licenses to material it publishes and in those instances
+will be considered the “Licensor.” The text of the Creative Commons
+public licenses is dedicated to the public domain under the CC0 Public
+Domain Dedication. Except for the limited purpose of indicating that
+material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the
+public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
\ No newline at end of file
diff --git a/bin/nerdfont/src/glyphs/codicons/README.md b/bin/nerdfont/src/glyphs/codicons/README.md
new file mode 100644
index 0000000..c746f31
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/codicons/README.md
@@ -0,0 +1,9 @@
+# Codicons
+
+For more information have a look at the upstream website: https://github.com/microsoft/vscode-codicons
+
+## Source bugs fixed
+
+Glyph 0xEB40 and 0xEB41 are defective in the original font. We fixed that manually.
+
+Version: 0.0.35
diff --git a/bin/nerdfont/src/glyphs/codicons/codicon.ttf b/bin/nerdfont/src/glyphs/codicons/codicon.ttf
new file mode 100644
index 0000000..c32cd9d
Binary files /dev/null and b/bin/nerdfont/src/glyphs/codicons/codicon.ttf differ
diff --git a/bin/nerdfont/src/glyphs/codicons/codicon_orig.ttf b/bin/nerdfont/src/glyphs/codicons/codicon_orig.ttf
new file mode 100644
index 0000000..0694339
Binary files /dev/null and b/bin/nerdfont/src/glyphs/codicons/codicon_orig.ttf differ
diff --git a/bin/nerdfont/src/glyphs/devicons/README.md b/bin/nerdfont/src/glyphs/devicons/README.md
new file mode 100644
index 0000000..6d0f3ba
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/devicons/README.md
@@ -0,0 +1,12 @@
+# Devicons
+
+For more information have a look at the upstream website: https://github.com/vorillaz/devicons
+
+This is taken directly from the repository default branch, which is ahead of release 1.8.0.
+We call it 1.8.1 here, but there is no such release.
+
+## Source bugs fixed
+
+Glyph 0xE6B6 is defective in the original font. We hand optimized and fixed that.
+
+Version: 1.8.1
diff --git a/bin/nerdfont/src/glyphs/devicons/devicons.ttf b/bin/nerdfont/src/glyphs/devicons/devicons.ttf
new file mode 100644
index 0000000..e882ad5
Binary files /dev/null and b/bin/nerdfont/src/glyphs/devicons/devicons.ttf differ
diff --git a/bin/nerdfont/src/glyphs/devicons/devicons_orig.ttf b/bin/nerdfont/src/glyphs/devicons/devicons_orig.ttf
new file mode 100644
index 0000000..b4980db
Binary files /dev/null and b/bin/nerdfont/src/glyphs/devicons/devicons_orig.ttf differ
diff --git a/bin/nerdfont/src/glyphs/extraglyphs.sfd b/bin/nerdfont/src/glyphs/extraglyphs.sfd
new file mode 100644
index 0000000..dc5d252
Binary files /dev/null and b/bin/nerdfont/src/glyphs/extraglyphs.sfd differ
diff --git a/bin/nerdfont/src/glyphs/font-awesome-extension.ttf b/bin/nerdfont/src/glyphs/font-awesome-extension.ttf
new file mode 100644
index 0000000..5128ce4
Binary files /dev/null and b/bin/nerdfont/src/glyphs/font-awesome-extension.ttf differ
diff --git a/bin/nerdfont/src/glyphs/font-awesome/FontAwesome.otf b/bin/nerdfont/src/glyphs/font-awesome/FontAwesome.otf
new file mode 100644
index 0000000..25a4328
Binary files /dev/null and b/bin/nerdfont/src/glyphs/font-awesome/FontAwesome.otf differ
diff --git a/bin/nerdfont/src/glyphs/font-awesome/LICENSE.txt b/bin/nerdfont/src/glyphs/font-awesome/LICENSE.txt
new file mode 100644
index 0000000..cc557ec
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/font-awesome/LICENSE.txt
@@ -0,0 +1,165 @@
+Fonticons, Inc. (https://fontawesome.com)
+
+--------------------------------------------------------------------------------
+
+Font Awesome Free License
+
+Font Awesome Free is free, open source, and GPL friendly. You can use it for
+commercial projects, open source projects, or really almost whatever you want.
+Full Font Awesome Free license: https://fontawesome.com/license/free.
+
+--------------------------------------------------------------------------------
+
+# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
+
+The Font Awesome Free download is licensed under a Creative Commons
+Attribution 4.0 International License and applies to all icons packaged
+as SVG and JS file types.
+
+--------------------------------------------------------------------------------
+
+# Fonts: SIL OFL 1.1 License
+
+In the Font Awesome Free download, the SIL OFL license applies to all icons
+packaged as web and desktop font files.
+
+Copyright (c) 2022 Fonticons, Inc. (https://fontawesome.com)
+with Reserved Font Name: "Font Awesome".
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+SIL OPEN FONT LICENSE
+Version 1.1 - 26 February 2007
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting — in part or in whole — any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+--------------------------------------------------------------------------------
+
+# Code: MIT License (https://opensource.org/licenses/MIT)
+
+In the Font Awesome Free download, the MIT license applies to all non-font and
+non-icon files.
+
+Copyright 2022 Fonticons, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in the
+Software without restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
+and to permit persons to whom the Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+--------------------------------------------------------------------------------
+
+# Attribution
+
+Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font
+Awesome Free files already contain embedded comments with sufficient
+attribution, so you shouldn't need to do anything additional when using these
+files normally.
+
+We've kept attribution comments terse, so we ask that you do not actively work
+to remove them from files, especially code. They're a great way for folks to
+learn about Font Awesome.
+
+--------------------------------------------------------------------------------
+
+# Brand Icons
+
+All brand icons are trademarks of their respective owners. The use of these
+trademarks does not indicate endorsement of the trademark holder by Font
+Awesome, nor vice versa. **Please do not use brand logos for any purpose except
+to represent the company, product, or service to which they refer.**
diff --git a/bin/nerdfont/src/glyphs/font-awesome/README.md b/bin/nerdfont/src/glyphs/font-awesome/README.md
new file mode 100644
index 0000000..72cff52
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/font-awesome/README.md
@@ -0,0 +1,16 @@
+# Font Awesome
+
+For more information have a look at the upstream website: https://github.com/FortAwesome/Font-Awesome
+
+## Custom created font file
+
+The `FontAwesome.otf` here is custom created from the Font Awesome release svgs.
+
+It does NOT contain all icons from 6.5.1!
+
+The helper scripts need to be called in this order (note the individual prerequisites):
+* `remix`
+* `analyze`
+* `generate`
+
+Version: 6.5.1.custom
diff --git a/bin/nerdfont/src/glyphs/font-awesome/analyze b/bin/nerdfont/src/glyphs/font-awesome/analyze
new file mode 100644
index 0000000..f48073f
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/font-awesome/analyze
@@ -0,0 +1,92 @@
+#!/usr/bin/env python3
+# coding=utf8
+
+# Create the final mapping file by combining the information from
+# the remix_mapping (which holds already the codepoints and file names
+# and that relation will not be changed) and the names of the
+# current (previous) Font Awesome Nerd Font mapping (from the
+# glyphnames.json file).
+# In pinciple this script just adds more names to the remix_mapping.
+
+# PREREQUISITES: Have remix_mapping file (generated with script remix)
+# $ ./analyze > mapping
+
+import re, sys
+from subprocess import run
+
+def collect_jq_names_for_one_codepoint(point, exclude, excludes):
+    global jq_names
+    ret = []
+    for n in jq_names:
+        if int(point, 16) in jq_names[n]:
+            ret.append(n)
+    if exclude in ret:
+        ret.remove(exclude)
+    for x in excludes:
+        if x in ret:
+            ret.remove(x)
+    return ret
+
+# print('Reading previous name-to-codepoint table (slow slow)')
+jq_names = {}
+for point in range(0xF000, 0xF300):
+    result = run([ 'jq', '-r',
+                'to_entries[] | select(.value.code == "{:04x}") | .key'.format(point),
+                '../../../glyphnames.json' ],
+            capture_output=True)
+    if result.returncode != 0:
+        sys.exit('Error fetching old names')
+    lines = result.stdout.decode("utf-8").split()
+    for n in lines:
+        if not n.startswith('fa-'):
+            print('WRONG START:', n)
+            sys.exit(1)
+        n = n[3:]
+        if n not in jq_names:
+            jq_names[n] = set([point])
+        else:
+            jq_names[n].add(point)
+            print('DOUBLE ENTRY:', n)
+            sys.exit(1)
+
+# print('Reading remix_mapping file')
+remix_mapping = []
+with open('remix_mapping', 'r') as f:
+    for line in f.readlines():
+        if line.startswith('#'):
+            continue
+        remix_mapping.append(tuple(re.split(' +', line.strip())))
+
+notes = ''
+unique_names = set()
+clashed_names = set()
+for orig_point, dest_point, filename, name in remix_mapping:
+    if name in jq_names:
+        codepointstring = '{:04X}'.format(list(jq_names[name])[0])
+        if codepointstring != dest_point:
+            for _, p, fn, nn in remix_mapping:
+                if codepointstring == p:
+                    notes += '# Name clash: name: {}, old: {}, new: {} ({}), name at old pos: {}\n'.format(
+                        name, codepointstring, dest_point, orig_point, nn)
+                    clashed_names.add(name)
+                    break
+
+print('# Font Awesome mapping file')
+print('#')
+print('# FA-code NF-code filename name...')
+print('#')
+
+
+remix_mapping.sort(key=(lambda x: x[1]))
+for orig_point, dest_point, filename, name in remix_mapping:
+    all_names = [ name ] + list(set(collect_jq_names_for_one_codepoint(dest_point, name, clashed_names)))
+    for n in all_names:
+        if n not in unique_names:
+            unique_names.add(n)
+            continue
+        print("ERROR name duplicate found: ", n)
+        sys.exit(1)
+
+    print("{} {} {} {}".format(orig_point, dest_point, filename, ' '.join(all_names)))
+
+print(notes)
diff --git a/bin/nerdfont/src/glyphs/font-awesome/generate b/bin/nerdfont/src/glyphs/font-awesome/generate
new file mode 100644
index 0000000..6957a48
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/font-awesome/generate
@@ -0,0 +1,109 @@
+#!/usr/bin/env python3
+# coding=utf8
+
+import sys
+import os
+import re
+import subprocess
+import fontforge
+
+# Double-quotes required here, for version-bump.sh:
+# version-bump.sh is not working here, need to adjust manually!
+version = "3.2.0"
+
+fa_version = '6.5.1'
+archive = 'fontawesome-free-{}-desktop.zip'.format(fa_version)
+
+vectorsdir = 'svgs'
+fontdir = '.'
+fontfile = 'FontAwesome.otf'
+glyphsetfile = 'i_fa.sh'
+glyphsetsdir = '../../../bin/scripts/lib'
+
+def addIcon(codepoint, name, filename):
+    """ Add one outline file and rescale/move """
+    filename = os.path.join(vectorsdir, filename)
+    glyph = font.createChar(codepoint, name)
+    glyph.importOutlines(filename)
+    xmin, ymin, xmax, ymax = glyph.boundingBox()
+    glyph.width = int(xmax + xmin) # make left and right bearings equal
+    glyph.manualHints = True
+
+def createGlyphInfo(icon_datasets, filepathname, into):
+    """ Write the glyphinfo file """
+    with open(filepathname, 'w', encoding = 'utf8') as f:
+        f.write(u'#!/usr/bin/env bash\n')
+        f.write(intro)
+        f.write(u'# Script Version: (autogenerated)\n')
+        f.write(u'test -n "$__i_fa_loaded" && return || __i_fa_loaded=1\n')
+        for _, codepoint, _, *name in icon_datasets:
+            codepoint = int(codepoint, 16)
+            f.write(u"i='{}' i_fa_{}=$i\n".format(chr(codepoint), name[0]))
+            for more_names in name[1:]:
+                f.write(u"      i_fa_{}=$i\n".format(more_names))
+        f.write(u'unset i\n')
+
+print('\nReading mapping file')
+mapping = []
+with open('mapping', 'r') as f:
+    for line in f.readlines():
+        line = line.strip()
+        if line.startswith('#') or len(line) < 1:
+            continue
+        mapping.append(tuple(re.split(' +', line.strip())))
+print('Found {} entries'.format(len(mapping)))
+mapping.sort(key=(lambda x: x[1]))
+
+print('Fetching Font Awesome archive "{}"\n'.format(archive))
+if subprocess.call('curl -OL https://github.com/FortAwesome/Font-Awesome/releases/download/' + fa_version + '/' + archive, shell=True):
+    sys.exit('Error fetching Font Awesome archive')
+print('\nUnpacking Font Awesome archive')
+if subprocess.call('rm -rf svgs fontawesome-free-*-desktop && unzip -q *.zip && mv fontawesome-free-*-desktop/svgs . && rm -rf fontawesome-free-*-desktop.zip', shell=True):
+    sys.exit('Error unpacking archive')
+
+svg_dirs = os.listdir(vectorsdir)
+svgs = []
+for d in svg_dirs:
+    svgs += os.listdir(vectorsdir + '/' + d)
+print('Found {} svgs'.format(len(svgs)))
+
+font = fontforge.font()
+font.fontname = 'FA-NerdFont-Regular'
+font.fullname = 'FA Nerd Font Regular'
+font.familyname = 'FA Nerd Font'
+font.ascent = 1000
+font.descent = 200
+font.encoding = 'UnicodeFull'
+
+# Add valid space glyph to avoid "unknown character" box on IE11
+glyph = font.createChar(32)
+glyph.width = 200
+
+font.sfntRevision = None # Auto-set (refreshed) by fontforge
+font.version = version
+font.copyright = 'Fonticons, Inc'
+font.appendSFNTName('English (US)', 'Version', archive + '; ' + version)
+font.appendSFNTName('English (US)', 'Vendor URL', 'https://github.com/ryanoasis/nerd-fonts')
+font.appendSFNTName('English (US)', 'Copyright', 'Fonticons, Inc')
+
+for _, codepoint, file, *names in mapping:
+    codepoint = int(codepoint, 16)
+    addIcon(codepoint, names[0], file)
+
+num_icons = len(mapping)
+
+print('Generating {} with {} glyphs'.format(fontfile, num_icons))
+font.ascent = 1000
+font.descent = 200
+font.generate(os.path.join(fontdir, fontfile), flags=("no-FFTM-table",))
+
+codepoints = [ int(p, 16) for _, p, *_ in mapping ]
+aliases = [ len(n) - 1 for _, _, _, *n in mapping ]
+intro  = u'# Font Awesome (version {}, {} icons, {} aliases)\n'.format(fa_version, num_icons, sum(aliases))
+intro += u'# Does not include all icons of the release\n'
+intro += u'# Codepoints: {:X}-{:X} with gaps\n'.format(min(codepoints), max(codepoints))
+intro += u'# Nerd Fonts Version: {}\n'.format(version)
+
+print('Generating GlyphInfo {}'.format(glyphsetfile))
+createGlyphInfo(mapping, os.path.join(glyphsetsdir, glyphsetfile), intro)
+print('Finished')
diff --git a/bin/nerdfont/src/glyphs/font-awesome/mapping b/bin/nerdfont/src/glyphs/font-awesome/mapping
new file mode 100644
index 0000000..f5ba9e6
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/font-awesome/mapping
@@ -0,0 +1,1489 @@
+# Font Awesome mapping file
+#
+# FA-code NF-code filename name...
+#
+F3C5 ED00 solid/location-dot.svg location_dot
+F3C6 ED01 brands/medapps.svg medapps
+F3C8 ED02 brands/medrt.svg medrt
+F3C9 ED03 solid/microphone-lines.svg microphone_lines
+F3CA ED04 brands/microsoft.svg microsoft
+F3CB ED05 brands/mix.svg mix
+F3CC ED06 brands/mizuni.svg mizuni
+F10B ED07 solid/mobile-button.svg mobile_button
+F3CE ED08 solid/mobile.svg mobile
+F3CF ED09 solid/mobile-screen.svg mobile_screen
+F3D0 ED0A brands/monero.svg monero
+F3D1 ED0B regular/money-bill-1.svg money_bill_1
+F3D2 ED0C brands/napster.svg napster
+F3D3 ED0D brands/node-js.svg node_js
+F3D4 ED0E brands/npm.svg npm
+F3D5 ED0F brands/ns8.svg ns8
+F3D6 ED10 brands/nutritionix.svg nutritionix
+F3D7 ED11 brands/page4.svg page4
+F3D8 ED12 brands/palfed.svg palfed
+F3D9 ED13 brands/patreon.svg patreon
+F3DA ED14 brands/periscope.svg periscope
+F3DB ED15 brands/phabricator.svg phabricator
+F3DC ED16 brands/phoenix-framework.svg phoenix_framework
+F3DD ED17 solid/phone-slash.svg phone_slash
+F3DF ED18 brands/playstation.svg playstation
+F3E0 ED19 solid/image-portrait.svg image_portrait
+F3E1 ED1A brands/pushed.svg pushed
+F3E2 ED1B brands/python.svg python
+F3E3 ED1C brands/red-river.svg red_river
+F3E4 ED1D brands/wpressr.svg wpressr
+F3E6 ED1E brands/replyd.svg replyd
+F3E7 ED1F brands/resolving.svg resolving
+F3E8 ED20 brands/rocketchat.svg rocketchat
+F3E9 ED21 brands/rockrms.svg rockrms
+F3EA ED22 brands/schlix.svg schlix
+F3EB ED23 brands/searchengin.svg searchengin
+F3EC ED24 brands/servicestack.svg servicestack
+F3ED ED25 solid/shield-halved.svg shield_halved
+F3EE ED26 brands/sistrix.svg sistrix
+F3F3 ED27 brands/speakap.svg speakap
+F3F5 ED28 brands/staylinked.svg staylinked
+F3F6 ED29 brands/steam-symbol.svg steam_symbol
+F3F7 ED2A brands/sticker-mule.svg sticker_mule
+F3F8 ED2B brands/studiovinari.svg studiovinari
+F3F9 ED2C brands/supple.svg supple
+F10A ED2D solid/tablet-button.svg tablet_button
+F3FB ED2E solid/tablet.svg tablet
+F3FD ED2F solid/gauge-high.svg gauge_high
+F3FF ED30 solid/ticket-simple.svg ticket_simple
+F402 ED31 brands/uber.svg uber
+F403 ED32 brands/uikit.svg uikit
+F404 ED33 brands/uniregistry.svg uniregistry
+F405 ED34 brands/untappd.svg untappd
+F406 ED35 solid/user-large.svg user_large
+F407 ED36 brands/ussunnah.svg ussunnah
+F408 ED37 brands/vaadin.svg vaadin
+F409 ED38 brands/viber.svg viber
+F40A ED39 brands/vimeo.svg vimeo
+F40B ED3A brands/vnv.svg vnv
+F40C ED3B brands/square-whatsapp.svg square_whatsapp
+F40D ED3C brands/whmcs.svg whmcs
+F411 ED3D brands/wordpress-simple.svg wordpress_simple
+F412 ED3E brands/xbox.svg xbox
+F413 ED3F brands/yandex.svg yandex
+F414 ED40 brands/yandex-international.svg yandex_international
+F415 ED41 brands/apple-pay.svg apple_pay
+F416 ED42 brands/cc-apple-pay.svg cc_apple_pay
+F417 ED43 brands/fly.svg fly
+F419 ED44 brands/node.svg node
+F41A ED45 brands/osi.svg osi
+F41B ED46 brands/react.svg react
+F41C ED47 brands/autoprefixer.svg autoprefixer
+F41D ED48 brands/less.svg less
+F41E ED49 brands/sass.svg sass
+F41F ED4A brands/vuejs.svg vuejs
+F420 ED4B brands/angular.svg angular
+F421 ED4C brands/aviato.svg aviato
+F422 ED4D solid/down-left-and-up-right-to-center.svg down_left_and_up_right_to_center
+F423 ED4E brands/ember.svg ember
+F424 ED4F solid/up-right-and-down-left-from-center.svg up_right_and_down_left_from_center
+F426 ED50 brands/gitter.svg gitter
+F427 ED51 brands/hooli.svg hooli
+F428 ED52 brands/strava.svg strava
+F429 ED53 brands/stripe.svg stripe
+F42A ED54 brands/stripe-s.svg stripe_s
+F42B ED55 brands/typo3.svg typo3
+F42C ED56 brands/amazon-pay.svg amazon_pay
+F42D ED57 brands/cc-amazon-pay.svg cc_amazon_pay
+F42E ED58 brands/ethereum.svg ethereum
+F42F ED59 brands/korvue.svg korvue
+F430 ED5A brands/elementor.svg elementor
+F432 ED5B solid/baseball-bat-ball.svg baseball_bat_ball
+F433 ED5C solid/baseball.svg baseball
+F434 ED5D solid/basketball.svg basketball
+F436 ED5E solid/bowling-ball.svg bowling_ball
+F439 ED5F solid/chess.svg chess
+F43A ED60 regular/chess-bishop.svg chess_bishop
+F43C ED61 solid/chess-board.svg chess_board
+F43F ED62 regular/chess-king.svg chess_king
+F441 ED63 regular/chess-knight.svg chess_knight
+F443 ED64 regular/chess-pawn.svg chess_pawn
+F445 ED65 regular/chess-queen.svg chess_queen
+F447 ED66 regular/chess-rook.svg chess_rook
+F44B ED67 solid/dumbbell.svg dumbbell
+F44D ED68 brands/flipboard.svg flipboard
+F44E ED69 solid/football.svg football
+F450 ED6A solid/golf-ball-tee.svg golf_ball_tee
+F452 ED6B brands/hips.svg hips
+F453 ED6C solid/hockey-puck.svg hockey_puck
+F457 ED6D brands/php.svg php
+F458 ED6E solid/broom-ball.svg broom_ball
+F459 ED6F brands/quinscape.svg quinscape
+F45C ED70 regular/square-full.svg square_full
+F45D ED71 solid/table-tennis-paddle-ball.svg table_tennis_paddle_ball
+F45F ED72 solid/volleyball.svg volleyball
+F461 ED73 solid/hand-dots.svg hand_dots
+F462 ED74 solid/bandage.svg bandage
+F466 ED75 solid/box.svg box
+F468 ED76 solid/boxes-stacked.svg boxes_stacked
+F469 ED77 solid/briefcase-medical.svg briefcase_medical
+F46A ED78 solid/fire-flame-simple.svg fire_flame_simple
+F46B ED79 solid/capsules.svg capsules
+F46C ED7A solid/clipboard-check.svg clipboard_check
+F46D ED7B solid/clipboard-list.svg clipboard_list
+F470 ED7C solid/person-dots-from-line.svg person_dots_from_line
+F471 ED7D solid/dna.svg dna
+F472 ED7E solid/dolly.svg dolly
+F474 ED7F solid/cart-flatbed.svg cart_flatbed
+F477 ED80 solid/file-medical.svg file_medical
+F478 ED81 solid/file-waveform.svg file_waveform
+F479 ED82 solid/kit-medical.svg kit_medical
+F47E ED83 solid/circle-h.svg circle_h
+F47F ED84 solid/id-card-clip.svg id_card_clip
+F481 ED85 solid/notes-medical.svg notes_medical
+F482 ED86 solid/pallet.svg pallet
+F484 ED87 solid/pills.svg pills
+F485 ED88 solid/prescription-bottle.svg prescription_bottle
+F486 ED89 solid/prescription-bottle-medical.svg prescription_bottle_medical
+F487 ED8A solid/bed-pulse.svg bed_pulse
+F48B ED8B solid/truck-fast.svg truck_fast
+F48D ED8C solid/smoking.svg smoking
+F48E ED8D solid/syringe.svg syringe
+F490 ED8E solid/tablets.svg tablets
+F491 ED8F solid/thermometer.svg thermometer_alt
+F492 ED90 solid/vial.svg vial
+F493 ED91 solid/vials.svg vials
+F494 ED92 solid/warehouse.svg warehouse
+F496 ED93 solid/weight-scale.svg weight_scale
+F497 ED94 solid/x-ray.svg x_ray
+F49E ED95 solid/box-open.svg box_open
+F4B3 ED96 solid/comment-slash.svg comment_slash
+F4B8 ED97 solid/couch.svg couch
+F4B9 ED98 solid/circle-dollar-to-slot.svg circle_dollar_to_slot
+F4BA ED99 solid/dove.svg dove
+F4BD ED9A solid/hand-holding.svg hand_holding
+F4BE ED9B solid/hand-holding-heart.svg hand_holding_heart
+F4C0 ED9C solid/hand-holding-dollar.svg hand_holding_dollar
+F4C1 ED9D solid/hand-holding-droplet.svg hand_holding_droplet
+F4C2 ED9E solid/hands-holding.svg hands_holding
+F4C4 ED9F solid/handshake-angle.svg handshake_angle
+F4C6 EDA0 solid/handshake-simple.svg handshake_simple
+F4CD EDA1 solid/parachute-box.svg parachute_box
+F4CE EDA2 solid/people-carry-box.svg people_carry_box
+F4D3 EDA3 solid/piggy-bank.svg piggy_bank
+F4D5 EDA4 brands/readme.svg readme
+F4D6 EDA5 solid/ribbon.svg ribbon
+F4D7 EDA6 solid/route.svg route
+F4D8 EDA7 solid/seedling.svg seedling
+F4D9 EDA8 solid/sign-hanging.svg sign_hanging
+F4DA EDA9 regular/face-smile-wink.svg face_smile_wink
+F4DB EDAA solid/tape.svg tape
+F4DE EDAB solid/truck-ramp-box.svg truck_ramp_box
+F4DF EDAC solid/truck-moving.svg truck_moving
+F4E2 EDAD solid/video-slash.svg video_slash
+F4E3 EDAE solid/wine-glass.svg wine_glass
+F4E4 EDAF brands/java.svg java
+F4E5 EDB0 brands/pied-piper-hat.svg pied_piper_hat
+F4E7 EDB1 brands/creative-commons-by.svg creative_commons_by
+F4E8 EDB2 brands/creative-commons-nc.svg creative_commons_nc
+F4E9 EDB3 brands/creative-commons-nc-eu.svg creative_commons_nc_eu
+F4EA EDB4 brands/creative-commons-nc-jp.svg creative_commons_nc_jp
+F4EB EDB5 brands/creative-commons-nd.svg creative_commons_nd
+F4EC EDB6 brands/creative-commons-pd.svg creative_commons_pd
+F4ED EDB7 brands/creative-commons-pd-alt.svg creative_commons_pd_alt
+F4EE EDB8 brands/creative-commons-remix.svg creative_commons_remix
+F4EF EDB9 brands/creative-commons-sa.svg creative_commons_sa
+F4F0 EDBA brands/creative-commons-sampling.svg creative_commons_sampling
+F4F1 EDBB brands/creative-commons-sampling-plus.svg creative_commons_sampling_plus
+F4F2 EDBC brands/creative-commons-share.svg creative_commons_share
+F4F3 EDBD brands/creative-commons-zero.svg creative_commons_zero
+F4F4 EDBE brands/ebay.svg ebay
+F4F5 EDBF brands/keybase.svg keybase
+F4F6 EDC0 brands/mastodon.svg mastodon
+F4F7 EDC1 brands/r-project.svg r_project
+F4F8 EDC2 brands/researchgate.svg researchgate
+F4F9 EDC3 brands/teamspeak.svg teamspeak
+F4FA EDC4 solid/user-large-slash.svg user_large_slash
+F4FB EDC5 solid/user-astronaut.svg user_astronaut
+F4FC EDC6 solid/user-check.svg user_check
+F4FD EDC7 solid/user-clock.svg user_clock
+F4FE EDC8 solid/user-gear.svg user_gear
+F4FF EDC9 solid/user-pen.svg user_pen
+F500 EDCA solid/user-group.svg user_group
+F501 EDCB solid/user-graduate.svg user_graduate
+F502 EDCC solid/user-lock.svg user_lock
+F503 EDCD solid/user-minus.svg user_minus
+F504 EDCE solid/user-ninja.svg user_ninja
+F505 EDCF solid/user-shield.svg user_shield
+F506 EDD0 solid/user-slash.svg user_slash
+F507 EDD1 solid/user-tag.svg user_tag
+F508 EDD2 solid/user-tie.svg user_tie
+F509 EDD3 solid/users-gear.svg users_gear
+F50A EDD4 brands/first-order-alt.svg first_order_alt
+F50B EDD5 brands/fulcrum.svg fulcrum
+F50C EDD6 brands/galactic-republic.svg galactic_republic
+F50D EDD7 brands/galactic-senate.svg galactic_senate
+F50E EDD8 brands/jedi-order.svg jedi_order
+F50F EDD9 brands/mandalorian.svg mandalorian
+F510 EDDA brands/old-republic.svg old_republic
+F511 EDDB brands/phoenix-squadron.svg phoenix_squadron
+F512 EDDC brands/sith.svg sith
+F513 EDDD brands/trade-federation.svg trade_federation
+F514 EDDE brands/wolf-pack-battalion.svg wolf_pack_battalion
+F515 EDDF solid/scale-unbalanced.svg scale_unbalanced
+F516 EDE0 solid/scale-unbalanced-flip.svg scale_unbalanced_flip
+F517 EDE1 solid/blender.svg blender
+F518 EDE2 solid/book-open.svg book_open
+F519 EDE3 solid/tower-broadcast.svg tower_broadcast
+F51A EDE4 solid/broom.svg broom
+F51B EDE5 solid/chalkboard.svg chalkboard
+F51C EDE6 solid/chalkboard-user.svg chalkboard_user
+F51D EDE7 solid/church.svg church
+F51E EDE8 solid/coins.svg coins
+F51F EDE9 solid/compact-disc.svg compact_disc
+F520 EDEA solid/crow.svg crow
+F521 EDEB solid/crown.svg crown
+F522 EDEC solid/dice.svg dice
+F523 EDED solid/dice-five.svg dice_five
+F524 EDEE solid/dice-four.svg dice_four
+F525 EDEF solid/dice-one.svg dice_one
+F526 EDF0 solid/dice-six.svg dice_six
+F527 EDF1 solid/dice-three.svg dice_three
+F528 EDF2 solid/dice-two.svg dice_two
+F529 EDF3 solid/divide.svg divide
+F52A EDF4 solid/door-closed.svg door_closed
+F52B EDF5 solid/door-open.svg door_open
+F52C EDF6 solid/equals.svg equals
+F52D EDF7 solid/feather.svg feather
+F52E EDF8 solid/frog.svg frog
+F52F EDF9 solid/gas-pump.svg gas_pump
+F530 EDFA solid/glasses.svg glasses
+F531 EDFB solid/greater-than.svg greater_than
+F532 EDFC solid/greater-than-equal.svg greater_than_equal
+F533 EDFD solid/helicopter.svg helicopter
+F534 EDFE solid/infinity.svg infinity
+F535 EDFF solid/kiwi-bird.svg kiwi_bird
+F543 EE0C solid/receipt.svg receipt
+F544 EE0D solid/robot.svg robot
+F545 EE0E solid/ruler.svg ruler
+F546 EE0F solid/ruler-combined.svg ruler_combined
+F547 EE10 solid/ruler-horizontal.svg ruler_horizontal
+F548 EE11 solid/ruler-vertical.svg ruler_vertical
+F549 EE12 solid/school.svg school
+F54A EE13 solid/screwdriver.svg screwdriver
+F54B EE14 solid/shoe-prints.svg shoe_prints
+F54C EE15 solid/skull.svg skull
+F54D EE16 solid/ban-smoking.svg ban_smoking
+F54E EE17 solid/store.svg store
+F54F EE18 solid/shop.svg shop
+F550 EE19 solid/bars-staggered.svg bars_staggered
+F551 EE1A solid/stroopwafel.svg stroopwafel
+F552 EE1B solid/toolbox.svg toolbox
+F553 EE1C solid/shirt.svg shirt
+F554 EE1D solid/person-walking.svg person_walking
+F555 EE1E solid/wallet.svg wallet
+F556 EE1F regular/face-angry.svg face_angry
+F557 EE20 solid/archway.svg archway
+F558 EE21 solid/book-atlas.svg book_atlas
+F559 EE22 solid/award.svg award
+F55A EE23 solid/delete-left.svg delete_left
+F55B EE24 solid/bezier-curve.svg bezier_curve
+F55C EE25 solid/bong.svg bong
+F55D EE26 solid/brush.svg brush
+F55E EE27 solid/bus-simple.svg bus_simple
+F55F EE28 solid/cannabis.svg cannabis
+F560 EE29 solid/check-double.svg check_double
+F561 EE2A solid/martini-glass-citrus.svg martini_glass_citrus
+F562 EE2B solid/bell-concierge.svg bell_concierge
+F563 EE2C solid/cookie.svg cookie
+F564 EE2D solid/cookie-bite.svg cookie_bite
+F565 EE2E solid/crop-simple.svg crop_simple
+F566 EE2F solid/tachograph-digital.svg tachograph_digital
+F567 EE30 regular/face-dizzy.svg face_dizzy
+F568 EE31 solid/compass-drafting.svg compass_drafting
+F569 EE32 solid/drum.svg drum
+F56A EE33 solid/drum-steelpan.svg drum_steelpan
+F56B EE34 solid/feather-pointed.svg feather_pointed
+F56C EE35 solid/file-contract.svg file_contract
+F56D EE36 solid/file-arrow-down.svg file_arrow_down
+F56E EE37 solid/file-export.svg file_export
+F56F EE38 solid/file-import.svg file_import
+F570 EE39 solid/file-invoice.svg file_invoice
+F571 EE3A solid/file-invoice-dollar.svg file_invoice_dollar
+F572 EE3B solid/file-prescription.svg file_prescription
+F573 EE3C solid/file-signature.svg file_signature
+F574 EE3D solid/file-arrow-up.svg file_arrow_up
+F575 EE3E solid/fill.svg fill
+F576 EE3F solid/fill-drip.svg fill_drip
+F577 EE40 solid/fingerprint.svg fingerprint
+F578 EE41 solid/fish.svg fish
+F579 EE42 regular/face-flushed.svg face_flushed
+F57A EE43 regular/face-frown-open.svg face_frown_open
+F57B EE44 solid/martini-glass.svg martini_glass
+F57C EE45 solid/earth-africa.svg earth_africa
+F57D EE46 solid/earth-americas.svg earth_americas
+F57E EE47 solid/earth-asia.svg earth_asia
+F57F EE48 regular/face-grimace.svg face_grimace
+F580 EE49 regular/face-grin.svg face_grin
+F581 EE4A regular/face-grin-wide.svg face_grin_wide
+F582 EE4B regular/face-grin-beam.svg face_grin_beam
+F583 EE4C regular/face-grin-beam-sweat.svg face_grin_beam_sweat
+F584 EE4D regular/face-grin-hearts.svg face_grin_hearts
+F585 EE4E regular/face-grin-squint.svg face_grin_squint
+F586 EE4F regular/face-grin-squint-tears.svg face_grin_squint_tears
+F587 EE50 regular/face-grin-stars.svg face_grin_stars
+F588 EE51 regular/face-grin-tears.svg face_grin_tears
+F589 EE52 regular/face-grin-tongue.svg face_grin_tongue
+F58A EE53 regular/face-grin-tongue-squint.svg face_grin_tongue_squint
+F58B EE54 regular/face-grin-tongue-wink.svg face_grin_tongue_wink
+F58C EE55 regular/face-grin-wink.svg face_grin_wink
+F58D EE56 solid/grip.svg grip
+F58E EE57 solid/grip-vertical.svg grip_vertical
+F58F EE58 solid/headphones-simple.svg headphones_simple
+F590 EE59 solid/headset.svg headset
+F591 EE5A solid/highlighter.svg highlighter
+F592 EE5B brands/hornbill.svg hornbill
+F593 EE5C solid/hot-tub-person.svg hot_tub_person
+F594 EE5D solid/hotel.svg hotel_building
+F595 EE5E solid/joint.svg joint
+F596 EE5F regular/face-kiss.svg face_kiss
+F597 EE60 regular/face-kiss-beam.svg face_kiss_beam
+F598 EE61 regular/face-kiss-wink-heart.svg face_kiss_wink_heart
+F599 EE62 regular/face-laugh.svg face_laugh
+F59A EE63 regular/face-laugh-beam.svg face_laugh_beam
+F59B EE64 regular/face-laugh-squint.svg face_laugh_squint
+F59C EE65 regular/face-laugh-wink.svg face_laugh_wink
+F59D EE66 solid/cart-flatbed-suitcase.svg cart_flatbed_suitcase
+F59E EE67 brands/mailchimp.svg mailchimp
+F59F EE68 solid/map-location.svg map_location
+F5A0 EE69 solid/map-location-dot.svg map_location_dot
+F5A1 EE6A solid/marker.svg marker
+F5A2 EE6B solid/medal.svg medal
+F5A3 EE6C brands/megaport.svg megaport
+F5A4 EE6D regular/face-meh-blank.svg face_meh_blank
+F5A5 EE6E regular/face-rolling-eyes.svg face_rolling_eyes
+F5A6 EE6F solid/monument.svg monument
+F5A7 EE70 solid/mortar-pestle.svg mortar_pestle
+F5A8 EE71 brands/nimblr.svg nimblr
+F5AA EE72 solid/paint-roller.svg paint_roller
+F5AB EE73 solid/passport.svg passport
+F5AC EE74 solid/pen-fancy.svg pen_fancy
+F5AD EE75 solid/pen-nib.svg pen_nib
+F5AE EE76 solid/pen-ruler.svg pen_ruler
+F5AF EE77 solid/plane-arrival.svg plane_arrival
+F5B0 EE78 solid/plane-departure.svg plane_departure
+F5B1 EE79 solid/prescription.svg prescription
+F5B2 EE7A brands/rev.svg rev
+F5B3 EE7B regular/face-sad-cry.svg face_sad_cry
+F5B4 EE7C regular/face-sad-tear.svg face_sad_tear
+F5B5 EE7D brands/shopware.svg shopware
+F5B6 EE7E solid/van-shuttle.svg van_shuttle
+F5B7 EE7F solid/signature.svg signature
+F5B8 EE80 regular/face-smile-beam.svg face_smile_beam
+F5BA EE81 solid/solar-panel.svg solar_panel
+F5BB EE82 solid/spa.svg spa
+F5BC EE83 solid/splotch.svg splotch
+F5BD EE84 solid/spray-can.svg spray_can
+F5BE EE85 brands/squarespace.svg squarespace
+F5BF EE86 solid/stamp.svg stamp
+F5C0 EE87 regular/star-half-stroke.svg star_half_stroke
+F5C1 EE88 solid/suitcase-rolling.svg suitcase_rolling
+F5C2 EE89 regular/face-surprise.svg face_surprise
+F5C3 EE8A solid/swatchbook.svg swatchbook
+F5C4 EE8B solid/person-swimming.svg person_swimming
+F5C5 EE8C solid/water-ladder.svg water_ladder
+F5C6 EE8D brands/themeco.svg themeco
+F5C7 EE8E solid/droplet-slash.svg droplet_slash
+F5C8 EE8F regular/face-tired.svg face_tired
+F5C9 EE90 solid/tooth.svg tooth
+F5CA EE91 solid/umbrella-beach.svg umbrella_beach
+F5CB EE92 solid/vector-square.svg vector_square
+F5CC EE93 brands/weebly.svg weebly
+F5CD EE94 solid/weight-hanging.svg weight_hanging
+F5CE EE95 solid/wine-glass-empty.svg wine_glass_empty
+F5CF EE96 brands/wix.svg wix
+F5D0 EE97 solid/spray-can-sparkles.svg spray_can_sparkles
+F5D1 EE98 solid/apple-whole.svg apple_whole
+F5D2 EE99 solid/atom.svg atom
+F5D7 EE9A solid/bone.svg bone
+F5DA EE9B solid/book-open-reader.svg book_open_reader
+F5DC EE9C solid/brain.svg brain
+F5DE EE9D solid/car-rear.svg car_rear
+F5DF EE9E solid/car-battery.svg car_battery
+F5E1 EE9F solid/car-burst.svg car_burst
+F5E4 EEA0 solid/car-side.svg car_side
+F5E7 EEA1 solid/charging-station.svg charging_station
+F5EB EEA2 solid/diamond-turn-right.svg diamond_turn_right
+F5EE EEA3 solid/draw-polygon.svg draw_polygon
+F5F1 EEA4 brands/ello.svg ello
+F5F7 EEA5 brands/hackerrank.svg hackerrank
+F5FA EEA6 brands/kaggle.svg kaggle
+F5FC EEA7 solid/laptop-code.svg laptop_code
+F5FD EEA8 solid/layer-group.svg layer_group
+F601 EEA9 solid/location-crosshairs.svg location_crosshairs
+F604 EEAA solid/lungs.svg lungs
+F60F EEAB brands/markdown.svg markdown
+F610 EEAC solid/microscope.svg microscope
+F612 EEAD brands/neos.svg neos
+F613 EEAE solid/oil-can.svg oil_can
+F619 EEAF solid/poop.svg poop
+F61F EEB0 solid/shapes.svg shapes
+F621 EEB1 solid/star-of-life.svg star_of_life
+F624 EEB2 solid/gauge.svg gauge
+F629 EEB3 solid/gauge-simple.svg gauge_simple
+F62E EEB4 solid/teeth.svg teeth
+F62F EEB5 solid/teeth-open.svg teeth_open
+F630 EEB6 solid/masks-theater.svg masks_theater
+F637 EEB7 solid/traffic-light.svg traffic_light
+F63B EEB8 solid/truck-monster.svg truck_monster
+F63C EEB9 solid/truck-pickup.svg truck_pickup
+F63F EEBA brands/zhihu.svg zhihu
+F641 EEBB solid/rectangle-ad.svg rectangle_ad
+F642 EEBC brands/alipay.svg alipay
+F644 EEBD solid/ankh.svg ankh
+F647 EEBE solid/book-bible.svg book_bible
+F64A EEBF solid/business-time.svg business_time
+F64F EEC0 solid/city.svg city
+F651 EEC1 solid/comment-dollar.svg comment_dollar
+F653 EEC2 solid/comments-dollar.svg comments_dollar
+F654 EEC3 solid/cross.svg cross
+F655 EEC4 solid/dharmachakra.svg dharmachakra
+F658 EEC5 solid/envelope-open-text.svg envelope_open_text
+F65D EEC6 solid/folder-minus.svg folder_minus
+F65E EEC7 solid/folder-plus.svg folder_plus
+F662 EEC8 solid/filter-circle-dollar.svg filter_circle_dollar
+F664 EEC9 solid/gopuram.svg gopuram
+F665 EECA solid/hamsa.svg hamsa
+F666 EECB solid/bahai.svg bahai
+F669 EECC solid/jedi.svg jedi
+F66A EECD solid/book-journal-whills.svg book_journal_whills
+F66B EECE solid/kaaba.svg kaaba
+F66D EECF solid/khanda.svg khanda
+F66F EED0 solid/landmark.svg landmark
+F674 EED1 solid/envelopes-bulk.svg envelopes_bulk
+F676 EED2 solid/menorah.svg menorah
+F678 EED3 solid/mosque.svg mosque
+F679 EED4 solid/om.svg om
+F67B EED5 solid/spaghetti-monster-flying.svg spaghetti_monster_flying
+F67C EED6 solid/peace.svg peace
+F67F EED7 solid/place-of-worship.svg place_of_worship
+F681 EED8 solid/square-poll-vertical.svg square_poll_vertical
+F682 EED9 solid/square-poll-horizontal.svg square_poll_horizontal
+F683 EEDA solid/person-praying.svg person_praying
+F684 EEDB solid/hands-praying.svg hands_praying
+F687 EEDC solid/book-quran.svg book_quran
+F688 EEDD solid/magnifying-glass-dollar.svg magnifying_glass_dollar
+F689 EEDE solid/magnifying-glass-location.svg magnifying_glass_location
+F696 EEDF solid/socks.svg socks
+F698 EEE0 solid/square-root-variable.svg square_root_variable
+F699 EEE1 solid/star-and-crescent.svg star_and_crescent
+F69A EEE2 solid/star-of-david.svg star_of_david
+F69B EEE3 solid/synagogue.svg synagogue
+F69D EEE4 brands/the-red-yeti.svg the_red_yeti
+F6A0 EEE5 solid/scroll-torah.svg scroll_torah
+F6A1 EEE6 solid/torii-gate.svg torii_gate
+F6A7 EEE7 solid/vihara.svg vihara
+F6A9 EEE8 solid/volume-xmark.svg volume_xmark
+F6AD EEE9 solid/yin-yang.svg yin_yang
+F6B6 EEEA solid/blender-phone.svg blender_phone
+F6B7 EEEB solid/book-skull.svg book_skull
+F6BB EEEC solid/campground.svg campground
+F6BE EEED solid/cat.svg cat
+F6C0 EEEE solid/chair.svg chair
+F6C3 EEEF solid/cloud-moon.svg cloud_moon
+F6C4 EEF0 solid/cloud-sun.svg cloud_sun
+F6C8 EEF1 solid/cow.svg cow
+F6C9 EEF2 brands/critical-role.svg critical_role
+F6CA EEF3 brands/d-and-d-beyond.svg d_and_d_beyond
+F6CC EEF4 brands/dev.svg dev
+F6CF EEF5 solid/dice-d20.svg dice_d20
+F6D1 EEF6 solid/dice-d6.svg dice_d6
+F6D3 EEF7 solid/dog.svg dog
+F6D5 EEF8 solid/dragon.svg dragon
+F6D7 EEF9 solid/drumstick-bite.svg drumstick_bite
+F6D9 EEFA solid/dungeon.svg dungeon
+F6DC EEFB brands/fantasy-flight-games.svg fantasy_flight_games
+F6DD EEFC solid/file-csv.svg file_csv
+F6DE EEFD solid/hand-fist.svg hand_fist
+F6E2 EEFE solid/ghost.svg ghost
+F6E3 EEFF solid/hammer.svg hammer
+F6E6 EF00 solid/hanukiah.svg hanukiah
+F6E8 EF01 solid/hat-wizard.svg hat_wizard
+F6EC EF02 solid/person-hiking.svg person_hiking
+F6ED EF03 solid/hippo.svg hippo
+F6F0 EF04 solid/horse.svg horse
+F6F1 EF05 solid/house-chimney-crack.svg house_chimney_crack
+F6F2 EF06 solid/hryvnia-sign.svg hryvnia_sign
+F6FA EF07 solid/mask.svg mask
+F6FC EF08 solid/mountain.svg mountain
+F6FF EF09 solid/network-wired.svg network_wired
+F700 EF0A solid/otter.svg otter
+F70B EF0B solid/ring.svg ring
+F70C EF0C solid/person-running.svg person_running
+F70E EF0D solid/scroll.svg scroll
+F714 EF0E solid/skull-crossbones.svg skull_crossbones
+F715 EF0F solid/slash.svg slash
+F717 EF10 solid/spider.svg spider
+F71E EF11 solid/toilet-paper.svg toilet_paper
+F722 EF12 solid/tractor.svg tractor
+F728 EF13 solid/user-injured.svg user_injured
+F729 EF14 solid/vr-cardboard.svg vr_cardboard
+F72B EF15 solid/wand-sparkles.svg wand_sparkles
+F72E EF16 solid/wind.svg wind
+F72F EF17 solid/wine-bottle.svg wine_bottle
+F730 EF18 brands/wizards-of-the-coast.svg wizards_of_the_coast
+F731 EF19 brands/think-peaks.svg think_peaks
+F73B EF1A solid/cloud-meatball.svg cloud_meatball
+F73C EF1B solid/cloud-moon-rain.svg cloud_moon_rain
+F73D EF1C solid/cloud-rain.svg cloud_rain
+F740 EF1D solid/cloud-showers-heavy.svg cloud_showers_heavy
+F743 EF1E solid/cloud-sun-rain.svg cloud_sun_rain
+F747 EF1F solid/democrat.svg democrat
+F74D EF20 solid/flag-usa.svg flag_usa
+F751 EF21 solid/hurricane.svg hurricane
+F752 EF22 solid/landmark-dome.svg landmark_dome
+F753 EF23 solid/meteor.svg meteor
+F756 EF24 solid/person-booth.svg person_booth
+F75A EF25 solid/poo-storm.svg poo_storm
+F75B EF26 solid/rainbow.svg rainbow
+F75D EF27 brands/reacteurope.svg reacteurope
+F75E EF28 solid/republican.svg republican
+F75F EF29 solid/smog.svg smog
+F769 EF2A solid/temperature-high.svg temperature_high
+F76B EF2B solid/temperature-low.svg temperature_low
+F76C EF2C solid/cloud-bolt.svg cloud_bolt
+F76F EF2D solid/tornado.svg tornado
+F770 EF2E solid/volcano.svg volcano
+F772 EF2F solid/check-to-slot.svg check_to_slot
+F773 EF30 solid/water.svg water
+F77A EF31 brands/artstation.svg artstation
+F77B EF32 brands/atlassian.svg atlassian
+F77C EF33 solid/baby.svg baby
+F77D EF34 solid/baby-carriage.svg baby_carriage
+F780 EF35 solid/biohazard.svg biohazard
+F781 EF36 solid/blog.svg blog
+F783 EF37 solid/calendar-day.svg calendar_day
+F784 EF38 solid/calendar-week.svg calendar_week
+F785 EF39 brands/canadian-maple-leaf.svg canadian_maple_leaf
+F786 EF3A solid/candy-cane.svg candy_cane
+F787 EF3B solid/carrot.svg carrot
+F788 EF3C solid/cash-register.svg cash_register
+F789 EF3D brands/centos.svg centos
+F78C EF3E solid/minimize.svg minimize
+F78D EF3F brands/confluence.svg confluence
+F790 EF40 brands/dhl.svg dhl
+F791 EF41 brands/diaspora.svg diaspora
+F793 EF42 solid/dumpster.svg dumpster
+F794 EF43 solid/dumpster-fire.svg dumpster_fire
+F796 EF44 solid/ethernet.svg ethernet
+F797 EF45 brands/fedex.svg fedex
+F798 EF46 brands/fedora.svg fedora
+F799 EF47 brands/figma.svg figma
+F79C EF48 solid/gifts.svg gifts
+F79F EF49 solid/champagne-glasses.svg champagne_glasses
+F7A0 EF4A solid/whiskey-glass.svg whiskey_glass
+F7A2 EF4B solid/earth-europe.svg earth_europe
+F7A4 EF4C solid/grip-lines.svg grip_lines
+F7A5 EF4D solid/grip-lines-vertical.svg grip_lines_vertical
+F7A6 EF4E solid/guitar.svg guitar
+F7A9 EF4F solid/heart-crack.svg heart_crack
+F7AA EF50 solid/holly-berry.svg holly_berry
+F7AB EF51 solid/horse-head.svg horse_head
+F7AD EF52 solid/icicles.svg icicles
+F7AE EF53 solid/igloo.svg igloo
+F7AF EF54 brands/intercom.svg intercom
+F7B0 EF55 brands/invision.svg invision
+F7B1 EF56 brands/jira.svg jira
+F7B3 EF57 brands/mendeley.svg mendeley
+F7B5 EF58 solid/mitten.svg mitten
+F7B6 EF59 solid/mug-hot.svg mug_hot
+F7B9 EF5A solid/radiation.svg radiation
+F7BA EF5B solid/circle-radiation.svg circle_radiation
+F7BB EF5C brands/raspberry-pi.svg raspberry_pi
+F7BC EF5D brands/redhat.svg redhat
+F7BD EF5E solid/restroom.svg restroom
+F7BF EF5F solid/satellite.svg satellite
+F7C0 EF60 solid/satellite-dish.svg satellite_dish
+F7C2 EF61 solid/sd-card.svg sd_card
+F7C4 EF62 solid/sim-card.svg sim_card
+F7C5 EF63 solid/person-skating.svg person_skating
+F7C6 EF64 brands/sketch.svg sketch
+F7C9 EF65 solid/person-skiing.svg person_skiing
+F7CA EF66 solid/person-skiing-nordic.svg person_skiing_nordic
+F7CC EF67 solid/sleigh.svg sleigh
+F7CD EF68 solid/comment-sms.svg comment_sms
+F7CE EF69 solid/person-snowboarding.svg person_snowboarding
+F7D0 EF6A solid/snowman.svg snowman
+F7D2 EF6B solid/snowplow.svg snowplow
+F7D3 EF6C brands/sourcetree.svg sourcetree
+F7D6 EF6D brands/suse.svg suse
+F7D7 EF6E solid/tenge-sign.svg tenge_sign
+F7D8 EF6F solid/toilet.svg toilet
+F7D9 EF70 solid/screwdriver-wrench.svg screwdriver_wrench
+F7DA EF71 solid/cable-car.svg cable_car
+F7DF EF72 brands/ubuntu.svg ubuntu
+F7E0 EF73 brands/ups.svg ups
+F7E1 EF74 brands/usps.svg usps
+F7E3 EF75 brands/yarn.svg yarn
+F7E4 EF76 solid/fire-flame-curved.svg fire_flame_curved
+F7E5 EF77 solid/bacon.svg bacon
+F7E6 EF78 solid/book-medical.svg book_medical
+F7EC EF79 solid/bread-slice.svg bread_slice
+F7EF EF7A solid/cheese.svg cheese
+F7F2 EF7B solid/house-chimney-medical.svg house_chimney_medical
+F7F3 EF7C solid/clipboard-user.svg clipboard_user
+F7F5 EF7D solid/comment-medical.svg comment_medical
+F7F7 EF7E solid/crutch.svg crutch
+F7FA EF7F solid/disease.svg disease
+F7FB EF80 solid/egg.svg egg
+F802 EF81 solid/folder-tree.svg folder_tree
+F805 EF82 solid/burger.svg burger
+F806 EF83 solid/hand-middle-finger.svg hand_middle_finger
+F807 EF84 solid/helmet-safety.svg helmet_safety
+F80B EF85 solid/house-chimney.svg house_chimney
+F80D EF86 solid/hospital-user.svg hospital_user
+F80F EF87 solid/hotdog.svg hotdog
+F810 EF88 solid/ice-cream.svg ice_cream
+F812 EF89 solid/laptop-medical.svg laptop_medical
+F815 EF8A solid/pager.svg pager
+F816 EF8B solid/pepper-hot.svg pepper_hot
+F818 EF8C solid/pizza-slice.svg pizza_slice
+F81D EF8D solid/sack-dollar.svg sack_dollar
+F827 EF8E solid/book-tanakh.svg book_tanakh
+F828 EF8F solid/bars-progress.svg bars_progress
+F829 EF90 solid/trash-arrow-up.svg trash_arrow_up
+F82A EF91 solid/trash-can-arrow-up.svg trash_can_arrow_up
+F82F EF92 solid/user-nurse.svg user_nurse
+F834 EF93 brands/airbnb.svg airbnb
+F835 EF94 brands/battle-net.svg battle_net
+F836 EF95 brands/bootstrap.svg bootstrap
+F837 EF96 brands/buffer.svg buffer
+F838 EF97 brands/chromecast.svg chromecast
+F839 EF98 brands/evernote.svg evernote
+F83A EF99 brands/itch-io.svg itch_io
+F83B EF9A brands/salesforce.svg salesforce
+F83C EF9B brands/speaker-deck.svg speaker_deck
+F83D EF9C brands/symfony.svg symfony
+F83E EF9D solid/wave-square.svg wave_square
+F83F EF9E brands/waze.svg waze
+F840 EF9F brands/yammer.svg yammer
+F841 EFA0 brands/git-alt.svg git_alt
+F842 EFA1 brands/stackpath.svg stackpath
+F84A EFA2 solid/person-biking.svg person_biking
+F84C EFA3 solid/border-all.svg border_all
+F850 EFA4 solid/border-none.svg border_none
+F853 EFA5 solid/border-top-left.svg border_top_left
+F85E EFA6 solid/person-digging.svg person_digging
+F863 EFA7 solid/fan.svg fan
+F86D EFA8 solid/icons.svg icons
+F879 EFA9 solid/phone-flip.svg phone_flip
+F87B EFAA solid/square-phone-flip.svg square_phone_flip
+F87C EFAB solid/photo-film.svg photo_film
+F87D EFAC solid/text-slash.svg text_slash
+F881 EFAD solid/arrow-down-z-a.svg arrow_down_z_a
+F882 EFAE solid/arrow-up-z-a.svg arrow_up_z_a
+F884 EFAF solid/arrow-down-short-wide.svg arrow_down_short_wide
+F885 EFB0 solid/arrow-up-short-wide.svg arrow_up_short_wide
+F886 EFB1 solid/arrow-down-9-1.svg arrow_down_9_1
+F887 EFB2 solid/arrow-up-9-1.svg arrow_up_9_1
+F891 EFB3 solid/spell-check.svg spell_check
+F897 EFB4 solid/voicemail.svg voicemail
+F89E EFB5 brands/cotton-bureau.svg cotton_bureau
+F8A6 EFB6 brands/buy-n-large.svg buy_n_large
+F8C0 EFB7 solid/hat-cowboy.svg hat_cowboy
+F8C1 EFB8 solid/hat-cowboy-side.svg hat_cowboy_side
+F8CA EFB9 brands/mdb.svg mdb
+F8CC EFBA solid/computer-mouse.svg computer_mouse
+F8D2 EFBB brands/orcid.svg orcid
+F8D7 EFBC solid/radio.svg radio
+F8D9 EFBD solid/record-vinyl.svg record_vinyl
+F8E1 EFBE brands/swift.svg swift
+F8E8 EFBF brands/umbraco.svg umbraco
+F8EF EFC0 solid/walkie-talkie.svg walkie_talkie
+F8FF EFC1 solid/caravan.svg caravan
+F374 EFC2 brands/avianex.svg avianex
+F536 EFC3 solid/less-than.svg less_than
+F537 EFC4 solid/less-than-equal.svg less_than_equal
+F538 EFC5 solid/memory.svg memory
+F539 EFC6 solid/microphone-lines-slash.svg microphone_lines_slash
+F53A EFC7 solid/money-bill-wave.svg money_bill_wave
+F53B EFC8 solid/money-bill-1-wave.svg money_bill_1_wave
+F53C EFC9 solid/money-check.svg money_check
+F53D EFCA solid/money-check-dollar.svg money_check_dollar
+F53E EFCB solid/not-equal.svg not_equal
+F53F EFCC solid/palette.svg palette
+F540 EFCD solid/square-parking.svg square_parking
+F542 EFCE solid/diagram-project.svg diagram_project
+F000 F000 solid/martini-glass-empty.svg martini_glass_empty glass
+F001 F001 solid/music.svg music
+F002 F002 solid/magnifying-glass.svg magnifying_glass search
+F003 F003 regular/envelope.svg envelope_o
+F004 F004 solid/heart.svg heart
+F005 F005 solid/star.svg star
+F006 F006 regular/star.svg star_o
+F007 F007 solid/user.svg user
+F008 F008 solid/film.svg film
+F009 F009 solid/table-cells-large.svg table_cells_large th_large
+F00A F00A solid/table-cells.svg table_cells th
+F00B F00B solid/table-list.svg table_list th_list
+F00C F00C solid/check.svg check
+F00D F00D solid/xmark.svg xmark times close remove
+F00E F00E solid/magnifying-glass-plus.svg magnifying_glass_plus search_plus
+F302 F00F regular/images.svg images
+F010 F010 solid/magnifying-glass-minus.svg magnifying_glass_minus search_minus
+F011 F011 solid/power-off.svg power_off
+F012 F012 solid/signal.svg signal
+F013 F013 solid/gear.svg gear cog
+F014 F014 regular/trash-can.svg trash_can trash_o
+F015 F015 solid/house.svg house home
+F016 F016 regular/file.svg file_o
+F017 F017 regular/clock.svg clock clock_o
+F018 F018 solid/road.svg road
+F019 F019 solid/download.svg download
+F01A F01A regular/circle-down.svg circle_down arrow_circle_o_down
+F01B F01B regular/circle-up.svg circle_up arrow_circle_o_up
+F01C F01C solid/inbox.svg inbox
+F01D F01D regular/circle-play.svg play_circle_o
+F01E F01E solid/arrow-rotate-right.svg arrow_rotate_right repeat
+F304 F01F solid/pen.svg pen
+F305 F020 solid/pen-clip.svg pen_clip
+F021 F021 solid/arrows-rotate.svg arrows_rotate refresh
+F022 F022 regular/rectangle-list.svg rectangle_list list_alt
+F023 F023 solid/lock.svg lock
+F024 F024 solid/flag.svg flag
+F025 F025 solid/headphones.svg headphones
+F026 F026 solid/volume-off.svg volume_off
+F027 F027 solid/volume-low.svg volume_low volume_down
+F028 F028 solid/volume-high.svg volume_high volume_up
+F029 F029 solid/qrcode.svg qrcode
+F02A F02A solid/barcode.svg barcode
+F02B F02B solid/tag.svg tag
+F02C F02C solid/tags.svg tags
+F02D F02D solid/book.svg book
+F02E F02E solid/bookmark.svg bookmark
+F02F F02F solid/print.svg print
+F030 F030 solid/camera.svg camera
+F031 F031 solid/font.svg font
+F032 F032 solid/bold.svg bold
+F033 F033 solid/italic.svg italic
+F034 F034 solid/text-height.svg text_height
+F035 F035 solid/text-width.svg text_width
+F036 F036 solid/align-left.svg align_left
+F037 F037 solid/align-center.svg align_center
+F038 F038 solid/align-right.svg align_right
+F039 F039 solid/align-justify.svg align_justify
+F03A F03A solid/list.svg list
+F03B F03B solid/outdent.svg outdent dedent
+F03C F03C solid/indent.svg indent
+F03D F03D solid/video.svg video video_camera
+F03E F03E regular/image.svg image picture_o photo
+F309 F03F solid/down-long.svg down_long
+F040 F040 solid/pencil.svg pencil
+F041 F041 solid/location-pin.svg location_pin map_marker
+F042 F042 solid/circle-half-stroke.svg circle_half_stroke adjust
+F043 F043 solid/droplet.svg droplet tint
+F044 F044 regular/pen-to-square.svg pen_to_square pencil_square_o edit
+F045 F045 regular/share-from-square.svg share_square_o
+F046 F046 regular/square-check.svg check_square_o
+F047 F047 solid/arrows-up-down-left-right.svg arrows_up_down_left_right arrows
+F048 F048 solid/backward-step.svg backward_step step_backward
+F049 F049 solid/backward-fast.svg backward_fast fast_backward
+F04A F04A solid/backward.svg backward
+F04B F04B solid/play.svg play
+F04C F04C solid/pause.svg pause
+F04D F04D solid/stop.svg stop
+F04E F04E solid/forward.svg forward
+F30A F04F solid/left-long.svg left_long
+F050 F050 solid/forward-fast.svg forward_fast fast_forward
+F051 F051 solid/forward-step.svg forward_step step_forward
+F052 F052 solid/eject.svg eject
+F053 F053 solid/chevron-left.svg chevron_left
+F054 F054 solid/chevron-right.svg chevron_right
+F055 F055 solid/circle-plus.svg circle_plus plus_circle
+F056 F056 solid/circle-minus.svg circle_minus minus_circle
+F057 F057 solid/circle-xmark.svg remove_sign times_circle
+F058 F058 solid/circle-check.svg ok_sign check_circle
+F059 F059 solid/circle-question.svg circle_question question_circle
+F05A F05A solid/circle-info.svg circle_info info_circle
+F05B F05B solid/crosshairs.svg crosshairs
+F05C F05C regular/circle-xmark.svg circle_xmark times_circle_o
+F05D F05D regular/circle-check.svg circle_check check_circle_o
+F05E F05E solid/ban.svg ban
+F31C F05F solid/file-pen.svg file_pen
+F060 F060 solid/arrow-left.svg arrow_left
+F061 F061 solid/arrow-right.svg arrow_right
+F062 F062 solid/arrow-up.svg arrow_up
+F063 F063 solid/arrow-down.svg arrow_down
+F064 F064 solid/share.svg share mail_forward
+F065 F065 solid/expand.svg expand
+F066 F066 solid/compress.svg compress
+F067 F067 solid/plus.svg plus
+F068 F068 solid/minus.svg minus
+F069 F069 solid/asterisk.svg asterisk
+F06A F06A solid/circle-exclamation.svg circle_exclamation exclamation_circle
+F06B F06B solid/gift.svg gift
+F06C F06C solid/leaf.svg leaf
+F06D F06D solid/fire.svg fire
+F06E F06E regular/eye.svg eye
+F31E F06F solid/maximize.svg maximize
+F070 F070 regular/eye-slash.svg eye_slash
+F071 F071 solid/triangle-exclamation.svg triangle_exclamation exclamation_triangle warning
+F072 F072 solid/plane.svg plane
+F073 F073 regular/calendar-days.svg calendar_days calendar
+F074 F074 solid/shuffle.svg shuffle random
+F075 F075 solid/comment.svg comment
+F076 F076 solid/magnet.svg magnet
+F077 F077 solid/chevron-up.svg chevron_up
+F078 F078 solid/chevron-down.svg chevron_down
+F079 F079 solid/retweet.svg retweet
+F07A F07A solid/cart-shopping.svg cart_shopping shopping_cart
+F07B F07B solid/folder.svg folder
+F07C F07C solid/folder-open.svg folder_open
+F07D F07D solid/arrows-up-down.svg arrows_up_down arrows_v
+F07E F07E solid/arrows-left-right.svg arrows_left_right arrows_h
+F328 F07F regular/clipboard.svg clipboard_alt
+F080 F080 regular/chart-bar.svg chart_bar bar_chart bar_chart_o
+F081 F081 brands/square-twitter.svg square_twitter twitter_square
+F082 F082 brands/square-facebook.svg square_facebook facebook_square
+F083 F083 solid/camera-retro.svg camera_retro
+F084 F084 solid/key.svg key
+F085 F085 solid/gears.svg gears cogs
+F086 F086 solid/comments.svg comments
+F087 F087 regular/thumbs-up.svg thumbs_o_up
+F088 F088 regular/thumbs-down.svg thumbs_o_down
+F089 F089 solid/star-half.svg star_half
+F08A F08A regular/heart.svg heard_o heart_o
+F08B F08B solid/arrow-right-from-bracket.svg arrow_right_from_bracket sign_out
+F08C F08C brands/linkedin.svg linkedin_square
+F08D F08D solid/thumbtack.svg thumbtack thumb_tack
+F08E F08E solid/arrow-up-right-from-square.svg arrow_up_right_from_square external_link
+F337 F08F solid/left-right.svg left_right
+F090 F090 solid/arrow-right-to-bracket.svg arrow_right_to_bracket sign_in
+F091 F091 solid/trophy.svg trophy
+F092 F092 brands/square-github.svg square_github github_square
+F093 F093 solid/upload.svg upload
+F094 F094 regular/lemon.svg lemon lemon_o
+F095 F095 solid/phone.svg phone
+F096 F096 regular/square.svg square_o
+F097 F097 regular/bookmark.svg bookmark_o
+F098 F098 solid/square-phone.svg square_phone phone_square
+F099 F099 brands/twitter.svg twitter
+F09A F09A brands/facebook.svg facebook
+F09B F09B brands/github.svg github
+F09C F09C solid/unlock.svg unlock
+F09D F09D regular/credit-card.svg credit_card
+F09E F09E solid/rss.svg rss feed
+F338 F09F solid/up-down.svg up_down
+F0A0 F0A0 regular/hard-drive.svg hard_drive hdd_o
+F0A1 F0A1 solid/bullhorn.svg bullhorn
+F0A2 F0A2 regular/bell.svg bell_o
+F0A3 F0A3 solid/certificate.svg certificate
+F0A4 F0A4 regular/hand-point-right.svg hand_point_right hand_o_right
+F0A5 F0A5 regular/hand-point-left.svg hand_point_left hand_o_left
+F0A6 F0A6 regular/hand-point-up.svg hand_point_up hand_o_up
+F0A7 F0A7 regular/hand-point-down.svg hand_point_down hand_o_down
+F0A8 F0A8 solid/circle-arrow-left.svg circle_arrow_left arrow_circle_left
+F0A9 F0A9 solid/circle-arrow-right.svg circle_arrow_right arrow_circle_right
+F0AA F0AA solid/circle-arrow-up.svg circle_arrow_up arrow_circle_up
+F0AB F0AB solid/circle-arrow-down.svg circle_arrow_down arrow_circle_down
+F0AC F0AC solid/globe.svg globe
+F0AD F0AD solid/wrench.svg wrench
+F0AE F0AE solid/list-check.svg list_check tasks
+F35C F0AF brands/square-font-awesome-stroke.svg square_font_awesome_stroke
+F0B0 F0B0 solid/filter.svg filter
+F0B1 F0B1 solid/briefcase.svg briefcase
+F0B2 F0B2 solid/up-down-left-right.svg up_down_left_right arrows_alt
+F35D F0B3 solid/up-right-from-square.svg up_right_from_square
+F360 F0B4 solid/square-up-right.svg square_up_right
+F362 F0B5 solid/right-left.svg right_left
+F363 F0B6 solid/repeat.svg repeat_alt
+F369 F0B7 brands/accusoft.svg accusoft
+F36A F0B8 brands/adversal.svg adversal
+F36B F0B9 brands/affiliatetheme.svg affiliatetheme
+F36C F0BA brands/algolia.svg algolia
+F36D F0BB brands/amilia.svg amilia
+F36E F0BC brands/angrycreative.svg angrycreative
+F36F F0BD brands/app-store.svg app_store
+F370 F0BE brands/app-store-ios.svg app_store_ios
+F371 F0BF brands/apper.svg apper
+F0C0 F0C0 solid/users.svg users group
+F0C1 F0C1 solid/link.svg link chain
+F0C2 F0C2 solid/cloud.svg cloud
+F0C3 F0C3 solid/flask.svg flask
+F0C4 F0C4 solid/scissors.svg scissors cut
+F0C5 F0C5 regular/copy.svg copy files_o
+F0C6 F0C6 solid/paperclip.svg paperclip
+F0C7 F0C7 regular/floppy-disk.svg floppy_disk floppy_o save
+F0C8 F0C8 solid/square.svg square
+F0C9 F0C9 solid/bars.svg bars reorder navicon
+F0CA F0CA solid/list-ul.svg list_ul
+F0CB F0CB solid/list-ol.svg list_ol
+F0CC F0CC solid/strikethrough.svg strikethrough
+F0CD F0CD solid/underline.svg underline
+F0CE F0CE solid/table.svg table
+F372 F0CF brands/asymmetrik.svg asymmetrik
+F0D0 F0D0 solid/wand-magic.svg wand_magic magic
+F0D1 F0D1 solid/truck.svg truck
+F0D2 F0D2 brands/pinterest.svg pinterest
+F0D3 F0D3 brands/square-pinterest.svg square_pinterest pinterest_square
+F0D4 F0D4 brands/square-google-plus.svg square_google_plus google_plus_square
+F0D5 F0D5 brands/google-plus-g.svg google_plus
+F0D6 F0D6 solid/money-bill.svg money_bill money
+F0D7 F0D7 solid/caret-down.svg caret_down
+F0D8 F0D8 solid/caret-up.svg caret_up
+F0D9 F0D9 solid/caret-left.svg caret_left
+F0DA F0DA solid/caret-right.svg caret_right
+F0DB F0DB solid/table-columns.svg table_columns columns
+F0DC F0DC solid/sort.svg sort unsorted
+F0DD F0DD solid/sort-down.svg sort_down sort_desc
+F0DE F0DE solid/sort-up.svg sort_up sort_asc
+F373 F0DF brands/audible.svg audible
+F0E0 F0E0 solid/envelope.svg envelope
+F0E1 F0E1 brands/linkedin-in.svg linkedin_in linkedin
+F0E2 F0E2 solid/arrow-rotate-left.svg arrow_rotate_left undo
+F0E3 F0E3 solid/gavel.svg gavel legal
+F0E4 F0E4 solid/gauge-simple-high.svg gauge_simple_high dashboard tachometer
+F0E5 F0E5 regular/comment.svg comment_o
+F0E6 F0E6 regular/comments.svg comments_o
+F0E7 F0E7 solid/bolt.svg bolt flash
+F0E8 F0E8 solid/sitemap.svg sitemap
+F0E9 F0E9 solid/umbrella.svg umbrella
+F0EA F0EA solid/paste.svg paste clipboard
+F0EB F0EB regular/lightbulb.svg lightbulb lightbulb_o
+F0EC F0EC solid/arrow-right-arrow-left.svg arrow_right_arrow_left exchange
+F0ED F0ED solid/cloud-arrow-down.svg cloud_arrow_down cloud_download
+F0EE F0EE solid/cloud-arrow-up.svg cloud_arrow_up cloud_upload
+F375 F0EF brands/aws.svg aws
+F0F0 F0F0 solid/user-doctor.svg user_doctor user_md
+F0F1 F0F1 solid/stethoscope.svg stethoscope
+F0F2 F0F2 solid/suitcase.svg suitcase
+F0F3 F0F3 solid/bell.svg bell
+F0F4 F0F4 solid/mug-saucer.svg mug_saucer coffee
+F0F5 F0F5 solid/utensils.svg utensils cutlery
+F0F6 F0F6 regular/file-lines.svg file_text_o
+F0F7 F0F7 regular/building.svg building_o
+F0F8 F0F8 regular/hospital.svg hospital hospital_o
+F0F9 F0F9 solid/truck-medical.svg truck_medical ambulance
+F0FA F0FA solid/suitcase-medical.svg suitcase_medical medkit
+F0FB F0FB solid/jet-fighter.svg jet_fighter fighter_jet
+F0FC F0FC solid/beer-mug-empty.svg beer_mug_empty beer
+F0FD F0FD solid/square-h.svg square_h h_square
+F0FE F0FE solid/square-plus.svg square_plus plus_square
+F378 F0FF brands/bimobject.svg bimobject
+F100 F100 solid/angles-left.svg angles_left angle_double_left
+F101 F101 solid/angles-right.svg angles_right angle_double_right
+F102 F102 solid/angles-up.svg angles_up angle_double_up
+F103 F103 solid/angles-down.svg angles_down angle_double_down
+F104 F104 solid/angle-left.svg angle_left
+F105 F105 solid/angle-right.svg angle_right
+F106 F106 solid/angle-up.svg angle_up
+F107 F107 solid/angle-down.svg angle_down
+F108 F108 solid/desktop.svg desktop
+F109 F109 solid/laptop.svg laptop
+F3FA F10A solid/tablet-screen-button.svg tablet_screen_button
+F3CD F10B solid/mobile-screen-button.svg mobile_screen_button mobile_phone
+F10C F10C regular/circle.svg circle_o
+F10D F10D solid/quote-left.svg quote_left
+F10E F10E solid/quote-right.svg quote_right
+F379 F10F brands/bitcoin.svg bitcoin
+F110 F110 solid/spinner.svg spinner
+F111 F111 solid/circle.svg circle
+F112 F112 solid/reply.svg reply mail_reply
+F113 F113 brands/github-alt.svg github_alt
+F114 F114 regular/folder.svg folder_o
+F115 F115 regular/folder-open.svg folder_open_o
+F37A F116 brands/bity.svg bity
+F37B F117 brands/blackberry.svg blackberry
+F118 F118 regular/face-smile.svg face_smile smile_o
+F119 F119 regular/face-frown.svg face_frown frown_o
+F11A F11A regular/face-meh.svg face_meh meh_o
+F11B F11B solid/gamepad.svg gamepad
+F11C F11C regular/keyboard.svg keyboard keyboard_o
+F11D F11D regular/flag.svg flag_o
+F11E F11E solid/flag-checkered.svg flag_checkered
+F37C F11F brands/blogger.svg blogger
+F120 F120 solid/terminal.svg terminal
+F121 F121 solid/code.svg code
+F122 F122 solid/reply-all.svg reply_all mail_reply_all
+F123 F123 regular/star-half.svg star_half_o star_half_full star_half_empty
+F124 F124 solid/location-arrow.svg location_arrow
+F125 F125 solid/crop.svg crop
+F126 F126 solid/code-branch.svg code_branch code_fork
+F127 F127 solid/link-slash.svg link_slash unlink chain_broken
+F128 F128 solid/question.svg question
+F129 F129 solid/info.svg info
+F12A F12A solid/exclamation.svg exclamation
+F12B F12B solid/superscript.svg superscript
+F12C F12C solid/subscript.svg subscript
+F12D F12D solid/eraser.svg eraser
+F12E F12E solid/puzzle-piece.svg puzzle_piece
+F37D F12F brands/blogger-b.svg blogger_b
+F130 F130 solid/microphone.svg microphone
+F131 F131 solid/microphone-slash.svg microphone_slash
+F132 F132 solid/shield.svg shield
+F133 F133 regular/calendar.svg calendar_o
+F134 F134 solid/fire-extinguisher.svg fire_extinguisher
+F135 F135 solid/rocket.svg rocket
+F136 F136 brands/maxcdn.svg maxcdn
+F137 F137 solid/circle-chevron-left.svg circle_chevron_left chevron_circle_left
+F138 F138 solid/circle-chevron-right.svg circle_chevron_right chevron_circle_right
+F139 F139 solid/circle-chevron-up.svg circle_chevron_up chevron_circle_up
+F13A F13A solid/circle-chevron-down.svg circle_chevron_down chevron_circle_down
+F13B F13B brands/html5.svg html5
+F13C F13C brands/css3.svg css3
+F13D F13D solid/anchor.svg anchor
+F13E F13E solid/unlock-keyhole.svg unlock_keyhole unlock_alt
+F37F F13F brands/buromobelexperte.svg buromobelexperte
+F140 F140 solid/bullseye.svg bullseye
+F141 F141 solid/ellipsis.svg ellipsis ellipsis_h
+F142 F142 solid/ellipsis-vertical.svg ellipsis_vertical ellipsis_v
+F143 F143 solid/square-rss.svg square_rss rss_square
+F144 F144 solid/circle-play.svg circle_play play_circle
+F145 F145 solid/ticket.svg ticket
+F146 F146 solid/square-minus.svg square_minus minus_square
+F147 F147 regular/square-minus.svg minus_square_o
+F148 F148 solid/arrow-turn-up.svg arrow_turn_up level_up
+F149 F149 solid/arrow-turn-down.svg arrow_turn_down level_down
+F14A F14A solid/square-check.svg square_check check_square
+F14B F14B solid/square-pen.svg square_pen pencil_square
+F14C F14C solid/square-arrow-up-right.svg square_arrow_up_right external_link_square
+F14D F14D solid/share-from-square.svg share_from_square share_square
+F14E F14E regular/compass.svg compass
+F380 F14F brands/centercode.svg centercode
+F150 F150 regular/square-caret-down.svg square_caret_down caret_square_o_down toggle_down
+F151 F151 regular/square-caret-up.svg square_caret_up toggle_up caret_square_o_up
+F152 F152 regular/square-caret-right.svg square_caret_right toggle_right caret_square_o_right
+F153 F153 solid/euro-sign.svg euro_sign euro eur
+F154 F154 solid/sterling-sign.svg sterling_sign gbp
+F155 F155 solid/dollar-sign.svg dollar_sign dollar usd
+F156 F156 solid/rupee-sign.svg rupee_sign inr rupee
+F157 F157 solid/yen-sign.svg yen_sign jpy yen cny rmb
+F158 F158 solid/ruble-sign.svg ruble_sign rouble ruble rub
+F159 F159 solid/won-sign.svg won_sign krw won
+F15A F15A brands/btc.svg btc
+F15B F15B solid/file.svg file
+F15C F15C solid/file-lines.svg file_lines file_text
+F15D F15D solid/arrow-down-a-z.svg arrow_down_a_z sort_alpha_asc
+F15E F15E solid/arrow-up-a-z.svg arrow_up_a_z sort_alpha_desc
+F383 F15F brands/cloudscale.svg cloudscale
+F160 F160 solid/arrow-down-wide-short.svg arrow_down_wide_short sort_amount_asc
+F161 F161 solid/arrow-up-wide-short.svg arrow_up_wide_short sort_amount_desc
+F162 F162 solid/arrow-down-1-9.svg arrow_down_1_9 sort_numeric_asc
+F163 F163 solid/arrow-up-1-9.svg arrow_up_1_9 sort_numeric_desc
+F164 F164 solid/thumbs-up.svg thumbs_up
+F165 F165 solid/thumbs-down.svg thumbs_down
+F166 F166 brands/square-youtube.svg square_youtube youtube_square
+F384 F167 brands/cloudsmith.svg cloudsmith
+F168 F168 brands/xing.svg xing
+F169 F169 brands/square-xing.svg square_xing xing_square
+F167 F16A brands/youtube.svg youtube youtube_play
+F16B F16B brands/dropbox.svg dropbox
+F16C F16C brands/stack-overflow.svg stack_overflow
+F16D F16D brands/instagram.svg instagram
+F16E F16E brands/flickr.svg flickr
+F385 F16F brands/cloudversify.svg cloudversify
+F170 F170 brands/adn.svg adn
+F171 F171 brands/bitbucket.svg bitbucket
+F386 F172 solid/code-commit.svg code_commit bitbucket_square
+F173 F173 brands/tumblr.svg tumblr
+F174 F174 brands/square-tumblr.svg square_tumblr tumblr_square
+F175 F175 solid/arrow-down-long.svg arrow_down_long long_arrow_down
+F176 F176 solid/arrow-up-long.svg arrow_up_long long_arrow_up
+F177 F177 solid/arrow-left-long.svg arrow_left_long long_arrow_left
+F178 F178 solid/arrow-right-long.svg arrow_right_long long_arrow_right
+F179 F179 brands/apple.svg apple
+F17A F17A brands/windows.svg windows
+F17B F17B brands/android.svg android
+F17C F17C brands/linux.svg linux
+F17D F17D brands/dribbble.svg dribbble
+F17E F17E brands/skype.svg skype
+F387 F17F solid/code-merge.svg code_merge
+F180 F180 brands/foursquare.svg foursquare
+F181 F181 brands/trello.svg trello
+F182 F182 solid/person-dress.svg person_dress female
+F183 F183 solid/person.svg person male
+F184 F184 brands/gratipay.svg gratipay gittip
+F185 F185 regular/sun.svg sun sun_o
+F186 F186 regular/moon.svg moon moon_o
+F187 F187 solid/box-archive.svg box_archive archive
+F188 F188 solid/bug.svg bug
+F189 F189 brands/vk.svg vk
+F18A F18A brands/weibo.svg weibo
+F18B F18B brands/renren.svg renren
+F18C F18C brands/pagelines.svg pagelines
+F18D F18D brands/stack-exchange.svg stack_exchange
+F18E F18E regular/circle-right.svg circle_right arrow_circle_o_right
+F388 F18F brands/cpanel.svg cpanel
+F190 F190 regular/circle-left.svg circle_left arrow_circle_o_left
+F191 F191 regular/square-caret-left.svg square_caret_left caret_square_o_left toggle_left
+F192 F192 regular/circle-dot.svg circle_dot dot_circle_o
+F193 F193 solid/wheelchair.svg wheelchair
+F194 F194 brands/square-vimeo.svg square_vimeo vimeo_square
+F195 F195 solid/lira-sign.svg lira_sign turkish_lira try
+F196 F196 regular/square-plus.svg plus_square_o
+F197 F197 solid/shuttle-space.svg shuttle_space space_shuttle
+F198 F198 brands/slack.svg slack
+F199 F199 solid/square-envelope.svg square_envelope envelope_square
+F19A F19A brands/wordpress.svg wordpress
+F19B F19B brands/openid.svg openid
+F19C F19C solid/building-columns.svg building_columns bank institution university
+F19D F19D solid/graduation-cap.svg graduation_cap mortar_board
+F19E F19E brands/yahoo.svg yahoo
+F38B F19F brands/css3-alt.svg css3_alt
+F1A0 F1A0 brands/google.svg google
+F1A1 F1A1 brands/reddit.svg reddit
+F1A2 F1A2 brands/square-reddit.svg square_reddit reddit_square
+F1A3 F1A3 brands/stumbleupon-circle.svg stumbleupon_circle
+F1A4 F1A4 brands/stumbleupon.svg stumbleupon
+F1A5 F1A5 brands/delicious.svg delicious
+F1A6 F1A6 brands/digg.svg digg
+F1A7 F1A7 brands/pied-piper-pp.svg pied_piper_pp
+F1A8 F1A8 brands/pied-piper-alt.svg pied_piper_alt
+F1A9 F1A9 brands/drupal.svg drupal
+F1AA F1AA brands/joomla.svg joomla
+F1AB F1AB solid/language.svg language
+F1AC F1AC solid/fax.svg fax
+F1AD F1AD solid/building.svg building
+F1AE F1AE solid/child.svg child
+F38C F1AF brands/cuttlefish.svg cuttlefish
+F1B0 F1B0 solid/paw.svg paw
+F1B1 F1B1 solid/spoon.svg spoon
+F1B2 F1B2 solid/cube.svg cube
+F1B3 F1B3 solid/cubes.svg cubes
+F1B4 F1B4 brands/behance.svg behance
+F1B5 F1B5 brands/square-behance.svg square_behance behance_square
+F1B6 F1B6 brands/steam.svg steam
+F1B7 F1B7 brands/square-steam.svg square_steam steam_square
+F1B8 F1B8 solid/recycle.svg recycle
+F1B9 F1B9 solid/car.svg car automobile
+F1BA F1BA solid/taxi.svg taxi cab
+F1BB F1BB solid/tree.svg tree
+F1BC F1BC brands/spotify.svg spotify
+F1BD F1BD brands/deviantart.svg deviantart
+F1BE F1BE brands/soundcloud.svg soundcloud
+F38D F1BF brands/d-and-d.svg d_and_d
+F1C0 F1C0 solid/database.svg database
+F1C1 F1C1 regular/file-pdf.svg file_pdf file_pdf_o
+F1C2 F1C2 regular/file-word.svg file_word file_word_o
+F1C3 F1C3 regular/file-excel.svg file_excel file_excel_o
+F1C4 F1C4 regular/file-powerpoint.svg file_powerpoint file_powerpoint_o
+F1C5 F1C5 regular/file-image.svg file_image file_picture_o file_image_o file_photo_o
+F1C6 F1C6 regular/file-zipper.svg file_zipper file_zip_o file_archive_o
+F1C7 F1C7 regular/file-audio.svg file_audio file_audio_o file_sound_o
+F1C8 F1C8 regular/file-video.svg file_video file_movie_o file_video_o
+F1C9 F1C9 regular/file-code.svg file_code file_code_o
+F1CA F1CA brands/vine.svg vine
+F1CB F1CB brands/codepen.svg codepen
+F1CC F1CC brands/jsfiddle.svg jsfiddle
+F1CD F1CD regular/life-ring.svg life_ring support life_bouy life_saver life_buoy
+F1CE F1CE solid/circle-notch.svg circle_notch circle_o_notch
+F38E F1CF brands/deploydog.svg deploydog
+F1D0 F1D0 brands/rebel.svg rebel ra resistance
+F1D1 F1D1 brands/empire.svg empire ge
+F1D2 F1D2 brands/square-git.svg square_git git_square
+F1D3 F1D3 brands/git.svg git
+F1D4 F1D4 brands/hacker-news.svg hacker_news y_combinator_square yc_square
+F1D5 F1D5 brands/tencent-weibo.svg tencent_weibo
+F1D6 F1D6 brands/qq.svg qq
+F1D7 F1D7 brands/weixin.svg weixin wechat
+F1D8 F1D8 solid/paper-plane.svg paper_plane send
+F1D9 F1D9 regular/paper-plane.svg paper_plane_o send_o
+F1DA F1DA solid/clock-rotate-left.svg clock_rotate_left history
+F1DB F1DB regular/circle.svg circle_thin
+F1DC F1DC solid/heading.svg heading header
+F1DD F1DD solid/paragraph.svg paragraph
+F1DE F1DE solid/sliders.svg sliders
+F38F F1DF brands/deskpro.svg deskpro
+F1E0 F1E0 solid/share-nodes.svg share_nodes share_alt
+F1E1 F1E1 solid/square-share-nodes.svg square_share_nodes share_alt_square
+F1E2 F1E2 solid/bomb.svg bomb
+F1E3 F1E3 regular/futbol.svg futbol soccer_ball_o futbol_o
+F1E4 F1E4 solid/tty.svg tty
+F1E5 F1E5 solid/binoculars.svg binoculars
+F1E6 F1E6 solid/plug.svg plug
+F1E7 F1E7 brands/slideshare.svg slideshare
+F1E8 F1E8 brands/twitch.svg twitch
+F1E9 F1E9 brands/yelp.svg yelp
+F1EA F1EA regular/newspaper.svg newspaper newspaper_o
+F1EB F1EB solid/wifi.svg wifi
+F1EC F1EC solid/calculator.svg calculator
+F1ED F1ED brands/paypal.svg paypal
+F1EE F1EE brands/google-wallet.svg google_wallet
+F391 F1EF brands/digital-ocean.svg digital_ocean
+F1F0 F1F0 brands/cc-visa.svg cc_visa
+F1F1 F1F1 brands/cc-mastercard.svg cc_mastercard
+F1F2 F1F2 brands/cc-discover.svg cc_discover
+F1F3 F1F3 brands/cc-amex.svg cc_amex
+F1F4 F1F4 brands/cc-paypal.svg cc_paypal
+F1F5 F1F5 brands/cc-stripe.svg cc_stripe
+F1F6 F1F6 solid/bell-slash.svg bell_slash
+F1F7 F1F7 regular/bell-slash.svg bell_slash_o
+F1F8 F1F8 solid/trash.svg trash
+F1F9 F1F9 regular/copyright.svg copyright
+F1FA F1FA solid/at.svg at
+F1FB F1FB solid/eye-dropper.svg eye_dropper eyedropper
+F1FC F1FC solid/paintbrush.svg paintbrush paint_brush
+F1FD F1FD solid/cake-candles.svg cake_candles birthday_cake
+F1FE F1FE solid/chart-area.svg chart_area area_chart
+F392 F1FF brands/discord.svg discord
+F200 F200 solid/chart-pie.svg chart_pie pie_chart
+F201 F201 solid/chart-line.svg chart_line line_chart
+F202 F202 brands/lastfm.svg lastfm
+F203 F203 brands/square-lastfm.svg square_lastfm lastfm_square
+F204 F204 solid/toggle-off.svg toggle_off
+F205 F205 solid/toggle-on.svg toggle_on
+F206 F206 solid/bicycle.svg bicycle
+F207 F207 solid/bus.svg bus
+F208 F208 brands/ioxhost.svg ioxhost
+F209 F209 brands/angellist.svg angellist
+F20A F20A regular/closed-captioning.svg closed_captioning cc
+F20B F20B solid/shekel-sign.svg shekel_sign sheqel shekel ils
+F393 F20C brands/discourse.svg discourse meanpath
+F20D F20D brands/buysellads.svg buysellads
+F20E F20E brands/connectdevelop.svg connectdevelop
+F394 F20F brands/dochub.svg dochub
+F210 F210 brands/dashcube.svg dashcube
+F211 F211 brands/forumbee.svg forumbee
+F212 F212 brands/leanpub.svg leanpub
+F213 F213 brands/sellsy.svg sellsy
+F214 F214 brands/shirtsinbulk.svg shirtsinbulk
+F215 F215 brands/simplybuilt.svg simplybuilt
+F216 F216 brands/skyatlas.svg skyatlas
+F217 F217 solid/cart-plus.svg cart_plus
+F218 F218 solid/cart-arrow-down.svg cart_arrow_down
+F3A5 F219 regular/gem.svg gem
+F21A F21A solid/ship.svg ship
+F21B F21B solid/user-secret.svg user_secret
+F21C F21C solid/motorcycle.svg motorcycle
+F21D F21D solid/street-view.svg street_view
+F21E F21E solid/heart-pulse.svg heart_pulse heartbeat
+F395 F21F brands/docker.svg docker
+F396 F220 brands/draft2digital.svg draft2digital
+F221 F221 solid/venus.svg venus
+F222 F222 solid/mars.svg mars
+F223 F223 solid/mercury.svg mercury
+F224 F224 solid/mars-and-venus.svg transgender intersex
+F225 F225 solid/transgender.svg transgender_alt
+F226 F226 solid/venus-double.svg venus_double
+F227 F227 solid/mars-double.svg mars_double
+F228 F228 solid/venus-mars.svg venus_mars
+F229 F229 solid/mars-stroke.svg mars_stroke
+F22A F22A solid/mars-stroke-up.svg mars_stroke_up mars_stroke_v
+F22B F22B solid/mars-stroke-right.svg mars_stroke_right mars_stroke_h
+F22C F22C solid/neuter.svg neuter
+F22D F22D solid/genderless.svg genderless
+F397 F22E brands/square-dribbble.svg square_dribbble
+F399 F22F brands/dyalog.svg dyalog
+F39A F230 brands/earlybirds.svg earlybirds facebook_official
+F231 F231 brands/pinterest-p.svg pinterest_p
+F232 F232 brands/whatsapp.svg whatsapp
+F233 F233 solid/server.svg server
+F234 F234 solid/user-plus.svg user_plus
+F235 F235 solid/user-xmark.svg user_xmark user_times
+F236 F236 solid/bed.svg bed hotel
+F237 F237 brands/viacoin.svg viacoin
+F238 F238 solid/train.svg train
+F239 F239 solid/train-subway.svg train_subway subway
+F23A F23A brands/medium.svg medium
+F23B F23B brands/y-combinator.svg y_combinator yc
+F23C F23C brands/optin-monster.svg optin_monster
+F23D F23D brands/opencart.svg opencart
+F23E F23E brands/expeditedssl.svg expeditedssl
+F39D F23F brands/erlang.svg erlang
+F240 F240 solid/battery-full.svg battery_full battery battery_4
+F241 F241 solid/battery-three-quarters.svg battery_three_quarters battery_3
+F242 F242 solid/battery-half.svg battery_half battery_2
+F243 F243 solid/battery-quarter.svg battery_quarter battery_1
+F244 F244 solid/battery-empty.svg battery_empty battery_0
+F245 F245 solid/arrow-pointer.svg arrow_pointer mouse_pointer
+F246 F246 solid/i-cursor.svg i_cursor
+F247 F247 regular/object-group.svg object_group
+F248 F248 regular/object-ungroup.svg object_ungroup
+F249 F249 solid/note-sticky.svg note_sticky sticky_note
+F24A F24A regular/note-sticky.svg sticky_note_o
+F24B F24B brands/cc-jcb.svg cc_jcb
+F24C F24C brands/cc-diners-club.svg cc_diners_club
+F24D F24D regular/clone.svg clone
+F24E F24E solid/scale-balanced.svg scale_balanced balance_scale
+F39E F24F brands/facebook-f.svg facebook_f
+F250 F250 regular/hourglass.svg hourglass_o
+F251 F251 solid/hourglass-start.svg hourglass_start hourglass_1
+F252 F252 regular/hourglass-half.svg hourglass_half hourglass_2
+F253 F253 solid/hourglass-end.svg hourglass_end hourglass_3
+F254 F254 solid/hourglass.svg hourglass
+F255 F255 regular/hand-back-fist.svg hand_back_fist hand_rock_o hand_grab_o
+F256 F256 regular/hand.svg hand hand_paper_o hand_stop_o
+F257 F257 regular/hand-scissors.svg hand_scissors hand_scissors_o
+F258 F258 regular/hand-lizard.svg hand_lizard hand_lizard_o
+F259 F259 regular/hand-spock.svg hand_spock hand_spock_o
+F25A F25A regular/hand-pointer.svg hand_pointer hand_pointer_o
+F25B F25B regular/hand-peace.svg hand_peace hand_peace_o
+F25C F25C solid/trademark.svg trademark
+F25D F25D regular/registered.svg registered
+F25E F25E brands/creative-commons.svg creative_commons
+F39F F25F brands/facebook-messenger.svg facebook_messenger
+F260 F260 brands/gg.svg gg
+F261 F261 brands/gg-circle.svg gg_circle
+F3A1 F262 brands/firstdraft.svg firstdraft tripadvisor
+F263 F263 brands/odnoklassniki.svg odnoklassniki
+F264 F264 brands/square-odnoklassniki.svg square_odnoklassniki odnoklassniki_square
+F265 F265 brands/get-pocket.svg get_pocket
+F266 F266 brands/wikipedia-w.svg wikipedia_w
+F267 F267 brands/safari.svg safari
+F268 F268 brands/chrome.svg chrome
+F269 F269 brands/firefox.svg firefox
+F26A F26A brands/opera.svg opera
+F26B F26B brands/internet-explorer.svg internet_explorer
+F26C F26C solid/tv.svg tv television
+F26D F26D brands/contao.svg contao
+F26E F26E brands/500px.svg 500px
+F3A2 F26F brands/fonticons-fi.svg fonticons_fi
+F270 F270 brands/amazon.svg amazon
+F271 F271 regular/calendar-plus.svg calendar_plus calendar_plus_o
+F272 F272 regular/calendar-minus.svg calendar_minus calendar_minus_o
+F273 F273 regular/calendar-xmark.svg calendar_xmark calendar_times_o
+F274 F274 regular/calendar-check.svg calendar_check calendar_check_o
+F275 F275 solid/industry.svg industry
+F276 F276 solid/map-pin.svg map_pin
+F277 F277 solid/signs-post.svg signs_post map_signs
+F278 F278 regular/map.svg map_o
+F279 F279 solid/map.svg map
+F27A F27A solid/message.svg message commenting
+F27B F27B regular/comment-dots.svg comment_dots commenting_o
+F27C F27C brands/houzz.svg houzz
+F27D F27D brands/vimeo-v.svg vimeo_v
+F27E F27E brands/black-tie.svg black_tie
+F3A3 F27F brands/fort-awesome-alt.svg fort_awesome_alt
+F280 F280 brands/fonticons.svg fonticons
+F281 F281 brands/reddit-alien.svg reddit_alien
+F282 F282 brands/edge.svg edge
+F283 F283 solid/credit-card.svg credit_card_alt
+F284 F284 brands/codiepie.svg codiepie
+F285 F285 brands/modx.svg modx
+F286 F286 brands/fort-awesome.svg fort_awesome
+F287 F287 brands/usb.svg usb
+F288 F288 brands/product-hunt.svg product_hunt
+F289 F289 brands/mixcloud.svg mixcloud
+F28A F28A brands/scribd.svg scribd
+F28B F28B solid/circle-pause.svg circle_pause pause_circle
+F28C F28C regular/circle-pause.svg pause_circle_o
+F28D F28D solid/circle-stop.svg circle_stop stop_circle
+F28E F28E regular/circle-stop.svg stop_circle_o
+F3A4 F28F brands/freebsd.svg freebsd
+F290 F290 solid/bag-shopping.svg bag_shopping shopping_bag
+F291 F291 solid/basket-shopping.svg basket_shopping shopping_basket
+F292 F292 solid/hashtag.svg hashtag
+F293 F293 brands/bluetooth.svg bluetooth
+F294 F294 brands/bluetooth-b.svg bluetooth_b
+F295 F295 solid/percent.svg percent
+F296 F296 brands/gitlab.svg gitlab
+F297 F297 brands/wpbeginner.svg wpbeginner
+F298 F298 brands/wpforms.svg wpforms
+F299 F299 brands/envira.svg envira
+F29A F29A solid/universal-access.svg universal_access
+F29B F29B brands/accessible-icon.svg accessible_icon wheelchair_alt
+F29C F29C regular/circle-question.svg question_circle_o
+F29D F29D solid/person-walking-with-cane.svg person_walking_with_cane blind
+F29E F29E solid/audio-description.svg audio_description
+F219 F29F solid/diamond.svg diamond
+F2A0 F2A0 solid/phone-volume.svg phone_volume volume_control_phone
+F2A1 F2A1 solid/braille.svg braille
+F2A2 F2A2 solid/ear-listen.svg ear_listen assistive_listening_systems
+F2A3 F2A3 solid/hands-asl-interpreting.svg hands_asl_interpreting american_sign_language_interpreting asl_interpreting
+F2A4 F2A4 solid/ear-deaf.svg ear_deaf deaf deafness hard_of_hearing
+F2A5 F2A5 brands/glide.svg glide
+F2A6 F2A6 brands/glide-g.svg glide_g
+F2A7 F2A7 solid/hands.svg hands signing sign_language
+F2A8 F2A8 solid/eye-low-vision.svg eye_low_vision low_vision
+F2A9 F2A9 brands/viadeo.svg viadeo
+F2AA F2AA brands/square-viadeo.svg square_viadeo viadeo_square
+F2AB F2AB brands/snapchat.svg snapchat
+F3A6 F2AC brands/gitkraken.svg gitkraken snapchat_ghost
+F2AD F2AD brands/square-snapchat.svg square_snapchat snapchat_square
+F2AE F2AE brands/pied-piper.svg pied_piper
+F3A7 F2AF brands/gofore.svg gofore
+F2B0 F2B0 brands/first-order.svg first_order
+F2B1 F2B1 brands/yoast.svg yoast
+F2B2 F2B2 brands/themeisle.svg themeisle
+F2B3 F2B3 brands/google-plus.svg google_plus_circle google_plus_official
+F2B4 F2B4 solid/font-awesome.svg font_awesome fa
+F2B5 F2B5 regular/handshake.svg handshake handshake_o
+F2B6 F2B6 solid/envelope-open.svg envelope_open
+F2B7 F2B7 regular/envelope-open.svg envelope_open_o
+F2B8 F2B8 brands/linode.svg linode
+F2B9 F2B9 solid/address-book.svg address_book
+F2BA F2BA regular/address-book.svg address_book_o
+F2BB F2BB solid/address-card.svg address_card vcard
+F2BC F2BC regular/address-card.svg address_card_o vcard_o
+F2BD F2BD solid/circle-user.svg circle_user user_circle
+F2BE F2BE regular/circle-user.svg user_circle_o
+F3A8 F2BF brands/goodreads.svg goodreads
+F2C0 F2C0 regular/user.svg user_o
+F2C1 F2C1 regular/id-badge.svg id_badge
+F2C2 F2C2 solid/id-card.svg id_card drivers_license
+F2C3 F2C3 regular/id-card.svg id_card_o drivers_license_o
+F2C4 F2C4 brands/quora.svg quora
+F2C5 F2C5 brands/free-code-camp.svg free_code_camp
+F2C6 F2C6 brands/telegram.svg telegram
+F2C7 F2C7 solid/temperature-full.svg temperature_full thermometer_4 thermometer thermometer_full
+F2C8 F2C8 solid/temperature-three-quarters.svg temperature_three_quarters thermometer_3 thermometer_three_quarters
+F2C9 F2C9 solid/temperature-half.svg temperature_half thermometer_2 thermometer_half
+F2CA F2CA solid/temperature-quarter.svg temperature_quarter thermometer_1 thermometer_quarter
+F2CB F2CB solid/temperature-empty.svg temperature_empty thermometer_empty thermometer_0
+F2CC F2CC solid/shower.svg shower
+F2CD F2CD solid/bath.svg bath bathtub s15
+F2CE F2CE solid/podcast.svg podcast
+F3A9 F2CF brands/goodreads-g.svg goodreads_g
+F2D0 F2D0 regular/window-maximize.svg window_maximize
+F2D1 F2D1 regular/window-minimize.svg window_minimize
+F2D2 F2D2 regular/window-restore.svg window_restore
+F2D3 F2D3 solid/square-xmark.svg square_xmark times_rectangle window_close
+F2D4 F2D4 regular/rectangle-xmark.svg rectangle_xmark window_close_o times_rectangle_o
+F2D5 F2D5 brands/bandcamp.svg bandcamp
+F2D6 F2D6 brands/grav.svg grav
+F2D7 F2D7 brands/etsy.svg etsy
+F2D8 F2D8 brands/imdb.svg imdb
+F2D9 F2D9 brands/ravelry.svg ravelry
+F2DA F2DA brands/sellcast.svg sellcast eercast
+F2DB F2DB solid/microchip.svg microchip
+F2DC F2DC regular/snowflake.svg snowflake snowflake_o
+F2DD F2DD brands/superpowers.svg superpowers
+F2DE F2DE brands/wpexplorer.svg wpexplorer
+F3AA F2DF brands/google-drive.svg google_drive
+F2E0 F2E0 brands/meetup.svg meetup
+F3AB F2E1 brands/google-play.svg google_play
+F3AC F2E2 brands/gripfire.svg gripfire
+F3AD F2E3 brands/grunt.svg grunt
+F3AE F2E4 brands/gulp.svg gulp
+F3AF F2E5 brands/square-hacker-news.svg square_hacker_news
+F3B0 F2E6 brands/hire-a-helper.svg hire_a_helper
+F3B1 F2E7 brands/hotjar.svg hotjar
+F3B2 F2E8 brands/hubspot.svg hubspot
+F3B4 F2E9 brands/itunes.svg itunes
+F2EA F2EA solid/rotate-left.svg rotate_left
+F3B5 F2EB brands/itunes-note.svg itunes_note
+F3B6 F2EC brands/jenkins.svg jenkins
+F3B7 F2ED brands/joget.svg joget
+F3B8 F2EE brands/js.svg js
+F3B9 F2EF brands/square-js.svg square_js
+F3BA F2F0 brands/keycdn.svg keycdn
+F2F1 F2F1 solid/rotate.svg rotate
+F2F2 F2F2 solid/stopwatch.svg stopwatch
+F3BB F2F3 brands/kickstarter.svg kickstarter
+F3BC F2F4 brands/kickstarter-k.svg kickstarter_k
+F2F5 F2F5 solid/right-from-bracket.svg right_from_bracket
+F2F6 F2F6 solid/right-to-bracket.svg right_to_bracket
+F3BD F2F7 brands/laravel.svg laravel
+F3BE F2F8 solid/turn-down.svg turn_down
+F2F9 F2F9 solid/rotate-right.svg rotate_right
+F3BF F2FA solid/turn-up.svg turn_up
+F3C0 F2FB brands/line.svg line
+F3C1 F2FC solid/lock-open.svg lock_open
+F3C3 F2FD brands/lyft.svg lyft
+F2FE F2FE solid/poo.svg poo
+F3C4 F2FF brands/magento.svg magento
+# Name clash: name: youtube, old: F167, new: F16A (F167), name at old pos: cloudsmith
+# Name clash: name: rotate_left, old: F0E2, new: F2EA (F2EA), name at old pos: arrow_rotate_left
+# Name clash: name: rotate_right, old: F01E, new: F2F9 (F2F9), name at old pos: arrow_rotate_right
+# Name clash: name: bitcoin, old: F15A, new: F10F (F379), name at old pos: btc
+# Name clash: name: facebook_f, old: F09A, new: F24F (F39E), name at old pos: facebook
+# Name clash: name: diamond, old: F219, new: F29F (F219), name at old pos: gem
+# Name clash: name: mobile, old: F10B, new: ED08 (F3CE), name at old pos: mobile_screen_button
+# Name clash: name: tablet, old: F10A, new: ED2E (F3FB), name at old pos: tablet_screen_button
+# Name clash: name: vimeo, old: F27D, new: ED39 (F40A), name at old pos: vimeo_v
+
diff --git a/bin/nerdfont/src/glyphs/font-awesome/remix b/bin/nerdfont/src/glyphs/font-awesome/remix
new file mode 100644
index 0000000..675d17b
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/font-awesome/remix
@@ -0,0 +1,237 @@
+#!/usr/bin/env python3
+# coding=utf8
+
+# Create a mapping file by combining the three free Font Awesome release
+# fonts and tries to keep the codepoints for old version 4.2 icons.
+# Newer icons are used to fill gaps and afterwards fill the new
+# range in Nerd Fonts of ED00-EFFF.
+#
+# Range A is F000 - F2FF, the 'original' codepoint range of FA in Nerd Fonts
+# Range B is F300 - F8FF, icons added to FA after 4.2
+# Range C is E000 - EFFF, more icons added to FA after 4.2
+
+# PREREQUISITES: Download Font Awesome release
+# $ curl -OL https://github.com/FortAwesome/Font-Awesome/releases/download/6.5.1/fontawesome-free-6.5.1-desktop.zip
+# $ unzip fontawesome-free-6.5.1-desktop.zip
+# $ cd fontawesome-free-6.5.1-desktop/otfs
+# $ fontforge ../../remix > ../../remix_mapping
+#
+# We do not use the font file generated by this script
+
+import fontforge, os, sys
+
+def find_destination(codepoint, font):
+    global swap_codes
+    for change in swap_codes:
+        if codepoint not in change:
+            continue
+        if codepoint == change[0]:
+            codepoint = change[1]
+        else:
+            codepoint = change[0]
+        break
+
+    if codepoint >= 0xF000 and codepoint < 0xF300:
+        # Keep codepoints in legacy region 'Region A'
+        return codepoint
+    if codepoint < 0xF000:
+        # Do not include any from 'Region C'
+        return None
+    # Fill gaps with the remaing icons (i.e. 'Region B')
+    # That will target first the original FA codepoint range in NF (F000-F2FF)
+    # and if that is full use the additional range ED00-EFFF
+    # The subrange 0xEE00 - 0xEE0B is reserved for Fira Code progress icons
+    for point in [ *range(0xF000, 0xF300), *range(0xED00, 0xEE00), *range(0xEE0C, 0xF000) ]:
+        if point not in font:
+            return point
+    print("No space found - abort")
+    sys.exit(1)
+
+
+class Sources:
+    def __init__(self):
+        self.regul = fontforge.open('Font Awesome 6 Free-Regular-400.otf')
+        self.solid = fontforge.open('Font Awesome 6 Free-Solid-900.otf')
+        self.brand = fontforge.open('Font Awesome 6 Brands-Regular-400.otf')
+        self.regul.encoding = 'UnicodeFull'
+        self.solid.encoding = 'UnicodeFull'
+        self.brand.encoding = 'UnicodeFull'
+
+sources = Sources()
+compo = fontforge.font()
+compo.encoding = 'UnicodeFull'
+
+names = {}
+
+count0 = 0
+count1 = 0
+count2 = 0
+count3 = 0
+count4 = 0
+
+# To solve some new names and keep old naming intact
+renames = {
+    0xF003: 'envelope_o',
+    0xF006: 'star_o',
+    0xF046: 'check_square_o',
+    0xF057: 'remove_sign',
+    0xF058: 'ok_sign',
+    0xF087: 'thumbs_o_up',
+    0xF088: 'thumbs_o_down',
+    0xF016: 'file_o',
+    0xF01D: 'play_circle_o',
+    0xF045: 'share_square_o',
+    0xF087: 'thumbs_o_up',
+    0xF088: 'thumbs_o_down',
+    0xF08A: 'heard_o',
+    0xF08C: 'linkedin_square',
+    0xF096: 'square_o',
+    0xF097: 'bookmark_o',
+    0xF0A2: 'bell_o',
+    0xF0D5: 'google_plus',
+    0xF0E5: 'comment_o',
+    0xF0E6: 'comments_o',
+    0xF0F6: 'file_text_o',
+    0xF0F7: 'building_o',
+    0xF10C: 'circle_o',
+    0xF114: 'folder_o',
+    0xF115: 'folder_open_o',
+    0xF11D: 'flag_o',
+    0xF123: 'star_half_o',
+    0xF133: 'calendar_o',
+    0xF147: 'minus_square_o',
+    0xF196: 'plus_square_o',
+    0xF1D9: 'paper_plane_o',
+    0xF1DB: 'circle_thin',
+    0xF1F7: 'bell_slash_o',
+    0xF224: 'transgender',
+    0xF225: 'transgender_alt',
+    0xF24A: 'sticky_note_o',
+    0xF250: 'hourglass_o',
+    0xF278: 'map_o',
+    0xF283: 'credit_card_alt',
+    0xF28C: 'pause_circle_o',
+    0xF28E: 'stop_circle_o',
+    0xF29C: 'question_circle_o',
+    0xF2B3: 'google_plus_circle',
+    0xF2B7: 'envelope_open_o',
+    0xF2BA: 'address_book_o',
+    0xF2BC: 'address_card_o',
+    0xF2BE: 'user_circle_o',
+    0xF2C0: 'user_o',
+    0xF2C3: 'id_card_o',
+    0xf328: 'clipboard_alt',
+    0xF363: 'repeat_alt',
+    0xF491: 'thermometer_alt',
+    0xF594: 'hotel_building',
+}
+
+# If Regular and Solid have a specific icon we prefer Regular, except for these:
+prefer_solid = {
+    0xF004, 0xF007, 0xF005, 0xF024, 0xF02E,
+    0xF057, 0xF058, 0xF059, 0xF075, 0xF07B,
+    0xF07C, 0xF086, 0xF089, 0xF0C8, 0xF0EA,
+    0xF0FE, 0xF146, 0xF14C, 0xF1D8, 0xF1F6,
+    0xF249, 0xF27A, 0xF28B, 0xF28D, 0xF2B4,
+    0xF2B6, 0xF2B9, 0xF2BB, 0xF2BD, 0xF2C2,
+}
+
+# Special handling of some few icons, see PR #1596
+move_or_drop = { 0xF30B: False, 0xF30C: False, 0xF374: True,
+                 0xF536: True, 0xF537: True, 0xF538: True, 0xF539: True, 0xF53A: True, 0xF53B: True, # move for progress icons
+                 0xF53C: True, 0xF53D: True, 0xF53E: True, 0xF53F: True, 0xF540: True, 0xF542: True, # move for progress icons
+                 0xF219: 0xF3A5, 0xF10A: 0xF3FA, 0xF10B: 0xF3CD, }
+swap_codes = [ (0xF167, 0xF16A), (0xF219, 0xF3A5), (0xF10A, 0xF3FA), (0xF10B, 0xF3CD), ]
+
+block_regular = set()
+
+print('# Intermediate mapping file')
+print('#')
+print('# FA-code NF-code filename FA-name')
+print('#')
+
+# Reorder processing to accomodate for glyph shifts introduced
+all_points = [ *range(0xF000, 0xF900), *range(0xE000, 0xF000) ]
+for code, move in move_or_drop.items():
+    if not isinstance(move, bool):
+        i1 = all_points.index(code)
+        i2 = all_points.index(move)
+        all_points[i1] = move
+        all_points[i2] = code
+        continue
+    all_points.remove(code)
+    if move:
+        all_points.append(code)
+
+for point in all_points:
+    source = None
+    subset = 'none'
+    if point in sources.regul and point not in block_regular and point not in prefer_solid:
+        source = sources.regul
+        subset = 'regular'
+        # Dont add the same icon multiple times
+        altuni = source[point].altuni
+        if altuni:
+            for i, _, _ in altuni:
+                if i != 0xf1db: # Allow circle to be used twice
+                    block_regular.add(i)
+    elif point in sources.solid:
+        source = sources.solid
+        subset = 'solid'
+    elif point in sources.brand:
+        source = sources.brand
+        subset = 'brands'
+    else:
+        continue
+
+    glyphname = source[point].glyphname.replace('-', '_')
+    if point in renames:
+        old_glyphname = glyphname
+        glyphname = renames[point]
+        print('# RENAME {} to {}'.format(old_glyphname, glyphname))
+
+    if glyphname in names:
+        # Assume same glyphname means same icon
+        # print('{:04X} {} dropped, (already in {:0X})'.format(point, glyphname, names[glyphname]))
+        count0 += 1
+        continue
+    names[glyphname] = point
+
+    source.selection.select(point)
+    destpoint = find_destination(point, compo)
+    if destpoint is None:
+        destpoint = 0
+        count1 += 1
+    else:
+        compo.selection.select(destpoint)
+        source.copy()
+        compo.paste()
+        compo[destpoint].glyphname = glyphname
+        compo[destpoint].manualHints = True
+
+    if not os.path.exists('../svgs/'  + subset + '/' + source[point].glyphname + '.svg'):
+        if os.path.exists('../svgs/'  + 'solid' + '/' + source[point].glyphname + '.svg'):
+            # Some glyphs originate from Solid but are also in Regular
+            subset = 'solid'
+        else:
+            print('Missing SVG "{}" - abort'.format(source[point].glyphname))
+            sys.exit(1)
+
+    print('{}{:04X} {:04X} {}/{}.svg {}'.format('' if destpoint != 0 else '# ', point, destpoint, subset, source[point].glyphname, glyphname))
+    if destpoint != 0:
+        if point < 0xF000:
+            count4 += 1
+        elif point < 0xF300:
+            count2 += 1
+        else:
+            count3 += 1
+
+print('# Summary')
+print('# - Duplicates {}'.format(count0))
+print('# - Dropped {}'.format(count1))
+print('# - From original range {} (0x{:X})'.format(count2, count2))
+print('# - From extended F0 range {} (0x{:X})'.format(count3, count3))
+print('# - From E0 range {} (0x{:X})'.format(count4, count4))
+
+# print('\nGenerating...')
+# compo.generate('FontAwesomeNew.otf')
diff --git a/bin/nerdfont/src/glyphs/font-awesome/remix_mapping b/bin/nerdfont/src/glyphs/font-awesome/remix_mapping
new file mode 100644
index 0000000..eda5a86
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/font-awesome/remix_mapping
@@ -0,0 +1,1937 @@
+# Intermediate mapping file
+#
+# FA-code NF-code filename FA-name
+#
+F000 F000 solid/martini-glass-empty.svg martini_glass_empty
+F001 F001 solid/music.svg music
+F002 F002 solid/magnifying-glass.svg magnifying_glass
+# RENAME envelope to envelope_o
+F003 F003 regular/envelope.svg envelope_o
+F004 F004 solid/heart.svg heart
+F005 F005 solid/star.svg star
+# RENAME star to star_o
+F006 F006 regular/star.svg star_o
+F007 F007 solid/user.svg user
+F008 F008 solid/film.svg film
+F009 F009 solid/table-cells-large.svg table_cells_large
+F00A F00A solid/table-cells.svg table_cells
+F00B F00B solid/table-list.svg table_list
+F00C F00C solid/check.svg check
+F00D F00D solid/xmark.svg xmark
+F00E F00E solid/magnifying-glass-plus.svg magnifying_glass_plus
+F010 F010 solid/magnifying-glass-minus.svg magnifying_glass_minus
+F011 F011 solid/power-off.svg power_off
+F012 F012 solid/signal.svg signal
+F013 F013 solid/gear.svg gear
+F014 F014 regular/trash-can.svg trash_can
+F015 F015 solid/house.svg house
+# RENAME file to file_o
+F016 F016 regular/file.svg file_o
+F017 F017 regular/clock.svg clock
+F018 F018 solid/road.svg road
+F019 F019 solid/download.svg download
+F01A F01A regular/circle-down.svg circle_down
+F01B F01B regular/circle-up.svg circle_up
+F01C F01C solid/inbox.svg inbox
+# RENAME circle_play to play_circle_o
+F01D F01D regular/circle-play.svg play_circle_o
+F01E F01E solid/arrow-rotate-right.svg arrow_rotate_right
+F021 F021 solid/arrows-rotate.svg arrows_rotate
+F022 F022 regular/rectangle-list.svg rectangle_list
+F023 F023 solid/lock.svg lock
+F024 F024 solid/flag.svg flag
+F025 F025 solid/headphones.svg headphones
+F026 F026 solid/volume-off.svg volume_off
+F027 F027 solid/volume-low.svg volume_low
+F028 F028 solid/volume-high.svg volume_high
+F029 F029 solid/qrcode.svg qrcode
+F02A F02A solid/barcode.svg barcode
+F02B F02B solid/tag.svg tag
+F02C F02C solid/tags.svg tags
+F02D F02D solid/book.svg book
+F02E F02E solid/bookmark.svg bookmark
+F02F F02F solid/print.svg print
+F030 F030 solid/camera.svg camera
+F031 F031 solid/font.svg font
+F032 F032 solid/bold.svg bold
+F033 F033 solid/italic.svg italic
+F034 F034 solid/text-height.svg text_height
+F035 F035 solid/text-width.svg text_width
+F036 F036 solid/align-left.svg align_left
+F037 F037 solid/align-center.svg align_center
+F038 F038 solid/align-right.svg align_right
+F039 F039 solid/align-justify.svg align_justify
+F03A F03A solid/list.svg list
+F03B F03B solid/outdent.svg outdent
+F03C F03C solid/indent.svg indent
+F03D F03D solid/video.svg video
+F03E F03E regular/image.svg image
+F040 F040 solid/pencil.svg pencil
+F041 F041 solid/location-pin.svg location_pin
+F042 F042 solid/circle-half-stroke.svg circle_half_stroke
+F043 F043 solid/droplet.svg droplet
+F044 F044 regular/pen-to-square.svg pen_to_square
+# RENAME share_from_square to share_square_o
+F045 F045 regular/share-from-square.svg share_square_o
+# RENAME square_check to check_square_o
+F046 F046 regular/square-check.svg check_square_o
+F047 F047 solid/arrows-up-down-left-right.svg arrows_up_down_left_right
+F048 F048 solid/backward-step.svg backward_step
+F049 F049 solid/backward-fast.svg backward_fast
+F04A F04A solid/backward.svg backward
+F04B F04B solid/play.svg play
+F04C F04C solid/pause.svg pause
+F04D F04D solid/stop.svg stop
+F04E F04E solid/forward.svg forward
+F050 F050 solid/forward-fast.svg forward_fast
+F051 F051 solid/forward-step.svg forward_step
+F052 F052 solid/eject.svg eject
+F053 F053 solid/chevron-left.svg chevron_left
+F054 F054 solid/chevron-right.svg chevron_right
+F055 F055 solid/circle-plus.svg circle_plus
+F056 F056 solid/circle-minus.svg circle_minus
+# RENAME circle_xmark to remove_sign
+F057 F057 solid/circle-xmark.svg remove_sign
+# RENAME circle_check to ok_sign
+F058 F058 solid/circle-check.svg ok_sign
+F059 F059 solid/circle-question.svg circle_question
+F05A F05A solid/circle-info.svg circle_info
+F05B F05B solid/crosshairs.svg crosshairs
+F05C F05C regular/circle-xmark.svg circle_xmark
+F05D F05D regular/circle-check.svg circle_check
+F05E F05E solid/ban.svg ban
+F060 F060 solid/arrow-left.svg arrow_left
+F061 F061 solid/arrow-right.svg arrow_right
+F062 F062 solid/arrow-up.svg arrow_up
+F063 F063 solid/arrow-down.svg arrow_down
+F064 F064 solid/share.svg share
+F065 F065 solid/expand.svg expand
+F066 F066 solid/compress.svg compress
+F067 F067 solid/plus.svg plus
+F068 F068 solid/minus.svg minus
+F069 F069 solid/asterisk.svg asterisk
+F06A F06A solid/circle-exclamation.svg circle_exclamation
+F06B F06B solid/gift.svg gift
+F06C F06C solid/leaf.svg leaf
+F06D F06D solid/fire.svg fire
+F06E F06E regular/eye.svg eye
+F070 F070 regular/eye-slash.svg eye_slash
+F071 F071 solid/triangle-exclamation.svg triangle_exclamation
+F072 F072 solid/plane.svg plane
+F073 F073 regular/calendar-days.svg calendar_days
+F074 F074 solid/shuffle.svg shuffle
+F075 F075 solid/comment.svg comment
+F076 F076 solid/magnet.svg magnet
+F077 F077 solid/chevron-up.svg chevron_up
+F078 F078 solid/chevron-down.svg chevron_down
+F079 F079 solid/retweet.svg retweet
+F07A F07A solid/cart-shopping.svg cart_shopping
+F07B F07B solid/folder.svg folder
+F07C F07C solid/folder-open.svg folder_open
+F07D F07D solid/arrows-up-down.svg arrows_up_down
+F07E F07E solid/arrows-left-right.svg arrows_left_right
+F080 F080 regular/chart-bar.svg chart_bar
+F081 F081 brands/square-twitter.svg square_twitter
+F082 F082 brands/square-facebook.svg square_facebook
+F083 F083 solid/camera-retro.svg camera_retro
+F084 F084 solid/key.svg key
+F085 F085 solid/gears.svg gears
+F086 F086 solid/comments.svg comments
+# RENAME thumbs_up to thumbs_o_up
+F087 F087 regular/thumbs-up.svg thumbs_o_up
+# RENAME thumbs_down to thumbs_o_down
+F088 F088 regular/thumbs-down.svg thumbs_o_down
+F089 F089 solid/star-half.svg star_half
+# RENAME heart to heard_o
+F08A F08A regular/heart.svg heard_o
+F08B F08B solid/arrow-right-from-bracket.svg arrow_right_from_bracket
+# RENAME linkedin to linkedin_square
+F08C F08C brands/linkedin.svg linkedin_square
+F08D F08D solid/thumbtack.svg thumbtack
+F08E F08E solid/arrow-up-right-from-square.svg arrow_up_right_from_square
+F090 F090 solid/arrow-right-to-bracket.svg arrow_right_to_bracket
+F091 F091 solid/trophy.svg trophy
+F092 F092 brands/square-github.svg square_github
+F093 F093 solid/upload.svg upload
+F094 F094 regular/lemon.svg lemon
+F095 F095 solid/phone.svg phone
+# RENAME square to square_o
+F096 F096 regular/square.svg square_o
+# RENAME bookmark to bookmark_o
+F097 F097 regular/bookmark.svg bookmark_o
+F098 F098 solid/square-phone.svg square_phone
+F099 F099 brands/twitter.svg twitter
+F09A F09A brands/facebook.svg facebook
+F09B F09B brands/github.svg github
+F09C F09C solid/unlock.svg unlock
+F09D F09D regular/credit-card.svg credit_card
+F09E F09E solid/rss.svg rss
+F0A0 F0A0 regular/hard-drive.svg hard_drive
+F0A1 F0A1 solid/bullhorn.svg bullhorn
+# RENAME bell to bell_o
+F0A2 F0A2 regular/bell.svg bell_o
+F0A3 F0A3 solid/certificate.svg certificate
+F0A4 F0A4 regular/hand-point-right.svg hand_point_right
+F0A5 F0A5 regular/hand-point-left.svg hand_point_left
+F0A6 F0A6 regular/hand-point-up.svg hand_point_up
+F0A7 F0A7 regular/hand-point-down.svg hand_point_down
+F0A8 F0A8 solid/circle-arrow-left.svg circle_arrow_left
+F0A9 F0A9 solid/circle-arrow-right.svg circle_arrow_right
+F0AA F0AA solid/circle-arrow-up.svg circle_arrow_up
+F0AB F0AB solid/circle-arrow-down.svg circle_arrow_down
+F0AC F0AC solid/globe.svg globe
+F0AD F0AD solid/wrench.svg wrench
+F0AE F0AE solid/list-check.svg list_check
+F0B0 F0B0 solid/filter.svg filter
+F0B1 F0B1 solid/briefcase.svg briefcase
+F0B2 F0B2 solid/up-down-left-right.svg up_down_left_right
+F0C0 F0C0 solid/users.svg users
+F0C1 F0C1 solid/link.svg link
+F0C2 F0C2 solid/cloud.svg cloud
+F0C3 F0C3 solid/flask.svg flask
+F0C4 F0C4 solid/scissors.svg scissors
+F0C5 F0C5 regular/copy.svg copy
+F0C6 F0C6 solid/paperclip.svg paperclip
+F0C7 F0C7 regular/floppy-disk.svg floppy_disk
+F0C8 F0C8 solid/square.svg square
+F0C9 F0C9 solid/bars.svg bars
+F0CA F0CA solid/list-ul.svg list_ul
+F0CB F0CB solid/list-ol.svg list_ol
+F0CC F0CC solid/strikethrough.svg strikethrough
+F0CD F0CD solid/underline.svg underline
+F0CE F0CE solid/table.svg table
+F0D0 F0D0 solid/wand-magic.svg wand_magic
+F0D1 F0D1 solid/truck.svg truck
+F0D2 F0D2 brands/pinterest.svg pinterest
+F0D3 F0D3 brands/square-pinterest.svg square_pinterest
+F0D4 F0D4 brands/square-google-plus.svg square_google_plus
+# RENAME google_plus_g to google_plus
+F0D5 F0D5 brands/google-plus-g.svg google_plus
+F0D6 F0D6 solid/money-bill.svg money_bill
+F0D7 F0D7 solid/caret-down.svg caret_down
+F0D8 F0D8 solid/caret-up.svg caret_up
+F0D9 F0D9 solid/caret-left.svg caret_left
+F0DA F0DA solid/caret-right.svg caret_right
+F0DB F0DB solid/table-columns.svg table_columns
+F0DC F0DC solid/sort.svg sort
+F0DD F0DD solid/sort-down.svg sort_down
+F0DE F0DE solid/sort-up.svg sort_up
+F0E0 F0E0 solid/envelope.svg envelope
+F0E1 F0E1 brands/linkedin-in.svg linkedin_in
+F0E2 F0E2 solid/arrow-rotate-left.svg arrow_rotate_left
+F0E3 F0E3 solid/gavel.svg gavel
+F0E4 F0E4 solid/gauge-simple-high.svg gauge_simple_high
+# RENAME comment to comment_o
+F0E5 F0E5 regular/comment.svg comment_o
+# RENAME comments to comments_o
+F0E6 F0E6 regular/comments.svg comments_o
+F0E7 F0E7 solid/bolt.svg bolt
+F0E8 F0E8 solid/sitemap.svg sitemap
+F0E9 F0E9 solid/umbrella.svg umbrella
+F0EA F0EA solid/paste.svg paste
+F0EB F0EB regular/lightbulb.svg lightbulb
+F0EC F0EC solid/arrow-right-arrow-left.svg arrow_right_arrow_left
+F0ED F0ED solid/cloud-arrow-down.svg cloud_arrow_down
+F0EE F0EE solid/cloud-arrow-up.svg cloud_arrow_up
+F0F0 F0F0 solid/user-doctor.svg user_doctor
+F0F1 F0F1 solid/stethoscope.svg stethoscope
+F0F2 F0F2 solid/suitcase.svg suitcase
+F0F3 F0F3 solid/bell.svg bell
+F0F4 F0F4 solid/mug-saucer.svg mug_saucer
+F0F5 F0F5 solid/utensils.svg utensils
+# RENAME file_lines to file_text_o
+F0F6 F0F6 regular/file-lines.svg file_text_o
+# RENAME building to building_o
+F0F7 F0F7 regular/building.svg building_o
+F0F8 F0F8 regular/hospital.svg hospital
+F0F9 F0F9 solid/truck-medical.svg truck_medical
+F0FA F0FA solid/suitcase-medical.svg suitcase_medical
+F0FB F0FB solid/jet-fighter.svg jet_fighter
+F0FC F0FC solid/beer-mug-empty.svg beer_mug_empty
+F0FD F0FD solid/square-h.svg square_h
+F0FE F0FE solid/square-plus.svg square_plus
+F100 F100 solid/angles-left.svg angles_left
+F101 F101 solid/angles-right.svg angles_right
+F102 F102 solid/angles-up.svg angles_up
+F103 F103 solid/angles-down.svg angles_down
+F104 F104 solid/angle-left.svg angle_left
+F105 F105 solid/angle-right.svg angle_right
+F106 F106 solid/angle-up.svg angle_up
+F107 F107 solid/angle-down.svg angle_down
+F108 F108 solid/desktop.svg desktop
+F109 F109 solid/laptop.svg laptop
+F3FA F10A solid/tablet-screen-button.svg tablet_screen_button
+F3CD F10B solid/mobile-screen-button.svg mobile_screen_button
+# RENAME circle to circle_o
+F10C F10C regular/circle.svg circle_o
+F10D F10D solid/quote-left.svg quote_left
+F10E F10E solid/quote-right.svg quote_right
+F110 F110 solid/spinner.svg spinner
+F111 F111 solid/circle.svg circle
+F112 F112 solid/reply.svg reply
+F113 F113 brands/github-alt.svg github_alt
+# RENAME folder to folder_o
+F114 F114 regular/folder.svg folder_o
+# RENAME folder_open to folder_open_o
+F115 F115 regular/folder-open.svg folder_open_o
+F118 F118 regular/face-smile.svg face_smile
+F119 F119 regular/face-frown.svg face_frown
+F11A F11A regular/face-meh.svg face_meh
+F11B F11B solid/gamepad.svg gamepad
+F11C F11C regular/keyboard.svg keyboard
+# RENAME flag to flag_o
+F11D F11D regular/flag.svg flag_o
+F11E F11E solid/flag-checkered.svg flag_checkered
+F120 F120 solid/terminal.svg terminal
+F121 F121 solid/code.svg code
+F122 F122 solid/reply-all.svg reply_all
+# RENAME star_half to star_half_o
+F123 F123 regular/star-half.svg star_half_o
+F124 F124 solid/location-arrow.svg location_arrow
+F125 F125 solid/crop.svg crop
+F126 F126 solid/code-branch.svg code_branch
+F127 F127 solid/link-slash.svg link_slash
+F128 F128 solid/question.svg question
+F129 F129 solid/info.svg info
+F12A F12A solid/exclamation.svg exclamation
+F12B F12B solid/superscript.svg superscript
+F12C F12C solid/subscript.svg subscript
+F12D F12D solid/eraser.svg eraser
+F12E F12E solid/puzzle-piece.svg puzzle_piece
+F130 F130 solid/microphone.svg microphone
+F131 F131 solid/microphone-slash.svg microphone_slash
+F132 F132 solid/shield.svg shield
+# RENAME calendar to calendar_o
+F133 F133 regular/calendar.svg calendar_o
+F134 F134 solid/fire-extinguisher.svg fire_extinguisher
+F135 F135 solid/rocket.svg rocket
+F136 F136 brands/maxcdn.svg maxcdn
+F137 F137 solid/circle-chevron-left.svg circle_chevron_left
+F138 F138 solid/circle-chevron-right.svg circle_chevron_right
+F139 F139 solid/circle-chevron-up.svg circle_chevron_up
+F13A F13A solid/circle-chevron-down.svg circle_chevron_down
+F13B F13B brands/html5.svg html5
+F13C F13C brands/css3.svg css3
+F13D F13D solid/anchor.svg anchor
+F13E F13E solid/unlock-keyhole.svg unlock_keyhole
+F140 F140 solid/bullseye.svg bullseye
+F141 F141 solid/ellipsis.svg ellipsis
+F142 F142 solid/ellipsis-vertical.svg ellipsis_vertical
+F143 F143 solid/square-rss.svg square_rss
+F144 F144 solid/circle-play.svg circle_play
+F145 F145 solid/ticket.svg ticket
+F146 F146 solid/square-minus.svg square_minus
+# RENAME square_minus to minus_square_o
+F147 F147 regular/square-minus.svg minus_square_o
+F148 F148 solid/arrow-turn-up.svg arrow_turn_up
+F149 F149 solid/arrow-turn-down.svg arrow_turn_down
+F14A F14A solid/square-check.svg square_check
+F14B F14B solid/square-pen.svg square_pen
+F14C F14C solid/square-arrow-up-right.svg square_arrow_up_right
+F14D F14D solid/share-from-square.svg share_from_square
+F14E F14E regular/compass.svg compass
+F150 F150 regular/square-caret-down.svg square_caret_down
+F151 F151 regular/square-caret-up.svg square_caret_up
+F152 F152 regular/square-caret-right.svg square_caret_right
+F153 F153 solid/euro-sign.svg euro_sign
+F154 F154 solid/sterling-sign.svg sterling_sign
+F155 F155 solid/dollar-sign.svg dollar_sign
+F156 F156 solid/rupee-sign.svg rupee_sign
+F157 F157 solid/yen-sign.svg yen_sign
+F158 F158 solid/ruble-sign.svg ruble_sign
+F159 F159 solid/won-sign.svg won_sign
+F15A F15A brands/btc.svg btc
+F15B F15B solid/file.svg file
+F15C F15C solid/file-lines.svg file_lines
+F15D F15D solid/arrow-down-a-z.svg arrow_down_a_z
+F15E F15E solid/arrow-up-a-z.svg arrow_up_a_z
+F160 F160 solid/arrow-down-wide-short.svg arrow_down_wide_short
+F161 F161 solid/arrow-up-wide-short.svg arrow_up_wide_short
+F162 F162 solid/arrow-down-1-9.svg arrow_down_1_9
+F163 F163 solid/arrow-up-1-9.svg arrow_up_1_9
+F164 F164 solid/thumbs-up.svg thumbs_up
+F165 F165 solid/thumbs-down.svg thumbs_down
+F166 F166 brands/square-youtube.svg square_youtube
+F167 F16A brands/youtube.svg youtube
+F168 F168 brands/xing.svg xing
+F169 F169 brands/square-xing.svg square_xing
+F16B F16B brands/dropbox.svg dropbox
+F16C F16C brands/stack-overflow.svg stack_overflow
+F16D F16D brands/instagram.svg instagram
+F16E F16E brands/flickr.svg flickr
+F170 F170 brands/adn.svg adn
+F171 F171 brands/bitbucket.svg bitbucket
+F173 F173 brands/tumblr.svg tumblr
+F174 F174 brands/square-tumblr.svg square_tumblr
+F175 F175 solid/arrow-down-long.svg arrow_down_long
+F176 F176 solid/arrow-up-long.svg arrow_up_long
+F177 F177 solid/arrow-left-long.svg arrow_left_long
+F178 F178 solid/arrow-right-long.svg arrow_right_long
+F179 F179 brands/apple.svg apple
+F17A F17A brands/windows.svg windows
+F17B F17B brands/android.svg android
+F17C F17C brands/linux.svg linux
+F17D F17D brands/dribbble.svg dribbble
+F17E F17E brands/skype.svg skype
+F180 F180 brands/foursquare.svg foursquare
+F181 F181 brands/trello.svg trello
+F182 F182 solid/person-dress.svg person_dress
+F183 F183 solid/person.svg person
+F184 F184 brands/gratipay.svg gratipay
+F185 F185 regular/sun.svg sun
+F186 F186 regular/moon.svg moon
+F187 F187 solid/box-archive.svg box_archive
+F188 F188 solid/bug.svg bug
+F189 F189 brands/vk.svg vk
+F18A F18A brands/weibo.svg weibo
+F18B F18B brands/renren.svg renren
+F18C F18C brands/pagelines.svg pagelines
+F18D F18D brands/stack-exchange.svg stack_exchange
+F18E F18E regular/circle-right.svg circle_right
+F190 F190 regular/circle-left.svg circle_left
+F191 F191 regular/square-caret-left.svg square_caret_left
+F192 F192 regular/circle-dot.svg circle_dot
+F193 F193 solid/wheelchair.svg wheelchair
+F194 F194 brands/square-vimeo.svg square_vimeo
+F195 F195 solid/lira-sign.svg lira_sign
+# RENAME square_plus to plus_square_o
+F196 F196 regular/square-plus.svg plus_square_o
+F197 F197 solid/shuttle-space.svg shuttle_space
+F198 F198 brands/slack.svg slack
+F199 F199 solid/square-envelope.svg square_envelope
+F19A F19A brands/wordpress.svg wordpress
+F19B F19B brands/openid.svg openid
+F19C F19C solid/building-columns.svg building_columns
+F19D F19D solid/graduation-cap.svg graduation_cap
+F19E F19E brands/yahoo.svg yahoo
+F1A0 F1A0 brands/google.svg google
+F1A1 F1A1 brands/reddit.svg reddit
+F1A2 F1A2 brands/square-reddit.svg square_reddit
+F1A3 F1A3 brands/stumbleupon-circle.svg stumbleupon_circle
+F1A4 F1A4 brands/stumbleupon.svg stumbleupon
+F1A5 F1A5 brands/delicious.svg delicious
+F1A6 F1A6 brands/digg.svg digg
+F1A7 F1A7 brands/pied-piper-pp.svg pied_piper_pp
+F1A8 F1A8 brands/pied-piper-alt.svg pied_piper_alt
+F1A9 F1A9 brands/drupal.svg drupal
+F1AA F1AA brands/joomla.svg joomla
+F1AB F1AB solid/language.svg language
+F1AC F1AC solid/fax.svg fax
+F1AD F1AD solid/building.svg building
+F1AE F1AE solid/child.svg child
+F1B0 F1B0 solid/paw.svg paw
+F1B1 F1B1 solid/spoon.svg spoon
+F1B2 F1B2 solid/cube.svg cube
+F1B3 F1B3 solid/cubes.svg cubes
+F1B4 F1B4 brands/behance.svg behance
+F1B5 F1B5 brands/square-behance.svg square_behance
+F1B6 F1B6 brands/steam.svg steam
+F1B7 F1B7 brands/square-steam.svg square_steam
+F1B8 F1B8 solid/recycle.svg recycle
+F1B9 F1B9 solid/car.svg car
+F1BA F1BA solid/taxi.svg taxi
+F1BB F1BB solid/tree.svg tree
+F1BC F1BC brands/spotify.svg spotify
+F1BD F1BD brands/deviantart.svg deviantart
+F1BE F1BE brands/soundcloud.svg soundcloud
+F1C0 F1C0 solid/database.svg database
+F1C1 F1C1 regular/file-pdf.svg file_pdf
+F1C2 F1C2 regular/file-word.svg file_word
+F1C3 F1C3 regular/file-excel.svg file_excel
+F1C4 F1C4 regular/file-powerpoint.svg file_powerpoint
+F1C5 F1C5 regular/file-image.svg file_image
+F1C6 F1C6 regular/file-zipper.svg file_zipper
+F1C7 F1C7 regular/file-audio.svg file_audio
+F1C8 F1C8 regular/file-video.svg file_video
+F1C9 F1C9 regular/file-code.svg file_code
+F1CA F1CA brands/vine.svg vine
+F1CB F1CB brands/codepen.svg codepen
+F1CC F1CC brands/jsfiddle.svg jsfiddle
+F1CD F1CD regular/life-ring.svg life_ring
+F1CE F1CE solid/circle-notch.svg circle_notch
+F1D0 F1D0 brands/rebel.svg rebel
+F1D1 F1D1 brands/empire.svg empire
+F1D2 F1D2 brands/square-git.svg square_git
+F1D3 F1D3 brands/git.svg git
+F1D4 F1D4 brands/hacker-news.svg hacker_news
+F1D5 F1D5 brands/tencent-weibo.svg tencent_weibo
+F1D6 F1D6 brands/qq.svg qq
+F1D7 F1D7 brands/weixin.svg weixin
+F1D8 F1D8 solid/paper-plane.svg paper_plane
+# RENAME paper_plane to paper_plane_o
+F1D9 F1D9 regular/paper-plane.svg paper_plane_o
+F1DA F1DA solid/clock-rotate-left.svg clock_rotate_left
+# RENAME circle to circle_thin
+F1DB F1DB regular/circle.svg circle_thin
+F1DC F1DC solid/heading.svg heading
+F1DD F1DD solid/paragraph.svg paragraph
+F1DE F1DE solid/sliders.svg sliders
+F1E0 F1E0 solid/share-nodes.svg share_nodes
+F1E1 F1E1 solid/square-share-nodes.svg square_share_nodes
+F1E2 F1E2 solid/bomb.svg bomb
+F1E3 F1E3 regular/futbol.svg futbol
+F1E4 F1E4 solid/tty.svg tty
+F1E5 F1E5 solid/binoculars.svg binoculars
+F1E6 F1E6 solid/plug.svg plug
+F1E7 F1E7 brands/slideshare.svg slideshare
+F1E8 F1E8 brands/twitch.svg twitch
+F1E9 F1E9 brands/yelp.svg yelp
+F1EA F1EA regular/newspaper.svg newspaper
+F1EB F1EB solid/wifi.svg wifi
+F1EC F1EC solid/calculator.svg calculator
+F1ED F1ED brands/paypal.svg paypal
+F1EE F1EE brands/google-wallet.svg google_wallet
+F1F0 F1F0 brands/cc-visa.svg cc_visa
+F1F1 F1F1 brands/cc-mastercard.svg cc_mastercard
+F1F2 F1F2 brands/cc-discover.svg cc_discover
+F1F3 F1F3 brands/cc-amex.svg cc_amex
+F1F4 F1F4 brands/cc-paypal.svg cc_paypal
+F1F5 F1F5 brands/cc-stripe.svg cc_stripe
+F1F6 F1F6 solid/bell-slash.svg bell_slash
+# RENAME bell_slash to bell_slash_o
+F1F7 F1F7 regular/bell-slash.svg bell_slash_o
+F1F8 F1F8 solid/trash.svg trash
+F1F9 F1F9 regular/copyright.svg copyright
+F1FA F1FA solid/at.svg at
+F1FB F1FB solid/eye-dropper.svg eye_dropper
+F1FC F1FC solid/paintbrush.svg paintbrush
+F1FD F1FD solid/cake-candles.svg cake_candles
+F1FE F1FE solid/chart-area.svg chart_area
+F200 F200 solid/chart-pie.svg chart_pie
+F201 F201 solid/chart-line.svg chart_line
+F202 F202 brands/lastfm.svg lastfm
+F203 F203 brands/square-lastfm.svg square_lastfm
+F204 F204 solid/toggle-off.svg toggle_off
+F205 F205 solid/toggle-on.svg toggle_on
+F206 F206 solid/bicycle.svg bicycle
+F207 F207 solid/bus.svg bus
+F208 F208 brands/ioxhost.svg ioxhost
+F209 F209 brands/angellist.svg angellist
+F20A F20A regular/closed-captioning.svg closed_captioning
+F20B F20B solid/shekel-sign.svg shekel_sign
+F20D F20D brands/buysellads.svg buysellads
+F20E F20E brands/connectdevelop.svg connectdevelop
+F210 F210 brands/dashcube.svg dashcube
+F211 F211 brands/forumbee.svg forumbee
+F212 F212 brands/leanpub.svg leanpub
+F213 F213 brands/sellsy.svg sellsy
+F214 F214 brands/shirtsinbulk.svg shirtsinbulk
+F215 F215 brands/simplybuilt.svg simplybuilt
+F216 F216 brands/skyatlas.svg skyatlas
+F217 F217 solid/cart-plus.svg cart_plus
+F218 F218 solid/cart-arrow-down.svg cart_arrow_down
+F3A5 F219 regular/gem.svg gem
+F21A F21A solid/ship.svg ship
+F21B F21B solid/user-secret.svg user_secret
+F21C F21C solid/motorcycle.svg motorcycle
+F21D F21D solid/street-view.svg street_view
+F21E F21E solid/heart-pulse.svg heart_pulse
+F221 F221 solid/venus.svg venus
+F222 F222 solid/mars.svg mars
+F223 F223 solid/mercury.svg mercury
+# RENAME mars_and_venus to transgender
+F224 F224 solid/mars-and-venus.svg transgender
+# RENAME transgender to transgender_alt
+F225 F225 solid/transgender.svg transgender_alt
+F226 F226 solid/venus-double.svg venus_double
+F227 F227 solid/mars-double.svg mars_double
+F228 F228 solid/venus-mars.svg venus_mars
+F229 F229 solid/mars-stroke.svg mars_stroke
+F22A F22A solid/mars-stroke-up.svg mars_stroke_up
+F22B F22B solid/mars-stroke-right.svg mars_stroke_right
+F22C F22C solid/neuter.svg neuter
+F22D F22D solid/genderless.svg genderless
+F231 F231 brands/pinterest-p.svg pinterest_p
+F232 F232 brands/whatsapp.svg whatsapp
+F233 F233 solid/server.svg server
+F234 F234 solid/user-plus.svg user_plus
+F235 F235 solid/user-xmark.svg user_xmark
+F236 F236 solid/bed.svg bed
+F237 F237 brands/viacoin.svg viacoin
+F238 F238 solid/train.svg train
+F239 F239 solid/train-subway.svg train_subway
+F23A F23A brands/medium.svg medium
+F23B F23B brands/y-combinator.svg y_combinator
+F23C F23C brands/optin-monster.svg optin_monster
+F23D F23D brands/opencart.svg opencart
+F23E F23E brands/expeditedssl.svg expeditedssl
+F240 F240 solid/battery-full.svg battery_full
+F241 F241 solid/battery-three-quarters.svg battery_three_quarters
+F242 F242 solid/battery-half.svg battery_half
+F243 F243 solid/battery-quarter.svg battery_quarter
+F244 F244 solid/battery-empty.svg battery_empty
+F245 F245 solid/arrow-pointer.svg arrow_pointer
+F246 F246 solid/i-cursor.svg i_cursor
+F247 F247 regular/object-group.svg object_group
+F248 F248 regular/object-ungroup.svg object_ungroup
+F249 F249 solid/note-sticky.svg note_sticky
+# RENAME note_sticky to sticky_note_o
+F24A F24A regular/note-sticky.svg sticky_note_o
+F24B F24B brands/cc-jcb.svg cc_jcb
+F24C F24C brands/cc-diners-club.svg cc_diners_club
+F24D F24D regular/clone.svg clone
+F24E F24E solid/scale-balanced.svg scale_balanced
+# RENAME hourglass to hourglass_o
+F250 F250 regular/hourglass.svg hourglass_o
+F251 F251 solid/hourglass-start.svg hourglass_start
+F252 F252 regular/hourglass-half.svg hourglass_half
+F253 F253 solid/hourglass-end.svg hourglass_end
+F254 F254 solid/hourglass.svg hourglass
+F255 F255 regular/hand-back-fist.svg hand_back_fist
+F256 F256 regular/hand.svg hand
+F257 F257 regular/hand-scissors.svg hand_scissors
+F258 F258 regular/hand-lizard.svg hand_lizard
+F259 F259 regular/hand-spock.svg hand_spock
+F25A F25A regular/hand-pointer.svg hand_pointer
+F25B F25B regular/hand-peace.svg hand_peace
+F25C F25C solid/trademark.svg trademark
+F25D F25D regular/registered.svg registered
+F25E F25E brands/creative-commons.svg creative_commons
+F260 F260 brands/gg.svg gg
+F261 F261 brands/gg-circle.svg gg_circle
+F263 F263 brands/odnoklassniki.svg odnoklassniki
+F264 F264 brands/square-odnoklassniki.svg square_odnoklassniki
+F265 F265 brands/get-pocket.svg get_pocket
+F266 F266 brands/wikipedia-w.svg wikipedia_w
+F267 F267 brands/safari.svg safari
+F268 F268 brands/chrome.svg chrome
+F269 F269 brands/firefox.svg firefox
+F26A F26A brands/opera.svg opera
+F26B F26B brands/internet-explorer.svg internet_explorer
+F26C F26C solid/tv.svg tv
+F26D F26D brands/contao.svg contao
+F26E F26E brands/500px.svg 500px
+F270 F270 brands/amazon.svg amazon
+F271 F271 regular/calendar-plus.svg calendar_plus
+F272 F272 regular/calendar-minus.svg calendar_minus
+F273 F273 regular/calendar-xmark.svg calendar_xmark
+F274 F274 regular/calendar-check.svg calendar_check
+F275 F275 solid/industry.svg industry
+F276 F276 solid/map-pin.svg map_pin
+F277 F277 solid/signs-post.svg signs_post
+# RENAME map to map_o
+F278 F278 regular/map.svg map_o
+F279 F279 solid/map.svg map
+F27A F27A solid/message.svg message
+F27B F27B regular/comment-dots.svg comment_dots
+F27C F27C brands/houzz.svg houzz
+F27D F27D brands/vimeo-v.svg vimeo_v
+F27E F27E brands/black-tie.svg black_tie
+F280 F280 brands/fonticons.svg fonticons
+F281 F281 brands/reddit-alien.svg reddit_alien
+F282 F282 brands/edge.svg edge
+# RENAME credit_card to credit_card_alt
+F283 F283 solid/credit-card.svg credit_card_alt
+F284 F284 brands/codiepie.svg codiepie
+F285 F285 brands/modx.svg modx
+F286 F286 brands/fort-awesome.svg fort_awesome
+F287 F287 brands/usb.svg usb
+F288 F288 brands/product-hunt.svg product_hunt
+F289 F289 brands/mixcloud.svg mixcloud
+F28A F28A brands/scribd.svg scribd
+F28B F28B solid/circle-pause.svg circle_pause
+# RENAME circle_pause to pause_circle_o
+F28C F28C regular/circle-pause.svg pause_circle_o
+F28D F28D solid/circle-stop.svg circle_stop
+# RENAME circle_stop to stop_circle_o
+F28E F28E regular/circle-stop.svg stop_circle_o
+F290 F290 solid/bag-shopping.svg bag_shopping
+F291 F291 solid/basket-shopping.svg basket_shopping
+F292 F292 solid/hashtag.svg hashtag
+F293 F293 brands/bluetooth.svg bluetooth
+F294 F294 brands/bluetooth-b.svg bluetooth_b
+F295 F295 solid/percent.svg percent
+F296 F296 brands/gitlab.svg gitlab
+F297 F297 brands/wpbeginner.svg wpbeginner
+F298 F298 brands/wpforms.svg wpforms
+F299 F299 brands/envira.svg envira
+F29A F29A solid/universal-access.svg universal_access
+F29B F29B brands/accessible-icon.svg accessible_icon
+# RENAME circle_question to question_circle_o
+F29C F29C regular/circle-question.svg question_circle_o
+F29D F29D solid/person-walking-with-cane.svg person_walking_with_cane
+F29E F29E solid/audio-description.svg audio_description
+F2A0 F2A0 solid/phone-volume.svg phone_volume
+F2A1 F2A1 solid/braille.svg braille
+F2A2 F2A2 solid/ear-listen.svg ear_listen
+F2A3 F2A3 solid/hands-asl-interpreting.svg hands_asl_interpreting
+F2A4 F2A4 solid/ear-deaf.svg ear_deaf
+F2A5 F2A5 brands/glide.svg glide
+F2A6 F2A6 brands/glide-g.svg glide_g
+F2A7 F2A7 solid/hands.svg hands
+F2A8 F2A8 solid/eye-low-vision.svg eye_low_vision
+F2A9 F2A9 brands/viadeo.svg viadeo
+F2AA F2AA brands/square-viadeo.svg square_viadeo
+F2AB F2AB brands/snapchat.svg snapchat
+F2AD F2AD brands/square-snapchat.svg square_snapchat
+F2AE F2AE brands/pied-piper.svg pied_piper
+F2B0 F2B0 brands/first-order.svg first_order
+F2B1 F2B1 brands/yoast.svg yoast
+F2B2 F2B2 brands/themeisle.svg themeisle
+# RENAME google_plus to google_plus_circle
+F2B3 F2B3 brands/google-plus.svg google_plus_circle
+F2B4 F2B4 solid/font-awesome.svg font_awesome
+F2B5 F2B5 regular/handshake.svg handshake
+F2B6 F2B6 solid/envelope-open.svg envelope_open
+# RENAME envelope_open to envelope_open_o
+F2B7 F2B7 regular/envelope-open.svg envelope_open_o
+F2B8 F2B8 brands/linode.svg linode
+F2B9 F2B9 solid/address-book.svg address_book
+# RENAME address_book to address_book_o
+F2BA F2BA regular/address-book.svg address_book_o
+F2BB F2BB solid/address-card.svg address_card
+# RENAME address_card to address_card_o
+F2BC F2BC regular/address-card.svg address_card_o
+F2BD F2BD solid/circle-user.svg circle_user
+# RENAME circle_user to user_circle_o
+F2BE F2BE regular/circle-user.svg user_circle_o
+# RENAME user to user_o
+F2C0 F2C0 regular/user.svg user_o
+F2C1 F2C1 regular/id-badge.svg id_badge
+F2C2 F2C2 solid/id-card.svg id_card
+# RENAME id_card to id_card_o
+F2C3 F2C3 regular/id-card.svg id_card_o
+F2C4 F2C4 brands/quora.svg quora
+F2C5 F2C5 brands/free-code-camp.svg free_code_camp
+F2C6 F2C6 brands/telegram.svg telegram
+F2C7 F2C7 solid/temperature-full.svg temperature_full
+F2C8 F2C8 solid/temperature-three-quarters.svg temperature_three_quarters
+F2C9 F2C9 solid/temperature-half.svg temperature_half
+F2CA F2CA solid/temperature-quarter.svg temperature_quarter
+F2CB F2CB solid/temperature-empty.svg temperature_empty
+F2CC F2CC solid/shower.svg shower
+F2CD F2CD solid/bath.svg bath
+F2CE F2CE solid/podcast.svg podcast
+F2D0 F2D0 regular/window-maximize.svg window_maximize
+F2D1 F2D1 regular/window-minimize.svg window_minimize
+F2D2 F2D2 regular/window-restore.svg window_restore
+F2D3 F2D3 solid/square-xmark.svg square_xmark
+F2D4 F2D4 regular/rectangle-xmark.svg rectangle_xmark
+F2D5 F2D5 brands/bandcamp.svg bandcamp
+F2D6 F2D6 brands/grav.svg grav
+F2D7 F2D7 brands/etsy.svg etsy
+F2D8 F2D8 brands/imdb.svg imdb
+F2D9 F2D9 brands/ravelry.svg ravelry
+F2DA F2DA brands/sellcast.svg sellcast
+F2DB F2DB solid/microchip.svg microchip
+F2DC F2DC regular/snowflake.svg snowflake
+F2DD F2DD brands/superpowers.svg superpowers
+F2DE F2DE brands/wpexplorer.svg wpexplorer
+F2E0 F2E0 brands/meetup.svg meetup
+F2EA F2EA solid/rotate-left.svg rotate_left
+F2F1 F2F1 solid/rotate.svg rotate
+F2F2 F2F2 solid/stopwatch.svg stopwatch
+F2F5 F2F5 solid/right-from-bracket.svg right_from_bracket
+F2F6 F2F6 solid/right-to-bracket.svg right_to_bracket
+F2F9 F2F9 solid/rotate-right.svg rotate_right
+F2FE F2FE solid/poo.svg poo
+F302 F00F regular/images.svg images
+F304 F01F solid/pen.svg pen
+F305 F020 solid/pen-clip.svg pen_clip
+F309 F03F solid/down-long.svg down_long
+F30A F04F solid/left-long.svg left_long
+F31C F05F solid/file-pen.svg file_pen
+F31E F06F solid/maximize.svg maximize
+# RENAME clipboard to clipboard_alt
+F328 F07F regular/clipboard.svg clipboard_alt
+F337 F08F solid/left-right.svg left_right
+F338 F09F solid/up-down.svg up_down
+F35C F0AF brands/square-font-awesome-stroke.svg square_font_awesome_stroke
+F35D F0B3 solid/up-right-from-square.svg up_right_from_square
+F360 F0B4 solid/square-up-right.svg square_up_right
+F362 F0B5 solid/right-left.svg right_left
+# RENAME repeat to repeat_alt
+F363 F0B6 solid/repeat.svg repeat_alt
+F369 F0B7 brands/accusoft.svg accusoft
+F36A F0B8 brands/adversal.svg adversal
+F36B F0B9 brands/affiliatetheme.svg affiliatetheme
+F36C F0BA brands/algolia.svg algolia
+F36D F0BB brands/amilia.svg amilia
+F36E F0BC brands/angrycreative.svg angrycreative
+F36F F0BD brands/app-store.svg app_store
+F370 F0BE brands/app-store-ios.svg app_store_ios
+F371 F0BF brands/apper.svg apper
+F372 F0CF brands/asymmetrik.svg asymmetrik
+F373 F0DF brands/audible.svg audible
+F375 F0EF brands/aws.svg aws
+F378 F0FF brands/bimobject.svg bimobject
+F379 F10F brands/bitcoin.svg bitcoin
+F37A F116 brands/bity.svg bity
+F37B F117 brands/blackberry.svg blackberry
+F37C F11F brands/blogger.svg blogger
+F37D F12F brands/blogger-b.svg blogger_b
+F37F F13F brands/buromobelexperte.svg buromobelexperte
+F380 F14F brands/centercode.svg centercode
+F383 F15F brands/cloudscale.svg cloudscale
+F384 F167 brands/cloudsmith.svg cloudsmith
+F385 F16F brands/cloudversify.svg cloudversify
+F386 F172 solid/code-commit.svg code_commit
+F387 F17F solid/code-merge.svg code_merge
+F388 F18F brands/cpanel.svg cpanel
+F38B F19F brands/css3-alt.svg css3_alt
+F38C F1AF brands/cuttlefish.svg cuttlefish
+F38D F1BF brands/d-and-d.svg d_and_d
+F38E F1CF brands/deploydog.svg deploydog
+F38F F1DF brands/deskpro.svg deskpro
+F391 F1EF brands/digital-ocean.svg digital_ocean
+F392 F1FF brands/discord.svg discord
+F393 F20C brands/discourse.svg discourse
+F394 F20F brands/dochub.svg dochub
+F395 F21F brands/docker.svg docker
+F396 F220 brands/draft2digital.svg draft2digital
+F397 F22E brands/square-dribbble.svg square_dribbble
+F399 F22F brands/dyalog.svg dyalog
+F39A F230 brands/earlybirds.svg earlybirds
+F39D F23F brands/erlang.svg erlang
+F39E F24F brands/facebook-f.svg facebook_f
+F39F F25F brands/facebook-messenger.svg facebook_messenger
+F3A1 F262 brands/firstdraft.svg firstdraft
+F3A2 F26F brands/fonticons-fi.svg fonticons_fi
+F3A3 F27F brands/fort-awesome-alt.svg fort_awesome_alt
+F3A4 F28F brands/freebsd.svg freebsd
+F219 F29F solid/diamond.svg diamond
+F3A6 F2AC brands/gitkraken.svg gitkraken
+F3A7 F2AF brands/gofore.svg gofore
+F3A8 F2BF brands/goodreads.svg goodreads
+F3A9 F2CF brands/goodreads-g.svg goodreads_g
+F3AA F2DF brands/google-drive.svg google_drive
+F3AB F2E1 brands/google-play.svg google_play
+F3AC F2E2 brands/gripfire.svg gripfire
+F3AD F2E3 brands/grunt.svg grunt
+F3AE F2E4 brands/gulp.svg gulp
+F3AF F2E5 brands/square-hacker-news.svg square_hacker_news
+F3B0 F2E6 brands/hire-a-helper.svg hire_a_helper
+F3B1 F2E7 brands/hotjar.svg hotjar
+F3B2 F2E8 brands/hubspot.svg hubspot
+F3B4 F2E9 brands/itunes.svg itunes
+F3B5 F2EB brands/itunes-note.svg itunes_note
+F3B6 F2EC brands/jenkins.svg jenkins
+F3B7 F2ED brands/joget.svg joget
+F3B8 F2EE brands/js.svg js
+F3B9 F2EF brands/square-js.svg square_js
+F3BA F2F0 brands/keycdn.svg keycdn
+F3BB F2F3 brands/kickstarter.svg kickstarter
+F3BC F2F4 brands/kickstarter-k.svg kickstarter_k
+F3BD F2F7 brands/laravel.svg laravel
+F3BE F2F8 solid/turn-down.svg turn_down
+F3BF F2FA solid/turn-up.svg turn_up
+F3C0 F2FB brands/line.svg line
+F3C1 F2FC solid/lock-open.svg lock_open
+F3C3 F2FD brands/lyft.svg lyft
+F3C4 F2FF brands/magento.svg magento
+F3C5 ED00 solid/location-dot.svg location_dot
+F3C6 ED01 brands/medapps.svg medapps
+F3C8 ED02 brands/medrt.svg medrt
+F3C9 ED03 solid/microphone-lines.svg microphone_lines
+F3CA ED04 brands/microsoft.svg microsoft
+F3CB ED05 brands/mix.svg mix
+F3CC ED06 brands/mizuni.svg mizuni
+F10B ED07 solid/mobile-button.svg mobile_button
+F3CE ED08 solid/mobile.svg mobile
+F3CF ED09 solid/mobile-screen.svg mobile_screen
+F3D0 ED0A brands/monero.svg monero
+F3D1 ED0B regular/money-bill-1.svg money_bill_1
+F3D2 ED0C brands/napster.svg napster
+F3D3 ED0D brands/node-js.svg node_js
+F3D4 ED0E brands/npm.svg npm
+F3D5 ED0F brands/ns8.svg ns8
+F3D6 ED10 brands/nutritionix.svg nutritionix
+F3D7 ED11 brands/page4.svg page4
+F3D8 ED12 brands/palfed.svg palfed
+F3D9 ED13 brands/patreon.svg patreon
+F3DA ED14 brands/periscope.svg periscope
+F3DB ED15 brands/phabricator.svg phabricator
+F3DC ED16 brands/phoenix-framework.svg phoenix_framework
+F3DD ED17 solid/phone-slash.svg phone_slash
+F3DF ED18 brands/playstation.svg playstation
+F3E0 ED19 solid/image-portrait.svg image_portrait
+F3E1 ED1A brands/pushed.svg pushed
+F3E2 ED1B brands/python.svg python
+F3E3 ED1C brands/red-river.svg red_river
+F3E4 ED1D brands/wpressr.svg wpressr
+F3E6 ED1E brands/replyd.svg replyd
+F3E7 ED1F brands/resolving.svg resolving
+F3E8 ED20 brands/rocketchat.svg rocketchat
+F3E9 ED21 brands/rockrms.svg rockrms
+F3EA ED22 brands/schlix.svg schlix
+F3EB ED23 brands/searchengin.svg searchengin
+F3EC ED24 brands/servicestack.svg servicestack
+F3ED ED25 solid/shield-halved.svg shield_halved
+F3EE ED26 brands/sistrix.svg sistrix
+F3F3 ED27 brands/speakap.svg speakap
+F3F5 ED28 brands/staylinked.svg staylinked
+F3F6 ED29 brands/steam-symbol.svg steam_symbol
+F3F7 ED2A brands/sticker-mule.svg sticker_mule
+F3F8 ED2B brands/studiovinari.svg studiovinari
+F3F9 ED2C brands/supple.svg supple
+F10A ED2D solid/tablet-button.svg tablet_button
+F3FB ED2E solid/tablet.svg tablet
+F3FD ED2F solid/gauge-high.svg gauge_high
+F3FF ED30 solid/ticket-simple.svg ticket_simple
+F402 ED31 brands/uber.svg uber
+F403 ED32 brands/uikit.svg uikit
+F404 ED33 brands/uniregistry.svg uniregistry
+F405 ED34 brands/untappd.svg untappd
+F406 ED35 solid/user-large.svg user_large
+F407 ED36 brands/ussunnah.svg ussunnah
+F408 ED37 brands/vaadin.svg vaadin
+F409 ED38 brands/viber.svg viber
+F40A ED39 brands/vimeo.svg vimeo
+F40B ED3A brands/vnv.svg vnv
+F40C ED3B brands/square-whatsapp.svg square_whatsapp
+F40D ED3C brands/whmcs.svg whmcs
+F411 ED3D brands/wordpress-simple.svg wordpress_simple
+F412 ED3E brands/xbox.svg xbox
+F413 ED3F brands/yandex.svg yandex
+F414 ED40 brands/yandex-international.svg yandex_international
+F415 ED41 brands/apple-pay.svg apple_pay
+F416 ED42 brands/cc-apple-pay.svg cc_apple_pay
+F417 ED43 brands/fly.svg fly
+F419 ED44 brands/node.svg node
+F41A ED45 brands/osi.svg osi
+F41B ED46 brands/react.svg react
+F41C ED47 brands/autoprefixer.svg autoprefixer
+F41D ED48 brands/less.svg less
+F41E ED49 brands/sass.svg sass
+F41F ED4A brands/vuejs.svg vuejs
+F420 ED4B brands/angular.svg angular
+F421 ED4C brands/aviato.svg aviato
+F422 ED4D solid/down-left-and-up-right-to-center.svg down_left_and_up_right_to_center
+F423 ED4E brands/ember.svg ember
+F424 ED4F solid/up-right-and-down-left-from-center.svg up_right_and_down_left_from_center
+F426 ED50 brands/gitter.svg gitter
+F427 ED51 brands/hooli.svg hooli
+F428 ED52 brands/strava.svg strava
+F429 ED53 brands/stripe.svg stripe
+F42A ED54 brands/stripe-s.svg stripe_s
+F42B ED55 brands/typo3.svg typo3
+F42C ED56 brands/amazon-pay.svg amazon_pay
+F42D ED57 brands/cc-amazon-pay.svg cc_amazon_pay
+F42E ED58 brands/ethereum.svg ethereum
+F42F ED59 brands/korvue.svg korvue
+F430 ED5A brands/elementor.svg elementor
+F432 ED5B solid/baseball-bat-ball.svg baseball_bat_ball
+F433 ED5C solid/baseball.svg baseball
+F434 ED5D solid/basketball.svg basketball
+F436 ED5E solid/bowling-ball.svg bowling_ball
+F439 ED5F solid/chess.svg chess
+F43A ED60 regular/chess-bishop.svg chess_bishop
+F43C ED61 solid/chess-board.svg chess_board
+F43F ED62 regular/chess-king.svg chess_king
+F441 ED63 regular/chess-knight.svg chess_knight
+F443 ED64 regular/chess-pawn.svg chess_pawn
+F445 ED65 regular/chess-queen.svg chess_queen
+F447 ED66 regular/chess-rook.svg chess_rook
+F44B ED67 solid/dumbbell.svg dumbbell
+F44D ED68 brands/flipboard.svg flipboard
+F44E ED69 solid/football.svg football
+F450 ED6A solid/golf-ball-tee.svg golf_ball_tee
+F452 ED6B brands/hips.svg hips
+F453 ED6C solid/hockey-puck.svg hockey_puck
+F457 ED6D brands/php.svg php
+F458 ED6E solid/broom-ball.svg broom_ball
+F459 ED6F brands/quinscape.svg quinscape
+F45C ED70 regular/square-full.svg square_full
+F45D ED71 solid/table-tennis-paddle-ball.svg table_tennis_paddle_ball
+F45F ED72 solid/volleyball.svg volleyball
+F461 ED73 solid/hand-dots.svg hand_dots
+F462 ED74 solid/bandage.svg bandage
+F466 ED75 solid/box.svg box
+F468 ED76 solid/boxes-stacked.svg boxes_stacked
+F469 ED77 solid/briefcase-medical.svg briefcase_medical
+F46A ED78 solid/fire-flame-simple.svg fire_flame_simple
+F46B ED79 solid/capsules.svg capsules
+F46C ED7A solid/clipboard-check.svg clipboard_check
+F46D ED7B solid/clipboard-list.svg clipboard_list
+F470 ED7C solid/person-dots-from-line.svg person_dots_from_line
+F471 ED7D solid/dna.svg dna
+F472 ED7E solid/dolly.svg dolly
+F474 ED7F solid/cart-flatbed.svg cart_flatbed
+F477 ED80 solid/file-medical.svg file_medical
+F478 ED81 solid/file-waveform.svg file_waveform
+F479 ED82 solid/kit-medical.svg kit_medical
+F47E ED83 solid/circle-h.svg circle_h
+F47F ED84 solid/id-card-clip.svg id_card_clip
+F481 ED85 solid/notes-medical.svg notes_medical
+F482 ED86 solid/pallet.svg pallet
+F484 ED87 solid/pills.svg pills
+F485 ED88 solid/prescription-bottle.svg prescription_bottle
+F486 ED89 solid/prescription-bottle-medical.svg prescription_bottle_medical
+F487 ED8A solid/bed-pulse.svg bed_pulse
+F48B ED8B solid/truck-fast.svg truck_fast
+F48D ED8C solid/smoking.svg smoking
+F48E ED8D solid/syringe.svg syringe
+F490 ED8E solid/tablets.svg tablets
+# RENAME thermometer to thermometer_alt
+F491 ED8F solid/thermometer.svg thermometer_alt
+F492 ED90 solid/vial.svg vial
+F493 ED91 solid/vials.svg vials
+F494 ED92 solid/warehouse.svg warehouse
+F496 ED93 solid/weight-scale.svg weight_scale
+F497 ED94 solid/x-ray.svg x_ray
+F49E ED95 solid/box-open.svg box_open
+F4B3 ED96 solid/comment-slash.svg comment_slash
+F4B8 ED97 solid/couch.svg couch
+F4B9 ED98 solid/circle-dollar-to-slot.svg circle_dollar_to_slot
+F4BA ED99 solid/dove.svg dove
+F4BD ED9A solid/hand-holding.svg hand_holding
+F4BE ED9B solid/hand-holding-heart.svg hand_holding_heart
+F4C0 ED9C solid/hand-holding-dollar.svg hand_holding_dollar
+F4C1 ED9D solid/hand-holding-droplet.svg hand_holding_droplet
+F4C2 ED9E solid/hands-holding.svg hands_holding
+F4C4 ED9F solid/handshake-angle.svg handshake_angle
+F4C6 EDA0 solid/handshake-simple.svg handshake_simple
+F4CD EDA1 solid/parachute-box.svg parachute_box
+F4CE EDA2 solid/people-carry-box.svg people_carry_box
+F4D3 EDA3 solid/piggy-bank.svg piggy_bank
+F4D5 EDA4 brands/readme.svg readme
+F4D6 EDA5 solid/ribbon.svg ribbon
+F4D7 EDA6 solid/route.svg route
+F4D8 EDA7 solid/seedling.svg seedling
+F4D9 EDA8 solid/sign-hanging.svg sign_hanging
+F4DA EDA9 regular/face-smile-wink.svg face_smile_wink
+F4DB EDAA solid/tape.svg tape
+F4DE EDAB solid/truck-ramp-box.svg truck_ramp_box
+F4DF EDAC solid/truck-moving.svg truck_moving
+F4E2 EDAD solid/video-slash.svg video_slash
+F4E3 EDAE solid/wine-glass.svg wine_glass
+F4E4 EDAF brands/java.svg java
+F4E5 EDB0 brands/pied-piper-hat.svg pied_piper_hat
+F4E7 EDB1 brands/creative-commons-by.svg creative_commons_by
+F4E8 EDB2 brands/creative-commons-nc.svg creative_commons_nc
+F4E9 EDB3 brands/creative-commons-nc-eu.svg creative_commons_nc_eu
+F4EA EDB4 brands/creative-commons-nc-jp.svg creative_commons_nc_jp
+F4EB EDB5 brands/creative-commons-nd.svg creative_commons_nd
+F4EC EDB6 brands/creative-commons-pd.svg creative_commons_pd
+F4ED EDB7 brands/creative-commons-pd-alt.svg creative_commons_pd_alt
+F4EE EDB8 brands/creative-commons-remix.svg creative_commons_remix
+F4EF EDB9 brands/creative-commons-sa.svg creative_commons_sa
+F4F0 EDBA brands/creative-commons-sampling.svg creative_commons_sampling
+F4F1 EDBB brands/creative-commons-sampling-plus.svg creative_commons_sampling_plus
+F4F2 EDBC brands/creative-commons-share.svg creative_commons_share
+F4F3 EDBD brands/creative-commons-zero.svg creative_commons_zero
+F4F4 EDBE brands/ebay.svg ebay
+F4F5 EDBF brands/keybase.svg keybase
+F4F6 EDC0 brands/mastodon.svg mastodon
+F4F7 EDC1 brands/r-project.svg r_project
+F4F8 EDC2 brands/researchgate.svg researchgate
+F4F9 EDC3 brands/teamspeak.svg teamspeak
+F4FA EDC4 solid/user-large-slash.svg user_large_slash
+F4FB EDC5 solid/user-astronaut.svg user_astronaut
+F4FC EDC6 solid/user-check.svg user_check
+F4FD EDC7 solid/user-clock.svg user_clock
+F4FE EDC8 solid/user-gear.svg user_gear
+F4FF EDC9 solid/user-pen.svg user_pen
+F500 EDCA solid/user-group.svg user_group
+F501 EDCB solid/user-graduate.svg user_graduate
+F502 EDCC solid/user-lock.svg user_lock
+F503 EDCD solid/user-minus.svg user_minus
+F504 EDCE solid/user-ninja.svg user_ninja
+F505 EDCF solid/user-shield.svg user_shield
+F506 EDD0 solid/user-slash.svg user_slash
+F507 EDD1 solid/user-tag.svg user_tag
+F508 EDD2 solid/user-tie.svg user_tie
+F509 EDD3 solid/users-gear.svg users_gear
+F50A EDD4 brands/first-order-alt.svg first_order_alt
+F50B EDD5 brands/fulcrum.svg fulcrum
+F50C EDD6 brands/galactic-republic.svg galactic_republic
+F50D EDD7 brands/galactic-senate.svg galactic_senate
+F50E EDD8 brands/jedi-order.svg jedi_order
+F50F EDD9 brands/mandalorian.svg mandalorian
+F510 EDDA brands/old-republic.svg old_republic
+F511 EDDB brands/phoenix-squadron.svg phoenix_squadron
+F512 EDDC brands/sith.svg sith
+F513 EDDD brands/trade-federation.svg trade_federation
+F514 EDDE brands/wolf-pack-battalion.svg wolf_pack_battalion
+F515 EDDF solid/scale-unbalanced.svg scale_unbalanced
+F516 EDE0 solid/scale-unbalanced-flip.svg scale_unbalanced_flip
+F517 EDE1 solid/blender.svg blender
+F518 EDE2 solid/book-open.svg book_open
+F519 EDE3 solid/tower-broadcast.svg tower_broadcast
+F51A EDE4 solid/broom.svg broom
+F51B EDE5 solid/chalkboard.svg chalkboard
+F51C EDE6 solid/chalkboard-user.svg chalkboard_user
+F51D EDE7 solid/church.svg church
+F51E EDE8 solid/coins.svg coins
+F51F EDE9 solid/compact-disc.svg compact_disc
+F520 EDEA solid/crow.svg crow
+F521 EDEB solid/crown.svg crown
+F522 EDEC solid/dice.svg dice
+F523 EDED solid/dice-five.svg dice_five
+F524 EDEE solid/dice-four.svg dice_four
+F525 EDEF solid/dice-one.svg dice_one
+F526 EDF0 solid/dice-six.svg dice_six
+F527 EDF1 solid/dice-three.svg dice_three
+F528 EDF2 solid/dice-two.svg dice_two
+F529 EDF3 solid/divide.svg divide
+F52A EDF4 solid/door-closed.svg door_closed
+F52B EDF5 solid/door-open.svg door_open
+F52C EDF6 solid/equals.svg equals
+F52D EDF7 solid/feather.svg feather
+F52E EDF8 solid/frog.svg frog
+F52F EDF9 solid/gas-pump.svg gas_pump
+F530 EDFA solid/glasses.svg glasses
+F531 EDFB solid/greater-than.svg greater_than
+F532 EDFC solid/greater-than-equal.svg greater_than_equal
+F533 EDFD solid/helicopter.svg helicopter
+F534 EDFE solid/infinity.svg infinity
+F535 EDFF solid/kiwi-bird.svg kiwi_bird
+F543 EE0C solid/receipt.svg receipt
+F544 EE0D solid/robot.svg robot
+F545 EE0E solid/ruler.svg ruler
+F546 EE0F solid/ruler-combined.svg ruler_combined
+F547 EE10 solid/ruler-horizontal.svg ruler_horizontal
+F548 EE11 solid/ruler-vertical.svg ruler_vertical
+F549 EE12 solid/school.svg school
+F54A EE13 solid/screwdriver.svg screwdriver
+F54B EE14 solid/shoe-prints.svg shoe_prints
+F54C EE15 solid/skull.svg skull
+F54D EE16 solid/ban-smoking.svg ban_smoking
+F54E EE17 solid/store.svg store
+F54F EE18 solid/shop.svg shop
+F550 EE19 solid/bars-staggered.svg bars_staggered
+F551 EE1A solid/stroopwafel.svg stroopwafel
+F552 EE1B solid/toolbox.svg toolbox
+F553 EE1C solid/shirt.svg shirt
+F554 EE1D solid/person-walking.svg person_walking
+F555 EE1E solid/wallet.svg wallet
+F556 EE1F regular/face-angry.svg face_angry
+F557 EE20 solid/archway.svg archway
+F558 EE21 solid/book-atlas.svg book_atlas
+F559 EE22 solid/award.svg award
+F55A EE23 solid/delete-left.svg delete_left
+F55B EE24 solid/bezier-curve.svg bezier_curve
+F55C EE25 solid/bong.svg bong
+F55D EE26 solid/brush.svg brush
+F55E EE27 solid/bus-simple.svg bus_simple
+F55F EE28 solid/cannabis.svg cannabis
+F560 EE29 solid/check-double.svg check_double
+F561 EE2A solid/martini-glass-citrus.svg martini_glass_citrus
+F562 EE2B solid/bell-concierge.svg bell_concierge
+F563 EE2C solid/cookie.svg cookie
+F564 EE2D solid/cookie-bite.svg cookie_bite
+F565 EE2E solid/crop-simple.svg crop_simple
+F566 EE2F solid/tachograph-digital.svg tachograph_digital
+F567 EE30 regular/face-dizzy.svg face_dizzy
+F568 EE31 solid/compass-drafting.svg compass_drafting
+F569 EE32 solid/drum.svg drum
+F56A EE33 solid/drum-steelpan.svg drum_steelpan
+F56B EE34 solid/feather-pointed.svg feather_pointed
+F56C EE35 solid/file-contract.svg file_contract
+F56D EE36 solid/file-arrow-down.svg file_arrow_down
+F56E EE37 solid/file-export.svg file_export
+F56F EE38 solid/file-import.svg file_import
+F570 EE39 solid/file-invoice.svg file_invoice
+F571 EE3A solid/file-invoice-dollar.svg file_invoice_dollar
+F572 EE3B solid/file-prescription.svg file_prescription
+F573 EE3C solid/file-signature.svg file_signature
+F574 EE3D solid/file-arrow-up.svg file_arrow_up
+F575 EE3E solid/fill.svg fill
+F576 EE3F solid/fill-drip.svg fill_drip
+F577 EE40 solid/fingerprint.svg fingerprint
+F578 EE41 solid/fish.svg fish
+F579 EE42 regular/face-flushed.svg face_flushed
+F57A EE43 regular/face-frown-open.svg face_frown_open
+F57B EE44 solid/martini-glass.svg martini_glass
+F57C EE45 solid/earth-africa.svg earth_africa
+F57D EE46 solid/earth-americas.svg earth_americas
+F57E EE47 solid/earth-asia.svg earth_asia
+F57F EE48 regular/face-grimace.svg face_grimace
+F580 EE49 regular/face-grin.svg face_grin
+F581 EE4A regular/face-grin-wide.svg face_grin_wide
+F582 EE4B regular/face-grin-beam.svg face_grin_beam
+F583 EE4C regular/face-grin-beam-sweat.svg face_grin_beam_sweat
+F584 EE4D regular/face-grin-hearts.svg face_grin_hearts
+F585 EE4E regular/face-grin-squint.svg face_grin_squint
+F586 EE4F regular/face-grin-squint-tears.svg face_grin_squint_tears
+F587 EE50 regular/face-grin-stars.svg face_grin_stars
+F588 EE51 regular/face-grin-tears.svg face_grin_tears
+F589 EE52 regular/face-grin-tongue.svg face_grin_tongue
+F58A EE53 regular/face-grin-tongue-squint.svg face_grin_tongue_squint
+F58B EE54 regular/face-grin-tongue-wink.svg face_grin_tongue_wink
+F58C EE55 regular/face-grin-wink.svg face_grin_wink
+F58D EE56 solid/grip.svg grip
+F58E EE57 solid/grip-vertical.svg grip_vertical
+F58F EE58 solid/headphones-simple.svg headphones_simple
+F590 EE59 solid/headset.svg headset
+F591 EE5A solid/highlighter.svg highlighter
+F592 EE5B brands/hornbill.svg hornbill
+F593 EE5C solid/hot-tub-person.svg hot_tub_person
+# RENAME hotel to hotel_building
+F594 EE5D solid/hotel.svg hotel_building
+F595 EE5E solid/joint.svg joint
+F596 EE5F regular/face-kiss.svg face_kiss
+F597 EE60 regular/face-kiss-beam.svg face_kiss_beam
+F598 EE61 regular/face-kiss-wink-heart.svg face_kiss_wink_heart
+F599 EE62 regular/face-laugh.svg face_laugh
+F59A EE63 regular/face-laugh-beam.svg face_laugh_beam
+F59B EE64 regular/face-laugh-squint.svg face_laugh_squint
+F59C EE65 regular/face-laugh-wink.svg face_laugh_wink
+F59D EE66 solid/cart-flatbed-suitcase.svg cart_flatbed_suitcase
+F59E EE67 brands/mailchimp.svg mailchimp
+F59F EE68 solid/map-location.svg map_location
+F5A0 EE69 solid/map-location-dot.svg map_location_dot
+F5A1 EE6A solid/marker.svg marker
+F5A2 EE6B solid/medal.svg medal
+F5A3 EE6C brands/megaport.svg megaport
+F5A4 EE6D regular/face-meh-blank.svg face_meh_blank
+F5A5 EE6E regular/face-rolling-eyes.svg face_rolling_eyes
+F5A6 EE6F solid/monument.svg monument
+F5A7 EE70 solid/mortar-pestle.svg mortar_pestle
+F5A8 EE71 brands/nimblr.svg nimblr
+F5AA EE72 solid/paint-roller.svg paint_roller
+F5AB EE73 solid/passport.svg passport
+F5AC EE74 solid/pen-fancy.svg pen_fancy
+F5AD EE75 solid/pen-nib.svg pen_nib
+F5AE EE76 solid/pen-ruler.svg pen_ruler
+F5AF EE77 solid/plane-arrival.svg plane_arrival
+F5B0 EE78 solid/plane-departure.svg plane_departure
+F5B1 EE79 solid/prescription.svg prescription
+F5B2 EE7A brands/rev.svg rev
+F5B3 EE7B regular/face-sad-cry.svg face_sad_cry
+F5B4 EE7C regular/face-sad-tear.svg face_sad_tear
+F5B5 EE7D brands/shopware.svg shopware
+F5B6 EE7E solid/van-shuttle.svg van_shuttle
+F5B7 EE7F solid/signature.svg signature
+F5B8 EE80 regular/face-smile-beam.svg face_smile_beam
+F5BA EE81 solid/solar-panel.svg solar_panel
+F5BB EE82 solid/spa.svg spa
+F5BC EE83 solid/splotch.svg splotch
+F5BD EE84 solid/spray-can.svg spray_can
+F5BE EE85 brands/squarespace.svg squarespace
+F5BF EE86 solid/stamp.svg stamp
+F5C0 EE87 regular/star-half-stroke.svg star_half_stroke
+F5C1 EE88 solid/suitcase-rolling.svg suitcase_rolling
+F5C2 EE89 regular/face-surprise.svg face_surprise
+F5C3 EE8A solid/swatchbook.svg swatchbook
+F5C4 EE8B solid/person-swimming.svg person_swimming
+F5C5 EE8C solid/water-ladder.svg water_ladder
+F5C6 EE8D brands/themeco.svg themeco
+F5C7 EE8E solid/droplet-slash.svg droplet_slash
+F5C8 EE8F regular/face-tired.svg face_tired
+F5C9 EE90 solid/tooth.svg tooth
+F5CA EE91 solid/umbrella-beach.svg umbrella_beach
+F5CB EE92 solid/vector-square.svg vector_square
+F5CC EE93 brands/weebly.svg weebly
+F5CD EE94 solid/weight-hanging.svg weight_hanging
+F5CE EE95 solid/wine-glass-empty.svg wine_glass_empty
+F5CF EE96 brands/wix.svg wix
+F5D0 EE97 solid/spray-can-sparkles.svg spray_can_sparkles
+F5D1 EE98 solid/apple-whole.svg apple_whole
+F5D2 EE99 solid/atom.svg atom
+F5D7 EE9A solid/bone.svg bone
+F5DA EE9B solid/book-open-reader.svg book_open_reader
+F5DC EE9C solid/brain.svg brain
+F5DE EE9D solid/car-rear.svg car_rear
+F5DF EE9E solid/car-battery.svg car_battery
+F5E1 EE9F solid/car-burst.svg car_burst
+F5E4 EEA0 solid/car-side.svg car_side
+F5E7 EEA1 solid/charging-station.svg charging_station
+F5EB EEA2 solid/diamond-turn-right.svg diamond_turn_right
+F5EE EEA3 solid/draw-polygon.svg draw_polygon
+F5F1 EEA4 brands/ello.svg ello
+F5F7 EEA5 brands/hackerrank.svg hackerrank
+F5FA EEA6 brands/kaggle.svg kaggle
+F5FC EEA7 solid/laptop-code.svg laptop_code
+F5FD EEA8 solid/layer-group.svg layer_group
+F601 EEA9 solid/location-crosshairs.svg location_crosshairs
+F604 EEAA solid/lungs.svg lungs
+F60F EEAB brands/markdown.svg markdown
+F610 EEAC solid/microscope.svg microscope
+F612 EEAD brands/neos.svg neos
+F613 EEAE solid/oil-can.svg oil_can
+F619 EEAF solid/poop.svg poop
+F61F EEB0 solid/shapes.svg shapes
+F621 EEB1 solid/star-of-life.svg star_of_life
+F624 EEB2 solid/gauge.svg gauge
+F629 EEB3 solid/gauge-simple.svg gauge_simple
+F62E EEB4 solid/teeth.svg teeth
+F62F EEB5 solid/teeth-open.svg teeth_open
+F630 EEB6 solid/masks-theater.svg masks_theater
+F637 EEB7 solid/traffic-light.svg traffic_light
+F63B EEB8 solid/truck-monster.svg truck_monster
+F63C EEB9 solid/truck-pickup.svg truck_pickup
+F63F EEBA brands/zhihu.svg zhihu
+F641 EEBB solid/rectangle-ad.svg rectangle_ad
+F642 EEBC brands/alipay.svg alipay
+F644 EEBD solid/ankh.svg ankh
+F647 EEBE solid/book-bible.svg book_bible
+F64A EEBF solid/business-time.svg business_time
+F64F EEC0 solid/city.svg city
+F651 EEC1 solid/comment-dollar.svg comment_dollar
+F653 EEC2 solid/comments-dollar.svg comments_dollar
+F654 EEC3 solid/cross.svg cross
+F655 EEC4 solid/dharmachakra.svg dharmachakra
+F658 EEC5 solid/envelope-open-text.svg envelope_open_text
+F65D EEC6 solid/folder-minus.svg folder_minus
+F65E EEC7 solid/folder-plus.svg folder_plus
+F662 EEC8 solid/filter-circle-dollar.svg filter_circle_dollar
+F664 EEC9 solid/gopuram.svg gopuram
+F665 EECA solid/hamsa.svg hamsa
+F666 EECB solid/bahai.svg bahai
+F669 EECC solid/jedi.svg jedi
+F66A EECD solid/book-journal-whills.svg book_journal_whills
+F66B EECE solid/kaaba.svg kaaba
+F66D EECF solid/khanda.svg khanda
+F66F EED0 solid/landmark.svg landmark
+F674 EED1 solid/envelopes-bulk.svg envelopes_bulk
+F676 EED2 solid/menorah.svg menorah
+F678 EED3 solid/mosque.svg mosque
+F679 EED4 solid/om.svg om
+F67B EED5 solid/spaghetti-monster-flying.svg spaghetti_monster_flying
+F67C EED6 solid/peace.svg peace
+F67F EED7 solid/place-of-worship.svg place_of_worship
+F681 EED8 solid/square-poll-vertical.svg square_poll_vertical
+F682 EED9 solid/square-poll-horizontal.svg square_poll_horizontal
+F683 EEDA solid/person-praying.svg person_praying
+F684 EEDB solid/hands-praying.svg hands_praying
+F687 EEDC solid/book-quran.svg book_quran
+F688 EEDD solid/magnifying-glass-dollar.svg magnifying_glass_dollar
+F689 EEDE solid/magnifying-glass-location.svg magnifying_glass_location
+F696 EEDF solid/socks.svg socks
+F698 EEE0 solid/square-root-variable.svg square_root_variable
+F699 EEE1 solid/star-and-crescent.svg star_and_crescent
+F69A EEE2 solid/star-of-david.svg star_of_david
+F69B EEE3 solid/synagogue.svg synagogue
+F69D EEE4 brands/the-red-yeti.svg the_red_yeti
+F6A0 EEE5 solid/scroll-torah.svg scroll_torah
+F6A1 EEE6 solid/torii-gate.svg torii_gate
+F6A7 EEE7 solid/vihara.svg vihara
+F6A9 EEE8 solid/volume-xmark.svg volume_xmark
+F6AD EEE9 solid/yin-yang.svg yin_yang
+F6B6 EEEA solid/blender-phone.svg blender_phone
+F6B7 EEEB solid/book-skull.svg book_skull
+F6BB EEEC solid/campground.svg campground
+F6BE EEED solid/cat.svg cat
+F6C0 EEEE solid/chair.svg chair
+F6C3 EEEF solid/cloud-moon.svg cloud_moon
+F6C4 EEF0 solid/cloud-sun.svg cloud_sun
+F6C8 EEF1 solid/cow.svg cow
+F6C9 EEF2 brands/critical-role.svg critical_role
+F6CA EEF3 brands/d-and-d-beyond.svg d_and_d_beyond
+F6CC EEF4 brands/dev.svg dev
+F6CF EEF5 solid/dice-d20.svg dice_d20
+F6D1 EEF6 solid/dice-d6.svg dice_d6
+F6D3 EEF7 solid/dog.svg dog
+F6D5 EEF8 solid/dragon.svg dragon
+F6D7 EEF9 solid/drumstick-bite.svg drumstick_bite
+F6D9 EEFA solid/dungeon.svg dungeon
+F6DC EEFB brands/fantasy-flight-games.svg fantasy_flight_games
+F6DD EEFC solid/file-csv.svg file_csv
+F6DE EEFD solid/hand-fist.svg hand_fist
+F6E2 EEFE solid/ghost.svg ghost
+F6E3 EEFF solid/hammer.svg hammer
+F6E6 EF00 solid/hanukiah.svg hanukiah
+F6E8 EF01 solid/hat-wizard.svg hat_wizard
+F6EC EF02 solid/person-hiking.svg person_hiking
+F6ED EF03 solid/hippo.svg hippo
+F6F0 EF04 solid/horse.svg horse
+F6F1 EF05 solid/house-chimney-crack.svg house_chimney_crack
+F6F2 EF06 solid/hryvnia-sign.svg hryvnia_sign
+F6FA EF07 solid/mask.svg mask
+F6FC EF08 solid/mountain.svg mountain
+F6FF EF09 solid/network-wired.svg network_wired
+F700 EF0A solid/otter.svg otter
+F70B EF0B solid/ring.svg ring
+F70C EF0C solid/person-running.svg person_running
+F70E EF0D solid/scroll.svg scroll
+F714 EF0E solid/skull-crossbones.svg skull_crossbones
+F715 EF0F solid/slash.svg slash
+F717 EF10 solid/spider.svg spider
+F71E EF11 solid/toilet-paper.svg toilet_paper
+F722 EF12 solid/tractor.svg tractor
+F728 EF13 solid/user-injured.svg user_injured
+F729 EF14 solid/vr-cardboard.svg vr_cardboard
+F72B EF15 solid/wand-sparkles.svg wand_sparkles
+F72E EF16 solid/wind.svg wind
+F72F EF17 solid/wine-bottle.svg wine_bottle
+F730 EF18 brands/wizards-of-the-coast.svg wizards_of_the_coast
+F731 EF19 brands/think-peaks.svg think_peaks
+F73B EF1A solid/cloud-meatball.svg cloud_meatball
+F73C EF1B solid/cloud-moon-rain.svg cloud_moon_rain
+F73D EF1C solid/cloud-rain.svg cloud_rain
+F740 EF1D solid/cloud-showers-heavy.svg cloud_showers_heavy
+F743 EF1E solid/cloud-sun-rain.svg cloud_sun_rain
+F747 EF1F solid/democrat.svg democrat
+F74D EF20 solid/flag-usa.svg flag_usa
+F751 EF21 solid/hurricane.svg hurricane
+F752 EF22 solid/landmark-dome.svg landmark_dome
+F753 EF23 solid/meteor.svg meteor
+F756 EF24 solid/person-booth.svg person_booth
+F75A EF25 solid/poo-storm.svg poo_storm
+F75B EF26 solid/rainbow.svg rainbow
+F75D EF27 brands/reacteurope.svg reacteurope
+F75E EF28 solid/republican.svg republican
+F75F EF29 solid/smog.svg smog
+F769 EF2A solid/temperature-high.svg temperature_high
+F76B EF2B solid/temperature-low.svg temperature_low
+F76C EF2C solid/cloud-bolt.svg cloud_bolt
+F76F EF2D solid/tornado.svg tornado
+F770 EF2E solid/volcano.svg volcano
+F772 EF2F solid/check-to-slot.svg check_to_slot
+F773 EF30 solid/water.svg water
+F77A EF31 brands/artstation.svg artstation
+F77B EF32 brands/atlassian.svg atlassian
+F77C EF33 solid/baby.svg baby
+F77D EF34 solid/baby-carriage.svg baby_carriage
+F780 EF35 solid/biohazard.svg biohazard
+F781 EF36 solid/blog.svg blog
+F783 EF37 solid/calendar-day.svg calendar_day
+F784 EF38 solid/calendar-week.svg calendar_week
+F785 EF39 brands/canadian-maple-leaf.svg canadian_maple_leaf
+F786 EF3A solid/candy-cane.svg candy_cane
+F787 EF3B solid/carrot.svg carrot
+F788 EF3C solid/cash-register.svg cash_register
+F789 EF3D brands/centos.svg centos
+F78C EF3E solid/minimize.svg minimize
+F78D EF3F brands/confluence.svg confluence
+F790 EF40 brands/dhl.svg dhl
+F791 EF41 brands/diaspora.svg diaspora
+F793 EF42 solid/dumpster.svg dumpster
+F794 EF43 solid/dumpster-fire.svg dumpster_fire
+F796 EF44 solid/ethernet.svg ethernet
+F797 EF45 brands/fedex.svg fedex
+F798 EF46 brands/fedora.svg fedora
+F799 EF47 brands/figma.svg figma
+F79C EF48 solid/gifts.svg gifts
+F79F EF49 solid/champagne-glasses.svg champagne_glasses
+F7A0 EF4A solid/whiskey-glass.svg whiskey_glass
+F7A2 EF4B solid/earth-europe.svg earth_europe
+F7A4 EF4C solid/grip-lines.svg grip_lines
+F7A5 EF4D solid/grip-lines-vertical.svg grip_lines_vertical
+F7A6 EF4E solid/guitar.svg guitar
+F7A9 EF4F solid/heart-crack.svg heart_crack
+F7AA EF50 solid/holly-berry.svg holly_berry
+F7AB EF51 solid/horse-head.svg horse_head
+F7AD EF52 solid/icicles.svg icicles
+F7AE EF53 solid/igloo.svg igloo
+F7AF EF54 brands/intercom.svg intercom
+F7B0 EF55 brands/invision.svg invision
+F7B1 EF56 brands/jira.svg jira
+F7B3 EF57 brands/mendeley.svg mendeley
+F7B5 EF58 solid/mitten.svg mitten
+F7B6 EF59 solid/mug-hot.svg mug_hot
+F7B9 EF5A solid/radiation.svg radiation
+F7BA EF5B solid/circle-radiation.svg circle_radiation
+F7BB EF5C brands/raspberry-pi.svg raspberry_pi
+F7BC EF5D brands/redhat.svg redhat
+F7BD EF5E solid/restroom.svg restroom
+F7BF EF5F solid/satellite.svg satellite
+F7C0 EF60 solid/satellite-dish.svg satellite_dish
+F7C2 EF61 solid/sd-card.svg sd_card
+F7C4 EF62 solid/sim-card.svg sim_card
+F7C5 EF63 solid/person-skating.svg person_skating
+F7C6 EF64 brands/sketch.svg sketch
+F7C9 EF65 solid/person-skiing.svg person_skiing
+F7CA EF66 solid/person-skiing-nordic.svg person_skiing_nordic
+F7CC EF67 solid/sleigh.svg sleigh
+F7CD EF68 solid/comment-sms.svg comment_sms
+F7CE EF69 solid/person-snowboarding.svg person_snowboarding
+F7D0 EF6A solid/snowman.svg snowman
+F7D2 EF6B solid/snowplow.svg snowplow
+F7D3 EF6C brands/sourcetree.svg sourcetree
+F7D6 EF6D brands/suse.svg suse
+F7D7 EF6E solid/tenge-sign.svg tenge_sign
+F7D8 EF6F solid/toilet.svg toilet
+F7D9 EF70 solid/screwdriver-wrench.svg screwdriver_wrench
+F7DA EF71 solid/cable-car.svg cable_car
+F7DF EF72 brands/ubuntu.svg ubuntu
+F7E0 EF73 brands/ups.svg ups
+F7E1 EF74 brands/usps.svg usps
+F7E3 EF75 brands/yarn.svg yarn
+F7E4 EF76 solid/fire-flame-curved.svg fire_flame_curved
+F7E5 EF77 solid/bacon.svg bacon
+F7E6 EF78 solid/book-medical.svg book_medical
+F7EC EF79 solid/bread-slice.svg bread_slice
+F7EF EF7A solid/cheese.svg cheese
+F7F2 EF7B solid/house-chimney-medical.svg house_chimney_medical
+F7F3 EF7C solid/clipboard-user.svg clipboard_user
+F7F5 EF7D solid/comment-medical.svg comment_medical
+F7F7 EF7E solid/crutch.svg crutch
+F7FA EF7F solid/disease.svg disease
+F7FB EF80 solid/egg.svg egg
+F802 EF81 solid/folder-tree.svg folder_tree
+F805 EF82 solid/burger.svg burger
+F806 EF83 solid/hand-middle-finger.svg hand_middle_finger
+F807 EF84 solid/helmet-safety.svg helmet_safety
+F80B EF85 solid/house-chimney.svg house_chimney
+F80D EF86 solid/hospital-user.svg hospital_user
+F80F EF87 solid/hotdog.svg hotdog
+F810 EF88 solid/ice-cream.svg ice_cream
+F812 EF89 solid/laptop-medical.svg laptop_medical
+F815 EF8A solid/pager.svg pager
+F816 EF8B solid/pepper-hot.svg pepper_hot
+F818 EF8C solid/pizza-slice.svg pizza_slice
+F81D EF8D solid/sack-dollar.svg sack_dollar
+F827 EF8E solid/book-tanakh.svg book_tanakh
+F828 EF8F solid/bars-progress.svg bars_progress
+F829 EF90 solid/trash-arrow-up.svg trash_arrow_up
+F82A EF91 solid/trash-can-arrow-up.svg trash_can_arrow_up
+F82F EF92 solid/user-nurse.svg user_nurse
+F834 EF93 brands/airbnb.svg airbnb
+F835 EF94 brands/battle-net.svg battle_net
+F836 EF95 brands/bootstrap.svg bootstrap
+F837 EF96 brands/buffer.svg buffer
+F838 EF97 brands/chromecast.svg chromecast
+F839 EF98 brands/evernote.svg evernote
+F83A EF99 brands/itch-io.svg itch_io
+F83B EF9A brands/salesforce.svg salesforce
+F83C EF9B brands/speaker-deck.svg speaker_deck
+F83D EF9C brands/symfony.svg symfony
+F83E EF9D solid/wave-square.svg wave_square
+F83F EF9E brands/waze.svg waze
+F840 EF9F brands/yammer.svg yammer
+F841 EFA0 brands/git-alt.svg git_alt
+F842 EFA1 brands/stackpath.svg stackpath
+F84A EFA2 solid/person-biking.svg person_biking
+F84C EFA3 solid/border-all.svg border_all
+F850 EFA4 solid/border-none.svg border_none
+F853 EFA5 solid/border-top-left.svg border_top_left
+F85E EFA6 solid/person-digging.svg person_digging
+F863 EFA7 solid/fan.svg fan
+F86D EFA8 solid/icons.svg icons
+F879 EFA9 solid/phone-flip.svg phone_flip
+F87B EFAA solid/square-phone-flip.svg square_phone_flip
+F87C EFAB solid/photo-film.svg photo_film
+F87D EFAC solid/text-slash.svg text_slash
+F881 EFAD solid/arrow-down-z-a.svg arrow_down_z_a
+F882 EFAE solid/arrow-up-z-a.svg arrow_up_z_a
+F884 EFAF solid/arrow-down-short-wide.svg arrow_down_short_wide
+F885 EFB0 solid/arrow-up-short-wide.svg arrow_up_short_wide
+F886 EFB1 solid/arrow-down-9-1.svg arrow_down_9_1
+F887 EFB2 solid/arrow-up-9-1.svg arrow_up_9_1
+F891 EFB3 solid/spell-check.svg spell_check
+F897 EFB4 solid/voicemail.svg voicemail
+F89E EFB5 brands/cotton-bureau.svg cotton_bureau
+F8A6 EFB6 brands/buy-n-large.svg buy_n_large
+F8C0 EFB7 solid/hat-cowboy.svg hat_cowboy
+F8C1 EFB8 solid/hat-cowboy-side.svg hat_cowboy_side
+F8CA EFB9 brands/mdb.svg mdb
+F8CC EFBA solid/computer-mouse.svg computer_mouse
+F8D2 EFBB brands/orcid.svg orcid
+F8D7 EFBC solid/radio.svg radio
+F8D9 EFBD solid/record-vinyl.svg record_vinyl
+F8E1 EFBE brands/swift.svg swift
+F8E8 EFBF brands/umbraco.svg umbraco
+F8EF EFC0 solid/walkie-talkie.svg walkie_talkie
+F8FF EFC1 solid/caravan.svg caravan
+# E005 0000 solid/faucet.svg faucet
+# E006 0000 solid/faucet-drip.svg faucet_drip
+# E007 0000 brands/firefox-browser.svg firefox_browser
+# E00D 0000 solid/house-chimney-window.svg house_chimney_window
+# E012 0000 solid/house-signal.svg house_signal
+# E013 0000 brands/ideal.svg ideal
+# E01A 0000 brands/microblog.svg microblog
+# E01E 0000 brands/square-pied-piper.svg square_pied_piper
+# E03F 0000 solid/temperature-arrow-down.svg temperature_arrow_down
+# E040 0000 solid/temperature-arrow-up.svg temperature_arrow_up
+# E041 0000 solid/trailer.svg trailer
+# E049 0000 brands/unity.svg unity
+# E052 0000 brands/dailymotion.svg dailymotion
+# E055 0000 brands/square-instagram.svg square_instagram
+# E056 0000 brands/mixer.svg mixer
+# E057 0000 brands/shopify.svg shopify
+# E059 0000 solid/bacteria.svg bacteria
+# E05A 0000 solid/bacterium.svg bacterium
+# E05B 0000 solid/box-tissue.svg box_tissue
+# E05C 0000 solid/hand-holding-medical.svg hand_holding_medical
+# E05D 0000 solid/hand-sparkles.svg hand_sparkles
+# E05E 0000 solid/hands-bubbles.svg hands_bubbles
+# E05F 0000 solid/handshake-simple-slash.svg handshake_simple_slash
+# E060 0000 solid/handshake-slash.svg handshake_slash
+# E061 0000 solid/head-side-cough.svg head_side_cough
+# E062 0000 solid/head-side-cough-slash.svg head_side_cough_slash
+# E063 0000 solid/head-side-mask.svg head_side_mask
+# E064 0000 solid/head-side-virus.svg head_side_virus
+# E065 0000 solid/house-chimney-user.svg house_chimney_user
+# E066 0000 solid/house-laptop.svg house_laptop
+# E067 0000 solid/lungs-virus.svg lungs_virus
+# E068 0000 solid/people-arrows.svg people_arrows
+# E069 0000 solid/plane-slash.svg plane_slash
+# E06A 0000 solid/pump-medical.svg pump_medical
+# E06B 0000 solid/pump-soap.svg pump_soap
+# E06C 0000 solid/shield-virus.svg shield_virus
+# E06D 0000 solid/sink.svg sink
+# E06E 0000 solid/soap.svg soap
+# E06F 0000 solid/stopwatch-20.svg stopwatch_20
+# E070 0000 solid/shop-slash.svg shop_slash
+# E071 0000 solid/store-slash.svg store_slash
+# E072 0000 solid/toilet-paper-slash.svg toilet_paper_slash
+# E073 0000 solid/users-slash.svg users_slash
+# E074 0000 solid/virus.svg virus
+# E075 0000 solid/virus-slash.svg virus_slash
+# E076 0000 solid/viruses.svg viruses
+# E077 0000 brands/deezer.svg deezer
+# E078 0000 brands/edge-legacy.svg edge_legacy
+# E079 0000 brands/google-pay.svg google_pay
+# E07A 0000 brands/rust.svg rust
+# E07B 0000 brands/tiktok.svg tiktok
+# E07C 0000 brands/unsplash.svg unsplash
+# E07D 0000 brands/cloudflare.svg cloudflare
+# E07E 0000 brands/guilded.svg guilded
+# E07F 0000 brands/hive.svg hive
+# E080 0000 brands/42-group.svg 42_group
+# E081 0000 brands/instalod.svg instalod
+# E082 0000 brands/octopus-deploy.svg octopus_deploy
+# E083 0000 brands/perbyte.svg perbyte
+# E084 0000 brands/uncharted.svg uncharted
+# E085 0000 solid/vest.svg vest
+# E086 0000 solid/vest-patches.svg vest_patches
+# E087 0000 brands/watchman-monitoring.svg watchman_monitoring
+# E088 0000 brands/wodu.svg wodu
+# E097 0000 solid/arrow-trend-down.svg arrow_trend_down
+# E098 0000 solid/arrow-trend-up.svg arrow_trend_up
+# E09A 0000 solid/arrow-up-from-bracket.svg arrow_up_from_bracket
+# E0A9 0000 solid/austral-sign.svg austral_sign
+# E0AC 0000 solid/baht-sign.svg baht_sign
+# E0B4 0000 solid/bitcoin-sign.svg bitcoin_sign
+# E0B7 0000 solid/bolt-lightning.svg bolt_lightning
+# E0BB 0000 solid/book-bookmark.svg book_bookmark
+# E0D8 0000 solid/camera-rotate.svg camera_rotate
+# E0DF 0000 solid/cedi-sign.svg cedi_sign
+# E0E3 0000 solid/chart-column.svg chart_column
+# E0E4 0000 solid/chart-gantt.svg chart_gantt
+# E131 0000 solid/clapperboard.svg clapperboard
+# E139 0000 solid/clover.svg clover
+# E13A 0000 solid/code-compare.svg code_compare
+# E13B 0000 solid/code-fork.svg code_fork
+# E13C 0000 solid/code-pull-request.svg code_pull_request
+# E140 0000 solid/colon-sign.svg colon_sign
+# E152 0000 solid/cruzeiro-sign.svg cruzeiro_sign
+# E163 0000 solid/display.svg display
+# E169 0000 solid/dong-sign.svg dong_sign
+# E16D 0000 solid/elevator.svg elevator
+# E17B 0000 solid/filter-circle-xmark.svg filter_circle_xmark
+# E184 0000 solid/florin-sign.svg florin_sign
+# E185 0000 regular/folder-closed.svg folder_closed
+# E18F 0000 solid/franc-sign.svg franc_sign
+# E19A 0000 solid/guarani-sign.svg guarani_sign
+# E19B 0000 solid/gun.svg gun
+# E1A8 0000 solid/hands-clapping.svg hands_clapping
+# E1B0 0000 solid/house-user.svg house_user
+# E1BC 0000 solid/indian-rupee-sign.svg indian_rupee_sign
+# E1C4 0000 solid/kip-sign.svg kip_sign
+# E1C8 0000 solid/lari-sign.svg lari_sign
+# E1D3 0000 solid/litecoin-sign.svg litecoin_sign
+# E1D5 0000 solid/manat-sign.svg manat_sign
+# E1D7 0000 solid/mask-face.svg mask_face
+# E1ED 0000 solid/mill-sign.svg mill_sign
+# E1F3 0000 solid/money-bills.svg money_bills
+# E1F6 0000 solid/naira-sign.svg naira_sign
+# E1FE 0000 solid/notdef.svg notdef
+# E209 0000 solid/panorama.svg panorama
+# E221 0000 solid/peseta-sign.svg peseta_sign
+# E222 0000 solid/peso-sign.svg peso_sign
+# E22D 0000 solid/plane-up.svg plane_up
+# E23D 0000 solid/rupiah-sign.svg rupiah_sign
+# E289 0000 solid/stairs.svg stairs
+# E29C 0000 solid/timeline.svg timeline
+# E2B7 0000 solid/truck-front.svg truck_front
+# E2BB 0000 solid/turkish-lira-sign.svg turkish_lira_sign
+# E2C5 0000 solid/vault.svg vault
+# E2CA 0000 solid/wand-magic-sparkles.svg wand_magic_sparkles
+# E2CD 0000 solid/wheat-awn.svg wheat_awn
+# E2CE 0000 solid/wheelchair-move.svg wheelchair_move
+# E2D0 0000 brands/wirsindhandwerk.svg wirsindhandwerk
+# E2E6 0000 solid/bangladeshi-taka-sign.svg bangladeshi_taka_sign
+# E2EB 0000 solid/bowl-rice.svg bowl_rice
+# E31E 0000 solid/person-pregnant.svg person_pregnant
+# E340 0000 brands/bots.svg bots
+# E360 0000 brands/cmplid.svg cmplid
+# E3B1 0000 solid/house-crack.svg house_crack
+# E3B2 0000 solid/house-medical.svg house_medical
+# E3D9 0000 brands/bilibili.svg bilibili
+# E3F5 0000 solid/cent-sign.svg cent_sign
+# E40F 0000 brands/golang.svg golang
+# E43A 0000 brands/pix.svg pix
+# E43C 0000 solid/plus-minus.svg plus_minus
+# E445 0000 solid/sailboat.svg sailboat
+# E447 0000 solid/section.svg section
+# E448 0000 solid/shrimp.svg shrimp
+# E44A 0000 brands/sitrox.svg sitrox
+# E46C 0000 solid/brazilian-real-sign.svg brazilian_real_sign
+# E473 0000 solid/chart-simple.svg chart_simple
+# E476 0000 solid/diagram-next.svg diagram_next
+# E477 0000 solid/diagram-predecessor.svg diagram_predecessor
+# E47A 0000 solid/diagram-successor.svg diagram_successor
+# E47B 0000 solid/earth-oceania.svg earth_oceania
+# E490 0000 solid/bug-slash.svg bug_slash
+# E494 0000 solid/file-circle-plus.svg file_circle_plus
+# E499 0000 brands/hashnode.svg hashnode
+# E49B 0000 brands/meta.svg meta
+# E4A0 0000 brands/padlet.svg padlet
+# E4A5 0000 solid/shop-lock.svg shop_lock
+# E4A8 0000 solid/virus-covid.svg virus_covid
+# E4A9 0000 solid/virus-covid-slash.svg virus_covid_slash
+# E4AA 0000 solid/anchor-circle-check.svg anchor_circle_check
+# E4AB 0000 solid/anchor-circle-exclamation.svg anchor_circle_exclamation
+# E4AC 0000 solid/anchor-circle-xmark.svg anchor_circle_xmark
+# E4AD 0000 solid/anchor-lock.svg anchor_lock
+# E4AF 0000 solid/arrow-down-up-across-line.svg arrow_down_up_across_line
+# E4B0 0000 solid/arrow-down-up-lock.svg arrow_down_up_lock
+# E4B3 0000 solid/arrow-right-to-city.svg arrow_right_to_city
+# E4B5 0000 solid/arrow-up-from-ground-water.svg arrow_up_from_ground_water
+# E4B6 0000 solid/arrow-up-from-water-pump.svg arrow_up_from_water_pump
+# E4B7 0000 solid/arrow-up-right-dots.svg arrow_up_right_dots
+# E4B8 0000 solid/arrows-down-to-line.svg arrows_down_to_line
+# E4B9 0000 solid/arrows-down-to-people.svg arrows_down_to_people
+# E4BA 0000 solid/arrows-left-right-to-line.svg arrows_left_right_to_line
+# E4BB 0000 solid/arrows-spin.svg arrows_spin
+# E4BC 0000 solid/arrows-split-up-and-left.svg arrows_split_up_and_left
+# E4BD 0000 solid/arrows-to-circle.svg arrows_to_circle
+# E4BE 0000 solid/arrows-to-dot.svg arrows_to_dot
+# E4BF 0000 solid/arrows-to-eye.svg arrows_to_eye
+# E4C0 0000 solid/arrows-turn-right.svg arrows_turn_right
+# E4C1 0000 solid/arrows-turn-to-dots.svg arrows_turn_to_dots
+# E4C2 0000 solid/arrows-up-to-line.svg arrows_up_to_line
+# E4C3 0000 solid/bore-hole.svg bore_hole
+# E4C4 0000 solid/bottle-droplet.svg bottle_droplet
+# E4C5 0000 solid/bottle-water.svg bottle_water
+# E4C6 0000 solid/bowl-food.svg bowl_food
+# E4C7 0000 solid/boxes-packing.svg boxes_packing
+# E4C8 0000 solid/bridge.svg bridge
+# E4C9 0000 solid/bridge-circle-check.svg bridge_circle_check
+# E4CA 0000 solid/bridge-circle-exclamation.svg bridge_circle_exclamation
+# E4CB 0000 solid/bridge-circle-xmark.svg bridge_circle_xmark
+# E4CC 0000 solid/bridge-lock.svg bridge_lock
+# E4CE 0000 solid/bridge-water.svg bridge_water
+# E4CF 0000 solid/bucket.svg bucket
+# E4D0 0000 solid/bugs.svg bugs
+# E4D1 0000 solid/building-circle-arrow-right.svg building_circle_arrow_right
+# E4D2 0000 solid/building-circle-check.svg building_circle_check
+# E4D3 0000 solid/building-circle-exclamation.svg building_circle_exclamation
+# E4D4 0000 solid/building-circle-xmark.svg building_circle_xmark
+# E4D5 0000 solid/building-flag.svg building_flag
+# E4D6 0000 solid/building-lock.svg building_lock
+# E4D7 0000 solid/building-ngo.svg building_ngo
+# E4D8 0000 solid/building-shield.svg building_shield
+# E4D9 0000 solid/building-un.svg building_un
+# E4DA 0000 solid/building-user.svg building_user
+# E4DB 0000 solid/building-wheat.svg building_wheat
+# E4DC 0000 solid/burst.svg burst
+# E4DD 0000 solid/car-on.svg car_on
+# E4DE 0000 solid/car-tunnel.svg car_tunnel
+# E4E0 0000 solid/child-combatant.svg child_combatant
+# E4E1 0000 solid/children.svg children
+# E4E2 0000 solid/circle-nodes.svg circle_nodes
+# E4E3 0000 solid/clipboard-question.svg clipboard_question
+# E4E4 0000 solid/cloud-showers-water.svg cloud_showers_water
+# E4E5 0000 solid/computer.svg computer
+# E4E6 0000 solid/cubes-stacked.svg cubes_stacked
+# E4E8 0000 solid/envelope-circle-check.svg envelope_circle_check
+# E4E9 0000 solid/explosion.svg explosion
+# E4EA 0000 solid/ferry.svg ferry
+# E4EB 0000 solid/file-circle-exclamation.svg file_circle_exclamation
+# E4ED 0000 solid/file-circle-minus.svg file_circle_minus
+# E4EF 0000 solid/file-circle-question.svg file_circle_question
+# E4F0 0000 solid/file-shield.svg file_shield
+# E4F1 0000 solid/fire-burner.svg fire_burner
+# E4F2 0000 solid/fish-fins.svg fish_fins
+# E4F3 0000 solid/flask-vial.svg flask_vial
+# E4F4 0000 solid/glass-water.svg glass_water
+# E4F5 0000 solid/glass-water-droplet.svg glass_water_droplet
+# E4F6 0000 solid/group-arrows-rotate.svg group_arrows_rotate
+# E4F7 0000 solid/hand-holding-hand.svg hand_holding_hand
+# E4F8 0000 solid/handcuffs.svg handcuffs
+# E4F9 0000 solid/hands-bound.svg hands_bound
+# E4FA 0000 solid/hands-holding-child.svg hands_holding_child
+# E4FB 0000 solid/hands-holding-circle.svg hands_holding_circle
+# E4FC 0000 solid/heart-circle-bolt.svg heart_circle_bolt
+# E4FD 0000 solid/heart-circle-check.svg heart_circle_check
+# E4FE 0000 solid/heart-circle-exclamation.svg heart_circle_exclamation
+# E4FF 0000 solid/heart-circle-minus.svg heart_circle_minus
+# E500 0000 solid/heart-circle-plus.svg heart_circle_plus
+# E501 0000 solid/heart-circle-xmark.svg heart_circle_xmark
+# E502 0000 solid/helicopter-symbol.svg helicopter_symbol
+# E503 0000 solid/helmet-un.svg helmet_un
+# E507 0000 solid/hill-avalanche.svg hill_avalanche
+# E508 0000 solid/hill-rockslide.svg hill_rockslide
+# E509 0000 solid/house-circle-check.svg house_circle_check
+# E50A 0000 solid/house-circle-exclamation.svg house_circle_exclamation
+# E50B 0000 solid/house-circle-xmark.svg house_circle_xmark
+# E50C 0000 solid/house-fire.svg house_fire
+# E50D 0000 solid/house-flag.svg house_flag
+# E50E 0000 solid/house-flood-water.svg house_flood_water
+# E50F 0000 solid/house-flood-water-circle-arrow-right.svg house_flood_water_circle_arrow_right
+# E510 0000 solid/house-lock.svg house_lock
+# E511 0000 solid/house-medical-circle-check.svg house_medical_circle_check
+# E512 0000 solid/house-medical-circle-exclamation.svg house_medical_circle_exclamation
+# E513 0000 solid/house-medical-circle-xmark.svg house_medical_circle_xmark
+# E514 0000 solid/house-medical-flag.svg house_medical_flag
+# E515 0000 solid/house-tsunami.svg house_tsunami
+# E516 0000 solid/jar.svg jar
+# E517 0000 solid/jar-wheat.svg jar_wheat
+# E518 0000 solid/jet-fighter-up.svg jet_fighter_up
+# E519 0000 solid/jug-detergent.svg jug_detergent
+# E51A 0000 solid/kitchen-set.svg kitchen_set
+# E51B 0000 solid/land-mine-on.svg land_mine_on
+# E51C 0000 solid/landmark-flag.svg landmark_flag
+# E51D 0000 solid/laptop-file.svg laptop_file
+# E51E 0000 solid/lines-leaning.svg lines_leaning
+# E51F 0000 solid/location-pin-lock.svg location_pin_lock
+# E520 0000 solid/locust.svg locust
+# E521 0000 solid/magnifying-glass-arrow-right.svg magnifying_glass_arrow_right
+# E522 0000 solid/magnifying-glass-chart.svg magnifying_glass_chart
+# E523 0000 solid/mars-and-venus-burst.svg mars_and_venus_burst
+# E524 0000 solid/mask-ventilator.svg mask_ventilator
+# E525 0000 solid/mattress-pillow.svg mattress_pillow
+# E527 0000 solid/mobile-retro.svg mobile_retro
+# E528 0000 solid/money-bill-transfer.svg money_bill_transfer
+# E529 0000 solid/money-bill-trend-up.svg money_bill_trend_up
+# E52A 0000 solid/money-bill-wheat.svg money_bill_wheat
+# E52B 0000 solid/mosquito.svg mosquito
+# E52C 0000 solid/mosquito-net.svg mosquito_net
+# E52D 0000 solid/mound.svg mound
+# E52E 0000 solid/mountain-city.svg mountain_city
+# E52F 0000 solid/mountain-sun.svg mountain_sun
+# E530 0000 brands/nfc-directional.svg nfc_directional
+# E531 0000 brands/nfc-symbol.svg nfc_symbol
+# E532 0000 solid/oil-well.svg oil_well
+# E533 0000 solid/people-group.svg people_group
+# E534 0000 solid/people-line.svg people_line
+# E535 0000 solid/people-pulling.svg people_pulling
+# E536 0000 solid/people-robbery.svg people_robbery
+# E537 0000 solid/people-roof.svg people_roof
+# E538 0000 solid/person-arrow-down-to-line.svg person_arrow_down_to_line
+# E539 0000 solid/person-arrow-up-from-line.svg person_arrow_up_from_line
+# E53A 0000 solid/person-breastfeeding.svg person_breastfeeding
+# E53B 0000 solid/person-burst.svg person_burst
+# E53C 0000 solid/person-cane.svg person_cane
+# E53D 0000 solid/person-chalkboard.svg person_chalkboard
+# E53E 0000 solid/person-circle-check.svg person_circle_check
+# E53F 0000 solid/person-circle-exclamation.svg person_circle_exclamation
+# E540 0000 solid/person-circle-minus.svg person_circle_minus
+# E541 0000 solid/person-circle-plus.svg person_circle_plus
+# E542 0000 solid/person-circle-question.svg person_circle_question
+# E543 0000 solid/person-circle-xmark.svg person_circle_xmark
+# E544 0000 solid/person-dress-burst.svg person_dress_burst
+# E545 0000 solid/person-drowning.svg person_drowning
+# E546 0000 solid/person-falling.svg person_falling
+# E547 0000 solid/person-falling-burst.svg person_falling_burst
+# E548 0000 solid/person-half-dress.svg person_half_dress
+# E549 0000 solid/person-harassing.svg person_harassing
+# E54A 0000 solid/person-military-pointing.svg person_military_pointing
+# E54B 0000 solid/person-military-rifle.svg person_military_rifle
+# E54C 0000 solid/person-military-to-person.svg person_military_to_person
+# E54D 0000 solid/person-rays.svg person_rays
+# E54E 0000 solid/person-rifle.svg person_rifle
+# E54F 0000 solid/person-shelter.svg person_shelter
+# E551 0000 solid/person-walking-arrow-loop-left.svg person_walking_arrow_loop_left
+# E552 0000 solid/person-walking-arrow-right.svg person_walking_arrow_right
+# E553 0000 solid/person-walking-dashed-line-arrow-right.svg person_walking_dashed_line_arrow_right
+# E554 0000 solid/person-walking-luggage.svg person_walking_luggage
+# E555 0000 solid/plane-circle-check.svg plane_circle_check
+# E556 0000 solid/plane-circle-exclamation.svg plane_circle_exclamation
+# E557 0000 solid/plane-circle-xmark.svg plane_circle_xmark
+# E558 0000 solid/plane-lock.svg plane_lock
+# E55A 0000 solid/plate-wheat.svg plate_wheat
+# E55B 0000 solid/plug-circle-bolt.svg plug_circle_bolt
+# E55C 0000 solid/plug-circle-check.svg plug_circle_check
+# E55D 0000 solid/plug-circle-exclamation.svg plug_circle_exclamation
+# E55E 0000 solid/plug-circle-minus.svg plug_circle_minus
+# E55F 0000 solid/plug-circle-plus.svg plug_circle_plus
+# E560 0000 solid/plug-circle-xmark.svg plug_circle_xmark
+# E561 0000 solid/ranking-star.svg ranking_star
+# E562 0000 solid/road-barrier.svg road_barrier
+# E563 0000 solid/road-bridge.svg road_bridge
+# E564 0000 solid/road-circle-check.svg road_circle_check
+# E565 0000 solid/road-circle-exclamation.svg road_circle_exclamation
+# E566 0000 solid/road-circle-xmark.svg road_circle_xmark
+# E567 0000 solid/road-lock.svg road_lock
+# E568 0000 solid/road-spikes.svg road_spikes
+# E569 0000 solid/rug.svg rug
+# E56A 0000 solid/sack-xmark.svg sack_xmark
+# E56B 0000 solid/school-circle-check.svg school_circle_check
+# E56C 0000 solid/school-circle-exclamation.svg school_circle_exclamation
+# E56D 0000 solid/school-circle-xmark.svg school_circle_xmark
+# E56E 0000 solid/school-flag.svg school_flag
+# E56F 0000 solid/school-lock.svg school_lock
+# E570 0000 brands/screenpal.svg screenpal
+# E571 0000 solid/sheet-plastic.svg sheet_plastic
+# E572 0000 solid/shield-cat.svg shield_cat
+# E573 0000 solid/shield-dog.svg shield_dog
+# E574 0000 solid/shield-heart.svg shield_heart
+# E576 0000 solid/square-nfi.svg square_nfi
+# E577 0000 solid/square-person-confined.svg square_person_confined
+# E578 0000 solid/square-virus.svg square_virus
+# E579 0000 solid/staff-snake.svg staff_snake
+# E57A 0000 solid/sun-plant-wilt.svg sun_plant_wilt
+# E57B 0000 solid/tarp.svg tarp
+# E57C 0000 solid/tarp-droplet.svg tarp_droplet
+# E57D 0000 solid/tent.svg tent
+# E57E 0000 solid/tent-arrow-down-to-line.svg tent_arrow_down_to_line
+# E57F 0000 solid/tent-arrow-left-right.svg tent_arrow_left_right
+# E580 0000 solid/tent-arrow-turn-left.svg tent_arrow_turn_left
+# E581 0000 solid/tent-arrows-down.svg tent_arrows_down
+# E582 0000 solid/tents.svg tents
+# E583 0000 solid/toilet-portable.svg toilet_portable
+# E584 0000 solid/toilets-portable.svg toilets_portable
+# E585 0000 solid/tower-cell.svg tower_cell
+# E586 0000 solid/tower-observation.svg tower_observation
+# E587 0000 solid/tree-city.svg tree_city
+# E589 0000 solid/trowel.svg trowel
+# E58A 0000 solid/trowel-bricks.svg trowel_bricks
+# E58B 0000 solid/truck-arrow-right.svg truck_arrow_right
+# E58C 0000 solid/truck-droplet.svg truck_droplet
+# E58D 0000 solid/truck-field.svg truck_field
+# E58E 0000 solid/truck-field-un.svg truck_field_un
+# E58F 0000 solid/truck-plane.svg truck_plane
+# E591 0000 solid/users-between-lines.svg users_between_lines
+# E592 0000 solid/users-line.svg users_line
+# E593 0000 solid/users-rays.svg users_rays
+# E594 0000 solid/users-rectangle.svg users_rectangle
+# E595 0000 solid/users-viewfinder.svg users_viewfinder
+# E596 0000 solid/vial-circle-check.svg vial_circle_check
+# E597 0000 solid/vial-virus.svg vial_virus
+# E598 0000 solid/wheat-awn-circle-exclamation.svg wheat_awn_circle_exclamation
+# E599 0000 solid/worm.svg worm
+# E59A 0000 solid/xmarks-lines.svg xmarks_lines
+# E59C 0000 solid/child-dress.svg child_dress
+# E59D 0000 solid/child-reaching.svg child_reaching
+# E5A0 0000 solid/file-circle-check.svg file_circle_check
+# E5A1 0000 solid/file-circle-xmark.svg file_circle_xmark
+# E5A9 0000 solid/person-through-window.svg person_through_window
+# E5AA 0000 solid/plant-wilt.svg plant_wilt
+# E5AC 0000 brands/space-awesome.svg space_awesome
+# E5AD 0000 brands/square-font-awesome.svg square_font_awesome
+# E5AE 0000 brands/square-gitlab.svg square_gitlab
+# E5AF 0000 solid/stapler.svg stapler
+# E5B4 0000 solid/train-tram.svg train_tram
+# E5C6 0000 brands/odysee.svg odysee
+# E5C7 0000 brands/stubber.svg stubber
+# E60B 0000 brands/debian.svg debian
+# E60C 0000 brands/shoelace.svg shoelace
+# E618 0000 brands/threads.svg threads
+# E619 0000 brands/square-threads.svg square_threads
+# E61A 0000 brands/square-x-twitter.svg square_x_twitter
+# E61B 0000 brands/x-twitter.svg x_twitter
+# E62B 0000 brands/opensuse.svg opensuse
+# E62D 0000 brands/letterboxd.svg letterboxd
+# E62E 0000 brands/square-letterboxd.svg square_letterboxd
+# E62F 0000 brands/mintbit.svg mintbit
+# E63B 0000 brands/google-scholar.svg google_scholar
+# E63C 0000 brands/brave.svg brave
+# E63D 0000 brands/brave-reverse.svg brave_reverse
+# E640 0000 brands/pixiv.svg pixiv
+# E641 0000 brands/upwork.svg upwork
+# E65C 0000 brands/webflow.svg webflow
+# E663 0000 brands/signal-messenger.svg signal_messenger
+F374 EFC2 brands/avianex.svg avianex
+F536 EFC3 solid/less-than.svg less_than
+F537 EFC4 solid/less-than-equal.svg less_than_equal
+F538 EFC5 solid/memory.svg memory
+F539 EFC6 solid/microphone-lines-slash.svg microphone_lines_slash
+F53A EFC7 solid/money-bill-wave.svg money_bill_wave
+F53B EFC8 solid/money-bill-1-wave.svg money_bill_1_wave
+F53C EFC9 solid/money-check.svg money_check
+F53D EFCA solid/money-check-dollar.svg money_check_dollar
+F53E EFCB solid/not-equal.svg not_equal
+F53F EFCC solid/palette.svg palette
+F540 EFCD solid/square-parking.svg square_parking
+F542 EFCE solid/diagram-project.svg diagram_project
+# Summary
+# - Duplicates 37
+# - Dropped 401
+# - From original range 676 (0x2A4)
+# - From extended F0 range 799 (0x31F)
+# - From E0 range 0 (0x0)
diff --git a/bin/nerdfont/src/glyphs/font-logos.ttf b/bin/nerdfont/src/glyphs/font-logos.ttf
new file mode 100644
index 0000000..3e2e8d7
Binary files /dev/null and b/bin/nerdfont/src/glyphs/font-logos.ttf differ
diff --git a/bin/nerdfont/src/glyphs/materialdesign/LICENSE b/bin/nerdfont/src/glyphs/materialdesign/LICENSE
new file mode 100644
index 0000000..382f8a1
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/materialdesign/LICENSE
@@ -0,0 +1,20 @@
+Pictogrammers Free License
+--------------------------
+
+This icon collection is released as free, open source, and GPL friendly by
+the [Pictogrammers](http://pictogrammers.com/) icon group. You may use it
+for commercial projects, open source projects, or anything really.
+
+# Icons: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
+Some of the icons are redistributed under the Apache 2.0 license. All other
+icons are either redistributed under their respective licenses or are
+distributed under the Apache 2.0 license.
+
+# Fonts: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
+All web and desktop fonts are distributed under the Apache 2.0 license. Web
+and desktop fonts contain some icons that are redistributed under the Apache
+2.0 license. All other icons are either redistributed under their respective
+licenses or are distributed under the Apache 2.0 license.
+
+# Code: MIT (https://opensource.org/licenses/MIT)
+The MIT license applies to all non-font and non-icon files.
diff --git a/bin/nerdfont/src/glyphs/materialdesign/MaterialDesignIconsDesktop.ttf b/bin/nerdfont/src/glyphs/materialdesign/MaterialDesignIconsDesktop.ttf
new file mode 100644
index 0000000..456bf81
Binary files /dev/null and b/bin/nerdfont/src/glyphs/materialdesign/MaterialDesignIconsDesktop.ttf differ
diff --git a/bin/nerdfont/src/glyphs/materialdesign/MaterialDesignIconsDesktop_orig.ttf b/bin/nerdfont/src/glyphs/materialdesign/MaterialDesignIconsDesktop_orig.ttf
new file mode 100644
index 0000000..33dac16
Binary files /dev/null and b/bin/nerdfont/src/glyphs/materialdesign/MaterialDesignIconsDesktop_orig.ttf differ
diff --git a/bin/nerdfont/src/glyphs/materialdesign/README.md b/bin/nerdfont/src/glyphs/materialdesign/README.md
new file mode 100644
index 0000000..dd38219
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/materialdesign/README.md
@@ -0,0 +1,31 @@
+## Contents
+
+This folder contains the source for the (current) Material Design Icons.
+Source is https://github.com/Templarian/MaterialDesign-Font
+
+Last fetch date is Oct 6, 2022.
+
+After fetching a new file one needs to correct our cheat-sheet by updating `bin/scripts/lib/i_md.sh`.
+Use the tool:
+```
+cd bin/scripts
+mv lib/i_md.sh lib/i_md.sh_
+python3 generate-glyph-info-from-set.py --start f0001 -end f1af0 -font ../../src/glyphs/materialdesign/MaterialDesignIconsDesktop.ttf -offset 0 -prefix md > lib/i_md.sh
+```
+
+Open old and new definitions shell script and copy the header from the old file to the autogenerated file. Adapt the values in the new file's header. Remove the last line in the new file (it contains the number of glyphs that is needed for the updated header). Yes, that is some manual labor.
+
+
+## Source bugs fixed
+
+Glyph 0xF1522 is broken in the original font. We fixed that one glyph manually.
+
+See https://github.com/Templarian/MaterialDesign-Font/issues/9
+
+## Old version
+
+Also contained is the old (pre Nerd Fonts v3.0.0) Material Design Icons:
+
+`materialdesignicons-webfont.ttf`
+
+That is not used, but can be activated by users of the font-patcher by enabling the font in the sourcecode.
diff --git a/bin/nerdfont/src/glyphs/materialdesign/materialdesignicons-webfont.ttf b/bin/nerdfont/src/glyphs/materialdesign/materialdesignicons-webfont.ttf
new file mode 100644
index 0000000..c9a3a30
Binary files /dev/null and b/bin/nerdfont/src/glyphs/materialdesign/materialdesignicons-webfont.ttf differ
diff --git a/bin/nerdfont/src/glyphs/octicons/LICENSE b/bin/nerdfont/src/glyphs/octicons/LICENSE
new file mode 100644
index 0000000..163074d
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/octicons/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/bin/nerdfont/src/glyphs/octicons/analyze_octicons b/bin/nerdfont/src/glyphs/octicons/analyze_octicons
new file mode 100644
index 0000000..35fa961
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/octicons/analyze_octicons
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+# coding=utf8
+
+# This extracts the names and source and destination codepoints
+# of the old octicons font file to keep their codepoints stable
+#
+# You do not need to redo it, the result is in the repo
+#
+# Usage:
+# fontforge analyze_octicons > mapping
+
+import fontforge
+
+octi_orig = "octicons.ttf"
+current_cp = 0xF400
+
+print('# Examining {}'.format(octi_orig))
+
+font = fontforge.open(octi_orig)
+for glyph in font.glyphs('encoding'):
+    point = glyph.unicode
+    if point < 0:
+        continue
+    desti = glyph.unicode
+    if point < 0xF000:
+        desti = point
+    else:
+        desti = current_cp
+        current_cp += 1
+    print("{:X} {:X} {}".format(point, desti, glyph.glyphname))
+
+font.close()
diff --git a/bin/nerdfont/src/glyphs/octicons/file-symlink-directory-16.svg b/bin/nerdfont/src/glyphs/octicons/file-symlink-directory-16.svg
new file mode 100644
index 0000000..af5dbe1
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/octicons/file-symlink-directory-16.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m1.75 1c-0.966 0-1.75 0.784-1.75 1.75v1.75c0 1 1.5 1 1.5 0v-1.75c0-0.138 0.112-0.25 0.25-0.25h3.25c0.0783 1.53e-4 0.152 0.037 0.199 0.0996l0.9 1.2c0.33 0.44 0.85 0.699 1.4 0.699h6.75c0.138 0 0.25 0.112 0.25 0.25v8.5c0 0.138-0.112 0.25-0.25 0.25h-9c-1 0-1 1.5 0 1.5h9c0.966 0 1.75-0.784 1.75-1.75v-8.5c0-0.966-0.784-1.75-1.75-1.75h-6.75c-0.0783-1.53e-4 -0.152-0.037-0.199-0.0996l-0.9-1.2c-0.33-0.44-0.85-0.699-1.4-0.699zm2.49 5.32c-0.135 0.00422-0.242 0.115-0.242 0.25v1.92h-0.23c-2.08-0.0119-3.77 1.67-3.77 3.75v1.01c1.63e-4 1 1.5 1 1.5 0v-1.01c-1.69e-5 -1.25 1.01-2.26 2.26-2.25l0.238 0.00195v1.94c0.0015 0.217 0.261 0.329 0.42 0.182l2.88-2.68c0.107-0.099 0.107-0.268 0-0.367l-2.88-2.68c-0.0482-0.0446-0.112-0.0685-0.178-0.0664z"/></svg>
diff --git a/bin/nerdfont/src/glyphs/octicons/file-symlink-directory-24.svg b/bin/nerdfont/src/glyphs/octicons/file-symlink-directory-24.svg
new file mode 100644
index 0000000..cb48984
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/octicons/file-symlink-directory-24.svg
@@ -0,0 +1 @@
+<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m3.75 3c-0.966 0-1.75 0.784-1.75 1.75v4.74c0 1 1.5 1 1.5 0v-4.74c0-0.138 0.112-0.25 0.25-0.25h4.97c0.0828 2.38e-4 0.16 0.0411 0.207 0.109l1.4 2.06c0.326 0.479 0.868 0.766 1.45 0.766h8.47c0.138 0 0.25 0.112 0.25 0.25v11.6c0 0.138-0.112 0.25-0.25 0.25h-13.5c-1 0-1 1.5 0 1.5h13.5c0.966 0 1.75-0.784 1.75-1.75v-11.6c0-0.967-0.784-1.75-1.75-1.75h-8.47c-0.083 0-0.161-0.0404-0.207-0.109l-1.4-2.06c-0.327-0.479-0.867-0.766-1.45-0.766zm5.95 5.99c-0.0441 0.00229-0.0877 0.00751-0.131 0.0176-0.569 0.132-0.775 0.835-0.369 1.25l2.11 2.24h-5.22c-2.26 8.6e-5 -4.09 1.83-4.09 4.09v3.16c0 1 1.5 1 1.5 0v-3.16c8.6e-5 -1.43 1.16-2.59 2.59-2.59h5.22l-2.11 2.24c-0.188 0.194-0.258 0.475-0.182 0.734 0.164 0.564 0.882 0.729 1.28 0.293l3.29-3.5c0.271-0.289 0.271-0.739 0-1.03l-3.29-3.5c-0.12-0.133-0.284-0.218-0.461-0.24-0.044-0.00555-0.0887-0.00619-0.133-0.00391z"/></svg>
diff --git a/bin/nerdfont/src/glyphs/octicons/generate b/bin/nerdfont/src/glyphs/octicons/generate
new file mode 100644
index 0000000..31970b1
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/octicons/generate
@@ -0,0 +1,181 @@
+#!/usr/bin/env python3
+# coding=utf8
+
+import sys
+import os
+import re
+import subprocess
+import fontforge
+
+# Double-quotes required here, for version-bump.sh:
+# version-bump.sh is not working here, need to adjust manually!
+version = "3.0.0"
+
+archive = 'v18.3.0.tar.gz'
+
+vectorsdir = 'icons'
+fontdir = '.'
+fontfile = 'octicons.ttf'
+glyphsetfile = 'i_oct.sh'
+glyphsetsdir = '../../../bin/scripts/lib'
+
+subset = '-16' # use 16 px subset if possible
+subset_other = '-24' # use 24 px subset otherwise
+
+def renamer(old_name):
+    """ Return new equivalent icon name """
+    return {
+            'trashcan' : 'trash',
+            'cloud-download' : 'download',
+            'cloud-upload' : 'upload',
+            'clippy' : 'paste',
+            'mail-read' : 'read',
+            'primitive-dot' : 'dot-fill',
+            'primitive-square' : 'square-fill',
+            'settings' : 'sliders',
+            'dashboard' : 'meter',
+            'paintcan' : 'paintbrush',
+        }.get(old_name, old_name)
+
+def addIcon(codepoint, name, filename):
+    """ Add one outline file and rescale/move """
+    dBB = [120, 0, 1000-120, 900] # just some nice sizes
+    filename = os.path.join(vectorsdir, filename)
+    glyph = font.createChar(codepoint, name)
+    glyph.importOutlines(filename)
+    glyph.manualHints = True
+
+def createGlyphInfo(icon_datasets, filepathname, into):
+    """ Write the glyphinfo file """
+    with open(filepathname, 'w', encoding = 'utf8') as f:
+        f.write(u'#!/usr/bin/env bash\n')
+        f.write(intro)
+        f.write(u'# Script Version: (autogenerated)\n')
+        f.write(u'test -n "$__i_oct_loaded" && return || __i_oct_loaded=1\n')
+        for _, codepoint, name in icon_datasets:
+            codepoint = int(codepoint, 16)
+            f.write(u"i='{}' i_oct_{}=$i\n".format(chr(codepoint), name.replace('-', '_')))
+        f.write(u'unset i\n')
+
+print('\nReading mapping file')
+old_mapping = []
+with open('mapping', 'r') as f:
+    for line in f.readlines():
+        if line.startswith('#'):
+            continue
+        old_mapping.append(tuple(re.split(' +', line.strip())))
+print('Found {} entries'.format(len(old_mapping)))
+old_mapping.sort(key=(lambda x: x[0]))
+
+print('Fetching octicons archive "{}"\n'.format(archive))
+if subprocess.call('curl -OL https://github.com/primer/octicons/archive/' + archive, shell=True):
+    sys.exit('Error fetching octicons archive')
+print('\nUnpacking octicons archive')
+if subprocess.call('rm -rf icons octicons-* && tar zxf *.gz && mv octicons-*/icons . && rm -rf octicons-* && cp file-symlink-directory-*.svg icons', shell=True):
+    sys.exit('Error unpacking archive')
+
+svgs = os.listdir(vectorsdir)
+print('Found {} svgs'.format(len(svgs)))
+names = { s[0:-len('-xx.svg')] for s in svgs if s.endswith(subset + '.svg') or s.endswith(subset_other + '.svg') }
+print('Found {} icons after de-duplicating\n'.format(len(names)))
+
+num_found = 0
+num_missing = 0
+misslist = ''
+renamelist = ''
+freeslots = []
+
+new_mapping = []
+for i, j, old_n in old_mapping:
+    if old_n in names:
+        names.remove(old_n)
+        new_mapping.append((i, j, old_n))
+        num_found += 1
+        continue
+    new_n = renamer(old_n)
+    if new_n in names:
+        renamelist += 'Renamed {} -> {}\n'.format(old_n, new_n)
+        names.remove(new_n)
+        new_mapping.append((i, j, new_n))
+        num_found += 1
+        continue
+    misslist += 'Missing {}\n'.format(old_n)
+    freeslots.append((i, j))
+    num_missing += 1
+
+print(renamelist)
+print(misslist)
+print('Found {} (of {}, missing {}) and new {}'.format(num_found, len(old_mapping), num_missing, len(names)))
+
+names = list(names)
+names.sort()
+for n in list(names):
+    if len(freeslots) == 0:
+        break
+    i, j = freeslots[0]
+    new_mapping.append((i, j, n))
+    names.remove(n)
+    freeslots = freeslots[1:]
+
+print('Filled in missing, remaining new {}'.format(len(names)))
+
+i_max = 0
+j_max = 0
+for i, j, _ in new_mapping:
+    i = int(i, 16)
+    j = int(j, 16)
+    if i > i_max:
+        i_max = i
+    if j > j_max:
+        j_max = j
+
+for n in names:
+    i_max += 1
+    j_max += 1
+    new_mapping.append(('{:X}'.format(i_max), '{:X}'.format(j_max), n))
+
+print('Appended remaining new, total new mapping {}'.format(len(new_mapping)))
+
+new_mapping.sort(key=(lambda x: x[0]))
+with open('mapping', 'w') as f:
+    for i, j, n in new_mapping:
+        f.write('{} {} {}\n'.format(i, j, n))
+
+font = fontforge.font()
+font.fontname = 'OcticonsNerdFont-Regular'
+font.fullname = 'Octicons Nerd Font Regular'
+font.familyname = 'Octicons Nerd Font'
+font.em = 2048
+font.encoding = 'UnicodeFull'
+
+# Add valid space glyph to avoid "unknown character" box on IE11
+glyph = font.createChar(32)
+glyph.width = 200
+
+font.sfntRevision = None # Auto-set (refreshed) by fontforge
+font.version = version
+font.copyright = 'GitHub Inc.'
+font.appendSFNTName('English (US)', 'Version', archive + '; ' + version)
+font.appendSFNTName('English (US)', 'Vendor URL', 'https://github.com/ryanoasis/nerd-fonts')
+font.appendSFNTName('English (US)', 'Copyright', 'GitHub Inc.')
+
+for codepoint, _, name in new_mapping:
+    codepoint = int(codepoint, 16)
+    filename = name + subset + '.svg'
+    if filename not in svgs:
+        filename = name + subset_other + '.svg'
+    addIcon(codepoint, name, filename)
+
+num_icons = len(new_mapping)
+
+print('Generating {} with {} glyphs'.format(fontfile, num_icons))
+font.generate(os.path.join(fontdir, fontfile), flags=("no-FFTM-table",))
+
+codepoints = [ int(p, 16) for _, p, _ in new_mapping ]
+intro  = u'# Octicons ({} icons)\n'.format(num_icons)
+intro += u'# Codepoints: {:X}-{:X} with gaps\n'.format(min(codepoints), max(codepoints))
+intro += u'# Nerd Fonts Version: {}\n'.format(version)
+
+print('Generating GlyphInfo {}'.format(glyphsetfile))
+createGlyphInfo(new_mapping, os.path.join(glyphsetsdir, glyphsetfile), intro)
+print('Finished')
diff --git a/bin/nerdfont/src/glyphs/octicons/mapping b/bin/nerdfont/src/glyphs/octicons/mapping
new file mode 100644
index 0000000..580becc
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/octicons/mapping
@@ -0,0 +1,310 @@
+2665 2665 heart
+26A1 26A1 zap
+F000 F400 light-bulb
+F001 F401 repo
+F002 F402 repo-forked
+F005 F403 repo-push
+F006 F404 repo-pull
+F007 F405 book
+F008 F406 accessibility
+F009 F407 git-pull-request
+F00A F408 mark-github
+F00B F409 download
+F00C F40A upload
+F00D F40B accessibility-inset
+F00E F40C alert-fill
+F010 F40D file-code
+F011 F40E apps
+F012 F40F file-media
+F013 F410 file-zip
+F014 F411 archive
+F015 F412 tag
+F016 F413 file-directory
+F017 F414 file-submodule
+F018 F415 person
+F019 F416 arrow-both
+F01F F417 git-commit
+F020 F418 git-branch
+F023 F419 git-merge
+F024 F41A mirror
+F026 F41B issue-opened
+F027 F41C issue-reopened
+F028 F41D issue-closed
+F02A F41E star
+F02B F41F comment
+F02C F420 question
+F02D F421 alert
+F02E F422 search
+F02F F423 gear
+F030 F424 arrow-down-left
+F031 F425 tools
+F032 F426 sign-out
+F033 F427 rocket
+F034 F428 rss
+F035 F429 paste
+F036 F42A sign-in
+F037 F42B organization
+F038 F42C device-mobile
+F039 F42D unfold
+F03A F42E check
+F03B F42F mail
+F03C F430 read
+F03D F431 arrow-up
+F03E F432 arrow-right
+F03F F433 arrow-down
+F040 F434 arrow-left
+F041 F435 pin
+F042 F436 gift
+F043 F437 graph
+F044 F438 triangle-left
+F045 F439 credit-card
+F046 F43A clock
+F047 F43B ruby
+F048 F43C broadcast
+F049 F43D key
+F04A F43E arrow-down-right
+F04C F43F repo-clone
+F04D F440 diff
+F04E F441 eye
+F04F F442 comment-discussion
+F051 F443 arrow-switch
+F052 F444 dot-fill
+F053 F445 square-fill
+F056 F446 device-camera
+F057 F447 device-camera-video
+F058 F448 pencil
+F059 F449 info
+F05A F44A triangle-right
+F05B F44B triangle-down
+F05C F44C link
+F05D F44D plus
+F05E F44E three-bars
+F05F F44F code
+F060 F450 location
+F061 F451 list-unordered
+F062 F452 list-ordered
+F063 F453 quote
+F064 F454 versions
+F068 F455 calendar
+F06A F456 lock
+F06B F457 diff-added
+F06C F458 diff-removed
+F06D F459 diff-modified
+F06E F45A diff-renamed
+F070 F45B horizontal-rule
+F071 F45C arrow-up-left
+F075 F45D milestone
+F076 F45E checklist
+F077 F45F megaphone
+F078 F460 chevron-right
+F07B F461 bookmark
+F07C F462 sliders
+F07D F463 meter
+F07E F464 history
+F07F F465 link-external
+F080 F466 mute
+F081 F467 x
+F084 F468 circle-slash
+F085 F469 pulse
+F087 F46A sync
+F088 F46B telescope
+F08C F46C arrow-up-right
+F08D F46D home
+F08F F46E stop
+F091 F46F bug
+F092 F470 logo-github
+F094 F471 file-binary
+F096 F472 database
+F097 F473 server
+F099 F474 diff-ignored
+F09A F475 ellipsis
+F09C F476 bell-fill
+F09D F477 hubot
+F09F F478 bell-slash
+F0A0 F479 blocked
+F0A1 F47A bookmark-fill
+F0A2 F47B chevron-up
+F0A3 F47C chevron-down
+F0A4 F47D chevron-left
+F0AA F47E triangle-up
+F0AC F47F git-compare
+F0AD F480 logo-gist
+F0B0 F481 file-symlink-file
+F0B1 F482 file-symlink-directory
+F0B2 F483 squirrel
+F0B6 F484 globe
+F0BA F485 unmute
+F0BE F486 mention
+F0C4 F487 package
+F0C5 F488 browser
+F0C8 F489 terminal
+F0C9 F48A markdown
+F0CA F48B dash
+F0CC F48C fold
+F0CF F48D inbox
+F0D0 F48E trash
+F0D1 F48F paintbrush
+F0D2 F490 flame
+F0D3 F491 briefcase
+F0D4 F492 plug
+F0D6 F493 bookmark-slash-fill
+F0D7 F494 mortar-board
+F0D8 F495 law
+F0DA F496 thumbsup
+F0DB F497 thumbsdown
+F0DC F498 desktop-download
+F0DD F499 beaker
+F0DE F49A bell
+F0E0 F49B cache
+F0E1 F49C shield
+F0E2 F49D bold
+F0E3 F49E check-circle
+F0E4 F49F italic
+F0E5 F4A0 tasklist
+F0E6 F4A1 verified
+F0E7 F4A2 smiley
+F0E8 F4A3 unverified
+F101 F4A4 check-circle-fill
+F102 F4A5 file
+F103 F4A6 grabber
+F104 F4A7 checkbox
+F105 F4A8 reply
+F27C F4A9 device-desktop
+F27D F4AA circle
+F27E F4AB clock-fill
+F27F F4AC cloud
+F280 F4AD cloud-offline
+F281 F4AE code-of-conduct
+F282 F4AF code-review
+F283 F4B0 code-square
+F284 F4B1 codescan
+F285 F4B2 codescan-checkmark
+F286 F4B3 codespaces
+F287 F4B4 columns
+F288 F4B5 command-palette
+F289 F4B6 commit
+F28A F4B7 container
+F28B F4B8 copilot
+F28C F4B9 copilot-error
+F28D F4BA copilot-warning
+F28E F4BB copy
+F28F F4BC cpu
+F290 F4BD cross-reference
+F291 F4BE dependabot
+F292 F4BF diamond
+F293 F4C0 discussion-closed
+F294 F4C1 discussion-duplicate
+F295 F4C2 discussion-outdated
+F296 F4C3 dot
+F297 F4C4 duplicate
+F298 F4C5 eye-closed
+F299 F4C6 feed-discussion
+F29A F4C7 feed-forked
+F29B F4C8 feed-heart
+F29C F4C9 feed-merged
+F29D F4CA feed-person
+F29E F4CB feed-repo
+F29F F4CC feed-rocket
+F2A0 F4CD feed-star
+F2A1 F4CE feed-tag
+F2A2 F4CF feed-trophy
+F2A3 F4D0 file-added
+F2A4 F4D1 file-badge
+F2A5 F4D2 file-diff
+F2A6 F4D3 file-directory-fill
+F2A7 F4D4 file-directory-open-fill
+F2A8 F4D5 file-moved
+F2A9 F4D6 file-removed
+F2AA F4D7 filter
+F2AB F4D8 fiscal-host
+F2AC F4D9 fold-down
+F2AD F4DA fold-up
+F2AE F4DB git-merge-queue
+F2AF F4DC git-pull-request-closed
+F2B0 F4DD git-pull-request-draft
+F2B1 F4DE goal
+F2B2 F4DF hash
+F2B3 F4E0 heading
+F2B4 F4E1 heart-fill
+F2B5 F4E2 home-fill
+F2B6 F4E3 hourglass
+F2B7 F4E4 id-badge
+F2B8 F4E5 image
+F2B9 F4E6 infinity
+F2BA F4E7 issue-draft
+F2BB F4E8 issue-tracked-by
+F2BC F4E9 issue-tracks
+F2BD F4EA iterations
+F2BE F4EB kebab-horizontal
+F2BF F4EC key-asterisk
+F2C0 F4ED log
+F2C1 F4EE moon
+F2C2 F4EF move-to-bottom
+F2C3 F4F0 move-to-end
+F2C4 F4F1 move-to-start
+F2C5 F4F2 move-to-top
+F2C6 F4F3 multi-select
+F2C7 F4F4 no-entry
+F2C8 F4F5 north-star
+F2C9 F4F6 note
+F2CA F4F7 number
+F2CB F4F8 package-dependencies
+F2CC F4F9 package-dependents
+F2CD F4FA paper-airplane
+F2CE F4FB paperclip
+F2CF F4FC passkey-fill
+F2D0 F4FD people
+F2D1 F4FE person-add
+F2D2 F4FF person-fill
+F2D3 F500 play
+F2D4 F501 plus-circle
+F2D5 F502 project
+F2D6 F503 project-roadmap
+F2D7 F504 project-symlink
+F2D8 F505 project-template
+F2D9 F506 rel-file-path
+F2DA F507 repo-deleted
+F2DB F508 repo-locked
+F2DC F509 repo-template
+F2DD F50A report
+F2DE F50B rows
+F2DF F50C screen-full
+F2E0 F50D screen-normal
+F2E1 F50E share
+F2E2 F50F share-android
+F2E3 F510 shield-check
+F2E4 F511 shield-lock
+F2E5 F512 shield-slash
+F2E6 F513 shield-x
+F2E7 F514 sidebar-collapse
+F2E8 F515 sidebar-expand
+F2E9 F516 single-select
+F2EA F517 skip
+F2EB F518 skip-fill
+F2EC F519 sort-asc
+F2ED F51A sort-desc
+F2EE F51B sparkle-fill
+F2EF F51C sponsor-tiers
+F2F0 F51D square
+F2F1 F51E stack
+F2F2 F51F star-fill
+F2F3 F520 stopwatch
+F2F4 F521 strikethrough
+F2F5 F522 sun
+F2F6 F523 tab
+F2F7 F524 tab-external
+F2F8 F525 table
+F2F9 F526 telescope-fill
+F2FA F527 trophy
+F2FB F528 typography
+F2FC F529 unlink
+F2FD F52A unlock
+F2FE F52B unread
+F2FF F52C video
+F300 F52D webhook
+F301 F52E workflow
+F302 F52F x-circle
+F303 F530 x-circle-fill
+F304 F531 zoom-in
+F305 F532 zoom-out
+F306 F533 bookmark-slash
diff --git a/bin/nerdfont/src/glyphs/octicons/octicons.ttf b/bin/nerdfont/src/glyphs/octicons/octicons.ttf
new file mode 100644
index 0000000..1ed38ae
Binary files /dev/null and b/bin/nerdfont/src/glyphs/octicons/octicons.ttf differ
diff --git a/bin/nerdfont/src/glyphs/original-source.otf b/bin/nerdfont/src/glyphs/original-source.otf
new file mode 100644
index 0000000..2838fa9
Binary files /dev/null and b/bin/nerdfont/src/glyphs/original-source.otf differ
diff --git a/bin/nerdfont/src/glyphs/pomicons/LICENSE b/bin/nerdfont/src/glyphs/pomicons/LICENSE
new file mode 100644
index 0000000..5dd70fa
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/pomicons/LICENSE
@@ -0,0 +1,94 @@
+Copyright (c) 2021, Gabriele Lana gabriele.lana@gmail.com
+with Reserved Font Name Pomicons.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded, 
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/bin/nerdfont/src/glyphs/pomicons/Pomicons.otf b/bin/nerdfont/src/glyphs/pomicons/Pomicons.otf
new file mode 100644
index 0000000..c19a396
Binary files /dev/null and b/bin/nerdfont/src/glyphs/pomicons/Pomicons.otf differ
diff --git a/bin/nerdfont/src/glyphs/pomicons/README.md b/bin/nerdfont/src/glyphs/pomicons/README.md
new file mode 100644
index 0000000..c59ef20
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/pomicons/README.md
@@ -0,0 +1,5 @@
+# Pomicons
+
+For more information have a look at the upstream website: https://github.com/gabrielelana/pomicons
+
+Version: 1.001
diff --git a/bin/nerdfont/src/glyphs/powerline-extra/LICENSE b/bin/nerdfont/src/glyphs/powerline-extra/LICENSE
new file mode 100644
index 0000000..c71d827
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/powerline-extra/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Ryan L McIntyre
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/bin/nerdfont/src/glyphs/powerline-extra/PowerlineExtraSymbols.otf b/bin/nerdfont/src/glyphs/powerline-extra/PowerlineExtraSymbols.otf
new file mode 100644
index 0000000..b1477fe
Binary files /dev/null and b/bin/nerdfont/src/glyphs/powerline-extra/PowerlineExtraSymbols.otf differ
diff --git a/bin/nerdfont/src/glyphs/powerline-extra/README.md b/bin/nerdfont/src/glyphs/powerline-extra/README.md
new file mode 100644
index 0000000..3a50b03
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/powerline-extra/README.md
@@ -0,0 +1,16 @@
+# Powerline Extra
+
+For more information have a look at the upstream website: https://github.com/ryanoasis/powerline-extra-symbols
+
+Version: 1.000 (from about 2016)
+
+## Source modified
+
+* Add missing Ice Waveform Mirrored glyph (0xE0CA)
+* Add Trigraph Heaven glyph (0x2630)
+* Simplify Waveform glyphs (0xE0C8, 0xE0CA)
+* Glyph 0xE0B4 and 0xE0B6 got an additional 7% strip on their straight side.
+* Add inverse triangular glyphs at 0xE0D6 and 0xE0D7
+* Change version of font to 1.100
+
+Version: 1.100 (our version)
diff --git a/bin/nerdfont/src/glyphs/powerline-symbols/LICENSE.txt b/bin/nerdfont/src/glyphs/powerline-symbols/LICENSE.txt
new file mode 100644
index 0000000..23b2ab2
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/powerline-symbols/LICENSE.txt
@@ -0,0 +1,21 @@
+Copyright 2013 Kim Silkebækken and other contributors
+https://github.com/powerline/powerline
+
+Permission is hereby granted, free of charge, to any person obtaining 
+a copy of this software and associated documentation files (the 
+"Software"), to deal in the Software without restriction, including 
+without limitation the rights to use, copy, modify, merge, publish, 
+distribute, sublicense, and/or sell copies of the Software, and to 
+permit persons to whom the Software is furnished to do so, subject to 
+the following conditions:
+
+The above copyright notice and this permission notice shall be 
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/bin/nerdfont/src/glyphs/powerline-symbols/PowerlineSymbols.otf b/bin/nerdfont/src/glyphs/powerline-symbols/PowerlineSymbols.otf
new file mode 100644
index 0000000..bdc6934
Binary files /dev/null and b/bin/nerdfont/src/glyphs/powerline-symbols/PowerlineSymbols.otf differ
diff --git a/bin/nerdfont/src/glyphs/powerline-symbols/README.md b/bin/nerdfont/src/glyphs/powerline-symbols/README.md
new file mode 100644
index 0000000..858e124
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/powerline-symbols/README.md
@@ -0,0 +1,9 @@
+# Powerline Symbols
+
+For more information have a look at the upstream website: https://github.com/powerline/powerline
+
+## Source modified
+
+* Glyph 0xE0B0 and 0xE0B2 got an additional 7% strip on their straight side.
+
+Version: 1.000 (from about 2013)
diff --git a/bin/nerdfont/src/glyphs/weather-icons/OFL-FAQ.txt b/bin/nerdfont/src/glyphs/weather-icons/OFL-FAQ.txt
new file mode 100644
index 0000000..526fba9
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/weather-icons/OFL-FAQ.txt
@@ -0,0 +1,436 @@
+OFL FAQ - Frequently Asked Questions about the SIL Open Font License (OFL)
+Version 1.1-update6 - December 2020
+The OFL FAQ is copyright (c) 2005-2020 SIL International.
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+(See http://scripts.sil.org/OFL for updates)
+
+
+CONTENTS OF THIS FAQ
+1  USING AND DISTRIBUTING FONTS LICENSED UNDER THE OFL
+2  USING OFL FONTS FOR WEB PAGES AND ONLINE WEB FONT SERVICES
+3  MODIFYING OFL-LICENSED FONTS
+4  LICENSING YOUR ORIGINAL FONTS UNDER THE OFL
+5  CHOOSING RESERVED FONT NAMES
+6  ABOUT THE FONTLOG
+7  MAKING CONTRIBUTIONS TO OFL PROJECTS
+8  ABOUT THE LICENSE ITSELF
+9  ABOUT SIL INTERNATIONAL
+APPENDIX A - FONTLOG EXAMPLE
+
+1  USING AND DISTRIBUTING FONTS LICENSED UNDER THE OFL
+
+1.1  Can I use the fonts for a book or other print publication, to create logos or other graphics or even to manufacture objects based on their outlines?
+Yes. You are very welcome to do so. Authors of fonts released under the OFL allow you to use their font software as such for any kind of design work. No additional license or permission is required, unlike with some other licenses. Some examples of these uses are: logos, posters, business cards, stationery, video titling, signage, t-shirts, personalised fabric, 3D-printed/laser-cut shapes, sculptures, rubber stamps, cookie cutters and lead type.
+
+1.1.1  Does that restrict the license or distribution of that artwork?
+No. You remain the author and copyright holder of that newly derived graphic or object. You are simply using an open font in the design process. It is only when you redistribute, bundle or modify the font itself that other conditions of the license have to be respected (see below for more details).
+
+1.1.2  Is any kind of acknowledgement required?
+No. Font authors may appreciate being mentioned in your artwork's acknowledgements alongside the name of the font, possibly with a link to their website, but that is not required.
+
+1.2  Can the fonts be included with Free/Libre and Open Source Software collections such as GNU/Linux and BSD distributions and repositories?
+Yes! Fonts licensed under the OFL can be freely included alongside other software under FLOSS (Free/Libre and Open Source Software) licenses. Since fonts are typically aggregated with, not merged into, existing software, there is little need to be concerned about incompatibility with existing software licenses. You may also repackage the fonts and the accompanying components in a .rpm or .deb package (or other similar package formats or installers) and include them in distribution CD/DVDs and online repositories. (Also see section 5.9 about rebuilding from source.)
+
+1.3  I want to distribute the fonts with my program. Does this mean my program also has to be Free/Libre and Open Source Software?
+No. Only the portions based on the Font Software are required to be released under the OFL. The intent of the license is to allow aggregation or bundling with software under restricted licensing as well.
+
+1.4  Can I sell a software package that includes these fonts?
+Yes, you can do this with both the Original Version and a Modified Version of the fonts. Examples of bundling made possible by the OFL would include: word processors, design and publishing applications, training and educational software, games and entertainment software, mobile device applications, etc.
+
+1.5  Can I include the fonts on a CD of freeware or commercial fonts?
+Yes, as long some other font or software is also on the disk, so the OFL font is not sold by itself.
+
+1.6  Why won't the OFL let me sell the fonts alone?
+The intent is to keep people from making money by simply redistributing the fonts. The only people who ought to profit directly from the fonts should be the original authors, and those authors have kindly given up potential direct income to distribute their fonts under the OFL. Please honour and respect their contribution!
+
+1.7  What about sharing OFL fonts with friends on a CD, DVD or USB stick?
+You are very welcome to share open fonts with friends, family and colleagues through removable media. Just remember to include the full font package, including any copyright notices and licensing information as available in OFL.txt. In the case where you sell the font, it has to come bundled with software.
+
+1.8  Can I host the fonts on a web site for others to use?
+Yes, as long as you make the full font package available. In most cases it may be best to point users to the main site that distributes the Original Version so they always get the most recent stable and complete version. See also discussion of web fonts in Section 2.
+
+1.9  Can I host the fonts on a server for use over our internal network?
+Yes. If the fonts are transferred from the server to the client computer by means that allow them to be used even if the computer is no longer attached to the network, the full package (copyright notices, licensing information, etc.) should be included.
+
+1.10  Does the full OFL license text always need to accompany the font?
+The only situation in which an OFL font can be distributed without the text of the OFL (either in a separate file or in font metadata), is when a font is embedded in a document or bundled within a program. In the case of metadata included within a font, it is legally sufficient to include only a link to the text of the OFL on http://scripts.sil.org/OFL, but we strongly recommend against this. Most modern font formats include metadata fields that will accept the full OFL text, and full inclusion increases the likelihood that users will understand and properly apply the license.
+
+1.11  What do you mean by 'embedding'? How does that differ from other means of distribution?
+By 'embedding' we mean inclusion of the font in a document or file in a way that makes extraction (and redistribution) difficult or clearly discouraged. In many cases the names of embedded fonts might also not be obvious to those reading the document, the font data format might be altered, and only a subset of the font - only the glyphs required for the text - might be included. Any other means of delivering a font to another person is considered 'distribution', and needs to be accompanied by any copyright notices and licensing information available in OFL.txt.
+
+1.12  So can I embed OFL fonts in my document?
+Yes, either in full or a subset. The restrictions regarding font modification and redistribution do not apply, as the font is not intended for use outside the document.
+
+1.13  Does embedding alter the license of the document itself?
+No. Referencing or embedding an OFL font in any document does not change the license of the document itself. The requirement for fonts to remain under the OFL does not apply to any document created using the fonts and their derivatives. Similarly, creating any kind of graphic using a font under OFL does not make the resulting artwork subject to the OFL.
+
+1.14  If OFL fonts are extracted from a document in which they are embedded (such as a PDF file), what can be done with them? Is this a risk to author(s)?
+The few utilities that can extract fonts embedded in a PDF will typically output limited amounts of outlines - not a complete font. To create a working font from this method is much more difficult and time consuming than finding the source of the original OFL font. So there is little chance that an OFL font would be extracted and redistributed inappropriately through this method. Even so, copyright laws address any misrepresentation of authorship. All Font Software released under the OFL and marked as such by the author(s) is intended to remain under this license regardless of the distribution method, and cannot be redistributed under any other license. We strongly discourage any font extraction - we recommend directly using the font sources instead - but if you extract font outlines from a document, please be considerate: respect the work of the author(s) and the licensing model.
+
+1.15  What about distributing fonts with a document? Within a compressed folder structure? Is it distribution, bundling or embedding?
+Certain document formats may allow the inclusion of an unmodified font within their file structure which may consist of a compressed folder containing the various resources forming the document (such as pictures and thumbnails). Including fonts within such a structure is understood as being different from embedding but rather similar to bundling (or mere aggregation) which the license explicitly allows. In this case the font is conveyed unchanged whereas embedding a font usually transforms it from the original format. The OFL does not allow anyone to extract the font from such a structure to then redistribute it under another license. The explicit permission to redistribute and embed does not cancel the requirement for the Font Software to remain under the license chosen by its author(s). Even if the font travels inside the document as one of its assets, it should not lose its authorship information and licensing.
+
+1.16  What about ebooks shipping with open fonts?
+The requirements differ depending on whether the fonts are linked, embedded or distributed (bundled or aggregated). Some ebook formats use web technologies to do font linking via @font-face, others are designed for font embedding, some use fonts distributed with the document or reading software, and a few rely solely on the fonts already present on the target system. The license requirements depend on the type of inclusion as discussed in 1.15.
+
+1.17  Can Font Software released under the OFL be subject to URL-based access restrictions methods or DRM (Digital Rights Management) mechanisms?
+Yes, but these issues are out-of-scope for the OFL. The license itself neither encourages their use nor prohibits them since such mechanisms are not implemented in the components of the Font Software but through external software. Such restrictions are put in place for many different purposes corresponding to various usage scenarios. One common example is to limit potentially dangerous cross-site scripting attacks. However, in the spirit of libre/open fonts and unrestricted writing systems, we strongly encourage open sharing and reuse of OFL fonts, and the establishment of an environment where such restrictions are unnecessary. Note that whether you wish to use such mechanisms or you prefer not to, you must still abide by the rules set forth by the OFL when using fonts released by their authors under this license. Derivative fonts must be licensed under the OFL, even if they are part of a service for which you charge fees and/or for which access to source code is restricted. You may not sell the fonts on their own - they must be part of a larger software package, bundle or subscription plan. For example, even if the OFL font is distributed in a software package or via an online service using a DRM mechanism, the user would still have the right to extract that font, use, study, modify and redistribute it under the OFL.
+
+1.18  I've come across a font released under the OFL. How can I easily get more information about the Original Version? How can I know where it stands compared to the Original Version or other Modified Versions?
+Consult the copyright statement(s) in the license for ways to contact the original authors. Consult the FONTLOG (see section 6 for more details and examples) for information on how the font differs from the Original Version, and get in touch with the various contributors via the information in the acknowledgement section. Please consider using the Original Versions of the fonts whenever possible.
+
+1.19  What do you mean in condition 4 of the OFL's permissions and conditions? Can you provide examples of abusive promotion / endorsement / advertisement vs. normal acknowledgement?
+The intent is that the goodwill and reputation of the author(s) should not be used in a way that makes it sound like the original author(s) endorse or approve of a specific Modified Version or software bundle. For example, it would not be right to advertise a word processor by naming the author(s) in a listing of software features, or to promote a Modified Version on a web site by saying "designed by ...". However, it would be appropriate to acknowledge the author(s) if your software package has a list of people who deserve thanks. We realize that this can seem to be a grey area, but the standard used to judge an acknowledgement is that if the acknowledgement benefits the author(s) it is allowed, but if it primarily benefits other parties, or could reflect poorly on the author(s), then it is not.
+
+1.20 I'm writing a small app for mobile platforms, do I need to include the whole package? 
+If you bundle a font under the OFL with your mobile app you must comply with the terms of the license. At a minimum you must include the copyright statement, the license notice and the license text. A mention of this information in your About box or Changelog, with a link to where the font package is from, is good practice, and the extra space needed to carry these items is very small. You do not, however, need to include the full contents of the font package - only the fonts you use and the copyright and license that apply to them. For example, if you only use the regular weight in your app, you do not need to include the italic and bold versions.
+
+1.21 What about including OFL fonts by default in my firmware or dedicated operating system? 
+Many such systems are restricted and turned into appliances so that users cannot study or modify them. Using open fonts to increase quality and language coverage is a great idea, but you need to be aware that if there is a way for users to extract fonts you cannot legally prevent them from doing that. The fonts themselves, including any changes you make to them, must be distributed under the OFL even if your firmware has a more restrictive license. If you do transform the fonts and change their formats when you include them in your firmware you must respect any names reserved by the font authors via the RFN mechanism and pick your own font name. Alternatively if you directly add a font under the OFL to the font folder of your firmware without modifying or optimizing it you are simply bundling the font like with any other software collection, and do not need to make any further changes.
+
+1.22  Can I make and publish CMS themes or templates that use OFL fonts?  Can I include the fonts themselves in the themes or templates? Can I sell the whole package?
+Yes, you are very welcome to integrate open fonts into themes and templates for your preferred CMS and make them more widely available. Remember that you can only sell the fonts and your CMS add-on as part of a software bundle. (See 1.4 for details and examples about selling bundles).
+
+1.23  Can OFL fonts be included in services that deliver fonts to the desktop from remote repositories? Even if they contain both OFL and non-OFL fonts?
+Yes. Some foundries have set up services to deliver fonts to subscribers directly to desktops from their online repositories; similarly, plugins are available to preview and use fonts directly in your design tool or publishing suite. These services may mix open and restricted fonts in the same channel, however they should make a clear distinction between them to users. These services should also not hinder users (such as through DRM or obfuscation mechanisms) from extracting and using the OFL fonts in other environments, or continuing to use OFL fonts after subscription terms have ended, as those uses are specifically allowed by the OFL.
+
+1.24  Can services that provide or distribute OFL fonts restrict my use of them?
+No. The terms of use of such services cannot replace or restrict the terms of the OFL, as that would be the same as distributing the fonts under a different license, which is not allowed. You are still entitled to use, modify and redistribute them as the original authors have intended outside of the sole control of that particular distribution channel. Note, however, that the fonts provided by these services may differ from the Original Versions.
+
+
+2  USING OFL FONTS FOR WEBPAGES AND ONLINE WEB FONT SERVICES
+
+NOTE: This section often refers to a separate paper on 'Web Fonts & RFNs'. This is available at http://scripts.sil.org/OFL_web_fonts_and_RFNs
+
+2.1  Can I make webpages using these fonts?
+Yes! Go ahead! Using CSS (Cascading Style Sheets) is recommended. Your three best options are: 
+- referring directly in your stylesheet to open fonts which may be available on the user's system
+- providing links to download the full package of the font - either from your own website or from elsewhere - so users can install it themselves
+- using @font-face to distribute the font directly to browsers. This is recommended and explicitly allowed by the licensing model because it is distribution. The font file itself is distributed with other components of the webpage. It is not embedded in the webpage but referenced through a web address which will cause the browser to retrieve and use the corresponding font to render the webpage (see 1.11 and 1.15 for details related to embedding fonts into documents). As you take advantage of the @font-face cross-platform standard, be aware that web fonts are often tuned for a web environment and not intended for installation and use outside a browser. The reasons in favour of using web fonts are to allow design of dynamic text elements instead of static graphics, to make it easier for content to be localized and translated, indexed and searched, and all this with cross-platform open standards without depending on restricted extensions or plugins. You should check the CSS cascade (the order in which fonts are being called or delivered to your users) when testing.
+
+2.2  Can I make and use WOFF (Web Open Font Format) versions of OFL fonts?
+Yes, but you need to be careful. A change in font format normally is considered modification, and Reserved Font Names (RFNs) cannot be used. Because of the design of the WOFF format, however, it is possible to create a WOFF version that is not considered modification, and so would not require a name change. You are allowed to create, use and distribute a WOFF version of an OFL font without changing the font name, but only if:
+
+- the original font data remains unchanged except for WOFF compression, and
+- WOFF-specific metadata is either omitted altogether or present and includes, unaltered, the contents of all equivalent metadata in the original font.
+
+If the original font data or metadata is changed, or the WOFF-specific metadata is incomplete, the font must be considered a Modified Version, the OFL restrictions would apply and the name of the font must be changed: any RFNs cannot be used and copyright notices and licensing information must be included and cannot be deleted or modified. You must come up with a unique name - we recommend one corresponding to your domain or your particular web application. Be aware that only the original author(s) can use RFNs. This is to prevent collisions between a derivative tuned to your audience and the original upstream version and so to reduce confusion.
+
+Please note that most WOFF conversion tools and online services do not meet the two requirements listed above, and so their output must be considered a Modified Version. So be very careful and check to be sure that the tool or service you're using is compressing unchanged data and completely and accurately reflecting the original font metadata.
+
+2.3  What about other web font formats such as EOT/EOTLite/CWT/etc.?
+In most cases these formats alter the original font data more than WOFF, and do not completely support appropriate metadata, so their use must be considered modification and RFNs may not be used. However, there may be certain formats or usage scenarios that may allow the use of RFNs. See http://scripts.sil.org/OFL_web_fonts_and_RFNs 
+
+2.4  Can I make OFL fonts available through web font online services?
+Yes, you are welcome to include OFL fonts in online web font services as long as you properly meet all the conditions of the license. The origin and open status of the font should be clear among the other fonts you are hosting. Authorship, copyright notices and license information must be sufficiently visible to your users or subscribers so they know where the font comes from and the rights granted by the author(s). Make sure the font file contains the needed copyright notice(s) and licensing information in its metadata. Please double-check the accuracy of every field to prevent contradictory information. Other font formats, including EOT/EOTLite/CWT and superior alternatives like WOFF, already provide fields for this information. Remember that if you modify the font within your library or convert it to another format for any reason the OFL restrictions apply and you need to change the names accordingly. Please respect the author's wishes as expressed in the OFL and do not misrepresent original designers and their work. Don't lump quality open fonts together with dubious freeware or public domain fonts. Consider how you can best work with the original designers and foundries, support their efforts and generate goodwill that will benefit your service. (See 1.17 for details related to URL-based access restrictions methods or DRM mechanisms).
+
+2.5  Some web font formats and services provide ways of "optimizing" the font for a particular website or web application; is that allowed? 
+Yes, it is permitted, but remember that these optimized versions are Modified Versions and so must follow OFL requirements like appropriate renaming. Also you need to bear in mind the other important parameters beyond compression, speed and responsiveness: you need to consider the audience of your particular website or web application, as choosing some optimization parameters may turn out to be less than ideal for them. Subsetting by removing certain glyphs or features may seriously limit functionality of the font in various languages that your users expect. It may also introduce degradation of quality in the rendering or specific bugs on the various target platforms compared to the original font from upstream. In other words, remember that one person's optimized font may be another person's missing feature. Various advanced typographic features (OpenType, Graphite or AAT) are also available through CSS and may provide the desired effects without the need to modify the font.
+
+2.6  Is subsetting a web font considered modification?
+Yes. Removing any parts of the font when delivering a web font to a browser, including unused glyphs and smart font code, is considered modification. This is permitted by the OFL but would not normally allow the use of RFNs. Some newer subsetting technologies may be able to subset in a way that allows users to effectively have access to the complete font, including smart font behaviour. See 2.8 and http://scripts.sil.org/OFL_web_fonts_and_RFNs
+
+2.7  Are there any situations in which a modified web font could use RFNs?
+Yes. If a web font is optimized only in ways that preserve Functional Equivalence (see 2.8), then it may use RFNs, as it reasonably represents the Original Version and respects the intentions of the author(s) and the main purposes of the RFN mechanism (avoids collisions, protects authors, minimizes support, encourages derivatives). However this is technically very difficult and often impractical, so a much better scenario is for the web font service or provider to sign a separate agreement with the author(s) that allows the use of RFNs for Modified Versions.
+
+2.8  How do you know if an optimization to a web font preserves Functional Equivalence?
+Functional Equivalence is described in full in the 'Web fonts and RFNs' paper at http://scripts.sil.org/OFL_web_fonts_and_RFNs, in general, an optimized font is deemed to be Functionally Equivalent (FE) to the Original Version if it:
+
+- Supports the same full character inventory. If a character can be properly displayed using the Original Version, then that same character, encoded correctly on a web page, will display properly. 
+- Provides the same smart font behavior. Any dynamic shaping behavior that works with the Original Version should work when optimized, unless the browser or environment does not support it. There does not need to be guaranteed support in the client, but there should be no forced degradation of smart font or shaping behavior, such as the removal or obfuscation of OpenType, Graphite or AAT tables.
+- Presents text with no obvious degradation in visual quality. The lettershapes should be equally (or more) readable, within limits of the rendering platform.
+- Preserves original author, project and license metadata. At a minimum, this should include: Copyright and authorship; The license as stated in the Original Version, whether that is the full text of the OFL or a link to the web version; Any RFN declarations; Information already present in the font or documentation that points back to the Original Version, such as a link to the project or the author's website.
+
+If an optimized font meets these requirements, and so is considered to be FE, then it's very likely that the original author would feel that the optimized font is a good and reasonable equivalent. If it falls short of any of these requirements, the optimized font does not reasonably represent the Original Version, and so should be considered to be a Modified Version. Like other Modified Versions, it would not be allowed to use any RFNs and you simply need to pick your own font name.
+
+2.9  Isn't use of web fonts another form of embedding?
+No. Unlike embedded fonts in a PDF, web fonts are not an integrated part of the document itself. They are not specific to a single document and are often applied to thousands of documents around the world. The font data is not stored alongside the document data and often originates from a different location. The ease by which the web fonts used by a document may be identified and downloaded for desktop use demonstrates that they are philosophically and technically separate from the web pages that specify them. See http://scripts.sil.org/OFL_web_fonts_and_RFNs
+
+2.10  So would it be better to not use RFNs at all if you want your font to be distributed by a web fonts service?
+No. Although the OFL does not require authors to use RFNs, the RFN mechanism is an important part of the OFL model and completely compatible with web font services. If that web font service modifies the fonts, then the best solution is to sign a separate agreement for the use of any RFNs. It is perfectly valid for an author to not declare any RFNs, but before they do so they need to fully understand the benefits they are giving up, and the overall negative effect of allowing many different versions bearing the same name to be widely distributed. As a result, we don't generally recommend it.
+
+2.11  What should an agreement for the use of RFNs say? Are there any examples?
+There is no prescribed format for this agreement, as legal systems vary, and no recommended examples. Authors may wish to add specific clauses to further restrict use, require author review of Modified Versions, establish user support mechanisms or provide terms for ending the agreement. Such agreements are usually not public, and apply only to the main parties. However, it would be very beneficial for web font services to clearly state when they have established such agreements, so that the public understands clearly that their service is operating appropriately.
+
+See the separate paper on 'Web Fonts & RFNs' for in-depth discussion of issues related to the use of RFNs for web fonts. This is available at http://scripts.sil.org/OFL_web_fonts_and_RFNs
+
+
+3  MODIFYING OFL-LICENSED FONTS
+
+3.1  Can I change the fonts? Are there any limitations to what things I can and cannot change?
+You are allowed to change anything, as long as such changes do not violate the terms of the license. In other words, you are not allowed to remove the copyright statement(s) from the font, but you could put additional information into it that covers your contribution. See the placeholders in the OFL header template for recommendations on where to add your own statements. (Remember that, when authors have reserved names via the RFN mechanism, you need to change the internal names of the font to your own font name when making your modified version even if it is just a small change.)
+
+3.2  I have a font that needs a few extra glyphs - can I take them from an OFL licensed font and copy them into mine?
+Yes, but if you distribute that font to others it must be under the OFL, and include the information mentioned in condition 2 of the license.
+
+3.3  Can I charge people for my additional work? In other words, if I add a bunch of special glyphs or OpenType/Graphite/AAT code, can I sell the enhanced font?
+Not by itself. Derivative fonts must be released under the OFL and cannot be sold by themselves. It is permitted, however, to include them in a larger software package (such as text editors, office suites or operating systems), even if the larger package is sold. In that case, you are strongly encouraged, but not required, to also make that derived font easily and freely available outside of the larger package.
+
+3.4  Can I pay someone to enhance the fonts for my use and distribution?
+Yes. This is a good way to fund the further development of the fonts. Keep in mind, however, that if the font is distributed to others it must be under the OFL. You won't be able to recover your investment by exclusively selling the font, but you will be making a valuable contribution to the community. Please remember how you have benefited from the contributions of others.
+
+3.5  I need to make substantial revisions to the font to make it work with my program. It will be a lot of work, and a big investment, and I want to be sure that it can only be distributed with my program. Can I restrict its use?
+No. If you redistribute a Modified Version of the font it must be under the OFL. You may not restrict it in any way beyond what the OFL permits and requires. This is intended to ensure that all released improvements to the fonts become available to everyone. But you will likely get an edge over competitors by being the first to distribute a bundle with the enhancements. Again, please remember how you have benefited from the contributions of others.
+
+3.6  Do I have to make any derivative fonts (including extended source files, build scripts, documentation, etc.) publicly available?
+No, but please consider sharing your improvements with others. You may find that you receive in return more than what you gave.
+
+3.7  If a trademark is claimed in the OFL font, does that trademark need to remain in modified fonts?
+Yes. Any trademark notices must remain in any derivative fonts to respect trademark laws, but you may add any additional trademarks you claim, officially registered or not. For example if an OFL font called "Foo" contains a notice that "Foo is a trademark of Acme", then if you rename the font to "Bar" when creating a Modified Version, the new trademark notice could say "Foo is a trademark of Acme Inc. - Bar is a trademark of Roadrunner Technologies Ltd.". Trademarks work alongside the OFL and are not subject to the terms of the licensing agreement. The OFL does not grant any rights under trademark law. Bear in mind that trademark law varies from country to country and that there are no international trademark conventions as there are for copyright. You may need to significantly invest in registering and defending a trademark for it to remain valid in the countries you are interested in. This may be costly for an individual independent designer.
+
+3.8 If I commit changes to a font (or publish a branch in a DVCS) as part of a public open source software project, do I have to change the internal font names? 
+Only if there are declared RFNs. Making a public commit or publishing a public branch is effectively redistributing your modifications, so any change to the font will require that you do not use the RFNs. Even if there are no RFNs, it may be useful to change the name or add a suffix indicating that a particular version of the font is still in development and not released yet. This will clearly indicate to users and fellow designers that this particular font is not ready for release yet. See section 5 for more details.
+
+
+4  LICENSING YOUR ORIGINAL FONTS UNDER THE OFL
+
+4.1  Can I use the SIL OFL for my own fonts?
+Yes! We heartily encourage everyone to use the OFL to distribute their own original fonts. It is a carefully constructed license that allows great freedom along with enough artistic integrity protection for the work of the authors as well as clear rules for other contributors and those who redistribute the fonts. The licensing model is used successfully by various organisations, both for-profit and not-for-profit, to release fonts of varying levels of scope and complexity.
+
+4.2  What do I have to do to apply the OFL to my font?
+If you want to release your fonts under the OFL, we recommend you do the following:
+
+4.2.1  Put your copyright and Reserved Font Names information at the beginning of the main OFL.txt file in place of the dedicated placeholders (marked with the <> characters). Include this file in your release package.
+
+4.2.2  Put your copyright and the OFL text with your chosen Reserved Font Name(s) into your font files (the copyright and license fields). A link to the OFL text on the OFL web site is an acceptable (but not recommended) alternative. Also add this information to any other components (build scripts, glyph databases, documentation, test files, etc). Accurate metadata in your font files is beneficial to you as an increasing number of applications are exposing this information to the user. For example, clickable links can bring users back to your website and let them know about other work you have done or services you provide. Depending on the format of your fonts and sources, you can use template human-readable headers or machine-readable metadata. You should also double-check that there is no conflicting metadata in the font itself contradicting the license, such as the fstype bits in the os2 table or fields in the name table.
+
+4.2.3  Write an initial FONTLOG.txt for your font and include it in the release package (see Section 6 and Appendix A for details including a template).
+
+4.2.4  Include the relevant practical documentation on the license by adding the current OFL-FAQ.txt file in your package.
+
+4.2.5  If you wish you can use the OFL graphics (http://scripts.sil.org/OFL_logo) on your website. 
+
+4.3  Will you make my font OFL for me?
+We won't do the work for you. We can, however, try to answer your questions, unfortunately we do not have the resources to review and check your font packages for correct use of the OFL. We recommend you turn to designers, foundries or consulting companies with experience in doing open font design to provide this service to you. 
+
+4.4  Will you distribute my OFL font for me?
+No, although if the font is of sufficient quality and general interest we may include a link to it on our partial list of OFL fonts on the OFL web site. You may wish to consider other open font catalogs or hosting services, such as the Unifont Font Guide (http://unifont.org/fontguide), The League of Movable Type (http://theleagueofmovabletype.com) or the Open Font Library (http://openfontlibrary.org/), which despite the name has no direct relationship to the OFL or SIL. We do not endorse any particular catalog or hosting service - it is your responsibility to determine if the service is right for you and if it treats authors with fairness. 
+
+4.5  Why should I use the OFL for my fonts?
+- to meet needs for fonts that can be modified to support lesser-known languages
+- to provide a legal and clear way for people to respect your work but still use it (and reduce piracy)
+- to involve others in your font project
+- to enable your fonts to be expanded with new weights and improved writing system/language support
+- to allow more technical font developers to add features to your design (such as OpenType, Graphite or AAT support)
+- to renew the life of an old font lying on your hard drive with no business model
+- to allow your font to be included in Libre Software operating systems like Ubuntu
+- to give your font world status and wide, unrestricted distribution
+- to educate students about quality typeface and font design
+- to expand your test base and get more useful feedback 
+- to extend your reach to new markets when users see your metadata and go to your website
+- to get your font more easily into one of the web font online services
+- to attract attention for your commercial fonts
+- to make money through web font services
+- to make money by bundling fonts with applications
+- to make money adjusting and extending existing open fonts
+- to get a better chance that foundations/NGOs/charities/companies who commission fonts will pick you 
+- to be part of a sharing design and development community 
+- to give back and contribute to a growing body of font sources
+
+
+5  CHOOSING RESERVED FONT NAMES
+
+5.1  What are Reserved Font Names?
+These are font names, or portions of font names, that the author has chosen to reserve for use only with the Original Version of the font, or for Modified Version(s) created by the original author.
+
+5.2  Why can't I use the Reserved Font Names in my derivative font names? I'd like people to know where the design came from.
+The best way to acknowledge the source of the design is to thank the original authors and any other contributors in the files that are distributed with your revised font (although no acknowledgement is required). The FONTLOG is a natural place to do this. Reserved Font Names ensure that the only fonts that have the original names are the unmodified Original Versions. This allows designers to maintain artistic integrity while allowing collaboration to happen. It eliminates potential confusion and name conflicts. When choosing a name, be creative and avoid names that reuse almost all the same letters in the same order or sound like the original. It will help everyone if Original Versions and Modified Versions can easily be distinguished from one another and from other derivatives. Any substitution and matching mechanism is outside the scope of the license.
+
+5.3  What do you mean by "primary name as presented to the user"? Are you referring to the font menu name?
+Yes, this applies to the font menu name and other mechanisms that specify a font in a document. It would be fine, however, to keep a text reference to the original fonts in the description field, in your modified source file or in documentation provided alongside your derivative as long as no one could be confused that your modified source is the original. But you cannot use the Reserved Font Names in any way to identify the font to the user (unless the Copyright Holder(s) allow(s) it through a separate agreement). Users who install derivatives (Modified Versions) on their systems should not see any of the original Reserved Font Names in their font menus, for example. Again, this is to ensure that users are not confused and do not mistake one font for another and so expect features only another derivative or the Original Version can actually offer. 
+
+5.4  Am I not allowed to use any part of the Reserved Font Names?
+You may not use individual words from the Reserved Font Names, but you would be allowed to use parts of words, as long as you do not use any word from the Reserved Font Names entirely. We do not recommend using parts of words because of potential confusion, but it is allowed. For example, if "Foobar" was a Reserved Font Name, you would be allowed to use "Foo" or "bar", although we would not recommend it. Such an unfortunate choice would confuse the users of your fonts as well as make it harder for other designers to contribute.
+
+5.5  So what should I, as an author, identify as Reserved Font Names?
+Original authors are encouraged to name their fonts using clear, distinct names, and only declare the unique parts of the name as Reserved Font Names. For example, the author of a font called "Foobar Sans" would declare "Foobar" as a Reserved Font Name, but not "Sans", as that is a common typographical term, and may be a useful word to use in a derivative font name. Reserved Font Names should also be single words for simplicity and legibility. A font called "Flowing River" should have Reserved Font Names "Flowing" and "River", not "Flowing River". You also need to be very careful about reserving font names which are already linked to trademarks (whether registered or not) which you do not own.
+
+5.6  Do I, as an author, have to identify any Reserved Font Names?
+No. RFNs are optional and not required, but we encourage you to use them. This is primarily to avoid confusion between your work and Modified Versions. As an author you can release a font under the OFL and not declare any Reserved Font Names. There may be situations where you find that using no RFNs and letting your font be changed and modified - including any kind of modification - without having to change the original name is desirable. However you need to be fully aware of the consequences. There will be no direct way for end-users and other designers to distinguish your Original Version from many Modified Versions that may be created. You have to trust whoever is making the changes and the optimizations to not introduce problematic changes. The RFNs you choose for your own creation have value to you as an author because they allow you to maintain artistic integrity and keep some control over the distribution channel to your end-users. For discussion of RFNs and web fonts see section 2.
+
+5.7  Are any names (such as the main font name) reserved by default?
+No. That is a change to the license as of version 1.1. If you want any names to be Reserved Font Names, they must be specified after the copyright statement(s).
+
+5.8  Is there any situation in which I can use Reserved Font Names for a Modified Version?
+The Copyright Holder(s) can give certain trusted parties the right to use any of the Reserved Font Names through separate written agreements. For example, even if "Foobar" is a RFN, you could write up an agreement to give company "XYZ" the right to distribute a modified version with a name that includes "Foobar". This allows for freedom without confusion. The existence of such an agreement should be made as clear as possible to downstream users and designers in the distribution package and the relevant documentation. They need to know if they are a party to the agreement or not and what they are practically allowed to do or not even if all the details of the agreement are not public.
+
+5.9  Do font rebuilds require a name change? Do I have to change the name of the font when my packaging workflow includes a full rebuild from source?
+Yes, all rebuilds which change the font data and the smart code are Modified Versions and the requirements of the OFL apply: you need to respect what the Author(s) have chosen in terms of Reserved Font Names. However if a package (or installer) is simply a wrapper or a compressed structure around the final font - leaving them intact on the inside - then no name change is required. Please get in touch with the author(s) and copyright holder(s) to inquire about the presence of font sources beyond the final font file(s) and the recommended build path. That build path may very well be non-trivial and hard to reproduce accurately by the maintainer. If a full font build path is made available by the upstream author(s) please be aware that any regressions and changes you may introduce when doing a rebuild for packaging purposes is your own responsibility as a package maintainer since you are effectively creating a separate branch. You should make it very clear to your users that your rebuilt version is not the canonical one from upstream.
+
+5.10  Can I add other Reserved Font Names when making a derivative font?
+Yes. List your additional Reserved Font Names after your additional copyright statement, as indicated with example placeholders at the top of the OFL.txt file. Be sure you do not remove any existing RFNs but only add your own. RFN statements should be placed next to the copyright statement of the relevant author as indicated in the OFL.txt template to make them visible to designers wishing to make their separate version.
+
+
+6  ABOUT THE FONTLOG
+
+6.1  What is this FONTLOG thing exactly?
+It has three purposes: 1) to provide basic information on the font to users and other designers and developers, 2) to document changes that have been made to the font or accompanying files, either by the original authors or others, and 3) to provide a place to acknowledge authors and other contributors. Please use it!
+
+6.2  Is the FONTLOG required?
+It is not a requirement of the license, but we strongly recommend you have one.
+
+6.3  Am I required to update the FONTLOG when making Modified Versions?
+No, but users, designers and other developers might get very frustrated with you if you don't. People need to know how derivative fonts differ from the original, and how to take advantage of the changes, or build on them. There are utilities that can help create and maintain a FONTLOG, such as the FONTLOG support in FontForge.
+
+6.4  What should the FONTLOG look like?
+It is typically a separate text file (FONTLOG.txt), but can take other formats. It commonly includes these four sections:
+
+- brief header describing the FONTLOG itself and name of the font family
+- Basic Font Information - description of the font family, purpose and breadth
+- ChangeLog - chronological listing of changes
+- Acknowledgements - list of authors and contributors with contact information
+
+It could also include other sections, such as: where to find documentation, how to make contributions, information on contributing organizations, source code details, and a short design guide. See Appendix A for an example FONTLOG.
+
+
+7  MAKING CONTRIBUTIONS TO OFL PROJECTS
+
+7.1  Can I contribute work to OFL projects?
+In many cases, yes. It is common for OFL fonts to be developed by a team of people who welcome contributions from the wider community. Contact the original authors for specific information on how to participate in their projects.
+
+7.2  Why should I contribute my changes back to the original authors?
+It would benefit many people if you contributed back in response to what you've received. Your contributions and improvements to the fonts and other components could be a tremendous help and would encourage others to contribute as well and 'give back'. You will then benefit from other people's contributions as well. Sometimes maintaining your own separate version takes more effort than merging back with the original. Be aware that any contributions, however, must be either your own original creation or work that you own, and you may be asked to affirm that clearly when you contribute.
+
+7.3  I've made some very nice improvements to the font. Will you consider adopting them and putting them into future Original Versions?
+Most authors would be very happy to receive such contributions. Keep in mind that it is unlikely that they would want to incorporate major changes that would require additional work on their end. Any contributions would likely need to be made for all the fonts in a family and match the overall design and style. Authors are encouraged to include a guide to the design with the fonts. It would also help to have contributions submitted as patches or clearly marked changes - the use of smart source revision control systems like subversion, mercurial, git or bzr is a good idea. Please follow the recommendations given by the author(s) in terms of preferred source formats and configuration parameters for sending contributions. If this is not indicated in a FONTLOG or other documentation of the font, consider asking them directly. Examples of useful contributions are bug fixes, additional glyphs, stylistic alternates (and the smart font code to access them) or improved hinting. Keep in mind that some kinds of changes (esp. hinting) may be technically difficult to integrate.
+
+7.4  How can I financially support the development of OFL fonts?
+It is likely that most authors of OFL fonts would accept financial contributions - contact them for instructions on how to do this. Such contributions would support future development. You can also pay for others to enhance the fonts and contribute the results back to the original authors for inclusion in the Original Version.
+
+
+8  ABOUT THE LICENSE ITSELF
+
+8.1  I see that this is version 1.1 of the license. Will there be later changes?
+Version 1.1 is the first minor revision of the OFL. We are confident that version 1.1 will meet most needs, but are open to future improvements. Any revisions would be for future font releases, and previously existing licenses would remain in effect. No retroactive changes are possible, although the Copyright Holder(s) can re-release the font under a revised OFL. All versions will be available on our web site: http://scripts.sil.org/OFL.
+
+8.2  Does this license restrict the rights of the Copyright Holder(s)?
+No. The Copyright Holder(s) still retain(s) all the rights to their creation; they are only releasing a portion of it for use in a specific way. For example, the Copyright Holder(s) may choose to release a 'basic' version of their font under the OFL, but sell a restricted 'enhanced' version under a different license. They may also choose to release the same font under both the OFL and some other license. Only the Copyright Holder(s) can do this, and doing so does not change the terms of the OFL as it applies to that font.
+
+8.3  Is the OFL a contract or a license?
+The OFL is a worldwide license based on international copyright agreements and conventions. It is not a contract and so does not require you to sign it to have legal validity. By using, modifying and redistributing components under the OFL you indicate that you accept the license.
+
+8.4  I really like the terms of the OFL, but want to change it a little. Am I allowed to take ideas and actual wording from the OFL and put them into my own custom license for distributing my fonts?
+We strongly recommend against creating your very own unique open licensing model. Using a modified or derivative license will likely cut you off - along with the font(s) under that license - from the community of designers using the OFL, potentially expose you and your users to legal liabilities, and possibly put your work and rights at risk. The OFL went though a community and legal review process that took years of effort, and that review is only applicable to an unmodified OFL. The text of the OFL has been written by SIL (with review and consultation from the community) and is copyright (c) 2005-2017 SIL International. You may re-use the ideas and wording (in part, not in whole) in another non-proprietary license provided that you call your license by another unambiguous name, that you do not use the preamble, that you do not mention SIL and that you clearly present your license as different from the OFL so as not to cause confusion by being too similar to the original. If you feel the OFL does not meet your needs for an open license, please contact us.
+
+8.5  Can I quote from the OFL FAQ?
+Yes, SIL gives permission to quote from the OFL FAQ (OFL-FAQ.txt), in whole or in part, provided that the quoted text is:
+
+- unmodified,
+- used to help explain the intent of the OFL, rather than cause misunderstanding, and
+- accompanied with the following attribution: "From the OFL FAQ (OFL-FAQ.txt), copyright (c) 2005-2020 SIL International. Used by permission. http://scripts.sil.org/OFL-FAQ_web".
+
+8.6  Can I translate the license and the FAQ into other languages?
+SIL certainly recognises the need for people who are not familiar with English to be able to understand the OFL and its use. Making the license very clear and readable has been a key goal for the OFL, but we know that people understand their own language best.
+
+If you are an experienced translator, you are very welcome to translate the OFL and OFL-FAQ so that designers and users in your language community can understand the license better. But only the original English version of the license has legal value and has been approved by the community. Translations do not count as legal substitutes and should only serve as a way to explain the original license. SIL - as the author and steward of the license for the community at large - does not approve any translation of the OFL as legally valid because even small translation ambiguities could be abused and create problems.
+
+SIL gives permission to publish unofficial translations into other languages provided that they comply with the following guidelines:
+
+- Put the following disclaimer in both English and the target language stating clearly that the translation is unofficial:
+
+"This is an unofficial translation of the SIL Open Font License into <language_name>. It was not published by SIL International, and does not legally state the distribution terms for fonts that use the OFL. A release under the OFL is only valid when using the original English text. However, we recognize that this unofficial translation will help users and designers not familiar with English to better understand and use the OFL. We encourage designers who consider releasing their creation under the OFL to read the OFL-FAQ in their own language if it is available. Please go to http://scripts.sil.org/OFL for the official version of the license and the accompanying OFL-FAQ."
+
+- Keep your unofficial translation current and update it at our request if needed, for example if there is any ambiguity which could lead to confusion.  
+
+If you start such a unofficial translation effort of the OFL and OFL-FAQ please let us know.
+
+8.7 Does the OFL have an explicit expiration term?
+No, the implicit intent of the OFL is that the permissions granted are perpetual and irrevocable. 
+
+
+9  ABOUT SIL INTERNATIONAL
+
+9.1  Who is SIL International and what do they do?
+SIL serves language communities worldwide, building their capacity for sustainable language development, by means of research, translation, training and materials development. SIL makes its services available to all without regard to religious belief, political ideology, gender, race, or ethnic background. SIL's members and volunteers share a Christian commitment.
+
+9.2  What does this have to do with font licensing?
+The ability to read, write, type and publish in one's own language is one of the most critical needs for millions of people around the world. This requires fonts that are widely available and support lesser-known languages. SIL develops - and encourages others to develop - a complete stack of writing systems implementation components available under open licenses. This open stack includes input methods, smart fonts, smart rendering libraries and smart applications. There has been a need for a common open license that is specifically applicable to fonts and related software (a crucial component of this stack), so SIL developed the SIL Open Font License with the help of the Free/Libre and Open Source Software community.
+
+9.3  How can I contact SIL?
+Our main web site is: http://www.sil.org/
+Our site about complex scripts is: http://scripts.sil.org/
+Information about this license (and contact information) is at: http://scripts.sil.org/OFL
+
+
+APPENDIX A - FONTLOG EXAMPLE
+
+Here is an example of the recommended format for a FONTLOG, although other formats are allowed.
+
+-----
+FONTLOG for the GlobalFontFamily fonts
+
+This file provides detailed information on the GlobalFontFamily Font Software. This information should be distributed along with the GlobalFontFamily fonts and any derivative works.
+
+Basic Font Information
+
+GlobalFontFamily is a Unicode typeface family that supports all languages that use the Latin script and its variants, and could be expanded to support other scripts.
+
+NewWorldFontFamily is based on the GlobalFontFamily and also supports Greek, Hebrew, Cyrillic and Armenian.
+
+More specifically, this release supports the following Unicode ranges...
+This release contains...
+Documentation can be found at...
+To contribute to the project...
+
+ChangeLog
+
+10 December 2010 (Fred Foobar) GlobalFontFamily-devel version 1.4
+- fix new build and testing system (bug #123456)
+
+1 August 2008 (Tom Parker) GlobalFontFamily version 1.2.1
+- Tweaked the smart font code (Branch merged with trunk version)
+- Provided improved build and debugging environment for smart behaviours
+
+7 February 2007 (Pat Johnson) NewWorldFontFamily Version 1.3
+- Added Greek and Cyrillic glyphs
+
+7 March 2006 (Fred Foobar) NewWorldFontFamily Version 1.2
+- Tweaked contextual behaviours
+
+1 Feb 2005 (Jane Doe) NewWorldFontFamily Version 1.1
+- Improved build script performance and verbosity
+- Extended the smart code documentation
+- Corrected minor typos in the documentation
+- Fixed position of combining inverted breve below (U+032F)
+- Added OpenType/Graphite smart code for Armenian
+- Added Armenian glyphs (U+0531 -> U+0587) 
+- Released as "NewWorldFontFamily"
+
+1 Jan 2005 (Joe Smith) GlobalFontFamily Version 1.0
+- Initial release
+
+Acknowledgements
+
+If you make modifications be sure to add your name (N), email (E), web-address (if you have one) (W) and description (D). This list is in alphabetical order.
+
+N: Jane Doe
+E: jane@university.edu
+W: http://art.university.edu/projects/fonts
+D: Contributor - Armenian glyphs and code
+
+N: Fred Foobar
+E: fred@foobar.org
+W: http://foobar.org
+D: Contributor - misc Graphite fixes
+
+N: Pat Johnson
+E: pat@fontstudio.org
+W: http://pat.fontstudio.org
+D: Designer - Greek & Cyrillic glyphs based on Roman design
+
+N: Tom Parker
+E: tom@company.com
+W: http://www.company.com/tom/projects/fonts
+D: Engineer - original smart font code
+
+N: Joe Smith
+E: joe@fontstudio.org
+W: http://joe.fontstudio.org
+D: Designer - original Roman glyphs
+
+Fontstudio.org is an not-for-profit design group whose purpose is...
+Foobar.org is a distributed community of developers...
+Company.com is a small business who likes to support community designers...
+University.edu is a renowned educational institution with a strong design department...
+-----
+
diff --git a/bin/nerdfont/src/glyphs/weather-icons/OFL.txt b/bin/nerdfont/src/glyphs/weather-icons/OFL.txt
new file mode 100644
index 0000000..730c93a
--- /dev/null
+++ b/bin/nerdfont/src/glyphs/weather-icons/OFL.txt
@@ -0,0 +1,97 @@
+Copyright (c) <dates>, <Erik Flowers> (<URL|email>),
+with Reserved Font Name <Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>),
+with Reserved Font Name <additional Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>).
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded, 
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/bin/nerdfont/src/glyphs/weather-icons/weathericons-regular-webfont.ttf b/bin/nerdfont/src/glyphs/weather-icons/weathericons-regular-webfont.ttf
new file mode 100644
index 0000000..948f0a5
Binary files /dev/null and b/bin/nerdfont/src/glyphs/weather-icons/weathericons-regular-webfont.ttf differ
diff --git a/bin/nerdfont/version.txt b/bin/nerdfont/version.txt
new file mode 100644
index 0000000..8f2ecd3
--- /dev/null
+++ b/bin/nerdfont/version.txt
@@ -0,0 +1 @@
+3.2.1 nf fp
\ No newline at end of file
diff --git a/bin/ttfautohint.exe b/bin/ttfautohint.exe
new file mode 100644
index 0000000..0ee816d
Binary files /dev/null and b/bin/ttfautohint.exe differ
diff --git a/bin/ttfautohintGUI.exe b/bin/ttfautohintGUI.exe
new file mode 100644
index 0000000..59ff677
Binary files /dev/null and b/bin/ttfautohintGUI.exe differ