sistema_progs

Programas para customizar o meu entorno de traballo nos meus equipos persoais
Log | Files | Refs

commit 2fffc8fdee2934cddc1f3ec3261fddc8dff1a41f
parent 48301ac1e9b1742515e5d4a7b8217b481d018179
Author: x0tero <gxoelotero@gmail.com>
Date:   Wed, 11 Oct 2023 15:00:04 +0200

configuracion de plugins

Diffstat:
Annn-4.9/.circleci/config.yml | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/.github/FUNDING.yml | 3+++
Annn-4.9/.github/ISSUE_TEMPLATE/bug_report.md | 42++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/.github/ISSUE_TEMPLATE/config.yml | 4++++
Annn-4.9/.github/workflows/ci.yml | 48++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/.github/workflows/codeql.yml | 42++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/.github/workflows/lock.yml | 17+++++++++++++++++
Annn-4.9/.gitignore | 5+++++
Annn-4.9/CHANGELOG | 1154+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/LICENSE | 27+++++++++++++++++++++++++++
Annn-4.9/Makefile | 370+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/README.md | 165+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/.gitignore | 0
Annn-4.9/icons-in-terminal/LICENSE | 22++++++++++++++++++++++
Annn-4.9/icons-in-terminal/README.md | 152+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/build.sh | 17+++++++++++++++++
Annn-4.9/icons-in-terminal/build/icons-in-terminal.el | 3774+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/build/icons-in-terminal.h | 3736+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/build/icons-in-terminal.ttf | 0
Annn-4.9/icons-in-terminal/build/icons.fish | 3730+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/build/icons_bash.sh | 3730+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/build/icons_bash_export.sh | 3730+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/build/icons_bash_without_codepoint.sh | 3730+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/build/mapping.txt | 38++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/config.json | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/FiraCode-Regular-Symbol-map | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/FiraCode-Regular-Symbol.otf | 0
Annn-4.9/icons-in-terminal/fonts/FontAwesome-map | 786+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/FontAwesome.otf | 0
Annn-4.9/icons-in-terminal/fonts/Pomicons.ttf | 0
Annn-4.9/icons-in-terminal/fonts/PowerlineExtraSymbols-map | 38++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/PowerlineExtraSymbols.otf | 0
Annn-4.9/icons-in-terminal/fonts/devicons-map | 191+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/devicons.ttf | 0
Annn-4.9/icons-in-terminal/fonts/file-icons-map | 429+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/file-icons.ttf | 0
Annn-4.9/icons-in-terminal/fonts/font-linux-map | 28++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/font-linux.ttf | 0
Annn-4.9/icons-in-terminal/fonts/font-mfizz-map | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/font-mfizz.ttf | 0
Annn-4.9/icons-in-terminal/fonts/linea/linea-arrows-10-map | 136+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/linea/linea-arrows-10.ttf | 0
Annn-4.9/icons-in-terminal/fonts/linea/linea-basic-10-map | 135+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/linea/linea-basic-10.ttf | 0
Annn-4.9/icons-in-terminal/fonts/linea/linea-basic-elaboration-10-map | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/linea/linea-basic-elaboration-10.ttf | 0
Annn-4.9/icons-in-terminal/fonts/linea/linea-ecommerce-10-map | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/linea/linea-ecommerce-10.ttf | 0
Annn-4.9/icons-in-terminal/fonts/linea/linea-music-10-map | 30++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/linea/linea-music-10.ttf | 0
Annn-4.9/icons-in-terminal/fonts/linea/linea-software-10-map | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/linea/linea-software-10.ttf | 0
Annn-4.9/icons-in-terminal/fonts/linea/linea-weather-10-map | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/linea/linea-weather-10.ttf | 0
Annn-4.9/icons-in-terminal/fonts/material-design-icons.ttf | 0
Annn-4.9/icons-in-terminal/fonts/material-design-map | 932+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/myicons.ttf | 0
Annn-4.9/icons-in-terminal/fonts/octicons.ttf | 0
Annn-4.9/icons-in-terminal/fonts/weathericons-map | 596+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/fonts/weathericons.ttf | 0
Annn-4.9/icons-in-terminal/image/icons-fish.jpg | 0
Annn-4.9/icons-in-terminal/image/icons.jpg | 0
Annn-4.9/icons-in-terminal/image/ls.jpg | 0
Annn-4.9/icons-in-terminal/install-autodetect.sh | 37+++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/install.sh | 40++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/print_icons.sh | 31+++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/colors.sh | 18++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_console.sh | 13+++++++++++++
Annn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_gnometerminal.sh | 48++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_system.sh | 3+++
Annn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_terminator.sh | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/firacode.el | 138+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/generate_font.py | 191+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/generate_fontconfig.sh | 24++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/generate_fontconfig_autodetect.sh | 47+++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/inte_bash.sh | 26++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/inte_bash_export.sh | 26++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/inte_c_header.sh | 34++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/inte_emacs.sh | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/inte_fish.sh | 26++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/scripts/inte_without_codepoint.sh | 27+++++++++++++++++++++++++++
Annn-4.9/icons-in-terminal/uninstall.sh | 15+++++++++++++++
Annn-4.9/misc/CONTRIBUTING.md | 22++++++++++++++++++++++
Annn-4.9/misc/auto-completion/bash/nnn-completion.bash | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/auto-completion/fish/nnn.fish | 46++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/auto-completion/zsh/_nnn | 47+++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/desktop/nnn.desktop | 10++++++++++
Annn-4.9/misc/haiku/Makefile | 250+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/haiku/haiku_interop.h | 14++++++++++++++
Annn-4.9/misc/haiku/nm.cpp | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/haiku/nnn-master.recipe | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/haiku/nnn.rdef | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/logo/logo-128x128.png | 0
Annn-4.9/misc/logo/logo-64x64.png | 0
Annn-4.9/misc/logo/logo.svg | 302++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/macos-legacy/mach_gettime.c | 42++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/macos-legacy/mach_gettime.h | 28++++++++++++++++++++++++++++
Annn-4.9/misc/musl/musl-static-ubuntu.sh | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/natool/natool | 45+++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/packagecore/packagecore.yaml | 141+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/quitcd/quitcd.bash_sh_zsh | 30++++++++++++++++++++++++++++++
Annn-4.9/misc/quitcd/quitcd.csh | 17+++++++++++++++++
Annn-4.9/misc/quitcd/quitcd.elv | 41+++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/quitcd/quitcd.fish | 36++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/quitcd/quitcd.nu | 18++++++++++++++++++
Annn-4.9/misc/test/benchmark.sh | 37+++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/test/genfiles.sh | 8++++++++
Annn-4.9/misc/test/mktest.sh | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/misc/test/plot-bench.py | 20++++++++++++++++++++
Annn-4.9/nnn.1 | 619+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/notas.txt | 3+++
Annn-4.9/patches/README.md | 30++++++++++++++++++++++++++++++
Annn-4.9/patches/check-patches.sh | 29+++++++++++++++++++++++++++++
Annn-4.9/patches/colemak-dh/mainline.diff | 173+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/patches/colemak/mainline.diff | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/patches/gitstatus/mainline.diff | 223+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/patches/gitstatus/namefirst.diff | 226+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/patches/namefirst/mainline.diff | 222+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/patches/restorepreview/mainline.diff | 267+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/.cbcp | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/.iconlookup | 441+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/.nmv | 174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/.nnn-plugin-helper | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/.ntfy | 22++++++++++++++++++++++
Annn-4.9/plugins/README.md | 377+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/autojump | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/boom | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/bulknew | 32++++++++++++++++++++++++++++++++
Annn-4.9/plugins/cdpath | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/chksum | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/cmusq | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/diffs | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/dragdrop | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/dups | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/finder | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/fixname | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/fzcd | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/fzhist | 40++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/fzopen | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/fzplug | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/getplugs | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/gitroot | 15+++++++++++++++
Annn-4.9/plugins/gpgd | 28++++++++++++++++++++++++++++
Annn-4.9/plugins/gpge | 45+++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/gsconnect | 21+++++++++++++++++++++
Annn-4.9/plugins/gutenread | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/imgresize | 31+++++++++++++++++++++++++++++++
Annn-4.9/plugins/imgur | 597+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/imgview | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/ipinfo | 13+++++++++++++
Annn-4.9/plugins/kdeconnect | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/launch | 42++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/mimelist | 15+++++++++++++++
Annn-4.9/plugins/moclyrics | 40++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/mocq | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/mp3conv | 41+++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/mtpmount | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/nbak | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/nmount | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/nuke | 555+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/oldbigfile | 16++++++++++++++++
Annn-4.9/plugins/openall | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/organize | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/pdfread | 30++++++++++++++++++++++++++++++
Annn-4.9/plugins/preview-tabbed | 216+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/preview-tui | 491+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/pskill | 35+++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/renamer | 45+++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/ringtone | 36++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/rsynccp | 26++++++++++++++++++++++++++
Annn-4.9/plugins/splitjoin | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/suedit | 16++++++++++++++++
Annn-4.9/plugins/togglex | 21+++++++++++++++++++++
Annn-4.9/plugins/umounttree | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/upload | 45+++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/wallpaper | 37+++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/x2sel | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/plugins/xdgdefault | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/src/.clang-tidy | 15+++++++++++++++
Annn-4.9/src/dbg.h | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/src/icons-hash.c | 291++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/src/icons-in-terminal.h | 3736+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/src/icons.h | 445+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/src/nnn.c | 9020+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/src/nnn.h | 291++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Annn-4.9/src/qsort.h | 186+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mportatil/bashrc | 2+-
187 files changed, 52843 insertions(+), 1 deletion(-)

diff --git a/nnn-4.9/.circleci/config.yml b/nnn-4.9/.circleci/config.yml @@ -0,0 +1,121 @@ +version: 2 + +jobs: + compile: + docker: + - image: ubuntu:22.04 + working_directory: ~/nnn + environment: + CI_FORCE_TEST: 1 + steps: + - run: + command: | + apt update -qq + DEBIAN_FRONTEND="noninteractive" TZ="America/New_York" apt-get -y install tzdata + apt install -y --no-install-recommends software-properties-common wget gpg-agent shellcheck + apt install -y --no-install-recommends git make pkg-config libncurses-dev libreadline-dev + apt install -y --no-install-recommends gcc-9 gcc-10 gcc-11 gcc-12 + apt install -y --no-install-recommends clang-11 clang-12 clang-13 clang-14 clang-15 clang-tidy-15 + - checkout + - run: + command: | + export CFLAGS=-Werror + make clean + echo + echo "########## gcc-9 ##########" + CC=gcc-9 make strip + ls -l nnn + make clean + echo + echo "########## gcc-10 ##########" + CC=gcc-10 make strip + ls -l nnn + make clean + echo + echo "########## gcc-11 ##########" + CC=gcc-11 make strip + ls -l nnn + make clean + echo + echo "########## gcc-12 ##########" + CC=gcc-12 make strip + ls -l nnn + make clean + echo + echo "########## clang-11 ##########" + CC=clang-11 make strip + ls -l nnn + make clean + echo + echo "########## clang-12 ##########" + CC=clang-12 make strip + ls -l nnn + make clean + echo + echo "########## clang-13 ##########" + CC=clang-13 make strip + ls -l nnn + make clean + echo + echo "########## clang-14 ##########" + CC=clang-14 make strip + ls -l nnn + make clean + echo + echo "########## clang-tidy-15 ##########" + clang-tidy-15 src/* -- -I/usr/include -I/usr/include/ncursesw + echo "########## shellcheck ##########" + find plugins/ -type f -not -name "*.md" -exec shellcheck {} + + + package-and-publish: + machine: true + working_directory: ~/nnn + steps: + - checkout + - run: + name: "auto-generate packages" + command: | + # Create dist directory if it doesn't exist + mkdir ./dist + # Clean up + rm -rf ./dist/* + # Pack source + git archive -o ../${CIRCLE_PROJECT_REPONAME}-${CIRCLE_TAG}.tar.gz --format tar.gz --prefix=${CIRCLE_PROJECT_REPONAME}-${CIRCLE_TAG#v}/ ${CIRCLE_TAG} + # Use latest installed python3 from pyenv + export PYENV_VERSION="$(pyenv versions | grep -Po '\b3\.\d+\.\d+' | tail -1)" + #pip install packagecore + #packagecore -c misc/packagecore/packagecore.yaml -o ./dist/ ${CIRCLE_TAG#v} + # Move source pack to dist + mv ../${CIRCLE_PROJECT_REPONAME}-${CIRCLE_TAG}.tar.gz ./dist/ + + - run: + name: "publish to GitHub" + command: | + go install github.com/tcnksm/ghr@latest + ghr -t ${GITHUB_API_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -replace ${CIRCLE_TAG} ./dist/ + +workflows: + version: 2 + + circleci: + jobs: &all-tests + - compile + + nightly: + triggers: + - schedule: + cron: "0 0 * * 6" + filters: + branches: + only: + - master + jobs: *all-tests + + publish-github-release: + jobs: + - package-and-publish: + filters: + tags: + only: /^v.*/ + branches: + ignore: /.*/ diff --git a/nnn-4.9/.github/FUNDING.yml b/nnn-4.9/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: jarun diff --git a/nnn-4.9/.github/ISSUE_TEMPLATE/bug_report.md b/nnn-4.9/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,42 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' +--- + +`nnn` comes with excellent documentation (including a Troubleshooting section). If you have a _How to do x_ question, it may have already been answered. Wiki: https://github.com/jarun/nnn/wiki + +If it looks like a local environment issue, please try to debug yourself. Debugging local setup issues is not our top priority. + +If you are looking for a new feature or program option, ensure you have the correct version with the feature installed. Refer to the release notes to confirm. + +Before opening an issue, please try to reproduce on latest master. The bug you noticed might have already been fixed. + +Useful links: + +- compile `nnn` from source - https://github.com/jarun/nnn/wiki/Usage#from-source +- debugging `nnn` - https://github.com/jarun/nnn/wiki/Developer-guides#debugging-nnn + +If the issue can be reproduced on master, log it. + +Please provide the environment details. **If that's missing, the issue will be closed without any cited reason.** + +If we need more information and there is no communication from the bug reporter within 7 days from the date of request, we will close the issue. If you have relevant information, resume discussion any time. + +--- PLEASE DELETE THIS LINE AND EVERYTHING ABOVE --- + +#### Environment details (Put `x` in the checkbox along with the information) + +- [ ] Operating System: +- [ ] Desktop Environment: +- [ ] Terminal Emulator: +- [ ] Shell: +- [ ] Custom desktop opener (if applicable): +- [ ] Program options used: +- [ ] Configuration options set: +- [ ] Plugins are installed +- [ ] Issue exists on `nnn` master + +#### Exact steps to reproduce the issue diff --git a/nnn-4.9/.github/ISSUE_TEMPLATE/config.yml b/nnn-4.9/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,4 @@ +contact_links: + - name: Idea, Enhancement, Question, Support + url: https://github.com/jarun/nnn/discussions + about: If you have a question, need support or want to discuss new ideas then please open a discussion thread. diff --git a/nnn-4.9/.github/workflows/ci.yml b/nnn-4.9/.github/workflows/ci.yml @@ -0,0 +1,48 @@ +name: ci + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + macOS-gcc: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v2 + - name: Compile with gcc + env: + CC: gcc + run: | + export CFLAGS="$CFLAGS -Werror" + make clean + make + make clean + macOS-clang: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v2 + - name: Compile with clang + env: + CC: clang + run: | + # see: https://github.com/actions/setup-python/issues/577 + brew update || true + brew install llvm || true + brew link --overwrite python@3.11 + export PATH="/usr/local/opt/llvm/bin:$PATH" + export CFLAGS="$CFLAGS -Werror" + make clean + make + make clean + clang-tidy src/* -- -I/usr/include + ubuntu-patches: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Compile patches with gcc + env: + CC: gcc + run: | + make checkpatches diff --git a/nnn-4.9/.github/workflows/codeql.yml b/nnn-4.9/.github/workflows/codeql.yml @@ -0,0 +1,42 @@ +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + schedule: + - cron: "11 23 * * 3" + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ cpp, python ] + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + queries: +security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + if: ${{ matrix.language == 'cpp' || matrix.language == 'python' }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{ matrix.language }}" diff --git a/nnn-4.9/.github/workflows/lock.yml b/nnn-4.9/.github/workflows/lock.yml @@ -0,0 +1,17 @@ +name: 'Lock threads' + +on: + schedule: + - cron: '0 0 * * *' + +jobs: + lock: + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@v2 + with: + github-token: ${{ github.token }} + issue-lock-inactive-days: '30' + issue-lock-reason: '' + pr-lock-inactive-days: '30' + pr-lock-reason: '' diff --git a/nnn-4.9/.gitignore b/nnn-4.9/.gitignore @@ -0,0 +1,5 @@ +*.o +*.dSYM +nnn +src/icons-generated*.h +src/icons-hash-gen diff --git a/nnn-4.9/CHANGELOG b/nnn-4.9/CHANGELOG @@ -0,0 +1,1154 @@ +nnn v4.9 Elixir +2023-08-27 + +- config option `NNN_ARCHMNT` to specify archive mounter utility +- key <kbd>^y</kbd> to jump to next young file +- filter adjustment when opening context from plugin +- properly update mode after `chmod` +- pre-fill selected file name to create link if sel is preferred over hovered +- fix crash when `PWD` is empty +- make `quitcd.bash_zsh` POSIX-compliant +- `nmount` - support `udiskctl` as default +- `preview-tui` - support wezterm split size percentage +- `preview-tui` - move to bash for environment manipulation through arrays +- `fzopen` - handle empty selection +- `finder` - use default path to find +- add icons for `djvu` files +- support Nerd Fonts v3.0.0 and above (older versions are broken by v3.0.0) + +------------------------------------------------------------------------------- + +nnn v4.8 Spritz +2023-04-13 + +- show total size (key <kbd>S</kbd>) of non-filtered selection in a directory +- fix tilde (~) handling in file name +- plugin `.nmv` now respects `-u` flag +- env var `$NNN_PREFER_SELECTION` exported to all plugins +- support for wezterm in `preview-tui` +- create new file or directory (tree) on startup +- run command as plugin now supports exported variables +- use `"$nnn"` anywhere when running command as plugin +- set defaults for some prompts on <kbd>Enter</kbd> +- improve archive, rename and create new workflows +- optimize link creation +- allow overwriting regular files on new empty file creation +- add patch for colemak keyboard (existing renamed to colemak-dh) +- add correct check for Wayland in clipboard plugins +- add quitcd script for nushell +- plugin `kdeconnect` - send multiple files +- plugin `preview-tui`: add `chafa` as preferred image viewer, multiple fixes +- plugin `nmount` - misc. improvements +- add icon for jxl files + +------------------------------------------------------------------------------- + +nnn v4.7 Cuba libre +2022-11-24 + + +- fix <kbd>^N</kbd> not working sometimes (#1449) +- fix file remove confirmation prompt +- bring back `atool` as the default archive handler +- add option `-B` to use `bsdtar` as the archive utility +- find and list mode improvements + ntinue even if max paths/data size limit is exceeded + eed improvements + pport listing maximum 16K paths of 64 MiB of data +- key <kbd>J</kbd> to jump to an entry or relative offset from current entry +- prefill the hard link creation prompt when there's a single target (#1507) +- documented workaround for docker container crash (#1407, #1476) +- plugin `imgview`: handle arguments as strings (#1509) +- plugin `wallpaper`: support Wayland (#1512) +- plugin `upload`: handle selection using `ffsend` (#1523) +- add Rust icons (#1502) + +------------------------------------------------------------------------------- + +nnn v4.6 Absinthe +2022-07-26 + +- icon handling overhaul (#1432, #1436) + - better performance, memory usage and reduced binary size +- emoji support for supporting distros and terminals (#1346) +- open the target directory of symlinked bookmarks (#1353) +- enable show hidden when a hidden file is passed as argument +- add Colemak-DH layout keybinds to patch framework (#1421) +- set `bsdtar` as the default archive utility +- support 4 byte unicode keybinds (#1428) +- enable directory auto-enter during filter operation (`-A` to disable) +- enable filter prompt inside the bookmark/plugin dirs +- show volume usage information in help +- add new icon colors for mp4 and flac files +- use `stat -x` for file details on *BSD and macOS (#1389) +- interpret suffix `$nnn` when paging (#1355) +- disable key <kbd>e</kbd> (edit file) in explorer mode (#1394) +- fix double order chars on filter case match change +- `.cbcp`: more verbose message on paste without a selection +- plugin `preview-tui`: scale-up kitty previews +- plugin `preview-tui`: account for ueberzug offset +- plugin `preview-tui`: support `SPLIT_SIZE` for preview pane (#1431) +- plugin `autojump`: support z.lua +- new Makefile target `shellcheck` to verify plugins + +------------------------------------------------------------------------------- + +nnn v4.5 Cachaça +2022-04-26 + +- disable filter info if file details (option `-i`) enabled +- open previous active context on context quit +- switch <kbd>^J</kbd> and <kbd>+</kbd> functionality: + - <kbd>+</kbd>: toggle file selection + - <kbd>^J</kbd>: toggle auto-jump on file open +- allow symlink creation with name `@` to a single file (#1345) +- clear selection on successful operation at native prompt with "%j" (#1330) +- reverse timestamps of entries modified/created within 5 minutes +- avoid using non-portable `xargs` flags on macOS (#1299) +- quitcd script for Elvish shell > 0.17.0 (#1344) +- plugin `openall` to open selected files together (#1333) +- plugin `gitroot` to jump to git root directory from a subtree +- plugin `gsconnect` to send the selected files to Android using gsconnect +- icon for opus and webp files +- `preview-tui` - fix gif conversion and whitespace name +- `preview-tui` - add support for windows terminal split +- `preview-tui` - djvu file previews +- `nuke` - add support for `imv` when named _imv_ +- `gsconnect` - support connection to multiple devices +- export `NNN_INCLUDE_HIDDEN` to plugins (#1308) +- respect `NNN_TRASH` in `.nmv` (#1306) +- add GNU sed as a dependency with support for env var `SED` +- use bold `>` to point at current entry in detail mode +- add 2 spaces after icons for better visibility +- documentation refresh +- make option `O_NOSORT` to load directories unsorted on entry + +------------------------------------------------------------------------------- + +nnn v4.4 Tequila +2021-11-23 + +- support macOS iterm2 in plugin preview-tui (#1196) +- use selection at native command prompt with `%j` and `%J` + - docs - https://github.com/jarun/nnn/wiki/concepts#special-variables +- scroll strings longer than columns in rename/new prompts (#1213, #279) +- batch rename symlink targets in listing mode (#1214) +- option for recursive rename in plugin .nmv (#1186) +- more frequent checks for cancellation during du (#1236) +- picker mode: enable auto-proceed +- picker mode: don't pick hovered file on <kbd>Enter</kbd> if selection exists +- picker mode: fix issue in plugin `fzopen` when used to pick files +- send file to explorer FIFO on double left click instead of opening it +- new neovim plugin [nnn.nvim](https://github.com/luukvbaal/nnn.nvim) + - nvim-only, featuring explorer mode (`-F` flag) +- explorer mode for [nnn.vim](https://github.com/mcchrish/nnn.vim#explorer) +- remove option `-w`: always place HW cursor on current entry +- accept link name when linking a single target (#1201) +- option `-i` to show current file information in info bar +- force GNU sed on *BSD and Solaris +- add `nsxiv` support to nuke, preview-tabbed and imgview (#1230) +- fix preview-tui without `-a` (#1208) +- pass `pts` in env var for preview-tui to use in `tput` (#1235) +- disable editing file in picker mode (#1183) +- save session in picker mode (#1190) +- use nerd icons for gitstatus patch (#1220) + +------------------------------------------------------------------------------- + +nnn v4.3 Martini +2021-09-29 + +- cool ASCII art logo in the help screen +- add `bookmarks` directory for flexible symlinked bookmarks +- new key <kbd>B</kbd> to add a symlinked bookmark for current dir +- special variables `$dN`, `$fN` available for plugins/prompt/shell to access + dir/hovered file in each context +- config `NNN_ORDER` to set directory-specific ordering +- show/hide hidden files as per context state in plugin based batch rename +- retain search filter history for plugin `finder` +- sync multiple instances of `nnn` after operation on selection +- signal CWD change to terminal via OSC-7 (#1147) +- save complete per-context filter when saving sessions +- disable symlink resolution for paths in `NNN_BMS` and arg `PATH` +- do not end selection mode on running plugins/prompt/shell +- plugin `bookmarks` replaced by symlinked bookmarks support +- list open locations in active contexts in help page +- make option `O_MATCHFLTR` to discard filter key if no match +- configurable `NNN_TMPFILE` to _cd on quit_ +- disable auto marking directories (use <kbd>-</kbd>) +- picker mode improvements + - open tty for input if `STDIN` is non-tty + - truncate output file before writing + - do not double select a file on <kbd>Enter</kbd> +- legacy macOS (< 10.12.0) support +- no redraw during du calculation, show processed dir name +- plugin `xdgdefault`: add dmenu support +- user patch `restorepreview`: close/restore `preview-tui` for internal edits + +------------------------------------------------------------------------------- + +nnn v4.2 Mojito +2021-07-21 + +- `NNN_PLUG` indicator symbol interpretation has **changed**: + - `!` - _run-cmd-as-plugin_ (earlier `_`) + - `&` - _run-gui-cmd-as-plugin_ (earlier `|`) + - `|` (new) - page noninteractive _run-cmd-as-plugin_ output +- persistent selection markers (#1086) +- option _extract to..._ for archives +- mount remote and mount/extract archive to a smart context +- confirm file trashing to avoid accidental press of <kbd>x</kbd> (#1101) +- insert the last command executed at prompt on <kbd>Up</kbd> or <kbd>Down</kbd> +- insert the current file name at empty prompt on <kbd>TAB</kbd> +- handle redraw issue on missed `KEY_RESIZE` (#1067) +- add force-tty capability to spawn and set pagers to it (#1064) +- clear selection mode on deselecting last selected file (#1098) +- remove selected hovered entry from selection on deletion +- disable filtering in empty directories +- ignore last pressed filter character when no matches +- fix broken screen on resize while paging (#1072) +- fix archive not hovered on creation +- remove libgit2 dependency in `gitstatus` patch (#1095) +- add `-G` flag for `gitstatus` patch +- option `-X` for explorer (persistent picker) mode +- option `-F` decommissioned in favour of config `NNN_HELP` +- `-F` redefined to multiplex `NNN_FIFO` to preview or explore +- support paging noninterative _run-cmd-as-plugin_ output +- `nuke` - add option to execute binaries (#1111) +- plugin `fzopen` - call `open` on macOS, add option to use `nuke` +- plugin `fzcd` will not modify selection +- plugin `suedit` - preserve environment +- several `preview-tui` fixes +- plugin `wall` renamed to `wallpaper` +- remove plugin `fzz` - merged into plugin `autojump` +- remove plugin `upgrade` - packaging is on OBS now +- remove plugin `treeview` - needs minor `preview-tui` tweak +- remove plugin `picker` - `nnn -p -` does the same +- remove plugin `pdfview` - needs simple change in `pdfread` +- remove plugin `uidgid` - use program option `-U` +- remove plugins `mediainf`, `hexview` - simple one-liners + +------------------------------------------------------------------------------- + +nnn v4.1.1 Sake +2021-06-03 + +- fix segfault on session save (#1041) +- remove redundant `_Atomic` usage +- move [`patches`](../tree/master/patches) directory to top-level +- fix and cleanup gitstatus patch +- plugin `imgview` improvements (#1049) +- restore source-code packing on CircleCI +- add Makefile target to compile with musl + +------------------------------------------------------------------------------- + +nnn v4.1 +2021-06-02 + +- a patch management model for approved patches +- multi-threaded disk usage calculation using pthreads and FTS +- dynamic view update when calculating disk usage +- <kbd>Bksp</kbd>/<kbd>Del</kbd> at empty filter prompt to refresh dir +- Try to create new context with <kbd>Shift-TAB</kbd>, else reverse cycle +- <kbd>Alt+Esc</kbd> to quit context from filter prompt +- fix zombies left behind after running plugins (#999) +- named persistent sessions (mcchrish/nnn.vim#43) +- consider nanosecond resolution when sorting by time (#978) +- check external selection in `'c'urrent / 's'el` prompt (#976) +- show number of files selected in local selection buffer, if any +- `nnn` & picker plugin (e.g. `fzopen`) sync (mcchrish/nnn.vim#82) +- make batch rename interactive (#971) +- cached uid/gid for performance improvement +- fixes for `nnn` with `netbsd-curses`, `musl-fts`, `musl` (#998) +- script to statically compile `nnn` with `musl gcc` on Ubuntu +- restore hovered file when plugin is chosen from plugin dir +- support QuickLook on WSL in `preview-tui` (#959) +- toggle `preview-tui` with the same _custom_ plugin key +- smoother preview toggling in `preview-tui` (#966) +- `listen_on` should be set in kitty.conf for `preview-tui` (#970) +- minimal `bat` style in `preview-tui`, honors `$BAT_STYLE` +- plugin `preview-tui-ext` supersedes `preview-tui` (#1033) +- plugin `fzcd` can now fuzzy search multiple directories +- plugin `imgview` supersedes `imgthumb` and `vidthumb` +- plugin `umounttree`: unmount remote mntpoint from within +- plugin `xdgdefault`: set the default app for hovered file type +- plugin `fzplug`: fuzzy find, preview and run other plugins +- plugin `cmusq`: queue/play music in `cmus` +- plugin `mocplay` renamed to `mocq` +- plugin `cleanfilename` renamed to `fixname` +- go to last dir on <kbd>~</kbd> (HOME) or <kbd>`</kbd> (ROOT) key repeat +- ambiguous key <kbd>^Space</kbd> to select/clear range dropped (#998) +- user wiki page for [Themes](https://github.com/jarun/nnn/wiki/Themes) +- show selection mark (`+`) in reverse bold for improved visibility +- reverse block replaces `>` to mark hovered entry in detail mode +- make option `O_CKBOARD` removed +- make option `O_NOLOC` renamed to `O_NOLC` +- ignore `O_NOLC` if `O_ICONS` or `O_NERD` is specified (#1026) +- unicode arrow indicators if `O_ICONS` or `O_NERD` is specified +- make option `NOX11`: disable notis, sel-clipboard sync, xterm title +- retain filter in _nav-to-type_ mode after file open +- fix no files picked with `NNN_TMPFILE` exported and <kbd>q</kbd> to quit +- disable xterm title setting in picker mode (#974) + +------------------------------------------------------------------------------- + +nnn v4.0 Sushi +2021-04-13 + +- show xterm title on option `-x` + +------------------------------------------------------------------------------- + +nnn v3.7 +2021-04-13 + +- allow plugins to clear selection (#884, #889, #917) +- do not clear selection on hovered file deletion +- resurrect `'c'urrent/'s'el` prompt and option `-u` (#889) +- show only file name in reverse in detail mode +- more file/mime types supported in `preview-tui-ext` +- plugin `mtpmount` - (un)mount MTP devices +- plugin `cleanfilename` - more shell-friendly file names +- plugin `rsynccp` - copy-paste with visual progress +- replace `$HOME` by `~` in address bar +- show current path in terminal title (#911) +- total links and inode number of hardlink in statusbar +- fix symlink to text file not opening in CLI editor (#890) +- fix symlink size shown as 0B in statusbar (#888) +- show symlink target in statusbar (#893) +- show correct disk free/total on macOS (#888) +- fix directory disk usage showing as 0 on macOS (#941) +- fix name col len with `-C` and icons compiled-in (#936) +- refactor printing entries in light/detail modes (#934) +- make option `O_CKBOARD` for checker board as indicator + +------------------------------------------------------------------------------- + +nnn v3.6 Nina +2021-03-16 + +- REPL command prompt (<kbd>Esc</kbd> or <kbd>Enter</kbd> to exit) +- invert selection with <kbd>A</kbd> +- option `-u` removed (always prefer selection to hovered) +- visit start dir on <kbd>@</kbd> when start path is a file +- exit filter mode and redraw on <kbd>^L</kbd> if no last filter +- plugin `fzcd` now selects the chosen file (#876) +- `ueberzug` support in plugin `preview-tui` +- new plugin `preview-tui-ext` with extra preview support +- clear selection after successful plugin invocation +- add method to sync subshell `$PWD` in WIki +- clear selection on single file deletion (#812) +- copy between instances not working (#864) +- plugin `togglex` to toggle exe mode of a selection (#813) +- fix `memccpy()` buffer overlap fault on macOS (#786) +- show `0 selected` msg on cp/mv with empty selection (#855) +- fix frozen terminal caused by opener (#858) +- migrate macOS CI to GitHub workflows, retire Travis + +------------------------------------------------------------------------------- + +nnn v3.5 Freddie +2020-11-17 + +- compile-in Alexey Tourbin's QSORT macro +- support Nerd Font patched icons [`make O_NERD=1`] +- auto-generate static binaries with icons support +- audit and adapt all plugins for macOS +- enhance plugin `dups` to delete duplicates interactively +- plugin `autojump` now supports `jump` and `zoxide` +- support `gio trash` to Trash [`export NNN_TRASH=2`] (#740) +- quit program on double <kbd>Esc</kbd> in normal mode (#775) +- <kbd>^Space</kbd> replaces <kbd>^K</kbd> for range selection/clear selection +- show selection symbol (`+`) next to filename in detail mode (#741) +- error & quit on <kbd>Q</kbd> if no selection, else pick to stdout +- repeat <kbd>^T</kbd> to cycle sort by time, size and clear +- option `-U` to show user & group info in status bar +- option `-J` to disable auto-proceed on select (#713) +- option `-D` to show dirs in context color with `NNN_FCOLORS` +- honor option `-C` for context colors +- show indicators if more entries above/below listing (#744) +- show missing utility name in flash msg (#753) +- exit `preview-tabbed` on <kbd>^C</kbd> (#727) +- invoke GNU sed (_gsed_) on macOS (#728) +- fix HW cursor moves to wrong line (#735) +- fix rollover bug with multiline scroll (#743) +- fix input stream not listed with `-s`/`-S` (#777) +- fix locker not being invoked +- make target `upx` for additional binary compression +- compress auto-generated static binaries with upx +- make variable `O_NOSSN` to compile out sessions +- make variable `O_NOUG` to compile out user & group info + +------------------------------------------------------------------------------- + +nnn v3.4 Emilia +2020-08-18 + +- icons with icon-specific colors (thanks @KlzXS) +- enhanced `NNN_COLORS` with xterm 256 colors support +- new colorscheme with `NNN_FCOLORS` (file type specific colors) +- switch `-C` to force earlier colorscheme (dirs follow context color) +- updates for Haiku (thanks @CodeforEvolution) +- fix XFS navigation issue (thanks @ucs1) +- optimize archive extension matching on file open +- show location in context color +- support `host[:dir]` format for remote mounts +- clear selection after copy +- support traversal on file/dir creation +- show selection in reverse in status bar +- show status bar indicator `H` when hidden files are listed +- show and confirm archive command output +- support _cd on quit_ in picker mode + +------------------------------------------------------------------------------- + +nnn v3.3 +2020-07-14 + +- subdir `mounts` for remote and archive mounts +- remove mount point on successful unmount of remote/archive +- show error and prompt user if `cp`/`mv`/`rm` operation fails +- support absolute/relative paths in cp/mv as +- mark current path automatically on archive/remote mount +- mark current path automatically on target file visit in _find and list_ mode +- option `-C` to place HW cursor on hovered for screen readers and braille displays +- option `-u` to use selection (if available) and skip `current/sel` prompt +- key <kbd>Alt+Esc</kbd> to clear filter prompt and redraw +- support <kbd>Esc</kbd> to cancel remove operation +- `gpge` & `gpgd`: encrypt and decrypt with GPG +- `blknew`: create new files and directories in bulk +- `preview-tui` + - unified to support `tmux`/`kitty`/`xterm`/`$TERMINAL` + - auto-determine split orientation based on terminal height and width + - provision to use [`scope.sh`](https://github.com/ranger/ranger/blob/master/ranger/data/scope.sh) and [`pistol`](https://github.com/doronbehar/pistol) +- various other improvements +- `upload`: send to Firefox Send if [`ffsend`](https://github.com/timvisee/ffsend) is found +- `hexview`: add [`hx`](https://github.com/krpors/hx) as alternative hex viewer +- `nuke` and `imgview`: add [`imv`](https://github.com/eXeC64/imv) as alternative image viewer +- add find (with `fd`) and grep (with `rg`) examples in plugins doc +- key <kbd>Esc</kbd> or left click to resend hovered file path to `NNN_FIFO` +- show `+` instead of `s` in status bar on selection +- <kbd>F5</kbd> removed (misfit for toggle hidden), <kbd>^S</kbd> removed (often masked, redundant) +- handle abnormal program termination and remove NNN_PIPE and/or NNN_FIFO +- clear selection after successful batch rename, link creation +- make option `O_CTX8` for 8 contexts (NOT backward compatible with 4 contexts) +- fix issue with child window resize (see #656) +- fix issue with `NNNLVL` on macOS (see #639) +- fix issue with restoring session with du/au enabled + +------------------------------------------------------------------------------- + +nnn v3.2 +2020-05-26 + +- an official logo +- previews + - config `NNN_FIFO` to write hovered file paths a previewer can read + - plugin `preview-tabbed`: [tabbed](https://tools.suckless.org/tabbed)/xembed based file previewer + - plugin `preview-tui`: simple TUI file previewer in tmux/xterm + - plugin `preview-kitty`: preview using kitty terminal's capabilities + - [live preview](https://github.com/jarun/nnn/wiki/Live-previews) configuration example +- find & list + - send list of files from (cmd run as) plugin to `nnn` + - plugin `finder`: find/fd/fzf/grep/ripgrep/fzf (in subtree) and list in `nnn` + - <kbd>Right</kbd> or <kbd>l</kbd> on symlink in list dir takes to target file +- persistent session option `-S` [for disk usage, run `nnn -T d` (see help)] +- hover on the file when a file path is passed as positional argument +- go to first file or match with <kbd>'</kbd> (followed by <kbd>'</kbd> or <kbd>char</kbd>) +- config `NNN_SEL` to specify custom selection file +- config `NNN_LOCKER` to specify locker program +- dim file details in detail mode +- call `chdir()` on directory change +- option `-l`: number of lines to move on mouse scroll +- graphical [keybind map](https://github.com/jarun/nnn/wiki/Usage#graphical-map) +- let `NNN_COLORS` override `NO_COLOR` +- plugins + - option `-P`: run plugin by key at start + - run plugins with <kbd>Alt+key</kbd> + - allow `NNN_PIPE` usage by commands run as plugin + - input format to `NNN_PIPE`: `<ctxcode><opcode><data>` (see plugins doc) + - set `ctxcode` to `+` for smart context usage (next inactive, else current) + - `getplugs` to fetch plugins by installed version of `nnn` + - plugin `mimelist`: list files by mime type in subtree + - plugin `bookmarks`: named bookmarks using symlinks + - plugin `nbak`: backup `nnn` config + - `nuke` adds lowdown as alternative markdown viewer + - several plugin improvements +- fix broken screen on resize (see #520) +- fix broken version sort (see #550) +- fix list and pipe modes not working together +- fix multiple issues with listing files +- fix `@` shown in detail mode for symlink to dir +- fix listing files directly under `/` +- move to `-std=c11` + +------------------------------------------------------------------------------- + +nnn v3.1 +2020-04-13 + +- unlimited bookmarks and plugin keys +- status bar text in context color +- support config `NO_COLOR` to disable colors +- config `NNN_OPTS` to specify binary options to `nnn` +- config `NNN_MCLICK` to emulate configurable key +- toggle selection on right click +- ignore hard links when calculating disk usage +- dim (hard/sym) link names (symlink to file has `@`) +- more special keys at empty filter prompt in _type-to-nav_ +- key <kbd>></kbd> to export file list +- option `-F` to show fortune in help and settings screen +- option `-T` to specify sort order (obsoletes `-v`) +- option to clear sort order +- key <kbd>T</kbd> to change time type (access/change/mod) +- `.nmv` - internal fully-functional batch renamer plugin +- make var `O_NOBATCH` to disable native batch renamer +- `nuke` & `imgview` - open all images in directory sxiv +- `nuke` - open log files in vi +- plugin `x2sel` - system clipboard to selection copier +- plugin `fzy` - cd using z database +- plugin `fzopen` - support `FZF_DEFAULT_COMMAND` +- create new context on TAB without prompt +- hover and connect by dir name (within config dir) +- move to next entry on current file delete +- on single file copy/move, select the copied/moved file +- option `-f` to use readline history file (off by default) +- use `s` in status bar to indicate selection in progress +- make var `O_NOMOUSE` to disable mouse support +- do not store `NNN_TRASH` and `-Q` in config/session +- add sample .desktop file for XDG compatible DEs +- rename _nav-as-you-type_ to _type-to-nav_ mode +- fix PCRE case-insensitive regex search +- fix no error msg when filter length limit exceeded +- fix static package generation +- fix broken abort message when started in du-mode +- fix filter lost on context switch in non _type-to-nav_ mode +- fix broken readline prompt +- fix long strings treated as action keys in filter prompt +- fix `NNNLVL` not reset when spawned shell is exited + +------------------------------------------------------------------------------- + +nnn v3.0 +2020-02-12 + +- take list of files as input and show +- option `-e` replaces `NNN_USE_EDITOR` +- option `-t` replaces `NNN_IDLE_TIMEOUT` +- PCRE support +- more readline bindings for native prompts +- run GUI app as plugin +- attempt lazy unmount when regular unmount fails +- fix unmount on macOS: use `umount` +- detect `sshfs` and `rclone` to prompt intelligently +- auto-proceed on file open (toggle key <kbd>+</kbd>) +- quit with error code on <kbd>Q</kbd> +- additional key <kbd>F5</kbd> to toggle hidden +- key <kbd>e</kbd> to edit in EDITOR (back on multiple user requests) +- option to edit list of files in selection is changed to <kbd>E</kbd> +- do not end selection on redraw +- `nuke`: [`glow`](https://github.com/charmbracelet/glow) as Markdown viewer +- `nuke`: refactor, handle some common video types by extension +- file name removed from status bar +- static Makefile target +- generate, upload static package on release +- fix crash on entering empty dir, then Down +- fix keypresses lost when showing message +- fix #227: `nnn` creates xdg-open zombies + +------------------------------------------------------------------------------- + +nnn v2.9 +2020-01-15 + +- all keybinds and options reviewed by the team and frozen (see #422) + - reduced number of keybinds +- greatly improved help screen readability +- `nuke`: sample opener (CLI-only by default) and plugin +- fast line redraws instead of full screen refresh (thanks @annagrram) +- auto archive handling by extension (see config `NNN_ARCHIVE`) +- Lead key simplified to bookmark key (<kbd>b</kbd> or <kbd>^/</kbd>) +- single key to toggle order (<kbd>t</kbd> or <kbd>^T</kbd>) +- plugins + - `.cbcp`: copy selection to system clipboard (internal, program option `-x`) + - `.ntfy`: show noti on cp, mv, rm completion (internal, program option `-x`) + - `autojump`: navigate using autojump + - `upload`: paste text files to http://ix.io, upload rest to https://file.io + - all fuzzy plugins modified to support both `fzf` and `fzy` +- more control on plugins + - prefix `-` to skip directory refresh after running (cmd as) plugin + - suffix `*` to skip confirmation after running cmd as plugin +- indicate range selection mode with `*` +- list keys at bookmark and plugin key prompts +- visit to pinned dir like bookmarks (Bookmark key followed by <kbd>,</kbd>) +- toggle executable (key <kbd>*</kbd>) +- show mime along with file details +- more special keys at empty filter prompt: + - apply the last filter (<kbd>^L</kbd>) + - toggle between string and regex (<kbd>/</kbd>) + - toggle case-sensitivity (<kbd>:</kbd>) +- retain filter on <kbd>Esc</kbd>, <kbd>Up</kbd>, <kbd>Down</kbd> +- show filter details when filter is on +- remove option to run filter as cmd on prompt key (can be disruptive) +- program options + - option `-x`: enable notis and copy selection to system clipboard + - option `-g`: regex filters (string filter is default now) + - option `-Q`: quit program without confirmation + - option `-s`: load session + - option `-n`: start in nav-as-you-type mode + - option `-v`: version sort + - option `-V`: show program version + - option `-A`: disable dir auto-select +- ISO 8601 compliant date in status bar +- ported to Haiku OS (thanks @annagrram) +- sort only filtered entries (to avoid directory refresh) +- fix `getplugs` to install hidden files +- fix several selection issues (see #400) +- fix detail mode not restored on loading session +- fix symlink to directory not auto-selected +- fix regex error on partial regex patterns +- fix symlink not shown if `stat(2)` on target fails +- fix flags when spawning a CLI opener as default FM +- fix issue with stat flag on Sun (no support for `dirent.d_type`) +- fix current file in current context not saved correctly in session +- signed source distribution on release +- simplified debugging with line numbers in logs + +------------------------------------------------------------------------------- + +nnn v2.8.1 +2019-12-05 + +- Fix always archiving current file +- More elaborate docs on selection changes + +------------------------------------------------------------------------------- + +nnn v2.8 +2019-12-04 + +- sessions (thanks @annagrram) +- `rclone` support for remote access (mount _any_ cloud storage!!!) +- toggle selection with <kbd>Space</kbd> or <kbd>^J</kbd> +- ignore events during selection so the `+` symbol is not lost +- run custom (non-shell-interpreted) commands like plugins +- configure _cd-on-quit_ as the default behaviour +- create parent dirs for new files and dirs, duplicate a file/dir anywhere +- _copy/move as_ workflow (thanks @KlzXS) +- edit , flush selection buffer (thanks @KlzXS) +- support xargs with minimal options (as in BusyBox) (thanks @KlzXS) +- changed the key to size sort to <kbd>z</kbd> +- additional key <kbd>]</kbd> to show command prompt +- mount archives using `archivemount` +- smoother double click handling +- program option `-R` to disable rollover at edges +- keybind collision checker (for custom keybind config) (thanks @annagrram) +- show size of file in bytes in status bar in disk usage mode +- pass unresolved path as second argument (`$2`) to plugin +- mechanism for plugins to control active directory +- all binary questions are confirmed by <kbd>y</kbd> or <kbd>Y</kbd> +- plugins + - some plugins renamed + - integrated `shellcheck` in CI, POSIX-compliance fixes (thanks @koalaman) + - `getplugs` - detect modifications in exiting plugin file (thanks @KlzXS) + - `drag-file` & `drop-file`: drag & drop files using dragon + - `gutenread`: browse, download and read from Project Gutenberg + - `suedit` - edit file with superuser permissions + - `fzhist` - fuzzy select commands from history, edit and run + - `fzcd` - change to a fuzzy-searched directory + - `rename` - batch rename directory or selection using qmv or vidir + - `pskill` - fuzzy list a process or zombies by name and kill + - `exetoggle` - toggle executable status of hovered file + - `treeview` - informative tree output with file permissions and size + - `chksum` - recursively calculate checksum for files in hovered directory + - `fzopen` renamed to `fzopen` + - `imgsxiv` instructions added to browse and rename images +- create link to current file +- additional key <kbd>;</kbd> to execute plugin +- more explicit force removal message +- force non-detachable internal edits in $EDITOR (option `-E`) +- export current file as `$nnn` (instead of `$NN`) +- fix file open failure from browser when configured as default FM + +------------------------------------------------------------------------------- + +nnn v2.7 +2019-10-06 + +- plugins for image preview, image and video thumbnails +- redesigned selection workflow +- drop path prefix for files in current dir for selection based archives +- custom direct keybinds for plugins +- libreadline `.history` file moved to `nnn` config directory +- export current entry as `$NN` at command prompt +- more informative status bar in light/detail modes +- auto-proceed to next file on single file select +- path clipping for long paths +- completely revamped wiki +- new program options: + - `-a` to use file access time throughout the program + - `-c` to indicate cli-only opener + - `-f` to run filter as command on <kbd>^P</kbd> + - `-o` replaces config `NNN_RESTRICT_NAV_OPEN` + - `-t` replaces config `NNN_NO_AUTOSELECT` + - `-r` replaces config `NNN_OPS_PROG` +- plugin changes: + - `vidthumb` - show video thumbnails in terminal + - `mediainf` - show media info (decoupled as a plugin) + - `notes` - open a quick notes file/dir in `$EDITOR` (decoupled as a plugin) + - `dups` - list duplicate files in the current directory + - `oldbigfile` - list large files by access time + - `moclyrics` - show lyrics of the track currently playing in MOC + - `uidgid` list uid and gid of files in directory + - `mocplay` - now detects if a track is playing or not + - `organize` - categorize files and move to respective directories + - `pastebin` - now uses ix.io paste service + - `fzy-edit` - merged into `fzy-open` + - `viuimg` - fix directory view + - `checksum` - fixed POSIX compliance issues + - `boom` - play music in MOC +- keybind changes: + - select entry: <kbd>Space</kbd> and <kbd>^J</kbd> + - select range (or clear selection): <kbd>m</kbd> and <kbd>^K</kbd> + - select all in dir: <kbd>a</kbd> + - list selection: <kbd>M</kbd> + - <kbd>^N</kbd> replaces <kbd>^T</kbd> to toggle _nav-as-you-type_ + - <kbd>Shift TAB</kbd> to reverse context cycle + - <kbd>'</kbd> to jump to first file in dir + - <kbd>S</kbd> for du, <kbd>A</kbd> for apparent du + - additional key <kbd>:</kbd> to run plugin + - additional key <kbd>F2</kbd> to rename file + - additional key <kbd>F5</kbd> to redraw + - quit context key <kbd>Leadq</kbd> is removed +- Leader key combinations: + - <kbd>Lead'</kbd> to jump to first file in dir + - <kbd>Lead]</kbd> go to next active context + - <kbd>Lead[</kbd> go to prev active context + - <kbd>Lead.</kbd> toggle show hidden files +- improved duplicate file workflow +- improved batch rename workflow when a selection exists +- removed the wild load option (`-w`) +- removed quick notes (added plugin `notes`) +- fix #225 (thanks @KlzXS) +- fix `tar`/`bsdtar` always creating tar archives (and not by suffix) +- fix single mouse click to select file not working +- fix symlink to dir removed on batch rename +- fix detail mode not set with program option `-S` + +------------------------------------------------------------------------------- + +nnn v2.6 +2019-08-06 + +- new plugins + - view image or browse a directory of images in terminal + - show image thumbnails + - PDF and text file reader + - calculate and verify checksum of selection or file + - append (and play) selection/dir/file music in MOC + - variable bitrate mp3 ringtone generator + - split current file or join selection +- better experience on Termux (and touch based devices) + - mouse scrolling support (with ncursesw6.0 and above) + - tap/left click to visit parent, toggle nav-as-you-type mode +- light mode set as default +- show status bar and use reverse video in light mode +- changed program options + - `-d`: detail mode + - `-H`: show hidden files + - `-l` is retired +- support `XDG_CONFIG_HOME` +- support <kbd>/</kbd> as an additional Leader key when filter is on +- sort by file extension +- use zip/unzip/tar if atool/bsdtar not found +- support duplicate file (key <kbd>^R</kbd>, same as rename file) +- new config option `NNN_SSHFS_OPTS` to specify `sshfs` options +- restrict opening 0 byte files (`NNN_RESTRICT_0B` is obsolete) +- critical defects fixed + - fix #276 - crash with variable length inotify event handling + - fix #285 - hang after deleting/moving current directory + - fix #274 - a broken prompt on empty input with libreadline + - fix #304 - list selection from another instance +- `cmatrix` as locker fallback +- wait for user input after running a command from prompt +- scrolloff set to 3 from 5 + +------------------------------------------------------------------------------- + +nnn v2.5 +2019-05-27 + +- mouse support +- new location for config files - `~/.config/nnn` + - plugin dir location: `~/.config/nnn/plugins` + - selection file `.nnncp` is now `~/.config/nnn/.selection` +- plugins: + - pdfview: view a PDF in pager + - nmount: (un)mount a storage device + - ndiff: file and directory diff for selection + - hexview: view a file in hex + - imgresize: batch resize images to desktop resolution + - ipinfo: check your IP address and whois information + - transfer: upload a file to transfer.in + - pastebin: paste the contents of a text file to paste.ubuntu.com + - boom: play random music from a directory + - nwal: set an image as wallpaper using nitrogen + - pywal: set selected image as wallpaper, change terminal color scheme + - getplugs: update plugins +- SSHFS support +- support `bsdtar`, simplify `patool` integration +- native batch rename support (`vidir` dependency dropped) +- changes to support [configuration](https://github.com/jarun/nnn/wiki/nnn-as-default-file-manager) as the default file manager +- per-context detail/light mode +- case-insensitive version compare +- shortcut to visit `/` - <kbd>`</kbd> (backtick) +- vim-like scrolloff support +- <kbd>^D</kbd> & <kbd>^U</kbd>: scroll half page, <kbd>PgDn</kbd> & <kbd>PdUp</kbd>: scroll full page +- fix selection across contexts +- recognize <kbd>Home</kbd> and <kbd>End</kbd> keys at prompt for editing +- fix broken program option `-b` +- POSIX-compliant user-scripts (wherever possible) +- `NNN_SCRIPT` is retired (replaced by plugins) + +------------------------------------------------------------------------------- + +nnn v2.4 +2019-03-19 + +- FreeDesktop.org compliant trashing +- mark selected entries with `+` +- _wild_ mode (option `-w`, key <kbd>^W</kbd>) for _nav-as-you-type_ +- POSIX-compliant GUI app launcher with drop-down menu (key <kbd>=</kbd>) +- new scripts: + - upload image to imgur + - send selection to Android using kdeconnect-cli +- show permissions in detail mode +- cp, mv progress bar for Linux (needs advcpmv) [BSD, macOS shows on <kbd>^T</kbd>] +- make libreadline an optional dep (reduces memory usage) +- minimize the number of redraws +- handle screen resize gracefully +- option `-d` to show hidden files (`NNN_SHOW_HIDDEN` is removed) +- additional key <kbd>K</kbd> to toggle selection +- change visit start dir key to <kbd>@</kbd> +- option `-C` to disable colors removed +- per-context initial directory replaced by program start dir +- marker msg when spawning new shell removed +- rename debug file to `nnndbg` + +------------------------------------------------------------------------------- + +nnn v2.3 +2019-02-19 + +- file picker mode +- repo of user-contributed scripts +- substring search for filters (option `-s`) +- version sort (option `-n`) +- disk usage calculation abort with <kbd>^C</kbd> +- create sym/hard link(s) to files in selection +- archiving of selection +- show dir symlinks along with dirs in top +- fixed CJK character handling at prompts +- key `N` (1 <= N <= 4) to switch to context N +- bring back `NNN_OPENER` to specify file opener +- env var `NNN_NOTE` and keybind <kbd>^N</kbd> for quick notes +- handle multiple arguments in VISUAL/EDITOR +- show the current directory being scanned in `du` mode +- select all files (<kbd>Y</kbd>) +- show command prompt (<kbd>^P</kbd>) +- key <kbd>,</kbd> replaces <kbd>`</kbd> as alternative Leader Key +- keybind for visit pinned directory is now <kbd>^B</kbd> +- additional key <kbd>^V</kbd> to run or select custom script +- use libreadline for command prompt +- reduce delay on <kbd>Esc</kbd> press +- config option to avoid unexpected behaviour on 0-byte file open (see #187) +- rename config option `DISABLE_FILE_OPEN_ON_NAV` to `NNN_RESTRICT_NAV_OPEN` +- keys removed - <kbd>$</kbd>, <kbd>^</kbd>, <kbd>Backspace</kbd>, <kbd>^H</kbd>, <kbd>^P</kbd>, <kbd>^M</kbd>, <kbd>^W</kbd>, <kbd>`</kbd> + +------------------------------------------------------------------------------- + +nnn v2.2 +2019-01-01 + +What's in? +- (neo)vim plugin [nnn.vim](https://github.com/mcchrish/nnn.vim) +- macOS fixes + - Fix issues with file copy, move, remove + - Handle <kbd>Del</kbd> in rename prompt + - Pass correct `file` option to identify mime +- Support selection across directories and contexts +- Offer option `force` before file remove +- Keys <kbd>Tab</kbd>, <kbd>^I</kbd> to go to next active context +- Per-context directory color specified by `$NNN_CONTEXT_COLORS` + - Option `-c` is removed +- Option `-C` to disable colors +- Choose script to run from a script directory +- Run a command (or launch an application) +- Run file as executable (key <kbd>C</kbd>) +- Documentation on lftp integration for remote file transfers +- Support a _combined_ set of arguments to `$EDITOR`, `$PAGER` and `$SHELL` +- Handle > 2 GB files on 32-bit ARM +- Env var `$DISABLE_FILE_OPEN_ON_NAV` to disable file open on <kbd>Right</kbd> or <kbd>l</kbd> +- `NUL`-terminated file paths in selection list instead of `LF` +- Better support for Termux and Cygwin environments +- Remapped keys + - <kbd>^I</kbd> - go to next active context + - <kbd>^T</kbd> - toggle _navigate-as-you-type_ + +------------------------------------------------------------------------------- + +nnn v2.1 +2018-11-23 + +What's in? +- Inclusion in several distros including Arch Linux official repo +- Multiple contexts (_aka_ tabs _aka_ workspaces) [max 4] +- Copy, move, remove selected files, remove current file +- [Leader key](https://github.com/jarun/nnn#leader-key) (like vim) +- In-built GUI app launcher with up to 2 arguments (key <kbd>o</kbd>) +- List copy selection (key <kbd>y</kbd>) +- Env var `NNN_NO_AUTOSELECT` to disable dir auto-select +- Key <kbd>Esc</kbd> exits prompt, <kbd>^L</kbd> clears prompt +- Program runtime help revamped +- Static code analysis integration +- gcc-8 warnings fixed +- Remapped keys: + - <kbd>^W</kbd> - go to pinned dir + - <kbd>^X</kbd> - delete current entry + - <kbd>^Q</kbd> - quit program +- `nlay` is retired (functionality built into `nnn`) +- `chdir` prompt is retired +- Env var `NNN_NO_X` retired, selection now works out of the box +- Only single-char bookmark keys (to work with Leader key) + +------------------------------------------------------------------------------- + +nnn v2.0 +2018-10-19 + +What's in? +- Mode to show apparent size (key `S`) +- Script to integrate `patool` instead of `atool` +- Support `bashlock` (OS X) and `lock` (BSD) as terminal locker +- Symbol `@/` for symlink to dir +- Dependency on `libreadline` removed + +------------------------------------------------------------------------------- + +nnn v1.9 +2018-08-10 + +What's in? +- Support unlimited number of scripts +- Pass currently selected filename as first argument to custom scripts +- Support directory auto-select in _navigate-as-you-type_ mode +- Show selection name in archive name prompt +- Support Cygwin opener +- Better support on RHEL 25 with earlier version on curses +- Sample script for `fzy` integration +- Now available on OpenBSD +- Disabled package generation for Ubuntu 17.10 + +------------------------------------------------------------------------------- + +nnn v1.8 +2018-05-02 + +What's in? +- Run a custom script +- Archive selected file/directory +- Show number of cherry-picked files in multi-copy mode +- Env var `NNN_SHOW_HIDDEN` to show hidden files by default +- Additional information in help screen +- Give preference to env var VISUAL, if defined, over EDITOR +- New/changed/remapped shortcuts + - <kbd>^]</kbd> - spawn a new shell in current directory + - <kbd>r</kbd> - edit directory entries in vidir + - <kbd>R</kbd> - run a custom script + - <kbd>^I</kbd> - toggle navigate-as-you-type mode + - <kbd>L</kbd> - lock the current terminal (Linux-only) +- All Ctrl shortcuts enabled in navigate-as-you-type mode +- Fix: GUI programs closing when parent terminal is closed +- Recognize `~`, `-` and `&` at bookmark prompt +- Recognize ruby (.rb) files as text files +- Efficient integer-only file size calculation +- Official inclusion on openSUSE and Fedora +- Package generation for Ubuntu 18.04 + +------------------------------------------------------------------------------- + +nnn v1.7 +2018-02-28 + +What's in? +- Batch rename/move/delete files in vidir from [moreutils](https://joeyh.name/code/moreutils/) +- Copy multiple file paths +- Copy file paths when X is unavailable +- Optionally quote individual file paths with single quotes on copy +- Use ISO 8601 date format in file details +- New/changed/remapped shortcuts: + - <kbd>^B</kbd> - show bookmark prompt (replaces <kbd>b</kbd>) + - <kbd>b</kbd> - pin current dir (replaces <kbd>^B</kbd>) + - <kbd>^J</kbd> - toggle du mode + - <kbd>R</kbd> - batch rename files in vidir + - <kbd>^F</kbd> - extract archive (replaces <kbd>^X</kbd>) + - <kbd>^G</kbd> - quit nnn and change dir + - <kbd>^X</kbd> - quit nnn (replaces <kbd>^Q</kbd>) +- Extra shortcuts enabled in nav-as-you-type mode: + - <kbd>^K</kbd>, <kbd>^Y</kbd> (file path copy) + - <kbd>^T</kbd> (toggles quoted file path copy) + - <kbd>^R</kbd> (rename) + - <kbd>^O</kbd> (open with...) + - <kbd>^B</kbd> (show bookmark prompt) + - <kbd>^V</kbd> (visit pinned dir) + - <kbd>^J</kbd> (toggle du mode) + - <kbd>^/</kbd> (open desktop opener) + - <kbd>^F</kbd> (extract archive) + - <kbd>^L</kbd> (refresh) + - <kbd>^G</kbd> (quit nnn and change dir) + - <kbd>^X</kbd> (quit nnn) + +------------------------------------------------------------------------------- + +nnn v1.6 +2017-12-25 + +What's in? +- Shortcut `^O` to open file with custom application +- Option `-b` to open bookmarks directly at start +- Huge performance improvements around file name storing and handling +- Several large static buffers removed or reduced +- Several internal algorithms fine tuned for performance/resource usage + +------------------------------------------------------------------------------- + +nnn v1.5 +2017-10-05 + +What's in? +- File and directory creation (`n`) +- Env variable `NNN_NOWAIT` to unblock nnn when opening files (DE-specific) +- Show current entry number in status bar +- Support archive listing (`F`) and extraction (`Ctrl-X`) [using `atool`] +- Show correct file size on i386 for large files (> 2GB) + +------------------------------------------------------------------------------- + +nnn v1.4 +2017-09-04 + +What's in? +- Monitor directory changes +- In-place file rename +- Pin (`Ctrl-B`) a directory and visit (`Ctrl-V`) it anytime +- Auto-completion scripts +- Show volume capacity and free in help +- Auto-fallback to light mode if too few columns (< 35) +- PackageCore integration +- Unsupported Function keys (they never work universally): + - `F2` (rename), use `Ctrl-R` + - `F5` (refresh), use `Ctrl-L` + +------------------------------------------------------------------------------- + +nnn v1.3 +2017-07-26 + +What's in? +- Show directories in custom color (default: enabled in blue) +- Option `-e` to use exiftool instead of mediainfo +- Fixed #34: nftw(3) broken with too many open descriptors +- More concise help screen + +------------------------------------------------------------------------------- + +nnn v1.2 +2017-06-29 + +What's in? +- Use the desktop opener (xdg-open on Linux, open(1) on OS X) to open files +- Option `NNN_USE_EDITOR` to open text files in EDITOR (fallback vi) +- Bookmark support (maximum 10, key `b`) +- *Navigate-as-you-type* mode (key `Insert` or option `-i`) +- Subtree search: gnome-search-tool, fallback catfish (key `^/`) (customizable) +- Show current directory content size and file count in disk usage mode +- Add detail view mode as default, use `-l` to start in light mode +- Shortcuts `F2` and `^L` to refresh and unfilter + Note: if filter is empty, `Enter` *opens* the currently selected file now +- Help screen shows bookmarks and configuration +- Show a message when calculating disk usage +- Show the spawned shell level +- Linux only: use vlock as the locker on timeout (set using `NNN_IDLE_TIMEOUT`) + +------------------------------------------------------------------------------- + +nnn v1.1 +2017-05-12 + +News +- Introducing nlay - a highly customizable bash script to handle media type +- nnn is on [Homebrew](http://braumeister.org/formula/nnn) now +- RPM packages for CentOS 7 and Fedora 24 generated on release + +What's in? +- *Search-as-you-type* +- Unicode support +- Option `-S` to start in disk usage analyzer mode +- Show media information (using mediainfo) +- Use readline at change directory prompt +- Jump to prev directories using `cd .....` (with `.` as PWD) +- Jump to initial directory using `&` +- Show help, mediainfo and file info in PAGER +- Several optimizations + +------------------------------------------------------------------------------- + +nnn v1.0 +2017-04-13 + +Modifications +- Behaviour and navigation + - Detail view (default: disabled) with: + - file type (directory, regular, symlink etc.) + - modification time + - human-readable file size + - current item in reverse video + - number of items in current directory + - full name of currently selected file in 'bar' + - Show details of the currently selected file (stat, file) + - Disk usage analyzer mode (within the same fs, doesn't follow symlinks) + - Directories first (even with sorting) + - Sort numeric names in numeric order + - Case-insensitive alphabetic content listing instead of upper case first + - Key `-` to jump to last visited directory + - Roll over at the first and last entries of a directory (with Up/Down keys) + - Removed navigation restriction with relative paths (and let permissions handle it) + - Sort entries by file size (largest to smallest) + - Shortcut to invoke file name copier (set using environment variable `NNN_COPIER`) +- File association + - Set `NNN_OPENER` to let a desktop opener handle it all. E.g.: + export NNN_OPENER=xdg-open + export NNN_OPENER=gnome-open + export NNN_OPENER=gvfs-open + - Selective file associations (ignored if `NNN_OPENER` is set): + - Associate plain text files (determined using file) with vi + - Associate common audio and video mimes with mpv + - Associate PDF files with [zathura](https://pwmt.org/projects/zathura/) + - Removed `less` as default file opener (there is no universal standalone opener utility) + - You can customize further (see [how to change file associations](#change-file-associations)) + - `NNN_FALLBACK_OPENER` is the last line of defense: + - If the executable in static file association is missing + - If a file type was not handled in static file association + - This may be the best option to set your desktop opener to + - To enable the desktop file manager key, set `NNN_DE_FILE_MANAGER`. E.g.: + export NNN_DE_FILE_MANAGER=thunar +- Optimization + - All redundant buffer removal + - All frequently used local chunks now static + - Removed some redundant string allocation and manipulation + - Simplified some roundabout procedures + - Compiler warnings fixed + - strip the final binary + +------------------------------------------------------------------------------- diff --git a/nnn-4.9/LICENSE b/nnn-4.9/LICENSE @@ -0,0 +1,27 @@ +BSD 2-Clause License + +Copyright (c) 2014-2016, Lazaros Koromilas <lostd@2f30.org> +Copyright (c) 2014-2016, Dimitris Papastamos <sin@2f30.org> +Copyright (c) 2016-2023, Arun Prakash Jana <engineerarun@gmail.com> +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/nnn-4.9/Makefile b/nnn-4.9/Makefile @@ -0,0 +1,370 @@ +VERSION = $(shell grep -m1 VERSION $(SRC) | cut -f 2 -d'"') + +PREFIX ?= /usr/local +MANPREFIX ?= $(PREFIX)/share/man +DESKTOPPREFIX ?= $(PREFIX)/share/applications +DESKTOPICONPREFIX ?= $(PREFIX)/share/icons/hicolor +STRIP ?= strip +PKG_CONFIG ?= pkg-config +INSTALL ?= install +CP ?= cp + +CFLAGS_OPTIMIZATION ?= -O3 + +O_DEBUG := 0 # debug binary +O_NORL := 0 # no readline support +O_PCRE := 0 # link with PCRE library +O_NOLC := 0 # no locale support +O_NOMOUSE := 0 # no mouse support +O_NOBATCH := 0 # no built-in batch renamer +O_NOFIFO := 0 # no FIFO previewer support +O_CTX8 := 0 # enable 8 contexts +O_ICONS := 0 # support icons-in-terminal +O_NERD := 1 # support icons-nerdfont +O_EMOJI := 0 # support emoji +O_QSORT := 0 # use Alexey Tourbin's QSORT implementation +O_BENCH := 0 # benchmark mode (stops at first user input) +O_NOSSN := 0 # disable session support +O_NOUG := 0 # disable user, group name in status bar +O_NOX11 := 0 # disable X11 integration +O_MATCHFLTR := 0 # allow filters without matches +O_NOSORT := 0 # disable sorting entries on dir load + +# User patches +O_COLEMAK := 0 # change key bindings to colemak compatible layout +O_COLEMAK-DH := 0 # change key bindings to colemak-dh compatible layout +O_GITSTATUS := 0 # add git status to detail view +O_NAMEFIRST := 0 # print file name first, add uid and guid to detail view +O_RESTOREPREVIEW := 0 # add preview pipe to close and restore preview pane + +# convert targets to flags for backwards compatibility +ifneq ($(filter debug,$(MAKECMDGOALS)),) + O_DEBUG := 1 +endif +ifneq ($(filter norl,$(MAKECMDGOALS)),) + O_NORL := 1 +endif +ifneq ($(filter nolc,$(MAKECMDGOALS)),) + O_NORL := 1 + O_NOLC := 1 +endif + +ifeq ($(strip $(O_DEBUG)),1) + CPPFLAGS += -DDEBUG + CFLAGS += -g3 +endif + +ifeq ($(strip $(O_NORL)),1) + CPPFLAGS += -DNORL +else ifeq ($(strip $(O_STATIC)),1) + CPPFLAGS += -DNORL +else + LDLIBS += -lreadline +endif + +ifeq ($(strip $(O_PCRE)),1) + CPPFLAGS += -DPCRE + LDLIBS += -lpcre +endif + +ifeq ($(strip $(O_NOLC)),1) + ifeq ($(strip $(O_ICONS)),1) +$(info *** Ignoring O_NOLC since O_ICONS is set ***) + else ifeq ($(strip $(O_NERD)),1) +$(info *** Ignoring O_NOLC since O_NERD is set ***) + else ifeq ($(strip $(O_EMOJI)),1) +$(info *** Ignoring O_NOLC since O_EMOJI is set ***) + else + CPPFLAGS += -DNOLC + endif +endif + +ifeq ($(strip $(O_NOMOUSE)),1) + CPPFLAGS += -DNOMOUSE +endif + +ifeq ($(strip $(O_NOBATCH)),1) + CPPFLAGS += -DNOBATCH +endif + +ifeq ($(strip $(O_NOFIFO)),1) + CPPFLAGS += -DNOFIFO +endif + +ifeq ($(strip $(O_CTX8)),1) + CPPFLAGS += -DCTX8 +endif + +ifeq ($(strip $(O_ICONS)),1) + ICONS_INCLUDE = icons-generated-icons-in-term.h + CPPFLAGS += -DICONS_IN_TERM -DICONS_INCLUDE=\"$(ICONS_INCLUDE)\" +endif + +ifeq ($(strip $(O_NERD)),1) + ICONS_INCLUDE = icons-generated-nerd.h + CPPFLAGS += -DNERD -DICONS_INCLUDE=\"$(ICONS_INCLUDE)\" +endif + +ifeq ($(strip $(O_EMOJI)),1) + ICONS_INCLUDE = icons-generated-emoji.h + CPPFLAGS += -DEMOJI -DICONS_INCLUDE=\"$(ICONS_INCLUDE)\" +endif + +ifeq ($(strip $(O_QSORT)),1) + CPPFLAGS += -DTOURBIN_QSORT +endif + +ifeq ($(strip $(O_BENCH)),1) + CPPFLAGS += -DBENCH +endif + +ifeq ($(strip $(O_NOSSN)),1) + CPPFLAGS += -DNOSSN +endif + +ifeq ($(strip $(O_NOUG)),1) + CPPFLAGS += -DNOUG +endif + +ifeq ($(strip $(O_NOX11)),1) + CPPFLAGS += -DNOX11 +endif + +ifeq ($(strip $(O_MATCHFLTR)),1) + CPPFLAGS += -DMATCHFLTR +endif + +ifeq ($(strip $(O_NOSORT)),1) + CPPFLAGS += -DNOSORT +endif + +ifeq ($(shell $(PKG_CONFIG) ncursesw && echo 1),1) + CFLAGS_CURSES ?= $(shell $(PKG_CONFIG) --cflags ncursesw) + LDLIBS_CURSES ?= $(shell $(PKG_CONFIG) --libs ncursesw) +else ifeq ($(shell $(PKG_CONFIG) ncurses && echo 1),1) + CFLAGS_CURSES ?= $(shell $(PKG_CONFIG) --cflags ncurses) + LDLIBS_CURSES ?= $(shell $(PKG_CONFIG) --libs ncurses) +else + LDLIBS_CURSES ?= -lncurses +endif + +CFLAGS += -std=c11 -Wall -Wextra -Wshadow +CFLAGS += $(CFLAGS_OPTIMIZATION) +CFLAGS += $(CFLAGS_CURSES) + +LDLIBS += $(LDLIBS_CURSES) -lpthread + +# static compilation needs libgpm development package +ifeq ($(strip $(O_STATIC)),1) + LDFLAGS += -static + LDLIBS += -lgpm +endif + +DISTFILES = src nnn.1 Makefile README.md LICENSE +SRC = src/nnn.c +HEADERS = src/nnn.h +BIN = nnn +DESKTOPFILE = misc/desktop/nnn.desktop +LOGOSVG = misc/logo/logo.svg +LOGO64X64 = misc/logo/logo-64x64.png + +COLEMAK = patches/colemak +COLEMAK-DH = patches/colemak-dh +GITSTATUS = patches/gitstatus +NAMEFIRST = patches/namefirst +RESTOREPREVIEW = patches/restorepreview + +# test if we are on Mac OS X and get X.Y.Z OS version with system binary /usr/bin/sw_vers +MACOS_VERSION := $(strip $(shell command -v sw_vers >/dev/null && [ "`sw_vers -productName`" = "Mac OS X" ] && sw_vers -productVersion)) +# if Mac OS X detected, test if its version is below 10.12.0 relying on "sort -c" returning "disorder" message if the input is not sorted +ifneq ($(MACOS_VERSION),) + MACOS_BELOW_1012 := $(if $(strip $(shell printf '10.12.0\n%s' "$(MACOS_VERSION)" | sort -ct. -k1,1n -k2,2n -k3,3n 2>&1)),1) +endif +# if Mac OS X version is below 10.12.0, compile in the replacement clock_gettime and define MACOS_BELOW_1012 so that it's included in nnn.c +ifneq ($(MACOS_BELOW_1012),) + GETTIME_C = misc/macos-legacy/mach_gettime.c + GETTIME_H = misc/macos-legacy/mach_gettime.h + SRC += $(GETTIME_C) + HEADERS += $(GETTIME_H) + CPPFLAGS += -DMACOS_BELOW_1012 +endif + +ifeq ($(strip $(O_DEBUG)),1) + HEADERS += src/dbg.h +endif +ifeq ($(strip $(O_QSORT)),1) + HEADERS += src/qsort.h +endif +ifeq ($(strip $(O_EMOJI)),1) + HEADERS += src/icons.h src/$(ICONS_INCLUDE) +endif +ifeq ($(strip $(O_NERD)),1) + HEADERS += src/icons.h src/$(ICONS_INCLUDE) +endif +ifeq ($(strip $(O_ICONS)),1) + HEADERS += src/icons.h src/$(ICONS_INCLUDE) src/icons-in-terminal.h +endif + +all: $(BIN) + +$(BIN): $(SRC) $(HEADERS) Makefile + @$(MAKE) --silent prepatch + $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(GETTIME_C) $< $(LDLIBS) + @$(MAKE) --silent postpatch + +# targets for backwards compatibility +debug: $(BIN) +norl: $(BIN) +nolc: $(BIN) + +src/$(ICONS_INCLUDE): src/icons-hash.c src/icons.h src/icons-in-terminal.h + $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -DICONS_GENERATE -o src/icons-hash-gen src/icons-hash.c + ./src/icons-hash-gen > $@ + +install-desktop: $(DESKTOPFILE) + $(INSTALL) -m 0755 -d $(DESTDIR)$(DESKTOPPREFIX) + $(INSTALL) -m 0644 $(DESKTOPFILE) $(DESTDIR)$(DESKTOPPREFIX) + $(INSTALL) -m 0755 -d $(DESTDIR)$(DESKTOPICONPREFIX)/scalable/apps + $(INSTALL) -m 0644 $(LOGOSVG) $(DESTDIR)$(DESKTOPICONPREFIX)/scalable/apps/nnn.svg + $(INSTALL) -m 0755 -d $(DESTDIR)$(DESKTOPICONPREFIX)/64x64/apps + $(INSTALL) -m 0644 $(LOGO64X64) $(DESTDIR)$(DESKTOPICONPREFIX)/64x64/apps/nnn.png + +uninstall-desktop: + $(RM) $(DESTDIR)$(DESKTOPPREFIX)/$(DESKTOPFILE) + $(RM) $(DESTDIR)$(DESKTOPICONPREFIX)/scalable/apps/nnn.svg + $(RM) $(DESTDIR)$(DESKTOPICONPREFIX)/64x64/apps/nnn.png + +install: all + $(INSTALL) -m 0755 -d $(DESTDIR)$(PREFIX)/bin + $(INSTALL) -m 0755 $(BIN) $(DESTDIR)$(PREFIX)/bin + $(INSTALL) -m 0755 -d $(DESTDIR)$(MANPREFIX)/man1 + $(INSTALL) -m 0644 $(BIN).1 $(DESTDIR)$(MANPREFIX)/man1 + +uninstall: + $(RM) $(DESTDIR)$(PREFIX)/bin/$(BIN) + $(RM) $(DESTDIR)$(MANPREFIX)/man1/$(BIN).1 + +strip: $(BIN) + $(STRIP) $^ + +upx: $(BIN) + $(STRIP) $^ + upx -qqq $^ + +static: + # regular static binary + make O_STATIC=1 strip + mv $(BIN) $(BIN)-static + # static binary with icons-in-terminal support + make O_STATIC=1 O_ICONS=1 strip + mv $(BIN) $(BIN)-icons-static + # static binary with patched nerd font support + make O_STATIC=1 O_NERD=1 strip + mv $(BIN) $(BIN)-nerd-static + # static binary with emoji support + make O_STATIC=1 O_EMOJI=1 strip + mv $(BIN) $(BIN)-emoji-static + +musl: + cp misc/musl/musl-static-ubuntu.sh . + ./musl-static-ubuntu.sh 1 + rm ./musl-static-ubuntu.sh + +shellcheck: + find ./plugins/ -type f -not -name "*.md" -exec shellcheck {} + + +dist: + mkdir -p nnn-$(VERSION) + $(CP) -r $(DISTFILES) nnn-$(VERSION) + tar -cf - nnn-$(VERSION) | gzip > nnn-$(VERSION).tar.gz + $(RM) -r nnn-$(VERSION) + +sign: + git archive -o nnn-$(VERSION).tar.gz --format tar.gz --prefix=nnn-$(VERSION)/ v$(VERSION) + gpg --detach-sign --yes nnn-$(VERSION).tar.gz + rm -f nnn-$(VERSION).tar.gz + +upload-local: sign static musl + $(eval ID=$(shell curl -s 'https://api.github.com/repos/jarun/nnn/releases/tags/v$(VERSION)' | jq .id)) + # upload sign file + curl -XPOST 'https://uploads.github.com/repos/jarun/nnn/releases/$(ID)/assets?name=nnn-$(VERSION).tar.gz.sig' \ + -H 'Authorization: token $(NNN_SIG_UPLOAD_TOKEN)' -H 'Content-Type: application/pgp-signature' \ + --upload-file nnn-$(VERSION).tar.gz.sig + # upx compress all static binaries + upx -qqq $(BIN)-static + upx -qqq $(BIN)-icons-static + upx -qqq $(BIN)-nerd-static + upx -qqq $(BIN)-emoji-static + # upload static binary + tar -zcf $(BIN)-static-$(VERSION).x86_64.tar.gz $(BIN)-static + curl -XPOST 'https://uploads.github.com/repos/jarun/nnn/releases/$(ID)/assets?name=$(BIN)-static-$(VERSION).x86_64.tar.gz' \ + -H 'Authorization: token $(NNN_SIG_UPLOAD_TOKEN)' -H 'Content-Type: application/x-sharedlib' \ + --upload-file $(BIN)-static-$(VERSION).x86_64.tar.gz + # upload icons-in-terminal compiled static binary + tar -zcf $(BIN)-icons-static-$(VERSION).x86_64.tar.gz $(BIN)-icons-static + curl -XPOST 'https://uploads.github.com/repos/jarun/nnn/releases/$(ID)/assets?name=$(BIN)-icons-static-$(VERSION).x86_64.tar.gz' \ + -H 'Authorization: token $(NNN_SIG_UPLOAD_TOKEN)' -H 'Content-Type: application/x-sharedlib' \ + --upload-file $(BIN)-icons-static-$(VERSION).x86_64.tar.gz + # upload patched nerd font compiled static binary + tar -zcf $(BIN)-nerd-static-$(VERSION).x86_64.tar.gz $(BIN)-nerd-static + curl -XPOST 'https://uploads.github.com/repos/jarun/nnn/releases/$(ID)/assets?name=$(BIN)-nerd-static-$(VERSION).x86_64.tar.gz' \ + -H 'Authorization: token $(NNN_SIG_UPLOAD_TOKEN)' -H 'Content-Type: application/x-sharedlib' \ + --upload-file $(BIN)-nerd-static-$(VERSION).x86_64.tar.gz + # upload emoji compiled static binary + tar -zcf $(BIN)-emoji-static-$(VERSION).x86_64.tar.gz $(BIN)-emoji-static + curl -XPOST 'https://uploads.github.com/repos/jarun/nnn/releases/$(ID)/assets?name=$(BIN)-emoji-static-$(VERSION).x86_64.tar.gz' \ + -H 'Authorization: token $(NNN_SIG_UPLOAD_TOKEN)' -H 'Content-Type: application/x-sharedlib' \ + --upload-file $(BIN)-emoji-static-$(VERSION).x86_64.tar.gz + # upload musl static binary + tar -zcf $(BIN)-musl-static-$(VERSION).x86_64.tar.gz $(BIN)-musl-static + curl -XPOST 'https://uploads.github.com/repos/jarun/nnn/releases/$(ID)/assets?name=$(BIN)-musl-static-$(VERSION).x86_64.tar.gz' \ + -H 'Authorization: token $(NNN_SIG_UPLOAD_TOKEN)' -H 'Content-Type: application/x-sharedlib' \ + --upload-file $(BIN)-musl-static-$(VERSION).x86_64.tar.gz + +clean: + $(RM) -f $(BIN) nnn-$(VERSION).tar.gz *.sig $(BIN)-static $(BIN)-static-$(VERSION).x86_64.tar.gz $(BIN)-icons-static $(BIN)-icons-static-$(VERSION).x86_64.tar.gz $(BIN)-nerd-static $(BIN)-nerd-static-$(VERSION).x86_64.tar.gz $(BIN)-emoji-static $(BIN)-emoji-static-$(VERSION).x86_64.tar.gz $(BIN)-musl-static $(BIN)-musl-static-$(VERSION).x86_64.tar.gz src/icons-hash-gen src/icons-generated-*.h + +checkpatches: + ./patches/check-patches.sh + +prepatch: +ifeq ($(strip $(O_NAMEFIRST)),1) + patch --forward $(PATCH_OPTS) --strip=1 --input=$(NAMEFIRST)/mainline.diff +ifeq ($(strip $(O_GITSTATUS)),1) + patch --forward $(PATCH_OPTS) --strip=1 --input=$(GITSTATUS)/namefirst.diff +endif +else ifeq ($(strip $(O_GITSTATUS)),1) + patch --forward $(PATCH_OPTS) --strip=1 --input=$(GITSTATUS)/mainline.diff +endif +ifeq ($(strip $(O_RESTOREPREVIEW)),1) + patch --forward $(PATCH_OPTS) --strip=1 --input=$(RESTOREPREVIEW)/mainline.diff +endif +ifeq ($(strip $(O_COLEMAK)),1) + patch --forward $(PATCH_OPTS) --strip=1 --input=$(COLEMAK)/mainline.diff +endif +ifeq ($(strip $(O_COLEMAK-DH)),1) + patch --forward $(PATCH_OPTS) --strip=1 --input=$(COLEMAK-DH)/mainline.diff +endif + +postpatch: +ifeq ($(strip $(O_NAMEFIRST)),1) +ifeq ($(strip $(O_GITSTATUS)),1) + patch --reverse $(PATCH_OPTS) --strip=1 --input=$(GITSTATUS)/namefirst.diff +endif + patch --reverse $(PATCH_OPTS) --strip=1 --input=$(NAMEFIRST)/mainline.diff +else ifeq ($(strip $(O_GITSTATUS)),1) + patch --reverse $(PATCH_OPTS) --strip=1 --input=$(GITSTATUS)/mainline.diff +endif +ifeq ($(strip $(O_RESTOREPREVIEW)),1) + patch --reverse $(PATCH_OPTS) --strip=1 --input=$(RESTOREPREVIEW)/mainline.diff +endif +ifeq ($(strip $(O_COLEMAK)),1) + patch --reverse $(PATCH_OPTS) --strip=1 --input=$(COLEMAK)/mainline.diff +endif +ifeq ($(strip $(O_COLEMAK-DH)),1) + patch --reverse $(PATCH_OPTS) --strip=1 --input=$(COLEMAK-DH)/mainline.diff +endif + +skip: ; + +.PHONY: all install uninstall strip static dist sign upload-local clean install-desktop uninstall-desktop diff --git a/nnn-4.9/README.md b/nnn-4.9/README.md @@ -0,0 +1,165 @@ +<h3 align="center"><img src="misc/logo/logo-128x128.png" alt="nnn"><br>nnn - <i>Supercharge your productivity!</i></h3> + +<p align="center"> +<a href="https://github.com/jarun/nnn/releases/latest"><img src="https://img.shields.io/github/release/jarun/nnn.svg?maxAge=600&label=rel" alt="Latest release" /></a> +<a href="https://repology.org/project/nnn/versions"><img src="https://repology.org/badge/tiny-repos/nnn.svg?header=repos" alt="Availability"></a> +<a href="https://circleci.com/gh/jarun/workflows/nnn"><img src="https://img.shields.io/circleci/project/github/jarun/nnn.svg?label=circle%20ci" alt="CircleCI Status" /></a> +<a href="https://github.com/jarun/nnn/actions"><img src="https://github.com/jarun/nnn/workflows/ci/badge.svg?branch=master" alt="GitHub CI Status" /></a> +<a href="https://en.wikipedia.org/wiki/Privacy-invasive_software"><img src="https://img.shields.io/badge/privacy-✓-crimson?maxAge=2592000" alt="Privacy Awareness" /></a> +<a href="https://github.com/jarun/nnn/blob/master/LICENSE"><img src="https://img.shields.io/badge/©-BSD%202--Clause-important.svg?maxAge=2592000" alt="License" /></a> +</p> + +<p align="center"><a href="http://i.imgur.com/kOld6HT.gif"><img src="https://i.imgur.com/NUsSA2u.jpg"></a></p> + +<h3 align="center">[<a +href="https://github.com/jarun/nnn#features">Features</a>] [<a +href="https://github.com/jarun/nnn#quickstart">Quickstart</a>] [<a +href="https://github.com/jarun/nnn/tree/master/plugins#nnn-plugins">Plugins</a>] [<a +href="https://github.com/jarun/nnn/wiki">Wiki</a>]</h3> + +`nnn` (_n³_) is a full-featured terminal file manager. It's tiny, nearly 0-config and [incredibly fast](https://github.com/jarun/nnn/wiki/Performance). + +It is designed to be unobtrusive with smart workflows to match the trains of thought. + +`nnn` can analyze disk usage, batch rename, launch apps and pick files. The plugin repository has tons of plugins to extend the capabilities further e.g. [live previews](https://github.com/jarun/nnn/wiki/Live-previews), (un)mount disks, find & list, file/dir diff, upload files. A [patch framework](https://github.com/jarun/nnn/tree/master/patches) hosts sizable user-submitted patches which are subjective in nature. + +Independent (neo)vim plugins - [nnn.vim](https://github.com/mcchrish/nnn.vim), [vim-floaterm nnn wrapper](https://github.com/voldikss/vim-floaterm#nnn) and [nnn.nvim](https://github.com/luukvbaal/nnn.nvim) (neovim exclusive). + +Runs on the Pi, [Termux](https://www.youtube.com/embed/AbaauM7gUJw) (Android), Linux, macOS, BSD, Haiku, Cygwin, WSL, across DEs or a strictly CLI env. + +[_(there's more)_](https://github.com/jarun/nnn/wiki/Basic-use-cases#the_nnn-magic) + +## Features + +- Quality + - Privacy-aware (no unconfirmed user data collection) + - POSIX-compliant, follows Linux kernel coding style + - Highly optimized, static analysis integrated code +- Frugal + - Typically needs less than 3.5MB resident memory + - Works with 8 colors (and xterm 256 colors) + - Disk-IO sensitive (few disk reads and writes) + - No FPU usage (all integer maths, even for file size) + - Minimizes screen refresh with fast line redraws + - Tiny binary (typically around 100KB) + - 1-column mode for smaller terminals and form factors + - Hackable - compile in/out features and dependencies +- Portable + - Language-agnostic plugins + - Static binary available (no need to install) + - Minimal library deps, easy to compile + - No config file, minimal config with sensible defaults + - Plugin to backup configuration + - Widely available on many packagers + - Touch enabled, handheld-friendly shortcuts + - Unicode support +- Modes + - Light (default), detail + - Disk usage analyzer (block/apparent) + - File picker, (neo)vim plugin +- Navigation + - Filter with automatic dir entry on unique match + - *Type-to-nav* (turbo navigation/always filter) mode + - Contexts (_aka_ tabs/workspaces) with custom colors + - Sessions, bookmarks, mark and visit a dir + - Remote mounts (needs `sshfs`, `rclone`) + - Familiar shortcuts (arrows, <kbd>~</kbd>, <kbd>-</kbd>, <kbd>@</kbd>), quick look-up + - `cd` on quit (*easy* shell integration) + - Proceed to next file on file open and selection +- Search + - Instant filtering with *search-as-you-type* + - Regex (POSIX/PCRE) and string (default) filters + - Subtree search plugin to open or edit files +- Sort + - Ordered pure numeric names by default (visit `/proc`) + - Case-insensitive version (_aka_ natural) sort + - By name, access/change/mod (default) time, size, extn + - Reverse sort + - Directory-specific ordering +- Mimes + - Preview hovered files in FIFO-based previewer + - Open with desktop opener or specify a custom opener + - File-specific colors (or minimal _dirs in context color_) + - Icons and Emojis support (customize and compile-in) + - Plugin for image, video and audio thumbnails + - Create, list, extract (to), mount (FUSE based) archives + - Option to open all text files in `$EDITOR` +- Convenience + - Detailed file stats and mime information + - Run plugins and custom commands with hotkeys + - FreeDesktop compliant trash utility integration + - Cross-dir file/all/range selection + - Create (with parents), rename, duplicate files and dirs + - Create new file or directory (tree) on startup + - Batch renamer for selection or dir + - List input stream of file paths from stdin or plugin + - Copy (as), move (as), delete, archive, link selection + - Dir updates, notification on `cp`, `mv`, `rm` completion + - Copy file paths to system clipboard on select + - Launch apps, run commands, spawn a shell, toggle exe + - Access context paths/files at prompt or spawned shell + - Lock terminal after configurable idle timeout + - Capture and show output of a program in help screen + - Basic support for screen readers and braille displays + +## Quickstart + +1. [Install](https://github.com/jarun/nnn/wiki/Usage) `nnn` and the dependencies you need. +2. The desktop opener is default. Use `-e` to open text files in the terminal. Optionally [open detached](https://github.com/jarun/nnn/wiki/Basic-use-cases#detached-text). +3. Configure [`cd` on quit](https://github.com/jarun/nnn/wiki/Basic-use-cases#configure-cd-on-quit). +4. [Sync subshell `$PWD`](https://github.com/jarun/nnn/wiki/Basic-use-cases#sync-subshell-pwd) to `nnn`. +5. [Install plugins](https://github.com/jarun/nnn/tree/master/plugins#installation). +6. Use `-x` to sync selection to clipboard, show notis on `cp`, `mv`, `rm` and set xterm title. +7. For a CLI-only environment, set [`NNN_OPENER`](https://github.com/jarun/nnn/wiki/Usage#configuration) to [`nuke`](https://github.com/jarun/nnn/blob/master/plugins/nuke). Use option `-c`. +8. Bid `ls` goodbye! `alias ls='nnn -de'` :sunglasses: +9. Visit the [Live previews](https://github.com/jarun/nnn/wiki/Live-previews) and [Troubleshooting](https://github.com/jarun/nnn/wiki/Troubleshooting) Wiki pages. + +Don't memorize! Arrows, <kbd>/</kbd>, <kbd>q</kbd> suffice. <kbd>Tab</kbd> creates and/or cycles contexts. <kbd>?</kbd> lists shortcuts. + +[![](https://i.imgur.com/TN3xYQz.jpg)](https://www.youtube.com/embed/-knZwdd1ScU) + +[![Wiki](https://img.shields.io/badge/RTFM-nnn%20Wiki-important?maxAge=2592000)](https://github.com/jarun/nnn/wiki) + +## Videos + +- [nnn file manager on Termux (Android)](https://www.youtube.com/embed/AbaauM7gUJw) +- [NNN File Manager](https://www.youtube.com/embed/1QXU4XSqXNo) +- [This Week in Linux 114 - TuxDigital](https://www.youtube.com/watch?v=5W9ja0DQjSY&t=2059s) +- [nnn file manager basics - Linux](https://www.youtube.com/embed/il2Fm-KJJfM) +- [I'M GOING TO USE THE NNN FILE BROWSER! 😮](https://www.youtube.com/embed/U2n5aGqou9E) +- [NNN: Is This Terminal File Manager As Good As People Say?](https://www.youtube.com/embed/KuJHo-aO_FA) +- [nnn - A File Manager (By Uoou, again.)](https://www.youtube.com/embed/cnzuzcCPYsk) + +## Elsewhere + +- [AddictiveTips](https://www.addictivetips.com/ubuntu-linux-tips/navigate-linux-filesystem/) +- [ArchWiki](https://wiki.archlinux.org/index.php/Nnn) +- [FOSSMint](https://www.fossmint.com/nnn-linux-terminal-file-browser/) +- [gHacks Tech News](https://www.ghacks.net/2019/11/01/nnn-is-an-excellent-command-line-based-file-manager-for-linux-macos-and-bsds/) +- Hacker News [[1](https://news.ycombinator.com/item?id=18520898)] [[2](https://news.ycombinator.com/item?id=19850656)] +- [It's FOSS](https://itsfoss.com/nnn-file-browser-linux/) +- [Linux Format Issue 265; Manage files with nnn](https://linuxformat.com/archives?issue=265) +- LinuxLinks [[1](https://www.linuxlinks.com/nnn-fast-and-flexible-file-manager/)] [[2](https://www.linuxlinks.com/bestconsolefilemanagers/)] [[3](https://www.linuxlinks.com/excellent-system-tools-nnn-portable-terminal-file-manager/)] +- [Linux Magazine; FOSSPicks](https://www.linux-magazine.com/Issues/2017/205/FOSSPicks/(offset)/15) +- [Make Tech Easier](https://www.maketecheasier.com/nnn-file-manager-terminal/) +- [Opensource.com](https://opensource.com/article/22/12/linux-file-manager-nnn) +- [Open Source For You](https://www.opensourceforu.com/2019/12/nnn-this-feature-rich-terminal-file-manager-will-enhance-your-productivity/) +- [PCLinuxOS Magazine Issue June 2021](https://pclosmag.com/html/Issues/202106/page08.html) +- [Suckless Rocks](https://suckless.org/rocks/) +- [Ubuntu Full Circle Magazine Issue 135; Review: nnn](https://fullcirclemagazine.org/issue-135/) +- [Using and Administering Linux: Volume 2: Zero to SysAdmin: Advanced Topics](https://books.google.com/books?id=MqjDDwAAQBAJ&pg=PA32) +- [Wikipedia](https://en.wikipedia.org/wiki/Nnn_(file_manager)) + +## Developers + +- [Arun Prakash Jana](https://github.com/jarun) (Copyright © 2016-2023) +- [0xACE](https://github.com/0xACE) +- [Anna Arad](https://github.com/annagrram) +- [KlzXS](https://github.com/KlzXS) +- [Léo Villeveygoux](https://github.com/leovilok) +- [Luuk van Baal](https://github.com/luukvbaal) +- [NRK](https://codeberg.org/NRK) +- [Sijmen J. Mulder](https://github.com/sjmulder) +- and other contributors + +Visit the [Tracker](https://github.com/jarun/nnn/issues/1546) thread for a list of features in progress and anything up for grabs. Feel free to [discuss](https://github.com/jarun/nnn/discussions) new ideas or enhancement requests. diff --git a/nnn-4.9/icons-in-terminal/.gitignore b/nnn-4.9/icons-in-terminal/.gitignore diff --git a/nnn-4.9/icons-in-terminal/LICENSE b/nnn-4.9/icons-in-terminal/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Dom Charlesworth + +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. +\ No newline at end of file diff --git a/nnn-4.9/icons-in-terminal/README.md b/nnn-4.9/icons-in-terminal/README.md @@ -0,0 +1,152 @@ +![ls](image/ls.jpg) + +## Overview + +- `icons-in-terminal` allows you to get any fonts in your terminal without replacing or patching your font. +- You can add as many fonts as you want easily, you just need the ttf/odf file and add it to `config.json`. +- `icons-in-terminal` can also be use with graphical applications. + +## Table of Contents + +1. [**Installation**](#installation) +2. [**Building**](#building) +3. [**How it works**](#how-it-works) +4. [**Included icons**](#included-icons) +5. [**Screenshots**](#screenshots) +6. [**Integrations**](#integrations) + * [**fish-shell**](#fish-integration) + * [**bash**](#bash-integration) + * [**emacs**](#emacs-integration) +7. [**Projects using icons-in-terminal**](#projects-using-icons-in-terminal) + * [**ls**](#ls) + * [**emacs**](#emacs) +8. [**Todos**](#todos) + +## Installation + +```bash +$ git clone https://github.com/sebastiencs/icons-in-terminal.git +``` + +To install `icons-in-terminal`, run: +```bash +$ ./install.sh +$ # Follow the instructions to edit ~/.config/fontconfig/conf.d/30-icons.conf +``` +Or if your terminal is [supported](https://github.com/sebastiencs/icons-in-terminal/issues/1) (Experimental) +```bash +$ ./install-autodetect.sh +``` +Done ! You can start a new terminal and run `print_icons.sh` to see the installed gryphs. +You can see names of each icon by giving any parameter to `print_icons.sh`: +```bash +$ ./print_icons.sh +$ ./print_icons.sh --names +$ ./print_icons.sh --names | grep ANY_NAME +``` +To use icons in your terminal, **do not copy-paste icons** from the output of `print_icons.sh` but use their variable name: see [integrations](#integrations). +When one of the provided font will be updated and add new icons, some codepoints in `icons-in-terminal.ttf` will be changed, the variable names won't. + +## Building + +If you want to add new font, follow these instructions: + +There are a few dependencies to install: + +- Python 3 +- [fontforge (with python extension)](https://fontforge.github.io) + +You can add the name and path of your font to the file `config.json`. +Each font can take parameters: +- `start-from`: exclude all glyphes before the given codepoint. +- `until`: exclude all glyphes at the given codepoint and after. +- `excludes`: exclude the given codepoints. +- `move-vertically`: Use this parameter if your font and its glyphes are not centered vertically. +- `short-name`: Prefix to insert before the glyph name when you want to use the icon in your shell or anywhere else +- `map-names`: Define a name to the glyph. If not provided, the name will be read from the ttf file + +Once done, you can run: +```bash +$ ./build.sh +``` +## How it works + +This project is inspired by [awesome-terminal-fonts](https://github.com/gabrielelana/awesome-terminal-fonts) but is different. +I don't modify any existing font, I merge all glyphes from the provided fonts in a new font file and insert them in the [private use areas](https://en.wikipedia.org/wiki/Private_Use_Areas). +The file `~/.config/fontconfig/conf.d/30-icons.conf` tells to freetype to search the glyph in `icons-in-terminal.ttf` if it fails in your default font file. As the codepoints generated are in the private use areas, freetype should always fail and fallback to icons-in-terminal.ttf +The only requirement is that your default font shouldn't be already patched/modified. But why use a patched font with a limited number of glyphes when they are all included here :) +Your terminal emulator should also support [fallback font](https://en.wikipedia.org/wiki/Fallback_font) (most of them support it) + +## Included icons + +There are already 3618 glyphes included: + +| Name | Version | Notes | +| ---------------------------------------------------------------------------------|---------------:|--------| +| [powerline-extra-symbols](https://github.com/ryanoasis/powerline-extra-symbols) | commit 4eae6e8 | | +| [octicons](https://octicons.github.com/) | 4.4.0 | | +| [fontawesome](http://fontawesome.io/) | 4.7 | | +| [material-design-icons](https://github.com/google/material-design-icons) | 3.0.1 | | +| [file-icons](https://atom.io/packages/file-icons) | 2.1.4 | | +| [weather-icons](https://erikflowers.github.io/weather-icons/) | 2.0.10 | | +| [font-linux](https://github.com/Lukas-W/font-linux) | 0.9 | | +| [devicons](https://github.com/vorillaz/devicons) | 1.8.0 | | +| [Pomicons](https://github.com/gabrielelana/pomicons) | commit bb0a579 | | +| [linea](http://linea.io/) | 1.0 | | +| [font-mfizz](https://github.com/fizzed/font-mfizz) | 2.4.1 | | +| [FiraCode](https://github.com/tonsky/FiraCode) | [1.200](https://github.com/tonsky/FiraCode/issues/211#issuecomment-239058632) | See if your terminal is [compatible](https://github.com/tonsky/FiraCode#terminal-support) | + +## Screenshots + +![Screenshot the included icons](image/icons.jpg) +![Screenshot with fish](image/icons-fish.jpg) + +## Integrations + +### Fish integration + +To use `icons-in-terminal` with fish, add this line to `~/.config/fish/config.fish`: +```bash +source ~/.local/share/icons-in-terminal/icons.fish +``` +Restart a terminal, now you can print any icons with its name: +```bash +$ echo $oct_location +``` + +### Bash integration + +Add this line to your .bashrc: +```bash +source ~/.local/share/icons-in-terminal/icons_bash.sh +``` +Restart a terminal, now you can print any icons with its name: +```bash +$ echo -e $oct_location # note the '-e' +``` + +### Emacs integration + +Add this line to your emacs init file: +```el +(add-to-list 'load-path "~/.local/share/icons-in-terminal/") +``` +To use icons-in-terminal in your package: +```el +(require 'icons-in-terminal) +(insert (icons-in-terminal 'oct_flame)) ; C-h f icons-in-terminal[RET] for more info +``` + +## Projects using icons-in-terminal + +### ls + +https://github.com/sebastiencs/ls-icons + +### emacs + +https://github.com/sebastiencs/sidebar.el + +## Todos + +- Integrate with differents shells diff --git a/nnn-4.9/icons-in-terminal/build.sh b/nnn-4.9/icons-in-terminal/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -xe +rm -rf ./build/ +mkdir -p ./build +./scripts/generate_font.py ./config.json > ./build/mapping.txt +./scripts/inte_fish.sh > ./build/icons.fish +./scripts/inte_bash.sh > ./build/icons_bash.sh +./scripts/inte_bash_export.sh > ./build/icons_bash_export.sh +./scripts/inte_without_codepoint.sh > ./build/icons_bash_without_codepoint.sh +./scripts/inte_emacs.sh > ./build/icons-in-terminal.el +./scripts/inte_c_header.sh > ./build/icons-in-terminal.h +chmod +x ./build/icons.fish +chmod +x ./build/icons_bash.sh +mv icons-in-terminal.ttf ./build/ +set +xe +echo -e "\nEverything seems good, now you can run install.sh" diff --git a/nnn-4.9/icons-in-terminal/build/icons-in-terminal.el b/nnn-4.9/icons-in-terminal/build/icons-in-terminal.el @@ -0,0 +1,3774 @@ +(require 'font-lock+) + +(defconst icons-in-terminal-alist + '( + ( powerline_branch . "\xe0a0" ) + ( powerline_line_number . "\xe0a1" ) + ( powerline_readonly . "\xe0a2" ) + ( powerline_extra_column_number . "\xe0a3" ) + ( powerline_left_hard_divider . "\xe0b0" ) + ( powerline_left_soft_divider . "\xe0b1" ) + ( powerline_right_hard_divider . "\xe0b2" ) + ( powerline_right_soft_divider . "\xe0b3" ) + ( powerline_extra_right_half_circle_thick . "\xe0b4" ) + ( powerline_extra_right_half_circle_thin . "\xe0b5" ) + ( powerline_extra_left_half_circle_thick . "\xe0b6" ) + ( powerline_extra_left_half_circle_thin . "\xe0b7" ) + ( powerline_extra_lower_left_triangle . "\xe0b8" ) + ( powerline_extra_backslash_separator . "\xe0b9" ) + ( powerline_extra_lower_right_triangle . "\xe0ba" ) + ( powerline_extra_forwardslash_separator . "\xe0bb" ) + ( powerline_extra_upper_left_triangle . "\xe0bc" ) + ( powerline_extra_forwardslash_separator_redundant . "\xe0bd" ) + ( powerline_extra_upper_right_triangle . "\xe0be" ) + ( powerline_extra_backslash_separator_redundant . "\xe0bf" ) + ( powerline_extra_flame_thick . "\xe0c0" ) + ( powerline_extra_flame_thin . "\xe0c1" ) + ( powerline_extra_flame_thick_mirrored . "\xe0c2" ) + ( powerline_extra_flame_thin_mirrored . "\xe0c3" ) + ( powerline_extra_pixelated_squares_small . "\xe0c4" ) + ( powerline_extra_pixelated_squares_small_mirrored . "\xe0c5" ) + ( powerline_extra_pixelated_squares_big . "\xe0c6" ) + ( powerline_extra_pixelated_squares_big_mirrored . "\xe0c7" ) + ( powerline_extra_ice_waveform . "\xe0c8" ) + ( powerline_extra_ice_waveform_mirrored . "\xe0ca" ) + ( powerline_extra_honeycomb . "\xe0cc" ) + ( powerline_extra_honeycomb_outline . "\xe0cd" ) + ( powerline_extra_lego_separator . "\xe0ce" ) + ( powerline_extra_lego_separator_thin . "\xe0cf" ) + ( powerline_extra_lego_block_facing . "\xe0d0" ) + ( powerline_extra_lego_block_sideways . "\xe0d1" ) + ( powerline_extra_trapezoid_top_bottom . "\xe0d2" ) + ( powerline_extra_trapezoid_top_bottom_mirrored . "\xe0d4" ) + ( oct_heart . "\xe000" ) + ( oct_zap . "\xe001" ) + ( oct_light_bulb . "\xe002" ) + ( oct_repo . "\xe003" ) + ( oct_repo_forked . "\xe004" ) + ( oct_repo_push . "\xe005" ) + ( oct_repo_pull . "\xe006" ) + ( oct_book . "\xe007" ) + ( oct_octoface . "\xe008" ) + ( oct_git_pull_request . "\xe009" ) + ( oct_mark_github . "\xe00a" ) + ( oct_cloud_download . "\xe00b" ) + ( oct_cloud_upload . "\xe00c" ) + ( oct_keyboard . "\xe00d" ) + ( oct_gist . "\xe00e" ) + ( oct_file_code . "\xe00f" ) + ( oct_file_text . "\xe010" ) + ( oct_file_media . "\xe011" ) + ( oct_file_zip . "\xe012" ) + ( oct_file_pdf . "\xe013" ) + ( oct_tag . "\xe014" ) + ( oct_file_directory . "\xe015" ) + ( oct_file_submodule . "\xe016" ) + ( oct_person . "\xe017" ) + ( oct_jersey . "\xe018" ) + ( oct_git_commit . "\xe019" ) + ( oct_git_branch . "\xe01a" ) + ( oct_git_merge . "\xe01b" ) + ( oct_mirror . "\xe01c" ) + ( oct_issue_opened . "\xe01d" ) + ( oct_issue_reopened . "\xe01e" ) + ( oct_issue_closed . "\xe01f" ) + ( oct_star . "\xe020" ) + ( oct_comment . "\xe021" ) + ( oct_question . "\xe022" ) + ( oct_alert . "\xe023" ) + ( oct_search . "\xe024" ) + ( oct_gear . "\xe025" ) + ( oct_radio_tower . "\xe026" ) + ( oct_tools . "\xe027" ) + ( oct_sign_out . "\xe028" ) + ( oct_rocket . "\xe029" ) + ( oct_rss . "\xe02a" ) + ( oct_clippy . "\xe02b" ) + ( oct_sign_in . "\xe02c" ) + ( oct_organization . "\xe02d" ) + ( oct_device_mobile . "\xe02e" ) + ( oct_unfold . "\xe02f" ) + ( oct_check . "\xe030" ) + ( oct_mail . "\xe031" ) + ( oct_mail_read . "\xe032" ) + ( oct_arrow_up . "\xe033" ) + ( oct_arrow_right . "\xe034" ) + ( oct_arrow_down . "\xe035" ) + ( oct_arrow_left . "\xe036" ) + ( oct_pin . "\xe037" ) + ( oct_gift . "\xe038" ) + ( oct_graph . "\xe039" ) + ( oct_triangle_left . "\xe03a" ) + ( oct_credit_card . "\xe03b" ) + ( oct_clock . "\xe03c" ) + ( oct_ruby . "\xe03d" ) + ( oct_broadcast . "\xe03e" ) + ( oct_key . "\xe03f" ) + ( oct_repo_force_push . "\xe040" ) + ( oct_repo_clone . "\xe041" ) + ( oct_diff . "\xe042" ) + ( oct_eye . "\xe043" ) + ( oct_comment_discussion . "\xe044" ) + ( oct_mail_reply . "\xe045" ) + ( oct_primitive_dot . "\xe046" ) + ( oct_primitive_square . "\xe047" ) + ( oct_device_camera . "\xe048" ) + ( oct_device_camera_video . "\xe049" ) + ( oct_pencil . "\xe04a" ) + ( oct_info . "\xe04b" ) + ( oct_triangle_right . "\xe04c" ) + ( oct_triangle_down . "\xe04d" ) + ( oct_link . "\xe04e" ) + ( oct_plus . "\xe04f" ) + ( oct_three_bars . "\xe050" ) + ( oct_code . "\xe051" ) + ( oct_location . "\xe052" ) + ( oct_list_unordered . "\xe053" ) + ( oct_list_ordered . "\xe054" ) + ( oct_quote . "\xe055" ) + ( oct_versions . "\xe056" ) + ( oct_calendar . "\xe057" ) + ( oct_lock . "\xe058" ) + ( oct_diff_added . "\xe059" ) + ( oct_diff_removed . "\xe05a" ) + ( oct_diff_modified . "\xe05b" ) + ( oct_diff_renamed . "\xe05c" ) + ( oct_horizontal_rule . "\xe05d" ) + ( oct_arrow_small_right . "\xe05e" ) + ( oct_milestone . "\xe05f" ) + ( oct_checklist . "\xe060" ) + ( oct_megaphone . "\xe061" ) + ( oct_chevron_right . "\xe062" ) + ( oct_bookmark . "\xe063" ) + ( oct_settings . "\xe064" ) + ( oct_dashboard . "\xe065" ) + ( oct_history . "\xe066" ) + ( oct_link_external . "\xe067" ) + ( oct_mute . "\xe068" ) + ( oct_x . "\xe069" ) + ( oct_circle_slash . "\xe06a" ) + ( oct_pulse . "\xe06b" ) + ( oct_sync . "\xe06c" ) + ( oct_telescope . "\xe06d" ) + ( oct_gist_secret . "\xe06e" ) + ( oct_home . "\xe06f" ) + ( oct_stop . "\xe070" ) + ( oct_bug . "\xe071" ) + ( oct_logo_github . "\xe072" ) + ( oct_file_binary . "\xe073" ) + ( oct_database . "\xe074" ) + ( oct_server . "\xe075" ) + ( oct_diff_ignored . "\xe076" ) + ( oct_ellipsis . "\xe077" ) + ( oct_no_newline . "\xe078" ) + ( oct_hubot . "\xe079" ) + ( oct_arrow_small_up . "\xe07a" ) + ( oct_arrow_small_down . "\xe07b" ) + ( oct_arrow_small_left . "\xe07c" ) + ( oct_chevron_up . "\xe07d" ) + ( oct_chevron_down . "\xe07e" ) + ( oct_chevron_left . "\xe07f" ) + ( oct_triangle_up . "\xe080" ) + ( oct_git_compare . "\xe081" ) + ( oct_logo_gist . "\xe082" ) + ( oct_file_symlink_file . "\xe083" ) + ( oct_file_symlink_directory . "\xe084" ) + ( oct_squirrel . "\xe085" ) + ( oct_globe . "\xe086" ) + ( oct_unmute . "\xe087" ) + ( oct_mention . "\xe088" ) + ( oct_package . "\xe089" ) + ( oct_browser . "\xe08a" ) + ( oct_terminal . "\xe08b" ) + ( oct_markdown . "\xe08c" ) + ( oct_dash . "\xe08d" ) + ( oct_fold . "\xe08e" ) + ( oct_inbox . "\xe08f" ) + ( oct_trashcan . "\xe090" ) + ( oct_paintcan . "\xe091" ) + ( oct_flame . "\xe092" ) + ( oct_briefcase . "\xe093" ) + ( oct_plug . "\xe094" ) + ( oct_circuit_board . "\xe095" ) + ( oct_mortar_board . "\xe096" ) + ( oct_law . "\xe097" ) + ( oct_thumbsup . "\xe098" ) + ( oct_thumbsdown . "\xe099" ) + ( oct_desktop_download . "\xe09a" ) + ( oct_beaker . "\xe09b" ) + ( oct_bell . "\xe09c" ) + ( oct_watch . "\xe09d" ) + ( oct_shield . "\xe09e" ) + ( oct_bold . "\xe09f" ) + ( oct_text_size . "\xe0d5" ) + ( oct_italic . "\xe0d6" ) + ( oct_tasklist . "\xe0d7" ) + ( oct_verified . "\xe0d8" ) + ( oct_smiley . "\xe0d9" ) + ( oct_unverified . "\xe0da" ) + ( oct_ellipses . "\xe0db" ) + ( oct_file . "\xe0dc" ) + ( oct_grabber . "\xe0dd" ) + ( oct_plus_small . "\xe0de" ) + ( oct_reply . "\xe0df" ) + ( oct_device_desktop . "\xe0e0" ) + ( fa_glass . "\xe0e1" ) + ( fa_music . "\xe0e2" ) + ( fa_search . "\xe0e3" ) + ( fa_envelope_o . "\xe0e4" ) + ( fa_heart . "\xe0e5" ) + ( fa_star . "\xe0e6" ) + ( fa_star_o . "\xe0e7" ) + ( fa_user . "\xe0e8" ) + ( fa_film . "\xe0e9" ) + ( fa_th_large . "\xe0ea" ) + ( fa_th . "\xe0eb" ) + ( fa_th_list . "\xe0ec" ) + ( fa_check . "\xe0ed" ) + ( fa_close . "\xe0ee" ) + ( fa_search_plus . "\xe0ef" ) + ( fa_search_minus . "\xe0f0" ) + ( fa_power_off . "\xe0f1" ) + ( fa_signal . "\xe0f2" ) + ( fa_cog . "\xe0f3" ) + ( fa_trash_o . "\xe0f4" ) + ( fa_home . "\xe0f5" ) + ( fa_file_o . "\xe0f6" ) + ( fa_clock_o . "\xe0f7" ) + ( fa_road . "\xe0f8" ) + ( fa_download . "\xe0f9" ) + ( fa_arrow_circle_o_down . "\xe0fa" ) + ( fa_arrow_circle_o_up . "\xe0fb" ) + ( fa_inbox . "\xe0fc" ) + ( fa_play_circle_o . "\xe0fd" ) + ( fa_repeat . "\xe0fe" ) + ( fa_refresh . "\xe0ff" ) + ( fa_list_alt . "\xe100" ) + ( fa_lock . "\xe101" ) + ( fa_flag . "\xe102" ) + ( fa_headphones . "\xe103" ) + ( fa_volume_off . "\xe104" ) + ( fa_volume_down . "\xe105" ) + ( fa_volume_up . "\xe106" ) + ( fa_qrcode . "\xe107" ) + ( fa_barcode . "\xe108" ) + ( fa_tag . "\xe109" ) + ( fa_tags . "\xe10a" ) + ( fa_book . "\xe10b" ) + ( fa_bookmark . "\xe10c" ) + ( fa_print . "\xe10d" ) + ( fa_camera . "\xe10e" ) + ( fa_font . "\xe10f" ) + ( fa_bold . "\xe110" ) + ( fa_italic . "\xe111" ) + ( fa_text_height . "\xe112" ) + ( fa_text_width . "\xe113" ) + ( fa_align_left . "\xe114" ) + ( fa_align_center . "\xe115" ) + ( fa_align_right . "\xe116" ) + ( fa_align_justify . "\xe117" ) + ( fa_list . "\xe118" ) + ( fa_dedent . "\xe119" ) + ( fa_indent . "\xe11a" ) + ( fa_video_camera . "\xe11b" ) + ( fa_image . "\xe11c" ) + ( fa_pencil . "\xe11d" ) + ( fa_map_marker . "\xe11e" ) + ( fa_adjust . "\xe11f" ) + ( fa_tint . "\xe120" ) + ( fa_edit . "\xe121" ) + ( fa_share_square_o . "\xe122" ) + ( fa_check_square_o . "\xe123" ) + ( fa_arrows . "\xe124" ) + ( fa_step_backward . "\xe125" ) + ( fa_fast_backward . "\xe126" ) + ( fa_backward . "\xe127" ) + ( fa_play . "\xe128" ) + ( fa_pause . "\xe129" ) + ( fa_stop . "\xe12a" ) + ( fa_forward . "\xe12b" ) + ( fa_fast_forward . "\xe12c" ) + ( fa_step_forward . "\xe12d" ) + ( fa_eject . "\xe12e" ) + ( fa_chevron_left . "\xe12f" ) + ( fa_chevron_right . "\xe130" ) + ( fa_plus_circle . "\xe131" ) + ( fa_minus_circle . "\xe132" ) + ( fa_times_circle . "\xe133" ) + ( fa_check_circle . "\xe134" ) + ( fa_question_circle . "\xe135" ) + ( fa_info_circle . "\xe136" ) + ( fa_crosshairs . "\xe137" ) + ( fa_times_circle_o . "\xe138" ) + ( fa_check_circle_o . "\xe139" ) + ( fa_ban . "\xe13a" ) + ( fa_arrow_left . "\xe13b" ) + ( fa_arrow_right . "\xe13c" ) + ( fa_arrow_up . "\xe13d" ) + ( fa_arrow_down . "\xe13e" ) + ( fa_mail_forward . "\xe13f" ) + ( fa_expand . "\xe140" ) + ( fa_compress . "\xe141" ) + ( fa_plus . "\xe142" ) + ( fa_minus . "\xe143" ) + ( fa_asterisk . "\xe144" ) + ( fa_exclamation_circle . "\xe145" ) + ( fa_gift . "\xe146" ) + ( fa_leaf . "\xe147" ) + ( fa_fire . "\xe148" ) + ( fa_eye . "\xe149" ) + ( fa_eye_slash . "\xe14a" ) + ( fa_exclamation_triangle . "\xe14b" ) + ( fa_plane . "\xe14c" ) + ( fa_calendar . "\xe14d" ) + ( fa_random . "\xe14e" ) + ( fa_comment . "\xe14f" ) + ( fa_magnet . "\xe150" ) + ( fa_chevron_up . "\xe151" ) + ( fa_chevron_down . "\xe152" ) + ( fa_retweet . "\xe153" ) + ( fa_shopping_cart . "\xe154" ) + ( fa_folder . "\xe155" ) + ( fa_folder_open . "\xe156" ) + ( fa_arrows_v . "\xe157" ) + ( fa_arrows_h . "\xe158" ) + ( fa_bar_chart . "\xe159" ) + ( fa_twitter_square . "\xe15a" ) + ( fa_facebook_square . "\xe15b" ) + ( fa_camera_retro . "\xe15c" ) + ( fa_key . "\xe15d" ) + ( fa_cogs . "\xe15e" ) + ( fa_comments . "\xe15f" ) + ( fa_thumbs_o_up . "\xe160" ) + ( fa_thumbs_o_down . "\xe161" ) + ( fa_star_half . "\xe162" ) + ( fa_heart_o . "\xe163" ) + ( fa_sign_out . "\xe164" ) + ( fa_linkedin_square . "\xe165" ) + ( fa_thumb_tack . "\xe166" ) + ( fa_external_link . "\xe167" ) + ( fa_sign_in . "\xe168" ) + ( fa_trophy . "\xe169" ) + ( fa_github_square . "\xe16a" ) + ( fa_upload . "\xe16b" ) + ( fa_lemon_o . "\xe16c" ) + ( fa_phone . "\xe16d" ) + ( fa_square_o . "\xe16e" ) + ( fa_bookmark_o . "\xe16f" ) + ( fa_phone_square . "\xe170" ) + ( fa_twitter . "\xe171" ) + ( fa_facebook . "\xe172" ) + ( fa_github . "\xe173" ) + ( fa_unlock . "\xe174" ) + ( fa_credit_card . "\xe175" ) + ( fa_feed . "\xe176" ) + ( fa_hdd_o . "\xe177" ) + ( fa_bullhorn . "\xe178" ) + ( fa_bell_o . "\xe179" ) + ( fa_certificate . "\xe17a" ) + ( fa_hand_o_right . "\xe17b" ) + ( fa_hand_o_left . "\xe17c" ) + ( fa_hand_o_up . "\xe17d" ) + ( fa_hand_o_down . "\xe17e" ) + ( fa_arrow_circle_left . "\xe17f" ) + ( fa_arrow_circle_right . "\xe180" ) + ( fa_arrow_circle_up . "\xe181" ) + ( fa_arrow_circle_down . "\xe182" ) + ( fa_globe . "\xe183" ) + ( fa_wrench . "\xe184" ) + ( fa_tasks . "\xe185" ) + ( fa_filter . "\xe186" ) + ( fa_briefcase . "\xe187" ) + ( fa_arrows_alt . "\xe188" ) + ( fa_group . "\xe189" ) + ( fa_chain . "\xe18a" ) + ( fa_cloud . "\xe18b" ) + ( fa_flask . "\xe18c" ) + ( fa_cut . "\xe18d" ) + ( fa_copy . "\xe18e" ) + ( fa_paperclip . "\xe18f" ) + ( fa_floppy_o . "\xe190" ) + ( fa_square . "\xe191" ) + ( fa_bars . "\xe192" ) + ( fa_list_ul . "\xe193" ) + ( fa_list_ol . "\xe194" ) + ( fa_strikethrough . "\xe195" ) + ( fa_underline . "\xe196" ) + ( fa_table . "\xe197" ) + ( fa_magic . "\xe198" ) + ( fa_truck . "\xe199" ) + ( fa_pinterest . "\xe19a" ) + ( fa_pinterest_square . "\xe19b" ) + ( fa_google_plus_square . "\xe19c" ) + ( fa_google_plus . "\xe19d" ) + ( fa_money . "\xe19e" ) + ( fa_caret_down . "\xe19f" ) + ( fa_caret_up . "\xe1a0" ) + ( fa_caret_left . "\xe1a1" ) + ( fa_caret_right . "\xe1a2" ) + ( fa_columns . "\xe1a3" ) + ( fa_sort . "\xe1a4" ) + ( fa_sort_desc . "\xe1a5" ) + ( fa_sort_asc . "\xe1a6" ) + ( fa_envelope . "\xe1a7" ) + ( fa_linkedin . "\xe1a8" ) + ( fa_rotate_left . "\xe1a9" ) + ( fa_gavel . "\xe1aa" ) + ( fa_dashboard . "\xe1ab" ) + ( fa_comment_o . "\xe1ac" ) + ( fa_comments_o . "\xe1ad" ) + ( fa_bolt . "\xe1ae" ) + ( fa_sitemap . "\xe1af" ) + ( fa_umbrella . "\xe1b0" ) + ( fa_clipboard . "\xe1b1" ) + ( fa_lightbulb_o . "\xe1b2" ) + ( fa_exchange . "\xe1b3" ) + ( fa_cloud_download . "\xe1b4" ) + ( fa_cloud_upload . "\xe1b5" ) + ( fa_user_md . "\xe1b6" ) + ( fa_stethoscope . "\xe1b7" ) + ( fa_suitcase . "\xe1b8" ) + ( fa_bell . "\xe1b9" ) + ( fa_coffee . "\xe1ba" ) + ( fa_cutlery . "\xe1bb" ) + ( fa_file_text_o . "\xe1bc" ) + ( fa_building_o . "\xe1bd" ) + ( fa_hospital_o . "\xe1be" ) + ( fa_ambulance . "\xe1bf" ) + ( fa_medkit . "\xe1c0" ) + ( fa_fighter_jet . "\xe1c1" ) + ( fa_beer . "\xe1c2" ) + ( fa_h_square . "\xe1c3" ) + ( fa_plus_square . "\xe1c4" ) + ( fa_angle_double_left . "\xe1c5" ) + ( fa_angle_double_right . "\xe1c6" ) + ( fa_angle_double_up . "\xe1c7" ) + ( fa_angle_double_down . "\xe1c8" ) + ( fa_angle_left . "\xe1c9" ) + ( fa_angle_right . "\xe1ca" ) + ( fa_angle_up . "\xe1cb" ) + ( fa_angle_down . "\xe1cc" ) + ( fa_desktop . "\xe1cd" ) + ( fa_laptop . "\xe1ce" ) + ( fa_tablet . "\xe1cf" ) + ( fa_mobile . "\xe1d0" ) + ( fa_circle_o . "\xe1d1" ) + ( fa_quote_left . "\xe1d2" ) + ( fa_quote_right . "\xe1d3" ) + ( fa_spinner . "\xe1d4" ) + ( fa_circle . "\xe1d5" ) + ( fa_mail_reply . "\xe1d6" ) + ( fa_github_alt . "\xe1d7" ) + ( fa_folder_o . "\xe1d8" ) + ( fa_folder_open_o . "\xe1d9" ) + ( fa_expand_alt . "\xe1da" ) + ( fa_collapse_alt . "\xe1db" ) + ( fa_smile_o . "\xe1dc" ) + ( fa_frown_o . "\xe1dd" ) + ( fa_meh_o . "\xe1de" ) + ( fa_gamepad . "\xe1df" ) + ( fa_keyboard_o . "\xe1e0" ) + ( fa_flag_o . "\xe1e1" ) + ( fa_flag_checkered . "\xe1e2" ) + ( fa_terminal . "\xe1e3" ) + ( fa_code . "\xe1e4" ) + ( fa_mail_reply_all . "\xe1e5" ) + ( fa_star_half_empty . "\xe1e6" ) + ( fa_location_arrow . "\xe1e7" ) + ( fa_crop . "\xe1e8" ) + ( fa_code_fork . "\xe1e9" ) + ( fa_chain_broken . "\xe1ea" ) + ( fa_question . "\xe1eb" ) + ( fa_info . "\xe1ec" ) + ( fa_exclamation . "\xe1ed" ) + ( fa_superscript . "\xe1ee" ) + ( fa_subscript . "\xe1ef" ) + ( fa_eraser . "\xe1f0" ) + ( fa_puzzle_piece . "\xe1f1" ) + ( fa_microphone . "\xe1f2" ) + ( fa_microphone_slash . "\xe1f3" ) + ( fa_shield . "\xe1f4" ) + ( fa_calendar_o . "\xe1f5" ) + ( fa_fire_extinguisher . "\xe1f6" ) + ( fa_rocket . "\xe1f7" ) + ( fa_maxcdn . "\xe1f8" ) + ( fa_chevron_circle_left . "\xe1f9" ) + ( fa_chevron_circle_right . "\xe1fa" ) + ( fa_chevron_circle_up . "\xe1fb" ) + ( fa_chevron_circle_down . "\xe1fc" ) + ( fa_html5 . "\xe1fd" ) + ( fa_css3 . "\xe1fe" ) + ( fa_anchor . "\xe1ff" ) + ( fa_unlock_alt . "\xe200" ) + ( fa_bullseye . "\xe201" ) + ( fa_ellipsis_h . "\xe202" ) + ( fa_ellipsis_v . "\xe203" ) + ( fa_rss_square . "\xe204" ) + ( fa_play_circle . "\xe205" ) + ( fa_ticket . "\xe206" ) + ( fa_minus_square . "\xe207" ) + ( fa_minus_square_o . "\xe208" ) + ( fa_level_up . "\xe209" ) + ( fa_level_down . "\xe20a" ) + ( fa_check_square . "\xe20b" ) + ( fa_pencil_square . "\xe20c" ) + ( fa_external_link_square . "\xe20d" ) + ( fa_share_square . "\xe20e" ) + ( fa_compass . "\xe20f" ) + ( fa_caret_square_o_down . "\xe210" ) + ( fa_caret_square_o_up . "\xe211" ) + ( fa_caret_square_o_right . "\xe212" ) + ( fa_eur . "\xe213" ) + ( fa_gbp . "\xe214" ) + ( fa_dollar . "\xe215" ) + ( fa_inr . "\xe216" ) + ( fa_cny . "\xe217" ) + ( fa_rouble . "\xe218" ) + ( fa_krw . "\xe219" ) + ( fa_bitcoin . "\xe21a" ) + ( fa_file . "\xe21b" ) + ( fa_file_text . "\xe21c" ) + ( fa_sort_alpha_asc . "\xe21d" ) + ( fa_sort_alpha_desc . "\xe21e" ) + ( fa_sort_amount_asc . "\xe21f" ) + ( fa_sort_amount_desc . "\xe220" ) + ( fa_sort_numeric_asc . "\xe221" ) + ( fa_sort_numeric_desc . "\xe222" ) + ( fa_thumbs_up . "\xe223" ) + ( fa_thumbs_down . "\xe224" ) + ( fa_youtube_square . "\xe225" ) + ( fa_youtube . "\xe226" ) + ( fa_xing . "\xe227" ) + ( fa_xing_square . "\xe228" ) + ( fa_youtube_play . "\xe229" ) + ( fa_dropbox . "\xe22a" ) + ( fa_stack_overflow . "\xe22b" ) + ( fa_instagram . "\xe22c" ) + ( fa_flickr . "\xe22d" ) + ( fa_adn . "\xe22e" ) + ( fa_bitbucket . "\xe22f" ) + ( fa_bitbucket_square . "\xe230" ) + ( fa_tumblr . "\xe231" ) + ( fa_tumblr_square . "\xe232" ) + ( fa_long_arrow_down . "\xe233" ) + ( fa_long_arrow_up . "\xe234" ) + ( fa_long_arrow_left . "\xe235" ) + ( fa_long_arrow_right . "\xe236" ) + ( fa_apple . "\xe237" ) + ( fa_windows . "\xe238" ) + ( fa_android . "\xe239" ) + ( fa_linux . "\xe23a" ) + ( fa_dribbble . "\xe23b" ) + ( fa_skype . "\xe23c" ) + ( fa_foursquare . "\xe23d" ) + ( fa_trello . "\xe23e" ) + ( fa_female . "\xe23f" ) + ( fa_male . "\xe240" ) + ( fa_gittip . "\xe241" ) + ( fa_sun_o . "\xe242" ) + ( fa_moon_o . "\xe243" ) + ( fa_archive . "\xe244" ) + ( fa_bug . "\xe245" ) + ( fa_vk . "\xe246" ) + ( fa_weibo . "\xe247" ) + ( fa_renren . "\xe248" ) + ( fa_pagelines . "\xe249" ) + ( fa_stack_exchange . "\xe24a" ) + ( fa_arrow_circle_o_right . "\xe24b" ) + ( fa_arrow_circle_o_left . "\xe24c" ) + ( fa_caret_square_o_left . "\xe24d" ) + ( fa_dot_circle_o . "\xe24e" ) + ( fa_wheelchair . "\xe24f" ) + ( fa_vimeo_square . "\xe250" ) + ( fa_try . "\xe251" ) + ( fa_plus_square_o . "\xe252" ) + ( fa_space_shuttle . "\xe253" ) + ( fa_slack . "\xe254" ) + ( fa_envelope_square . "\xe255" ) + ( fa_wordpress . "\xe256" ) + ( fa_openid . "\xe257" ) + ( fa_bank . "\xe258" ) + ( fa_graduation_cap . "\xe259" ) + ( fa_yahoo . "\xe25a" ) + ( fa_google . "\xe25b" ) + ( fa_reddit . "\xe25c" ) + ( fa_reddit_square . "\xe25d" ) + ( fa_stumbleupon_circle . "\xe25e" ) + ( fa_stumbleupon . "\xe25f" ) + ( fa_delicious . "\xe260" ) + ( fa_digg . "\xe261" ) + ( fa_pied_piper_pp . "\xe262" ) + ( fa_pied_piper_alt . "\xe263" ) + ( fa_drupal . "\xe264" ) + ( fa_joomla . "\xe265" ) + ( fa_language . "\xe266" ) + ( fa_fax . "\xe267" ) + ( fa_building . "\xe268" ) + ( fa_child . "\xe269" ) + ( fa_paw . "\xe26a" ) + ( fa_spoon . "\xe26b" ) + ( fa_cube . "\xe26c" ) + ( fa_cubes . "\xe26d" ) + ( fa_behance . "\xe26e" ) + ( fa_behance_square . "\xe26f" ) + ( fa_steam . "\xe270" ) + ( fa_steam_square . "\xe271" ) + ( fa_recycle . "\xe272" ) + ( fa_automobile . "\xe273" ) + ( fa_cab . "\xe274" ) + ( fa_tree . "\xe275" ) + ( fa_spotify . "\xe276" ) + ( fa_deviantart . "\xe277" ) + ( fa_soundcloud . "\xe278" ) + ( fa_database . "\xe279" ) + ( fa_file_pdf_o . "\xe27a" ) + ( fa_file_word_o . "\xe27b" ) + ( fa_file_excel_o . "\xe27c" ) + ( fa_file_powerpoint_o . "\xe27d" ) + ( fa_file_image_o . "\xe27e" ) + ( fa_file_archive_o . "\xe27f" ) + ( fa_file_audio_o . "\xe280" ) + ( fa_file_movie_o . "\xe281" ) + ( fa_file_code_o . "\xe282" ) + ( fa_vine . "\xe283" ) + ( fa_codepen . "\xe284" ) + ( fa_jsfiddle . "\xe285" ) + ( fa_life_bouy . "\xe286" ) + ( fa_circle_o_notch . "\xe287" ) + ( fa_ra . "\xe288" ) + ( fa_empire . "\xe289" ) + ( fa_git_square . "\xe28a" ) + ( fa_git . "\xe28b" ) + ( fa_hacker_news . "\xe28c" ) + ( fa_tencent_weibo . "\xe28d" ) + ( fa_qq . "\xe28e" ) + ( fa_wechat . "\xe28f" ) + ( fa_paper_plane . "\xe290" ) + ( fa_paper_plane_o . "\xe291" ) + ( fa_history . "\xe292" ) + ( fa_circle_thin . "\xe293" ) + ( fa_header . "\xe294" ) + ( fa_paragraph . "\xe295" ) + ( fa_sliders . "\xe296" ) + ( fa_share_alt . "\xe297" ) + ( fa_share_alt_square . "\xe298" ) + ( fa_bomb . "\xe299" ) + ( fa_futbol_o . "\xe29a" ) + ( fa_tty . "\xe29b" ) + ( fa_binoculars . "\xe29c" ) + ( fa_plug . "\xe29d" ) + ( fa_slideshare . "\xe29e" ) + ( fa_twitch . "\xe29f" ) + ( fa_yelp . "\xe2a0" ) + ( fa_newspaper_o . "\xe2a1" ) + ( fa_wifi . "\xe2a2" ) + ( fa_calculator . "\xe2a3" ) + ( fa_paypal . "\xe2a4" ) + ( fa_google_wallet . "\xe2a5" ) + ( fa_cc_visa . "\xe2a6" ) + ( fa_cc_mastercard . "\xe2a7" ) + ( fa_cc_discover . "\xe2a8" ) + ( fa_cc_amex . "\xe2a9" ) + ( fa_cc_paypal . "\xe2aa" ) + ( fa_cc_stripe . "\xe2ab" ) + ( fa_bell_slash . "\xe2ac" ) + ( fa_bell_slash_o . "\xe2ad" ) + ( fa_trash . "\xe2ae" ) + ( fa_copyright . "\xe2af" ) + ( fa_at . "\xe2b0" ) + ( fa_eyedropper . "\xe2b1" ) + ( fa_paint_brush . "\xe2b2" ) + ( fa_birthday_cake . "\xe2b3" ) + ( fa_area_chart . "\xe2b4" ) + ( fa_pie_chart . "\xe2b5" ) + ( fa_line_chart . "\xe2b6" ) + ( fa_lastfm . "\xe2b7" ) + ( fa_lastfm_square . "\xe2b8" ) + ( fa_toggle_off . "\xe2b9" ) + ( fa_toggle_on . "\xe2ba" ) + ( fa_bicycle . "\xe2bb" ) + ( fa_bus . "\xe2bc" ) + ( fa_ioxhost . "\xe2bd" ) + ( fa_angellist . "\xe2be" ) + ( fa_cc . "\xe2bf" ) + ( fa_ils . "\xe2c0" ) + ( fa_meanpath . "\xe2c1" ) + ( fa_buysellads . "\xe2c2" ) + ( fa_connectdevelop . "\xe2c3" ) + ( fa_dashcube . "\xe2c4" ) + ( fa_forumbee . "\xe2c5" ) + ( fa_leanpub . "\xe2c6" ) + ( fa_sellsy . "\xe2c7" ) + ( fa_shirtsinbulk . "\xe2c8" ) + ( fa_simplybuilt . "\xe2c9" ) + ( fa_skyatlas . "\xe2ca" ) + ( fa_cart_plus . "\xe2cb" ) + ( fa_cart_arrow_down . "\xe2cc" ) + ( fa_diamond . "\xe2cd" ) + ( fa_ship . "\xe2ce" ) + ( fa_user_secret . "\xe2cf" ) + ( fa_motorcycle . "\xe2d0" ) + ( fa_street_view . "\xe2d1" ) + ( fa_heartbeat . "\xe2d2" ) + ( fa_venus . "\xe2d3" ) + ( fa_mars . "\xe2d4" ) + ( fa_mercury . "\xe2d5" ) + ( fa_intersex . "\xe2d6" ) + ( fa_transgender_alt . "\xe2d7" ) + ( fa_venus_double . "\xe2d8" ) + ( fa_mars_double . "\xe2d9" ) + ( fa_venus_mars . "\xe2da" ) + ( fa_mars_stroke . "\xe2db" ) + ( fa_mars_stroke_v . "\xe2dc" ) + ( fa_mars_stroke_h . "\xe2dd" ) + ( fa_neuter . "\xe2de" ) + ( fa_genderless . "\xe2df" ) + ( fa__523 . "\xe2e0" ) + ( fa__524 . "\xe2e1" ) + ( fa_facebook_official . "\xe2e2" ) + ( fa_pinterest_p . "\xe2e3" ) + ( fa_whatsapp . "\xe2e4" ) + ( fa_server . "\xe2e5" ) + ( fa_user_plus . "\xe2e6" ) + ( fa_user_times . "\xe2e7" ) + ( fa_bed . "\xe2e8" ) + ( fa_viacoin . "\xe2e9" ) + ( fa_train . "\xe2ea" ) + ( fa_subway . "\xe2eb" ) + ( fa_medium . "\xe2ec" ) + ( fa_y_combinator . "\xe2ed" ) + ( fa_optin_monster . "\xe2ee" ) + ( fa_opencart . "\xe2ef" ) + ( fa_expeditedssl . "\xe2f0" ) + ( fa_battery . "\xe2f1" ) + ( fa_battery_3 . "\xe2f2" ) + ( fa_battery_2 . "\xe2f3" ) + ( fa_battery_1 . "\xe2f4" ) + ( fa_battery_0 . "\xe2f5" ) + ( fa_mouse_pointer . "\xe2f6" ) + ( fa_i_cursor . "\xe2f7" ) + ( fa_object_group . "\xe2f8" ) + ( fa_object_ungroup . "\xe2f9" ) + ( fa_sticky_note . "\xe2fa" ) + ( fa_sticky_note_o . "\xe2fb" ) + ( fa_cc_jcb . "\xe2fc" ) + ( fa_cc_diners_club . "\xe2fd" ) + ( fa_clone . "\xe2fe" ) + ( fa_balance_scale . "\xe2ff" ) + ( fa_hourglass_o . "\xe300" ) + ( fa_hourglass_1 . "\xe301" ) + ( fa_hourglass_2 . "\xe302" ) + ( fa_hourglass_3 . "\xe303" ) + ( fa_hourglass . "\xe304" ) + ( fa_hand_grab_o . "\xe305" ) + ( fa_hand_paper_o . "\xe306" ) + ( fa_hand_scissors_o . "\xe307" ) + ( fa_hand_lizard_o . "\xe308" ) + ( fa_hand_spock_o . "\xe309" ) + ( fa_hand_pointer_o . "\xe30a" ) + ( fa_hand_peace_o . "\xe30b" ) + ( fa_trademark . "\xe30c" ) + ( fa_registered . "\xe30d" ) + ( fa_creative_commons . "\xe30e" ) + ( fa_gg . "\xe30f" ) + ( fa_gg_circle . "\xe310" ) + ( fa_tripadvisor . "\xe311" ) + ( fa_odnoklassniki . "\xe312" ) + ( fa_odnoklassniki_square . "\xe313" ) + ( fa_get_pocket . "\xe314" ) + ( fa_wikipedia_w . "\xe315" ) + ( fa_safari . "\xe316" ) + ( fa_chrome . "\xe317" ) + ( fa_firefox . "\xe318" ) + ( fa_opera . "\xe319" ) + ( fa_internet_explorer . "\xe31a" ) + ( fa_television . "\xe31b" ) + ( fa_contao . "\xe31c" ) + ( fa_500px . "\xe31d" ) + ( fa_amazon . "\xe31e" ) + ( fa_calendar_plus_o . "\xe31f" ) + ( fa_calendar_minus_o . "\xe320" ) + ( fa_calendar_times_o . "\xe321" ) + ( fa_calendar_check_o . "\xe322" ) + ( fa_industry . "\xe323" ) + ( fa_map_pin . "\xe324" ) + ( fa_map_signs . "\xe325" ) + ( fa_map_o . "\xe326" ) + ( fa_map . "\xe327" ) + ( fa_commenting . "\xe328" ) + ( fa_commenting_o . "\xe329" ) + ( fa_houzz . "\xe32a" ) + ( fa_vimeo . "\xe32b" ) + ( fa_black_tie . "\xe32c" ) + ( fa_fonticons . "\xe32d" ) + ( fa_reddit_alien . "\xe32e" ) + ( fa_edge . "\xe32f" ) + ( fa_credit_card_alt . "\xe330" ) + ( fa_codiepie . "\xe331" ) + ( fa_modx . "\xe332" ) + ( fa_fort_awesome . "\xe333" ) + ( fa_usb . "\xe334" ) + ( fa_product_hunt . "\xe335" ) + ( fa_mixcloud . "\xe336" ) + ( fa_scribd . "\xe337" ) + ( fa_pause_circle . "\xe338" ) + ( fa_pause_circle_o . "\xe339" ) + ( fa_stop_circle . "\xe33a" ) + ( fa_stop_circle_o . "\xe33b" ) + ( fa_shopping_bag . "\xe33c" ) + ( fa_shopping_basket . "\xe33d" ) + ( fa_hashtag . "\xe33e" ) + ( fa_bluetooth . "\xe33f" ) + ( fa_bluetooth_b . "\xe340" ) + ( fa_percent . "\xe341" ) + ( fa_gitlab . "\xe342" ) + ( fa_wpbeginner . "\xe343" ) + ( fa_wpforms . "\xe344" ) + ( fa_envira . "\xe345" ) + ( fa_universal_access . "\xe346" ) + ( fa_wheelchair_alt . "\xe347" ) + ( fa_question_circle_o . "\xe348" ) + ( fa_blind . "\xe349" ) + ( fa_audio_description . "\xe34a" ) + ( fa_volume_control_phone . "\xe34b" ) + ( fa_braille . "\xe34c" ) + ( fa_assistive_listening_systems . "\xe34d" ) + ( fa_american_sign_language_interpreting . "\xe34e" ) + ( fa_deaf . "\xe34f" ) + ( fa_glide . "\xe350" ) + ( fa_glide_g . "\xe351" ) + ( fa_sign_language . "\xe352" ) + ( fa_low_vision . "\xe353" ) + ( fa_viadeo . "\xe354" ) + ( fa_viadeo_square . "\xe355" ) + ( fa_snapchat . "\xe356" ) + ( fa_snapchat_ghost . "\xe357" ) + ( fa_snapchat_square . "\xe358" ) + ( fa_pied_piper . "\xe359" ) + ( fa_first_order . "\xe35a" ) + ( fa_yoast . "\xe35b" ) + ( fa_themeisle . "\xe35c" ) + ( fa_google_plus_circle . "\xe35d" ) + ( fa_fa . "\xe35e" ) + ( fa_handshake_o . "\xe35f" ) + ( fa_envelope_open . "\xe360" ) + ( fa_envelope_open_o . "\xe361" ) + ( fa_linode . "\xe362" ) + ( fa_address_book . "\xe363" ) + ( fa_address_book_o . "\xe364" ) + ( fa_address_card . "\xe365" ) + ( fa_address_card_o . "\xe366" ) + ( fa_user_circle . "\xe367" ) + ( fa_user_circle_o . "\xe368" ) + ( fa_user_o . "\xe369" ) + ( fa_id_badge . "\xe36a" ) + ( fa_drivers_license . "\xe36b" ) + ( fa_drivers_license_o . "\xe36c" ) + ( fa_quora . "\xe36d" ) + ( fa_free_code_camp . "\xe36e" ) + ( fa_telegram . "\xe36f" ) + ( fa_thermometer . "\xe370" ) + ( fa_thermometer_3 . "\xe371" ) + ( fa_thermometer_2 . "\xe372" ) + ( fa_thermometer_1 . "\xe373" ) + ( fa_thermometer_0 . "\xe374" ) + ( fa_shower . "\xe375" ) + ( fa_bath . "\xe376" ) + ( fa_podcast . "\xe377" ) + ( fa_window_maximize . "\xe378" ) + ( fa_window_minimize . "\xe379" ) + ( fa_window_restore . "\xe37a" ) + ( fa_times_rectangle . "\xe37b" ) + ( fa_times_rectangle_o . "\xe37c" ) + ( fa_bandcamp . "\xe37d" ) + ( fa_grav . "\xe37e" ) + ( fa_etsy . "\xe37f" ) + ( fa_imdb . "\xe380" ) + ( fa_ravelry . "\xe381" ) + ( fa_eercast . "\xe382" ) + ( fa_microchip . "\xe383" ) + ( fa_snowflake_o . "\xe384" ) + ( fa_superpowers . "\xe385" ) + ( fa_wpexplorer . "\xe386" ) + ( fa_meetup . "\xe387" ) + ( md_error . "\xe388" ) + ( md_error_outline . "\xe389" ) + ( md_warning . "\xe38a" ) + ( md_add_alert . "\xe38b" ) + ( md_album . "\xe38c" ) + ( md_av_timer . "\xe38d" ) + ( md_closed_caption . "\xe38e" ) + ( md_equalizer . "\xe38f" ) + ( md_explicit . "\xe390" ) + ( md_fast_forward . "\xe391" ) + ( md_fast_rewind . "\xe392" ) + ( md_games . "\xe393" ) + ( md_hearing . "\xe394" ) + ( md_high_quality . "\xe395" ) + ( md_loop . "\xe396" ) + ( md_mic . "\xe397" ) + ( md_mic_none . "\xe398" ) + ( md_mic_off . "\xe399" ) + ( md_movie . "\xe39a" ) + ( md_library_add . "\xe39b" ) + ( md_library_books . "\xe39c" ) + ( md_library_music . "\xe39d" ) + ( md_new_releases . "\xe39e" ) + ( md_not_interested . "\xe39f" ) + ( md_pause . "\xe3a0" ) + ( md_pause_circle_filled . "\xe3a1" ) + ( md_pause_circle_outline . "\xe3a2" ) + ( md_play_arrow . "\xe3a3" ) + ( md_play_circle_filled . "\xe3a4" ) + ( md_play_circle_outline . "\xe3a5" ) + ( md_playlist_add . "\xe3a6" ) + ( md_queue . "\xe3a7" ) + ( md_queue_music . "\xe3a8" ) + ( md_radio . "\xe3a9" ) + ( md_recent_actors . "\xe3aa" ) + ( md_repeat . "\xe3ab" ) + ( md_repeat_one . "\xe3ac" ) + ( md_replay . "\xe3ad" ) + ( md_shuffle . "\xe3ae" ) + ( md_skip_next . "\xe3af" ) + ( md_skip_previous . "\xe3b0" ) + ( md_snooze . "\xe3b1" ) + ( md_stop . "\xe3b2" ) + ( md_subtitles . "\xe3b3" ) + ( md_surround_sound . "\xe3b4" ) + ( md_video_library . "\xe3b5" ) + ( md_videocam . "\xe3b6" ) + ( md_videocam_off . "\xe3b7" ) + ( md_volume_down . "\xe3b8" ) + ( md_volume_mute . "\xe3b9" ) + ( md_volume_off . "\xe3ba" ) + ( md_volume_up . "\xe3bb" ) + ( md_web . "\xe3bc" ) + ( md_hd . "\xe3bd" ) + ( md_sort_by_alpha . "\xe3be" ) + ( md_airplay . "\xe3bf" ) + ( md_forward_10 . "\xe3c0" ) + ( md_forward_30 . "\xe3c1" ) + ( md_forward_5 . "\xe3c2" ) + ( md_replay_10 . "\xe3c3" ) + ( md_replay_30 . "\xe3c4" ) + ( md_replay_5 . "\xe3c5" ) + ( md_add_to_queue . "\xe3c6" ) + ( md_fiber_dvr . "\xe3c7" ) + ( md_fiber_new . "\xe3c8" ) + ( md_playlist_play . "\xe3c9" ) + ( md_art_track . "\xe3ca" ) + ( md_fiber_manual_record . "\xe3cb" ) + ( md_fiber_smart_record . "\xe3cc" ) + ( md_music_video . "\xe3cd" ) + ( md_subscriptions . "\xe3ce" ) + ( md_playlist_add_check . "\xe3cf" ) + ( md_queue_play_next . "\xe3d0" ) + ( md_remove_from_queue . "\xe3d1" ) + ( md_slow_motion_video . "\xe3d2" ) + ( md_web_asset . "\xe3d3" ) + ( md_fiber_pin . "\xe3d4" ) + ( md_branding_watermark . "\xe3d5" ) + ( md_call_to_action . "\xe3d6" ) + ( md_featured_play_list . "\xe3d7" ) + ( md_featured_video . "\xe3d8" ) + ( md_note . "\xe3d9" ) + ( md_video_call . "\xe3da" ) + ( md_video_label . "\xe3db" ) + ( md_business . "\xe3dc" ) + ( md_call . "\xe3dd" ) + ( md_call_end . "\xe3de" ) + ( md_call_made . "\xe3df" ) + ( md_call_merge . "\xe3e0" ) + ( md_call_missed . "\xe3e1" ) + ( md_call_received . "\xe3e2" ) + ( md_call_split . "\xe3e3" ) + ( md_chat . "\xe3e4" ) + ( md_clear_all . "\xe3e5" ) + ( md_comment . "\xe3e6" ) + ( md_contacts . "\xe3e7" ) + ( md_dialer_sip . "\xe3e8" ) + ( md_dialpad . "\xe3e9" ) + ( md_email . "\xe3ea" ) + ( md_forum . "\xe3eb" ) + ( md_import_export . "\xe3ec" ) + ( md_invert_colors_off . "\xe3ed" ) + ( md_live_help . "\xe3ee" ) + ( md_location_off . "\xe3ef" ) + ( md_location_on . "\xe3f0" ) + ( md_message . "\xe3f1" ) + ( md_chat_bubble . "\xe3f2" ) + ( md_chat_bubble_outline . "\xe3f3" ) + ( md_no_sim . "\xe3f4" ) + ( md_phone . "\xe3f5" ) + ( md_portable_wifi_off . "\xe3f6" ) + ( md_contact_phone . "\xe3f7" ) + ( md_contact_mail . "\xe3f8" ) + ( md_ring_volume . "\xe3f9" ) + ( md_speaker_phone . "\xe3fa" ) + ( md_stay_current_landscape . "\xe3fb" ) + ( md_stay_current_portrait . "\xe3fc" ) + ( md_stay_primary_landscape . "\xe3fd" ) + ( md_stay_primary_portrait . "\xe3fe" ) + ( md_swap_calls . "\xe3ff" ) + ( md_textsms . "\xe400" ) + ( md_voicemail . "\xe401" ) + ( md_vpn_key . "\xe402" ) + ( md_phonelink_erase . "\xe403" ) + ( md_phonelink_lock . "\xe404" ) + ( md_phonelink_ring . "\xe405" ) + ( md_phonelink_setup . "\xe406" ) + ( md_present_to_all . "\xe407" ) + ( md_import_contacts . "\xe408" ) + ( md_mail_outline . "\xe409" ) + ( md_screen_share . "\xe40a" ) + ( md_stop_screen_share . "\xe40b" ) + ( md_call_missed_outgoing . "\xe40c" ) + ( md_rss_feed . "\xe40d" ) + ( md_add . "\xe40e" ) + ( md_add_box . "\xe40f" ) + ( md_add_circle . "\xe410" ) + ( md_add_circle_outline . "\xe411" ) + ( md_archive . "\xe412" ) + ( md_backspace . "\xe413" ) + ( md_block . "\xe414" ) + ( md_clear . "\xe415" ) + ( md_content_copy . "\xe416" ) + ( md_content_cut . "\xe417" ) + ( md_content_paste . "\xe418" ) + ( md_create . "\xe419" ) + ( md_drafts . "\xe41a" ) + ( md_filter_list . "\xe41b" ) + ( md_flag . "\xe41c" ) + ( md_forward . "\xe41d" ) + ( md_gesture . "\xe41e" ) + ( md_inbox . "\xe41f" ) + ( md_link . "\xe420" ) + ( md_mail . "\xe421" ) + ( md_markunread . "\xe422" ) + ( md_redo . "\xe423" ) + ( md_remove . "\xe424" ) + ( md_remove_circle . "\xe425" ) + ( md_remove_circle_outline . "\xe426" ) + ( md_reply . "\xe427" ) + ( md_reply_all . "\xe428" ) + ( md_report . "\xe429" ) + ( md_save . "\xe42a" ) + ( md_select_all . "\xe42b" ) + ( md_send . "\xe42c" ) + ( md_sort . "\xe42d" ) + ( md_text_format . "\xe42e" ) + ( md_undo . "\xe42f" ) + ( md_font_download . "\xe430" ) + ( md_move_to_inbox . "\xe431" ) + ( md_unarchive . "\xe432" ) + ( md_next_week . "\xe433" ) + ( md_weekend . "\xe434" ) + ( md_delete_sweep . "\xe435" ) + ( md_low_priority . "\xe436" ) + ( md_access_alarm . "\xe437" ) + ( md_access_alarms . "\xe438" ) + ( md_access_time . "\xe439" ) + ( md_add_alarm . "\xe43a" ) + ( md_airplanemode_inactive . "\xe43b" ) + ( md_airplanemode_active . "\xe43c" ) + ( md_battery_alert . "\xe43d" ) + ( md_battery_charging_full . "\xe43e" ) + ( md_battery_full . "\xe43f" ) + ( md_battery_std . "\xe440" ) + ( md_battery_unknown . "\xe441" ) + ( md_bluetooth . "\xe442" ) + ( md_bluetooth_connected . "\xe443" ) + ( md_bluetooth_disabled . "\xe444" ) + ( md_bluetooth_searching . "\xe445" ) + ( md_brightness_auto . "\xe446" ) + ( md_brightness_high . "\xe447" ) + ( md_brightness_low . "\xe448" ) + ( md_brightness_medium . "\xe449" ) + ( md_data_usage . "\xe44a" ) + ( md_developer_mode . "\xe44b" ) + ( md_devices . "\xe44c" ) + ( md_dvr . "\xe44d" ) + ( md_gps_fixed . "\xe44e" ) + ( md_gps_not_fixed . "\xe44f" ) + ( md_gps_off . "\xe450" ) + ( md_location_disabled . "\xe451" ) + ( md_location_searching . "\xe452" ) + ( md_graphic_eq . "\xe453" ) + ( md_network_cell . "\xe454" ) + ( md_network_wifi . "\xe455" ) + ( md_nfc . "\xe456" ) + ( md_wallpaper . "\xe457" ) + ( md_widgets . "\xe458" ) + ( md_screen_lock_landscape . "\xe459" ) + ( md_screen_lock_portrait . "\xe45a" ) + ( md_screen_lock_rotation . "\xe45b" ) + ( md_screen_rotation . "\xe45c" ) + ( md_sd_storage . "\xe45d" ) + ( md_settings_system_daydream . "\xe45e" ) + ( md_signal_cellular_4_bar . "\xe45f" ) + ( md_signal_cellular_connected_no_internet_4_bar . "\xe460" ) + ( md_signal_cellular_no_sim . "\xe461" ) + ( md_signal_cellular_null . "\xe462" ) + ( md_signal_cellular_off . "\xe463" ) + ( md_signal_wifi_4_bar . "\xe464" ) + ( md_signal_wifi_4_bar_lock . "\xe465" ) + ( md_signal_wifi_off . "\xe466" ) + ( md_storage . "\xe467" ) + ( md_usb . "\xe468" ) + ( md_wifi_lock . "\xe469" ) + ( md_wifi_tethering . "\xe46a" ) + ( md_attach_file . "\xe46b" ) + ( md_attach_money . "\xe46c" ) + ( md_border_all . "\xe46d" ) + ( md_border_bottom . "\xe46e" ) + ( md_border_clear . "\xe46f" ) + ( md_border_color . "\xe470" ) + ( md_border_horizontal . "\xe471" ) + ( md_border_inner . "\xe472" ) + ( md_border_left . "\xe473" ) + ( md_border_outer . "\xe474" ) + ( md_border_right . "\xe475" ) + ( md_border_style . "\xe476" ) + ( md_border_top . "\xe477" ) + ( md_border_vertical . "\xe478" ) + ( md_format_align_center . "\xe479" ) + ( md_format_align_justify . "\xe47a" ) + ( md_format_align_left . "\xe47b" ) + ( md_format_align_right . "\xe47c" ) + ( md_format_bold . "\xe47d" ) + ( md_format_clear . "\xe47e" ) + ( md_format_color_fill . "\xe47f" ) + ( md_format_color_reset . "\xe480" ) + ( md_format_color_text . "\xe481" ) + ( md_format_indent_decrease . "\xe482" ) + ( md_format_indent_increase . "\xe483" ) + ( md_format_italic . "\xe484" ) + ( md_format_line_spacing . "\xe485" ) + ( md_format_list_bulleted . "\xe486" ) + ( md_format_list_numbered . "\xe487" ) + ( md_format_paint . "\xe488" ) + ( md_format_quote . "\xe489" ) + ( md_format_size . "\xe48a" ) + ( md_format_strikethrough . "\xe48b" ) + ( md_format_textdirection_l_to_r . "\xe48c" ) + ( md_format_textdirection_r_to_l . "\xe48d" ) + ( md_format_underlined . "\xe48e" ) + ( md_functions . "\xe48f" ) + ( md_insert_chart . "\xe490" ) + ( md_insert_comment . "\xe491" ) + ( md_insert_drive_file . "\xe492" ) + ( md_insert_emoticon . "\xe493" ) + ( md_insert_invitation . "\xe494" ) + ( md_insert_link . "\xe495" ) + ( md_insert_photo . "\xe496" ) + ( md_merge_type . "\xe497" ) + ( md_mode_comment . "\xe498" ) + ( md_mode_edit . "\xe499" ) + ( md_publish . "\xe49a" ) + ( md_space_bar . "\xe49b" ) + ( md_strikethrough_s . "\xe49c" ) + ( md_vertical_align_bottom . "\xe49d" ) + ( md_vertical_align_center . "\xe49e" ) + ( md_vertical_align_top . "\xe49f" ) + ( md_wrap_text . "\xe4a0" ) + ( md_money_off . "\xe4a1" ) + ( md_drag_handle . "\xe4a2" ) + ( md_format_shapes . "\xe4a3" ) + ( md_highlight . "\xe4a4" ) + ( md_linear_scale . "\xe4a5" ) + ( md_short_text . "\xe4a6" ) + ( md_text_fields . "\xe4a7" ) + ( md_monetization_on . "\xe4a8" ) + ( md_title . "\xe4a9" ) + ( md_attachment . "\xe4aa" ) + ( md_cloud . "\xe4ab" ) + ( md_cloud_circle . "\xe4ac" ) + ( md_cloud_done . "\xe4ad" ) + ( md_cloud_download . "\xe4ae" ) + ( md_cloud_off . "\xe4af" ) + ( md_cloud_queue . "\xe4b0" ) + ( md_cloud_upload . "\xe4b1" ) + ( md_file_download . "\xe4b2" ) + ( md_file_upload . "\xe4b3" ) + ( md_folder . "\xe4b4" ) + ( md_folder_open . "\xe4b5" ) + ( md_folder_shared . "\xe4b6" ) + ( md_create_new_folder . "\xe4b7" ) + ( md_cast . "\xe4b8" ) + ( md_cast_connected . "\xe4b9" ) + ( md_computer . "\xe4ba" ) + ( md_desktop_mac . "\xe4bb" ) + ( md_desktop_windows . "\xe4bc" ) + ( md_developer_board . "\xe4bd" ) + ( md_dock . "\xe4be" ) + ( md_gamepad . "\xe4bf" ) + ( md_headset . "\xe4c0" ) + ( md_headset_mic . "\xe4c1" ) + ( md_keyboard . "\xe4c2" ) + ( md_keyboard_arrow_down . "\xe4c3" ) + ( md_keyboard_arrow_left . "\xe4c4" ) + ( md_keyboard_arrow_right . "\xe4c5" ) + ( md_keyboard_arrow_up . "\xe4c6" ) + ( md_keyboard_backspace . "\xe4c7" ) + ( md_keyboard_capslock . "\xe4c8" ) + ( md_keyboard_hide . "\xe4c9" ) + ( md_keyboard_return . "\xe4ca" ) + ( md_keyboard_tab . "\xe4cb" ) + ( md_keyboard_voice . "\xe4cc" ) + ( md_laptop . "\xe4cd" ) + ( md_laptop_chromebook . "\xe4ce" ) + ( md_laptop_mac . "\xe4cf" ) + ( md_laptop_windows . "\xe4d0" ) + ( md_memory . "\xe4d1" ) + ( md_mouse . "\xe4d2" ) + ( md_phone_android . "\xe4d3" ) + ( md_phone_iphone . "\xe4d4" ) + ( md_phonelink . "\xe4d5" ) + ( md_phonelink_off . "\xe4d6" ) + ( md_router . "\xe4d7" ) + ( md_scanner . "\xe4d8" ) + ( md_security . "\xe4d9" ) + ( md_sim_card . "\xe4da" ) + ( md_smartphone . "\xe4db" ) + ( md_speaker . "\xe4dc" ) + ( md_speaker_group . "\xe4dd" ) + ( md_tablet . "\xe4de" ) + ( md_tablet_android . "\xe4df" ) + ( md_tablet_mac . "\xe4e0" ) + ( md_toys . "\xe4e1" ) + ( md_tv . "\xe4e2" ) + ( md_watch . "\xe4e3" ) + ( md_device_hub . "\xe4e4" ) + ( md_power_input . "\xe4e5" ) + ( md_devices_other . "\xe4e6" ) + ( md_videogame_asset . "\xe4e7" ) + ( md_add_to_photos . "\xe4e8" ) + ( md_adjust . "\xe4e9" ) + ( md_assistant . "\xe4ea" ) + ( md_assistant_photo . "\xe4eb" ) + ( md_audiotrack . "\xe4ec" ) + ( md_blur_circular . "\xe4ed" ) + ( md_blur_linear . "\xe4ee" ) + ( md_blur_off . "\xe4ef" ) + ( md_blur_on . "\xe4f0" ) + ( md_brightness_1 . "\xe4f1" ) + ( md_brightness_2 . "\xe4f2" ) + ( md_brightness_3 . "\xe4f3" ) + ( md_brightness_4 . "\xe4f4" ) + ( md_brightness_5 . "\xe4f5" ) + ( md_brightness_6 . "\xe4f6" ) + ( md_brightness_7 . "\xe4f7" ) + ( md_broken_image . "\xe4f8" ) + ( md_brush . "\xe4f9" ) + ( md_camera . "\xe4fa" ) + ( md_camera_alt . "\xe4fb" ) + ( md_camera_front . "\xe4fc" ) + ( md_camera_rear . "\xe4fd" ) + ( md_camera_roll . "\xe4fe" ) + ( md_center_focus_strong . "\xe4ff" ) + ( md_center_focus_weak . "\xe500" ) + ( md_collections . "\xe501" ) + ( md_color_lens . "\xe502" ) + ( md_colorize . "\xe503" ) + ( md_compare . "\xe504" ) + ( md_control_point . "\xe505" ) + ( md_control_point_duplicate . "\xe506" ) + ( md_crop_16_9 . "\xe507" ) + ( md_crop_3_2 . "\xe508" ) + ( md_crop . "\xe509" ) + ( md_crop_5_4 . "\xe50a" ) + ( md_crop_7_5 . "\xe50b" ) + ( md_crop_din . "\xe50c" ) + ( md_crop_free . "\xe50d" ) + ( md_crop_landscape . "\xe50e" ) + ( md_crop_original . "\xe50f" ) + ( md_crop_portrait . "\xe510" ) + ( md_crop_square . "\xe511" ) + ( md_dehaze . "\xe512" ) + ( md_details . "\xe513" ) + ( md_edit . "\xe514" ) + ( md_exposure . "\xe515" ) + ( md_exposure_neg_1 . "\xe516" ) + ( md_exposure_neg_2 . "\xe517" ) + ( md_exposure_plus_1 . "\xe518" ) + ( md_exposure_plus_2 . "\xe519" ) + ( md_exposure_zero . "\xe51a" ) + ( md_filter_1 . "\xe51b" ) + ( md_filter_2 . "\xe51c" ) + ( md_filter_3 . "\xe51d" ) + ( md_filter . "\xe51e" ) + ( md_filter_4 . "\xe51f" ) + ( md_filter_5 . "\xe520" ) + ( md_filter_6 . "\xe521" ) + ( md_filter_7 . "\xe522" ) + ( md_filter_8 . "\xe523" ) + ( md_filter_9 . "\xe524" ) + ( md_filter_9_plus . "\xe525" ) + ( md_filter_b_and_w . "\xe526" ) + ( md_filter_center_focus . "\xe527" ) + ( md_filter_drama . "\xe528" ) + ( md_filter_frames . "\xe529" ) + ( md_filter_hdr . "\xe52a" ) + ( md_filter_none . "\xe52b" ) + ( md_filter_tilt_shift . "\xe52c" ) + ( md_filter_vintage . "\xe52d" ) + ( md_flare . "\xe52e" ) + ( md_flash_auto . "\xe52f" ) + ( md_flash_off . "\xe530" ) + ( md_flash_on . "\xe531" ) + ( md_flip . "\xe532" ) + ( md_gradient . "\xe533" ) + ( md_grain . "\xe534" ) + ( md_grid_off . "\xe535" ) + ( md_grid_on . "\xe536" ) + ( md_hdr_off . "\xe537" ) + ( md_hdr_on . "\xe538" ) + ( md_hdr_strong . "\xe539" ) + ( md_hdr_weak . "\xe53a" ) + ( md_healing . "\xe53b" ) + ( md_image . "\xe53c" ) + ( md_image_aspect_ratio . "\xe53d" ) + ( md_iso . "\xe53e" ) + ( md_landscape . "\xe53f" ) + ( md_leak_add . "\xe540" ) + ( md_leak_remove . "\xe541" ) + ( md_lens . "\xe542" ) + ( md_looks_3 . "\xe543" ) + ( md_looks . "\xe544" ) + ( md_looks_4 . "\xe545" ) + ( md_looks_5 . "\xe546" ) + ( md_looks_6 . "\xe547" ) + ( md_looks_one . "\xe548" ) + ( md_looks_two . "\xe549" ) + ( md_loupe . "\xe54a" ) + ( md_monochrome_photos . "\xe54b" ) + ( md_movie_creation . "\xe54c" ) + ( md_music_note . "\xe54d" ) + ( md_nature . "\xe54e" ) + ( md_nature_people . "\xe54f" ) + ( md_navigate_before . "\xe550" ) + ( md_navigate_next . "\xe551" ) + ( md_palette . "\xe552" ) + ( md_panorama . "\xe553" ) + ( md_panorama_fish_eye . "\xe554" ) + ( md_panorama_horizontal . "\xe555" ) + ( md_panorama_vertical . "\xe556" ) + ( md_panorama_wide_angle . "\xe557" ) + ( md_photo . "\xe558" ) + ( md_photo_album . "\xe559" ) + ( md_photo_camera . "\xe55a" ) + ( md_photo_library . "\xe55b" ) + ( md_picture_as_pdf . "\xe55c" ) + ( md_portrait . "\xe55d" ) + ( md_remove_red_eye . "\xe55e" ) + ( md_rotate_90_degrees_ccw . "\xe55f" ) + ( md_rotate_left . "\xe560" ) + ( md_rotate_right . "\xe561" ) + ( md_slideshow . "\xe562" ) + ( md_straighten . "\xe563" ) + ( md_style . "\xe564" ) + ( md_switch_camera . "\xe565" ) + ( md_switch_video . "\xe566" ) + ( md_tag_faces . "\xe567" ) + ( md_texture . "\xe568" ) + ( md_timelapse . "\xe569" ) + ( md_timer_10 . "\xe56a" ) + ( md_timer_3 . "\xe56b" ) + ( md_timer . "\xe56c" ) + ( md_timer_off . "\xe56d" ) + ( md_tonality . "\xe56e" ) + ( md_transform . "\xe56f" ) + ( md_tune . "\xe570" ) + ( md_view_comfy . "\xe571" ) + ( md_view_compact . "\xe572" ) + ( md_wb_auto . "\xe573" ) + ( md_wb_cloudy . "\xe574" ) + ( md_wb_incandescent . "\xe575" ) + ( md_wb_sunny . "\xe576" ) + ( md_collections_bookmark . "\xe577" ) + ( md_photo_size_select_actual . "\xe578" ) + ( md_photo_size_select_large . "\xe579" ) + ( md_photo_size_select_small . "\xe57a" ) + ( md_vignette . "\xe57b" ) + ( md_wb_iridescent . "\xe57c" ) + ( md_crop_rotate . "\xe57d" ) + ( md_linked_camera . "\xe57e" ) + ( md_add_a_photo . "\xe57f" ) + ( md_movie_filter . "\xe580" ) + ( md_photo_filter . "\xe581" ) + ( md_burst_mode . "\xe582" ) + ( md_beenhere . "\xe583" ) + ( md_directions . "\xe584" ) + ( md_directions_bike . "\xe585" ) + ( md_directions_bus . "\xe586" ) + ( md_directions_car . "\xe587" ) + ( md_directions_boat . "\xe588" ) + ( md_directions_subway . "\xe589" ) + ( md_directions_railway . "\xe58a" ) + ( md_directions_transit . "\xe58b" ) + ( md_directions_walk . "\xe58c" ) + ( md_flight . "\xe58d" ) + ( md_hotel . "\xe58e" ) + ( md_layers . "\xe58f" ) + ( md_layers_clear . "\xe590" ) + ( md_local_airport . "\xe591" ) + ( md_local_atm . "\xe592" ) + ( md_local_activity . "\xe593" ) + ( md_local_bar . "\xe594" ) + ( md_local_cafe . "\xe595" ) + ( md_local_car_wash . "\xe596" ) + ( md_local_convenience_store . "\xe597" ) + ( md_local_drink . "\xe598" ) + ( md_local_florist . "\xe599" ) + ( md_local_gas_station . "\xe59a" ) + ( md_local_grocery_store . "\xe59b" ) + ( md_local_hospital . "\xe59c" ) + ( md_local_hotel . "\xe59d" ) + ( md_local_laundry_service . "\xe59e" ) + ( md_local_library . "\xe59f" ) + ( md_local_mall . "\xe5a0" ) + ( md_local_movies . "\xe5a1" ) + ( md_local_offer . "\xe5a2" ) + ( md_local_parking . "\xe5a3" ) + ( md_local_pharmacy . "\xe5a4" ) + ( md_local_phone . "\xe5a5" ) + ( md_local_pizza . "\xe5a6" ) + ( md_local_play . "\xe5a7" ) + ( md_local_post_office . "\xe5a8" ) + ( md_local_printshop . "\xe5a9" ) + ( md_local_dining . "\xe5aa" ) + ( md_local_see . "\xe5ab" ) + ( md_local_shipping . "\xe5ac" ) + ( md_local_taxi . "\xe5ad" ) + ( md_person_pin . "\xe5ae" ) + ( md_map . "\xe5af" ) + ( md_my_location . "\xe5b0" ) + ( md_navigation . "\xe5b1" ) + ( md_pin_drop . "\xe5b2" ) + ( md_place . "\xe5b3" ) + ( md_rate_review . "\xe5b4" ) + ( md_restaurant_menu . "\xe5b5" ) + ( md_satellite . "\xe5b6" ) + ( md_store_mall_directory . "\xe5b7" ) + ( md_terrain . "\xe5b8" ) + ( md_traffic . "\xe5b9" ) + ( md_directions_run . "\xe5ba" ) + ( md_add_location . "\xe5bb" ) + ( md_edit_location . "\xe5bc" ) + ( md_near_me . "\xe5bd" ) + ( md_person_pin_circle . "\xe5be" ) + ( md_zoom_out_map . "\xe5bf" ) + ( md_restaurant . "\xe5c0" ) + ( md_ev_station . "\xe5c1" ) + ( md_streetview . "\xe5c2" ) + ( md_subway . "\xe5c3" ) + ( md_train . "\xe5c4" ) + ( md_tram . "\xe5c5" ) + ( md_transfer_within_a_station . "\xe5c6" ) + ( md_apps . "\xe5c7" ) + ( md_arrow_back . "\xe5c8" ) + ( md_arrow_drop_down . "\xe5c9" ) + ( md_arrow_drop_down_circle . "\xe5ca" ) + ( md_arrow_drop_up . "\xe5cb" ) + ( md_arrow_forward . "\xe5cc" ) + ( md_cancel . "\xe5cd" ) + ( md_check . "\xe5ce" ) + ( md_chevron_left . "\xe5cf" ) + ( md_chevron_right . "\xe5d0" ) + ( md_close . "\xe5d1" ) + ( md_expand_less . "\xe5d2" ) + ( md_expand_more . "\xe5d3" ) + ( md_fullscreen . "\xe5d4" ) + ( md_fullscreen_exit . "\xe5d5" ) + ( md_menu . "\xe5d6" ) + ( md_more_horiz . "\xe5d7" ) + ( md_more_vert . "\xe5d8" ) + ( md_refresh . "\xe5d9" ) + ( md_unfold_less . "\xe5da" ) + ( md_unfold_more . "\xe5db" ) + ( md_arrow_upward . "\xe5dc" ) + ( md_subdirectory_arrow_left . "\xe5dd" ) + ( md_subdirectory_arrow_right . "\xe5de" ) + ( md_arrow_downward . "\xe5df" ) + ( md_first_page . "\xe5e0" ) + ( md_last_page . "\xe5e1" ) + ( md_adb . "\xe5e2" ) + ( md_bluetooth_audio . "\xe5e3" ) + ( md_disc_full . "\xe5e4" ) + ( md_do_not_disturb_alt . "\xe5e5" ) + ( md_do_not_disturb . "\xe5e6" ) + ( md_drive_eta . "\xe5e7" ) + ( md_event_available . "\xe5e8" ) + ( md_event_busy . "\xe5e9" ) + ( md_event_note . "\xe5ea" ) + ( md_folder_special . "\xe5eb" ) + ( md_mms . "\xe5ec" ) + ( md_more . "\xe5ed" ) + ( md_network_locked . "\xe5ee" ) + ( md_phone_bluetooth_speaker . "\xe5ef" ) + ( md_phone_forwarded . "\xe5f0" ) + ( md_phone_in_talk . "\xe5f1" ) + ( md_phone_locked . "\xe5f2" ) + ( md_phone_missed . "\xe5f3" ) + ( md_phone_paused . "\xe5f4" ) + ( md_sd_card . "\xe5f5" ) + ( md_sim_card_alert . "\xe5f6" ) + ( md_sms . "\xe5f7" ) + ( md_sms_failed . "\xe5f8" ) + ( md_sync . "\xe5f9" ) + ( md_sync_disabled . "\xe5fa" ) + ( md_sync_problem . "\xe5fb" ) + ( md_system_update . "\xe5fc" ) + ( md_tap_and_play . "\xe5fd" ) + ( md_time_to_leave . "\xe5fe" ) + ( md_vibration . "\xe5ff" ) + ( md_voice_chat . "\xe600" ) + ( md_vpn_lock . "\xe601" ) + ( md_airline_seat_flat . "\xe602" ) + ( md_airline_seat_flat_angled . "\xe603" ) + ( md_airline_seat_individual_suite . "\xe604" ) + ( md_airline_seat_legroom_extra . "\xe605" ) + ( md_airline_seat_legroom_normal . "\xe606" ) + ( md_airline_seat_legroom_reduced . "\xe607" ) + ( md_airline_seat_recline_extra . "\xe608" ) + ( md_airline_seat_recline_normal . "\xe609" ) + ( md_confirmation_number . "\xe60a" ) + ( md_live_tv . "\xe60b" ) + ( md_ondemand_video . "\xe60c" ) + ( md_personal_video . "\xe60d" ) + ( md_power . "\xe60e" ) + ( md_wc . "\xe60f" ) + ( md_wifi . "\xe610" ) + ( md_enhanced_encryption . "\xe611" ) + ( md_network_check . "\xe612" ) + ( md_no_encryption . "\xe613" ) + ( md_rv_hookup . "\xe614" ) + ( md_do_not_disturb_off . "\xe615" ) + ( md_do_not_disturb_on . "\xe616" ) + ( md_priority_high . "\xe617" ) + ( md_pie_chart . "\xe618" ) + ( md_pie_chart_outlined . "\xe619" ) + ( md_bubble_chart . "\xe61a" ) + ( md_multiline_chart . "\xe61b" ) + ( md_show_chart . "\xe61c" ) + ( md_cake . "\xe61d" ) + ( md_domain . "\xe61e" ) + ( md_group . "\xe61f" ) + ( md_group_add . "\xe620" ) + ( md_location_city . "\xe621" ) + ( md_mood . "\xe622" ) + ( md_mood_bad . "\xe623" ) + ( md_notifications . "\xe624" ) + ( md_notifications_none . "\xe625" ) + ( md_notifications_off . "\xe626" ) + ( md_notifications_active . "\xe627" ) + ( md_notifications_paused . "\xe628" ) + ( md_pages . "\xe629" ) + ( md_party_mode . "\xe62a" ) + ( md_people . "\xe62b" ) + ( md_people_outline . "\xe62c" ) + ( md_person . "\xe62d" ) + ( md_person_add . "\xe62e" ) + ( md_person_outline . "\xe62f" ) + ( md_plus_one . "\xe630" ) + ( md_poll . "\xe631" ) + ( md_public . "\xe632" ) + ( md_school . "\xe633" ) + ( md_share . "\xe634" ) + ( md_whatshot . "\xe635" ) + ( md_sentiment_dissatisfied . "\xe636" ) + ( md_sentiment_neutral . "\xe637" ) + ( md_sentiment_satisfied . "\xe638" ) + ( md_sentiment_very_dissatisfied . "\xe639" ) + ( md_sentiment_very_satisfied . "\xe63a" ) + ( md_check_box . "\xe63b" ) + ( md_check_box_outline_blank . "\xe63c" ) + ( md_radio_button_unchecked . "\xe63d" ) + ( md_radio_button_checked . "\xe63e" ) + ( md_star . "\xe63f" ) + ( md_star_half . "\xe640" ) + ( md_star_border . "\xe641" ) + ( md_3d_rotation . "\xe642" ) + ( md_accessibility . "\xe643" ) + ( md_account_balance . "\xe644" ) + ( md_account_balance_wallet . "\xe645" ) + ( md_account_box . "\xe646" ) + ( md_account_circle . "\xe647" ) + ( md_add_shopping_cart . "\xe648" ) + ( md_alarm . "\xe649" ) + ( md_alarm_add . "\xe64a" ) + ( md_alarm_off . "\xe64b" ) + ( md_alarm_on . "\xe64c" ) + ( md_android . "\xe64d" ) + ( md_announcement . "\xe64e" ) + ( md_aspect_ratio . "\xe64f" ) + ( md_assessment . "\xe650" ) + ( md_assignment . "\xe651" ) + ( md_assignment_ind . "\xe652" ) + ( md_assignment_late . "\xe653" ) + ( md_assignment_return . "\xe654" ) + ( md_assignment_returned . "\xe655" ) + ( md_assignment_turned_in . "\xe656" ) + ( md_autorenew . "\xe657" ) + ( md_backup . "\xe658" ) + ( md_book . "\xe659" ) + ( md_bookmark . "\xe65a" ) + ( md_bookmark_border . "\xe65b" ) + ( md_bug_report . "\xe65c" ) + ( md_build . "\xe65d" ) + ( md_cached . "\xe65e" ) + ( md_change_history . "\xe65f" ) + ( md_check_circle . "\xe660" ) + ( md_chrome_reader_mode . "\xe661" ) + ( md_class . "\xe662" ) + ( md_code . "\xe663" ) + ( md_credit_card . "\xe664" ) + ( md_dashboard . "\xe665" ) + ( md_delete . "\xe666" ) + ( md_description . "\xe667" ) + ( md_dns . "\xe668" ) + ( md_done . "\xe669" ) + ( md_done_all . "\xe66a" ) + ( md_event . "\xe66b" ) + ( md_exit_to_app . "\xe66c" ) + ( md_explore . "\xe66d" ) + ( md_extension . "\xe66e" ) + ( md_face . "\xe66f" ) + ( md_favorite . "\xe670" ) + ( md_favorite_border . "\xe671" ) + ( md_feedback . "\xe672" ) + ( md_find_in_page . "\xe673" ) + ( md_find_replace . "\xe674" ) + ( md_flip_to_back . "\xe675" ) + ( md_flip_to_front . "\xe676" ) + ( md_get_app . "\xe677" ) + ( md_grade . "\xe678" ) + ( md_group_work . "\xe679" ) + ( md_help . "\xe67a" ) + ( md_highlight_off . "\xe67b" ) + ( md_history . "\xe67c" ) + ( md_home . "\xe67d" ) + ( md_hourglass_empty . "\xe67e" ) + ( md_hourglass_full . "\xe67f" ) + ( md_https . "\xe680" ) + ( md_info . "\xe681" ) + ( md_info_outline . "\xe682" ) + ( md_input . "\xe683" ) + ( md_invert_colors . "\xe684" ) + ( md_label . "\xe685" ) + ( md_label_outline . "\xe686" ) + ( md_language . "\xe687" ) + ( md_launch . "\xe688" ) + ( md_list . "\xe689" ) + ( md_lock . "\xe68a" ) + ( md_lock_open . "\xe68b" ) + ( md_lock_outline . "\xe68c" ) + ( md_loyalty . "\xe68d" ) + ( md_markunread_mailbox . "\xe68e" ) + ( md_note_add . "\xe68f" ) + ( md_open_in_browser . "\xe690" ) + ( md_open_in_new . "\xe691" ) + ( md_open_with . "\xe692" ) + ( md_pageview . "\xe693" ) + ( md_payment . "\xe694" ) + ( md_perm_camera_mic . "\xe695" ) + ( md_perm_contact_calendar . "\xe696" ) + ( md_perm_data_setting . "\xe697" ) + ( md_perm_device_information . "\xe698" ) + ( md_perm_identity . "\xe699" ) + ( md_perm_media . "\xe69a" ) + ( md_perm_phone_msg . "\xe69b" ) + ( md_perm_scan_wifi . "\xe69c" ) + ( md_picture_in_picture . "\xe69d" ) + ( md_polymer . "\xe69e" ) + ( md_power_settings_new . "\xe69f" ) + ( md_print . "\xe6a0" ) + ( md_query_builder . "\xe6a1" ) + ( md_question_answer . "\xe6a2" ) + ( md_receipt . "\xe6a3" ) + ( md_redeem . "\xe6a4" ) + ( md_report_problem . "\xe6a5" ) + ( md_restore . "\xe6a6" ) + ( md_room . "\xe6a7" ) + ( md_schedule . "\xe6a8" ) + ( md_search . "\xe6a9" ) + ( md_settings . "\xe6aa" ) + ( md_settings_applications . "\xe6ab" ) + ( md_settings_backup_restore . "\xe6ac" ) + ( md_settings_bluetooth . "\xe6ad" ) + ( md_settings_cell . "\xe6ae" ) + ( md_settings_brightness . "\xe6af" ) + ( md_settings_ethernet . "\xe6b0" ) + ( md_settings_input_antenna . "\xe6b1" ) + ( md_settings_input_component . "\xe6b2" ) + ( md_settings_input_composite . "\xe6b3" ) + ( md_settings_input_hdmi . "\xe6b4" ) + ( md_settings_input_svideo . "\xe6b5" ) + ( md_settings_overscan . "\xe6b6" ) + ( md_settings_phone . "\xe6b7" ) + ( md_settings_power . "\xe6b8" ) + ( md_settings_remote . "\xe6b9" ) + ( md_settings_voice . "\xe6ba" ) + ( md_shop . "\xe6bb" ) + ( md_shop_two . "\xe6bc" ) + ( md_shopping_basket . "\xe6bd" ) + ( md_shopping_cart . "\xe6be" ) + ( md_speaker_notes . "\xe6bf" ) + ( md_spellcheck . "\xe6c0" ) + ( md_stars . "\xe6c1" ) + ( md_store . "\xe6c2" ) + ( md_subject . "\xe6c3" ) + ( md_supervisor_account . "\xe6c4" ) + ( md_swap_horiz . "\xe6c5" ) + ( md_swap_vert . "\xe6c6" ) + ( md_swap_vertical_circle . "\xe6c7" ) + ( md_system_update_alt . "\xe6c8" ) + ( md_tab . "\xe6c9" ) + ( md_tab_unselected . "\xe6ca" ) + ( md_theaters . "\xe6cb" ) + ( md_thumb_down . "\xe6cc" ) + ( md_thumb_up . "\xe6cd" ) + ( md_thumbs_up_down . "\xe6ce" ) + ( md_toc . "\xe6cf" ) + ( md_today . "\xe6d0" ) + ( md_toll . "\xe6d1" ) + ( md_track_changes . "\xe6d2" ) + ( md_translate . "\xe6d3" ) + ( md_trending_down . "\xe6d4" ) + ( md_trending_flat . "\xe6d5" ) + ( md_trending_up . "\xe6d6" ) + ( md_turned_in . "\xe6d7" ) + ( md_turned_in_not . "\xe6d8" ) + ( md_verified_user . "\xe6d9" ) + ( md_view_agenda . "\xe6da" ) + ( md_view_array . "\xe6db" ) + ( md_view_carousel . "\xe6dc" ) + ( md_view_column . "\xe6dd" ) + ( md_view_day . "\xe6de" ) + ( md_view_headline . "\xe6df" ) + ( md_view_list . "\xe6e0" ) + ( md_view_module . "\xe6e1" ) + ( md_view_quilt . "\xe6e2" ) + ( md_view_stream . "\xe6e3" ) + ( md_view_week . "\xe6e4" ) + ( md_visibility . "\xe6e5" ) + ( md_visibility_off . "\xe6e6" ) + ( md_card_giftcard . "\xe6e7" ) + ( md_card_membership . "\xe6e8" ) + ( md_card_travel . "\xe6e9" ) + ( md_work . "\xe6ea" ) + ( md_youtube_searched_for . "\xe6eb" ) + ( md_eject . "\xe6ec" ) + ( md_camera_enhance . "\xe6ed" ) + ( md_help_outline . "\xe6ee" ) + ( md_reorder . "\xe6ef" ) + ( md_zoom_in . "\xe6f0" ) + ( md_zoom_out . "\xe6f1" ) + ( md_http . "\xe6f2" ) + ( md_event_seat . "\xe6f3" ) + ( md_flight_land . "\xe6f4" ) + ( md_flight_takeoff . "\xe6f5" ) + ( md_play_for_work . "\xe6f6" ) + ( md_gif . "\xe6f7" ) + ( md_indeterminate_check_box . "\xe6f8" ) + ( md_offline_pin . "\xe6f9" ) + ( md_all_out . "\xe6fa" ) + ( md_copyright . "\xe6fb" ) + ( md_fingerprint . "\xe6fc" ) + ( md_gavel . "\xe6fd" ) + ( md_lightbulb_outline . "\xe6fe" ) + ( md_picture_in_picture_alt . "\xe6ff" ) + ( md_important_devices . "\xe700" ) + ( md_touch_app . "\xe701" ) + ( md_accessible . "\xe702" ) + ( md_compare_arrows . "\xe703" ) + ( md_date_range . "\xe704" ) + ( md_donut_large . "\xe705" ) + ( md_donut_small . "\xe706" ) + ( md_line_style . "\xe707" ) + ( md_line_weight . "\xe708" ) + ( md_motorcycle . "\xe709" ) + ( md_opacity . "\xe70a" ) + ( md_pets . "\xe70b" ) + ( md_pregnant_woman . "\xe70c" ) + ( md_record_voice_over . "\xe70d" ) + ( md_rounded_corner . "\xe70e" ) + ( md_rowing . "\xe70f" ) + ( md_timeline . "\xe710" ) + ( md_update . "\xe711" ) + ( md_watch_later . "\xe712" ) + ( md_pan_tool . "\xe713" ) + ( md_euro_symbol . "\xe714" ) + ( md_g_translate . "\xe715" ) + ( md_remove_shopping_cart . "\xe716" ) + ( md_restore_page . "\xe717" ) + ( md_speaker_notes_off . "\xe718" ) + ( md_delete_forever . "\xe719" ) + ( md_ac_unit . "\xe71a" ) + ( md_airport_shuttle . "\xe71b" ) + ( md_all_inclusive . "\xe71c" ) + ( md_beach_access . "\xe71d" ) + ( md_business_center . "\xe71e" ) + ( md_casino . "\xe71f" ) + ( md_child_care . "\xe720" ) + ( md_child_friendly . "\xe721" ) + ( md_fitness_center . "\xe722" ) + ( md_free_breakfast . "\xe723" ) + ( md_golf_course . "\xe724" ) + ( md_hot_tub . "\xe725" ) + ( md_kitchen . "\xe726" ) + ( md_pool . "\xe727" ) + ( md_room_service . "\xe728" ) + ( md_smoke_free . "\xe729" ) + ( md_smoking_rooms . "\xe72a" ) + ( md_spa . "\xe72b" ) + ( md_u10fffd . "\xe72c" ) + ( file_regex . "\xe72d" ) + ( file_arch_linux . "\xe72e" ) + ( file_e . "\xe72f" ) + ( file_glyphs . "\xe730" ) + ( file_knockout . "\xe731" ) + ( file_lean . "\xe732" ) + ( file_metal . "\xe733" ) + ( file_povray . "\xe734" ) + ( file_s . "\xe735" ) + ( file_tt . "\xe736" ) + ( file_vagrant . "\xe737" ) + ( file_xmos . "\xe738" ) + ( file_a . "\xe739" ) + ( file_chai . "\xe73a" ) + ( file_stylus . "\xe73b" ) + ( file_textile . "\xe73c" ) + ( file_unreal . "\xe73d" ) + ( file_purebasic . "\xe73e" ) + ( file_ts . "\xe73f" ) + ( file_scheme . "\xe740" ) + ( file_textmate . "\xe741" ) + ( file_x10 . "\xe742" ) + ( file_apl . "\xe743" ) + ( file_ansible . "\xe744" ) + ( file_arttext . "\xe745" ) + ( file_antwar . "\xe746" ) + ( file_opa . "\xe747" ) + ( file_codecov . "\xe748" ) + ( file_yang . "\xe749" ) + ( file_pm2 . "\xe74a" ) + ( file_hg . "\xe74b" ) + ( file_pawn . "\xe74c" ) + ( file_julia . "\xe74d" ) + ( file_shipit . "\xe74e" ) + ( file_mocha . "\xe74f" ) + ( file_nib . "\xe750" ) + ( file_shuriken . "\xe751" ) + ( file_alex . "\xe752" ) + ( file_twig . "\xe753" ) + ( file_1c . "\xe754" ) + ( file_tex . "\xe755" ) + ( file_bibtex . "\xe756" ) + ( file_mustache . "\xe757" ) + ( file_gulp . "\xe758" ) + ( file_grunt . "\xe759" ) + ( file_ember . "\xe75a" ) + ( file_go . "\xe75b" ) + ( file_jenkins . "\xe75c" ) + ( file_gnu . "\xe75d" ) + ( file_composer . "\xe75e" ) + ( file_meteor . "\xe75f" ) + ( file_ai . "\xe760" ) + ( file_psd . "\xe761" ) + ( file_silverstripe . "\xe762" ) + ( file_maxscript . "\xe763" ) + ( file_kivy . "\xe764" ) + ( file_crystal . "\xe765" ) + ( file_gradle . "\xe766" ) + ( file_groovy . "\xe767" ) + ( file_r . "\xe768" ) + ( file_vue . "\xe769" ) + ( file_haxe . "\xe76a" ) + ( file_lisp . "\xe76b" ) + ( file_e909 . "\xe76c" ) + ( file_fortran . "\xe76d" ) + ( file_ada . "\xe76e" ) + ( file_dyalog . "\xe76f" ) + ( file_jade . "\xe770" ) + ( file_e90e . "\xe771" ) + ( file_font . "\xe772" ) + ( file_postcss . "\xe773" ) + ( file_scad . "\xe774" ) + ( file_e912 . "\xe775" ) + ( file_raml . "\xe776" ) + ( file_ls . "\xe777" ) + ( file_saltstack . "\xe778" ) + ( file_terraform . "\xe779" ) + ( file_org . "\xe77a" ) + ( file_asciidoc . "\xe77b" ) + ( file_riot . "\xe77c" ) + ( file_ocaml . "\xe77d" ) + ( file_lua . "\xe77e" ) + ( file_npm . "\xe77f" ) + ( file_llvm . "\xe780" ) + ( file_e91e . "\xe781" ) + ( file_babel . "\xe782" ) + ( file_marko . "\xe783" ) + ( file_flow . "\xe784" ) + ( file_broccoli . "\xe785" ) + ( file_appveyor . "\xe786" ) + ( file_cakefile . "\xe787" ) + ( file_apple . "\xe788" ) + ( file_emacs . "\xe789" ) + ( file_sketch . "\xe78a" ) + ( file_doxygen . "\xe78b" ) + ( file_cf . "\xe78c" ) + ( file_pascal . "\xe78d" ) + ( file_abap . "\xe78e" ) + ( file_antlr . "\xe78f" ) + ( file_api . "\xe790" ) + ( file_as . "\xe791" ) + ( file_arc . "\xe792" ) + ( file_arduino . "\xe793" ) + ( file_augeas . "\xe794" ) + ( file_ahk . "\xe795" ) + ( file_autoit . "\xe796" ) + ( file_ats . "\xe797" ) + ( file_alloy . "\xe798" ) + ( file_manpage . "\xe799" ) + ( file_j . "\xe79a" ) + ( file_glade . "\xe79b" ) + ( file_boo . "\xe79c" ) + ( file_brain . "\xe79d" ) + ( file_bro . "\xe79e" ) + ( file_bluespec . "\xe79f" ) + ( file_stylelint . "\xe7a0" ) + ( file_ant . "\xe7a1" ) + ( file_cmake . "\xe7a2" ) + ( file_clips . "\xe7a3" ) + ( file_mapbox . "\xe7a4" ) + ( file_cp . "\xe7a5" ) + ( file_chuck . "\xe7a6" ) + ( file_jinja . "\xe7a7" ) + ( file_isabelle . "\xe7a8" ) + ( file_doge . "\xe7a9" ) + ( file_idl . "\xe7aa" ) + ( file_jake . "\xe7ab" ) + ( file_verilog . "\xe7ac" ) + ( file_phalcon . "\xe7ad" ) + ( file_fabfile . "\xe7ae" ) + ( file_lfe . "\xe7af" ) + ( file_nmap . "\xe7b0" ) + ( file_ampl . "\xe7b1" ) + ( file_ceylon . "\xe7b2" ) + ( file_chapel . "\xe7b3" ) + ( file_cirru . "\xe7b4" ) + ( file_clarion . "\xe7b5" ) + ( file_nunjucks . "\xe7b6" ) + ( file_mediawiki . "\xe7b7" ) + ( file_postscript . "\xe7b8" ) + ( file_tcl . "\xe7b9" ) + ( file_owl . "\xe7ba" ) + ( file_jsonld . "\xe7bb" ) + ( file_sparql . "\xe7bc" ) + ( file_sas . "\xe7bd" ) + ( file_clean . "\xe7be" ) + ( file_click . "\xe7bf" ) + ( file_nvidia . "\xe7c0" ) + ( file_creole . "\xe7c1" ) + ( file_coq . "\xe7c2" ) + ( file_diff . "\xe7c3" ) + ( file_patch . "\xe7c4" ) + ( file_byond . "\xe7c5" ) + ( file_cython . "\xe7c6" ) + ( file_darcs . "\xe7c7" ) + ( file_eagle . "\xe7c8" ) + ( file_ecere . "\xe7c9" ) + ( file_eiffel . "\xe7ca" ) + ( file_em . "\xe7cb" ) + ( file_flux . "\xe7cc" ) + ( file_factor . "\xe7cd" ) + ( file_fancy . "\xe7ce" ) + ( file_perl6 . "\xe7cf" ) + ( file_gentoo . "\xe7d0" ) + ( file_frege . "\xe7d1" ) + ( file_fantom . "\xe7d2" ) + ( file_freemarker . "\xe7d3" ) + ( file_gap . "\xe7d4" ) + ( file_cl . "\xe7d5" ) + ( file_gams . "\xe7d6" ) + ( file_godot . "\xe7d7" ) + ( file_gml . "\xe7d8" ) + ( file_genshi . "\xe7d9" ) + ( file_pointwise . "\xe7da" ) + ( file_gf . "\xe7db" ) + ( file_golo . "\xe7dc" ) + ( file_gosu . "\xe7dd" ) + ( file_harbour . "\xe7de" ) + ( file_graphql . "\xe7df" ) + ( file_graphviz . "\xe7e0" ) + ( file_hashicorp . "\xe7e1" ) + ( file_hy . "\xe7e2" ) + ( file_igorpro . "\xe7e3" ) + ( file_io . "\xe7e4" ) + ( file_ioke . "\xe7e5" ) + ( file_idris . "\xe7e6" ) + ( file_inform7 . "\xe7e7" ) + ( file_inno . "\xe7e8" ) + ( file_sublime . "\xe7e9" ) + ( file_jupyter . "\xe7ea" ) + ( file_krl . "\xe7eb" ) + ( file_kotlin . "\xe7ec" ) + ( file_labview . "\xe7ed" ) + ( file_lsl . "\xe7ee" ) + ( file_lasso . "\xe7ef" ) + ( file_logtalk . "\xe7f0" ) + ( file_lookml . "\xe7f1" ) + ( file_mako . "\xe7f2" ) + ( file_mathematica . "\xe7f3" ) + ( file_matlab . "\xe7f4" ) + ( file_e992 . "\xe7f5" ) + ( file_max . "\xe7f6" ) + ( file_mercury . "\xe7f7" ) + ( file_mirah . "\xe7f8" ) + ( file_modula2 . "\xe7f9" ) + ( file_monkey . "\xe7fa" ) + ( file_nimrod . "\xe7fb" ) + ( file_nit . "\xe7fc" ) + ( file_nix . "\xe7fd" ) + ( file_amx . "\xe7fe" ) + ( file_netlogo . "\xe7ff" ) + ( file_numpy . "\xe800" ) + ( file_objj . "\xe801" ) + ( file_opencl . "\xe802" ) + ( file_processing . "\xe803" ) + ( file_ox . "\xe804" ) + ( file_scd . "\xe805" ) + ( file_stata . "\xe806" ) + ( file_stan . "\xe807" ) + ( file_sqf . "\xe808" ) + ( file_slash . "\xe809" ) + ( file_shen . "\xe80a" ) + ( file_self . "\xe80b" ) + ( file_scilab . "\xe80c" ) + ( file_vhdl . "\xe80d" ) + ( file_sage . "\xe80e" ) + ( file_robot . "\xe80f" ) + ( file_red . "\xe810" ) + ( file_rebol . "\xe811" ) + ( file_xojo . "\xe812" ) + ( file_rdoc . "\xe813" ) + ( file_racket . "\xe814" ) + ( file_purescript . "\xe815" ) + ( file_uno . "\xe816" ) + ( file_varnish . "\xe817" ) + ( file_propeller . "\xe818" ) + ( file_turing . "\xe819" ) + ( file_pony . "\xe81a" ) + ( file_pogo . "\xe81b" ) + ( file_pike . "\xe81c" ) + ( file_urweb . "\xe81d" ) + ( file_parrot . "\xe81e" ) + ( file_papyrus . "\xe81f" ) + ( file_pan . "\xe820" ) + ( file_oz . "\xe821" ) + ( file_oxygene . "\xe822" ) + ( file_progress . "\xe823" ) + ( file_txl . "\xe824" ) + ( file_cabal . "\xe825" ) + ( file_sysverilog . "\xe826" ) + ( file_pickle . "\xe827" ) + ( file_xpages . "\xe828" ) + ( file_xtend . "\xe829" ) + ( file_zephir . "\xe82a" ) + ( file_zimpl . "\xe82b" ) + ( file_ec . "\xe82c" ) + ( file_mupad . "\xe82d" ) + ( file_ooc . "\xe82e" ) + ( file_rst . "\xe82f" ) + ( file_karma . "\xe830" ) + ( file_hack . "\xe831" ) + ( file_shopify . "\xe832" ) + ( file_pug_alt . "\xe833" ) + ( file_e9d1 . "\xe834" ) + ( file_sbt . "\xe835" ) + ( file_e9d3 . "\xe836" ) + ( file_scrutinizer . "\xe837" ) + ( file_cc . "\xe838" ) + ( file_brakeman . "\xe839" ) + ( file_newrelic . "\xe83a" ) + ( file_thor . "\xe83b" ) + ( file_nuget . "\xe83c" ) + ( file_powershell . "\xe83d" ) + ( file_sf . "\xe83e" ) + ( file_minecraft . "\xe83f" ) + ( file_sqlite . "\xe840" ) + ( file_protractor . "\xe841" ) + ( file_typings . "\xe842" ) + ( file_strings . "\xe843" ) + ( file_nant . "\xe844" ) + ( file_csscript . "\xe845" ) + ( file_cake . "\xe846" ) + ( file_openoffice . "\xe847" ) + ( file_keynote . "\xe848" ) + ( file_jsx . "\xe849" ) + ( file_tsx . "\xe84a" ) + ( file_model . "\xe84b" ) + ( file_finder . "\xe84c" ) + ( file_access . "\xe84d" ) + ( file_onenote . "\xe84e" ) + ( file_powerpoint . "\xe84f" ) + ( file_word . "\xe850" ) + ( file_excel . "\xe851" ) + ( file_storyist . "\xe852" ) + ( file_csound . "\xe853" ) + ( file_dbase . "\xe854" ) + ( file_zbrush . "\xe855" ) + ( file_ae . "\xe856" ) + ( file_indesign . "\xe857" ) + ( file_premiere . "\xe858" ) + ( file_maya . "\xe859" ) + ( file_e9f7 . "\xe85a" ) + ( file_khronos . "\xe85b" ) + ( file_audacity . "\xe85c" ) + ( file_blender . "\xe85d" ) + ( file_lightwave . "\xe85e" ) + ( file_fbx . "\xe85f" ) + ( file_e9fd . "\xe860" ) + ( file_typedoc . "\xe861" ) + ( file_alpine . "\xe862" ) + ( file_yui . "\xe863" ) + ( file_ea01 . "\xe864" ) + ( file_ea02 . "\xe865" ) + ( file_ea03 . "\xe866" ) + ( file_normalize . "\xe867" ) + ( file_neko . "\xe868" ) + ( file_mathjax . "\xe869" ) + ( file_leaflet . "\xe86a" ) + ( file_gdb . "\xe86b" ) + ( file_fuelux . "\xe86c" ) + ( file_eq . "\xe86d" ) + ( file_chartjs . "\xe86e" ) + ( file_ea0c . "\xe86f" ) + ( file_ea0d . "\xe870" ) + ( file_ea0e . "\xe871" ) + ( file_eslint . "\xe872" ) + ( file_d3 . "\xe873" ) + ( file_cordova . "\xe874" ) + ( file_circleci . "\xe875" ) + ( file_pug . "\xe876" ) + ( file_powerbuilder . "\xe877" ) + ( file_dylib . "\xe878" ) + ( file_rexx . "\xe879" ) + ( file_svn . "\xe87a" ) + ( file_mruby . "\xe87b" ) + ( file_wercker . "\xe87c" ) + ( file_yarn . "\xe87d" ) + ( file_editorconfig . "\xe87e" ) + ( file_snyk . "\xe87f" ) + ( file_reason . "\xe880" ) + ( file_nsis . "\xe881" ) + ( file_v8 . "\xe882" ) + ( file_rollup . "\xe883" ) + ( file_ea21 . "\xe884" ) + ( file_ea22 . "\xe885" ) + ( file_ea23 . "\xe886" ) + ( file_rascal . "\xe887" ) + ( file_gn . "\xe888" ) + ( file_nodemon . "\xe889" ) + ( file_electron . "\xe88a" ) + ( file_1c_alt . "\xe88b" ) + ( file_swagger . "\xe88c" ) + ( file_bithound . "\xe88d" ) + ( file_polymer . "\xe88e" ) + ( file_platformio . "\xe88f" ) + ( file_shippable . "\xe890" ) + ( file_ea2e . "\xe891" ) + ( file_sequelize . "\xe892" ) + ( file_redux . "\xe893" ) + ( file_rspec . "\xe894" ) + ( file_phpunit . "\xe895" ) + ( file_octave . "\xe896" ) + ( file_nuclide . "\xe897" ) + ( file_infopath . "\xe898" ) + ( file_lime . "\xe899" ) + ( file_lerna . "\xe89a" ) + ( file_kitchenci . "\xe89b" ) + ( file_jest . "\xe89c" ) + ( file_jasmine . "\xe89d" ) + ( file_haxedevelop . "\xe89e" ) + ( file_gitlab . "\xe89f" ) + ( file_drone . "\xe8a0" ) + ( file_virtualbox . "\xe8a1" ) + ( file_doclets . "\xe8a2" ) + ( file_delphi . "\xe8a3" ) + ( file_codekit . "\xe8a4" ) + ( file_chef . "\xe8a5" ) + ( file_cakephp . "\xe8a6" ) + ( file_cobol . "\xe8a7" ) + ( file_bundler . "\xe8a8" ) + ( file_buck . "\xe8a9" ) + ( file_brunch . "\xe8aa" ) + ( file_aurelia . "\xe8ab" ) + ( file_vmware . "\xe8ac" ) + ( file_rhino . "\xe8ad" ) + ( file_ejs . "\xe8ae" ) + ( file_kicad . "\xe8af" ) + ( file_hoplon . "\xe8b0" ) + ( file_abif . "\xe8b1" ) + ( file_watchman . "\xe8b2" ) + ( file_p4 . "\xe8b3" ) + ( file_nanoc . "\xe8b4" ) + ( file_miranda . "\xe8b5" ) + ( file_minizinc . "\xe8b6" ) + ( file_meson . "\xe8b7" ) + ( file_jison . "\xe8b8" ) + ( file_franca . "\xe8b9" ) + ( file_devicetree . "\xe8ba" ) + ( file_caddy . "\xe8bb" ) + ( file_bem . "\xe8bc" ) + ( file_bazel . "\xe8bd" ) + ( file_angelscript . "\xe8be" ) + ( file_esdoc . "\xe8bf" ) + ( file_twine . "\xe8c0" ) + ( file_squarespace . "\xe8c1" ) + ( file_phoenix . "\xe8c2" ) + ( file_test_dir . "\xe8c3" ) + ( file_webpack . "\xe8c4" ) + ( file_test_coffee . "\xe8c5" ) + ( file_test_generic . "\xe8c6" ) + ( file_test_js . "\xe8c7" ) + ( file_test_perl . "\xe8c8" ) + ( file_test_python . "\xe8c9" ) + ( file_test_react . "\xe8ca" ) + ( file_test_ruby . "\xe8cb" ) + ( file_test_ts . "\xe8cc" ) + ( file_codeship . "\xe8cd" ) + ( file_nxc . "\xe8ce" ) + ( file_brotli . "\xe8cf" ) + ( file_proselint . "\xe8d0" ) + ( file_bintray . "\xe8d1" ) + ( file_mjml . "\xe8d2" ) + ( file_wasm . "\xe8d3" ) + ( file_ea71 . "\xe8d4" ) + ( file_nasm . "\xe8d5" ) + ( file_ea73 . "\xe8d6" ) + ( file_peg . "\xe8d7" ) + ( file_jolie . "\xe8d8" ) + ( file_nano . "\xe8d9" ) + ( file_xamarin . "\xe8da" ) + ( file_f012 . "\xe8db" ) + ( file_tag . "\xe8dc" ) + ( file_cucumber . "\xe8dd" ) + ( file_video . "\xe8de" ) + ( file_config . "\xe8df" ) + ( file_dashboard . "\xe8e0" ) + ( file_puppet . "\xe8e1" ) + ( file_terminal . "\xe8e2" ) + ( file_markdownlint . "\xe8e3" ) + ( file_react . "\xe8e4" ) + ( file_f101 . "\xe8e5" ) + ( file_elm . "\xe8e6" ) + ( file_boot . "\xe8e7" ) + ( file_cljs . "\xe8e8" ) + ( file_lein . "\xe8e9" ) + ( file_docker . "\xe8ea" ) + ( file_php . "\xe8eb" ) + ( file_ionic . "\xe8ec" ) + ( file_haml . "\xe8ed" ) + ( file_f17b . "\xe8ee" ) + ( file_ff . "\xe8ef" ) + ( file_u1f3c1 . "\xe8f0" ) + ( file_tern . "\xe8f1" ) + ( file_default . "\xe8f2" ) + ( file_sigils . "\xe8f3" ) + ( file_nginx . "\xe8f4" ) + ( weather_day_cloudy_gusts . "\xe8f5" ) + ( weather_day_cloudy_windy . "\xe8f6" ) + ( weather_day_cloudy . "\xe8f7" ) + ( weather_day_fog . "\xe8f8" ) + ( weather_day_hail . "\xe8f9" ) + ( weather_day_lightning . "\xe8fa" ) + ( weather_day_rain_mix . "\xe8fb" ) + ( weather_day_rain_wind . "\xe8fc" ) + ( weather_day_rain . "\xe8fd" ) + ( weather_day_showers . "\xe8fe" ) + ( weather_day_snow . "\xe8ff" ) + ( weather_day_sprinkle . "\xe900" ) + ( weather_day_sunny_overcast . "\xe901" ) + ( weather_day_sunny . "\xe902" ) + ( weather_day_storm_showers . "\xe903" ) + ( weather_day_thunderstorm . "\xe904" ) + ( weather_cloudy_gusts . "\xe905" ) + ( weather_cloudy_windy . "\xe906" ) + ( weather_cloudy . "\xe907" ) + ( weather_fog . "\xe908" ) + ( weather_hail . "\xe909" ) + ( weather_lightning . "\xe90a" ) + ( weather_rain_mix . "\xe90b" ) + ( weather_rain_wind . "\xe90c" ) + ( weather_rain . "\xe90d" ) + ( weather_showers . "\xe90e" ) + ( weather_snow . "\xe90f" ) + ( weather_sprinkle . "\xe910" ) + ( weather_storm_showers . "\xe911" ) + ( weather_thunderstorm . "\xe912" ) + ( weather_windy . "\xe913" ) + ( weather_night_alt_cloudy_gusts . "\xe914" ) + ( weather_night_alt_cloudy_windy . "\xe915" ) + ( weather_night_alt_hail . "\xe916" ) + ( weather_night_alt_lightning . "\xe917" ) + ( weather_night_alt_rain_mix . "\xe918" ) + ( weather_night_alt_rain_wind . "\xe919" ) + ( weather_night_alt_rain . "\xe91a" ) + ( weather_night_alt_showers . "\xe91b" ) + ( weather_night_alt_snow . "\xe91c" ) + ( weather_night_alt_sprinkle . "\xe91d" ) + ( weather_night_alt_storm_showers . "\xe91e" ) + ( weather_night_alt_thunderstorm . "\xe91f" ) + ( weather_night_clear . "\xe920" ) + ( weather_night_cloudy_gusts . "\xe921" ) + ( weather_night_cloudy_windy . "\xe922" ) + ( weather_night_cloudy . "\xe923" ) + ( weather_night_hail . "\xe924" ) + ( weather_night_lightning . "\xe925" ) + ( weather_night_rain_mix . "\xe926" ) + ( weather_night_rain_wind . "\xe927" ) + ( weather_night_rain . "\xe928" ) + ( weather_night_showers . "\xe929" ) + ( weather_night_snow . "\xe92a" ) + ( weather_night_sprinkle . "\xe92b" ) + ( weather_night_storm_showers . "\xe92c" ) + ( weather_night_thunderstorm . "\xe92d" ) + ( weather_celsius . "\xe92e" ) + ( weather_cloud_down . "\xe92f" ) + ( weather_cloud_refresh . "\xe930" ) + ( weather_cloud_up . "\xe931" ) + ( weather_cloud . "\xe932" ) + ( weather_degrees . "\xe933" ) + ( weather_direction_down_left . "\xe934" ) + ( weather_direction_down . "\xe935" ) + ( weather_fahrenheit . "\xe936" ) + ( weather_horizon_alt . "\xe937" ) + ( weather_horizon . "\xe938" ) + ( weather_direction_left . "\xe939" ) + ( weather_f049 . "\xe93a" ) + ( weather_night_fog . "\xe93b" ) + ( weather_refresh_alt . "\xe93c" ) + ( weather_refresh . "\xe93d" ) + ( weather_direction_right . "\xe93e" ) + ( weather_raindrops . "\xe93f" ) + ( weather_strong_wind . "\xe940" ) + ( weather_sunrise . "\xe941" ) + ( weather_sunset . "\xe942" ) + ( weather_thermometer_exterior . "\xe943" ) + ( weather_thermometer_internal . "\xe944" ) + ( weather_thermometer . "\xe945" ) + ( weather_tornado . "\xe946" ) + ( weather_direction_up_right . "\xe947" ) + ( weather_direction_up . "\xe948" ) + ( weather_f059 . "\xe949" ) + ( weather_f05a . "\xe94a" ) + ( weather_f05b . "\xe94b" ) + ( weather_f05c . "\xe94c" ) + ( weather_f05d . "\xe94d" ) + ( weather_f05e . "\xe94e" ) + ( weather_f060 . "\xe94f" ) + ( weather_f061 . "\xe950" ) + ( weather_smoke . "\xe951" ) + ( weather_dust . "\xe952" ) + ( weather_snow_wind . "\xe953" ) + ( weather_day_snow_wind . "\xe954" ) + ( weather_night_snow_wind . "\xe955" ) + ( weather_night_alt_snow_wind . "\xe956" ) + ( weather_day_sleet_storm . "\xe957" ) + ( weather_night_sleet_storm . "\xe958" ) + ( weather_night_alt_sleet_storm . "\xe959" ) + ( weather_day_snow_thunderstorm . "\xe95a" ) + ( weather_night_snow_thunderstorm . "\xe95b" ) + ( weather_night_alt_snow_thunderstorm . "\xe95c" ) + ( weather_solar_eclipse . "\xe95d" ) + ( weather_lunar_eclipse . "\xe95e" ) + ( weather_meteor . "\xe95f" ) + ( weather_hot . "\xe960" ) + ( weather_hurricane . "\xe961" ) + ( weather_smog . "\xe962" ) + ( weather_alien . "\xe963" ) + ( weather_snowflake_cold . "\xe964" ) + ( weather_stars . "\xe965" ) + ( weather_raindrop . "\xe966" ) + ( weather_barometer . "\xe967" ) + ( weather_humidity . "\xe968" ) + ( weather_na . "\xe969" ) + ( weather_flood . "\xe96a" ) + ( weather_day_cloudy_high . "\xe96b" ) + ( weather_night_alt_cloudy_high . "\xe96c" ) + ( weather_night_cloudy_high . "\xe96d" ) + ( weather_night_alt_partly_cloudy . "\xe96e" ) + ( weather_sandstorm . "\xe96f" ) + ( weather_night_partly_cloudy . "\xe970" ) + ( weather_umbrella . "\xe971" ) + ( weather_day_windy . "\xe972" ) + ( weather_night_alt_cloudy . "\xe973" ) + ( weather_direction_up_left . "\xe974" ) + ( weather_direction_down_right . "\xe975" ) + ( weather_time_12 . "\xe976" ) + ( weather_time_1 . "\xe977" ) + ( weather_time_2 . "\xe978" ) + ( weather_time_3 . "\xe979" ) + ( weather_time_4 . "\xe97a" ) + ( weather_time_5 . "\xe97b" ) + ( weather_time_6 . "\xe97c" ) + ( weather_time_7 . "\xe97d" ) + ( weather_time_8 . "\xe97e" ) + ( weather_time_9 . "\xe97f" ) + ( weather_time_10 . "\xe980" ) + ( weather_time_11 . "\xe981" ) + ( weather_moon_new . "\xe982" ) + ( weather_moon_waxing_crescent_1 . "\xe983" ) + ( weather_moon_waxing_crescent_2 . "\xe984" ) + ( weather_moon_waxing_crescent_3 . "\xe985" ) + ( weather_moon_waxing_crescent_4 . "\xe986" ) + ( weather_moon_waxing_crescent_5 . "\xe987" ) + ( weather_moon_waxing_crescent_6 . "\xe988" ) + ( weather_moon_first_quarter . "\xe989" ) + ( weather_moon_waxing_gibbous_1 . "\xe98a" ) + ( weather_moon_waxing_gibbous_2 . "\xe98b" ) + ( weather_moon_waxing_gibbous_3 . "\xe98c" ) + ( weather_moon_waxing_gibbous_4 . "\xe98d" ) + ( weather_moon_waxing_gibbous_5 . "\xe98e" ) + ( weather_moon_waxing_gibbous_6 . "\xe98f" ) + ( weather_moon_full . "\xe990" ) + ( weather_moon_waning_gibbous_1 . "\xe991" ) + ( weather_moon_waning_gibbous_2 . "\xe992" ) + ( weather_moon_waning_gibbous_3 . "\xe993" ) + ( weather_moon_waning_gibbous_4 . "\xe994" ) + ( weather_moon_waning_gibbous_5 . "\xe995" ) + ( weather_moon_waning_gibbous_6 . "\xe996" ) + ( weather_moon_third_quarter . "\xe997" ) + ( weather_moon_waning_crescent_1 . "\xe998" ) + ( weather_moon_waning_crescent_2 . "\xe999" ) + ( weather_moon_waning_crescent_3 . "\xe99a" ) + ( weather_moon_waning_crescent_4 . "\xe99b" ) + ( weather_moon_waning_crescent_5 . "\xe99c" ) + ( weather_moon_waning_crescent_6 . "\xe99d" ) + ( weather_wind_direction . "\xe99e" ) + ( weather_day_sleet . "\xe99f" ) + ( weather_night_sleet . "\xe9a0" ) + ( weather_night_alt_sleet . "\xe9a1" ) + ( weather_sleet . "\xe9a2" ) + ( weather_day_haze . "\xe9a3" ) + ( weather_wind_beaufort_0 . "\xe9a4" ) + ( weather_wind_beaufort_1 . "\xe9a5" ) + ( weather_wind_beaufort_2 . "\xe9a6" ) + ( weather_wind_beaufort_3 . "\xe9a7" ) + ( weather_wind_beaufort_4 . "\xe9a8" ) + ( weather_wind_beaufort_5 . "\xe9a9" ) + ( weather_wind_beaufort_6 . "\xe9aa" ) + ( weather_wind_beaufort_7 . "\xe9ab" ) + ( weather_wind_beaufort_8 . "\xe9ac" ) + ( weather_wind_beaufort_9 . "\xe9ad" ) + ( weather_wind_beaufort_10 . "\xe9ae" ) + ( weather_wind_beaufort_11 . "\xe9af" ) + ( weather_wind_beaufort_12 . "\xe9b0" ) + ( weather_day_light_wind . "\xe9b1" ) + ( weather_tsunami . "\xe9b2" ) + ( weather_earthquake . "\xe9b3" ) + ( weather_fire . "\xe9b4" ) + ( weather_volcano . "\xe9b5" ) + ( weather_moonrise . "\xe9b6" ) + ( weather_moonset . "\xe9b7" ) + ( weather_train . "\xe9b8" ) + ( weather_small_craft_advisory . "\xe9b9" ) + ( weather_gale_warning . "\xe9ba" ) + ( weather_storm_warning . "\xe9bb" ) + ( weather_hurricane_warning . "\xe9bc" ) + ( weather_moon_alt_waxing_crescent_1 . "\xe9bd" ) + ( weather_moon_alt_waxing_crescent_2 . "\xe9be" ) + ( weather_moon_alt_waxing_crescent_3 . "\xe9bf" ) + ( weather_moon_alt_waxing_crescent_4 . "\xe9c0" ) + ( weather_moon_alt_waxing_crescent_5 . "\xe9c1" ) + ( weather_moon_alt_waxing_crescent_6 . "\xe9c2" ) + ( weather_moon_alt_first_quarter . "\xe9c3" ) + ( weather_moon_alt_waxing_gibbous_1 . "\xe9c4" ) + ( weather_moon_alt_waxing_gibbous_2 . "\xe9c5" ) + ( weather_moon_alt_waxing_gibbous_3 . "\xe9c6" ) + ( weather_moon_alt_waxing_gibbous_4 . "\xe9c7" ) + ( weather_moon_alt_waxing_gibbous_5 . "\xe9c8" ) + ( weather_moon_alt_waxing_gibbous_6 . "\xe9c9" ) + ( weather_moon_alt_full . "\xe9ca" ) + ( weather_moon_alt_waning_gibbous_1 . "\xe9cb" ) + ( weather_moon_alt_waning_gibbous_2 . "\xe9cc" ) + ( weather_moon_alt_waning_gibbous_3 . "\xe9cd" ) + ( weather_moon_alt_waning_gibbous_4 . "\xe9ce" ) + ( weather_moon_alt_waning_gibbous_5 . "\xe9cf" ) + ( weather_moon_alt_waning_gibbous_6 . "\xe9d0" ) + ( weather_moon_alt_third_quarter . "\xe9d1" ) + ( weather_moon_alt_waning_crescent_1 . "\xe9d2" ) + ( weather_moon_alt_waning_crescent_2 . "\xe9d3" ) + ( weather_moon_alt_waning_crescent_3 . "\xe9d4" ) + ( weather_moon_alt_waning_crescent_4 . "\xe9d5" ) + ( weather_moon_alt_waning_crescent_5 . "\xe9d6" ) + ( weather_moon_alt_waning_crescent_6 . "\xe9d7" ) + ( weather_moon_alt_new . "\xe9d8" ) + ( linux_archlinux . "\xe9d9" ) + ( linux_centos . "\xe9da" ) + ( linux_debian . "\xe9db" ) + ( linux_fedora . "\xe9dc" ) + ( linux_linuxmint . "\xe9dd" ) + ( linux_linuxmint_inverse . "\xe9de" ) + ( linux_mageia . "\xe9df" ) + ( linux_mandriva . "\xe9e0" ) + ( linux_opensuse . "\xe9e1" ) + ( linux_redhat . "\xe9e2" ) + ( linux_slackware . "\xe9e3" ) + ( linux_slackware_inverse . "\xe9e4" ) + ( linux_ubuntu . "\xe9e5" ) + ( linux_ubuntu_inverse . "\xe9e6" ) + ( linux_freebsd . "\xe9e7" ) + ( linux_coreos . "\xe9e8" ) + ( linux_gentoo . "\xe9e9" ) + ( linux_elementary . "\xe9ea" ) + ( linux_fedora_inverse . "\xe9eb" ) + ( linux_sabayon . "\xe9ec" ) + ( linux_aosc . "\xe9ed" ) + ( linux_nixos . "\xe9ee" ) + ( linux_tux . "\xe9ef" ) + ( linux_raspberry_pi . "\xe9f0" ) + ( linux_manjaro . "\xe9f1" ) + ( linux_apple . "\xe9f2" ) + ( linux_docker . "\xe9f3" ) + ( linux_alpine . "\xe9f4" ) + ( myicons_0001 . "\xe9f5" ) + ( myicons_0002 . "\xe9f6" ) + ( myicons_0003 . "\xe9f7" ) + ( myicons_0004 . "\xe9f8" ) + ( myicons_0005 . "\xe9f9" ) + ( myicons_0006 . "\xe9fa" ) + ( myicons_0007 . "\xe9fb" ) + ( myicons_0008 . "\xe9fc" ) + ( myicons_0009 . "\xe9fd" ) + ( myicons_000a . "\xe9fe" ) + ( myicons_000b . "\xe9ff" ) + ( myicons_000d . "\xea00" ) + ( myicons_000e . "\xea01" ) + ( myicons_0010 . "\xea02" ) + ( myicons_0011 . "\xea03" ) + ( myicons_0013 . "\xea04" ) + ( myicons_0014 . "\xea05" ) + ( myicons_arch_linux_arrow . "\xea06" ) + ( dev_bing_small . "\xea07" ) + ( dev_css_tricks . "\xea08" ) + ( dev_git . "\xea09" ) + ( dev_bitbucket . "\xea0a" ) + ( dev_mysql . "\xea0b" ) + ( dev_streamline . "\xea0c" ) + ( dev_database . "\xea0d" ) + ( dev_dropbox . "\xea0e" ) + ( dev_github_alt . "\xea0f" ) + ( dev_github_badge . "\xea10" ) + ( dev_github . "\xea11" ) + ( dev_wordpress . "\xea12" ) + ( dev_visualstudio . "\xea13" ) + ( dev_jekyll_small . "\xea14" ) + ( dev_android . "\xea15" ) + ( dev_windows . "\xea16" ) + ( dev_stackoverflow . "\xea17" ) + ( dev_apple . "\xea18" ) + ( dev_linux . "\xea19" ) + ( dev_appstore . "\xea1a" ) + ( dev_ghost_small . "\xea1b" ) + ( dev_yahoo . "\xea1c" ) + ( dev_codepen . "\xea1d" ) + ( dev_github_full . "\xea1e" ) + ( dev_nodejs_small . "\xea1f" ) + ( dev_nodejs . "\xea20" ) + ( dev_hackernews . "\xea21" ) + ( dev_ember . "\xea22" ) + ( dev_dojo . "\xea23" ) + ( dev_django . "\xea24" ) + ( dev_npm . "\xea25" ) + ( dev_ghost . "\xea26" ) + ( dev_modernizr . "\xea27" ) + ( dev_unity_small . "\xea28" ) + ( dev_raspberry_pi . "\xea29" ) + ( dev_blackberry . "\xea2a" ) + ( dev_go . "\xea2b" ) + ( dev_git_branch . "\xea2c" ) + ( dev_git_pull_request . "\xea2d" ) + ( dev_git_merge . "\xea2e" ) + ( dev_git_compare . "\xea2f" ) + ( dev_git_commit . "\xea30" ) + ( dev_cssdeck . "\xea31" ) + ( dev_yahoo_small . "\xea32" ) + ( dev_techcrunch . "\xea33" ) + ( dev_smashing_magazine . "\xea34" ) + ( dev_netmagazine . "\xea35" ) + ( dev_codrops . "\xea36" ) + ( dev_phonegap . "\xea37" ) + ( dev_google_drive . "\xea38" ) + ( dev_html5_multimedia . "\xea39" ) + ( dev_html5_device_access . "\xea3a" ) + ( dev_html5_connectivity . "\xea3b" ) + ( dev_html5_3d_effects . "\xea3c" ) + ( dev_html5 . "\xea3d" ) + ( dev_scala . "\xea3e" ) + ( dev_java . "\xea3f" ) + ( dev_ruby . "\xea40" ) + ( dev_ubuntu . "\xea41" ) + ( dev_ruby_on_rails . "\xea42" ) + ( dev_python . "\xea43" ) + ( dev_php . "\xea44" ) + ( dev_markdown . "\xea45" ) + ( dev_laravel . "\xea46" ) + ( dev_magento . "\xea47" ) + ( dev_joomla . "\xea48" ) + ( dev_drupal . "\xea49" ) + ( dev_chrome . "\xea4a" ) + ( dev_ie . "\xea4b" ) + ( dev_firefox . "\xea4c" ) + ( dev_opera . "\xea4d" ) + ( dev_bootstrap . "\xea4e" ) + ( dev_safari . "\xea4f" ) + ( dev_css3 . "\xea50" ) + ( dev_css3_full . "\xea51" ) + ( dev_sass . "\xea52" ) + ( dev_grunt . "\xea53" ) + ( dev_bower . "\xea54" ) + ( dev_javascript . "\xea55" ) + ( dev_javascript_shield . "\xea56" ) + ( dev_jquery . "\xea57" ) + ( dev_coffeescript . "\xea58" ) + ( dev_backbone . "\xea59" ) + ( dev_angular . "\xea5a" ) + ( dev_jquery_ui . "\xea5b" ) + ( dev_swift . "\xea5c" ) + ( dev_symfony . "\xea5d" ) + ( dev_symfony_badge . "\xea5e" ) + ( dev_less . "\xea5f" ) + ( dev_stylus . "\xea60" ) + ( dev_trello . "\xea61" ) + ( dev_atlassian . "\xea62" ) + ( dev_jira . "\xea63" ) + ( dev_envato . "\xea64" ) + ( dev_snap_svg . "\xea65" ) + ( dev_raphael . "\xea66" ) + ( dev_google_analytics . "\xea67" ) + ( dev_compass . "\xea68" ) + ( dev_onedrive . "\xea69" ) + ( dev_gulp . "\xea6a" ) + ( dev_atom . "\xea6b" ) + ( dev_cisco . "\xea6c" ) + ( dev_nancy . "\xea6d" ) + ( dev_jenkins . "\xea6e" ) + ( dev_clojure . "\xea6f" ) + ( dev_perl . "\xea70" ) + ( dev_clojure_alt . "\xea71" ) + ( dev_celluloid . "\xea72" ) + ( dev_w3c . "\xea73" ) + ( dev_redis . "\xea74" ) + ( dev_postgresql . "\xea75" ) + ( dev_webplatform . "\xea76" ) + ( dev_requirejs . "\xea77" ) + ( dev_opensource . "\xea78" ) + ( dev_typo3 . "\xea79" ) + ( dev_uikit . "\xea7a" ) + ( dev_doctrine . "\xea7b" ) + ( dev_groovy . "\xea7c" ) + ( dev_nginx . "\xea7d" ) + ( dev_haskell . "\xea7e" ) + ( dev_zend . "\xea7f" ) + ( dev_gnu . "\xea80" ) + ( dev_yeoman . "\xea81" ) + ( dev_heroku . "\xea82" ) + ( dev_msql_server . "\xea83" ) + ( dev_debian . "\xea84" ) + ( dev_travis . "\xea85" ) + ( dev_dotnet . "\xea86" ) + ( dev_codeigniter . "\xea87" ) + ( dev_javascript_badge . "\xea88" ) + ( dev_yii . "\xea89" ) + ( dev_composer . "\xea8a" ) + ( dev_krakenjs_badge . "\xea8b" ) + ( dev_krakenjs . "\xea8c" ) + ( dev_mozilla . "\xea8d" ) + ( dev_firebase . "\xea8e" ) + ( dev_sizzlejs . "\xea8f" ) + ( dev_creativecommons . "\xea90" ) + ( dev_creativecommons_badge . "\xea91" ) + ( dev_mitlicence . "\xea92" ) + ( dev_senchatouch . "\xea93" ) + ( dev_bugsense . "\xea94" ) + ( dev_extjs . "\xea95" ) + ( dev_mootools_badge . "\xea96" ) + ( dev_mootools . "\xea97" ) + ( dev_ruby_rough . "\xea98" ) + ( dev_komodo . "\xea99" ) + ( dev_coda . "\xea9a" ) + ( dev_bintray . "\xea9b" ) + ( dev_terminal . "\xea9c" ) + ( dev_code . "\xea9d" ) + ( dev_responsive . "\xea9e" ) + ( dev_dart . "\xea9f" ) + ( dev_aptana . "\xeaa0" ) + ( dev_mailchimp . "\xeaa1" ) + ( dev_netbeans . "\xeaa2" ) + ( dev_dreamweaver . "\xeaa3" ) + ( dev_brackets . "\xeaa4" ) + ( dev_eclipse . "\xeaa5" ) + ( dev_cloud9 . "\xeaa6" ) + ( dev_scrum . "\xeaa7" ) + ( dev_prolog . "\xeaa8" ) + ( dev_terminal_badge . "\xeaa9" ) + ( dev_code_badge . "\xeaaa" ) + ( dev_mongodb . "\xeaab" ) + ( dev_meteor . "\xeaac" ) + ( dev_meteorfull . "\xeaad" ) + ( dev_fsharp . "\xeaae" ) + ( dev_rust . "\xeaaf" ) + ( dev_ionic . "\xeab0" ) + ( dev_sublime . "\xeab1" ) + ( dev_appcelerator . "\xeab2" ) + ( dev_asterisk . "\xeab3" ) + ( dev_aws . "\xeab4" ) + ( dev_digital_ocean . "\xeab5" ) + ( dev_dlang . "\xeab6" ) + ( dev_docker . "\xeab7" ) + ( dev_erlang . "\xeab8" ) + ( dev_google_cloud_platform . "\xeab9" ) + ( dev_grails . "\xeaba" ) + ( dev_illustrator . "\xeabb" ) + ( dev_intellij . "\xeabc" ) + ( dev_materializecss . "\xeabd" ) + ( dev_openshift . "\xeabe" ) + ( dev_photoshop . "\xeabf" ) + ( dev_rackspace . "\xeac0" ) + ( dev_react . "\xeac1" ) + ( dev_redhat . "\xeac2" ) + ( dev_scriptcs . "\xeac3" ) + ( dev_e6bd . "\xeac4" ) + ( dev_e6be . "\xeac5" ) + ( dev_e6bf . "\xeac6" ) + ( dev_e6c0 . "\xeac7" ) + ( dev_e6c1 . "\xeac8" ) + ( dev_e6c2 . "\xeac9" ) + ( dev_e6c3 . "\xeaca" ) + ( dev_sqllite . "\xeacb" ) + ( dev_vim . "\xeacc" ) + ( pom_clean_code . "\xeacd" ) + ( pom_pomodoro_done . "\xeace" ) + ( pom_pomodoro_estimated . "\xeacf" ) + ( pom_pomodoro_ticking . "\xead0" ) + ( pom_pomodoro_squashed . "\xead1" ) + ( pom_short_pause . "\xead2" ) + ( pom_long_pause . "\xead3" ) + ( pom_away . "\xead4" ) + ( pom_pair_programming . "\xead5" ) + ( pom_internal_interruption . "\xead6" ) + ( pom_external_interruption . "\xead7" ) + ( linea_arrows_anticlockwise . "\xead8" ) + ( linea_arrows_anticlockwise_dashed . "\xead9" ) + ( linea_arrows_button_down . "\xeada" ) + ( linea_arrows_button_off . "\xeadb" ) + ( linea_arrows_button_on . "\xeadc" ) + ( linea_arrows_button_up . "\xeadd" ) + ( linea_arrows_check . "\xeade" ) + ( linea_arrows_circle_check . "\xeadf" ) + ( linea_arrows_circle_down . "\xeae0" ) + ( linea_arrows_circle_downleft . "\xeae1" ) + ( linea_arrows_circle_downright . "\xeae2" ) + ( linea_arrows_circle_left . "\xeae3" ) + ( linea_arrows_circle_minus . "\xeae4" ) + ( linea_arrows_circle_plus . "\xeae5" ) + ( linea_arrows_circle_remove . "\xeae6" ) + ( linea_arrows_circle_right . "\xeae7" ) + ( linea_arrows_circle_up . "\xeae8" ) + ( linea_arrows_circle_upleft . "\xeae9" ) + ( linea_arrows_circle_upright . "\xeaea" ) + ( linea_arrows_clockwise . "\xeaeb" ) + ( linea_arrows_clockwise_dashed . "\xeaec" ) + ( linea_arrows_compress . "\xeaed" ) + ( linea_arrows_deny . "\xeaee" ) + ( linea_arrows_diagonal . "\xeaef" ) + ( linea_arrows_diagonal2 . "\xeaf0" ) + ( linea_arrows_down . "\xeaf1" ) + ( linea_arrows_down_double . "\xeaf2" ) + ( linea_arrows_downleft . "\xeaf3" ) + ( linea_arrows_downright . "\xeaf4" ) + ( linea_arrows_drag_down . "\xeaf5" ) + ( linea_arrows_drag_down_dashed . "\xeaf6" ) + ( linea_arrows_drag_horiz . "\xeaf7" ) + ( linea_arrows_drag_left . "\xeaf8" ) + ( linea_arrows_drag_left_dashed . "\xeaf9" ) + ( linea_arrows_drag_right . "\xeafa" ) + ( linea_arrows_drag_right_dashed . "\xeafb" ) + ( linea_arrows_drag_up . "\xeafc" ) + ( linea_arrows_drag_up_dashed . "\xeafd" ) + ( linea_arrows_drag_vert . "\xeafe" ) + ( linea_arrows_exclamation . "\xeaff" ) + ( linea_arrows_expand . "\xeb00" ) + ( linea_arrows_expand_diagonal1 . "\xeb01" ) + ( linea_arrows_expand_horizontal1 . "\xeb02" ) + ( linea_arrows_expand_vertical1 . "\xeb03" ) + ( linea_arrows_fit_horizontal . "\xeb04" ) + ( linea_arrows_fit_vertical . "\xeb05" ) + ( linea_arrows_glide . "\xeb06" ) + ( linea_arrows_glide_horizontal . "\xeb07" ) + ( linea_arrows_glide_vertical . "\xeb08" ) + ( linea_arrows_hamburger1 . "\xeb09" ) + ( linea_arrows_hamburger_2 . "\xeb0a" ) + ( linea_arrows_horizontal . "\xeb0b" ) + ( linea_arrows_info . "\xeb0c" ) + ( linea_arrows_keyboard_alt . "\xeb0d" ) + ( linea_arrows_keyboard_cmd . "\xeb0e" ) + ( linea_arrows_keyboard_delete . "\xeb0f" ) + ( linea_arrows_keyboard_down . "\xeb10" ) + ( linea_arrows_keyboard_left . "\xeb11" ) + ( linea_arrows_keyboard_return . "\xeb12" ) + ( linea_arrows_keyboard_right . "\xeb13" ) + ( linea_arrows_keyboard_shift . "\xeb14" ) + ( linea_arrows_keyboard_tab . "\xeb15" ) + ( linea_arrows_keyboard_up . "\xeb16" ) + ( linea_arrows_left . "\xeb17" ) + ( linea_arrows_left_double_32 . "\xeb18" ) + ( linea_arrows_minus . "\xeb19" ) + ( linea_arrows_move . "\xeb1a" ) + ( linea_arrows_move2 . "\xeb1b" ) + ( linea_arrows_move_bottom . "\xeb1c" ) + ( linea_arrows_move_left . "\xeb1d" ) + ( linea_arrows_move_right . "\xeb1e" ) + ( linea_arrows_move_top . "\xeb1f" ) + ( linea_arrows_plus . "\xeb20" ) + ( linea_arrows_question . "\xeb21" ) + ( linea_arrows_remove . "\xeb22" ) + ( linea_arrows_right . "\xeb23" ) + ( linea_arrows_right_double . "\xeb24" ) + ( linea_arrows_rotate . "\xeb25" ) + ( linea_arrows_rotate_anti . "\xeb26" ) + ( linea_arrows_rotate_anti_dashed . "\xeb27" ) + ( linea_arrows_rotate_dashed . "\xeb28" ) + ( linea_arrows_shrink . "\xeb29" ) + ( linea_arrows_shrink_diagonal1 . "\xeb2a" ) + ( linea_arrows_shrink_diagonal2 . "\xeb2b" ) + ( linea_arrows_shrink_horizonal2 . "\xeb2c" ) + ( linea_arrows_shrink_horizontal1 . "\xeb2d" ) + ( linea_arrows_shrink_vertical1 . "\xeb2e" ) + ( linea_arrows_shrink_vertical2 . "\xeb2f" ) + ( linea_arrows_sign_down . "\xeb30" ) + ( linea_arrows_sign_left . "\xeb31" ) + ( linea_arrows_sign_right . "\xeb32" ) + ( linea_arrows_sign_up . "\xeb33" ) + ( linea_arrows_slide_down1 . "\xeb34" ) + ( linea_arrows_slide_down2 . "\xeb35" ) + ( linea_arrows_slide_left1 . "\xeb36" ) + ( linea_arrows_slide_left2 . "\xeb37" ) + ( linea_arrows_slide_right1 . "\xeb38" ) + ( linea_arrows_slide_right2 . "\xeb39" ) + ( linea_arrows_slide_up1 . "\xeb3a" ) + ( linea_arrows_slide_up2 . "\xeb3b" ) + ( linea_arrows_slim_down . "\xeb3c" ) + ( linea_arrows_slim_down_dashed . "\xeb3d" ) + ( linea_arrows_slim_left . "\xeb3e" ) + ( linea_arrows_slim_left_dashed . "\xeb3f" ) + ( linea_arrows_slim_right . "\xeb40" ) + ( linea_arrows_slim_right_dashed . "\xeb41" ) + ( linea_arrows_slim_up . "\xeb42" ) + ( linea_arrows_slim_up_dashed . "\xeb43" ) + ( linea_arrows_square_check . "\xeb44" ) + ( linea_arrows_square_down . "\xeb45" ) + ( linea_arrows_square_downleft . "\xeb46" ) + ( linea_arrows_square_downright . "\xeb47" ) + ( linea_arrows_square_left . "\xeb48" ) + ( linea_arrows_square_minus . "\xeb49" ) + ( linea_arrows_square_plus . "\xeb4a" ) + ( linea_arrows_square_remove . "\xeb4b" ) + ( linea_arrows_square_right . "\xeb4c" ) + ( linea_arrows_square_up . "\xeb4d" ) + ( linea_arrows_square_upleft . "\xeb4e" ) + ( linea_arrows_square_upright . "\xeb4f" ) + ( linea_arrows_squares . "\xeb50" ) + ( linea_arrows_stretch_diagonal1 . "\xeb51" ) + ( linea_arrows_stretch_diagonal2 . "\xeb52" ) + ( linea_arrows_stretch_diagonal3 . "\xeb53" ) + ( linea_arrows_stretch_diagonal4 . "\xeb54" ) + ( linea_arrows_stretch_horizontal1 . "\xeb55" ) + ( linea_arrows_stretch_horizontal2 . "\xeb56" ) + ( linea_arrows_stretch_vertical1 . "\xeb57" ) + ( linea_arrows_stretch_vertical2 . "\xeb58" ) + ( linea_arrows_switch_horizontal . "\xeb59" ) + ( linea_arrows_switch_vertical . "\xeb5a" ) + ( linea_arrows_up . "\xeb5b" ) + ( linea_arrows_up_double_33 . "\xeb5c" ) + ( linea_arrows_upleft . "\xeb5d" ) + ( linea_arrows_upright . "\xeb5e" ) + ( linea_arrows_vertical . "\xeb5f" ) + ( linea_basic_lock_open . "\xeb60" ) + ( linea_basic_magic_mouse . "\xeb61" ) + ( linea_basic_magnifier . "\xeb62" ) + ( linea_basic_magnifier_minus . "\xeb63" ) + ( linea_basic_magnifier_plus . "\xeb64" ) + ( linea_basic_mail . "\xeb65" ) + ( linea_basic_mail_multiple . "\xeb66" ) + ( linea_basic_mail_open . "\xeb67" ) + ( linea_basic_mail_open_text . "\xeb68" ) + ( linea_basic_male . "\xeb69" ) + ( linea_basic_map . "\xeb6a" ) + ( linea_basic_message . "\xeb6b" ) + ( linea_basic_message_multiple . "\xeb6c" ) + ( linea_basic_message_txt . "\xeb6d" ) + ( linea_basic_mixer2 . "\xeb6e" ) + ( linea_basic_info . "\xeb6f" ) + ( linea_basic_ipod . "\xeb70" ) + ( linea_basic_joypad . "\xeb71" ) + ( linea_basic_key . "\xeb72" ) + ( linea_basic_keyboard . "\xeb73" ) + ( linea_basic_laptop . "\xeb74" ) + ( linea_basic_life_buoy . "\xeb75" ) + ( linea_basic_lightbulb . "\xeb76" ) + ( linea_basic_link . "\xeb77" ) + ( linea_basic_lock . "\xeb78" ) + ( linea_basic_mouse . "\xeb79" ) + ( linea_basic_notebook . "\xeb7a" ) + ( linea_basic_notebook_pen . "\xeb7b" ) + ( linea_basic_notebook_pencil . "\xeb7c" ) + ( linea_basic_paperplane . "\xeb7d" ) + ( linea_basic_pencil_ruler . "\xeb7e" ) + ( linea_basic_pencil_ruler_pen . "\xeb7f" ) + ( linea_basic_clubs . "\xeb80" ) + ( linea_basic_compass . "\xeb81" ) + ( linea_basic_cup . "\xeb82" ) + ( linea_basic_diamonds . "\xeb83" ) + ( linea_basic_display . "\xeb84" ) + ( linea_basic_download . "\xeb85" ) + ( linea_basic_exclamation . "\xeb86" ) + ( linea_basic_eye . "\xeb87" ) + ( linea_basic_eye_closed . "\xeb88" ) + ( linea_basic_female . "\xeb89" ) + ( linea_basic_flag1 . "\xeb8a" ) + ( linea_basic_flag2 . "\xeb8b" ) + ( linea_basic_floppydisk . "\xeb8c" ) + ( linea_basic_folder . "\xeb8d" ) + ( linea_basic_folder_multiple . "\xeb8e" ) + ( linea_basic_gear . "\xeb8f" ) + ( linea_basic_geolocalize_01 . "\xeb90" ) + ( linea_basic_geolocalize_05 . "\xeb91" ) + ( linea_basic_globe . "\xeb92" ) + ( linea_basic_gunsight . "\xeb93" ) + ( linea_basic_hammer . "\xeb94" ) + ( linea_basic_headset . "\xeb95" ) + ( linea_basic_heart . "\xeb96" ) + ( linea_basic_heart_broken . "\xeb97" ) + ( linea_basic_helm . "\xeb98" ) + ( linea_basic_home . "\xeb99" ) + ( linea_basic_photo . "\xeb9a" ) + ( linea_basic_rss . "\xeb9b" ) + ( linea_basic_picture . "\xeb9c" ) + ( linea_basic_picture_multiple . "\xeb9d" ) + ( linea_basic_pin1 . "\xeb9e" ) + ( linea_basic_pin2 . "\xeb9f" ) + ( linea_basic_accelerator . "\xeba0" ) + ( linea_basic_alarm . "\xeba1" ) + ( linea_basic_anchor . "\xeba2" ) + ( linea_basic_anticlockwise . "\xeba3" ) + ( linea_basic_archive . "\xeba4" ) + ( linea_basic_archive_full . "\xeba5" ) + ( linea_basic_ban . "\xeba6" ) + ( linea_basic_battery_charge . "\xeba7" ) + ( linea_basic_battery_empty . "\xeba8" ) + ( linea_basic_battery_full . "\xeba9" ) + ( linea_basic_battery_half . "\xebaa" ) + ( linea_basic_bolt . "\xebab" ) + ( linea_basic_book . "\xebac" ) + ( linea_basic_book_pen . "\xebad" ) + ( linea_basic_book_pencil . "\xebae" ) + ( linea_basic_bookmark . "\xebaf" ) + ( linea_basic_calculator . "\xebb0" ) + ( linea_basic_calendar . "\xebb1" ) + ( linea_basic_cards_diamonds . "\xebb2" ) + ( linea_basic_cards_hearts . "\xebb3" ) + ( linea_basic_case . "\xebb4" ) + ( linea_basic_chronometer . "\xebb5" ) + ( linea_basic_clessidre . "\xebb6" ) + ( linea_basic_clock . "\xebb7" ) + ( linea_basic_clockwise . "\xebb8" ) + ( linea_basic_cloud . "\xebb9" ) + ( linea_basic_postcard . "\xebba" ) + ( linea_basic_postcard_multiple . "\xebbb" ) + ( linea_basic_printer . "\xebbc" ) + ( linea_basic_question . "\xebbd" ) + ( linea_basic_server . "\xebbe" ) + ( linea_basic_server2 . "\xebbf" ) + ( linea_basic_server_cloud . "\xebc0" ) + ( linea_basic_server_download . "\xebc1" ) + ( linea_basic_server_upload . "\xebc2" ) + ( linea_basic_settings . "\xebc3" ) + ( linea_basic_share . "\xebc4" ) + ( linea_basic_sheet . "\xebc5" ) + ( linea_basic_sheet_multiple . "\xebc6" ) + ( linea_basic_sheet_pen . "\xebc7" ) + ( linea_basic_sheet_pencil . "\xebc8" ) + ( linea_basic_sheet_txt . "\xebc9" ) + ( linea_basic_signs . "\xebca" ) + ( linea_basic_smartphone . "\xebcb" ) + ( linea_basic_spades . "\xebcc" ) + ( linea_basic_spread . "\xebcd" ) + ( linea_basic_spread_bookmark . "\xebce" ) + ( linea_basic_spread_text . "\xebcf" ) + ( linea_basic_spread_text_bookmark . "\xebd0" ) + ( linea_basic_star . "\xebd1" ) + ( linea_basic_tablet . "\xebd2" ) + ( linea_basic_target . "\xebd3" ) + ( linea_basic_todo . "\xebd4" ) + ( linea_basic_todo_pen . "\xebd5" ) + ( linea_basic_todo_pencil . "\xebd6" ) + ( linea_basic_todo_txt . "\xebd7" ) + ( linea_basic_todolist_pen . "\xebd8" ) + ( linea_basic_todolist_pencil . "\xebd9" ) + ( linea_basic_trashcan . "\xebda" ) + ( linea_basic_trashcan_full . "\xebdb" ) + ( linea_basic_trashcan_refresh . "\xebdc" ) + ( linea_basic_trashcan_remove . "\xebdd" ) + ( linea_basic_upload . "\xebde" ) + ( linea_basic_usb . "\xebdf" ) + ( linea_basic_video . "\xebe0" ) + ( linea_basic_watch . "\xebe1" ) + ( linea_basic_webpage . "\xebe2" ) + ( linea_basic_webpage_img_txt . "\xebe3" ) + ( linea_basic_webpage_multiple . "\xebe4" ) + ( linea_basic_webpage_txt . "\xebe5" ) + ( linea_basic_world . "\xebe6" ) + ( linea_elaboration_document_previous . "\xebe7" ) + ( linea_elaboration_document_refresh . "\xebe8" ) + ( linea_elaboration_document_remove . "\xebe9" ) + ( linea_elaboration_document_search . "\xebea" ) + ( linea_elaboration_document_star . "\xebeb" ) + ( linea_elaboration_document_upload . "\xebec" ) + ( linea_elaboration_folder_check . "\xebed" ) + ( linea_elaboration_folder_cloud . "\xebee" ) + ( linea_elaboration_folder_document . "\xebef" ) + ( linea_elaboration_folder_download . "\xebf0" ) + ( linea_elaboration_folder_flagged . "\xebf1" ) + ( linea_elaboration_folder_graph . "\xebf2" ) + ( linea_elaboration_folder_heart . "\xebf3" ) + ( linea_elaboration_folder_minus . "\xebf4" ) + ( linea_elaboration_folder_next . "\xebf5" ) + ( linea_elaboration_document_flagged . "\xebf6" ) + ( linea_elaboration_document_graph . "\xebf7" ) + ( linea_elaboration_document_heart . "\xebf8" ) + ( linea_elaboration_document_minus . "\xebf9" ) + ( linea_elaboration_document_next . "\xebfa" ) + ( linea_elaboration_document_noaccess . "\xebfb" ) + ( linea_elaboration_document_note . "\xebfc" ) + ( linea_elaboration_document_pencil . "\xebfd" ) + ( linea_elaboration_document_picture . "\xebfe" ) + ( linea_elaboration_document_plus . "\xebff" ) + ( linea_elaboration_folder_noaccess . "\xec00" ) + ( linea_elaboration_folder_note . "\xec01" ) + ( linea_elaboration_folder_pencil . "\xec02" ) + ( linea_elaboration_folder_picture . "\xec03" ) + ( linea_elaboration_folder_plus . "\xec04" ) + ( linea_elaboration_folder_previous . "\xec05" ) + ( linea_elaboration_folder_refresh . "\xec06" ) + ( linea_elaboration_calendar_empty . "\xec07" ) + ( linea_elaboration_calendar_flagged . "\xec08" ) + ( linea_elaboration_calendar_heart . "\xec09" ) + ( linea_elaboration_calendar_minus . "\xec0a" ) + ( linea_elaboration_calendar_next . "\xec0b" ) + ( linea_elaboration_calendar_noaccess . "\xec0c" ) + ( linea_elaboration_calendar_pencil . "\xec0d" ) + ( linea_elaboration_calendar_plus . "\xec0e" ) + ( linea_elaboration_calendar_previous . "\xec0f" ) + ( linea_elaboration_calendar_refresh . "\xec10" ) + ( linea_elaboration_calendar_remove . "\xec11" ) + ( linea_elaboration_calendar_search . "\xec12" ) + ( linea_elaboration_calendar_star . "\xec13" ) + ( linea_elaboration_calendar_upload . "\xec14" ) + ( linea_elaboration_cloud_check . "\xec15" ) + ( linea_elaboration_cloud_download . "\xec16" ) + ( linea_elaboration_cloud_minus . "\xec17" ) + ( linea_elaboration_cloud_noaccess . "\xec18" ) + ( linea_elaboration_cloud_plus . "\xec19" ) + ( linea_elaboration_cloud_refresh . "\xec1a" ) + ( linea_elaboration_cloud_remove . "\xec1b" ) + ( linea_elaboration_cloud_search . "\xec1c" ) + ( linea_elaboration_cloud_upload . "\xec1d" ) + ( linea_elaboration_document_check . "\xec1e" ) + ( linea_elaboration_document_cloud . "\xec1f" ) + ( linea_elaboration_document_download . "\xec20" ) + ( linea_elaboration_folder_remove . "\xec21" ) + ( linea_elaboration_mail_heart . "\xec22" ) + ( linea_elaboration_folder_search . "\xec23" ) + ( linea_elaboration_folder_star . "\xec24" ) + ( linea_elaboration_folder_upload . "\xec25" ) + ( linea_elaboration_mail_check . "\xec26" ) + ( linea_elaboration_bookmark_checck . "\xec27" ) + ( linea_elaboration_bookmark_minus . "\xec28" ) + ( linea_elaboration_bookmark_plus . "\xec29" ) + ( linea_elaboration_bookmark_remove . "\xec2a" ) + ( linea_elaboration_briefcase_check . "\xec2b" ) + ( linea_elaboration_briefcase_download . "\xec2c" ) + ( linea_elaboration_briefcase_flagged . "\xec2d" ) + ( linea_elaboration_briefcase_minus . "\xec2e" ) + ( linea_elaboration_briefcase_plus . "\xec2f" ) + ( linea_elaboration_briefcase_refresh . "\xec30" ) + ( linea_elaboration_briefcase_remove . "\xec31" ) + ( linea_elaboration_briefcase_search . "\xec32" ) + ( linea_elaboration_briefcase_star . "\xec33" ) + ( linea_elaboration_briefcase_upload . "\xec34" ) + ( linea_elaboration_browser_check . "\xec35" ) + ( linea_elaboration_browser_download . "\xec36" ) + ( linea_elaboration_browser_minus . "\xec37" ) + ( linea_elaboration_browser_plus . "\xec38" ) + ( linea_elaboration_browser_refresh . "\xec39" ) + ( linea_elaboration_browser_remove . "\xec3a" ) + ( linea_elaboration_browser_search . "\xec3b" ) + ( linea_elaboration_browser_star . "\xec3c" ) + ( linea_elaboration_browser_upload . "\xec3d" ) + ( linea_elaboration_calendar_check . "\xec3e" ) + ( linea_elaboration_calendar_cloud . "\xec3f" ) + ( linea_elaboration_calendar_download . "\xec40" ) + ( linea_elaboration_mail_cloud . "\xec41" ) + ( linea_elaboration_mail_document . "\xec42" ) + ( linea_elaboration_mail_download . "\xec43" ) + ( linea_elaboration_mail_flagged . "\xec44" ) + ( linea_elaboration_mail_next . "\xec45" ) + ( linea_elaboration_mail_noaccess . "\xec46" ) + ( linea_elaboration_mail_note . "\xec47" ) + ( linea_elaboration_mail_pencil . "\xec48" ) + ( linea_elaboration_mail_picture . "\xec49" ) + ( linea_elaboration_mail_previous . "\xec4a" ) + ( linea_elaboration_mail_refresh . "\xec4b" ) + ( linea_elaboration_mail_remove . "\xec4c" ) + ( linea_elaboration_mail_search . "\xec4d" ) + ( linea_elaboration_mail_star . "\xec4e" ) + ( linea_elaboration_mail_upload . "\xec4f" ) + ( linea_elaboration_message_check . "\xec50" ) + ( linea_elaboration_message_dots . "\xec51" ) + ( linea_elaboration_message_happy . "\xec52" ) + ( linea_elaboration_message_heart . "\xec53" ) + ( linea_elaboration_message_minus . "\xec54" ) + ( linea_elaboration_message_note . "\xec55" ) + ( linea_elaboration_message_plus . "\xec56" ) + ( linea_elaboration_message_refresh . "\xec57" ) + ( linea_elaboration_message_remove . "\xec58" ) + ( linea_elaboration_message_sad . "\xec59" ) + ( linea_elaboration_smartphone_cloud . "\xec5a" ) + ( linea_elaboration_smartphone_heart . "\xec5b" ) + ( linea_elaboration_smartphone_noaccess . "\xec5c" ) + ( linea_elaboration_smartphone_note . "\xec5d" ) + ( linea_elaboration_smartphone_pencil . "\xec5e" ) + ( linea_elaboration_smartphone_picture . "\xec5f" ) + ( linea_elaboration_smartphone_refresh . "\xec60" ) + ( linea_elaboration_smartphone_search . "\xec61" ) + ( linea_elaboration_tablet_cloud . "\xec62" ) + ( linea_elaboration_tablet_heart . "\xec63" ) + ( linea_elaboration_tablet_noaccess . "\xec64" ) + ( linea_elaboration_tablet_note . "\xec65" ) + ( linea_elaboration_tablet_pencil . "\xec66" ) + ( linea_elaboration_tablet_picture . "\xec67" ) + ( linea_elaboration_tablet_refresh . "\xec68" ) + ( linea_elaboration_tablet_search . "\xec69" ) + ( linea_elaboration_todolist_2 . "\xec6a" ) + ( linea_elaboration_todolist_check . "\xec6b" ) + ( linea_elaboration_todolist_cloud . "\xec6c" ) + ( linea_elaboration_todolist_download . "\xec6d" ) + ( linea_elaboration_todolist_flagged . "\xec6e" ) + ( linea_elaboration_todolist_minus . "\xec6f" ) + ( linea_elaboration_todolist_noaccess . "\xec70" ) + ( linea_elaboration_todolist_pencil . "\xec71" ) + ( linea_elaboration_todolist_plus . "\xec72" ) + ( linea_elaboration_todolist_refresh . "\xec73" ) + ( linea_elaboration_todolist_remove . "\xec74" ) + ( linea_elaboration_todolist_search . "\xec75" ) + ( linea_elaboration_todolist_star . "\xec76" ) + ( linea_elaboration_todolist_upload . "\xec77" ) + ( linea_ecommerce_receipt_kips . "\xec78" ) + ( linea_ecommerce_receipt_lira . "\xec79" ) + ( linea_ecommerce_receipt_naira . "\xec7a" ) + ( linea_ecommerce_receipt_pesos . "\xec7b" ) + ( linea_ecommerce_receipt_pound . "\xec7c" ) + ( linea_ecommerce_receipt_rublo . "\xec7d" ) + ( linea_ecommerce_receipt_rupee . "\xec7e" ) + ( linea_ecommerce_receipt_tugrik . "\xec7f" ) + ( linea_ecommerce_receipt_won . "\xec80" ) + ( linea_ecommerce_receipt_yen . "\xec81" ) + ( linea_ecommerce_receipt_yen2 . "\xec82" ) + ( linea_ecommerce_recept_colon . "\xec83" ) + ( linea_ecommerce_rublo . "\xec84" ) + ( linea_ecommerce_rupee . "\xec85" ) + ( linea_ecommerce_safe . "\xec86" ) + ( linea_ecommerce_naira . "\xec87" ) + ( linea_ecommerce_pesos . "\xec88" ) + ( linea_ecommerce_pound . "\xec89" ) + ( linea_ecommerce_receipt . "\xec8a" ) + ( linea_ecommerce_receipt_bath . "\xec8b" ) + ( linea_ecommerce_receipt_cent . "\xec8c" ) + ( linea_ecommerce_receipt_dollar . "\xec8d" ) + ( linea_ecommerce_receipt_euro . "\xec8e" ) + ( linea_ecommerce_receipt_franc . "\xec8f" ) + ( linea_ecommerce_receipt_guarani . "\xec90" ) + ( linea_ecommerce_sale . "\xec91" ) + ( linea_ecommerce_sales . "\xec92" ) + ( linea_ecommerce_ticket . "\xec93" ) + ( linea_ecommerce_tugriks . "\xec94" ) + ( linea_ecommerce_wallet . "\xec95" ) + ( linea_ecommerce_won . "\xec96" ) + ( linea_ecommerce_yen . "\xec97" ) + ( linea_ecommerce_cart_content . "\xec98" ) + ( linea_ecommerce_cart_download . "\xec99" ) + ( linea_ecommerce_cart_minus . "\xec9a" ) + ( linea_ecommerce_cart_plus . "\xec9b" ) + ( linea_ecommerce_cart_refresh . "\xec9c" ) + ( linea_ecommerce_cart_remove . "\xec9d" ) + ( linea_ecommerce_cart_search . "\xec9e" ) + ( linea_ecommerce_cart_upload . "\xec9f" ) + ( linea_ecommerce_cent . "\xeca0" ) + ( linea_ecommerce_colon . "\xeca1" ) + ( linea_ecommerce_creditcard . "\xeca2" ) + ( linea_ecommerce_diamond . "\xeca3" ) + ( linea_ecommerce_dollar . "\xeca4" ) + ( linea_ecommerce_euro . "\xeca5" ) + ( linea_ecommerce_franc . "\xeca6" ) + ( linea_ecommerce_gift . "\xeca7" ) + ( linea_ecommerce_graph1 . "\xeca8" ) + ( linea_ecommerce_graph2 . "\xeca9" ) + ( linea_ecommerce_graph3 . "\xecaa" ) + ( linea_ecommerce_graph_decrease . "\xecab" ) + ( linea_ecommerce_graph_increase . "\xecac" ) + ( linea_ecommerce_guarani . "\xecad" ) + ( linea_ecommerce_kips . "\xecae" ) + ( linea_ecommerce_lira . "\xecaf" ) + ( linea_ecommerce_megaphone . "\xecb0" ) + ( linea_ecommerce_money . "\xecb1" ) + ( linea_ecommerce_yen2 . "\xecb2" ) + ( linea_ecommerce_bag . "\xecb3" ) + ( linea_ecommerce_bag_check . "\xecb4" ) + ( linea_ecommerce_bag_cloud . "\xecb5" ) + ( linea_ecommerce_bag_download . "\xecb6" ) + ( linea_ecommerce_bag_minus . "\xecb7" ) + ( linea_ecommerce_bag_plus . "\xecb8" ) + ( linea_ecommerce_bag_refresh . "\xecb9" ) + ( linea_ecommerce_bag_remove . "\xecba" ) + ( linea_ecommerce_bag_search . "\xecbb" ) + ( linea_ecommerce_bag_upload . "\xecbc" ) + ( linea_ecommerce_banknote . "\xecbd" ) + ( linea_ecommerce_banknotes . "\xecbe" ) + ( linea_ecommerce_basket . "\xecbf" ) + ( linea_ecommerce_basket_check . "\xecc0" ) + ( linea_ecommerce_basket_cloud . "\xecc1" ) + ( linea_ecommerce_basket_download . "\xecc2" ) + ( linea_ecommerce_basket_minus . "\xecc3" ) + ( linea_ecommerce_basket_plus . "\xecc4" ) + ( linea_ecommerce_basket_refresh . "\xecc5" ) + ( linea_ecommerce_basket_remove . "\xecc6" ) + ( linea_ecommerce_basket_search . "\xecc7" ) + ( linea_ecommerce_basket_upload . "\xecc8" ) + ( linea_ecommerce_bath . "\xecc9" ) + ( linea_ecommerce_cart . "\xecca" ) + ( linea_ecommerce_cart_check . "\xeccb" ) + ( linea_ecommerce_cart_cloud . "\xeccc" ) + ( linea_music_stop_button . "\xeccd" ) + ( linea_music_tape . "\xecce" ) + ( linea_music_volume_down . "\xeccf" ) + ( linea_music_volume_up . "\xecd0" ) + ( linea_music_beginning_button . "\xecd1" ) + ( linea_music_bell . "\xecd2" ) + ( linea_music_cd . "\xecd3" ) + ( linea_music_diapason . "\xecd4" ) + ( linea_music_eject_button . "\xecd5" ) + ( linea_music_end_button . "\xecd6" ) + ( linea_music_fastforward_button . "\xecd7" ) + ( linea_music_headphones . "\xecd8" ) + ( linea_music_ipod . "\xecd9" ) + ( linea_music_loudspeaker . "\xecda" ) + ( linea_music_microphone . "\xecdb" ) + ( linea_music_microphone_old . "\xecdc" ) + ( linea_music_mixer . "\xecdd" ) + ( linea_music_mute . "\xecde" ) + ( linea_music_note_multiple . "\xecdf" ) + ( linea_music_note_single . "\xece0" ) + ( linea_music_pause_button . "\xece1" ) + ( linea_music_play_button . "\xece2" ) + ( linea_music_playlist . "\xece3" ) + ( linea_music_radio_ghettoblaster . "\xece4" ) + ( linea_music_radio_portable . "\xece5" ) + ( linea_music_record . "\xece6" ) + ( linea_music_recordplayer . "\xece7" ) + ( linea_music_repeat_button . "\xece8" ) + ( linea_music_rewind_button . "\xece9" ) + ( linea_music_shuffle_button . "\xecea" ) + ( linea_software_paragraph_justify_center . "\xeceb" ) + ( linea_software_paragraph_justify_left . "\xecec" ) + ( linea_software_paragraph_justify_right . "\xeced" ) + ( linea_software_paragraph_space_after . "\xecee" ) + ( linea_software_paragraph_space_before . "\xecef" ) + ( linea_software_pathfinder_exclude . "\xecf0" ) + ( linea_software_pathfinder_intersect . "\xecf1" ) + ( linea_software_pathfinder_subtract . "\xecf2" ) + ( linea_software_pathfinder_unite . "\xecf3" ) + ( linea_software_pen . "\xecf4" ) + ( linea_software_pen_add . "\xecf5" ) + ( linea_software_pen_remove . "\xecf6" ) + ( linea_software_pencil . "\xecf7" ) + ( linea_software_polygonallasso . "\xecf8" ) + ( linea_software_reflect_horizontal . "\xecf9" ) + ( linea_software_magnete . "\xecfa" ) + ( linea_software_pages . "\xecfb" ) + ( linea_software_paintbrush . "\xecfc" ) + ( linea_software_paintbucket . "\xecfd" ) + ( linea_software_paintroller . "\xecfe" ) + ( linea_software_paragraph . "\xecff" ) + ( linea_software_paragraph_align_left . "\xed00" ) + ( linea_software_paragraph_align_right . "\xed01" ) + ( linea_software_paragraph_center . "\xed02" ) + ( linea_software_paragraph_justify_all . "\xed03" ) + ( linea_software_reflect_vertical . "\xed04" ) + ( linea_software_remove_vectorpoint . "\xed05" ) + ( linea_software_scale_expand . "\xed06" ) + ( linea_software_scale_reduce . "\xed07" ) + ( linea_software_selection_oval . "\xed08" ) + ( linea_software_selection_polygon . "\xed09" ) + ( linea_software_selection_rectangle . "\xed0a" ) + ( linea_software_indent_firstline . "\xed0b" ) + ( linea_software_indent_left . "\xed0c" ) + ( linea_software_indent_right . "\xed0d" ) + ( linea_software_lasso . "\xed0e" ) + ( linea_software_layers1 . "\xed0f" ) + ( linea_software_layers2 . "\xed10" ) + ( linea_software_layout . "\xed11" ) + ( linea_software_layout_2columns . "\xed12" ) + ( linea_software_layout_3columns . "\xed13" ) + ( linea_software_layout_4boxes . "\xed14" ) + ( linea_software_layout_4columns . "\xed15" ) + ( linea_software_layout_4lines . "\xed16" ) + ( linea_software_layout_8boxes . "\xed17" ) + ( linea_software_layout_header . "\xed18" ) + ( linea_software_layout_header_2columns . "\xed19" ) + ( linea_software_layout_header_3columns . "\xed1a" ) + ( linea_software_layout_header_4boxes . "\xed1b" ) + ( linea_software_layout_header_4columns . "\xed1c" ) + ( linea_software_layout_header_complex . "\xed1d" ) + ( linea_software_layout_header_complex2 . "\xed1e" ) + ( linea_software_layout_header_complex3 . "\xed1f" ) + ( linea_software_layout_header_complex4 . "\xed20" ) + ( linea_software_layout_header_sideleft . "\xed21" ) + ( linea_software_layout_header_sideright . "\xed22" ) + ( linea_software_layout_sidebar_left . "\xed23" ) + ( linea_software_layout_sidebar_right . "\xed24" ) + ( linea_software_selection_roundedrectangle . "\xed25" ) + ( linea_software_vector_line . "\xed26" ) + ( linea_software_shape_oval . "\xed27" ) + ( linea_software_shape_polygon . "\xed28" ) + ( linea_software_shape_rectangle . "\xed29" ) + ( linea_software_shape_roundedrectangle . "\xed2a" ) + ( linea_software_add_vectorpoint . "\xed2b" ) + ( linea_software_box_oval . "\xed2c" ) + ( linea_software_box_polygon . "\xed2d" ) + ( linea_software_box_rectangle . "\xed2e" ) + ( linea_software_box_roundedrectangle . "\xed2f" ) + ( linea_software_character . "\xed30" ) + ( linea_software_crop . "\xed31" ) + ( linea_software_eyedropper . "\xed32" ) + ( linea_software_font_allcaps . "\xed33" ) + ( linea_software_font_baseline_shift . "\xed34" ) + ( linea_software_font_horizontal_scale . "\xed35" ) + ( linea_software_font_kerning . "\xed36" ) + ( linea_software_font_leading . "\xed37" ) + ( linea_software_font_size . "\xed38" ) + ( linea_software_font_smallcapital . "\xed39" ) + ( linea_software_font_smallcaps . "\xed3a" ) + ( linea_software_font_strikethrough . "\xed3b" ) + ( linea_software_font_tracking . "\xed3c" ) + ( linea_software_font_underline . "\xed3d" ) + ( linea_software_font_vertical_scale . "\xed3e" ) + ( linea_software_horizontal_align_center . "\xed3f" ) + ( linea_software_horizontal_align_left . "\xed40" ) + ( linea_software_horizontal_align_right . "\xed41" ) + ( linea_software_horizontal_distribute_center . "\xed42" ) + ( linea_software_horizontal_distribute_left . "\xed43" ) + ( linea_software_horizontal_distribute_right . "\xed44" ) + ( linea_software_slice . "\xed45" ) + ( linea_software_transform_bezier . "\xed46" ) + ( linea_software_vector_box . "\xed47" ) + ( linea_software_vector_composite . "\xed48" ) + ( linea_software_vertical_align_bottom . "\xed49" ) + ( linea_software_vertical_align_center . "\xed4a" ) + ( linea_software_vertical_align_top . "\xed4b" ) + ( linea_software_vertical_distribute_bottom . "\xed4c" ) + ( linea_software_vertical_distribute_center . "\xed4d" ) + ( linea_software_vertical_distribute_top . "\xed4e" ) + ( linea_weather_aquarius . "\xed4f" ) + ( linea_weather_aries . "\xed50" ) + ( linea_weather_cancer . "\xed51" ) + ( linea_weather_capricorn . "\xed52" ) + ( linea_weather_cloud . "\xed53" ) + ( linea_weather_cloud_drop . "\xed54" ) + ( linea_weather_cloud_lightning . "\xed55" ) + ( linea_weather_cloud_snowflake . "\xed56" ) + ( linea_weather_downpour_fullmoon . "\xed57" ) + ( linea_weather_downpour_halfmoon . "\xed58" ) + ( linea_weather_downpour_sun . "\xed59" ) + ( linea_weather_drop . "\xed5a" ) + ( linea_weather_first_quarter . "\xed5b" ) + ( linea_weather_fog . "\xed5c" ) + ( linea_weather_fog_fullmoon . "\xed5d" ) + ( linea_weather_fog_halfmoon . "\xed5e" ) + ( linea_weather_fog_sun . "\xed5f" ) + ( linea_weather_fullmoon . "\xed60" ) + ( linea_weather_gemini . "\xed61" ) + ( linea_weather_hail . "\xed62" ) + ( linea_weather_hail_fullmoon . "\xed63" ) + ( linea_weather_hail_halfmoon . "\xed64" ) + ( linea_weather_hail_sun . "\xed65" ) + ( linea_weather_last_quarter . "\xed66" ) + ( linea_weather_leo . "\xed67" ) + ( linea_weather_libra . "\xed68" ) + ( linea_weather_lightning . "\xed69" ) + ( linea_weather_mistyrain . "\xed6a" ) + ( linea_weather_mistyrain_fullmoon . "\xed6b" ) + ( linea_weather_mistyrain_halfmoon . "\xed6c" ) + ( linea_weather_mistyrain_sun . "\xed6d" ) + ( linea_weather_moon . "\xed6e" ) + ( linea_weather_moondown_full . "\xed6f" ) + ( linea_weather_moondown_half . "\xed70" ) + ( linea_weather_moonset_full . "\xed71" ) + ( linea_weather_moonset_half . "\xed72" ) + ( linea_weather_move2 . "\xed73" ) + ( linea_weather_newmoon . "\xed74" ) + ( linea_weather_pisces . "\xed75" ) + ( linea_weather_rain . "\xed76" ) + ( linea_weather_rain_fullmoon . "\xed77" ) + ( linea_weather_rain_halfmoon . "\xed78" ) + ( linea_weather_rain_sun . "\xed79" ) + ( linea_weather_sagittarius . "\xed7a" ) + ( linea_weather_scorpio . "\xed7b" ) + ( linea_weather_snow . "\xed7c" ) + ( linea_weather_snow_fullmoon . "\xed7d" ) + ( linea_weather_snow_halfmoon . "\xed7e" ) + ( linea_weather_snow_sun . "\xed7f" ) + ( linea_weather_snowflake . "\xed80" ) + ( linea_weather_star . "\xed81" ) + ( linea_weather_storm_11 . "\xed82" ) + ( linea_weather_storm_32 . "\xed83" ) + ( linea_weather_storm_fullmoon . "\xed84" ) + ( linea_weather_storm_halfmoon . "\xed85" ) + ( linea_weather_storm_sun . "\xed86" ) + ( linea_weather_sun . "\xed87" ) + ( linea_weather_sundown . "\xed88" ) + ( linea_weather_sunset . "\xed89" ) + ( linea_weather_taurus . "\xed8a" ) + ( linea_weather_tempest . "\xed8b" ) + ( linea_weather_tempest_fullmoon . "\xed8c" ) + ( linea_weather_tempest_halfmoon . "\xed8d" ) + ( linea_weather_tempest_sun . "\xed8e" ) + ( linea_weather_variable_fullmoon . "\xed8f" ) + ( linea_weather_variable_halfmoon . "\xed90" ) + ( linea_weather_variable_sun . "\xed91" ) + ( linea_weather_virgo . "\xed92" ) + ( linea_weather_waning_cresent . "\xed93" ) + ( linea_weather_waning_gibbous . "\xed94" ) + ( linea_weather_waxing_cresent . "\xed95" ) + ( linea_weather_waxing_gibbous . "\xed96" ) + ( linea_weather_wind . "\xed97" ) + ( linea_weather_wind_e . "\xed98" ) + ( linea_weather_wind_fullmoon . "\xed99" ) + ( linea_weather_wind_halfmoon . "\xed9a" ) + ( linea_weather_wind_n . "\xed9b" ) + ( linea_weather_wind_ne . "\xed9c" ) + ( linea_weather_wind_nw . "\xed9d" ) + ( linea_weather_wind_s . "\xed9e" ) + ( linea_weather_wind_se . "\xed9f" ) + ( linea_weather_wind_sun . "\xeda0" ) + ( linea_weather_wind_sw . "\xeda1" ) + ( linea_weather_wind_w . "\xeda2" ) + ( linea_weather_windgust . "\xeda3" ) + ( mfizz_3dprint . "\xeda4" ) + ( mfizz_alpinelinux . "\xeda5" ) + ( mfizz_angular . "\xeda6" ) + ( mfizz_angular_alt . "\xeda7" ) + ( mfizz_antenna . "\xeda8" ) + ( mfizz_apache . "\xeda9" ) + ( mfizz_archlinux . "\xedaa" ) + ( mfizz_aws . "\xedab" ) + ( mfizz_azure . "\xedac" ) + ( mfizz_backbone . "\xedad" ) + ( mfizz_blackberry . "\xedae" ) + ( mfizz_bomb . "\xedaf" ) + ( mfizz_bootstrap . "\xedb0" ) + ( mfizz_c . "\xedb1" ) + ( mfizz_cassandra . "\xedb2" ) + ( mfizz_centos . "\xedb3" ) + ( mfizz_clojure . "\xedb4" ) + ( mfizz_codeigniter . "\xedb5" ) + ( mfizz_codepen . "\xedb6" ) + ( mfizz_coffee_bean . "\xedb7" ) + ( mfizz_cplusplus . "\xedb8" ) + ( mfizz_csharp . "\xedb9" ) + ( mfizz_css . "\xedba" ) + ( mfizz_css3 . "\xedbb" ) + ( mfizz_css3_alt . "\xedbc" ) + ( mfizz_d3 . "\xedbd" ) + ( mfizz_database . "\xedbe" ) + ( mfizz_database_alt . "\xedbf" ) + ( mfizz_database_alt2 . "\xedc0" ) + ( mfizz_debian . "\xedc1" ) + ( mfizz_docker . "\xedc2" ) + ( mfizz_dreamhost . "\xedc3" ) + ( mfizz_elixir . "\xedc4" ) + ( mfizz_elm . "\xedc5" ) + ( mfizz_erlang . "\xedc6" ) + ( mfizz_exherbo . "\xedc7" ) + ( mfizz_fedora . "\xedc8" ) + ( mfizz_fire_alt . "\xedc9" ) + ( mfizz_freebsd . "\xedca" ) + ( mfizz_freecodecamp . "\xedcb" ) + ( mfizz_gentoo . "\xedcc" ) + ( mfizz_ghost . "\xedcd" ) + ( mfizz_git . "\xedce" ) + ( mfizz_gnome . "\xedcf" ) + ( mfizz_go . "\xedd0" ) + ( mfizz_go_alt . "\xedd1" ) + ( mfizz_google . "\xedd2" ) + ( mfizz_google_alt . "\xedd3" ) + ( mfizz_google_code . "\xedd4" ) + ( mfizz_google_developers . "\xedd5" ) + ( mfizz_gradle . "\xedd6" ) + ( mfizz_grails . "\xedd7" ) + ( mfizz_grails_alt . "\xedd8" ) + ( mfizz_grunt . "\xedd9" ) + ( mfizz_gulp . "\xedda" ) + ( mfizz_gulp_alt . "\xeddb" ) + ( mfizz_hadoop . "\xeddc" ) + ( mfizz_haskell . "\xeddd" ) + ( mfizz_heroku . "\xedde" ) + ( mfizz_html . "\xeddf" ) + ( mfizz_html5 . "\xede0" ) + ( mfizz_html5_alt . "\xede1" ) + ( mfizz_iphone . "\xede2" ) + ( mfizz_java . "\xede3" ) + ( mfizz_java_bold . "\xede4" ) + ( mfizz_java_duke . "\xede5" ) + ( mfizz_javascript . "\xede6" ) + ( mfizz_javascript_alt . "\xede7" ) + ( mfizz_jetty . "\xede8" ) + ( mfizz_jquery . "\xede9" ) + ( mfizz_kde . "\xedea" ) + ( mfizz_laravel . "\xedeb" ) + ( mfizz_line_graph . "\xedec" ) + ( mfizz_linux_mint . "\xeded" ) + ( mfizz_looking . "\xedee" ) + ( mfizz_magento . "\xedef" ) + ( mfizz_mariadb . "\xedf0" ) + ( mfizz_maven . "\xedf1" ) + ( mfizz_microscope . "\xedf2" ) + ( mfizz_mobile_device . "\xedf3" ) + ( mfizz_mobile_phone_alt . "\xedf4" ) + ( mfizz_mobile_phone_broadcast . "\xedf5" ) + ( mfizz_mongodb . "\xedf6" ) + ( mfizz_mssql . "\xedf7" ) + ( mfizz_mysql . "\xedf8" ) + ( mfizz_mysql_alt . "\xedf9" ) + ( mfizz_netbsd . "\xedfa" ) + ( mfizz_nginx . "\xedfb" ) + ( mfizz_nginx_alt . "\xedfc" ) + ( mfizz_nginx_alt2 . "\xedfd" ) + ( mfizz_nodejs . "\xedfe" ) + ( mfizz_npm . "\xedff" ) + ( mfizz_objc . "\xee00" ) + ( mfizz_openshift . "\xee01" ) + ( mfizz_oracle . "\xee02" ) + ( mfizz_oracle_alt . "\xee03" ) + ( mfizz_osx . "\xee04" ) + ( mfizz_perl . "\xee05" ) + ( mfizz_phone_alt . "\xee06" ) + ( mfizz_phone_gap . "\xee07" ) + ( mfizz_phone_retro . "\xee08" ) + ( mfizz_php . "\xee09" ) + ( mfizz_php_alt . "\xee0a" ) + ( mfizz_playframework . "\xee0b" ) + ( mfizz_playframework_alt . "\xee0c" ) + ( mfizz_plone . "\xee0d" ) + ( mfizz_postgres . "\xee0e" ) + ( mfizz_postgres_alt . "\xee0f" ) + ( mfizz_python . "\xee10" ) + ( mfizz_raspberrypi . "\xee11" ) + ( mfizz_reactjs . "\xee12" ) + ( mfizz_redhat . "\xee13" ) + ( mfizz_redis . "\xee14" ) + ( mfizz_ruby . "\xee15" ) + ( mfizz_ruby_on_rails . "\xee16" ) + ( mfizz_ruby_on_rails_alt . "\xee17" ) + ( mfizz_rust . "\xee18" ) + ( mfizz_sass . "\xee19" ) + ( mfizz_satellite . "\xee1a" ) + ( mfizz_scala . "\xee1b" ) + ( mfizz_scala_alt . "\xee1c" ) + ( mfizz_script . "\xee1d" ) + ( mfizz_script_alt . "\xee1e" ) + ( mfizz_shell . "\xee1f" ) + ( mfizz_sitefinity . "\xee20" ) + ( mfizz_solaris . "\xee21" ) + ( mfizz_splatter . "\xee22" ) + ( mfizz_spring . "\xee23" ) + ( mfizz_suse . "\xee24" ) + ( mfizz_svg . "\xee25" ) + ( mfizz_symfony . "\xee26" ) + ( mfizz_tomcat . "\xee27" ) + ( mfizz_ubuntu . "\xee28" ) + ( mfizz_unity . "\xee29" ) + ( mfizz_wireless . "\xee2a" ) + ( mfizz_wordpress . "\xee2b" ) + ( mfizz_x11 . "\xee2c" ) + ( firacode_asterisk . "\xee2d" ) + ( firacode_plus . "\xee2e" ) + ( firacode_hyphen . "\xee2f" ) + ( firacode_sad . "\xee30" ) + ( firacode_w_w_w . "\xee31" ) + ( firacode_asterisk_asterisk . "\xee32" ) + ( firacode_asterisk_asterisk_asterisk . "\xee33" ) + ( firacode_asterisk_asterisk_slash . "\xee34" ) + ( firacode_asterisk_greater . "\xee35" ) + ( firacode_asterisk_slash . "\xee36" ) + ( firacode_backslash_backslash . "\xee37" ) + ( firacode_bbb . "\xee38" ) + ( firacode_braceleft_hyphen . "\xee39" ) + ( firacode_bracketleft_bracketright . "\xee3a" ) + ( firacode_colon_colon . "\xee3b" ) + ( firacode_colon_colon_colon . "\xee3c" ) + ( firacode_colon_equal . "\xee3d" ) + ( firacode_exclam_exclam . "\xee3e" ) + ( firacode_exclam_equal . "\xee3f" ) + ( firacode_exclam_equal_equal . "\xee40" ) + ( firacode_hyphen_braceright . "\xee41" ) + ( firacode_hyphen_hyphen . "\xee42" ) + ( firacode_hyphen_hyphen_hyphen . "\xee43" ) + ( firacode_hyphen_hyphen_greater . "\xee44" ) + ( firacode_hyphen_greater . "\xee45" ) + ( firacode_hyphen_greater_greater . "\xee46" ) + ( firacode_hyphen_less . "\xee47" ) + ( firacode_hyphen_less_less . "\xee48" ) + ( firacode_hyphen_asciitilde . "\xee49" ) + ( firacode_numbersign_braceleft . "\xee4a" ) + ( firacode_numbersign_bracketleft . "\xee4b" ) + ( firacode_numbersign_numbersign . "\xee4c" ) + ( firacode_nnn . "\xee4d" ) + ( firacode_nnnn . "\xee4e" ) + ( firacode_numbersign_parenleft . "\xee4f" ) + ( firacode_numbersign_question . "\xee50" ) + ( firacode_numbersign_underscore . "\xee51" ) + ( firacode_nup . "\xee52" ) + ( firacode_period_hyphen . "\xee53" ) + ( firacode_period_equal . "\xee54" ) + ( firacode_period_period . "\xee55" ) + ( firacode_period_period_less . "\xee56" ) + ( firacode_period_period_period . "\xee57" ) + ( firacode_question_equal . "\xee58" ) + ( firacode_question_question . "\xee59" ) + ( firacode_semicolon_semicolon . "\xee5a" ) + ( firacode_slash_asterisk . "\xee5b" ) + ( firacode_slash_asterisk_asterisk . "\xee5c" ) + ( firacode_slash_equal . "\xee5d" ) + ( firacode_slash_equal_equal . "\xee5e" ) + ( firacode_slash_greater . "\xee5f" ) + ( firacode_slash_slash . "\xee60" ) + ( firacode_slash_slash_slash . "\xee61" ) + ( firacode_ampersand_ampersand . "\xee62" ) + ( firacode_bar_bar . "\xee63" ) + ( firacode_bar_bar_equal . "\xee64" ) + ( firacode_bar_equal . "\xee65" ) + ( firacode_bar_greater . "\xee66" ) + ( firacode_asciicircum_equal . "\xee67" ) + ( firacode_dollar_greater . "\xee68" ) + ( firacode_plus_plus . "\xee69" ) + ( firacode_plus_plus_plus . "\xee6a" ) + ( firacode_plus_greater . "\xee6b" ) + ( firacode_equal_colon_equal . "\xee6c" ) + ( firacode_equal_equal . "\xee6d" ) + ( firacode_equal_equal_equal . "\xee6e" ) + ( firacode_equal_equal_greater . "\xee6f" ) + ( firacode_equal_greater . "\xee70" ) + ( firacode_equal_greater_greater . "\xee71" ) + ( firacode_equal_less . "\xee72" ) + ( firacode_equal_less_less . "\xee73" ) + ( firacode_equal_slash_equal . "\xee74" ) + ( firacode_greater_hyphen . "\xee75" ) + ( firacode_greater_equal . "\xee76" ) + ( firacode_greater_equal_greater . "\xee77" ) + ( firacode_greater_greater . "\xee78" ) + ( firacode_greater_greater_hyphen . "\xee79" ) + ( firacode_greater_greater_equal . "\xee7a" ) + ( firacode_greater_greater_greater . "\xee7b" ) + ( firacode_less_asterisk . "\xee7c" ) + ( firacode_less_asterisk_greater . "\xee7d" ) + ( firacode_less_bar . "\xee7e" ) + ( firacode_less_bar_greater . "\xee7f" ) + ( firacode_less_dollar . "\xee80" ) + ( firacode_less_dollar_greater . "\xee81" ) + ( firacode_less_exclam_hyphen_hyphen . "\xee82" ) + ( firacode_less_hyphen . "\xee83" ) + ( firacode_less_hyphen_hyphen . "\xee84" ) + ( firacode_less_hyphen_greater . "\xee85" ) + ( firacode_less_plus . "\xee86" ) + ( firacode_less_plus_greater . "\xee87" ) + ( firacode_less_equal . "\xee88" ) + ( firacode_less_equal_equal . "\xee89" ) + ( firacode_less_equal_greater . "\xee8a" ) + ( firacode_less_equal_less . "\xee8b" ) + ( firacode_less_greater . "\xee8c" ) + ( firacode_less_less . "\xee8d" ) + ( firacode_less_less_hyphen . "\xee8e" ) + ( firacode_less_less_equal . "\xee8f" ) + ( firacode_less_less_less . "\xee90" ) + ( firacode_less_asciitilde . "\xee91" ) + ( firacode_less_asciitilde_asciitilde . "\xee92" ) + ( firacode_less_slash . "\xee93" ) + ( firacode_less_slash_greater . "\xee94" ) + ( firacode_asciitilde_at . "\xee95" ) + ( firacode_asciitilde_hyphen . "\xee96" ) + ( firacode_asciitilde_equal . "\xee97" ) + ( firacode_asciitilde_greater . "\xee98" ) + ( firacode_asciitilde_asciitilde . "\xee99" ) + ( firacode_aag . "\xee9a" ) + ( firacode_percent_percent . "\xee9b" ) + ( firacode_x_multiply . "\xee9c" ) + ( firacode_colon_uc . "\xee9d" ) + ( firacode_plus_lc . "\xee9e" ) + ( firacode_plus_tosf2 . "\xee9f" ) + ( firacode_nameme_1114119 . "\xeea0" ) + )) + + +(defun icons-in-terminal (name &rest attributes) + "Return icon from NAME with optional ATTRIBUTES. +Attributes are face attributes or the display specification raise with :raise +the keyword :face can be use as an alias for :inherit + +Examples of use: (insert (icons-in-terminal 'oct_flame)) + (insert (icons-in-terminal 'oct_flame :foreground \"red\" :height 1.4)) + (insert (icons-in-terminal 'oct_flame :face any-face :underline t)) + (insert (icons-in-terminal 'oct_flame :inherit any-face :underline t)) ;; Similar to the line above + (insert (icons-in-terminal 'oct_flame :raise 0.2))." + (let* ((list-attributes (list :family "icons-in-terminal")) + (face (or (plist-get attributes :inherit) (plist-get attributes :face))) + (foreground (plist-get attributes :foreground)) + (distant-foreground (plist-get attributes :distant-foreground)) + (background (plist-get attributes :background)) + (width (plist-get attributes :width)) + (height (plist-get attributes :height)) + (underline (plist-get attributes :underline)) + (overline (plist-get attributes :overline)) + (box (plist-get attributes :box)) + (raise (or (plist-get attributes :raise) -0.05))) + (when face (push `(:inherit ,face) list-attributes)) + (when foreground (push `(:foreground ,foreground) list-attributes)) + (when distant-foreground (push `(:distant-foreground ,distant-foreground) list-attributes)) + (when background (push `(:background ,background) list-attributes)) + (when width (push `(:width ,width) list-attributes)) + (when height (push `(:height ,height) list-attributes)) + (when underline (push `(:underline ,underline) list-attributes)) + (when overline (push `(:overline ,overline) list-attributes)) + (when box (push `(:box ,box) list-attributes)) + (propertize (alist-get name icons-in-terminal-alist) + 'face list-attributes + 'display `(raise ,raise) + 'font-lock-ignore t))) + + +(provide 'icons-in-terminal) diff --git a/nnn-4.9/icons-in-terminal/build/icons-in-terminal.h b/nnn-4.9/icons-in-terminal/build/icons-in-terminal.h @@ -0,0 +1,3736 @@ +#ifndef ICONS_IN_TERMINAL +# define ICONS_IN_TERMINAL + +# define POWERLINE_BRANCH "\ue0a0" +# define POWERLINE_LINE_NUMBER "\ue0a1" +# define POWERLINE_READONLY "\ue0a2" +# define POWERLINE_EXTRA_COLUMN_NUMBER "\ue0a3" +# define POWERLINE_LEFT_HARD_DIVIDER "\ue0b0" +# define POWERLINE_LEFT_SOFT_DIVIDER "\ue0b1" +# define POWERLINE_RIGHT_HARD_DIVIDER "\ue0b2" +# define POWERLINE_RIGHT_SOFT_DIVIDER "\ue0b3" +# define POWERLINE_EXTRA_RIGHT_HALF_CIRCLE_THICK "\ue0b4" +# define POWERLINE_EXTRA_RIGHT_HALF_CIRCLE_THIN "\ue0b5" +# define POWERLINE_EXTRA_LEFT_HALF_CIRCLE_THICK "\ue0b6" +# define POWERLINE_EXTRA_LEFT_HALF_CIRCLE_THIN "\ue0b7" +# define POWERLINE_EXTRA_LOWER_LEFT_TRIANGLE "\ue0b8" +# define POWERLINE_EXTRA_BACKSLASH_SEPARATOR "\ue0b9" +# define POWERLINE_EXTRA_LOWER_RIGHT_TRIANGLE "\ue0ba" +# define POWERLINE_EXTRA_FORWARDSLASH_SEPARATOR "\ue0bb" +# define POWERLINE_EXTRA_UPPER_LEFT_TRIANGLE "\ue0bc" +# define POWERLINE_EXTRA_FORWARDSLASH_SEPARATOR_REDUNDANT "\ue0bd" +# define POWERLINE_EXTRA_UPPER_RIGHT_TRIANGLE "\ue0be" +# define POWERLINE_EXTRA_BACKSLASH_SEPARATOR_REDUNDANT "\ue0bf" +# define POWERLINE_EXTRA_FLAME_THICK "\ue0c0" +# define POWERLINE_EXTRA_FLAME_THIN "\ue0c1" +# define POWERLINE_EXTRA_FLAME_THICK_MIRRORED "\ue0c2" +# define POWERLINE_EXTRA_FLAME_THIN_MIRRORED "\ue0c3" +# define POWERLINE_EXTRA_PIXELATED_SQUARES_SMALL "\ue0c4" +# define POWERLINE_EXTRA_PIXELATED_SQUARES_SMALL_MIRRORED "\ue0c5" +# define POWERLINE_EXTRA_PIXELATED_SQUARES_BIG "\ue0c6" +# define POWERLINE_EXTRA_PIXELATED_SQUARES_BIG_MIRRORED "\ue0c7" +# define POWERLINE_EXTRA_ICE_WAVEFORM "\ue0c8" +# define POWERLINE_EXTRA_ICE_WAVEFORM_MIRRORED "\ue0ca" +# define POWERLINE_EXTRA_HONEYCOMB "\ue0cc" +# define POWERLINE_EXTRA_HONEYCOMB_OUTLINE "\ue0cd" +# define POWERLINE_EXTRA_LEGO_SEPARATOR "\ue0ce" +# define POWERLINE_EXTRA_LEGO_SEPARATOR_THIN "\ue0cf" +# define POWERLINE_EXTRA_LEGO_BLOCK_FACING "\ue0d0" +# define POWERLINE_EXTRA_LEGO_BLOCK_SIDEWAYS "\ue0d1" +# define POWERLINE_EXTRA_TRAPEZOID_TOP_BOTTOM "\ue0d2" +# define POWERLINE_EXTRA_TRAPEZOID_TOP_BOTTOM_MIRRORED "\ue0d4" +# define OCT_HEART "\ue000" +# define OCT_ZAP "\ue001" +# define OCT_LIGHT_BULB "\ue002" +# define OCT_REPO "\ue003" +# define OCT_REPO_FORKED "\ue004" +# define OCT_REPO_PUSH "\ue005" +# define OCT_REPO_PULL "\ue006" +# define OCT_BOOK "\ue007" +# define OCT_OCTOFACE "\ue008" +# define OCT_GIT_PULL_REQUEST "\ue009" +# define OCT_MARK_GITHUB "\ue00a" +# define OCT_CLOUD_DOWNLOAD "\ue00b" +# define OCT_CLOUD_UPLOAD "\ue00c" +# define OCT_KEYBOARD "\ue00d" +# define OCT_GIST "\ue00e" +# define OCT_FILE_CODE "\ue00f" +# define OCT_FILE_TEXT "\ue010" +# define OCT_FILE_MEDIA "\ue011" +# define OCT_FILE_ZIP "\ue012" +# define OCT_FILE_PDF "\ue013" +# define OCT_TAG "\ue014" +# define OCT_FILE_DIRECTORY "\ue015" +# define OCT_FILE_SUBMODULE "\ue016" +# define OCT_PERSON "\ue017" +# define OCT_JERSEY "\ue018" +# define OCT_GIT_COMMIT "\ue019" +# define OCT_GIT_BRANCH "\ue01a" +# define OCT_GIT_MERGE "\ue01b" +# define OCT_MIRROR "\ue01c" +# define OCT_ISSUE_OPENED "\ue01d" +# define OCT_ISSUE_REOPENED "\ue01e" +# define OCT_ISSUE_CLOSED "\ue01f" +# define OCT_STAR "\ue020" +# define OCT_COMMENT "\ue021" +# define OCT_QUESTION "\ue022" +# define OCT_ALERT "\ue023" +# define OCT_SEARCH "\ue024" +# define OCT_GEAR "\ue025" +# define OCT_RADIO_TOWER "\ue026" +# define OCT_TOOLS "\ue027" +# define OCT_SIGN_OUT "\ue028" +# define OCT_ROCKET "\ue029" +# define OCT_RSS "\ue02a" +# define OCT_CLIPPY "\ue02b" +# define OCT_SIGN_IN "\ue02c" +# define OCT_ORGANIZATION "\ue02d" +# define OCT_DEVICE_MOBILE "\ue02e" +# define OCT_UNFOLD "\ue02f" +# define OCT_CHECK "\ue030" +# define OCT_MAIL "\ue031" +# define OCT_MAIL_READ "\ue032" +# define OCT_ARROW_UP "\ue033" +# define OCT_ARROW_RIGHT "\ue034" +# define OCT_ARROW_DOWN "\ue035" +# define OCT_ARROW_LEFT "\ue036" +# define OCT_PIN "\ue037" +# define OCT_GIFT "\ue038" +# define OCT_GRAPH "\ue039" +# define OCT_TRIANGLE_LEFT "\ue03a" +# define OCT_CREDIT_CARD "\ue03b" +# define OCT_CLOCK "\ue03c" +# define OCT_RUBY "\ue03d" +# define OCT_BROADCAST "\ue03e" +# define OCT_KEY "\ue03f" +# define OCT_REPO_FORCE_PUSH "\ue040" +# define OCT_REPO_CLONE "\ue041" +# define OCT_DIFF "\ue042" +# define OCT_EYE "\ue043" +# define OCT_COMMENT_DISCUSSION "\ue044" +# define OCT_MAIL_REPLY "\ue045" +# define OCT_PRIMITIVE_DOT "\ue046" +# define OCT_PRIMITIVE_SQUARE "\ue047" +# define OCT_DEVICE_CAMERA "\ue048" +# define OCT_DEVICE_CAMERA_VIDEO "\ue049" +# define OCT_PENCIL "\ue04a" +# define OCT_INFO "\ue04b" +# define OCT_TRIANGLE_RIGHT "\ue04c" +# define OCT_TRIANGLE_DOWN "\ue04d" +# define OCT_LINK "\ue04e" +# define OCT_PLUS "\ue04f" +# define OCT_THREE_BARS "\ue050" +# define OCT_CODE "\ue051" +# define OCT_LOCATION "\ue052" +# define OCT_LIST_UNORDERED "\ue053" +# define OCT_LIST_ORDERED "\ue054" +# define OCT_QUOTE "\ue055" +# define OCT_VERSIONS "\ue056" +# define OCT_CALENDAR "\ue057" +# define OCT_LOCK "\ue058" +# define OCT_DIFF_ADDED "\ue059" +# define OCT_DIFF_REMOVED "\ue05a" +# define OCT_DIFF_MODIFIED "\ue05b" +# define OCT_DIFF_RENAMED "\ue05c" +# define OCT_HORIZONTAL_RULE "\ue05d" +# define OCT_ARROW_SMALL_RIGHT "\ue05e" +# define OCT_MILESTONE "\ue05f" +# define OCT_CHECKLIST "\ue060" +# define OCT_MEGAPHONE "\ue061" +# define OCT_CHEVRON_RIGHT "\ue062" +# define OCT_BOOKMARK "\ue063" +# define OCT_SETTINGS "\ue064" +# define OCT_DASHBOARD "\ue065" +# define OCT_HISTORY "\ue066" +# define OCT_LINK_EXTERNAL "\ue067" +# define OCT_MUTE "\ue068" +# define OCT_X "\ue069" +# define OCT_CIRCLE_SLASH "\ue06a" +# define OCT_PULSE "\ue06b" +# define OCT_SYNC "\ue06c" +# define OCT_TELESCOPE "\ue06d" +# define OCT_GIST_SECRET "\ue06e" +# define OCT_HOME "\ue06f" +# define OCT_STOP "\ue070" +# define OCT_BUG "\ue071" +# define OCT_LOGO_GITHUB "\ue072" +# define OCT_FILE_BINARY "\ue073" +# define OCT_DATABASE "\ue074" +# define OCT_SERVER "\ue075" +# define OCT_DIFF_IGNORED "\ue076" +# define OCT_ELLIPSIS "\ue077" +# define OCT_NO_NEWLINE "\ue078" +# define OCT_HUBOT "\ue079" +# define OCT_ARROW_SMALL_UP "\ue07a" +# define OCT_ARROW_SMALL_DOWN "\ue07b" +# define OCT_ARROW_SMALL_LEFT "\ue07c" +# define OCT_CHEVRON_UP "\ue07d" +# define OCT_CHEVRON_DOWN "\ue07e" +# define OCT_CHEVRON_LEFT "\ue07f" +# define OCT_TRIANGLE_UP "\ue080" +# define OCT_GIT_COMPARE "\ue081" +# define OCT_LOGO_GIST "\ue082" +# define OCT_FILE_SYMLINK_FILE "\ue083" +# define OCT_FILE_SYMLINK_DIRECTORY "\ue084" +# define OCT_SQUIRREL "\ue085" +# define OCT_GLOBE "\ue086" +# define OCT_UNMUTE "\ue087" +# define OCT_MENTION "\ue088" +# define OCT_PACKAGE "\ue089" +# define OCT_BROWSER "\ue08a" +# define OCT_TERMINAL "\ue08b" +# define OCT_MARKDOWN "\ue08c" +# define OCT_DASH "\ue08d" +# define OCT_FOLD "\ue08e" +# define OCT_INBOX "\ue08f" +# define OCT_TRASHCAN "\ue090" +# define OCT_PAINTCAN "\ue091" +# define OCT_FLAME "\ue092" +# define OCT_BRIEFCASE "\ue093" +# define OCT_PLUG "\ue094" +# define OCT_CIRCUIT_BOARD "\ue095" +# define OCT_MORTAR_BOARD "\ue096" +# define OCT_LAW "\ue097" +# define OCT_THUMBSUP "\ue098" +# define OCT_THUMBSDOWN "\ue099" +# define OCT_DESKTOP_DOWNLOAD "\ue09a" +# define OCT_BEAKER "\ue09b" +# define OCT_BELL "\ue09c" +# define OCT_WATCH "\ue09d" +# define OCT_SHIELD "\ue09e" +# define OCT_BOLD "\ue09f" +# define OCT_TEXT_SIZE "\ue0d5" +# define OCT_ITALIC "\ue0d6" +# define OCT_TASKLIST "\ue0d7" +# define OCT_VERIFIED "\ue0d8" +# define OCT_SMILEY "\ue0d9" +# define OCT_UNVERIFIED "\ue0da" +# define OCT_ELLIPSES "\ue0db" +# define OCT_FILE "\ue0dc" +# define OCT_GRABBER "\ue0dd" +# define OCT_PLUS_SMALL "\ue0de" +# define OCT_REPLY "\ue0df" +# define OCT_DEVICE_DESKTOP "\ue0e0" +# define FA_GLASS "\ue0e1" +# define FA_MUSIC "\ue0e2" +# define FA_SEARCH "\ue0e3" +# define FA_ENVELOPE_O "\ue0e4" +# define FA_HEART "\ue0e5" +# define FA_STAR "\ue0e6" +# define FA_STAR_O "\ue0e7" +# define FA_USER "\ue0e8" +# define FA_FILM "\ue0e9" +# define FA_TH_LARGE "\ue0ea" +# define FA_TH "\ue0eb" +# define FA_TH_LIST "\ue0ec" +# define FA_CHECK "\ue0ed" +# define FA_CLOSE "\ue0ee" +# define FA_SEARCH_PLUS "\ue0ef" +# define FA_SEARCH_MINUS "\ue0f0" +# define FA_POWER_OFF "\ue0f1" +# define FA_SIGNAL "\ue0f2" +# define FA_COG "\ue0f3" +# define FA_TRASH_O "\ue0f4" +# define FA_HOME "\ue0f5" +# define FA_FILE_O "\ue0f6" +# define FA_CLOCK_O "\ue0f7" +# define FA_ROAD "\ue0f8" +# define FA_DOWNLOAD "\ue0f9" +# define FA_ARROW_CIRCLE_O_DOWN "\ue0fa" +# define FA_ARROW_CIRCLE_O_UP "\ue0fb" +# define FA_INBOX "\ue0fc" +# define FA_PLAY_CIRCLE_O "\ue0fd" +# define FA_REPEAT "\ue0fe" +# define FA_REFRESH "\ue0ff" +# define FA_LIST_ALT "\ue100" +# define FA_LOCK "\ue101" +# define FA_FLAG "\ue102" +# define FA_HEADPHONES "\ue103" +# define FA_VOLUME_OFF "\ue104" +# define FA_VOLUME_DOWN "\ue105" +# define FA_VOLUME_UP "\ue106" +# define FA_QRCODE "\ue107" +# define FA_BARCODE "\ue108" +# define FA_TAG "\ue109" +# define FA_TAGS "\ue10a" +# define FA_BOOK "\ue10b" +# define FA_BOOKMARK "\ue10c" +# define FA_PRINT "\ue10d" +# define FA_CAMERA "\ue10e" +# define FA_FONT "\ue10f" +# define FA_BOLD "\ue110" +# define FA_ITALIC "\ue111" +# define FA_TEXT_HEIGHT "\ue112" +# define FA_TEXT_WIDTH "\ue113" +# define FA_ALIGN_LEFT "\ue114" +# define FA_ALIGN_CENTER "\ue115" +# define FA_ALIGN_RIGHT "\ue116" +# define FA_ALIGN_JUSTIFY "\ue117" +# define FA_LIST "\ue118" +# define FA_DEDENT "\ue119" +# define FA_INDENT "\ue11a" +# define FA_VIDEO_CAMERA "\ue11b" +# define FA_IMAGE "\ue11c" +# define FA_PENCIL "\ue11d" +# define FA_MAP_MARKER "\ue11e" +# define FA_ADJUST "\ue11f" +# define FA_TINT "\ue120" +# define FA_EDIT "\ue121" +# define FA_SHARE_SQUARE_O "\ue122" +# define FA_CHECK_SQUARE_O "\ue123" +# define FA_ARROWS "\ue124" +# define FA_STEP_BACKWARD "\ue125" +# define FA_FAST_BACKWARD "\ue126" +# define FA_BACKWARD "\ue127" +# define FA_PLAY "\ue128" +# define FA_PAUSE "\ue129" +# define FA_STOP "\ue12a" +# define FA_FORWARD "\ue12b" +# define FA_FAST_FORWARD "\ue12c" +# define FA_STEP_FORWARD "\ue12d" +# define FA_EJECT "\ue12e" +# define FA_CHEVRON_LEFT "\ue12f" +# define FA_CHEVRON_RIGHT "\ue130" +# define FA_PLUS_CIRCLE "\ue131" +# define FA_MINUS_CIRCLE "\ue132" +# define FA_TIMES_CIRCLE "\ue133" +# define FA_CHECK_CIRCLE "\ue134" +# define FA_QUESTION_CIRCLE "\ue135" +# define FA_INFO_CIRCLE "\ue136" +# define FA_CROSSHAIRS "\ue137" +# define FA_TIMES_CIRCLE_O "\ue138" +# define FA_CHECK_CIRCLE_O "\ue139" +# define FA_BAN "\ue13a" +# define FA_ARROW_LEFT "\ue13b" +# define FA_ARROW_RIGHT "\ue13c" +# define FA_ARROW_UP "\ue13d" +# define FA_ARROW_DOWN "\ue13e" +# define FA_MAIL_FORWARD "\ue13f" +# define FA_EXPAND "\ue140" +# define FA_COMPRESS "\ue141" +# define FA_PLUS "\ue142" +# define FA_MINUS "\ue143" +# define FA_ASTERISK "\ue144" +# define FA_EXCLAMATION_CIRCLE "\ue145" +# define FA_GIFT "\ue146" +# define FA_LEAF "\ue147" +# define FA_FIRE "\ue148" +# define FA_EYE "\ue149" +# define FA_EYE_SLASH "\ue14a" +# define FA_EXCLAMATION_TRIANGLE "\ue14b" +# define FA_PLANE "\ue14c" +# define FA_CALENDAR "\ue14d" +# define FA_RANDOM "\ue14e" +# define FA_COMMENT "\ue14f" +# define FA_MAGNET "\ue150" +# define FA_CHEVRON_UP "\ue151" +# define FA_CHEVRON_DOWN "\ue152" +# define FA_RETWEET "\ue153" +# define FA_SHOPPING_CART "\ue154" +# define FA_FOLDER "\ue155" +# define FA_FOLDER_OPEN "\ue156" +# define FA_ARROWS_V "\ue157" +# define FA_ARROWS_H "\ue158" +# define FA_BAR_CHART "\ue159" +# define FA_TWITTER_SQUARE "\ue15a" +# define FA_FACEBOOK_SQUARE "\ue15b" +# define FA_CAMERA_RETRO "\ue15c" +# define FA_KEY "\ue15d" +# define FA_COGS "\ue15e" +# define FA_COMMENTS "\ue15f" +# define FA_THUMBS_O_UP "\ue160" +# define FA_THUMBS_O_DOWN "\ue161" +# define FA_STAR_HALF "\ue162" +# define FA_HEART_O "\ue163" +# define FA_SIGN_OUT "\ue164" +# define FA_LINKEDIN_SQUARE "\ue165" +# define FA_THUMB_TACK "\ue166" +# define FA_EXTERNAL_LINK "\ue167" +# define FA_SIGN_IN "\ue168" +# define FA_TROPHY "\ue169" +# define FA_GITHUB_SQUARE "\ue16a" +# define FA_UPLOAD "\ue16b" +# define FA_LEMON_O "\ue16c" +# define FA_PHONE "\ue16d" +# define FA_SQUARE_O "\ue16e" +# define FA_BOOKMARK_O "\ue16f" +# define FA_PHONE_SQUARE "\ue170" +# define FA_TWITTER "\ue171" +# define FA_FACEBOOK "\ue172" +# define FA_GITHUB "\ue173" +# define FA_UNLOCK "\ue174" +# define FA_CREDIT_CARD "\ue175" +# define FA_FEED "\ue176" +# define FA_HDD_O "\ue177" +# define FA_BULLHORN "\ue178" +# define FA_BELL_O "\ue179" +# define FA_CERTIFICATE "\ue17a" +# define FA_HAND_O_RIGHT "\ue17b" +# define FA_HAND_O_LEFT "\ue17c" +# define FA_HAND_O_UP "\ue17d" +# define FA_HAND_O_DOWN "\ue17e" +# define FA_ARROW_CIRCLE_LEFT "\ue17f" +# define FA_ARROW_CIRCLE_RIGHT "\ue180" +# define FA_ARROW_CIRCLE_UP "\ue181" +# define FA_ARROW_CIRCLE_DOWN "\ue182" +# define FA_GLOBE "\ue183" +# define FA_WRENCH "\ue184" +# define FA_TASKS "\ue185" +# define FA_FILTER "\ue186" +# define FA_BRIEFCASE "\ue187" +# define FA_ARROWS_ALT "\ue188" +# define FA_GROUP "\ue189" +# define FA_CHAIN "\ue18a" +# define FA_CLOUD "\ue18b" +# define FA_FLASK "\ue18c" +# define FA_CUT "\ue18d" +# define FA_COPY "\ue18e" +# define FA_PAPERCLIP "\ue18f" +# define FA_FLOPPY_O "\ue190" +# define FA_SQUARE "\ue191" +# define FA_BARS "\ue192" +# define FA_LIST_UL "\ue193" +# define FA_LIST_OL "\ue194" +# define FA_STRIKETHROUGH "\ue195" +# define FA_UNDERLINE "\ue196" +# define FA_TABLE "\ue197" +# define FA_MAGIC "\ue198" +# define FA_TRUCK "\ue199" +# define FA_PINTEREST "\ue19a" +# define FA_PINTEREST_SQUARE "\ue19b" +# define FA_GOOGLE_PLUS_SQUARE "\ue19c" +# define FA_GOOGLE_PLUS "\ue19d" +# define FA_MONEY "\ue19e" +# define FA_CARET_DOWN "\ue19f" +# define FA_CARET_UP "\ue1a0" +# define FA_CARET_LEFT "\ue1a1" +# define FA_CARET_RIGHT "\ue1a2" +# define FA_COLUMNS "\ue1a3" +# define FA_SORT "\ue1a4" +# define FA_SORT_DESC "\ue1a5" +# define FA_SORT_ASC "\ue1a6" +# define FA_ENVELOPE "\ue1a7" +# define FA_LINKEDIN "\ue1a8" +# define FA_ROTATE_LEFT "\ue1a9" +# define FA_GAVEL "\ue1aa" +# define FA_DASHBOARD "\ue1ab" +# define FA_COMMENT_O "\ue1ac" +# define FA_COMMENTS_O "\ue1ad" +# define FA_BOLT "\ue1ae" +# define FA_SITEMAP "\ue1af" +# define FA_UMBRELLA "\ue1b0" +# define FA_CLIPBOARD "\ue1b1" +# define FA_LIGHTBULB_O "\ue1b2" +# define FA_EXCHANGE "\ue1b3" +# define FA_CLOUD_DOWNLOAD "\ue1b4" +# define FA_CLOUD_UPLOAD "\ue1b5" +# define FA_USER_MD "\ue1b6" +# define FA_STETHOSCOPE "\ue1b7" +# define FA_SUITCASE "\ue1b8" +# define FA_BELL "\ue1b9" +# define FA_COFFEE "\ue1ba" +# define FA_CUTLERY "\ue1bb" +# define FA_FILE_TEXT_O "\ue1bc" +# define FA_BUILDING_O "\ue1bd" +# define FA_HOSPITAL_O "\ue1be" +# define FA_AMBULANCE "\ue1bf" +# define FA_MEDKIT "\ue1c0" +# define FA_FIGHTER_JET "\ue1c1" +# define FA_BEER "\ue1c2" +# define FA_H_SQUARE "\ue1c3" +# define FA_PLUS_SQUARE "\ue1c4" +# define FA_ANGLE_DOUBLE_LEFT "\ue1c5" +# define FA_ANGLE_DOUBLE_RIGHT "\ue1c6" +# define FA_ANGLE_DOUBLE_UP "\ue1c7" +# define FA_ANGLE_DOUBLE_DOWN "\ue1c8" +# define FA_ANGLE_LEFT "\ue1c9" +# define FA_ANGLE_RIGHT "\ue1ca" +# define FA_ANGLE_UP "\ue1cb" +# define FA_ANGLE_DOWN "\ue1cc" +# define FA_DESKTOP "\ue1cd" +# define FA_LAPTOP "\ue1ce" +# define FA_TABLET "\ue1cf" +# define FA_MOBILE "\ue1d0" +# define FA_CIRCLE_O "\ue1d1" +# define FA_QUOTE_LEFT "\ue1d2" +# define FA_QUOTE_RIGHT "\ue1d3" +# define FA_SPINNER "\ue1d4" +# define FA_CIRCLE "\ue1d5" +# define FA_MAIL_REPLY "\ue1d6" +# define FA_GITHUB_ALT "\ue1d7" +# define FA_FOLDER_O "\ue1d8" +# define FA_FOLDER_OPEN_O "\ue1d9" +# define FA_EXPAND_ALT "\ue1da" +# define FA_COLLAPSE_ALT "\ue1db" +# define FA_SMILE_O "\ue1dc" +# define FA_FROWN_O "\ue1dd" +# define FA_MEH_O "\ue1de" +# define FA_GAMEPAD "\ue1df" +# define FA_KEYBOARD_O "\ue1e0" +# define FA_FLAG_O "\ue1e1" +# define FA_FLAG_CHECKERED "\ue1e2" +# define FA_TERMINAL "\ue1e3" +# define FA_CODE "\ue1e4" +# define FA_MAIL_REPLY_ALL "\ue1e5" +# define FA_STAR_HALF_EMPTY "\ue1e6" +# define FA_LOCATION_ARROW "\ue1e7" +# define FA_CROP "\ue1e8" +# define FA_CODE_FORK "\ue1e9" +# define FA_CHAIN_BROKEN "\ue1ea" +# define FA_QUESTION "\ue1eb" +# define FA_INFO "\ue1ec" +# define FA_EXCLAMATION "\ue1ed" +# define FA_SUPERSCRIPT "\ue1ee" +# define FA_SUBSCRIPT "\ue1ef" +# define FA_ERASER "\ue1f0" +# define FA_PUZZLE_PIECE "\ue1f1" +# define FA_MICROPHONE "\ue1f2" +# define FA_MICROPHONE_SLASH "\ue1f3" +# define FA_SHIELD "\ue1f4" +# define FA_CALENDAR_O "\ue1f5" +# define FA_FIRE_EXTINGUISHER "\ue1f6" +# define FA_ROCKET "\ue1f7" +# define FA_MAXCDN "\ue1f8" +# define FA_CHEVRON_CIRCLE_LEFT "\ue1f9" +# define FA_CHEVRON_CIRCLE_RIGHT "\ue1fa" +# define FA_CHEVRON_CIRCLE_UP "\ue1fb" +# define FA_CHEVRON_CIRCLE_DOWN "\ue1fc" +# define FA_HTML5 "\ue1fd" +# define FA_CSS3 "\ue1fe" +# define FA_ANCHOR "\ue1ff" +# define FA_UNLOCK_ALT "\ue200" +# define FA_BULLSEYE "\ue201" +# define FA_ELLIPSIS_H "\ue202" +# define FA_ELLIPSIS_V "\ue203" +# define FA_RSS_SQUARE "\ue204" +# define FA_PLAY_CIRCLE "\ue205" +# define FA_TICKET "\ue206" +# define FA_MINUS_SQUARE "\ue207" +# define FA_MINUS_SQUARE_O "\ue208" +# define FA_LEVEL_UP "\ue209" +# define FA_LEVEL_DOWN "\ue20a" +# define FA_CHECK_SQUARE "\ue20b" +# define FA_PENCIL_SQUARE "\ue20c" +# define FA_EXTERNAL_LINK_SQUARE "\ue20d" +# define FA_SHARE_SQUARE "\ue20e" +# define FA_COMPASS "\ue20f" +# define FA_CARET_SQUARE_O_DOWN "\ue210" +# define FA_CARET_SQUARE_O_UP "\ue211" +# define FA_CARET_SQUARE_O_RIGHT "\ue212" +# define FA_EUR "\ue213" +# define FA_GBP "\ue214" +# define FA_DOLLAR "\ue215" +# define FA_INR "\ue216" +# define FA_CNY "\ue217" +# define FA_ROUBLE "\ue218" +# define FA_KRW "\ue219" +# define FA_BITCOIN "\ue21a" +# define FA_FILE "\ue21b" +# define FA_FILE_TEXT "\ue21c" +# define FA_SORT_ALPHA_ASC "\ue21d" +# define FA_SORT_ALPHA_DESC "\ue21e" +# define FA_SORT_AMOUNT_ASC "\ue21f" +# define FA_SORT_AMOUNT_DESC "\ue220" +# define FA_SORT_NUMERIC_ASC "\ue221" +# define FA_SORT_NUMERIC_DESC "\ue222" +# define FA_THUMBS_UP "\ue223" +# define FA_THUMBS_DOWN "\ue224" +# define FA_YOUTUBE_SQUARE "\ue225" +# define FA_YOUTUBE "\ue226" +# define FA_XING "\ue227" +# define FA_XING_SQUARE "\ue228" +# define FA_YOUTUBE_PLAY "\ue229" +# define FA_DROPBOX "\ue22a" +# define FA_STACK_OVERFLOW "\ue22b" +# define FA_INSTAGRAM "\ue22c" +# define FA_FLICKR "\ue22d" +# define FA_ADN "\ue22e" +# define FA_BITBUCKET "\ue22f" +# define FA_BITBUCKET_SQUARE "\ue230" +# define FA_TUMBLR "\ue231" +# define FA_TUMBLR_SQUARE "\ue232" +# define FA_LONG_ARROW_DOWN "\ue233" +# define FA_LONG_ARROW_UP "\ue234" +# define FA_LONG_ARROW_LEFT "\ue235" +# define FA_LONG_ARROW_RIGHT "\ue236" +# define FA_APPLE "\ue237" +# define FA_WINDOWS "\ue238" +# define FA_ANDROID "\ue239" +# define FA_LINUX "\ue23a" +# define FA_DRIBBBLE "\ue23b" +# define FA_SKYPE "\ue23c" +# define FA_FOURSQUARE "\ue23d" +# define FA_TRELLO "\ue23e" +# define FA_FEMALE "\ue23f" +# define FA_MALE "\ue240" +# define FA_GITTIP "\ue241" +# define FA_SUN_O "\ue242" +# define FA_MOON_O "\ue243" +# define FA_ARCHIVE "\ue244" +# define FA_BUG "\ue245" +# define FA_VK "\ue246" +# define FA_WEIBO "\ue247" +# define FA_RENREN "\ue248" +# define FA_PAGELINES "\ue249" +# define FA_STACK_EXCHANGE "\ue24a" +# define FA_ARROW_CIRCLE_O_RIGHT "\ue24b" +# define FA_ARROW_CIRCLE_O_LEFT "\ue24c" +# define FA_CARET_SQUARE_O_LEFT "\ue24d" +# define FA_DOT_CIRCLE_O "\ue24e" +# define FA_WHEELCHAIR "\ue24f" +# define FA_VIMEO_SQUARE "\ue250" +# define FA_TRY "\ue251" +# define FA_PLUS_SQUARE_O "\ue252" +# define FA_SPACE_SHUTTLE "\ue253" +# define FA_SLACK "\ue254" +# define FA_ENVELOPE_SQUARE "\ue255" +# define FA_WORDPRESS "\ue256" +# define FA_OPENID "\ue257" +# define FA_BANK "\ue258" +# define FA_GRADUATION_CAP "\ue259" +# define FA_YAHOO "\ue25a" +# define FA_GOOGLE "\ue25b" +# define FA_REDDIT "\ue25c" +# define FA_REDDIT_SQUARE "\ue25d" +# define FA_STUMBLEUPON_CIRCLE "\ue25e" +# define FA_STUMBLEUPON "\ue25f" +# define FA_DELICIOUS "\ue260" +# define FA_DIGG "\ue261" +# define FA_PIED_PIPER_PP "\ue262" +# define FA_PIED_PIPER_ALT "\ue263" +# define FA_DRUPAL "\ue264" +# define FA_JOOMLA "\ue265" +# define FA_LANGUAGE "\ue266" +# define FA_FAX "\ue267" +# define FA_BUILDING "\ue268" +# define FA_CHILD "\ue269" +# define FA_PAW "\ue26a" +# define FA_SPOON "\ue26b" +# define FA_CUBE "\ue26c" +# define FA_CUBES "\ue26d" +# define FA_BEHANCE "\ue26e" +# define FA_BEHANCE_SQUARE "\ue26f" +# define FA_STEAM "\ue270" +# define FA_STEAM_SQUARE "\ue271" +# define FA_RECYCLE "\ue272" +# define FA_AUTOMOBILE "\ue273" +# define FA_CAB "\ue274" +# define FA_TREE "\ue275" +# define FA_SPOTIFY "\ue276" +# define FA_DEVIANTART "\ue277" +# define FA_SOUNDCLOUD "\ue278" +# define FA_DATABASE "\ue279" +# define FA_FILE_PDF_O "\ue27a" +# define FA_FILE_WORD_O "\ue27b" +# define FA_FILE_EXCEL_O "\ue27c" +# define FA_FILE_POWERPOINT_O "\ue27d" +# define FA_FILE_IMAGE_O "\ue27e" +# define FA_FILE_ARCHIVE_O "\ue27f" +# define FA_FILE_AUDIO_O "\ue280" +# define FA_FILE_MOVIE_O "\ue281" +# define FA_FILE_CODE_O "\ue282" +# define FA_VINE "\ue283" +# define FA_CODEPEN "\ue284" +# define FA_JSFIDDLE "\ue285" +# define FA_LIFE_BOUY "\ue286" +# define FA_CIRCLE_O_NOTCH "\ue287" +# define FA_RA "\ue288" +# define FA_EMPIRE "\ue289" +# define FA_GIT_SQUARE "\ue28a" +# define FA_GIT "\ue28b" +# define FA_HACKER_NEWS "\ue28c" +# define FA_TENCENT_WEIBO "\ue28d" +# define FA_QQ "\ue28e" +# define FA_WECHAT "\ue28f" +# define FA_PAPER_PLANE "\ue290" +# define FA_PAPER_PLANE_O "\ue291" +# define FA_HISTORY "\ue292" +# define FA_CIRCLE_THIN "\ue293" +# define FA_HEADER "\ue294" +# define FA_PARAGRAPH "\ue295" +# define FA_SLIDERS "\ue296" +# define FA_SHARE_ALT "\ue297" +# define FA_SHARE_ALT_SQUARE "\ue298" +# define FA_BOMB "\ue299" +# define FA_FUTBOL_O "\ue29a" +# define FA_TTY "\ue29b" +# define FA_BINOCULARS "\ue29c" +# define FA_PLUG "\ue29d" +# define FA_SLIDESHARE "\ue29e" +# define FA_TWITCH "\ue29f" +# define FA_YELP "\ue2a0" +# define FA_NEWSPAPER_O "\ue2a1" +# define FA_WIFI "\ue2a2" +# define FA_CALCULATOR "\ue2a3" +# define FA_PAYPAL "\ue2a4" +# define FA_GOOGLE_WALLET "\ue2a5" +# define FA_CC_VISA "\ue2a6" +# define FA_CC_MASTERCARD "\ue2a7" +# define FA_CC_DISCOVER "\ue2a8" +# define FA_CC_AMEX "\ue2a9" +# define FA_CC_PAYPAL "\ue2aa" +# define FA_CC_STRIPE "\ue2ab" +# define FA_BELL_SLASH "\ue2ac" +# define FA_BELL_SLASH_O "\ue2ad" +# define FA_TRASH "\ue2ae" +# define FA_COPYRIGHT "\ue2af" +# define FA_AT "\ue2b0" +# define FA_EYEDROPPER "\ue2b1" +# define FA_PAINT_BRUSH "\ue2b2" +# define FA_BIRTHDAY_CAKE "\ue2b3" +# define FA_AREA_CHART "\ue2b4" +# define FA_PIE_CHART "\ue2b5" +# define FA_LINE_CHART "\ue2b6" +# define FA_LASTFM "\ue2b7" +# define FA_LASTFM_SQUARE "\ue2b8" +# define FA_TOGGLE_OFF "\ue2b9" +# define FA_TOGGLE_ON "\ue2ba" +# define FA_BICYCLE "\ue2bb" +# define FA_BUS "\ue2bc" +# define FA_IOXHOST "\ue2bd" +# define FA_ANGELLIST "\ue2be" +# define FA_CC "\ue2bf" +# define FA_ILS "\ue2c0" +# define FA_MEANPATH "\ue2c1" +# define FA_BUYSELLADS "\ue2c2" +# define FA_CONNECTDEVELOP "\ue2c3" +# define FA_DASHCUBE "\ue2c4" +# define FA_FORUMBEE "\ue2c5" +# define FA_LEANPUB "\ue2c6" +# define FA_SELLSY "\ue2c7" +# define FA_SHIRTSINBULK "\ue2c8" +# define FA_SIMPLYBUILT "\ue2c9" +# define FA_SKYATLAS "\ue2ca" +# define FA_CART_PLUS "\ue2cb" +# define FA_CART_ARROW_DOWN "\ue2cc" +# define FA_DIAMOND "\ue2cd" +# define FA_SHIP "\ue2ce" +# define FA_USER_SECRET "\ue2cf" +# define FA_MOTORCYCLE "\ue2d0" +# define FA_STREET_VIEW "\ue2d1" +# define FA_HEARTBEAT "\ue2d2" +# define FA_VENUS "\ue2d3" +# define FA_MARS "\ue2d4" +# define FA_MERCURY "\ue2d5" +# define FA_INTERSEX "\ue2d6" +# define FA_TRANSGENDER_ALT "\ue2d7" +# define FA_VENUS_DOUBLE "\ue2d8" +# define FA_MARS_DOUBLE "\ue2d9" +# define FA_VENUS_MARS "\ue2da" +# define FA_MARS_STROKE "\ue2db" +# define FA_MARS_STROKE_V "\ue2dc" +# define FA_MARS_STROKE_H "\ue2dd" +# define FA_NEUTER "\ue2de" +# define FA_GENDERLESS "\ue2df" +# define FA__523 "\ue2e0" +# define FA__524 "\ue2e1" +# define FA_FACEBOOK_OFFICIAL "\ue2e2" +# define FA_PINTEREST_P "\ue2e3" +# define FA_WHATSAPP "\ue2e4" +# define FA_SERVER "\ue2e5" +# define FA_USER_PLUS "\ue2e6" +# define FA_USER_TIMES "\ue2e7" +# define FA_BED "\ue2e8" +# define FA_VIACOIN "\ue2e9" +# define FA_TRAIN "\ue2ea" +# define FA_SUBWAY "\ue2eb" +# define FA_MEDIUM "\ue2ec" +# define FA_Y_COMBINATOR "\ue2ed" +# define FA_OPTIN_MONSTER "\ue2ee" +# define FA_OPENCART "\ue2ef" +# define FA_EXPEDITEDSSL "\ue2f0" +# define FA_BATTERY "\ue2f1" +# define FA_BATTERY_3 "\ue2f2" +# define FA_BATTERY_2 "\ue2f3" +# define FA_BATTERY_1 "\ue2f4" +# define FA_BATTERY_0 "\ue2f5" +# define FA_MOUSE_POINTER "\ue2f6" +# define FA_I_CURSOR "\ue2f7" +# define FA_OBJECT_GROUP "\ue2f8" +# define FA_OBJECT_UNGROUP "\ue2f9" +# define FA_STICKY_NOTE "\ue2fa" +# define FA_STICKY_NOTE_O "\ue2fb" +# define FA_CC_JCB "\ue2fc" +# define FA_CC_DINERS_CLUB "\ue2fd" +# define FA_CLONE "\ue2fe" +# define FA_BALANCE_SCALE "\ue2ff" +# define FA_HOURGLASS_O "\ue300" +# define FA_HOURGLASS_1 "\ue301" +# define FA_HOURGLASS_2 "\ue302" +# define FA_HOURGLASS_3 "\ue303" +# define FA_HOURGLASS "\ue304" +# define FA_HAND_GRAB_O "\ue305" +# define FA_HAND_PAPER_O "\ue306" +# define FA_HAND_SCISSORS_O "\ue307" +# define FA_HAND_LIZARD_O "\ue308" +# define FA_HAND_SPOCK_O "\ue309" +# define FA_HAND_POINTER_O "\ue30a" +# define FA_HAND_PEACE_O "\ue30b" +# define FA_TRADEMARK "\ue30c" +# define FA_REGISTERED "\ue30d" +# define FA_CREATIVE_COMMONS "\ue30e" +# define FA_GG "\ue30f" +# define FA_GG_CIRCLE "\ue310" +# define FA_TRIPADVISOR "\ue311" +# define FA_ODNOKLASSNIKI "\ue312" +# define FA_ODNOKLASSNIKI_SQUARE "\ue313" +# define FA_GET_POCKET "\ue314" +# define FA_WIKIPEDIA_W "\ue315" +# define FA_SAFARI "\ue316" +# define FA_CHROME "\ue317" +# define FA_FIREFOX "\ue318" +# define FA_OPERA "\ue319" +# define FA_INTERNET_EXPLORER "\ue31a" +# define FA_TELEVISION "\ue31b" +# define FA_CONTAO "\ue31c" +# define FA_500PX "\ue31d" +# define FA_AMAZON "\ue31e" +# define FA_CALENDAR_PLUS_O "\ue31f" +# define FA_CALENDAR_MINUS_O "\ue320" +# define FA_CALENDAR_TIMES_O "\ue321" +# define FA_CALENDAR_CHECK_O "\ue322" +# define FA_INDUSTRY "\ue323" +# define FA_MAP_PIN "\ue324" +# define FA_MAP_SIGNS "\ue325" +# define FA_MAP_O "\ue326" +# define FA_MAP "\ue327" +# define FA_COMMENTING "\ue328" +# define FA_COMMENTING_O "\ue329" +# define FA_HOUZZ "\ue32a" +# define FA_VIMEO "\ue32b" +# define FA_BLACK_TIE "\ue32c" +# define FA_FONTICONS "\ue32d" +# define FA_REDDIT_ALIEN "\ue32e" +# define FA_EDGE "\ue32f" +# define FA_CREDIT_CARD_ALT "\ue330" +# define FA_CODIEPIE "\ue331" +# define FA_MODX "\ue332" +# define FA_FORT_AWESOME "\ue333" +# define FA_USB "\ue334" +# define FA_PRODUCT_HUNT "\ue335" +# define FA_MIXCLOUD "\ue336" +# define FA_SCRIBD "\ue337" +# define FA_PAUSE_CIRCLE "\ue338" +# define FA_PAUSE_CIRCLE_O "\ue339" +# define FA_STOP_CIRCLE "\ue33a" +# define FA_STOP_CIRCLE_O "\ue33b" +# define FA_SHOPPING_BAG "\ue33c" +# define FA_SHOPPING_BASKET "\ue33d" +# define FA_HASHTAG "\ue33e" +# define FA_BLUETOOTH "\ue33f" +# define FA_BLUETOOTH_B "\ue340" +# define FA_PERCENT "\ue341" +# define FA_GITLAB "\ue342" +# define FA_WPBEGINNER "\ue343" +# define FA_WPFORMS "\ue344" +# define FA_ENVIRA "\ue345" +# define FA_UNIVERSAL_ACCESS "\ue346" +# define FA_WHEELCHAIR_ALT "\ue347" +# define FA_QUESTION_CIRCLE_O "\ue348" +# define FA_BLIND "\ue349" +# define FA_AUDIO_DESCRIPTION "\ue34a" +# define FA_VOLUME_CONTROL_PHONE "\ue34b" +# define FA_BRAILLE "\ue34c" +# define FA_ASSISTIVE_LISTENING_SYSTEMS "\ue34d" +# define FA_AMERICAN_SIGN_LANGUAGE_INTERPRETING "\ue34e" +# define FA_DEAF "\ue34f" +# define FA_GLIDE "\ue350" +# define FA_GLIDE_G "\ue351" +# define FA_SIGN_LANGUAGE "\ue352" +# define FA_LOW_VISION "\ue353" +# define FA_VIADEO "\ue354" +# define FA_VIADEO_SQUARE "\ue355" +# define FA_SNAPCHAT "\ue356" +# define FA_SNAPCHAT_GHOST "\ue357" +# define FA_SNAPCHAT_SQUARE "\ue358" +# define FA_PIED_PIPER "\ue359" +# define FA_FIRST_ORDER "\ue35a" +# define FA_YOAST "\ue35b" +# define FA_THEMEISLE "\ue35c" +# define FA_GOOGLE_PLUS_CIRCLE "\ue35d" +# define FA_FA "\ue35e" +# define FA_HANDSHAKE_O "\ue35f" +# define FA_ENVELOPE_OPEN "\ue360" +# define FA_ENVELOPE_OPEN_O "\ue361" +# define FA_LINODE "\ue362" +# define FA_ADDRESS_BOOK "\ue363" +# define FA_ADDRESS_BOOK_O "\ue364" +# define FA_ADDRESS_CARD "\ue365" +# define FA_ADDRESS_CARD_O "\ue366" +# define FA_USER_CIRCLE "\ue367" +# define FA_USER_CIRCLE_O "\ue368" +# define FA_USER_O "\ue369" +# define FA_ID_BADGE "\ue36a" +# define FA_DRIVERS_LICENSE "\ue36b" +# define FA_DRIVERS_LICENSE_O "\ue36c" +# define FA_QUORA "\ue36d" +# define FA_FREE_CODE_CAMP "\ue36e" +# define FA_TELEGRAM "\ue36f" +# define FA_THERMOMETER "\ue370" +# define FA_THERMOMETER_3 "\ue371" +# define FA_THERMOMETER_2 "\ue372" +# define FA_THERMOMETER_1 "\ue373" +# define FA_THERMOMETER_0 "\ue374" +# define FA_SHOWER "\ue375" +# define FA_BATH "\ue376" +# define FA_PODCAST "\ue377" +# define FA_WINDOW_MAXIMIZE "\ue378" +# define FA_WINDOW_MINIMIZE "\ue379" +# define FA_WINDOW_RESTORE "\ue37a" +# define FA_TIMES_RECTANGLE "\ue37b" +# define FA_TIMES_RECTANGLE_O "\ue37c" +# define FA_BANDCAMP "\ue37d" +# define FA_GRAV "\ue37e" +# define FA_ETSY "\ue37f" +# define FA_IMDB "\ue380" +# define FA_RAVELRY "\ue381" +# define FA_EERCAST "\ue382" +# define FA_MICROCHIP "\ue383" +# define FA_SNOWFLAKE_O "\ue384" +# define FA_SUPERPOWERS "\ue385" +# define FA_WPEXPLORER "\ue386" +# define FA_MEETUP "\ue387" +# define MD_ERROR "\ue388" +# define MD_ERROR_OUTLINE "\ue389" +# define MD_WARNING "\ue38a" +# define MD_ADD_ALERT "\ue38b" +# define MD_ALBUM "\ue38c" +# define MD_AV_TIMER "\ue38d" +# define MD_CLOSED_CAPTION "\ue38e" +# define MD_EQUALIZER "\ue38f" +# define MD_EXPLICIT "\ue390" +# define MD_FAST_FORWARD "\ue391" +# define MD_FAST_REWIND "\ue392" +# define MD_GAMES "\ue393" +# define MD_HEARING "\ue394" +# define MD_HIGH_QUALITY "\ue395" +# define MD_LOOP "\ue396" +# define MD_MIC "\ue397" +# define MD_MIC_NONE "\ue398" +# define MD_MIC_OFF "\ue399" +# define MD_MOVIE "\ue39a" +# define MD_LIBRARY_ADD "\ue39b" +# define MD_LIBRARY_BOOKS "\ue39c" +# define MD_LIBRARY_MUSIC "\ue39d" +# define MD_NEW_RELEASES "\ue39e" +# define MD_NOT_INTERESTED "\ue39f" +# define MD_PAUSE "\ue3a0" +# define MD_PAUSE_CIRCLE_FILLED "\ue3a1" +# define MD_PAUSE_CIRCLE_OUTLINE "\ue3a2" +# define MD_PLAY_ARROW "\ue3a3" +# define MD_PLAY_CIRCLE_FILLED "\ue3a4" +# define MD_PLAY_CIRCLE_OUTLINE "\ue3a5" +# define MD_PLAYLIST_ADD "\ue3a6" +# define MD_QUEUE "\ue3a7" +# define MD_QUEUE_MUSIC "\ue3a8" +# define MD_RADIO "\ue3a9" +# define MD_RECENT_ACTORS "\ue3aa" +# define MD_REPEAT "\ue3ab" +# define MD_REPEAT_ONE "\ue3ac" +# define MD_REPLAY "\ue3ad" +# define MD_SHUFFLE "\ue3ae" +# define MD_SKIP_NEXT "\ue3af" +# define MD_SKIP_PREVIOUS "\ue3b0" +# define MD_SNOOZE "\ue3b1" +# define MD_STOP "\ue3b2" +# define MD_SUBTITLES "\ue3b3" +# define MD_SURROUND_SOUND "\ue3b4" +# define MD_VIDEO_LIBRARY "\ue3b5" +# define MD_VIDEOCAM "\ue3b6" +# define MD_VIDEOCAM_OFF "\ue3b7" +# define MD_VOLUME_DOWN "\ue3b8" +# define MD_VOLUME_MUTE "\ue3b9" +# define MD_VOLUME_OFF "\ue3ba" +# define MD_VOLUME_UP "\ue3bb" +# define MD_WEB "\ue3bc" +# define MD_HD "\ue3bd" +# define MD_SORT_BY_ALPHA "\ue3be" +# define MD_AIRPLAY "\ue3bf" +# define MD_FORWARD_10 "\ue3c0" +# define MD_FORWARD_30 "\ue3c1" +# define MD_FORWARD_5 "\ue3c2" +# define MD_REPLAY_10 "\ue3c3" +# define MD_REPLAY_30 "\ue3c4" +# define MD_REPLAY_5 "\ue3c5" +# define MD_ADD_TO_QUEUE "\ue3c6" +# define MD_FIBER_DVR "\ue3c7" +# define MD_FIBER_NEW "\ue3c8" +# define MD_PLAYLIST_PLAY "\ue3c9" +# define MD_ART_TRACK "\ue3ca" +# define MD_FIBER_MANUAL_RECORD "\ue3cb" +# define MD_FIBER_SMART_RECORD "\ue3cc" +# define MD_MUSIC_VIDEO "\ue3cd" +# define MD_SUBSCRIPTIONS "\ue3ce" +# define MD_PLAYLIST_ADD_CHECK "\ue3cf" +# define MD_QUEUE_PLAY_NEXT "\ue3d0" +# define MD_REMOVE_FROM_QUEUE "\ue3d1" +# define MD_SLOW_MOTION_VIDEO "\ue3d2" +# define MD_WEB_ASSET "\ue3d3" +# define MD_FIBER_PIN "\ue3d4" +# define MD_BRANDING_WATERMARK "\ue3d5" +# define MD_CALL_TO_ACTION "\ue3d6" +# define MD_FEATURED_PLAY_LIST "\ue3d7" +# define MD_FEATURED_VIDEO "\ue3d8" +# define MD_NOTE "\ue3d9" +# define MD_VIDEO_CALL "\ue3da" +# define MD_VIDEO_LABEL "\ue3db" +# define MD_BUSINESS "\ue3dc" +# define MD_CALL "\ue3dd" +# define MD_CALL_END "\ue3de" +# define MD_CALL_MADE "\ue3df" +# define MD_CALL_MERGE "\ue3e0" +# define MD_CALL_MISSED "\ue3e1" +# define MD_CALL_RECEIVED "\ue3e2" +# define MD_CALL_SPLIT "\ue3e3" +# define MD_CHAT "\ue3e4" +# define MD_CLEAR_ALL "\ue3e5" +# define MD_COMMENT "\ue3e6" +# define MD_CONTACTS "\ue3e7" +# define MD_DIALER_SIP "\ue3e8" +# define MD_DIALPAD "\ue3e9" +# define MD_EMAIL "\ue3ea" +# define MD_FORUM "\ue3eb" +# define MD_IMPORT_EXPORT "\ue3ec" +# define MD_INVERT_COLORS_OFF "\ue3ed" +# define MD_LIVE_HELP "\ue3ee" +# define MD_LOCATION_OFF "\ue3ef" +# define MD_LOCATION_ON "\ue3f0" +# define MD_MESSAGE "\ue3f1" +# define MD_CHAT_BUBBLE "\ue3f2" +# define MD_CHAT_BUBBLE_OUTLINE "\ue3f3" +# define MD_NO_SIM "\ue3f4" +# define MD_PHONE "\ue3f5" +# define MD_PORTABLE_WIFI_OFF "\ue3f6" +# define MD_CONTACT_PHONE "\ue3f7" +# define MD_CONTACT_MAIL "\ue3f8" +# define MD_RING_VOLUME "\ue3f9" +# define MD_SPEAKER_PHONE "\ue3fa" +# define MD_STAY_CURRENT_LANDSCAPE "\ue3fb" +# define MD_STAY_CURRENT_PORTRAIT "\ue3fc" +# define MD_STAY_PRIMARY_LANDSCAPE "\ue3fd" +# define MD_STAY_PRIMARY_PORTRAIT "\ue3fe" +# define MD_SWAP_CALLS "\ue3ff" +# define MD_TEXTSMS "\ue400" +# define MD_VOICEMAIL "\ue401" +# define MD_VPN_KEY "\ue402" +# define MD_PHONELINK_ERASE "\ue403" +# define MD_PHONELINK_LOCK "\ue404" +# define MD_PHONELINK_RING "\ue405" +# define MD_PHONELINK_SETUP "\ue406" +# define MD_PRESENT_TO_ALL "\ue407" +# define MD_IMPORT_CONTACTS "\ue408" +# define MD_MAIL_OUTLINE "\ue409" +# define MD_SCREEN_SHARE "\ue40a" +# define MD_STOP_SCREEN_SHARE "\ue40b" +# define MD_CALL_MISSED_OUTGOING "\ue40c" +# define MD_RSS_FEED "\ue40d" +# define MD_ADD "\ue40e" +# define MD_ADD_BOX "\ue40f" +# define MD_ADD_CIRCLE "\ue410" +# define MD_ADD_CIRCLE_OUTLINE "\ue411" +# define MD_ARCHIVE "\ue412" +# define MD_BACKSPACE "\ue413" +# define MD_BLOCK "\ue414" +# define MD_CLEAR "\ue415" +# define MD_CONTENT_COPY "\ue416" +# define MD_CONTENT_CUT "\ue417" +# define MD_CONTENT_PASTE "\ue418" +# define MD_CREATE "\ue419" +# define MD_DRAFTS "\ue41a" +# define MD_FILTER_LIST "\ue41b" +# define MD_FLAG "\ue41c" +# define MD_FORWARD "\ue41d" +# define MD_GESTURE "\ue41e" +# define MD_INBOX "\ue41f" +# define MD_LINK "\ue420" +# define MD_MAIL "\ue421" +# define MD_MARKUNREAD "\ue422" +# define MD_REDO "\ue423" +# define MD_REMOVE "\ue424" +# define MD_REMOVE_CIRCLE "\ue425" +# define MD_REMOVE_CIRCLE_OUTLINE "\ue426" +# define MD_REPLY "\ue427" +# define MD_REPLY_ALL "\ue428" +# define MD_REPORT "\ue429" +# define MD_SAVE "\ue42a" +# define MD_SELECT_ALL "\ue42b" +# define MD_SEND "\ue42c" +# define MD_SORT "\ue42d" +# define MD_TEXT_FORMAT "\ue42e" +# define MD_UNDO "\ue42f" +# define MD_FONT_DOWNLOAD "\ue430" +# define MD_MOVE_TO_INBOX "\ue431" +# define MD_UNARCHIVE "\ue432" +# define MD_NEXT_WEEK "\ue433" +# define MD_WEEKEND "\ue434" +# define MD_DELETE_SWEEP "\ue435" +# define MD_LOW_PRIORITY "\ue436" +# define MD_ACCESS_ALARM "\ue437" +# define MD_ACCESS_ALARMS "\ue438" +# define MD_ACCESS_TIME "\ue439" +# define MD_ADD_ALARM "\ue43a" +# define MD_AIRPLANEMODE_INACTIVE "\ue43b" +# define MD_AIRPLANEMODE_ACTIVE "\ue43c" +# define MD_BATTERY_ALERT "\ue43d" +# define MD_BATTERY_CHARGING_FULL "\ue43e" +# define MD_BATTERY_FULL "\ue43f" +# define MD_BATTERY_STD "\ue440" +# define MD_BATTERY_UNKNOWN "\ue441" +# define MD_BLUETOOTH "\ue442" +# define MD_BLUETOOTH_CONNECTED "\ue443" +# define MD_BLUETOOTH_DISABLED "\ue444" +# define MD_BLUETOOTH_SEARCHING "\ue445" +# define MD_BRIGHTNESS_AUTO "\ue446" +# define MD_BRIGHTNESS_HIGH "\ue447" +# define MD_BRIGHTNESS_LOW "\ue448" +# define MD_BRIGHTNESS_MEDIUM "\ue449" +# define MD_DATA_USAGE "\ue44a" +# define MD_DEVELOPER_MODE "\ue44b" +# define MD_DEVICES "\ue44c" +# define MD_DVR "\ue44d" +# define MD_GPS_FIXED "\ue44e" +# define MD_GPS_NOT_FIXED "\ue44f" +# define MD_GPS_OFF "\ue450" +# define MD_LOCATION_DISABLED "\ue451" +# define MD_LOCATION_SEARCHING "\ue452" +# define MD_GRAPHIC_EQ "\ue453" +# define MD_NETWORK_CELL "\ue454" +# define MD_NETWORK_WIFI "\ue455" +# define MD_NFC "\ue456" +# define MD_WALLPAPER "\ue457" +# define MD_WIDGETS "\ue458" +# define MD_SCREEN_LOCK_LANDSCAPE "\ue459" +# define MD_SCREEN_LOCK_PORTRAIT "\ue45a" +# define MD_SCREEN_LOCK_ROTATION "\ue45b" +# define MD_SCREEN_ROTATION "\ue45c" +# define MD_SD_STORAGE "\ue45d" +# define MD_SETTINGS_SYSTEM_DAYDREAM "\ue45e" +# define MD_SIGNAL_CELLULAR_4_BAR "\ue45f" +# define MD_SIGNAL_CELLULAR_CONNECTED_NO_INTERNET_4_BAR "\ue460" +# define MD_SIGNAL_CELLULAR_NO_SIM "\ue461" +# define MD_SIGNAL_CELLULAR_NULL "\ue462" +# define MD_SIGNAL_CELLULAR_OFF "\ue463" +# define MD_SIGNAL_WIFI_4_BAR "\ue464" +# define MD_SIGNAL_WIFI_4_BAR_LOCK "\ue465" +# define MD_SIGNAL_WIFI_OFF "\ue466" +# define MD_STORAGE "\ue467" +# define MD_USB "\ue468" +# define MD_WIFI_LOCK "\ue469" +# define MD_WIFI_TETHERING "\ue46a" +# define MD_ATTACH_FILE "\ue46b" +# define MD_ATTACH_MONEY "\ue46c" +# define MD_BORDER_ALL "\ue46d" +# define MD_BORDER_BOTTOM "\ue46e" +# define MD_BORDER_CLEAR "\ue46f" +# define MD_BORDER_COLOR "\ue470" +# define MD_BORDER_HORIZONTAL "\ue471" +# define MD_BORDER_INNER "\ue472" +# define MD_BORDER_LEFT "\ue473" +# define MD_BORDER_OUTER "\ue474" +# define MD_BORDER_RIGHT "\ue475" +# define MD_BORDER_STYLE "\ue476" +# define MD_BORDER_TOP "\ue477" +# define MD_BORDER_VERTICAL "\ue478" +# define MD_FORMAT_ALIGN_CENTER "\ue479" +# define MD_FORMAT_ALIGN_JUSTIFY "\ue47a" +# define MD_FORMAT_ALIGN_LEFT "\ue47b" +# define MD_FORMAT_ALIGN_RIGHT "\ue47c" +# define MD_FORMAT_BOLD "\ue47d" +# define MD_FORMAT_CLEAR "\ue47e" +# define MD_FORMAT_COLOR_FILL "\ue47f" +# define MD_FORMAT_COLOR_RESET "\ue480" +# define MD_FORMAT_COLOR_TEXT "\ue481" +# define MD_FORMAT_INDENT_DECREASE "\ue482" +# define MD_FORMAT_INDENT_INCREASE "\ue483" +# define MD_FORMAT_ITALIC "\ue484" +# define MD_FORMAT_LINE_SPACING "\ue485" +# define MD_FORMAT_LIST_BULLETED "\ue486" +# define MD_FORMAT_LIST_NUMBERED "\ue487" +# define MD_FORMAT_PAINT "\ue488" +# define MD_FORMAT_QUOTE "\ue489" +# define MD_FORMAT_SIZE "\ue48a" +# define MD_FORMAT_STRIKETHROUGH "\ue48b" +# define MD_FORMAT_TEXTDIRECTION_L_TO_R "\ue48c" +# define MD_FORMAT_TEXTDIRECTION_R_TO_L "\ue48d" +# define MD_FORMAT_UNDERLINED "\ue48e" +# define MD_FUNCTIONS "\ue48f" +# define MD_INSERT_CHART "\ue490" +# define MD_INSERT_COMMENT "\ue491" +# define MD_INSERT_DRIVE_FILE "\ue492" +# define MD_INSERT_EMOTICON "\ue493" +# define MD_INSERT_INVITATION "\ue494" +# define MD_INSERT_LINK "\ue495" +# define MD_INSERT_PHOTO "\ue496" +# define MD_MERGE_TYPE "\ue497" +# define MD_MODE_COMMENT "\ue498" +# define MD_MODE_EDIT "\ue499" +# define MD_PUBLISH "\ue49a" +# define MD_SPACE_BAR "\ue49b" +# define MD_STRIKETHROUGH_S "\ue49c" +# define MD_VERTICAL_ALIGN_BOTTOM "\ue49d" +# define MD_VERTICAL_ALIGN_CENTER "\ue49e" +# define MD_VERTICAL_ALIGN_TOP "\ue49f" +# define MD_WRAP_TEXT "\ue4a0" +# define MD_MONEY_OFF "\ue4a1" +# define MD_DRAG_HANDLE "\ue4a2" +# define MD_FORMAT_SHAPES "\ue4a3" +# define MD_HIGHLIGHT "\ue4a4" +# define MD_LINEAR_SCALE "\ue4a5" +# define MD_SHORT_TEXT "\ue4a6" +# define MD_TEXT_FIELDS "\ue4a7" +# define MD_MONETIZATION_ON "\ue4a8" +# define MD_TITLE "\ue4a9" +# define MD_ATTACHMENT "\ue4aa" +# define MD_CLOUD "\ue4ab" +# define MD_CLOUD_CIRCLE "\ue4ac" +# define MD_CLOUD_DONE "\ue4ad" +# define MD_CLOUD_DOWNLOAD "\ue4ae" +# define MD_CLOUD_OFF "\ue4af" +# define MD_CLOUD_QUEUE "\ue4b0" +# define MD_CLOUD_UPLOAD "\ue4b1" +# define MD_FILE_DOWNLOAD "\ue4b2" +# define MD_FILE_UPLOAD "\ue4b3" +# define MD_FOLDER "\ue4b4" +# define MD_FOLDER_OPEN "\ue4b5" +# define MD_FOLDER_SHARED "\ue4b6" +# define MD_CREATE_NEW_FOLDER "\ue4b7" +# define MD_CAST "\ue4b8" +# define MD_CAST_CONNECTED "\ue4b9" +# define MD_COMPUTER "\ue4ba" +# define MD_DESKTOP_MAC "\ue4bb" +# define MD_DESKTOP_WINDOWS "\ue4bc" +# define MD_DEVELOPER_BOARD "\ue4bd" +# define MD_DOCK "\ue4be" +# define MD_GAMEPAD "\ue4bf" +# define MD_HEADSET "\ue4c0" +# define MD_HEADSET_MIC "\ue4c1" +# define MD_KEYBOARD "\ue4c2" +# define MD_KEYBOARD_ARROW_DOWN "\ue4c3" +# define MD_KEYBOARD_ARROW_LEFT "\ue4c4" +# define MD_KEYBOARD_ARROW_RIGHT "\ue4c5" +# define MD_KEYBOARD_ARROW_UP "\ue4c6" +# define MD_KEYBOARD_BACKSPACE "\ue4c7" +# define MD_KEYBOARD_CAPSLOCK "\ue4c8" +# define MD_KEYBOARD_HIDE "\ue4c9" +# define MD_KEYBOARD_RETURN "\ue4ca" +# define MD_KEYBOARD_TAB "\ue4cb" +# define MD_KEYBOARD_VOICE "\ue4cc" +# define MD_LAPTOP "\ue4cd" +# define MD_LAPTOP_CHROMEBOOK "\ue4ce" +# define MD_LAPTOP_MAC "\ue4cf" +# define MD_LAPTOP_WINDOWS "\ue4d0" +# define MD_MEMORY "\ue4d1" +# define MD_MOUSE "\ue4d2" +# define MD_PHONE_ANDROID "\ue4d3" +# define MD_PHONE_IPHONE "\ue4d4" +# define MD_PHONELINK "\ue4d5" +# define MD_PHONELINK_OFF "\ue4d6" +# define MD_ROUTER "\ue4d7" +# define MD_SCANNER "\ue4d8" +# define MD_SECURITY "\ue4d9" +# define MD_SIM_CARD "\ue4da" +# define MD_SMARTPHONE "\ue4db" +# define MD_SPEAKER "\ue4dc" +# define MD_SPEAKER_GROUP "\ue4dd" +# define MD_TABLET "\ue4de" +# define MD_TABLET_ANDROID "\ue4df" +# define MD_TABLET_MAC "\ue4e0" +# define MD_TOYS "\ue4e1" +# define MD_TV "\ue4e2" +# define MD_WATCH "\ue4e3" +# define MD_DEVICE_HUB "\ue4e4" +# define MD_POWER_INPUT "\ue4e5" +# define MD_DEVICES_OTHER "\ue4e6" +# define MD_VIDEOGAME_ASSET "\ue4e7" +# define MD_ADD_TO_PHOTOS "\ue4e8" +# define MD_ADJUST "\ue4e9" +# define MD_ASSISTANT "\ue4ea" +# define MD_ASSISTANT_PHOTO "\ue4eb" +# define MD_AUDIOTRACK "\ue4ec" +# define MD_BLUR_CIRCULAR "\ue4ed" +# define MD_BLUR_LINEAR "\ue4ee" +# define MD_BLUR_OFF "\ue4ef" +# define MD_BLUR_ON "\ue4f0" +# define MD_BRIGHTNESS_1 "\ue4f1" +# define MD_BRIGHTNESS_2 "\ue4f2" +# define MD_BRIGHTNESS_3 "\ue4f3" +# define MD_BRIGHTNESS_4 "\ue4f4" +# define MD_BRIGHTNESS_5 "\ue4f5" +# define MD_BRIGHTNESS_6 "\ue4f6" +# define MD_BRIGHTNESS_7 "\ue4f7" +# define MD_BROKEN_IMAGE "\ue4f8" +# define MD_BRUSH "\ue4f9" +# define MD_CAMERA "\ue4fa" +# define MD_CAMERA_ALT "\ue4fb" +# define MD_CAMERA_FRONT "\ue4fc" +# define MD_CAMERA_REAR "\ue4fd" +# define MD_CAMERA_ROLL "\ue4fe" +# define MD_CENTER_FOCUS_STRONG "\ue4ff" +# define MD_CENTER_FOCUS_WEAK "\ue500" +# define MD_COLLECTIONS "\ue501" +# define MD_COLOR_LENS "\ue502" +# define MD_COLORIZE "\ue503" +# define MD_COMPARE "\ue504" +# define MD_CONTROL_POINT "\ue505" +# define MD_CONTROL_POINT_DUPLICATE "\ue506" +# define MD_CROP_16_9 "\ue507" +# define MD_CROP_3_2 "\ue508" +# define MD_CROP "\ue509" +# define MD_CROP_5_4 "\ue50a" +# define MD_CROP_7_5 "\ue50b" +# define MD_CROP_DIN "\ue50c" +# define MD_CROP_FREE "\ue50d" +# define MD_CROP_LANDSCAPE "\ue50e" +# define MD_CROP_ORIGINAL "\ue50f" +# define MD_CROP_PORTRAIT "\ue510" +# define MD_CROP_SQUARE "\ue511" +# define MD_DEHAZE "\ue512" +# define MD_DETAILS "\ue513" +# define MD_EDIT "\ue514" +# define MD_EXPOSURE "\ue515" +# define MD_EXPOSURE_NEG_1 "\ue516" +# define MD_EXPOSURE_NEG_2 "\ue517" +# define MD_EXPOSURE_PLUS_1 "\ue518" +# define MD_EXPOSURE_PLUS_2 "\ue519" +# define MD_EXPOSURE_ZERO "\ue51a" +# define MD_FILTER_1 "\ue51b" +# define MD_FILTER_2 "\ue51c" +# define MD_FILTER_3 "\ue51d" +# define MD_FILTER "\ue51e" +# define MD_FILTER_4 "\ue51f" +# define MD_FILTER_5 "\ue520" +# define MD_FILTER_6 "\ue521" +# define MD_FILTER_7 "\ue522" +# define MD_FILTER_8 "\ue523" +# define MD_FILTER_9 "\ue524" +# define MD_FILTER_9_PLUS "\ue525" +# define MD_FILTER_B_AND_W "\ue526" +# define MD_FILTER_CENTER_FOCUS "\ue527" +# define MD_FILTER_DRAMA "\ue528" +# define MD_FILTER_FRAMES "\ue529" +# define MD_FILTER_HDR "\ue52a" +# define MD_FILTER_NONE "\ue52b" +# define MD_FILTER_TILT_SHIFT "\ue52c" +# define MD_FILTER_VINTAGE "\ue52d" +# define MD_FLARE "\ue52e" +# define MD_FLASH_AUTO "\ue52f" +# define MD_FLASH_OFF "\ue530" +# define MD_FLASH_ON "\ue531" +# define MD_FLIP "\ue532" +# define MD_GRADIENT "\ue533" +# define MD_GRAIN "\ue534" +# define MD_GRID_OFF "\ue535" +# define MD_GRID_ON "\ue536" +# define MD_HDR_OFF "\ue537" +# define MD_HDR_ON "\ue538" +# define MD_HDR_STRONG "\ue539" +# define MD_HDR_WEAK "\ue53a" +# define MD_HEALING "\ue53b" +# define MD_IMAGE "\ue53c" +# define MD_IMAGE_ASPECT_RATIO "\ue53d" +# define MD_ISO "\ue53e" +# define MD_LANDSCAPE "\ue53f" +# define MD_LEAK_ADD "\ue540" +# define MD_LEAK_REMOVE "\ue541" +# define MD_LENS "\ue542" +# define MD_LOOKS_3 "\ue543" +# define MD_LOOKS "\ue544" +# define MD_LOOKS_4 "\ue545" +# define MD_LOOKS_5 "\ue546" +# define MD_LOOKS_6 "\ue547" +# define MD_LOOKS_ONE "\ue548" +# define MD_LOOKS_TWO "\ue549" +# define MD_LOUPE "\ue54a" +# define MD_MONOCHROME_PHOTOS "\ue54b" +# define MD_MOVIE_CREATION "\ue54c" +# define MD_MUSIC_NOTE "\ue54d" +# define MD_NATURE "\ue54e" +# define MD_NATURE_PEOPLE "\ue54f" +# define MD_NAVIGATE_BEFORE "\ue550" +# define MD_NAVIGATE_NEXT "\ue551" +# define MD_PALETTE "\ue552" +# define MD_PANORAMA "\ue553" +# define MD_PANORAMA_FISH_EYE "\ue554" +# define MD_PANORAMA_HORIZONTAL "\ue555" +# define MD_PANORAMA_VERTICAL "\ue556" +# define MD_PANORAMA_WIDE_ANGLE "\ue557" +# define MD_PHOTO "\ue558" +# define MD_PHOTO_ALBUM "\ue559" +# define MD_PHOTO_CAMERA "\ue55a" +# define MD_PHOTO_LIBRARY "\ue55b" +# define MD_PICTURE_AS_PDF "\ue55c" +# define MD_PORTRAIT "\ue55d" +# define MD_REMOVE_RED_EYE "\ue55e" +# define MD_ROTATE_90_DEGREES_CCW "\ue55f" +# define MD_ROTATE_LEFT "\ue560" +# define MD_ROTATE_RIGHT "\ue561" +# define MD_SLIDESHOW "\ue562" +# define MD_STRAIGHTEN "\ue563" +# define MD_STYLE "\ue564" +# define MD_SWITCH_CAMERA "\ue565" +# define MD_SWITCH_VIDEO "\ue566" +# define MD_TAG_FACES "\ue567" +# define MD_TEXTURE "\ue568" +# define MD_TIMELAPSE "\ue569" +# define MD_TIMER_10 "\ue56a" +# define MD_TIMER_3 "\ue56b" +# define MD_TIMER "\ue56c" +# define MD_TIMER_OFF "\ue56d" +# define MD_TONALITY "\ue56e" +# define MD_TRANSFORM "\ue56f" +# define MD_TUNE "\ue570" +# define MD_VIEW_COMFY "\ue571" +# define MD_VIEW_COMPACT "\ue572" +# define MD_WB_AUTO "\ue573" +# define MD_WB_CLOUDY "\ue574" +# define MD_WB_INCANDESCENT "\ue575" +# define MD_WB_SUNNY "\ue576" +# define MD_COLLECTIONS_BOOKMARK "\ue577" +# define MD_PHOTO_SIZE_SELECT_ACTUAL "\ue578" +# define MD_PHOTO_SIZE_SELECT_LARGE "\ue579" +# define MD_PHOTO_SIZE_SELECT_SMALL "\ue57a" +# define MD_VIGNETTE "\ue57b" +# define MD_WB_IRIDESCENT "\ue57c" +# define MD_CROP_ROTATE "\ue57d" +# define MD_LINKED_CAMERA "\ue57e" +# define MD_ADD_A_PHOTO "\ue57f" +# define MD_MOVIE_FILTER "\ue580" +# define MD_PHOTO_FILTER "\ue581" +# define MD_BURST_MODE "\ue582" +# define MD_BEENHERE "\ue583" +# define MD_DIRECTIONS "\ue584" +# define MD_DIRECTIONS_BIKE "\ue585" +# define MD_DIRECTIONS_BUS "\ue586" +# define MD_DIRECTIONS_CAR "\ue587" +# define MD_DIRECTIONS_BOAT "\ue588" +# define MD_DIRECTIONS_SUBWAY "\ue589" +# define MD_DIRECTIONS_RAILWAY "\ue58a" +# define MD_DIRECTIONS_TRANSIT "\ue58b" +# define MD_DIRECTIONS_WALK "\ue58c" +# define MD_FLIGHT "\ue58d" +# define MD_HOTEL "\ue58e" +# define MD_LAYERS "\ue58f" +# define MD_LAYERS_CLEAR "\ue590" +# define MD_LOCAL_AIRPORT "\ue591" +# define MD_LOCAL_ATM "\ue592" +# define MD_LOCAL_ACTIVITY "\ue593" +# define MD_LOCAL_BAR "\ue594" +# define MD_LOCAL_CAFE "\ue595" +# define MD_LOCAL_CAR_WASH "\ue596" +# define MD_LOCAL_CONVENIENCE_STORE "\ue597" +# define MD_LOCAL_DRINK "\ue598" +# define MD_LOCAL_FLORIST "\ue599" +# define MD_LOCAL_GAS_STATION "\ue59a" +# define MD_LOCAL_GROCERY_STORE "\ue59b" +# define MD_LOCAL_HOSPITAL "\ue59c" +# define MD_LOCAL_HOTEL "\ue59d" +# define MD_LOCAL_LAUNDRY_SERVICE "\ue59e" +# define MD_LOCAL_LIBRARY "\ue59f" +# define MD_LOCAL_MALL "\ue5a0" +# define MD_LOCAL_MOVIES "\ue5a1" +# define MD_LOCAL_OFFER "\ue5a2" +# define MD_LOCAL_PARKING "\ue5a3" +# define MD_LOCAL_PHARMACY "\ue5a4" +# define MD_LOCAL_PHONE "\ue5a5" +# define MD_LOCAL_PIZZA "\ue5a6" +# define MD_LOCAL_PLAY "\ue5a7" +# define MD_LOCAL_POST_OFFICE "\ue5a8" +# define MD_LOCAL_PRINTSHOP "\ue5a9" +# define MD_LOCAL_DINING "\ue5aa" +# define MD_LOCAL_SEE "\ue5ab" +# define MD_LOCAL_SHIPPING "\ue5ac" +# define MD_LOCAL_TAXI "\ue5ad" +# define MD_PERSON_PIN "\ue5ae" +# define MD_MAP "\ue5af" +# define MD_MY_LOCATION "\ue5b0" +# define MD_NAVIGATION "\ue5b1" +# define MD_PIN_DROP "\ue5b2" +# define MD_PLACE "\ue5b3" +# define MD_RATE_REVIEW "\ue5b4" +# define MD_RESTAURANT_MENU "\ue5b5" +# define MD_SATELLITE "\ue5b6" +# define MD_STORE_MALL_DIRECTORY "\ue5b7" +# define MD_TERRAIN "\ue5b8" +# define MD_TRAFFIC "\ue5b9" +# define MD_DIRECTIONS_RUN "\ue5ba" +# define MD_ADD_LOCATION "\ue5bb" +# define MD_EDIT_LOCATION "\ue5bc" +# define MD_NEAR_ME "\ue5bd" +# define MD_PERSON_PIN_CIRCLE "\ue5be" +# define MD_ZOOM_OUT_MAP "\ue5bf" +# define MD_RESTAURANT "\ue5c0" +# define MD_EV_STATION "\ue5c1" +# define MD_STREETVIEW "\ue5c2" +# define MD_SUBWAY "\ue5c3" +# define MD_TRAIN "\ue5c4" +# define MD_TRAM "\ue5c5" +# define MD_TRANSFER_WITHIN_A_STATION "\ue5c6" +# define MD_APPS "\ue5c7" +# define MD_ARROW_BACK "\ue5c8" +# define MD_ARROW_DROP_DOWN "\ue5c9" +# define MD_ARROW_DROP_DOWN_CIRCLE "\ue5ca" +# define MD_ARROW_DROP_UP "\ue5cb" +# define MD_ARROW_FORWARD "\ue5cc" +# define MD_CANCEL "\ue5cd" +# define MD_CHECK "\ue5ce" +# define MD_CHEVRON_LEFT "\ue5cf" +# define MD_CHEVRON_RIGHT "\ue5d0" +# define MD_CLOSE "\ue5d1" +# define MD_EXPAND_LESS "\ue5d2" +# define MD_EXPAND_MORE "\ue5d3" +# define MD_FULLSCREEN "\ue5d4" +# define MD_FULLSCREEN_EXIT "\ue5d5" +# define MD_MENU "\ue5d6" +# define MD_MORE_HORIZ "\ue5d7" +# define MD_MORE_VERT "\ue5d8" +# define MD_REFRESH "\ue5d9" +# define MD_UNFOLD_LESS "\ue5da" +# define MD_UNFOLD_MORE "\ue5db" +# define MD_ARROW_UPWARD "\ue5dc" +# define MD_SUBDIRECTORY_ARROW_LEFT "\ue5dd" +# define MD_SUBDIRECTORY_ARROW_RIGHT "\ue5de" +# define MD_ARROW_DOWNWARD "\ue5df" +# define MD_FIRST_PAGE "\ue5e0" +# define MD_LAST_PAGE "\ue5e1" +# define MD_ADB "\ue5e2" +# define MD_BLUETOOTH_AUDIO "\ue5e3" +# define MD_DISC_FULL "\ue5e4" +# define MD_DO_NOT_DISTURB_ALT "\ue5e5" +# define MD_DO_NOT_DISTURB "\ue5e6" +# define MD_DRIVE_ETA "\ue5e7" +# define MD_EVENT_AVAILABLE "\ue5e8" +# define MD_EVENT_BUSY "\ue5e9" +# define MD_EVENT_NOTE "\ue5ea" +# define MD_FOLDER_SPECIAL "\ue5eb" +# define MD_MMS "\ue5ec" +# define MD_MORE "\ue5ed" +# define MD_NETWORK_LOCKED "\ue5ee" +# define MD_PHONE_BLUETOOTH_SPEAKER "\ue5ef" +# define MD_PHONE_FORWARDED "\ue5f0" +# define MD_PHONE_IN_TALK "\ue5f1" +# define MD_PHONE_LOCKED "\ue5f2" +# define MD_PHONE_MISSED "\ue5f3" +# define MD_PHONE_PAUSED "\ue5f4" +# define MD_SD_CARD "\ue5f5" +# define MD_SIM_CARD_ALERT "\ue5f6" +# define MD_SMS "\ue5f7" +# define MD_SMS_FAILED "\ue5f8" +# define MD_SYNC "\ue5f9" +# define MD_SYNC_DISABLED "\ue5fa" +# define MD_SYNC_PROBLEM "\ue5fb" +# define MD_SYSTEM_UPDATE "\ue5fc" +# define MD_TAP_AND_PLAY "\ue5fd" +# define MD_TIME_TO_LEAVE "\ue5fe" +# define MD_VIBRATION "\ue5ff" +# define MD_VOICE_CHAT "\ue600" +# define MD_VPN_LOCK "\ue601" +# define MD_AIRLINE_SEAT_FLAT "\ue602" +# define MD_AIRLINE_SEAT_FLAT_ANGLED "\ue603" +# define MD_AIRLINE_SEAT_INDIVIDUAL_SUITE "\ue604" +# define MD_AIRLINE_SEAT_LEGROOM_EXTRA "\ue605" +# define MD_AIRLINE_SEAT_LEGROOM_NORMAL "\ue606" +# define MD_AIRLINE_SEAT_LEGROOM_REDUCED "\ue607" +# define MD_AIRLINE_SEAT_RECLINE_EXTRA "\ue608" +# define MD_AIRLINE_SEAT_RECLINE_NORMAL "\ue609" +# define MD_CONFIRMATION_NUMBER "\ue60a" +# define MD_LIVE_TV "\ue60b" +# define MD_ONDEMAND_VIDEO "\ue60c" +# define MD_PERSONAL_VIDEO "\ue60d" +# define MD_POWER "\ue60e" +# define MD_WC "\ue60f" +# define MD_WIFI "\ue610" +# define MD_ENHANCED_ENCRYPTION "\ue611" +# define MD_NETWORK_CHECK "\ue612" +# define MD_NO_ENCRYPTION "\ue613" +# define MD_RV_HOOKUP "\ue614" +# define MD_DO_NOT_DISTURB_OFF "\ue615" +# define MD_DO_NOT_DISTURB_ON "\ue616" +# define MD_PRIORITY_HIGH "\ue617" +# define MD_PIE_CHART "\ue618" +# define MD_PIE_CHART_OUTLINED "\ue619" +# define MD_BUBBLE_CHART "\ue61a" +# define MD_MULTILINE_CHART "\ue61b" +# define MD_SHOW_CHART "\ue61c" +# define MD_CAKE "\ue61d" +# define MD_DOMAIN "\ue61e" +# define MD_GROUP "\ue61f" +# define MD_GROUP_ADD "\ue620" +# define MD_LOCATION_CITY "\ue621" +# define MD_MOOD "\ue622" +# define MD_MOOD_BAD "\ue623" +# define MD_NOTIFICATIONS "\ue624" +# define MD_NOTIFICATIONS_NONE "\ue625" +# define MD_NOTIFICATIONS_OFF "\ue626" +# define MD_NOTIFICATIONS_ACTIVE "\ue627" +# define MD_NOTIFICATIONS_PAUSED "\ue628" +# define MD_PAGES "\ue629" +# define MD_PARTY_MODE "\ue62a" +# define MD_PEOPLE "\ue62b" +# define MD_PEOPLE_OUTLINE "\ue62c" +# define MD_PERSON "\ue62d" +# define MD_PERSON_ADD "\ue62e" +# define MD_PERSON_OUTLINE "\ue62f" +# define MD_PLUS_ONE "\ue630" +# define MD_POLL "\ue631" +# define MD_PUBLIC "\ue632" +# define MD_SCHOOL "\ue633" +# define MD_SHARE "\ue634" +# define MD_WHATSHOT "\ue635" +# define MD_SENTIMENT_DISSATISFIED "\ue636" +# define MD_SENTIMENT_NEUTRAL "\ue637" +# define MD_SENTIMENT_SATISFIED "\ue638" +# define MD_SENTIMENT_VERY_DISSATISFIED "\ue639" +# define MD_SENTIMENT_VERY_SATISFIED "\ue63a" +# define MD_CHECK_BOX "\ue63b" +# define MD_CHECK_BOX_OUTLINE_BLANK "\ue63c" +# define MD_RADIO_BUTTON_UNCHECKED "\ue63d" +# define MD_RADIO_BUTTON_CHECKED "\ue63e" +# define MD_STAR "\ue63f" +# define MD_STAR_HALF "\ue640" +# define MD_STAR_BORDER "\ue641" +# define MD_3D_ROTATION "\ue642" +# define MD_ACCESSIBILITY "\ue643" +# define MD_ACCOUNT_BALANCE "\ue644" +# define MD_ACCOUNT_BALANCE_WALLET "\ue645" +# define MD_ACCOUNT_BOX "\ue646" +# define MD_ACCOUNT_CIRCLE "\ue647" +# define MD_ADD_SHOPPING_CART "\ue648" +# define MD_ALARM "\ue649" +# define MD_ALARM_ADD "\ue64a" +# define MD_ALARM_OFF "\ue64b" +# define MD_ALARM_ON "\ue64c" +# define MD_ANDROID "\ue64d" +# define MD_ANNOUNCEMENT "\ue64e" +# define MD_ASPECT_RATIO "\ue64f" +# define MD_ASSESSMENT "\ue650" +# define MD_ASSIGNMENT "\ue651" +# define MD_ASSIGNMENT_IND "\ue652" +# define MD_ASSIGNMENT_LATE "\ue653" +# define MD_ASSIGNMENT_RETURN "\ue654" +# define MD_ASSIGNMENT_RETURNED "\ue655" +# define MD_ASSIGNMENT_TURNED_IN "\ue656" +# define MD_AUTORENEW "\ue657" +# define MD_BACKUP "\ue658" +# define MD_BOOK "\ue659" +# define MD_BOOKMARK "\ue65a" +# define MD_BOOKMARK_BORDER "\ue65b" +# define MD_BUG_REPORT "\ue65c" +# define MD_BUILD "\ue65d" +# define MD_CACHED "\ue65e" +# define MD_CHANGE_HISTORY "\ue65f" +# define MD_CHECK_CIRCLE "\ue660" +# define MD_CHROME_READER_MODE "\ue661" +# define MD_CLASS "\ue662" +# define MD_CODE "\ue663" +# define MD_CREDIT_CARD "\ue664" +# define MD_DASHBOARD "\ue665" +# define MD_DELETE "\ue666" +# define MD_DESCRIPTION "\ue667" +# define MD_DNS "\ue668" +# define MD_DONE "\ue669" +# define MD_DONE_ALL "\ue66a" +# define MD_EVENT "\ue66b" +# define MD_EXIT_TO_APP "\ue66c" +# define MD_EXPLORE "\ue66d" +# define MD_EXTENSION "\ue66e" +# define MD_FACE "\ue66f" +# define MD_FAVORITE "\ue670" +# define MD_FAVORITE_BORDER "\ue671" +# define MD_FEEDBACK "\ue672" +# define MD_FIND_IN_PAGE "\ue673" +# define MD_FIND_REPLACE "\ue674" +# define MD_FLIP_TO_BACK "\ue675" +# define MD_FLIP_TO_FRONT "\ue676" +# define MD_GET_APP "\ue677" +# define MD_GRADE "\ue678" +# define MD_GROUP_WORK "\ue679" +# define MD_HELP "\ue67a" +# define MD_HIGHLIGHT_OFF "\ue67b" +# define MD_HISTORY "\ue67c" +# define MD_HOME "\ue67d" +# define MD_HOURGLASS_EMPTY "\ue67e" +# define MD_HOURGLASS_FULL "\ue67f" +# define MD_HTTPS "\ue680" +# define MD_INFO "\ue681" +# define MD_INFO_OUTLINE "\ue682" +# define MD_INPUT "\ue683" +# define MD_INVERT_COLORS "\ue684" +# define MD_LABEL "\ue685" +# define MD_LABEL_OUTLINE "\ue686" +# define MD_LANGUAGE "\ue687" +# define MD_LAUNCH "\ue688" +# define MD_LIST "\ue689" +# define MD_LOCK "\ue68a" +# define MD_LOCK_OPEN "\ue68b" +# define MD_LOCK_OUTLINE "\ue68c" +# define MD_LOYALTY "\ue68d" +# define MD_MARKUNREAD_MAILBOX "\ue68e" +# define MD_NOTE_ADD "\ue68f" +# define MD_OPEN_IN_BROWSER "\ue690" +# define MD_OPEN_IN_NEW "\ue691" +# define MD_OPEN_WITH "\ue692" +# define MD_PAGEVIEW "\ue693" +# define MD_PAYMENT "\ue694" +# define MD_PERM_CAMERA_MIC "\ue695" +# define MD_PERM_CONTACT_CALENDAR "\ue696" +# define MD_PERM_DATA_SETTING "\ue697" +# define MD_PERM_DEVICE_INFORMATION "\ue698" +# define MD_PERM_IDENTITY "\ue699" +# define MD_PERM_MEDIA "\ue69a" +# define MD_PERM_PHONE_MSG "\ue69b" +# define MD_PERM_SCAN_WIFI "\ue69c" +# define MD_PICTURE_IN_PICTURE "\ue69d" +# define MD_POLYMER "\ue69e" +# define MD_POWER_SETTINGS_NEW "\ue69f" +# define MD_PRINT "\ue6a0" +# define MD_QUERY_BUILDER "\ue6a1" +# define MD_QUESTION_ANSWER "\ue6a2" +# define MD_RECEIPT "\ue6a3" +# define MD_REDEEM "\ue6a4" +# define MD_REPORT_PROBLEM "\ue6a5" +# define MD_RESTORE "\ue6a6" +# define MD_ROOM "\ue6a7" +# define MD_SCHEDULE "\ue6a8" +# define MD_SEARCH "\ue6a9" +# define MD_SETTINGS "\ue6aa" +# define MD_SETTINGS_APPLICATIONS "\ue6ab" +# define MD_SETTINGS_BACKUP_RESTORE "\ue6ac" +# define MD_SETTINGS_BLUETOOTH "\ue6ad" +# define MD_SETTINGS_CELL "\ue6ae" +# define MD_SETTINGS_BRIGHTNESS "\ue6af" +# define MD_SETTINGS_ETHERNET "\ue6b0" +# define MD_SETTINGS_INPUT_ANTENNA "\ue6b1" +# define MD_SETTINGS_INPUT_COMPONENT "\ue6b2" +# define MD_SETTINGS_INPUT_COMPOSITE "\ue6b3" +# define MD_SETTINGS_INPUT_HDMI "\ue6b4" +# define MD_SETTINGS_INPUT_SVIDEO "\ue6b5" +# define MD_SETTINGS_OVERSCAN "\ue6b6" +# define MD_SETTINGS_PHONE "\ue6b7" +# define MD_SETTINGS_POWER "\ue6b8" +# define MD_SETTINGS_REMOTE "\ue6b9" +# define MD_SETTINGS_VOICE "\ue6ba" +# define MD_SHOP "\ue6bb" +# define MD_SHOP_TWO "\ue6bc" +# define MD_SHOPPING_BASKET "\ue6bd" +# define MD_SHOPPING_CART "\ue6be" +# define MD_SPEAKER_NOTES "\ue6bf" +# define MD_SPELLCHECK "\ue6c0" +# define MD_STARS "\ue6c1" +# define MD_STORE "\ue6c2" +# define MD_SUBJECT "\ue6c3" +# define MD_SUPERVISOR_ACCOUNT "\ue6c4" +# define MD_SWAP_HORIZ "\ue6c5" +# define MD_SWAP_VERT "\ue6c6" +# define MD_SWAP_VERTICAL_CIRCLE "\ue6c7" +# define MD_SYSTEM_UPDATE_ALT "\ue6c8" +# define MD_TAB "\ue6c9" +# define MD_TAB_UNSELECTED "\ue6ca" +# define MD_THEATERS "\ue6cb" +# define MD_THUMB_DOWN "\ue6cc" +# define MD_THUMB_UP "\ue6cd" +# define MD_THUMBS_UP_DOWN "\ue6ce" +# define MD_TOC "\ue6cf" +# define MD_TODAY "\ue6d0" +# define MD_TOLL "\ue6d1" +# define MD_TRACK_CHANGES "\ue6d2" +# define MD_TRANSLATE "\ue6d3" +# define MD_TRENDING_DOWN "\ue6d4" +# define MD_TRENDING_FLAT "\ue6d5" +# define MD_TRENDING_UP "\ue6d6" +# define MD_TURNED_IN "\ue6d7" +# define MD_TURNED_IN_NOT "\ue6d8" +# define MD_VERIFIED_USER "\ue6d9" +# define MD_VIEW_AGENDA "\ue6da" +# define MD_VIEW_ARRAY "\ue6db" +# define MD_VIEW_CAROUSEL "\ue6dc" +# define MD_VIEW_COLUMN "\ue6dd" +# define MD_VIEW_DAY "\ue6de" +# define MD_VIEW_HEADLINE "\ue6df" +# define MD_VIEW_LIST "\ue6e0" +# define MD_VIEW_MODULE "\ue6e1" +# define MD_VIEW_QUILT "\ue6e2" +# define MD_VIEW_STREAM "\ue6e3" +# define MD_VIEW_WEEK "\ue6e4" +# define MD_VISIBILITY "\ue6e5" +# define MD_VISIBILITY_OFF "\ue6e6" +# define MD_CARD_GIFTCARD "\ue6e7" +# define MD_CARD_MEMBERSHIP "\ue6e8" +# define MD_CARD_TRAVEL "\ue6e9" +# define MD_WORK "\ue6ea" +# define MD_YOUTUBE_SEARCHED_FOR "\ue6eb" +# define MD_EJECT "\ue6ec" +# define MD_CAMERA_ENHANCE "\ue6ed" +# define MD_HELP_OUTLINE "\ue6ee" +# define MD_REORDER "\ue6ef" +# define MD_ZOOM_IN "\ue6f0" +# define MD_ZOOM_OUT "\ue6f1" +# define MD_HTTP "\ue6f2" +# define MD_EVENT_SEAT "\ue6f3" +# define MD_FLIGHT_LAND "\ue6f4" +# define MD_FLIGHT_TAKEOFF "\ue6f5" +# define MD_PLAY_FOR_WORK "\ue6f6" +# define MD_GIF "\ue6f7" +# define MD_INDETERMINATE_CHECK_BOX "\ue6f8" +# define MD_OFFLINE_PIN "\ue6f9" +# define MD_ALL_OUT "\ue6fa" +# define MD_COPYRIGHT "\ue6fb" +# define MD_FINGERPRINT "\ue6fc" +# define MD_GAVEL "\ue6fd" +# define MD_LIGHTBULB_OUTLINE "\ue6fe" +# define MD_PICTURE_IN_PICTURE_ALT "\ue6ff" +# define MD_IMPORTANT_DEVICES "\ue700" +# define MD_TOUCH_APP "\ue701" +# define MD_ACCESSIBLE "\ue702" +# define MD_COMPARE_ARROWS "\ue703" +# define MD_DATE_RANGE "\ue704" +# define MD_DONUT_LARGE "\ue705" +# define MD_DONUT_SMALL "\ue706" +# define MD_LINE_STYLE "\ue707" +# define MD_LINE_WEIGHT "\ue708" +# define MD_MOTORCYCLE "\ue709" +# define MD_OPACITY "\ue70a" +# define MD_PETS "\ue70b" +# define MD_PREGNANT_WOMAN "\ue70c" +# define MD_RECORD_VOICE_OVER "\ue70d" +# define MD_ROUNDED_CORNER "\ue70e" +# define MD_ROWING "\ue70f" +# define MD_TIMELINE "\ue710" +# define MD_UPDATE "\ue711" +# define MD_WATCH_LATER "\ue712" +# define MD_PAN_TOOL "\ue713" +# define MD_EURO_SYMBOL "\ue714" +# define MD_G_TRANSLATE "\ue715" +# define MD_REMOVE_SHOPPING_CART "\ue716" +# define MD_RESTORE_PAGE "\ue717" +# define MD_SPEAKER_NOTES_OFF "\ue718" +# define MD_DELETE_FOREVER "\ue719" +# define MD_AC_UNIT "\ue71a" +# define MD_AIRPORT_SHUTTLE "\ue71b" +# define MD_ALL_INCLUSIVE "\ue71c" +# define MD_BEACH_ACCESS "\ue71d" +# define MD_BUSINESS_CENTER "\ue71e" +# define MD_CASINO "\ue71f" +# define MD_CHILD_CARE "\ue720" +# define MD_CHILD_FRIENDLY "\ue721" +# define MD_FITNESS_CENTER "\ue722" +# define MD_FREE_BREAKFAST "\ue723" +# define MD_GOLF_COURSE "\ue724" +# define MD_HOT_TUB "\ue725" +# define MD_KITCHEN "\ue726" +# define MD_POOL "\ue727" +# define MD_ROOM_SERVICE "\ue728" +# define MD_SMOKE_FREE "\ue729" +# define MD_SMOKING_ROOMS "\ue72a" +# define MD_SPA "\ue72b" +# define MD_U10FFFD "\ue72c" +# define FILE_REGEX "\ue72d" +# define FILE_ARCH_LINUX "\ue72e" +# define FILE_E "\ue72f" +# define FILE_GLYPHS "\ue730" +# define FILE_KNOCKOUT "\ue731" +# define FILE_LEAN "\ue732" +# define FILE_METAL "\ue733" +# define FILE_POVRAY "\ue734" +# define FILE_S "\ue735" +# define FILE_TT "\ue736" +# define FILE_VAGRANT "\ue737" +# define FILE_XMOS "\ue738" +# define FILE_A "\ue739" +# define FILE_CHAI "\ue73a" +# define FILE_STYLUS "\ue73b" +# define FILE_TEXTILE "\ue73c" +# define FILE_UNREAL "\ue73d" +# define FILE_PUREBASIC "\ue73e" +# define FILE_TS "\ue73f" +# define FILE_SCHEME "\ue740" +# define FILE_TEXTMATE "\ue741" +# define FILE_X10 "\ue742" +# define FILE_APL "\ue743" +# define FILE_ANSIBLE "\ue744" +# define FILE_ARTTEXT "\ue745" +# define FILE_ANTWAR "\ue746" +# define FILE_OPA "\ue747" +# define FILE_CODECOV "\ue748" +# define FILE_YANG "\ue749" +# define FILE_PM2 "\ue74a" +# define FILE_HG "\ue74b" +# define FILE_PAWN "\ue74c" +# define FILE_JULIA "\ue74d" +# define FILE_SHIPIT "\ue74e" +# define FILE_MOCHA "\ue74f" +# define FILE_NIB "\ue750" +# define FILE_SHURIKEN "\ue751" +# define FILE_ALEX "\ue752" +# define FILE_TWIG "\ue753" +# define FILE_1C "\ue754" +# define FILE_TEX "\ue755" +# define FILE_BIBTEX "\ue756" +# define FILE_MUSTACHE "\ue757" +# define FILE_GULP "\ue758" +# define FILE_GRUNT "\ue759" +# define FILE_EMBER "\ue75a" +# define FILE_GO "\ue75b" +# define FILE_JENKINS "\ue75c" +# define FILE_GNU "\ue75d" +# define FILE_COMPOSER "\ue75e" +# define FILE_METEOR "\ue75f" +# define FILE_AI "\ue760" +# define FILE_PSD "\ue761" +# define FILE_SILVERSTRIPE "\ue762" +# define FILE_MAXSCRIPT "\ue763" +# define FILE_KIVY "\ue764" +# define FILE_CRYSTAL "\ue765" +# define FILE_GRADLE "\ue766" +# define FILE_GROOVY "\ue767" +# define FILE_R "\ue768" +# define FILE_VUE "\ue769" +# define FILE_HAXE "\ue76a" +# define FILE_LISP "\ue76b" +# define FILE_E909 "\ue76c" +# define FILE_FORTRAN "\ue76d" +# define FILE_ADA "\ue76e" +# define FILE_DYALOG "\ue76f" +# define FILE_JADE "\ue770" +# define FILE_E90E "\ue771" +# define FILE_FONT "\ue772" +# define FILE_POSTCSS "\ue773" +# define FILE_SCAD "\ue774" +# define FILE_E912 "\ue775" +# define FILE_RAML "\ue776" +# define FILE_LS "\ue777" +# define FILE_SALTSTACK "\ue778" +# define FILE_TERRAFORM "\ue779" +# define FILE_ORG "\ue77a" +# define FILE_ASCIIDOC "\ue77b" +# define FILE_RIOT "\ue77c" +# define FILE_OCAML "\ue77d" +# define FILE_LUA "\ue77e" +# define FILE_NPM "\ue77f" +# define FILE_LLVM "\ue780" +# define FILE_E91E "\ue781" +# define FILE_BABEL "\ue782" +# define FILE_MARKO "\ue783" +# define FILE_FLOW "\ue784" +# define FILE_BROCCOLI "\ue785" +# define FILE_APPVEYOR "\ue786" +# define FILE_CAKEFILE "\ue787" +# define FILE_APPLE "\ue788" +# define FILE_EMACS "\ue789" +# define FILE_SKETCH "\ue78a" +# define FILE_DOXYGEN "\ue78b" +# define FILE_CF "\ue78c" +# define FILE_PASCAL "\ue78d" +# define FILE_ABAP "\ue78e" +# define FILE_ANTLR "\ue78f" +# define FILE_API "\ue790" +# define FILE_AS "\ue791" +# define FILE_ARC "\ue792" +# define FILE_ARDUINO "\ue793" +# define FILE_AUGEAS "\ue794" +# define FILE_AHK "\ue795" +# define FILE_AUTOIT "\ue796" +# define FILE_ATS "\ue797" +# define FILE_ALLOY "\ue798" +# define FILE_MANPAGE "\ue799" +# define FILE_J "\ue79a" +# define FILE_GLADE "\ue79b" +# define FILE_BOO "\ue79c" +# define FILE_BRAIN "\ue79d" +# define FILE_BRO "\ue79e" +# define FILE_BLUESPEC "\ue79f" +# define FILE_STYLELINT "\ue7a0" +# define FILE_ANT "\ue7a1" +# define FILE_CMAKE "\ue7a2" +# define FILE_CLIPS "\ue7a3" +# define FILE_MAPBOX "\ue7a4" +# define FILE_CP "\ue7a5" +# define FILE_CHUCK "\ue7a6" +# define FILE_JINJA "\ue7a7" +# define FILE_ISABELLE "\ue7a8" +# define FILE_DOGE "\ue7a9" +# define FILE_IDL "\ue7aa" +# define FILE_JAKE "\ue7ab" +# define FILE_VERILOG "\ue7ac" +# define FILE_PHALCON "\ue7ad" +# define FILE_FABFILE "\ue7ae" +# define FILE_LFE "\ue7af" +# define FILE_NMAP "\ue7b0" +# define FILE_AMPL "\ue7b1" +# define FILE_CEYLON "\ue7b2" +# define FILE_CHAPEL "\ue7b3" +# define FILE_CIRRU "\ue7b4" +# define FILE_CLARION "\ue7b5" +# define FILE_NUNJUCKS "\ue7b6" +# define FILE_MEDIAWIKI "\ue7b7" +# define FILE_POSTSCRIPT "\ue7b8" +# define FILE_TCL "\ue7b9" +# define FILE_OWL "\ue7ba" +# define FILE_JSONLD "\ue7bb" +# define FILE_SPARQL "\ue7bc" +# define FILE_SAS "\ue7bd" +# define FILE_CLEAN "\ue7be" +# define FILE_CLICK "\ue7bf" +# define FILE_NVIDIA "\ue7c0" +# define FILE_CREOLE "\ue7c1" +# define FILE_COQ "\ue7c2" +# define FILE_DIFF "\ue7c3" +# define FILE_PATCH "\ue7c4" +# define FILE_BYOND "\ue7c5" +# define FILE_CYTHON "\ue7c6" +# define FILE_DARCS "\ue7c7" +# define FILE_EAGLE "\ue7c8" +# define FILE_ECERE "\ue7c9" +# define FILE_EIFFEL "\ue7ca" +# define FILE_EM "\ue7cb" +# define FILE_FLUX "\ue7cc" +# define FILE_FACTOR "\ue7cd" +# define FILE_FANCY "\ue7ce" +# define FILE_PERL6 "\ue7cf" +# define FILE_GENTOO "\ue7d0" +# define FILE_FREGE "\ue7d1" +# define FILE_FANTOM "\ue7d2" +# define FILE_FREEMARKER "\ue7d3" +# define FILE_GAP "\ue7d4" +# define FILE_CL "\ue7d5" +# define FILE_GAMS "\ue7d6" +# define FILE_GODOT "\ue7d7" +# define FILE_GML "\ue7d8" +# define FILE_GENSHI "\ue7d9" +# define FILE_POINTWISE "\ue7da" +# define FILE_GF "\ue7db" +# define FILE_GOLO "\ue7dc" +# define FILE_GOSU "\ue7dd" +# define FILE_HARBOUR "\ue7de" +# define FILE_GRAPHQL "\ue7df" +# define FILE_GRAPHVIZ "\ue7e0" +# define FILE_HASHICORP "\ue7e1" +# define FILE_HY "\ue7e2" +# define FILE_IGORPRO "\ue7e3" +# define FILE_IO "\ue7e4" +# define FILE_IOKE "\ue7e5" +# define FILE_IDRIS "\ue7e6" +# define FILE_INFORM7 "\ue7e7" +# define FILE_INNO "\ue7e8" +# define FILE_SUBLIME "\ue7e9" +# define FILE_JUPYTER "\ue7ea" +# define FILE_KRL "\ue7eb" +# define FILE_KOTLIN "\ue7ec" +# define FILE_LABVIEW "\ue7ed" +# define FILE_LSL "\ue7ee" +# define FILE_LASSO "\ue7ef" +# define FILE_LOGTALK "\ue7f0" +# define FILE_LOOKML "\ue7f1" +# define FILE_MAKO "\ue7f2" +# define FILE_MATHEMATICA "\ue7f3" +# define FILE_MATLAB "\ue7f4" +# define FILE_E992 "\ue7f5" +# define FILE_MAX "\ue7f6" +# define FILE_MERCURY "\ue7f7" +# define FILE_MIRAH "\ue7f8" +# define FILE_MODULA2 "\ue7f9" +# define FILE_MONKEY "\ue7fa" +# define FILE_NIMROD "\ue7fb" +# define FILE_NIT "\ue7fc" +# define FILE_NIX "\ue7fd" +# define FILE_AMX "\ue7fe" +# define FILE_NETLOGO "\ue7ff" +# define FILE_NUMPY "\ue800" +# define FILE_OBJJ "\ue801" +# define FILE_OPENCL "\ue802" +# define FILE_PROCESSING "\ue803" +# define FILE_OX "\ue804" +# define FILE_SCD "\ue805" +# define FILE_STATA "\ue806" +# define FILE_STAN "\ue807" +# define FILE_SQF "\ue808" +# define FILE_SLASH "\ue809" +# define FILE_SHEN "\ue80a" +# define FILE_SELF "\ue80b" +# define FILE_SCILAB "\ue80c" +# define FILE_VHDL "\ue80d" +# define FILE_SAGE "\ue80e" +# define FILE_ROBOT "\ue80f" +# define FILE_RED "\ue810" +# define FILE_REBOL "\ue811" +# define FILE_XOJO "\ue812" +# define FILE_RDOC "\ue813" +# define FILE_RACKET "\ue814" +# define FILE_PURESCRIPT "\ue815" +# define FILE_UNO "\ue816" +# define FILE_VARNISH "\ue817" +# define FILE_PROPELLER "\ue818" +# define FILE_TURING "\ue819" +# define FILE_PONY "\ue81a" +# define FILE_POGO "\ue81b" +# define FILE_PIKE "\ue81c" +# define FILE_URWEB "\ue81d" +# define FILE_PARROT "\ue81e" +# define FILE_PAPYRUS "\ue81f" +# define FILE_PAN "\ue820" +# define FILE_OZ "\ue821" +# define FILE_OXYGENE "\ue822" +# define FILE_PROGRESS "\ue823" +# define FILE_TXL "\ue824" +# define FILE_CABAL "\ue825" +# define FILE_SYSVERILOG "\ue826" +# define FILE_PICKLE "\ue827" +# define FILE_XPAGES "\ue828" +# define FILE_XTEND "\ue829" +# define FILE_ZEPHIR "\ue82a" +# define FILE_ZIMPL "\ue82b" +# define FILE_EC "\ue82c" +# define FILE_MUPAD "\ue82d" +# define FILE_OOC "\ue82e" +# define FILE_RST "\ue82f" +# define FILE_KARMA "\ue830" +# define FILE_HACK "\ue831" +# define FILE_SHOPIFY "\ue832" +# define FILE_PUG_ALT "\ue833" +# define FILE_E9D1 "\ue834" +# define FILE_SBT "\ue835" +# define FILE_E9D3 "\ue836" +# define FILE_SCRUTINIZER "\ue837" +# define FILE_CC "\ue838" +# define FILE_BRAKEMAN "\ue839" +# define FILE_NEWRELIC "\ue83a" +# define FILE_THOR "\ue83b" +# define FILE_NUGET "\ue83c" +# define FILE_POWERSHELL "\ue83d" +# define FILE_SF "\ue83e" +# define FILE_MINECRAFT "\ue83f" +# define FILE_SQLITE "\ue840" +# define FILE_PROTRACTOR "\ue841" +# define FILE_TYPINGS "\ue842" +# define FILE_STRINGS "\ue843" +# define FILE_NANT "\ue844" +# define FILE_CSSCRIPT "\ue845" +# define FILE_CAKE "\ue846" +# define FILE_OPENOFFICE "\ue847" +# define FILE_KEYNOTE "\ue848" +# define FILE_JSX "\ue849" +# define FILE_TSX "\ue84a" +# define FILE_MODEL "\ue84b" +# define FILE_FINDER "\ue84c" +# define FILE_ACCESS "\ue84d" +# define FILE_ONENOTE "\ue84e" +# define FILE_POWERPOINT "\ue84f" +# define FILE_WORD "\ue850" +# define FILE_EXCEL "\ue851" +# define FILE_STORYIST "\ue852" +# define FILE_CSOUND "\ue853" +# define FILE_DBASE "\ue854" +# define FILE_ZBRUSH "\ue855" +# define FILE_AE "\ue856" +# define FILE_INDESIGN "\ue857" +# define FILE_PREMIERE "\ue858" +# define FILE_MAYA "\ue859" +# define FILE_E9F7 "\ue85a" +# define FILE_KHRONOS "\ue85b" +# define FILE_AUDACITY "\ue85c" +# define FILE_BLENDER "\ue85d" +# define FILE_LIGHTWAVE "\ue85e" +# define FILE_FBX "\ue85f" +# define FILE_E9FD "\ue860" +# define FILE_TYPEDOC "\ue861" +# define FILE_ALPINE "\ue862" +# define FILE_YUI "\ue863" +# define FILE_EA01 "\ue864" +# define FILE_EA02 "\ue865" +# define FILE_EA03 "\ue866" +# define FILE_NORMALIZE "\ue867" +# define FILE_NEKO "\ue868" +# define FILE_MATHJAX "\ue869" +# define FILE_LEAFLET "\ue86a" +# define FILE_GDB "\ue86b" +# define FILE_FUELUX "\ue86c" +# define FILE_EQ "\ue86d" +# define FILE_CHARTJS "\ue86e" +# define FILE_EA0C "\ue86f" +# define FILE_EA0D "\ue870" +# define FILE_EA0E "\ue871" +# define FILE_ESLINT "\ue872" +# define FILE_D3 "\ue873" +# define FILE_CORDOVA "\ue874" +# define FILE_CIRCLECI "\ue875" +# define FILE_PUG "\ue876" +# define FILE_POWERBUILDER "\ue877" +# define FILE_DYLIB "\ue878" +# define FILE_REXX "\ue879" +# define FILE_SVN "\ue87a" +# define FILE_MRUBY "\ue87b" +# define FILE_WERCKER "\ue87c" +# define FILE_YARN "\ue87d" +# define FILE_EDITORCONFIG "\ue87e" +# define FILE_SNYK "\ue87f" +# define FILE_REASON "\ue880" +# define FILE_NSIS "\ue881" +# define FILE_V8 "\ue882" +# define FILE_ROLLUP "\ue883" +# define FILE_EA21 "\ue884" +# define FILE_EA22 "\ue885" +# define FILE_EA23 "\ue886" +# define FILE_RASCAL "\ue887" +# define FILE_GN "\ue888" +# define FILE_NODEMON "\ue889" +# define FILE_ELECTRON "\ue88a" +# define FILE_1C_ALT "\ue88b" +# define FILE_SWAGGER "\ue88c" +# define FILE_BITHOUND "\ue88d" +# define FILE_POLYMER "\ue88e" +# define FILE_PLATFORMIO "\ue88f" +# define FILE_SHIPPABLE "\ue890" +# define FILE_EA2E "\ue891" +# define FILE_SEQUELIZE "\ue892" +# define FILE_REDUX "\ue893" +# define FILE_RSPEC "\ue894" +# define FILE_PHPUNIT "\ue895" +# define FILE_OCTAVE "\ue896" +# define FILE_NUCLIDE "\ue897" +# define FILE_INFOPATH "\ue898" +# define FILE_LIME "\ue899" +# define FILE_LERNA "\ue89a" +# define FILE_KITCHENCI "\ue89b" +# define FILE_JEST "\ue89c" +# define FILE_JASMINE "\ue89d" +# define FILE_HAXEDEVELOP "\ue89e" +# define FILE_GITLAB "\ue89f" +# define FILE_DRONE "\ue8a0" +# define FILE_VIRTUALBOX "\ue8a1" +# define FILE_DOCLETS "\ue8a2" +# define FILE_DELPHI "\ue8a3" +# define FILE_CODEKIT "\ue8a4" +# define FILE_CHEF "\ue8a5" +# define FILE_CAKEPHP "\ue8a6" +# define FILE_COBOL "\ue8a7" +# define FILE_BUNDLER "\ue8a8" +# define FILE_BUCK "\ue8a9" +# define FILE_BRUNCH "\ue8aa" +# define FILE_AURELIA "\ue8ab" +# define FILE_VMWARE "\ue8ac" +# define FILE_RHINO "\ue8ad" +# define FILE_EJS "\ue8ae" +# define FILE_KICAD "\ue8af" +# define FILE_HOPLON "\ue8b0" +# define FILE_ABIF "\ue8b1" +# define FILE_WATCHMAN "\ue8b2" +# define FILE_P4 "\ue8b3" +# define FILE_NANOC "\ue8b4" +# define FILE_MIRANDA "\ue8b5" +# define FILE_MINIZINC "\ue8b6" +# define FILE_MESON "\ue8b7" +# define FILE_JISON "\ue8b8" +# define FILE_FRANCA "\ue8b9" +# define FILE_DEVICETREE "\ue8ba" +# define FILE_CADDY "\ue8bb" +# define FILE_BEM "\ue8bc" +# define FILE_BAZEL "\ue8bd" +# define FILE_ANGELSCRIPT "\ue8be" +# define FILE_ESDOC "\ue8bf" +# define FILE_TWINE "\ue8c0" +# define FILE_SQUARESPACE "\ue8c1" +# define FILE_PHOENIX "\ue8c2" +# define FILE_TEST_DIR "\ue8c3" +# define FILE_WEBPACK "\ue8c4" +# define FILE_TEST_COFFEE "\ue8c5" +# define FILE_TEST_GENERIC "\ue8c6" +# define FILE_TEST_JS "\ue8c7" +# define FILE_TEST_PERL "\ue8c8" +# define FILE_TEST_PYTHON "\ue8c9" +# define FILE_TEST_REACT "\ue8ca" +# define FILE_TEST_RUBY "\ue8cb" +# define FILE_TEST_TS "\ue8cc" +# define FILE_CODESHIP "\ue8cd" +# define FILE_NXC "\ue8ce" +# define FILE_BROTLI "\ue8cf" +# define FILE_PROSELINT "\ue8d0" +# define FILE_BINTRAY "\ue8d1" +# define FILE_MJML "\ue8d2" +# define FILE_WASM "\ue8d3" +# define FILE_EA71 "\ue8d4" +# define FILE_NASM "\ue8d5" +# define FILE_EA73 "\ue8d6" +# define FILE_PEG "\ue8d7" +# define FILE_JOLIE "\ue8d8" +# define FILE_NANO "\ue8d9" +# define FILE_XAMARIN "\ue8da" +# define FILE_F012 "\ue8db" +# define FILE_TAG "\ue8dc" +# define FILE_CUCUMBER "\ue8dd" +# define FILE_VIDEO "\ue8de" +# define FILE_CONFIG "\ue8df" +# define FILE_DASHBOARD "\ue8e0" +# define FILE_PUPPET "\ue8e1" +# define FILE_TERMINAL "\ue8e2" +# define FILE_MARKDOWNLINT "\ue8e3" +# define FILE_REACT "\ue8e4" +# define FILE_F101 "\ue8e5" +# define FILE_ELM "\ue8e6" +# define FILE_BOOT "\ue8e7" +# define FILE_CLJS "\ue8e8" +# define FILE_LEIN "\ue8e9" +# define FILE_DOCKER "\ue8ea" +# define FILE_PHP "\ue8eb" +# define FILE_IONIC "\ue8ec" +# define FILE_HAML "\ue8ed" +# define FILE_F17B "\ue8ee" +# define FILE_FF "\ue8ef" +# define FILE_U1F3C1 "\ue8f0" +# define FILE_TERN "\ue8f1" +# define FILE_DEFAULT "\ue8f2" +# define FILE_SIGILS "\ue8f3" +# define FILE_NGINX "\ue8f4" +# define WEATHER_DAY_CLOUDY_GUSTS "\ue8f5" +# define WEATHER_DAY_CLOUDY_WINDY "\ue8f6" +# define WEATHER_DAY_CLOUDY "\ue8f7" +# define WEATHER_DAY_FOG "\ue8f8" +# define WEATHER_DAY_HAIL "\ue8f9" +# define WEATHER_DAY_LIGHTNING "\ue8fa" +# define WEATHER_DAY_RAIN_MIX "\ue8fb" +# define WEATHER_DAY_RAIN_WIND "\ue8fc" +# define WEATHER_DAY_RAIN "\ue8fd" +# define WEATHER_DAY_SHOWERS "\ue8fe" +# define WEATHER_DAY_SNOW "\ue8ff" +# define WEATHER_DAY_SPRINKLE "\ue900" +# define WEATHER_DAY_SUNNY_OVERCAST "\ue901" +# define WEATHER_DAY_SUNNY "\ue902" +# define WEATHER_DAY_STORM_SHOWERS "\ue903" +# define WEATHER_DAY_THUNDERSTORM "\ue904" +# define WEATHER_CLOUDY_GUSTS "\ue905" +# define WEATHER_CLOUDY_WINDY "\ue906" +# define WEATHER_CLOUDY "\ue907" +# define WEATHER_FOG "\ue908" +# define WEATHER_HAIL "\ue909" +# define WEATHER_LIGHTNING "\ue90a" +# define WEATHER_RAIN_MIX "\ue90b" +# define WEATHER_RAIN_WIND "\ue90c" +# define WEATHER_RAIN "\ue90d" +# define WEATHER_SHOWERS "\ue90e" +# define WEATHER_SNOW "\ue90f" +# define WEATHER_SPRINKLE "\ue910" +# define WEATHER_STORM_SHOWERS "\ue911" +# define WEATHER_THUNDERSTORM "\ue912" +# define WEATHER_WINDY "\ue913" +# define WEATHER_NIGHT_ALT_CLOUDY_GUSTS "\ue914" +# define WEATHER_NIGHT_ALT_CLOUDY_WINDY "\ue915" +# define WEATHER_NIGHT_ALT_HAIL "\ue916" +# define WEATHER_NIGHT_ALT_LIGHTNING "\ue917" +# define WEATHER_NIGHT_ALT_RAIN_MIX "\ue918" +# define WEATHER_NIGHT_ALT_RAIN_WIND "\ue919" +# define WEATHER_NIGHT_ALT_RAIN "\ue91a" +# define WEATHER_NIGHT_ALT_SHOWERS "\ue91b" +# define WEATHER_NIGHT_ALT_SNOW "\ue91c" +# define WEATHER_NIGHT_ALT_SPRINKLE "\ue91d" +# define WEATHER_NIGHT_ALT_STORM_SHOWERS "\ue91e" +# define WEATHER_NIGHT_ALT_THUNDERSTORM "\ue91f" +# define WEATHER_NIGHT_CLEAR "\ue920" +# define WEATHER_NIGHT_CLOUDY_GUSTS "\ue921" +# define WEATHER_NIGHT_CLOUDY_WINDY "\ue922" +# define WEATHER_NIGHT_CLOUDY "\ue923" +# define WEATHER_NIGHT_HAIL "\ue924" +# define WEATHER_NIGHT_LIGHTNING "\ue925" +# define WEATHER_NIGHT_RAIN_MIX "\ue926" +# define WEATHER_NIGHT_RAIN_WIND "\ue927" +# define WEATHER_NIGHT_RAIN "\ue928" +# define WEATHER_NIGHT_SHOWERS "\ue929" +# define WEATHER_NIGHT_SNOW "\ue92a" +# define WEATHER_NIGHT_SPRINKLE "\ue92b" +# define WEATHER_NIGHT_STORM_SHOWERS "\ue92c" +# define WEATHER_NIGHT_THUNDERSTORM "\ue92d" +# define WEATHER_CELSIUS "\ue92e" +# define WEATHER_CLOUD_DOWN "\ue92f" +# define WEATHER_CLOUD_REFRESH "\ue930" +# define WEATHER_CLOUD_UP "\ue931" +# define WEATHER_CLOUD "\ue932" +# define WEATHER_DEGREES "\ue933" +# define WEATHER_DIRECTION_DOWN_LEFT "\ue934" +# define WEATHER_DIRECTION_DOWN "\ue935" +# define WEATHER_FAHRENHEIT "\ue936" +# define WEATHER_HORIZON_ALT "\ue937" +# define WEATHER_HORIZON "\ue938" +# define WEATHER_DIRECTION_LEFT "\ue939" +# define WEATHER_F049 "\ue93a" +# define WEATHER_NIGHT_FOG "\ue93b" +# define WEATHER_REFRESH_ALT "\ue93c" +# define WEATHER_REFRESH "\ue93d" +# define WEATHER_DIRECTION_RIGHT "\ue93e" +# define WEATHER_RAINDROPS "\ue93f" +# define WEATHER_STRONG_WIND "\ue940" +# define WEATHER_SUNRISE "\ue941" +# define WEATHER_SUNSET "\ue942" +# define WEATHER_THERMOMETER_EXTERIOR "\ue943" +# define WEATHER_THERMOMETER_INTERNAL "\ue944" +# define WEATHER_THERMOMETER "\ue945" +# define WEATHER_TORNADO "\ue946" +# define WEATHER_DIRECTION_UP_RIGHT "\ue947" +# define WEATHER_DIRECTION_UP "\ue948" +# define WEATHER_F059 "\ue949" +# define WEATHER_F05A "\ue94a" +# define WEATHER_F05B "\ue94b" +# define WEATHER_F05C "\ue94c" +# define WEATHER_F05D "\ue94d" +# define WEATHER_F05E "\ue94e" +# define WEATHER_F060 "\ue94f" +# define WEATHER_F061 "\ue950" +# define WEATHER_SMOKE "\ue951" +# define WEATHER_DUST "\ue952" +# define WEATHER_SNOW_WIND "\ue953" +# define WEATHER_DAY_SNOW_WIND "\ue954" +# define WEATHER_NIGHT_SNOW_WIND "\ue955" +# define WEATHER_NIGHT_ALT_SNOW_WIND "\ue956" +# define WEATHER_DAY_SLEET_STORM "\ue957" +# define WEATHER_NIGHT_SLEET_STORM "\ue958" +# define WEATHER_NIGHT_ALT_SLEET_STORM "\ue959" +# define WEATHER_DAY_SNOW_THUNDERSTORM "\ue95a" +# define WEATHER_NIGHT_SNOW_THUNDERSTORM "\ue95b" +# define WEATHER_NIGHT_ALT_SNOW_THUNDERSTORM "\ue95c" +# define WEATHER_SOLAR_ECLIPSE "\ue95d" +# define WEATHER_LUNAR_ECLIPSE "\ue95e" +# define WEATHER_METEOR "\ue95f" +# define WEATHER_HOT "\ue960" +# define WEATHER_HURRICANE "\ue961" +# define WEATHER_SMOG "\ue962" +# define WEATHER_ALIEN "\ue963" +# define WEATHER_SNOWFLAKE_COLD "\ue964" +# define WEATHER_STARS "\ue965" +# define WEATHER_RAINDROP "\ue966" +# define WEATHER_BAROMETER "\ue967" +# define WEATHER_HUMIDITY "\ue968" +# define WEATHER_NA "\ue969" +# define WEATHER_FLOOD "\ue96a" +# define WEATHER_DAY_CLOUDY_HIGH "\ue96b" +# define WEATHER_NIGHT_ALT_CLOUDY_HIGH "\ue96c" +# define WEATHER_NIGHT_CLOUDY_HIGH "\ue96d" +# define WEATHER_NIGHT_ALT_PARTLY_CLOUDY "\ue96e" +# define WEATHER_SANDSTORM "\ue96f" +# define WEATHER_NIGHT_PARTLY_CLOUDY "\ue970" +# define WEATHER_UMBRELLA "\ue971" +# define WEATHER_DAY_WINDY "\ue972" +# define WEATHER_NIGHT_ALT_CLOUDY "\ue973" +# define WEATHER_DIRECTION_UP_LEFT "\ue974" +# define WEATHER_DIRECTION_DOWN_RIGHT "\ue975" +# define WEATHER_TIME_12 "\ue976" +# define WEATHER_TIME_1 "\ue977" +# define WEATHER_TIME_2 "\ue978" +# define WEATHER_TIME_3 "\ue979" +# define WEATHER_TIME_4 "\ue97a" +# define WEATHER_TIME_5 "\ue97b" +# define WEATHER_TIME_6 "\ue97c" +# define WEATHER_TIME_7 "\ue97d" +# define WEATHER_TIME_8 "\ue97e" +# define WEATHER_TIME_9 "\ue97f" +# define WEATHER_TIME_10 "\ue980" +# define WEATHER_TIME_11 "\ue981" +# define WEATHER_MOON_NEW "\ue982" +# define WEATHER_MOON_WAXING_CRESCENT_1 "\ue983" +# define WEATHER_MOON_WAXING_CRESCENT_2 "\ue984" +# define WEATHER_MOON_WAXING_CRESCENT_3 "\ue985" +# define WEATHER_MOON_WAXING_CRESCENT_4 "\ue986" +# define WEATHER_MOON_WAXING_CRESCENT_5 "\ue987" +# define WEATHER_MOON_WAXING_CRESCENT_6 "\ue988" +# define WEATHER_MOON_FIRST_QUARTER "\ue989" +# define WEATHER_MOON_WAXING_GIBBOUS_1 "\ue98a" +# define WEATHER_MOON_WAXING_GIBBOUS_2 "\ue98b" +# define WEATHER_MOON_WAXING_GIBBOUS_3 "\ue98c" +# define WEATHER_MOON_WAXING_GIBBOUS_4 "\ue98d" +# define WEATHER_MOON_WAXING_GIBBOUS_5 "\ue98e" +# define WEATHER_MOON_WAXING_GIBBOUS_6 "\ue98f" +# define WEATHER_MOON_FULL "\ue990" +# define WEATHER_MOON_WANING_GIBBOUS_1 "\ue991" +# define WEATHER_MOON_WANING_GIBBOUS_2 "\ue992" +# define WEATHER_MOON_WANING_GIBBOUS_3 "\ue993" +# define WEATHER_MOON_WANING_GIBBOUS_4 "\ue994" +# define WEATHER_MOON_WANING_GIBBOUS_5 "\ue995" +# define WEATHER_MOON_WANING_GIBBOUS_6 "\ue996" +# define WEATHER_MOON_THIRD_QUARTER "\ue997" +# define WEATHER_MOON_WANING_CRESCENT_1 "\ue998" +# define WEATHER_MOON_WANING_CRESCENT_2 "\ue999" +# define WEATHER_MOON_WANING_CRESCENT_3 "\ue99a" +# define WEATHER_MOON_WANING_CRESCENT_4 "\ue99b" +# define WEATHER_MOON_WANING_CRESCENT_5 "\ue99c" +# define WEATHER_MOON_WANING_CRESCENT_6 "\ue99d" +# define WEATHER_WIND_DIRECTION "\ue99e" +# define WEATHER_DAY_SLEET "\ue99f" +# define WEATHER_NIGHT_SLEET "\ue9a0" +# define WEATHER_NIGHT_ALT_SLEET "\ue9a1" +# define WEATHER_SLEET "\ue9a2" +# define WEATHER_DAY_HAZE "\ue9a3" +# define WEATHER_WIND_BEAUFORT_0 "\ue9a4" +# define WEATHER_WIND_BEAUFORT_1 "\ue9a5" +# define WEATHER_WIND_BEAUFORT_2 "\ue9a6" +# define WEATHER_WIND_BEAUFORT_3 "\ue9a7" +# define WEATHER_WIND_BEAUFORT_4 "\ue9a8" +# define WEATHER_WIND_BEAUFORT_5 "\ue9a9" +# define WEATHER_WIND_BEAUFORT_6 "\ue9aa" +# define WEATHER_WIND_BEAUFORT_7 "\ue9ab" +# define WEATHER_WIND_BEAUFORT_8 "\ue9ac" +# define WEATHER_WIND_BEAUFORT_9 "\ue9ad" +# define WEATHER_WIND_BEAUFORT_10 "\ue9ae" +# define WEATHER_WIND_BEAUFORT_11 "\ue9af" +# define WEATHER_WIND_BEAUFORT_12 "\ue9b0" +# define WEATHER_DAY_LIGHT_WIND "\ue9b1" +# define WEATHER_TSUNAMI "\ue9b2" +# define WEATHER_EARTHQUAKE "\ue9b3" +# define WEATHER_FIRE "\ue9b4" +# define WEATHER_VOLCANO "\ue9b5" +# define WEATHER_MOONRISE "\ue9b6" +# define WEATHER_MOONSET "\ue9b7" +# define WEATHER_TRAIN "\ue9b8" +# define WEATHER_SMALL_CRAFT_ADVISORY "\ue9b9" +# define WEATHER_GALE_WARNING "\ue9ba" +# define WEATHER_STORM_WARNING "\ue9bb" +# define WEATHER_HURRICANE_WARNING "\ue9bc" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_1 "\ue9bd" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_2 "\ue9be" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_3 "\ue9bf" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_4 "\ue9c0" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_5 "\ue9c1" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_6 "\ue9c2" +# define WEATHER_MOON_ALT_FIRST_QUARTER "\ue9c3" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_1 "\ue9c4" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_2 "\ue9c5" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_3 "\ue9c6" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_4 "\ue9c7" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_5 "\ue9c8" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_6 "\ue9c9" +# define WEATHER_MOON_ALT_FULL "\ue9ca" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_1 "\ue9cb" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_2 "\ue9cc" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_3 "\ue9cd" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_4 "\ue9ce" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_5 "\ue9cf" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_6 "\ue9d0" +# define WEATHER_MOON_ALT_THIRD_QUARTER "\ue9d1" +# define WEATHER_MOON_ALT_WANING_CRESCENT_1 "\ue9d2" +# define WEATHER_MOON_ALT_WANING_CRESCENT_2 "\ue9d3" +# define WEATHER_MOON_ALT_WANING_CRESCENT_3 "\ue9d4" +# define WEATHER_MOON_ALT_WANING_CRESCENT_4 "\ue9d5" +# define WEATHER_MOON_ALT_WANING_CRESCENT_5 "\ue9d6" +# define WEATHER_MOON_ALT_WANING_CRESCENT_6 "\ue9d7" +# define WEATHER_MOON_ALT_NEW "\ue9d8" +# define LINUX_ARCHLINUX "\ue9d9" +# define LINUX_CENTOS "\ue9da" +# define LINUX_DEBIAN "\ue9db" +# define LINUX_FEDORA "\ue9dc" +# define LINUX_LINUXMINT "\ue9dd" +# define LINUX_LINUXMINT_INVERSE "\ue9de" +# define LINUX_MAGEIA "\ue9df" +# define LINUX_MANDRIVA "\ue9e0" +# define LINUX_OPENSUSE "\ue9e1" +# define LINUX_REDHAT "\ue9e2" +# define LINUX_SLACKWARE "\ue9e3" +# define LINUX_SLACKWARE_INVERSE "\ue9e4" +# define LINUX_UBUNTU "\ue9e5" +# define LINUX_UBUNTU_INVERSE "\ue9e6" +# define LINUX_FREEBSD "\ue9e7" +# define LINUX_COREOS "\ue9e8" +# define LINUX_GENTOO "\ue9e9" +# define LINUX_ELEMENTARY "\ue9ea" +# define LINUX_FEDORA_INVERSE "\ue9eb" +# define LINUX_SABAYON "\ue9ec" +# define LINUX_AOSC "\ue9ed" +# define LINUX_NIXOS "\ue9ee" +# define LINUX_TUX "\ue9ef" +# define LINUX_RASPBERRY_PI "\ue9f0" +# define LINUX_MANJARO "\ue9f1" +# define LINUX_APPLE "\ue9f2" +# define LINUX_DOCKER "\ue9f3" +# define LINUX_ALPINE "\ue9f4" +# define MYICONS_0001 "\ue9f5" +# define MYICONS_0002 "\ue9f6" +# define MYICONS_0003 "\ue9f7" +# define MYICONS_0004 "\ue9f8" +# define MYICONS_0005 "\ue9f9" +# define MYICONS_0006 "\ue9fa" +# define MYICONS_0007 "\ue9fb" +# define MYICONS_0008 "\ue9fc" +# define MYICONS_0009 "\ue9fd" +# define MYICONS_000A "\ue9fe" +# define MYICONS_000B "\ue9ff" +# define MYICONS_000D "\uea00" +# define MYICONS_000E "\uea01" +# define MYICONS_0010 "\uea02" +# define MYICONS_0011 "\uea03" +# define MYICONS_0013 "\uea04" +# define MYICONS_0014 "\uea05" +# define MYICONS_ARCH_LINUX_ARROW "\uea06" +# define DEV_BING_SMALL "\uea07" +# define DEV_CSS_TRICKS "\uea08" +# define DEV_GIT "\uea09" +# define DEV_BITBUCKET "\uea0a" +# define DEV_MYSQL "\uea0b" +# define DEV_STREAMLINE "\uea0c" +# define DEV_DATABASE "\uea0d" +# define DEV_DROPBOX "\uea0e" +# define DEV_GITHUB_ALT "\uea0f" +# define DEV_GITHUB_BADGE "\uea10" +# define DEV_GITHUB "\uea11" +# define DEV_WORDPRESS "\uea12" +# define DEV_VISUALSTUDIO "\uea13" +# define DEV_JEKYLL_SMALL "\uea14" +# define DEV_ANDROID "\uea15" +# define DEV_WINDOWS "\uea16" +# define DEV_STACKOVERFLOW "\uea17" +# define DEV_APPLE "\uea18" +# define DEV_LINUX "\uea19" +# define DEV_APPSTORE "\uea1a" +# define DEV_GHOST_SMALL "\uea1b" +# define DEV_YAHOO "\uea1c" +# define DEV_CODEPEN "\uea1d" +# define DEV_GITHUB_FULL "\uea1e" +# define DEV_NODEJS_SMALL "\uea1f" +# define DEV_NODEJS "\uea20" +# define DEV_HACKERNEWS "\uea21" +# define DEV_EMBER "\uea22" +# define DEV_DOJO "\uea23" +# define DEV_DJANGO "\uea24" +# define DEV_NPM "\uea25" +# define DEV_GHOST "\uea26" +# define DEV_MODERNIZR "\uea27" +# define DEV_UNITY_SMALL "\uea28" +# define DEV_RASPBERRY_PI "\uea29" +# define DEV_BLACKBERRY "\uea2a" +# define DEV_GO "\uea2b" +# define DEV_GIT_BRANCH "\uea2c" +# define DEV_GIT_PULL_REQUEST "\uea2d" +# define DEV_GIT_MERGE "\uea2e" +# define DEV_GIT_COMPARE "\uea2f" +# define DEV_GIT_COMMIT "\uea30" +# define DEV_CSSDECK "\uea31" +# define DEV_YAHOO_SMALL "\uea32" +# define DEV_TECHCRUNCH "\uea33" +# define DEV_SMASHING_MAGAZINE "\uea34" +# define DEV_NETMAGAZINE "\uea35" +# define DEV_CODROPS "\uea36" +# define DEV_PHONEGAP "\uea37" +# define DEV_GOOGLE_DRIVE "\uea38" +# define DEV_HTML5_MULTIMEDIA "\uea39" +# define DEV_HTML5_DEVICE_ACCESS "\uea3a" +# define DEV_HTML5_CONNECTIVITY "\uea3b" +# define DEV_HTML5_3D_EFFECTS "\uea3c" +# define DEV_HTML5 "\uea3d" +# define DEV_SCALA "\uea3e" +# define DEV_JAVA "\uea3f" +# define DEV_RUBY "\uea40" +# define DEV_UBUNTU "\uea41" +# define DEV_RUBY_ON_RAILS "\uea42" +# define DEV_PYTHON "\uea43" +# define DEV_PHP "\uea44" +# define DEV_MARKDOWN "\uea45" +# define DEV_LARAVEL "\uea46" +# define DEV_MAGENTO "\uea47" +# define DEV_JOOMLA "\uea48" +# define DEV_DRUPAL "\uea49" +# define DEV_CHROME "\uea4a" +# define DEV_IE "\uea4b" +# define DEV_FIREFOX "\uea4c" +# define DEV_OPERA "\uea4d" +# define DEV_BOOTSTRAP "\uea4e" +# define DEV_SAFARI "\uea4f" +# define DEV_CSS3 "\uea50" +# define DEV_CSS3_FULL "\uea51" +# define DEV_SASS "\uea52" +# define DEV_GRUNT "\uea53" +# define DEV_BOWER "\uea54" +# define DEV_JAVASCRIPT "\uea55" +# define DEV_JAVASCRIPT_SHIELD "\uea56" +# define DEV_JQUERY "\uea57" +# define DEV_COFFEESCRIPT "\uea58" +# define DEV_BACKBONE "\uea59" +# define DEV_ANGULAR "\uea5a" +# define DEV_JQUERY_UI "\uea5b" +# define DEV_SWIFT "\uea5c" +# define DEV_SYMFONY "\uea5d" +# define DEV_SYMFONY_BADGE "\uea5e" +# define DEV_LESS "\uea5f" +# define DEV_STYLUS "\uea60" +# define DEV_TRELLO "\uea61" +# define DEV_ATLASSIAN "\uea62" +# define DEV_JIRA "\uea63" +# define DEV_ENVATO "\uea64" +# define DEV_SNAP_SVG "\uea65" +# define DEV_RAPHAEL "\uea66" +# define DEV_GOOGLE_ANALYTICS "\uea67" +# define DEV_COMPASS "\uea68" +# define DEV_ONEDRIVE "\uea69" +# define DEV_GULP "\uea6a" +# define DEV_ATOM "\uea6b" +# define DEV_CISCO "\uea6c" +# define DEV_NANCY "\uea6d" +# define DEV_JENKINS "\uea6e" +# define DEV_CLOJURE "\uea6f" +# define DEV_PERL "\uea70" +# define DEV_CLOJURE_ALT "\uea71" +# define DEV_CELLULOID "\uea72" +# define DEV_W3C "\uea73" +# define DEV_REDIS "\uea74" +# define DEV_POSTGRESQL "\uea75" +# define DEV_WEBPLATFORM "\uea76" +# define DEV_REQUIREJS "\uea77" +# define DEV_OPENSOURCE "\uea78" +# define DEV_TYPO3 "\uea79" +# define DEV_UIKIT "\uea7a" +# define DEV_DOCTRINE "\uea7b" +# define DEV_GROOVY "\uea7c" +# define DEV_NGINX "\uea7d" +# define DEV_HASKELL "\uea7e" +# define DEV_ZEND "\uea7f" +# define DEV_GNU "\uea80" +# define DEV_YEOMAN "\uea81" +# define DEV_HEROKU "\uea82" +# define DEV_MSQL_SERVER "\uea83" +# define DEV_DEBIAN "\uea84" +# define DEV_TRAVIS "\uea85" +# define DEV_DOTNET "\uea86" +# define DEV_CODEIGNITER "\uea87" +# define DEV_JAVASCRIPT_BADGE "\uea88" +# define DEV_YII "\uea89" +# define DEV_COMPOSER "\uea8a" +# define DEV_KRAKENJS_BADGE "\uea8b" +# define DEV_KRAKENJS "\uea8c" +# define DEV_MOZILLA "\uea8d" +# define DEV_FIREBASE "\uea8e" +# define DEV_SIZZLEJS "\uea8f" +# define DEV_CREATIVECOMMONS "\uea90" +# define DEV_CREATIVECOMMONS_BADGE "\uea91" +# define DEV_MITLICENCE "\uea92" +# define DEV_SENCHATOUCH "\uea93" +# define DEV_BUGSENSE "\uea94" +# define DEV_EXTJS "\uea95" +# define DEV_MOOTOOLS_BADGE "\uea96" +# define DEV_MOOTOOLS "\uea97" +# define DEV_RUBY_ROUGH "\uea98" +# define DEV_KOMODO "\uea99" +# define DEV_CODA "\uea9a" +# define DEV_BINTRAY "\uea9b" +# define DEV_TERMINAL "\uea9c" +# define DEV_CODE "\uea9d" +# define DEV_RESPONSIVE "\uea9e" +# define DEV_DART "\uea9f" +# define DEV_APTANA "\ueaa0" +# define DEV_MAILCHIMP "\ueaa1" +# define DEV_NETBEANS "\ueaa2" +# define DEV_DREAMWEAVER "\ueaa3" +# define DEV_BRACKETS "\ueaa4" +# define DEV_ECLIPSE "\ueaa5" +# define DEV_CLOUD9 "\ueaa6" +# define DEV_SCRUM "\ueaa7" +# define DEV_PROLOG "\ueaa8" +# define DEV_TERMINAL_BADGE "\ueaa9" +# define DEV_CODE_BADGE "\ueaaa" +# define DEV_MONGODB "\ueaab" +# define DEV_METEOR "\ueaac" +# define DEV_METEORFULL "\ueaad" +# define DEV_FSHARP "\ueaae" +# define DEV_RUST "\ueaaf" +# define DEV_IONIC "\ueab0" +# define DEV_SUBLIME "\ueab1" +# define DEV_APPCELERATOR "\ueab2" +# define DEV_ASTERISK "\ueab3" +# define DEV_AWS "\ueab4" +# define DEV_DIGITAL_OCEAN "\ueab5" +# define DEV_DLANG "\ueab6" +# define DEV_DOCKER "\ueab7" +# define DEV_ERLANG "\ueab8" +# define DEV_GOOGLE_CLOUD_PLATFORM "\ueab9" +# define DEV_GRAILS "\ueaba" +# define DEV_ILLUSTRATOR "\ueabb" +# define DEV_INTELLIJ "\ueabc" +# define DEV_MATERIALIZECSS "\ueabd" +# define DEV_OPENSHIFT "\ueabe" +# define DEV_PHOTOSHOP "\ueabf" +# define DEV_RACKSPACE "\ueac0" +# define DEV_REACT "\ueac1" +# define DEV_REDHAT "\ueac2" +# define DEV_SCRIPTCS "\ueac3" +# define DEV_E6BD "\ueac4" +# define DEV_E6BE "\ueac5" +# define DEV_E6BF "\ueac6" +# define DEV_E6C0 "\ueac7" +# define DEV_E6C1 "\ueac8" +# define DEV_E6C2 "\ueac9" +# define DEV_E6C3 "\ueaca" +# define DEV_SQLLITE "\ueacb" +# define DEV_VIM "\ueacc" +# define POM_CLEAN_CODE "\ueacd" +# define POM_POMODORO_DONE "\ueace" +# define POM_POMODORO_ESTIMATED "\ueacf" +# define POM_POMODORO_TICKING "\uead0" +# define POM_POMODORO_SQUASHED "\uead1" +# define POM_SHORT_PAUSE "\uead2" +# define POM_LONG_PAUSE "\uead3" +# define POM_AWAY "\uead4" +# define POM_PAIR_PROGRAMMING "\uead5" +# define POM_INTERNAL_INTERRUPTION "\uead6" +# define POM_EXTERNAL_INTERRUPTION "\uead7" +# define LINEA_ARROWS_ANTICLOCKWISE "\uead8" +# define LINEA_ARROWS_ANTICLOCKWISE_DASHED "\uead9" +# define LINEA_ARROWS_BUTTON_DOWN "\ueada" +# define LINEA_ARROWS_BUTTON_OFF "\ueadb" +# define LINEA_ARROWS_BUTTON_ON "\ueadc" +# define LINEA_ARROWS_BUTTON_UP "\ueadd" +# define LINEA_ARROWS_CHECK "\ueade" +# define LINEA_ARROWS_CIRCLE_CHECK "\ueadf" +# define LINEA_ARROWS_CIRCLE_DOWN "\ueae0" +# define LINEA_ARROWS_CIRCLE_DOWNLEFT "\ueae1" +# define LINEA_ARROWS_CIRCLE_DOWNRIGHT "\ueae2" +# define LINEA_ARROWS_CIRCLE_LEFT "\ueae3" +# define LINEA_ARROWS_CIRCLE_MINUS "\ueae4" +# define LINEA_ARROWS_CIRCLE_PLUS "\ueae5" +# define LINEA_ARROWS_CIRCLE_REMOVE "\ueae6" +# define LINEA_ARROWS_CIRCLE_RIGHT "\ueae7" +# define LINEA_ARROWS_CIRCLE_UP "\ueae8" +# define LINEA_ARROWS_CIRCLE_UPLEFT "\ueae9" +# define LINEA_ARROWS_CIRCLE_UPRIGHT "\ueaea" +# define LINEA_ARROWS_CLOCKWISE "\ueaeb" +# define LINEA_ARROWS_CLOCKWISE_DASHED "\ueaec" +# define LINEA_ARROWS_COMPRESS "\ueaed" +# define LINEA_ARROWS_DENY "\ueaee" +# define LINEA_ARROWS_DIAGONAL "\ueaef" +# define LINEA_ARROWS_DIAGONAL2 "\ueaf0" +# define LINEA_ARROWS_DOWN "\ueaf1" +# define LINEA_ARROWS_DOWN_DOUBLE "\ueaf2" +# define LINEA_ARROWS_DOWNLEFT "\ueaf3" +# define LINEA_ARROWS_DOWNRIGHT "\ueaf4" +# define LINEA_ARROWS_DRAG_DOWN "\ueaf5" +# define LINEA_ARROWS_DRAG_DOWN_DASHED "\ueaf6" +# define LINEA_ARROWS_DRAG_HORIZ "\ueaf7" +# define LINEA_ARROWS_DRAG_LEFT "\ueaf8" +# define LINEA_ARROWS_DRAG_LEFT_DASHED "\ueaf9" +# define LINEA_ARROWS_DRAG_RIGHT "\ueafa" +# define LINEA_ARROWS_DRAG_RIGHT_DASHED "\ueafb" +# define LINEA_ARROWS_DRAG_UP "\ueafc" +# define LINEA_ARROWS_DRAG_UP_DASHED "\ueafd" +# define LINEA_ARROWS_DRAG_VERT "\ueafe" +# define LINEA_ARROWS_EXCLAMATION "\ueaff" +# define LINEA_ARROWS_EXPAND "\ueb00" +# define LINEA_ARROWS_EXPAND_DIAGONAL1 "\ueb01" +# define LINEA_ARROWS_EXPAND_HORIZONTAL1 "\ueb02" +# define LINEA_ARROWS_EXPAND_VERTICAL1 "\ueb03" +# define LINEA_ARROWS_FIT_HORIZONTAL "\ueb04" +# define LINEA_ARROWS_FIT_VERTICAL "\ueb05" +# define LINEA_ARROWS_GLIDE "\ueb06" +# define LINEA_ARROWS_GLIDE_HORIZONTAL "\ueb07" +# define LINEA_ARROWS_GLIDE_VERTICAL "\ueb08" +# define LINEA_ARROWS_HAMBURGER1 "\ueb09" +# define LINEA_ARROWS_HAMBURGER_2 "\ueb0a" +# define LINEA_ARROWS_HORIZONTAL "\ueb0b" +# define LINEA_ARROWS_INFO "\ueb0c" +# define LINEA_ARROWS_KEYBOARD_ALT "\ueb0d" +# define LINEA_ARROWS_KEYBOARD_CMD "\ueb0e" +# define LINEA_ARROWS_KEYBOARD_DELETE "\ueb0f" +# define LINEA_ARROWS_KEYBOARD_DOWN "\ueb10" +# define LINEA_ARROWS_KEYBOARD_LEFT "\ueb11" +# define LINEA_ARROWS_KEYBOARD_RETURN "\ueb12" +# define LINEA_ARROWS_KEYBOARD_RIGHT "\ueb13" +# define LINEA_ARROWS_KEYBOARD_SHIFT "\ueb14" +# define LINEA_ARROWS_KEYBOARD_TAB "\ueb15" +# define LINEA_ARROWS_KEYBOARD_UP "\ueb16" +# define LINEA_ARROWS_LEFT "\ueb17" +# define LINEA_ARROWS_LEFT_DOUBLE_32 "\ueb18" +# define LINEA_ARROWS_MINUS "\ueb19" +# define LINEA_ARROWS_MOVE "\ueb1a" +# define LINEA_ARROWS_MOVE2 "\ueb1b" +# define LINEA_ARROWS_MOVE_BOTTOM "\ueb1c" +# define LINEA_ARROWS_MOVE_LEFT "\ueb1d" +# define LINEA_ARROWS_MOVE_RIGHT "\ueb1e" +# define LINEA_ARROWS_MOVE_TOP "\ueb1f" +# define LINEA_ARROWS_PLUS "\ueb20" +# define LINEA_ARROWS_QUESTION "\ueb21" +# define LINEA_ARROWS_REMOVE "\ueb22" +# define LINEA_ARROWS_RIGHT "\ueb23" +# define LINEA_ARROWS_RIGHT_DOUBLE "\ueb24" +# define LINEA_ARROWS_ROTATE "\ueb25" +# define LINEA_ARROWS_ROTATE_ANTI "\ueb26" +# define LINEA_ARROWS_ROTATE_ANTI_DASHED "\ueb27" +# define LINEA_ARROWS_ROTATE_DASHED "\ueb28" +# define LINEA_ARROWS_SHRINK "\ueb29" +# define LINEA_ARROWS_SHRINK_DIAGONAL1 "\ueb2a" +# define LINEA_ARROWS_SHRINK_DIAGONAL2 "\ueb2b" +# define LINEA_ARROWS_SHRINK_HORIZONAL2 "\ueb2c" +# define LINEA_ARROWS_SHRINK_HORIZONTAL1 "\ueb2d" +# define LINEA_ARROWS_SHRINK_VERTICAL1 "\ueb2e" +# define LINEA_ARROWS_SHRINK_VERTICAL2 "\ueb2f" +# define LINEA_ARROWS_SIGN_DOWN "\ueb30" +# define LINEA_ARROWS_SIGN_LEFT "\ueb31" +# define LINEA_ARROWS_SIGN_RIGHT "\ueb32" +# define LINEA_ARROWS_SIGN_UP "\ueb33" +# define LINEA_ARROWS_SLIDE_DOWN1 "\ueb34" +# define LINEA_ARROWS_SLIDE_DOWN2 "\ueb35" +# define LINEA_ARROWS_SLIDE_LEFT1 "\ueb36" +# define LINEA_ARROWS_SLIDE_LEFT2 "\ueb37" +# define LINEA_ARROWS_SLIDE_RIGHT1 "\ueb38" +# define LINEA_ARROWS_SLIDE_RIGHT2 "\ueb39" +# define LINEA_ARROWS_SLIDE_UP1 "\ueb3a" +# define LINEA_ARROWS_SLIDE_UP2 "\ueb3b" +# define LINEA_ARROWS_SLIM_DOWN "\ueb3c" +# define LINEA_ARROWS_SLIM_DOWN_DASHED "\ueb3d" +# define LINEA_ARROWS_SLIM_LEFT "\ueb3e" +# define LINEA_ARROWS_SLIM_LEFT_DASHED "\ueb3f" +# define LINEA_ARROWS_SLIM_RIGHT "\ueb40" +# define LINEA_ARROWS_SLIM_RIGHT_DASHED "\ueb41" +# define LINEA_ARROWS_SLIM_UP "\ueb42" +# define LINEA_ARROWS_SLIM_UP_DASHED "\ueb43" +# define LINEA_ARROWS_SQUARE_CHECK "\ueb44" +# define LINEA_ARROWS_SQUARE_DOWN "\ueb45" +# define LINEA_ARROWS_SQUARE_DOWNLEFT "\ueb46" +# define LINEA_ARROWS_SQUARE_DOWNRIGHT "\ueb47" +# define LINEA_ARROWS_SQUARE_LEFT "\ueb48" +# define LINEA_ARROWS_SQUARE_MINUS "\ueb49" +# define LINEA_ARROWS_SQUARE_PLUS "\ueb4a" +# define LINEA_ARROWS_SQUARE_REMOVE "\ueb4b" +# define LINEA_ARROWS_SQUARE_RIGHT "\ueb4c" +# define LINEA_ARROWS_SQUARE_UP "\ueb4d" +# define LINEA_ARROWS_SQUARE_UPLEFT "\ueb4e" +# define LINEA_ARROWS_SQUARE_UPRIGHT "\ueb4f" +# define LINEA_ARROWS_SQUARES "\ueb50" +# define LINEA_ARROWS_STRETCH_DIAGONAL1 "\ueb51" +# define LINEA_ARROWS_STRETCH_DIAGONAL2 "\ueb52" +# define LINEA_ARROWS_STRETCH_DIAGONAL3 "\ueb53" +# define LINEA_ARROWS_STRETCH_DIAGONAL4 "\ueb54" +# define LINEA_ARROWS_STRETCH_HORIZONTAL1 "\ueb55" +# define LINEA_ARROWS_STRETCH_HORIZONTAL2 "\ueb56" +# define LINEA_ARROWS_STRETCH_VERTICAL1 "\ueb57" +# define LINEA_ARROWS_STRETCH_VERTICAL2 "\ueb58" +# define LINEA_ARROWS_SWITCH_HORIZONTAL "\ueb59" +# define LINEA_ARROWS_SWITCH_VERTICAL "\ueb5a" +# define LINEA_ARROWS_UP "\ueb5b" +# define LINEA_ARROWS_UP_DOUBLE_33 "\ueb5c" +# define LINEA_ARROWS_UPLEFT "\ueb5d" +# define LINEA_ARROWS_UPRIGHT "\ueb5e" +# define LINEA_ARROWS_VERTICAL "\ueb5f" +# define LINEA_BASIC_LOCK_OPEN "\ueb60" +# define LINEA_BASIC_MAGIC_MOUSE "\ueb61" +# define LINEA_BASIC_MAGNIFIER "\ueb62" +# define LINEA_BASIC_MAGNIFIER_MINUS "\ueb63" +# define LINEA_BASIC_MAGNIFIER_PLUS "\ueb64" +# define LINEA_BASIC_MAIL "\ueb65" +# define LINEA_BASIC_MAIL_MULTIPLE "\ueb66" +# define LINEA_BASIC_MAIL_OPEN "\ueb67" +# define LINEA_BASIC_MAIL_OPEN_TEXT "\ueb68" +# define LINEA_BASIC_MALE "\ueb69" +# define LINEA_BASIC_MAP "\ueb6a" +# define LINEA_BASIC_MESSAGE "\ueb6b" +# define LINEA_BASIC_MESSAGE_MULTIPLE "\ueb6c" +# define LINEA_BASIC_MESSAGE_TXT "\ueb6d" +# define LINEA_BASIC_MIXER2 "\ueb6e" +# define LINEA_BASIC_INFO "\ueb6f" +# define LINEA_BASIC_IPOD "\ueb70" +# define LINEA_BASIC_JOYPAD "\ueb71" +# define LINEA_BASIC_KEY "\ueb72" +# define LINEA_BASIC_KEYBOARD "\ueb73" +# define LINEA_BASIC_LAPTOP "\ueb74" +# define LINEA_BASIC_LIFE_BUOY "\ueb75" +# define LINEA_BASIC_LIGHTBULB "\ueb76" +# define LINEA_BASIC_LINK "\ueb77" +# define LINEA_BASIC_LOCK "\ueb78" +# define LINEA_BASIC_MOUSE "\ueb79" +# define LINEA_BASIC_NOTEBOOK "\ueb7a" +# define LINEA_BASIC_NOTEBOOK_PEN "\ueb7b" +# define LINEA_BASIC_NOTEBOOK_PENCIL "\ueb7c" +# define LINEA_BASIC_PAPERPLANE "\ueb7d" +# define LINEA_BASIC_PENCIL_RULER "\ueb7e" +# define LINEA_BASIC_PENCIL_RULER_PEN "\ueb7f" +# define LINEA_BASIC_CLUBS "\ueb80" +# define LINEA_BASIC_COMPASS "\ueb81" +# define LINEA_BASIC_CUP "\ueb82" +# define LINEA_BASIC_DIAMONDS "\ueb83" +# define LINEA_BASIC_DISPLAY "\ueb84" +# define LINEA_BASIC_DOWNLOAD "\ueb85" +# define LINEA_BASIC_EXCLAMATION "\ueb86" +# define LINEA_BASIC_EYE "\ueb87" +# define LINEA_BASIC_EYE_CLOSED "\ueb88" +# define LINEA_BASIC_FEMALE "\ueb89" +# define LINEA_BASIC_FLAG1 "\ueb8a" +# define LINEA_BASIC_FLAG2 "\ueb8b" +# define LINEA_BASIC_FLOPPYDISK "\ueb8c" +# define LINEA_BASIC_FOLDER "\ueb8d" +# define LINEA_BASIC_FOLDER_MULTIPLE "\ueb8e" +# define LINEA_BASIC_GEAR "\ueb8f" +# define LINEA_BASIC_GEOLOCALIZE_01 "\ueb90" +# define LINEA_BASIC_GEOLOCALIZE_05 "\ueb91" +# define LINEA_BASIC_GLOBE "\ueb92" +# define LINEA_BASIC_GUNSIGHT "\ueb93" +# define LINEA_BASIC_HAMMER "\ueb94" +# define LINEA_BASIC_HEADSET "\ueb95" +# define LINEA_BASIC_HEART "\ueb96" +# define LINEA_BASIC_HEART_BROKEN "\ueb97" +# define LINEA_BASIC_HELM "\ueb98" +# define LINEA_BASIC_HOME "\ueb99" +# define LINEA_BASIC_PHOTO "\ueb9a" +# define LINEA_BASIC_RSS "\ueb9b" +# define LINEA_BASIC_PICTURE "\ueb9c" +# define LINEA_BASIC_PICTURE_MULTIPLE "\ueb9d" +# define LINEA_BASIC_PIN1 "\ueb9e" +# define LINEA_BASIC_PIN2 "\ueb9f" +# define LINEA_BASIC_ACCELERATOR "\ueba0" +# define LINEA_BASIC_ALARM "\ueba1" +# define LINEA_BASIC_ANCHOR "\ueba2" +# define LINEA_BASIC_ANTICLOCKWISE "\ueba3" +# define LINEA_BASIC_ARCHIVE "\ueba4" +# define LINEA_BASIC_ARCHIVE_FULL "\ueba5" +# define LINEA_BASIC_BAN "\ueba6" +# define LINEA_BASIC_BATTERY_CHARGE "\ueba7" +# define LINEA_BASIC_BATTERY_EMPTY "\ueba8" +# define LINEA_BASIC_BATTERY_FULL "\ueba9" +# define LINEA_BASIC_BATTERY_HALF "\uebaa" +# define LINEA_BASIC_BOLT "\uebab" +# define LINEA_BASIC_BOOK "\uebac" +# define LINEA_BASIC_BOOK_PEN "\uebad" +# define LINEA_BASIC_BOOK_PENCIL "\uebae" +# define LINEA_BASIC_BOOKMARK "\uebaf" +# define LINEA_BASIC_CALCULATOR "\uebb0" +# define LINEA_BASIC_CALENDAR "\uebb1" +# define LINEA_BASIC_CARDS_DIAMONDS "\uebb2" +# define LINEA_BASIC_CARDS_HEARTS "\uebb3" +# define LINEA_BASIC_CASE "\uebb4" +# define LINEA_BASIC_CHRONOMETER "\uebb5" +# define LINEA_BASIC_CLESSIDRE "\uebb6" +# define LINEA_BASIC_CLOCK "\uebb7" +# define LINEA_BASIC_CLOCKWISE "\uebb8" +# define LINEA_BASIC_CLOUD "\uebb9" +# define LINEA_BASIC_POSTCARD "\uebba" +# define LINEA_BASIC_POSTCARD_MULTIPLE "\uebbb" +# define LINEA_BASIC_PRINTER "\uebbc" +# define LINEA_BASIC_QUESTION "\uebbd" +# define LINEA_BASIC_SERVER "\uebbe" +# define LINEA_BASIC_SERVER2 "\uebbf" +# define LINEA_BASIC_SERVER_CLOUD "\uebc0" +# define LINEA_BASIC_SERVER_DOWNLOAD "\uebc1" +# define LINEA_BASIC_SERVER_UPLOAD "\uebc2" +# define LINEA_BASIC_SETTINGS "\uebc3" +# define LINEA_BASIC_SHARE "\uebc4" +# define LINEA_BASIC_SHEET "\uebc5" +# define LINEA_BASIC_SHEET_MULTIPLE "\uebc6" +# define LINEA_BASIC_SHEET_PEN "\uebc7" +# define LINEA_BASIC_SHEET_PENCIL "\uebc8" +# define LINEA_BASIC_SHEET_TXT "\uebc9" +# define LINEA_BASIC_SIGNS "\uebca" +# define LINEA_BASIC_SMARTPHONE "\uebcb" +# define LINEA_BASIC_SPADES "\uebcc" +# define LINEA_BASIC_SPREAD "\uebcd" +# define LINEA_BASIC_SPREAD_BOOKMARK "\uebce" +# define LINEA_BASIC_SPREAD_TEXT "\uebcf" +# define LINEA_BASIC_SPREAD_TEXT_BOOKMARK "\uebd0" +# define LINEA_BASIC_STAR "\uebd1" +# define LINEA_BASIC_TABLET "\uebd2" +# define LINEA_BASIC_TARGET "\uebd3" +# define LINEA_BASIC_TODO "\uebd4" +# define LINEA_BASIC_TODO_PEN "\uebd5" +# define LINEA_BASIC_TODO_PENCIL "\uebd6" +# define LINEA_BASIC_TODO_TXT "\uebd7" +# define LINEA_BASIC_TODOLIST_PEN "\uebd8" +# define LINEA_BASIC_TODOLIST_PENCIL "\uebd9" +# define LINEA_BASIC_TRASHCAN "\uebda" +# define LINEA_BASIC_TRASHCAN_FULL "\uebdb" +# define LINEA_BASIC_TRASHCAN_REFRESH "\uebdc" +# define LINEA_BASIC_TRASHCAN_REMOVE "\uebdd" +# define LINEA_BASIC_UPLOAD "\uebde" +# define LINEA_BASIC_USB "\uebdf" +# define LINEA_BASIC_VIDEO "\uebe0" +# define LINEA_BASIC_WATCH "\uebe1" +# define LINEA_BASIC_WEBPAGE "\uebe2" +# define LINEA_BASIC_WEBPAGE_IMG_TXT "\uebe3" +# define LINEA_BASIC_WEBPAGE_MULTIPLE "\uebe4" +# define LINEA_BASIC_WEBPAGE_TXT "\uebe5" +# define LINEA_BASIC_WORLD "\uebe6" +# define LINEA_ELABORATION_DOCUMENT_PREVIOUS "\uebe7" +# define LINEA_ELABORATION_DOCUMENT_REFRESH "\uebe8" +# define LINEA_ELABORATION_DOCUMENT_REMOVE "\uebe9" +# define LINEA_ELABORATION_DOCUMENT_SEARCH "\uebea" +# define LINEA_ELABORATION_DOCUMENT_STAR "\uebeb" +# define LINEA_ELABORATION_DOCUMENT_UPLOAD "\uebec" +# define LINEA_ELABORATION_FOLDER_CHECK "\uebed" +# define LINEA_ELABORATION_FOLDER_CLOUD "\uebee" +# define LINEA_ELABORATION_FOLDER_DOCUMENT "\uebef" +# define LINEA_ELABORATION_FOLDER_DOWNLOAD "\uebf0" +# define LINEA_ELABORATION_FOLDER_FLAGGED "\uebf1" +# define LINEA_ELABORATION_FOLDER_GRAPH "\uebf2" +# define LINEA_ELABORATION_FOLDER_HEART "\uebf3" +# define LINEA_ELABORATION_FOLDER_MINUS "\uebf4" +# define LINEA_ELABORATION_FOLDER_NEXT "\uebf5" +# define LINEA_ELABORATION_DOCUMENT_FLAGGED "\uebf6" +# define LINEA_ELABORATION_DOCUMENT_GRAPH "\uebf7" +# define LINEA_ELABORATION_DOCUMENT_HEART "\uebf8" +# define LINEA_ELABORATION_DOCUMENT_MINUS "\uebf9" +# define LINEA_ELABORATION_DOCUMENT_NEXT "\uebfa" +# define LINEA_ELABORATION_DOCUMENT_NOACCESS "\uebfb" +# define LINEA_ELABORATION_DOCUMENT_NOTE "\uebfc" +# define LINEA_ELABORATION_DOCUMENT_PENCIL "\uebfd" +# define LINEA_ELABORATION_DOCUMENT_PICTURE "\uebfe" +# define LINEA_ELABORATION_DOCUMENT_PLUS "\uebff" +# define LINEA_ELABORATION_FOLDER_NOACCESS "\uec00" +# define LINEA_ELABORATION_FOLDER_NOTE "\uec01" +# define LINEA_ELABORATION_FOLDER_PENCIL "\uec02" +# define LINEA_ELABORATION_FOLDER_PICTURE "\uec03" +# define LINEA_ELABORATION_FOLDER_PLUS "\uec04" +# define LINEA_ELABORATION_FOLDER_PREVIOUS "\uec05" +# define LINEA_ELABORATION_FOLDER_REFRESH "\uec06" +# define LINEA_ELABORATION_CALENDAR_EMPTY "\uec07" +# define LINEA_ELABORATION_CALENDAR_FLAGGED "\uec08" +# define LINEA_ELABORATION_CALENDAR_HEART "\uec09" +# define LINEA_ELABORATION_CALENDAR_MINUS "\uec0a" +# define LINEA_ELABORATION_CALENDAR_NEXT "\uec0b" +# define LINEA_ELABORATION_CALENDAR_NOACCESS "\uec0c" +# define LINEA_ELABORATION_CALENDAR_PENCIL "\uec0d" +# define LINEA_ELABORATION_CALENDAR_PLUS "\uec0e" +# define LINEA_ELABORATION_CALENDAR_PREVIOUS "\uec0f" +# define LINEA_ELABORATION_CALENDAR_REFRESH "\uec10" +# define LINEA_ELABORATION_CALENDAR_REMOVE "\uec11" +# define LINEA_ELABORATION_CALENDAR_SEARCH "\uec12" +# define LINEA_ELABORATION_CALENDAR_STAR "\uec13" +# define LINEA_ELABORATION_CALENDAR_UPLOAD "\uec14" +# define LINEA_ELABORATION_CLOUD_CHECK "\uec15" +# define LINEA_ELABORATION_CLOUD_DOWNLOAD "\uec16" +# define LINEA_ELABORATION_CLOUD_MINUS "\uec17" +# define LINEA_ELABORATION_CLOUD_NOACCESS "\uec18" +# define LINEA_ELABORATION_CLOUD_PLUS "\uec19" +# define LINEA_ELABORATION_CLOUD_REFRESH "\uec1a" +# define LINEA_ELABORATION_CLOUD_REMOVE "\uec1b" +# define LINEA_ELABORATION_CLOUD_SEARCH "\uec1c" +# define LINEA_ELABORATION_CLOUD_UPLOAD "\uec1d" +# define LINEA_ELABORATION_DOCUMENT_CHECK "\uec1e" +# define LINEA_ELABORATION_DOCUMENT_CLOUD "\uec1f" +# define LINEA_ELABORATION_DOCUMENT_DOWNLOAD "\uec20" +# define LINEA_ELABORATION_FOLDER_REMOVE "\uec21" +# define LINEA_ELABORATION_MAIL_HEART "\uec22" +# define LINEA_ELABORATION_FOLDER_SEARCH "\uec23" +# define LINEA_ELABORATION_FOLDER_STAR "\uec24" +# define LINEA_ELABORATION_FOLDER_UPLOAD "\uec25" +# define LINEA_ELABORATION_MAIL_CHECK "\uec26" +# define LINEA_ELABORATION_BOOKMARK_CHECCK "\uec27" +# define LINEA_ELABORATION_BOOKMARK_MINUS "\uec28" +# define LINEA_ELABORATION_BOOKMARK_PLUS "\uec29" +# define LINEA_ELABORATION_BOOKMARK_REMOVE "\uec2a" +# define LINEA_ELABORATION_BRIEFCASE_CHECK "\uec2b" +# define LINEA_ELABORATION_BRIEFCASE_DOWNLOAD "\uec2c" +# define LINEA_ELABORATION_BRIEFCASE_FLAGGED "\uec2d" +# define LINEA_ELABORATION_BRIEFCASE_MINUS "\uec2e" +# define LINEA_ELABORATION_BRIEFCASE_PLUS "\uec2f" +# define LINEA_ELABORATION_BRIEFCASE_REFRESH "\uec30" +# define LINEA_ELABORATION_BRIEFCASE_REMOVE "\uec31" +# define LINEA_ELABORATION_BRIEFCASE_SEARCH "\uec32" +# define LINEA_ELABORATION_BRIEFCASE_STAR "\uec33" +# define LINEA_ELABORATION_BRIEFCASE_UPLOAD "\uec34" +# define LINEA_ELABORATION_BROWSER_CHECK "\uec35" +# define LINEA_ELABORATION_BROWSER_DOWNLOAD "\uec36" +# define LINEA_ELABORATION_BROWSER_MINUS "\uec37" +# define LINEA_ELABORATION_BROWSER_PLUS "\uec38" +# define LINEA_ELABORATION_BROWSER_REFRESH "\uec39" +# define LINEA_ELABORATION_BROWSER_REMOVE "\uec3a" +# define LINEA_ELABORATION_BROWSER_SEARCH "\uec3b" +# define LINEA_ELABORATION_BROWSER_STAR "\uec3c" +# define LINEA_ELABORATION_BROWSER_UPLOAD "\uec3d" +# define LINEA_ELABORATION_CALENDAR_CHECK "\uec3e" +# define LINEA_ELABORATION_CALENDAR_CLOUD "\uec3f" +# define LINEA_ELABORATION_CALENDAR_DOWNLOAD "\uec40" +# define LINEA_ELABORATION_MAIL_CLOUD "\uec41" +# define LINEA_ELABORATION_MAIL_DOCUMENT "\uec42" +# define LINEA_ELABORATION_MAIL_DOWNLOAD "\uec43" +# define LINEA_ELABORATION_MAIL_FLAGGED "\uec44" +# define LINEA_ELABORATION_MAIL_NEXT "\uec45" +# define LINEA_ELABORATION_MAIL_NOACCESS "\uec46" +# define LINEA_ELABORATION_MAIL_NOTE "\uec47" +# define LINEA_ELABORATION_MAIL_PENCIL "\uec48" +# define LINEA_ELABORATION_MAIL_PICTURE "\uec49" +# define LINEA_ELABORATION_MAIL_PREVIOUS "\uec4a" +# define LINEA_ELABORATION_MAIL_REFRESH "\uec4b" +# define LINEA_ELABORATION_MAIL_REMOVE "\uec4c" +# define LINEA_ELABORATION_MAIL_SEARCH "\uec4d" +# define LINEA_ELABORATION_MAIL_STAR "\uec4e" +# define LINEA_ELABORATION_MAIL_UPLOAD "\uec4f" +# define LINEA_ELABORATION_MESSAGE_CHECK "\uec50" +# define LINEA_ELABORATION_MESSAGE_DOTS "\uec51" +# define LINEA_ELABORATION_MESSAGE_HAPPY "\uec52" +# define LINEA_ELABORATION_MESSAGE_HEART "\uec53" +# define LINEA_ELABORATION_MESSAGE_MINUS "\uec54" +# define LINEA_ELABORATION_MESSAGE_NOTE "\uec55" +# define LINEA_ELABORATION_MESSAGE_PLUS "\uec56" +# define LINEA_ELABORATION_MESSAGE_REFRESH "\uec57" +# define LINEA_ELABORATION_MESSAGE_REMOVE "\uec58" +# define LINEA_ELABORATION_MESSAGE_SAD "\uec59" +# define LINEA_ELABORATION_SMARTPHONE_CLOUD "\uec5a" +# define LINEA_ELABORATION_SMARTPHONE_HEART "\uec5b" +# define LINEA_ELABORATION_SMARTPHONE_NOACCESS "\uec5c" +# define LINEA_ELABORATION_SMARTPHONE_NOTE "\uec5d" +# define LINEA_ELABORATION_SMARTPHONE_PENCIL "\uec5e" +# define LINEA_ELABORATION_SMARTPHONE_PICTURE "\uec5f" +# define LINEA_ELABORATION_SMARTPHONE_REFRESH "\uec60" +# define LINEA_ELABORATION_SMARTPHONE_SEARCH "\uec61" +# define LINEA_ELABORATION_TABLET_CLOUD "\uec62" +# define LINEA_ELABORATION_TABLET_HEART "\uec63" +# define LINEA_ELABORATION_TABLET_NOACCESS "\uec64" +# define LINEA_ELABORATION_TABLET_NOTE "\uec65" +# define LINEA_ELABORATION_TABLET_PENCIL "\uec66" +# define LINEA_ELABORATION_TABLET_PICTURE "\uec67" +# define LINEA_ELABORATION_TABLET_REFRESH "\uec68" +# define LINEA_ELABORATION_TABLET_SEARCH "\uec69" +# define LINEA_ELABORATION_TODOLIST_2 "\uec6a" +# define LINEA_ELABORATION_TODOLIST_CHECK "\uec6b" +# define LINEA_ELABORATION_TODOLIST_CLOUD "\uec6c" +# define LINEA_ELABORATION_TODOLIST_DOWNLOAD "\uec6d" +# define LINEA_ELABORATION_TODOLIST_FLAGGED "\uec6e" +# define LINEA_ELABORATION_TODOLIST_MINUS "\uec6f" +# define LINEA_ELABORATION_TODOLIST_NOACCESS "\uec70" +# define LINEA_ELABORATION_TODOLIST_PENCIL "\uec71" +# define LINEA_ELABORATION_TODOLIST_PLUS "\uec72" +# define LINEA_ELABORATION_TODOLIST_REFRESH "\uec73" +# define LINEA_ELABORATION_TODOLIST_REMOVE "\uec74" +# define LINEA_ELABORATION_TODOLIST_SEARCH "\uec75" +# define LINEA_ELABORATION_TODOLIST_STAR "\uec76" +# define LINEA_ELABORATION_TODOLIST_UPLOAD "\uec77" +# define LINEA_ECOMMERCE_RECEIPT_KIPS "\uec78" +# define LINEA_ECOMMERCE_RECEIPT_LIRA "\uec79" +# define LINEA_ECOMMERCE_RECEIPT_NAIRA "\uec7a" +# define LINEA_ECOMMERCE_RECEIPT_PESOS "\uec7b" +# define LINEA_ECOMMERCE_RECEIPT_POUND "\uec7c" +# define LINEA_ECOMMERCE_RECEIPT_RUBLO "\uec7d" +# define LINEA_ECOMMERCE_RECEIPT_RUPEE "\uec7e" +# define LINEA_ECOMMERCE_RECEIPT_TUGRIK "\uec7f" +# define LINEA_ECOMMERCE_RECEIPT_WON "\uec80" +# define LINEA_ECOMMERCE_RECEIPT_YEN "\uec81" +# define LINEA_ECOMMERCE_RECEIPT_YEN2 "\uec82" +# define LINEA_ECOMMERCE_RECEPT_COLON "\uec83" +# define LINEA_ECOMMERCE_RUBLO "\uec84" +# define LINEA_ECOMMERCE_RUPEE "\uec85" +# define LINEA_ECOMMERCE_SAFE "\uec86" +# define LINEA_ECOMMERCE_NAIRA "\uec87" +# define LINEA_ECOMMERCE_PESOS "\uec88" +# define LINEA_ECOMMERCE_POUND "\uec89" +# define LINEA_ECOMMERCE_RECEIPT "\uec8a" +# define LINEA_ECOMMERCE_RECEIPT_BATH "\uec8b" +# define LINEA_ECOMMERCE_RECEIPT_CENT "\uec8c" +# define LINEA_ECOMMERCE_RECEIPT_DOLLAR "\uec8d" +# define LINEA_ECOMMERCE_RECEIPT_EURO "\uec8e" +# define LINEA_ECOMMERCE_RECEIPT_FRANC "\uec8f" +# define LINEA_ECOMMERCE_RECEIPT_GUARANI "\uec90" +# define LINEA_ECOMMERCE_SALE "\uec91" +# define LINEA_ECOMMERCE_SALES "\uec92" +# define LINEA_ECOMMERCE_TICKET "\uec93" +# define LINEA_ECOMMERCE_TUGRIKS "\uec94" +# define LINEA_ECOMMERCE_WALLET "\uec95" +# define LINEA_ECOMMERCE_WON "\uec96" +# define LINEA_ECOMMERCE_YEN "\uec97" +# define LINEA_ECOMMERCE_CART_CONTENT "\uec98" +# define LINEA_ECOMMERCE_CART_DOWNLOAD "\uec99" +# define LINEA_ECOMMERCE_CART_MINUS "\uec9a" +# define LINEA_ECOMMERCE_CART_PLUS "\uec9b" +# define LINEA_ECOMMERCE_CART_REFRESH "\uec9c" +# define LINEA_ECOMMERCE_CART_REMOVE "\uec9d" +# define LINEA_ECOMMERCE_CART_SEARCH "\uec9e" +# define LINEA_ECOMMERCE_CART_UPLOAD "\uec9f" +# define LINEA_ECOMMERCE_CENT "\ueca0" +# define LINEA_ECOMMERCE_COLON "\ueca1" +# define LINEA_ECOMMERCE_CREDITCARD "\ueca2" +# define LINEA_ECOMMERCE_DIAMOND "\ueca3" +# define LINEA_ECOMMERCE_DOLLAR "\ueca4" +# define LINEA_ECOMMERCE_EURO "\ueca5" +# define LINEA_ECOMMERCE_FRANC "\ueca6" +# define LINEA_ECOMMERCE_GIFT "\ueca7" +# define LINEA_ECOMMERCE_GRAPH1 "\ueca8" +# define LINEA_ECOMMERCE_GRAPH2 "\ueca9" +# define LINEA_ECOMMERCE_GRAPH3 "\uecaa" +# define LINEA_ECOMMERCE_GRAPH_DECREASE "\uecab" +# define LINEA_ECOMMERCE_GRAPH_INCREASE "\uecac" +# define LINEA_ECOMMERCE_GUARANI "\uecad" +# define LINEA_ECOMMERCE_KIPS "\uecae" +# define LINEA_ECOMMERCE_LIRA "\uecaf" +# define LINEA_ECOMMERCE_MEGAPHONE "\uecb0" +# define LINEA_ECOMMERCE_MONEY "\uecb1" +# define LINEA_ECOMMERCE_YEN2 "\uecb2" +# define LINEA_ECOMMERCE_BAG "\uecb3" +# define LINEA_ECOMMERCE_BAG_CHECK "\uecb4" +# define LINEA_ECOMMERCE_BAG_CLOUD "\uecb5" +# define LINEA_ECOMMERCE_BAG_DOWNLOAD "\uecb6" +# define LINEA_ECOMMERCE_BAG_MINUS "\uecb7" +# define LINEA_ECOMMERCE_BAG_PLUS "\uecb8" +# define LINEA_ECOMMERCE_BAG_REFRESH "\uecb9" +# define LINEA_ECOMMERCE_BAG_REMOVE "\uecba" +# define LINEA_ECOMMERCE_BAG_SEARCH "\uecbb" +# define LINEA_ECOMMERCE_BAG_UPLOAD "\uecbc" +# define LINEA_ECOMMERCE_BANKNOTE "\uecbd" +# define LINEA_ECOMMERCE_BANKNOTES "\uecbe" +# define LINEA_ECOMMERCE_BASKET "\uecbf" +# define LINEA_ECOMMERCE_BASKET_CHECK "\uecc0" +# define LINEA_ECOMMERCE_BASKET_CLOUD "\uecc1" +# define LINEA_ECOMMERCE_BASKET_DOWNLOAD "\uecc2" +# define LINEA_ECOMMERCE_BASKET_MINUS "\uecc3" +# define LINEA_ECOMMERCE_BASKET_PLUS "\uecc4" +# define LINEA_ECOMMERCE_BASKET_REFRESH "\uecc5" +# define LINEA_ECOMMERCE_BASKET_REMOVE "\uecc6" +# define LINEA_ECOMMERCE_BASKET_SEARCH "\uecc7" +# define LINEA_ECOMMERCE_BASKET_UPLOAD "\uecc8" +# define LINEA_ECOMMERCE_BATH "\uecc9" +# define LINEA_ECOMMERCE_CART "\uecca" +# define LINEA_ECOMMERCE_CART_CHECK "\ueccb" +# define LINEA_ECOMMERCE_CART_CLOUD "\ueccc" +# define LINEA_MUSIC_STOP_BUTTON "\ueccd" +# define LINEA_MUSIC_TAPE "\uecce" +# define LINEA_MUSIC_VOLUME_DOWN "\ueccf" +# define LINEA_MUSIC_VOLUME_UP "\uecd0" +# define LINEA_MUSIC_BEGINNING_BUTTON "\uecd1" +# define LINEA_MUSIC_BELL "\uecd2" +# define LINEA_MUSIC_CD "\uecd3" +# define LINEA_MUSIC_DIAPASON "\uecd4" +# define LINEA_MUSIC_EJECT_BUTTON "\uecd5" +# define LINEA_MUSIC_END_BUTTON "\uecd6" +# define LINEA_MUSIC_FASTFORWARD_BUTTON "\uecd7" +# define LINEA_MUSIC_HEADPHONES "\uecd8" +# define LINEA_MUSIC_IPOD "\uecd9" +# define LINEA_MUSIC_LOUDSPEAKER "\uecda" +# define LINEA_MUSIC_MICROPHONE "\uecdb" +# define LINEA_MUSIC_MICROPHONE_OLD "\uecdc" +# define LINEA_MUSIC_MIXER "\uecdd" +# define LINEA_MUSIC_MUTE "\uecde" +# define LINEA_MUSIC_NOTE_MULTIPLE "\uecdf" +# define LINEA_MUSIC_NOTE_SINGLE "\uece0" +# define LINEA_MUSIC_PAUSE_BUTTON "\uece1" +# define LINEA_MUSIC_PLAY_BUTTON "\uece2" +# define LINEA_MUSIC_PLAYLIST "\uece3" +# define LINEA_MUSIC_RADIO_GHETTOBLASTER "\uece4" +# define LINEA_MUSIC_RADIO_PORTABLE "\uece5" +# define LINEA_MUSIC_RECORD "\uece6" +# define LINEA_MUSIC_RECORDPLAYER "\uece7" +# define LINEA_MUSIC_REPEAT_BUTTON "\uece8" +# define LINEA_MUSIC_REWIND_BUTTON "\uece9" +# define LINEA_MUSIC_SHUFFLE_BUTTON "\uecea" +# define LINEA_SOFTWARE_PARAGRAPH_JUSTIFY_CENTER "\ueceb" +# define LINEA_SOFTWARE_PARAGRAPH_JUSTIFY_LEFT "\uecec" +# define LINEA_SOFTWARE_PARAGRAPH_JUSTIFY_RIGHT "\ueced" +# define LINEA_SOFTWARE_PARAGRAPH_SPACE_AFTER "\uecee" +# define LINEA_SOFTWARE_PARAGRAPH_SPACE_BEFORE "\uecef" +# define LINEA_SOFTWARE_PATHFINDER_EXCLUDE "\uecf0" +# define LINEA_SOFTWARE_PATHFINDER_INTERSECT "\uecf1" +# define LINEA_SOFTWARE_PATHFINDER_SUBTRACT "\uecf2" +# define LINEA_SOFTWARE_PATHFINDER_UNITE "\uecf3" +# define LINEA_SOFTWARE_PEN "\uecf4" +# define LINEA_SOFTWARE_PEN_ADD "\uecf5" +# define LINEA_SOFTWARE_PEN_REMOVE "\uecf6" +# define LINEA_SOFTWARE_PENCIL "\uecf7" +# define LINEA_SOFTWARE_POLYGONALLASSO "\uecf8" +# define LINEA_SOFTWARE_REFLECT_HORIZONTAL "\uecf9" +# define LINEA_SOFTWARE_MAGNETE "\uecfa" +# define LINEA_SOFTWARE_PAGES "\uecfb" +# define LINEA_SOFTWARE_PAINTBRUSH "\uecfc" +# define LINEA_SOFTWARE_PAINTBUCKET "\uecfd" +# define LINEA_SOFTWARE_PAINTROLLER "\uecfe" +# define LINEA_SOFTWARE_PARAGRAPH "\uecff" +# define LINEA_SOFTWARE_PARAGRAPH_ALIGN_LEFT "\ued00" +# define LINEA_SOFTWARE_PARAGRAPH_ALIGN_RIGHT "\ued01" +# define LINEA_SOFTWARE_PARAGRAPH_CENTER "\ued02" +# define LINEA_SOFTWARE_PARAGRAPH_JUSTIFY_ALL "\ued03" +# define LINEA_SOFTWARE_REFLECT_VERTICAL "\ued04" +# define LINEA_SOFTWARE_REMOVE_VECTORPOINT "\ued05" +# define LINEA_SOFTWARE_SCALE_EXPAND "\ued06" +# define LINEA_SOFTWARE_SCALE_REDUCE "\ued07" +# define LINEA_SOFTWARE_SELECTION_OVAL "\ued08" +# define LINEA_SOFTWARE_SELECTION_POLYGON "\ued09" +# define LINEA_SOFTWARE_SELECTION_RECTANGLE "\ued0a" +# define LINEA_SOFTWARE_INDENT_FIRSTLINE "\ued0b" +# define LINEA_SOFTWARE_INDENT_LEFT "\ued0c" +# define LINEA_SOFTWARE_INDENT_RIGHT "\ued0d" +# define LINEA_SOFTWARE_LASSO "\ued0e" +# define LINEA_SOFTWARE_LAYERS1 "\ued0f" +# define LINEA_SOFTWARE_LAYERS2 "\ued10" +# define LINEA_SOFTWARE_LAYOUT "\ued11" +# define LINEA_SOFTWARE_LAYOUT_2COLUMNS "\ued12" +# define LINEA_SOFTWARE_LAYOUT_3COLUMNS "\ued13" +# define LINEA_SOFTWARE_LAYOUT_4BOXES "\ued14" +# define LINEA_SOFTWARE_LAYOUT_4COLUMNS "\ued15" +# define LINEA_SOFTWARE_LAYOUT_4LINES "\ued16" +# define LINEA_SOFTWARE_LAYOUT_8BOXES "\ued17" +# define LINEA_SOFTWARE_LAYOUT_HEADER "\ued18" +# define LINEA_SOFTWARE_LAYOUT_HEADER_2COLUMNS "\ued19" +# define LINEA_SOFTWARE_LAYOUT_HEADER_3COLUMNS "\ued1a" +# define LINEA_SOFTWARE_LAYOUT_HEADER_4BOXES "\ued1b" +# define LINEA_SOFTWARE_LAYOUT_HEADER_4COLUMNS "\ued1c" +# define LINEA_SOFTWARE_LAYOUT_HEADER_COMPLEX "\ued1d" +# define LINEA_SOFTWARE_LAYOUT_HEADER_COMPLEX2 "\ued1e" +# define LINEA_SOFTWARE_LAYOUT_HEADER_COMPLEX3 "\ued1f" +# define LINEA_SOFTWARE_LAYOUT_HEADER_COMPLEX4 "\ued20" +# define LINEA_SOFTWARE_LAYOUT_HEADER_SIDELEFT "\ued21" +# define LINEA_SOFTWARE_LAYOUT_HEADER_SIDERIGHT "\ued22" +# define LINEA_SOFTWARE_LAYOUT_SIDEBAR_LEFT "\ued23" +# define LINEA_SOFTWARE_LAYOUT_SIDEBAR_RIGHT "\ued24" +# define LINEA_SOFTWARE_SELECTION_ROUNDEDRECTANGLE "\ued25" +# define LINEA_SOFTWARE_VECTOR_LINE "\ued26" +# define LINEA_SOFTWARE_SHAPE_OVAL "\ued27" +# define LINEA_SOFTWARE_SHAPE_POLYGON "\ued28" +# define LINEA_SOFTWARE_SHAPE_RECTANGLE "\ued29" +# define LINEA_SOFTWARE_SHAPE_ROUNDEDRECTANGLE "\ued2a" +# define LINEA_SOFTWARE_ADD_VECTORPOINT "\ued2b" +# define LINEA_SOFTWARE_BOX_OVAL "\ued2c" +# define LINEA_SOFTWARE_BOX_POLYGON "\ued2d" +# define LINEA_SOFTWARE_BOX_RECTANGLE "\ued2e" +# define LINEA_SOFTWARE_BOX_ROUNDEDRECTANGLE "\ued2f" +# define LINEA_SOFTWARE_CHARACTER "\ued30" +# define LINEA_SOFTWARE_CROP "\ued31" +# define LINEA_SOFTWARE_EYEDROPPER "\ued32" +# define LINEA_SOFTWARE_FONT_ALLCAPS "\ued33" +# define LINEA_SOFTWARE_FONT_BASELINE_SHIFT "\ued34" +# define LINEA_SOFTWARE_FONT_HORIZONTAL_SCALE "\ued35" +# define LINEA_SOFTWARE_FONT_KERNING "\ued36" +# define LINEA_SOFTWARE_FONT_LEADING "\ued37" +# define LINEA_SOFTWARE_FONT_SIZE "\ued38" +# define LINEA_SOFTWARE_FONT_SMALLCAPITAL "\ued39" +# define LINEA_SOFTWARE_FONT_SMALLCAPS "\ued3a" +# define LINEA_SOFTWARE_FONT_STRIKETHROUGH "\ued3b" +# define LINEA_SOFTWARE_FONT_TRACKING "\ued3c" +# define LINEA_SOFTWARE_FONT_UNDERLINE "\ued3d" +# define LINEA_SOFTWARE_FONT_VERTICAL_SCALE "\ued3e" +# define LINEA_SOFTWARE_HORIZONTAL_ALIGN_CENTER "\ued3f" +# define LINEA_SOFTWARE_HORIZONTAL_ALIGN_LEFT "\ued40" +# define LINEA_SOFTWARE_HORIZONTAL_ALIGN_RIGHT "\ued41" +# define LINEA_SOFTWARE_HORIZONTAL_DISTRIBUTE_CENTER "\ued42" +# define LINEA_SOFTWARE_HORIZONTAL_DISTRIBUTE_LEFT "\ued43" +# define LINEA_SOFTWARE_HORIZONTAL_DISTRIBUTE_RIGHT "\ued44" +# define LINEA_SOFTWARE_SLICE "\ued45" +# define LINEA_SOFTWARE_TRANSFORM_BEZIER "\ued46" +# define LINEA_SOFTWARE_VECTOR_BOX "\ued47" +# define LINEA_SOFTWARE_VECTOR_COMPOSITE "\ued48" +# define LINEA_SOFTWARE_VERTICAL_ALIGN_BOTTOM "\ued49" +# define LINEA_SOFTWARE_VERTICAL_ALIGN_CENTER "\ued4a" +# define LINEA_SOFTWARE_VERTICAL_ALIGN_TOP "\ued4b" +# define LINEA_SOFTWARE_VERTICAL_DISTRIBUTE_BOTTOM "\ued4c" +# define LINEA_SOFTWARE_VERTICAL_DISTRIBUTE_CENTER "\ued4d" +# define LINEA_SOFTWARE_VERTICAL_DISTRIBUTE_TOP "\ued4e" +# define LINEA_WEATHER_AQUARIUS "\ued4f" +# define LINEA_WEATHER_ARIES "\ued50" +# define LINEA_WEATHER_CANCER "\ued51" +# define LINEA_WEATHER_CAPRICORN "\ued52" +# define LINEA_WEATHER_CLOUD "\ued53" +# define LINEA_WEATHER_CLOUD_DROP "\ued54" +# define LINEA_WEATHER_CLOUD_LIGHTNING "\ued55" +# define LINEA_WEATHER_CLOUD_SNOWFLAKE "\ued56" +# define LINEA_WEATHER_DOWNPOUR_FULLMOON "\ued57" +# define LINEA_WEATHER_DOWNPOUR_HALFMOON "\ued58" +# define LINEA_WEATHER_DOWNPOUR_SUN "\ued59" +# define LINEA_WEATHER_DROP "\ued5a" +# define LINEA_WEATHER_FIRST_QUARTER "\ued5b" +# define LINEA_WEATHER_FOG "\ued5c" +# define LINEA_WEATHER_FOG_FULLMOON "\ued5d" +# define LINEA_WEATHER_FOG_HALFMOON "\ued5e" +# define LINEA_WEATHER_FOG_SUN "\ued5f" +# define LINEA_WEATHER_FULLMOON "\ued60" +# define LINEA_WEATHER_GEMINI "\ued61" +# define LINEA_WEATHER_HAIL "\ued62" +# define LINEA_WEATHER_HAIL_FULLMOON "\ued63" +# define LINEA_WEATHER_HAIL_HALFMOON "\ued64" +# define LINEA_WEATHER_HAIL_SUN "\ued65" +# define LINEA_WEATHER_LAST_QUARTER "\ued66" +# define LINEA_WEATHER_LEO "\ued67" +# define LINEA_WEATHER_LIBRA "\ued68" +# define LINEA_WEATHER_LIGHTNING "\ued69" +# define LINEA_WEATHER_MISTYRAIN "\ued6a" +# define LINEA_WEATHER_MISTYRAIN_FULLMOON "\ued6b" +# define LINEA_WEATHER_MISTYRAIN_HALFMOON "\ued6c" +# define LINEA_WEATHER_MISTYRAIN_SUN "\ued6d" +# define LINEA_WEATHER_MOON "\ued6e" +# define LINEA_WEATHER_MOONDOWN_FULL "\ued6f" +# define LINEA_WEATHER_MOONDOWN_HALF "\ued70" +# define LINEA_WEATHER_MOONSET_FULL "\ued71" +# define LINEA_WEATHER_MOONSET_HALF "\ued72" +# define LINEA_WEATHER_MOVE2 "\ued73" +# define LINEA_WEATHER_NEWMOON "\ued74" +# define LINEA_WEATHER_PISCES "\ued75" +# define LINEA_WEATHER_RAIN "\ued76" +# define LINEA_WEATHER_RAIN_FULLMOON "\ued77" +# define LINEA_WEATHER_RAIN_HALFMOON "\ued78" +# define LINEA_WEATHER_RAIN_SUN "\ued79" +# define LINEA_WEATHER_SAGITTARIUS "\ued7a" +# define LINEA_WEATHER_SCORPIO "\ued7b" +# define LINEA_WEATHER_SNOW "\ued7c" +# define LINEA_WEATHER_SNOW_FULLMOON "\ued7d" +# define LINEA_WEATHER_SNOW_HALFMOON "\ued7e" +# define LINEA_WEATHER_SNOW_SUN "\ued7f" +# define LINEA_WEATHER_SNOWFLAKE "\ued80" +# define LINEA_WEATHER_STAR "\ued81" +# define LINEA_WEATHER_STORM_11 "\ued82" +# define LINEA_WEATHER_STORM_32 "\ued83" +# define LINEA_WEATHER_STORM_FULLMOON "\ued84" +# define LINEA_WEATHER_STORM_HALFMOON "\ued85" +# define LINEA_WEATHER_STORM_SUN "\ued86" +# define LINEA_WEATHER_SUN "\ued87" +# define LINEA_WEATHER_SUNDOWN "\ued88" +# define LINEA_WEATHER_SUNSET "\ued89" +# define LINEA_WEATHER_TAURUS "\ued8a" +# define LINEA_WEATHER_TEMPEST "\ued8b" +# define LINEA_WEATHER_TEMPEST_FULLMOON "\ued8c" +# define LINEA_WEATHER_TEMPEST_HALFMOON "\ued8d" +# define LINEA_WEATHER_TEMPEST_SUN "\ued8e" +# define LINEA_WEATHER_VARIABLE_FULLMOON "\ued8f" +# define LINEA_WEATHER_VARIABLE_HALFMOON "\ued90" +# define LINEA_WEATHER_VARIABLE_SUN "\ued91" +# define LINEA_WEATHER_VIRGO "\ued92" +# define LINEA_WEATHER_WANING_CRESENT "\ued93" +# define LINEA_WEATHER_WANING_GIBBOUS "\ued94" +# define LINEA_WEATHER_WAXING_CRESENT "\ued95" +# define LINEA_WEATHER_WAXING_GIBBOUS "\ued96" +# define LINEA_WEATHER_WIND "\ued97" +# define LINEA_WEATHER_WIND_E "\ued98" +# define LINEA_WEATHER_WIND_FULLMOON "\ued99" +# define LINEA_WEATHER_WIND_HALFMOON "\ued9a" +# define LINEA_WEATHER_WIND_N "\ued9b" +# define LINEA_WEATHER_WIND_NE "\ued9c" +# define LINEA_WEATHER_WIND_NW "\ued9d" +# define LINEA_WEATHER_WIND_S "\ued9e" +# define LINEA_WEATHER_WIND_SE "\ued9f" +# define LINEA_WEATHER_WIND_SUN "\ueda0" +# define LINEA_WEATHER_WIND_SW "\ueda1" +# define LINEA_WEATHER_WIND_W "\ueda2" +# define LINEA_WEATHER_WINDGUST "\ueda3" +# define MFIZZ_3DPRINT "\ueda4" +# define MFIZZ_ALPINELINUX "\ueda5" +# define MFIZZ_ANGULAR "\ueda6" +# define MFIZZ_ANGULAR_ALT "\ueda7" +# define MFIZZ_ANTENNA "\ueda8" +# define MFIZZ_APACHE "\ueda9" +# define MFIZZ_ARCHLINUX "\uedaa" +# define MFIZZ_AWS "\uedab" +# define MFIZZ_AZURE "\uedac" +# define MFIZZ_BACKBONE "\uedad" +# define MFIZZ_BLACKBERRY "\uedae" +# define MFIZZ_BOMB "\uedaf" +# define MFIZZ_BOOTSTRAP "\uedb0" +# define MFIZZ_C "\uedb1" +# define MFIZZ_CASSANDRA "\uedb2" +# define MFIZZ_CENTOS "\uedb3" +# define MFIZZ_CLOJURE "\uedb4" +# define MFIZZ_CODEIGNITER "\uedb5" +# define MFIZZ_CODEPEN "\uedb6" +# define MFIZZ_COFFEE_BEAN "\uedb7" +# define MFIZZ_CPLUSPLUS "\uedb8" +# define MFIZZ_CSHARP "\uedb9" +# define MFIZZ_CSS "\uedba" +# define MFIZZ_CSS3 "\uedbb" +# define MFIZZ_CSS3_ALT "\uedbc" +# define MFIZZ_D3 "\uedbd" +# define MFIZZ_DATABASE "\uedbe" +# define MFIZZ_DATABASE_ALT "\uedbf" +# define MFIZZ_DATABASE_ALT2 "\uedc0" +# define MFIZZ_DEBIAN "\uedc1" +# define MFIZZ_DOCKER "\uedc2" +# define MFIZZ_DREAMHOST "\uedc3" +# define MFIZZ_ELIXIR "\uedc4" +# define MFIZZ_ELM "\uedc5" +# define MFIZZ_ERLANG "\uedc6" +# define MFIZZ_EXHERBO "\uedc7" +# define MFIZZ_FEDORA "\uedc8" +# define MFIZZ_FIRE_ALT "\uedc9" +# define MFIZZ_FREEBSD "\uedca" +# define MFIZZ_FREECODECAMP "\uedcb" +# define MFIZZ_GENTOO "\uedcc" +# define MFIZZ_GHOST "\uedcd" +# define MFIZZ_GIT "\uedce" +# define MFIZZ_GNOME "\uedcf" +# define MFIZZ_GO "\uedd0" +# define MFIZZ_GO_ALT "\uedd1" +# define MFIZZ_GOOGLE "\uedd2" +# define MFIZZ_GOOGLE_ALT "\uedd3" +# define MFIZZ_GOOGLE_CODE "\uedd4" +# define MFIZZ_GOOGLE_DEVELOPERS "\uedd5" +# define MFIZZ_GRADLE "\uedd6" +# define MFIZZ_GRAILS "\uedd7" +# define MFIZZ_GRAILS_ALT "\uedd8" +# define MFIZZ_GRUNT "\uedd9" +# define MFIZZ_GULP "\uedda" +# define MFIZZ_GULP_ALT "\ueddb" +# define MFIZZ_HADOOP "\ueddc" +# define MFIZZ_HASKELL "\ueddd" +# define MFIZZ_HEROKU "\uedde" +# define MFIZZ_HTML "\ueddf" +# define MFIZZ_HTML5 "\uede0" +# define MFIZZ_HTML5_ALT "\uede1" +# define MFIZZ_IPHONE "\uede2" +# define MFIZZ_JAVA "\uede3" +# define MFIZZ_JAVA_BOLD "\uede4" +# define MFIZZ_JAVA_DUKE "\uede5" +# define MFIZZ_JAVASCRIPT "\uede6" +# define MFIZZ_JAVASCRIPT_ALT "\uede7" +# define MFIZZ_JETTY "\uede8" +# define MFIZZ_JQUERY "\uede9" +# define MFIZZ_KDE "\uedea" +# define MFIZZ_LARAVEL "\uedeb" +# define MFIZZ_LINE_GRAPH "\uedec" +# define MFIZZ_LINUX_MINT "\ueded" +# define MFIZZ_LOOKING "\uedee" +# define MFIZZ_MAGENTO "\uedef" +# define MFIZZ_MARIADB "\uedf0" +# define MFIZZ_MAVEN "\uedf1" +# define MFIZZ_MICROSCOPE "\uedf2" +# define MFIZZ_MOBILE_DEVICE "\uedf3" +# define MFIZZ_MOBILE_PHONE_ALT "\uedf4" +# define MFIZZ_MOBILE_PHONE_BROADCAST "\uedf5" +# define MFIZZ_MONGODB "\uedf6" +# define MFIZZ_MSSQL "\uedf7" +# define MFIZZ_MYSQL "\uedf8" +# define MFIZZ_MYSQL_ALT "\uedf9" +# define MFIZZ_NETBSD "\uedfa" +# define MFIZZ_NGINX "\uedfb" +# define MFIZZ_NGINX_ALT "\uedfc" +# define MFIZZ_NGINX_ALT2 "\uedfd" +# define MFIZZ_NODEJS "\uedfe" +# define MFIZZ_NPM "\uedff" +# define MFIZZ_OBJC "\uee00" +# define MFIZZ_OPENSHIFT "\uee01" +# define MFIZZ_ORACLE "\uee02" +# define MFIZZ_ORACLE_ALT "\uee03" +# define MFIZZ_OSX "\uee04" +# define MFIZZ_PERL "\uee05" +# define MFIZZ_PHONE_ALT "\uee06" +# define MFIZZ_PHONE_GAP "\uee07" +# define MFIZZ_PHONE_RETRO "\uee08" +# define MFIZZ_PHP "\uee09" +# define MFIZZ_PHP_ALT "\uee0a" +# define MFIZZ_PLAYFRAMEWORK "\uee0b" +# define MFIZZ_PLAYFRAMEWORK_ALT "\uee0c" +# define MFIZZ_PLONE "\uee0d" +# define MFIZZ_POSTGRES "\uee0e" +# define MFIZZ_POSTGRES_ALT "\uee0f" +# define MFIZZ_PYTHON "\uee10" +# define MFIZZ_RASPBERRYPI "\uee11" +# define MFIZZ_REACTJS "\uee12" +# define MFIZZ_REDHAT "\uee13" +# define MFIZZ_REDIS "\uee14" +# define MFIZZ_RUBY "\uee15" +# define MFIZZ_RUBY_ON_RAILS "\uee16" +# define MFIZZ_RUBY_ON_RAILS_ALT "\uee17" +# define MFIZZ_RUST "\uee18" +# define MFIZZ_SASS "\uee19" +# define MFIZZ_SATELLITE "\uee1a" +# define MFIZZ_SCALA "\uee1b" +# define MFIZZ_SCALA_ALT "\uee1c" +# define MFIZZ_SCRIPT "\uee1d" +# define MFIZZ_SCRIPT_ALT "\uee1e" +# define MFIZZ_SHELL "\uee1f" +# define MFIZZ_SITEFINITY "\uee20" +# define MFIZZ_SOLARIS "\uee21" +# define MFIZZ_SPLATTER "\uee22" +# define MFIZZ_SPRING "\uee23" +# define MFIZZ_SUSE "\uee24" +# define MFIZZ_SVG "\uee25" +# define MFIZZ_SYMFONY "\uee26" +# define MFIZZ_TOMCAT "\uee27" +# define MFIZZ_UBUNTU "\uee28" +# define MFIZZ_UNITY "\uee29" +# define MFIZZ_WIRELESS "\uee2a" +# define MFIZZ_WORDPRESS "\uee2b" +# define MFIZZ_X11 "\uee2c" +# define FIRACODE_ASTERISK "\uee2d" +# define FIRACODE_PLUS "\uee2e" +# define FIRACODE_HYPHEN "\uee2f" +# define FIRACODE_SAD "\uee30" +# define FIRACODE_W_W_W "\uee31" +# define FIRACODE_ASTERISK_ASTERISK "\uee32" +# define FIRACODE_ASTERISK_ASTERISK_ASTERISK "\uee33" +# define FIRACODE_ASTERISK_ASTERISK_SLASH "\uee34" +# define FIRACODE_ASTERISK_GREATER "\uee35" +# define FIRACODE_ASTERISK_SLASH "\uee36" +# define FIRACODE_BACKSLASH_BACKSLASH "\uee37" +# define FIRACODE_BBB "\uee38" +# define FIRACODE_BRACELEFT_HYPHEN "\uee39" +# define FIRACODE_BRACKETLEFT_BRACKETRIGHT "\uee3a" +# define FIRACODE_COLON_COLON "\uee3b" +# define FIRACODE_COLON_COLON_COLON "\uee3c" +# define FIRACODE_COLON_EQUAL "\uee3d" +# define FIRACODE_EXCLAM_EXCLAM "\uee3e" +# define FIRACODE_EXCLAM_EQUAL "\uee3f" +# define FIRACODE_EXCLAM_EQUAL_EQUAL "\uee40" +# define FIRACODE_HYPHEN_BRACERIGHT "\uee41" +# define FIRACODE_HYPHEN_HYPHEN "\uee42" +# define FIRACODE_HYPHEN_HYPHEN_HYPHEN "\uee43" +# define FIRACODE_HYPHEN_HYPHEN_GREATER "\uee44" +# define FIRACODE_HYPHEN_GREATER "\uee45" +# define FIRACODE_HYPHEN_GREATER_GREATER "\uee46" +# define FIRACODE_HYPHEN_LESS "\uee47" +# define FIRACODE_HYPHEN_LESS_LESS "\uee48" +# define FIRACODE_HYPHEN_ASCIITILDE "\uee49" +# define FIRACODE_NUMBERSIGN_BRACELEFT "\uee4a" +# define FIRACODE_NUMBERSIGN_BRACKETLEFT "\uee4b" +# define FIRACODE_NUMBERSIGN_NUMBERSIGN "\uee4c" +# define FIRACODE_NNN "\uee4d" +# define FIRACODE_NNNN "\uee4e" +# define FIRACODE_NUMBERSIGN_PARENLEFT "\uee4f" +# define FIRACODE_NUMBERSIGN_QUESTION "\uee50" +# define FIRACODE_NUMBERSIGN_UNDERSCORE "\uee51" +# define FIRACODE_NUP "\uee52" +# define FIRACODE_PERIOD_HYPHEN "\uee53" +# define FIRACODE_PERIOD_EQUAL "\uee54" +# define FIRACODE_PERIOD_PERIOD "\uee55" +# define FIRACODE_PERIOD_PERIOD_LESS "\uee56" +# define FIRACODE_PERIOD_PERIOD_PERIOD "\uee57" +# define FIRACODE_QUESTION_EQUAL "\uee58" +# define FIRACODE_QUESTION_QUESTION "\uee59" +# define FIRACODE_SEMICOLON_SEMICOLON "\uee5a" +# define FIRACODE_SLASH_ASTERISK "\uee5b" +# define FIRACODE_SLASH_ASTERISK_ASTERISK "\uee5c" +# define FIRACODE_SLASH_EQUAL "\uee5d" +# define FIRACODE_SLASH_EQUAL_EQUAL "\uee5e" +# define FIRACODE_SLASH_GREATER "\uee5f" +# define FIRACODE_SLASH_SLASH "\uee60" +# define FIRACODE_SLASH_SLASH_SLASH "\uee61" +# define FIRACODE_AMPERSAND_AMPERSAND "\uee62" +# define FIRACODE_BAR_BAR "\uee63" +# define FIRACODE_BAR_BAR_EQUAL "\uee64" +# define FIRACODE_BAR_EQUAL "\uee65" +# define FIRACODE_BAR_GREATER "\uee66" +# define FIRACODE_ASCIICIRCUM_EQUAL "\uee67" +# define FIRACODE_DOLLAR_GREATER "\uee68" +# define FIRACODE_PLUS_PLUS "\uee69" +# define FIRACODE_PLUS_PLUS_PLUS "\uee6a" +# define FIRACODE_PLUS_GREATER "\uee6b" +# define FIRACODE_EQUAL_COLON_EQUAL "\uee6c" +# define FIRACODE_EQUAL_EQUAL "\uee6d" +# define FIRACODE_EQUAL_EQUAL_EQUAL "\uee6e" +# define FIRACODE_EQUAL_EQUAL_GREATER "\uee6f" +# define FIRACODE_EQUAL_GREATER "\uee70" +# define FIRACODE_EQUAL_GREATER_GREATER "\uee71" +# define FIRACODE_EQUAL_LESS "\uee72" +# define FIRACODE_EQUAL_LESS_LESS "\uee73" +# define FIRACODE_EQUAL_SLASH_EQUAL "\uee74" +# define FIRACODE_GREATER_HYPHEN "\uee75" +# define FIRACODE_GREATER_EQUAL "\uee76" +# define FIRACODE_GREATER_EQUAL_GREATER "\uee77" +# define FIRACODE_GREATER_GREATER "\uee78" +# define FIRACODE_GREATER_GREATER_HYPHEN "\uee79" +# define FIRACODE_GREATER_GREATER_EQUAL "\uee7a" +# define FIRACODE_GREATER_GREATER_GREATER "\uee7b" +# define FIRACODE_LESS_ASTERISK "\uee7c" +# define FIRACODE_LESS_ASTERISK_GREATER "\uee7d" +# define FIRACODE_LESS_BAR "\uee7e" +# define FIRACODE_LESS_BAR_GREATER "\uee7f" +# define FIRACODE_LESS_DOLLAR "\uee80" +# define FIRACODE_LESS_DOLLAR_GREATER "\uee81" +# define FIRACODE_LESS_EXCLAM_HYPHEN_HYPHEN "\uee82" +# define FIRACODE_LESS_HYPHEN "\uee83" +# define FIRACODE_LESS_HYPHEN_HYPHEN "\uee84" +# define FIRACODE_LESS_HYPHEN_GREATER "\uee85" +# define FIRACODE_LESS_PLUS "\uee86" +# define FIRACODE_LESS_PLUS_GREATER "\uee87" +# define FIRACODE_LESS_EQUAL "\uee88" +# define FIRACODE_LESS_EQUAL_EQUAL "\uee89" +# define FIRACODE_LESS_EQUAL_GREATER "\uee8a" +# define FIRACODE_LESS_EQUAL_LESS "\uee8b" +# define FIRACODE_LESS_GREATER "\uee8c" +# define FIRACODE_LESS_LESS "\uee8d" +# define FIRACODE_LESS_LESS_HYPHEN "\uee8e" +# define FIRACODE_LESS_LESS_EQUAL "\uee8f" +# define FIRACODE_LESS_LESS_LESS "\uee90" +# define FIRACODE_LESS_ASCIITILDE "\uee91" +# define FIRACODE_LESS_ASCIITILDE_ASCIITILDE "\uee92" +# define FIRACODE_LESS_SLASH "\uee93" +# define FIRACODE_LESS_SLASH_GREATER "\uee94" +# define FIRACODE_ASCIITILDE_AT "\uee95" +# define FIRACODE_ASCIITILDE_HYPHEN "\uee96" +# define FIRACODE_ASCIITILDE_EQUAL "\uee97" +# define FIRACODE_ASCIITILDE_GREATER "\uee98" +# define FIRACODE_ASCIITILDE_ASCIITILDE "\uee99" +# define FIRACODE_AAG "\uee9a" +# define FIRACODE_PERCENT_PERCENT "\uee9b" +# define FIRACODE_X_MULTIPLY "\uee9c" +# define FIRACODE_COLON_UC "\uee9d" +# define FIRACODE_PLUS_LC "\uee9e" +# define FIRACODE_PLUS_TOSF2 "\uee9f" +# define FIRACODE_NAMEME_1114119 "\ueea0" + +#endif // ICONS_IN_TERMINAL + diff --git a/nnn-4.9/icons-in-terminal/build/icons-in-terminal.ttf b/nnn-4.9/icons-in-terminal/build/icons-in-terminal.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/build/icons.fish b/nnn-4.9/icons-in-terminal/build/icons.fish @@ -0,0 +1,3730 @@ +set -g powerline_branch \ue0a0 +set -g powerline_line_number \ue0a1 +set -g powerline_readonly \ue0a2 +set -g powerline_extra_column_number \ue0a3 +set -g powerline_left_hard_divider \ue0b0 +set -g powerline_left_soft_divider \ue0b1 +set -g powerline_right_hard_divider \ue0b2 +set -g powerline_right_soft_divider \ue0b3 +set -g powerline_extra_right_half_circle_thick \ue0b4 +set -g powerline_extra_right_half_circle_thin \ue0b5 +set -g powerline_extra_left_half_circle_thick \ue0b6 +set -g powerline_extra_left_half_circle_thin \ue0b7 +set -g powerline_extra_lower_left_triangle \ue0b8 +set -g powerline_extra_backslash_separator \ue0b9 +set -g powerline_extra_lower_right_triangle \ue0ba +set -g powerline_extra_forwardslash_separator \ue0bb +set -g powerline_extra_upper_left_triangle \ue0bc +set -g powerline_extra_forwardslash_separator_redundant \ue0bd +set -g powerline_extra_upper_right_triangle \ue0be +set -g powerline_extra_backslash_separator_redundant \ue0bf +set -g powerline_extra_flame_thick \ue0c0 +set -g powerline_extra_flame_thin \ue0c1 +set -g powerline_extra_flame_thick_mirrored \ue0c2 +set -g powerline_extra_flame_thin_mirrored \ue0c3 +set -g powerline_extra_pixelated_squares_small \ue0c4 +set -g powerline_extra_pixelated_squares_small_mirrored \ue0c5 +set -g powerline_extra_pixelated_squares_big \ue0c6 +set -g powerline_extra_pixelated_squares_big_mirrored \ue0c7 +set -g powerline_extra_ice_waveform \ue0c8 +set -g powerline_extra_ice_waveform_mirrored \ue0ca +set -g powerline_extra_honeycomb \ue0cc +set -g powerline_extra_honeycomb_outline \ue0cd +set -g powerline_extra_lego_separator \ue0ce +set -g powerline_extra_lego_separator_thin \ue0cf +set -g powerline_extra_lego_block_facing \ue0d0 +set -g powerline_extra_lego_block_sideways \ue0d1 +set -g powerline_extra_trapezoid_top_bottom \ue0d2 +set -g powerline_extra_trapezoid_top_bottom_mirrored \ue0d4 +set -g oct_heart \ue000 +set -g oct_zap \ue001 +set -g oct_light_bulb \ue002 +set -g oct_repo \ue003 +set -g oct_repo_forked \ue004 +set -g oct_repo_push \ue005 +set -g oct_repo_pull \ue006 +set -g oct_book \ue007 +set -g oct_octoface \ue008 +set -g oct_git_pull_request \ue009 +set -g oct_mark_github \ue00a +set -g oct_cloud_download \ue00b +set -g oct_cloud_upload \ue00c +set -g oct_keyboard \ue00d +set -g oct_gist \ue00e +set -g oct_file_code \ue00f +set -g oct_file_text \ue010 +set -g oct_file_media \ue011 +set -g oct_file_zip \ue012 +set -g oct_file_pdf \ue013 +set -g oct_tag \ue014 +set -g oct_file_directory \ue015 +set -g oct_file_submodule \ue016 +set -g oct_person \ue017 +set -g oct_jersey \ue018 +set -g oct_git_commit \ue019 +set -g oct_git_branch \ue01a +set -g oct_git_merge \ue01b +set -g oct_mirror \ue01c +set -g oct_issue_opened \ue01d +set -g oct_issue_reopened \ue01e +set -g oct_issue_closed \ue01f +set -g oct_star \ue020 +set -g oct_comment \ue021 +set -g oct_question \ue022 +set -g oct_alert \ue023 +set -g oct_search \ue024 +set -g oct_gear \ue025 +set -g oct_radio_tower \ue026 +set -g oct_tools \ue027 +set -g oct_sign_out \ue028 +set -g oct_rocket \ue029 +set -g oct_rss \ue02a +set -g oct_clippy \ue02b +set -g oct_sign_in \ue02c +set -g oct_organization \ue02d +set -g oct_device_mobile \ue02e +set -g oct_unfold \ue02f +set -g oct_check \ue030 +set -g oct_mail \ue031 +set -g oct_mail_read \ue032 +set -g oct_arrow_up \ue033 +set -g oct_arrow_right \ue034 +set -g oct_arrow_down \ue035 +set -g oct_arrow_left \ue036 +set -g oct_pin \ue037 +set -g oct_gift \ue038 +set -g oct_graph \ue039 +set -g oct_triangle_left \ue03a +set -g oct_credit_card \ue03b +set -g oct_clock \ue03c +set -g oct_ruby \ue03d +set -g oct_broadcast \ue03e +set -g oct_key \ue03f +set -g oct_repo_force_push \ue040 +set -g oct_repo_clone \ue041 +set -g oct_diff \ue042 +set -g oct_eye \ue043 +set -g oct_comment_discussion \ue044 +set -g oct_mail_reply \ue045 +set -g oct_primitive_dot \ue046 +set -g oct_primitive_square \ue047 +set -g oct_device_camera \ue048 +set -g oct_device_camera_video \ue049 +set -g oct_pencil \ue04a +set -g oct_info \ue04b +set -g oct_triangle_right \ue04c +set -g oct_triangle_down \ue04d +set -g oct_link \ue04e +set -g oct_plus \ue04f +set -g oct_three_bars \ue050 +set -g oct_code \ue051 +set -g oct_location \ue052 +set -g oct_list_unordered \ue053 +set -g oct_list_ordered \ue054 +set -g oct_quote \ue055 +set -g oct_versions \ue056 +set -g oct_calendar \ue057 +set -g oct_lock \ue058 +set -g oct_diff_added \ue059 +set -g oct_diff_removed \ue05a +set -g oct_diff_modified \ue05b +set -g oct_diff_renamed \ue05c +set -g oct_horizontal_rule \ue05d +set -g oct_arrow_small_right \ue05e +set -g oct_milestone \ue05f +set -g oct_checklist \ue060 +set -g oct_megaphone \ue061 +set -g oct_chevron_right \ue062 +set -g oct_bookmark \ue063 +set -g oct_settings \ue064 +set -g oct_dashboard \ue065 +set -g oct_history \ue066 +set -g oct_link_external \ue067 +set -g oct_mute \ue068 +set -g oct_x \ue069 +set -g oct_circle_slash \ue06a +set -g oct_pulse \ue06b +set -g oct_sync \ue06c +set -g oct_telescope \ue06d +set -g oct_gist_secret \ue06e +set -g oct_home \ue06f +set -g oct_stop \ue070 +set -g oct_bug \ue071 +set -g oct_logo_github \ue072 +set -g oct_file_binary \ue073 +set -g oct_database \ue074 +set -g oct_server \ue075 +set -g oct_diff_ignored \ue076 +set -g oct_ellipsis \ue077 +set -g oct_no_newline \ue078 +set -g oct_hubot \ue079 +set -g oct_arrow_small_up \ue07a +set -g oct_arrow_small_down \ue07b +set -g oct_arrow_small_left \ue07c +set -g oct_chevron_up \ue07d +set -g oct_chevron_down \ue07e +set -g oct_chevron_left \ue07f +set -g oct_triangle_up \ue080 +set -g oct_git_compare \ue081 +set -g oct_logo_gist \ue082 +set -g oct_file_symlink_file \ue083 +set -g oct_file_symlink_directory \ue084 +set -g oct_squirrel \ue085 +set -g oct_globe \ue086 +set -g oct_unmute \ue087 +set -g oct_mention \ue088 +set -g oct_package \ue089 +set -g oct_browser \ue08a +set -g oct_terminal \ue08b +set -g oct_markdown \ue08c +set -g oct_dash \ue08d +set -g oct_fold \ue08e +set -g oct_inbox \ue08f +set -g oct_trashcan \ue090 +set -g oct_paintcan \ue091 +set -g oct_flame \ue092 +set -g oct_briefcase \ue093 +set -g oct_plug \ue094 +set -g oct_circuit_board \ue095 +set -g oct_mortar_board \ue096 +set -g oct_law \ue097 +set -g oct_thumbsup \ue098 +set -g oct_thumbsdown \ue099 +set -g oct_desktop_download \ue09a +set -g oct_beaker \ue09b +set -g oct_bell \ue09c +set -g oct_watch \ue09d +set -g oct_shield \ue09e +set -g oct_bold \ue09f +set -g oct_text_size \ue0d5 +set -g oct_italic \ue0d6 +set -g oct_tasklist \ue0d7 +set -g oct_verified \ue0d8 +set -g oct_smiley \ue0d9 +set -g oct_unverified \ue0da +set -g oct_ellipses \ue0db +set -g oct_file \ue0dc +set -g oct_grabber \ue0dd +set -g oct_plus_small \ue0de +set -g oct_reply \ue0df +set -g oct_device_desktop \ue0e0 +set -g fa_glass \ue0e1 +set -g fa_music \ue0e2 +set -g fa_search \ue0e3 +set -g fa_envelope_o \ue0e4 +set -g fa_heart \ue0e5 +set -g fa_star \ue0e6 +set -g fa_star_o \ue0e7 +set -g fa_user \ue0e8 +set -g fa_film \ue0e9 +set -g fa_th_large \ue0ea +set -g fa_th \ue0eb +set -g fa_th_list \ue0ec +set -g fa_check \ue0ed +set -g fa_close \ue0ee +set -g fa_search_plus \ue0ef +set -g fa_search_minus \ue0f0 +set -g fa_power_off \ue0f1 +set -g fa_signal \ue0f2 +set -g fa_cog \ue0f3 +set -g fa_trash_o \ue0f4 +set -g fa_home \ue0f5 +set -g fa_file_o \ue0f6 +set -g fa_clock_o \ue0f7 +set -g fa_road \ue0f8 +set -g fa_download \ue0f9 +set -g fa_arrow_circle_o_down \ue0fa +set -g fa_arrow_circle_o_up \ue0fb +set -g fa_inbox \ue0fc +set -g fa_play_circle_o \ue0fd +set -g fa_repeat \ue0fe +set -g fa_refresh \ue0ff +set -g fa_list_alt \ue100 +set -g fa_lock \ue101 +set -g fa_flag \ue102 +set -g fa_headphones \ue103 +set -g fa_volume_off \ue104 +set -g fa_volume_down \ue105 +set -g fa_volume_up \ue106 +set -g fa_qrcode \ue107 +set -g fa_barcode \ue108 +set -g fa_tag \ue109 +set -g fa_tags \ue10a +set -g fa_book \ue10b +set -g fa_bookmark \ue10c +set -g fa_print \ue10d +set -g fa_camera \ue10e +set -g fa_font \ue10f +set -g fa_bold \ue110 +set -g fa_italic \ue111 +set -g fa_text_height \ue112 +set -g fa_text_width \ue113 +set -g fa_align_left \ue114 +set -g fa_align_center \ue115 +set -g fa_align_right \ue116 +set -g fa_align_justify \ue117 +set -g fa_list \ue118 +set -g fa_dedent \ue119 +set -g fa_indent \ue11a +set -g fa_video_camera \ue11b +set -g fa_image \ue11c +set -g fa_pencil \ue11d +set -g fa_map_marker \ue11e +set -g fa_adjust \ue11f +set -g fa_tint \ue120 +set -g fa_edit \ue121 +set -g fa_share_square_o \ue122 +set -g fa_check_square_o \ue123 +set -g fa_arrows \ue124 +set -g fa_step_backward \ue125 +set -g fa_fast_backward \ue126 +set -g fa_backward \ue127 +set -g fa_play \ue128 +set -g fa_pause \ue129 +set -g fa_stop \ue12a +set -g fa_forward \ue12b +set -g fa_fast_forward \ue12c +set -g fa_step_forward \ue12d +set -g fa_eject \ue12e +set -g fa_chevron_left \ue12f +set -g fa_chevron_right \ue130 +set -g fa_plus_circle \ue131 +set -g fa_minus_circle \ue132 +set -g fa_times_circle \ue133 +set -g fa_check_circle \ue134 +set -g fa_question_circle \ue135 +set -g fa_info_circle \ue136 +set -g fa_crosshairs \ue137 +set -g fa_times_circle_o \ue138 +set -g fa_check_circle_o \ue139 +set -g fa_ban \ue13a +set -g fa_arrow_left \ue13b +set -g fa_arrow_right \ue13c +set -g fa_arrow_up \ue13d +set -g fa_arrow_down \ue13e +set -g fa_mail_forward \ue13f +set -g fa_expand \ue140 +set -g fa_compress \ue141 +set -g fa_plus \ue142 +set -g fa_minus \ue143 +set -g fa_asterisk \ue144 +set -g fa_exclamation_circle \ue145 +set -g fa_gift \ue146 +set -g fa_leaf \ue147 +set -g fa_fire \ue148 +set -g fa_eye \ue149 +set -g fa_eye_slash \ue14a +set -g fa_exclamation_triangle \ue14b +set -g fa_plane \ue14c +set -g fa_calendar \ue14d +set -g fa_random \ue14e +set -g fa_comment \ue14f +set -g fa_magnet \ue150 +set -g fa_chevron_up \ue151 +set -g fa_chevron_down \ue152 +set -g fa_retweet \ue153 +set -g fa_shopping_cart \ue154 +set -g fa_folder \ue155 +set -g fa_folder_open \ue156 +set -g fa_arrows_v \ue157 +set -g fa_arrows_h \ue158 +set -g fa_bar_chart \ue159 +set -g fa_twitter_square \ue15a +set -g fa_facebook_square \ue15b +set -g fa_camera_retro \ue15c +set -g fa_key \ue15d +set -g fa_cogs \ue15e +set -g fa_comments \ue15f +set -g fa_thumbs_o_up \ue160 +set -g fa_thumbs_o_down \ue161 +set -g fa_star_half \ue162 +set -g fa_heart_o \ue163 +set -g fa_sign_out \ue164 +set -g fa_linkedin_square \ue165 +set -g fa_thumb_tack \ue166 +set -g fa_external_link \ue167 +set -g fa_sign_in \ue168 +set -g fa_trophy \ue169 +set -g fa_github_square \ue16a +set -g fa_upload \ue16b +set -g fa_lemon_o \ue16c +set -g fa_phone \ue16d +set -g fa_square_o \ue16e +set -g fa_bookmark_o \ue16f +set -g fa_phone_square \ue170 +set -g fa_twitter \ue171 +set -g fa_facebook \ue172 +set -g fa_github \ue173 +set -g fa_unlock \ue174 +set -g fa_credit_card \ue175 +set -g fa_feed \ue176 +set -g fa_hdd_o \ue177 +set -g fa_bullhorn \ue178 +set -g fa_bell_o \ue179 +set -g fa_certificate \ue17a +set -g fa_hand_o_right \ue17b +set -g fa_hand_o_left \ue17c +set -g fa_hand_o_up \ue17d +set -g fa_hand_o_down \ue17e +set -g fa_arrow_circle_left \ue17f +set -g fa_arrow_circle_right \ue180 +set -g fa_arrow_circle_up \ue181 +set -g fa_arrow_circle_down \ue182 +set -g fa_globe \ue183 +set -g fa_wrench \ue184 +set -g fa_tasks \ue185 +set -g fa_filter \ue186 +set -g fa_briefcase \ue187 +set -g fa_arrows_alt \ue188 +set -g fa_group \ue189 +set -g fa_chain \ue18a +set -g fa_cloud \ue18b +set -g fa_flask \ue18c +set -g fa_cut \ue18d +set -g fa_copy \ue18e +set -g fa_paperclip \ue18f +set -g fa_floppy_o \ue190 +set -g fa_square \ue191 +set -g fa_bars \ue192 +set -g fa_list_ul \ue193 +set -g fa_list_ol \ue194 +set -g fa_strikethrough \ue195 +set -g fa_underline \ue196 +set -g fa_table \ue197 +set -g fa_magic \ue198 +set -g fa_truck \ue199 +set -g fa_pinterest \ue19a +set -g fa_pinterest_square \ue19b +set -g fa_google_plus_square \ue19c +set -g fa_google_plus \ue19d +set -g fa_money \ue19e +set -g fa_caret_down \ue19f +set -g fa_caret_up \ue1a0 +set -g fa_caret_left \ue1a1 +set -g fa_caret_right \ue1a2 +set -g fa_columns \ue1a3 +set -g fa_sort \ue1a4 +set -g fa_sort_desc \ue1a5 +set -g fa_sort_asc \ue1a6 +set -g fa_envelope \ue1a7 +set -g fa_linkedin \ue1a8 +set -g fa_rotate_left \ue1a9 +set -g fa_gavel \ue1aa +set -g fa_dashboard \ue1ab +set -g fa_comment_o \ue1ac +set -g fa_comments_o \ue1ad +set -g fa_bolt \ue1ae +set -g fa_sitemap \ue1af +set -g fa_umbrella \ue1b0 +set -g fa_clipboard \ue1b1 +set -g fa_lightbulb_o \ue1b2 +set -g fa_exchange \ue1b3 +set -g fa_cloud_download \ue1b4 +set -g fa_cloud_upload \ue1b5 +set -g fa_user_md \ue1b6 +set -g fa_stethoscope \ue1b7 +set -g fa_suitcase \ue1b8 +set -g fa_bell \ue1b9 +set -g fa_coffee \ue1ba +set -g fa_cutlery \ue1bb +set -g fa_file_text_o \ue1bc +set -g fa_building_o \ue1bd +set -g fa_hospital_o \ue1be +set -g fa_ambulance \ue1bf +set -g fa_medkit \ue1c0 +set -g fa_fighter_jet \ue1c1 +set -g fa_beer \ue1c2 +set -g fa_h_square \ue1c3 +set -g fa_plus_square \ue1c4 +set -g fa_angle_double_left \ue1c5 +set -g fa_angle_double_right \ue1c6 +set -g fa_angle_double_up \ue1c7 +set -g fa_angle_double_down \ue1c8 +set -g fa_angle_left \ue1c9 +set -g fa_angle_right \ue1ca +set -g fa_angle_up \ue1cb +set -g fa_angle_down \ue1cc +set -g fa_desktop \ue1cd +set -g fa_laptop \ue1ce +set -g fa_tablet \ue1cf +set -g fa_mobile \ue1d0 +set -g fa_circle_o \ue1d1 +set -g fa_quote_left \ue1d2 +set -g fa_quote_right \ue1d3 +set -g fa_spinner \ue1d4 +set -g fa_circle \ue1d5 +set -g fa_mail_reply \ue1d6 +set -g fa_github_alt \ue1d7 +set -g fa_folder_o \ue1d8 +set -g fa_folder_open_o \ue1d9 +set -g fa_expand_alt \ue1da +set -g fa_collapse_alt \ue1db +set -g fa_smile_o \ue1dc +set -g fa_frown_o \ue1dd +set -g fa_meh_o \ue1de +set -g fa_gamepad \ue1df +set -g fa_keyboard_o \ue1e0 +set -g fa_flag_o \ue1e1 +set -g fa_flag_checkered \ue1e2 +set -g fa_terminal \ue1e3 +set -g fa_code \ue1e4 +set -g fa_mail_reply_all \ue1e5 +set -g fa_star_half_empty \ue1e6 +set -g fa_location_arrow \ue1e7 +set -g fa_crop \ue1e8 +set -g fa_code_fork \ue1e9 +set -g fa_chain_broken \ue1ea +set -g fa_question \ue1eb +set -g fa_info \ue1ec +set -g fa_exclamation \ue1ed +set -g fa_superscript \ue1ee +set -g fa_subscript \ue1ef +set -g fa_eraser \ue1f0 +set -g fa_puzzle_piece \ue1f1 +set -g fa_microphone \ue1f2 +set -g fa_microphone_slash \ue1f3 +set -g fa_shield \ue1f4 +set -g fa_calendar_o \ue1f5 +set -g fa_fire_extinguisher \ue1f6 +set -g fa_rocket \ue1f7 +set -g fa_maxcdn \ue1f8 +set -g fa_chevron_circle_left \ue1f9 +set -g fa_chevron_circle_right \ue1fa +set -g fa_chevron_circle_up \ue1fb +set -g fa_chevron_circle_down \ue1fc +set -g fa_html5 \ue1fd +set -g fa_css3 \ue1fe +set -g fa_anchor \ue1ff +set -g fa_unlock_alt \ue200 +set -g fa_bullseye \ue201 +set -g fa_ellipsis_h \ue202 +set -g fa_ellipsis_v \ue203 +set -g fa_rss_square \ue204 +set -g fa_play_circle \ue205 +set -g fa_ticket \ue206 +set -g fa_minus_square \ue207 +set -g fa_minus_square_o \ue208 +set -g fa_level_up \ue209 +set -g fa_level_down \ue20a +set -g fa_check_square \ue20b +set -g fa_pencil_square \ue20c +set -g fa_external_link_square \ue20d +set -g fa_share_square \ue20e +set -g fa_compass \ue20f +set -g fa_caret_square_o_down \ue210 +set -g fa_caret_square_o_up \ue211 +set -g fa_caret_square_o_right \ue212 +set -g fa_eur \ue213 +set -g fa_gbp \ue214 +set -g fa_dollar \ue215 +set -g fa_inr \ue216 +set -g fa_cny \ue217 +set -g fa_rouble \ue218 +set -g fa_krw \ue219 +set -g fa_bitcoin \ue21a +set -g fa_file \ue21b +set -g fa_file_text \ue21c +set -g fa_sort_alpha_asc \ue21d +set -g fa_sort_alpha_desc \ue21e +set -g fa_sort_amount_asc \ue21f +set -g fa_sort_amount_desc \ue220 +set -g fa_sort_numeric_asc \ue221 +set -g fa_sort_numeric_desc \ue222 +set -g fa_thumbs_up \ue223 +set -g fa_thumbs_down \ue224 +set -g fa_youtube_square \ue225 +set -g fa_youtube \ue226 +set -g fa_xing \ue227 +set -g fa_xing_square \ue228 +set -g fa_youtube_play \ue229 +set -g fa_dropbox \ue22a +set -g fa_stack_overflow \ue22b +set -g fa_instagram \ue22c +set -g fa_flickr \ue22d +set -g fa_adn \ue22e +set -g fa_bitbucket \ue22f +set -g fa_bitbucket_square \ue230 +set -g fa_tumblr \ue231 +set -g fa_tumblr_square \ue232 +set -g fa_long_arrow_down \ue233 +set -g fa_long_arrow_up \ue234 +set -g fa_long_arrow_left \ue235 +set -g fa_long_arrow_right \ue236 +set -g fa_apple \ue237 +set -g fa_windows \ue238 +set -g fa_android \ue239 +set -g fa_linux \ue23a +set -g fa_dribbble \ue23b +set -g fa_skype \ue23c +set -g fa_foursquare \ue23d +set -g fa_trello \ue23e +set -g fa_female \ue23f +set -g fa_male \ue240 +set -g fa_gittip \ue241 +set -g fa_sun_o \ue242 +set -g fa_moon_o \ue243 +set -g fa_archive \ue244 +set -g fa_bug \ue245 +set -g fa_vk \ue246 +set -g fa_weibo \ue247 +set -g fa_renren \ue248 +set -g fa_pagelines \ue249 +set -g fa_stack_exchange \ue24a +set -g fa_arrow_circle_o_right \ue24b +set -g fa_arrow_circle_o_left \ue24c +set -g fa_caret_square_o_left \ue24d +set -g fa_dot_circle_o \ue24e +set -g fa_wheelchair \ue24f +set -g fa_vimeo_square \ue250 +set -g fa_try \ue251 +set -g fa_plus_square_o \ue252 +set -g fa_space_shuttle \ue253 +set -g fa_slack \ue254 +set -g fa_envelope_square \ue255 +set -g fa_wordpress \ue256 +set -g fa_openid \ue257 +set -g fa_bank \ue258 +set -g fa_graduation_cap \ue259 +set -g fa_yahoo \ue25a +set -g fa_google \ue25b +set -g fa_reddit \ue25c +set -g fa_reddit_square \ue25d +set -g fa_stumbleupon_circle \ue25e +set -g fa_stumbleupon \ue25f +set -g fa_delicious \ue260 +set -g fa_digg \ue261 +set -g fa_pied_piper_pp \ue262 +set -g fa_pied_piper_alt \ue263 +set -g fa_drupal \ue264 +set -g fa_joomla \ue265 +set -g fa_language \ue266 +set -g fa_fax \ue267 +set -g fa_building \ue268 +set -g fa_child \ue269 +set -g fa_paw \ue26a +set -g fa_spoon \ue26b +set -g fa_cube \ue26c +set -g fa_cubes \ue26d +set -g fa_behance \ue26e +set -g fa_behance_square \ue26f +set -g fa_steam \ue270 +set -g fa_steam_square \ue271 +set -g fa_recycle \ue272 +set -g fa_automobile \ue273 +set -g fa_cab \ue274 +set -g fa_tree \ue275 +set -g fa_spotify \ue276 +set -g fa_deviantart \ue277 +set -g fa_soundcloud \ue278 +set -g fa_database \ue279 +set -g fa_file_pdf_o \ue27a +set -g fa_file_word_o \ue27b +set -g fa_file_excel_o \ue27c +set -g fa_file_powerpoint_o \ue27d +set -g fa_file_image_o \ue27e +set -g fa_file_archive_o \ue27f +set -g fa_file_audio_o \ue280 +set -g fa_file_movie_o \ue281 +set -g fa_file_code_o \ue282 +set -g fa_vine \ue283 +set -g fa_codepen \ue284 +set -g fa_jsfiddle \ue285 +set -g fa_life_bouy \ue286 +set -g fa_circle_o_notch \ue287 +set -g fa_ra \ue288 +set -g fa_empire \ue289 +set -g fa_git_square \ue28a +set -g fa_git \ue28b +set -g fa_hacker_news \ue28c +set -g fa_tencent_weibo \ue28d +set -g fa_qq \ue28e +set -g fa_wechat \ue28f +set -g fa_paper_plane \ue290 +set -g fa_paper_plane_o \ue291 +set -g fa_history \ue292 +set -g fa_circle_thin \ue293 +set -g fa_header \ue294 +set -g fa_paragraph \ue295 +set -g fa_sliders \ue296 +set -g fa_share_alt \ue297 +set -g fa_share_alt_square \ue298 +set -g fa_bomb \ue299 +set -g fa_futbol_o \ue29a +set -g fa_tty \ue29b +set -g fa_binoculars \ue29c +set -g fa_plug \ue29d +set -g fa_slideshare \ue29e +set -g fa_twitch \ue29f +set -g fa_yelp \ue2a0 +set -g fa_newspaper_o \ue2a1 +set -g fa_wifi \ue2a2 +set -g fa_calculator \ue2a3 +set -g fa_paypal \ue2a4 +set -g fa_google_wallet \ue2a5 +set -g fa_cc_visa \ue2a6 +set -g fa_cc_mastercard \ue2a7 +set -g fa_cc_discover \ue2a8 +set -g fa_cc_amex \ue2a9 +set -g fa_cc_paypal \ue2aa +set -g fa_cc_stripe \ue2ab +set -g fa_bell_slash \ue2ac +set -g fa_bell_slash_o \ue2ad +set -g fa_trash \ue2ae +set -g fa_copyright \ue2af +set -g fa_at \ue2b0 +set -g fa_eyedropper \ue2b1 +set -g fa_paint_brush \ue2b2 +set -g fa_birthday_cake \ue2b3 +set -g fa_area_chart \ue2b4 +set -g fa_pie_chart \ue2b5 +set -g fa_line_chart \ue2b6 +set -g fa_lastfm \ue2b7 +set -g fa_lastfm_square \ue2b8 +set -g fa_toggle_off \ue2b9 +set -g fa_toggle_on \ue2ba +set -g fa_bicycle \ue2bb +set -g fa_bus \ue2bc +set -g fa_ioxhost \ue2bd +set -g fa_angellist \ue2be +set -g fa_cc \ue2bf +set -g fa_ils \ue2c0 +set -g fa_meanpath \ue2c1 +set -g fa_buysellads \ue2c2 +set -g fa_connectdevelop \ue2c3 +set -g fa_dashcube \ue2c4 +set -g fa_forumbee \ue2c5 +set -g fa_leanpub \ue2c6 +set -g fa_sellsy \ue2c7 +set -g fa_shirtsinbulk \ue2c8 +set -g fa_simplybuilt \ue2c9 +set -g fa_skyatlas \ue2ca +set -g fa_cart_plus \ue2cb +set -g fa_cart_arrow_down \ue2cc +set -g fa_diamond \ue2cd +set -g fa_ship \ue2ce +set -g fa_user_secret \ue2cf +set -g fa_motorcycle \ue2d0 +set -g fa_street_view \ue2d1 +set -g fa_heartbeat \ue2d2 +set -g fa_venus \ue2d3 +set -g fa_mars \ue2d4 +set -g fa_mercury \ue2d5 +set -g fa_intersex \ue2d6 +set -g fa_transgender_alt \ue2d7 +set -g fa_venus_double \ue2d8 +set -g fa_mars_double \ue2d9 +set -g fa_venus_mars \ue2da +set -g fa_mars_stroke \ue2db +set -g fa_mars_stroke_v \ue2dc +set -g fa_mars_stroke_h \ue2dd +set -g fa_neuter \ue2de +set -g fa_genderless \ue2df +set -g fa__523 \ue2e0 +set -g fa__524 \ue2e1 +set -g fa_facebook_official \ue2e2 +set -g fa_pinterest_p \ue2e3 +set -g fa_whatsapp \ue2e4 +set -g fa_server \ue2e5 +set -g fa_user_plus \ue2e6 +set -g fa_user_times \ue2e7 +set -g fa_bed \ue2e8 +set -g fa_viacoin \ue2e9 +set -g fa_train \ue2ea +set -g fa_subway \ue2eb +set -g fa_medium \ue2ec +set -g fa_y_combinator \ue2ed +set -g fa_optin_monster \ue2ee +set -g fa_opencart \ue2ef +set -g fa_expeditedssl \ue2f0 +set -g fa_battery \ue2f1 +set -g fa_battery_3 \ue2f2 +set -g fa_battery_2 \ue2f3 +set -g fa_battery_1 \ue2f4 +set -g fa_battery_0 \ue2f5 +set -g fa_mouse_pointer \ue2f6 +set -g fa_i_cursor \ue2f7 +set -g fa_object_group \ue2f8 +set -g fa_object_ungroup \ue2f9 +set -g fa_sticky_note \ue2fa +set -g fa_sticky_note_o \ue2fb +set -g fa_cc_jcb \ue2fc +set -g fa_cc_diners_club \ue2fd +set -g fa_clone \ue2fe +set -g fa_balance_scale \ue2ff +set -g fa_hourglass_o \ue300 +set -g fa_hourglass_1 \ue301 +set -g fa_hourglass_2 \ue302 +set -g fa_hourglass_3 \ue303 +set -g fa_hourglass \ue304 +set -g fa_hand_grab_o \ue305 +set -g fa_hand_paper_o \ue306 +set -g fa_hand_scissors_o \ue307 +set -g fa_hand_lizard_o \ue308 +set -g fa_hand_spock_o \ue309 +set -g fa_hand_pointer_o \ue30a +set -g fa_hand_peace_o \ue30b +set -g fa_trademark \ue30c +set -g fa_registered \ue30d +set -g fa_creative_commons \ue30e +set -g fa_gg \ue30f +set -g fa_gg_circle \ue310 +set -g fa_tripadvisor \ue311 +set -g fa_odnoklassniki \ue312 +set -g fa_odnoklassniki_square \ue313 +set -g fa_get_pocket \ue314 +set -g fa_wikipedia_w \ue315 +set -g fa_safari \ue316 +set -g fa_chrome \ue317 +set -g fa_firefox \ue318 +set -g fa_opera \ue319 +set -g fa_internet_explorer \ue31a +set -g fa_television \ue31b +set -g fa_contao \ue31c +set -g fa_500px \ue31d +set -g fa_amazon \ue31e +set -g fa_calendar_plus_o \ue31f +set -g fa_calendar_minus_o \ue320 +set -g fa_calendar_times_o \ue321 +set -g fa_calendar_check_o \ue322 +set -g fa_industry \ue323 +set -g fa_map_pin \ue324 +set -g fa_map_signs \ue325 +set -g fa_map_o \ue326 +set -g fa_map \ue327 +set -g fa_commenting \ue328 +set -g fa_commenting_o \ue329 +set -g fa_houzz \ue32a +set -g fa_vimeo \ue32b +set -g fa_black_tie \ue32c +set -g fa_fonticons \ue32d +set -g fa_reddit_alien \ue32e +set -g fa_edge \ue32f +set -g fa_credit_card_alt \ue330 +set -g fa_codiepie \ue331 +set -g fa_modx \ue332 +set -g fa_fort_awesome \ue333 +set -g fa_usb \ue334 +set -g fa_product_hunt \ue335 +set -g fa_mixcloud \ue336 +set -g fa_scribd \ue337 +set -g fa_pause_circle \ue338 +set -g fa_pause_circle_o \ue339 +set -g fa_stop_circle \ue33a +set -g fa_stop_circle_o \ue33b +set -g fa_shopping_bag \ue33c +set -g fa_shopping_basket \ue33d +set -g fa_hashtag \ue33e +set -g fa_bluetooth \ue33f +set -g fa_bluetooth_b \ue340 +set -g fa_percent \ue341 +set -g fa_gitlab \ue342 +set -g fa_wpbeginner \ue343 +set -g fa_wpforms \ue344 +set -g fa_envira \ue345 +set -g fa_universal_access \ue346 +set -g fa_wheelchair_alt \ue347 +set -g fa_question_circle_o \ue348 +set -g fa_blind \ue349 +set -g fa_audio_description \ue34a +set -g fa_volume_control_phone \ue34b +set -g fa_braille \ue34c +set -g fa_assistive_listening_systems \ue34d +set -g fa_american_sign_language_interpreting \ue34e +set -g fa_deaf \ue34f +set -g fa_glide \ue350 +set -g fa_glide_g \ue351 +set -g fa_sign_language \ue352 +set -g fa_low_vision \ue353 +set -g fa_viadeo \ue354 +set -g fa_viadeo_square \ue355 +set -g fa_snapchat \ue356 +set -g fa_snapchat_ghost \ue357 +set -g fa_snapchat_square \ue358 +set -g fa_pied_piper \ue359 +set -g fa_first_order \ue35a +set -g fa_yoast \ue35b +set -g fa_themeisle \ue35c +set -g fa_google_plus_circle \ue35d +set -g fa_fa \ue35e +set -g fa_handshake_o \ue35f +set -g fa_envelope_open \ue360 +set -g fa_envelope_open_o \ue361 +set -g fa_linode \ue362 +set -g fa_address_book \ue363 +set -g fa_address_book_o \ue364 +set -g fa_address_card \ue365 +set -g fa_address_card_o \ue366 +set -g fa_user_circle \ue367 +set -g fa_user_circle_o \ue368 +set -g fa_user_o \ue369 +set -g fa_id_badge \ue36a +set -g fa_drivers_license \ue36b +set -g fa_drivers_license_o \ue36c +set -g fa_quora \ue36d +set -g fa_free_code_camp \ue36e +set -g fa_telegram \ue36f +set -g fa_thermometer \ue370 +set -g fa_thermometer_3 \ue371 +set -g fa_thermometer_2 \ue372 +set -g fa_thermometer_1 \ue373 +set -g fa_thermometer_0 \ue374 +set -g fa_shower \ue375 +set -g fa_bath \ue376 +set -g fa_podcast \ue377 +set -g fa_window_maximize \ue378 +set -g fa_window_minimize \ue379 +set -g fa_window_restore \ue37a +set -g fa_times_rectangle \ue37b +set -g fa_times_rectangle_o \ue37c +set -g fa_bandcamp \ue37d +set -g fa_grav \ue37e +set -g fa_etsy \ue37f +set -g fa_imdb \ue380 +set -g fa_ravelry \ue381 +set -g fa_eercast \ue382 +set -g fa_microchip \ue383 +set -g fa_snowflake_o \ue384 +set -g fa_superpowers \ue385 +set -g fa_wpexplorer \ue386 +set -g fa_meetup \ue387 +set -g md_error \ue388 +set -g md_error_outline \ue389 +set -g md_warning \ue38a +set -g md_add_alert \ue38b +set -g md_album \ue38c +set -g md_av_timer \ue38d +set -g md_closed_caption \ue38e +set -g md_equalizer \ue38f +set -g md_explicit \ue390 +set -g md_fast_forward \ue391 +set -g md_fast_rewind \ue392 +set -g md_games \ue393 +set -g md_hearing \ue394 +set -g md_high_quality \ue395 +set -g md_loop \ue396 +set -g md_mic \ue397 +set -g md_mic_none \ue398 +set -g md_mic_off \ue399 +set -g md_movie \ue39a +set -g md_library_add \ue39b +set -g md_library_books \ue39c +set -g md_library_music \ue39d +set -g md_new_releases \ue39e +set -g md_not_interested \ue39f +set -g md_pause \ue3a0 +set -g md_pause_circle_filled \ue3a1 +set -g md_pause_circle_outline \ue3a2 +set -g md_play_arrow \ue3a3 +set -g md_play_circle_filled \ue3a4 +set -g md_play_circle_outline \ue3a5 +set -g md_playlist_add \ue3a6 +set -g md_queue \ue3a7 +set -g md_queue_music \ue3a8 +set -g md_radio \ue3a9 +set -g md_recent_actors \ue3aa +set -g md_repeat \ue3ab +set -g md_repeat_one \ue3ac +set -g md_replay \ue3ad +set -g md_shuffle \ue3ae +set -g md_skip_next \ue3af +set -g md_skip_previous \ue3b0 +set -g md_snooze \ue3b1 +set -g md_stop \ue3b2 +set -g md_subtitles \ue3b3 +set -g md_surround_sound \ue3b4 +set -g md_video_library \ue3b5 +set -g md_videocam \ue3b6 +set -g md_videocam_off \ue3b7 +set -g md_volume_down \ue3b8 +set -g md_volume_mute \ue3b9 +set -g md_volume_off \ue3ba +set -g md_volume_up \ue3bb +set -g md_web \ue3bc +set -g md_hd \ue3bd +set -g md_sort_by_alpha \ue3be +set -g md_airplay \ue3bf +set -g md_forward_10 \ue3c0 +set -g md_forward_30 \ue3c1 +set -g md_forward_5 \ue3c2 +set -g md_replay_10 \ue3c3 +set -g md_replay_30 \ue3c4 +set -g md_replay_5 \ue3c5 +set -g md_add_to_queue \ue3c6 +set -g md_fiber_dvr \ue3c7 +set -g md_fiber_new \ue3c8 +set -g md_playlist_play \ue3c9 +set -g md_art_track \ue3ca +set -g md_fiber_manual_record \ue3cb +set -g md_fiber_smart_record \ue3cc +set -g md_music_video \ue3cd +set -g md_subscriptions \ue3ce +set -g md_playlist_add_check \ue3cf +set -g md_queue_play_next \ue3d0 +set -g md_remove_from_queue \ue3d1 +set -g md_slow_motion_video \ue3d2 +set -g md_web_asset \ue3d3 +set -g md_fiber_pin \ue3d4 +set -g md_branding_watermark \ue3d5 +set -g md_call_to_action \ue3d6 +set -g md_featured_play_list \ue3d7 +set -g md_featured_video \ue3d8 +set -g md_note \ue3d9 +set -g md_video_call \ue3da +set -g md_video_label \ue3db +set -g md_business \ue3dc +set -g md_call \ue3dd +set -g md_call_end \ue3de +set -g md_call_made \ue3df +set -g md_call_merge \ue3e0 +set -g md_call_missed \ue3e1 +set -g md_call_received \ue3e2 +set -g md_call_split \ue3e3 +set -g md_chat \ue3e4 +set -g md_clear_all \ue3e5 +set -g md_comment \ue3e6 +set -g md_contacts \ue3e7 +set -g md_dialer_sip \ue3e8 +set -g md_dialpad \ue3e9 +set -g md_email \ue3ea +set -g md_forum \ue3eb +set -g md_import_export \ue3ec +set -g md_invert_colors_off \ue3ed +set -g md_live_help \ue3ee +set -g md_location_off \ue3ef +set -g md_location_on \ue3f0 +set -g md_message \ue3f1 +set -g md_chat_bubble \ue3f2 +set -g md_chat_bubble_outline \ue3f3 +set -g md_no_sim \ue3f4 +set -g md_phone \ue3f5 +set -g md_portable_wifi_off \ue3f6 +set -g md_contact_phone \ue3f7 +set -g md_contact_mail \ue3f8 +set -g md_ring_volume \ue3f9 +set -g md_speaker_phone \ue3fa +set -g md_stay_current_landscape \ue3fb +set -g md_stay_current_portrait \ue3fc +set -g md_stay_primary_landscape \ue3fd +set -g md_stay_primary_portrait \ue3fe +set -g md_swap_calls \ue3ff +set -g md_textsms \ue400 +set -g md_voicemail \ue401 +set -g md_vpn_key \ue402 +set -g md_phonelink_erase \ue403 +set -g md_phonelink_lock \ue404 +set -g md_phonelink_ring \ue405 +set -g md_phonelink_setup \ue406 +set -g md_present_to_all \ue407 +set -g md_import_contacts \ue408 +set -g md_mail_outline \ue409 +set -g md_screen_share \ue40a +set -g md_stop_screen_share \ue40b +set -g md_call_missed_outgoing \ue40c +set -g md_rss_feed \ue40d +set -g md_add \ue40e +set -g md_add_box \ue40f +set -g md_add_circle \ue410 +set -g md_add_circle_outline \ue411 +set -g md_archive \ue412 +set -g md_backspace \ue413 +set -g md_block \ue414 +set -g md_clear \ue415 +set -g md_content_copy \ue416 +set -g md_content_cut \ue417 +set -g md_content_paste \ue418 +set -g md_create \ue419 +set -g md_drafts \ue41a +set -g md_filter_list \ue41b +set -g md_flag \ue41c +set -g md_forward \ue41d +set -g md_gesture \ue41e +set -g md_inbox \ue41f +set -g md_link \ue420 +set -g md_mail \ue421 +set -g md_markunread \ue422 +set -g md_redo \ue423 +set -g md_remove \ue424 +set -g md_remove_circle \ue425 +set -g md_remove_circle_outline \ue426 +set -g md_reply \ue427 +set -g md_reply_all \ue428 +set -g md_report \ue429 +set -g md_save \ue42a +set -g md_select_all \ue42b +set -g md_send \ue42c +set -g md_sort \ue42d +set -g md_text_format \ue42e +set -g md_undo \ue42f +set -g md_font_download \ue430 +set -g md_move_to_inbox \ue431 +set -g md_unarchive \ue432 +set -g md_next_week \ue433 +set -g md_weekend \ue434 +set -g md_delete_sweep \ue435 +set -g md_low_priority \ue436 +set -g md_access_alarm \ue437 +set -g md_access_alarms \ue438 +set -g md_access_time \ue439 +set -g md_add_alarm \ue43a +set -g md_airplanemode_inactive \ue43b +set -g md_airplanemode_active \ue43c +set -g md_battery_alert \ue43d +set -g md_battery_charging_full \ue43e +set -g md_battery_full \ue43f +set -g md_battery_std \ue440 +set -g md_battery_unknown \ue441 +set -g md_bluetooth \ue442 +set -g md_bluetooth_connected \ue443 +set -g md_bluetooth_disabled \ue444 +set -g md_bluetooth_searching \ue445 +set -g md_brightness_auto \ue446 +set -g md_brightness_high \ue447 +set -g md_brightness_low \ue448 +set -g md_brightness_medium \ue449 +set -g md_data_usage \ue44a +set -g md_developer_mode \ue44b +set -g md_devices \ue44c +set -g md_dvr \ue44d +set -g md_gps_fixed \ue44e +set -g md_gps_not_fixed \ue44f +set -g md_gps_off \ue450 +set -g md_location_disabled \ue451 +set -g md_location_searching \ue452 +set -g md_graphic_eq \ue453 +set -g md_network_cell \ue454 +set -g md_network_wifi \ue455 +set -g md_nfc \ue456 +set -g md_wallpaper \ue457 +set -g md_widgets \ue458 +set -g md_screen_lock_landscape \ue459 +set -g md_screen_lock_portrait \ue45a +set -g md_screen_lock_rotation \ue45b +set -g md_screen_rotation \ue45c +set -g md_sd_storage \ue45d +set -g md_settings_system_daydream \ue45e +set -g md_signal_cellular_4_bar \ue45f +set -g md_signal_cellular_connected_no_internet_4_bar \ue460 +set -g md_signal_cellular_no_sim \ue461 +set -g md_signal_cellular_null \ue462 +set -g md_signal_cellular_off \ue463 +set -g md_signal_wifi_4_bar \ue464 +set -g md_signal_wifi_4_bar_lock \ue465 +set -g md_signal_wifi_off \ue466 +set -g md_storage \ue467 +set -g md_usb \ue468 +set -g md_wifi_lock \ue469 +set -g md_wifi_tethering \ue46a +set -g md_attach_file \ue46b +set -g md_attach_money \ue46c +set -g md_border_all \ue46d +set -g md_border_bottom \ue46e +set -g md_border_clear \ue46f +set -g md_border_color \ue470 +set -g md_border_horizontal \ue471 +set -g md_border_inner \ue472 +set -g md_border_left \ue473 +set -g md_border_outer \ue474 +set -g md_border_right \ue475 +set -g md_border_style \ue476 +set -g md_border_top \ue477 +set -g md_border_vertical \ue478 +set -g md_format_align_center \ue479 +set -g md_format_align_justify \ue47a +set -g md_format_align_left \ue47b +set -g md_format_align_right \ue47c +set -g md_format_bold \ue47d +set -g md_format_clear \ue47e +set -g md_format_color_fill \ue47f +set -g md_format_color_reset \ue480 +set -g md_format_color_text \ue481 +set -g md_format_indent_decrease \ue482 +set -g md_format_indent_increase \ue483 +set -g md_format_italic \ue484 +set -g md_format_line_spacing \ue485 +set -g md_format_list_bulleted \ue486 +set -g md_format_list_numbered \ue487 +set -g md_format_paint \ue488 +set -g md_format_quote \ue489 +set -g md_format_size \ue48a +set -g md_format_strikethrough \ue48b +set -g md_format_textdirection_l_to_r \ue48c +set -g md_format_textdirection_r_to_l \ue48d +set -g md_format_underlined \ue48e +set -g md_functions \ue48f +set -g md_insert_chart \ue490 +set -g md_insert_comment \ue491 +set -g md_insert_drive_file \ue492 +set -g md_insert_emoticon \ue493 +set -g md_insert_invitation \ue494 +set -g md_insert_link \ue495 +set -g md_insert_photo \ue496 +set -g md_merge_type \ue497 +set -g md_mode_comment \ue498 +set -g md_mode_edit \ue499 +set -g md_publish \ue49a +set -g md_space_bar \ue49b +set -g md_strikethrough_s \ue49c +set -g md_vertical_align_bottom \ue49d +set -g md_vertical_align_center \ue49e +set -g md_vertical_align_top \ue49f +set -g md_wrap_text \ue4a0 +set -g md_money_off \ue4a1 +set -g md_drag_handle \ue4a2 +set -g md_format_shapes \ue4a3 +set -g md_highlight \ue4a4 +set -g md_linear_scale \ue4a5 +set -g md_short_text \ue4a6 +set -g md_text_fields \ue4a7 +set -g md_monetization_on \ue4a8 +set -g md_title \ue4a9 +set -g md_attachment \ue4aa +set -g md_cloud \ue4ab +set -g md_cloud_circle \ue4ac +set -g md_cloud_done \ue4ad +set -g md_cloud_download \ue4ae +set -g md_cloud_off \ue4af +set -g md_cloud_queue \ue4b0 +set -g md_cloud_upload \ue4b1 +set -g md_file_download \ue4b2 +set -g md_file_upload \ue4b3 +set -g md_folder \ue4b4 +set -g md_folder_open \ue4b5 +set -g md_folder_shared \ue4b6 +set -g md_create_new_folder \ue4b7 +set -g md_cast \ue4b8 +set -g md_cast_connected \ue4b9 +set -g md_computer \ue4ba +set -g md_desktop_mac \ue4bb +set -g md_desktop_windows \ue4bc +set -g md_developer_board \ue4bd +set -g md_dock \ue4be +set -g md_gamepad \ue4bf +set -g md_headset \ue4c0 +set -g md_headset_mic \ue4c1 +set -g md_keyboard \ue4c2 +set -g md_keyboard_arrow_down \ue4c3 +set -g md_keyboard_arrow_left \ue4c4 +set -g md_keyboard_arrow_right \ue4c5 +set -g md_keyboard_arrow_up \ue4c6 +set -g md_keyboard_backspace \ue4c7 +set -g md_keyboard_capslock \ue4c8 +set -g md_keyboard_hide \ue4c9 +set -g md_keyboard_return \ue4ca +set -g md_keyboard_tab \ue4cb +set -g md_keyboard_voice \ue4cc +set -g md_laptop \ue4cd +set -g md_laptop_chromebook \ue4ce +set -g md_laptop_mac \ue4cf +set -g md_laptop_windows \ue4d0 +set -g md_memory \ue4d1 +set -g md_mouse \ue4d2 +set -g md_phone_android \ue4d3 +set -g md_phone_iphone \ue4d4 +set -g md_phonelink \ue4d5 +set -g md_phonelink_off \ue4d6 +set -g md_router \ue4d7 +set -g md_scanner \ue4d8 +set -g md_security \ue4d9 +set -g md_sim_card \ue4da +set -g md_smartphone \ue4db +set -g md_speaker \ue4dc +set -g md_speaker_group \ue4dd +set -g md_tablet \ue4de +set -g md_tablet_android \ue4df +set -g md_tablet_mac \ue4e0 +set -g md_toys \ue4e1 +set -g md_tv \ue4e2 +set -g md_watch \ue4e3 +set -g md_device_hub \ue4e4 +set -g md_power_input \ue4e5 +set -g md_devices_other \ue4e6 +set -g md_videogame_asset \ue4e7 +set -g md_add_to_photos \ue4e8 +set -g md_adjust \ue4e9 +set -g md_assistant \ue4ea +set -g md_assistant_photo \ue4eb +set -g md_audiotrack \ue4ec +set -g md_blur_circular \ue4ed +set -g md_blur_linear \ue4ee +set -g md_blur_off \ue4ef +set -g md_blur_on \ue4f0 +set -g md_brightness_1 \ue4f1 +set -g md_brightness_2 \ue4f2 +set -g md_brightness_3 \ue4f3 +set -g md_brightness_4 \ue4f4 +set -g md_brightness_5 \ue4f5 +set -g md_brightness_6 \ue4f6 +set -g md_brightness_7 \ue4f7 +set -g md_broken_image \ue4f8 +set -g md_brush \ue4f9 +set -g md_camera \ue4fa +set -g md_camera_alt \ue4fb +set -g md_camera_front \ue4fc +set -g md_camera_rear \ue4fd +set -g md_camera_roll \ue4fe +set -g md_center_focus_strong \ue4ff +set -g md_center_focus_weak \ue500 +set -g md_collections \ue501 +set -g md_color_lens \ue502 +set -g md_colorize \ue503 +set -g md_compare \ue504 +set -g md_control_point \ue505 +set -g md_control_point_duplicate \ue506 +set -g md_crop_16_9 \ue507 +set -g md_crop_3_2 \ue508 +set -g md_crop \ue509 +set -g md_crop_5_4 \ue50a +set -g md_crop_7_5 \ue50b +set -g md_crop_din \ue50c +set -g md_crop_free \ue50d +set -g md_crop_landscape \ue50e +set -g md_crop_original \ue50f +set -g md_crop_portrait \ue510 +set -g md_crop_square \ue511 +set -g md_dehaze \ue512 +set -g md_details \ue513 +set -g md_edit \ue514 +set -g md_exposure \ue515 +set -g md_exposure_neg_1 \ue516 +set -g md_exposure_neg_2 \ue517 +set -g md_exposure_plus_1 \ue518 +set -g md_exposure_plus_2 \ue519 +set -g md_exposure_zero \ue51a +set -g md_filter_1 \ue51b +set -g md_filter_2 \ue51c +set -g md_filter_3 \ue51d +set -g md_filter \ue51e +set -g md_filter_4 \ue51f +set -g md_filter_5 \ue520 +set -g md_filter_6 \ue521 +set -g md_filter_7 \ue522 +set -g md_filter_8 \ue523 +set -g md_filter_9 \ue524 +set -g md_filter_9_plus \ue525 +set -g md_filter_b_and_w \ue526 +set -g md_filter_center_focus \ue527 +set -g md_filter_drama \ue528 +set -g md_filter_frames \ue529 +set -g md_filter_hdr \ue52a +set -g md_filter_none \ue52b +set -g md_filter_tilt_shift \ue52c +set -g md_filter_vintage \ue52d +set -g md_flare \ue52e +set -g md_flash_auto \ue52f +set -g md_flash_off \ue530 +set -g md_flash_on \ue531 +set -g md_flip \ue532 +set -g md_gradient \ue533 +set -g md_grain \ue534 +set -g md_grid_off \ue535 +set -g md_grid_on \ue536 +set -g md_hdr_off \ue537 +set -g md_hdr_on \ue538 +set -g md_hdr_strong \ue539 +set -g md_hdr_weak \ue53a +set -g md_healing \ue53b +set -g md_image \ue53c +set -g md_image_aspect_ratio \ue53d +set -g md_iso \ue53e +set -g md_landscape \ue53f +set -g md_leak_add \ue540 +set -g md_leak_remove \ue541 +set -g md_lens \ue542 +set -g md_looks_3 \ue543 +set -g md_looks \ue544 +set -g md_looks_4 \ue545 +set -g md_looks_5 \ue546 +set -g md_looks_6 \ue547 +set -g md_looks_one \ue548 +set -g md_looks_two \ue549 +set -g md_loupe \ue54a +set -g md_monochrome_photos \ue54b +set -g md_movie_creation \ue54c +set -g md_music_note \ue54d +set -g md_nature \ue54e +set -g md_nature_people \ue54f +set -g md_navigate_before \ue550 +set -g md_navigate_next \ue551 +set -g md_palette \ue552 +set -g md_panorama \ue553 +set -g md_panorama_fish_eye \ue554 +set -g md_panorama_horizontal \ue555 +set -g md_panorama_vertical \ue556 +set -g md_panorama_wide_angle \ue557 +set -g md_photo \ue558 +set -g md_photo_album \ue559 +set -g md_photo_camera \ue55a +set -g md_photo_library \ue55b +set -g md_picture_as_pdf \ue55c +set -g md_portrait \ue55d +set -g md_remove_red_eye \ue55e +set -g md_rotate_90_degrees_ccw \ue55f +set -g md_rotate_left \ue560 +set -g md_rotate_right \ue561 +set -g md_slideshow \ue562 +set -g md_straighten \ue563 +set -g md_style \ue564 +set -g md_switch_camera \ue565 +set -g md_switch_video \ue566 +set -g md_tag_faces \ue567 +set -g md_texture \ue568 +set -g md_timelapse \ue569 +set -g md_timer_10 \ue56a +set -g md_timer_3 \ue56b +set -g md_timer \ue56c +set -g md_timer_off \ue56d +set -g md_tonality \ue56e +set -g md_transform \ue56f +set -g md_tune \ue570 +set -g md_view_comfy \ue571 +set -g md_view_compact \ue572 +set -g md_wb_auto \ue573 +set -g md_wb_cloudy \ue574 +set -g md_wb_incandescent \ue575 +set -g md_wb_sunny \ue576 +set -g md_collections_bookmark \ue577 +set -g md_photo_size_select_actual \ue578 +set -g md_photo_size_select_large \ue579 +set -g md_photo_size_select_small \ue57a +set -g md_vignette \ue57b +set -g md_wb_iridescent \ue57c +set -g md_crop_rotate \ue57d +set -g md_linked_camera \ue57e +set -g md_add_a_photo \ue57f +set -g md_movie_filter \ue580 +set -g md_photo_filter \ue581 +set -g md_burst_mode \ue582 +set -g md_beenhere \ue583 +set -g md_directions \ue584 +set -g md_directions_bike \ue585 +set -g md_directions_bus \ue586 +set -g md_directions_car \ue587 +set -g md_directions_boat \ue588 +set -g md_directions_subway \ue589 +set -g md_directions_railway \ue58a +set -g md_directions_transit \ue58b +set -g md_directions_walk \ue58c +set -g md_flight \ue58d +set -g md_hotel \ue58e +set -g md_layers \ue58f +set -g md_layers_clear \ue590 +set -g md_local_airport \ue591 +set -g md_local_atm \ue592 +set -g md_local_activity \ue593 +set -g md_local_bar \ue594 +set -g md_local_cafe \ue595 +set -g md_local_car_wash \ue596 +set -g md_local_convenience_store \ue597 +set -g md_local_drink \ue598 +set -g md_local_florist \ue599 +set -g md_local_gas_station \ue59a +set -g md_local_grocery_store \ue59b +set -g md_local_hospital \ue59c +set -g md_local_hotel \ue59d +set -g md_local_laundry_service \ue59e +set -g md_local_library \ue59f +set -g md_local_mall \ue5a0 +set -g md_local_movies \ue5a1 +set -g md_local_offer \ue5a2 +set -g md_local_parking \ue5a3 +set -g md_local_pharmacy \ue5a4 +set -g md_local_phone \ue5a5 +set -g md_local_pizza \ue5a6 +set -g md_local_play \ue5a7 +set -g md_local_post_office \ue5a8 +set -g md_local_printshop \ue5a9 +set -g md_local_dining \ue5aa +set -g md_local_see \ue5ab +set -g md_local_shipping \ue5ac +set -g md_local_taxi \ue5ad +set -g md_person_pin \ue5ae +set -g md_map \ue5af +set -g md_my_location \ue5b0 +set -g md_navigation \ue5b1 +set -g md_pin_drop \ue5b2 +set -g md_place \ue5b3 +set -g md_rate_review \ue5b4 +set -g md_restaurant_menu \ue5b5 +set -g md_satellite \ue5b6 +set -g md_store_mall_directory \ue5b7 +set -g md_terrain \ue5b8 +set -g md_traffic \ue5b9 +set -g md_directions_run \ue5ba +set -g md_add_location \ue5bb +set -g md_edit_location \ue5bc +set -g md_near_me \ue5bd +set -g md_person_pin_circle \ue5be +set -g md_zoom_out_map \ue5bf +set -g md_restaurant \ue5c0 +set -g md_ev_station \ue5c1 +set -g md_streetview \ue5c2 +set -g md_subway \ue5c3 +set -g md_train \ue5c4 +set -g md_tram \ue5c5 +set -g md_transfer_within_a_station \ue5c6 +set -g md_apps \ue5c7 +set -g md_arrow_back \ue5c8 +set -g md_arrow_drop_down \ue5c9 +set -g md_arrow_drop_down_circle \ue5ca +set -g md_arrow_drop_up \ue5cb +set -g md_arrow_forward \ue5cc +set -g md_cancel \ue5cd +set -g md_check \ue5ce +set -g md_chevron_left \ue5cf +set -g md_chevron_right \ue5d0 +set -g md_close \ue5d1 +set -g md_expand_less \ue5d2 +set -g md_expand_more \ue5d3 +set -g md_fullscreen \ue5d4 +set -g md_fullscreen_exit \ue5d5 +set -g md_menu \ue5d6 +set -g md_more_horiz \ue5d7 +set -g md_more_vert \ue5d8 +set -g md_refresh \ue5d9 +set -g md_unfold_less \ue5da +set -g md_unfold_more \ue5db +set -g md_arrow_upward \ue5dc +set -g md_subdirectory_arrow_left \ue5dd +set -g md_subdirectory_arrow_right \ue5de +set -g md_arrow_downward \ue5df +set -g md_first_page \ue5e0 +set -g md_last_page \ue5e1 +set -g md_adb \ue5e2 +set -g md_bluetooth_audio \ue5e3 +set -g md_disc_full \ue5e4 +set -g md_do_not_disturb_alt \ue5e5 +set -g md_do_not_disturb \ue5e6 +set -g md_drive_eta \ue5e7 +set -g md_event_available \ue5e8 +set -g md_event_busy \ue5e9 +set -g md_event_note \ue5ea +set -g md_folder_special \ue5eb +set -g md_mms \ue5ec +set -g md_more \ue5ed +set -g md_network_locked \ue5ee +set -g md_phone_bluetooth_speaker \ue5ef +set -g md_phone_forwarded \ue5f0 +set -g md_phone_in_talk \ue5f1 +set -g md_phone_locked \ue5f2 +set -g md_phone_missed \ue5f3 +set -g md_phone_paused \ue5f4 +set -g md_sd_card \ue5f5 +set -g md_sim_card_alert \ue5f6 +set -g md_sms \ue5f7 +set -g md_sms_failed \ue5f8 +set -g md_sync \ue5f9 +set -g md_sync_disabled \ue5fa +set -g md_sync_problem \ue5fb +set -g md_system_update \ue5fc +set -g md_tap_and_play \ue5fd +set -g md_time_to_leave \ue5fe +set -g md_vibration \ue5ff +set -g md_voice_chat \ue600 +set -g md_vpn_lock \ue601 +set -g md_airline_seat_flat \ue602 +set -g md_airline_seat_flat_angled \ue603 +set -g md_airline_seat_individual_suite \ue604 +set -g md_airline_seat_legroom_extra \ue605 +set -g md_airline_seat_legroom_normal \ue606 +set -g md_airline_seat_legroom_reduced \ue607 +set -g md_airline_seat_recline_extra \ue608 +set -g md_airline_seat_recline_normal \ue609 +set -g md_confirmation_number \ue60a +set -g md_live_tv \ue60b +set -g md_ondemand_video \ue60c +set -g md_personal_video \ue60d +set -g md_power \ue60e +set -g md_wc \ue60f +set -g md_wifi \ue610 +set -g md_enhanced_encryption \ue611 +set -g md_network_check \ue612 +set -g md_no_encryption \ue613 +set -g md_rv_hookup \ue614 +set -g md_do_not_disturb_off \ue615 +set -g md_do_not_disturb_on \ue616 +set -g md_priority_high \ue617 +set -g md_pie_chart \ue618 +set -g md_pie_chart_outlined \ue619 +set -g md_bubble_chart \ue61a +set -g md_multiline_chart \ue61b +set -g md_show_chart \ue61c +set -g md_cake \ue61d +set -g md_domain \ue61e +set -g md_group \ue61f +set -g md_group_add \ue620 +set -g md_location_city \ue621 +set -g md_mood \ue622 +set -g md_mood_bad \ue623 +set -g md_notifications \ue624 +set -g md_notifications_none \ue625 +set -g md_notifications_off \ue626 +set -g md_notifications_active \ue627 +set -g md_notifications_paused \ue628 +set -g md_pages \ue629 +set -g md_party_mode \ue62a +set -g md_people \ue62b +set -g md_people_outline \ue62c +set -g md_person \ue62d +set -g md_person_add \ue62e +set -g md_person_outline \ue62f +set -g md_plus_one \ue630 +set -g md_poll \ue631 +set -g md_public \ue632 +set -g md_school \ue633 +set -g md_share \ue634 +set -g md_whatshot \ue635 +set -g md_sentiment_dissatisfied \ue636 +set -g md_sentiment_neutral \ue637 +set -g md_sentiment_satisfied \ue638 +set -g md_sentiment_very_dissatisfied \ue639 +set -g md_sentiment_very_satisfied \ue63a +set -g md_check_box \ue63b +set -g md_check_box_outline_blank \ue63c +set -g md_radio_button_unchecked \ue63d +set -g md_radio_button_checked \ue63e +set -g md_star \ue63f +set -g md_star_half \ue640 +set -g md_star_border \ue641 +set -g md_3d_rotation \ue642 +set -g md_accessibility \ue643 +set -g md_account_balance \ue644 +set -g md_account_balance_wallet \ue645 +set -g md_account_box \ue646 +set -g md_account_circle \ue647 +set -g md_add_shopping_cart \ue648 +set -g md_alarm \ue649 +set -g md_alarm_add \ue64a +set -g md_alarm_off \ue64b +set -g md_alarm_on \ue64c +set -g md_android \ue64d +set -g md_announcement \ue64e +set -g md_aspect_ratio \ue64f +set -g md_assessment \ue650 +set -g md_assignment \ue651 +set -g md_assignment_ind \ue652 +set -g md_assignment_late \ue653 +set -g md_assignment_return \ue654 +set -g md_assignment_returned \ue655 +set -g md_assignment_turned_in \ue656 +set -g md_autorenew \ue657 +set -g md_backup \ue658 +set -g md_book \ue659 +set -g md_bookmark \ue65a +set -g md_bookmark_border \ue65b +set -g md_bug_report \ue65c +set -g md_build \ue65d +set -g md_cached \ue65e +set -g md_change_history \ue65f +set -g md_check_circle \ue660 +set -g md_chrome_reader_mode \ue661 +set -g md_class \ue662 +set -g md_code \ue663 +set -g md_credit_card \ue664 +set -g md_dashboard \ue665 +set -g md_delete \ue666 +set -g md_description \ue667 +set -g md_dns \ue668 +set -g md_done \ue669 +set -g md_done_all \ue66a +set -g md_event \ue66b +set -g md_exit_to_app \ue66c +set -g md_explore \ue66d +set -g md_extension \ue66e +set -g md_face \ue66f +set -g md_favorite \ue670 +set -g md_favorite_border \ue671 +set -g md_feedback \ue672 +set -g md_find_in_page \ue673 +set -g md_find_replace \ue674 +set -g md_flip_to_back \ue675 +set -g md_flip_to_front \ue676 +set -g md_get_app \ue677 +set -g md_grade \ue678 +set -g md_group_work \ue679 +set -g md_help \ue67a +set -g md_highlight_off \ue67b +set -g md_history \ue67c +set -g md_home \ue67d +set -g md_hourglass_empty \ue67e +set -g md_hourglass_full \ue67f +set -g md_https \ue680 +set -g md_info \ue681 +set -g md_info_outline \ue682 +set -g md_input \ue683 +set -g md_invert_colors \ue684 +set -g md_label \ue685 +set -g md_label_outline \ue686 +set -g md_language \ue687 +set -g md_launch \ue688 +set -g md_list \ue689 +set -g md_lock \ue68a +set -g md_lock_open \ue68b +set -g md_lock_outline \ue68c +set -g md_loyalty \ue68d +set -g md_markunread_mailbox \ue68e +set -g md_note_add \ue68f +set -g md_open_in_browser \ue690 +set -g md_open_in_new \ue691 +set -g md_open_with \ue692 +set -g md_pageview \ue693 +set -g md_payment \ue694 +set -g md_perm_camera_mic \ue695 +set -g md_perm_contact_calendar \ue696 +set -g md_perm_data_setting \ue697 +set -g md_perm_device_information \ue698 +set -g md_perm_identity \ue699 +set -g md_perm_media \ue69a +set -g md_perm_phone_msg \ue69b +set -g md_perm_scan_wifi \ue69c +set -g md_picture_in_picture \ue69d +set -g md_polymer \ue69e +set -g md_power_settings_new \ue69f +set -g md_print \ue6a0 +set -g md_query_builder \ue6a1 +set -g md_question_answer \ue6a2 +set -g md_receipt \ue6a3 +set -g md_redeem \ue6a4 +set -g md_report_problem \ue6a5 +set -g md_restore \ue6a6 +set -g md_room \ue6a7 +set -g md_schedule \ue6a8 +set -g md_search \ue6a9 +set -g md_settings \ue6aa +set -g md_settings_applications \ue6ab +set -g md_settings_backup_restore \ue6ac +set -g md_settings_bluetooth \ue6ad +set -g md_settings_cell \ue6ae +set -g md_settings_brightness \ue6af +set -g md_settings_ethernet \ue6b0 +set -g md_settings_input_antenna \ue6b1 +set -g md_settings_input_component \ue6b2 +set -g md_settings_input_composite \ue6b3 +set -g md_settings_input_hdmi \ue6b4 +set -g md_settings_input_svideo \ue6b5 +set -g md_settings_overscan \ue6b6 +set -g md_settings_phone \ue6b7 +set -g md_settings_power \ue6b8 +set -g md_settings_remote \ue6b9 +set -g md_settings_voice \ue6ba +set -g md_shop \ue6bb +set -g md_shop_two \ue6bc +set -g md_shopping_basket \ue6bd +set -g md_shopping_cart \ue6be +set -g md_speaker_notes \ue6bf +set -g md_spellcheck \ue6c0 +set -g md_stars \ue6c1 +set -g md_store \ue6c2 +set -g md_subject \ue6c3 +set -g md_supervisor_account \ue6c4 +set -g md_swap_horiz \ue6c5 +set -g md_swap_vert \ue6c6 +set -g md_swap_vertical_circle \ue6c7 +set -g md_system_update_alt \ue6c8 +set -g md_tab \ue6c9 +set -g md_tab_unselected \ue6ca +set -g md_theaters \ue6cb +set -g md_thumb_down \ue6cc +set -g md_thumb_up \ue6cd +set -g md_thumbs_up_down \ue6ce +set -g md_toc \ue6cf +set -g md_today \ue6d0 +set -g md_toll \ue6d1 +set -g md_track_changes \ue6d2 +set -g md_translate \ue6d3 +set -g md_trending_down \ue6d4 +set -g md_trending_flat \ue6d5 +set -g md_trending_up \ue6d6 +set -g md_turned_in \ue6d7 +set -g md_turned_in_not \ue6d8 +set -g md_verified_user \ue6d9 +set -g md_view_agenda \ue6da +set -g md_view_array \ue6db +set -g md_view_carousel \ue6dc +set -g md_view_column \ue6dd +set -g md_view_day \ue6de +set -g md_view_headline \ue6df +set -g md_view_list \ue6e0 +set -g md_view_module \ue6e1 +set -g md_view_quilt \ue6e2 +set -g md_view_stream \ue6e3 +set -g md_view_week \ue6e4 +set -g md_visibility \ue6e5 +set -g md_visibility_off \ue6e6 +set -g md_card_giftcard \ue6e7 +set -g md_card_membership \ue6e8 +set -g md_card_travel \ue6e9 +set -g md_work \ue6ea +set -g md_youtube_searched_for \ue6eb +set -g md_eject \ue6ec +set -g md_camera_enhance \ue6ed +set -g md_help_outline \ue6ee +set -g md_reorder \ue6ef +set -g md_zoom_in \ue6f0 +set -g md_zoom_out \ue6f1 +set -g md_http \ue6f2 +set -g md_event_seat \ue6f3 +set -g md_flight_land \ue6f4 +set -g md_flight_takeoff \ue6f5 +set -g md_play_for_work \ue6f6 +set -g md_gif \ue6f7 +set -g md_indeterminate_check_box \ue6f8 +set -g md_offline_pin \ue6f9 +set -g md_all_out \ue6fa +set -g md_copyright \ue6fb +set -g md_fingerprint \ue6fc +set -g md_gavel \ue6fd +set -g md_lightbulb_outline \ue6fe +set -g md_picture_in_picture_alt \ue6ff +set -g md_important_devices \ue700 +set -g md_touch_app \ue701 +set -g md_accessible \ue702 +set -g md_compare_arrows \ue703 +set -g md_date_range \ue704 +set -g md_donut_large \ue705 +set -g md_donut_small \ue706 +set -g md_line_style \ue707 +set -g md_line_weight \ue708 +set -g md_motorcycle \ue709 +set -g md_opacity \ue70a +set -g md_pets \ue70b +set -g md_pregnant_woman \ue70c +set -g md_record_voice_over \ue70d +set -g md_rounded_corner \ue70e +set -g md_rowing \ue70f +set -g md_timeline \ue710 +set -g md_update \ue711 +set -g md_watch_later \ue712 +set -g md_pan_tool \ue713 +set -g md_euro_symbol \ue714 +set -g md_g_translate \ue715 +set -g md_remove_shopping_cart \ue716 +set -g md_restore_page \ue717 +set -g md_speaker_notes_off \ue718 +set -g md_delete_forever \ue719 +set -g md_ac_unit \ue71a +set -g md_airport_shuttle \ue71b +set -g md_all_inclusive \ue71c +set -g md_beach_access \ue71d +set -g md_business_center \ue71e +set -g md_casino \ue71f +set -g md_child_care \ue720 +set -g md_child_friendly \ue721 +set -g md_fitness_center \ue722 +set -g md_free_breakfast \ue723 +set -g md_golf_course \ue724 +set -g md_hot_tub \ue725 +set -g md_kitchen \ue726 +set -g md_pool \ue727 +set -g md_room_service \ue728 +set -g md_smoke_free \ue729 +set -g md_smoking_rooms \ue72a +set -g md_spa \ue72b +set -g md_u10fffd \ue72c +set -g file_regex \ue72d +set -g file_arch_linux \ue72e +set -g file_e \ue72f +set -g file_glyphs \ue730 +set -g file_knockout \ue731 +set -g file_lean \ue732 +set -g file_metal \ue733 +set -g file_povray \ue734 +set -g file_s \ue735 +set -g file_tt \ue736 +set -g file_vagrant \ue737 +set -g file_xmos \ue738 +set -g file_a \ue739 +set -g file_chai \ue73a +set -g file_stylus \ue73b +set -g file_textile \ue73c +set -g file_unreal \ue73d +set -g file_purebasic \ue73e +set -g file_ts \ue73f +set -g file_scheme \ue740 +set -g file_textmate \ue741 +set -g file_x10 \ue742 +set -g file_apl \ue743 +set -g file_ansible \ue744 +set -g file_arttext \ue745 +set -g file_antwar \ue746 +set -g file_opa \ue747 +set -g file_codecov \ue748 +set -g file_yang \ue749 +set -g file_pm2 \ue74a +set -g file_hg \ue74b +set -g file_pawn \ue74c +set -g file_julia \ue74d +set -g file_shipit \ue74e +set -g file_mocha \ue74f +set -g file_nib \ue750 +set -g file_shuriken \ue751 +set -g file_alex \ue752 +set -g file_twig \ue753 +set -g file_1c \ue754 +set -g file_tex \ue755 +set -g file_bibtex \ue756 +set -g file_mustache \ue757 +set -g file_gulp \ue758 +set -g file_grunt \ue759 +set -g file_ember \ue75a +set -g file_go \ue75b +set -g file_jenkins \ue75c +set -g file_gnu \ue75d +set -g file_composer \ue75e +set -g file_meteor \ue75f +set -g file_ai \ue760 +set -g file_psd \ue761 +set -g file_silverstripe \ue762 +set -g file_maxscript \ue763 +set -g file_kivy \ue764 +set -g file_crystal \ue765 +set -g file_gradle \ue766 +set -g file_groovy \ue767 +set -g file_r \ue768 +set -g file_vue \ue769 +set -g file_haxe \ue76a +set -g file_lisp \ue76b +set -g file_e909 \ue76c +set -g file_fortran \ue76d +set -g file_ada \ue76e +set -g file_dyalog \ue76f +set -g file_jade \ue770 +set -g file_e90e \ue771 +set -g file_font \ue772 +set -g file_postcss \ue773 +set -g file_scad \ue774 +set -g file_e912 \ue775 +set -g file_raml \ue776 +set -g file_ls \ue777 +set -g file_saltstack \ue778 +set -g file_terraform \ue779 +set -g file_org \ue77a +set -g file_asciidoc \ue77b +set -g file_riot \ue77c +set -g file_ocaml \ue77d +set -g file_lua \ue77e +set -g file_npm \ue77f +set -g file_llvm \ue780 +set -g file_e91e \ue781 +set -g file_babel \ue782 +set -g file_marko \ue783 +set -g file_flow \ue784 +set -g file_broccoli \ue785 +set -g file_appveyor \ue786 +set -g file_cakefile \ue787 +set -g file_apple \ue788 +set -g file_emacs \ue789 +set -g file_sketch \ue78a +set -g file_doxygen \ue78b +set -g file_cf \ue78c +set -g file_pascal \ue78d +set -g file_abap \ue78e +set -g file_antlr \ue78f +set -g file_api \ue790 +set -g file_as \ue791 +set -g file_arc \ue792 +set -g file_arduino \ue793 +set -g file_augeas \ue794 +set -g file_ahk \ue795 +set -g file_autoit \ue796 +set -g file_ats \ue797 +set -g file_alloy \ue798 +set -g file_manpage \ue799 +set -g file_j \ue79a +set -g file_glade \ue79b +set -g file_boo \ue79c +set -g file_brain \ue79d +set -g file_bro \ue79e +set -g file_bluespec \ue79f +set -g file_stylelint \ue7a0 +set -g file_ant \ue7a1 +set -g file_cmake \ue7a2 +set -g file_clips \ue7a3 +set -g file_mapbox \ue7a4 +set -g file_cp \ue7a5 +set -g file_chuck \ue7a6 +set -g file_jinja \ue7a7 +set -g file_isabelle \ue7a8 +set -g file_doge \ue7a9 +set -g file_idl \ue7aa +set -g file_jake \ue7ab +set -g file_verilog \ue7ac +set -g file_phalcon \ue7ad +set -g file_fabfile \ue7ae +set -g file_lfe \ue7af +set -g file_nmap \ue7b0 +set -g file_ampl \ue7b1 +set -g file_ceylon \ue7b2 +set -g file_chapel \ue7b3 +set -g file_cirru \ue7b4 +set -g file_clarion \ue7b5 +set -g file_nunjucks \ue7b6 +set -g file_mediawiki \ue7b7 +set -g file_postscript \ue7b8 +set -g file_tcl \ue7b9 +set -g file_owl \ue7ba +set -g file_jsonld \ue7bb +set -g file_sparql \ue7bc +set -g file_sas \ue7bd +set -g file_clean \ue7be +set -g file_click \ue7bf +set -g file_nvidia \ue7c0 +set -g file_creole \ue7c1 +set -g file_coq \ue7c2 +set -g file_diff \ue7c3 +set -g file_patch \ue7c4 +set -g file_byond \ue7c5 +set -g file_cython \ue7c6 +set -g file_darcs \ue7c7 +set -g file_eagle \ue7c8 +set -g file_ecere \ue7c9 +set -g file_eiffel \ue7ca +set -g file_em \ue7cb +set -g file_flux \ue7cc +set -g file_factor \ue7cd +set -g file_fancy \ue7ce +set -g file_perl6 \ue7cf +set -g file_gentoo \ue7d0 +set -g file_frege \ue7d1 +set -g file_fantom \ue7d2 +set -g file_freemarker \ue7d3 +set -g file_gap \ue7d4 +set -g file_cl \ue7d5 +set -g file_gams \ue7d6 +set -g file_godot \ue7d7 +set -g file_gml \ue7d8 +set -g file_genshi \ue7d9 +set -g file_pointwise \ue7da +set -g file_gf \ue7db +set -g file_golo \ue7dc +set -g file_gosu \ue7dd +set -g file_harbour \ue7de +set -g file_graphql \ue7df +set -g file_graphviz \ue7e0 +set -g file_hashicorp \ue7e1 +set -g file_hy \ue7e2 +set -g file_igorpro \ue7e3 +set -g file_io \ue7e4 +set -g file_ioke \ue7e5 +set -g file_idris \ue7e6 +set -g file_inform7 \ue7e7 +set -g file_inno \ue7e8 +set -g file_sublime \ue7e9 +set -g file_jupyter \ue7ea +set -g file_krl \ue7eb +set -g file_kotlin \ue7ec +set -g file_labview \ue7ed +set -g file_lsl \ue7ee +set -g file_lasso \ue7ef +set -g file_logtalk \ue7f0 +set -g file_lookml \ue7f1 +set -g file_mako \ue7f2 +set -g file_mathematica \ue7f3 +set -g file_matlab \ue7f4 +set -g file_e992 \ue7f5 +set -g file_max \ue7f6 +set -g file_mercury \ue7f7 +set -g file_mirah \ue7f8 +set -g file_modula2 \ue7f9 +set -g file_monkey \ue7fa +set -g file_nimrod \ue7fb +set -g file_nit \ue7fc +set -g file_nix \ue7fd +set -g file_amx \ue7fe +set -g file_netlogo \ue7ff +set -g file_numpy \ue800 +set -g file_objj \ue801 +set -g file_opencl \ue802 +set -g file_processing \ue803 +set -g file_ox \ue804 +set -g file_scd \ue805 +set -g file_stata \ue806 +set -g file_stan \ue807 +set -g file_sqf \ue808 +set -g file_slash \ue809 +set -g file_shen \ue80a +set -g file_self \ue80b +set -g file_scilab \ue80c +set -g file_vhdl \ue80d +set -g file_sage \ue80e +set -g file_robot \ue80f +set -g file_red \ue810 +set -g file_rebol \ue811 +set -g file_xojo \ue812 +set -g file_rdoc \ue813 +set -g file_racket \ue814 +set -g file_purescript \ue815 +set -g file_uno \ue816 +set -g file_varnish \ue817 +set -g file_propeller \ue818 +set -g file_turing \ue819 +set -g file_pony \ue81a +set -g file_pogo \ue81b +set -g file_pike \ue81c +set -g file_urweb \ue81d +set -g file_parrot \ue81e +set -g file_papyrus \ue81f +set -g file_pan \ue820 +set -g file_oz \ue821 +set -g file_oxygene \ue822 +set -g file_progress \ue823 +set -g file_txl \ue824 +set -g file_cabal \ue825 +set -g file_sysverilog \ue826 +set -g file_pickle \ue827 +set -g file_xpages \ue828 +set -g file_xtend \ue829 +set -g file_zephir \ue82a +set -g file_zimpl \ue82b +set -g file_ec \ue82c +set -g file_mupad \ue82d +set -g file_ooc \ue82e +set -g file_rst \ue82f +set -g file_karma \ue830 +set -g file_hack \ue831 +set -g file_shopify \ue832 +set -g file_pug_alt \ue833 +set -g file_e9d1 \ue834 +set -g file_sbt \ue835 +set -g file_e9d3 \ue836 +set -g file_scrutinizer \ue837 +set -g file_cc \ue838 +set -g file_brakeman \ue839 +set -g file_newrelic \ue83a +set -g file_thor \ue83b +set -g file_nuget \ue83c +set -g file_powershell \ue83d +set -g file_sf \ue83e +set -g file_minecraft \ue83f +set -g file_sqlite \ue840 +set -g file_protractor \ue841 +set -g file_typings \ue842 +set -g file_strings \ue843 +set -g file_nant \ue844 +set -g file_csscript \ue845 +set -g file_cake \ue846 +set -g file_openoffice \ue847 +set -g file_keynote \ue848 +set -g file_jsx \ue849 +set -g file_tsx \ue84a +set -g file_model \ue84b +set -g file_finder \ue84c +set -g file_access \ue84d +set -g file_onenote \ue84e +set -g file_powerpoint \ue84f +set -g file_word \ue850 +set -g file_excel \ue851 +set -g file_storyist \ue852 +set -g file_csound \ue853 +set -g file_dbase \ue854 +set -g file_zbrush \ue855 +set -g file_ae \ue856 +set -g file_indesign \ue857 +set -g file_premiere \ue858 +set -g file_maya \ue859 +set -g file_e9f7 \ue85a +set -g file_khronos \ue85b +set -g file_audacity \ue85c +set -g file_blender \ue85d +set -g file_lightwave \ue85e +set -g file_fbx \ue85f +set -g file_e9fd \ue860 +set -g file_typedoc \ue861 +set -g file_alpine \ue862 +set -g file_yui \ue863 +set -g file_ea01 \ue864 +set -g file_ea02 \ue865 +set -g file_ea03 \ue866 +set -g file_normalize \ue867 +set -g file_neko \ue868 +set -g file_mathjax \ue869 +set -g file_leaflet \ue86a +set -g file_gdb \ue86b +set -g file_fuelux \ue86c +set -g file_eq \ue86d +set -g file_chartjs \ue86e +set -g file_ea0c \ue86f +set -g file_ea0d \ue870 +set -g file_ea0e \ue871 +set -g file_eslint \ue872 +set -g file_d3 \ue873 +set -g file_cordova \ue874 +set -g file_circleci \ue875 +set -g file_pug \ue876 +set -g file_powerbuilder \ue877 +set -g file_dylib \ue878 +set -g file_rexx \ue879 +set -g file_svn \ue87a +set -g file_mruby \ue87b +set -g file_wercker \ue87c +set -g file_yarn \ue87d +set -g file_editorconfig \ue87e +set -g file_snyk \ue87f +set -g file_reason \ue880 +set -g file_nsis \ue881 +set -g file_v8 \ue882 +set -g file_rollup \ue883 +set -g file_ea21 \ue884 +set -g file_ea22 \ue885 +set -g file_ea23 \ue886 +set -g file_rascal \ue887 +set -g file_gn \ue888 +set -g file_nodemon \ue889 +set -g file_electron \ue88a +set -g file_1c_alt \ue88b +set -g file_swagger \ue88c +set -g file_bithound \ue88d +set -g file_polymer \ue88e +set -g file_platformio \ue88f +set -g file_shippable \ue890 +set -g file_ea2e \ue891 +set -g file_sequelize \ue892 +set -g file_redux \ue893 +set -g file_rspec \ue894 +set -g file_phpunit \ue895 +set -g file_octave \ue896 +set -g file_nuclide \ue897 +set -g file_infopath \ue898 +set -g file_lime \ue899 +set -g file_lerna \ue89a +set -g file_kitchenci \ue89b +set -g file_jest \ue89c +set -g file_jasmine \ue89d +set -g file_haxedevelop \ue89e +set -g file_gitlab \ue89f +set -g file_drone \ue8a0 +set -g file_virtualbox \ue8a1 +set -g file_doclets \ue8a2 +set -g file_delphi \ue8a3 +set -g file_codekit \ue8a4 +set -g file_chef \ue8a5 +set -g file_cakephp \ue8a6 +set -g file_cobol \ue8a7 +set -g file_bundler \ue8a8 +set -g file_buck \ue8a9 +set -g file_brunch \ue8aa +set -g file_aurelia \ue8ab +set -g file_vmware \ue8ac +set -g file_rhino \ue8ad +set -g file_ejs \ue8ae +set -g file_kicad \ue8af +set -g file_hoplon \ue8b0 +set -g file_abif \ue8b1 +set -g file_watchman \ue8b2 +set -g file_p4 \ue8b3 +set -g file_nanoc \ue8b4 +set -g file_miranda \ue8b5 +set -g file_minizinc \ue8b6 +set -g file_meson \ue8b7 +set -g file_jison \ue8b8 +set -g file_franca \ue8b9 +set -g file_devicetree \ue8ba +set -g file_caddy \ue8bb +set -g file_bem \ue8bc +set -g file_bazel \ue8bd +set -g file_angelscript \ue8be +set -g file_esdoc \ue8bf +set -g file_twine \ue8c0 +set -g file_squarespace \ue8c1 +set -g file_phoenix \ue8c2 +set -g file_test_dir \ue8c3 +set -g file_webpack \ue8c4 +set -g file_test_coffee \ue8c5 +set -g file_test_generic \ue8c6 +set -g file_test_js \ue8c7 +set -g file_test_perl \ue8c8 +set -g file_test_python \ue8c9 +set -g file_test_react \ue8ca +set -g file_test_ruby \ue8cb +set -g file_test_ts \ue8cc +set -g file_codeship \ue8cd +set -g file_nxc \ue8ce +set -g file_brotli \ue8cf +set -g file_proselint \ue8d0 +set -g file_bintray \ue8d1 +set -g file_mjml \ue8d2 +set -g file_wasm \ue8d3 +set -g file_ea71 \ue8d4 +set -g file_nasm \ue8d5 +set -g file_ea73 \ue8d6 +set -g file_peg \ue8d7 +set -g file_jolie \ue8d8 +set -g file_nano \ue8d9 +set -g file_xamarin \ue8da +set -g file_f012 \ue8db +set -g file_tag \ue8dc +set -g file_cucumber \ue8dd +set -g file_video \ue8de +set -g file_config \ue8df +set -g file_dashboard \ue8e0 +set -g file_puppet \ue8e1 +set -g file_terminal \ue8e2 +set -g file_markdownlint \ue8e3 +set -g file_react \ue8e4 +set -g file_f101 \ue8e5 +set -g file_elm \ue8e6 +set -g file_boot \ue8e7 +set -g file_cljs \ue8e8 +set -g file_lein \ue8e9 +set -g file_docker \ue8ea +set -g file_php \ue8eb +set -g file_ionic \ue8ec +set -g file_haml \ue8ed +set -g file_f17b \ue8ee +set -g file_ff \ue8ef +set -g file_u1f3c1 \ue8f0 +set -g file_tern \ue8f1 +set -g file_default \ue8f2 +set -g file_sigils \ue8f3 +set -g file_nginx \ue8f4 +set -g weather_day_cloudy_gusts \ue8f5 +set -g weather_day_cloudy_windy \ue8f6 +set -g weather_day_cloudy \ue8f7 +set -g weather_day_fog \ue8f8 +set -g weather_day_hail \ue8f9 +set -g weather_day_lightning \ue8fa +set -g weather_day_rain_mix \ue8fb +set -g weather_day_rain_wind \ue8fc +set -g weather_day_rain \ue8fd +set -g weather_day_showers \ue8fe +set -g weather_day_snow \ue8ff +set -g weather_day_sprinkle \ue900 +set -g weather_day_sunny_overcast \ue901 +set -g weather_day_sunny \ue902 +set -g weather_day_storm_showers \ue903 +set -g weather_day_thunderstorm \ue904 +set -g weather_cloudy_gusts \ue905 +set -g weather_cloudy_windy \ue906 +set -g weather_cloudy \ue907 +set -g weather_fog \ue908 +set -g weather_hail \ue909 +set -g weather_lightning \ue90a +set -g weather_rain_mix \ue90b +set -g weather_rain_wind \ue90c +set -g weather_rain \ue90d +set -g weather_showers \ue90e +set -g weather_snow \ue90f +set -g weather_sprinkle \ue910 +set -g weather_storm_showers \ue911 +set -g weather_thunderstorm \ue912 +set -g weather_windy \ue913 +set -g weather_night_alt_cloudy_gusts \ue914 +set -g weather_night_alt_cloudy_windy \ue915 +set -g weather_night_alt_hail \ue916 +set -g weather_night_alt_lightning \ue917 +set -g weather_night_alt_rain_mix \ue918 +set -g weather_night_alt_rain_wind \ue919 +set -g weather_night_alt_rain \ue91a +set -g weather_night_alt_showers \ue91b +set -g weather_night_alt_snow \ue91c +set -g weather_night_alt_sprinkle \ue91d +set -g weather_night_alt_storm_showers \ue91e +set -g weather_night_alt_thunderstorm \ue91f +set -g weather_night_clear \ue920 +set -g weather_night_cloudy_gusts \ue921 +set -g weather_night_cloudy_windy \ue922 +set -g weather_night_cloudy \ue923 +set -g weather_night_hail \ue924 +set -g weather_night_lightning \ue925 +set -g weather_night_rain_mix \ue926 +set -g weather_night_rain_wind \ue927 +set -g weather_night_rain \ue928 +set -g weather_night_showers \ue929 +set -g weather_night_snow \ue92a +set -g weather_night_sprinkle \ue92b +set -g weather_night_storm_showers \ue92c +set -g weather_night_thunderstorm \ue92d +set -g weather_celsius \ue92e +set -g weather_cloud_down \ue92f +set -g weather_cloud_refresh \ue930 +set -g weather_cloud_up \ue931 +set -g weather_cloud \ue932 +set -g weather_degrees \ue933 +set -g weather_direction_down_left \ue934 +set -g weather_direction_down \ue935 +set -g weather_fahrenheit \ue936 +set -g weather_horizon_alt \ue937 +set -g weather_horizon \ue938 +set -g weather_direction_left \ue939 +set -g weather_f049 \ue93a +set -g weather_night_fog \ue93b +set -g weather_refresh_alt \ue93c +set -g weather_refresh \ue93d +set -g weather_direction_right \ue93e +set -g weather_raindrops \ue93f +set -g weather_strong_wind \ue940 +set -g weather_sunrise \ue941 +set -g weather_sunset \ue942 +set -g weather_thermometer_exterior \ue943 +set -g weather_thermometer_internal \ue944 +set -g weather_thermometer \ue945 +set -g weather_tornado \ue946 +set -g weather_direction_up_right \ue947 +set -g weather_direction_up \ue948 +set -g weather_f059 \ue949 +set -g weather_f05a \ue94a +set -g weather_f05b \ue94b +set -g weather_f05c \ue94c +set -g weather_f05d \ue94d +set -g weather_f05e \ue94e +set -g weather_f060 \ue94f +set -g weather_f061 \ue950 +set -g weather_smoke \ue951 +set -g weather_dust \ue952 +set -g weather_snow_wind \ue953 +set -g weather_day_snow_wind \ue954 +set -g weather_night_snow_wind \ue955 +set -g weather_night_alt_snow_wind \ue956 +set -g weather_day_sleet_storm \ue957 +set -g weather_night_sleet_storm \ue958 +set -g weather_night_alt_sleet_storm \ue959 +set -g weather_day_snow_thunderstorm \ue95a +set -g weather_night_snow_thunderstorm \ue95b +set -g weather_night_alt_snow_thunderstorm \ue95c +set -g weather_solar_eclipse \ue95d +set -g weather_lunar_eclipse \ue95e +set -g weather_meteor \ue95f +set -g weather_hot \ue960 +set -g weather_hurricane \ue961 +set -g weather_smog \ue962 +set -g weather_alien \ue963 +set -g weather_snowflake_cold \ue964 +set -g weather_stars \ue965 +set -g weather_raindrop \ue966 +set -g weather_barometer \ue967 +set -g weather_humidity \ue968 +set -g weather_na \ue969 +set -g weather_flood \ue96a +set -g weather_day_cloudy_high \ue96b +set -g weather_night_alt_cloudy_high \ue96c +set -g weather_night_cloudy_high \ue96d +set -g weather_night_alt_partly_cloudy \ue96e +set -g weather_sandstorm \ue96f +set -g weather_night_partly_cloudy \ue970 +set -g weather_umbrella \ue971 +set -g weather_day_windy \ue972 +set -g weather_night_alt_cloudy \ue973 +set -g weather_direction_up_left \ue974 +set -g weather_direction_down_right \ue975 +set -g weather_time_12 \ue976 +set -g weather_time_1 \ue977 +set -g weather_time_2 \ue978 +set -g weather_time_3 \ue979 +set -g weather_time_4 \ue97a +set -g weather_time_5 \ue97b +set -g weather_time_6 \ue97c +set -g weather_time_7 \ue97d +set -g weather_time_8 \ue97e +set -g weather_time_9 \ue97f +set -g weather_time_10 \ue980 +set -g weather_time_11 \ue981 +set -g weather_moon_new \ue982 +set -g weather_moon_waxing_crescent_1 \ue983 +set -g weather_moon_waxing_crescent_2 \ue984 +set -g weather_moon_waxing_crescent_3 \ue985 +set -g weather_moon_waxing_crescent_4 \ue986 +set -g weather_moon_waxing_crescent_5 \ue987 +set -g weather_moon_waxing_crescent_6 \ue988 +set -g weather_moon_first_quarter \ue989 +set -g weather_moon_waxing_gibbous_1 \ue98a +set -g weather_moon_waxing_gibbous_2 \ue98b +set -g weather_moon_waxing_gibbous_3 \ue98c +set -g weather_moon_waxing_gibbous_4 \ue98d +set -g weather_moon_waxing_gibbous_5 \ue98e +set -g weather_moon_waxing_gibbous_6 \ue98f +set -g weather_moon_full \ue990 +set -g weather_moon_waning_gibbous_1 \ue991 +set -g weather_moon_waning_gibbous_2 \ue992 +set -g weather_moon_waning_gibbous_3 \ue993 +set -g weather_moon_waning_gibbous_4 \ue994 +set -g weather_moon_waning_gibbous_5 \ue995 +set -g weather_moon_waning_gibbous_6 \ue996 +set -g weather_moon_third_quarter \ue997 +set -g weather_moon_waning_crescent_1 \ue998 +set -g weather_moon_waning_crescent_2 \ue999 +set -g weather_moon_waning_crescent_3 \ue99a +set -g weather_moon_waning_crescent_4 \ue99b +set -g weather_moon_waning_crescent_5 \ue99c +set -g weather_moon_waning_crescent_6 \ue99d +set -g weather_wind_direction \ue99e +set -g weather_day_sleet \ue99f +set -g weather_night_sleet \ue9a0 +set -g weather_night_alt_sleet \ue9a1 +set -g weather_sleet \ue9a2 +set -g weather_day_haze \ue9a3 +set -g weather_wind_beaufort_0 \ue9a4 +set -g weather_wind_beaufort_1 \ue9a5 +set -g weather_wind_beaufort_2 \ue9a6 +set -g weather_wind_beaufort_3 \ue9a7 +set -g weather_wind_beaufort_4 \ue9a8 +set -g weather_wind_beaufort_5 \ue9a9 +set -g weather_wind_beaufort_6 \ue9aa +set -g weather_wind_beaufort_7 \ue9ab +set -g weather_wind_beaufort_8 \ue9ac +set -g weather_wind_beaufort_9 \ue9ad +set -g weather_wind_beaufort_10 \ue9ae +set -g weather_wind_beaufort_11 \ue9af +set -g weather_wind_beaufort_12 \ue9b0 +set -g weather_day_light_wind \ue9b1 +set -g weather_tsunami \ue9b2 +set -g weather_earthquake \ue9b3 +set -g weather_fire \ue9b4 +set -g weather_volcano \ue9b5 +set -g weather_moonrise \ue9b6 +set -g weather_moonset \ue9b7 +set -g weather_train \ue9b8 +set -g weather_small_craft_advisory \ue9b9 +set -g weather_gale_warning \ue9ba +set -g weather_storm_warning \ue9bb +set -g weather_hurricane_warning \ue9bc +set -g weather_moon_alt_waxing_crescent_1 \ue9bd +set -g weather_moon_alt_waxing_crescent_2 \ue9be +set -g weather_moon_alt_waxing_crescent_3 \ue9bf +set -g weather_moon_alt_waxing_crescent_4 \ue9c0 +set -g weather_moon_alt_waxing_crescent_5 \ue9c1 +set -g weather_moon_alt_waxing_crescent_6 \ue9c2 +set -g weather_moon_alt_first_quarter \ue9c3 +set -g weather_moon_alt_waxing_gibbous_1 \ue9c4 +set -g weather_moon_alt_waxing_gibbous_2 \ue9c5 +set -g weather_moon_alt_waxing_gibbous_3 \ue9c6 +set -g weather_moon_alt_waxing_gibbous_4 \ue9c7 +set -g weather_moon_alt_waxing_gibbous_5 \ue9c8 +set -g weather_moon_alt_waxing_gibbous_6 \ue9c9 +set -g weather_moon_alt_full \ue9ca +set -g weather_moon_alt_waning_gibbous_1 \ue9cb +set -g weather_moon_alt_waning_gibbous_2 \ue9cc +set -g weather_moon_alt_waning_gibbous_3 \ue9cd +set -g weather_moon_alt_waning_gibbous_4 \ue9ce +set -g weather_moon_alt_waning_gibbous_5 \ue9cf +set -g weather_moon_alt_waning_gibbous_6 \ue9d0 +set -g weather_moon_alt_third_quarter \ue9d1 +set -g weather_moon_alt_waning_crescent_1 \ue9d2 +set -g weather_moon_alt_waning_crescent_2 \ue9d3 +set -g weather_moon_alt_waning_crescent_3 \ue9d4 +set -g weather_moon_alt_waning_crescent_4 \ue9d5 +set -g weather_moon_alt_waning_crescent_5 \ue9d6 +set -g weather_moon_alt_waning_crescent_6 \ue9d7 +set -g weather_moon_alt_new \ue9d8 +set -g linux_archlinux \ue9d9 +set -g linux_centos \ue9da +set -g linux_debian \ue9db +set -g linux_fedora \ue9dc +set -g linux_linuxmint \ue9dd +set -g linux_linuxmint_inverse \ue9de +set -g linux_mageia \ue9df +set -g linux_mandriva \ue9e0 +set -g linux_opensuse \ue9e1 +set -g linux_redhat \ue9e2 +set -g linux_slackware \ue9e3 +set -g linux_slackware_inverse \ue9e4 +set -g linux_ubuntu \ue9e5 +set -g linux_ubuntu_inverse \ue9e6 +set -g linux_freebsd \ue9e7 +set -g linux_coreos \ue9e8 +set -g linux_gentoo \ue9e9 +set -g linux_elementary \ue9ea +set -g linux_fedora_inverse \ue9eb +set -g linux_sabayon \ue9ec +set -g linux_aosc \ue9ed +set -g linux_nixos \ue9ee +set -g linux_tux \ue9ef +set -g linux_raspberry_pi \ue9f0 +set -g linux_manjaro \ue9f1 +set -g linux_apple \ue9f2 +set -g linux_docker \ue9f3 +set -g linux_alpine \ue9f4 +set -g myicons_0001 \ue9f5 +set -g myicons_0002 \ue9f6 +set -g myicons_0003 \ue9f7 +set -g myicons_0004 \ue9f8 +set -g myicons_0005 \ue9f9 +set -g myicons_0006 \ue9fa +set -g myicons_0007 \ue9fb +set -g myicons_0008 \ue9fc +set -g myicons_0009 \ue9fd +set -g myicons_000a \ue9fe +set -g myicons_000b \ue9ff +set -g myicons_000d \uea00 +set -g myicons_000e \uea01 +set -g myicons_0010 \uea02 +set -g myicons_0011 \uea03 +set -g myicons_0013 \uea04 +set -g myicons_0014 \uea05 +set -g myicons_arch_linux_arrow \uea06 +set -g dev_bing_small \uea07 +set -g dev_css_tricks \uea08 +set -g dev_git \uea09 +set -g dev_bitbucket \uea0a +set -g dev_mysql \uea0b +set -g dev_streamline \uea0c +set -g dev_database \uea0d +set -g dev_dropbox \uea0e +set -g dev_github_alt \uea0f +set -g dev_github_badge \uea10 +set -g dev_github \uea11 +set -g dev_wordpress \uea12 +set -g dev_visualstudio \uea13 +set -g dev_jekyll_small \uea14 +set -g dev_android \uea15 +set -g dev_windows \uea16 +set -g dev_stackoverflow \uea17 +set -g dev_apple \uea18 +set -g dev_linux \uea19 +set -g dev_appstore \uea1a +set -g dev_ghost_small \uea1b +set -g dev_yahoo \uea1c +set -g dev_codepen \uea1d +set -g dev_github_full \uea1e +set -g dev_nodejs_small \uea1f +set -g dev_nodejs \uea20 +set -g dev_hackernews \uea21 +set -g dev_ember \uea22 +set -g dev_dojo \uea23 +set -g dev_django \uea24 +set -g dev_npm \uea25 +set -g dev_ghost \uea26 +set -g dev_modernizr \uea27 +set -g dev_unity_small \uea28 +set -g dev_raspberry_pi \uea29 +set -g dev_blackberry \uea2a +set -g dev_go \uea2b +set -g dev_git_branch \uea2c +set -g dev_git_pull_request \uea2d +set -g dev_git_merge \uea2e +set -g dev_git_compare \uea2f +set -g dev_git_commit \uea30 +set -g dev_cssdeck \uea31 +set -g dev_yahoo_small \uea32 +set -g dev_techcrunch \uea33 +set -g dev_smashing_magazine \uea34 +set -g dev_netmagazine \uea35 +set -g dev_codrops \uea36 +set -g dev_phonegap \uea37 +set -g dev_google_drive \uea38 +set -g dev_html5_multimedia \uea39 +set -g dev_html5_device_access \uea3a +set -g dev_html5_connectivity \uea3b +set -g dev_html5_3d_effects \uea3c +set -g dev_html5 \uea3d +set -g dev_scala \uea3e +set -g dev_java \uea3f +set -g dev_ruby \uea40 +set -g dev_ubuntu \uea41 +set -g dev_ruby_on_rails \uea42 +set -g dev_python \uea43 +set -g dev_php \uea44 +set -g dev_markdown \uea45 +set -g dev_laravel \uea46 +set -g dev_magento \uea47 +set -g dev_joomla \uea48 +set -g dev_drupal \uea49 +set -g dev_chrome \uea4a +set -g dev_ie \uea4b +set -g dev_firefox \uea4c +set -g dev_opera \uea4d +set -g dev_bootstrap \uea4e +set -g dev_safari \uea4f +set -g dev_css3 \uea50 +set -g dev_css3_full \uea51 +set -g dev_sass \uea52 +set -g dev_grunt \uea53 +set -g dev_bower \uea54 +set -g dev_javascript \uea55 +set -g dev_javascript_shield \uea56 +set -g dev_jquery \uea57 +set -g dev_coffeescript \uea58 +set -g dev_backbone \uea59 +set -g dev_angular \uea5a +set -g dev_jquery_ui \uea5b +set -g dev_swift \uea5c +set -g dev_symfony \uea5d +set -g dev_symfony_badge \uea5e +set -g dev_less \uea5f +set -g dev_stylus \uea60 +set -g dev_trello \uea61 +set -g dev_atlassian \uea62 +set -g dev_jira \uea63 +set -g dev_envato \uea64 +set -g dev_snap_svg \uea65 +set -g dev_raphael \uea66 +set -g dev_google_analytics \uea67 +set -g dev_compass \uea68 +set -g dev_onedrive \uea69 +set -g dev_gulp \uea6a +set -g dev_atom \uea6b +set -g dev_cisco \uea6c +set -g dev_nancy \uea6d +set -g dev_jenkins \uea6e +set -g dev_clojure \uea6f +set -g dev_perl \uea70 +set -g dev_clojure_alt \uea71 +set -g dev_celluloid \uea72 +set -g dev_w3c \uea73 +set -g dev_redis \uea74 +set -g dev_postgresql \uea75 +set -g dev_webplatform \uea76 +set -g dev_requirejs \uea77 +set -g dev_opensource \uea78 +set -g dev_typo3 \uea79 +set -g dev_uikit \uea7a +set -g dev_doctrine \uea7b +set -g dev_groovy \uea7c +set -g dev_nginx \uea7d +set -g dev_haskell \uea7e +set -g dev_zend \uea7f +set -g dev_gnu \uea80 +set -g dev_yeoman \uea81 +set -g dev_heroku \uea82 +set -g dev_msql_server \uea83 +set -g dev_debian \uea84 +set -g dev_travis \uea85 +set -g dev_dotnet \uea86 +set -g dev_codeigniter \uea87 +set -g dev_javascript_badge \uea88 +set -g dev_yii \uea89 +set -g dev_composer \uea8a +set -g dev_krakenjs_badge \uea8b +set -g dev_krakenjs \uea8c +set -g dev_mozilla \uea8d +set -g dev_firebase \uea8e +set -g dev_sizzlejs \uea8f +set -g dev_creativecommons \uea90 +set -g dev_creativecommons_badge \uea91 +set -g dev_mitlicence \uea92 +set -g dev_senchatouch \uea93 +set -g dev_bugsense \uea94 +set -g dev_extjs \uea95 +set -g dev_mootools_badge \uea96 +set -g dev_mootools \uea97 +set -g dev_ruby_rough \uea98 +set -g dev_komodo \uea99 +set -g dev_coda \uea9a +set -g dev_bintray \uea9b +set -g dev_terminal \uea9c +set -g dev_code \uea9d +set -g dev_responsive \uea9e +set -g dev_dart \uea9f +set -g dev_aptana \ueaa0 +set -g dev_mailchimp \ueaa1 +set -g dev_netbeans \ueaa2 +set -g dev_dreamweaver \ueaa3 +set -g dev_brackets \ueaa4 +set -g dev_eclipse \ueaa5 +set -g dev_cloud9 \ueaa6 +set -g dev_scrum \ueaa7 +set -g dev_prolog \ueaa8 +set -g dev_terminal_badge \ueaa9 +set -g dev_code_badge \ueaaa +set -g dev_mongodb \ueaab +set -g dev_meteor \ueaac +set -g dev_meteorfull \ueaad +set -g dev_fsharp \ueaae +set -g dev_rust \ueaaf +set -g dev_ionic \ueab0 +set -g dev_sublime \ueab1 +set -g dev_appcelerator \ueab2 +set -g dev_asterisk \ueab3 +set -g dev_aws \ueab4 +set -g dev_digital_ocean \ueab5 +set -g dev_dlang \ueab6 +set -g dev_docker \ueab7 +set -g dev_erlang \ueab8 +set -g dev_google_cloud_platform \ueab9 +set -g dev_grails \ueaba +set -g dev_illustrator \ueabb +set -g dev_intellij \ueabc +set -g dev_materializecss \ueabd +set -g dev_openshift \ueabe +set -g dev_photoshop \ueabf +set -g dev_rackspace \ueac0 +set -g dev_react \ueac1 +set -g dev_redhat \ueac2 +set -g dev_scriptcs \ueac3 +set -g dev_e6bd \ueac4 +set -g dev_e6be \ueac5 +set -g dev_e6bf \ueac6 +set -g dev_e6c0 \ueac7 +set -g dev_e6c1 \ueac8 +set -g dev_e6c2 \ueac9 +set -g dev_e6c3 \ueaca +set -g dev_sqllite \ueacb +set -g dev_vim \ueacc +set -g pom_clean_code \ueacd +set -g pom_pomodoro_done \ueace +set -g pom_pomodoro_estimated \ueacf +set -g pom_pomodoro_ticking \uead0 +set -g pom_pomodoro_squashed \uead1 +set -g pom_short_pause \uead2 +set -g pom_long_pause \uead3 +set -g pom_away \uead4 +set -g pom_pair_programming \uead5 +set -g pom_internal_interruption \uead6 +set -g pom_external_interruption \uead7 +set -g linea_arrows_anticlockwise \uead8 +set -g linea_arrows_anticlockwise_dashed \uead9 +set -g linea_arrows_button_down \ueada +set -g linea_arrows_button_off \ueadb +set -g linea_arrows_button_on \ueadc +set -g linea_arrows_button_up \ueadd +set -g linea_arrows_check \ueade +set -g linea_arrows_circle_check \ueadf +set -g linea_arrows_circle_down \ueae0 +set -g linea_arrows_circle_downleft \ueae1 +set -g linea_arrows_circle_downright \ueae2 +set -g linea_arrows_circle_left \ueae3 +set -g linea_arrows_circle_minus \ueae4 +set -g linea_arrows_circle_plus \ueae5 +set -g linea_arrows_circle_remove \ueae6 +set -g linea_arrows_circle_right \ueae7 +set -g linea_arrows_circle_up \ueae8 +set -g linea_arrows_circle_upleft \ueae9 +set -g linea_arrows_circle_upright \ueaea +set -g linea_arrows_clockwise \ueaeb +set -g linea_arrows_clockwise_dashed \ueaec +set -g linea_arrows_compress \ueaed +set -g linea_arrows_deny \ueaee +set -g linea_arrows_diagonal \ueaef +set -g linea_arrows_diagonal2 \ueaf0 +set -g linea_arrows_down \ueaf1 +set -g linea_arrows_down_double \ueaf2 +set -g linea_arrows_downleft \ueaf3 +set -g linea_arrows_downright \ueaf4 +set -g linea_arrows_drag_down \ueaf5 +set -g linea_arrows_drag_down_dashed \ueaf6 +set -g linea_arrows_drag_horiz \ueaf7 +set -g linea_arrows_drag_left \ueaf8 +set -g linea_arrows_drag_left_dashed \ueaf9 +set -g linea_arrows_drag_right \ueafa +set -g linea_arrows_drag_right_dashed \ueafb +set -g linea_arrows_drag_up \ueafc +set -g linea_arrows_drag_up_dashed \ueafd +set -g linea_arrows_drag_vert \ueafe +set -g linea_arrows_exclamation \ueaff +set -g linea_arrows_expand \ueb00 +set -g linea_arrows_expand_diagonal1 \ueb01 +set -g linea_arrows_expand_horizontal1 \ueb02 +set -g linea_arrows_expand_vertical1 \ueb03 +set -g linea_arrows_fit_horizontal \ueb04 +set -g linea_arrows_fit_vertical \ueb05 +set -g linea_arrows_glide \ueb06 +set -g linea_arrows_glide_horizontal \ueb07 +set -g linea_arrows_glide_vertical \ueb08 +set -g linea_arrows_hamburger1 \ueb09 +set -g linea_arrows_hamburger_2 \ueb0a +set -g linea_arrows_horizontal \ueb0b +set -g linea_arrows_info \ueb0c +set -g linea_arrows_keyboard_alt \ueb0d +set -g linea_arrows_keyboard_cmd \ueb0e +set -g linea_arrows_keyboard_delete \ueb0f +set -g linea_arrows_keyboard_down \ueb10 +set -g linea_arrows_keyboard_left \ueb11 +set -g linea_arrows_keyboard_return \ueb12 +set -g linea_arrows_keyboard_right \ueb13 +set -g linea_arrows_keyboard_shift \ueb14 +set -g linea_arrows_keyboard_tab \ueb15 +set -g linea_arrows_keyboard_up \ueb16 +set -g linea_arrows_left \ueb17 +set -g linea_arrows_left_double_32 \ueb18 +set -g linea_arrows_minus \ueb19 +set -g linea_arrows_move \ueb1a +set -g linea_arrows_move2 \ueb1b +set -g linea_arrows_move_bottom \ueb1c +set -g linea_arrows_move_left \ueb1d +set -g linea_arrows_move_right \ueb1e +set -g linea_arrows_move_top \ueb1f +set -g linea_arrows_plus \ueb20 +set -g linea_arrows_question \ueb21 +set -g linea_arrows_remove \ueb22 +set -g linea_arrows_right \ueb23 +set -g linea_arrows_right_double \ueb24 +set -g linea_arrows_rotate \ueb25 +set -g linea_arrows_rotate_anti \ueb26 +set -g linea_arrows_rotate_anti_dashed \ueb27 +set -g linea_arrows_rotate_dashed \ueb28 +set -g linea_arrows_shrink \ueb29 +set -g linea_arrows_shrink_diagonal1 \ueb2a +set -g linea_arrows_shrink_diagonal2 \ueb2b +set -g linea_arrows_shrink_horizonal2 \ueb2c +set -g linea_arrows_shrink_horizontal1 \ueb2d +set -g linea_arrows_shrink_vertical1 \ueb2e +set -g linea_arrows_shrink_vertical2 \ueb2f +set -g linea_arrows_sign_down \ueb30 +set -g linea_arrows_sign_left \ueb31 +set -g linea_arrows_sign_right \ueb32 +set -g linea_arrows_sign_up \ueb33 +set -g linea_arrows_slide_down1 \ueb34 +set -g linea_arrows_slide_down2 \ueb35 +set -g linea_arrows_slide_left1 \ueb36 +set -g linea_arrows_slide_left2 \ueb37 +set -g linea_arrows_slide_right1 \ueb38 +set -g linea_arrows_slide_right2 \ueb39 +set -g linea_arrows_slide_up1 \ueb3a +set -g linea_arrows_slide_up2 \ueb3b +set -g linea_arrows_slim_down \ueb3c +set -g linea_arrows_slim_down_dashed \ueb3d +set -g linea_arrows_slim_left \ueb3e +set -g linea_arrows_slim_left_dashed \ueb3f +set -g linea_arrows_slim_right \ueb40 +set -g linea_arrows_slim_right_dashed \ueb41 +set -g linea_arrows_slim_up \ueb42 +set -g linea_arrows_slim_up_dashed \ueb43 +set -g linea_arrows_square_check \ueb44 +set -g linea_arrows_square_down \ueb45 +set -g linea_arrows_square_downleft \ueb46 +set -g linea_arrows_square_downright \ueb47 +set -g linea_arrows_square_left \ueb48 +set -g linea_arrows_square_minus \ueb49 +set -g linea_arrows_square_plus \ueb4a +set -g linea_arrows_square_remove \ueb4b +set -g linea_arrows_square_right \ueb4c +set -g linea_arrows_square_up \ueb4d +set -g linea_arrows_square_upleft \ueb4e +set -g linea_arrows_square_upright \ueb4f +set -g linea_arrows_squares \ueb50 +set -g linea_arrows_stretch_diagonal1 \ueb51 +set -g linea_arrows_stretch_diagonal2 \ueb52 +set -g linea_arrows_stretch_diagonal3 \ueb53 +set -g linea_arrows_stretch_diagonal4 \ueb54 +set -g linea_arrows_stretch_horizontal1 \ueb55 +set -g linea_arrows_stretch_horizontal2 \ueb56 +set -g linea_arrows_stretch_vertical1 \ueb57 +set -g linea_arrows_stretch_vertical2 \ueb58 +set -g linea_arrows_switch_horizontal \ueb59 +set -g linea_arrows_switch_vertical \ueb5a +set -g linea_arrows_up \ueb5b +set -g linea_arrows_up_double_33 \ueb5c +set -g linea_arrows_upleft \ueb5d +set -g linea_arrows_upright \ueb5e +set -g linea_arrows_vertical \ueb5f +set -g linea_basic_lock_open \ueb60 +set -g linea_basic_magic_mouse \ueb61 +set -g linea_basic_magnifier \ueb62 +set -g linea_basic_magnifier_minus \ueb63 +set -g linea_basic_magnifier_plus \ueb64 +set -g linea_basic_mail \ueb65 +set -g linea_basic_mail_multiple \ueb66 +set -g linea_basic_mail_open \ueb67 +set -g linea_basic_mail_open_text \ueb68 +set -g linea_basic_male \ueb69 +set -g linea_basic_map \ueb6a +set -g linea_basic_message \ueb6b +set -g linea_basic_message_multiple \ueb6c +set -g linea_basic_message_txt \ueb6d +set -g linea_basic_mixer2 \ueb6e +set -g linea_basic_info \ueb6f +set -g linea_basic_ipod \ueb70 +set -g linea_basic_joypad \ueb71 +set -g linea_basic_key \ueb72 +set -g linea_basic_keyboard \ueb73 +set -g linea_basic_laptop \ueb74 +set -g linea_basic_life_buoy \ueb75 +set -g linea_basic_lightbulb \ueb76 +set -g linea_basic_link \ueb77 +set -g linea_basic_lock \ueb78 +set -g linea_basic_mouse \ueb79 +set -g linea_basic_notebook \ueb7a +set -g linea_basic_notebook_pen \ueb7b +set -g linea_basic_notebook_pencil \ueb7c +set -g linea_basic_paperplane \ueb7d +set -g linea_basic_pencil_ruler \ueb7e +set -g linea_basic_pencil_ruler_pen \ueb7f +set -g linea_basic_clubs \ueb80 +set -g linea_basic_compass \ueb81 +set -g linea_basic_cup \ueb82 +set -g linea_basic_diamonds \ueb83 +set -g linea_basic_display \ueb84 +set -g linea_basic_download \ueb85 +set -g linea_basic_exclamation \ueb86 +set -g linea_basic_eye \ueb87 +set -g linea_basic_eye_closed \ueb88 +set -g linea_basic_female \ueb89 +set -g linea_basic_flag1 \ueb8a +set -g linea_basic_flag2 \ueb8b +set -g linea_basic_floppydisk \ueb8c +set -g linea_basic_folder \ueb8d +set -g linea_basic_folder_multiple \ueb8e +set -g linea_basic_gear \ueb8f +set -g linea_basic_geolocalize_01 \ueb90 +set -g linea_basic_geolocalize_05 \ueb91 +set -g linea_basic_globe \ueb92 +set -g linea_basic_gunsight \ueb93 +set -g linea_basic_hammer \ueb94 +set -g linea_basic_headset \ueb95 +set -g linea_basic_heart \ueb96 +set -g linea_basic_heart_broken \ueb97 +set -g linea_basic_helm \ueb98 +set -g linea_basic_home \ueb99 +set -g linea_basic_photo \ueb9a +set -g linea_basic_rss \ueb9b +set -g linea_basic_picture \ueb9c +set -g linea_basic_picture_multiple \ueb9d +set -g linea_basic_pin1 \ueb9e +set -g linea_basic_pin2 \ueb9f +set -g linea_basic_accelerator \ueba0 +set -g linea_basic_alarm \ueba1 +set -g linea_basic_anchor \ueba2 +set -g linea_basic_anticlockwise \ueba3 +set -g linea_basic_archive \ueba4 +set -g linea_basic_archive_full \ueba5 +set -g linea_basic_ban \ueba6 +set -g linea_basic_battery_charge \ueba7 +set -g linea_basic_battery_empty \ueba8 +set -g linea_basic_battery_full \ueba9 +set -g linea_basic_battery_half \uebaa +set -g linea_basic_bolt \uebab +set -g linea_basic_book \uebac +set -g linea_basic_book_pen \uebad +set -g linea_basic_book_pencil \uebae +set -g linea_basic_bookmark \uebaf +set -g linea_basic_calculator \uebb0 +set -g linea_basic_calendar \uebb1 +set -g linea_basic_cards_diamonds \uebb2 +set -g linea_basic_cards_hearts \uebb3 +set -g linea_basic_case \uebb4 +set -g linea_basic_chronometer \uebb5 +set -g linea_basic_clessidre \uebb6 +set -g linea_basic_clock \uebb7 +set -g linea_basic_clockwise \uebb8 +set -g linea_basic_cloud \uebb9 +set -g linea_basic_postcard \uebba +set -g linea_basic_postcard_multiple \uebbb +set -g linea_basic_printer \uebbc +set -g linea_basic_question \uebbd +set -g linea_basic_server \uebbe +set -g linea_basic_server2 \uebbf +set -g linea_basic_server_cloud \uebc0 +set -g linea_basic_server_download \uebc1 +set -g linea_basic_server_upload \uebc2 +set -g linea_basic_settings \uebc3 +set -g linea_basic_share \uebc4 +set -g linea_basic_sheet \uebc5 +set -g linea_basic_sheet_multiple \uebc6 +set -g linea_basic_sheet_pen \uebc7 +set -g linea_basic_sheet_pencil \uebc8 +set -g linea_basic_sheet_txt \uebc9 +set -g linea_basic_signs \uebca +set -g linea_basic_smartphone \uebcb +set -g linea_basic_spades \uebcc +set -g linea_basic_spread \uebcd +set -g linea_basic_spread_bookmark \uebce +set -g linea_basic_spread_text \uebcf +set -g linea_basic_spread_text_bookmark \uebd0 +set -g linea_basic_star \uebd1 +set -g linea_basic_tablet \uebd2 +set -g linea_basic_target \uebd3 +set -g linea_basic_todo \uebd4 +set -g linea_basic_todo_pen \uebd5 +set -g linea_basic_todo_pencil \uebd6 +set -g linea_basic_todo_txt \uebd7 +set -g linea_basic_todolist_pen \uebd8 +set -g linea_basic_todolist_pencil \uebd9 +set -g linea_basic_trashcan \uebda +set -g linea_basic_trashcan_full \uebdb +set -g linea_basic_trashcan_refresh \uebdc +set -g linea_basic_trashcan_remove \uebdd +set -g linea_basic_upload \uebde +set -g linea_basic_usb \uebdf +set -g linea_basic_video \uebe0 +set -g linea_basic_watch \uebe1 +set -g linea_basic_webpage \uebe2 +set -g linea_basic_webpage_img_txt \uebe3 +set -g linea_basic_webpage_multiple \uebe4 +set -g linea_basic_webpage_txt \uebe5 +set -g linea_basic_world \uebe6 +set -g linea_elaboration_document_previous \uebe7 +set -g linea_elaboration_document_refresh \uebe8 +set -g linea_elaboration_document_remove \uebe9 +set -g linea_elaboration_document_search \uebea +set -g linea_elaboration_document_star \uebeb +set -g linea_elaboration_document_upload \uebec +set -g linea_elaboration_folder_check \uebed +set -g linea_elaboration_folder_cloud \uebee +set -g linea_elaboration_folder_document \uebef +set -g linea_elaboration_folder_download \uebf0 +set -g linea_elaboration_folder_flagged \uebf1 +set -g linea_elaboration_folder_graph \uebf2 +set -g linea_elaboration_folder_heart \uebf3 +set -g linea_elaboration_folder_minus \uebf4 +set -g linea_elaboration_folder_next \uebf5 +set -g linea_elaboration_document_flagged \uebf6 +set -g linea_elaboration_document_graph \uebf7 +set -g linea_elaboration_document_heart \uebf8 +set -g linea_elaboration_document_minus \uebf9 +set -g linea_elaboration_document_next \uebfa +set -g linea_elaboration_document_noaccess \uebfb +set -g linea_elaboration_document_note \uebfc +set -g linea_elaboration_document_pencil \uebfd +set -g linea_elaboration_document_picture \uebfe +set -g linea_elaboration_document_plus \uebff +set -g linea_elaboration_folder_noaccess \uec00 +set -g linea_elaboration_folder_note \uec01 +set -g linea_elaboration_folder_pencil \uec02 +set -g linea_elaboration_folder_picture \uec03 +set -g linea_elaboration_folder_plus \uec04 +set -g linea_elaboration_folder_previous \uec05 +set -g linea_elaboration_folder_refresh \uec06 +set -g linea_elaboration_calendar_empty \uec07 +set -g linea_elaboration_calendar_flagged \uec08 +set -g linea_elaboration_calendar_heart \uec09 +set -g linea_elaboration_calendar_minus \uec0a +set -g linea_elaboration_calendar_next \uec0b +set -g linea_elaboration_calendar_noaccess \uec0c +set -g linea_elaboration_calendar_pencil \uec0d +set -g linea_elaboration_calendar_plus \uec0e +set -g linea_elaboration_calendar_previous \uec0f +set -g linea_elaboration_calendar_refresh \uec10 +set -g linea_elaboration_calendar_remove \uec11 +set -g linea_elaboration_calendar_search \uec12 +set -g linea_elaboration_calendar_star \uec13 +set -g linea_elaboration_calendar_upload \uec14 +set -g linea_elaboration_cloud_check \uec15 +set -g linea_elaboration_cloud_download \uec16 +set -g linea_elaboration_cloud_minus \uec17 +set -g linea_elaboration_cloud_noaccess \uec18 +set -g linea_elaboration_cloud_plus \uec19 +set -g linea_elaboration_cloud_refresh \uec1a +set -g linea_elaboration_cloud_remove \uec1b +set -g linea_elaboration_cloud_search \uec1c +set -g linea_elaboration_cloud_upload \uec1d +set -g linea_elaboration_document_check \uec1e +set -g linea_elaboration_document_cloud \uec1f +set -g linea_elaboration_document_download \uec20 +set -g linea_elaboration_folder_remove \uec21 +set -g linea_elaboration_mail_heart \uec22 +set -g linea_elaboration_folder_search \uec23 +set -g linea_elaboration_folder_star \uec24 +set -g linea_elaboration_folder_upload \uec25 +set -g linea_elaboration_mail_check \uec26 +set -g linea_elaboration_bookmark_checck \uec27 +set -g linea_elaboration_bookmark_minus \uec28 +set -g linea_elaboration_bookmark_plus \uec29 +set -g linea_elaboration_bookmark_remove \uec2a +set -g linea_elaboration_briefcase_check \uec2b +set -g linea_elaboration_briefcase_download \uec2c +set -g linea_elaboration_briefcase_flagged \uec2d +set -g linea_elaboration_briefcase_minus \uec2e +set -g linea_elaboration_briefcase_plus \uec2f +set -g linea_elaboration_briefcase_refresh \uec30 +set -g linea_elaboration_briefcase_remove \uec31 +set -g linea_elaboration_briefcase_search \uec32 +set -g linea_elaboration_briefcase_star \uec33 +set -g linea_elaboration_briefcase_upload \uec34 +set -g linea_elaboration_browser_check \uec35 +set -g linea_elaboration_browser_download \uec36 +set -g linea_elaboration_browser_minus \uec37 +set -g linea_elaboration_browser_plus \uec38 +set -g linea_elaboration_browser_refresh \uec39 +set -g linea_elaboration_browser_remove \uec3a +set -g linea_elaboration_browser_search \uec3b +set -g linea_elaboration_browser_star \uec3c +set -g linea_elaboration_browser_upload \uec3d +set -g linea_elaboration_calendar_check \uec3e +set -g linea_elaboration_calendar_cloud \uec3f +set -g linea_elaboration_calendar_download \uec40 +set -g linea_elaboration_mail_cloud \uec41 +set -g linea_elaboration_mail_document \uec42 +set -g linea_elaboration_mail_download \uec43 +set -g linea_elaboration_mail_flagged \uec44 +set -g linea_elaboration_mail_next \uec45 +set -g linea_elaboration_mail_noaccess \uec46 +set -g linea_elaboration_mail_note \uec47 +set -g linea_elaboration_mail_pencil \uec48 +set -g linea_elaboration_mail_picture \uec49 +set -g linea_elaboration_mail_previous \uec4a +set -g linea_elaboration_mail_refresh \uec4b +set -g linea_elaboration_mail_remove \uec4c +set -g linea_elaboration_mail_search \uec4d +set -g linea_elaboration_mail_star \uec4e +set -g linea_elaboration_mail_upload \uec4f +set -g linea_elaboration_message_check \uec50 +set -g linea_elaboration_message_dots \uec51 +set -g linea_elaboration_message_happy \uec52 +set -g linea_elaboration_message_heart \uec53 +set -g linea_elaboration_message_minus \uec54 +set -g linea_elaboration_message_note \uec55 +set -g linea_elaboration_message_plus \uec56 +set -g linea_elaboration_message_refresh \uec57 +set -g linea_elaboration_message_remove \uec58 +set -g linea_elaboration_message_sad \uec59 +set -g linea_elaboration_smartphone_cloud \uec5a +set -g linea_elaboration_smartphone_heart \uec5b +set -g linea_elaboration_smartphone_noaccess \uec5c +set -g linea_elaboration_smartphone_note \uec5d +set -g linea_elaboration_smartphone_pencil \uec5e +set -g linea_elaboration_smartphone_picture \uec5f +set -g linea_elaboration_smartphone_refresh \uec60 +set -g linea_elaboration_smartphone_search \uec61 +set -g linea_elaboration_tablet_cloud \uec62 +set -g linea_elaboration_tablet_heart \uec63 +set -g linea_elaboration_tablet_noaccess \uec64 +set -g linea_elaboration_tablet_note \uec65 +set -g linea_elaboration_tablet_pencil \uec66 +set -g linea_elaboration_tablet_picture \uec67 +set -g linea_elaboration_tablet_refresh \uec68 +set -g linea_elaboration_tablet_search \uec69 +set -g linea_elaboration_todolist_2 \uec6a +set -g linea_elaboration_todolist_check \uec6b +set -g linea_elaboration_todolist_cloud \uec6c +set -g linea_elaboration_todolist_download \uec6d +set -g linea_elaboration_todolist_flagged \uec6e +set -g linea_elaboration_todolist_minus \uec6f +set -g linea_elaboration_todolist_noaccess \uec70 +set -g linea_elaboration_todolist_pencil \uec71 +set -g linea_elaboration_todolist_plus \uec72 +set -g linea_elaboration_todolist_refresh \uec73 +set -g linea_elaboration_todolist_remove \uec74 +set -g linea_elaboration_todolist_search \uec75 +set -g linea_elaboration_todolist_star \uec76 +set -g linea_elaboration_todolist_upload \uec77 +set -g linea_ecommerce_receipt_kips \uec78 +set -g linea_ecommerce_receipt_lira \uec79 +set -g linea_ecommerce_receipt_naira \uec7a +set -g linea_ecommerce_receipt_pesos \uec7b +set -g linea_ecommerce_receipt_pound \uec7c +set -g linea_ecommerce_receipt_rublo \uec7d +set -g linea_ecommerce_receipt_rupee \uec7e +set -g linea_ecommerce_receipt_tugrik \uec7f +set -g linea_ecommerce_receipt_won \uec80 +set -g linea_ecommerce_receipt_yen \uec81 +set -g linea_ecommerce_receipt_yen2 \uec82 +set -g linea_ecommerce_recept_colon \uec83 +set -g linea_ecommerce_rublo \uec84 +set -g linea_ecommerce_rupee \uec85 +set -g linea_ecommerce_safe \uec86 +set -g linea_ecommerce_naira \uec87 +set -g linea_ecommerce_pesos \uec88 +set -g linea_ecommerce_pound \uec89 +set -g linea_ecommerce_receipt \uec8a +set -g linea_ecommerce_receipt_bath \uec8b +set -g linea_ecommerce_receipt_cent \uec8c +set -g linea_ecommerce_receipt_dollar \uec8d +set -g linea_ecommerce_receipt_euro \uec8e +set -g linea_ecommerce_receipt_franc \uec8f +set -g linea_ecommerce_receipt_guarani \uec90 +set -g linea_ecommerce_sale \uec91 +set -g linea_ecommerce_sales \uec92 +set -g linea_ecommerce_ticket \uec93 +set -g linea_ecommerce_tugriks \uec94 +set -g linea_ecommerce_wallet \uec95 +set -g linea_ecommerce_won \uec96 +set -g linea_ecommerce_yen \uec97 +set -g linea_ecommerce_cart_content \uec98 +set -g linea_ecommerce_cart_download \uec99 +set -g linea_ecommerce_cart_minus \uec9a +set -g linea_ecommerce_cart_plus \uec9b +set -g linea_ecommerce_cart_refresh \uec9c +set -g linea_ecommerce_cart_remove \uec9d +set -g linea_ecommerce_cart_search \uec9e +set -g linea_ecommerce_cart_upload \uec9f +set -g linea_ecommerce_cent \ueca0 +set -g linea_ecommerce_colon \ueca1 +set -g linea_ecommerce_creditcard \ueca2 +set -g linea_ecommerce_diamond \ueca3 +set -g linea_ecommerce_dollar \ueca4 +set -g linea_ecommerce_euro \ueca5 +set -g linea_ecommerce_franc \ueca6 +set -g linea_ecommerce_gift \ueca7 +set -g linea_ecommerce_graph1 \ueca8 +set -g linea_ecommerce_graph2 \ueca9 +set -g linea_ecommerce_graph3 \uecaa +set -g linea_ecommerce_graph_decrease \uecab +set -g linea_ecommerce_graph_increase \uecac +set -g linea_ecommerce_guarani \uecad +set -g linea_ecommerce_kips \uecae +set -g linea_ecommerce_lira \uecaf +set -g linea_ecommerce_megaphone \uecb0 +set -g linea_ecommerce_money \uecb1 +set -g linea_ecommerce_yen2 \uecb2 +set -g linea_ecommerce_bag \uecb3 +set -g linea_ecommerce_bag_check \uecb4 +set -g linea_ecommerce_bag_cloud \uecb5 +set -g linea_ecommerce_bag_download \uecb6 +set -g linea_ecommerce_bag_minus \uecb7 +set -g linea_ecommerce_bag_plus \uecb8 +set -g linea_ecommerce_bag_refresh \uecb9 +set -g linea_ecommerce_bag_remove \uecba +set -g linea_ecommerce_bag_search \uecbb +set -g linea_ecommerce_bag_upload \uecbc +set -g linea_ecommerce_banknote \uecbd +set -g linea_ecommerce_banknotes \uecbe +set -g linea_ecommerce_basket \uecbf +set -g linea_ecommerce_basket_check \uecc0 +set -g linea_ecommerce_basket_cloud \uecc1 +set -g linea_ecommerce_basket_download \uecc2 +set -g linea_ecommerce_basket_minus \uecc3 +set -g linea_ecommerce_basket_plus \uecc4 +set -g linea_ecommerce_basket_refresh \uecc5 +set -g linea_ecommerce_basket_remove \uecc6 +set -g linea_ecommerce_basket_search \uecc7 +set -g linea_ecommerce_basket_upload \uecc8 +set -g linea_ecommerce_bath \uecc9 +set -g linea_ecommerce_cart \uecca +set -g linea_ecommerce_cart_check \ueccb +set -g linea_ecommerce_cart_cloud \ueccc +set -g linea_music_stop_button \ueccd +set -g linea_music_tape \uecce +set -g linea_music_volume_down \ueccf +set -g linea_music_volume_up \uecd0 +set -g linea_music_beginning_button \uecd1 +set -g linea_music_bell \uecd2 +set -g linea_music_cd \uecd3 +set -g linea_music_diapason \uecd4 +set -g linea_music_eject_button \uecd5 +set -g linea_music_end_button \uecd6 +set -g linea_music_fastforward_button \uecd7 +set -g linea_music_headphones \uecd8 +set -g linea_music_ipod \uecd9 +set -g linea_music_loudspeaker \uecda +set -g linea_music_microphone \uecdb +set -g linea_music_microphone_old \uecdc +set -g linea_music_mixer \uecdd +set -g linea_music_mute \uecde +set -g linea_music_note_multiple \uecdf +set -g linea_music_note_single \uece0 +set -g linea_music_pause_button \uece1 +set -g linea_music_play_button \uece2 +set -g linea_music_playlist \uece3 +set -g linea_music_radio_ghettoblaster \uece4 +set -g linea_music_radio_portable \uece5 +set -g linea_music_record \uece6 +set -g linea_music_recordplayer \uece7 +set -g linea_music_repeat_button \uece8 +set -g linea_music_rewind_button \uece9 +set -g linea_music_shuffle_button \uecea +set -g linea_software_paragraph_justify_center \ueceb +set -g linea_software_paragraph_justify_left \uecec +set -g linea_software_paragraph_justify_right \ueced +set -g linea_software_paragraph_space_after \uecee +set -g linea_software_paragraph_space_before \uecef +set -g linea_software_pathfinder_exclude \uecf0 +set -g linea_software_pathfinder_intersect \uecf1 +set -g linea_software_pathfinder_subtract \uecf2 +set -g linea_software_pathfinder_unite \uecf3 +set -g linea_software_pen \uecf4 +set -g linea_software_pen_add \uecf5 +set -g linea_software_pen_remove \uecf6 +set -g linea_software_pencil \uecf7 +set -g linea_software_polygonallasso \uecf8 +set -g linea_software_reflect_horizontal \uecf9 +set -g linea_software_magnete \uecfa +set -g linea_software_pages \uecfb +set -g linea_software_paintbrush \uecfc +set -g linea_software_paintbucket \uecfd +set -g linea_software_paintroller \uecfe +set -g linea_software_paragraph \uecff +set -g linea_software_paragraph_align_left \ued00 +set -g linea_software_paragraph_align_right \ued01 +set -g linea_software_paragraph_center \ued02 +set -g linea_software_paragraph_justify_all \ued03 +set -g linea_software_reflect_vertical \ued04 +set -g linea_software_remove_vectorpoint \ued05 +set -g linea_software_scale_expand \ued06 +set -g linea_software_scale_reduce \ued07 +set -g linea_software_selection_oval \ued08 +set -g linea_software_selection_polygon \ued09 +set -g linea_software_selection_rectangle \ued0a +set -g linea_software_indent_firstline \ued0b +set -g linea_software_indent_left \ued0c +set -g linea_software_indent_right \ued0d +set -g linea_software_lasso \ued0e +set -g linea_software_layers1 \ued0f +set -g linea_software_layers2 \ued10 +set -g linea_software_layout \ued11 +set -g linea_software_layout_2columns \ued12 +set -g linea_software_layout_3columns \ued13 +set -g linea_software_layout_4boxes \ued14 +set -g linea_software_layout_4columns \ued15 +set -g linea_software_layout_4lines \ued16 +set -g linea_software_layout_8boxes \ued17 +set -g linea_software_layout_header \ued18 +set -g linea_software_layout_header_2columns \ued19 +set -g linea_software_layout_header_3columns \ued1a +set -g linea_software_layout_header_4boxes \ued1b +set -g linea_software_layout_header_4columns \ued1c +set -g linea_software_layout_header_complex \ued1d +set -g linea_software_layout_header_complex2 \ued1e +set -g linea_software_layout_header_complex3 \ued1f +set -g linea_software_layout_header_complex4 \ued20 +set -g linea_software_layout_header_sideleft \ued21 +set -g linea_software_layout_header_sideright \ued22 +set -g linea_software_layout_sidebar_left \ued23 +set -g linea_software_layout_sidebar_right \ued24 +set -g linea_software_selection_roundedrectangle \ued25 +set -g linea_software_vector_line \ued26 +set -g linea_software_shape_oval \ued27 +set -g linea_software_shape_polygon \ued28 +set -g linea_software_shape_rectangle \ued29 +set -g linea_software_shape_roundedrectangle \ued2a +set -g linea_software_add_vectorpoint \ued2b +set -g linea_software_box_oval \ued2c +set -g linea_software_box_polygon \ued2d +set -g linea_software_box_rectangle \ued2e +set -g linea_software_box_roundedrectangle \ued2f +set -g linea_software_character \ued30 +set -g linea_software_crop \ued31 +set -g linea_software_eyedropper \ued32 +set -g linea_software_font_allcaps \ued33 +set -g linea_software_font_baseline_shift \ued34 +set -g linea_software_font_horizontal_scale \ued35 +set -g linea_software_font_kerning \ued36 +set -g linea_software_font_leading \ued37 +set -g linea_software_font_size \ued38 +set -g linea_software_font_smallcapital \ued39 +set -g linea_software_font_smallcaps \ued3a +set -g linea_software_font_strikethrough \ued3b +set -g linea_software_font_tracking \ued3c +set -g linea_software_font_underline \ued3d +set -g linea_software_font_vertical_scale \ued3e +set -g linea_software_horizontal_align_center \ued3f +set -g linea_software_horizontal_align_left \ued40 +set -g linea_software_horizontal_align_right \ued41 +set -g linea_software_horizontal_distribute_center \ued42 +set -g linea_software_horizontal_distribute_left \ued43 +set -g linea_software_horizontal_distribute_right \ued44 +set -g linea_software_slice \ued45 +set -g linea_software_transform_bezier \ued46 +set -g linea_software_vector_box \ued47 +set -g linea_software_vector_composite \ued48 +set -g linea_software_vertical_align_bottom \ued49 +set -g linea_software_vertical_align_center \ued4a +set -g linea_software_vertical_align_top \ued4b +set -g linea_software_vertical_distribute_bottom \ued4c +set -g linea_software_vertical_distribute_center \ued4d +set -g linea_software_vertical_distribute_top \ued4e +set -g linea_weather_aquarius \ued4f +set -g linea_weather_aries \ued50 +set -g linea_weather_cancer \ued51 +set -g linea_weather_capricorn \ued52 +set -g linea_weather_cloud \ued53 +set -g linea_weather_cloud_drop \ued54 +set -g linea_weather_cloud_lightning \ued55 +set -g linea_weather_cloud_snowflake \ued56 +set -g linea_weather_downpour_fullmoon \ued57 +set -g linea_weather_downpour_halfmoon \ued58 +set -g linea_weather_downpour_sun \ued59 +set -g linea_weather_drop \ued5a +set -g linea_weather_first_quarter \ued5b +set -g linea_weather_fog \ued5c +set -g linea_weather_fog_fullmoon \ued5d +set -g linea_weather_fog_halfmoon \ued5e +set -g linea_weather_fog_sun \ued5f +set -g linea_weather_fullmoon \ued60 +set -g linea_weather_gemini \ued61 +set -g linea_weather_hail \ued62 +set -g linea_weather_hail_fullmoon \ued63 +set -g linea_weather_hail_halfmoon \ued64 +set -g linea_weather_hail_sun \ued65 +set -g linea_weather_last_quarter \ued66 +set -g linea_weather_leo \ued67 +set -g linea_weather_libra \ued68 +set -g linea_weather_lightning \ued69 +set -g linea_weather_mistyrain \ued6a +set -g linea_weather_mistyrain_fullmoon \ued6b +set -g linea_weather_mistyrain_halfmoon \ued6c +set -g linea_weather_mistyrain_sun \ued6d +set -g linea_weather_moon \ued6e +set -g linea_weather_moondown_full \ued6f +set -g linea_weather_moondown_half \ued70 +set -g linea_weather_moonset_full \ued71 +set -g linea_weather_moonset_half \ued72 +set -g linea_weather_move2 \ued73 +set -g linea_weather_newmoon \ued74 +set -g linea_weather_pisces \ued75 +set -g linea_weather_rain \ued76 +set -g linea_weather_rain_fullmoon \ued77 +set -g linea_weather_rain_halfmoon \ued78 +set -g linea_weather_rain_sun \ued79 +set -g linea_weather_sagittarius \ued7a +set -g linea_weather_scorpio \ued7b +set -g linea_weather_snow \ued7c +set -g linea_weather_snow_fullmoon \ued7d +set -g linea_weather_snow_halfmoon \ued7e +set -g linea_weather_snow_sun \ued7f +set -g linea_weather_snowflake \ued80 +set -g linea_weather_star \ued81 +set -g linea_weather_storm_11 \ued82 +set -g linea_weather_storm_32 \ued83 +set -g linea_weather_storm_fullmoon \ued84 +set -g linea_weather_storm_halfmoon \ued85 +set -g linea_weather_storm_sun \ued86 +set -g linea_weather_sun \ued87 +set -g linea_weather_sundown \ued88 +set -g linea_weather_sunset \ued89 +set -g linea_weather_taurus \ued8a +set -g linea_weather_tempest \ued8b +set -g linea_weather_tempest_fullmoon \ued8c +set -g linea_weather_tempest_halfmoon \ued8d +set -g linea_weather_tempest_sun \ued8e +set -g linea_weather_variable_fullmoon \ued8f +set -g linea_weather_variable_halfmoon \ued90 +set -g linea_weather_variable_sun \ued91 +set -g linea_weather_virgo \ued92 +set -g linea_weather_waning_cresent \ued93 +set -g linea_weather_waning_gibbous \ued94 +set -g linea_weather_waxing_cresent \ued95 +set -g linea_weather_waxing_gibbous \ued96 +set -g linea_weather_wind \ued97 +set -g linea_weather_wind_e \ued98 +set -g linea_weather_wind_fullmoon \ued99 +set -g linea_weather_wind_halfmoon \ued9a +set -g linea_weather_wind_n \ued9b +set -g linea_weather_wind_ne \ued9c +set -g linea_weather_wind_nw \ued9d +set -g linea_weather_wind_s \ued9e +set -g linea_weather_wind_se \ued9f +set -g linea_weather_wind_sun \ueda0 +set -g linea_weather_wind_sw \ueda1 +set -g linea_weather_wind_w \ueda2 +set -g linea_weather_windgust \ueda3 +set -g mfizz_3dprint \ueda4 +set -g mfizz_alpinelinux \ueda5 +set -g mfizz_angular \ueda6 +set -g mfizz_angular_alt \ueda7 +set -g mfizz_antenna \ueda8 +set -g mfizz_apache \ueda9 +set -g mfizz_archlinux \uedaa +set -g mfizz_aws \uedab +set -g mfizz_azure \uedac +set -g mfizz_backbone \uedad +set -g mfizz_blackberry \uedae +set -g mfizz_bomb \uedaf +set -g mfizz_bootstrap \uedb0 +set -g mfizz_c \uedb1 +set -g mfizz_cassandra \uedb2 +set -g mfizz_centos \uedb3 +set -g mfizz_clojure \uedb4 +set -g mfizz_codeigniter \uedb5 +set -g mfizz_codepen \uedb6 +set -g mfizz_coffee_bean \uedb7 +set -g mfizz_cplusplus \uedb8 +set -g mfizz_csharp \uedb9 +set -g mfizz_css \uedba +set -g mfizz_css3 \uedbb +set -g mfizz_css3_alt \uedbc +set -g mfizz_d3 \uedbd +set -g mfizz_database \uedbe +set -g mfizz_database_alt \uedbf +set -g mfizz_database_alt2 \uedc0 +set -g mfizz_debian \uedc1 +set -g mfizz_docker \uedc2 +set -g mfizz_dreamhost \uedc3 +set -g mfizz_elixir \uedc4 +set -g mfizz_elm \uedc5 +set -g mfizz_erlang \uedc6 +set -g mfizz_exherbo \uedc7 +set -g mfizz_fedora \uedc8 +set -g mfizz_fire_alt \uedc9 +set -g mfizz_freebsd \uedca +set -g mfizz_freecodecamp \uedcb +set -g mfizz_gentoo \uedcc +set -g mfizz_ghost \uedcd +set -g mfizz_git \uedce +set -g mfizz_gnome \uedcf +set -g mfizz_go \uedd0 +set -g mfizz_go_alt \uedd1 +set -g mfizz_google \uedd2 +set -g mfizz_google_alt \uedd3 +set -g mfizz_google_code \uedd4 +set -g mfizz_google_developers \uedd5 +set -g mfizz_gradle \uedd6 +set -g mfizz_grails \uedd7 +set -g mfizz_grails_alt \uedd8 +set -g mfizz_grunt \uedd9 +set -g mfizz_gulp \uedda +set -g mfizz_gulp_alt \ueddb +set -g mfizz_hadoop \ueddc +set -g mfizz_haskell \ueddd +set -g mfizz_heroku \uedde +set -g mfizz_html \ueddf +set -g mfizz_html5 \uede0 +set -g mfizz_html5_alt \uede1 +set -g mfizz_iphone \uede2 +set -g mfizz_java \uede3 +set -g mfizz_java_bold \uede4 +set -g mfizz_java_duke \uede5 +set -g mfizz_javascript \uede6 +set -g mfizz_javascript_alt \uede7 +set -g mfizz_jetty \uede8 +set -g mfizz_jquery \uede9 +set -g mfizz_kde \uedea +set -g mfizz_laravel \uedeb +set -g mfizz_line_graph \uedec +set -g mfizz_linux_mint \ueded +set -g mfizz_looking \uedee +set -g mfizz_magento \uedef +set -g mfizz_mariadb \uedf0 +set -g mfizz_maven \uedf1 +set -g mfizz_microscope \uedf2 +set -g mfizz_mobile_device \uedf3 +set -g mfizz_mobile_phone_alt \uedf4 +set -g mfizz_mobile_phone_broadcast \uedf5 +set -g mfizz_mongodb \uedf6 +set -g mfizz_mssql \uedf7 +set -g mfizz_mysql \uedf8 +set -g mfizz_mysql_alt \uedf9 +set -g mfizz_netbsd \uedfa +set -g mfizz_nginx \uedfb +set -g mfizz_nginx_alt \uedfc +set -g mfizz_nginx_alt2 \uedfd +set -g mfizz_nodejs \uedfe +set -g mfizz_npm \uedff +set -g mfizz_objc \uee00 +set -g mfizz_openshift \uee01 +set -g mfizz_oracle \uee02 +set -g mfizz_oracle_alt \uee03 +set -g mfizz_osx \uee04 +set -g mfizz_perl \uee05 +set -g mfizz_phone_alt \uee06 +set -g mfizz_phone_gap \uee07 +set -g mfizz_phone_retro \uee08 +set -g mfizz_php \uee09 +set -g mfizz_php_alt \uee0a +set -g mfizz_playframework \uee0b +set -g mfizz_playframework_alt \uee0c +set -g mfizz_plone \uee0d +set -g mfizz_postgres \uee0e +set -g mfizz_postgres_alt \uee0f +set -g mfizz_python \uee10 +set -g mfizz_raspberrypi \uee11 +set -g mfizz_reactjs \uee12 +set -g mfizz_redhat \uee13 +set -g mfizz_redis \uee14 +set -g mfizz_ruby \uee15 +set -g mfizz_ruby_on_rails \uee16 +set -g mfizz_ruby_on_rails_alt \uee17 +set -g mfizz_rust \uee18 +set -g mfizz_sass \uee19 +set -g mfizz_satellite \uee1a +set -g mfizz_scala \uee1b +set -g mfizz_scala_alt \uee1c +set -g mfizz_script \uee1d +set -g mfizz_script_alt \uee1e +set -g mfizz_shell \uee1f +set -g mfizz_sitefinity \uee20 +set -g mfizz_solaris \uee21 +set -g mfizz_splatter \uee22 +set -g mfizz_spring \uee23 +set -g mfizz_suse \uee24 +set -g mfizz_svg \uee25 +set -g mfizz_symfony \uee26 +set -g mfizz_tomcat \uee27 +set -g mfizz_ubuntu \uee28 +set -g mfizz_unity \uee29 +set -g mfizz_wireless \uee2a +set -g mfizz_wordpress \uee2b +set -g mfizz_x11 \uee2c +set -g firacode_asterisk \uee2d +set -g firacode_plus \uee2e +set -g firacode_hyphen \uee2f +set -g firacode_sad \uee30 +set -g firacode_w_w_w \uee31 +set -g firacode_asterisk_asterisk \uee32 +set -g firacode_asterisk_asterisk_asterisk \uee33 +set -g firacode_asterisk_asterisk_slash \uee34 +set -g firacode_asterisk_greater \uee35 +set -g firacode_asterisk_slash \uee36 +set -g firacode_backslash_backslash \uee37 +set -g firacode_bbb \uee38 +set -g firacode_braceleft_hyphen \uee39 +set -g firacode_bracketleft_bracketright \uee3a +set -g firacode_colon_colon \uee3b +set -g firacode_colon_colon_colon \uee3c +set -g firacode_colon_equal \uee3d +set -g firacode_exclam_exclam \uee3e +set -g firacode_exclam_equal \uee3f +set -g firacode_exclam_equal_equal \uee40 +set -g firacode_hyphen_braceright \uee41 +set -g firacode_hyphen_hyphen \uee42 +set -g firacode_hyphen_hyphen_hyphen \uee43 +set -g firacode_hyphen_hyphen_greater \uee44 +set -g firacode_hyphen_greater \uee45 +set -g firacode_hyphen_greater_greater \uee46 +set -g firacode_hyphen_less \uee47 +set -g firacode_hyphen_less_less \uee48 +set -g firacode_hyphen_asciitilde \uee49 +set -g firacode_numbersign_braceleft \uee4a +set -g firacode_numbersign_bracketleft \uee4b +set -g firacode_numbersign_numbersign \uee4c +set -g firacode_nnn \uee4d +set -g firacode_nnnn \uee4e +set -g firacode_numbersign_parenleft \uee4f +set -g firacode_numbersign_question \uee50 +set -g firacode_numbersign_underscore \uee51 +set -g firacode_nup \uee52 +set -g firacode_period_hyphen \uee53 +set -g firacode_period_equal \uee54 +set -g firacode_period_period \uee55 +set -g firacode_period_period_less \uee56 +set -g firacode_period_period_period \uee57 +set -g firacode_question_equal \uee58 +set -g firacode_question_question \uee59 +set -g firacode_semicolon_semicolon \uee5a +set -g firacode_slash_asterisk \uee5b +set -g firacode_slash_asterisk_asterisk \uee5c +set -g firacode_slash_equal \uee5d +set -g firacode_slash_equal_equal \uee5e +set -g firacode_slash_greater \uee5f +set -g firacode_slash_slash \uee60 +set -g firacode_slash_slash_slash \uee61 +set -g firacode_ampersand_ampersand \uee62 +set -g firacode_bar_bar \uee63 +set -g firacode_bar_bar_equal \uee64 +set -g firacode_bar_equal \uee65 +set -g firacode_bar_greater \uee66 +set -g firacode_asciicircum_equal \uee67 +set -g firacode_dollar_greater \uee68 +set -g firacode_plus_plus \uee69 +set -g firacode_plus_plus_plus \uee6a +set -g firacode_plus_greater \uee6b +set -g firacode_equal_colon_equal \uee6c +set -g firacode_equal_equal \uee6d +set -g firacode_equal_equal_equal \uee6e +set -g firacode_equal_equal_greater \uee6f +set -g firacode_equal_greater \uee70 +set -g firacode_equal_greater_greater \uee71 +set -g firacode_equal_less \uee72 +set -g firacode_equal_less_less \uee73 +set -g firacode_equal_slash_equal \uee74 +set -g firacode_greater_hyphen \uee75 +set -g firacode_greater_equal \uee76 +set -g firacode_greater_equal_greater \uee77 +set -g firacode_greater_greater \uee78 +set -g firacode_greater_greater_hyphen \uee79 +set -g firacode_greater_greater_equal \uee7a +set -g firacode_greater_greater_greater \uee7b +set -g firacode_less_asterisk \uee7c +set -g firacode_less_asterisk_greater \uee7d +set -g firacode_less_bar \uee7e +set -g firacode_less_bar_greater \uee7f +set -g firacode_less_dollar \uee80 +set -g firacode_less_dollar_greater \uee81 +set -g firacode_less_exclam_hyphen_hyphen \uee82 +set -g firacode_less_hyphen \uee83 +set -g firacode_less_hyphen_hyphen \uee84 +set -g firacode_less_hyphen_greater \uee85 +set -g firacode_less_plus \uee86 +set -g firacode_less_plus_greater \uee87 +set -g firacode_less_equal \uee88 +set -g firacode_less_equal_equal \uee89 +set -g firacode_less_equal_greater \uee8a +set -g firacode_less_equal_less \uee8b +set -g firacode_less_greater \uee8c +set -g firacode_less_less \uee8d +set -g firacode_less_less_hyphen \uee8e +set -g firacode_less_less_equal \uee8f +set -g firacode_less_less_less \uee90 +set -g firacode_less_asciitilde \uee91 +set -g firacode_less_asciitilde_asciitilde \uee92 +set -g firacode_less_slash \uee93 +set -g firacode_less_slash_greater \uee94 +set -g firacode_asciitilde_at \uee95 +set -g firacode_asciitilde_hyphen \uee96 +set -g firacode_asciitilde_equal \uee97 +set -g firacode_asciitilde_greater \uee98 +set -g firacode_asciitilde_asciitilde \uee99 +set -g firacode_aag \uee9a +set -g firacode_percent_percent \uee9b +set -g firacode_x_multiply \uee9c +set -g firacode_colon_uc \uee9d +set -g firacode_plus_lc \uee9e +set -g firacode_plus_tosf2 \uee9f +set -g firacode_nameme_1114119 \ueea0 diff --git a/nnn-4.9/icons-in-terminal/build/icons_bash.sh b/nnn-4.9/icons-in-terminal/build/icons_bash.sh @@ -0,0 +1,3730 @@ +powerline_branch="\ue0a0" +powerline_line_number="\ue0a1" +powerline_readonly="\ue0a2" +powerline_extra_column_number="\ue0a3" +powerline_left_hard_divider="\ue0b0" +powerline_left_soft_divider="\ue0b1" +powerline_right_hard_divider="\ue0b2" +powerline_right_soft_divider="\ue0b3" +powerline_extra_right_half_circle_thick="\ue0b4" +powerline_extra_right_half_circle_thin="\ue0b5" +powerline_extra_left_half_circle_thick="\ue0b6" +powerline_extra_left_half_circle_thin="\ue0b7" +powerline_extra_lower_left_triangle="\ue0b8" +powerline_extra_backslash_separator="\ue0b9" +powerline_extra_lower_right_triangle="\ue0ba" +powerline_extra_forwardslash_separator="\ue0bb" +powerline_extra_upper_left_triangle="\ue0bc" +powerline_extra_forwardslash_separator_redundant="\ue0bd" +powerline_extra_upper_right_triangle="\ue0be" +powerline_extra_backslash_separator_redundant="\ue0bf" +powerline_extra_flame_thick="\ue0c0" +powerline_extra_flame_thin="\ue0c1" +powerline_extra_flame_thick_mirrored="\ue0c2" +powerline_extra_flame_thin_mirrored="\ue0c3" +powerline_extra_pixelated_squares_small="\ue0c4" +powerline_extra_pixelated_squares_small_mirrored="\ue0c5" +powerline_extra_pixelated_squares_big="\ue0c6" +powerline_extra_pixelated_squares_big_mirrored="\ue0c7" +powerline_extra_ice_waveform="\ue0c8" +powerline_extra_ice_waveform_mirrored="\ue0ca" +powerline_extra_honeycomb="\ue0cc" +powerline_extra_honeycomb_outline="\ue0cd" +powerline_extra_lego_separator="\ue0ce" +powerline_extra_lego_separator_thin="\ue0cf" +powerline_extra_lego_block_facing="\ue0d0" +powerline_extra_lego_block_sideways="\ue0d1" +powerline_extra_trapezoid_top_bottom="\ue0d2" +powerline_extra_trapezoid_top_bottom_mirrored="\ue0d4" +oct_heart="\ue000" +oct_zap="\ue001" +oct_light_bulb="\ue002" +oct_repo="\ue003" +oct_repo_forked="\ue004" +oct_repo_push="\ue005" +oct_repo_pull="\ue006" +oct_book="\ue007" +oct_octoface="\ue008" +oct_git_pull_request="\ue009" +oct_mark_github="\ue00a" +oct_cloud_download="\ue00b" +oct_cloud_upload="\ue00c" +oct_keyboard="\ue00d" +oct_gist="\ue00e" +oct_file_code="\ue00f" +oct_file_text="\ue010" +oct_file_media="\ue011" +oct_file_zip="\ue012" +oct_file_pdf="\ue013" +oct_tag="\ue014" +oct_file_directory="\ue015" +oct_file_submodule="\ue016" +oct_person="\ue017" +oct_jersey="\ue018" +oct_git_commit="\ue019" +oct_git_branch="\ue01a" +oct_git_merge="\ue01b" +oct_mirror="\ue01c" +oct_issue_opened="\ue01d" +oct_issue_reopened="\ue01e" +oct_issue_closed="\ue01f" +oct_star="\ue020" +oct_comment="\ue021" +oct_question="\ue022" +oct_alert="\ue023" +oct_search="\ue024" +oct_gear="\ue025" +oct_radio_tower="\ue026" +oct_tools="\ue027" +oct_sign_out="\ue028" +oct_rocket="\ue029" +oct_rss="\ue02a" +oct_clippy="\ue02b" +oct_sign_in="\ue02c" +oct_organization="\ue02d" +oct_device_mobile="\ue02e" +oct_unfold="\ue02f" +oct_check="\ue030" +oct_mail="\ue031" +oct_mail_read="\ue032" +oct_arrow_up="\ue033" +oct_arrow_right="\ue034" +oct_arrow_down="\ue035" +oct_arrow_left="\ue036" +oct_pin="\ue037" +oct_gift="\ue038" +oct_graph="\ue039" +oct_triangle_left="\ue03a" +oct_credit_card="\ue03b" +oct_clock="\ue03c" +oct_ruby="\ue03d" +oct_broadcast="\ue03e" +oct_key="\ue03f" +oct_repo_force_push="\ue040" +oct_repo_clone="\ue041" +oct_diff="\ue042" +oct_eye="\ue043" +oct_comment_discussion="\ue044" +oct_mail_reply="\ue045" +oct_primitive_dot="\ue046" +oct_primitive_square="\ue047" +oct_device_camera="\ue048" +oct_device_camera_video="\ue049" +oct_pencil="\ue04a" +oct_info="\ue04b" +oct_triangle_right="\ue04c" +oct_triangle_down="\ue04d" +oct_link="\ue04e" +oct_plus="\ue04f" +oct_three_bars="\ue050" +oct_code="\ue051" +oct_location="\ue052" +oct_list_unordered="\ue053" +oct_list_ordered="\ue054" +oct_quote="\ue055" +oct_versions="\ue056" +oct_calendar="\ue057" +oct_lock="\ue058" +oct_diff_added="\ue059" +oct_diff_removed="\ue05a" +oct_diff_modified="\ue05b" +oct_diff_renamed="\ue05c" +oct_horizontal_rule="\ue05d" +oct_arrow_small_right="\ue05e" +oct_milestone="\ue05f" +oct_checklist="\ue060" +oct_megaphone="\ue061" +oct_chevron_right="\ue062" +oct_bookmark="\ue063" +oct_settings="\ue064" +oct_dashboard="\ue065" +oct_history="\ue066" +oct_link_external="\ue067" +oct_mute="\ue068" +oct_x="\ue069" +oct_circle_slash="\ue06a" +oct_pulse="\ue06b" +oct_sync="\ue06c" +oct_telescope="\ue06d" +oct_gist_secret="\ue06e" +oct_home="\ue06f" +oct_stop="\ue070" +oct_bug="\ue071" +oct_logo_github="\ue072" +oct_file_binary="\ue073" +oct_database="\ue074" +oct_server="\ue075" +oct_diff_ignored="\ue076" +oct_ellipsis="\ue077" +oct_no_newline="\ue078" +oct_hubot="\ue079" +oct_arrow_small_up="\ue07a" +oct_arrow_small_down="\ue07b" +oct_arrow_small_left="\ue07c" +oct_chevron_up="\ue07d" +oct_chevron_down="\ue07e" +oct_chevron_left="\ue07f" +oct_triangle_up="\ue080" +oct_git_compare="\ue081" +oct_logo_gist="\ue082" +oct_file_symlink_file="\ue083" +oct_file_symlink_directory="\ue084" +oct_squirrel="\ue085" +oct_globe="\ue086" +oct_unmute="\ue087" +oct_mention="\ue088" +oct_package="\ue089" +oct_browser="\ue08a" +oct_terminal="\ue08b" +oct_markdown="\ue08c" +oct_dash="\ue08d" +oct_fold="\ue08e" +oct_inbox="\ue08f" +oct_trashcan="\ue090" +oct_paintcan="\ue091" +oct_flame="\ue092" +oct_briefcase="\ue093" +oct_plug="\ue094" +oct_circuit_board="\ue095" +oct_mortar_board="\ue096" +oct_law="\ue097" +oct_thumbsup="\ue098" +oct_thumbsdown="\ue099" +oct_desktop_download="\ue09a" +oct_beaker="\ue09b" +oct_bell="\ue09c" +oct_watch="\ue09d" +oct_shield="\ue09e" +oct_bold="\ue09f" +oct_text_size="\ue0d5" +oct_italic="\ue0d6" +oct_tasklist="\ue0d7" +oct_verified="\ue0d8" +oct_smiley="\ue0d9" +oct_unverified="\ue0da" +oct_ellipses="\ue0db" +oct_file="\ue0dc" +oct_grabber="\ue0dd" +oct_plus_small="\ue0de" +oct_reply="\ue0df" +oct_device_desktop="\ue0e0" +fa_glass="\ue0e1" +fa_music="\ue0e2" +fa_search="\ue0e3" +fa_envelope_o="\ue0e4" +fa_heart="\ue0e5" +fa_star="\ue0e6" +fa_star_o="\ue0e7" +fa_user="\ue0e8" +fa_film="\ue0e9" +fa_th_large="\ue0ea" +fa_th="\ue0eb" +fa_th_list="\ue0ec" +fa_check="\ue0ed" +fa_close="\ue0ee" +fa_search_plus="\ue0ef" +fa_search_minus="\ue0f0" +fa_power_off="\ue0f1" +fa_signal="\ue0f2" +fa_cog="\ue0f3" +fa_trash_o="\ue0f4" +fa_home="\ue0f5" +fa_file_o="\ue0f6" +fa_clock_o="\ue0f7" +fa_road="\ue0f8" +fa_download="\ue0f9" +fa_arrow_circle_o_down="\ue0fa" +fa_arrow_circle_o_up="\ue0fb" +fa_inbox="\ue0fc" +fa_play_circle_o="\ue0fd" +fa_repeat="\ue0fe" +fa_refresh="\ue0ff" +fa_list_alt="\ue100" +fa_lock="\ue101" +fa_flag="\ue102" +fa_headphones="\ue103" +fa_volume_off="\ue104" +fa_volume_down="\ue105" +fa_volume_up="\ue106" +fa_qrcode="\ue107" +fa_barcode="\ue108" +fa_tag="\ue109" +fa_tags="\ue10a" +fa_book="\ue10b" +fa_bookmark="\ue10c" +fa_print="\ue10d" +fa_camera="\ue10e" +fa_font="\ue10f" +fa_bold="\ue110" +fa_italic="\ue111" +fa_text_height="\ue112" +fa_text_width="\ue113" +fa_align_left="\ue114" +fa_align_center="\ue115" +fa_align_right="\ue116" +fa_align_justify="\ue117" +fa_list="\ue118" +fa_dedent="\ue119" +fa_indent="\ue11a" +fa_video_camera="\ue11b" +fa_image="\ue11c" +fa_pencil="\ue11d" +fa_map_marker="\ue11e" +fa_adjust="\ue11f" +fa_tint="\ue120" +fa_edit="\ue121" +fa_share_square_o="\ue122" +fa_check_square_o="\ue123" +fa_arrows="\ue124" +fa_step_backward="\ue125" +fa_fast_backward="\ue126" +fa_backward="\ue127" +fa_play="\ue128" +fa_pause="\ue129" +fa_stop="\ue12a" +fa_forward="\ue12b" +fa_fast_forward="\ue12c" +fa_step_forward="\ue12d" +fa_eject="\ue12e" +fa_chevron_left="\ue12f" +fa_chevron_right="\ue130" +fa_plus_circle="\ue131" +fa_minus_circle="\ue132" +fa_times_circle="\ue133" +fa_check_circle="\ue134" +fa_question_circle="\ue135" +fa_info_circle="\ue136" +fa_crosshairs="\ue137" +fa_times_circle_o="\ue138" +fa_check_circle_o="\ue139" +fa_ban="\ue13a" +fa_arrow_left="\ue13b" +fa_arrow_right="\ue13c" +fa_arrow_up="\ue13d" +fa_arrow_down="\ue13e" +fa_mail_forward="\ue13f" +fa_expand="\ue140" +fa_compress="\ue141" +fa_plus="\ue142" +fa_minus="\ue143" +fa_asterisk="\ue144" +fa_exclamation_circle="\ue145" +fa_gift="\ue146" +fa_leaf="\ue147" +fa_fire="\ue148" +fa_eye="\ue149" +fa_eye_slash="\ue14a" +fa_exclamation_triangle="\ue14b" +fa_plane="\ue14c" +fa_calendar="\ue14d" +fa_random="\ue14e" +fa_comment="\ue14f" +fa_magnet="\ue150" +fa_chevron_up="\ue151" +fa_chevron_down="\ue152" +fa_retweet="\ue153" +fa_shopping_cart="\ue154" +fa_folder="\ue155" +fa_folder_open="\ue156" +fa_arrows_v="\ue157" +fa_arrows_h="\ue158" +fa_bar_chart="\ue159" +fa_twitter_square="\ue15a" +fa_facebook_square="\ue15b" +fa_camera_retro="\ue15c" +fa_key="\ue15d" +fa_cogs="\ue15e" +fa_comments="\ue15f" +fa_thumbs_o_up="\ue160" +fa_thumbs_o_down="\ue161" +fa_star_half="\ue162" +fa_heart_o="\ue163" +fa_sign_out="\ue164" +fa_linkedin_square="\ue165" +fa_thumb_tack="\ue166" +fa_external_link="\ue167" +fa_sign_in="\ue168" +fa_trophy="\ue169" +fa_github_square="\ue16a" +fa_upload="\ue16b" +fa_lemon_o="\ue16c" +fa_phone="\ue16d" +fa_square_o="\ue16e" +fa_bookmark_o="\ue16f" +fa_phone_square="\ue170" +fa_twitter="\ue171" +fa_facebook="\ue172" +fa_github="\ue173" +fa_unlock="\ue174" +fa_credit_card="\ue175" +fa_feed="\ue176" +fa_hdd_o="\ue177" +fa_bullhorn="\ue178" +fa_bell_o="\ue179" +fa_certificate="\ue17a" +fa_hand_o_right="\ue17b" +fa_hand_o_left="\ue17c" +fa_hand_o_up="\ue17d" +fa_hand_o_down="\ue17e" +fa_arrow_circle_left="\ue17f" +fa_arrow_circle_right="\ue180" +fa_arrow_circle_up="\ue181" +fa_arrow_circle_down="\ue182" +fa_globe="\ue183" +fa_wrench="\ue184" +fa_tasks="\ue185" +fa_filter="\ue186" +fa_briefcase="\ue187" +fa_arrows_alt="\ue188" +fa_group="\ue189" +fa_chain="\ue18a" +fa_cloud="\ue18b" +fa_flask="\ue18c" +fa_cut="\ue18d" +fa_copy="\ue18e" +fa_paperclip="\ue18f" +fa_floppy_o="\ue190" +fa_square="\ue191" +fa_bars="\ue192" +fa_list_ul="\ue193" +fa_list_ol="\ue194" +fa_strikethrough="\ue195" +fa_underline="\ue196" +fa_table="\ue197" +fa_magic="\ue198" +fa_truck="\ue199" +fa_pinterest="\ue19a" +fa_pinterest_square="\ue19b" +fa_google_plus_square="\ue19c" +fa_google_plus="\ue19d" +fa_money="\ue19e" +fa_caret_down="\ue19f" +fa_caret_up="\ue1a0" +fa_caret_left="\ue1a1" +fa_caret_right="\ue1a2" +fa_columns="\ue1a3" +fa_sort="\ue1a4" +fa_sort_desc="\ue1a5" +fa_sort_asc="\ue1a6" +fa_envelope="\ue1a7" +fa_linkedin="\ue1a8" +fa_rotate_left="\ue1a9" +fa_gavel="\ue1aa" +fa_dashboard="\ue1ab" +fa_comment_o="\ue1ac" +fa_comments_o="\ue1ad" +fa_bolt="\ue1ae" +fa_sitemap="\ue1af" +fa_umbrella="\ue1b0" +fa_clipboard="\ue1b1" +fa_lightbulb_o="\ue1b2" +fa_exchange="\ue1b3" +fa_cloud_download="\ue1b4" +fa_cloud_upload="\ue1b5" +fa_user_md="\ue1b6" +fa_stethoscope="\ue1b7" +fa_suitcase="\ue1b8" +fa_bell="\ue1b9" +fa_coffee="\ue1ba" +fa_cutlery="\ue1bb" +fa_file_text_o="\ue1bc" +fa_building_o="\ue1bd" +fa_hospital_o="\ue1be" +fa_ambulance="\ue1bf" +fa_medkit="\ue1c0" +fa_fighter_jet="\ue1c1" +fa_beer="\ue1c2" +fa_h_square="\ue1c3" +fa_plus_square="\ue1c4" +fa_angle_double_left="\ue1c5" +fa_angle_double_right="\ue1c6" +fa_angle_double_up="\ue1c7" +fa_angle_double_down="\ue1c8" +fa_angle_left="\ue1c9" +fa_angle_right="\ue1ca" +fa_angle_up="\ue1cb" +fa_angle_down="\ue1cc" +fa_desktop="\ue1cd" +fa_laptop="\ue1ce" +fa_tablet="\ue1cf" +fa_mobile="\ue1d0" +fa_circle_o="\ue1d1" +fa_quote_left="\ue1d2" +fa_quote_right="\ue1d3" +fa_spinner="\ue1d4" +fa_circle="\ue1d5" +fa_mail_reply="\ue1d6" +fa_github_alt="\ue1d7" +fa_folder_o="\ue1d8" +fa_folder_open_o="\ue1d9" +fa_expand_alt="\ue1da" +fa_collapse_alt="\ue1db" +fa_smile_o="\ue1dc" +fa_frown_o="\ue1dd" +fa_meh_o="\ue1de" +fa_gamepad="\ue1df" +fa_keyboard_o="\ue1e0" +fa_flag_o="\ue1e1" +fa_flag_checkered="\ue1e2" +fa_terminal="\ue1e3" +fa_code="\ue1e4" +fa_mail_reply_all="\ue1e5" +fa_star_half_empty="\ue1e6" +fa_location_arrow="\ue1e7" +fa_crop="\ue1e8" +fa_code_fork="\ue1e9" +fa_chain_broken="\ue1ea" +fa_question="\ue1eb" +fa_info="\ue1ec" +fa_exclamation="\ue1ed" +fa_superscript="\ue1ee" +fa_subscript="\ue1ef" +fa_eraser="\ue1f0" +fa_puzzle_piece="\ue1f1" +fa_microphone="\ue1f2" +fa_microphone_slash="\ue1f3" +fa_shield="\ue1f4" +fa_calendar_o="\ue1f5" +fa_fire_extinguisher="\ue1f6" +fa_rocket="\ue1f7" +fa_maxcdn="\ue1f8" +fa_chevron_circle_left="\ue1f9" +fa_chevron_circle_right="\ue1fa" +fa_chevron_circle_up="\ue1fb" +fa_chevron_circle_down="\ue1fc" +fa_html5="\ue1fd" +fa_css3="\ue1fe" +fa_anchor="\ue1ff" +fa_unlock_alt="\ue200" +fa_bullseye="\ue201" +fa_ellipsis_h="\ue202" +fa_ellipsis_v="\ue203" +fa_rss_square="\ue204" +fa_play_circle="\ue205" +fa_ticket="\ue206" +fa_minus_square="\ue207" +fa_minus_square_o="\ue208" +fa_level_up="\ue209" +fa_level_down="\ue20a" +fa_check_square="\ue20b" +fa_pencil_square="\ue20c" +fa_external_link_square="\ue20d" +fa_share_square="\ue20e" +fa_compass="\ue20f" +fa_caret_square_o_down="\ue210" +fa_caret_square_o_up="\ue211" +fa_caret_square_o_right="\ue212" +fa_eur="\ue213" +fa_gbp="\ue214" +fa_dollar="\ue215" +fa_inr="\ue216" +fa_cny="\ue217" +fa_rouble="\ue218" +fa_krw="\ue219" +fa_bitcoin="\ue21a" +fa_file="\ue21b" +fa_file_text="\ue21c" +fa_sort_alpha_asc="\ue21d" +fa_sort_alpha_desc="\ue21e" +fa_sort_amount_asc="\ue21f" +fa_sort_amount_desc="\ue220" +fa_sort_numeric_asc="\ue221" +fa_sort_numeric_desc="\ue222" +fa_thumbs_up="\ue223" +fa_thumbs_down="\ue224" +fa_youtube_square="\ue225" +fa_youtube="\ue226" +fa_xing="\ue227" +fa_xing_square="\ue228" +fa_youtube_play="\ue229" +fa_dropbox="\ue22a" +fa_stack_overflow="\ue22b" +fa_instagram="\ue22c" +fa_flickr="\ue22d" +fa_adn="\ue22e" +fa_bitbucket="\ue22f" +fa_bitbucket_square="\ue230" +fa_tumblr="\ue231" +fa_tumblr_square="\ue232" +fa_long_arrow_down="\ue233" +fa_long_arrow_up="\ue234" +fa_long_arrow_left="\ue235" +fa_long_arrow_right="\ue236" +fa_apple="\ue237" +fa_windows="\ue238" +fa_android="\ue239" +fa_linux="\ue23a" +fa_dribbble="\ue23b" +fa_skype="\ue23c" +fa_foursquare="\ue23d" +fa_trello="\ue23e" +fa_female="\ue23f" +fa_male="\ue240" +fa_gittip="\ue241" +fa_sun_o="\ue242" +fa_moon_o="\ue243" +fa_archive="\ue244" +fa_bug="\ue245" +fa_vk="\ue246" +fa_weibo="\ue247" +fa_renren="\ue248" +fa_pagelines="\ue249" +fa_stack_exchange="\ue24a" +fa_arrow_circle_o_right="\ue24b" +fa_arrow_circle_o_left="\ue24c" +fa_caret_square_o_left="\ue24d" +fa_dot_circle_o="\ue24e" +fa_wheelchair="\ue24f" +fa_vimeo_square="\ue250" +fa_try="\ue251" +fa_plus_square_o="\ue252" +fa_space_shuttle="\ue253" +fa_slack="\ue254" +fa_envelope_square="\ue255" +fa_wordpress="\ue256" +fa_openid="\ue257" +fa_bank="\ue258" +fa_graduation_cap="\ue259" +fa_yahoo="\ue25a" +fa_google="\ue25b" +fa_reddit="\ue25c" +fa_reddit_square="\ue25d" +fa_stumbleupon_circle="\ue25e" +fa_stumbleupon="\ue25f" +fa_delicious="\ue260" +fa_digg="\ue261" +fa_pied_piper_pp="\ue262" +fa_pied_piper_alt="\ue263" +fa_drupal="\ue264" +fa_joomla="\ue265" +fa_language="\ue266" +fa_fax="\ue267" +fa_building="\ue268" +fa_child="\ue269" +fa_paw="\ue26a" +fa_spoon="\ue26b" +fa_cube="\ue26c" +fa_cubes="\ue26d" +fa_behance="\ue26e" +fa_behance_square="\ue26f" +fa_steam="\ue270" +fa_steam_square="\ue271" +fa_recycle="\ue272" +fa_automobile="\ue273" +fa_cab="\ue274" +fa_tree="\ue275" +fa_spotify="\ue276" +fa_deviantart="\ue277" +fa_soundcloud="\ue278" +fa_database="\ue279" +fa_file_pdf_o="\ue27a" +fa_file_word_o="\ue27b" +fa_file_excel_o="\ue27c" +fa_file_powerpoint_o="\ue27d" +fa_file_image_o="\ue27e" +fa_file_archive_o="\ue27f" +fa_file_audio_o="\ue280" +fa_file_movie_o="\ue281" +fa_file_code_o="\ue282" +fa_vine="\ue283" +fa_codepen="\ue284" +fa_jsfiddle="\ue285" +fa_life_bouy="\ue286" +fa_circle_o_notch="\ue287" +fa_ra="\ue288" +fa_empire="\ue289" +fa_git_square="\ue28a" +fa_git="\ue28b" +fa_hacker_news="\ue28c" +fa_tencent_weibo="\ue28d" +fa_qq="\ue28e" +fa_wechat="\ue28f" +fa_paper_plane="\ue290" +fa_paper_plane_o="\ue291" +fa_history="\ue292" +fa_circle_thin="\ue293" +fa_header="\ue294" +fa_paragraph="\ue295" +fa_sliders="\ue296" +fa_share_alt="\ue297" +fa_share_alt_square="\ue298" +fa_bomb="\ue299" +fa_futbol_o="\ue29a" +fa_tty="\ue29b" +fa_binoculars="\ue29c" +fa_plug="\ue29d" +fa_slideshare="\ue29e" +fa_twitch="\ue29f" +fa_yelp="\ue2a0" +fa_newspaper_o="\ue2a1" +fa_wifi="\ue2a2" +fa_calculator="\ue2a3" +fa_paypal="\ue2a4" +fa_google_wallet="\ue2a5" +fa_cc_visa="\ue2a6" +fa_cc_mastercard="\ue2a7" +fa_cc_discover="\ue2a8" +fa_cc_amex="\ue2a9" +fa_cc_paypal="\ue2aa" +fa_cc_stripe="\ue2ab" +fa_bell_slash="\ue2ac" +fa_bell_slash_o="\ue2ad" +fa_trash="\ue2ae" +fa_copyright="\ue2af" +fa_at="\ue2b0" +fa_eyedropper="\ue2b1" +fa_paint_brush="\ue2b2" +fa_birthday_cake="\ue2b3" +fa_area_chart="\ue2b4" +fa_pie_chart="\ue2b5" +fa_line_chart="\ue2b6" +fa_lastfm="\ue2b7" +fa_lastfm_square="\ue2b8" +fa_toggle_off="\ue2b9" +fa_toggle_on="\ue2ba" +fa_bicycle="\ue2bb" +fa_bus="\ue2bc" +fa_ioxhost="\ue2bd" +fa_angellist="\ue2be" +fa_cc="\ue2bf" +fa_ils="\ue2c0" +fa_meanpath="\ue2c1" +fa_buysellads="\ue2c2" +fa_connectdevelop="\ue2c3" +fa_dashcube="\ue2c4" +fa_forumbee="\ue2c5" +fa_leanpub="\ue2c6" +fa_sellsy="\ue2c7" +fa_shirtsinbulk="\ue2c8" +fa_simplybuilt="\ue2c9" +fa_skyatlas="\ue2ca" +fa_cart_plus="\ue2cb" +fa_cart_arrow_down="\ue2cc" +fa_diamond="\ue2cd" +fa_ship="\ue2ce" +fa_user_secret="\ue2cf" +fa_motorcycle="\ue2d0" +fa_street_view="\ue2d1" +fa_heartbeat="\ue2d2" +fa_venus="\ue2d3" +fa_mars="\ue2d4" +fa_mercury="\ue2d5" +fa_intersex="\ue2d6" +fa_transgender_alt="\ue2d7" +fa_venus_double="\ue2d8" +fa_mars_double="\ue2d9" +fa_venus_mars="\ue2da" +fa_mars_stroke="\ue2db" +fa_mars_stroke_v="\ue2dc" +fa_mars_stroke_h="\ue2dd" +fa_neuter="\ue2de" +fa_genderless="\ue2df" +fa__523="\ue2e0" +fa__524="\ue2e1" +fa_facebook_official="\ue2e2" +fa_pinterest_p="\ue2e3" +fa_whatsapp="\ue2e4" +fa_server="\ue2e5" +fa_user_plus="\ue2e6" +fa_user_times="\ue2e7" +fa_bed="\ue2e8" +fa_viacoin="\ue2e9" +fa_train="\ue2ea" +fa_subway="\ue2eb" +fa_medium="\ue2ec" +fa_y_combinator="\ue2ed" +fa_optin_monster="\ue2ee" +fa_opencart="\ue2ef" +fa_expeditedssl="\ue2f0" +fa_battery="\ue2f1" +fa_battery_3="\ue2f2" +fa_battery_2="\ue2f3" +fa_battery_1="\ue2f4" +fa_battery_0="\ue2f5" +fa_mouse_pointer="\ue2f6" +fa_i_cursor="\ue2f7" +fa_object_group="\ue2f8" +fa_object_ungroup="\ue2f9" +fa_sticky_note="\ue2fa" +fa_sticky_note_o="\ue2fb" +fa_cc_jcb="\ue2fc" +fa_cc_diners_club="\ue2fd" +fa_clone="\ue2fe" +fa_balance_scale="\ue2ff" +fa_hourglass_o="\ue300" +fa_hourglass_1="\ue301" +fa_hourglass_2="\ue302" +fa_hourglass_3="\ue303" +fa_hourglass="\ue304" +fa_hand_grab_o="\ue305" +fa_hand_paper_o="\ue306" +fa_hand_scissors_o="\ue307" +fa_hand_lizard_o="\ue308" +fa_hand_spock_o="\ue309" +fa_hand_pointer_o="\ue30a" +fa_hand_peace_o="\ue30b" +fa_trademark="\ue30c" +fa_registered="\ue30d" +fa_creative_commons="\ue30e" +fa_gg="\ue30f" +fa_gg_circle="\ue310" +fa_tripadvisor="\ue311" +fa_odnoklassniki="\ue312" +fa_odnoklassniki_square="\ue313" +fa_get_pocket="\ue314" +fa_wikipedia_w="\ue315" +fa_safari="\ue316" +fa_chrome="\ue317" +fa_firefox="\ue318" +fa_opera="\ue319" +fa_internet_explorer="\ue31a" +fa_television="\ue31b" +fa_contao="\ue31c" +fa_500px="\ue31d" +fa_amazon="\ue31e" +fa_calendar_plus_o="\ue31f" +fa_calendar_minus_o="\ue320" +fa_calendar_times_o="\ue321" +fa_calendar_check_o="\ue322" +fa_industry="\ue323" +fa_map_pin="\ue324" +fa_map_signs="\ue325" +fa_map_o="\ue326" +fa_map="\ue327" +fa_commenting="\ue328" +fa_commenting_o="\ue329" +fa_houzz="\ue32a" +fa_vimeo="\ue32b" +fa_black_tie="\ue32c" +fa_fonticons="\ue32d" +fa_reddit_alien="\ue32e" +fa_edge="\ue32f" +fa_credit_card_alt="\ue330" +fa_codiepie="\ue331" +fa_modx="\ue332" +fa_fort_awesome="\ue333" +fa_usb="\ue334" +fa_product_hunt="\ue335" +fa_mixcloud="\ue336" +fa_scribd="\ue337" +fa_pause_circle="\ue338" +fa_pause_circle_o="\ue339" +fa_stop_circle="\ue33a" +fa_stop_circle_o="\ue33b" +fa_shopping_bag="\ue33c" +fa_shopping_basket="\ue33d" +fa_hashtag="\ue33e" +fa_bluetooth="\ue33f" +fa_bluetooth_b="\ue340" +fa_percent="\ue341" +fa_gitlab="\ue342" +fa_wpbeginner="\ue343" +fa_wpforms="\ue344" +fa_envira="\ue345" +fa_universal_access="\ue346" +fa_wheelchair_alt="\ue347" +fa_question_circle_o="\ue348" +fa_blind="\ue349" +fa_audio_description="\ue34a" +fa_volume_control_phone="\ue34b" +fa_braille="\ue34c" +fa_assistive_listening_systems="\ue34d" +fa_american_sign_language_interpreting="\ue34e" +fa_deaf="\ue34f" +fa_glide="\ue350" +fa_glide_g="\ue351" +fa_sign_language="\ue352" +fa_low_vision="\ue353" +fa_viadeo="\ue354" +fa_viadeo_square="\ue355" +fa_snapchat="\ue356" +fa_snapchat_ghost="\ue357" +fa_snapchat_square="\ue358" +fa_pied_piper="\ue359" +fa_first_order="\ue35a" +fa_yoast="\ue35b" +fa_themeisle="\ue35c" +fa_google_plus_circle="\ue35d" +fa_fa="\ue35e" +fa_handshake_o="\ue35f" +fa_envelope_open="\ue360" +fa_envelope_open_o="\ue361" +fa_linode="\ue362" +fa_address_book="\ue363" +fa_address_book_o="\ue364" +fa_address_card="\ue365" +fa_address_card_o="\ue366" +fa_user_circle="\ue367" +fa_user_circle_o="\ue368" +fa_user_o="\ue369" +fa_id_badge="\ue36a" +fa_drivers_license="\ue36b" +fa_drivers_license_o="\ue36c" +fa_quora="\ue36d" +fa_free_code_camp="\ue36e" +fa_telegram="\ue36f" +fa_thermometer="\ue370" +fa_thermometer_3="\ue371" +fa_thermometer_2="\ue372" +fa_thermometer_1="\ue373" +fa_thermometer_0="\ue374" +fa_shower="\ue375" +fa_bath="\ue376" +fa_podcast="\ue377" +fa_window_maximize="\ue378" +fa_window_minimize="\ue379" +fa_window_restore="\ue37a" +fa_times_rectangle="\ue37b" +fa_times_rectangle_o="\ue37c" +fa_bandcamp="\ue37d" +fa_grav="\ue37e" +fa_etsy="\ue37f" +fa_imdb="\ue380" +fa_ravelry="\ue381" +fa_eercast="\ue382" +fa_microchip="\ue383" +fa_snowflake_o="\ue384" +fa_superpowers="\ue385" +fa_wpexplorer="\ue386" +fa_meetup="\ue387" +md_error="\ue388" +md_error_outline="\ue389" +md_warning="\ue38a" +md_add_alert="\ue38b" +md_album="\ue38c" +md_av_timer="\ue38d" +md_closed_caption="\ue38e" +md_equalizer="\ue38f" +md_explicit="\ue390" +md_fast_forward="\ue391" +md_fast_rewind="\ue392" +md_games="\ue393" +md_hearing="\ue394" +md_high_quality="\ue395" +md_loop="\ue396" +md_mic="\ue397" +md_mic_none="\ue398" +md_mic_off="\ue399" +md_movie="\ue39a" +md_library_add="\ue39b" +md_library_books="\ue39c" +md_library_music="\ue39d" +md_new_releases="\ue39e" +md_not_interested="\ue39f" +md_pause="\ue3a0" +md_pause_circle_filled="\ue3a1" +md_pause_circle_outline="\ue3a2" +md_play_arrow="\ue3a3" +md_play_circle_filled="\ue3a4" +md_play_circle_outline="\ue3a5" +md_playlist_add="\ue3a6" +md_queue="\ue3a7" +md_queue_music="\ue3a8" +md_radio="\ue3a9" +md_recent_actors="\ue3aa" +md_repeat="\ue3ab" +md_repeat_one="\ue3ac" +md_replay="\ue3ad" +md_shuffle="\ue3ae" +md_skip_next="\ue3af" +md_skip_previous="\ue3b0" +md_snooze="\ue3b1" +md_stop="\ue3b2" +md_subtitles="\ue3b3" +md_surround_sound="\ue3b4" +md_video_library="\ue3b5" +md_videocam="\ue3b6" +md_videocam_off="\ue3b7" +md_volume_down="\ue3b8" +md_volume_mute="\ue3b9" +md_volume_off="\ue3ba" +md_volume_up="\ue3bb" +md_web="\ue3bc" +md_hd="\ue3bd" +md_sort_by_alpha="\ue3be" +md_airplay="\ue3bf" +md_forward_10="\ue3c0" +md_forward_30="\ue3c1" +md_forward_5="\ue3c2" +md_replay_10="\ue3c3" +md_replay_30="\ue3c4" +md_replay_5="\ue3c5" +md_add_to_queue="\ue3c6" +md_fiber_dvr="\ue3c7" +md_fiber_new="\ue3c8" +md_playlist_play="\ue3c9" +md_art_track="\ue3ca" +md_fiber_manual_record="\ue3cb" +md_fiber_smart_record="\ue3cc" +md_music_video="\ue3cd" +md_subscriptions="\ue3ce" +md_playlist_add_check="\ue3cf" +md_queue_play_next="\ue3d0" +md_remove_from_queue="\ue3d1" +md_slow_motion_video="\ue3d2" +md_web_asset="\ue3d3" +md_fiber_pin="\ue3d4" +md_branding_watermark="\ue3d5" +md_call_to_action="\ue3d6" +md_featured_play_list="\ue3d7" +md_featured_video="\ue3d8" +md_note="\ue3d9" +md_video_call="\ue3da" +md_video_label="\ue3db" +md_business="\ue3dc" +md_call="\ue3dd" +md_call_end="\ue3de" +md_call_made="\ue3df" +md_call_merge="\ue3e0" +md_call_missed="\ue3e1" +md_call_received="\ue3e2" +md_call_split="\ue3e3" +md_chat="\ue3e4" +md_clear_all="\ue3e5" +md_comment="\ue3e6" +md_contacts="\ue3e7" +md_dialer_sip="\ue3e8" +md_dialpad="\ue3e9" +md_email="\ue3ea" +md_forum="\ue3eb" +md_import_export="\ue3ec" +md_invert_colors_off="\ue3ed" +md_live_help="\ue3ee" +md_location_off="\ue3ef" +md_location_on="\ue3f0" +md_message="\ue3f1" +md_chat_bubble="\ue3f2" +md_chat_bubble_outline="\ue3f3" +md_no_sim="\ue3f4" +md_phone="\ue3f5" +md_portable_wifi_off="\ue3f6" +md_contact_phone="\ue3f7" +md_contact_mail="\ue3f8" +md_ring_volume="\ue3f9" +md_speaker_phone="\ue3fa" +md_stay_current_landscape="\ue3fb" +md_stay_current_portrait="\ue3fc" +md_stay_primary_landscape="\ue3fd" +md_stay_primary_portrait="\ue3fe" +md_swap_calls="\ue3ff" +md_textsms="\ue400" +md_voicemail="\ue401" +md_vpn_key="\ue402" +md_phonelink_erase="\ue403" +md_phonelink_lock="\ue404" +md_phonelink_ring="\ue405" +md_phonelink_setup="\ue406" +md_present_to_all="\ue407" +md_import_contacts="\ue408" +md_mail_outline="\ue409" +md_screen_share="\ue40a" +md_stop_screen_share="\ue40b" +md_call_missed_outgoing="\ue40c" +md_rss_feed="\ue40d" +md_add="\ue40e" +md_add_box="\ue40f" +md_add_circle="\ue410" +md_add_circle_outline="\ue411" +md_archive="\ue412" +md_backspace="\ue413" +md_block="\ue414" +md_clear="\ue415" +md_content_copy="\ue416" +md_content_cut="\ue417" +md_content_paste="\ue418" +md_create="\ue419" +md_drafts="\ue41a" +md_filter_list="\ue41b" +md_flag="\ue41c" +md_forward="\ue41d" +md_gesture="\ue41e" +md_inbox="\ue41f" +md_link="\ue420" +md_mail="\ue421" +md_markunread="\ue422" +md_redo="\ue423" +md_remove="\ue424" +md_remove_circle="\ue425" +md_remove_circle_outline="\ue426" +md_reply="\ue427" +md_reply_all="\ue428" +md_report="\ue429" +md_save="\ue42a" +md_select_all="\ue42b" +md_send="\ue42c" +md_sort="\ue42d" +md_text_format="\ue42e" +md_undo="\ue42f" +md_font_download="\ue430" +md_move_to_inbox="\ue431" +md_unarchive="\ue432" +md_next_week="\ue433" +md_weekend="\ue434" +md_delete_sweep="\ue435" +md_low_priority="\ue436" +md_access_alarm="\ue437" +md_access_alarms="\ue438" +md_access_time="\ue439" +md_add_alarm="\ue43a" +md_airplanemode_inactive="\ue43b" +md_airplanemode_active="\ue43c" +md_battery_alert="\ue43d" +md_battery_charging_full="\ue43e" +md_battery_full="\ue43f" +md_battery_std="\ue440" +md_battery_unknown="\ue441" +md_bluetooth="\ue442" +md_bluetooth_connected="\ue443" +md_bluetooth_disabled="\ue444" +md_bluetooth_searching="\ue445" +md_brightness_auto="\ue446" +md_brightness_high="\ue447" +md_brightness_low="\ue448" +md_brightness_medium="\ue449" +md_data_usage="\ue44a" +md_developer_mode="\ue44b" +md_devices="\ue44c" +md_dvr="\ue44d" +md_gps_fixed="\ue44e" +md_gps_not_fixed="\ue44f" +md_gps_off="\ue450" +md_location_disabled="\ue451" +md_location_searching="\ue452" +md_graphic_eq="\ue453" +md_network_cell="\ue454" +md_network_wifi="\ue455" +md_nfc="\ue456" +md_wallpaper="\ue457" +md_widgets="\ue458" +md_screen_lock_landscape="\ue459" +md_screen_lock_portrait="\ue45a" +md_screen_lock_rotation="\ue45b" +md_screen_rotation="\ue45c" +md_sd_storage="\ue45d" +md_settings_system_daydream="\ue45e" +md_signal_cellular_4_bar="\ue45f" +md_signal_cellular_connected_no_internet_4_bar="\ue460" +md_signal_cellular_no_sim="\ue461" +md_signal_cellular_null="\ue462" +md_signal_cellular_off="\ue463" +md_signal_wifi_4_bar="\ue464" +md_signal_wifi_4_bar_lock="\ue465" +md_signal_wifi_off="\ue466" +md_storage="\ue467" +md_usb="\ue468" +md_wifi_lock="\ue469" +md_wifi_tethering="\ue46a" +md_attach_file="\ue46b" +md_attach_money="\ue46c" +md_border_all="\ue46d" +md_border_bottom="\ue46e" +md_border_clear="\ue46f" +md_border_color="\ue470" +md_border_horizontal="\ue471" +md_border_inner="\ue472" +md_border_left="\ue473" +md_border_outer="\ue474" +md_border_right="\ue475" +md_border_style="\ue476" +md_border_top="\ue477" +md_border_vertical="\ue478" +md_format_align_center="\ue479" +md_format_align_justify="\ue47a" +md_format_align_left="\ue47b" +md_format_align_right="\ue47c" +md_format_bold="\ue47d" +md_format_clear="\ue47e" +md_format_color_fill="\ue47f" +md_format_color_reset="\ue480" +md_format_color_text="\ue481" +md_format_indent_decrease="\ue482" +md_format_indent_increase="\ue483" +md_format_italic="\ue484" +md_format_line_spacing="\ue485" +md_format_list_bulleted="\ue486" +md_format_list_numbered="\ue487" +md_format_paint="\ue488" +md_format_quote="\ue489" +md_format_size="\ue48a" +md_format_strikethrough="\ue48b" +md_format_textdirection_l_to_r="\ue48c" +md_format_textdirection_r_to_l="\ue48d" +md_format_underlined="\ue48e" +md_functions="\ue48f" +md_insert_chart="\ue490" +md_insert_comment="\ue491" +md_insert_drive_file="\ue492" +md_insert_emoticon="\ue493" +md_insert_invitation="\ue494" +md_insert_link="\ue495" +md_insert_photo="\ue496" +md_merge_type="\ue497" +md_mode_comment="\ue498" +md_mode_edit="\ue499" +md_publish="\ue49a" +md_space_bar="\ue49b" +md_strikethrough_s="\ue49c" +md_vertical_align_bottom="\ue49d" +md_vertical_align_center="\ue49e" +md_vertical_align_top="\ue49f" +md_wrap_text="\ue4a0" +md_money_off="\ue4a1" +md_drag_handle="\ue4a2" +md_format_shapes="\ue4a3" +md_highlight="\ue4a4" +md_linear_scale="\ue4a5" +md_short_text="\ue4a6" +md_text_fields="\ue4a7" +md_monetization_on="\ue4a8" +md_title="\ue4a9" +md_attachment="\ue4aa" +md_cloud="\ue4ab" +md_cloud_circle="\ue4ac" +md_cloud_done="\ue4ad" +md_cloud_download="\ue4ae" +md_cloud_off="\ue4af" +md_cloud_queue="\ue4b0" +md_cloud_upload="\ue4b1" +md_file_download="\ue4b2" +md_file_upload="\ue4b3" +md_folder="\ue4b4" +md_folder_open="\ue4b5" +md_folder_shared="\ue4b6" +md_create_new_folder="\ue4b7" +md_cast="\ue4b8" +md_cast_connected="\ue4b9" +md_computer="\ue4ba" +md_desktop_mac="\ue4bb" +md_desktop_windows="\ue4bc" +md_developer_board="\ue4bd" +md_dock="\ue4be" +md_gamepad="\ue4bf" +md_headset="\ue4c0" +md_headset_mic="\ue4c1" +md_keyboard="\ue4c2" +md_keyboard_arrow_down="\ue4c3" +md_keyboard_arrow_left="\ue4c4" +md_keyboard_arrow_right="\ue4c5" +md_keyboard_arrow_up="\ue4c6" +md_keyboard_backspace="\ue4c7" +md_keyboard_capslock="\ue4c8" +md_keyboard_hide="\ue4c9" +md_keyboard_return="\ue4ca" +md_keyboard_tab="\ue4cb" +md_keyboard_voice="\ue4cc" +md_laptop="\ue4cd" +md_laptop_chromebook="\ue4ce" +md_laptop_mac="\ue4cf" +md_laptop_windows="\ue4d0" +md_memory="\ue4d1" +md_mouse="\ue4d2" +md_phone_android="\ue4d3" +md_phone_iphone="\ue4d4" +md_phonelink="\ue4d5" +md_phonelink_off="\ue4d6" +md_router="\ue4d7" +md_scanner="\ue4d8" +md_security="\ue4d9" +md_sim_card="\ue4da" +md_smartphone="\ue4db" +md_speaker="\ue4dc" +md_speaker_group="\ue4dd" +md_tablet="\ue4de" +md_tablet_android="\ue4df" +md_tablet_mac="\ue4e0" +md_toys="\ue4e1" +md_tv="\ue4e2" +md_watch="\ue4e3" +md_device_hub="\ue4e4" +md_power_input="\ue4e5" +md_devices_other="\ue4e6" +md_videogame_asset="\ue4e7" +md_add_to_photos="\ue4e8" +md_adjust="\ue4e9" +md_assistant="\ue4ea" +md_assistant_photo="\ue4eb" +md_audiotrack="\ue4ec" +md_blur_circular="\ue4ed" +md_blur_linear="\ue4ee" +md_blur_off="\ue4ef" +md_blur_on="\ue4f0" +md_brightness_1="\ue4f1" +md_brightness_2="\ue4f2" +md_brightness_3="\ue4f3" +md_brightness_4="\ue4f4" +md_brightness_5="\ue4f5" +md_brightness_6="\ue4f6" +md_brightness_7="\ue4f7" +md_broken_image="\ue4f8" +md_brush="\ue4f9" +md_camera="\ue4fa" +md_camera_alt="\ue4fb" +md_camera_front="\ue4fc" +md_camera_rear="\ue4fd" +md_camera_roll="\ue4fe" +md_center_focus_strong="\ue4ff" +md_center_focus_weak="\ue500" +md_collections="\ue501" +md_color_lens="\ue502" +md_colorize="\ue503" +md_compare="\ue504" +md_control_point="\ue505" +md_control_point_duplicate="\ue506" +md_crop_16_9="\ue507" +md_crop_3_2="\ue508" +md_crop="\ue509" +md_crop_5_4="\ue50a" +md_crop_7_5="\ue50b" +md_crop_din="\ue50c" +md_crop_free="\ue50d" +md_crop_landscape="\ue50e" +md_crop_original="\ue50f" +md_crop_portrait="\ue510" +md_crop_square="\ue511" +md_dehaze="\ue512" +md_details="\ue513" +md_edit="\ue514" +md_exposure="\ue515" +md_exposure_neg_1="\ue516" +md_exposure_neg_2="\ue517" +md_exposure_plus_1="\ue518" +md_exposure_plus_2="\ue519" +md_exposure_zero="\ue51a" +md_filter_1="\ue51b" +md_filter_2="\ue51c" +md_filter_3="\ue51d" +md_filter="\ue51e" +md_filter_4="\ue51f" +md_filter_5="\ue520" +md_filter_6="\ue521" +md_filter_7="\ue522" +md_filter_8="\ue523" +md_filter_9="\ue524" +md_filter_9_plus="\ue525" +md_filter_b_and_w="\ue526" +md_filter_center_focus="\ue527" +md_filter_drama="\ue528" +md_filter_frames="\ue529" +md_filter_hdr="\ue52a" +md_filter_none="\ue52b" +md_filter_tilt_shift="\ue52c" +md_filter_vintage="\ue52d" +md_flare="\ue52e" +md_flash_auto="\ue52f" +md_flash_off="\ue530" +md_flash_on="\ue531" +md_flip="\ue532" +md_gradient="\ue533" +md_grain="\ue534" +md_grid_off="\ue535" +md_grid_on="\ue536" +md_hdr_off="\ue537" +md_hdr_on="\ue538" +md_hdr_strong="\ue539" +md_hdr_weak="\ue53a" +md_healing="\ue53b" +md_image="\ue53c" +md_image_aspect_ratio="\ue53d" +md_iso="\ue53e" +md_landscape="\ue53f" +md_leak_add="\ue540" +md_leak_remove="\ue541" +md_lens="\ue542" +md_looks_3="\ue543" +md_looks="\ue544" +md_looks_4="\ue545" +md_looks_5="\ue546" +md_looks_6="\ue547" +md_looks_one="\ue548" +md_looks_two="\ue549" +md_loupe="\ue54a" +md_monochrome_photos="\ue54b" +md_movie_creation="\ue54c" +md_music_note="\ue54d" +md_nature="\ue54e" +md_nature_people="\ue54f" +md_navigate_before="\ue550" +md_navigate_next="\ue551" +md_palette="\ue552" +md_panorama="\ue553" +md_panorama_fish_eye="\ue554" +md_panorama_horizontal="\ue555" +md_panorama_vertical="\ue556" +md_panorama_wide_angle="\ue557" +md_photo="\ue558" +md_photo_album="\ue559" +md_photo_camera="\ue55a" +md_photo_library="\ue55b" +md_picture_as_pdf="\ue55c" +md_portrait="\ue55d" +md_remove_red_eye="\ue55e" +md_rotate_90_degrees_ccw="\ue55f" +md_rotate_left="\ue560" +md_rotate_right="\ue561" +md_slideshow="\ue562" +md_straighten="\ue563" +md_style="\ue564" +md_switch_camera="\ue565" +md_switch_video="\ue566" +md_tag_faces="\ue567" +md_texture="\ue568" +md_timelapse="\ue569" +md_timer_10="\ue56a" +md_timer_3="\ue56b" +md_timer="\ue56c" +md_timer_off="\ue56d" +md_tonality="\ue56e" +md_transform="\ue56f" +md_tune="\ue570" +md_view_comfy="\ue571" +md_view_compact="\ue572" +md_wb_auto="\ue573" +md_wb_cloudy="\ue574" +md_wb_incandescent="\ue575" +md_wb_sunny="\ue576" +md_collections_bookmark="\ue577" +md_photo_size_select_actual="\ue578" +md_photo_size_select_large="\ue579" +md_photo_size_select_small="\ue57a" +md_vignette="\ue57b" +md_wb_iridescent="\ue57c" +md_crop_rotate="\ue57d" +md_linked_camera="\ue57e" +md_add_a_photo="\ue57f" +md_movie_filter="\ue580" +md_photo_filter="\ue581" +md_burst_mode="\ue582" +md_beenhere="\ue583" +md_directions="\ue584" +md_directions_bike="\ue585" +md_directions_bus="\ue586" +md_directions_car="\ue587" +md_directions_boat="\ue588" +md_directions_subway="\ue589" +md_directions_railway="\ue58a" +md_directions_transit="\ue58b" +md_directions_walk="\ue58c" +md_flight="\ue58d" +md_hotel="\ue58e" +md_layers="\ue58f" +md_layers_clear="\ue590" +md_local_airport="\ue591" +md_local_atm="\ue592" +md_local_activity="\ue593" +md_local_bar="\ue594" +md_local_cafe="\ue595" +md_local_car_wash="\ue596" +md_local_convenience_store="\ue597" +md_local_drink="\ue598" +md_local_florist="\ue599" +md_local_gas_station="\ue59a" +md_local_grocery_store="\ue59b" +md_local_hospital="\ue59c" +md_local_hotel="\ue59d" +md_local_laundry_service="\ue59e" +md_local_library="\ue59f" +md_local_mall="\ue5a0" +md_local_movies="\ue5a1" +md_local_offer="\ue5a2" +md_local_parking="\ue5a3" +md_local_pharmacy="\ue5a4" +md_local_phone="\ue5a5" +md_local_pizza="\ue5a6" +md_local_play="\ue5a7" +md_local_post_office="\ue5a8" +md_local_printshop="\ue5a9" +md_local_dining="\ue5aa" +md_local_see="\ue5ab" +md_local_shipping="\ue5ac" +md_local_taxi="\ue5ad" +md_person_pin="\ue5ae" +md_map="\ue5af" +md_my_location="\ue5b0" +md_navigation="\ue5b1" +md_pin_drop="\ue5b2" +md_place="\ue5b3" +md_rate_review="\ue5b4" +md_restaurant_menu="\ue5b5" +md_satellite="\ue5b6" +md_store_mall_directory="\ue5b7" +md_terrain="\ue5b8" +md_traffic="\ue5b9" +md_directions_run="\ue5ba" +md_add_location="\ue5bb" +md_edit_location="\ue5bc" +md_near_me="\ue5bd" +md_person_pin_circle="\ue5be" +md_zoom_out_map="\ue5bf" +md_restaurant="\ue5c0" +md_ev_station="\ue5c1" +md_streetview="\ue5c2" +md_subway="\ue5c3" +md_train="\ue5c4" +md_tram="\ue5c5" +md_transfer_within_a_station="\ue5c6" +md_apps="\ue5c7" +md_arrow_back="\ue5c8" +md_arrow_drop_down="\ue5c9" +md_arrow_drop_down_circle="\ue5ca" +md_arrow_drop_up="\ue5cb" +md_arrow_forward="\ue5cc" +md_cancel="\ue5cd" +md_check="\ue5ce" +md_chevron_left="\ue5cf" +md_chevron_right="\ue5d0" +md_close="\ue5d1" +md_expand_less="\ue5d2" +md_expand_more="\ue5d3" +md_fullscreen="\ue5d4" +md_fullscreen_exit="\ue5d5" +md_menu="\ue5d6" +md_more_horiz="\ue5d7" +md_more_vert="\ue5d8" +md_refresh="\ue5d9" +md_unfold_less="\ue5da" +md_unfold_more="\ue5db" +md_arrow_upward="\ue5dc" +md_subdirectory_arrow_left="\ue5dd" +md_subdirectory_arrow_right="\ue5de" +md_arrow_downward="\ue5df" +md_first_page="\ue5e0" +md_last_page="\ue5e1" +md_adb="\ue5e2" +md_bluetooth_audio="\ue5e3" +md_disc_full="\ue5e4" +md_do_not_disturb_alt="\ue5e5" +md_do_not_disturb="\ue5e6" +md_drive_eta="\ue5e7" +md_event_available="\ue5e8" +md_event_busy="\ue5e9" +md_event_note="\ue5ea" +md_folder_special="\ue5eb" +md_mms="\ue5ec" +md_more="\ue5ed" +md_network_locked="\ue5ee" +md_phone_bluetooth_speaker="\ue5ef" +md_phone_forwarded="\ue5f0" +md_phone_in_talk="\ue5f1" +md_phone_locked="\ue5f2" +md_phone_missed="\ue5f3" +md_phone_paused="\ue5f4" +md_sd_card="\ue5f5" +md_sim_card_alert="\ue5f6" +md_sms="\ue5f7" +md_sms_failed="\ue5f8" +md_sync="\ue5f9" +md_sync_disabled="\ue5fa" +md_sync_problem="\ue5fb" +md_system_update="\ue5fc" +md_tap_and_play="\ue5fd" +md_time_to_leave="\ue5fe" +md_vibration="\ue5ff" +md_voice_chat="\ue600" +md_vpn_lock="\ue601" +md_airline_seat_flat="\ue602" +md_airline_seat_flat_angled="\ue603" +md_airline_seat_individual_suite="\ue604" +md_airline_seat_legroom_extra="\ue605" +md_airline_seat_legroom_normal="\ue606" +md_airline_seat_legroom_reduced="\ue607" +md_airline_seat_recline_extra="\ue608" +md_airline_seat_recline_normal="\ue609" +md_confirmation_number="\ue60a" +md_live_tv="\ue60b" +md_ondemand_video="\ue60c" +md_personal_video="\ue60d" +md_power="\ue60e" +md_wc="\ue60f" +md_wifi="\ue610" +md_enhanced_encryption="\ue611" +md_network_check="\ue612" +md_no_encryption="\ue613" +md_rv_hookup="\ue614" +md_do_not_disturb_off="\ue615" +md_do_not_disturb_on="\ue616" +md_priority_high="\ue617" +md_pie_chart="\ue618" +md_pie_chart_outlined="\ue619" +md_bubble_chart="\ue61a" +md_multiline_chart="\ue61b" +md_show_chart="\ue61c" +md_cake="\ue61d" +md_domain="\ue61e" +md_group="\ue61f" +md_group_add="\ue620" +md_location_city="\ue621" +md_mood="\ue622" +md_mood_bad="\ue623" +md_notifications="\ue624" +md_notifications_none="\ue625" +md_notifications_off="\ue626" +md_notifications_active="\ue627" +md_notifications_paused="\ue628" +md_pages="\ue629" +md_party_mode="\ue62a" +md_people="\ue62b" +md_people_outline="\ue62c" +md_person="\ue62d" +md_person_add="\ue62e" +md_person_outline="\ue62f" +md_plus_one="\ue630" +md_poll="\ue631" +md_public="\ue632" +md_school="\ue633" +md_share="\ue634" +md_whatshot="\ue635" +md_sentiment_dissatisfied="\ue636" +md_sentiment_neutral="\ue637" +md_sentiment_satisfied="\ue638" +md_sentiment_very_dissatisfied="\ue639" +md_sentiment_very_satisfied="\ue63a" +md_check_box="\ue63b" +md_check_box_outline_blank="\ue63c" +md_radio_button_unchecked="\ue63d" +md_radio_button_checked="\ue63e" +md_star="\ue63f" +md_star_half="\ue640" +md_star_border="\ue641" +md_3d_rotation="\ue642" +md_accessibility="\ue643" +md_account_balance="\ue644" +md_account_balance_wallet="\ue645" +md_account_box="\ue646" +md_account_circle="\ue647" +md_add_shopping_cart="\ue648" +md_alarm="\ue649" +md_alarm_add="\ue64a" +md_alarm_off="\ue64b" +md_alarm_on="\ue64c" +md_android="\ue64d" +md_announcement="\ue64e" +md_aspect_ratio="\ue64f" +md_assessment="\ue650" +md_assignment="\ue651" +md_assignment_ind="\ue652" +md_assignment_late="\ue653" +md_assignment_return="\ue654" +md_assignment_returned="\ue655" +md_assignment_turned_in="\ue656" +md_autorenew="\ue657" +md_backup="\ue658" +md_book="\ue659" +md_bookmark="\ue65a" +md_bookmark_border="\ue65b" +md_bug_report="\ue65c" +md_build="\ue65d" +md_cached="\ue65e" +md_change_history="\ue65f" +md_check_circle="\ue660" +md_chrome_reader_mode="\ue661" +md_class="\ue662" +md_code="\ue663" +md_credit_card="\ue664" +md_dashboard="\ue665" +md_delete="\ue666" +md_description="\ue667" +md_dns="\ue668" +md_done="\ue669" +md_done_all="\ue66a" +md_event="\ue66b" +md_exit_to_app="\ue66c" +md_explore="\ue66d" +md_extension="\ue66e" +md_face="\ue66f" +md_favorite="\ue670" +md_favorite_border="\ue671" +md_feedback="\ue672" +md_find_in_page="\ue673" +md_find_replace="\ue674" +md_flip_to_back="\ue675" +md_flip_to_front="\ue676" +md_get_app="\ue677" +md_grade="\ue678" +md_group_work="\ue679" +md_help="\ue67a" +md_highlight_off="\ue67b" +md_history="\ue67c" +md_home="\ue67d" +md_hourglass_empty="\ue67e" +md_hourglass_full="\ue67f" +md_https="\ue680" +md_info="\ue681" +md_info_outline="\ue682" +md_input="\ue683" +md_invert_colors="\ue684" +md_label="\ue685" +md_label_outline="\ue686" +md_language="\ue687" +md_launch="\ue688" +md_list="\ue689" +md_lock="\ue68a" +md_lock_open="\ue68b" +md_lock_outline="\ue68c" +md_loyalty="\ue68d" +md_markunread_mailbox="\ue68e" +md_note_add="\ue68f" +md_open_in_browser="\ue690" +md_open_in_new="\ue691" +md_open_with="\ue692" +md_pageview="\ue693" +md_payment="\ue694" +md_perm_camera_mic="\ue695" +md_perm_contact_calendar="\ue696" +md_perm_data_setting="\ue697" +md_perm_device_information="\ue698" +md_perm_identity="\ue699" +md_perm_media="\ue69a" +md_perm_phone_msg="\ue69b" +md_perm_scan_wifi="\ue69c" +md_picture_in_picture="\ue69d" +md_polymer="\ue69e" +md_power_settings_new="\ue69f" +md_print="\ue6a0" +md_query_builder="\ue6a1" +md_question_answer="\ue6a2" +md_receipt="\ue6a3" +md_redeem="\ue6a4" +md_report_problem="\ue6a5" +md_restore="\ue6a6" +md_room="\ue6a7" +md_schedule="\ue6a8" +md_search="\ue6a9" +md_settings="\ue6aa" +md_settings_applications="\ue6ab" +md_settings_backup_restore="\ue6ac" +md_settings_bluetooth="\ue6ad" +md_settings_cell="\ue6ae" +md_settings_brightness="\ue6af" +md_settings_ethernet="\ue6b0" +md_settings_input_antenna="\ue6b1" +md_settings_input_component="\ue6b2" +md_settings_input_composite="\ue6b3" +md_settings_input_hdmi="\ue6b4" +md_settings_input_svideo="\ue6b5" +md_settings_overscan="\ue6b6" +md_settings_phone="\ue6b7" +md_settings_power="\ue6b8" +md_settings_remote="\ue6b9" +md_settings_voice="\ue6ba" +md_shop="\ue6bb" +md_shop_two="\ue6bc" +md_shopping_basket="\ue6bd" +md_shopping_cart="\ue6be" +md_speaker_notes="\ue6bf" +md_spellcheck="\ue6c0" +md_stars="\ue6c1" +md_store="\ue6c2" +md_subject="\ue6c3" +md_supervisor_account="\ue6c4" +md_swap_horiz="\ue6c5" +md_swap_vert="\ue6c6" +md_swap_vertical_circle="\ue6c7" +md_system_update_alt="\ue6c8" +md_tab="\ue6c9" +md_tab_unselected="\ue6ca" +md_theaters="\ue6cb" +md_thumb_down="\ue6cc" +md_thumb_up="\ue6cd" +md_thumbs_up_down="\ue6ce" +md_toc="\ue6cf" +md_today="\ue6d0" +md_toll="\ue6d1" +md_track_changes="\ue6d2" +md_translate="\ue6d3" +md_trending_down="\ue6d4" +md_trending_flat="\ue6d5" +md_trending_up="\ue6d6" +md_turned_in="\ue6d7" +md_turned_in_not="\ue6d8" +md_verified_user="\ue6d9" +md_view_agenda="\ue6da" +md_view_array="\ue6db" +md_view_carousel="\ue6dc" +md_view_column="\ue6dd" +md_view_day="\ue6de" +md_view_headline="\ue6df" +md_view_list="\ue6e0" +md_view_module="\ue6e1" +md_view_quilt="\ue6e2" +md_view_stream="\ue6e3" +md_view_week="\ue6e4" +md_visibility="\ue6e5" +md_visibility_off="\ue6e6" +md_card_giftcard="\ue6e7" +md_card_membership="\ue6e8" +md_card_travel="\ue6e9" +md_work="\ue6ea" +md_youtube_searched_for="\ue6eb" +md_eject="\ue6ec" +md_camera_enhance="\ue6ed" +md_help_outline="\ue6ee" +md_reorder="\ue6ef" +md_zoom_in="\ue6f0" +md_zoom_out="\ue6f1" +md_http="\ue6f2" +md_event_seat="\ue6f3" +md_flight_land="\ue6f4" +md_flight_takeoff="\ue6f5" +md_play_for_work="\ue6f6" +md_gif="\ue6f7" +md_indeterminate_check_box="\ue6f8" +md_offline_pin="\ue6f9" +md_all_out="\ue6fa" +md_copyright="\ue6fb" +md_fingerprint="\ue6fc" +md_gavel="\ue6fd" +md_lightbulb_outline="\ue6fe" +md_picture_in_picture_alt="\ue6ff" +md_important_devices="\ue700" +md_touch_app="\ue701" +md_accessible="\ue702" +md_compare_arrows="\ue703" +md_date_range="\ue704" +md_donut_large="\ue705" +md_donut_small="\ue706" +md_line_style="\ue707" +md_line_weight="\ue708" +md_motorcycle="\ue709" +md_opacity="\ue70a" +md_pets="\ue70b" +md_pregnant_woman="\ue70c" +md_record_voice_over="\ue70d" +md_rounded_corner="\ue70e" +md_rowing="\ue70f" +md_timeline="\ue710" +md_update="\ue711" +md_watch_later="\ue712" +md_pan_tool="\ue713" +md_euro_symbol="\ue714" +md_g_translate="\ue715" +md_remove_shopping_cart="\ue716" +md_restore_page="\ue717" +md_speaker_notes_off="\ue718" +md_delete_forever="\ue719" +md_ac_unit="\ue71a" +md_airport_shuttle="\ue71b" +md_all_inclusive="\ue71c" +md_beach_access="\ue71d" +md_business_center="\ue71e" +md_casino="\ue71f" +md_child_care="\ue720" +md_child_friendly="\ue721" +md_fitness_center="\ue722" +md_free_breakfast="\ue723" +md_golf_course="\ue724" +md_hot_tub="\ue725" +md_kitchen="\ue726" +md_pool="\ue727" +md_room_service="\ue728" +md_smoke_free="\ue729" +md_smoking_rooms="\ue72a" +md_spa="\ue72b" +md_u10fffd="\ue72c" +file_regex="\ue72d" +file_arch_linux="\ue72e" +file_e="\ue72f" +file_glyphs="\ue730" +file_knockout="\ue731" +file_lean="\ue732" +file_metal="\ue733" +file_povray="\ue734" +file_s="\ue735" +file_tt="\ue736" +file_vagrant="\ue737" +file_xmos="\ue738" +file_a="\ue739" +file_chai="\ue73a" +file_stylus="\ue73b" +file_textile="\ue73c" +file_unreal="\ue73d" +file_purebasic="\ue73e" +file_ts="\ue73f" +file_scheme="\ue740" +file_textmate="\ue741" +file_x10="\ue742" +file_apl="\ue743" +file_ansible="\ue744" +file_arttext="\ue745" +file_antwar="\ue746" +file_opa="\ue747" +file_codecov="\ue748" +file_yang="\ue749" +file_pm2="\ue74a" +file_hg="\ue74b" +file_pawn="\ue74c" +file_julia="\ue74d" +file_shipit="\ue74e" +file_mocha="\ue74f" +file_nib="\ue750" +file_shuriken="\ue751" +file_alex="\ue752" +file_twig="\ue753" +file_1c="\ue754" +file_tex="\ue755" +file_bibtex="\ue756" +file_mustache="\ue757" +file_gulp="\ue758" +file_grunt="\ue759" +file_ember="\ue75a" +file_go="\ue75b" +file_jenkins="\ue75c" +file_gnu="\ue75d" +file_composer="\ue75e" +file_meteor="\ue75f" +file_ai="\ue760" +file_psd="\ue761" +file_silverstripe="\ue762" +file_maxscript="\ue763" +file_kivy="\ue764" +file_crystal="\ue765" +file_gradle="\ue766" +file_groovy="\ue767" +file_r="\ue768" +file_vue="\ue769" +file_haxe="\ue76a" +file_lisp="\ue76b" +file_e909="\ue76c" +file_fortran="\ue76d" +file_ada="\ue76e" +file_dyalog="\ue76f" +file_jade="\ue770" +file_e90e="\ue771" +file_font="\ue772" +file_postcss="\ue773" +file_scad="\ue774" +file_e912="\ue775" +file_raml="\ue776" +file_ls="\ue777" +file_saltstack="\ue778" +file_terraform="\ue779" +file_org="\ue77a" +file_asciidoc="\ue77b" +file_riot="\ue77c" +file_ocaml="\ue77d" +file_lua="\ue77e" +file_npm="\ue77f" +file_llvm="\ue780" +file_e91e="\ue781" +file_babel="\ue782" +file_marko="\ue783" +file_flow="\ue784" +file_broccoli="\ue785" +file_appveyor="\ue786" +file_cakefile="\ue787" +file_apple="\ue788" +file_emacs="\ue789" +file_sketch="\ue78a" +file_doxygen="\ue78b" +file_cf="\ue78c" +file_pascal="\ue78d" +file_abap="\ue78e" +file_antlr="\ue78f" +file_api="\ue790" +file_as="\ue791" +file_arc="\ue792" +file_arduino="\ue793" +file_augeas="\ue794" +file_ahk="\ue795" +file_autoit="\ue796" +file_ats="\ue797" +file_alloy="\ue798" +file_manpage="\ue799" +file_j="\ue79a" +file_glade="\ue79b" +file_boo="\ue79c" +file_brain="\ue79d" +file_bro="\ue79e" +file_bluespec="\ue79f" +file_stylelint="\ue7a0" +file_ant="\ue7a1" +file_cmake="\ue7a2" +file_clips="\ue7a3" +file_mapbox="\ue7a4" +file_cp="\ue7a5" +file_chuck="\ue7a6" +file_jinja="\ue7a7" +file_isabelle="\ue7a8" +file_doge="\ue7a9" +file_idl="\ue7aa" +file_jake="\ue7ab" +file_verilog="\ue7ac" +file_phalcon="\ue7ad" +file_fabfile="\ue7ae" +file_lfe="\ue7af" +file_nmap="\ue7b0" +file_ampl="\ue7b1" +file_ceylon="\ue7b2" +file_chapel="\ue7b3" +file_cirru="\ue7b4" +file_clarion="\ue7b5" +file_nunjucks="\ue7b6" +file_mediawiki="\ue7b7" +file_postscript="\ue7b8" +file_tcl="\ue7b9" +file_owl="\ue7ba" +file_jsonld="\ue7bb" +file_sparql="\ue7bc" +file_sas="\ue7bd" +file_clean="\ue7be" +file_click="\ue7bf" +file_nvidia="\ue7c0" +file_creole="\ue7c1" +file_coq="\ue7c2" +file_diff="\ue7c3" +file_patch="\ue7c4" +file_byond="\ue7c5" +file_cython="\ue7c6" +file_darcs="\ue7c7" +file_eagle="\ue7c8" +file_ecere="\ue7c9" +file_eiffel="\ue7ca" +file_em="\ue7cb" +file_flux="\ue7cc" +file_factor="\ue7cd" +file_fancy="\ue7ce" +file_perl6="\ue7cf" +file_gentoo="\ue7d0" +file_frege="\ue7d1" +file_fantom="\ue7d2" +file_freemarker="\ue7d3" +file_gap="\ue7d4" +file_cl="\ue7d5" +file_gams="\ue7d6" +file_godot="\ue7d7" +file_gml="\ue7d8" +file_genshi="\ue7d9" +file_pointwise="\ue7da" +file_gf="\ue7db" +file_golo="\ue7dc" +file_gosu="\ue7dd" +file_harbour="\ue7de" +file_graphql="\ue7df" +file_graphviz="\ue7e0" +file_hashicorp="\ue7e1" +file_hy="\ue7e2" +file_igorpro="\ue7e3" +file_io="\ue7e4" +file_ioke="\ue7e5" +file_idris="\ue7e6" +file_inform7="\ue7e7" +file_inno="\ue7e8" +file_sublime="\ue7e9" +file_jupyter="\ue7ea" +file_krl="\ue7eb" +file_kotlin="\ue7ec" +file_labview="\ue7ed" +file_lsl="\ue7ee" +file_lasso="\ue7ef" +file_logtalk="\ue7f0" +file_lookml="\ue7f1" +file_mako="\ue7f2" +file_mathematica="\ue7f3" +file_matlab="\ue7f4" +file_e992="\ue7f5" +file_max="\ue7f6" +file_mercury="\ue7f7" +file_mirah="\ue7f8" +file_modula2="\ue7f9" +file_monkey="\ue7fa" +file_nimrod="\ue7fb" +file_nit="\ue7fc" +file_nix="\ue7fd" +file_amx="\ue7fe" +file_netlogo="\ue7ff" +file_numpy="\ue800" +file_objj="\ue801" +file_opencl="\ue802" +file_processing="\ue803" +file_ox="\ue804" +file_scd="\ue805" +file_stata="\ue806" +file_stan="\ue807" +file_sqf="\ue808" +file_slash="\ue809" +file_shen="\ue80a" +file_self="\ue80b" +file_scilab="\ue80c" +file_vhdl="\ue80d" +file_sage="\ue80e" +file_robot="\ue80f" +file_red="\ue810" +file_rebol="\ue811" +file_xojo="\ue812" +file_rdoc="\ue813" +file_racket="\ue814" +file_purescript="\ue815" +file_uno="\ue816" +file_varnish="\ue817" +file_propeller="\ue818" +file_turing="\ue819" +file_pony="\ue81a" +file_pogo="\ue81b" +file_pike="\ue81c" +file_urweb="\ue81d" +file_parrot="\ue81e" +file_papyrus="\ue81f" +file_pan="\ue820" +file_oz="\ue821" +file_oxygene="\ue822" +file_progress="\ue823" +file_txl="\ue824" +file_cabal="\ue825" +file_sysverilog="\ue826" +file_pickle="\ue827" +file_xpages="\ue828" +file_xtend="\ue829" +file_zephir="\ue82a" +file_zimpl="\ue82b" +file_ec="\ue82c" +file_mupad="\ue82d" +file_ooc="\ue82e" +file_rst="\ue82f" +file_karma="\ue830" +file_hack="\ue831" +file_shopify="\ue832" +file_pug_alt="\ue833" +file_e9d1="\ue834" +file_sbt="\ue835" +file_e9d3="\ue836" +file_scrutinizer="\ue837" +file_cc="\ue838" +file_brakeman="\ue839" +file_newrelic="\ue83a" +file_thor="\ue83b" +file_nuget="\ue83c" +file_powershell="\ue83d" +file_sf="\ue83e" +file_minecraft="\ue83f" +file_sqlite="\ue840" +file_protractor="\ue841" +file_typings="\ue842" +file_strings="\ue843" +file_nant="\ue844" +file_csscript="\ue845" +file_cake="\ue846" +file_openoffice="\ue847" +file_keynote="\ue848" +file_jsx="\ue849" +file_tsx="\ue84a" +file_model="\ue84b" +file_finder="\ue84c" +file_access="\ue84d" +file_onenote="\ue84e" +file_powerpoint="\ue84f" +file_word="\ue850" +file_excel="\ue851" +file_storyist="\ue852" +file_csound="\ue853" +file_dbase="\ue854" +file_zbrush="\ue855" +file_ae="\ue856" +file_indesign="\ue857" +file_premiere="\ue858" +file_maya="\ue859" +file_e9f7="\ue85a" +file_khronos="\ue85b" +file_audacity="\ue85c" +file_blender="\ue85d" +file_lightwave="\ue85e" +file_fbx="\ue85f" +file_e9fd="\ue860" +file_typedoc="\ue861" +file_alpine="\ue862" +file_yui="\ue863" +file_ea01="\ue864" +file_ea02="\ue865" +file_ea03="\ue866" +file_normalize="\ue867" +file_neko="\ue868" +file_mathjax="\ue869" +file_leaflet="\ue86a" +file_gdb="\ue86b" +file_fuelux="\ue86c" +file_eq="\ue86d" +file_chartjs="\ue86e" +file_ea0c="\ue86f" +file_ea0d="\ue870" +file_ea0e="\ue871" +file_eslint="\ue872" +file_d3="\ue873" +file_cordova="\ue874" +file_circleci="\ue875" +file_pug="\ue876" +file_powerbuilder="\ue877" +file_dylib="\ue878" +file_rexx="\ue879" +file_svn="\ue87a" +file_mruby="\ue87b" +file_wercker="\ue87c" +file_yarn="\ue87d" +file_editorconfig="\ue87e" +file_snyk="\ue87f" +file_reason="\ue880" +file_nsis="\ue881" +file_v8="\ue882" +file_rollup="\ue883" +file_ea21="\ue884" +file_ea22="\ue885" +file_ea23="\ue886" +file_rascal="\ue887" +file_gn="\ue888" +file_nodemon="\ue889" +file_electron="\ue88a" +file_1c_alt="\ue88b" +file_swagger="\ue88c" +file_bithound="\ue88d" +file_polymer="\ue88e" +file_platformio="\ue88f" +file_shippable="\ue890" +file_ea2e="\ue891" +file_sequelize="\ue892" +file_redux="\ue893" +file_rspec="\ue894" +file_phpunit="\ue895" +file_octave="\ue896" +file_nuclide="\ue897" +file_infopath="\ue898" +file_lime="\ue899" +file_lerna="\ue89a" +file_kitchenci="\ue89b" +file_jest="\ue89c" +file_jasmine="\ue89d" +file_haxedevelop="\ue89e" +file_gitlab="\ue89f" +file_drone="\ue8a0" +file_virtualbox="\ue8a1" +file_doclets="\ue8a2" +file_delphi="\ue8a3" +file_codekit="\ue8a4" +file_chef="\ue8a5" +file_cakephp="\ue8a6" +file_cobol="\ue8a7" +file_bundler="\ue8a8" +file_buck="\ue8a9" +file_brunch="\ue8aa" +file_aurelia="\ue8ab" +file_vmware="\ue8ac" +file_rhino="\ue8ad" +file_ejs="\ue8ae" +file_kicad="\ue8af" +file_hoplon="\ue8b0" +file_abif="\ue8b1" +file_watchman="\ue8b2" +file_p4="\ue8b3" +file_nanoc="\ue8b4" +file_miranda="\ue8b5" +file_minizinc="\ue8b6" +file_meson="\ue8b7" +file_jison="\ue8b8" +file_franca="\ue8b9" +file_devicetree="\ue8ba" +file_caddy="\ue8bb" +file_bem="\ue8bc" +file_bazel="\ue8bd" +file_angelscript="\ue8be" +file_esdoc="\ue8bf" +file_twine="\ue8c0" +file_squarespace="\ue8c1" +file_phoenix="\ue8c2" +file_test_dir="\ue8c3" +file_webpack="\ue8c4" +file_test_coffee="\ue8c5" +file_test_generic="\ue8c6" +file_test_js="\ue8c7" +file_test_perl="\ue8c8" +file_test_python="\ue8c9" +file_test_react="\ue8ca" +file_test_ruby="\ue8cb" +file_test_ts="\ue8cc" +file_codeship="\ue8cd" +file_nxc="\ue8ce" +file_brotli="\ue8cf" +file_proselint="\ue8d0" +file_bintray="\ue8d1" +file_mjml="\ue8d2" +file_wasm="\ue8d3" +file_ea71="\ue8d4" +file_nasm="\ue8d5" +file_ea73="\ue8d6" +file_peg="\ue8d7" +file_jolie="\ue8d8" +file_nano="\ue8d9" +file_xamarin="\ue8da" +file_f012="\ue8db" +file_tag="\ue8dc" +file_cucumber="\ue8dd" +file_video="\ue8de" +file_config="\ue8df" +file_dashboard="\ue8e0" +file_puppet="\ue8e1" +file_terminal="\ue8e2" +file_markdownlint="\ue8e3" +file_react="\ue8e4" +file_f101="\ue8e5" +file_elm="\ue8e6" +file_boot="\ue8e7" +file_cljs="\ue8e8" +file_lein="\ue8e9" +file_docker="\ue8ea" +file_php="\ue8eb" +file_ionic="\ue8ec" +file_haml="\ue8ed" +file_f17b="\ue8ee" +file_ff="\ue8ef" +file_u1f3c1="\ue8f0" +file_tern="\ue8f1" +file_default="\ue8f2" +file_sigils="\ue8f3" +file_nginx="\ue8f4" +weather_day_cloudy_gusts="\ue8f5" +weather_day_cloudy_windy="\ue8f6" +weather_day_cloudy="\ue8f7" +weather_day_fog="\ue8f8" +weather_day_hail="\ue8f9" +weather_day_lightning="\ue8fa" +weather_day_rain_mix="\ue8fb" +weather_day_rain_wind="\ue8fc" +weather_day_rain="\ue8fd" +weather_day_showers="\ue8fe" +weather_day_snow="\ue8ff" +weather_day_sprinkle="\ue900" +weather_day_sunny_overcast="\ue901" +weather_day_sunny="\ue902" +weather_day_storm_showers="\ue903" +weather_day_thunderstorm="\ue904" +weather_cloudy_gusts="\ue905" +weather_cloudy_windy="\ue906" +weather_cloudy="\ue907" +weather_fog="\ue908" +weather_hail="\ue909" +weather_lightning="\ue90a" +weather_rain_mix="\ue90b" +weather_rain_wind="\ue90c" +weather_rain="\ue90d" +weather_showers="\ue90e" +weather_snow="\ue90f" +weather_sprinkle="\ue910" +weather_storm_showers="\ue911" +weather_thunderstorm="\ue912" +weather_windy="\ue913" +weather_night_alt_cloudy_gusts="\ue914" +weather_night_alt_cloudy_windy="\ue915" +weather_night_alt_hail="\ue916" +weather_night_alt_lightning="\ue917" +weather_night_alt_rain_mix="\ue918" +weather_night_alt_rain_wind="\ue919" +weather_night_alt_rain="\ue91a" +weather_night_alt_showers="\ue91b" +weather_night_alt_snow="\ue91c" +weather_night_alt_sprinkle="\ue91d" +weather_night_alt_storm_showers="\ue91e" +weather_night_alt_thunderstorm="\ue91f" +weather_night_clear="\ue920" +weather_night_cloudy_gusts="\ue921" +weather_night_cloudy_windy="\ue922" +weather_night_cloudy="\ue923" +weather_night_hail="\ue924" +weather_night_lightning="\ue925" +weather_night_rain_mix="\ue926" +weather_night_rain_wind="\ue927" +weather_night_rain="\ue928" +weather_night_showers="\ue929" +weather_night_snow="\ue92a" +weather_night_sprinkle="\ue92b" +weather_night_storm_showers="\ue92c" +weather_night_thunderstorm="\ue92d" +weather_celsius="\ue92e" +weather_cloud_down="\ue92f" +weather_cloud_refresh="\ue930" +weather_cloud_up="\ue931" +weather_cloud="\ue932" +weather_degrees="\ue933" +weather_direction_down_left="\ue934" +weather_direction_down="\ue935" +weather_fahrenheit="\ue936" +weather_horizon_alt="\ue937" +weather_horizon="\ue938" +weather_direction_left="\ue939" +weather_f049="\ue93a" +weather_night_fog="\ue93b" +weather_refresh_alt="\ue93c" +weather_refresh="\ue93d" +weather_direction_right="\ue93e" +weather_raindrops="\ue93f" +weather_strong_wind="\ue940" +weather_sunrise="\ue941" +weather_sunset="\ue942" +weather_thermometer_exterior="\ue943" +weather_thermometer_internal="\ue944" +weather_thermometer="\ue945" +weather_tornado="\ue946" +weather_direction_up_right="\ue947" +weather_direction_up="\ue948" +weather_f059="\ue949" +weather_f05a="\ue94a" +weather_f05b="\ue94b" +weather_f05c="\ue94c" +weather_f05d="\ue94d" +weather_f05e="\ue94e" +weather_f060="\ue94f" +weather_f061="\ue950" +weather_smoke="\ue951" +weather_dust="\ue952" +weather_snow_wind="\ue953" +weather_day_snow_wind="\ue954" +weather_night_snow_wind="\ue955" +weather_night_alt_snow_wind="\ue956" +weather_day_sleet_storm="\ue957" +weather_night_sleet_storm="\ue958" +weather_night_alt_sleet_storm="\ue959" +weather_day_snow_thunderstorm="\ue95a" +weather_night_snow_thunderstorm="\ue95b" +weather_night_alt_snow_thunderstorm="\ue95c" +weather_solar_eclipse="\ue95d" +weather_lunar_eclipse="\ue95e" +weather_meteor="\ue95f" +weather_hot="\ue960" +weather_hurricane="\ue961" +weather_smog="\ue962" +weather_alien="\ue963" +weather_snowflake_cold="\ue964" +weather_stars="\ue965" +weather_raindrop="\ue966" +weather_barometer="\ue967" +weather_humidity="\ue968" +weather_na="\ue969" +weather_flood="\ue96a" +weather_day_cloudy_high="\ue96b" +weather_night_alt_cloudy_high="\ue96c" +weather_night_cloudy_high="\ue96d" +weather_night_alt_partly_cloudy="\ue96e" +weather_sandstorm="\ue96f" +weather_night_partly_cloudy="\ue970" +weather_umbrella="\ue971" +weather_day_windy="\ue972" +weather_night_alt_cloudy="\ue973" +weather_direction_up_left="\ue974" +weather_direction_down_right="\ue975" +weather_time_12="\ue976" +weather_time_1="\ue977" +weather_time_2="\ue978" +weather_time_3="\ue979" +weather_time_4="\ue97a" +weather_time_5="\ue97b" +weather_time_6="\ue97c" +weather_time_7="\ue97d" +weather_time_8="\ue97e" +weather_time_9="\ue97f" +weather_time_10="\ue980" +weather_time_11="\ue981" +weather_moon_new="\ue982" +weather_moon_waxing_crescent_1="\ue983" +weather_moon_waxing_crescent_2="\ue984" +weather_moon_waxing_crescent_3="\ue985" +weather_moon_waxing_crescent_4="\ue986" +weather_moon_waxing_crescent_5="\ue987" +weather_moon_waxing_crescent_6="\ue988" +weather_moon_first_quarter="\ue989" +weather_moon_waxing_gibbous_1="\ue98a" +weather_moon_waxing_gibbous_2="\ue98b" +weather_moon_waxing_gibbous_3="\ue98c" +weather_moon_waxing_gibbous_4="\ue98d" +weather_moon_waxing_gibbous_5="\ue98e" +weather_moon_waxing_gibbous_6="\ue98f" +weather_moon_full="\ue990" +weather_moon_waning_gibbous_1="\ue991" +weather_moon_waning_gibbous_2="\ue992" +weather_moon_waning_gibbous_3="\ue993" +weather_moon_waning_gibbous_4="\ue994" +weather_moon_waning_gibbous_5="\ue995" +weather_moon_waning_gibbous_6="\ue996" +weather_moon_third_quarter="\ue997" +weather_moon_waning_crescent_1="\ue998" +weather_moon_waning_crescent_2="\ue999" +weather_moon_waning_crescent_3="\ue99a" +weather_moon_waning_crescent_4="\ue99b" +weather_moon_waning_crescent_5="\ue99c" +weather_moon_waning_crescent_6="\ue99d" +weather_wind_direction="\ue99e" +weather_day_sleet="\ue99f" +weather_night_sleet="\ue9a0" +weather_night_alt_sleet="\ue9a1" +weather_sleet="\ue9a2" +weather_day_haze="\ue9a3" +weather_wind_beaufort_0="\ue9a4" +weather_wind_beaufort_1="\ue9a5" +weather_wind_beaufort_2="\ue9a6" +weather_wind_beaufort_3="\ue9a7" +weather_wind_beaufort_4="\ue9a8" +weather_wind_beaufort_5="\ue9a9" +weather_wind_beaufort_6="\ue9aa" +weather_wind_beaufort_7="\ue9ab" +weather_wind_beaufort_8="\ue9ac" +weather_wind_beaufort_9="\ue9ad" +weather_wind_beaufort_10="\ue9ae" +weather_wind_beaufort_11="\ue9af" +weather_wind_beaufort_12="\ue9b0" +weather_day_light_wind="\ue9b1" +weather_tsunami="\ue9b2" +weather_earthquake="\ue9b3" +weather_fire="\ue9b4" +weather_volcano="\ue9b5" +weather_moonrise="\ue9b6" +weather_moonset="\ue9b7" +weather_train="\ue9b8" +weather_small_craft_advisory="\ue9b9" +weather_gale_warning="\ue9ba" +weather_storm_warning="\ue9bb" +weather_hurricane_warning="\ue9bc" +weather_moon_alt_waxing_crescent_1="\ue9bd" +weather_moon_alt_waxing_crescent_2="\ue9be" +weather_moon_alt_waxing_crescent_3="\ue9bf" +weather_moon_alt_waxing_crescent_4="\ue9c0" +weather_moon_alt_waxing_crescent_5="\ue9c1" +weather_moon_alt_waxing_crescent_6="\ue9c2" +weather_moon_alt_first_quarter="\ue9c3" +weather_moon_alt_waxing_gibbous_1="\ue9c4" +weather_moon_alt_waxing_gibbous_2="\ue9c5" +weather_moon_alt_waxing_gibbous_3="\ue9c6" +weather_moon_alt_waxing_gibbous_4="\ue9c7" +weather_moon_alt_waxing_gibbous_5="\ue9c8" +weather_moon_alt_waxing_gibbous_6="\ue9c9" +weather_moon_alt_full="\ue9ca" +weather_moon_alt_waning_gibbous_1="\ue9cb" +weather_moon_alt_waning_gibbous_2="\ue9cc" +weather_moon_alt_waning_gibbous_3="\ue9cd" +weather_moon_alt_waning_gibbous_4="\ue9ce" +weather_moon_alt_waning_gibbous_5="\ue9cf" +weather_moon_alt_waning_gibbous_6="\ue9d0" +weather_moon_alt_third_quarter="\ue9d1" +weather_moon_alt_waning_crescent_1="\ue9d2" +weather_moon_alt_waning_crescent_2="\ue9d3" +weather_moon_alt_waning_crescent_3="\ue9d4" +weather_moon_alt_waning_crescent_4="\ue9d5" +weather_moon_alt_waning_crescent_5="\ue9d6" +weather_moon_alt_waning_crescent_6="\ue9d7" +weather_moon_alt_new="\ue9d8" +linux_archlinux="\ue9d9" +linux_centos="\ue9da" +linux_debian="\ue9db" +linux_fedora="\ue9dc" +linux_linuxmint="\ue9dd" +linux_linuxmint_inverse="\ue9de" +linux_mageia="\ue9df" +linux_mandriva="\ue9e0" +linux_opensuse="\ue9e1" +linux_redhat="\ue9e2" +linux_slackware="\ue9e3" +linux_slackware_inverse="\ue9e4" +linux_ubuntu="\ue9e5" +linux_ubuntu_inverse="\ue9e6" +linux_freebsd="\ue9e7" +linux_coreos="\ue9e8" +linux_gentoo="\ue9e9" +linux_elementary="\ue9ea" +linux_fedora_inverse="\ue9eb" +linux_sabayon="\ue9ec" +linux_aosc="\ue9ed" +linux_nixos="\ue9ee" +linux_tux="\ue9ef" +linux_raspberry_pi="\ue9f0" +linux_manjaro="\ue9f1" +linux_apple="\ue9f2" +linux_docker="\ue9f3" +linux_alpine="\ue9f4" +myicons_0001="\ue9f5" +myicons_0002="\ue9f6" +myicons_0003="\ue9f7" +myicons_0004="\ue9f8" +myicons_0005="\ue9f9" +myicons_0006="\ue9fa" +myicons_0007="\ue9fb" +myicons_0008="\ue9fc" +myicons_0009="\ue9fd" +myicons_000a="\ue9fe" +myicons_000b="\ue9ff" +myicons_000d="\uea00" +myicons_000e="\uea01" +myicons_0010="\uea02" +myicons_0011="\uea03" +myicons_0013="\uea04" +myicons_0014="\uea05" +myicons_arch_linux_arrow="\uea06" +dev_bing_small="\uea07" +dev_css_tricks="\uea08" +dev_git="\uea09" +dev_bitbucket="\uea0a" +dev_mysql="\uea0b" +dev_streamline="\uea0c" +dev_database="\uea0d" +dev_dropbox="\uea0e" +dev_github_alt="\uea0f" +dev_github_badge="\uea10" +dev_github="\uea11" +dev_wordpress="\uea12" +dev_visualstudio="\uea13" +dev_jekyll_small="\uea14" +dev_android="\uea15" +dev_windows="\uea16" +dev_stackoverflow="\uea17" +dev_apple="\uea18" +dev_linux="\uea19" +dev_appstore="\uea1a" +dev_ghost_small="\uea1b" +dev_yahoo="\uea1c" +dev_codepen="\uea1d" +dev_github_full="\uea1e" +dev_nodejs_small="\uea1f" +dev_nodejs="\uea20" +dev_hackernews="\uea21" +dev_ember="\uea22" +dev_dojo="\uea23" +dev_django="\uea24" +dev_npm="\uea25" +dev_ghost="\uea26" +dev_modernizr="\uea27" +dev_unity_small="\uea28" +dev_raspberry_pi="\uea29" +dev_blackberry="\uea2a" +dev_go="\uea2b" +dev_git_branch="\uea2c" +dev_git_pull_request="\uea2d" +dev_git_merge="\uea2e" +dev_git_compare="\uea2f" +dev_git_commit="\uea30" +dev_cssdeck="\uea31" +dev_yahoo_small="\uea32" +dev_techcrunch="\uea33" +dev_smashing_magazine="\uea34" +dev_netmagazine="\uea35" +dev_codrops="\uea36" +dev_phonegap="\uea37" +dev_google_drive="\uea38" +dev_html5_multimedia="\uea39" +dev_html5_device_access="\uea3a" +dev_html5_connectivity="\uea3b" +dev_html5_3d_effects="\uea3c" +dev_html5="\uea3d" +dev_scala="\uea3e" +dev_java="\uea3f" +dev_ruby="\uea40" +dev_ubuntu="\uea41" +dev_ruby_on_rails="\uea42" +dev_python="\uea43" +dev_php="\uea44" +dev_markdown="\uea45" +dev_laravel="\uea46" +dev_magento="\uea47" +dev_joomla="\uea48" +dev_drupal="\uea49" +dev_chrome="\uea4a" +dev_ie="\uea4b" +dev_firefox="\uea4c" +dev_opera="\uea4d" +dev_bootstrap="\uea4e" +dev_safari="\uea4f" +dev_css3="\uea50" +dev_css3_full="\uea51" +dev_sass="\uea52" +dev_grunt="\uea53" +dev_bower="\uea54" +dev_javascript="\uea55" +dev_javascript_shield="\uea56" +dev_jquery="\uea57" +dev_coffeescript="\uea58" +dev_backbone="\uea59" +dev_angular="\uea5a" +dev_jquery_ui="\uea5b" +dev_swift="\uea5c" +dev_symfony="\uea5d" +dev_symfony_badge="\uea5e" +dev_less="\uea5f" +dev_stylus="\uea60" +dev_trello="\uea61" +dev_atlassian="\uea62" +dev_jira="\uea63" +dev_envato="\uea64" +dev_snap_svg="\uea65" +dev_raphael="\uea66" +dev_google_analytics="\uea67" +dev_compass="\uea68" +dev_onedrive="\uea69" +dev_gulp="\uea6a" +dev_atom="\uea6b" +dev_cisco="\uea6c" +dev_nancy="\uea6d" +dev_jenkins="\uea6e" +dev_clojure="\uea6f" +dev_perl="\uea70" +dev_clojure_alt="\uea71" +dev_celluloid="\uea72" +dev_w3c="\uea73" +dev_redis="\uea74" +dev_postgresql="\uea75" +dev_webplatform="\uea76" +dev_requirejs="\uea77" +dev_opensource="\uea78" +dev_typo3="\uea79" +dev_uikit="\uea7a" +dev_doctrine="\uea7b" +dev_groovy="\uea7c" +dev_nginx="\uea7d" +dev_haskell="\uea7e" +dev_zend="\uea7f" +dev_gnu="\uea80" +dev_yeoman="\uea81" +dev_heroku="\uea82" +dev_msql_server="\uea83" +dev_debian="\uea84" +dev_travis="\uea85" +dev_dotnet="\uea86" +dev_codeigniter="\uea87" +dev_javascript_badge="\uea88" +dev_yii="\uea89" +dev_composer="\uea8a" +dev_krakenjs_badge="\uea8b" +dev_krakenjs="\uea8c" +dev_mozilla="\uea8d" +dev_firebase="\uea8e" +dev_sizzlejs="\uea8f" +dev_creativecommons="\uea90" +dev_creativecommons_badge="\uea91" +dev_mitlicence="\uea92" +dev_senchatouch="\uea93" +dev_bugsense="\uea94" +dev_extjs="\uea95" +dev_mootools_badge="\uea96" +dev_mootools="\uea97" +dev_ruby_rough="\uea98" +dev_komodo="\uea99" +dev_coda="\uea9a" +dev_bintray="\uea9b" +dev_terminal="\uea9c" +dev_code="\uea9d" +dev_responsive="\uea9e" +dev_dart="\uea9f" +dev_aptana="\ueaa0" +dev_mailchimp="\ueaa1" +dev_netbeans="\ueaa2" +dev_dreamweaver="\ueaa3" +dev_brackets="\ueaa4" +dev_eclipse="\ueaa5" +dev_cloud9="\ueaa6" +dev_scrum="\ueaa7" +dev_prolog="\ueaa8" +dev_terminal_badge="\ueaa9" +dev_code_badge="\ueaaa" +dev_mongodb="\ueaab" +dev_meteor="\ueaac" +dev_meteorfull="\ueaad" +dev_fsharp="\ueaae" +dev_rust="\ueaaf" +dev_ionic="\ueab0" +dev_sublime="\ueab1" +dev_appcelerator="\ueab2" +dev_asterisk="\ueab3" +dev_aws="\ueab4" +dev_digital_ocean="\ueab5" +dev_dlang="\ueab6" +dev_docker="\ueab7" +dev_erlang="\ueab8" +dev_google_cloud_platform="\ueab9" +dev_grails="\ueaba" +dev_illustrator="\ueabb" +dev_intellij="\ueabc" +dev_materializecss="\ueabd" +dev_openshift="\ueabe" +dev_photoshop="\ueabf" +dev_rackspace="\ueac0" +dev_react="\ueac1" +dev_redhat="\ueac2" +dev_scriptcs="\ueac3" +dev_e6bd="\ueac4" +dev_e6be="\ueac5" +dev_e6bf="\ueac6" +dev_e6c0="\ueac7" +dev_e6c1="\ueac8" +dev_e6c2="\ueac9" +dev_e6c3="\ueaca" +dev_sqllite="\ueacb" +dev_vim="\ueacc" +pom_clean_code="\ueacd" +pom_pomodoro_done="\ueace" +pom_pomodoro_estimated="\ueacf" +pom_pomodoro_ticking="\uead0" +pom_pomodoro_squashed="\uead1" +pom_short_pause="\uead2" +pom_long_pause="\uead3" +pom_away="\uead4" +pom_pair_programming="\uead5" +pom_internal_interruption="\uead6" +pom_external_interruption="\uead7" +linea_arrows_anticlockwise="\uead8" +linea_arrows_anticlockwise_dashed="\uead9" +linea_arrows_button_down="\ueada" +linea_arrows_button_off="\ueadb" +linea_arrows_button_on="\ueadc" +linea_arrows_button_up="\ueadd" +linea_arrows_check="\ueade" +linea_arrows_circle_check="\ueadf" +linea_arrows_circle_down="\ueae0" +linea_arrows_circle_downleft="\ueae1" +linea_arrows_circle_downright="\ueae2" +linea_arrows_circle_left="\ueae3" +linea_arrows_circle_minus="\ueae4" +linea_arrows_circle_plus="\ueae5" +linea_arrows_circle_remove="\ueae6" +linea_arrows_circle_right="\ueae7" +linea_arrows_circle_up="\ueae8" +linea_arrows_circle_upleft="\ueae9" +linea_arrows_circle_upright="\ueaea" +linea_arrows_clockwise="\ueaeb" +linea_arrows_clockwise_dashed="\ueaec" +linea_arrows_compress="\ueaed" +linea_arrows_deny="\ueaee" +linea_arrows_diagonal="\ueaef" +linea_arrows_diagonal2="\ueaf0" +linea_arrows_down="\ueaf1" +linea_arrows_down_double="\ueaf2" +linea_arrows_downleft="\ueaf3" +linea_arrows_downright="\ueaf4" +linea_arrows_drag_down="\ueaf5" +linea_arrows_drag_down_dashed="\ueaf6" +linea_arrows_drag_horiz="\ueaf7" +linea_arrows_drag_left="\ueaf8" +linea_arrows_drag_left_dashed="\ueaf9" +linea_arrows_drag_right="\ueafa" +linea_arrows_drag_right_dashed="\ueafb" +linea_arrows_drag_up="\ueafc" +linea_arrows_drag_up_dashed="\ueafd" +linea_arrows_drag_vert="\ueafe" +linea_arrows_exclamation="\ueaff" +linea_arrows_expand="\ueb00" +linea_arrows_expand_diagonal1="\ueb01" +linea_arrows_expand_horizontal1="\ueb02" +linea_arrows_expand_vertical1="\ueb03" +linea_arrows_fit_horizontal="\ueb04" +linea_arrows_fit_vertical="\ueb05" +linea_arrows_glide="\ueb06" +linea_arrows_glide_horizontal="\ueb07" +linea_arrows_glide_vertical="\ueb08" +linea_arrows_hamburger1="\ueb09" +linea_arrows_hamburger_2="\ueb0a" +linea_arrows_horizontal="\ueb0b" +linea_arrows_info="\ueb0c" +linea_arrows_keyboard_alt="\ueb0d" +linea_arrows_keyboard_cmd="\ueb0e" +linea_arrows_keyboard_delete="\ueb0f" +linea_arrows_keyboard_down="\ueb10" +linea_arrows_keyboard_left="\ueb11" +linea_arrows_keyboard_return="\ueb12" +linea_arrows_keyboard_right="\ueb13" +linea_arrows_keyboard_shift="\ueb14" +linea_arrows_keyboard_tab="\ueb15" +linea_arrows_keyboard_up="\ueb16" +linea_arrows_left="\ueb17" +linea_arrows_left_double_32="\ueb18" +linea_arrows_minus="\ueb19" +linea_arrows_move="\ueb1a" +linea_arrows_move2="\ueb1b" +linea_arrows_move_bottom="\ueb1c" +linea_arrows_move_left="\ueb1d" +linea_arrows_move_right="\ueb1e" +linea_arrows_move_top="\ueb1f" +linea_arrows_plus="\ueb20" +linea_arrows_question="\ueb21" +linea_arrows_remove="\ueb22" +linea_arrows_right="\ueb23" +linea_arrows_right_double="\ueb24" +linea_arrows_rotate="\ueb25" +linea_arrows_rotate_anti="\ueb26" +linea_arrows_rotate_anti_dashed="\ueb27" +linea_arrows_rotate_dashed="\ueb28" +linea_arrows_shrink="\ueb29" +linea_arrows_shrink_diagonal1="\ueb2a" +linea_arrows_shrink_diagonal2="\ueb2b" +linea_arrows_shrink_horizonal2="\ueb2c" +linea_arrows_shrink_horizontal1="\ueb2d" +linea_arrows_shrink_vertical1="\ueb2e" +linea_arrows_shrink_vertical2="\ueb2f" +linea_arrows_sign_down="\ueb30" +linea_arrows_sign_left="\ueb31" +linea_arrows_sign_right="\ueb32" +linea_arrows_sign_up="\ueb33" +linea_arrows_slide_down1="\ueb34" +linea_arrows_slide_down2="\ueb35" +linea_arrows_slide_left1="\ueb36" +linea_arrows_slide_left2="\ueb37" +linea_arrows_slide_right1="\ueb38" +linea_arrows_slide_right2="\ueb39" +linea_arrows_slide_up1="\ueb3a" +linea_arrows_slide_up2="\ueb3b" +linea_arrows_slim_down="\ueb3c" +linea_arrows_slim_down_dashed="\ueb3d" +linea_arrows_slim_left="\ueb3e" +linea_arrows_slim_left_dashed="\ueb3f" +linea_arrows_slim_right="\ueb40" +linea_arrows_slim_right_dashed="\ueb41" +linea_arrows_slim_up="\ueb42" +linea_arrows_slim_up_dashed="\ueb43" +linea_arrows_square_check="\ueb44" +linea_arrows_square_down="\ueb45" +linea_arrows_square_downleft="\ueb46" +linea_arrows_square_downright="\ueb47" +linea_arrows_square_left="\ueb48" +linea_arrows_square_minus="\ueb49" +linea_arrows_square_plus="\ueb4a" +linea_arrows_square_remove="\ueb4b" +linea_arrows_square_right="\ueb4c" +linea_arrows_square_up="\ueb4d" +linea_arrows_square_upleft="\ueb4e" +linea_arrows_square_upright="\ueb4f" +linea_arrows_squares="\ueb50" +linea_arrows_stretch_diagonal1="\ueb51" +linea_arrows_stretch_diagonal2="\ueb52" +linea_arrows_stretch_diagonal3="\ueb53" +linea_arrows_stretch_diagonal4="\ueb54" +linea_arrows_stretch_horizontal1="\ueb55" +linea_arrows_stretch_horizontal2="\ueb56" +linea_arrows_stretch_vertical1="\ueb57" +linea_arrows_stretch_vertical2="\ueb58" +linea_arrows_switch_horizontal="\ueb59" +linea_arrows_switch_vertical="\ueb5a" +linea_arrows_up="\ueb5b" +linea_arrows_up_double_33="\ueb5c" +linea_arrows_upleft="\ueb5d" +linea_arrows_upright="\ueb5e" +linea_arrows_vertical="\ueb5f" +linea_basic_lock_open="\ueb60" +linea_basic_magic_mouse="\ueb61" +linea_basic_magnifier="\ueb62" +linea_basic_magnifier_minus="\ueb63" +linea_basic_magnifier_plus="\ueb64" +linea_basic_mail="\ueb65" +linea_basic_mail_multiple="\ueb66" +linea_basic_mail_open="\ueb67" +linea_basic_mail_open_text="\ueb68" +linea_basic_male="\ueb69" +linea_basic_map="\ueb6a" +linea_basic_message="\ueb6b" +linea_basic_message_multiple="\ueb6c" +linea_basic_message_txt="\ueb6d" +linea_basic_mixer2="\ueb6e" +linea_basic_info="\ueb6f" +linea_basic_ipod="\ueb70" +linea_basic_joypad="\ueb71" +linea_basic_key="\ueb72" +linea_basic_keyboard="\ueb73" +linea_basic_laptop="\ueb74" +linea_basic_life_buoy="\ueb75" +linea_basic_lightbulb="\ueb76" +linea_basic_link="\ueb77" +linea_basic_lock="\ueb78" +linea_basic_mouse="\ueb79" +linea_basic_notebook="\ueb7a" +linea_basic_notebook_pen="\ueb7b" +linea_basic_notebook_pencil="\ueb7c" +linea_basic_paperplane="\ueb7d" +linea_basic_pencil_ruler="\ueb7e" +linea_basic_pencil_ruler_pen="\ueb7f" +linea_basic_clubs="\ueb80" +linea_basic_compass="\ueb81" +linea_basic_cup="\ueb82" +linea_basic_diamonds="\ueb83" +linea_basic_display="\ueb84" +linea_basic_download="\ueb85" +linea_basic_exclamation="\ueb86" +linea_basic_eye="\ueb87" +linea_basic_eye_closed="\ueb88" +linea_basic_female="\ueb89" +linea_basic_flag1="\ueb8a" +linea_basic_flag2="\ueb8b" +linea_basic_floppydisk="\ueb8c" +linea_basic_folder="\ueb8d" +linea_basic_folder_multiple="\ueb8e" +linea_basic_gear="\ueb8f" +linea_basic_geolocalize_01="\ueb90" +linea_basic_geolocalize_05="\ueb91" +linea_basic_globe="\ueb92" +linea_basic_gunsight="\ueb93" +linea_basic_hammer="\ueb94" +linea_basic_headset="\ueb95" +linea_basic_heart="\ueb96" +linea_basic_heart_broken="\ueb97" +linea_basic_helm="\ueb98" +linea_basic_home="\ueb99" +linea_basic_photo="\ueb9a" +linea_basic_rss="\ueb9b" +linea_basic_picture="\ueb9c" +linea_basic_picture_multiple="\ueb9d" +linea_basic_pin1="\ueb9e" +linea_basic_pin2="\ueb9f" +linea_basic_accelerator="\ueba0" +linea_basic_alarm="\ueba1" +linea_basic_anchor="\ueba2" +linea_basic_anticlockwise="\ueba3" +linea_basic_archive="\ueba4" +linea_basic_archive_full="\ueba5" +linea_basic_ban="\ueba6" +linea_basic_battery_charge="\ueba7" +linea_basic_battery_empty="\ueba8" +linea_basic_battery_full="\ueba9" +linea_basic_battery_half="\uebaa" +linea_basic_bolt="\uebab" +linea_basic_book="\uebac" +linea_basic_book_pen="\uebad" +linea_basic_book_pencil="\uebae" +linea_basic_bookmark="\uebaf" +linea_basic_calculator="\uebb0" +linea_basic_calendar="\uebb1" +linea_basic_cards_diamonds="\uebb2" +linea_basic_cards_hearts="\uebb3" +linea_basic_case="\uebb4" +linea_basic_chronometer="\uebb5" +linea_basic_clessidre="\uebb6" +linea_basic_clock="\uebb7" +linea_basic_clockwise="\uebb8" +linea_basic_cloud="\uebb9" +linea_basic_postcard="\uebba" +linea_basic_postcard_multiple="\uebbb" +linea_basic_printer="\uebbc" +linea_basic_question="\uebbd" +linea_basic_server="\uebbe" +linea_basic_server2="\uebbf" +linea_basic_server_cloud="\uebc0" +linea_basic_server_download="\uebc1" +linea_basic_server_upload="\uebc2" +linea_basic_settings="\uebc3" +linea_basic_share="\uebc4" +linea_basic_sheet="\uebc5" +linea_basic_sheet_multiple="\uebc6" +linea_basic_sheet_pen="\uebc7" +linea_basic_sheet_pencil="\uebc8" +linea_basic_sheet_txt="\uebc9" +linea_basic_signs="\uebca" +linea_basic_smartphone="\uebcb" +linea_basic_spades="\uebcc" +linea_basic_spread="\uebcd" +linea_basic_spread_bookmark="\uebce" +linea_basic_spread_text="\uebcf" +linea_basic_spread_text_bookmark="\uebd0" +linea_basic_star="\uebd1" +linea_basic_tablet="\uebd2" +linea_basic_target="\uebd3" +linea_basic_todo="\uebd4" +linea_basic_todo_pen="\uebd5" +linea_basic_todo_pencil="\uebd6" +linea_basic_todo_txt="\uebd7" +linea_basic_todolist_pen="\uebd8" +linea_basic_todolist_pencil="\uebd9" +linea_basic_trashcan="\uebda" +linea_basic_trashcan_full="\uebdb" +linea_basic_trashcan_refresh="\uebdc" +linea_basic_trashcan_remove="\uebdd" +linea_basic_upload="\uebde" +linea_basic_usb="\uebdf" +linea_basic_video="\uebe0" +linea_basic_watch="\uebe1" +linea_basic_webpage="\uebe2" +linea_basic_webpage_img_txt="\uebe3" +linea_basic_webpage_multiple="\uebe4" +linea_basic_webpage_txt="\uebe5" +linea_basic_world="\uebe6" +linea_elaboration_document_previous="\uebe7" +linea_elaboration_document_refresh="\uebe8" +linea_elaboration_document_remove="\uebe9" +linea_elaboration_document_search="\uebea" +linea_elaboration_document_star="\uebeb" +linea_elaboration_document_upload="\uebec" +linea_elaboration_folder_check="\uebed" +linea_elaboration_folder_cloud="\uebee" +linea_elaboration_folder_document="\uebef" +linea_elaboration_folder_download="\uebf0" +linea_elaboration_folder_flagged="\uebf1" +linea_elaboration_folder_graph="\uebf2" +linea_elaboration_folder_heart="\uebf3" +linea_elaboration_folder_minus="\uebf4" +linea_elaboration_folder_next="\uebf5" +linea_elaboration_document_flagged="\uebf6" +linea_elaboration_document_graph="\uebf7" +linea_elaboration_document_heart="\uebf8" +linea_elaboration_document_minus="\uebf9" +linea_elaboration_document_next="\uebfa" +linea_elaboration_document_noaccess="\uebfb" +linea_elaboration_document_note="\uebfc" +linea_elaboration_document_pencil="\uebfd" +linea_elaboration_document_picture="\uebfe" +linea_elaboration_document_plus="\uebff" +linea_elaboration_folder_noaccess="\uec00" +linea_elaboration_folder_note="\uec01" +linea_elaboration_folder_pencil="\uec02" +linea_elaboration_folder_picture="\uec03" +linea_elaboration_folder_plus="\uec04" +linea_elaboration_folder_previous="\uec05" +linea_elaboration_folder_refresh="\uec06" +linea_elaboration_calendar_empty="\uec07" +linea_elaboration_calendar_flagged="\uec08" +linea_elaboration_calendar_heart="\uec09" +linea_elaboration_calendar_minus="\uec0a" +linea_elaboration_calendar_next="\uec0b" +linea_elaboration_calendar_noaccess="\uec0c" +linea_elaboration_calendar_pencil="\uec0d" +linea_elaboration_calendar_plus="\uec0e" +linea_elaboration_calendar_previous="\uec0f" +linea_elaboration_calendar_refresh="\uec10" +linea_elaboration_calendar_remove="\uec11" +linea_elaboration_calendar_search="\uec12" +linea_elaboration_calendar_star="\uec13" +linea_elaboration_calendar_upload="\uec14" +linea_elaboration_cloud_check="\uec15" +linea_elaboration_cloud_download="\uec16" +linea_elaboration_cloud_minus="\uec17" +linea_elaboration_cloud_noaccess="\uec18" +linea_elaboration_cloud_plus="\uec19" +linea_elaboration_cloud_refresh="\uec1a" +linea_elaboration_cloud_remove="\uec1b" +linea_elaboration_cloud_search="\uec1c" +linea_elaboration_cloud_upload="\uec1d" +linea_elaboration_document_check="\uec1e" +linea_elaboration_document_cloud="\uec1f" +linea_elaboration_document_download="\uec20" +linea_elaboration_folder_remove="\uec21" +linea_elaboration_mail_heart="\uec22" +linea_elaboration_folder_search="\uec23" +linea_elaboration_folder_star="\uec24" +linea_elaboration_folder_upload="\uec25" +linea_elaboration_mail_check="\uec26" +linea_elaboration_bookmark_checck="\uec27" +linea_elaboration_bookmark_minus="\uec28" +linea_elaboration_bookmark_plus="\uec29" +linea_elaboration_bookmark_remove="\uec2a" +linea_elaboration_briefcase_check="\uec2b" +linea_elaboration_briefcase_download="\uec2c" +linea_elaboration_briefcase_flagged="\uec2d" +linea_elaboration_briefcase_minus="\uec2e" +linea_elaboration_briefcase_plus="\uec2f" +linea_elaboration_briefcase_refresh="\uec30" +linea_elaboration_briefcase_remove="\uec31" +linea_elaboration_briefcase_search="\uec32" +linea_elaboration_briefcase_star="\uec33" +linea_elaboration_briefcase_upload="\uec34" +linea_elaboration_browser_check="\uec35" +linea_elaboration_browser_download="\uec36" +linea_elaboration_browser_minus="\uec37" +linea_elaboration_browser_plus="\uec38" +linea_elaboration_browser_refresh="\uec39" +linea_elaboration_browser_remove="\uec3a" +linea_elaboration_browser_search="\uec3b" +linea_elaboration_browser_star="\uec3c" +linea_elaboration_browser_upload="\uec3d" +linea_elaboration_calendar_check="\uec3e" +linea_elaboration_calendar_cloud="\uec3f" +linea_elaboration_calendar_download="\uec40" +linea_elaboration_mail_cloud="\uec41" +linea_elaboration_mail_document="\uec42" +linea_elaboration_mail_download="\uec43" +linea_elaboration_mail_flagged="\uec44" +linea_elaboration_mail_next="\uec45" +linea_elaboration_mail_noaccess="\uec46" +linea_elaboration_mail_note="\uec47" +linea_elaboration_mail_pencil="\uec48" +linea_elaboration_mail_picture="\uec49" +linea_elaboration_mail_previous="\uec4a" +linea_elaboration_mail_refresh="\uec4b" +linea_elaboration_mail_remove="\uec4c" +linea_elaboration_mail_search="\uec4d" +linea_elaboration_mail_star="\uec4e" +linea_elaboration_mail_upload="\uec4f" +linea_elaboration_message_check="\uec50" +linea_elaboration_message_dots="\uec51" +linea_elaboration_message_happy="\uec52" +linea_elaboration_message_heart="\uec53" +linea_elaboration_message_minus="\uec54" +linea_elaboration_message_note="\uec55" +linea_elaboration_message_plus="\uec56" +linea_elaboration_message_refresh="\uec57" +linea_elaboration_message_remove="\uec58" +linea_elaboration_message_sad="\uec59" +linea_elaboration_smartphone_cloud="\uec5a" +linea_elaboration_smartphone_heart="\uec5b" +linea_elaboration_smartphone_noaccess="\uec5c" +linea_elaboration_smartphone_note="\uec5d" +linea_elaboration_smartphone_pencil="\uec5e" +linea_elaboration_smartphone_picture="\uec5f" +linea_elaboration_smartphone_refresh="\uec60" +linea_elaboration_smartphone_search="\uec61" +linea_elaboration_tablet_cloud="\uec62" +linea_elaboration_tablet_heart="\uec63" +linea_elaboration_tablet_noaccess="\uec64" +linea_elaboration_tablet_note="\uec65" +linea_elaboration_tablet_pencil="\uec66" +linea_elaboration_tablet_picture="\uec67" +linea_elaboration_tablet_refresh="\uec68" +linea_elaboration_tablet_search="\uec69" +linea_elaboration_todolist_2="\uec6a" +linea_elaboration_todolist_check="\uec6b" +linea_elaboration_todolist_cloud="\uec6c" +linea_elaboration_todolist_download="\uec6d" +linea_elaboration_todolist_flagged="\uec6e" +linea_elaboration_todolist_minus="\uec6f" +linea_elaboration_todolist_noaccess="\uec70" +linea_elaboration_todolist_pencil="\uec71" +linea_elaboration_todolist_plus="\uec72" +linea_elaboration_todolist_refresh="\uec73" +linea_elaboration_todolist_remove="\uec74" +linea_elaboration_todolist_search="\uec75" +linea_elaboration_todolist_star="\uec76" +linea_elaboration_todolist_upload="\uec77" +linea_ecommerce_receipt_kips="\uec78" +linea_ecommerce_receipt_lira="\uec79" +linea_ecommerce_receipt_naira="\uec7a" +linea_ecommerce_receipt_pesos="\uec7b" +linea_ecommerce_receipt_pound="\uec7c" +linea_ecommerce_receipt_rublo="\uec7d" +linea_ecommerce_receipt_rupee="\uec7e" +linea_ecommerce_receipt_tugrik="\uec7f" +linea_ecommerce_receipt_won="\uec80" +linea_ecommerce_receipt_yen="\uec81" +linea_ecommerce_receipt_yen2="\uec82" +linea_ecommerce_recept_colon="\uec83" +linea_ecommerce_rublo="\uec84" +linea_ecommerce_rupee="\uec85" +linea_ecommerce_safe="\uec86" +linea_ecommerce_naira="\uec87" +linea_ecommerce_pesos="\uec88" +linea_ecommerce_pound="\uec89" +linea_ecommerce_receipt="\uec8a" +linea_ecommerce_receipt_bath="\uec8b" +linea_ecommerce_receipt_cent="\uec8c" +linea_ecommerce_receipt_dollar="\uec8d" +linea_ecommerce_receipt_euro="\uec8e" +linea_ecommerce_receipt_franc="\uec8f" +linea_ecommerce_receipt_guarani="\uec90" +linea_ecommerce_sale="\uec91" +linea_ecommerce_sales="\uec92" +linea_ecommerce_ticket="\uec93" +linea_ecommerce_tugriks="\uec94" +linea_ecommerce_wallet="\uec95" +linea_ecommerce_won="\uec96" +linea_ecommerce_yen="\uec97" +linea_ecommerce_cart_content="\uec98" +linea_ecommerce_cart_download="\uec99" +linea_ecommerce_cart_minus="\uec9a" +linea_ecommerce_cart_plus="\uec9b" +linea_ecommerce_cart_refresh="\uec9c" +linea_ecommerce_cart_remove="\uec9d" +linea_ecommerce_cart_search="\uec9e" +linea_ecommerce_cart_upload="\uec9f" +linea_ecommerce_cent="\ueca0" +linea_ecommerce_colon="\ueca1" +linea_ecommerce_creditcard="\ueca2" +linea_ecommerce_diamond="\ueca3" +linea_ecommerce_dollar="\ueca4" +linea_ecommerce_euro="\ueca5" +linea_ecommerce_franc="\ueca6" +linea_ecommerce_gift="\ueca7" +linea_ecommerce_graph1="\ueca8" +linea_ecommerce_graph2="\ueca9" +linea_ecommerce_graph3="\uecaa" +linea_ecommerce_graph_decrease="\uecab" +linea_ecommerce_graph_increase="\uecac" +linea_ecommerce_guarani="\uecad" +linea_ecommerce_kips="\uecae" +linea_ecommerce_lira="\uecaf" +linea_ecommerce_megaphone="\uecb0" +linea_ecommerce_money="\uecb1" +linea_ecommerce_yen2="\uecb2" +linea_ecommerce_bag="\uecb3" +linea_ecommerce_bag_check="\uecb4" +linea_ecommerce_bag_cloud="\uecb5" +linea_ecommerce_bag_download="\uecb6" +linea_ecommerce_bag_minus="\uecb7" +linea_ecommerce_bag_plus="\uecb8" +linea_ecommerce_bag_refresh="\uecb9" +linea_ecommerce_bag_remove="\uecba" +linea_ecommerce_bag_search="\uecbb" +linea_ecommerce_bag_upload="\uecbc" +linea_ecommerce_banknote="\uecbd" +linea_ecommerce_banknotes="\uecbe" +linea_ecommerce_basket="\uecbf" +linea_ecommerce_basket_check="\uecc0" +linea_ecommerce_basket_cloud="\uecc1" +linea_ecommerce_basket_download="\uecc2" +linea_ecommerce_basket_minus="\uecc3" +linea_ecommerce_basket_plus="\uecc4" +linea_ecommerce_basket_refresh="\uecc5" +linea_ecommerce_basket_remove="\uecc6" +linea_ecommerce_basket_search="\uecc7" +linea_ecommerce_basket_upload="\uecc8" +linea_ecommerce_bath="\uecc9" +linea_ecommerce_cart="\uecca" +linea_ecommerce_cart_check="\ueccb" +linea_ecommerce_cart_cloud="\ueccc" +linea_music_stop_button="\ueccd" +linea_music_tape="\uecce" +linea_music_volume_down="\ueccf" +linea_music_volume_up="\uecd0" +linea_music_beginning_button="\uecd1" +linea_music_bell="\uecd2" +linea_music_cd="\uecd3" +linea_music_diapason="\uecd4" +linea_music_eject_button="\uecd5" +linea_music_end_button="\uecd6" +linea_music_fastforward_button="\uecd7" +linea_music_headphones="\uecd8" +linea_music_ipod="\uecd9" +linea_music_loudspeaker="\uecda" +linea_music_microphone="\uecdb" +linea_music_microphone_old="\uecdc" +linea_music_mixer="\uecdd" +linea_music_mute="\uecde" +linea_music_note_multiple="\uecdf" +linea_music_note_single="\uece0" +linea_music_pause_button="\uece1" +linea_music_play_button="\uece2" +linea_music_playlist="\uece3" +linea_music_radio_ghettoblaster="\uece4" +linea_music_radio_portable="\uece5" +linea_music_record="\uece6" +linea_music_recordplayer="\uece7" +linea_music_repeat_button="\uece8" +linea_music_rewind_button="\uece9" +linea_music_shuffle_button="\uecea" +linea_software_paragraph_justify_center="\ueceb" +linea_software_paragraph_justify_left="\uecec" +linea_software_paragraph_justify_right="\ueced" +linea_software_paragraph_space_after="\uecee" +linea_software_paragraph_space_before="\uecef" +linea_software_pathfinder_exclude="\uecf0" +linea_software_pathfinder_intersect="\uecf1" +linea_software_pathfinder_subtract="\uecf2" +linea_software_pathfinder_unite="\uecf3" +linea_software_pen="\uecf4" +linea_software_pen_add="\uecf5" +linea_software_pen_remove="\uecf6" +linea_software_pencil="\uecf7" +linea_software_polygonallasso="\uecf8" +linea_software_reflect_horizontal="\uecf9" +linea_software_magnete="\uecfa" +linea_software_pages="\uecfb" +linea_software_paintbrush="\uecfc" +linea_software_paintbucket="\uecfd" +linea_software_paintroller="\uecfe" +linea_software_paragraph="\uecff" +linea_software_paragraph_align_left="\ued00" +linea_software_paragraph_align_right="\ued01" +linea_software_paragraph_center="\ued02" +linea_software_paragraph_justify_all="\ued03" +linea_software_reflect_vertical="\ued04" +linea_software_remove_vectorpoint="\ued05" +linea_software_scale_expand="\ued06" +linea_software_scale_reduce="\ued07" +linea_software_selection_oval="\ued08" +linea_software_selection_polygon="\ued09" +linea_software_selection_rectangle="\ued0a" +linea_software_indent_firstline="\ued0b" +linea_software_indent_left="\ued0c" +linea_software_indent_right="\ued0d" +linea_software_lasso="\ued0e" +linea_software_layers1="\ued0f" +linea_software_layers2="\ued10" +linea_software_layout="\ued11" +linea_software_layout_2columns="\ued12" +linea_software_layout_3columns="\ued13" +linea_software_layout_4boxes="\ued14" +linea_software_layout_4columns="\ued15" +linea_software_layout_4lines="\ued16" +linea_software_layout_8boxes="\ued17" +linea_software_layout_header="\ued18" +linea_software_layout_header_2columns="\ued19" +linea_software_layout_header_3columns="\ued1a" +linea_software_layout_header_4boxes="\ued1b" +linea_software_layout_header_4columns="\ued1c" +linea_software_layout_header_complex="\ued1d" +linea_software_layout_header_complex2="\ued1e" +linea_software_layout_header_complex3="\ued1f" +linea_software_layout_header_complex4="\ued20" +linea_software_layout_header_sideleft="\ued21" +linea_software_layout_header_sideright="\ued22" +linea_software_layout_sidebar_left="\ued23" +linea_software_layout_sidebar_right="\ued24" +linea_software_selection_roundedrectangle="\ued25" +linea_software_vector_line="\ued26" +linea_software_shape_oval="\ued27" +linea_software_shape_polygon="\ued28" +linea_software_shape_rectangle="\ued29" +linea_software_shape_roundedrectangle="\ued2a" +linea_software_add_vectorpoint="\ued2b" +linea_software_box_oval="\ued2c" +linea_software_box_polygon="\ued2d" +linea_software_box_rectangle="\ued2e" +linea_software_box_roundedrectangle="\ued2f" +linea_software_character="\ued30" +linea_software_crop="\ued31" +linea_software_eyedropper="\ued32" +linea_software_font_allcaps="\ued33" +linea_software_font_baseline_shift="\ued34" +linea_software_font_horizontal_scale="\ued35" +linea_software_font_kerning="\ued36" +linea_software_font_leading="\ued37" +linea_software_font_size="\ued38" +linea_software_font_smallcapital="\ued39" +linea_software_font_smallcaps="\ued3a" +linea_software_font_strikethrough="\ued3b" +linea_software_font_tracking="\ued3c" +linea_software_font_underline="\ued3d" +linea_software_font_vertical_scale="\ued3e" +linea_software_horizontal_align_center="\ued3f" +linea_software_horizontal_align_left="\ued40" +linea_software_horizontal_align_right="\ued41" +linea_software_horizontal_distribute_center="\ued42" +linea_software_horizontal_distribute_left="\ued43" +linea_software_horizontal_distribute_right="\ued44" +linea_software_slice="\ued45" +linea_software_transform_bezier="\ued46" +linea_software_vector_box="\ued47" +linea_software_vector_composite="\ued48" +linea_software_vertical_align_bottom="\ued49" +linea_software_vertical_align_center="\ued4a" +linea_software_vertical_align_top="\ued4b" +linea_software_vertical_distribute_bottom="\ued4c" +linea_software_vertical_distribute_center="\ued4d" +linea_software_vertical_distribute_top="\ued4e" +linea_weather_aquarius="\ued4f" +linea_weather_aries="\ued50" +linea_weather_cancer="\ued51" +linea_weather_capricorn="\ued52" +linea_weather_cloud="\ued53" +linea_weather_cloud_drop="\ued54" +linea_weather_cloud_lightning="\ued55" +linea_weather_cloud_snowflake="\ued56" +linea_weather_downpour_fullmoon="\ued57" +linea_weather_downpour_halfmoon="\ued58" +linea_weather_downpour_sun="\ued59" +linea_weather_drop="\ued5a" +linea_weather_first_quarter="\ued5b" +linea_weather_fog="\ued5c" +linea_weather_fog_fullmoon="\ued5d" +linea_weather_fog_halfmoon="\ued5e" +linea_weather_fog_sun="\ued5f" +linea_weather_fullmoon="\ued60" +linea_weather_gemini="\ued61" +linea_weather_hail="\ued62" +linea_weather_hail_fullmoon="\ued63" +linea_weather_hail_halfmoon="\ued64" +linea_weather_hail_sun="\ued65" +linea_weather_last_quarter="\ued66" +linea_weather_leo="\ued67" +linea_weather_libra="\ued68" +linea_weather_lightning="\ued69" +linea_weather_mistyrain="\ued6a" +linea_weather_mistyrain_fullmoon="\ued6b" +linea_weather_mistyrain_halfmoon="\ued6c" +linea_weather_mistyrain_sun="\ued6d" +linea_weather_moon="\ued6e" +linea_weather_moondown_full="\ued6f" +linea_weather_moondown_half="\ued70" +linea_weather_moonset_full="\ued71" +linea_weather_moonset_half="\ued72" +linea_weather_move2="\ued73" +linea_weather_newmoon="\ued74" +linea_weather_pisces="\ued75" +linea_weather_rain="\ued76" +linea_weather_rain_fullmoon="\ued77" +linea_weather_rain_halfmoon="\ued78" +linea_weather_rain_sun="\ued79" +linea_weather_sagittarius="\ued7a" +linea_weather_scorpio="\ued7b" +linea_weather_snow="\ued7c" +linea_weather_snow_fullmoon="\ued7d" +linea_weather_snow_halfmoon="\ued7e" +linea_weather_snow_sun="\ued7f" +linea_weather_snowflake="\ued80" +linea_weather_star="\ued81" +linea_weather_storm_11="\ued82" +linea_weather_storm_32="\ued83" +linea_weather_storm_fullmoon="\ued84" +linea_weather_storm_halfmoon="\ued85" +linea_weather_storm_sun="\ued86" +linea_weather_sun="\ued87" +linea_weather_sundown="\ued88" +linea_weather_sunset="\ued89" +linea_weather_taurus="\ued8a" +linea_weather_tempest="\ued8b" +linea_weather_tempest_fullmoon="\ued8c" +linea_weather_tempest_halfmoon="\ued8d" +linea_weather_tempest_sun="\ued8e" +linea_weather_variable_fullmoon="\ued8f" +linea_weather_variable_halfmoon="\ued90" +linea_weather_variable_sun="\ued91" +linea_weather_virgo="\ued92" +linea_weather_waning_cresent="\ued93" +linea_weather_waning_gibbous="\ued94" +linea_weather_waxing_cresent="\ued95" +linea_weather_waxing_gibbous="\ued96" +linea_weather_wind="\ued97" +linea_weather_wind_e="\ued98" +linea_weather_wind_fullmoon="\ued99" +linea_weather_wind_halfmoon="\ued9a" +linea_weather_wind_n="\ued9b" +linea_weather_wind_ne="\ued9c" +linea_weather_wind_nw="\ued9d" +linea_weather_wind_s="\ued9e" +linea_weather_wind_se="\ued9f" +linea_weather_wind_sun="\ueda0" +linea_weather_wind_sw="\ueda1" +linea_weather_wind_w="\ueda2" +linea_weather_windgust="\ueda3" +mfizz_3dprint="\ueda4" +mfizz_alpinelinux="\ueda5" +mfizz_angular="\ueda6" +mfizz_angular_alt="\ueda7" +mfizz_antenna="\ueda8" +mfizz_apache="\ueda9" +mfizz_archlinux="\uedaa" +mfizz_aws="\uedab" +mfizz_azure="\uedac" +mfizz_backbone="\uedad" +mfizz_blackberry="\uedae" +mfizz_bomb="\uedaf" +mfizz_bootstrap="\uedb0" +mfizz_c="\uedb1" +mfizz_cassandra="\uedb2" +mfizz_centos="\uedb3" +mfizz_clojure="\uedb4" +mfizz_codeigniter="\uedb5" +mfizz_codepen="\uedb6" +mfizz_coffee_bean="\uedb7" +mfizz_cplusplus="\uedb8" +mfizz_csharp="\uedb9" +mfizz_css="\uedba" +mfizz_css3="\uedbb" +mfizz_css3_alt="\uedbc" +mfizz_d3="\uedbd" +mfizz_database="\uedbe" +mfizz_database_alt="\uedbf" +mfizz_database_alt2="\uedc0" +mfizz_debian="\uedc1" +mfizz_docker="\uedc2" +mfizz_dreamhost="\uedc3" +mfizz_elixir="\uedc4" +mfizz_elm="\uedc5" +mfizz_erlang="\uedc6" +mfizz_exherbo="\uedc7" +mfizz_fedora="\uedc8" +mfizz_fire_alt="\uedc9" +mfizz_freebsd="\uedca" +mfizz_freecodecamp="\uedcb" +mfizz_gentoo="\uedcc" +mfizz_ghost="\uedcd" +mfizz_git="\uedce" +mfizz_gnome="\uedcf" +mfizz_go="\uedd0" +mfizz_go_alt="\uedd1" +mfizz_google="\uedd2" +mfizz_google_alt="\uedd3" +mfizz_google_code="\uedd4" +mfizz_google_developers="\uedd5" +mfizz_gradle="\uedd6" +mfizz_grails="\uedd7" +mfizz_grails_alt="\uedd8" +mfizz_grunt="\uedd9" +mfizz_gulp="\uedda" +mfizz_gulp_alt="\ueddb" +mfizz_hadoop="\ueddc" +mfizz_haskell="\ueddd" +mfizz_heroku="\uedde" +mfizz_html="\ueddf" +mfizz_html5="\uede0" +mfizz_html5_alt="\uede1" +mfizz_iphone="\uede2" +mfizz_java="\uede3" +mfizz_java_bold="\uede4" +mfizz_java_duke="\uede5" +mfizz_javascript="\uede6" +mfizz_javascript_alt="\uede7" +mfizz_jetty="\uede8" +mfizz_jquery="\uede9" +mfizz_kde="\uedea" +mfizz_laravel="\uedeb" +mfizz_line_graph="\uedec" +mfizz_linux_mint="\ueded" +mfizz_looking="\uedee" +mfizz_magento="\uedef" +mfizz_mariadb="\uedf0" +mfizz_maven="\uedf1" +mfizz_microscope="\uedf2" +mfizz_mobile_device="\uedf3" +mfizz_mobile_phone_alt="\uedf4" +mfizz_mobile_phone_broadcast="\uedf5" +mfizz_mongodb="\uedf6" +mfizz_mssql="\uedf7" +mfizz_mysql="\uedf8" +mfizz_mysql_alt="\uedf9" +mfizz_netbsd="\uedfa" +mfizz_nginx="\uedfb" +mfizz_nginx_alt="\uedfc" +mfizz_nginx_alt2="\uedfd" +mfizz_nodejs="\uedfe" +mfizz_npm="\uedff" +mfizz_objc="\uee00" +mfizz_openshift="\uee01" +mfizz_oracle="\uee02" +mfizz_oracle_alt="\uee03" +mfizz_osx="\uee04" +mfizz_perl="\uee05" +mfizz_phone_alt="\uee06" +mfizz_phone_gap="\uee07" +mfizz_phone_retro="\uee08" +mfizz_php="\uee09" +mfizz_php_alt="\uee0a" +mfizz_playframework="\uee0b" +mfizz_playframework_alt="\uee0c" +mfizz_plone="\uee0d" +mfizz_postgres="\uee0e" +mfizz_postgres_alt="\uee0f" +mfizz_python="\uee10" +mfizz_raspberrypi="\uee11" +mfizz_reactjs="\uee12" +mfizz_redhat="\uee13" +mfizz_redis="\uee14" +mfizz_ruby="\uee15" +mfizz_ruby_on_rails="\uee16" +mfizz_ruby_on_rails_alt="\uee17" +mfizz_rust="\uee18" +mfizz_sass="\uee19" +mfizz_satellite="\uee1a" +mfizz_scala="\uee1b" +mfizz_scala_alt="\uee1c" +mfizz_script="\uee1d" +mfizz_script_alt="\uee1e" +mfizz_shell="\uee1f" +mfizz_sitefinity="\uee20" +mfizz_solaris="\uee21" +mfizz_splatter="\uee22" +mfizz_spring="\uee23" +mfizz_suse="\uee24" +mfizz_svg="\uee25" +mfizz_symfony="\uee26" +mfizz_tomcat="\uee27" +mfizz_ubuntu="\uee28" +mfizz_unity="\uee29" +mfizz_wireless="\uee2a" +mfizz_wordpress="\uee2b" +mfizz_x11="\uee2c" +firacode_asterisk="\uee2d" +firacode_plus="\uee2e" +firacode_hyphen="\uee2f" +firacode_sad="\uee30" +firacode_w_w_w="\uee31" +firacode_asterisk_asterisk="\uee32" +firacode_asterisk_asterisk_asterisk="\uee33" +firacode_asterisk_asterisk_slash="\uee34" +firacode_asterisk_greater="\uee35" +firacode_asterisk_slash="\uee36" +firacode_backslash_backslash="\uee37" +firacode_bbb="\uee38" +firacode_braceleft_hyphen="\uee39" +firacode_bracketleft_bracketright="\uee3a" +firacode_colon_colon="\uee3b" +firacode_colon_colon_colon="\uee3c" +firacode_colon_equal="\uee3d" +firacode_exclam_exclam="\uee3e" +firacode_exclam_equal="\uee3f" +firacode_exclam_equal_equal="\uee40" +firacode_hyphen_braceright="\uee41" +firacode_hyphen_hyphen="\uee42" +firacode_hyphen_hyphen_hyphen="\uee43" +firacode_hyphen_hyphen_greater="\uee44" +firacode_hyphen_greater="\uee45" +firacode_hyphen_greater_greater="\uee46" +firacode_hyphen_less="\uee47" +firacode_hyphen_less_less="\uee48" +firacode_hyphen_asciitilde="\uee49" +firacode_numbersign_braceleft="\uee4a" +firacode_numbersign_bracketleft="\uee4b" +firacode_numbersign_numbersign="\uee4c" +firacode_nnn="\uee4d" +firacode_nnnn="\uee4e" +firacode_numbersign_parenleft="\uee4f" +firacode_numbersign_question="\uee50" +firacode_numbersign_underscore="\uee51" +firacode_nup="\uee52" +firacode_period_hyphen="\uee53" +firacode_period_equal="\uee54" +firacode_period_period="\uee55" +firacode_period_period_less="\uee56" +firacode_period_period_period="\uee57" +firacode_question_equal="\uee58" +firacode_question_question="\uee59" +firacode_semicolon_semicolon="\uee5a" +firacode_slash_asterisk="\uee5b" +firacode_slash_asterisk_asterisk="\uee5c" +firacode_slash_equal="\uee5d" +firacode_slash_equal_equal="\uee5e" +firacode_slash_greater="\uee5f" +firacode_slash_slash="\uee60" +firacode_slash_slash_slash="\uee61" +firacode_ampersand_ampersand="\uee62" +firacode_bar_bar="\uee63" +firacode_bar_bar_equal="\uee64" +firacode_bar_equal="\uee65" +firacode_bar_greater="\uee66" +firacode_asciicircum_equal="\uee67" +firacode_dollar_greater="\uee68" +firacode_plus_plus="\uee69" +firacode_plus_plus_plus="\uee6a" +firacode_plus_greater="\uee6b" +firacode_equal_colon_equal="\uee6c" +firacode_equal_equal="\uee6d" +firacode_equal_equal_equal="\uee6e" +firacode_equal_equal_greater="\uee6f" +firacode_equal_greater="\uee70" +firacode_equal_greater_greater="\uee71" +firacode_equal_less="\uee72" +firacode_equal_less_less="\uee73" +firacode_equal_slash_equal="\uee74" +firacode_greater_hyphen="\uee75" +firacode_greater_equal="\uee76" +firacode_greater_equal_greater="\uee77" +firacode_greater_greater="\uee78" +firacode_greater_greater_hyphen="\uee79" +firacode_greater_greater_equal="\uee7a" +firacode_greater_greater_greater="\uee7b" +firacode_less_asterisk="\uee7c" +firacode_less_asterisk_greater="\uee7d" +firacode_less_bar="\uee7e" +firacode_less_bar_greater="\uee7f" +firacode_less_dollar="\uee80" +firacode_less_dollar_greater="\uee81" +firacode_less_exclam_hyphen_hyphen="\uee82" +firacode_less_hyphen="\uee83" +firacode_less_hyphen_hyphen="\uee84" +firacode_less_hyphen_greater="\uee85" +firacode_less_plus="\uee86" +firacode_less_plus_greater="\uee87" +firacode_less_equal="\uee88" +firacode_less_equal_equal="\uee89" +firacode_less_equal_greater="\uee8a" +firacode_less_equal_less="\uee8b" +firacode_less_greater="\uee8c" +firacode_less_less="\uee8d" +firacode_less_less_hyphen="\uee8e" +firacode_less_less_equal="\uee8f" +firacode_less_less_less="\uee90" +firacode_less_asciitilde="\uee91" +firacode_less_asciitilde_asciitilde="\uee92" +firacode_less_slash="\uee93" +firacode_less_slash_greater="\uee94" +firacode_asciitilde_at="\uee95" +firacode_asciitilde_hyphen="\uee96" +firacode_asciitilde_equal="\uee97" +firacode_asciitilde_greater="\uee98" +firacode_asciitilde_asciitilde="\uee99" +firacode_aag="\uee9a" +firacode_percent_percent="\uee9b" +firacode_x_multiply="\uee9c" +firacode_colon_uc="\uee9d" +firacode_plus_lc="\uee9e" +firacode_plus_tosf2="\uee9f" +firacode_nameme_1114119="\ueea0" diff --git a/nnn-4.9/icons-in-terminal/build/icons_bash_export.sh b/nnn-4.9/icons-in-terminal/build/icons_bash_export.sh @@ -0,0 +1,3730 @@ +export powerline_branch="\ue0a0" +export powerline_line_number="\ue0a1" +export powerline_readonly="\ue0a2" +export powerline_extra_column_number="\ue0a3" +export powerline_left_hard_divider="\ue0b0" +export powerline_left_soft_divider="\ue0b1" +export powerline_right_hard_divider="\ue0b2" +export powerline_right_soft_divider="\ue0b3" +export powerline_extra_right_half_circle_thick="\ue0b4" +export powerline_extra_right_half_circle_thin="\ue0b5" +export powerline_extra_left_half_circle_thick="\ue0b6" +export powerline_extra_left_half_circle_thin="\ue0b7" +export powerline_extra_lower_left_triangle="\ue0b8" +export powerline_extra_backslash_separator="\ue0b9" +export powerline_extra_lower_right_triangle="\ue0ba" +export powerline_extra_forwardslash_separator="\ue0bb" +export powerline_extra_upper_left_triangle="\ue0bc" +export powerline_extra_forwardslash_separator_redundant="\ue0bd" +export powerline_extra_upper_right_triangle="\ue0be" +export powerline_extra_backslash_separator_redundant="\ue0bf" +export powerline_extra_flame_thick="\ue0c0" +export powerline_extra_flame_thin="\ue0c1" +export powerline_extra_flame_thick_mirrored="\ue0c2" +export powerline_extra_flame_thin_mirrored="\ue0c3" +export powerline_extra_pixelated_squares_small="\ue0c4" +export powerline_extra_pixelated_squares_small_mirrored="\ue0c5" +export powerline_extra_pixelated_squares_big="\ue0c6" +export powerline_extra_pixelated_squares_big_mirrored="\ue0c7" +export powerline_extra_ice_waveform="\ue0c8" +export powerline_extra_ice_waveform_mirrored="\ue0ca" +export powerline_extra_honeycomb="\ue0cc" +export powerline_extra_honeycomb_outline="\ue0cd" +export powerline_extra_lego_separator="\ue0ce" +export powerline_extra_lego_separator_thin="\ue0cf" +export powerline_extra_lego_block_facing="\ue0d0" +export powerline_extra_lego_block_sideways="\ue0d1" +export powerline_extra_trapezoid_top_bottom="\ue0d2" +export powerline_extra_trapezoid_top_bottom_mirrored="\ue0d4" +export oct_heart="\ue000" +export oct_zap="\ue001" +export oct_light_bulb="\ue002" +export oct_repo="\ue003" +export oct_repo_forked="\ue004" +export oct_repo_push="\ue005" +export oct_repo_pull="\ue006" +export oct_book="\ue007" +export oct_octoface="\ue008" +export oct_git_pull_request="\ue009" +export oct_mark_github="\ue00a" +export oct_cloud_download="\ue00b" +export oct_cloud_upload="\ue00c" +export oct_keyboard="\ue00d" +export oct_gist="\ue00e" +export oct_file_code="\ue00f" +export oct_file_text="\ue010" +export oct_file_media="\ue011" +export oct_file_zip="\ue012" +export oct_file_pdf="\ue013" +export oct_tag="\ue014" +export oct_file_directory="\ue015" +export oct_file_submodule="\ue016" +export oct_person="\ue017" +export oct_jersey="\ue018" +export oct_git_commit="\ue019" +export oct_git_branch="\ue01a" +export oct_git_merge="\ue01b" +export oct_mirror="\ue01c" +export oct_issue_opened="\ue01d" +export oct_issue_reopened="\ue01e" +export oct_issue_closed="\ue01f" +export oct_star="\ue020" +export oct_comment="\ue021" +export oct_question="\ue022" +export oct_alert="\ue023" +export oct_search="\ue024" +export oct_gear="\ue025" +export oct_radio_tower="\ue026" +export oct_tools="\ue027" +export oct_sign_out="\ue028" +export oct_rocket="\ue029" +export oct_rss="\ue02a" +export oct_clippy="\ue02b" +export oct_sign_in="\ue02c" +export oct_organization="\ue02d" +export oct_device_mobile="\ue02e" +export oct_unfold="\ue02f" +export oct_check="\ue030" +export oct_mail="\ue031" +export oct_mail_read="\ue032" +export oct_arrow_up="\ue033" +export oct_arrow_right="\ue034" +export oct_arrow_down="\ue035" +export oct_arrow_left="\ue036" +export oct_pin="\ue037" +export oct_gift="\ue038" +export oct_graph="\ue039" +export oct_triangle_left="\ue03a" +export oct_credit_card="\ue03b" +export oct_clock="\ue03c" +export oct_ruby="\ue03d" +export oct_broadcast="\ue03e" +export oct_key="\ue03f" +export oct_repo_force_push="\ue040" +export oct_repo_clone="\ue041" +export oct_diff="\ue042" +export oct_eye="\ue043" +export oct_comment_discussion="\ue044" +export oct_mail_reply="\ue045" +export oct_primitive_dot="\ue046" +export oct_primitive_square="\ue047" +export oct_device_camera="\ue048" +export oct_device_camera_video="\ue049" +export oct_pencil="\ue04a" +export oct_info="\ue04b" +export oct_triangle_right="\ue04c" +export oct_triangle_down="\ue04d" +export oct_link="\ue04e" +export oct_plus="\ue04f" +export oct_three_bars="\ue050" +export oct_code="\ue051" +export oct_location="\ue052" +export oct_list_unordered="\ue053" +export oct_list_ordered="\ue054" +export oct_quote="\ue055" +export oct_versions="\ue056" +export oct_calendar="\ue057" +export oct_lock="\ue058" +export oct_diff_added="\ue059" +export oct_diff_removed="\ue05a" +export oct_diff_modified="\ue05b" +export oct_diff_renamed="\ue05c" +export oct_horizontal_rule="\ue05d" +export oct_arrow_small_right="\ue05e" +export oct_milestone="\ue05f" +export oct_checklist="\ue060" +export oct_megaphone="\ue061" +export oct_chevron_right="\ue062" +export oct_bookmark="\ue063" +export oct_settings="\ue064" +export oct_dashboard="\ue065" +export oct_history="\ue066" +export oct_link_external="\ue067" +export oct_mute="\ue068" +export oct_x="\ue069" +export oct_circle_slash="\ue06a" +export oct_pulse="\ue06b" +export oct_sync="\ue06c" +export oct_telescope="\ue06d" +export oct_gist_secret="\ue06e" +export oct_home="\ue06f" +export oct_stop="\ue070" +export oct_bug="\ue071" +export oct_logo_github="\ue072" +export oct_file_binary="\ue073" +export oct_database="\ue074" +export oct_server="\ue075" +export oct_diff_ignored="\ue076" +export oct_ellipsis="\ue077" +export oct_no_newline="\ue078" +export oct_hubot="\ue079" +export oct_arrow_small_up="\ue07a" +export oct_arrow_small_down="\ue07b" +export oct_arrow_small_left="\ue07c" +export oct_chevron_up="\ue07d" +export oct_chevron_down="\ue07e" +export oct_chevron_left="\ue07f" +export oct_triangle_up="\ue080" +export oct_git_compare="\ue081" +export oct_logo_gist="\ue082" +export oct_file_symlink_file="\ue083" +export oct_file_symlink_directory="\ue084" +export oct_squirrel="\ue085" +export oct_globe="\ue086" +export oct_unmute="\ue087" +export oct_mention="\ue088" +export oct_package="\ue089" +export oct_browser="\ue08a" +export oct_terminal="\ue08b" +export oct_markdown="\ue08c" +export oct_dash="\ue08d" +export oct_fold="\ue08e" +export oct_inbox="\ue08f" +export oct_trashcan="\ue090" +export oct_paintcan="\ue091" +export oct_flame="\ue092" +export oct_briefcase="\ue093" +export oct_plug="\ue094" +export oct_circuit_board="\ue095" +export oct_mortar_board="\ue096" +export oct_law="\ue097" +export oct_thumbsup="\ue098" +export oct_thumbsdown="\ue099" +export oct_desktop_download="\ue09a" +export oct_beaker="\ue09b" +export oct_bell="\ue09c" +export oct_watch="\ue09d" +export oct_shield="\ue09e" +export oct_bold="\ue09f" +export oct_text_size="\ue0d5" +export oct_italic="\ue0d6" +export oct_tasklist="\ue0d7" +export oct_verified="\ue0d8" +export oct_smiley="\ue0d9" +export oct_unverified="\ue0da" +export oct_ellipses="\ue0db" +export oct_file="\ue0dc" +export oct_grabber="\ue0dd" +export oct_plus_small="\ue0de" +export oct_reply="\ue0df" +export oct_device_desktop="\ue0e0" +export fa_glass="\ue0e1" +export fa_music="\ue0e2" +export fa_search="\ue0e3" +export fa_envelope_o="\ue0e4" +export fa_heart="\ue0e5" +export fa_star="\ue0e6" +export fa_star_o="\ue0e7" +export fa_user="\ue0e8" +export fa_film="\ue0e9" +export fa_th_large="\ue0ea" +export fa_th="\ue0eb" +export fa_th_list="\ue0ec" +export fa_check="\ue0ed" +export fa_close="\ue0ee" +export fa_search_plus="\ue0ef" +export fa_search_minus="\ue0f0" +export fa_power_off="\ue0f1" +export fa_signal="\ue0f2" +export fa_cog="\ue0f3" +export fa_trash_o="\ue0f4" +export fa_home="\ue0f5" +export fa_file_o="\ue0f6" +export fa_clock_o="\ue0f7" +export fa_road="\ue0f8" +export fa_download="\ue0f9" +export fa_arrow_circle_o_down="\ue0fa" +export fa_arrow_circle_o_up="\ue0fb" +export fa_inbox="\ue0fc" +export fa_play_circle_o="\ue0fd" +export fa_repeat="\ue0fe" +export fa_refresh="\ue0ff" +export fa_list_alt="\ue100" +export fa_lock="\ue101" +export fa_flag="\ue102" +export fa_headphones="\ue103" +export fa_volume_off="\ue104" +export fa_volume_down="\ue105" +export fa_volume_up="\ue106" +export fa_qrcode="\ue107" +export fa_barcode="\ue108" +export fa_tag="\ue109" +export fa_tags="\ue10a" +export fa_book="\ue10b" +export fa_bookmark="\ue10c" +export fa_print="\ue10d" +export fa_camera="\ue10e" +export fa_font="\ue10f" +export fa_bold="\ue110" +export fa_italic="\ue111" +export fa_text_height="\ue112" +export fa_text_width="\ue113" +export fa_align_left="\ue114" +export fa_align_center="\ue115" +export fa_align_right="\ue116" +export fa_align_justify="\ue117" +export fa_list="\ue118" +export fa_dedent="\ue119" +export fa_indent="\ue11a" +export fa_video_camera="\ue11b" +export fa_image="\ue11c" +export fa_pencil="\ue11d" +export fa_map_marker="\ue11e" +export fa_adjust="\ue11f" +export fa_tint="\ue120" +export fa_edit="\ue121" +export fa_share_square_o="\ue122" +export fa_check_square_o="\ue123" +export fa_arrows="\ue124" +export fa_step_backward="\ue125" +export fa_fast_backward="\ue126" +export fa_backward="\ue127" +export fa_play="\ue128" +export fa_pause="\ue129" +export fa_stop="\ue12a" +export fa_forward="\ue12b" +export fa_fast_forward="\ue12c" +export fa_step_forward="\ue12d" +export fa_eject="\ue12e" +export fa_chevron_left="\ue12f" +export fa_chevron_right="\ue130" +export fa_plus_circle="\ue131" +export fa_minus_circle="\ue132" +export fa_times_circle="\ue133" +export fa_check_circle="\ue134" +export fa_question_circle="\ue135" +export fa_info_circle="\ue136" +export fa_crosshairs="\ue137" +export fa_times_circle_o="\ue138" +export fa_check_circle_o="\ue139" +export fa_ban="\ue13a" +export fa_arrow_left="\ue13b" +export fa_arrow_right="\ue13c" +export fa_arrow_up="\ue13d" +export fa_arrow_down="\ue13e" +export fa_mail_forward="\ue13f" +export fa_expand="\ue140" +export fa_compress="\ue141" +export fa_plus="\ue142" +export fa_minus="\ue143" +export fa_asterisk="\ue144" +export fa_exclamation_circle="\ue145" +export fa_gift="\ue146" +export fa_leaf="\ue147" +export fa_fire="\ue148" +export fa_eye="\ue149" +export fa_eye_slash="\ue14a" +export fa_exclamation_triangle="\ue14b" +export fa_plane="\ue14c" +export fa_calendar="\ue14d" +export fa_random="\ue14e" +export fa_comment="\ue14f" +export fa_magnet="\ue150" +export fa_chevron_up="\ue151" +export fa_chevron_down="\ue152" +export fa_retweet="\ue153" +export fa_shopping_cart="\ue154" +export fa_folder="\ue155" +export fa_folder_open="\ue156" +export fa_arrows_v="\ue157" +export fa_arrows_h="\ue158" +export fa_bar_chart="\ue159" +export fa_twitter_square="\ue15a" +export fa_facebook_square="\ue15b" +export fa_camera_retro="\ue15c" +export fa_key="\ue15d" +export fa_cogs="\ue15e" +export fa_comments="\ue15f" +export fa_thumbs_o_up="\ue160" +export fa_thumbs_o_down="\ue161" +export fa_star_half="\ue162" +export fa_heart_o="\ue163" +export fa_sign_out="\ue164" +export fa_linkedin_square="\ue165" +export fa_thumb_tack="\ue166" +export fa_external_link="\ue167" +export fa_sign_in="\ue168" +export fa_trophy="\ue169" +export fa_github_square="\ue16a" +export fa_upload="\ue16b" +export fa_lemon_o="\ue16c" +export fa_phone="\ue16d" +export fa_square_o="\ue16e" +export fa_bookmark_o="\ue16f" +export fa_phone_square="\ue170" +export fa_twitter="\ue171" +export fa_facebook="\ue172" +export fa_github="\ue173" +export fa_unlock="\ue174" +export fa_credit_card="\ue175" +export fa_feed="\ue176" +export fa_hdd_o="\ue177" +export fa_bullhorn="\ue178" +export fa_bell_o="\ue179" +export fa_certificate="\ue17a" +export fa_hand_o_right="\ue17b" +export fa_hand_o_left="\ue17c" +export fa_hand_o_up="\ue17d" +export fa_hand_o_down="\ue17e" +export fa_arrow_circle_left="\ue17f" +export fa_arrow_circle_right="\ue180" +export fa_arrow_circle_up="\ue181" +export fa_arrow_circle_down="\ue182" +export fa_globe="\ue183" +export fa_wrench="\ue184" +export fa_tasks="\ue185" +export fa_filter="\ue186" +export fa_briefcase="\ue187" +export fa_arrows_alt="\ue188" +export fa_group="\ue189" +export fa_chain="\ue18a" +export fa_cloud="\ue18b" +export fa_flask="\ue18c" +export fa_cut="\ue18d" +export fa_copy="\ue18e" +export fa_paperclip="\ue18f" +export fa_floppy_o="\ue190" +export fa_square="\ue191" +export fa_bars="\ue192" +export fa_list_ul="\ue193" +export fa_list_ol="\ue194" +export fa_strikethrough="\ue195" +export fa_underline="\ue196" +export fa_table="\ue197" +export fa_magic="\ue198" +export fa_truck="\ue199" +export fa_pinterest="\ue19a" +export fa_pinterest_square="\ue19b" +export fa_google_plus_square="\ue19c" +export fa_google_plus="\ue19d" +export fa_money="\ue19e" +export fa_caret_down="\ue19f" +export fa_caret_up="\ue1a0" +export fa_caret_left="\ue1a1" +export fa_caret_right="\ue1a2" +export fa_columns="\ue1a3" +export fa_sort="\ue1a4" +export fa_sort_desc="\ue1a5" +export fa_sort_asc="\ue1a6" +export fa_envelope="\ue1a7" +export fa_linkedin="\ue1a8" +export fa_rotate_left="\ue1a9" +export fa_gavel="\ue1aa" +export fa_dashboard="\ue1ab" +export fa_comment_o="\ue1ac" +export fa_comments_o="\ue1ad" +export fa_bolt="\ue1ae" +export fa_sitemap="\ue1af" +export fa_umbrella="\ue1b0" +export fa_clipboard="\ue1b1" +export fa_lightbulb_o="\ue1b2" +export fa_exchange="\ue1b3" +export fa_cloud_download="\ue1b4" +export fa_cloud_upload="\ue1b5" +export fa_user_md="\ue1b6" +export fa_stethoscope="\ue1b7" +export fa_suitcase="\ue1b8" +export fa_bell="\ue1b9" +export fa_coffee="\ue1ba" +export fa_cutlery="\ue1bb" +export fa_file_text_o="\ue1bc" +export fa_building_o="\ue1bd" +export fa_hospital_o="\ue1be" +export fa_ambulance="\ue1bf" +export fa_medkit="\ue1c0" +export fa_fighter_jet="\ue1c1" +export fa_beer="\ue1c2" +export fa_h_square="\ue1c3" +export fa_plus_square="\ue1c4" +export fa_angle_double_left="\ue1c5" +export fa_angle_double_right="\ue1c6" +export fa_angle_double_up="\ue1c7" +export fa_angle_double_down="\ue1c8" +export fa_angle_left="\ue1c9" +export fa_angle_right="\ue1ca" +export fa_angle_up="\ue1cb" +export fa_angle_down="\ue1cc" +export fa_desktop="\ue1cd" +export fa_laptop="\ue1ce" +export fa_tablet="\ue1cf" +export fa_mobile="\ue1d0" +export fa_circle_o="\ue1d1" +export fa_quote_left="\ue1d2" +export fa_quote_right="\ue1d3" +export fa_spinner="\ue1d4" +export fa_circle="\ue1d5" +export fa_mail_reply="\ue1d6" +export fa_github_alt="\ue1d7" +export fa_folder_o="\ue1d8" +export fa_folder_open_o="\ue1d9" +export fa_expand_alt="\ue1da" +export fa_collapse_alt="\ue1db" +export fa_smile_o="\ue1dc" +export fa_frown_o="\ue1dd" +export fa_meh_o="\ue1de" +export fa_gamepad="\ue1df" +export fa_keyboard_o="\ue1e0" +export fa_flag_o="\ue1e1" +export fa_flag_checkered="\ue1e2" +export fa_terminal="\ue1e3" +export fa_code="\ue1e4" +export fa_mail_reply_all="\ue1e5" +export fa_star_half_empty="\ue1e6" +export fa_location_arrow="\ue1e7" +export fa_crop="\ue1e8" +export fa_code_fork="\ue1e9" +export fa_chain_broken="\ue1ea" +export fa_question="\ue1eb" +export fa_info="\ue1ec" +export fa_exclamation="\ue1ed" +export fa_superscript="\ue1ee" +export fa_subscript="\ue1ef" +export fa_eraser="\ue1f0" +export fa_puzzle_piece="\ue1f1" +export fa_microphone="\ue1f2" +export fa_microphone_slash="\ue1f3" +export fa_shield="\ue1f4" +export fa_calendar_o="\ue1f5" +export fa_fire_extinguisher="\ue1f6" +export fa_rocket="\ue1f7" +export fa_maxcdn="\ue1f8" +export fa_chevron_circle_left="\ue1f9" +export fa_chevron_circle_right="\ue1fa" +export fa_chevron_circle_up="\ue1fb" +export fa_chevron_circle_down="\ue1fc" +export fa_html5="\ue1fd" +export fa_css3="\ue1fe" +export fa_anchor="\ue1ff" +export fa_unlock_alt="\ue200" +export fa_bullseye="\ue201" +export fa_ellipsis_h="\ue202" +export fa_ellipsis_v="\ue203" +export fa_rss_square="\ue204" +export fa_play_circle="\ue205" +export fa_ticket="\ue206" +export fa_minus_square="\ue207" +export fa_minus_square_o="\ue208" +export fa_level_up="\ue209" +export fa_level_down="\ue20a" +export fa_check_square="\ue20b" +export fa_pencil_square="\ue20c" +export fa_external_link_square="\ue20d" +export fa_share_square="\ue20e" +export fa_compass="\ue20f" +export fa_caret_square_o_down="\ue210" +export fa_caret_square_o_up="\ue211" +export fa_caret_square_o_right="\ue212" +export fa_eur="\ue213" +export fa_gbp="\ue214" +export fa_dollar="\ue215" +export fa_inr="\ue216" +export fa_cny="\ue217" +export fa_rouble="\ue218" +export fa_krw="\ue219" +export fa_bitcoin="\ue21a" +export fa_file="\ue21b" +export fa_file_text="\ue21c" +export fa_sort_alpha_asc="\ue21d" +export fa_sort_alpha_desc="\ue21e" +export fa_sort_amount_asc="\ue21f" +export fa_sort_amount_desc="\ue220" +export fa_sort_numeric_asc="\ue221" +export fa_sort_numeric_desc="\ue222" +export fa_thumbs_up="\ue223" +export fa_thumbs_down="\ue224" +export fa_youtube_square="\ue225" +export fa_youtube="\ue226" +export fa_xing="\ue227" +export fa_xing_square="\ue228" +export fa_youtube_play="\ue229" +export fa_dropbox="\ue22a" +export fa_stack_overflow="\ue22b" +export fa_instagram="\ue22c" +export fa_flickr="\ue22d" +export fa_adn="\ue22e" +export fa_bitbucket="\ue22f" +export fa_bitbucket_square="\ue230" +export fa_tumblr="\ue231" +export fa_tumblr_square="\ue232" +export fa_long_arrow_down="\ue233" +export fa_long_arrow_up="\ue234" +export fa_long_arrow_left="\ue235" +export fa_long_arrow_right="\ue236" +export fa_apple="\ue237" +export fa_windows="\ue238" +export fa_android="\ue239" +export fa_linux="\ue23a" +export fa_dribbble="\ue23b" +export fa_skype="\ue23c" +export fa_foursquare="\ue23d" +export fa_trello="\ue23e" +export fa_female="\ue23f" +export fa_male="\ue240" +export fa_gittip="\ue241" +export fa_sun_o="\ue242" +export fa_moon_o="\ue243" +export fa_archive="\ue244" +export fa_bug="\ue245" +export fa_vk="\ue246" +export fa_weibo="\ue247" +export fa_renren="\ue248" +export fa_pagelines="\ue249" +export fa_stack_exchange="\ue24a" +export fa_arrow_circle_o_right="\ue24b" +export fa_arrow_circle_o_left="\ue24c" +export fa_caret_square_o_left="\ue24d" +export fa_dot_circle_o="\ue24e" +export fa_wheelchair="\ue24f" +export fa_vimeo_square="\ue250" +export fa_try="\ue251" +export fa_plus_square_o="\ue252" +export fa_space_shuttle="\ue253" +export fa_slack="\ue254" +export fa_envelope_square="\ue255" +export fa_wordpress="\ue256" +export fa_openid="\ue257" +export fa_bank="\ue258" +export fa_graduation_cap="\ue259" +export fa_yahoo="\ue25a" +export fa_google="\ue25b" +export fa_reddit="\ue25c" +export fa_reddit_square="\ue25d" +export fa_stumbleupon_circle="\ue25e" +export fa_stumbleupon="\ue25f" +export fa_delicious="\ue260" +export fa_digg="\ue261" +export fa_pied_piper_pp="\ue262" +export fa_pied_piper_alt="\ue263" +export fa_drupal="\ue264" +export fa_joomla="\ue265" +export fa_language="\ue266" +export fa_fax="\ue267" +export fa_building="\ue268" +export fa_child="\ue269" +export fa_paw="\ue26a" +export fa_spoon="\ue26b" +export fa_cube="\ue26c" +export fa_cubes="\ue26d" +export fa_behance="\ue26e" +export fa_behance_square="\ue26f" +export fa_steam="\ue270" +export fa_steam_square="\ue271" +export fa_recycle="\ue272" +export fa_automobile="\ue273" +export fa_cab="\ue274" +export fa_tree="\ue275" +export fa_spotify="\ue276" +export fa_deviantart="\ue277" +export fa_soundcloud="\ue278" +export fa_database="\ue279" +export fa_file_pdf_o="\ue27a" +export fa_file_word_o="\ue27b" +export fa_file_excel_o="\ue27c" +export fa_file_powerpoint_o="\ue27d" +export fa_file_image_o="\ue27e" +export fa_file_archive_o="\ue27f" +export fa_file_audio_o="\ue280" +export fa_file_movie_o="\ue281" +export fa_file_code_o="\ue282" +export fa_vine="\ue283" +export fa_codepen="\ue284" +export fa_jsfiddle="\ue285" +export fa_life_bouy="\ue286" +export fa_circle_o_notch="\ue287" +export fa_ra="\ue288" +export fa_empire="\ue289" +export fa_git_square="\ue28a" +export fa_git="\ue28b" +export fa_hacker_news="\ue28c" +export fa_tencent_weibo="\ue28d" +export fa_qq="\ue28e" +export fa_wechat="\ue28f" +export fa_paper_plane="\ue290" +export fa_paper_plane_o="\ue291" +export fa_history="\ue292" +export fa_circle_thin="\ue293" +export fa_header="\ue294" +export fa_paragraph="\ue295" +export fa_sliders="\ue296" +export fa_share_alt="\ue297" +export fa_share_alt_square="\ue298" +export fa_bomb="\ue299" +export fa_futbol_o="\ue29a" +export fa_tty="\ue29b" +export fa_binoculars="\ue29c" +export fa_plug="\ue29d" +export fa_slideshare="\ue29e" +export fa_twitch="\ue29f" +export fa_yelp="\ue2a0" +export fa_newspaper_o="\ue2a1" +export fa_wifi="\ue2a2" +export fa_calculator="\ue2a3" +export fa_paypal="\ue2a4" +export fa_google_wallet="\ue2a5" +export fa_cc_visa="\ue2a6" +export fa_cc_mastercard="\ue2a7" +export fa_cc_discover="\ue2a8" +export fa_cc_amex="\ue2a9" +export fa_cc_paypal="\ue2aa" +export fa_cc_stripe="\ue2ab" +export fa_bell_slash="\ue2ac" +export fa_bell_slash_o="\ue2ad" +export fa_trash="\ue2ae" +export fa_copyright="\ue2af" +export fa_at="\ue2b0" +export fa_eyedropper="\ue2b1" +export fa_paint_brush="\ue2b2" +export fa_birthday_cake="\ue2b3" +export fa_area_chart="\ue2b4" +export fa_pie_chart="\ue2b5" +export fa_line_chart="\ue2b6" +export fa_lastfm="\ue2b7" +export fa_lastfm_square="\ue2b8" +export fa_toggle_off="\ue2b9" +export fa_toggle_on="\ue2ba" +export fa_bicycle="\ue2bb" +export fa_bus="\ue2bc" +export fa_ioxhost="\ue2bd" +export fa_angellist="\ue2be" +export fa_cc="\ue2bf" +export fa_ils="\ue2c0" +export fa_meanpath="\ue2c1" +export fa_buysellads="\ue2c2" +export fa_connectdevelop="\ue2c3" +export fa_dashcube="\ue2c4" +export fa_forumbee="\ue2c5" +export fa_leanpub="\ue2c6" +export fa_sellsy="\ue2c7" +export fa_shirtsinbulk="\ue2c8" +export fa_simplybuilt="\ue2c9" +export fa_skyatlas="\ue2ca" +export fa_cart_plus="\ue2cb" +export fa_cart_arrow_down="\ue2cc" +export fa_diamond="\ue2cd" +export fa_ship="\ue2ce" +export fa_user_secret="\ue2cf" +export fa_motorcycle="\ue2d0" +export fa_street_view="\ue2d1" +export fa_heartbeat="\ue2d2" +export fa_venus="\ue2d3" +export fa_mars="\ue2d4" +export fa_mercury="\ue2d5" +export fa_intersex="\ue2d6" +export fa_transgender_alt="\ue2d7" +export fa_venus_double="\ue2d8" +export fa_mars_double="\ue2d9" +export fa_venus_mars="\ue2da" +export fa_mars_stroke="\ue2db" +export fa_mars_stroke_v="\ue2dc" +export fa_mars_stroke_h="\ue2dd" +export fa_neuter="\ue2de" +export fa_genderless="\ue2df" +export fa__523="\ue2e0" +export fa__524="\ue2e1" +export fa_facebook_official="\ue2e2" +export fa_pinterest_p="\ue2e3" +export fa_whatsapp="\ue2e4" +export fa_server="\ue2e5" +export fa_user_plus="\ue2e6" +export fa_user_times="\ue2e7" +export fa_bed="\ue2e8" +export fa_viacoin="\ue2e9" +export fa_train="\ue2ea" +export fa_subway="\ue2eb" +export fa_medium="\ue2ec" +export fa_y_combinator="\ue2ed" +export fa_optin_monster="\ue2ee" +export fa_opencart="\ue2ef" +export fa_expeditedssl="\ue2f0" +export fa_battery="\ue2f1" +export fa_battery_3="\ue2f2" +export fa_battery_2="\ue2f3" +export fa_battery_1="\ue2f4" +export fa_battery_0="\ue2f5" +export fa_mouse_pointer="\ue2f6" +export fa_i_cursor="\ue2f7" +export fa_object_group="\ue2f8" +export fa_object_ungroup="\ue2f9" +export fa_sticky_note="\ue2fa" +export fa_sticky_note_o="\ue2fb" +export fa_cc_jcb="\ue2fc" +export fa_cc_diners_club="\ue2fd" +export fa_clone="\ue2fe" +export fa_balance_scale="\ue2ff" +export fa_hourglass_o="\ue300" +export fa_hourglass_1="\ue301" +export fa_hourglass_2="\ue302" +export fa_hourglass_3="\ue303" +export fa_hourglass="\ue304" +export fa_hand_grab_o="\ue305" +export fa_hand_paper_o="\ue306" +export fa_hand_scissors_o="\ue307" +export fa_hand_lizard_o="\ue308" +export fa_hand_spock_o="\ue309" +export fa_hand_pointer_o="\ue30a" +export fa_hand_peace_o="\ue30b" +export fa_trademark="\ue30c" +export fa_registered="\ue30d" +export fa_creative_commons="\ue30e" +export fa_gg="\ue30f" +export fa_gg_circle="\ue310" +export fa_tripadvisor="\ue311" +export fa_odnoklassniki="\ue312" +export fa_odnoklassniki_square="\ue313" +export fa_get_pocket="\ue314" +export fa_wikipedia_w="\ue315" +export fa_safari="\ue316" +export fa_chrome="\ue317" +export fa_firefox="\ue318" +export fa_opera="\ue319" +export fa_internet_explorer="\ue31a" +export fa_television="\ue31b" +export fa_contao="\ue31c" +export fa_500px="\ue31d" +export fa_amazon="\ue31e" +export fa_calendar_plus_o="\ue31f" +export fa_calendar_minus_o="\ue320" +export fa_calendar_times_o="\ue321" +export fa_calendar_check_o="\ue322" +export fa_industry="\ue323" +export fa_map_pin="\ue324" +export fa_map_signs="\ue325" +export fa_map_o="\ue326" +export fa_map="\ue327" +export fa_commenting="\ue328" +export fa_commenting_o="\ue329" +export fa_houzz="\ue32a" +export fa_vimeo="\ue32b" +export fa_black_tie="\ue32c" +export fa_fonticons="\ue32d" +export fa_reddit_alien="\ue32e" +export fa_edge="\ue32f" +export fa_credit_card_alt="\ue330" +export fa_codiepie="\ue331" +export fa_modx="\ue332" +export fa_fort_awesome="\ue333" +export fa_usb="\ue334" +export fa_product_hunt="\ue335" +export fa_mixcloud="\ue336" +export fa_scribd="\ue337" +export fa_pause_circle="\ue338" +export fa_pause_circle_o="\ue339" +export fa_stop_circle="\ue33a" +export fa_stop_circle_o="\ue33b" +export fa_shopping_bag="\ue33c" +export fa_shopping_basket="\ue33d" +export fa_hashtag="\ue33e" +export fa_bluetooth="\ue33f" +export fa_bluetooth_b="\ue340" +export fa_percent="\ue341" +export fa_gitlab="\ue342" +export fa_wpbeginner="\ue343" +export fa_wpforms="\ue344" +export fa_envira="\ue345" +export fa_universal_access="\ue346" +export fa_wheelchair_alt="\ue347" +export fa_question_circle_o="\ue348" +export fa_blind="\ue349" +export fa_audio_description="\ue34a" +export fa_volume_control_phone="\ue34b" +export fa_braille="\ue34c" +export fa_assistive_listening_systems="\ue34d" +export fa_american_sign_language_interpreting="\ue34e" +export fa_deaf="\ue34f" +export fa_glide="\ue350" +export fa_glide_g="\ue351" +export fa_sign_language="\ue352" +export fa_low_vision="\ue353" +export fa_viadeo="\ue354" +export fa_viadeo_square="\ue355" +export fa_snapchat="\ue356" +export fa_snapchat_ghost="\ue357" +export fa_snapchat_square="\ue358" +export fa_pied_piper="\ue359" +export fa_first_order="\ue35a" +export fa_yoast="\ue35b" +export fa_themeisle="\ue35c" +export fa_google_plus_circle="\ue35d" +export fa_fa="\ue35e" +export fa_handshake_o="\ue35f" +export fa_envelope_open="\ue360" +export fa_envelope_open_o="\ue361" +export fa_linode="\ue362" +export fa_address_book="\ue363" +export fa_address_book_o="\ue364" +export fa_address_card="\ue365" +export fa_address_card_o="\ue366" +export fa_user_circle="\ue367" +export fa_user_circle_o="\ue368" +export fa_user_o="\ue369" +export fa_id_badge="\ue36a" +export fa_drivers_license="\ue36b" +export fa_drivers_license_o="\ue36c" +export fa_quora="\ue36d" +export fa_free_code_camp="\ue36e" +export fa_telegram="\ue36f" +export fa_thermometer="\ue370" +export fa_thermometer_3="\ue371" +export fa_thermometer_2="\ue372" +export fa_thermometer_1="\ue373" +export fa_thermometer_0="\ue374" +export fa_shower="\ue375" +export fa_bath="\ue376" +export fa_podcast="\ue377" +export fa_window_maximize="\ue378" +export fa_window_minimize="\ue379" +export fa_window_restore="\ue37a" +export fa_times_rectangle="\ue37b" +export fa_times_rectangle_o="\ue37c" +export fa_bandcamp="\ue37d" +export fa_grav="\ue37e" +export fa_etsy="\ue37f" +export fa_imdb="\ue380" +export fa_ravelry="\ue381" +export fa_eercast="\ue382" +export fa_microchip="\ue383" +export fa_snowflake_o="\ue384" +export fa_superpowers="\ue385" +export fa_wpexplorer="\ue386" +export fa_meetup="\ue387" +export md_error="\ue388" +export md_error_outline="\ue389" +export md_warning="\ue38a" +export md_add_alert="\ue38b" +export md_album="\ue38c" +export md_av_timer="\ue38d" +export md_closed_caption="\ue38e" +export md_equalizer="\ue38f" +export md_explicit="\ue390" +export md_fast_forward="\ue391" +export md_fast_rewind="\ue392" +export md_games="\ue393" +export md_hearing="\ue394" +export md_high_quality="\ue395" +export md_loop="\ue396" +export md_mic="\ue397" +export md_mic_none="\ue398" +export md_mic_off="\ue399" +export md_movie="\ue39a" +export md_library_add="\ue39b" +export md_library_books="\ue39c" +export md_library_music="\ue39d" +export md_new_releases="\ue39e" +export md_not_interested="\ue39f" +export md_pause="\ue3a0" +export md_pause_circle_filled="\ue3a1" +export md_pause_circle_outline="\ue3a2" +export md_play_arrow="\ue3a3" +export md_play_circle_filled="\ue3a4" +export md_play_circle_outline="\ue3a5" +export md_playlist_add="\ue3a6" +export md_queue="\ue3a7" +export md_queue_music="\ue3a8" +export md_radio="\ue3a9" +export md_recent_actors="\ue3aa" +export md_repeat="\ue3ab" +export md_repeat_one="\ue3ac" +export md_replay="\ue3ad" +export md_shuffle="\ue3ae" +export md_skip_next="\ue3af" +export md_skip_previous="\ue3b0" +export md_snooze="\ue3b1" +export md_stop="\ue3b2" +export md_subtitles="\ue3b3" +export md_surround_sound="\ue3b4" +export md_video_library="\ue3b5" +export md_videocam="\ue3b6" +export md_videocam_off="\ue3b7" +export md_volume_down="\ue3b8" +export md_volume_mute="\ue3b9" +export md_volume_off="\ue3ba" +export md_volume_up="\ue3bb" +export md_web="\ue3bc" +export md_hd="\ue3bd" +export md_sort_by_alpha="\ue3be" +export md_airplay="\ue3bf" +export md_forward_10="\ue3c0" +export md_forward_30="\ue3c1" +export md_forward_5="\ue3c2" +export md_replay_10="\ue3c3" +export md_replay_30="\ue3c4" +export md_replay_5="\ue3c5" +export md_add_to_queue="\ue3c6" +export md_fiber_dvr="\ue3c7" +export md_fiber_new="\ue3c8" +export md_playlist_play="\ue3c9" +export md_art_track="\ue3ca" +export md_fiber_manual_record="\ue3cb" +export md_fiber_smart_record="\ue3cc" +export md_music_video="\ue3cd" +export md_subscriptions="\ue3ce" +export md_playlist_add_check="\ue3cf" +export md_queue_play_next="\ue3d0" +export md_remove_from_queue="\ue3d1" +export md_slow_motion_video="\ue3d2" +export md_web_asset="\ue3d3" +export md_fiber_pin="\ue3d4" +export md_branding_watermark="\ue3d5" +export md_call_to_action="\ue3d6" +export md_featured_play_list="\ue3d7" +export md_featured_video="\ue3d8" +export md_note="\ue3d9" +export md_video_call="\ue3da" +export md_video_label="\ue3db" +export md_business="\ue3dc" +export md_call="\ue3dd" +export md_call_end="\ue3de" +export md_call_made="\ue3df" +export md_call_merge="\ue3e0" +export md_call_missed="\ue3e1" +export md_call_received="\ue3e2" +export md_call_split="\ue3e3" +export md_chat="\ue3e4" +export md_clear_all="\ue3e5" +export md_comment="\ue3e6" +export md_contacts="\ue3e7" +export md_dialer_sip="\ue3e8" +export md_dialpad="\ue3e9" +export md_email="\ue3ea" +export md_forum="\ue3eb" +export md_import_export="\ue3ec" +export md_invert_colors_off="\ue3ed" +export md_live_help="\ue3ee" +export md_location_off="\ue3ef" +export md_location_on="\ue3f0" +export md_message="\ue3f1" +export md_chat_bubble="\ue3f2" +export md_chat_bubble_outline="\ue3f3" +export md_no_sim="\ue3f4" +export md_phone="\ue3f5" +export md_portable_wifi_off="\ue3f6" +export md_contact_phone="\ue3f7" +export md_contact_mail="\ue3f8" +export md_ring_volume="\ue3f9" +export md_speaker_phone="\ue3fa" +export md_stay_current_landscape="\ue3fb" +export md_stay_current_portrait="\ue3fc" +export md_stay_primary_landscape="\ue3fd" +export md_stay_primary_portrait="\ue3fe" +export md_swap_calls="\ue3ff" +export md_textsms="\ue400" +export md_voicemail="\ue401" +export md_vpn_key="\ue402" +export md_phonelink_erase="\ue403" +export md_phonelink_lock="\ue404" +export md_phonelink_ring="\ue405" +export md_phonelink_setup="\ue406" +export md_present_to_all="\ue407" +export md_import_contacts="\ue408" +export md_mail_outline="\ue409" +export md_screen_share="\ue40a" +export md_stop_screen_share="\ue40b" +export md_call_missed_outgoing="\ue40c" +export md_rss_feed="\ue40d" +export md_add="\ue40e" +export md_add_box="\ue40f" +export md_add_circle="\ue410" +export md_add_circle_outline="\ue411" +export md_archive="\ue412" +export md_backspace="\ue413" +export md_block="\ue414" +export md_clear="\ue415" +export md_content_copy="\ue416" +export md_content_cut="\ue417" +export md_content_paste="\ue418" +export md_create="\ue419" +export md_drafts="\ue41a" +export md_filter_list="\ue41b" +export md_flag="\ue41c" +export md_forward="\ue41d" +export md_gesture="\ue41e" +export md_inbox="\ue41f" +export md_link="\ue420" +export md_mail="\ue421" +export md_markunread="\ue422" +export md_redo="\ue423" +export md_remove="\ue424" +export md_remove_circle="\ue425" +export md_remove_circle_outline="\ue426" +export md_reply="\ue427" +export md_reply_all="\ue428" +export md_report="\ue429" +export md_save="\ue42a" +export md_select_all="\ue42b" +export md_send="\ue42c" +export md_sort="\ue42d" +export md_text_format="\ue42e" +export md_undo="\ue42f" +export md_font_download="\ue430" +export md_move_to_inbox="\ue431" +export md_unarchive="\ue432" +export md_next_week="\ue433" +export md_weekend="\ue434" +export md_delete_sweep="\ue435" +export md_low_priority="\ue436" +export md_access_alarm="\ue437" +export md_access_alarms="\ue438" +export md_access_time="\ue439" +export md_add_alarm="\ue43a" +export md_airplanemode_inactive="\ue43b" +export md_airplanemode_active="\ue43c" +export md_battery_alert="\ue43d" +export md_battery_charging_full="\ue43e" +export md_battery_full="\ue43f" +export md_battery_std="\ue440" +export md_battery_unknown="\ue441" +export md_bluetooth="\ue442" +export md_bluetooth_connected="\ue443" +export md_bluetooth_disabled="\ue444" +export md_bluetooth_searching="\ue445" +export md_brightness_auto="\ue446" +export md_brightness_high="\ue447" +export md_brightness_low="\ue448" +export md_brightness_medium="\ue449" +export md_data_usage="\ue44a" +export md_developer_mode="\ue44b" +export md_devices="\ue44c" +export md_dvr="\ue44d" +export md_gps_fixed="\ue44e" +export md_gps_not_fixed="\ue44f" +export md_gps_off="\ue450" +export md_location_disabled="\ue451" +export md_location_searching="\ue452" +export md_graphic_eq="\ue453" +export md_network_cell="\ue454" +export md_network_wifi="\ue455" +export md_nfc="\ue456" +export md_wallpaper="\ue457" +export md_widgets="\ue458" +export md_screen_lock_landscape="\ue459" +export md_screen_lock_portrait="\ue45a" +export md_screen_lock_rotation="\ue45b" +export md_screen_rotation="\ue45c" +export md_sd_storage="\ue45d" +export md_settings_system_daydream="\ue45e" +export md_signal_cellular_4_bar="\ue45f" +export md_signal_cellular_connected_no_internet_4_bar="\ue460" +export md_signal_cellular_no_sim="\ue461" +export md_signal_cellular_null="\ue462" +export md_signal_cellular_off="\ue463" +export md_signal_wifi_4_bar="\ue464" +export md_signal_wifi_4_bar_lock="\ue465" +export md_signal_wifi_off="\ue466" +export md_storage="\ue467" +export md_usb="\ue468" +export md_wifi_lock="\ue469" +export md_wifi_tethering="\ue46a" +export md_attach_file="\ue46b" +export md_attach_money="\ue46c" +export md_border_all="\ue46d" +export md_border_bottom="\ue46e" +export md_border_clear="\ue46f" +export md_border_color="\ue470" +export md_border_horizontal="\ue471" +export md_border_inner="\ue472" +export md_border_left="\ue473" +export md_border_outer="\ue474" +export md_border_right="\ue475" +export md_border_style="\ue476" +export md_border_top="\ue477" +export md_border_vertical="\ue478" +export md_format_align_center="\ue479" +export md_format_align_justify="\ue47a" +export md_format_align_left="\ue47b" +export md_format_align_right="\ue47c" +export md_format_bold="\ue47d" +export md_format_clear="\ue47e" +export md_format_color_fill="\ue47f" +export md_format_color_reset="\ue480" +export md_format_color_text="\ue481" +export md_format_indent_decrease="\ue482" +export md_format_indent_increase="\ue483" +export md_format_italic="\ue484" +export md_format_line_spacing="\ue485" +export md_format_list_bulleted="\ue486" +export md_format_list_numbered="\ue487" +export md_format_paint="\ue488" +export md_format_quote="\ue489" +export md_format_size="\ue48a" +export md_format_strikethrough="\ue48b" +export md_format_textdirection_l_to_r="\ue48c" +export md_format_textdirection_r_to_l="\ue48d" +export md_format_underlined="\ue48e" +export md_functions="\ue48f" +export md_insert_chart="\ue490" +export md_insert_comment="\ue491" +export md_insert_drive_file="\ue492" +export md_insert_emoticon="\ue493" +export md_insert_invitation="\ue494" +export md_insert_link="\ue495" +export md_insert_photo="\ue496" +export md_merge_type="\ue497" +export md_mode_comment="\ue498" +export md_mode_edit="\ue499" +export md_publish="\ue49a" +export md_space_bar="\ue49b" +export md_strikethrough_s="\ue49c" +export md_vertical_align_bottom="\ue49d" +export md_vertical_align_center="\ue49e" +export md_vertical_align_top="\ue49f" +export md_wrap_text="\ue4a0" +export md_money_off="\ue4a1" +export md_drag_handle="\ue4a2" +export md_format_shapes="\ue4a3" +export md_highlight="\ue4a4" +export md_linear_scale="\ue4a5" +export md_short_text="\ue4a6" +export md_text_fields="\ue4a7" +export md_monetization_on="\ue4a8" +export md_title="\ue4a9" +export md_attachment="\ue4aa" +export md_cloud="\ue4ab" +export md_cloud_circle="\ue4ac" +export md_cloud_done="\ue4ad" +export md_cloud_download="\ue4ae" +export md_cloud_off="\ue4af" +export md_cloud_queue="\ue4b0" +export md_cloud_upload="\ue4b1" +export md_file_download="\ue4b2" +export md_file_upload="\ue4b3" +export md_folder="\ue4b4" +export md_folder_open="\ue4b5" +export md_folder_shared="\ue4b6" +export md_create_new_folder="\ue4b7" +export md_cast="\ue4b8" +export md_cast_connected="\ue4b9" +export md_computer="\ue4ba" +export md_desktop_mac="\ue4bb" +export md_desktop_windows="\ue4bc" +export md_developer_board="\ue4bd" +export md_dock="\ue4be" +export md_gamepad="\ue4bf" +export md_headset="\ue4c0" +export md_headset_mic="\ue4c1" +export md_keyboard="\ue4c2" +export md_keyboard_arrow_down="\ue4c3" +export md_keyboard_arrow_left="\ue4c4" +export md_keyboard_arrow_right="\ue4c5" +export md_keyboard_arrow_up="\ue4c6" +export md_keyboard_backspace="\ue4c7" +export md_keyboard_capslock="\ue4c8" +export md_keyboard_hide="\ue4c9" +export md_keyboard_return="\ue4ca" +export md_keyboard_tab="\ue4cb" +export md_keyboard_voice="\ue4cc" +export md_laptop="\ue4cd" +export md_laptop_chromebook="\ue4ce" +export md_laptop_mac="\ue4cf" +export md_laptop_windows="\ue4d0" +export md_memory="\ue4d1" +export md_mouse="\ue4d2" +export md_phone_android="\ue4d3" +export md_phone_iphone="\ue4d4" +export md_phonelink="\ue4d5" +export md_phonelink_off="\ue4d6" +export md_router="\ue4d7" +export md_scanner="\ue4d8" +export md_security="\ue4d9" +export md_sim_card="\ue4da" +export md_smartphone="\ue4db" +export md_speaker="\ue4dc" +export md_speaker_group="\ue4dd" +export md_tablet="\ue4de" +export md_tablet_android="\ue4df" +export md_tablet_mac="\ue4e0" +export md_toys="\ue4e1" +export md_tv="\ue4e2" +export md_watch="\ue4e3" +export md_device_hub="\ue4e4" +export md_power_input="\ue4e5" +export md_devices_other="\ue4e6" +export md_videogame_asset="\ue4e7" +export md_add_to_photos="\ue4e8" +export md_adjust="\ue4e9" +export md_assistant="\ue4ea" +export md_assistant_photo="\ue4eb" +export md_audiotrack="\ue4ec" +export md_blur_circular="\ue4ed" +export md_blur_linear="\ue4ee" +export md_blur_off="\ue4ef" +export md_blur_on="\ue4f0" +export md_brightness_1="\ue4f1" +export md_brightness_2="\ue4f2" +export md_brightness_3="\ue4f3" +export md_brightness_4="\ue4f4" +export md_brightness_5="\ue4f5" +export md_brightness_6="\ue4f6" +export md_brightness_7="\ue4f7" +export md_broken_image="\ue4f8" +export md_brush="\ue4f9" +export md_camera="\ue4fa" +export md_camera_alt="\ue4fb" +export md_camera_front="\ue4fc" +export md_camera_rear="\ue4fd" +export md_camera_roll="\ue4fe" +export md_center_focus_strong="\ue4ff" +export md_center_focus_weak="\ue500" +export md_collections="\ue501" +export md_color_lens="\ue502" +export md_colorize="\ue503" +export md_compare="\ue504" +export md_control_point="\ue505" +export md_control_point_duplicate="\ue506" +export md_crop_16_9="\ue507" +export md_crop_3_2="\ue508" +export md_crop="\ue509" +export md_crop_5_4="\ue50a" +export md_crop_7_5="\ue50b" +export md_crop_din="\ue50c" +export md_crop_free="\ue50d" +export md_crop_landscape="\ue50e" +export md_crop_original="\ue50f" +export md_crop_portrait="\ue510" +export md_crop_square="\ue511" +export md_dehaze="\ue512" +export md_details="\ue513" +export md_edit="\ue514" +export md_exposure="\ue515" +export md_exposure_neg_1="\ue516" +export md_exposure_neg_2="\ue517" +export md_exposure_plus_1="\ue518" +export md_exposure_plus_2="\ue519" +export md_exposure_zero="\ue51a" +export md_filter_1="\ue51b" +export md_filter_2="\ue51c" +export md_filter_3="\ue51d" +export md_filter="\ue51e" +export md_filter_4="\ue51f" +export md_filter_5="\ue520" +export md_filter_6="\ue521" +export md_filter_7="\ue522" +export md_filter_8="\ue523" +export md_filter_9="\ue524" +export md_filter_9_plus="\ue525" +export md_filter_b_and_w="\ue526" +export md_filter_center_focus="\ue527" +export md_filter_drama="\ue528" +export md_filter_frames="\ue529" +export md_filter_hdr="\ue52a" +export md_filter_none="\ue52b" +export md_filter_tilt_shift="\ue52c" +export md_filter_vintage="\ue52d" +export md_flare="\ue52e" +export md_flash_auto="\ue52f" +export md_flash_off="\ue530" +export md_flash_on="\ue531" +export md_flip="\ue532" +export md_gradient="\ue533" +export md_grain="\ue534" +export md_grid_off="\ue535" +export md_grid_on="\ue536" +export md_hdr_off="\ue537" +export md_hdr_on="\ue538" +export md_hdr_strong="\ue539" +export md_hdr_weak="\ue53a" +export md_healing="\ue53b" +export md_image="\ue53c" +export md_image_aspect_ratio="\ue53d" +export md_iso="\ue53e" +export md_landscape="\ue53f" +export md_leak_add="\ue540" +export md_leak_remove="\ue541" +export md_lens="\ue542" +export md_looks_3="\ue543" +export md_looks="\ue544" +export md_looks_4="\ue545" +export md_looks_5="\ue546" +export md_looks_6="\ue547" +export md_looks_one="\ue548" +export md_looks_two="\ue549" +export md_loupe="\ue54a" +export md_monochrome_photos="\ue54b" +export md_movie_creation="\ue54c" +export md_music_note="\ue54d" +export md_nature="\ue54e" +export md_nature_people="\ue54f" +export md_navigate_before="\ue550" +export md_navigate_next="\ue551" +export md_palette="\ue552" +export md_panorama="\ue553" +export md_panorama_fish_eye="\ue554" +export md_panorama_horizontal="\ue555" +export md_panorama_vertical="\ue556" +export md_panorama_wide_angle="\ue557" +export md_photo="\ue558" +export md_photo_album="\ue559" +export md_photo_camera="\ue55a" +export md_photo_library="\ue55b" +export md_picture_as_pdf="\ue55c" +export md_portrait="\ue55d" +export md_remove_red_eye="\ue55e" +export md_rotate_90_degrees_ccw="\ue55f" +export md_rotate_left="\ue560" +export md_rotate_right="\ue561" +export md_slideshow="\ue562" +export md_straighten="\ue563" +export md_style="\ue564" +export md_switch_camera="\ue565" +export md_switch_video="\ue566" +export md_tag_faces="\ue567" +export md_texture="\ue568" +export md_timelapse="\ue569" +export md_timer_10="\ue56a" +export md_timer_3="\ue56b" +export md_timer="\ue56c" +export md_timer_off="\ue56d" +export md_tonality="\ue56e" +export md_transform="\ue56f" +export md_tune="\ue570" +export md_view_comfy="\ue571" +export md_view_compact="\ue572" +export md_wb_auto="\ue573" +export md_wb_cloudy="\ue574" +export md_wb_incandescent="\ue575" +export md_wb_sunny="\ue576" +export md_collections_bookmark="\ue577" +export md_photo_size_select_actual="\ue578" +export md_photo_size_select_large="\ue579" +export md_photo_size_select_small="\ue57a" +export md_vignette="\ue57b" +export md_wb_iridescent="\ue57c" +export md_crop_rotate="\ue57d" +export md_linked_camera="\ue57e" +export md_add_a_photo="\ue57f" +export md_movie_filter="\ue580" +export md_photo_filter="\ue581" +export md_burst_mode="\ue582" +export md_beenhere="\ue583" +export md_directions="\ue584" +export md_directions_bike="\ue585" +export md_directions_bus="\ue586" +export md_directions_car="\ue587" +export md_directions_boat="\ue588" +export md_directions_subway="\ue589" +export md_directions_railway="\ue58a" +export md_directions_transit="\ue58b" +export md_directions_walk="\ue58c" +export md_flight="\ue58d" +export md_hotel="\ue58e" +export md_layers="\ue58f" +export md_layers_clear="\ue590" +export md_local_airport="\ue591" +export md_local_atm="\ue592" +export md_local_activity="\ue593" +export md_local_bar="\ue594" +export md_local_cafe="\ue595" +export md_local_car_wash="\ue596" +export md_local_convenience_store="\ue597" +export md_local_drink="\ue598" +export md_local_florist="\ue599" +export md_local_gas_station="\ue59a" +export md_local_grocery_store="\ue59b" +export md_local_hospital="\ue59c" +export md_local_hotel="\ue59d" +export md_local_laundry_service="\ue59e" +export md_local_library="\ue59f" +export md_local_mall="\ue5a0" +export md_local_movies="\ue5a1" +export md_local_offer="\ue5a2" +export md_local_parking="\ue5a3" +export md_local_pharmacy="\ue5a4" +export md_local_phone="\ue5a5" +export md_local_pizza="\ue5a6" +export md_local_play="\ue5a7" +export md_local_post_office="\ue5a8" +export md_local_printshop="\ue5a9" +export md_local_dining="\ue5aa" +export md_local_see="\ue5ab" +export md_local_shipping="\ue5ac" +export md_local_taxi="\ue5ad" +export md_person_pin="\ue5ae" +export md_map="\ue5af" +export md_my_location="\ue5b0" +export md_navigation="\ue5b1" +export md_pin_drop="\ue5b2" +export md_place="\ue5b3" +export md_rate_review="\ue5b4" +export md_restaurant_menu="\ue5b5" +export md_satellite="\ue5b6" +export md_store_mall_directory="\ue5b7" +export md_terrain="\ue5b8" +export md_traffic="\ue5b9" +export md_directions_run="\ue5ba" +export md_add_location="\ue5bb" +export md_edit_location="\ue5bc" +export md_near_me="\ue5bd" +export md_person_pin_circle="\ue5be" +export md_zoom_out_map="\ue5bf" +export md_restaurant="\ue5c0" +export md_ev_station="\ue5c1" +export md_streetview="\ue5c2" +export md_subway="\ue5c3" +export md_train="\ue5c4" +export md_tram="\ue5c5" +export md_transfer_within_a_station="\ue5c6" +export md_apps="\ue5c7" +export md_arrow_back="\ue5c8" +export md_arrow_drop_down="\ue5c9" +export md_arrow_drop_down_circle="\ue5ca" +export md_arrow_drop_up="\ue5cb" +export md_arrow_forward="\ue5cc" +export md_cancel="\ue5cd" +export md_check="\ue5ce" +export md_chevron_left="\ue5cf" +export md_chevron_right="\ue5d0" +export md_close="\ue5d1" +export md_expand_less="\ue5d2" +export md_expand_more="\ue5d3" +export md_fullscreen="\ue5d4" +export md_fullscreen_exit="\ue5d5" +export md_menu="\ue5d6" +export md_more_horiz="\ue5d7" +export md_more_vert="\ue5d8" +export md_refresh="\ue5d9" +export md_unfold_less="\ue5da" +export md_unfold_more="\ue5db" +export md_arrow_upward="\ue5dc" +export md_subdirectory_arrow_left="\ue5dd" +export md_subdirectory_arrow_right="\ue5de" +export md_arrow_downward="\ue5df" +export md_first_page="\ue5e0" +export md_last_page="\ue5e1" +export md_adb="\ue5e2" +export md_bluetooth_audio="\ue5e3" +export md_disc_full="\ue5e4" +export md_do_not_disturb_alt="\ue5e5" +export md_do_not_disturb="\ue5e6" +export md_drive_eta="\ue5e7" +export md_event_available="\ue5e8" +export md_event_busy="\ue5e9" +export md_event_note="\ue5ea" +export md_folder_special="\ue5eb" +export md_mms="\ue5ec" +export md_more="\ue5ed" +export md_network_locked="\ue5ee" +export md_phone_bluetooth_speaker="\ue5ef" +export md_phone_forwarded="\ue5f0" +export md_phone_in_talk="\ue5f1" +export md_phone_locked="\ue5f2" +export md_phone_missed="\ue5f3" +export md_phone_paused="\ue5f4" +export md_sd_card="\ue5f5" +export md_sim_card_alert="\ue5f6" +export md_sms="\ue5f7" +export md_sms_failed="\ue5f8" +export md_sync="\ue5f9" +export md_sync_disabled="\ue5fa" +export md_sync_problem="\ue5fb" +export md_system_update="\ue5fc" +export md_tap_and_play="\ue5fd" +export md_time_to_leave="\ue5fe" +export md_vibration="\ue5ff" +export md_voice_chat="\ue600" +export md_vpn_lock="\ue601" +export md_airline_seat_flat="\ue602" +export md_airline_seat_flat_angled="\ue603" +export md_airline_seat_individual_suite="\ue604" +export md_airline_seat_legroom_extra="\ue605" +export md_airline_seat_legroom_normal="\ue606" +export md_airline_seat_legroom_reduced="\ue607" +export md_airline_seat_recline_extra="\ue608" +export md_airline_seat_recline_normal="\ue609" +export md_confirmation_number="\ue60a" +export md_live_tv="\ue60b" +export md_ondemand_video="\ue60c" +export md_personal_video="\ue60d" +export md_power="\ue60e" +export md_wc="\ue60f" +export md_wifi="\ue610" +export md_enhanced_encryption="\ue611" +export md_network_check="\ue612" +export md_no_encryption="\ue613" +export md_rv_hookup="\ue614" +export md_do_not_disturb_off="\ue615" +export md_do_not_disturb_on="\ue616" +export md_priority_high="\ue617" +export md_pie_chart="\ue618" +export md_pie_chart_outlined="\ue619" +export md_bubble_chart="\ue61a" +export md_multiline_chart="\ue61b" +export md_show_chart="\ue61c" +export md_cake="\ue61d" +export md_domain="\ue61e" +export md_group="\ue61f" +export md_group_add="\ue620" +export md_location_city="\ue621" +export md_mood="\ue622" +export md_mood_bad="\ue623" +export md_notifications="\ue624" +export md_notifications_none="\ue625" +export md_notifications_off="\ue626" +export md_notifications_active="\ue627" +export md_notifications_paused="\ue628" +export md_pages="\ue629" +export md_party_mode="\ue62a" +export md_people="\ue62b" +export md_people_outline="\ue62c" +export md_person="\ue62d" +export md_person_add="\ue62e" +export md_person_outline="\ue62f" +export md_plus_one="\ue630" +export md_poll="\ue631" +export md_public="\ue632" +export md_school="\ue633" +export md_share="\ue634" +export md_whatshot="\ue635" +export md_sentiment_dissatisfied="\ue636" +export md_sentiment_neutral="\ue637" +export md_sentiment_satisfied="\ue638" +export md_sentiment_very_dissatisfied="\ue639" +export md_sentiment_very_satisfied="\ue63a" +export md_check_box="\ue63b" +export md_check_box_outline_blank="\ue63c" +export md_radio_button_unchecked="\ue63d" +export md_radio_button_checked="\ue63e" +export md_star="\ue63f" +export md_star_half="\ue640" +export md_star_border="\ue641" +export md_3d_rotation="\ue642" +export md_accessibility="\ue643" +export md_account_balance="\ue644" +export md_account_balance_wallet="\ue645" +export md_account_box="\ue646" +export md_account_circle="\ue647" +export md_add_shopping_cart="\ue648" +export md_alarm="\ue649" +export md_alarm_add="\ue64a" +export md_alarm_off="\ue64b" +export md_alarm_on="\ue64c" +export md_android="\ue64d" +export md_announcement="\ue64e" +export md_aspect_ratio="\ue64f" +export md_assessment="\ue650" +export md_assignment="\ue651" +export md_assignment_ind="\ue652" +export md_assignment_late="\ue653" +export md_assignment_return="\ue654" +export md_assignment_returned="\ue655" +export md_assignment_turned_in="\ue656" +export md_autorenew="\ue657" +export md_backup="\ue658" +export md_book="\ue659" +export md_bookmark="\ue65a" +export md_bookmark_border="\ue65b" +export md_bug_report="\ue65c" +export md_build="\ue65d" +export md_cached="\ue65e" +export md_change_history="\ue65f" +export md_check_circle="\ue660" +export md_chrome_reader_mode="\ue661" +export md_class="\ue662" +export md_code="\ue663" +export md_credit_card="\ue664" +export md_dashboard="\ue665" +export md_delete="\ue666" +export md_description="\ue667" +export md_dns="\ue668" +export md_done="\ue669" +export md_done_all="\ue66a" +export md_event="\ue66b" +export md_exit_to_app="\ue66c" +export md_explore="\ue66d" +export md_extension="\ue66e" +export md_face="\ue66f" +export md_favorite="\ue670" +export md_favorite_border="\ue671" +export md_feedback="\ue672" +export md_find_in_page="\ue673" +export md_find_replace="\ue674" +export md_flip_to_back="\ue675" +export md_flip_to_front="\ue676" +export md_get_app="\ue677" +export md_grade="\ue678" +export md_group_work="\ue679" +export md_help="\ue67a" +export md_highlight_off="\ue67b" +export md_history="\ue67c" +export md_home="\ue67d" +export md_hourglass_empty="\ue67e" +export md_hourglass_full="\ue67f" +export md_https="\ue680" +export md_info="\ue681" +export md_info_outline="\ue682" +export md_input="\ue683" +export md_invert_colors="\ue684" +export md_label="\ue685" +export md_label_outline="\ue686" +export md_language="\ue687" +export md_launch="\ue688" +export md_list="\ue689" +export md_lock="\ue68a" +export md_lock_open="\ue68b" +export md_lock_outline="\ue68c" +export md_loyalty="\ue68d" +export md_markunread_mailbox="\ue68e" +export md_note_add="\ue68f" +export md_open_in_browser="\ue690" +export md_open_in_new="\ue691" +export md_open_with="\ue692" +export md_pageview="\ue693" +export md_payment="\ue694" +export md_perm_camera_mic="\ue695" +export md_perm_contact_calendar="\ue696" +export md_perm_data_setting="\ue697" +export md_perm_device_information="\ue698" +export md_perm_identity="\ue699" +export md_perm_media="\ue69a" +export md_perm_phone_msg="\ue69b" +export md_perm_scan_wifi="\ue69c" +export md_picture_in_picture="\ue69d" +export md_polymer="\ue69e" +export md_power_settings_new="\ue69f" +export md_print="\ue6a0" +export md_query_builder="\ue6a1" +export md_question_answer="\ue6a2" +export md_receipt="\ue6a3" +export md_redeem="\ue6a4" +export md_report_problem="\ue6a5" +export md_restore="\ue6a6" +export md_room="\ue6a7" +export md_schedule="\ue6a8" +export md_search="\ue6a9" +export md_settings="\ue6aa" +export md_settings_applications="\ue6ab" +export md_settings_backup_restore="\ue6ac" +export md_settings_bluetooth="\ue6ad" +export md_settings_cell="\ue6ae" +export md_settings_brightness="\ue6af" +export md_settings_ethernet="\ue6b0" +export md_settings_input_antenna="\ue6b1" +export md_settings_input_component="\ue6b2" +export md_settings_input_composite="\ue6b3" +export md_settings_input_hdmi="\ue6b4" +export md_settings_input_svideo="\ue6b5" +export md_settings_overscan="\ue6b6" +export md_settings_phone="\ue6b7" +export md_settings_power="\ue6b8" +export md_settings_remote="\ue6b9" +export md_settings_voice="\ue6ba" +export md_shop="\ue6bb" +export md_shop_two="\ue6bc" +export md_shopping_basket="\ue6bd" +export md_shopping_cart="\ue6be" +export md_speaker_notes="\ue6bf" +export md_spellcheck="\ue6c0" +export md_stars="\ue6c1" +export md_store="\ue6c2" +export md_subject="\ue6c3" +export md_supervisor_account="\ue6c4" +export md_swap_horiz="\ue6c5" +export md_swap_vert="\ue6c6" +export md_swap_vertical_circle="\ue6c7" +export md_system_update_alt="\ue6c8" +export md_tab="\ue6c9" +export md_tab_unselected="\ue6ca" +export md_theaters="\ue6cb" +export md_thumb_down="\ue6cc" +export md_thumb_up="\ue6cd" +export md_thumbs_up_down="\ue6ce" +export md_toc="\ue6cf" +export md_today="\ue6d0" +export md_toll="\ue6d1" +export md_track_changes="\ue6d2" +export md_translate="\ue6d3" +export md_trending_down="\ue6d4" +export md_trending_flat="\ue6d5" +export md_trending_up="\ue6d6" +export md_turned_in="\ue6d7" +export md_turned_in_not="\ue6d8" +export md_verified_user="\ue6d9" +export md_view_agenda="\ue6da" +export md_view_array="\ue6db" +export md_view_carousel="\ue6dc" +export md_view_column="\ue6dd" +export md_view_day="\ue6de" +export md_view_headline="\ue6df" +export md_view_list="\ue6e0" +export md_view_module="\ue6e1" +export md_view_quilt="\ue6e2" +export md_view_stream="\ue6e3" +export md_view_week="\ue6e4" +export md_visibility="\ue6e5" +export md_visibility_off="\ue6e6" +export md_card_giftcard="\ue6e7" +export md_card_membership="\ue6e8" +export md_card_travel="\ue6e9" +export md_work="\ue6ea" +export md_youtube_searched_for="\ue6eb" +export md_eject="\ue6ec" +export md_camera_enhance="\ue6ed" +export md_help_outline="\ue6ee" +export md_reorder="\ue6ef" +export md_zoom_in="\ue6f0" +export md_zoom_out="\ue6f1" +export md_http="\ue6f2" +export md_event_seat="\ue6f3" +export md_flight_land="\ue6f4" +export md_flight_takeoff="\ue6f5" +export md_play_for_work="\ue6f6" +export md_gif="\ue6f7" +export md_indeterminate_check_box="\ue6f8" +export md_offline_pin="\ue6f9" +export md_all_out="\ue6fa" +export md_copyright="\ue6fb" +export md_fingerprint="\ue6fc" +export md_gavel="\ue6fd" +export md_lightbulb_outline="\ue6fe" +export md_picture_in_picture_alt="\ue6ff" +export md_important_devices="\ue700" +export md_touch_app="\ue701" +export md_accessible="\ue702" +export md_compare_arrows="\ue703" +export md_date_range="\ue704" +export md_donut_large="\ue705" +export md_donut_small="\ue706" +export md_line_style="\ue707" +export md_line_weight="\ue708" +export md_motorcycle="\ue709" +export md_opacity="\ue70a" +export md_pets="\ue70b" +export md_pregnant_woman="\ue70c" +export md_record_voice_over="\ue70d" +export md_rounded_corner="\ue70e" +export md_rowing="\ue70f" +export md_timeline="\ue710" +export md_update="\ue711" +export md_watch_later="\ue712" +export md_pan_tool="\ue713" +export md_euro_symbol="\ue714" +export md_g_translate="\ue715" +export md_remove_shopping_cart="\ue716" +export md_restore_page="\ue717" +export md_speaker_notes_off="\ue718" +export md_delete_forever="\ue719" +export md_ac_unit="\ue71a" +export md_airport_shuttle="\ue71b" +export md_all_inclusive="\ue71c" +export md_beach_access="\ue71d" +export md_business_center="\ue71e" +export md_casino="\ue71f" +export md_child_care="\ue720" +export md_child_friendly="\ue721" +export md_fitness_center="\ue722" +export md_free_breakfast="\ue723" +export md_golf_course="\ue724" +export md_hot_tub="\ue725" +export md_kitchen="\ue726" +export md_pool="\ue727" +export md_room_service="\ue728" +export md_smoke_free="\ue729" +export md_smoking_rooms="\ue72a" +export md_spa="\ue72b" +export md_u10fffd="\ue72c" +export file_regex="\ue72d" +export file_arch_linux="\ue72e" +export file_e="\ue72f" +export file_glyphs="\ue730" +export file_knockout="\ue731" +export file_lean="\ue732" +export file_metal="\ue733" +export file_povray="\ue734" +export file_s="\ue735" +export file_tt="\ue736" +export file_vagrant="\ue737" +export file_xmos="\ue738" +export file_a="\ue739" +export file_chai="\ue73a" +export file_stylus="\ue73b" +export file_textile="\ue73c" +export file_unreal="\ue73d" +export file_purebasic="\ue73e" +export file_ts="\ue73f" +export file_scheme="\ue740" +export file_textmate="\ue741" +export file_x10="\ue742" +export file_apl="\ue743" +export file_ansible="\ue744" +export file_arttext="\ue745" +export file_antwar="\ue746" +export file_opa="\ue747" +export file_codecov="\ue748" +export file_yang="\ue749" +export file_pm2="\ue74a" +export file_hg="\ue74b" +export file_pawn="\ue74c" +export file_julia="\ue74d" +export file_shipit="\ue74e" +export file_mocha="\ue74f" +export file_nib="\ue750" +export file_shuriken="\ue751" +export file_alex="\ue752" +export file_twig="\ue753" +export file_1c="\ue754" +export file_tex="\ue755" +export file_bibtex="\ue756" +export file_mustache="\ue757" +export file_gulp="\ue758" +export file_grunt="\ue759" +export file_ember="\ue75a" +export file_go="\ue75b" +export file_jenkins="\ue75c" +export file_gnu="\ue75d" +export file_composer="\ue75e" +export file_meteor="\ue75f" +export file_ai="\ue760" +export file_psd="\ue761" +export file_silverstripe="\ue762" +export file_maxscript="\ue763" +export file_kivy="\ue764" +export file_crystal="\ue765" +export file_gradle="\ue766" +export file_groovy="\ue767" +export file_r="\ue768" +export file_vue="\ue769" +export file_haxe="\ue76a" +export file_lisp="\ue76b" +export file_e909="\ue76c" +export file_fortran="\ue76d" +export file_ada="\ue76e" +export file_dyalog="\ue76f" +export file_jade="\ue770" +export file_e90e="\ue771" +export file_font="\ue772" +export file_postcss="\ue773" +export file_scad="\ue774" +export file_e912="\ue775" +export file_raml="\ue776" +export file_ls="\ue777" +export file_saltstack="\ue778" +export file_terraform="\ue779" +export file_org="\ue77a" +export file_asciidoc="\ue77b" +export file_riot="\ue77c" +export file_ocaml="\ue77d" +export file_lua="\ue77e" +export file_npm="\ue77f" +export file_llvm="\ue780" +export file_e91e="\ue781" +export file_babel="\ue782" +export file_marko="\ue783" +export file_flow="\ue784" +export file_broccoli="\ue785" +export file_appveyor="\ue786" +export file_cakefile="\ue787" +export file_apple="\ue788" +export file_emacs="\ue789" +export file_sketch="\ue78a" +export file_doxygen="\ue78b" +export file_cf="\ue78c" +export file_pascal="\ue78d" +export file_abap="\ue78e" +export file_antlr="\ue78f" +export file_api="\ue790" +export file_as="\ue791" +export file_arc="\ue792" +export file_arduino="\ue793" +export file_augeas="\ue794" +export file_ahk="\ue795" +export file_autoit="\ue796" +export file_ats="\ue797" +export file_alloy="\ue798" +export file_manpage="\ue799" +export file_j="\ue79a" +export file_glade="\ue79b" +export file_boo="\ue79c" +export file_brain="\ue79d" +export file_bro="\ue79e" +export file_bluespec="\ue79f" +export file_stylelint="\ue7a0" +export file_ant="\ue7a1" +export file_cmake="\ue7a2" +export file_clips="\ue7a3" +export file_mapbox="\ue7a4" +export file_cp="\ue7a5" +export file_chuck="\ue7a6" +export file_jinja="\ue7a7" +export file_isabelle="\ue7a8" +export file_doge="\ue7a9" +export file_idl="\ue7aa" +export file_jake="\ue7ab" +export file_verilog="\ue7ac" +export file_phalcon="\ue7ad" +export file_fabfile="\ue7ae" +export file_lfe="\ue7af" +export file_nmap="\ue7b0" +export file_ampl="\ue7b1" +export file_ceylon="\ue7b2" +export file_chapel="\ue7b3" +export file_cirru="\ue7b4" +export file_clarion="\ue7b5" +export file_nunjucks="\ue7b6" +export file_mediawiki="\ue7b7" +export file_postscript="\ue7b8" +export file_tcl="\ue7b9" +export file_owl="\ue7ba" +export file_jsonld="\ue7bb" +export file_sparql="\ue7bc" +export file_sas="\ue7bd" +export file_clean="\ue7be" +export file_click="\ue7bf" +export file_nvidia="\ue7c0" +export file_creole="\ue7c1" +export file_coq="\ue7c2" +export file_diff="\ue7c3" +export file_patch="\ue7c4" +export file_byond="\ue7c5" +export file_cython="\ue7c6" +export file_darcs="\ue7c7" +export file_eagle="\ue7c8" +export file_ecere="\ue7c9" +export file_eiffel="\ue7ca" +export file_em="\ue7cb" +export file_flux="\ue7cc" +export file_factor="\ue7cd" +export file_fancy="\ue7ce" +export file_perl6="\ue7cf" +export file_gentoo="\ue7d0" +export file_frege="\ue7d1" +export file_fantom="\ue7d2" +export file_freemarker="\ue7d3" +export file_gap="\ue7d4" +export file_cl="\ue7d5" +export file_gams="\ue7d6" +export file_godot="\ue7d7" +export file_gml="\ue7d8" +export file_genshi="\ue7d9" +export file_pointwise="\ue7da" +export file_gf="\ue7db" +export file_golo="\ue7dc" +export file_gosu="\ue7dd" +export file_harbour="\ue7de" +export file_graphql="\ue7df" +export file_graphviz="\ue7e0" +export file_hashicorp="\ue7e1" +export file_hy="\ue7e2" +export file_igorpro="\ue7e3" +export file_io="\ue7e4" +export file_ioke="\ue7e5" +export file_idris="\ue7e6" +export file_inform7="\ue7e7" +export file_inno="\ue7e8" +export file_sublime="\ue7e9" +export file_jupyter="\ue7ea" +export file_krl="\ue7eb" +export file_kotlin="\ue7ec" +export file_labview="\ue7ed" +export file_lsl="\ue7ee" +export file_lasso="\ue7ef" +export file_logtalk="\ue7f0" +export file_lookml="\ue7f1" +export file_mako="\ue7f2" +export file_mathematica="\ue7f3" +export file_matlab="\ue7f4" +export file_e992="\ue7f5" +export file_max="\ue7f6" +export file_mercury="\ue7f7" +export file_mirah="\ue7f8" +export file_modula2="\ue7f9" +export file_monkey="\ue7fa" +export file_nimrod="\ue7fb" +export file_nit="\ue7fc" +export file_nix="\ue7fd" +export file_amx="\ue7fe" +export file_netlogo="\ue7ff" +export file_numpy="\ue800" +export file_objj="\ue801" +export file_opencl="\ue802" +export file_processing="\ue803" +export file_ox="\ue804" +export file_scd="\ue805" +export file_stata="\ue806" +export file_stan="\ue807" +export file_sqf="\ue808" +export file_slash="\ue809" +export file_shen="\ue80a" +export file_self="\ue80b" +export file_scilab="\ue80c" +export file_vhdl="\ue80d" +export file_sage="\ue80e" +export file_robot="\ue80f" +export file_red="\ue810" +export file_rebol="\ue811" +export file_xojo="\ue812" +export file_rdoc="\ue813" +export file_racket="\ue814" +export file_purescript="\ue815" +export file_uno="\ue816" +export file_varnish="\ue817" +export file_propeller="\ue818" +export file_turing="\ue819" +export file_pony="\ue81a" +export file_pogo="\ue81b" +export file_pike="\ue81c" +export file_urweb="\ue81d" +export file_parrot="\ue81e" +export file_papyrus="\ue81f" +export file_pan="\ue820" +export file_oz="\ue821" +export file_oxygene="\ue822" +export file_progress="\ue823" +export file_txl="\ue824" +export file_cabal="\ue825" +export file_sysverilog="\ue826" +export file_pickle="\ue827" +export file_xpages="\ue828" +export file_xtend="\ue829" +export file_zephir="\ue82a" +export file_zimpl="\ue82b" +export file_ec="\ue82c" +export file_mupad="\ue82d" +export file_ooc="\ue82e" +export file_rst="\ue82f" +export file_karma="\ue830" +export file_hack="\ue831" +export file_shopify="\ue832" +export file_pug_alt="\ue833" +export file_e9d1="\ue834" +export file_sbt="\ue835" +export file_e9d3="\ue836" +export file_scrutinizer="\ue837" +export file_cc="\ue838" +export file_brakeman="\ue839" +export file_newrelic="\ue83a" +export file_thor="\ue83b" +export file_nuget="\ue83c" +export file_powershell="\ue83d" +export file_sf="\ue83e" +export file_minecraft="\ue83f" +export file_sqlite="\ue840" +export file_protractor="\ue841" +export file_typings="\ue842" +export file_strings="\ue843" +export file_nant="\ue844" +export file_csscript="\ue845" +export file_cake="\ue846" +export file_openoffice="\ue847" +export file_keynote="\ue848" +export file_jsx="\ue849" +export file_tsx="\ue84a" +export file_model="\ue84b" +export file_finder="\ue84c" +export file_access="\ue84d" +export file_onenote="\ue84e" +export file_powerpoint="\ue84f" +export file_word="\ue850" +export file_excel="\ue851" +export file_storyist="\ue852" +export file_csound="\ue853" +export file_dbase="\ue854" +export file_zbrush="\ue855" +export file_ae="\ue856" +export file_indesign="\ue857" +export file_premiere="\ue858" +export file_maya="\ue859" +export file_e9f7="\ue85a" +export file_khronos="\ue85b" +export file_audacity="\ue85c" +export file_blender="\ue85d" +export file_lightwave="\ue85e" +export file_fbx="\ue85f" +export file_e9fd="\ue860" +export file_typedoc="\ue861" +export file_alpine="\ue862" +export file_yui="\ue863" +export file_ea01="\ue864" +export file_ea02="\ue865" +export file_ea03="\ue866" +export file_normalize="\ue867" +export file_neko="\ue868" +export file_mathjax="\ue869" +export file_leaflet="\ue86a" +export file_gdb="\ue86b" +export file_fuelux="\ue86c" +export file_eq="\ue86d" +export file_chartjs="\ue86e" +export file_ea0c="\ue86f" +export file_ea0d="\ue870" +export file_ea0e="\ue871" +export file_eslint="\ue872" +export file_d3="\ue873" +export file_cordova="\ue874" +export file_circleci="\ue875" +export file_pug="\ue876" +export file_powerbuilder="\ue877" +export file_dylib="\ue878" +export file_rexx="\ue879" +export file_svn="\ue87a" +export file_mruby="\ue87b" +export file_wercker="\ue87c" +export file_yarn="\ue87d" +export file_editorconfig="\ue87e" +export file_snyk="\ue87f" +export file_reason="\ue880" +export file_nsis="\ue881" +export file_v8="\ue882" +export file_rollup="\ue883" +export file_ea21="\ue884" +export file_ea22="\ue885" +export file_ea23="\ue886" +export file_rascal="\ue887" +export file_gn="\ue888" +export file_nodemon="\ue889" +export file_electron="\ue88a" +export file_1c_alt="\ue88b" +export file_swagger="\ue88c" +export file_bithound="\ue88d" +export file_polymer="\ue88e" +export file_platformio="\ue88f" +export file_shippable="\ue890" +export file_ea2e="\ue891" +export file_sequelize="\ue892" +export file_redux="\ue893" +export file_rspec="\ue894" +export file_phpunit="\ue895" +export file_octave="\ue896" +export file_nuclide="\ue897" +export file_infopath="\ue898" +export file_lime="\ue899" +export file_lerna="\ue89a" +export file_kitchenci="\ue89b" +export file_jest="\ue89c" +export file_jasmine="\ue89d" +export file_haxedevelop="\ue89e" +export file_gitlab="\ue89f" +export file_drone="\ue8a0" +export file_virtualbox="\ue8a1" +export file_doclets="\ue8a2" +export file_delphi="\ue8a3" +export file_codekit="\ue8a4" +export file_chef="\ue8a5" +export file_cakephp="\ue8a6" +export file_cobol="\ue8a7" +export file_bundler="\ue8a8" +export file_buck="\ue8a9" +export file_brunch="\ue8aa" +export file_aurelia="\ue8ab" +export file_vmware="\ue8ac" +export file_rhino="\ue8ad" +export file_ejs="\ue8ae" +export file_kicad="\ue8af" +export file_hoplon="\ue8b0" +export file_abif="\ue8b1" +export file_watchman="\ue8b2" +export file_p4="\ue8b3" +export file_nanoc="\ue8b4" +export file_miranda="\ue8b5" +export file_minizinc="\ue8b6" +export file_meson="\ue8b7" +export file_jison="\ue8b8" +export file_franca="\ue8b9" +export file_devicetree="\ue8ba" +export file_caddy="\ue8bb" +export file_bem="\ue8bc" +export file_bazel="\ue8bd" +export file_angelscript="\ue8be" +export file_esdoc="\ue8bf" +export file_twine="\ue8c0" +export file_squarespace="\ue8c1" +export file_phoenix="\ue8c2" +export file_test_dir="\ue8c3" +export file_webpack="\ue8c4" +export file_test_coffee="\ue8c5" +export file_test_generic="\ue8c6" +export file_test_js="\ue8c7" +export file_test_perl="\ue8c8" +export file_test_python="\ue8c9" +export file_test_react="\ue8ca" +export file_test_ruby="\ue8cb" +export file_test_ts="\ue8cc" +export file_codeship="\ue8cd" +export file_nxc="\ue8ce" +export file_brotli="\ue8cf" +export file_proselint="\ue8d0" +export file_bintray="\ue8d1" +export file_mjml="\ue8d2" +export file_wasm="\ue8d3" +export file_ea71="\ue8d4" +export file_nasm="\ue8d5" +export file_ea73="\ue8d6" +export file_peg="\ue8d7" +export file_jolie="\ue8d8" +export file_nano="\ue8d9" +export file_xamarin="\ue8da" +export file_f012="\ue8db" +export file_tag="\ue8dc" +export file_cucumber="\ue8dd" +export file_video="\ue8de" +export file_config="\ue8df" +export file_dashboard="\ue8e0" +export file_puppet="\ue8e1" +export file_terminal="\ue8e2" +export file_markdownlint="\ue8e3" +export file_react="\ue8e4" +export file_f101="\ue8e5" +export file_elm="\ue8e6" +export file_boot="\ue8e7" +export file_cljs="\ue8e8" +export file_lein="\ue8e9" +export file_docker="\ue8ea" +export file_php="\ue8eb" +export file_ionic="\ue8ec" +export file_haml="\ue8ed" +export file_f17b="\ue8ee" +export file_ff="\ue8ef" +export file_u1f3c1="\ue8f0" +export file_tern="\ue8f1" +export file_default="\ue8f2" +export file_sigils="\ue8f3" +export file_nginx="\ue8f4" +export weather_day_cloudy_gusts="\ue8f5" +export weather_day_cloudy_windy="\ue8f6" +export weather_day_cloudy="\ue8f7" +export weather_day_fog="\ue8f8" +export weather_day_hail="\ue8f9" +export weather_day_lightning="\ue8fa" +export weather_day_rain_mix="\ue8fb" +export weather_day_rain_wind="\ue8fc" +export weather_day_rain="\ue8fd" +export weather_day_showers="\ue8fe" +export weather_day_snow="\ue8ff" +export weather_day_sprinkle="\ue900" +export weather_day_sunny_overcast="\ue901" +export weather_day_sunny="\ue902" +export weather_day_storm_showers="\ue903" +export weather_day_thunderstorm="\ue904" +export weather_cloudy_gusts="\ue905" +export weather_cloudy_windy="\ue906" +export weather_cloudy="\ue907" +export weather_fog="\ue908" +export weather_hail="\ue909" +export weather_lightning="\ue90a" +export weather_rain_mix="\ue90b" +export weather_rain_wind="\ue90c" +export weather_rain="\ue90d" +export weather_showers="\ue90e" +export weather_snow="\ue90f" +export weather_sprinkle="\ue910" +export weather_storm_showers="\ue911" +export weather_thunderstorm="\ue912" +export weather_windy="\ue913" +export weather_night_alt_cloudy_gusts="\ue914" +export weather_night_alt_cloudy_windy="\ue915" +export weather_night_alt_hail="\ue916" +export weather_night_alt_lightning="\ue917" +export weather_night_alt_rain_mix="\ue918" +export weather_night_alt_rain_wind="\ue919" +export weather_night_alt_rain="\ue91a" +export weather_night_alt_showers="\ue91b" +export weather_night_alt_snow="\ue91c" +export weather_night_alt_sprinkle="\ue91d" +export weather_night_alt_storm_showers="\ue91e" +export weather_night_alt_thunderstorm="\ue91f" +export weather_night_clear="\ue920" +export weather_night_cloudy_gusts="\ue921" +export weather_night_cloudy_windy="\ue922" +export weather_night_cloudy="\ue923" +export weather_night_hail="\ue924" +export weather_night_lightning="\ue925" +export weather_night_rain_mix="\ue926" +export weather_night_rain_wind="\ue927" +export weather_night_rain="\ue928" +export weather_night_showers="\ue929" +export weather_night_snow="\ue92a" +export weather_night_sprinkle="\ue92b" +export weather_night_storm_showers="\ue92c" +export weather_night_thunderstorm="\ue92d" +export weather_celsius="\ue92e" +export weather_cloud_down="\ue92f" +export weather_cloud_refresh="\ue930" +export weather_cloud_up="\ue931" +export weather_cloud="\ue932" +export weather_degrees="\ue933" +export weather_direction_down_left="\ue934" +export weather_direction_down="\ue935" +export weather_fahrenheit="\ue936" +export weather_horizon_alt="\ue937" +export weather_horizon="\ue938" +export weather_direction_left="\ue939" +export weather_f049="\ue93a" +export weather_night_fog="\ue93b" +export weather_refresh_alt="\ue93c" +export weather_refresh="\ue93d" +export weather_direction_right="\ue93e" +export weather_raindrops="\ue93f" +export weather_strong_wind="\ue940" +export weather_sunrise="\ue941" +export weather_sunset="\ue942" +export weather_thermometer_exterior="\ue943" +export weather_thermometer_internal="\ue944" +export weather_thermometer="\ue945" +export weather_tornado="\ue946" +export weather_direction_up_right="\ue947" +export weather_direction_up="\ue948" +export weather_f059="\ue949" +export weather_f05a="\ue94a" +export weather_f05b="\ue94b" +export weather_f05c="\ue94c" +export weather_f05d="\ue94d" +export weather_f05e="\ue94e" +export weather_f060="\ue94f" +export weather_f061="\ue950" +export weather_smoke="\ue951" +export weather_dust="\ue952" +export weather_snow_wind="\ue953" +export weather_day_snow_wind="\ue954" +export weather_night_snow_wind="\ue955" +export weather_night_alt_snow_wind="\ue956" +export weather_day_sleet_storm="\ue957" +export weather_night_sleet_storm="\ue958" +export weather_night_alt_sleet_storm="\ue959" +export weather_day_snow_thunderstorm="\ue95a" +export weather_night_snow_thunderstorm="\ue95b" +export weather_night_alt_snow_thunderstorm="\ue95c" +export weather_solar_eclipse="\ue95d" +export weather_lunar_eclipse="\ue95e" +export weather_meteor="\ue95f" +export weather_hot="\ue960" +export weather_hurricane="\ue961" +export weather_smog="\ue962" +export weather_alien="\ue963" +export weather_snowflake_cold="\ue964" +export weather_stars="\ue965" +export weather_raindrop="\ue966" +export weather_barometer="\ue967" +export weather_humidity="\ue968" +export weather_na="\ue969" +export weather_flood="\ue96a" +export weather_day_cloudy_high="\ue96b" +export weather_night_alt_cloudy_high="\ue96c" +export weather_night_cloudy_high="\ue96d" +export weather_night_alt_partly_cloudy="\ue96e" +export weather_sandstorm="\ue96f" +export weather_night_partly_cloudy="\ue970" +export weather_umbrella="\ue971" +export weather_day_windy="\ue972" +export weather_night_alt_cloudy="\ue973" +export weather_direction_up_left="\ue974" +export weather_direction_down_right="\ue975" +export weather_time_12="\ue976" +export weather_time_1="\ue977" +export weather_time_2="\ue978" +export weather_time_3="\ue979" +export weather_time_4="\ue97a" +export weather_time_5="\ue97b" +export weather_time_6="\ue97c" +export weather_time_7="\ue97d" +export weather_time_8="\ue97e" +export weather_time_9="\ue97f" +export weather_time_10="\ue980" +export weather_time_11="\ue981" +export weather_moon_new="\ue982" +export weather_moon_waxing_crescent_1="\ue983" +export weather_moon_waxing_crescent_2="\ue984" +export weather_moon_waxing_crescent_3="\ue985" +export weather_moon_waxing_crescent_4="\ue986" +export weather_moon_waxing_crescent_5="\ue987" +export weather_moon_waxing_crescent_6="\ue988" +export weather_moon_first_quarter="\ue989" +export weather_moon_waxing_gibbous_1="\ue98a" +export weather_moon_waxing_gibbous_2="\ue98b" +export weather_moon_waxing_gibbous_3="\ue98c" +export weather_moon_waxing_gibbous_4="\ue98d" +export weather_moon_waxing_gibbous_5="\ue98e" +export weather_moon_waxing_gibbous_6="\ue98f" +export weather_moon_full="\ue990" +export weather_moon_waning_gibbous_1="\ue991" +export weather_moon_waning_gibbous_2="\ue992" +export weather_moon_waning_gibbous_3="\ue993" +export weather_moon_waning_gibbous_4="\ue994" +export weather_moon_waning_gibbous_5="\ue995" +export weather_moon_waning_gibbous_6="\ue996" +export weather_moon_third_quarter="\ue997" +export weather_moon_waning_crescent_1="\ue998" +export weather_moon_waning_crescent_2="\ue999" +export weather_moon_waning_crescent_3="\ue99a" +export weather_moon_waning_crescent_4="\ue99b" +export weather_moon_waning_crescent_5="\ue99c" +export weather_moon_waning_crescent_6="\ue99d" +export weather_wind_direction="\ue99e" +export weather_day_sleet="\ue99f" +export weather_night_sleet="\ue9a0" +export weather_night_alt_sleet="\ue9a1" +export weather_sleet="\ue9a2" +export weather_day_haze="\ue9a3" +export weather_wind_beaufort_0="\ue9a4" +export weather_wind_beaufort_1="\ue9a5" +export weather_wind_beaufort_2="\ue9a6" +export weather_wind_beaufort_3="\ue9a7" +export weather_wind_beaufort_4="\ue9a8" +export weather_wind_beaufort_5="\ue9a9" +export weather_wind_beaufort_6="\ue9aa" +export weather_wind_beaufort_7="\ue9ab" +export weather_wind_beaufort_8="\ue9ac" +export weather_wind_beaufort_9="\ue9ad" +export weather_wind_beaufort_10="\ue9ae" +export weather_wind_beaufort_11="\ue9af" +export weather_wind_beaufort_12="\ue9b0" +export weather_day_light_wind="\ue9b1" +export weather_tsunami="\ue9b2" +export weather_earthquake="\ue9b3" +export weather_fire="\ue9b4" +export weather_volcano="\ue9b5" +export weather_moonrise="\ue9b6" +export weather_moonset="\ue9b7" +export weather_train="\ue9b8" +export weather_small_craft_advisory="\ue9b9" +export weather_gale_warning="\ue9ba" +export weather_storm_warning="\ue9bb" +export weather_hurricane_warning="\ue9bc" +export weather_moon_alt_waxing_crescent_1="\ue9bd" +export weather_moon_alt_waxing_crescent_2="\ue9be" +export weather_moon_alt_waxing_crescent_3="\ue9bf" +export weather_moon_alt_waxing_crescent_4="\ue9c0" +export weather_moon_alt_waxing_crescent_5="\ue9c1" +export weather_moon_alt_waxing_crescent_6="\ue9c2" +export weather_moon_alt_first_quarter="\ue9c3" +export weather_moon_alt_waxing_gibbous_1="\ue9c4" +export weather_moon_alt_waxing_gibbous_2="\ue9c5" +export weather_moon_alt_waxing_gibbous_3="\ue9c6" +export weather_moon_alt_waxing_gibbous_4="\ue9c7" +export weather_moon_alt_waxing_gibbous_5="\ue9c8" +export weather_moon_alt_waxing_gibbous_6="\ue9c9" +export weather_moon_alt_full="\ue9ca" +export weather_moon_alt_waning_gibbous_1="\ue9cb" +export weather_moon_alt_waning_gibbous_2="\ue9cc" +export weather_moon_alt_waning_gibbous_3="\ue9cd" +export weather_moon_alt_waning_gibbous_4="\ue9ce" +export weather_moon_alt_waning_gibbous_5="\ue9cf" +export weather_moon_alt_waning_gibbous_6="\ue9d0" +export weather_moon_alt_third_quarter="\ue9d1" +export weather_moon_alt_waning_crescent_1="\ue9d2" +export weather_moon_alt_waning_crescent_2="\ue9d3" +export weather_moon_alt_waning_crescent_3="\ue9d4" +export weather_moon_alt_waning_crescent_4="\ue9d5" +export weather_moon_alt_waning_crescent_5="\ue9d6" +export weather_moon_alt_waning_crescent_6="\ue9d7" +export weather_moon_alt_new="\ue9d8" +export linux_archlinux="\ue9d9" +export linux_centos="\ue9da" +export linux_debian="\ue9db" +export linux_fedora="\ue9dc" +export linux_linuxmint="\ue9dd" +export linux_linuxmint_inverse="\ue9de" +export linux_mageia="\ue9df" +export linux_mandriva="\ue9e0" +export linux_opensuse="\ue9e1" +export linux_redhat="\ue9e2" +export linux_slackware="\ue9e3" +export linux_slackware_inverse="\ue9e4" +export linux_ubuntu="\ue9e5" +export linux_ubuntu_inverse="\ue9e6" +export linux_freebsd="\ue9e7" +export linux_coreos="\ue9e8" +export linux_gentoo="\ue9e9" +export linux_elementary="\ue9ea" +export linux_fedora_inverse="\ue9eb" +export linux_sabayon="\ue9ec" +export linux_aosc="\ue9ed" +export linux_nixos="\ue9ee" +export linux_tux="\ue9ef" +export linux_raspberry_pi="\ue9f0" +export linux_manjaro="\ue9f1" +export linux_apple="\ue9f2" +export linux_docker="\ue9f3" +export linux_alpine="\ue9f4" +export myicons_0001="\ue9f5" +export myicons_0002="\ue9f6" +export myicons_0003="\ue9f7" +export myicons_0004="\ue9f8" +export myicons_0005="\ue9f9" +export myicons_0006="\ue9fa" +export myicons_0007="\ue9fb" +export myicons_0008="\ue9fc" +export myicons_0009="\ue9fd" +export myicons_000a="\ue9fe" +export myicons_000b="\ue9ff" +export myicons_000d="\uea00" +export myicons_000e="\uea01" +export myicons_0010="\uea02" +export myicons_0011="\uea03" +export myicons_0013="\uea04" +export myicons_0014="\uea05" +export myicons_arch_linux_arrow="\uea06" +export dev_bing_small="\uea07" +export dev_css_tricks="\uea08" +export dev_git="\uea09" +export dev_bitbucket="\uea0a" +export dev_mysql="\uea0b" +export dev_streamline="\uea0c" +export dev_database="\uea0d" +export dev_dropbox="\uea0e" +export dev_github_alt="\uea0f" +export dev_github_badge="\uea10" +export dev_github="\uea11" +export dev_wordpress="\uea12" +export dev_visualstudio="\uea13" +export dev_jekyll_small="\uea14" +export dev_android="\uea15" +export dev_windows="\uea16" +export dev_stackoverflow="\uea17" +export dev_apple="\uea18" +export dev_linux="\uea19" +export dev_appstore="\uea1a" +export dev_ghost_small="\uea1b" +export dev_yahoo="\uea1c" +export dev_codepen="\uea1d" +export dev_github_full="\uea1e" +export dev_nodejs_small="\uea1f" +export dev_nodejs="\uea20" +export dev_hackernews="\uea21" +export dev_ember="\uea22" +export dev_dojo="\uea23" +export dev_django="\uea24" +export dev_npm="\uea25" +export dev_ghost="\uea26" +export dev_modernizr="\uea27" +export dev_unity_small="\uea28" +export dev_raspberry_pi="\uea29" +export dev_blackberry="\uea2a" +export dev_go="\uea2b" +export dev_git_branch="\uea2c" +export dev_git_pull_request="\uea2d" +export dev_git_merge="\uea2e" +export dev_git_compare="\uea2f" +export dev_git_commit="\uea30" +export dev_cssdeck="\uea31" +export dev_yahoo_small="\uea32" +export dev_techcrunch="\uea33" +export dev_smashing_magazine="\uea34" +export dev_netmagazine="\uea35" +export dev_codrops="\uea36" +export dev_phonegap="\uea37" +export dev_google_drive="\uea38" +export dev_html5_multimedia="\uea39" +export dev_html5_device_access="\uea3a" +export dev_html5_connectivity="\uea3b" +export dev_html5_3d_effects="\uea3c" +export dev_html5="\uea3d" +export dev_scala="\uea3e" +export dev_java="\uea3f" +export dev_ruby="\uea40" +export dev_ubuntu="\uea41" +export dev_ruby_on_rails="\uea42" +export dev_python="\uea43" +export dev_php="\uea44" +export dev_markdown="\uea45" +export dev_laravel="\uea46" +export dev_magento="\uea47" +export dev_joomla="\uea48" +export dev_drupal="\uea49" +export dev_chrome="\uea4a" +export dev_ie="\uea4b" +export dev_firefox="\uea4c" +export dev_opera="\uea4d" +export dev_bootstrap="\uea4e" +export dev_safari="\uea4f" +export dev_css3="\uea50" +export dev_css3_full="\uea51" +export dev_sass="\uea52" +export dev_grunt="\uea53" +export dev_bower="\uea54" +export dev_javascript="\uea55" +export dev_javascript_shield="\uea56" +export dev_jquery="\uea57" +export dev_coffeescript="\uea58" +export dev_backbone="\uea59" +export dev_angular="\uea5a" +export dev_jquery_ui="\uea5b" +export dev_swift="\uea5c" +export dev_symfony="\uea5d" +export dev_symfony_badge="\uea5e" +export dev_less="\uea5f" +export dev_stylus="\uea60" +export dev_trello="\uea61" +export dev_atlassian="\uea62" +export dev_jira="\uea63" +export dev_envato="\uea64" +export dev_snap_svg="\uea65" +export dev_raphael="\uea66" +export dev_google_analytics="\uea67" +export dev_compass="\uea68" +export dev_onedrive="\uea69" +export dev_gulp="\uea6a" +export dev_atom="\uea6b" +export dev_cisco="\uea6c" +export dev_nancy="\uea6d" +export dev_jenkins="\uea6e" +export dev_clojure="\uea6f" +export dev_perl="\uea70" +export dev_clojure_alt="\uea71" +export dev_celluloid="\uea72" +export dev_w3c="\uea73" +export dev_redis="\uea74" +export dev_postgresql="\uea75" +export dev_webplatform="\uea76" +export dev_requirejs="\uea77" +export dev_opensource="\uea78" +export dev_typo3="\uea79" +export dev_uikit="\uea7a" +export dev_doctrine="\uea7b" +export dev_groovy="\uea7c" +export dev_nginx="\uea7d" +export dev_haskell="\uea7e" +export dev_zend="\uea7f" +export dev_gnu="\uea80" +export dev_yeoman="\uea81" +export dev_heroku="\uea82" +export dev_msql_server="\uea83" +export dev_debian="\uea84" +export dev_travis="\uea85" +export dev_dotnet="\uea86" +export dev_codeigniter="\uea87" +export dev_javascript_badge="\uea88" +export dev_yii="\uea89" +export dev_composer="\uea8a" +export dev_krakenjs_badge="\uea8b" +export dev_krakenjs="\uea8c" +export dev_mozilla="\uea8d" +export dev_firebase="\uea8e" +export dev_sizzlejs="\uea8f" +export dev_creativecommons="\uea90" +export dev_creativecommons_badge="\uea91" +export dev_mitlicence="\uea92" +export dev_senchatouch="\uea93" +export dev_bugsense="\uea94" +export dev_extjs="\uea95" +export dev_mootools_badge="\uea96" +export dev_mootools="\uea97" +export dev_ruby_rough="\uea98" +export dev_komodo="\uea99" +export dev_coda="\uea9a" +export dev_bintray="\uea9b" +export dev_terminal="\uea9c" +export dev_code="\uea9d" +export dev_responsive="\uea9e" +export dev_dart="\uea9f" +export dev_aptana="\ueaa0" +export dev_mailchimp="\ueaa1" +export dev_netbeans="\ueaa2" +export dev_dreamweaver="\ueaa3" +export dev_brackets="\ueaa4" +export dev_eclipse="\ueaa5" +export dev_cloud9="\ueaa6" +export dev_scrum="\ueaa7" +export dev_prolog="\ueaa8" +export dev_terminal_badge="\ueaa9" +export dev_code_badge="\ueaaa" +export dev_mongodb="\ueaab" +export dev_meteor="\ueaac" +export dev_meteorfull="\ueaad" +export dev_fsharp="\ueaae" +export dev_rust="\ueaaf" +export dev_ionic="\ueab0" +export dev_sublime="\ueab1" +export dev_appcelerator="\ueab2" +export dev_asterisk="\ueab3" +export dev_aws="\ueab4" +export dev_digital_ocean="\ueab5" +export dev_dlang="\ueab6" +export dev_docker="\ueab7" +export dev_erlang="\ueab8" +export dev_google_cloud_platform="\ueab9" +export dev_grails="\ueaba" +export dev_illustrator="\ueabb" +export dev_intellij="\ueabc" +export dev_materializecss="\ueabd" +export dev_openshift="\ueabe" +export dev_photoshop="\ueabf" +export dev_rackspace="\ueac0" +export dev_react="\ueac1" +export dev_redhat="\ueac2" +export dev_scriptcs="\ueac3" +export dev_e6bd="\ueac4" +export dev_e6be="\ueac5" +export dev_e6bf="\ueac6" +export dev_e6c0="\ueac7" +export dev_e6c1="\ueac8" +export dev_e6c2="\ueac9" +export dev_e6c3="\ueaca" +export dev_sqllite="\ueacb" +export dev_vim="\ueacc" +export pom_clean_code="\ueacd" +export pom_pomodoro_done="\ueace" +export pom_pomodoro_estimated="\ueacf" +export pom_pomodoro_ticking="\uead0" +export pom_pomodoro_squashed="\uead1" +export pom_short_pause="\uead2" +export pom_long_pause="\uead3" +export pom_away="\uead4" +export pom_pair_programming="\uead5" +export pom_internal_interruption="\uead6" +export pom_external_interruption="\uead7" +export linea_arrows_anticlockwise="\uead8" +export linea_arrows_anticlockwise_dashed="\uead9" +export linea_arrows_button_down="\ueada" +export linea_arrows_button_off="\ueadb" +export linea_arrows_button_on="\ueadc" +export linea_arrows_button_up="\ueadd" +export linea_arrows_check="\ueade" +export linea_arrows_circle_check="\ueadf" +export linea_arrows_circle_down="\ueae0" +export linea_arrows_circle_downleft="\ueae1" +export linea_arrows_circle_downright="\ueae2" +export linea_arrows_circle_left="\ueae3" +export linea_arrows_circle_minus="\ueae4" +export linea_arrows_circle_plus="\ueae5" +export linea_arrows_circle_remove="\ueae6" +export linea_arrows_circle_right="\ueae7" +export linea_arrows_circle_up="\ueae8" +export linea_arrows_circle_upleft="\ueae9" +export linea_arrows_circle_upright="\ueaea" +export linea_arrows_clockwise="\ueaeb" +export linea_arrows_clockwise_dashed="\ueaec" +export linea_arrows_compress="\ueaed" +export linea_arrows_deny="\ueaee" +export linea_arrows_diagonal="\ueaef" +export linea_arrows_diagonal2="\ueaf0" +export linea_arrows_down="\ueaf1" +export linea_arrows_down_double="\ueaf2" +export linea_arrows_downleft="\ueaf3" +export linea_arrows_downright="\ueaf4" +export linea_arrows_drag_down="\ueaf5" +export linea_arrows_drag_down_dashed="\ueaf6" +export linea_arrows_drag_horiz="\ueaf7" +export linea_arrows_drag_left="\ueaf8" +export linea_arrows_drag_left_dashed="\ueaf9" +export linea_arrows_drag_right="\ueafa" +export linea_arrows_drag_right_dashed="\ueafb" +export linea_arrows_drag_up="\ueafc" +export linea_arrows_drag_up_dashed="\ueafd" +export linea_arrows_drag_vert="\ueafe" +export linea_arrows_exclamation="\ueaff" +export linea_arrows_expand="\ueb00" +export linea_arrows_expand_diagonal1="\ueb01" +export linea_arrows_expand_horizontal1="\ueb02" +export linea_arrows_expand_vertical1="\ueb03" +export linea_arrows_fit_horizontal="\ueb04" +export linea_arrows_fit_vertical="\ueb05" +export linea_arrows_glide="\ueb06" +export linea_arrows_glide_horizontal="\ueb07" +export linea_arrows_glide_vertical="\ueb08" +export linea_arrows_hamburger1="\ueb09" +export linea_arrows_hamburger_2="\ueb0a" +export linea_arrows_horizontal="\ueb0b" +export linea_arrows_info="\ueb0c" +export linea_arrows_keyboard_alt="\ueb0d" +export linea_arrows_keyboard_cmd="\ueb0e" +export linea_arrows_keyboard_delete="\ueb0f" +export linea_arrows_keyboard_down="\ueb10" +export linea_arrows_keyboard_left="\ueb11" +export linea_arrows_keyboard_return="\ueb12" +export linea_arrows_keyboard_right="\ueb13" +export linea_arrows_keyboard_shift="\ueb14" +export linea_arrows_keyboard_tab="\ueb15" +export linea_arrows_keyboard_up="\ueb16" +export linea_arrows_left="\ueb17" +export linea_arrows_left_double_32="\ueb18" +export linea_arrows_minus="\ueb19" +export linea_arrows_move="\ueb1a" +export linea_arrows_move2="\ueb1b" +export linea_arrows_move_bottom="\ueb1c" +export linea_arrows_move_left="\ueb1d" +export linea_arrows_move_right="\ueb1e" +export linea_arrows_move_top="\ueb1f" +export linea_arrows_plus="\ueb20" +export linea_arrows_question="\ueb21" +export linea_arrows_remove="\ueb22" +export linea_arrows_right="\ueb23" +export linea_arrows_right_double="\ueb24" +export linea_arrows_rotate="\ueb25" +export linea_arrows_rotate_anti="\ueb26" +export linea_arrows_rotate_anti_dashed="\ueb27" +export linea_arrows_rotate_dashed="\ueb28" +export linea_arrows_shrink="\ueb29" +export linea_arrows_shrink_diagonal1="\ueb2a" +export linea_arrows_shrink_diagonal2="\ueb2b" +export linea_arrows_shrink_horizonal2="\ueb2c" +export linea_arrows_shrink_horizontal1="\ueb2d" +export linea_arrows_shrink_vertical1="\ueb2e" +export linea_arrows_shrink_vertical2="\ueb2f" +export linea_arrows_sign_down="\ueb30" +export linea_arrows_sign_left="\ueb31" +export linea_arrows_sign_right="\ueb32" +export linea_arrows_sign_up="\ueb33" +export linea_arrows_slide_down1="\ueb34" +export linea_arrows_slide_down2="\ueb35" +export linea_arrows_slide_left1="\ueb36" +export linea_arrows_slide_left2="\ueb37" +export linea_arrows_slide_right1="\ueb38" +export linea_arrows_slide_right2="\ueb39" +export linea_arrows_slide_up1="\ueb3a" +export linea_arrows_slide_up2="\ueb3b" +export linea_arrows_slim_down="\ueb3c" +export linea_arrows_slim_down_dashed="\ueb3d" +export linea_arrows_slim_left="\ueb3e" +export linea_arrows_slim_left_dashed="\ueb3f" +export linea_arrows_slim_right="\ueb40" +export linea_arrows_slim_right_dashed="\ueb41" +export linea_arrows_slim_up="\ueb42" +export linea_arrows_slim_up_dashed="\ueb43" +export linea_arrows_square_check="\ueb44" +export linea_arrows_square_down="\ueb45" +export linea_arrows_square_downleft="\ueb46" +export linea_arrows_square_downright="\ueb47" +export linea_arrows_square_left="\ueb48" +export linea_arrows_square_minus="\ueb49" +export linea_arrows_square_plus="\ueb4a" +export linea_arrows_square_remove="\ueb4b" +export linea_arrows_square_right="\ueb4c" +export linea_arrows_square_up="\ueb4d" +export linea_arrows_square_upleft="\ueb4e" +export linea_arrows_square_upright="\ueb4f" +export linea_arrows_squares="\ueb50" +export linea_arrows_stretch_diagonal1="\ueb51" +export linea_arrows_stretch_diagonal2="\ueb52" +export linea_arrows_stretch_diagonal3="\ueb53" +export linea_arrows_stretch_diagonal4="\ueb54" +export linea_arrows_stretch_horizontal1="\ueb55" +export linea_arrows_stretch_horizontal2="\ueb56" +export linea_arrows_stretch_vertical1="\ueb57" +export linea_arrows_stretch_vertical2="\ueb58" +export linea_arrows_switch_horizontal="\ueb59" +export linea_arrows_switch_vertical="\ueb5a" +export linea_arrows_up="\ueb5b" +export linea_arrows_up_double_33="\ueb5c" +export linea_arrows_upleft="\ueb5d" +export linea_arrows_upright="\ueb5e" +export linea_arrows_vertical="\ueb5f" +export linea_basic_lock_open="\ueb60" +export linea_basic_magic_mouse="\ueb61" +export linea_basic_magnifier="\ueb62" +export linea_basic_magnifier_minus="\ueb63" +export linea_basic_magnifier_plus="\ueb64" +export linea_basic_mail="\ueb65" +export linea_basic_mail_multiple="\ueb66" +export linea_basic_mail_open="\ueb67" +export linea_basic_mail_open_text="\ueb68" +export linea_basic_male="\ueb69" +export linea_basic_map="\ueb6a" +export linea_basic_message="\ueb6b" +export linea_basic_message_multiple="\ueb6c" +export linea_basic_message_txt="\ueb6d" +export linea_basic_mixer2="\ueb6e" +export linea_basic_info="\ueb6f" +export linea_basic_ipod="\ueb70" +export linea_basic_joypad="\ueb71" +export linea_basic_key="\ueb72" +export linea_basic_keyboard="\ueb73" +export linea_basic_laptop="\ueb74" +export linea_basic_life_buoy="\ueb75" +export linea_basic_lightbulb="\ueb76" +export linea_basic_link="\ueb77" +export linea_basic_lock="\ueb78" +export linea_basic_mouse="\ueb79" +export linea_basic_notebook="\ueb7a" +export linea_basic_notebook_pen="\ueb7b" +export linea_basic_notebook_pencil="\ueb7c" +export linea_basic_paperplane="\ueb7d" +export linea_basic_pencil_ruler="\ueb7e" +export linea_basic_pencil_ruler_pen="\ueb7f" +export linea_basic_clubs="\ueb80" +export linea_basic_compass="\ueb81" +export linea_basic_cup="\ueb82" +export linea_basic_diamonds="\ueb83" +export linea_basic_display="\ueb84" +export linea_basic_download="\ueb85" +export linea_basic_exclamation="\ueb86" +export linea_basic_eye="\ueb87" +export linea_basic_eye_closed="\ueb88" +export linea_basic_female="\ueb89" +export linea_basic_flag1="\ueb8a" +export linea_basic_flag2="\ueb8b" +export linea_basic_floppydisk="\ueb8c" +export linea_basic_folder="\ueb8d" +export linea_basic_folder_multiple="\ueb8e" +export linea_basic_gear="\ueb8f" +export linea_basic_geolocalize_01="\ueb90" +export linea_basic_geolocalize_05="\ueb91" +export linea_basic_globe="\ueb92" +export linea_basic_gunsight="\ueb93" +export linea_basic_hammer="\ueb94" +export linea_basic_headset="\ueb95" +export linea_basic_heart="\ueb96" +export linea_basic_heart_broken="\ueb97" +export linea_basic_helm="\ueb98" +export linea_basic_home="\ueb99" +export linea_basic_photo="\ueb9a" +export linea_basic_rss="\ueb9b" +export linea_basic_picture="\ueb9c" +export linea_basic_picture_multiple="\ueb9d" +export linea_basic_pin1="\ueb9e" +export linea_basic_pin2="\ueb9f" +export linea_basic_accelerator="\ueba0" +export linea_basic_alarm="\ueba1" +export linea_basic_anchor="\ueba2" +export linea_basic_anticlockwise="\ueba3" +export linea_basic_archive="\ueba4" +export linea_basic_archive_full="\ueba5" +export linea_basic_ban="\ueba6" +export linea_basic_battery_charge="\ueba7" +export linea_basic_battery_empty="\ueba8" +export linea_basic_battery_full="\ueba9" +export linea_basic_battery_half="\uebaa" +export linea_basic_bolt="\uebab" +export linea_basic_book="\uebac" +export linea_basic_book_pen="\uebad" +export linea_basic_book_pencil="\uebae" +export linea_basic_bookmark="\uebaf" +export linea_basic_calculator="\uebb0" +export linea_basic_calendar="\uebb1" +export linea_basic_cards_diamonds="\uebb2" +export linea_basic_cards_hearts="\uebb3" +export linea_basic_case="\uebb4" +export linea_basic_chronometer="\uebb5" +export linea_basic_clessidre="\uebb6" +export linea_basic_clock="\uebb7" +export linea_basic_clockwise="\uebb8" +export linea_basic_cloud="\uebb9" +export linea_basic_postcard="\uebba" +export linea_basic_postcard_multiple="\uebbb" +export linea_basic_printer="\uebbc" +export linea_basic_question="\uebbd" +export linea_basic_server="\uebbe" +export linea_basic_server2="\uebbf" +export linea_basic_server_cloud="\uebc0" +export linea_basic_server_download="\uebc1" +export linea_basic_server_upload="\uebc2" +export linea_basic_settings="\uebc3" +export linea_basic_share="\uebc4" +export linea_basic_sheet="\uebc5" +export linea_basic_sheet_multiple="\uebc6" +export linea_basic_sheet_pen="\uebc7" +export linea_basic_sheet_pencil="\uebc8" +export linea_basic_sheet_txt="\uebc9" +export linea_basic_signs="\uebca" +export linea_basic_smartphone="\uebcb" +export linea_basic_spades="\uebcc" +export linea_basic_spread="\uebcd" +export linea_basic_spread_bookmark="\uebce" +export linea_basic_spread_text="\uebcf" +export linea_basic_spread_text_bookmark="\uebd0" +export linea_basic_star="\uebd1" +export linea_basic_tablet="\uebd2" +export linea_basic_target="\uebd3" +export linea_basic_todo="\uebd4" +export linea_basic_todo_pen="\uebd5" +export linea_basic_todo_pencil="\uebd6" +export linea_basic_todo_txt="\uebd7" +export linea_basic_todolist_pen="\uebd8" +export linea_basic_todolist_pencil="\uebd9" +export linea_basic_trashcan="\uebda" +export linea_basic_trashcan_full="\uebdb" +export linea_basic_trashcan_refresh="\uebdc" +export linea_basic_trashcan_remove="\uebdd" +export linea_basic_upload="\uebde" +export linea_basic_usb="\uebdf" +export linea_basic_video="\uebe0" +export linea_basic_watch="\uebe1" +export linea_basic_webpage="\uebe2" +export linea_basic_webpage_img_txt="\uebe3" +export linea_basic_webpage_multiple="\uebe4" +export linea_basic_webpage_txt="\uebe5" +export linea_basic_world="\uebe6" +export linea_elaboration_document_previous="\uebe7" +export linea_elaboration_document_refresh="\uebe8" +export linea_elaboration_document_remove="\uebe9" +export linea_elaboration_document_search="\uebea" +export linea_elaboration_document_star="\uebeb" +export linea_elaboration_document_upload="\uebec" +export linea_elaboration_folder_check="\uebed" +export linea_elaboration_folder_cloud="\uebee" +export linea_elaboration_folder_document="\uebef" +export linea_elaboration_folder_download="\uebf0" +export linea_elaboration_folder_flagged="\uebf1" +export linea_elaboration_folder_graph="\uebf2" +export linea_elaboration_folder_heart="\uebf3" +export linea_elaboration_folder_minus="\uebf4" +export linea_elaboration_folder_next="\uebf5" +export linea_elaboration_document_flagged="\uebf6" +export linea_elaboration_document_graph="\uebf7" +export linea_elaboration_document_heart="\uebf8" +export linea_elaboration_document_minus="\uebf9" +export linea_elaboration_document_next="\uebfa" +export linea_elaboration_document_noaccess="\uebfb" +export linea_elaboration_document_note="\uebfc" +export linea_elaboration_document_pencil="\uebfd" +export linea_elaboration_document_picture="\uebfe" +export linea_elaboration_document_plus="\uebff" +export linea_elaboration_folder_noaccess="\uec00" +export linea_elaboration_folder_note="\uec01" +export linea_elaboration_folder_pencil="\uec02" +export linea_elaboration_folder_picture="\uec03" +export linea_elaboration_folder_plus="\uec04" +export linea_elaboration_folder_previous="\uec05" +export linea_elaboration_folder_refresh="\uec06" +export linea_elaboration_calendar_empty="\uec07" +export linea_elaboration_calendar_flagged="\uec08" +export linea_elaboration_calendar_heart="\uec09" +export linea_elaboration_calendar_minus="\uec0a" +export linea_elaboration_calendar_next="\uec0b" +export linea_elaboration_calendar_noaccess="\uec0c" +export linea_elaboration_calendar_pencil="\uec0d" +export linea_elaboration_calendar_plus="\uec0e" +export linea_elaboration_calendar_previous="\uec0f" +export linea_elaboration_calendar_refresh="\uec10" +export linea_elaboration_calendar_remove="\uec11" +export linea_elaboration_calendar_search="\uec12" +export linea_elaboration_calendar_star="\uec13" +export linea_elaboration_calendar_upload="\uec14" +export linea_elaboration_cloud_check="\uec15" +export linea_elaboration_cloud_download="\uec16" +export linea_elaboration_cloud_minus="\uec17" +export linea_elaboration_cloud_noaccess="\uec18" +export linea_elaboration_cloud_plus="\uec19" +export linea_elaboration_cloud_refresh="\uec1a" +export linea_elaboration_cloud_remove="\uec1b" +export linea_elaboration_cloud_search="\uec1c" +export linea_elaboration_cloud_upload="\uec1d" +export linea_elaboration_document_check="\uec1e" +export linea_elaboration_document_cloud="\uec1f" +export linea_elaboration_document_download="\uec20" +export linea_elaboration_folder_remove="\uec21" +export linea_elaboration_mail_heart="\uec22" +export linea_elaboration_folder_search="\uec23" +export linea_elaboration_folder_star="\uec24" +export linea_elaboration_folder_upload="\uec25" +export linea_elaboration_mail_check="\uec26" +export linea_elaboration_bookmark_checck="\uec27" +export linea_elaboration_bookmark_minus="\uec28" +export linea_elaboration_bookmark_plus="\uec29" +export linea_elaboration_bookmark_remove="\uec2a" +export linea_elaboration_briefcase_check="\uec2b" +export linea_elaboration_briefcase_download="\uec2c" +export linea_elaboration_briefcase_flagged="\uec2d" +export linea_elaboration_briefcase_minus="\uec2e" +export linea_elaboration_briefcase_plus="\uec2f" +export linea_elaboration_briefcase_refresh="\uec30" +export linea_elaboration_briefcase_remove="\uec31" +export linea_elaboration_briefcase_search="\uec32" +export linea_elaboration_briefcase_star="\uec33" +export linea_elaboration_briefcase_upload="\uec34" +export linea_elaboration_browser_check="\uec35" +export linea_elaboration_browser_download="\uec36" +export linea_elaboration_browser_minus="\uec37" +export linea_elaboration_browser_plus="\uec38" +export linea_elaboration_browser_refresh="\uec39" +export linea_elaboration_browser_remove="\uec3a" +export linea_elaboration_browser_search="\uec3b" +export linea_elaboration_browser_star="\uec3c" +export linea_elaboration_browser_upload="\uec3d" +export linea_elaboration_calendar_check="\uec3e" +export linea_elaboration_calendar_cloud="\uec3f" +export linea_elaboration_calendar_download="\uec40" +export linea_elaboration_mail_cloud="\uec41" +export linea_elaboration_mail_document="\uec42" +export linea_elaboration_mail_download="\uec43" +export linea_elaboration_mail_flagged="\uec44" +export linea_elaboration_mail_next="\uec45" +export linea_elaboration_mail_noaccess="\uec46" +export linea_elaboration_mail_note="\uec47" +export linea_elaboration_mail_pencil="\uec48" +export linea_elaboration_mail_picture="\uec49" +export linea_elaboration_mail_previous="\uec4a" +export linea_elaboration_mail_refresh="\uec4b" +export linea_elaboration_mail_remove="\uec4c" +export linea_elaboration_mail_search="\uec4d" +export linea_elaboration_mail_star="\uec4e" +export linea_elaboration_mail_upload="\uec4f" +export linea_elaboration_message_check="\uec50" +export linea_elaboration_message_dots="\uec51" +export linea_elaboration_message_happy="\uec52" +export linea_elaboration_message_heart="\uec53" +export linea_elaboration_message_minus="\uec54" +export linea_elaboration_message_note="\uec55" +export linea_elaboration_message_plus="\uec56" +export linea_elaboration_message_refresh="\uec57" +export linea_elaboration_message_remove="\uec58" +export linea_elaboration_message_sad="\uec59" +export linea_elaboration_smartphone_cloud="\uec5a" +export linea_elaboration_smartphone_heart="\uec5b" +export linea_elaboration_smartphone_noaccess="\uec5c" +export linea_elaboration_smartphone_note="\uec5d" +export linea_elaboration_smartphone_pencil="\uec5e" +export linea_elaboration_smartphone_picture="\uec5f" +export linea_elaboration_smartphone_refresh="\uec60" +export linea_elaboration_smartphone_search="\uec61" +export linea_elaboration_tablet_cloud="\uec62" +export linea_elaboration_tablet_heart="\uec63" +export linea_elaboration_tablet_noaccess="\uec64" +export linea_elaboration_tablet_note="\uec65" +export linea_elaboration_tablet_pencil="\uec66" +export linea_elaboration_tablet_picture="\uec67" +export linea_elaboration_tablet_refresh="\uec68" +export linea_elaboration_tablet_search="\uec69" +export linea_elaboration_todolist_2="\uec6a" +export linea_elaboration_todolist_check="\uec6b" +export linea_elaboration_todolist_cloud="\uec6c" +export linea_elaboration_todolist_download="\uec6d" +export linea_elaboration_todolist_flagged="\uec6e" +export linea_elaboration_todolist_minus="\uec6f" +export linea_elaboration_todolist_noaccess="\uec70" +export linea_elaboration_todolist_pencil="\uec71" +export linea_elaboration_todolist_plus="\uec72" +export linea_elaboration_todolist_refresh="\uec73" +export linea_elaboration_todolist_remove="\uec74" +export linea_elaboration_todolist_search="\uec75" +export linea_elaboration_todolist_star="\uec76" +export linea_elaboration_todolist_upload="\uec77" +export linea_ecommerce_receipt_kips="\uec78" +export linea_ecommerce_receipt_lira="\uec79" +export linea_ecommerce_receipt_naira="\uec7a" +export linea_ecommerce_receipt_pesos="\uec7b" +export linea_ecommerce_receipt_pound="\uec7c" +export linea_ecommerce_receipt_rublo="\uec7d" +export linea_ecommerce_receipt_rupee="\uec7e" +export linea_ecommerce_receipt_tugrik="\uec7f" +export linea_ecommerce_receipt_won="\uec80" +export linea_ecommerce_receipt_yen="\uec81" +export linea_ecommerce_receipt_yen2="\uec82" +export linea_ecommerce_recept_colon="\uec83" +export linea_ecommerce_rublo="\uec84" +export linea_ecommerce_rupee="\uec85" +export linea_ecommerce_safe="\uec86" +export linea_ecommerce_naira="\uec87" +export linea_ecommerce_pesos="\uec88" +export linea_ecommerce_pound="\uec89" +export linea_ecommerce_receipt="\uec8a" +export linea_ecommerce_receipt_bath="\uec8b" +export linea_ecommerce_receipt_cent="\uec8c" +export linea_ecommerce_receipt_dollar="\uec8d" +export linea_ecommerce_receipt_euro="\uec8e" +export linea_ecommerce_receipt_franc="\uec8f" +export linea_ecommerce_receipt_guarani="\uec90" +export linea_ecommerce_sale="\uec91" +export linea_ecommerce_sales="\uec92" +export linea_ecommerce_ticket="\uec93" +export linea_ecommerce_tugriks="\uec94" +export linea_ecommerce_wallet="\uec95" +export linea_ecommerce_won="\uec96" +export linea_ecommerce_yen="\uec97" +export linea_ecommerce_cart_content="\uec98" +export linea_ecommerce_cart_download="\uec99" +export linea_ecommerce_cart_minus="\uec9a" +export linea_ecommerce_cart_plus="\uec9b" +export linea_ecommerce_cart_refresh="\uec9c" +export linea_ecommerce_cart_remove="\uec9d" +export linea_ecommerce_cart_search="\uec9e" +export linea_ecommerce_cart_upload="\uec9f" +export linea_ecommerce_cent="\ueca0" +export linea_ecommerce_colon="\ueca1" +export linea_ecommerce_creditcard="\ueca2" +export linea_ecommerce_diamond="\ueca3" +export linea_ecommerce_dollar="\ueca4" +export linea_ecommerce_euro="\ueca5" +export linea_ecommerce_franc="\ueca6" +export linea_ecommerce_gift="\ueca7" +export linea_ecommerce_graph1="\ueca8" +export linea_ecommerce_graph2="\ueca9" +export linea_ecommerce_graph3="\uecaa" +export linea_ecommerce_graph_decrease="\uecab" +export linea_ecommerce_graph_increase="\uecac" +export linea_ecommerce_guarani="\uecad" +export linea_ecommerce_kips="\uecae" +export linea_ecommerce_lira="\uecaf" +export linea_ecommerce_megaphone="\uecb0" +export linea_ecommerce_money="\uecb1" +export linea_ecommerce_yen2="\uecb2" +export linea_ecommerce_bag="\uecb3" +export linea_ecommerce_bag_check="\uecb4" +export linea_ecommerce_bag_cloud="\uecb5" +export linea_ecommerce_bag_download="\uecb6" +export linea_ecommerce_bag_minus="\uecb7" +export linea_ecommerce_bag_plus="\uecb8" +export linea_ecommerce_bag_refresh="\uecb9" +export linea_ecommerce_bag_remove="\uecba" +export linea_ecommerce_bag_search="\uecbb" +export linea_ecommerce_bag_upload="\uecbc" +export linea_ecommerce_banknote="\uecbd" +export linea_ecommerce_banknotes="\uecbe" +export linea_ecommerce_basket="\uecbf" +export linea_ecommerce_basket_check="\uecc0" +export linea_ecommerce_basket_cloud="\uecc1" +export linea_ecommerce_basket_download="\uecc2" +export linea_ecommerce_basket_minus="\uecc3" +export linea_ecommerce_basket_plus="\uecc4" +export linea_ecommerce_basket_refresh="\uecc5" +export linea_ecommerce_basket_remove="\uecc6" +export linea_ecommerce_basket_search="\uecc7" +export linea_ecommerce_basket_upload="\uecc8" +export linea_ecommerce_bath="\uecc9" +export linea_ecommerce_cart="\uecca" +export linea_ecommerce_cart_check="\ueccb" +export linea_ecommerce_cart_cloud="\ueccc" +export linea_music_stop_button="\ueccd" +export linea_music_tape="\uecce" +export linea_music_volume_down="\ueccf" +export linea_music_volume_up="\uecd0" +export linea_music_beginning_button="\uecd1" +export linea_music_bell="\uecd2" +export linea_music_cd="\uecd3" +export linea_music_diapason="\uecd4" +export linea_music_eject_button="\uecd5" +export linea_music_end_button="\uecd6" +export linea_music_fastforward_button="\uecd7" +export linea_music_headphones="\uecd8" +export linea_music_ipod="\uecd9" +export linea_music_loudspeaker="\uecda" +export linea_music_microphone="\uecdb" +export linea_music_microphone_old="\uecdc" +export linea_music_mixer="\uecdd" +export linea_music_mute="\uecde" +export linea_music_note_multiple="\uecdf" +export linea_music_note_single="\uece0" +export linea_music_pause_button="\uece1" +export linea_music_play_button="\uece2" +export linea_music_playlist="\uece3" +export linea_music_radio_ghettoblaster="\uece4" +export linea_music_radio_portable="\uece5" +export linea_music_record="\uece6" +export linea_music_recordplayer="\uece7" +export linea_music_repeat_button="\uece8" +export linea_music_rewind_button="\uece9" +export linea_music_shuffle_button="\uecea" +export linea_software_paragraph_justify_center="\ueceb" +export linea_software_paragraph_justify_left="\uecec" +export linea_software_paragraph_justify_right="\ueced" +export linea_software_paragraph_space_after="\uecee" +export linea_software_paragraph_space_before="\uecef" +export linea_software_pathfinder_exclude="\uecf0" +export linea_software_pathfinder_intersect="\uecf1" +export linea_software_pathfinder_subtract="\uecf2" +export linea_software_pathfinder_unite="\uecf3" +export linea_software_pen="\uecf4" +export linea_software_pen_add="\uecf5" +export linea_software_pen_remove="\uecf6" +export linea_software_pencil="\uecf7" +export linea_software_polygonallasso="\uecf8" +export linea_software_reflect_horizontal="\uecf9" +export linea_software_magnete="\uecfa" +export linea_software_pages="\uecfb" +export linea_software_paintbrush="\uecfc" +export linea_software_paintbucket="\uecfd" +export linea_software_paintroller="\uecfe" +export linea_software_paragraph="\uecff" +export linea_software_paragraph_align_left="\ued00" +export linea_software_paragraph_align_right="\ued01" +export linea_software_paragraph_center="\ued02" +export linea_software_paragraph_justify_all="\ued03" +export linea_software_reflect_vertical="\ued04" +export linea_software_remove_vectorpoint="\ued05" +export linea_software_scale_expand="\ued06" +export linea_software_scale_reduce="\ued07" +export linea_software_selection_oval="\ued08" +export linea_software_selection_polygon="\ued09" +export linea_software_selection_rectangle="\ued0a" +export linea_software_indent_firstline="\ued0b" +export linea_software_indent_left="\ued0c" +export linea_software_indent_right="\ued0d" +export linea_software_lasso="\ued0e" +export linea_software_layers1="\ued0f" +export linea_software_layers2="\ued10" +export linea_software_layout="\ued11" +export linea_software_layout_2columns="\ued12" +export linea_software_layout_3columns="\ued13" +export linea_software_layout_4boxes="\ued14" +export linea_software_layout_4columns="\ued15" +export linea_software_layout_4lines="\ued16" +export linea_software_layout_8boxes="\ued17" +export linea_software_layout_header="\ued18" +export linea_software_layout_header_2columns="\ued19" +export linea_software_layout_header_3columns="\ued1a" +export linea_software_layout_header_4boxes="\ued1b" +export linea_software_layout_header_4columns="\ued1c" +export linea_software_layout_header_complex="\ued1d" +export linea_software_layout_header_complex2="\ued1e" +export linea_software_layout_header_complex3="\ued1f" +export linea_software_layout_header_complex4="\ued20" +export linea_software_layout_header_sideleft="\ued21" +export linea_software_layout_header_sideright="\ued22" +export linea_software_layout_sidebar_left="\ued23" +export linea_software_layout_sidebar_right="\ued24" +export linea_software_selection_roundedrectangle="\ued25" +export linea_software_vector_line="\ued26" +export linea_software_shape_oval="\ued27" +export linea_software_shape_polygon="\ued28" +export linea_software_shape_rectangle="\ued29" +export linea_software_shape_roundedrectangle="\ued2a" +export linea_software_add_vectorpoint="\ued2b" +export linea_software_box_oval="\ued2c" +export linea_software_box_polygon="\ued2d" +export linea_software_box_rectangle="\ued2e" +export linea_software_box_roundedrectangle="\ued2f" +export linea_software_character="\ued30" +export linea_software_crop="\ued31" +export linea_software_eyedropper="\ued32" +export linea_software_font_allcaps="\ued33" +export linea_software_font_baseline_shift="\ued34" +export linea_software_font_horizontal_scale="\ued35" +export linea_software_font_kerning="\ued36" +export linea_software_font_leading="\ued37" +export linea_software_font_size="\ued38" +export linea_software_font_smallcapital="\ued39" +export linea_software_font_smallcaps="\ued3a" +export linea_software_font_strikethrough="\ued3b" +export linea_software_font_tracking="\ued3c" +export linea_software_font_underline="\ued3d" +export linea_software_font_vertical_scale="\ued3e" +export linea_software_horizontal_align_center="\ued3f" +export linea_software_horizontal_align_left="\ued40" +export linea_software_horizontal_align_right="\ued41" +export linea_software_horizontal_distribute_center="\ued42" +export linea_software_horizontal_distribute_left="\ued43" +export linea_software_horizontal_distribute_right="\ued44" +export linea_software_slice="\ued45" +export linea_software_transform_bezier="\ued46" +export linea_software_vector_box="\ued47" +export linea_software_vector_composite="\ued48" +export linea_software_vertical_align_bottom="\ued49" +export linea_software_vertical_align_center="\ued4a" +export linea_software_vertical_align_top="\ued4b" +export linea_software_vertical_distribute_bottom="\ued4c" +export linea_software_vertical_distribute_center="\ued4d" +export linea_software_vertical_distribute_top="\ued4e" +export linea_weather_aquarius="\ued4f" +export linea_weather_aries="\ued50" +export linea_weather_cancer="\ued51" +export linea_weather_capricorn="\ued52" +export linea_weather_cloud="\ued53" +export linea_weather_cloud_drop="\ued54" +export linea_weather_cloud_lightning="\ued55" +export linea_weather_cloud_snowflake="\ued56" +export linea_weather_downpour_fullmoon="\ued57" +export linea_weather_downpour_halfmoon="\ued58" +export linea_weather_downpour_sun="\ued59" +export linea_weather_drop="\ued5a" +export linea_weather_first_quarter="\ued5b" +export linea_weather_fog="\ued5c" +export linea_weather_fog_fullmoon="\ued5d" +export linea_weather_fog_halfmoon="\ued5e" +export linea_weather_fog_sun="\ued5f" +export linea_weather_fullmoon="\ued60" +export linea_weather_gemini="\ued61" +export linea_weather_hail="\ued62" +export linea_weather_hail_fullmoon="\ued63" +export linea_weather_hail_halfmoon="\ued64" +export linea_weather_hail_sun="\ued65" +export linea_weather_last_quarter="\ued66" +export linea_weather_leo="\ued67" +export linea_weather_libra="\ued68" +export linea_weather_lightning="\ued69" +export linea_weather_mistyrain="\ued6a" +export linea_weather_mistyrain_fullmoon="\ued6b" +export linea_weather_mistyrain_halfmoon="\ued6c" +export linea_weather_mistyrain_sun="\ued6d" +export linea_weather_moon="\ued6e" +export linea_weather_moondown_full="\ued6f" +export linea_weather_moondown_half="\ued70" +export linea_weather_moonset_full="\ued71" +export linea_weather_moonset_half="\ued72" +export linea_weather_move2="\ued73" +export linea_weather_newmoon="\ued74" +export linea_weather_pisces="\ued75" +export linea_weather_rain="\ued76" +export linea_weather_rain_fullmoon="\ued77" +export linea_weather_rain_halfmoon="\ued78" +export linea_weather_rain_sun="\ued79" +export linea_weather_sagittarius="\ued7a" +export linea_weather_scorpio="\ued7b" +export linea_weather_snow="\ued7c" +export linea_weather_snow_fullmoon="\ued7d" +export linea_weather_snow_halfmoon="\ued7e" +export linea_weather_snow_sun="\ued7f" +export linea_weather_snowflake="\ued80" +export linea_weather_star="\ued81" +export linea_weather_storm_11="\ued82" +export linea_weather_storm_32="\ued83" +export linea_weather_storm_fullmoon="\ued84" +export linea_weather_storm_halfmoon="\ued85" +export linea_weather_storm_sun="\ued86" +export linea_weather_sun="\ued87" +export linea_weather_sundown="\ued88" +export linea_weather_sunset="\ued89" +export linea_weather_taurus="\ued8a" +export linea_weather_tempest="\ued8b" +export linea_weather_tempest_fullmoon="\ued8c" +export linea_weather_tempest_halfmoon="\ued8d" +export linea_weather_tempest_sun="\ued8e" +export linea_weather_variable_fullmoon="\ued8f" +export linea_weather_variable_halfmoon="\ued90" +export linea_weather_variable_sun="\ued91" +export linea_weather_virgo="\ued92" +export linea_weather_waning_cresent="\ued93" +export linea_weather_waning_gibbous="\ued94" +export linea_weather_waxing_cresent="\ued95" +export linea_weather_waxing_gibbous="\ued96" +export linea_weather_wind="\ued97" +export linea_weather_wind_e="\ued98" +export linea_weather_wind_fullmoon="\ued99" +export linea_weather_wind_halfmoon="\ued9a" +export linea_weather_wind_n="\ued9b" +export linea_weather_wind_ne="\ued9c" +export linea_weather_wind_nw="\ued9d" +export linea_weather_wind_s="\ued9e" +export linea_weather_wind_se="\ued9f" +export linea_weather_wind_sun="\ueda0" +export linea_weather_wind_sw="\ueda1" +export linea_weather_wind_w="\ueda2" +export linea_weather_windgust="\ueda3" +export mfizz_3dprint="\ueda4" +export mfizz_alpinelinux="\ueda5" +export mfizz_angular="\ueda6" +export mfizz_angular_alt="\ueda7" +export mfizz_antenna="\ueda8" +export mfizz_apache="\ueda9" +export mfizz_archlinux="\uedaa" +export mfizz_aws="\uedab" +export mfizz_azure="\uedac" +export mfizz_backbone="\uedad" +export mfizz_blackberry="\uedae" +export mfizz_bomb="\uedaf" +export mfizz_bootstrap="\uedb0" +export mfizz_c="\uedb1" +export mfizz_cassandra="\uedb2" +export mfizz_centos="\uedb3" +export mfizz_clojure="\uedb4" +export mfizz_codeigniter="\uedb5" +export mfizz_codepen="\uedb6" +export mfizz_coffee_bean="\uedb7" +export mfizz_cplusplus="\uedb8" +export mfizz_csharp="\uedb9" +export mfizz_css="\uedba" +export mfizz_css3="\uedbb" +export mfizz_css3_alt="\uedbc" +export mfizz_d3="\uedbd" +export mfizz_database="\uedbe" +export mfizz_database_alt="\uedbf" +export mfizz_database_alt2="\uedc0" +export mfizz_debian="\uedc1" +export mfizz_docker="\uedc2" +export mfizz_dreamhost="\uedc3" +export mfizz_elixir="\uedc4" +export mfizz_elm="\uedc5" +export mfizz_erlang="\uedc6" +export mfizz_exherbo="\uedc7" +export mfizz_fedora="\uedc8" +export mfizz_fire_alt="\uedc9" +export mfizz_freebsd="\uedca" +export mfizz_freecodecamp="\uedcb" +export mfizz_gentoo="\uedcc" +export mfizz_ghost="\uedcd" +export mfizz_git="\uedce" +export mfizz_gnome="\uedcf" +export mfizz_go="\uedd0" +export mfizz_go_alt="\uedd1" +export mfizz_google="\uedd2" +export mfizz_google_alt="\uedd3" +export mfizz_google_code="\uedd4" +export mfizz_google_developers="\uedd5" +export mfizz_gradle="\uedd6" +export mfizz_grails="\uedd7" +export mfizz_grails_alt="\uedd8" +export mfizz_grunt="\uedd9" +export mfizz_gulp="\uedda" +export mfizz_gulp_alt="\ueddb" +export mfizz_hadoop="\ueddc" +export mfizz_haskell="\ueddd" +export mfizz_heroku="\uedde" +export mfizz_html="\ueddf" +export mfizz_html5="\uede0" +export mfizz_html5_alt="\uede1" +export mfizz_iphone="\uede2" +export mfizz_java="\uede3" +export mfizz_java_bold="\uede4" +export mfizz_java_duke="\uede5" +export mfizz_javascript="\uede6" +export mfizz_javascript_alt="\uede7" +export mfizz_jetty="\uede8" +export mfizz_jquery="\uede9" +export mfizz_kde="\uedea" +export mfizz_laravel="\uedeb" +export mfizz_line_graph="\uedec" +export mfizz_linux_mint="\ueded" +export mfizz_looking="\uedee" +export mfizz_magento="\uedef" +export mfizz_mariadb="\uedf0" +export mfizz_maven="\uedf1" +export mfizz_microscope="\uedf2" +export mfizz_mobile_device="\uedf3" +export mfizz_mobile_phone_alt="\uedf4" +export mfizz_mobile_phone_broadcast="\uedf5" +export mfizz_mongodb="\uedf6" +export mfizz_mssql="\uedf7" +export mfizz_mysql="\uedf8" +export mfizz_mysql_alt="\uedf9" +export mfizz_netbsd="\uedfa" +export mfizz_nginx="\uedfb" +export mfizz_nginx_alt="\uedfc" +export mfizz_nginx_alt2="\uedfd" +export mfizz_nodejs="\uedfe" +export mfizz_npm="\uedff" +export mfizz_objc="\uee00" +export mfizz_openshift="\uee01" +export mfizz_oracle="\uee02" +export mfizz_oracle_alt="\uee03" +export mfizz_osx="\uee04" +export mfizz_perl="\uee05" +export mfizz_phone_alt="\uee06" +export mfizz_phone_gap="\uee07" +export mfizz_phone_retro="\uee08" +export mfizz_php="\uee09" +export mfizz_php_alt="\uee0a" +export mfizz_playframework="\uee0b" +export mfizz_playframework_alt="\uee0c" +export mfizz_plone="\uee0d" +export mfizz_postgres="\uee0e" +export mfizz_postgres_alt="\uee0f" +export mfizz_python="\uee10" +export mfizz_raspberrypi="\uee11" +export mfizz_reactjs="\uee12" +export mfizz_redhat="\uee13" +export mfizz_redis="\uee14" +export mfizz_ruby="\uee15" +export mfizz_ruby_on_rails="\uee16" +export mfizz_ruby_on_rails_alt="\uee17" +export mfizz_rust="\uee18" +export mfizz_sass="\uee19" +export mfizz_satellite="\uee1a" +export mfizz_scala="\uee1b" +export mfizz_scala_alt="\uee1c" +export mfizz_script="\uee1d" +export mfizz_script_alt="\uee1e" +export mfizz_shell="\uee1f" +export mfizz_sitefinity="\uee20" +export mfizz_solaris="\uee21" +export mfizz_splatter="\uee22" +export mfizz_spring="\uee23" +export mfizz_suse="\uee24" +export mfizz_svg="\uee25" +export mfizz_symfony="\uee26" +export mfizz_tomcat="\uee27" +export mfizz_ubuntu="\uee28" +export mfizz_unity="\uee29" +export mfizz_wireless="\uee2a" +export mfizz_wordpress="\uee2b" +export mfizz_x11="\uee2c" +export firacode_asterisk="\uee2d" +export firacode_plus="\uee2e" +export firacode_hyphen="\uee2f" +export firacode_sad="\uee30" +export firacode_w_w_w="\uee31" +export firacode_asterisk_asterisk="\uee32" +export firacode_asterisk_asterisk_asterisk="\uee33" +export firacode_asterisk_asterisk_slash="\uee34" +export firacode_asterisk_greater="\uee35" +export firacode_asterisk_slash="\uee36" +export firacode_backslash_backslash="\uee37" +export firacode_bbb="\uee38" +export firacode_braceleft_hyphen="\uee39" +export firacode_bracketleft_bracketright="\uee3a" +export firacode_colon_colon="\uee3b" +export firacode_colon_colon_colon="\uee3c" +export firacode_colon_equal="\uee3d" +export firacode_exclam_exclam="\uee3e" +export firacode_exclam_equal="\uee3f" +export firacode_exclam_equal_equal="\uee40" +export firacode_hyphen_braceright="\uee41" +export firacode_hyphen_hyphen="\uee42" +export firacode_hyphen_hyphen_hyphen="\uee43" +export firacode_hyphen_hyphen_greater="\uee44" +export firacode_hyphen_greater="\uee45" +export firacode_hyphen_greater_greater="\uee46" +export firacode_hyphen_less="\uee47" +export firacode_hyphen_less_less="\uee48" +export firacode_hyphen_asciitilde="\uee49" +export firacode_numbersign_braceleft="\uee4a" +export firacode_numbersign_bracketleft="\uee4b" +export firacode_numbersign_numbersign="\uee4c" +export firacode_nnn="\uee4d" +export firacode_nnnn="\uee4e" +export firacode_numbersign_parenleft="\uee4f" +export firacode_numbersign_question="\uee50" +export firacode_numbersign_underscore="\uee51" +export firacode_nup="\uee52" +export firacode_period_hyphen="\uee53" +export firacode_period_equal="\uee54" +export firacode_period_period="\uee55" +export firacode_period_period_less="\uee56" +export firacode_period_period_period="\uee57" +export firacode_question_equal="\uee58" +export firacode_question_question="\uee59" +export firacode_semicolon_semicolon="\uee5a" +export firacode_slash_asterisk="\uee5b" +export firacode_slash_asterisk_asterisk="\uee5c" +export firacode_slash_equal="\uee5d" +export firacode_slash_equal_equal="\uee5e" +export firacode_slash_greater="\uee5f" +export firacode_slash_slash="\uee60" +export firacode_slash_slash_slash="\uee61" +export firacode_ampersand_ampersand="\uee62" +export firacode_bar_bar="\uee63" +export firacode_bar_bar_equal="\uee64" +export firacode_bar_equal="\uee65" +export firacode_bar_greater="\uee66" +export firacode_asciicircum_equal="\uee67" +export firacode_dollar_greater="\uee68" +export firacode_plus_plus="\uee69" +export firacode_plus_plus_plus="\uee6a" +export firacode_plus_greater="\uee6b" +export firacode_equal_colon_equal="\uee6c" +export firacode_equal_equal="\uee6d" +export firacode_equal_equal_equal="\uee6e" +export firacode_equal_equal_greater="\uee6f" +export firacode_equal_greater="\uee70" +export firacode_equal_greater_greater="\uee71" +export firacode_equal_less="\uee72" +export firacode_equal_less_less="\uee73" +export firacode_equal_slash_equal="\uee74" +export firacode_greater_hyphen="\uee75" +export firacode_greater_equal="\uee76" +export firacode_greater_equal_greater="\uee77" +export firacode_greater_greater="\uee78" +export firacode_greater_greater_hyphen="\uee79" +export firacode_greater_greater_equal="\uee7a" +export firacode_greater_greater_greater="\uee7b" +export firacode_less_asterisk="\uee7c" +export firacode_less_asterisk_greater="\uee7d" +export firacode_less_bar="\uee7e" +export firacode_less_bar_greater="\uee7f" +export firacode_less_dollar="\uee80" +export firacode_less_dollar_greater="\uee81" +export firacode_less_exclam_hyphen_hyphen="\uee82" +export firacode_less_hyphen="\uee83" +export firacode_less_hyphen_hyphen="\uee84" +export firacode_less_hyphen_greater="\uee85" +export firacode_less_plus="\uee86" +export firacode_less_plus_greater="\uee87" +export firacode_less_equal="\uee88" +export firacode_less_equal_equal="\uee89" +export firacode_less_equal_greater="\uee8a" +export firacode_less_equal_less="\uee8b" +export firacode_less_greater="\uee8c" +export firacode_less_less="\uee8d" +export firacode_less_less_hyphen="\uee8e" +export firacode_less_less_equal="\uee8f" +export firacode_less_less_less="\uee90" +export firacode_less_asciitilde="\uee91" +export firacode_less_asciitilde_asciitilde="\uee92" +export firacode_less_slash="\uee93" +export firacode_less_slash_greater="\uee94" +export firacode_asciitilde_at="\uee95" +export firacode_asciitilde_hyphen="\uee96" +export firacode_asciitilde_equal="\uee97" +export firacode_asciitilde_greater="\uee98" +export firacode_asciitilde_asciitilde="\uee99" +export firacode_aag="\uee9a" +export firacode_percent_percent="\uee9b" +export firacode_x_multiply="\uee9c" +export firacode_colon_uc="\uee9d" +export firacode_plus_lc="\uee9e" +export firacode_plus_tosf2="\uee9f" +export firacode_nameme_1114119="\ueea0" diff --git a/nnn-4.9/icons-in-terminal/build/icons_bash_without_codepoint.sh b/nnn-4.9/icons-in-terminal/build/icons_bash_without_codepoint.sh @@ -0,0 +1,3730 @@ +export powerline_branch= +export powerline_line_number= +export powerline_readonly= +export powerline_extra_column_number= +export powerline_left_hard_divider= +export powerline_left_soft_divider= +export powerline_right_hard_divider= +export powerline_right_soft_divider= +export powerline_extra_right_half_circle_thick= +export powerline_extra_right_half_circle_thin= +export powerline_extra_left_half_circle_thick= +export powerline_extra_left_half_circle_thin= +export powerline_extra_lower_left_triangle= +export powerline_extra_backslash_separator= +export powerline_extra_lower_right_triangle= +export powerline_extra_forwardslash_separator= +export powerline_extra_upper_left_triangle= +export powerline_extra_forwardslash_separator_redundant= +export powerline_extra_upper_right_triangle= +export powerline_extra_backslash_separator_redundant= +export powerline_extra_flame_thick= +export powerline_extra_flame_thin= +export powerline_extra_flame_thick_mirrored= +export powerline_extra_flame_thin_mirrored= +export powerline_extra_pixelated_squares_small= +export powerline_extra_pixelated_squares_small_mirrored= +export powerline_extra_pixelated_squares_big= +export powerline_extra_pixelated_squares_big_mirrored= +export powerline_extra_ice_waveform= +export powerline_extra_ice_waveform_mirrored= +export powerline_extra_honeycomb= +export powerline_extra_honeycomb_outline= +export powerline_extra_lego_separator= +export powerline_extra_lego_separator_thin= +export powerline_extra_lego_block_facing= +export powerline_extra_lego_block_sideways= +export powerline_extra_trapezoid_top_bottom= +export powerline_extra_trapezoid_top_bottom_mirrored= +export oct_heart= +export oct_zap= +export oct_light_bulb= +export oct_repo= +export oct_repo_forked= +export oct_repo_push= +export oct_repo_pull= +export oct_book= +export oct_octoface= +export oct_git_pull_request= +export oct_mark_github= +export oct_cloud_download= +export oct_cloud_upload= +export oct_keyboard= +export oct_gist= +export oct_file_code= +export oct_file_text= +export oct_file_media= +export oct_file_zip= +export oct_file_pdf= +export oct_tag= +export oct_file_directory= +export oct_file_submodule= +export oct_person= +export oct_jersey= +export oct_git_commit= +export oct_git_branch= +export oct_git_merge= +export oct_mirror= +export oct_issue_opened= +export oct_issue_reopened= +export oct_issue_closed= +export oct_star= +export oct_comment= +export oct_question= +export oct_alert= +export oct_search= +export oct_gear= +export oct_radio_tower= +export oct_tools= +export oct_sign_out= +export oct_rocket= +export oct_rss= +export oct_clippy= +export oct_sign_in= +export oct_organization= +export oct_device_mobile= +export oct_unfold= +export oct_check= +export oct_mail= +export oct_mail_read= +export oct_arrow_up= +export oct_arrow_right= +export oct_arrow_down= +export oct_arrow_left= +export oct_pin= +export oct_gift= +export oct_graph= +export oct_triangle_left= +export oct_credit_card= +export oct_clock= +export oct_ruby= +export oct_broadcast= +export oct_key= +export oct_repo_force_push= +export oct_repo_clone= +export oct_diff= +export oct_eye= +export oct_comment_discussion= +export oct_mail_reply= +export oct_primitive_dot= +export oct_primitive_square= +export oct_device_camera= +export oct_device_camera_video= +export oct_pencil= +export oct_info= +export oct_triangle_right= +export oct_triangle_down= +export oct_link= +export oct_plus= +export oct_three_bars= +export oct_code= +export oct_location= +export oct_list_unordered= +export oct_list_ordered= +export oct_quote= +export oct_versions= +export oct_calendar= +export oct_lock= +export oct_diff_added= +export oct_diff_removed= +export oct_diff_modified= +export oct_diff_renamed= +export oct_horizontal_rule= +export oct_arrow_small_right= +export oct_milestone= +export oct_checklist= +export oct_megaphone= +export oct_chevron_right= +export oct_bookmark= +export oct_settings= +export oct_dashboard= +export oct_history= +export oct_link_external= +export oct_mute= +export oct_x= +export oct_circle_slash= +export oct_pulse= +export oct_sync= +export oct_telescope= +export oct_gist_secret= +export oct_home= +export oct_stop= +export oct_bug= +export oct_logo_github= +export oct_file_binary= +export oct_database= +export oct_server= +export oct_diff_ignored= +export oct_ellipsis= +export oct_no_newline= +export oct_hubot= +export oct_arrow_small_up= +export oct_arrow_small_down= +export oct_arrow_small_left= +export oct_chevron_up= +export oct_chevron_down= +export oct_chevron_left= +export oct_triangle_up= +export oct_git_compare= +export oct_logo_gist= +export oct_file_symlink_file= +export oct_file_symlink_directory= +export oct_squirrel= +export oct_globe= +export oct_unmute= +export oct_mention= +export oct_package= +export oct_browser= +export oct_terminal= +export oct_markdown= +export oct_dash= +export oct_fold= +export oct_inbox= +export oct_trashcan= +export oct_paintcan= +export oct_flame= +export oct_briefcase= +export oct_plug= +export oct_circuit_board= +export oct_mortar_board= +export oct_law= +export oct_thumbsup= +export oct_thumbsdown= +export oct_desktop_download= +export oct_beaker= +export oct_bell= +export oct_watch= +export oct_shield= +export oct_bold= +export oct_text_size= +export oct_italic= +export oct_tasklist= +export oct_verified= +export oct_smiley= +export oct_unverified= +export oct_ellipses= +export oct_file= +export oct_grabber= +export oct_plus_small= +export oct_reply= +export oct_device_desktop= +export fa_glass= +export fa_music= +export fa_search= +export fa_envelope_o= +export fa_heart= +export fa_star= +export fa_star_o= +export fa_user= +export fa_film= +export fa_th_large= +export fa_th= +export fa_th_list= +export fa_check= +export fa_close= +export fa_search_plus= +export fa_search_minus= +export fa_power_off= +export fa_signal= +export fa_cog= +export fa_trash_o= +export fa_home= +export fa_file_o= +export fa_clock_o= +export fa_road= +export fa_download= +export fa_arrow_circle_o_down= +export fa_arrow_circle_o_up= +export fa_inbox= +export fa_play_circle_o= +export fa_repeat= +export fa_refresh= +export fa_list_alt= +export fa_lock= +export fa_flag= +export fa_headphones= +export fa_volume_off= +export fa_volume_down= +export fa_volume_up= +export fa_qrcode= +export fa_barcode= +export fa_tag= +export fa_tags= +export fa_book= +export fa_bookmark= +export fa_print= +export fa_camera= +export fa_font= +export fa_bold= +export fa_italic= +export fa_text_height= +export fa_text_width= +export fa_align_left= +export fa_align_center= +export fa_align_right= +export fa_align_justify= +export fa_list= +export fa_dedent= +export fa_indent= +export fa_video_camera= +export fa_image= +export fa_pencil= +export fa_map_marker= +export fa_adjust= +export fa_tint= +export fa_edit= +export fa_share_square_o= +export fa_check_square_o= +export fa_arrows= +export fa_step_backward= +export fa_fast_backward= +export fa_backward= +export fa_play= +export fa_pause= +export fa_stop= +export fa_forward= +export fa_fast_forward= +export fa_step_forward= +export fa_eject= +export fa_chevron_left= +export fa_chevron_right= +export fa_plus_circle= +export fa_minus_circle= +export fa_times_circle= +export fa_check_circle= +export fa_question_circle= +export fa_info_circle= +export fa_crosshairs= +export fa_times_circle_o= +export fa_check_circle_o= +export fa_ban= +export fa_arrow_left= +export fa_arrow_right= +export fa_arrow_up= +export fa_arrow_down= +export fa_mail_forward= +export fa_expand= +export fa_compress= +export fa_plus= +export fa_minus= +export fa_asterisk= +export fa_exclamation_circle= +export fa_gift= +export fa_leaf= +export fa_fire= +export fa_eye= +export fa_eye_slash= +export fa_exclamation_triangle= +export fa_plane= +export fa_calendar= +export fa_random= +export fa_comment= +export fa_magnet= +export fa_chevron_up= +export fa_chevron_down= +export fa_retweet= +export fa_shopping_cart= +export fa_folder= +export fa_folder_open= +export fa_arrows_v= +export fa_arrows_h= +export fa_bar_chart= +export fa_twitter_square= +export fa_facebook_square= +export fa_camera_retro= +export fa_key= +export fa_cogs= +export fa_comments= +export fa_thumbs_o_up= +export fa_thumbs_o_down= +export fa_star_half= +export fa_heart_o= +export fa_sign_out= +export fa_linkedin_square= +export fa_thumb_tack= +export fa_external_link= +export fa_sign_in= +export fa_trophy= +export fa_github_square= +export fa_upload= +export fa_lemon_o= +export fa_phone= +export fa_square_o= +export fa_bookmark_o= +export fa_phone_square= +export fa_twitter= +export fa_facebook= +export fa_github= +export fa_unlock= +export fa_credit_card= +export fa_feed= +export fa_hdd_o= +export fa_bullhorn= +export fa_bell_o= +export fa_certificate= +export fa_hand_o_right= +export fa_hand_o_left= +export fa_hand_o_up= +export fa_hand_o_down= +export fa_arrow_circle_left= +export fa_arrow_circle_right= +export fa_arrow_circle_up= +export fa_arrow_circle_down= +export fa_globe= +export fa_wrench= +export fa_tasks= +export fa_filter= +export fa_briefcase= +export fa_arrows_alt= +export fa_group= +export fa_chain= +export fa_cloud= +export fa_flask= +export fa_cut= +export fa_copy= +export fa_paperclip= +export fa_floppy_o= +export fa_square= +export fa_bars= +export fa_list_ul= +export fa_list_ol= +export fa_strikethrough= +export fa_underline= +export fa_table= +export fa_magic= +export fa_truck= +export fa_pinterest= +export fa_pinterest_square= +export fa_google_plus_square= +export fa_google_plus= +export fa_money= +export fa_caret_down= +export fa_caret_up= +export fa_caret_left= +export fa_caret_right= +export fa_columns= +export fa_sort= +export fa_sort_desc= +export fa_sort_asc= +export fa_envelope= +export fa_linkedin= +export fa_rotate_left= +export fa_gavel= +export fa_dashboard= +export fa_comment_o= +export fa_comments_o= +export fa_bolt= +export fa_sitemap= +export fa_umbrella= +export fa_clipboard= +export fa_lightbulb_o= +export fa_exchange= +export fa_cloud_download= +export fa_cloud_upload= +export fa_user_md= +export fa_stethoscope= +export fa_suitcase= +export fa_bell= +export fa_coffee= +export fa_cutlery= +export fa_file_text_o= +export fa_building_o= +export fa_hospital_o= +export fa_ambulance= +export fa_medkit= +export fa_fighter_jet= +export fa_beer= +export fa_h_square= +export fa_plus_square= +export fa_angle_double_left= +export fa_angle_double_right= +export fa_angle_double_up= +export fa_angle_double_down= +export fa_angle_left= +export fa_angle_right= +export fa_angle_up= +export fa_angle_down= +export fa_desktop= +export fa_laptop= +export fa_tablet= +export fa_mobile= +export fa_circle_o= +export fa_quote_left= +export fa_quote_right= +export fa_spinner= +export fa_circle= +export fa_mail_reply= +export fa_github_alt= +export fa_folder_o= +export fa_folder_open_o= +export fa_expand_alt= +export fa_collapse_alt= +export fa_smile_o= +export fa_frown_o= +export fa_meh_o= +export fa_gamepad= +export fa_keyboard_o= +export fa_flag_o= +export fa_flag_checkered= +export fa_terminal= +export fa_code= +export fa_mail_reply_all= +export fa_star_half_empty= +export fa_location_arrow= +export fa_crop= +export fa_code_fork= +export fa_chain_broken= +export fa_question= +export fa_info= +export fa_exclamation= +export fa_superscript= +export fa_subscript= +export fa_eraser= +export fa_puzzle_piece= +export fa_microphone= +export fa_microphone_slash= +export fa_shield= +export fa_calendar_o= +export fa_fire_extinguisher= +export fa_rocket= +export fa_maxcdn= +export fa_chevron_circle_left= +export fa_chevron_circle_right= +export fa_chevron_circle_up= +export fa_chevron_circle_down= +export fa_html5= +export fa_css3= +export fa_anchor= +export fa_unlock_alt= +export fa_bullseye= +export fa_ellipsis_h= +export fa_ellipsis_v= +export fa_rss_square= +export fa_play_circle= +export fa_ticket= +export fa_minus_square= +export fa_minus_square_o= +export fa_level_up= +export fa_level_down= +export fa_check_square= +export fa_pencil_square= +export fa_external_link_square= +export fa_share_square= +export fa_compass= +export fa_caret_square_o_down= +export fa_caret_square_o_up= +export fa_caret_square_o_right= +export fa_eur= +export fa_gbp= +export fa_dollar= +export fa_inr= +export fa_cny= +export fa_rouble= +export fa_krw= +export fa_bitcoin= +export fa_file= +export fa_file_text= +export fa_sort_alpha_asc= +export fa_sort_alpha_desc= +export fa_sort_amount_asc= +export fa_sort_amount_desc= +export fa_sort_numeric_asc= +export fa_sort_numeric_desc= +export fa_thumbs_up= +export fa_thumbs_down= +export fa_youtube_square= +export fa_youtube= +export fa_xing= +export fa_xing_square= +export fa_youtube_play= +export fa_dropbox= +export fa_stack_overflow= +export fa_instagram= +export fa_flickr= +export fa_adn= +export fa_bitbucket= +export fa_bitbucket_square= +export fa_tumblr= +export fa_tumblr_square= +export fa_long_arrow_down= +export fa_long_arrow_up= +export fa_long_arrow_left= +export fa_long_arrow_right= +export fa_apple= +export fa_windows= +export fa_android= +export fa_linux= +export fa_dribbble= +export fa_skype= +export fa_foursquare= +export fa_trello= +export fa_female= +export fa_male= +export fa_gittip= +export fa_sun_o= +export fa_moon_o= +export fa_archive= +export fa_bug= +export fa_vk= +export fa_weibo= +export fa_renren= +export fa_pagelines= +export fa_stack_exchange= +export fa_arrow_circle_o_right= +export fa_arrow_circle_o_left= +export fa_caret_square_o_left= +export fa_dot_circle_o= +export fa_wheelchair= +export fa_vimeo_square= +export fa_try= +export fa_plus_square_o= +export fa_space_shuttle= +export fa_slack= +export fa_envelope_square= +export fa_wordpress= +export fa_openid= +export fa_bank= +export fa_graduation_cap= +export fa_yahoo= +export fa_google= +export fa_reddit= +export fa_reddit_square= +export fa_stumbleupon_circle= +export fa_stumbleupon= +export fa_delicious= +export fa_digg= +export fa_pied_piper_pp= +export fa_pied_piper_alt= +export fa_drupal= +export fa_joomla= +export fa_language= +export fa_fax= +export fa_building= +export fa_child= +export fa_paw= +export fa_spoon= +export fa_cube= +export fa_cubes= +export fa_behance= +export fa_behance_square= +export fa_steam= +export fa_steam_square= +export fa_recycle= +export fa_automobile= +export fa_cab= +export fa_tree= +export fa_spotify= +export fa_deviantart= +export fa_soundcloud= +export fa_database= +export fa_file_pdf_o= +export fa_file_word_o= +export fa_file_excel_o= +export fa_file_powerpoint_o= +export fa_file_image_o= +export fa_file_archive_o= +export fa_file_audio_o= +export fa_file_movie_o= +export fa_file_code_o= +export fa_vine= +export fa_codepen= +export fa_jsfiddle= +export fa_life_bouy= +export fa_circle_o_notch= +export fa_ra= +export fa_empire= +export fa_git_square= +export fa_git= +export fa_hacker_news= +export fa_tencent_weibo= +export fa_qq= +export fa_wechat= +export fa_paper_plane= +export fa_paper_plane_o= +export fa_history= +export fa_circle_thin= +export fa_header= +export fa_paragraph= +export fa_sliders= +export fa_share_alt= +export fa_share_alt_square= +export fa_bomb= +export fa_futbol_o= +export fa_tty= +export fa_binoculars= +export fa_plug= +export fa_slideshare= +export fa_twitch= +export fa_yelp= +export fa_newspaper_o= +export fa_wifi= +export fa_calculator= +export fa_paypal= +export fa_google_wallet= +export fa_cc_visa= +export fa_cc_mastercard= +export fa_cc_discover= +export fa_cc_amex= +export fa_cc_paypal= +export fa_cc_stripe= +export fa_bell_slash= +export fa_bell_slash_o= +export fa_trash= +export fa_copyright= +export fa_at= +export fa_eyedropper= +export fa_paint_brush= +export fa_birthday_cake= +export fa_area_chart= +export fa_pie_chart= +export fa_line_chart= +export fa_lastfm= +export fa_lastfm_square= +export fa_toggle_off= +export fa_toggle_on= +export fa_bicycle= +export fa_bus= +export fa_ioxhost= +export fa_angellist= +export fa_cc= +export fa_ils= +export fa_meanpath= +export fa_buysellads= +export fa_connectdevelop= +export fa_dashcube= +export fa_forumbee= +export fa_leanpub= +export fa_sellsy= +export fa_shirtsinbulk= +export fa_simplybuilt= +export fa_skyatlas= +export fa_cart_plus= +export fa_cart_arrow_down= +export fa_diamond= +export fa_ship= +export fa_user_secret= +export fa_motorcycle= +export fa_street_view= +export fa_heartbeat= +export fa_venus= +export fa_mars= +export fa_mercury= +export fa_intersex= +export fa_transgender_alt= +export fa_venus_double= +export fa_mars_double= +export fa_venus_mars= +export fa_mars_stroke= +export fa_mars_stroke_v= +export fa_mars_stroke_h= +export fa_neuter= +export fa_genderless= +export fa__523= +export fa__524= +export fa_facebook_official= +export fa_pinterest_p= +export fa_whatsapp= +export fa_server= +export fa_user_plus= +export fa_user_times= +export fa_bed= +export fa_viacoin= +export fa_train= +export fa_subway= +export fa_medium= +export fa_y_combinator= +export fa_optin_monster= +export fa_opencart= +export fa_expeditedssl= +export fa_battery= +export fa_battery_3= +export fa_battery_2= +export fa_battery_1= +export fa_battery_0= +export fa_mouse_pointer= +export fa_i_cursor= +export fa_object_group= +export fa_object_ungroup= +export fa_sticky_note= +export fa_sticky_note_o= +export fa_cc_jcb= +export fa_cc_diners_club= +export fa_clone= +export fa_balance_scale= +export fa_hourglass_o= +export fa_hourglass_1= +export fa_hourglass_2= +export fa_hourglass_3= +export fa_hourglass= +export fa_hand_grab_o= +export fa_hand_paper_o= +export fa_hand_scissors_o= +export fa_hand_lizard_o= +export fa_hand_spock_o= +export fa_hand_pointer_o= +export fa_hand_peace_o= +export fa_trademark= +export fa_registered= +export fa_creative_commons= +export fa_gg= +export fa_gg_circle= +export fa_tripadvisor= +export fa_odnoklassniki= +export fa_odnoklassniki_square= +export fa_get_pocket= +export fa_wikipedia_w= +export fa_safari= +export fa_chrome= +export fa_firefox= +export fa_opera= +export fa_internet_explorer= +export fa_television= +export fa_contao= +export fa_500px= +export fa_amazon= +export fa_calendar_plus_o= +export fa_calendar_minus_o= +export fa_calendar_times_o= +export fa_calendar_check_o= +export fa_industry= +export fa_map_pin= +export fa_map_signs= +export fa_map_o= +export fa_map= +export fa_commenting= +export fa_commenting_o= +export fa_houzz= +export fa_vimeo= +export fa_black_tie= +export fa_fonticons= +export fa_reddit_alien= +export fa_edge= +export fa_credit_card_alt= +export fa_codiepie= +export fa_modx= +export fa_fort_awesome= +export fa_usb= +export fa_product_hunt= +export fa_mixcloud= +export fa_scribd= +export fa_pause_circle= +export fa_pause_circle_o= +export fa_stop_circle= +export fa_stop_circle_o= +export fa_shopping_bag= +export fa_shopping_basket= +export fa_hashtag= +export fa_bluetooth= +export fa_bluetooth_b= +export fa_percent= +export fa_gitlab= +export fa_wpbeginner= +export fa_wpforms= +export fa_envira= +export fa_universal_access= +export fa_wheelchair_alt= +export fa_question_circle_o= +export fa_blind= +export fa_audio_description= +export fa_volume_control_phone= +export fa_braille= +export fa_assistive_listening_systems= +export fa_american_sign_language_interpreting= +export fa_deaf= +export fa_glide= +export fa_glide_g= +export fa_sign_language= +export fa_low_vision= +export fa_viadeo= +export fa_viadeo_square= +export fa_snapchat= +export fa_snapchat_ghost= +export fa_snapchat_square= +export fa_pied_piper= +export fa_first_order= +export fa_yoast= +export fa_themeisle= +export fa_google_plus_circle= +export fa_fa= +export fa_handshake_o= +export fa_envelope_open= +export fa_envelope_open_o= +export fa_linode= +export fa_address_book= +export fa_address_book_o= +export fa_address_card= +export fa_address_card_o= +export fa_user_circle= +export fa_user_circle_o= +export fa_user_o= +export fa_id_badge= +export fa_drivers_license= +export fa_drivers_license_o= +export fa_quora= +export fa_free_code_camp= +export fa_telegram= +export fa_thermometer= +export fa_thermometer_3= +export fa_thermometer_2= +export fa_thermometer_1= +export fa_thermometer_0= +export fa_shower= +export fa_bath= +export fa_podcast= +export fa_window_maximize= +export fa_window_minimize= +export fa_window_restore= +export fa_times_rectangle= +export fa_times_rectangle_o= +export fa_bandcamp= +export fa_grav= +export fa_etsy= +export fa_imdb= +export fa_ravelry= +export fa_eercast= +export fa_microchip= +export fa_snowflake_o= +export fa_superpowers= +export fa_wpexplorer= +export fa_meetup= +export md_error= +export md_error_outline= +export md_warning= +export md_add_alert= +export md_album= +export md_av_timer= +export md_closed_caption= +export md_equalizer= +export md_explicit= +export md_fast_forward= +export md_fast_rewind= +export md_games= +export md_hearing= +export md_high_quality= +export md_loop= +export md_mic= +export md_mic_none= +export md_mic_off= +export md_movie= +export md_library_add= +export md_library_books= +export md_library_music= +export md_new_releases= +export md_not_interested= +export md_pause= +export md_pause_circle_filled= +export md_pause_circle_outline= +export md_play_arrow= +export md_play_circle_filled= +export md_play_circle_outline= +export md_playlist_add= +export md_queue= +export md_queue_music= +export md_radio= +export md_recent_actors= +export md_repeat= +export md_repeat_one= +export md_replay= +export md_shuffle= +export md_skip_next= +export md_skip_previous= +export md_snooze= +export md_stop= +export md_subtitles= +export md_surround_sound= +export md_video_library= +export md_videocam= +export md_videocam_off= +export md_volume_down= +export md_volume_mute= +export md_volume_off= +export md_volume_up= +export md_web= +export md_hd= +export md_sort_by_alpha= +export md_airplay= +export md_forward_10= +export md_forward_30= +export md_forward_5= +export md_replay_10= +export md_replay_30= +export md_replay_5= +export md_add_to_queue= +export md_fiber_dvr= +export md_fiber_new= +export md_playlist_play= +export md_art_track= +export md_fiber_manual_record= +export md_fiber_smart_record= +export md_music_video= +export md_subscriptions= +export md_playlist_add_check= +export md_queue_play_next= +export md_remove_from_queue= +export md_slow_motion_video= +export md_web_asset= +export md_fiber_pin= +export md_branding_watermark= +export md_call_to_action= +export md_featured_play_list= +export md_featured_video= +export md_note= +export md_video_call= +export md_video_label= +export md_business= +export md_call= +export md_call_end= +export md_call_made= +export md_call_merge= +export md_call_missed= +export md_call_received= +export md_call_split= +export md_chat= +export md_clear_all= +export md_comment= +export md_contacts= +export md_dialer_sip= +export md_dialpad= +export md_email= +export md_forum= +export md_import_export= +export md_invert_colors_off= +export md_live_help= +export md_location_off= +export md_location_on= +export md_message= +export md_chat_bubble= +export md_chat_bubble_outline= +export md_no_sim= +export md_phone= +export md_portable_wifi_off= +export md_contact_phone= +export md_contact_mail= +export md_ring_volume= +export md_speaker_phone= +export md_stay_current_landscape= +export md_stay_current_portrait= +export md_stay_primary_landscape= +export md_stay_primary_portrait= +export md_swap_calls= +export md_textsms= +export md_voicemail= +export md_vpn_key= +export md_phonelink_erase= +export md_phonelink_lock= +export md_phonelink_ring= +export md_phonelink_setup= +export md_present_to_all= +export md_import_contacts= +export md_mail_outline= +export md_screen_share= +export md_stop_screen_share= +export md_call_missed_outgoing= +export md_rss_feed= +export md_add= +export md_add_box= +export md_add_circle= +export md_add_circle_outline= +export md_archive= +export md_backspace= +export md_block= +export md_clear= +export md_content_copy= +export md_content_cut= +export md_content_paste= +export md_create= +export md_drafts= +export md_filter_list= +export md_flag= +export md_forward= +export md_gesture= +export md_inbox= +export md_link= +export md_mail= +export md_markunread= +export md_redo= +export md_remove= +export md_remove_circle= +export md_remove_circle_outline= +export md_reply= +export md_reply_all= +export md_report= +export md_save= +export md_select_all= +export md_send= +export md_sort= +export md_text_format= +export md_undo= +export md_font_download= +export md_move_to_inbox= +export md_unarchive= +export md_next_week= +export md_weekend= +export md_delete_sweep= +export md_low_priority= +export md_access_alarm= +export md_access_alarms= +export md_access_time= +export md_add_alarm= +export md_airplanemode_inactive= +export md_airplanemode_active= +export md_battery_alert= +export md_battery_charging_full= +export md_battery_full= +export md_battery_std= +export md_battery_unknown= +export md_bluetooth= +export md_bluetooth_connected= +export md_bluetooth_disabled= +export md_bluetooth_searching= +export md_brightness_auto= +export md_brightness_high= +export md_brightness_low= +export md_brightness_medium= +export md_data_usage= +export md_developer_mode= +export md_devices= +export md_dvr= +export md_gps_fixed= +export md_gps_not_fixed= +export md_gps_off= +export md_location_disabled= +export md_location_searching= +export md_graphic_eq= +export md_network_cell= +export md_network_wifi= +export md_nfc= +export md_wallpaper= +export md_widgets= +export md_screen_lock_landscape= +export md_screen_lock_portrait= +export md_screen_lock_rotation= +export md_screen_rotation= +export md_sd_storage= +export md_settings_system_daydream= +export md_signal_cellular_4_bar= +export md_signal_cellular_connected_no_internet_4_bar= +export md_signal_cellular_no_sim= +export md_signal_cellular_null= +export md_signal_cellular_off= +export md_signal_wifi_4_bar= +export md_signal_wifi_4_bar_lock= +export md_signal_wifi_off= +export md_storage= +export md_usb= +export md_wifi_lock= +export md_wifi_tethering= +export md_attach_file= +export md_attach_money= +export md_border_all= +export md_border_bottom= +export md_border_clear= +export md_border_color= +export md_border_horizontal= +export md_border_inner= +export md_border_left= +export md_border_outer= +export md_border_right= +export md_border_style= +export md_border_top= +export md_border_vertical= +export md_format_align_center= +export md_format_align_justify= +export md_format_align_left= +export md_format_align_right= +export md_format_bold= +export md_format_clear= +export md_format_color_fill= +export md_format_color_reset= +export md_format_color_text= +export md_format_indent_decrease= +export md_format_indent_increase= +export md_format_italic= +export md_format_line_spacing= +export md_format_list_bulleted= +export md_format_list_numbered= +export md_format_paint= +export md_format_quote= +export md_format_size= +export md_format_strikethrough= +export md_format_textdirection_l_to_r= +export md_format_textdirection_r_to_l= +export md_format_underlined= +export md_functions= +export md_insert_chart= +export md_insert_comment= +export md_insert_drive_file= +export md_insert_emoticon= +export md_insert_invitation= +export md_insert_link= +export md_insert_photo= +export md_merge_type= +export md_mode_comment= +export md_mode_edit= +export md_publish= +export md_space_bar= +export md_strikethrough_s= +export md_vertical_align_bottom= +export md_vertical_align_center= +export md_vertical_align_top= +export md_wrap_text= +export md_money_off= +export md_drag_handle= +export md_format_shapes= +export md_highlight= +export md_linear_scale= +export md_short_text= +export md_text_fields= +export md_monetization_on= +export md_title= +export md_attachment= +export md_cloud= +export md_cloud_circle= +export md_cloud_done= +export md_cloud_download= +export md_cloud_off= +export md_cloud_queue= +export md_cloud_upload= +export md_file_download= +export md_file_upload= +export md_folder= +export md_folder_open= +export md_folder_shared= +export md_create_new_folder= +export md_cast= +export md_cast_connected= +export md_computer= +export md_desktop_mac= +export md_desktop_windows= +export md_developer_board= +export md_dock= +export md_gamepad= +export md_headset= +export md_headset_mic= +export md_keyboard= +export md_keyboard_arrow_down= +export md_keyboard_arrow_left= +export md_keyboard_arrow_right= +export md_keyboard_arrow_up= +export md_keyboard_backspace= +export md_keyboard_capslock= +export md_keyboard_hide= +export md_keyboard_return= +export md_keyboard_tab= +export md_keyboard_voice= +export md_laptop= +export md_laptop_chromebook= +export md_laptop_mac= +export md_laptop_windows= +export md_memory= +export md_mouse= +export md_phone_android= +export md_phone_iphone= +export md_phonelink= +export md_phonelink_off= +export md_router= +export md_scanner= +export md_security= +export md_sim_card= +export md_smartphone= +export md_speaker= +export md_speaker_group= +export md_tablet= +export md_tablet_android= +export md_tablet_mac= +export md_toys= +export md_tv= +export md_watch= +export md_device_hub= +export md_power_input= +export md_devices_other= +export md_videogame_asset= +export md_add_to_photos= +export md_adjust= +export md_assistant= +export md_assistant_photo= +export md_audiotrack= +export md_blur_circular= +export md_blur_linear= +export md_blur_off= +export md_blur_on= +export md_brightness_1= +export md_brightness_2= +export md_brightness_3= +export md_brightness_4= +export md_brightness_5= +export md_brightness_6= +export md_brightness_7= +export md_broken_image= +export md_brush= +export md_camera= +export md_camera_alt= +export md_camera_front= +export md_camera_rear= +export md_camera_roll= +export md_center_focus_strong= +export md_center_focus_weak= +export md_collections= +export md_color_lens= +export md_colorize= +export md_compare= +export md_control_point= +export md_control_point_duplicate= +export md_crop_16_9= +export md_crop_3_2= +export md_crop= +export md_crop_5_4= +export md_crop_7_5= +export md_crop_din= +export md_crop_free= +export md_crop_landscape= +export md_crop_original= +export md_crop_portrait= +export md_crop_square= +export md_dehaze= +export md_details= +export md_edit= +export md_exposure= +export md_exposure_neg_1= +export md_exposure_neg_2= +export md_exposure_plus_1= +export md_exposure_plus_2= +export md_exposure_zero= +export md_filter_1= +export md_filter_2= +export md_filter_3= +export md_filter= +export md_filter_4= +export md_filter_5= +export md_filter_6= +export md_filter_7= +export md_filter_8= +export md_filter_9= +export md_filter_9_plus= +export md_filter_b_and_w= +export md_filter_center_focus= +export md_filter_drama= +export md_filter_frames= +export md_filter_hdr= +export md_filter_none= +export md_filter_tilt_shift= +export md_filter_vintage= +export md_flare= +export md_flash_auto= +export md_flash_off= +export md_flash_on= +export md_flip= +export md_gradient= +export md_grain= +export md_grid_off= +export md_grid_on= +export md_hdr_off= +export md_hdr_on= +export md_hdr_strong= +export md_hdr_weak= +export md_healing= +export md_image= +export md_image_aspect_ratio= +export md_iso= +export md_landscape= +export md_leak_add= +export md_leak_remove= +export md_lens= +export md_looks_3= +export md_looks= +export md_looks_4= +export md_looks_5= +export md_looks_6= +export md_looks_one= +export md_looks_two= +export md_loupe= +export md_monochrome_photos= +export md_movie_creation= +export md_music_note= +export md_nature= +export md_nature_people= +export md_navigate_before= +export md_navigate_next= +export md_palette= +export md_panorama= +export md_panorama_fish_eye= +export md_panorama_horizontal= +export md_panorama_vertical= +export md_panorama_wide_angle= +export md_photo= +export md_photo_album= +export md_photo_camera= +export md_photo_library= +export md_picture_as_pdf= +export md_portrait= +export md_remove_red_eye= +export md_rotate_90_degrees_ccw= +export md_rotate_left= +export md_rotate_right= +export md_slideshow= +export md_straighten= +export md_style= +export md_switch_camera= +export md_switch_video= +export md_tag_faces= +export md_texture= +export md_timelapse= +export md_timer_10= +export md_timer_3= +export md_timer= +export md_timer_off= +export md_tonality= +export md_transform= +export md_tune= +export md_view_comfy= +export md_view_compact= +export md_wb_auto= +export md_wb_cloudy= +export md_wb_incandescent= +export md_wb_sunny= +export md_collections_bookmark= +export md_photo_size_select_actual= +export md_photo_size_select_large= +export md_photo_size_select_small= +export md_vignette= +export md_wb_iridescent= +export md_crop_rotate= +export md_linked_camera= +export md_add_a_photo= +export md_movie_filter= +export md_photo_filter= +export md_burst_mode= +export md_beenhere= +export md_directions= +export md_directions_bike= +export md_directions_bus= +export md_directions_car= +export md_directions_boat= +export md_directions_subway= +export md_directions_railway= +export md_directions_transit= +export md_directions_walk= +export md_flight= +export md_hotel= +export md_layers= +export md_layers_clear= +export md_local_airport= +export md_local_atm= +export md_local_activity= +export md_local_bar= +export md_local_cafe= +export md_local_car_wash= +export md_local_convenience_store= +export md_local_drink= +export md_local_florist= +export md_local_gas_station= +export md_local_grocery_store= +export md_local_hospital= +export md_local_hotel= +export md_local_laundry_service= +export md_local_library= +export md_local_mall= +export md_local_movies= +export md_local_offer= +export md_local_parking= +export md_local_pharmacy= +export md_local_phone= +export md_local_pizza= +export md_local_play= +export md_local_post_office= +export md_local_printshop= +export md_local_dining= +export md_local_see= +export md_local_shipping= +export md_local_taxi= +export md_person_pin= +export md_map= +export md_my_location= +export md_navigation= +export md_pin_drop= +export md_place= +export md_rate_review= +export md_restaurant_menu= +export md_satellite= +export md_store_mall_directory= +export md_terrain= +export md_traffic= +export md_directions_run= +export md_add_location= +export md_edit_location= +export md_near_me= +export md_person_pin_circle= +export md_zoom_out_map= +export md_restaurant= +export md_ev_station= +export md_streetview= +export md_subway= +export md_train= +export md_tram= +export md_transfer_within_a_station= +export md_apps= +export md_arrow_back= +export md_arrow_drop_down= +export md_arrow_drop_down_circle= +export md_arrow_drop_up= +export md_arrow_forward= +export md_cancel= +export md_check= +export md_chevron_left= +export md_chevron_right= +export md_close= +export md_expand_less= +export md_expand_more= +export md_fullscreen= +export md_fullscreen_exit= +export md_menu= +export md_more_horiz= +export md_more_vert= +export md_refresh= +export md_unfold_less= +export md_unfold_more= +export md_arrow_upward= +export md_subdirectory_arrow_left= +export md_subdirectory_arrow_right= +export md_arrow_downward= +export md_first_page= +export md_last_page= +export md_adb= +export md_bluetooth_audio= +export md_disc_full= +export md_do_not_disturb_alt= +export md_do_not_disturb= +export md_drive_eta= +export md_event_available= +export md_event_busy= +export md_event_note= +export md_folder_special= +export md_mms= +export md_more= +export md_network_locked= +export md_phone_bluetooth_speaker= +export md_phone_forwarded= +export md_phone_in_talk= +export md_phone_locked= +export md_phone_missed= +export md_phone_paused= +export md_sd_card= +export md_sim_card_alert= +export md_sms= +export md_sms_failed= +export md_sync= +export md_sync_disabled= +export md_sync_problem= +export md_system_update= +export md_tap_and_play= +export md_time_to_leave= +export md_vibration= +export md_voice_chat= +export md_vpn_lock= +export md_airline_seat_flat= +export md_airline_seat_flat_angled= +export md_airline_seat_individual_suite= +export md_airline_seat_legroom_extra= +export md_airline_seat_legroom_normal= +export md_airline_seat_legroom_reduced= +export md_airline_seat_recline_extra= +export md_airline_seat_recline_normal= +export md_confirmation_number= +export md_live_tv= +export md_ondemand_video= +export md_personal_video= +export md_power= +export md_wc= +export md_wifi= +export md_enhanced_encryption= +export md_network_check= +export md_no_encryption= +export md_rv_hookup= +export md_do_not_disturb_off= +export md_do_not_disturb_on= +export md_priority_high= +export md_pie_chart= +export md_pie_chart_outlined= +export md_bubble_chart= +export md_multiline_chart= +export md_show_chart= +export md_cake= +export md_domain= +export md_group= +export md_group_add= +export md_location_city= +export md_mood= +export md_mood_bad= +export md_notifications= +export md_notifications_none= +export md_notifications_off= +export md_notifications_active= +export md_notifications_paused= +export md_pages= +export md_party_mode= +export md_people= +export md_people_outline= +export md_person= +export md_person_add= +export md_person_outline= +export md_plus_one= +export md_poll= +export md_public= +export md_school= +export md_share= +export md_whatshot= +export md_sentiment_dissatisfied= +export md_sentiment_neutral= +export md_sentiment_satisfied= +export md_sentiment_very_dissatisfied= +export md_sentiment_very_satisfied= +export md_check_box= +export md_check_box_outline_blank= +export md_radio_button_unchecked= +export md_radio_button_checked= +export md_star= +export md_star_half= +export md_star_border= +export md_3d_rotation= +export md_accessibility= +export md_account_balance= +export md_account_balance_wallet= +export md_account_box= +export md_account_circle= +export md_add_shopping_cart= +export md_alarm= +export md_alarm_add= +export md_alarm_off= +export md_alarm_on= +export md_android= +export md_announcement= +export md_aspect_ratio= +export md_assessment= +export md_assignment= +export md_assignment_ind= +export md_assignment_late= +export md_assignment_return= +export md_assignment_returned= +export md_assignment_turned_in= +export md_autorenew= +export md_backup= +export md_book= +export md_bookmark= +export md_bookmark_border= +export md_bug_report= +export md_build= +export md_cached= +export md_change_history= +export md_check_circle= +export md_chrome_reader_mode= +export md_class= +export md_code= +export md_credit_card= +export md_dashboard= +export md_delete= +export md_description= +export md_dns= +export md_done= +export md_done_all= +export md_event= +export md_exit_to_app= +export md_explore= +export md_extension= +export md_face= +export md_favorite= +export md_favorite_border= +export md_feedback= +export md_find_in_page= +export md_find_replace= +export md_flip_to_back= +export md_flip_to_front= +export md_get_app= +export md_grade= +export md_group_work= +export md_help= +export md_highlight_off= +export md_history= +export md_home= +export md_hourglass_empty= +export md_hourglass_full= +export md_https= +export md_info= +export md_info_outline= +export md_input= +export md_invert_colors= +export md_label= +export md_label_outline= +export md_language= +export md_launch= +export md_list= +export md_lock= +export md_lock_open= +export md_lock_outline= +export md_loyalty= +export md_markunread_mailbox= +export md_note_add= +export md_open_in_browser= +export md_open_in_new= +export md_open_with= +export md_pageview= +export md_payment= +export md_perm_camera_mic= +export md_perm_contact_calendar= +export md_perm_data_setting= +export md_perm_device_information= +export md_perm_identity= +export md_perm_media= +export md_perm_phone_msg= +export md_perm_scan_wifi= +export md_picture_in_picture= +export md_polymer= +export md_power_settings_new= +export md_print= +export md_query_builder= +export md_question_answer= +export md_receipt= +export md_redeem= +export md_report_problem= +export md_restore= +export md_room= +export md_schedule= +export md_search= +export md_settings= +export md_settings_applications= +export md_settings_backup_restore= +export md_settings_bluetooth= +export md_settings_cell= +export md_settings_brightness= +export md_settings_ethernet= +export md_settings_input_antenna= +export md_settings_input_component= +export md_settings_input_composite= +export md_settings_input_hdmi= +export md_settings_input_svideo= +export md_settings_overscan= +export md_settings_phone= +export md_settings_power= +export md_settings_remote= +export md_settings_voice= +export md_shop= +export md_shop_two= +export md_shopping_basket= +export md_shopping_cart= +export md_speaker_notes= +export md_spellcheck= +export md_stars= +export md_store= +export md_subject= +export md_supervisor_account= +export md_swap_horiz= +export md_swap_vert= +export md_swap_vertical_circle= +export md_system_update_alt= +export md_tab= +export md_tab_unselected= +export md_theaters= +export md_thumb_down= +export md_thumb_up= +export md_thumbs_up_down= +export md_toc= +export md_today= +export md_toll= +export md_track_changes= +export md_translate= +export md_trending_down= +export md_trending_flat= +export md_trending_up= +export md_turned_in= +export md_turned_in_not= +export md_verified_user= +export md_view_agenda= +export md_view_array= +export md_view_carousel= +export md_view_column= +export md_view_day= +export md_view_headline= +export md_view_list= +export md_view_module= +export md_view_quilt= +export md_view_stream= +export md_view_week= +export md_visibility= +export md_visibility_off= +export md_card_giftcard= +export md_card_membership= +export md_card_travel= +export md_work= +export md_youtube_searched_for= +export md_eject= +export md_camera_enhance= +export md_help_outline= +export md_reorder= +export md_zoom_in= +export md_zoom_out= +export md_http= +export md_event_seat= +export md_flight_land= +export md_flight_takeoff= +export md_play_for_work= +export md_gif= +export md_indeterminate_check_box= +export md_offline_pin= +export md_all_out= +export md_copyright= +export md_fingerprint= +export md_gavel= +export md_lightbulb_outline= +export md_picture_in_picture_alt= +export md_important_devices= +export md_touch_app= +export md_accessible= +export md_compare_arrows= +export md_date_range= +export md_donut_large= +export md_donut_small= +export md_line_style= +export md_line_weight= +export md_motorcycle= +export md_opacity= +export md_pets= +export md_pregnant_woman= +export md_record_voice_over= +export md_rounded_corner= +export md_rowing= +export md_timeline= +export md_update= +export md_watch_later= +export md_pan_tool= +export md_euro_symbol= +export md_g_translate= +export md_remove_shopping_cart= +export md_restore_page= +export md_speaker_notes_off= +export md_delete_forever= +export md_ac_unit= +export md_airport_shuttle= +export md_all_inclusive= +export md_beach_access= +export md_business_center= +export md_casino= +export md_child_care= +export md_child_friendly= +export md_fitness_center= +export md_free_breakfast= +export md_golf_course= +export md_hot_tub= +export md_kitchen= +export md_pool= +export md_room_service= +export md_smoke_free= +export md_smoking_rooms= +export md_spa= +export md_u10fffd= +export file_regex= +export file_arch_linux= +export file_e= +export file_glyphs= +export file_knockout= +export file_lean= +export file_metal= +export file_povray= +export file_s= +export file_tt= +export file_vagrant= +export file_xmos= +export file_a= +export file_chai= +export file_stylus= +export file_textile= +export file_unreal= +export file_purebasic= +export file_ts= +export file_scheme= +export file_textmate= +export file_x10= +export file_apl= +export file_ansible= +export file_arttext= +export file_antwar= +export file_opa= +export file_codecov= +export file_yang= +export file_pm2= +export file_hg= +export file_pawn= +export file_julia= +export file_shipit= +export file_mocha= +export file_nib= +export file_shuriken= +export file_alex= +export file_twig= +export file_1c= +export file_tex= +export file_bibtex= +export file_mustache= +export file_gulp= +export file_grunt= +export file_ember= +export file_go= +export file_jenkins= +export file_gnu= +export file_composer= +export file_meteor= +export file_ai= +export file_psd= +export file_silverstripe= +export file_maxscript= +export file_kivy= +export file_crystal= +export file_gradle= +export file_groovy= +export file_r= +export file_vue= +export file_haxe= +export file_lisp= +export file_e909= +export file_fortran= +export file_ada= +export file_dyalog= +export file_jade= +export file_e90e= +export file_font= +export file_postcss= +export file_scad= +export file_e912= +export file_raml= +export file_ls= +export file_saltstack= +export file_terraform= +export file_org= +export file_asciidoc= +export file_riot= +export file_ocaml= +export file_lua= +export file_npm= +export file_llvm= +export file_e91e= +export file_babel= +export file_marko= +export file_flow= +export file_broccoli= +export file_appveyor= +export file_cakefile= +export file_apple= +export file_emacs= +export file_sketch= +export file_doxygen= +export file_cf= +export file_pascal= +export file_abap= +export file_antlr= +export file_api= +export file_as= +export file_arc= +export file_arduino= +export file_augeas= +export file_ahk= +export file_autoit= +export file_ats= +export file_alloy= +export file_manpage= +export file_j= +export file_glade= +export file_boo= +export file_brain= +export file_bro= +export file_bluespec= +export file_stylelint= +export file_ant= +export file_cmake= +export file_clips= +export file_mapbox= +export file_cp= +export file_chuck= +export file_jinja= +export file_isabelle= +export file_doge= +export file_idl= +export file_jake= +export file_verilog= +export file_phalcon= +export file_fabfile= +export file_lfe= +export file_nmap= +export file_ampl= +export file_ceylon= +export file_chapel= +export file_cirru= +export file_clarion= +export file_nunjucks= +export file_mediawiki= +export file_postscript= +export file_tcl= +export file_owl= +export file_jsonld= +export file_sparql= +export file_sas= +export file_clean= +export file_click= +export file_nvidia= +export file_creole= +export file_coq= +export file_diff= +export file_patch= +export file_byond= +export file_cython= +export file_darcs= +export file_eagle= +export file_ecere= +export file_eiffel= +export file_em= +export file_flux= +export file_factor= +export file_fancy= +export file_perl6= +export file_gentoo= +export file_frege= +export file_fantom= +export file_freemarker= +export file_gap= +export file_cl= +export file_gams= +export file_godot= +export file_gml= +export file_genshi= +export file_pointwise= +export file_gf= +export file_golo= +export file_gosu= +export file_harbour= +export file_graphql= +export file_graphviz= +export file_hashicorp= +export file_hy= +export file_igorpro= +export file_io= +export file_ioke= +export file_idris= +export file_inform7= +export file_inno= +export file_sublime= +export file_jupyter= +export file_krl= +export file_kotlin= +export file_labview= +export file_lsl= +export file_lasso= +export file_logtalk= +export file_lookml= +export file_mako= +export file_mathematica= +export file_matlab= +export file_e992= +export file_max= +export file_mercury= +export file_mirah= +export file_modula2= +export file_monkey= +export file_nimrod= +export file_nit= +export file_nix= +export file_amx= +export file_netlogo= +export file_numpy= +export file_objj= +export file_opencl= +export file_processing= +export file_ox= +export file_scd= +export file_stata= +export file_stan= +export file_sqf= +export file_slash= +export file_shen= +export file_self= +export file_scilab= +export file_vhdl= +export file_sage= +export file_robot= +export file_red= +export file_rebol= +export file_xojo= +export file_rdoc= +export file_racket= +export file_purescript= +export file_uno= +export file_varnish= +export file_propeller= +export file_turing= +export file_pony= +export file_pogo= +export file_pike= +export file_urweb= +export file_parrot= +export file_papyrus= +export file_pan= +export file_oz= +export file_oxygene= +export file_progress= +export file_txl= +export file_cabal= +export file_sysverilog= +export file_pickle= +export file_xpages= +export file_xtend= +export file_zephir= +export file_zimpl= +export file_ec= +export file_mupad= +export file_ooc= +export file_rst= +export file_karma= +export file_hack= +export file_shopify= +export file_pug_alt= +export file_e9d1= +export file_sbt= +export file_e9d3= +export file_scrutinizer= +export file_cc= +export file_brakeman= +export file_newrelic= +export file_thor= +export file_nuget= +export file_powershell= +export file_sf= +export file_minecraft= +export file_sqlite= +export file_protractor= +export file_typings= +export file_strings= +export file_nant= +export file_csscript= +export file_cake= +export file_openoffice= +export file_keynote= +export file_jsx= +export file_tsx= +export file_model= +export file_finder= +export file_access= +export file_onenote= +export file_powerpoint= +export file_word= +export file_excel= +export file_storyist= +export file_csound= +export file_dbase= +export file_zbrush= +export file_ae= +export file_indesign= +export file_premiere= +export file_maya= +export file_e9f7= +export file_khronos= +export file_audacity= +export file_blender= +export file_lightwave= +export file_fbx= +export file_e9fd= +export file_typedoc= +export file_alpine= +export file_yui= +export file_ea01= +export file_ea02= +export file_ea03= +export file_normalize= +export file_neko= +export file_mathjax= +export file_leaflet= +export file_gdb= +export file_fuelux= +export file_eq= +export file_chartjs= +export file_ea0c= +export file_ea0d= +export file_ea0e= +export file_eslint= +export file_d3= +export file_cordova= +export file_circleci= +export file_pug= +export file_powerbuilder= +export file_dylib= +export file_rexx= +export file_svn= +export file_mruby= +export file_wercker= +export file_yarn= +export file_editorconfig= +export file_snyk= +export file_reason= +export file_nsis= +export file_v8= +export file_rollup= +export file_ea21= +export file_ea22= +export file_ea23= +export file_rascal= +export file_gn= +export file_nodemon= +export file_electron= +export file_1c_alt= +export file_swagger= +export file_bithound= +export file_polymer= +export file_platformio= +export file_shippable= +export file_ea2e= +export file_sequelize= +export file_redux= +export file_rspec= +export file_phpunit= +export file_octave= +export file_nuclide= +export file_infopath= +export file_lime= +export file_lerna= +export file_kitchenci= +export file_jest= +export file_jasmine= +export file_haxedevelop= +export file_gitlab= +export file_drone= +export file_virtualbox= +export file_doclets= +export file_delphi= +export file_codekit= +export file_chef= +export file_cakephp= +export file_cobol= +export file_bundler= +export file_buck= +export file_brunch= +export file_aurelia= +export file_vmware= +export file_rhino= +export file_ejs= +export file_kicad= +export file_hoplon= +export file_abif= +export file_watchman= +export file_p4= +export file_nanoc= +export file_miranda= +export file_minizinc= +export file_meson= +export file_jison= +export file_franca= +export file_devicetree= +export file_caddy= +export file_bem= +export file_bazel= +export file_angelscript= +export file_esdoc= +export file_twine= +export file_squarespace= +export file_phoenix= +export file_test_dir= +export file_webpack= +export file_test_coffee= +export file_test_generic= +export file_test_js= +export file_test_perl= +export file_test_python= +export file_test_react= +export file_test_ruby= +export file_test_ts= +export file_codeship= +export file_nxc= +export file_brotli= +export file_proselint= +export file_bintray= +export file_mjml= +export file_wasm= +export file_ea71= +export file_nasm= +export file_ea73= +export file_peg= +export file_jolie= +export file_nano= +export file_xamarin= +export file_f012= +export file_tag= +export file_cucumber= +export file_video= +export file_config= +export file_dashboard= +export file_puppet= +export file_terminal= +export file_markdownlint= +export file_react= +export file_f101= +export file_elm= +export file_boot= +export file_cljs= +export file_lein= +export file_docker= +export file_php= +export file_ionic= +export file_haml= +export file_f17b= +export file_ff= +export file_u1f3c1= +export file_tern= +export file_default= +export file_sigils= +export file_nginx= +export weather_day_cloudy_gusts= +export weather_day_cloudy_windy= +export weather_day_cloudy= +export weather_day_fog= +export weather_day_hail= +export weather_day_lightning= +export weather_day_rain_mix= +export weather_day_rain_wind= +export weather_day_rain= +export weather_day_showers= +export weather_day_snow= +export weather_day_sprinkle= +export weather_day_sunny_overcast= +export weather_day_sunny= +export weather_day_storm_showers= +export weather_day_thunderstorm= +export weather_cloudy_gusts= +export weather_cloudy_windy= +export weather_cloudy= +export weather_fog= +export weather_hail= +export weather_lightning= +export weather_rain_mix= +export weather_rain_wind= +export weather_rain= +export weather_showers= +export weather_snow= +export weather_sprinkle= +export weather_storm_showers= +export weather_thunderstorm= +export weather_windy= +export weather_night_alt_cloudy_gusts= +export weather_night_alt_cloudy_windy= +export weather_night_alt_hail= +export weather_night_alt_lightning= +export weather_night_alt_rain_mix= +export weather_night_alt_rain_wind= +export weather_night_alt_rain= +export weather_night_alt_showers= +export weather_night_alt_snow= +export weather_night_alt_sprinkle= +export weather_night_alt_storm_showers= +export weather_night_alt_thunderstorm= +export weather_night_clear= +export weather_night_cloudy_gusts= +export weather_night_cloudy_windy= +export weather_night_cloudy= +export weather_night_hail= +export weather_night_lightning= +export weather_night_rain_mix= +export weather_night_rain_wind= +export weather_night_rain= +export weather_night_showers= +export weather_night_snow= +export weather_night_sprinkle= +export weather_night_storm_showers= +export weather_night_thunderstorm= +export weather_celsius= +export weather_cloud_down= +export weather_cloud_refresh= +export weather_cloud_up= +export weather_cloud= +export weather_degrees= +export weather_direction_down_left= +export weather_direction_down= +export weather_fahrenheit= +export weather_horizon_alt= +export weather_horizon= +export weather_direction_left= +export weather_f049= +export weather_night_fog= +export weather_refresh_alt= +export weather_refresh= +export weather_direction_right= +export weather_raindrops= +export weather_strong_wind= +export weather_sunrise= +export weather_sunset= +export weather_thermometer_exterior= +export weather_thermometer_internal= +export weather_thermometer= +export weather_tornado= +export weather_direction_up_right= +export weather_direction_up= +export weather_f059= +export weather_f05a= +export weather_f05b= +export weather_f05c= +export weather_f05d= +export weather_f05e= +export weather_f060= +export weather_f061= +export weather_smoke= +export weather_dust= +export weather_snow_wind= +export weather_day_snow_wind= +export weather_night_snow_wind= +export weather_night_alt_snow_wind= +export weather_day_sleet_storm= +export weather_night_sleet_storm= +export weather_night_alt_sleet_storm= +export weather_day_snow_thunderstorm= +export weather_night_snow_thunderstorm= +export weather_night_alt_snow_thunderstorm= +export weather_solar_eclipse= +export weather_lunar_eclipse= +export weather_meteor= +export weather_hot= +export weather_hurricane= +export weather_smog= +export weather_alien= +export weather_snowflake_cold= +export weather_stars= +export weather_raindrop= +export weather_barometer= +export weather_humidity= +export weather_na= +export weather_flood= +export weather_day_cloudy_high= +export weather_night_alt_cloudy_high= +export weather_night_cloudy_high= +export weather_night_alt_partly_cloudy= +export weather_sandstorm= +export weather_night_partly_cloudy= +export weather_umbrella= +export weather_day_windy= +export weather_night_alt_cloudy= +export weather_direction_up_left= +export weather_direction_down_right= +export weather_time_12= +export weather_time_1= +export weather_time_2= +export weather_time_3= +export weather_time_4= +export weather_time_5= +export weather_time_6= +export weather_time_7= +export weather_time_8= +export weather_time_9= +export weather_time_10= +export weather_time_11= +export weather_moon_new= +export weather_moon_waxing_crescent_1= +export weather_moon_waxing_crescent_2= +export weather_moon_waxing_crescent_3= +export weather_moon_waxing_crescent_4= +export weather_moon_waxing_crescent_5= +export weather_moon_waxing_crescent_6= +export weather_moon_first_quarter= +export weather_moon_waxing_gibbous_1= +export weather_moon_waxing_gibbous_2= +export weather_moon_waxing_gibbous_3= +export weather_moon_waxing_gibbous_4= +export weather_moon_waxing_gibbous_5= +export weather_moon_waxing_gibbous_6= +export weather_moon_full= +export weather_moon_waning_gibbous_1= +export weather_moon_waning_gibbous_2= +export weather_moon_waning_gibbous_3= +export weather_moon_waning_gibbous_4= +export weather_moon_waning_gibbous_5= +export weather_moon_waning_gibbous_6= +export weather_moon_third_quarter= +export weather_moon_waning_crescent_1= +export weather_moon_waning_crescent_2= +export weather_moon_waning_crescent_3= +export weather_moon_waning_crescent_4= +export weather_moon_waning_crescent_5= +export weather_moon_waning_crescent_6= +export weather_wind_direction= +export weather_day_sleet= +export weather_night_sleet= +export weather_night_alt_sleet= +export weather_sleet= +export weather_day_haze= +export weather_wind_beaufort_0= +export weather_wind_beaufort_1= +export weather_wind_beaufort_2= +export weather_wind_beaufort_3= +export weather_wind_beaufort_4= +export weather_wind_beaufort_5= +export weather_wind_beaufort_6= +export weather_wind_beaufort_7= +export weather_wind_beaufort_8= +export weather_wind_beaufort_9= +export weather_wind_beaufort_10= +export weather_wind_beaufort_11= +export weather_wind_beaufort_12= +export weather_day_light_wind= +export weather_tsunami= +export weather_earthquake= +export weather_fire= +export weather_volcano= +export weather_moonrise= +export weather_moonset= +export weather_train= +export weather_small_craft_advisory= +export weather_gale_warning= +export weather_storm_warning= +export weather_hurricane_warning= +export weather_moon_alt_waxing_crescent_1= +export weather_moon_alt_waxing_crescent_2= +export weather_moon_alt_waxing_crescent_3= +export weather_moon_alt_waxing_crescent_4= +export weather_moon_alt_waxing_crescent_5= +export weather_moon_alt_waxing_crescent_6= +export weather_moon_alt_first_quarter= +export weather_moon_alt_waxing_gibbous_1= +export weather_moon_alt_waxing_gibbous_2= +export weather_moon_alt_waxing_gibbous_3= +export weather_moon_alt_waxing_gibbous_4= +export weather_moon_alt_waxing_gibbous_5= +export weather_moon_alt_waxing_gibbous_6= +export weather_moon_alt_full= +export weather_moon_alt_waning_gibbous_1= +export weather_moon_alt_waning_gibbous_2= +export weather_moon_alt_waning_gibbous_3= +export weather_moon_alt_waning_gibbous_4= +export weather_moon_alt_waning_gibbous_5= +export weather_moon_alt_waning_gibbous_6= +export weather_moon_alt_third_quarter= +export weather_moon_alt_waning_crescent_1= +export weather_moon_alt_waning_crescent_2= +export weather_moon_alt_waning_crescent_3= +export weather_moon_alt_waning_crescent_4= +export weather_moon_alt_waning_crescent_5= +export weather_moon_alt_waning_crescent_6= +export weather_moon_alt_new= +export linux_archlinux= +export linux_centos= +export linux_debian= +export linux_fedora= +export linux_linuxmint= +export linux_linuxmint_inverse= +export linux_mageia= +export linux_mandriva= +export linux_opensuse= +export linux_redhat= +export linux_slackware= +export linux_slackware_inverse= +export linux_ubuntu= +export linux_ubuntu_inverse= +export linux_freebsd= +export linux_coreos= +export linux_gentoo= +export linux_elementary= +export linux_fedora_inverse= +export linux_sabayon= +export linux_aosc= +export linux_nixos= +export linux_tux= +export linux_raspberry_pi= +export linux_manjaro= +export linux_apple= +export linux_docker= +export linux_alpine= +export myicons_0001= +export myicons_0002= +export myicons_0003= +export myicons_0004= +export myicons_0005= +export myicons_0006= +export myicons_0007= +export myicons_0008= +export myicons_0009= +export myicons_000a= +export myicons_000b= +export myicons_000d= +export myicons_000e= +export myicons_0010= +export myicons_0011= +export myicons_0013= +export myicons_0014= +export myicons_arch_linux_arrow= +export dev_bing_small= +export dev_css_tricks= +export dev_git= +export dev_bitbucket= +export dev_mysql= +export dev_streamline= +export dev_database= +export dev_dropbox= +export dev_github_alt= +export dev_github_badge= +export dev_github= +export dev_wordpress= +export dev_visualstudio= +export dev_jekyll_small= +export dev_android= +export dev_windows= +export dev_stackoverflow= +export dev_apple= +export dev_linux= +export dev_appstore= +export dev_ghost_small= +export dev_yahoo= +export dev_codepen= +export dev_github_full= +export dev_nodejs_small= +export dev_nodejs= +export dev_hackernews= +export dev_ember= +export dev_dojo= +export dev_django= +export dev_npm= +export dev_ghost= +export dev_modernizr= +export dev_unity_small= +export dev_raspberry_pi= +export dev_blackberry= +export dev_go= +export dev_git_branch= +export dev_git_pull_request= +export dev_git_merge= +export dev_git_compare= +export dev_git_commit= +export dev_cssdeck= +export dev_yahoo_small= +export dev_techcrunch= +export dev_smashing_magazine= +export dev_netmagazine= +export dev_codrops= +export dev_phonegap= +export dev_google_drive= +export dev_html5_multimedia= +export dev_html5_device_access= +export dev_html5_connectivity= +export dev_html5_3d_effects= +export dev_html5= +export dev_scala= +export dev_java= +export dev_ruby= +export dev_ubuntu= +export dev_ruby_on_rails= +export dev_python= +export dev_php= +export dev_markdown= +export dev_laravel= +export dev_magento= +export dev_joomla= +export dev_drupal= +export dev_chrome= +export dev_ie= +export dev_firefox= +export dev_opera= +export dev_bootstrap= +export dev_safari= +export dev_css3= +export dev_css3_full= +export dev_sass= +export dev_grunt= +export dev_bower= +export dev_javascript= +export dev_javascript_shield= +export dev_jquery= +export dev_coffeescript= +export dev_backbone= +export dev_angular= +export dev_jquery_ui= +export dev_swift= +export dev_symfony= +export dev_symfony_badge= +export dev_less= +export dev_stylus= +export dev_trello= +export dev_atlassian= +export dev_jira= +export dev_envato= +export dev_snap_svg= +export dev_raphael= +export dev_google_analytics= +export dev_compass= +export dev_onedrive= +export dev_gulp= +export dev_atom= +export dev_cisco= +export dev_nancy= +export dev_jenkins= +export dev_clojure= +export dev_perl= +export dev_clojure_alt= +export dev_celluloid= +export dev_w3c= +export dev_redis= +export dev_postgresql= +export dev_webplatform= +export dev_requirejs= +export dev_opensource= +export dev_typo3= +export dev_uikit= +export dev_doctrine= +export dev_groovy= +export dev_nginx= +export dev_haskell= +export dev_zend= +export dev_gnu= +export dev_yeoman= +export dev_heroku= +export dev_msql_server= +export dev_debian= +export dev_travis= +export dev_dotnet= +export dev_codeigniter= +export dev_javascript_badge= +export dev_yii= +export dev_composer= +export dev_krakenjs_badge= +export dev_krakenjs= +export dev_mozilla= +export dev_firebase= +export dev_sizzlejs= +export dev_creativecommons= +export dev_creativecommons_badge= +export dev_mitlicence= +export dev_senchatouch= +export dev_bugsense= +export dev_extjs= +export dev_mootools_badge= +export dev_mootools= +export dev_ruby_rough= +export dev_komodo= +export dev_coda= +export dev_bintray= +export dev_terminal= +export dev_code= +export dev_responsive= +export dev_dart= +export dev_aptana= +export dev_mailchimp= +export dev_netbeans= +export dev_dreamweaver= +export dev_brackets= +export dev_eclipse= +export dev_cloud9= +export dev_scrum= +export dev_prolog= +export dev_terminal_badge= +export dev_code_badge= +export dev_mongodb= +export dev_meteor= +export dev_meteorfull= +export dev_fsharp= +export dev_rust= +export dev_ionic= +export dev_sublime= +export dev_appcelerator= +export dev_asterisk= +export dev_aws= +export dev_digital_ocean= +export dev_dlang= +export dev_docker= +export dev_erlang= +export dev_google_cloud_platform= +export dev_grails= +export dev_illustrator= +export dev_intellij= +export dev_materializecss= +export dev_openshift= +export dev_photoshop= +export dev_rackspace= +export dev_react= +export dev_redhat= +export dev_scriptcs= +export dev_e6bd= +export dev_e6be= +export dev_e6bf= +export dev_e6c0= +export dev_e6c1= +export dev_e6c2= +export dev_e6c3= +export dev_sqllite= +export dev_vim= +export pom_clean_code= +export pom_pomodoro_done= +export pom_pomodoro_estimated= +export pom_pomodoro_ticking= +export pom_pomodoro_squashed= +export pom_short_pause= +export pom_long_pause= +export pom_away= +export pom_pair_programming= +export pom_internal_interruption= +export pom_external_interruption= +export linea_arrows_anticlockwise= +export linea_arrows_anticlockwise_dashed= +export linea_arrows_button_down= +export linea_arrows_button_off= +export linea_arrows_button_on= +export linea_arrows_button_up= +export linea_arrows_check= +export linea_arrows_circle_check= +export linea_arrows_circle_down= +export linea_arrows_circle_downleft= +export linea_arrows_circle_downright= +export linea_arrows_circle_left= +export linea_arrows_circle_minus= +export linea_arrows_circle_plus= +export linea_arrows_circle_remove= +export linea_arrows_circle_right= +export linea_arrows_circle_up= +export linea_arrows_circle_upleft= +export linea_arrows_circle_upright= +export linea_arrows_clockwise= +export linea_arrows_clockwise_dashed= +export linea_arrows_compress= +export linea_arrows_deny= +export linea_arrows_diagonal= +export linea_arrows_diagonal2= +export linea_arrows_down= +export linea_arrows_down_double= +export linea_arrows_downleft= +export linea_arrows_downright= +export linea_arrows_drag_down= +export linea_arrows_drag_down_dashed= +export linea_arrows_drag_horiz= +export linea_arrows_drag_left= +export linea_arrows_drag_left_dashed= +export linea_arrows_drag_right= +export linea_arrows_drag_right_dashed= +export linea_arrows_drag_up= +export linea_arrows_drag_up_dashed= +export linea_arrows_drag_vert= +export linea_arrows_exclamation= +export linea_arrows_expand= +export linea_arrows_expand_diagonal1= +export linea_arrows_expand_horizontal1= +export linea_arrows_expand_vertical1= +export linea_arrows_fit_horizontal= +export linea_arrows_fit_vertical= +export linea_arrows_glide= +export linea_arrows_glide_horizontal= +export linea_arrows_glide_vertical= +export linea_arrows_hamburger1= +export linea_arrows_hamburger_2= +export linea_arrows_horizontal= +export linea_arrows_info= +export linea_arrows_keyboard_alt= +export linea_arrows_keyboard_cmd= +export linea_arrows_keyboard_delete= +export linea_arrows_keyboard_down= +export linea_arrows_keyboard_left= +export linea_arrows_keyboard_return= +export linea_arrows_keyboard_right= +export linea_arrows_keyboard_shift= +export linea_arrows_keyboard_tab= +export linea_arrows_keyboard_up= +export linea_arrows_left= +export linea_arrows_left_double_32= +export linea_arrows_minus= +export linea_arrows_move= +export linea_arrows_move2= +export linea_arrows_move_bottom= +export linea_arrows_move_left= +export linea_arrows_move_right= +export linea_arrows_move_top= +export linea_arrows_plus= +export linea_arrows_question= +export linea_arrows_remove= +export linea_arrows_right= +export linea_arrows_right_double= +export linea_arrows_rotate= +export linea_arrows_rotate_anti= +export linea_arrows_rotate_anti_dashed= +export linea_arrows_rotate_dashed= +export linea_arrows_shrink= +export linea_arrows_shrink_diagonal1= +export linea_arrows_shrink_diagonal2= +export linea_arrows_shrink_horizonal2= +export linea_arrows_shrink_horizontal1= +export linea_arrows_shrink_vertical1= +export linea_arrows_shrink_vertical2= +export linea_arrows_sign_down= +export linea_arrows_sign_left= +export linea_arrows_sign_right= +export linea_arrows_sign_up= +export linea_arrows_slide_down1= +export linea_arrows_slide_down2= +export linea_arrows_slide_left1= +export linea_arrows_slide_left2= +export linea_arrows_slide_right1= +export linea_arrows_slide_right2= +export linea_arrows_slide_up1= +export linea_arrows_slide_up2= +export linea_arrows_slim_down= +export linea_arrows_slim_down_dashed= +export linea_arrows_slim_left= +export linea_arrows_slim_left_dashed= +export linea_arrows_slim_right= +export linea_arrows_slim_right_dashed= +export linea_arrows_slim_up= +export linea_arrows_slim_up_dashed= +export linea_arrows_square_check= +export linea_arrows_square_down= +export linea_arrows_square_downleft= +export linea_arrows_square_downright= +export linea_arrows_square_left= +export linea_arrows_square_minus= +export linea_arrows_square_plus= +export linea_arrows_square_remove= +export linea_arrows_square_right= +export linea_arrows_square_up= +export linea_arrows_square_upleft= +export linea_arrows_square_upright= +export linea_arrows_squares= +export linea_arrows_stretch_diagonal1= +export linea_arrows_stretch_diagonal2= +export linea_arrows_stretch_diagonal3= +export linea_arrows_stretch_diagonal4= +export linea_arrows_stretch_horizontal1= +export linea_arrows_stretch_horizontal2= +export linea_arrows_stretch_vertical1= +export linea_arrows_stretch_vertical2= +export linea_arrows_switch_horizontal= +export linea_arrows_switch_vertical= +export linea_arrows_up= +export linea_arrows_up_double_33= +export linea_arrows_upleft= +export linea_arrows_upright= +export linea_arrows_vertical= +export linea_basic_lock_open= +export linea_basic_magic_mouse= +export linea_basic_magnifier= +export linea_basic_magnifier_minus= +export linea_basic_magnifier_plus= +export linea_basic_mail= +export linea_basic_mail_multiple= +export linea_basic_mail_open= +export linea_basic_mail_open_text= +export linea_basic_male= +export linea_basic_map= +export linea_basic_message= +export linea_basic_message_multiple= +export linea_basic_message_txt= +export linea_basic_mixer2= +export linea_basic_info= +export linea_basic_ipod= +export linea_basic_joypad= +export linea_basic_key= +export linea_basic_keyboard= +export linea_basic_laptop= +export linea_basic_life_buoy= +export linea_basic_lightbulb= +export linea_basic_link= +export linea_basic_lock= +export linea_basic_mouse= +export linea_basic_notebook= +export linea_basic_notebook_pen= +export linea_basic_notebook_pencil= +export linea_basic_paperplane= +export linea_basic_pencil_ruler= +export linea_basic_pencil_ruler_pen= +export linea_basic_clubs= +export linea_basic_compass= +export linea_basic_cup= +export linea_basic_diamonds= +export linea_basic_display= +export linea_basic_download= +export linea_basic_exclamation= +export linea_basic_eye= +export linea_basic_eye_closed= +export linea_basic_female= +export linea_basic_flag1= +export linea_basic_flag2= +export linea_basic_floppydisk= +export linea_basic_folder= +export linea_basic_folder_multiple= +export linea_basic_gear= +export linea_basic_geolocalize_01= +export linea_basic_geolocalize_05= +export linea_basic_globe= +export linea_basic_gunsight= +export linea_basic_hammer= +export linea_basic_headset= +export linea_basic_heart= +export linea_basic_heart_broken= +export linea_basic_helm= +export linea_basic_home= +export linea_basic_photo= +export linea_basic_rss= +export linea_basic_picture= +export linea_basic_picture_multiple= +export linea_basic_pin1= +export linea_basic_pin2= +export linea_basic_accelerator= +export linea_basic_alarm= +export linea_basic_anchor= +export linea_basic_anticlockwise= +export linea_basic_archive= +export linea_basic_archive_full= +export linea_basic_ban= +export linea_basic_battery_charge= +export linea_basic_battery_empty= +export linea_basic_battery_full= +export linea_basic_battery_half= +export linea_basic_bolt= +export linea_basic_book= +export linea_basic_book_pen= +export linea_basic_book_pencil= +export linea_basic_bookmark= +export linea_basic_calculator= +export linea_basic_calendar= +export linea_basic_cards_diamonds= +export linea_basic_cards_hearts= +export linea_basic_case= +export linea_basic_chronometer= +export linea_basic_clessidre= +export linea_basic_clock= +export linea_basic_clockwise= +export linea_basic_cloud= +export linea_basic_postcard= +export linea_basic_postcard_multiple= +export linea_basic_printer= +export linea_basic_question= +export linea_basic_server= +export linea_basic_server2= +export linea_basic_server_cloud= +export linea_basic_server_download= +export linea_basic_server_upload= +export linea_basic_settings= +export linea_basic_share= +export linea_basic_sheet= +export linea_basic_sheet_multiple= +export linea_basic_sheet_pen= +export linea_basic_sheet_pencil= +export linea_basic_sheet_txt= +export linea_basic_signs= +export linea_basic_smartphone= +export linea_basic_spades= +export linea_basic_spread= +export linea_basic_spread_bookmark= +export linea_basic_spread_text= +export linea_basic_spread_text_bookmark= +export linea_basic_star= +export linea_basic_tablet= +export linea_basic_target= +export linea_basic_todo= +export linea_basic_todo_pen= +export linea_basic_todo_pencil= +export linea_basic_todo_txt= +export linea_basic_todolist_pen= +export linea_basic_todolist_pencil= +export linea_basic_trashcan= +export linea_basic_trashcan_full= +export linea_basic_trashcan_refresh= +export linea_basic_trashcan_remove= +export linea_basic_upload= +export linea_basic_usb= +export linea_basic_video= +export linea_basic_watch= +export linea_basic_webpage= +export linea_basic_webpage_img_txt= +export linea_basic_webpage_multiple= +export linea_basic_webpage_txt= +export linea_basic_world= +export linea_elaboration_document_previous= +export linea_elaboration_document_refresh= +export linea_elaboration_document_remove= +export linea_elaboration_document_search= +export linea_elaboration_document_star= +export linea_elaboration_document_upload= +export linea_elaboration_folder_check= +export linea_elaboration_folder_cloud= +export linea_elaboration_folder_document= +export linea_elaboration_folder_download= +export linea_elaboration_folder_flagged= +export linea_elaboration_folder_graph= +export linea_elaboration_folder_heart= +export linea_elaboration_folder_minus= +export linea_elaboration_folder_next= +export linea_elaboration_document_flagged= +export linea_elaboration_document_graph= +export linea_elaboration_document_heart= +export linea_elaboration_document_minus= +export linea_elaboration_document_next= +export linea_elaboration_document_noaccess= +export linea_elaboration_document_note= +export linea_elaboration_document_pencil= +export linea_elaboration_document_picture= +export linea_elaboration_document_plus= +export linea_elaboration_folder_noaccess= +export linea_elaboration_folder_note= +export linea_elaboration_folder_pencil= +export linea_elaboration_folder_picture= +export linea_elaboration_folder_plus= +export linea_elaboration_folder_previous= +export linea_elaboration_folder_refresh= +export linea_elaboration_calendar_empty= +export linea_elaboration_calendar_flagged= +export linea_elaboration_calendar_heart= +export linea_elaboration_calendar_minus= +export linea_elaboration_calendar_next= +export linea_elaboration_calendar_noaccess= +export linea_elaboration_calendar_pencil= +export linea_elaboration_calendar_plus= +export linea_elaboration_calendar_previous= +export linea_elaboration_calendar_refresh= +export linea_elaboration_calendar_remove= +export linea_elaboration_calendar_search= +export linea_elaboration_calendar_star= +export linea_elaboration_calendar_upload= +export linea_elaboration_cloud_check= +export linea_elaboration_cloud_download= +export linea_elaboration_cloud_minus= +export linea_elaboration_cloud_noaccess= +export linea_elaboration_cloud_plus= +export linea_elaboration_cloud_refresh= +export linea_elaboration_cloud_remove= +export linea_elaboration_cloud_search= +export linea_elaboration_cloud_upload= +export linea_elaboration_document_check= +export linea_elaboration_document_cloud= +export linea_elaboration_document_download= +export linea_elaboration_folder_remove= +export linea_elaboration_mail_heart= +export linea_elaboration_folder_search= +export linea_elaboration_folder_star= +export linea_elaboration_folder_upload= +export linea_elaboration_mail_check= +export linea_elaboration_bookmark_checck= +export linea_elaboration_bookmark_minus= +export linea_elaboration_bookmark_plus= +export linea_elaboration_bookmark_remove= +export linea_elaboration_briefcase_check= +export linea_elaboration_briefcase_download= +export linea_elaboration_briefcase_flagged= +export linea_elaboration_briefcase_minus= +export linea_elaboration_briefcase_plus= +export linea_elaboration_briefcase_refresh= +export linea_elaboration_briefcase_remove= +export linea_elaboration_briefcase_search= +export linea_elaboration_briefcase_star= +export linea_elaboration_briefcase_upload= +export linea_elaboration_browser_check= +export linea_elaboration_browser_download= +export linea_elaboration_browser_minus= +export linea_elaboration_browser_plus= +export linea_elaboration_browser_refresh= +export linea_elaboration_browser_remove= +export linea_elaboration_browser_search= +export linea_elaboration_browser_star= +export linea_elaboration_browser_upload= +export linea_elaboration_calendar_check= +export linea_elaboration_calendar_cloud= +export linea_elaboration_calendar_download= +export linea_elaboration_mail_cloud= +export linea_elaboration_mail_document= +export linea_elaboration_mail_download= +export linea_elaboration_mail_flagged= +export linea_elaboration_mail_next= +export linea_elaboration_mail_noaccess= +export linea_elaboration_mail_note= +export linea_elaboration_mail_pencil= +export linea_elaboration_mail_picture= +export linea_elaboration_mail_previous= +export linea_elaboration_mail_refresh= +export linea_elaboration_mail_remove= +export linea_elaboration_mail_search= +export linea_elaboration_mail_star= +export linea_elaboration_mail_upload= +export linea_elaboration_message_check= +export linea_elaboration_message_dots= +export linea_elaboration_message_happy= +export linea_elaboration_message_heart= +export linea_elaboration_message_minus= +export linea_elaboration_message_note= +export linea_elaboration_message_plus= +export linea_elaboration_message_refresh= +export linea_elaboration_message_remove= +export linea_elaboration_message_sad= +export linea_elaboration_smartphone_cloud= +export linea_elaboration_smartphone_heart= +export linea_elaboration_smartphone_noaccess= +export linea_elaboration_smartphone_note= +export linea_elaboration_smartphone_pencil= +export linea_elaboration_smartphone_picture= +export linea_elaboration_smartphone_refresh= +export linea_elaboration_smartphone_search= +export linea_elaboration_tablet_cloud= +export linea_elaboration_tablet_heart= +export linea_elaboration_tablet_noaccess= +export linea_elaboration_tablet_note= +export linea_elaboration_tablet_pencil= +export linea_elaboration_tablet_picture= +export linea_elaboration_tablet_refresh= +export linea_elaboration_tablet_search= +export linea_elaboration_todolist_2= +export linea_elaboration_todolist_check= +export linea_elaboration_todolist_cloud= +export linea_elaboration_todolist_download= +export linea_elaboration_todolist_flagged= +export linea_elaboration_todolist_minus= +export linea_elaboration_todolist_noaccess= +export linea_elaboration_todolist_pencil= +export linea_elaboration_todolist_plus= +export linea_elaboration_todolist_refresh= +export linea_elaboration_todolist_remove= +export linea_elaboration_todolist_search= +export linea_elaboration_todolist_star= +export linea_elaboration_todolist_upload= +export linea_ecommerce_receipt_kips= +export linea_ecommerce_receipt_lira= +export linea_ecommerce_receipt_naira= +export linea_ecommerce_receipt_pesos= +export linea_ecommerce_receipt_pound= +export linea_ecommerce_receipt_rublo= +export linea_ecommerce_receipt_rupee= +export linea_ecommerce_receipt_tugrik= +export linea_ecommerce_receipt_won= +export linea_ecommerce_receipt_yen= +export linea_ecommerce_receipt_yen2= +export linea_ecommerce_recept_colon= +export linea_ecommerce_rublo= +export linea_ecommerce_rupee= +export linea_ecommerce_safe= +export linea_ecommerce_naira= +export linea_ecommerce_pesos= +export linea_ecommerce_pound= +export linea_ecommerce_receipt= +export linea_ecommerce_receipt_bath= +export linea_ecommerce_receipt_cent= +export linea_ecommerce_receipt_dollar= +export linea_ecommerce_receipt_euro= +export linea_ecommerce_receipt_franc= +export linea_ecommerce_receipt_guarani= +export linea_ecommerce_sale= +export linea_ecommerce_sales= +export linea_ecommerce_ticket= +export linea_ecommerce_tugriks= +export linea_ecommerce_wallet= +export linea_ecommerce_won= +export linea_ecommerce_yen= +export linea_ecommerce_cart_content= +export linea_ecommerce_cart_download= +export linea_ecommerce_cart_minus= +export linea_ecommerce_cart_plus= +export linea_ecommerce_cart_refresh= +export linea_ecommerce_cart_remove= +export linea_ecommerce_cart_search= +export linea_ecommerce_cart_upload= +export linea_ecommerce_cent= +export linea_ecommerce_colon= +export linea_ecommerce_creditcard= +export linea_ecommerce_diamond= +export linea_ecommerce_dollar= +export linea_ecommerce_euro= +export linea_ecommerce_franc= +export linea_ecommerce_gift= +export linea_ecommerce_graph1= +export linea_ecommerce_graph2= +export linea_ecommerce_graph3= +export linea_ecommerce_graph_decrease= +export linea_ecommerce_graph_increase= +export linea_ecommerce_guarani= +export linea_ecommerce_kips= +export linea_ecommerce_lira= +export linea_ecommerce_megaphone= +export linea_ecommerce_money= +export linea_ecommerce_yen2= +export linea_ecommerce_bag= +export linea_ecommerce_bag_check= +export linea_ecommerce_bag_cloud= +export linea_ecommerce_bag_download= +export linea_ecommerce_bag_minus= +export linea_ecommerce_bag_plus= +export linea_ecommerce_bag_refresh= +export linea_ecommerce_bag_remove= +export linea_ecommerce_bag_search= +export linea_ecommerce_bag_upload= +export linea_ecommerce_banknote= +export linea_ecommerce_banknotes= +export linea_ecommerce_basket= +export linea_ecommerce_basket_check= +export linea_ecommerce_basket_cloud= +export linea_ecommerce_basket_download= +export linea_ecommerce_basket_minus= +export linea_ecommerce_basket_plus= +export linea_ecommerce_basket_refresh= +export linea_ecommerce_basket_remove= +export linea_ecommerce_basket_search= +export linea_ecommerce_basket_upload= +export linea_ecommerce_bath= +export linea_ecommerce_cart= +export linea_ecommerce_cart_check= +export linea_ecommerce_cart_cloud= +export linea_music_stop_button= +export linea_music_tape= +export linea_music_volume_down= +export linea_music_volume_up= +export linea_music_beginning_button= +export linea_music_bell= +export linea_music_cd= +export linea_music_diapason= +export linea_music_eject_button= +export linea_music_end_button= +export linea_music_fastforward_button= +export linea_music_headphones= +export linea_music_ipod= +export linea_music_loudspeaker= +export linea_music_microphone= +export linea_music_microphone_old= +export linea_music_mixer= +export linea_music_mute= +export linea_music_note_multiple= +export linea_music_note_single= +export linea_music_pause_button= +export linea_music_play_button= +export linea_music_playlist= +export linea_music_radio_ghettoblaster= +export linea_music_radio_portable= +export linea_music_record= +export linea_music_recordplayer= +export linea_music_repeat_button= +export linea_music_rewind_button= +export linea_music_shuffle_button= +export linea_software_paragraph_justify_center= +export linea_software_paragraph_justify_left= +export linea_software_paragraph_justify_right= +export linea_software_paragraph_space_after= +export linea_software_paragraph_space_before= +export linea_software_pathfinder_exclude= +export linea_software_pathfinder_intersect= +export linea_software_pathfinder_subtract= +export linea_software_pathfinder_unite= +export linea_software_pen= +export linea_software_pen_add= +export linea_software_pen_remove= +export linea_software_pencil= +export linea_software_polygonallasso= +export linea_software_reflect_horizontal= +export linea_software_magnete= +export linea_software_pages= +export linea_software_paintbrush= +export linea_software_paintbucket= +export linea_software_paintroller= +export linea_software_paragraph= +export linea_software_paragraph_align_left= +export linea_software_paragraph_align_right= +export linea_software_paragraph_center= +export linea_software_paragraph_justify_all= +export linea_software_reflect_vertical= +export linea_software_remove_vectorpoint= +export linea_software_scale_expand= +export linea_software_scale_reduce= +export linea_software_selection_oval= +export linea_software_selection_polygon= +export linea_software_selection_rectangle= +export linea_software_indent_firstline= +export linea_software_indent_left= +export linea_software_indent_right= +export linea_software_lasso= +export linea_software_layers1= +export linea_software_layers2= +export linea_software_layout= +export linea_software_layout_2columns= +export linea_software_layout_3columns= +export linea_software_layout_4boxes= +export linea_software_layout_4columns= +export linea_software_layout_4lines= +export linea_software_layout_8boxes= +export linea_software_layout_header= +export linea_software_layout_header_2columns= +export linea_software_layout_header_3columns= +export linea_software_layout_header_4boxes= +export linea_software_layout_header_4columns= +export linea_software_layout_header_complex= +export linea_software_layout_header_complex2= +export linea_software_layout_header_complex3= +export linea_software_layout_header_complex4= +export linea_software_layout_header_sideleft= +export linea_software_layout_header_sideright= +export linea_software_layout_sidebar_left= +export linea_software_layout_sidebar_right= +export linea_software_selection_roundedrectangle= +export linea_software_vector_line= +export linea_software_shape_oval= +export linea_software_shape_polygon= +export linea_software_shape_rectangle= +export linea_software_shape_roundedrectangle= +export linea_software_add_vectorpoint= +export linea_software_box_oval= +export linea_software_box_polygon= +export linea_software_box_rectangle= +export linea_software_box_roundedrectangle= +export linea_software_character= +export linea_software_crop= +export linea_software_eyedropper= +export linea_software_font_allcaps= +export linea_software_font_baseline_shift= +export linea_software_font_horizontal_scale= +export linea_software_font_kerning= +export linea_software_font_leading= +export linea_software_font_size= +export linea_software_font_smallcapital= +export linea_software_font_smallcaps= +export linea_software_font_strikethrough= +export linea_software_font_tracking= +export linea_software_font_underline= +export linea_software_font_vertical_scale= +export linea_software_horizontal_align_center= +export linea_software_horizontal_align_left= +export linea_software_horizontal_align_right= +export linea_software_horizontal_distribute_center= +export linea_software_horizontal_distribute_left= +export linea_software_horizontal_distribute_right= +export linea_software_slice= +export linea_software_transform_bezier= +export linea_software_vector_box= +export linea_software_vector_composite= +export linea_software_vertical_align_bottom= +export linea_software_vertical_align_center= +export linea_software_vertical_align_top= +export linea_software_vertical_distribute_bottom= +export linea_software_vertical_distribute_center= +export linea_software_vertical_distribute_top= +export linea_weather_aquarius= +export linea_weather_aries= +export linea_weather_cancer= +export linea_weather_capricorn= +export linea_weather_cloud= +export linea_weather_cloud_drop= +export linea_weather_cloud_lightning= +export linea_weather_cloud_snowflake= +export linea_weather_downpour_fullmoon= +export linea_weather_downpour_halfmoon= +export linea_weather_downpour_sun= +export linea_weather_drop= +export linea_weather_first_quarter= +export linea_weather_fog= +export linea_weather_fog_fullmoon= +export linea_weather_fog_halfmoon= +export linea_weather_fog_sun= +export linea_weather_fullmoon= +export linea_weather_gemini= +export linea_weather_hail= +export linea_weather_hail_fullmoon= +export linea_weather_hail_halfmoon= +export linea_weather_hail_sun= +export linea_weather_last_quarter= +export linea_weather_leo= +export linea_weather_libra= +export linea_weather_lightning= +export linea_weather_mistyrain= +export linea_weather_mistyrain_fullmoon= +export linea_weather_mistyrain_halfmoon= +export linea_weather_mistyrain_sun= +export linea_weather_moon= +export linea_weather_moondown_full= +export linea_weather_moondown_half= +export linea_weather_moonset_full= +export linea_weather_moonset_half= +export linea_weather_move2= +export linea_weather_newmoon= +export linea_weather_pisces= +export linea_weather_rain= +export linea_weather_rain_fullmoon= +export linea_weather_rain_halfmoon= +export linea_weather_rain_sun= +export linea_weather_sagittarius= +export linea_weather_scorpio= +export linea_weather_snow= +export linea_weather_snow_fullmoon= +export linea_weather_snow_halfmoon= +export linea_weather_snow_sun= +export linea_weather_snowflake= +export linea_weather_star= +export linea_weather_storm_11= +export linea_weather_storm_32= +export linea_weather_storm_fullmoon= +export linea_weather_storm_halfmoon= +export linea_weather_storm_sun= +export linea_weather_sun= +export linea_weather_sundown= +export linea_weather_sunset= +export linea_weather_taurus= +export linea_weather_tempest= +export linea_weather_tempest_fullmoon= +export linea_weather_tempest_halfmoon= +export linea_weather_tempest_sun= +export linea_weather_variable_fullmoon= +export linea_weather_variable_halfmoon= +export linea_weather_variable_sun= +export linea_weather_virgo= +export linea_weather_waning_cresent= +export linea_weather_waning_gibbous= +export linea_weather_waxing_cresent= +export linea_weather_waxing_gibbous= +export linea_weather_wind= +export linea_weather_wind_e= +export linea_weather_wind_fullmoon= +export linea_weather_wind_halfmoon= +export linea_weather_wind_n= +export linea_weather_wind_ne= +export linea_weather_wind_nw= +export linea_weather_wind_s= +export linea_weather_wind_se= +export linea_weather_wind_sun= +export linea_weather_wind_sw= +export linea_weather_wind_w= +export linea_weather_windgust= +export mfizz_3dprint= +export mfizz_alpinelinux= +export mfizz_angular= +export mfizz_angular_alt= +export mfizz_antenna= +export mfizz_apache= +export mfizz_archlinux= +export mfizz_aws= +export mfizz_azure= +export mfizz_backbone= +export mfizz_blackberry= +export mfizz_bomb= +export mfizz_bootstrap= +export mfizz_c= +export mfizz_cassandra= +export mfizz_centos= +export mfizz_clojure= +export mfizz_codeigniter= +export mfizz_codepen= +export mfizz_coffee_bean= +export mfizz_cplusplus= +export mfizz_csharp= +export mfizz_css= +export mfizz_css3= +export mfizz_css3_alt= +export mfizz_d3= +export mfizz_database= +export mfizz_database_alt= +export mfizz_database_alt2= +export mfizz_debian= +export mfizz_docker= +export mfizz_dreamhost= +export mfizz_elixir= +export mfizz_elm= +export mfizz_erlang= +export mfizz_exherbo= +export mfizz_fedora= +export mfizz_fire_alt= +export mfizz_freebsd= +export mfizz_freecodecamp= +export mfizz_gentoo= +export mfizz_ghost= +export mfizz_git= +export mfizz_gnome= +export mfizz_go= +export mfizz_go_alt= +export mfizz_google= +export mfizz_google_alt= +export mfizz_google_code= +export mfizz_google_developers= +export mfizz_gradle= +export mfizz_grails= +export mfizz_grails_alt= +export mfizz_grunt= +export mfizz_gulp= +export mfizz_gulp_alt= +export mfizz_hadoop= +export mfizz_haskell= +export mfizz_heroku= +export mfizz_html= +export mfizz_html5= +export mfizz_html5_alt= +export mfizz_iphone= +export mfizz_java= +export mfizz_java_bold= +export mfizz_java_duke= +export mfizz_javascript= +export mfizz_javascript_alt= +export mfizz_jetty= +export mfizz_jquery= +export mfizz_kde= +export mfizz_laravel= +export mfizz_line_graph= +export mfizz_linux_mint= +export mfizz_looking= +export mfizz_magento= +export mfizz_mariadb= +export mfizz_maven= +export mfizz_microscope= +export mfizz_mobile_device= +export mfizz_mobile_phone_alt= +export mfizz_mobile_phone_broadcast= +export mfizz_mongodb= +export mfizz_mssql= +export mfizz_mysql= +export mfizz_mysql_alt= +export mfizz_netbsd= +export mfizz_nginx= +export mfizz_nginx_alt= +export mfizz_nginx_alt2= +export mfizz_nodejs= +export mfizz_npm= +export mfizz_objc= +export mfizz_openshift= +export mfizz_oracle= +export mfizz_oracle_alt= +export mfizz_osx= +export mfizz_perl= +export mfizz_phone_alt= +export mfizz_phone_gap= +export mfizz_phone_retro= +export mfizz_php= +export mfizz_php_alt= +export mfizz_playframework= +export mfizz_playframework_alt= +export mfizz_plone= +export mfizz_postgres= +export mfizz_postgres_alt= +export mfizz_python= +export mfizz_raspberrypi= +export mfizz_reactjs= +export mfizz_redhat= +export mfizz_redis= +export mfizz_ruby= +export mfizz_ruby_on_rails= +export mfizz_ruby_on_rails_alt= +export mfizz_rust= +export mfizz_sass= +export mfizz_satellite= +export mfizz_scala= +export mfizz_scala_alt= +export mfizz_script= +export mfizz_script_alt= +export mfizz_shell= +export mfizz_sitefinity= +export mfizz_solaris= +export mfizz_splatter= +export mfizz_spring= +export mfizz_suse= +export mfizz_svg= +export mfizz_symfony= +export mfizz_tomcat= +export mfizz_ubuntu= +export mfizz_unity= +export mfizz_wireless= +export mfizz_wordpress= +export mfizz_x11= +export firacode_asterisk= +export firacode_plus= +export firacode_hyphen= +export firacode_sad= +export firacode_w_w_w= +export firacode_asterisk_asterisk= +export firacode_asterisk_asterisk_asterisk= +export firacode_asterisk_asterisk_slash= +export firacode_asterisk_greater= +export firacode_asterisk_slash= +export firacode_backslash_backslash= +export firacode_bbb= +export firacode_braceleft_hyphen= +export firacode_bracketleft_bracketright= +export firacode_colon_colon= +export firacode_colon_colon_colon= +export firacode_colon_equal= +export firacode_exclam_exclam= +export firacode_exclam_equal= +export firacode_exclam_equal_equal= +export firacode_hyphen_braceright= +export firacode_hyphen_hyphen= +export firacode_hyphen_hyphen_hyphen= +export firacode_hyphen_hyphen_greater= +export firacode_hyphen_greater= +export firacode_hyphen_greater_greater= +export firacode_hyphen_less= +export firacode_hyphen_less_less= +export firacode_hyphen_asciitilde= +export firacode_numbersign_braceleft= +export firacode_numbersign_bracketleft= +export firacode_numbersign_numbersign= +export firacode_nnn= +export firacode_nnnn= +export firacode_numbersign_parenleft= +export firacode_numbersign_question= +export firacode_numbersign_underscore= +export firacode_nup= +export firacode_period_hyphen= +export firacode_period_equal= +export firacode_period_period= +export firacode_period_period_less= +export firacode_period_period_period= +export firacode_question_equal= +export firacode_question_question= +export firacode_semicolon_semicolon= +export firacode_slash_asterisk= +export firacode_slash_asterisk_asterisk= +export firacode_slash_equal= +export firacode_slash_equal_equal= +export firacode_slash_greater= +export firacode_slash_slash= +export firacode_slash_slash_slash= +export firacode_ampersand_ampersand= +export firacode_bar_bar= +export firacode_bar_bar_equal= +export firacode_bar_equal= +export firacode_bar_greater= +export firacode_asciicircum_equal= +export firacode_dollar_greater= +export firacode_plus_plus= +export firacode_plus_plus_plus= +export firacode_plus_greater= +export firacode_equal_colon_equal= +export firacode_equal_equal= +export firacode_equal_equal_equal= +export firacode_equal_equal_greater= +export firacode_equal_greater= +export firacode_equal_greater_greater= +export firacode_equal_less= +export firacode_equal_less_less= +export firacode_equal_slash_equal= +export firacode_greater_hyphen= +export firacode_greater_equal= +export firacode_greater_equal_greater= +export firacode_greater_greater= +export firacode_greater_greater_hyphen= +export firacode_greater_greater_equal= +export firacode_greater_greater_greater= +export firacode_less_asterisk= +export firacode_less_asterisk_greater= +export firacode_less_bar= +export firacode_less_bar_greater= +export firacode_less_dollar= +export firacode_less_dollar_greater= +export firacode_less_exclam_hyphen_hyphen= +export firacode_less_hyphen= +export firacode_less_hyphen_hyphen= +export firacode_less_hyphen_greater= +export firacode_less_plus= +export firacode_less_plus_greater= +export firacode_less_equal= +export firacode_less_equal_equal= +export firacode_less_equal_greater= +export firacode_less_equal_less= +export firacode_less_greater= +export firacode_less_less= +export firacode_less_less_hyphen= +export firacode_less_less_equal= +export firacode_less_less_less= +export firacode_less_asciitilde= +export firacode_less_asciitilde_asciitilde= +export firacode_less_slash= +export firacode_less_slash_greater= +export firacode_asciitilde_at= +export firacode_asciitilde_hyphen= +export firacode_asciitilde_equal= +export firacode_asciitilde_greater= +export firacode_asciitilde_asciitilde= +export firacode_aag= +export firacode_percent_percent= +export firacode_x_multiply= +export firacode_colon_uc= +export firacode_plus_lc= +export firacode_plus_tosf2= +export firacode_nameme_1114119= diff --git a/nnn-4.9/icons-in-terminal/build/mapping.txt b/nnn-4.9/icons-in-terminal/build/mapping.txt @@ -0,0 +1,38 @@ +#powerline-extras:38 +powerline_branch:e0a0;powerline_line_number:e0a1;powerline_readonly:e0a2;powerline_extra_column_number:e0a3;powerline_left_hard_divider:e0b0;powerline_left_soft_divider:e0b1;powerline_right_hard_divider:e0b2;powerline_right_soft_divider:e0b3;powerline_extra_right_half_circle_thick:e0b4;powerline_extra_right_half_circle_thin:e0b5;powerline_extra_left_half_circle_thick:e0b6;powerline_extra_left_half_circle_thin:e0b7;powerline_extra_lower_left_triangle:e0b8;powerline_extra_backslash_separator:e0b9;powerline_extra_lower_right_triangle:e0ba;powerline_extra_forwardslash_separator:e0bb;powerline_extra_upper_left_triangle:e0bc;powerline_extra_forwardslash_separator_redundant:e0bd;powerline_extra_upper_right_triangle:e0be;powerline_extra_backslash_separator_redundant:e0bf;powerline_extra_flame_thick:e0c0;powerline_extra_flame_thin:e0c1;powerline_extra_flame_thick_mirrored:e0c2;powerline_extra_flame_thin_mirrored:e0c3;powerline_extra_pixelated_squares_small:e0c4;powerline_extra_pixelated_squares_small_mirrored:e0c5;powerline_extra_pixelated_squares_big:e0c6;powerline_extra_pixelated_squares_big_mirrored:e0c7;powerline_extra_ice_waveform:e0c8;powerline_extra_ice_waveform_mirrored:e0ca;powerline_extra_honeycomb:e0cc;powerline_extra_honeycomb_outline:e0cd;powerline_extra_lego_separator:e0ce;powerline_extra_lego_separator_thin:e0cf;powerline_extra_lego_block_facing:e0d0;powerline_extra_lego_block_sideways:e0d1;powerline_extra_trapezoid_top_bottom:e0d2;powerline_extra_trapezoid_top_bottom_mirrored:e0d4; +#octicons:172 +oct_heart:e000;oct_zap:e001;oct_light_bulb:e002;oct_repo:e003;oct_repo_forked:e004;oct_repo_push:e005;oct_repo_pull:e006;oct_book:e007;oct_octoface:e008;oct_git_pull_request:e009;oct_mark_github:e00a;oct_cloud_download:e00b;oct_cloud_upload:e00c;oct_keyboard:e00d;oct_gist:e00e;oct_file_code:e00f;oct_file_text:e010;oct_file_media:e011;oct_file_zip:e012;oct_file_pdf:e013;oct_tag:e014;oct_file_directory:e015;oct_file_submodule:e016;oct_person:e017;oct_jersey:e018;oct_git_commit:e019;oct_git_branch:e01a;oct_git_merge:e01b;oct_mirror:e01c;oct_issue_opened:e01d;oct_issue_reopened:e01e;oct_issue_closed:e01f;oct_star:e020;oct_comment:e021;oct_question:e022;oct_alert:e023;oct_search:e024;oct_gear:e025;oct_radio_tower:e026;oct_tools:e027;oct_sign_out:e028;oct_rocket:e029;oct_rss:e02a;oct_clippy:e02b;oct_sign_in:e02c;oct_organization:e02d;oct_device_mobile:e02e;oct_unfold:e02f;oct_check:e030;oct_mail:e031;oct_mail_read:e032;oct_arrow_up:e033;oct_arrow_right:e034;oct_arrow_down:e035;oct_arrow_left:e036;oct_pin:e037;oct_gift:e038;oct_graph:e039;oct_triangle_left:e03a;oct_credit_card:e03b;oct_clock:e03c;oct_ruby:e03d;oct_broadcast:e03e;oct_key:e03f;oct_repo_force_push:e040;oct_repo_clone:e041;oct_diff:e042;oct_eye:e043;oct_comment_discussion:e044;oct_mail_reply:e045;oct_primitive_dot:e046;oct_primitive_square:e047;oct_device_camera:e048;oct_device_camera_video:e049;oct_pencil:e04a;oct_info:e04b;oct_triangle_right:e04c;oct_triangle_down:e04d;oct_link:e04e;oct_plus:e04f;oct_three_bars:e050;oct_code:e051;oct_location:e052;oct_list_unordered:e053;oct_list_ordered:e054;oct_quote:e055;oct_versions:e056;oct_calendar:e057;oct_lock:e058;oct_diff_added:e059;oct_diff_removed:e05a;oct_diff_modified:e05b;oct_diff_renamed:e05c;oct_horizontal_rule:e05d;oct_arrow_small_right:e05e;oct_milestone:e05f;oct_checklist:e060;oct_megaphone:e061;oct_chevron_right:e062;oct_bookmark:e063;oct_settings:e064;oct_dashboard:e065;oct_history:e066;oct_link_external:e067;oct_mute:e068;oct_x:e069;oct_circle_slash:e06a;oct_pulse:e06b;oct_sync:e06c;oct_telescope:e06d;oct_gist_secret:e06e;oct_home:e06f;oct_stop:e070;oct_bug:e071;oct_logo_github:e072;oct_file_binary:e073;oct_database:e074;oct_server:e075;oct_diff_ignored:e076;oct_ellipsis:e077;oct_no_newline:e078;oct_hubot:e079;oct_arrow_small_up:e07a;oct_arrow_small_down:e07b;oct_arrow_small_left:e07c;oct_chevron_up:e07d;oct_chevron_down:e07e;oct_chevron_left:e07f;oct_triangle_up:e080;oct_git_compare:e081;oct_logo_gist:e082;oct_file_symlink_file:e083;oct_file_symlink_directory:e084;oct_squirrel:e085;oct_globe:e086;oct_unmute:e087;oct_mention:e088;oct_package:e089;oct_browser:e08a;oct_terminal:e08b;oct_markdown:e08c;oct_dash:e08d;oct_fold:e08e;oct_inbox:e08f;oct_trashcan:e090;oct_paintcan:e091;oct_flame:e092;oct_briefcase:e093;oct_plug:e094;oct_circuit_board:e095;oct_mortar_board:e096;oct_law:e097;oct_thumbsup:e098;oct_thumbsdown:e099;oct_desktop_download:e09a;oct_beaker:e09b;oct_bell:e09c;oct_watch:e09d;oct_shield:e09e;oct_bold:e09f;oct_text_size:e0d5;oct_italic:e0d6;oct_tasklist:e0d7;oct_verified:e0d8;oct_smiley:e0d9;oct_unverified:e0da;oct_ellipses:e0db;oct_file:e0dc;oct_grabber:e0dd;oct_plus_small:e0de;oct_reply:e0df;oct_device_desktop:e0e0; +#fontawesome:679 +fa_glass:e0e1;fa_music:e0e2;fa_search:e0e3;fa_envelope_o:e0e4;fa_heart:e0e5;fa_star:e0e6;fa_star_o:e0e7;fa_user:e0e8;fa_film:e0e9;fa_th_large:e0ea;fa_th:e0eb;fa_th_list:e0ec;fa_check:e0ed;fa_close:e0ee;fa_search_plus:e0ef;fa_search_minus:e0f0;fa_power_off:e0f1;fa_signal:e0f2;fa_cog:e0f3;fa_trash_o:e0f4;fa_home:e0f5;fa_file_o:e0f6;fa_clock_o:e0f7;fa_road:e0f8;fa_download:e0f9;fa_arrow_circle_o_down:e0fa;fa_arrow_circle_o_up:e0fb;fa_inbox:e0fc;fa_play_circle_o:e0fd;fa_repeat:e0fe;fa_refresh:e0ff;fa_list_alt:e100;fa_lock:e101;fa_flag:e102;fa_headphones:e103;fa_volume_off:e104;fa_volume_down:e105;fa_volume_up:e106;fa_qrcode:e107;fa_barcode:e108;fa_tag:e109;fa_tags:e10a;fa_book:e10b;fa_bookmark:e10c;fa_print:e10d;fa_camera:e10e;fa_font:e10f;fa_bold:e110;fa_italic:e111;fa_text_height:e112;fa_text_width:e113;fa_align_left:e114;fa_align_center:e115;fa_align_right:e116;fa_align_justify:e117;fa_list:e118;fa_dedent:e119;fa_indent:e11a;fa_video_camera:e11b;fa_image:e11c;fa_pencil:e11d;fa_map_marker:e11e;fa_adjust:e11f;fa_tint:e120;fa_edit:e121;fa_share_square_o:e122;fa_check_square_o:e123;fa_arrows:e124;fa_step_backward:e125;fa_fast_backward:e126;fa_backward:e127;fa_play:e128;fa_pause:e129;fa_stop:e12a;fa_forward:e12b;fa_fast_forward:e12c;fa_step_forward:e12d;fa_eject:e12e;fa_chevron_left:e12f;fa_chevron_right:e130;fa_plus_circle:e131;fa_minus_circle:e132;fa_times_circle:e133;fa_check_circle:e134;fa_question_circle:e135;fa_info_circle:e136;fa_crosshairs:e137;fa_times_circle_o:e138;fa_check_circle_o:e139;fa_ban:e13a;fa_arrow_left:e13b;fa_arrow_right:e13c;fa_arrow_up:e13d;fa_arrow_down:e13e;fa_mail_forward:e13f;fa_expand:e140;fa_compress:e141;fa_plus:e142;fa_minus:e143;fa_asterisk:e144;fa_exclamation_circle:e145;fa_gift:e146;fa_leaf:e147;fa_fire:e148;fa_eye:e149;fa_eye_slash:e14a;fa_exclamation_triangle:e14b;fa_plane:e14c;fa_calendar:e14d;fa_random:e14e;fa_comment:e14f;fa_magnet:e150;fa_chevron_up:e151;fa_chevron_down:e152;fa_retweet:e153;fa_shopping_cart:e154;fa_folder:e155;fa_folder_open:e156;fa_arrows_v:e157;fa_arrows_h:e158;fa_bar_chart:e159;fa_twitter_square:e15a;fa_facebook_square:e15b;fa_camera_retro:e15c;fa_key:e15d;fa_cogs:e15e;fa_comments:e15f;fa_thumbs_o_up:e160;fa_thumbs_o_down:e161;fa_star_half:e162;fa_heart_o:e163;fa_sign_out:e164;fa_linkedin_square:e165;fa_thumb_tack:e166;fa_external_link:e167;fa_sign_in:e168;fa_trophy:e169;fa_github_square:e16a;fa_upload:e16b;fa_lemon_o:e16c;fa_phone:e16d;fa_square_o:e16e;fa_bookmark_o:e16f;fa_phone_square:e170;fa_twitter:e171;fa_facebook:e172;fa_github:e173;fa_unlock:e174;fa_credit_card:e175;fa_feed:e176;fa_hdd_o:e177;fa_bullhorn:e178;fa_bell_o:e179;fa_certificate:e17a;fa_hand_o_right:e17b;fa_hand_o_left:e17c;fa_hand_o_up:e17d;fa_hand_o_down:e17e;fa_arrow_circle_left:e17f;fa_arrow_circle_right:e180;fa_arrow_circle_up:e181;fa_arrow_circle_down:e182;fa_globe:e183;fa_wrench:e184;fa_tasks:e185;fa_filter:e186;fa_briefcase:e187;fa_arrows_alt:e188;fa_group:e189;fa_chain:e18a;fa_cloud:e18b;fa_flask:e18c;fa_cut:e18d;fa_copy:e18e;fa_paperclip:e18f;fa_floppy_o:e190;fa_square:e191;fa_bars:e192;fa_list_ul:e193;fa_list_ol:e194;fa_strikethrough:e195;fa_underline:e196;fa_table:e197;fa_magic:e198;fa_truck:e199;fa_pinterest:e19a;fa_pinterest_square:e19b;fa_google_plus_square:e19c;fa_google_plus:e19d;fa_money:e19e;fa_caret_down:e19f;fa_caret_up:e1a0;fa_caret_left:e1a1;fa_caret_right:e1a2;fa_columns:e1a3;fa_sort:e1a4;fa_sort_desc:e1a5;fa_sort_asc:e1a6;fa_envelope:e1a7;fa_linkedin:e1a8;fa_rotate_left:e1a9;fa_gavel:e1aa;fa_dashboard:e1ab;fa_comment_o:e1ac;fa_comments_o:e1ad;fa_bolt:e1ae;fa_sitemap:e1af;fa_umbrella:e1b0;fa_clipboard:e1b1;fa_lightbulb_o:e1b2;fa_exchange:e1b3;fa_cloud_download:e1b4;fa_cloud_upload:e1b5;fa_user_md:e1b6;fa_stethoscope:e1b7;fa_suitcase:e1b8;fa_bell:e1b9;fa_coffee:e1ba;fa_cutlery:e1bb;fa_file_text_o:e1bc;fa_building_o:e1bd;fa_hospital_o:e1be;fa_ambulance:e1bf;fa_medkit:e1c0;fa_fighter_jet:e1c1;fa_beer:e1c2;fa_h_square:e1c3;fa_plus_square:e1c4;fa_angle_double_left:e1c5;fa_angle_double_right:e1c6;fa_angle_double_up:e1c7;fa_angle_double_down:e1c8;fa_angle_left:e1c9;fa_angle_right:e1ca;fa_angle_up:e1cb;fa_angle_down:e1cc;fa_desktop:e1cd;fa_laptop:e1ce;fa_tablet:e1cf;fa_mobile:e1d0;fa_circle_o:e1d1;fa_quote_left:e1d2;fa_quote_right:e1d3;fa_spinner:e1d4;fa_circle:e1d5;fa_mail_reply:e1d6;fa_github_alt:e1d7;fa_folder_o:e1d8;fa_folder_open_o:e1d9;fa_expand_alt:e1da;fa_collapse_alt:e1db;fa_smile_o:e1dc;fa_frown_o:e1dd;fa_meh_o:e1de;fa_gamepad:e1df;fa_keyboard_o:e1e0;fa_flag_o:e1e1;fa_flag_checkered:e1e2;fa_terminal:e1e3;fa_code:e1e4;fa_mail_reply_all:e1e5;fa_star_half_empty:e1e6;fa_location_arrow:e1e7;fa_crop:e1e8;fa_code_fork:e1e9;fa_chain_broken:e1ea;fa_question:e1eb;fa_info:e1ec;fa_exclamation:e1ed;fa_superscript:e1ee;fa_subscript:e1ef;fa_eraser:e1f0;fa_puzzle_piece:e1f1;fa_microphone:e1f2;fa_microphone_slash:e1f3;fa_shield:e1f4;fa_calendar_o:e1f5;fa_fire_extinguisher:e1f6;fa_rocket:e1f7;fa_maxcdn:e1f8;fa_chevron_circle_left:e1f9;fa_chevron_circle_right:e1fa;fa_chevron_circle_up:e1fb;fa_chevron_circle_down:e1fc;fa_html5:e1fd;fa_css3:e1fe;fa_anchor:e1ff;fa_unlock_alt:e200;fa_bullseye:e201;fa_ellipsis_h:e202;fa_ellipsis_v:e203;fa_rss_square:e204;fa_play_circle:e205;fa_ticket:e206;fa_minus_square:e207;fa_minus_square_o:e208;fa_level_up:e209;fa_level_down:e20a;fa_check_square:e20b;fa_pencil_square:e20c;fa_external_link_square:e20d;fa_share_square:e20e;fa_compass:e20f;fa_caret_square_o_down:e210;fa_caret_square_o_up:e211;fa_caret_square_o_right:e212;fa_eur:e213;fa_gbp:e214;fa_dollar:e215;fa_inr:e216;fa_cny:e217;fa_rouble:e218;fa_krw:e219;fa_bitcoin:e21a;fa_file:e21b;fa_file_text:e21c;fa_sort_alpha_asc:e21d;fa_sort_alpha_desc:e21e;fa_sort_amount_asc:e21f;fa_sort_amount_desc:e220;fa_sort_numeric_asc:e221;fa_sort_numeric_desc:e222;fa_thumbs_up:e223;fa_thumbs_down:e224;fa_youtube_square:e225;fa_youtube:e226;fa_xing:e227;fa_xing_square:e228;fa_youtube_play:e229;fa_dropbox:e22a;fa_stack_overflow:e22b;fa_instagram:e22c;fa_flickr:e22d;fa_adn:e22e;fa_bitbucket:e22f;fa_bitbucket_square:e230;fa_tumblr:e231;fa_tumblr_square:e232;fa_long_arrow_down:e233;fa_long_arrow_up:e234;fa_long_arrow_left:e235;fa_long_arrow_right:e236;fa_apple:e237;fa_windows:e238;fa_android:e239;fa_linux:e23a;fa_dribbble:e23b;fa_skype:e23c;fa_foursquare:e23d;fa_trello:e23e;fa_female:e23f;fa_male:e240;fa_gittip:e241;fa_sun_o:e242;fa_moon_o:e243;fa_archive:e244;fa_bug:e245;fa_vk:e246;fa_weibo:e247;fa_renren:e248;fa_pagelines:e249;fa_stack_exchange:e24a;fa_arrow_circle_o_right:e24b;fa_arrow_circle_o_left:e24c;fa_caret_square_o_left:e24d;fa_dot_circle_o:e24e;fa_wheelchair:e24f;fa_vimeo_square:e250;fa_try:e251;fa_plus_square_o:e252;fa_space_shuttle:e253;fa_slack:e254;fa_envelope_square:e255;fa_wordpress:e256;fa_openid:e257;fa_bank:e258;fa_graduation_cap:e259;fa_yahoo:e25a;fa_google:e25b;fa_reddit:e25c;fa_reddit_square:e25d;fa_stumbleupon_circle:e25e;fa_stumbleupon:e25f;fa_delicious:e260;fa_digg:e261;fa_pied_piper_pp:e262;fa_pied_piper_alt:e263;fa_drupal:e264;fa_joomla:e265;fa_language:e266;fa_fax:e267;fa_building:e268;fa_child:e269;fa_paw:e26a;fa_spoon:e26b;fa_cube:e26c;fa_cubes:e26d;fa_behance:e26e;fa_behance_square:e26f;fa_steam:e270;fa_steam_square:e271;fa_recycle:e272;fa_automobile:e273;fa_cab:e274;fa_tree:e275;fa_spotify:e276;fa_deviantart:e277;fa_soundcloud:e278;fa_database:e279;fa_file_pdf_o:e27a;fa_file_word_o:e27b;fa_file_excel_o:e27c;fa_file_powerpoint_o:e27d;fa_file_image_o:e27e;fa_file_archive_o:e27f;fa_file_audio_o:e280;fa_file_movie_o:e281;fa_file_code_o:e282;fa_vine:e283;fa_codepen:e284;fa_jsfiddle:e285;fa_life_bouy:e286;fa_circle_o_notch:e287;fa_ra:e288;fa_empire:e289;fa_git_square:e28a;fa_git:e28b;fa_hacker_news:e28c;fa_tencent_weibo:e28d;fa_qq:e28e;fa_wechat:e28f;fa_paper_plane:e290;fa_paper_plane_o:e291;fa_history:e292;fa_circle_thin:e293;fa_header:e294;fa_paragraph:e295;fa_sliders:e296;fa_share_alt:e297;fa_share_alt_square:e298;fa_bomb:e299;fa_futbol_o:e29a;fa_tty:e29b;fa_binoculars:e29c;fa_plug:e29d;fa_slideshare:e29e;fa_twitch:e29f;fa_yelp:e2a0;fa_newspaper_o:e2a1;fa_wifi:e2a2;fa_calculator:e2a3;fa_paypal:e2a4;fa_google_wallet:e2a5;fa_cc_visa:e2a6;fa_cc_mastercard:e2a7;fa_cc_discover:e2a8;fa_cc_amex:e2a9;fa_cc_paypal:e2aa;fa_cc_stripe:e2ab;fa_bell_slash:e2ac;fa_bell_slash_o:e2ad;fa_trash:e2ae;fa_copyright:e2af;fa_at:e2b0;fa_eyedropper:e2b1;fa_paint_brush:e2b2;fa_birthday_cake:e2b3;fa_area_chart:e2b4;fa_pie_chart:e2b5;fa_line_chart:e2b6;fa_lastfm:e2b7;fa_lastfm_square:e2b8;fa_toggle_off:e2b9;fa_toggle_on:e2ba;fa_bicycle:e2bb;fa_bus:e2bc;fa_ioxhost:e2bd;fa_angellist:e2be;fa_cc:e2bf;fa_ils:e2c0;fa_meanpath:e2c1;fa_buysellads:e2c2;fa_connectdevelop:e2c3;fa_dashcube:e2c4;fa_forumbee:e2c5;fa_leanpub:e2c6;fa_sellsy:e2c7;fa_shirtsinbulk:e2c8;fa_simplybuilt:e2c9;fa_skyatlas:e2ca;fa_cart_plus:e2cb;fa_cart_arrow_down:e2cc;fa_diamond:e2cd;fa_ship:e2ce;fa_user_secret:e2cf;fa_motorcycle:e2d0;fa_street_view:e2d1;fa_heartbeat:e2d2;fa_venus:e2d3;fa_mars:e2d4;fa_mercury:e2d5;fa_intersex:e2d6;fa_transgender_alt:e2d7;fa_venus_double:e2d8;fa_mars_double:e2d9;fa_venus_mars:e2da;fa_mars_stroke:e2db;fa_mars_stroke_v:e2dc;fa_mars_stroke_h:e2dd;fa_neuter:e2de;fa_genderless:e2df;fa__523:e2e0;fa__524:e2e1;fa_facebook_official:e2e2;fa_pinterest_p:e2e3;fa_whatsapp:e2e4;fa_server:e2e5;fa_user_plus:e2e6;fa_user_times:e2e7;fa_bed:e2e8;fa_viacoin:e2e9;fa_train:e2ea;fa_subway:e2eb;fa_medium:e2ec;fa_y_combinator:e2ed;fa_optin_monster:e2ee;fa_opencart:e2ef;fa_expeditedssl:e2f0;fa_battery:e2f1;fa_battery_3:e2f2;fa_battery_2:e2f3;fa_battery_1:e2f4;fa_battery_0:e2f5;fa_mouse_pointer:e2f6;fa_i_cursor:e2f7;fa_object_group:e2f8;fa_object_ungroup:e2f9;fa_sticky_note:e2fa;fa_sticky_note_o:e2fb;fa_cc_jcb:e2fc;fa_cc_diners_club:e2fd;fa_clone:e2fe;fa_balance_scale:e2ff;fa_hourglass_o:e300;fa_hourglass_1:e301;fa_hourglass_2:e302;fa_hourglass_3:e303;fa_hourglass:e304;fa_hand_grab_o:e305;fa_hand_paper_o:e306;fa_hand_scissors_o:e307;fa_hand_lizard_o:e308;fa_hand_spock_o:e309;fa_hand_pointer_o:e30a;fa_hand_peace_o:e30b;fa_trademark:e30c;fa_registered:e30d;fa_creative_commons:e30e;fa_gg:e30f;fa_gg_circle:e310;fa_tripadvisor:e311;fa_odnoklassniki:e312;fa_odnoklassniki_square:e313;fa_get_pocket:e314;fa_wikipedia_w:e315;fa_safari:e316;fa_chrome:e317;fa_firefox:e318;fa_opera:e319;fa_internet_explorer:e31a;fa_television:e31b;fa_contao:e31c;fa_500px:e31d;fa_amazon:e31e;fa_calendar_plus_o:e31f;fa_calendar_minus_o:e320;fa_calendar_times_o:e321;fa_calendar_check_o:e322;fa_industry:e323;fa_map_pin:e324;fa_map_signs:e325;fa_map_o:e326;fa_map:e327;fa_commenting:e328;fa_commenting_o:e329;fa_houzz:e32a;fa_vimeo:e32b;fa_black_tie:e32c;fa_fonticons:e32d;fa_reddit_alien:e32e;fa_edge:e32f;fa_credit_card_alt:e330;fa_codiepie:e331;fa_modx:e332;fa_fort_awesome:e333;fa_usb:e334;fa_product_hunt:e335;fa_mixcloud:e336;fa_scribd:e337;fa_pause_circle:e338;fa_pause_circle_o:e339;fa_stop_circle:e33a;fa_stop_circle_o:e33b;fa_shopping_bag:e33c;fa_shopping_basket:e33d;fa_hashtag:e33e;fa_bluetooth:e33f;fa_bluetooth_b:e340;fa_percent:e341;fa_gitlab:e342;fa_wpbeginner:e343;fa_wpforms:e344;fa_envira:e345;fa_universal_access:e346;fa_wheelchair_alt:e347;fa_question_circle_o:e348;fa_blind:e349;fa_audio_description:e34a;fa_volume_control_phone:e34b;fa_braille:e34c;fa_assistive_listening_systems:e34d;fa_american_sign_language_interpreting:e34e;fa_deaf:e34f;fa_glide:e350;fa_glide_g:e351;fa_sign_language:e352;fa_low_vision:e353;fa_viadeo:e354;fa_viadeo_square:e355;fa_snapchat:e356;fa_snapchat_ghost:e357;fa_snapchat_square:e358;fa_pied_piper:e359;fa_first_order:e35a;fa_yoast:e35b;fa_themeisle:e35c;fa_google_plus_circle:e35d;fa_fa:e35e;fa_handshake_o:e35f;fa_envelope_open:e360;fa_envelope_open_o:e361;fa_linode:e362;fa_address_book:e363;fa_address_book_o:e364;fa_address_card:e365;fa_address_card_o:e366;fa_user_circle:e367;fa_user_circle_o:e368;fa_user_o:e369;fa_id_badge:e36a;fa_drivers_license:e36b;fa_drivers_license_o:e36c;fa_quora:e36d;fa_free_code_camp:e36e;fa_telegram:e36f;fa_thermometer:e370;fa_thermometer_3:e371;fa_thermometer_2:e372;fa_thermometer_1:e373;fa_thermometer_0:e374;fa_shower:e375;fa_bath:e376;fa_podcast:e377;fa_window_maximize:e378;fa_window_minimize:e379;fa_window_restore:e37a;fa_times_rectangle:e37b;fa_times_rectangle_o:e37c;fa_bandcamp:e37d;fa_grav:e37e;fa_etsy:e37f;fa_imdb:e380;fa_ravelry:e381;fa_eercast:e382;fa_microchip:e383;fa_snowflake_o:e384;fa_superpowers:e385;fa_wpexplorer:e386;fa_meetup:e387; +#material:933 +md_error:e388;md_error_outline:e389;md_warning:e38a;md_add_alert:e38b;md_album:e38c;md_av_timer:e38d;md_closed_caption:e38e;md_equalizer:e38f;md_explicit:e390;md_fast_forward:e391;md_fast_rewind:e392;md_games:e393;md_hearing:e394;md_high_quality:e395;md_loop:e396;md_mic:e397;md_mic_none:e398;md_mic_off:e399;md_movie:e39a;md_library_add:e39b;md_library_books:e39c;md_library_music:e39d;md_new_releases:e39e;md_not_interested:e39f;md_pause:e3a0;md_pause_circle_filled:e3a1;md_pause_circle_outline:e3a2;md_play_arrow:e3a3;md_play_circle_filled:e3a4;md_play_circle_outline:e3a5;md_playlist_add:e3a6;md_queue:e3a7;md_queue_music:e3a8;md_radio:e3a9;md_recent_actors:e3aa;md_repeat:e3ab;md_repeat_one:e3ac;md_replay:e3ad;md_shuffle:e3ae;md_skip_next:e3af;md_skip_previous:e3b0;md_snooze:e3b1;md_stop:e3b2;md_subtitles:e3b3;md_surround_sound:e3b4;md_video_library:e3b5;md_videocam:e3b6;md_videocam_off:e3b7;md_volume_down:e3b8;md_volume_mute:e3b9;md_volume_off:e3ba;md_volume_up:e3bb;md_web:e3bc;md_hd:e3bd;md_sort_by_alpha:e3be;md_airplay:e3bf;md_forward_10:e3c0;md_forward_30:e3c1;md_forward_5:e3c2;md_replay_10:e3c3;md_replay_30:e3c4;md_replay_5:e3c5;md_add_to_queue:e3c6;md_fiber_dvr:e3c7;md_fiber_new:e3c8;md_playlist_play:e3c9;md_art_track:e3ca;md_fiber_manual_record:e3cb;md_fiber_smart_record:e3cc;md_music_video:e3cd;md_subscriptions:e3ce;md_playlist_add_check:e3cf;md_queue_play_next:e3d0;md_remove_from_queue:e3d1;md_slow_motion_video:e3d2;md_web_asset:e3d3;md_fiber_pin:e3d4;md_branding_watermark:e3d5;md_call_to_action:e3d6;md_featured_play_list:e3d7;md_featured_video:e3d8;md_note:e3d9;md_video_call:e3da;md_video_label:e3db;md_business:e3dc;md_call:e3dd;md_call_end:e3de;md_call_made:e3df;md_call_merge:e3e0;md_call_missed:e3e1;md_call_received:e3e2;md_call_split:e3e3;md_chat:e3e4;md_clear_all:e3e5;md_comment:e3e6;md_contacts:e3e7;md_dialer_sip:e3e8;md_dialpad:e3e9;md_email:e3ea;md_forum:e3eb;md_import_export:e3ec;md_invert_colors_off:e3ed;md_live_help:e3ee;md_location_off:e3ef;md_location_on:e3f0;md_message:e3f1;md_chat_bubble:e3f2;md_chat_bubble_outline:e3f3;md_no_sim:e3f4;md_phone:e3f5;md_portable_wifi_off:e3f6;md_contact_phone:e3f7;md_contact_mail:e3f8;md_ring_volume:e3f9;md_speaker_phone:e3fa;md_stay_current_landscape:e3fb;md_stay_current_portrait:e3fc;md_stay_primary_landscape:e3fd;md_stay_primary_portrait:e3fe;md_swap_calls:e3ff;md_textsms:e400;md_voicemail:e401;md_vpn_key:e402;md_phonelink_erase:e403;md_phonelink_lock:e404;md_phonelink_ring:e405;md_phonelink_setup:e406;md_present_to_all:e407;md_import_contacts:e408;md_mail_outline:e409;md_screen_share:e40a;md_stop_screen_share:e40b;md_call_missed_outgoing:e40c;md_rss_feed:e40d;md_add:e40e;md_add_box:e40f;md_add_circle:e410;md_add_circle_outline:e411;md_archive:e412;md_backspace:e413;md_block:e414;md_clear:e415;md_content_copy:e416;md_content_cut:e417;md_content_paste:e418;md_create:e419;md_drafts:e41a;md_filter_list:e41b;md_flag:e41c;md_forward:e41d;md_gesture:e41e;md_inbox:e41f;md_link:e420;md_mail:e421;md_markunread:e422;md_redo:e423;md_remove:e424;md_remove_circle:e425;md_remove_circle_outline:e426;md_reply:e427;md_reply_all:e428;md_report:e429;md_save:e42a;md_select_all:e42b;md_send:e42c;md_sort:e42d;md_text_format:e42e;md_undo:e42f;md_font_download:e430;md_move_to_inbox:e431;md_unarchive:e432;md_next_week:e433;md_weekend:e434;md_delete_sweep:e435;md_low_priority:e436;md_access_alarm:e437;md_access_alarms:e438;md_access_time:e439;md_add_alarm:e43a;md_airplanemode_inactive:e43b;md_airplanemode_active:e43c;md_battery_alert:e43d;md_battery_charging_full:e43e;md_battery_full:e43f;md_battery_std:e440;md_battery_unknown:e441;md_bluetooth:e442;md_bluetooth_connected:e443;md_bluetooth_disabled:e444;md_bluetooth_searching:e445;md_brightness_auto:e446;md_brightness_high:e447;md_brightness_low:e448;md_brightness_medium:e449;md_data_usage:e44a;md_developer_mode:e44b;md_devices:e44c;md_dvr:e44d;md_gps_fixed:e44e;md_gps_not_fixed:e44f;md_gps_off:e450;md_location_disabled:e451;md_location_searching:e452;md_graphic_eq:e453;md_network_cell:e454;md_network_wifi:e455;md_nfc:e456;md_wallpaper:e457;md_widgets:e458;md_screen_lock_landscape:e459;md_screen_lock_portrait:e45a;md_screen_lock_rotation:e45b;md_screen_rotation:e45c;md_sd_storage:e45d;md_settings_system_daydream:e45e;md_signal_cellular_4_bar:e45f;md_signal_cellular_connected_no_internet_4_bar:e460;md_signal_cellular_no_sim:e461;md_signal_cellular_null:e462;md_signal_cellular_off:e463;md_signal_wifi_4_bar:e464;md_signal_wifi_4_bar_lock:e465;md_signal_wifi_off:e466;md_storage:e467;md_usb:e468;md_wifi_lock:e469;md_wifi_tethering:e46a;md_attach_file:e46b;md_attach_money:e46c;md_border_all:e46d;md_border_bottom:e46e;md_border_clear:e46f;md_border_color:e470;md_border_horizontal:e471;md_border_inner:e472;md_border_left:e473;md_border_outer:e474;md_border_right:e475;md_border_style:e476;md_border_top:e477;md_border_vertical:e478;md_format_align_center:e479;md_format_align_justify:e47a;md_format_align_left:e47b;md_format_align_right:e47c;md_format_bold:e47d;md_format_clear:e47e;md_format_color_fill:e47f;md_format_color_reset:e480;md_format_color_text:e481;md_format_indent_decrease:e482;md_format_indent_increase:e483;md_format_italic:e484;md_format_line_spacing:e485;md_format_list_bulleted:e486;md_format_list_numbered:e487;md_format_paint:e488;md_format_quote:e489;md_format_size:e48a;md_format_strikethrough:e48b;md_format_textdirection_l_to_r:e48c;md_format_textdirection_r_to_l:e48d;md_format_underlined:e48e;md_functions:e48f;md_insert_chart:e490;md_insert_comment:e491;md_insert_drive_file:e492;md_insert_emoticon:e493;md_insert_invitation:e494;md_insert_link:e495;md_insert_photo:e496;md_merge_type:e497;md_mode_comment:e498;md_mode_edit:e499;md_publish:e49a;md_space_bar:e49b;md_strikethrough_s:e49c;md_vertical_align_bottom:e49d;md_vertical_align_center:e49e;md_vertical_align_top:e49f;md_wrap_text:e4a0;md_money_off:e4a1;md_drag_handle:e4a2;md_format_shapes:e4a3;md_highlight:e4a4;md_linear_scale:e4a5;md_short_text:e4a6;md_text_fields:e4a7;md_monetization_on:e4a8;md_title:e4a9;md_attachment:e4aa;md_cloud:e4ab;md_cloud_circle:e4ac;md_cloud_done:e4ad;md_cloud_download:e4ae;md_cloud_off:e4af;md_cloud_queue:e4b0;md_cloud_upload:e4b1;md_file_download:e4b2;md_file_upload:e4b3;md_folder:e4b4;md_folder_open:e4b5;md_folder_shared:e4b6;md_create_new_folder:e4b7;md_cast:e4b8;md_cast_connected:e4b9;md_computer:e4ba;md_desktop_mac:e4bb;md_desktop_windows:e4bc;md_developer_board:e4bd;md_dock:e4be;md_gamepad:e4bf;md_headset:e4c0;md_headset_mic:e4c1;md_keyboard:e4c2;md_keyboard_arrow_down:e4c3;md_keyboard_arrow_left:e4c4;md_keyboard_arrow_right:e4c5;md_keyboard_arrow_up:e4c6;md_keyboard_backspace:e4c7;md_keyboard_capslock:e4c8;md_keyboard_hide:e4c9;md_keyboard_return:e4ca;md_keyboard_tab:e4cb;md_keyboard_voice:e4cc;md_laptop:e4cd;md_laptop_chromebook:e4ce;md_laptop_mac:e4cf;md_laptop_windows:e4d0;md_memory:e4d1;md_mouse:e4d2;md_phone_android:e4d3;md_phone_iphone:e4d4;md_phonelink:e4d5;md_phonelink_off:e4d6;md_router:e4d7;md_scanner:e4d8;md_security:e4d9;md_sim_card:e4da;md_smartphone:e4db;md_speaker:e4dc;md_speaker_group:e4dd;md_tablet:e4de;md_tablet_android:e4df;md_tablet_mac:e4e0;md_toys:e4e1;md_tv:e4e2;md_watch:e4e3;md_device_hub:e4e4;md_power_input:e4e5;md_devices_other:e4e6;md_videogame_asset:e4e7;md_add_to_photos:e4e8;md_adjust:e4e9;md_assistant:e4ea;md_assistant_photo:e4eb;md_audiotrack:e4ec;md_blur_circular:e4ed;md_blur_linear:e4ee;md_blur_off:e4ef;md_blur_on:e4f0;md_brightness_1:e4f1;md_brightness_2:e4f2;md_brightness_3:e4f3;md_brightness_4:e4f4;md_brightness_5:e4f5;md_brightness_6:e4f6;md_brightness_7:e4f7;md_broken_image:e4f8;md_brush:e4f9;md_camera:e4fa;md_camera_alt:e4fb;md_camera_front:e4fc;md_camera_rear:e4fd;md_camera_roll:e4fe;md_center_focus_strong:e4ff;md_center_focus_weak:e500;md_collections:e501;md_color_lens:e502;md_colorize:e503;md_compare:e504;md_control_point:e505;md_control_point_duplicate:e506;md_crop_16_9:e507;md_crop_3_2:e508;md_crop:e509;md_crop_5_4:e50a;md_crop_7_5:e50b;md_crop_din:e50c;md_crop_free:e50d;md_crop_landscape:e50e;md_crop_original:e50f;md_crop_portrait:e510;md_crop_square:e511;md_dehaze:e512;md_details:e513;md_edit:e514;md_exposure:e515;md_exposure_neg_1:e516;md_exposure_neg_2:e517;md_exposure_plus_1:e518;md_exposure_plus_2:e519;md_exposure_zero:e51a;md_filter_1:e51b;md_filter_2:e51c;md_filter_3:e51d;md_filter:e51e;md_filter_4:e51f;md_filter_5:e520;md_filter_6:e521;md_filter_7:e522;md_filter_8:e523;md_filter_9:e524;md_filter_9_plus:e525;md_filter_b_and_w:e526;md_filter_center_focus:e527;md_filter_drama:e528;md_filter_frames:e529;md_filter_hdr:e52a;md_filter_none:e52b;md_filter_tilt_shift:e52c;md_filter_vintage:e52d;md_flare:e52e;md_flash_auto:e52f;md_flash_off:e530;md_flash_on:e531;md_flip:e532;md_gradient:e533;md_grain:e534;md_grid_off:e535;md_grid_on:e536;md_hdr_off:e537;md_hdr_on:e538;md_hdr_strong:e539;md_hdr_weak:e53a;md_healing:e53b;md_image:e53c;md_image_aspect_ratio:e53d;md_iso:e53e;md_landscape:e53f;md_leak_add:e540;md_leak_remove:e541;md_lens:e542;md_looks_3:e543;md_looks:e544;md_looks_4:e545;md_looks_5:e546;md_looks_6:e547;md_looks_one:e548;md_looks_two:e549;md_loupe:e54a;md_monochrome_photos:e54b;md_movie_creation:e54c;md_music_note:e54d;md_nature:e54e;md_nature_people:e54f;md_navigate_before:e550;md_navigate_next:e551;md_palette:e552;md_panorama:e553;md_panorama_fish_eye:e554;md_panorama_horizontal:e555;md_panorama_vertical:e556;md_panorama_wide_angle:e557;md_photo:e558;md_photo_album:e559;md_photo_camera:e55a;md_photo_library:e55b;md_picture_as_pdf:e55c;md_portrait:e55d;md_remove_red_eye:e55e;md_rotate_90_degrees_ccw:e55f;md_rotate_left:e560;md_rotate_right:e561;md_slideshow:e562;md_straighten:e563;md_style:e564;md_switch_camera:e565;md_switch_video:e566;md_tag_faces:e567;md_texture:e568;md_timelapse:e569;md_timer_10:e56a;md_timer_3:e56b;md_timer:e56c;md_timer_off:e56d;md_tonality:e56e;md_transform:e56f;md_tune:e570;md_view_comfy:e571;md_view_compact:e572;md_wb_auto:e573;md_wb_cloudy:e574;md_wb_incandescent:e575;md_wb_sunny:e576;md_collections_bookmark:e577;md_photo_size_select_actual:e578;md_photo_size_select_large:e579;md_photo_size_select_small:e57a;md_vignette:e57b;md_wb_iridescent:e57c;md_crop_rotate:e57d;md_linked_camera:e57e;md_add_a_photo:e57f;md_movie_filter:e580;md_photo_filter:e581;md_burst_mode:e582;md_beenhere:e583;md_directions:e584;md_directions_bike:e585;md_directions_bus:e586;md_directions_car:e587;md_directions_boat:e588;md_directions_subway:e589;md_directions_railway:e58a;md_directions_transit:e58b;md_directions_walk:e58c;md_flight:e58d;md_hotel:e58e;md_layers:e58f;md_layers_clear:e590;md_local_airport:e591;md_local_atm:e592;md_local_activity:e593;md_local_bar:e594;md_local_cafe:e595;md_local_car_wash:e596;md_local_convenience_store:e597;md_local_drink:e598;md_local_florist:e599;md_local_gas_station:e59a;md_local_grocery_store:e59b;md_local_hospital:e59c;md_local_hotel:e59d;md_local_laundry_service:e59e;md_local_library:e59f;md_local_mall:e5a0;md_local_movies:e5a1;md_local_offer:e5a2;md_local_parking:e5a3;md_local_pharmacy:e5a4;md_local_phone:e5a5;md_local_pizza:e5a6;md_local_play:e5a7;md_local_post_office:e5a8;md_local_printshop:e5a9;md_local_dining:e5aa;md_local_see:e5ab;md_local_shipping:e5ac;md_local_taxi:e5ad;md_person_pin:e5ae;md_map:e5af;md_my_location:e5b0;md_navigation:e5b1;md_pin_drop:e5b2;md_place:e5b3;md_rate_review:e5b4;md_restaurant_menu:e5b5;md_satellite:e5b6;md_store_mall_directory:e5b7;md_terrain:e5b8;md_traffic:e5b9;md_directions_run:e5ba;md_add_location:e5bb;md_edit_location:e5bc;md_near_me:e5bd;md_person_pin_circle:e5be;md_zoom_out_map:e5bf;md_restaurant:e5c0;md_ev_station:e5c1;md_streetview:e5c2;md_subway:e5c3;md_train:e5c4;md_tram:e5c5;md_transfer_within_a_station:e5c6;md_apps:e5c7;md_arrow_back:e5c8;md_arrow_drop_down:e5c9;md_arrow_drop_down_circle:e5ca;md_arrow_drop_up:e5cb;md_arrow_forward:e5cc;md_cancel:e5cd;md_check:e5ce;md_chevron_left:e5cf;md_chevron_right:e5d0;md_close:e5d1;md_expand_less:e5d2;md_expand_more:e5d3;md_fullscreen:e5d4;md_fullscreen_exit:e5d5;md_menu:e5d6;md_more_horiz:e5d7;md_more_vert:e5d8;md_refresh:e5d9;md_unfold_less:e5da;md_unfold_more:e5db;md_arrow_upward:e5dc;md_subdirectory_arrow_left:e5dd;md_subdirectory_arrow_right:e5de;md_arrow_downward:e5df;md_first_page:e5e0;md_last_page:e5e1;md_adb:e5e2;md_bluetooth_audio:e5e3;md_disc_full:e5e4;md_do_not_disturb_alt:e5e5;md_do_not_disturb:e5e6;md_drive_eta:e5e7;md_event_available:e5e8;md_event_busy:e5e9;md_event_note:e5ea;md_folder_special:e5eb;md_mms:e5ec;md_more:e5ed;md_network_locked:e5ee;md_phone_bluetooth_speaker:e5ef;md_phone_forwarded:e5f0;md_phone_in_talk:e5f1;md_phone_locked:e5f2;md_phone_missed:e5f3;md_phone_paused:e5f4;md_sd_card:e5f5;md_sim_card_alert:e5f6;md_sms:e5f7;md_sms_failed:e5f8;md_sync:e5f9;md_sync_disabled:e5fa;md_sync_problem:e5fb;md_system_update:e5fc;md_tap_and_play:e5fd;md_time_to_leave:e5fe;md_vibration:e5ff;md_voice_chat:e600;md_vpn_lock:e601;md_airline_seat_flat:e602;md_airline_seat_flat_angled:e603;md_airline_seat_individual_suite:e604;md_airline_seat_legroom_extra:e605;md_airline_seat_legroom_normal:e606;md_airline_seat_legroom_reduced:e607;md_airline_seat_recline_extra:e608;md_airline_seat_recline_normal:e609;md_confirmation_number:e60a;md_live_tv:e60b;md_ondemand_video:e60c;md_personal_video:e60d;md_power:e60e;md_wc:e60f;md_wifi:e610;md_enhanced_encryption:e611;md_network_check:e612;md_no_encryption:e613;md_rv_hookup:e614;md_do_not_disturb_off:e615;md_do_not_disturb_on:e616;md_priority_high:e617;md_pie_chart:e618;md_pie_chart_outlined:e619;md_bubble_chart:e61a;md_multiline_chart:e61b;md_show_chart:e61c;md_cake:e61d;md_domain:e61e;md_group:e61f;md_group_add:e620;md_location_city:e621;md_mood:e622;md_mood_bad:e623;md_notifications:e624;md_notifications_none:e625;md_notifications_off:e626;md_notifications_active:e627;md_notifications_paused:e628;md_pages:e629;md_party_mode:e62a;md_people:e62b;md_people_outline:e62c;md_person:e62d;md_person_add:e62e;md_person_outline:e62f;md_plus_one:e630;md_poll:e631;md_public:e632;md_school:e633;md_share:e634;md_whatshot:e635;md_sentiment_dissatisfied:e636;md_sentiment_neutral:e637;md_sentiment_satisfied:e638;md_sentiment_very_dissatisfied:e639;md_sentiment_very_satisfied:e63a;md_check_box:e63b;md_check_box_outline_blank:e63c;md_radio_button_unchecked:e63d;md_radio_button_checked:e63e;md_star:e63f;md_star_half:e640;md_star_border:e641;md_3d_rotation:e642;md_accessibility:e643;md_account_balance:e644;md_account_balance_wallet:e645;md_account_box:e646;md_account_circle:e647;md_add_shopping_cart:e648;md_alarm:e649;md_alarm_add:e64a;md_alarm_off:e64b;md_alarm_on:e64c;md_android:e64d;md_announcement:e64e;md_aspect_ratio:e64f;md_assessment:e650;md_assignment:e651;md_assignment_ind:e652;md_assignment_late:e653;md_assignment_return:e654;md_assignment_returned:e655;md_assignment_turned_in:e656;md_autorenew:e657;md_backup:e658;md_book:e659;md_bookmark:e65a;md_bookmark_border:e65b;md_bug_report:e65c;md_build:e65d;md_cached:e65e;md_change_history:e65f;md_check_circle:e660;md_chrome_reader_mode:e661;md_class:e662;md_code:e663;md_credit_card:e664;md_dashboard:e665;md_delete:e666;md_description:e667;md_dns:e668;md_done:e669;md_done_all:e66a;md_event:e66b;md_exit_to_app:e66c;md_explore:e66d;md_extension:e66e;md_face:e66f;md_favorite:e670;md_favorite_border:e671;md_feedback:e672;md_find_in_page:e673;md_find_replace:e674;md_flip_to_back:e675;md_flip_to_front:e676;md_get_app:e677;md_grade:e678;md_group_work:e679;md_help:e67a;md_highlight_off:e67b;md_history:e67c;md_home:e67d;md_hourglass_empty:e67e;md_hourglass_full:e67f;md_https:e680;md_info:e681;md_info_outline:e682;md_input:e683;md_invert_colors:e684;md_label:e685;md_label_outline:e686;md_language:e687;md_launch:e688;md_list:e689;md_lock:e68a;md_lock_open:e68b;md_lock_outline:e68c;md_loyalty:e68d;md_markunread_mailbox:e68e;md_note_add:e68f;md_open_in_browser:e690;md_open_in_new:e691;md_open_with:e692;md_pageview:e693;md_payment:e694;md_perm_camera_mic:e695;md_perm_contact_calendar:e696;md_perm_data_setting:e697;md_perm_device_information:e698;md_perm_identity:e699;md_perm_media:e69a;md_perm_phone_msg:e69b;md_perm_scan_wifi:e69c;md_picture_in_picture:e69d;md_polymer:e69e;md_power_settings_new:e69f;md_print:e6a0;md_query_builder:e6a1;md_question_answer:e6a2;md_receipt:e6a3;md_redeem:e6a4;md_report_problem:e6a5;md_restore:e6a6;md_room:e6a7;md_schedule:e6a8;md_search:e6a9;md_settings:e6aa;md_settings_applications:e6ab;md_settings_backup_restore:e6ac;md_settings_bluetooth:e6ad;md_settings_cell:e6ae;md_settings_brightness:e6af;md_settings_ethernet:e6b0;md_settings_input_antenna:e6b1;md_settings_input_component:e6b2;md_settings_input_composite:e6b3;md_settings_input_hdmi:e6b4;md_settings_input_svideo:e6b5;md_settings_overscan:e6b6;md_settings_phone:e6b7;md_settings_power:e6b8;md_settings_remote:e6b9;md_settings_voice:e6ba;md_shop:e6bb;md_shop_two:e6bc;md_shopping_basket:e6bd;md_shopping_cart:e6be;md_speaker_notes:e6bf;md_spellcheck:e6c0;md_stars:e6c1;md_store:e6c2;md_subject:e6c3;md_supervisor_account:e6c4;md_swap_horiz:e6c5;md_swap_vert:e6c6;md_swap_vertical_circle:e6c7;md_system_update_alt:e6c8;md_tab:e6c9;md_tab_unselected:e6ca;md_theaters:e6cb;md_thumb_down:e6cc;md_thumb_up:e6cd;md_thumbs_up_down:e6ce;md_toc:e6cf;md_today:e6d0;md_toll:e6d1;md_track_changes:e6d2;md_translate:e6d3;md_trending_down:e6d4;md_trending_flat:e6d5;md_trending_up:e6d6;md_turned_in:e6d7;md_turned_in_not:e6d8;md_verified_user:e6d9;md_view_agenda:e6da;md_view_array:e6db;md_view_carousel:e6dc;md_view_column:e6dd;md_view_day:e6de;md_view_headline:e6df;md_view_list:e6e0;md_view_module:e6e1;md_view_quilt:e6e2;md_view_stream:e6e3;md_view_week:e6e4;md_visibility:e6e5;md_visibility_off:e6e6;md_card_giftcard:e6e7;md_card_membership:e6e8;md_card_travel:e6e9;md_work:e6ea;md_youtube_searched_for:e6eb;md_eject:e6ec;md_camera_enhance:e6ed;md_help_outline:e6ee;md_reorder:e6ef;md_zoom_in:e6f0;md_zoom_out:e6f1;md_http:e6f2;md_event_seat:e6f3;md_flight_land:e6f4;md_flight_takeoff:e6f5;md_play_for_work:e6f6;md_gif:e6f7;md_indeterminate_check_box:e6f8;md_offline_pin:e6f9;md_all_out:e6fa;md_copyright:e6fb;md_fingerprint:e6fc;md_gavel:e6fd;md_lightbulb_outline:e6fe;md_picture_in_picture_alt:e6ff;md_important_devices:e700;md_touch_app:e701;md_accessible:e702;md_compare_arrows:e703;md_date_range:e704;md_donut_large:e705;md_donut_small:e706;md_line_style:e707;md_line_weight:e708;md_motorcycle:e709;md_opacity:e70a;md_pets:e70b;md_pregnant_woman:e70c;md_record_voice_over:e70d;md_rounded_corner:e70e;md_rowing:e70f;md_timeline:e710;md_update:e711;md_watch_later:e712;md_pan_tool:e713;md_euro_symbol:e714;md_g_translate:e715;md_remove_shopping_cart:e716;md_restore_page:e717;md_speaker_notes_off:e718;md_delete_forever:e719;md_ac_unit:e71a;md_airport_shuttle:e71b;md_all_inclusive:e71c;md_beach_access:e71d;md_business_center:e71e;md_casino:e71f;md_child_care:e720;md_child_friendly:e721;md_fitness_center:e722;md_free_breakfast:e723;md_golf_course:e724;md_hot_tub:e725;md_kitchen:e726;md_pool:e727;md_room_service:e728;md_smoke_free:e729;md_smoking_rooms:e72a;md_spa:e72b;md_u10fffd:e72c; +#fileicons:456 +file_regex:e72d;file_arch_linux:e72e;file_e:e72f;file_glyphs:e730;file_knockout:e731;file_lean:e732;file_metal:e733;file_povray:e734;file_s:e735;file_tt:e736;file_vagrant:e737;file_xmos:e738;file_a:e739;file_chai:e73a;file_stylus:e73b;file_textile:e73c;file_unreal:e73d;file_purebasic:e73e;file_ts:e73f;file_scheme:e740;file_textmate:e741;file_x10:e742;file_apl:e743;file_ansible:e744;file_arttext:e745;file_antwar:e746;file_opa:e747;file_codecov:e748;file_yang:e749;file_pm2:e74a;file_hg:e74b;file_pawn:e74c;file_julia:e74d;file_shipit:e74e;file_mocha:e74f;file_nib:e750;file_shuriken:e751;file_alex:e752;file_twig:e753;file_1c:e754;file_tex:e755;file_bibtex:e756;file_mustache:e757;file_gulp:e758;file_grunt:e759;file_ember:e75a;file_go:e75b;file_jenkins:e75c;file_gnu:e75d;file_composer:e75e;file_meteor:e75f;file_ai:e760;file_psd:e761;file_silverstripe:e762;file_maxscript:e763;file_kivy:e764;file_crystal:e765;file_gradle:e766;file_groovy:e767;file_r:e768;file_vue:e769;file_haxe:e76a;file_lisp:e76b;file_e909:e76c;file_fortran:e76d;file_ada:e76e;file_dyalog:e76f;file_jade:e770;file_e90e:e771;file_font:e772;file_postcss:e773;file_scad:e774;file_e912:e775;file_raml:e776;file_ls:e777;file_saltstack:e778;file_terraform:e779;file_org:e77a;file_asciidoc:e77b;file_riot:e77c;file_ocaml:e77d;file_lua:e77e;file_npm:e77f;file_llvm:e780;file_e91e:e781;file_babel:e782;file_marko:e783;file_flow:e784;file_broccoli:e785;file_appveyor:e786;file_cakefile:e787;file_apple:e788;file_emacs:e789;file_sketch:e78a;file_doxygen:e78b;file_cf:e78c;file_pascal:e78d;file_abap:e78e;file_antlr:e78f;file_api:e790;file_as:e791;file_arc:e792;file_arduino:e793;file_augeas:e794;file_ahk:e795;file_autoit:e796;file_ats:e797;file_alloy:e798;file_manpage:e799;file_j:e79a;file_glade:e79b;file_boo:e79c;file_brain:e79d;file_bro:e79e;file_bluespec:e79f;file_stylelint:e7a0;file_ant:e7a1;file_cmake:e7a2;file_clips:e7a3;file_mapbox:e7a4;file_cp:e7a5;file_chuck:e7a6;file_jinja:e7a7;file_isabelle:e7a8;file_doge:e7a9;file_idl:e7aa;file_jake:e7ab;file_verilog:e7ac;file_phalcon:e7ad;file_fabfile:e7ae;file_lfe:e7af;file_nmap:e7b0;file_ampl:e7b1;file_ceylon:e7b2;file_chapel:e7b3;file_cirru:e7b4;file_clarion:e7b5;file_nunjucks:e7b6;file_mediawiki:e7b7;file_postscript:e7b8;file_tcl:e7b9;file_owl:e7ba;file_jsonld:e7bb;file_sparql:e7bc;file_sas:e7bd;file_clean:e7be;file_click:e7bf;file_nvidia:e7c0;file_creole:e7c1;file_coq:e7c2;file_diff:e7c3;file_patch:e7c4;file_byond:e7c5;file_cython:e7c6;file_darcs:e7c7;file_eagle:e7c8;file_ecere:e7c9;file_eiffel:e7ca;file_em:e7cb;file_flux:e7cc;file_factor:e7cd;file_fancy:e7ce;file_perl6:e7cf;file_gentoo:e7d0;file_frege:e7d1;file_fantom:e7d2;file_freemarker:e7d3;file_gap:e7d4;file_cl:e7d5;file_gams:e7d6;file_godot:e7d7;file_gml:e7d8;file_genshi:e7d9;file_pointwise:e7da;file_gf:e7db;file_golo:e7dc;file_gosu:e7dd;file_harbour:e7de;file_graphql:e7df;file_graphviz:e7e0;file_hashicorp:e7e1;file_hy:e7e2;file_igorpro:e7e3;file_io:e7e4;file_ioke:e7e5;file_idris:e7e6;file_inform7:e7e7;file_inno:e7e8;file_sublime:e7e9;file_jupyter:e7ea;file_krl:e7eb;file_kotlin:e7ec;file_labview:e7ed;file_lsl:e7ee;file_lasso:e7ef;file_logtalk:e7f0;file_lookml:e7f1;file_mako:e7f2;file_mathematica:e7f3;file_matlab:e7f4;file_e992:e7f5;file_max:e7f6;file_mercury:e7f7;file_mirah:e7f8;file_modula2:e7f9;file_monkey:e7fa;file_nimrod:e7fb;file_nit:e7fc;file_nix:e7fd;file_amx:e7fe;file_netlogo:e7ff;file_numpy:e800;file_objj:e801;file_opencl:e802;file_processing:e803;file_ox:e804;file_scd:e805;file_stata:e806;file_stan:e807;file_sqf:e808;file_slash:e809;file_shen:e80a;file_self:e80b;file_scilab:e80c;file_vhdl:e80d;file_sage:e80e;file_robot:e80f;file_red:e810;file_rebol:e811;file_xojo:e812;file_rdoc:e813;file_racket:e814;file_purescript:e815;file_uno:e816;file_varnish:e817;file_propeller:e818;file_turing:e819;file_pony:e81a;file_pogo:e81b;file_pike:e81c;file_urweb:e81d;file_parrot:e81e;file_papyrus:e81f;file_pan:e820;file_oz:e821;file_oxygene:e822;file_progress:e823;file_txl:e824;file_cabal:e825;file_sysverilog:e826;file_pickle:e827;file_xpages:e828;file_xtend:e829;file_zephir:e82a;file_zimpl:e82b;file_ec:e82c;file_mupad:e82d;file_ooc:e82e;file_rst:e82f;file_karma:e830;file_hack:e831;file_shopify:e832;file_pug_alt:e833;file_e9d1:e834;file_sbt:e835;file_e9d3:e836;file_scrutinizer:e837;file_cc:e838;file_brakeman:e839;file_newrelic:e83a;file_thor:e83b;file_nuget:e83c;file_powershell:e83d;file_sf:e83e;file_minecraft:e83f;file_sqlite:e840;file_protractor:e841;file_typings:e842;file_strings:e843;file_nant:e844;file_csscript:e845;file_cake:e846;file_openoffice:e847;file_keynote:e848;file_jsx:e849;file_tsx:e84a;file_model:e84b;file_finder:e84c;file_access:e84d;file_onenote:e84e;file_powerpoint:e84f;file_word:e850;file_excel:e851;file_storyist:e852;file_csound:e853;file_dbase:e854;file_zbrush:e855;file_ae:e856;file_indesign:e857;file_premiere:e858;file_maya:e859;file_e9f7:e85a;file_khronos:e85b;file_audacity:e85c;file_blender:e85d;file_lightwave:e85e;file_fbx:e85f;file_e9fd:e860;file_typedoc:e861;file_alpine:e862;file_yui:e863;file_ea01:e864;file_ea02:e865;file_ea03:e866;file_normalize:e867;file_neko:e868;file_mathjax:e869;file_leaflet:e86a;file_gdb:e86b;file_fuelux:e86c;file_eq:e86d;file_chartjs:e86e;file_ea0c:e86f;file_ea0d:e870;file_ea0e:e871;file_eslint:e872;file_d3:e873;file_cordova:e874;file_circleci:e875;file_pug:e876;file_powerbuilder:e877;file_dylib:e878;file_rexx:e879;file_svn:e87a;file_mruby:e87b;file_wercker:e87c;file_yarn:e87d;file_editorconfig:e87e;file_snyk:e87f;file_reason:e880;file_nsis:e881;file_v8:e882;file_rollup:e883;file_ea21:e884;file_ea22:e885;file_ea23:e886;file_rascal:e887;file_gn:e888;file_nodemon:e889;file_electron:e88a;file_1c_alt:e88b;file_swagger:e88c;file_bithound:e88d;file_polymer:e88e;file_platformio:e88f;file_shippable:e890;file_ea2e:e891;file_sequelize:e892;file_redux:e893;file_rspec:e894;file_phpunit:e895;file_octave:e896;file_nuclide:e897;file_infopath:e898;file_lime:e899;file_lerna:e89a;file_kitchenci:e89b;file_jest:e89c;file_jasmine:e89d;file_haxedevelop:e89e;file_gitlab:e89f;file_drone:e8a0;file_virtualbox:e8a1;file_doclets:e8a2;file_delphi:e8a3;file_codekit:e8a4;file_chef:e8a5;file_cakephp:e8a6;file_cobol:e8a7;file_bundler:e8a8;file_buck:e8a9;file_brunch:e8aa;file_aurelia:e8ab;file_vmware:e8ac;file_rhino:e8ad;file_ejs:e8ae;file_kicad:e8af;file_hoplon:e8b0;file_abif:e8b1;file_watchman:e8b2;file_p4:e8b3;file_nanoc:e8b4;file_miranda:e8b5;file_minizinc:e8b6;file_meson:e8b7;file_jison:e8b8;file_franca:e8b9;file_devicetree:e8ba;file_caddy:e8bb;file_bem:e8bc;file_bazel:e8bd;file_angelscript:e8be;file_esdoc:e8bf;file_twine:e8c0;file_squarespace:e8c1;file_phoenix:e8c2;file_test_dir:e8c3;file_webpack:e8c4;file_test_coffee:e8c5;file_test_generic:e8c6;file_test_js:e8c7;file_test_perl:e8c8;file_test_python:e8c9;file_test_react:e8ca;file_test_ruby:e8cb;file_test_ts:e8cc;file_codeship:e8cd;file_nxc:e8ce;file_brotli:e8cf;file_proselint:e8d0;file_bintray:e8d1;file_mjml:e8d2;file_wasm:e8d3;file_ea71:e8d4;file_nasm:e8d5;file_ea73:e8d6;file_peg:e8d7;file_jolie:e8d8;file_nano:e8d9;file_xamarin:e8da;file_f012:e8db;file_tag:e8dc;file_cucumber:e8dd;file_video:e8de;file_config:e8df;file_dashboard:e8e0;file_puppet:e8e1;file_terminal:e8e2;file_markdownlint:e8e3;file_react:e8e4;file_f101:e8e5;file_elm:e8e6;file_boot:e8e7;file_cljs:e8e8;file_lein:e8e9;file_docker:e8ea;file_php:e8eb;file_ionic:e8ec;file_haml:e8ed;file_f17b:e8ee;file_ff:e8ef;file_u1f3c1:e8f0;file_tern:e8f1;file_default:e8f2;file_sigils:e8f3;file_nginx:e8f4; +#weather:228 +weather_day_cloudy_gusts:e8f5;weather_day_cloudy_windy:e8f6;weather_day_cloudy:e8f7;weather_day_fog:e8f8;weather_day_hail:e8f9;weather_day_lightning:e8fa;weather_day_rain_mix:e8fb;weather_day_rain_wind:e8fc;weather_day_rain:e8fd;weather_day_showers:e8fe;weather_day_snow:e8ff;weather_day_sprinkle:e900;weather_day_sunny_overcast:e901;weather_day_sunny:e902;weather_day_storm_showers:e903;weather_day_thunderstorm:e904;weather_cloudy_gusts:e905;weather_cloudy_windy:e906;weather_cloudy:e907;weather_fog:e908;weather_hail:e909;weather_lightning:e90a;weather_rain_mix:e90b;weather_rain_wind:e90c;weather_rain:e90d;weather_showers:e90e;weather_snow:e90f;weather_sprinkle:e910;weather_storm_showers:e911;weather_thunderstorm:e912;weather_windy:e913;weather_night_alt_cloudy_gusts:e914;weather_night_alt_cloudy_windy:e915;weather_night_alt_hail:e916;weather_night_alt_lightning:e917;weather_night_alt_rain_mix:e918;weather_night_alt_rain_wind:e919;weather_night_alt_rain:e91a;weather_night_alt_showers:e91b;weather_night_alt_snow:e91c;weather_night_alt_sprinkle:e91d;weather_night_alt_storm_showers:e91e;weather_night_alt_thunderstorm:e91f;weather_night_clear:e920;weather_night_cloudy_gusts:e921;weather_night_cloudy_windy:e922;weather_night_cloudy:e923;weather_night_hail:e924;weather_night_lightning:e925;weather_night_rain_mix:e926;weather_night_rain_wind:e927;weather_night_rain:e928;weather_night_showers:e929;weather_night_snow:e92a;weather_night_sprinkle:e92b;weather_night_storm_showers:e92c;weather_night_thunderstorm:e92d;weather_celsius:e92e;weather_cloud_down:e92f;weather_cloud_refresh:e930;weather_cloud_up:e931;weather_cloud:e932;weather_degrees:e933;weather_direction_down_left:e934;weather_direction_down:e935;weather_fahrenheit:e936;weather_horizon_alt:e937;weather_horizon:e938;weather_direction_left:e939;weather_f049:e93a;weather_night_fog:e93b;weather_refresh_alt:e93c;weather_refresh:e93d;weather_direction_right:e93e;weather_raindrops:e93f;weather_strong_wind:e940;weather_sunrise:e941;weather_sunset:e942;weather_thermometer_exterior:e943;weather_thermometer_internal:e944;weather_thermometer:e945;weather_tornado:e946;weather_direction_up_right:e947;weather_direction_up:e948;weather_f059:e949;weather_f05a:e94a;weather_f05b:e94b;weather_f05c:e94c;weather_f05d:e94d;weather_f05e:e94e;weather_f060:e94f;weather_f061:e950;weather_smoke:e951;weather_dust:e952;weather_snow_wind:e953;weather_day_snow_wind:e954;weather_night_snow_wind:e955;weather_night_alt_snow_wind:e956;weather_day_sleet_storm:e957;weather_night_sleet_storm:e958;weather_night_alt_sleet_storm:e959;weather_day_snow_thunderstorm:e95a;weather_night_snow_thunderstorm:e95b;weather_night_alt_snow_thunderstorm:e95c;weather_solar_eclipse:e95d;weather_lunar_eclipse:e95e;weather_meteor:e95f;weather_hot:e960;weather_hurricane:e961;weather_smog:e962;weather_alien:e963;weather_snowflake_cold:e964;weather_stars:e965;weather_raindrop:e966;weather_barometer:e967;weather_humidity:e968;weather_na:e969;weather_flood:e96a;weather_day_cloudy_high:e96b;weather_night_alt_cloudy_high:e96c;weather_night_cloudy_high:e96d;weather_night_alt_partly_cloudy:e96e;weather_sandstorm:e96f;weather_night_partly_cloudy:e970;weather_umbrella:e971;weather_day_windy:e972;weather_night_alt_cloudy:e973;weather_direction_up_left:e974;weather_direction_down_right:e975;weather_time_12:e976;weather_time_1:e977;weather_time_2:e978;weather_time_3:e979;weather_time_4:e97a;weather_time_5:e97b;weather_time_6:e97c;weather_time_7:e97d;weather_time_8:e97e;weather_time_9:e97f;weather_time_10:e980;weather_time_11:e981;weather_moon_new:e982;weather_moon_waxing_crescent_1:e983;weather_moon_waxing_crescent_2:e984;weather_moon_waxing_crescent_3:e985;weather_moon_waxing_crescent_4:e986;weather_moon_waxing_crescent_5:e987;weather_moon_waxing_crescent_6:e988;weather_moon_first_quarter:e989;weather_moon_waxing_gibbous_1:e98a;weather_moon_waxing_gibbous_2:e98b;weather_moon_waxing_gibbous_3:e98c;weather_moon_waxing_gibbous_4:e98d;weather_moon_waxing_gibbous_5:e98e;weather_moon_waxing_gibbous_6:e98f;weather_moon_full:e990;weather_moon_waning_gibbous_1:e991;weather_moon_waning_gibbous_2:e992;weather_moon_waning_gibbous_3:e993;weather_moon_waning_gibbous_4:e994;weather_moon_waning_gibbous_5:e995;weather_moon_waning_gibbous_6:e996;weather_moon_third_quarter:e997;weather_moon_waning_crescent_1:e998;weather_moon_waning_crescent_2:e999;weather_moon_waning_crescent_3:e99a;weather_moon_waning_crescent_4:e99b;weather_moon_waning_crescent_5:e99c;weather_moon_waning_crescent_6:e99d;weather_wind_direction:e99e;weather_day_sleet:e99f;weather_night_sleet:e9a0;weather_night_alt_sleet:e9a1;weather_sleet:e9a2;weather_day_haze:e9a3;weather_wind_beaufort_0:e9a4;weather_wind_beaufort_1:e9a5;weather_wind_beaufort_2:e9a6;weather_wind_beaufort_3:e9a7;weather_wind_beaufort_4:e9a8;weather_wind_beaufort_5:e9a9;weather_wind_beaufort_6:e9aa;weather_wind_beaufort_7:e9ab;weather_wind_beaufort_8:e9ac;weather_wind_beaufort_9:e9ad;weather_wind_beaufort_10:e9ae;weather_wind_beaufort_11:e9af;weather_wind_beaufort_12:e9b0;weather_day_light_wind:e9b1;weather_tsunami:e9b2;weather_earthquake:e9b3;weather_fire:e9b4;weather_volcano:e9b5;weather_moonrise:e9b6;weather_moonset:e9b7;weather_train:e9b8;weather_small_craft_advisory:e9b9;weather_gale_warning:e9ba;weather_storm_warning:e9bb;weather_hurricane_warning:e9bc;weather_moon_alt_waxing_crescent_1:e9bd;weather_moon_alt_waxing_crescent_2:e9be;weather_moon_alt_waxing_crescent_3:e9bf;weather_moon_alt_waxing_crescent_4:e9c0;weather_moon_alt_waxing_crescent_5:e9c1;weather_moon_alt_waxing_crescent_6:e9c2;weather_moon_alt_first_quarter:e9c3;weather_moon_alt_waxing_gibbous_1:e9c4;weather_moon_alt_waxing_gibbous_2:e9c5;weather_moon_alt_waxing_gibbous_3:e9c6;weather_moon_alt_waxing_gibbous_4:e9c7;weather_moon_alt_waxing_gibbous_5:e9c8;weather_moon_alt_waxing_gibbous_6:e9c9;weather_moon_alt_full:e9ca;weather_moon_alt_waning_gibbous_1:e9cb;weather_moon_alt_waning_gibbous_2:e9cc;weather_moon_alt_waning_gibbous_3:e9cd;weather_moon_alt_waning_gibbous_4:e9ce;weather_moon_alt_waning_gibbous_5:e9cf;weather_moon_alt_waning_gibbous_6:e9d0;weather_moon_alt_third_quarter:e9d1;weather_moon_alt_waning_crescent_1:e9d2;weather_moon_alt_waning_crescent_2:e9d3;weather_moon_alt_waning_crescent_3:e9d4;weather_moon_alt_waning_crescent_4:e9d5;weather_moon_alt_waning_crescent_5:e9d6;weather_moon_alt_waning_crescent_6:e9d7;weather_moon_alt_new:e9d8; +#linux:28 +linux_archlinux:e9d9;linux_centos:e9da;linux_debian:e9db;linux_fedora:e9dc;linux_linuxmint:e9dd;linux_linuxmint_inverse:e9de;linux_mageia:e9df;linux_mandriva:e9e0;linux_opensuse:e9e1;linux_redhat:e9e2;linux_slackware:e9e3;linux_slackware_inverse:e9e4;linux_ubuntu:e9e5;linux_ubuntu_inverse:e9e6;linux_freebsd:e9e7;linux_coreos:e9e8;linux_gentoo:e9e9;linux_elementary:e9ea;linux_fedora_inverse:e9eb;linux_sabayon:e9ec;linux_aosc:e9ed;linux_nixos:e9ee;linux_tux:e9ef;linux_raspberry_pi:e9f0;linux_manjaro:e9f1;linux_apple:e9f2;linux_docker:e9f3;linux_alpine:e9f4; +#myicons:18 +myicons_0001:e9f5;myicons_0002:e9f6;myicons_0003:e9f7;myicons_0004:e9f8;myicons_0005:e9f9;myicons_0006:e9fa;myicons_0007:e9fb;myicons_0008:e9fc;myicons_0009:e9fd;myicons_000a:e9fe;myicons_000b:e9ff;myicons_000d:ea00;myicons_000e:ea01;myicons_0010:ea02;myicons_0011:ea03;myicons_0013:ea04;myicons_0014:ea05;myicons_arch_linux_arrow:ea06; +#devicons:198 +dev_bing_small:ea07;dev_css_tricks:ea08;dev_git:ea09;dev_bitbucket:ea0a;dev_mysql:ea0b;dev_streamline:ea0c;dev_database:ea0d;dev_dropbox:ea0e;dev_github_alt:ea0f;dev_github_badge:ea10;dev_github:ea11;dev_wordpress:ea12;dev_visualstudio:ea13;dev_jekyll_small:ea14;dev_android:ea15;dev_windows:ea16;dev_stackoverflow:ea17;dev_apple:ea18;dev_linux:ea19;dev_appstore:ea1a;dev_ghost_small:ea1b;dev_yahoo:ea1c;dev_codepen:ea1d;dev_github_full:ea1e;dev_nodejs_small:ea1f;dev_nodejs:ea20;dev_hackernews:ea21;dev_ember:ea22;dev_dojo:ea23;dev_django:ea24;dev_npm:ea25;dev_ghost:ea26;dev_modernizr:ea27;dev_unity_small:ea28;dev_raspberry_pi:ea29;dev_blackberry:ea2a;dev_go:ea2b;dev_git_branch:ea2c;dev_git_pull_request:ea2d;dev_git_merge:ea2e;dev_git_compare:ea2f;dev_git_commit:ea30;dev_cssdeck:ea31;dev_yahoo_small:ea32;dev_techcrunch:ea33;dev_smashing_magazine:ea34;dev_netmagazine:ea35;dev_codrops:ea36;dev_phonegap:ea37;dev_google_drive:ea38;dev_html5_multimedia:ea39;dev_html5_device_access:ea3a;dev_html5_connectivity:ea3b;dev_html5_3d_effects:ea3c;dev_html5:ea3d;dev_scala:ea3e;dev_java:ea3f;dev_ruby:ea40;dev_ubuntu:ea41;dev_ruby_on_rails:ea42;dev_python:ea43;dev_php:ea44;dev_markdown:ea45;dev_laravel:ea46;dev_magento:ea47;dev_joomla:ea48;dev_drupal:ea49;dev_chrome:ea4a;dev_ie:ea4b;dev_firefox:ea4c;dev_opera:ea4d;dev_bootstrap:ea4e;dev_safari:ea4f;dev_css3:ea50;dev_css3_full:ea51;dev_sass:ea52;dev_grunt:ea53;dev_bower:ea54;dev_javascript:ea55;dev_javascript_shield:ea56;dev_jquery:ea57;dev_coffeescript:ea58;dev_backbone:ea59;dev_angular:ea5a;dev_jquery_ui:ea5b;dev_swift:ea5c;dev_symfony:ea5d;dev_symfony_badge:ea5e;dev_less:ea5f;dev_stylus:ea60;dev_trello:ea61;dev_atlassian:ea62;dev_jira:ea63;dev_envato:ea64;dev_snap_svg:ea65;dev_raphael:ea66;dev_google_analytics:ea67;dev_compass:ea68;dev_onedrive:ea69;dev_gulp:ea6a;dev_atom:ea6b;dev_cisco:ea6c;dev_nancy:ea6d;dev_jenkins:ea6e;dev_clojure:ea6f;dev_perl:ea70;dev_clojure_alt:ea71;dev_celluloid:ea72;dev_w3c:ea73;dev_redis:ea74;dev_postgresql:ea75;dev_webplatform:ea76;dev_requirejs:ea77;dev_opensource:ea78;dev_typo3:ea79;dev_uikit:ea7a;dev_doctrine:ea7b;dev_groovy:ea7c;dev_nginx:ea7d;dev_haskell:ea7e;dev_zend:ea7f;dev_gnu:ea80;dev_yeoman:ea81;dev_heroku:ea82;dev_msql_server:ea83;dev_debian:ea84;dev_travis:ea85;dev_dotnet:ea86;dev_codeigniter:ea87;dev_javascript_badge:ea88;dev_yii:ea89;dev_composer:ea8a;dev_krakenjs_badge:ea8b;dev_krakenjs:ea8c;dev_mozilla:ea8d;dev_firebase:ea8e;dev_sizzlejs:ea8f;dev_creativecommons:ea90;dev_creativecommons_badge:ea91;dev_mitlicence:ea92;dev_senchatouch:ea93;dev_bugsense:ea94;dev_extjs:ea95;dev_mootools_badge:ea96;dev_mootools:ea97;dev_ruby_rough:ea98;dev_komodo:ea99;dev_coda:ea9a;dev_bintray:ea9b;dev_terminal:ea9c;dev_code:ea9d;dev_responsive:ea9e;dev_dart:ea9f;dev_aptana:eaa0;dev_mailchimp:eaa1;dev_netbeans:eaa2;dev_dreamweaver:eaa3;dev_brackets:eaa4;dev_eclipse:eaa5;dev_cloud9:eaa6;dev_scrum:eaa7;dev_prolog:eaa8;dev_terminal_badge:eaa9;dev_code_badge:eaaa;dev_mongodb:eaab;dev_meteor:eaac;dev_meteorfull:eaad;dev_fsharp:eaae;dev_rust:eaaf;dev_ionic:eab0;dev_sublime:eab1;dev_appcelerator:eab2;dev_asterisk:eab3;dev_aws:eab4;dev_digital_ocean:eab5;dev_dlang:eab6;dev_docker:eab7;dev_erlang:eab8;dev_google_cloud_platform:eab9;dev_grails:eaba;dev_illustrator:eabb;dev_intellij:eabc;dev_materializecss:eabd;dev_openshift:eabe;dev_photoshop:eabf;dev_rackspace:eac0;dev_react:eac1;dev_redhat:eac2;dev_scriptcs:eac3;dev_e6bd:eac4;dev_e6be:eac5;dev_e6bf:eac6;dev_e6c0:eac7;dev_e6c1:eac8;dev_e6c2:eac9;dev_e6c3:eaca;dev_sqllite:eacb;dev_vim:eacc; +#pomicons:11 +pom_clean_code:eacd;pom_pomodoro_done:eace;pom_pomodoro_estimated:eacf;pom_pomodoro_ticking:ead0;pom_pomodoro_squashed:ead1;pom_short_pause:ead2;pom_long_pause:ead3;pom_away:ead4;pom_pair_programming:ead5;pom_internal_interruption:ead6;pom_external_interruption:ead7; +#linea-arrows:136 +linea_arrows_anticlockwise:ead8;linea_arrows_anticlockwise_dashed:ead9;linea_arrows_button_down:eada;linea_arrows_button_off:eadb;linea_arrows_button_on:eadc;linea_arrows_button_up:eadd;linea_arrows_check:eade;linea_arrows_circle_check:eadf;linea_arrows_circle_down:eae0;linea_arrows_circle_downleft:eae1;linea_arrows_circle_downright:eae2;linea_arrows_circle_left:eae3;linea_arrows_circle_minus:eae4;linea_arrows_circle_plus:eae5;linea_arrows_circle_remove:eae6;linea_arrows_circle_right:eae7;linea_arrows_circle_up:eae8;linea_arrows_circle_upleft:eae9;linea_arrows_circle_upright:eaea;linea_arrows_clockwise:eaeb;linea_arrows_clockwise_dashed:eaec;linea_arrows_compress:eaed;linea_arrows_deny:eaee;linea_arrows_diagonal:eaef;linea_arrows_diagonal2:eaf0;linea_arrows_down:eaf1;linea_arrows_down_double:eaf2;linea_arrows_downleft:eaf3;linea_arrows_downright:eaf4;linea_arrows_drag_down:eaf5;linea_arrows_drag_down_dashed:eaf6;linea_arrows_drag_horiz:eaf7;linea_arrows_drag_left:eaf8;linea_arrows_drag_left_dashed:eaf9;linea_arrows_drag_right:eafa;linea_arrows_drag_right_dashed:eafb;linea_arrows_drag_up:eafc;linea_arrows_drag_up_dashed:eafd;linea_arrows_drag_vert:eafe;linea_arrows_exclamation:eaff;linea_arrows_expand:eb00;linea_arrows_expand_diagonal1:eb01;linea_arrows_expand_horizontal1:eb02;linea_arrows_expand_vertical1:eb03;linea_arrows_fit_horizontal:eb04;linea_arrows_fit_vertical:eb05;linea_arrows_glide:eb06;linea_arrows_glide_horizontal:eb07;linea_arrows_glide_vertical:eb08;linea_arrows_hamburger1:eb09;linea_arrows_hamburger_2:eb0a;linea_arrows_horizontal:eb0b;linea_arrows_info:eb0c;linea_arrows_keyboard_alt:eb0d;linea_arrows_keyboard_cmd:eb0e;linea_arrows_keyboard_delete:eb0f;linea_arrows_keyboard_down:eb10;linea_arrows_keyboard_left:eb11;linea_arrows_keyboard_return:eb12;linea_arrows_keyboard_right:eb13;linea_arrows_keyboard_shift:eb14;linea_arrows_keyboard_tab:eb15;linea_arrows_keyboard_up:eb16;linea_arrows_left:eb17;linea_arrows_left_double_32:eb18;linea_arrows_minus:eb19;linea_arrows_move:eb1a;linea_arrows_move2:eb1b;linea_arrows_move_bottom:eb1c;linea_arrows_move_left:eb1d;linea_arrows_move_right:eb1e;linea_arrows_move_top:eb1f;linea_arrows_plus:eb20;linea_arrows_question:eb21;linea_arrows_remove:eb22;linea_arrows_right:eb23;linea_arrows_right_double:eb24;linea_arrows_rotate:eb25;linea_arrows_rotate_anti:eb26;linea_arrows_rotate_anti_dashed:eb27;linea_arrows_rotate_dashed:eb28;linea_arrows_shrink:eb29;linea_arrows_shrink_diagonal1:eb2a;linea_arrows_shrink_diagonal2:eb2b;linea_arrows_shrink_horizonal2:eb2c;linea_arrows_shrink_horizontal1:eb2d;linea_arrows_shrink_vertical1:eb2e;linea_arrows_shrink_vertical2:eb2f;linea_arrows_sign_down:eb30;linea_arrows_sign_left:eb31;linea_arrows_sign_right:eb32;linea_arrows_sign_up:eb33;linea_arrows_slide_down1:eb34;linea_arrows_slide_down2:eb35;linea_arrows_slide_left1:eb36;linea_arrows_slide_left2:eb37;linea_arrows_slide_right1:eb38;linea_arrows_slide_right2:eb39;linea_arrows_slide_up1:eb3a;linea_arrows_slide_up2:eb3b;linea_arrows_slim_down:eb3c;linea_arrows_slim_down_dashed:eb3d;linea_arrows_slim_left:eb3e;linea_arrows_slim_left_dashed:eb3f;linea_arrows_slim_right:eb40;linea_arrows_slim_right_dashed:eb41;linea_arrows_slim_up:eb42;linea_arrows_slim_up_dashed:eb43;linea_arrows_square_check:eb44;linea_arrows_square_down:eb45;linea_arrows_square_downleft:eb46;linea_arrows_square_downright:eb47;linea_arrows_square_left:eb48;linea_arrows_square_minus:eb49;linea_arrows_square_plus:eb4a;linea_arrows_square_remove:eb4b;linea_arrows_square_right:eb4c;linea_arrows_square_up:eb4d;linea_arrows_square_upleft:eb4e;linea_arrows_square_upright:eb4f;linea_arrows_squares:eb50;linea_arrows_stretch_diagonal1:eb51;linea_arrows_stretch_diagonal2:eb52;linea_arrows_stretch_diagonal3:eb53;linea_arrows_stretch_diagonal4:eb54;linea_arrows_stretch_horizontal1:eb55;linea_arrows_stretch_horizontal2:eb56;linea_arrows_stretch_vertical1:eb57;linea_arrows_stretch_vertical2:eb58;linea_arrows_switch_horizontal:eb59;linea_arrows_switch_vertical:eb5a;linea_arrows_up:eb5b;linea_arrows_up_double_33:eb5c;linea_arrows_upleft:eb5d;linea_arrows_upright:eb5e;linea_arrows_vertical:eb5f; +#linea-basic:135 +linea_basic_lock_open:eb60;linea_basic_magic_mouse:eb61;linea_basic_magnifier:eb62;linea_basic_magnifier_minus:eb63;linea_basic_magnifier_plus:eb64;linea_basic_mail:eb65;linea_basic_mail_multiple:eb66;linea_basic_mail_open:eb67;linea_basic_mail_open_text:eb68;linea_basic_male:eb69;linea_basic_map:eb6a;linea_basic_message:eb6b;linea_basic_message_multiple:eb6c;linea_basic_message_txt:eb6d;linea_basic_mixer2:eb6e;linea_basic_info:eb6f;linea_basic_ipod:eb70;linea_basic_joypad:eb71;linea_basic_key:eb72;linea_basic_keyboard:eb73;linea_basic_laptop:eb74;linea_basic_life_buoy:eb75;linea_basic_lightbulb:eb76;linea_basic_link:eb77;linea_basic_lock:eb78;linea_basic_mouse:eb79;linea_basic_notebook:eb7a;linea_basic_notebook_pen:eb7b;linea_basic_notebook_pencil:eb7c;linea_basic_paperplane:eb7d;linea_basic_pencil_ruler:eb7e;linea_basic_pencil_ruler_pen:eb7f;linea_basic_clubs:eb80;linea_basic_compass:eb81;linea_basic_cup:eb82;linea_basic_diamonds:eb83;linea_basic_display:eb84;linea_basic_download:eb85;linea_basic_exclamation:eb86;linea_basic_eye:eb87;linea_basic_eye_closed:eb88;linea_basic_female:eb89;linea_basic_flag1:eb8a;linea_basic_flag2:eb8b;linea_basic_floppydisk:eb8c;linea_basic_folder:eb8d;linea_basic_folder_multiple:eb8e;linea_basic_gear:eb8f;linea_basic_geolocalize_01:eb90;linea_basic_geolocalize_05:eb91;linea_basic_globe:eb92;linea_basic_gunsight:eb93;linea_basic_hammer:eb94;linea_basic_headset:eb95;linea_basic_heart:eb96;linea_basic_heart_broken:eb97;linea_basic_helm:eb98;linea_basic_home:eb99;linea_basic_photo:eb9a;linea_basic_rss:eb9b;linea_basic_picture:eb9c;linea_basic_picture_multiple:eb9d;linea_basic_pin1:eb9e;linea_basic_pin2:eb9f;linea_basic_accelerator:eba0;linea_basic_alarm:eba1;linea_basic_anchor:eba2;linea_basic_anticlockwise:eba3;linea_basic_archive:eba4;linea_basic_archive_full:eba5;linea_basic_ban:eba6;linea_basic_battery_charge:eba7;linea_basic_battery_empty:eba8;linea_basic_battery_full:eba9;linea_basic_battery_half:ebaa;linea_basic_bolt:ebab;linea_basic_book:ebac;linea_basic_book_pen:ebad;linea_basic_book_pencil:ebae;linea_basic_bookmark:ebaf;linea_basic_calculator:ebb0;linea_basic_calendar:ebb1;linea_basic_cards_diamonds:ebb2;linea_basic_cards_hearts:ebb3;linea_basic_case:ebb4;linea_basic_chronometer:ebb5;linea_basic_clessidre:ebb6;linea_basic_clock:ebb7;linea_basic_clockwise:ebb8;linea_basic_cloud:ebb9;linea_basic_postcard:ebba;linea_basic_postcard_multiple:ebbb;linea_basic_printer:ebbc;linea_basic_question:ebbd;linea_basic_server:ebbe;linea_basic_server2:ebbf;linea_basic_server_cloud:ebc0;linea_basic_server_download:ebc1;linea_basic_server_upload:ebc2;linea_basic_settings:ebc3;linea_basic_share:ebc4;linea_basic_sheet:ebc5;linea_basic_sheet_multiple:ebc6;linea_basic_sheet_pen:ebc7;linea_basic_sheet_pencil:ebc8;linea_basic_sheet_txt:ebc9;linea_basic_signs:ebca;linea_basic_smartphone:ebcb;linea_basic_spades:ebcc;linea_basic_spread:ebcd;linea_basic_spread_bookmark:ebce;linea_basic_spread_text:ebcf;linea_basic_spread_text_bookmark:ebd0;linea_basic_star:ebd1;linea_basic_tablet:ebd2;linea_basic_target:ebd3;linea_basic_todo:ebd4;linea_basic_todo_pen:ebd5;linea_basic_todo_pencil:ebd6;linea_basic_todo_txt:ebd7;linea_basic_todolist_pen:ebd8;linea_basic_todolist_pencil:ebd9;linea_basic_trashcan:ebda;linea_basic_trashcan_full:ebdb;linea_basic_trashcan_refresh:ebdc;linea_basic_trashcan_remove:ebdd;linea_basic_upload:ebde;linea_basic_usb:ebdf;linea_basic_video:ebe0;linea_basic_watch:ebe1;linea_basic_webpage:ebe2;linea_basic_webpage_img_txt:ebe3;linea_basic_webpage_multiple:ebe4;linea_basic_webpage_txt:ebe5;linea_basic_world:ebe6; +#linea-basic-elaboration:145 +linea_elaboration_document_previous:ebe7;linea_elaboration_document_refresh:ebe8;linea_elaboration_document_remove:ebe9;linea_elaboration_document_search:ebea;linea_elaboration_document_star:ebeb;linea_elaboration_document_upload:ebec;linea_elaboration_folder_check:ebed;linea_elaboration_folder_cloud:ebee;linea_elaboration_folder_document:ebef;linea_elaboration_folder_download:ebf0;linea_elaboration_folder_flagged:ebf1;linea_elaboration_folder_graph:ebf2;linea_elaboration_folder_heart:ebf3;linea_elaboration_folder_minus:ebf4;linea_elaboration_folder_next:ebf5;linea_elaboration_document_flagged:ebf6;linea_elaboration_document_graph:ebf7;linea_elaboration_document_heart:ebf8;linea_elaboration_document_minus:ebf9;linea_elaboration_document_next:ebfa;linea_elaboration_document_noaccess:ebfb;linea_elaboration_document_note:ebfc;linea_elaboration_document_pencil:ebfd;linea_elaboration_document_picture:ebfe;linea_elaboration_document_plus:ebff;linea_elaboration_folder_noaccess:ec00;linea_elaboration_folder_note:ec01;linea_elaboration_folder_pencil:ec02;linea_elaboration_folder_picture:ec03;linea_elaboration_folder_plus:ec04;linea_elaboration_folder_previous:ec05;linea_elaboration_folder_refresh:ec06;linea_elaboration_calendar_empty:ec07;linea_elaboration_calendar_flagged:ec08;linea_elaboration_calendar_heart:ec09;linea_elaboration_calendar_minus:ec0a;linea_elaboration_calendar_next:ec0b;linea_elaboration_calendar_noaccess:ec0c;linea_elaboration_calendar_pencil:ec0d;linea_elaboration_calendar_plus:ec0e;linea_elaboration_calendar_previous:ec0f;linea_elaboration_calendar_refresh:ec10;linea_elaboration_calendar_remove:ec11;linea_elaboration_calendar_search:ec12;linea_elaboration_calendar_star:ec13;linea_elaboration_calendar_upload:ec14;linea_elaboration_cloud_check:ec15;linea_elaboration_cloud_download:ec16;linea_elaboration_cloud_minus:ec17;linea_elaboration_cloud_noaccess:ec18;linea_elaboration_cloud_plus:ec19;linea_elaboration_cloud_refresh:ec1a;linea_elaboration_cloud_remove:ec1b;linea_elaboration_cloud_search:ec1c;linea_elaboration_cloud_upload:ec1d;linea_elaboration_document_check:ec1e;linea_elaboration_document_cloud:ec1f;linea_elaboration_document_download:ec20;linea_elaboration_folder_remove:ec21;linea_elaboration_mail_heart:ec22;linea_elaboration_folder_search:ec23;linea_elaboration_folder_star:ec24;linea_elaboration_folder_upload:ec25;linea_elaboration_mail_check:ec26;linea_elaboration_bookmark_checck:ec27;linea_elaboration_bookmark_minus:ec28;linea_elaboration_bookmark_plus:ec29;linea_elaboration_bookmark_remove:ec2a;linea_elaboration_briefcase_check:ec2b;linea_elaboration_briefcase_download:ec2c;linea_elaboration_briefcase_flagged:ec2d;linea_elaboration_briefcase_minus:ec2e;linea_elaboration_briefcase_plus:ec2f;linea_elaboration_briefcase_refresh:ec30;linea_elaboration_briefcase_remove:ec31;linea_elaboration_briefcase_search:ec32;linea_elaboration_briefcase_star:ec33;linea_elaboration_briefcase_upload:ec34;linea_elaboration_browser_check:ec35;linea_elaboration_browser_download:ec36;linea_elaboration_browser_minus:ec37;linea_elaboration_browser_plus:ec38;linea_elaboration_browser_refresh:ec39;linea_elaboration_browser_remove:ec3a;linea_elaboration_browser_search:ec3b;linea_elaboration_browser_star:ec3c;linea_elaboration_browser_upload:ec3d;linea_elaboration_calendar_check:ec3e;linea_elaboration_calendar_cloud:ec3f;linea_elaboration_calendar_download:ec40;linea_elaboration_mail_cloud:ec41;linea_elaboration_mail_document:ec42;linea_elaboration_mail_download:ec43;linea_elaboration_mail_flagged:ec44;linea_elaboration_mail_next:ec45;linea_elaboration_mail_noaccess:ec46;linea_elaboration_mail_note:ec47;linea_elaboration_mail_pencil:ec48;linea_elaboration_mail_picture:ec49;linea_elaboration_mail_previous:ec4a;linea_elaboration_mail_refresh:ec4b;linea_elaboration_mail_remove:ec4c;linea_elaboration_mail_search:ec4d;linea_elaboration_mail_star:ec4e;linea_elaboration_mail_upload:ec4f;linea_elaboration_message_check:ec50;linea_elaboration_message_dots:ec51;linea_elaboration_message_happy:ec52;linea_elaboration_message_heart:ec53;linea_elaboration_message_minus:ec54;linea_elaboration_message_note:ec55;linea_elaboration_message_plus:ec56;linea_elaboration_message_refresh:ec57;linea_elaboration_message_remove:ec58;linea_elaboration_message_sad:ec59;linea_elaboration_smartphone_cloud:ec5a;linea_elaboration_smartphone_heart:ec5b;linea_elaboration_smartphone_noaccess:ec5c;linea_elaboration_smartphone_note:ec5d;linea_elaboration_smartphone_pencil:ec5e;linea_elaboration_smartphone_picture:ec5f;linea_elaboration_smartphone_refresh:ec60;linea_elaboration_smartphone_search:ec61;linea_elaboration_tablet_cloud:ec62;linea_elaboration_tablet_heart:ec63;linea_elaboration_tablet_noaccess:ec64;linea_elaboration_tablet_note:ec65;linea_elaboration_tablet_pencil:ec66;linea_elaboration_tablet_picture:ec67;linea_elaboration_tablet_refresh:ec68;linea_elaboration_tablet_search:ec69;linea_elaboration_todolist_2:ec6a;linea_elaboration_todolist_check:ec6b;linea_elaboration_todolist_cloud:ec6c;linea_elaboration_todolist_download:ec6d;linea_elaboration_todolist_flagged:ec6e;linea_elaboration_todolist_minus:ec6f;linea_elaboration_todolist_noaccess:ec70;linea_elaboration_todolist_pencil:ec71;linea_elaboration_todolist_plus:ec72;linea_elaboration_todolist_refresh:ec73;linea_elaboration_todolist_remove:ec74;linea_elaboration_todolist_search:ec75;linea_elaboration_todolist_star:ec76;linea_elaboration_todolist_upload:ec77; +#linea-ecommerce:85 +linea_ecommerce_receipt_kips:ec78;linea_ecommerce_receipt_lira:ec79;linea_ecommerce_receipt_naira:ec7a;linea_ecommerce_receipt_pesos:ec7b;linea_ecommerce_receipt_pound:ec7c;linea_ecommerce_receipt_rublo:ec7d;linea_ecommerce_receipt_rupee:ec7e;linea_ecommerce_receipt_tugrik:ec7f;linea_ecommerce_receipt_won:ec80;linea_ecommerce_receipt_yen:ec81;linea_ecommerce_receipt_yen2:ec82;linea_ecommerce_recept_colon:ec83;linea_ecommerce_rublo:ec84;linea_ecommerce_rupee:ec85;linea_ecommerce_safe:ec86;linea_ecommerce_naira:ec87;linea_ecommerce_pesos:ec88;linea_ecommerce_pound:ec89;linea_ecommerce_receipt:ec8a;linea_ecommerce_receipt_bath:ec8b;linea_ecommerce_receipt_cent:ec8c;linea_ecommerce_receipt_dollar:ec8d;linea_ecommerce_receipt_euro:ec8e;linea_ecommerce_receipt_franc:ec8f;linea_ecommerce_receipt_guarani:ec90;linea_ecommerce_sale:ec91;linea_ecommerce_sales:ec92;linea_ecommerce_ticket:ec93;linea_ecommerce_tugriks:ec94;linea_ecommerce_wallet:ec95;linea_ecommerce_won:ec96;linea_ecommerce_yen:ec97;linea_ecommerce_cart_content:ec98;linea_ecommerce_cart_download:ec99;linea_ecommerce_cart_minus:ec9a;linea_ecommerce_cart_plus:ec9b;linea_ecommerce_cart_refresh:ec9c;linea_ecommerce_cart_remove:ec9d;linea_ecommerce_cart_search:ec9e;linea_ecommerce_cart_upload:ec9f;linea_ecommerce_cent:eca0;linea_ecommerce_colon:eca1;linea_ecommerce_creditcard:eca2;linea_ecommerce_diamond:eca3;linea_ecommerce_dollar:eca4;linea_ecommerce_euro:eca5;linea_ecommerce_franc:eca6;linea_ecommerce_gift:eca7;linea_ecommerce_graph1:eca8;linea_ecommerce_graph2:eca9;linea_ecommerce_graph3:ecaa;linea_ecommerce_graph_decrease:ecab;linea_ecommerce_graph_increase:ecac;linea_ecommerce_guarani:ecad;linea_ecommerce_kips:ecae;linea_ecommerce_lira:ecaf;linea_ecommerce_megaphone:ecb0;linea_ecommerce_money:ecb1;linea_ecommerce_yen2:ecb2;linea_ecommerce_bag:ecb3;linea_ecommerce_bag_check:ecb4;linea_ecommerce_bag_cloud:ecb5;linea_ecommerce_bag_download:ecb6;linea_ecommerce_bag_minus:ecb7;linea_ecommerce_bag_plus:ecb8;linea_ecommerce_bag_refresh:ecb9;linea_ecommerce_bag_remove:ecba;linea_ecommerce_bag_search:ecbb;linea_ecommerce_bag_upload:ecbc;linea_ecommerce_banknote:ecbd;linea_ecommerce_banknotes:ecbe;linea_ecommerce_basket:ecbf;linea_ecommerce_basket_check:ecc0;linea_ecommerce_basket_cloud:ecc1;linea_ecommerce_basket_download:ecc2;linea_ecommerce_basket_minus:ecc3;linea_ecommerce_basket_plus:ecc4;linea_ecommerce_basket_refresh:ecc5;linea_ecommerce_basket_remove:ecc6;linea_ecommerce_basket_search:ecc7;linea_ecommerce_basket_upload:ecc8;linea_ecommerce_bath:ecc9;linea_ecommerce_cart:ecca;linea_ecommerce_cart_check:eccb;linea_ecommerce_cart_cloud:eccc; +#linea-music:30 +linea_music_stop_button:eccd;linea_music_tape:ecce;linea_music_volume_down:eccf;linea_music_volume_up:ecd0;linea_music_beginning_button:ecd1;linea_music_bell:ecd2;linea_music_cd:ecd3;linea_music_diapason:ecd4;linea_music_eject_button:ecd5;linea_music_end_button:ecd6;linea_music_fastforward_button:ecd7;linea_music_headphones:ecd8;linea_music_ipod:ecd9;linea_music_loudspeaker:ecda;linea_music_microphone:ecdb;linea_music_microphone_old:ecdc;linea_music_mixer:ecdd;linea_music_mute:ecde;linea_music_note_multiple:ecdf;linea_music_note_single:ece0;linea_music_pause_button:ece1;linea_music_play_button:ece2;linea_music_playlist:ece3;linea_music_radio_ghettoblaster:ece4;linea_music_radio_portable:ece5;linea_music_record:ece6;linea_music_recordplayer:ece7;linea_music_repeat_button:ece8;linea_music_rewind_button:ece9;linea_music_shuffle_button:ecea; +#linea-software:100 +linea_software_paragraph_justify_center:eceb;linea_software_paragraph_justify_left:ecec;linea_software_paragraph_justify_right:eced;linea_software_paragraph_space_after:ecee;linea_software_paragraph_space_before:ecef;linea_software_pathfinder_exclude:ecf0;linea_software_pathfinder_intersect:ecf1;linea_software_pathfinder_subtract:ecf2;linea_software_pathfinder_unite:ecf3;linea_software_pen:ecf4;linea_software_pen_add:ecf5;linea_software_pen_remove:ecf6;linea_software_pencil:ecf7;linea_software_polygonallasso:ecf8;linea_software_reflect_horizontal:ecf9;linea_software_magnete:ecfa;linea_software_pages:ecfb;linea_software_paintbrush:ecfc;linea_software_paintbucket:ecfd;linea_software_paintroller:ecfe;linea_software_paragraph:ecff;linea_software_paragraph_align_left:ed00;linea_software_paragraph_align_right:ed01;linea_software_paragraph_center:ed02;linea_software_paragraph_justify_all:ed03;linea_software_reflect_vertical:ed04;linea_software_remove_vectorpoint:ed05;linea_software_scale_expand:ed06;linea_software_scale_reduce:ed07;linea_software_selection_oval:ed08;linea_software_selection_polygon:ed09;linea_software_selection_rectangle:ed0a;linea_software_indent_firstline:ed0b;linea_software_indent_left:ed0c;linea_software_indent_right:ed0d;linea_software_lasso:ed0e;linea_software_layers1:ed0f;linea_software_layers2:ed10;linea_software_layout:ed11;linea_software_layout_2columns:ed12;linea_software_layout_3columns:ed13;linea_software_layout_4boxes:ed14;linea_software_layout_4columns:ed15;linea_software_layout_4lines:ed16;linea_software_layout_8boxes:ed17;linea_software_layout_header:ed18;linea_software_layout_header_2columns:ed19;linea_software_layout_header_3columns:ed1a;linea_software_layout_header_4boxes:ed1b;linea_software_layout_header_4columns:ed1c;linea_software_layout_header_complex:ed1d;linea_software_layout_header_complex2:ed1e;linea_software_layout_header_complex3:ed1f;linea_software_layout_header_complex4:ed20;linea_software_layout_header_sideleft:ed21;linea_software_layout_header_sideright:ed22;linea_software_layout_sidebar_left:ed23;linea_software_layout_sidebar_right:ed24;linea_software_selection_roundedrectangle:ed25;linea_software_vector_line:ed26;linea_software_shape_oval:ed27;linea_software_shape_polygon:ed28;linea_software_shape_rectangle:ed29;linea_software_shape_roundedrectangle:ed2a;linea_software_add_vectorpoint:ed2b;linea_software_box_oval:ed2c;linea_software_box_polygon:ed2d;linea_software_box_rectangle:ed2e;linea_software_box_roundedrectangle:ed2f;linea_software_character:ed30;linea_software_crop:ed31;linea_software_eyedropper:ed32;linea_software_font_allcaps:ed33;linea_software_font_baseline_shift:ed34;linea_software_font_horizontal_scale:ed35;linea_software_font_kerning:ed36;linea_software_font_leading:ed37;linea_software_font_size:ed38;linea_software_font_smallcapital:ed39;linea_software_font_smallcaps:ed3a;linea_software_font_strikethrough:ed3b;linea_software_font_tracking:ed3c;linea_software_font_underline:ed3d;linea_software_font_vertical_scale:ed3e;linea_software_horizontal_align_center:ed3f;linea_software_horizontal_align_left:ed40;linea_software_horizontal_align_right:ed41;linea_software_horizontal_distribute_center:ed42;linea_software_horizontal_distribute_left:ed43;linea_software_horizontal_distribute_right:ed44;linea_software_slice:ed45;linea_software_transform_bezier:ed46;linea_software_vector_box:ed47;linea_software_vector_composite:ed48;linea_software_vertical_align_bottom:ed49;linea_software_vertical_align_center:ed4a;linea_software_vertical_align_top:ed4b;linea_software_vertical_distribute_bottom:ed4c;linea_software_vertical_distribute_center:ed4d;linea_software_vertical_distribute_top:ed4e; +#linea-weather:85 +linea_weather_aquarius:ed4f;linea_weather_aries:ed50;linea_weather_cancer:ed51;linea_weather_capricorn:ed52;linea_weather_cloud:ed53;linea_weather_cloud_drop:ed54;linea_weather_cloud_lightning:ed55;linea_weather_cloud_snowflake:ed56;linea_weather_downpour_fullmoon:ed57;linea_weather_downpour_halfmoon:ed58;linea_weather_downpour_sun:ed59;linea_weather_drop:ed5a;linea_weather_first_quarter:ed5b;linea_weather_fog:ed5c;linea_weather_fog_fullmoon:ed5d;linea_weather_fog_halfmoon:ed5e;linea_weather_fog_sun:ed5f;linea_weather_fullmoon:ed60;linea_weather_gemini:ed61;linea_weather_hail:ed62;linea_weather_hail_fullmoon:ed63;linea_weather_hail_halfmoon:ed64;linea_weather_hail_sun:ed65;linea_weather_last_quarter:ed66;linea_weather_leo:ed67;linea_weather_libra:ed68;linea_weather_lightning:ed69;linea_weather_mistyrain:ed6a;linea_weather_mistyrain_fullmoon:ed6b;linea_weather_mistyrain_halfmoon:ed6c;linea_weather_mistyrain_sun:ed6d;linea_weather_moon:ed6e;linea_weather_moondown_full:ed6f;linea_weather_moondown_half:ed70;linea_weather_moonset_full:ed71;linea_weather_moonset_half:ed72;linea_weather_move2:ed73;linea_weather_newmoon:ed74;linea_weather_pisces:ed75;linea_weather_rain:ed76;linea_weather_rain_fullmoon:ed77;linea_weather_rain_halfmoon:ed78;linea_weather_rain_sun:ed79;linea_weather_sagittarius:ed7a;linea_weather_scorpio:ed7b;linea_weather_snow:ed7c;linea_weather_snow_fullmoon:ed7d;linea_weather_snow_halfmoon:ed7e;linea_weather_snow_sun:ed7f;linea_weather_snowflake:ed80;linea_weather_star:ed81;linea_weather_storm_11:ed82;linea_weather_storm_32:ed83;linea_weather_storm_fullmoon:ed84;linea_weather_storm_halfmoon:ed85;linea_weather_storm_sun:ed86;linea_weather_sun:ed87;linea_weather_sundown:ed88;linea_weather_sunset:ed89;linea_weather_taurus:ed8a;linea_weather_tempest:ed8b;linea_weather_tempest_fullmoon:ed8c;linea_weather_tempest_halfmoon:ed8d;linea_weather_tempest_sun:ed8e;linea_weather_variable_fullmoon:ed8f;linea_weather_variable_halfmoon:ed90;linea_weather_variable_sun:ed91;linea_weather_virgo:ed92;linea_weather_waning_cresent:ed93;linea_weather_waning_gibbous:ed94;linea_weather_waxing_cresent:ed95;linea_weather_waxing_gibbous:ed96;linea_weather_wind:ed97;linea_weather_wind_e:ed98;linea_weather_wind_fullmoon:ed99;linea_weather_wind_halfmoon:ed9a;linea_weather_wind_n:ed9b;linea_weather_wind_ne:ed9c;linea_weather_wind_nw:ed9d;linea_weather_wind_s:ed9e;linea_weather_wind_se:ed9f;linea_weather_wind_sun:eda0;linea_weather_wind_sw:eda1;linea_weather_wind_w:eda2;linea_weather_windgust:eda3; +#mfizz:137 +mfizz_3dprint:eda4;mfizz_alpinelinux:eda5;mfizz_angular:eda6;mfizz_angular_alt:eda7;mfizz_antenna:eda8;mfizz_apache:eda9;mfizz_archlinux:edaa;mfizz_aws:edab;mfizz_azure:edac;mfizz_backbone:edad;mfizz_blackberry:edae;mfizz_bomb:edaf;mfizz_bootstrap:edb0;mfizz_c:edb1;mfizz_cassandra:edb2;mfizz_centos:edb3;mfizz_clojure:edb4;mfizz_codeigniter:edb5;mfizz_codepen:edb6;mfizz_coffee_bean:edb7;mfizz_cplusplus:edb8;mfizz_csharp:edb9;mfizz_css:edba;mfizz_css3:edbb;mfizz_css3_alt:edbc;mfizz_d3:edbd;mfizz_database:edbe;mfizz_database_alt:edbf;mfizz_database_alt2:edc0;mfizz_debian:edc1;mfizz_docker:edc2;mfizz_dreamhost:edc3;mfizz_elixir:edc4;mfizz_elm:edc5;mfizz_erlang:edc6;mfizz_exherbo:edc7;mfizz_fedora:edc8;mfizz_fire_alt:edc9;mfizz_freebsd:edca;mfizz_freecodecamp:edcb;mfizz_gentoo:edcc;mfizz_ghost:edcd;mfizz_git:edce;mfizz_gnome:edcf;mfizz_go:edd0;mfizz_go_alt:edd1;mfizz_google:edd2;mfizz_google_alt:edd3;mfizz_google_code:edd4;mfizz_google_developers:edd5;mfizz_gradle:edd6;mfizz_grails:edd7;mfizz_grails_alt:edd8;mfizz_grunt:edd9;mfizz_gulp:edda;mfizz_gulp_alt:eddb;mfizz_hadoop:eddc;mfizz_haskell:eddd;mfizz_heroku:edde;mfizz_html:eddf;mfizz_html5:ede0;mfizz_html5_alt:ede1;mfizz_iphone:ede2;mfizz_java:ede3;mfizz_java_bold:ede4;mfizz_java_duke:ede5;mfizz_javascript:ede6;mfizz_javascript_alt:ede7;mfizz_jetty:ede8;mfizz_jquery:ede9;mfizz_kde:edea;mfizz_laravel:edeb;mfizz_line_graph:edec;mfizz_linux_mint:eded;mfizz_looking:edee;mfizz_magento:edef;mfizz_mariadb:edf0;mfizz_maven:edf1;mfizz_microscope:edf2;mfizz_mobile_device:edf3;mfizz_mobile_phone_alt:edf4;mfizz_mobile_phone_broadcast:edf5;mfizz_mongodb:edf6;mfizz_mssql:edf7;mfizz_mysql:edf8;mfizz_mysql_alt:edf9;mfizz_netbsd:edfa;mfizz_nginx:edfb;mfizz_nginx_alt:edfc;mfizz_nginx_alt2:edfd;mfizz_nodejs:edfe;mfizz_npm:edff;mfizz_objc:ee00;mfizz_openshift:ee01;mfizz_oracle:ee02;mfizz_oracle_alt:ee03;mfizz_osx:ee04;mfizz_perl:ee05;mfizz_phone_alt:ee06;mfizz_phone_gap:ee07;mfizz_phone_retro:ee08;mfizz_php:ee09;mfizz_php_alt:ee0a;mfizz_playframework:ee0b;mfizz_playframework_alt:ee0c;mfizz_plone:ee0d;mfizz_postgres:ee0e;mfizz_postgres_alt:ee0f;mfizz_python:ee10;mfizz_raspberrypi:ee11;mfizz_reactjs:ee12;mfizz_redhat:ee13;mfizz_redis:ee14;mfizz_ruby:ee15;mfizz_ruby_on_rails:ee16;mfizz_ruby_on_rails_alt:ee17;mfizz_rust:ee18;mfizz_sass:ee19;mfizz_satellite:ee1a;mfizz_scala:ee1b;mfizz_scala_alt:ee1c;mfizz_script:ee1d;mfizz_script_alt:ee1e;mfizz_shell:ee1f;mfizz_sitefinity:ee20;mfizz_solaris:ee21;mfizz_splatter:ee22;mfizz_spring:ee23;mfizz_suse:ee24;mfizz_svg:ee25;mfizz_symfony:ee26;mfizz_tomcat:ee27;mfizz_ubuntu:ee28;mfizz_unity:ee29;mfizz_wireless:ee2a;mfizz_wordpress:ee2b;mfizz_x11:ee2c; +#firacode:116 +firacode_asterisk:ee2d;firacode_plus:ee2e;firacode_hyphen:ee2f;firacode_sad:ee30;firacode_w_w_w:ee31;firacode_asterisk_asterisk:ee32;firacode_asterisk_asterisk_asterisk:ee33;firacode_asterisk_asterisk_slash:ee34;firacode_asterisk_greater:ee35;firacode_asterisk_slash:ee36;firacode_backslash_backslash:ee37;firacode_bbb:ee38;firacode_braceleft_hyphen:ee39;firacode_bracketleft_bracketright:ee3a;firacode_colon_colon:ee3b;firacode_colon_colon_colon:ee3c;firacode_colon_equal:ee3d;firacode_exclam_exclam:ee3e;firacode_exclam_equal:ee3f;firacode_exclam_equal_equal:ee40;firacode_hyphen_braceright:ee41;firacode_hyphen_hyphen:ee42;firacode_hyphen_hyphen_hyphen:ee43;firacode_hyphen_hyphen_greater:ee44;firacode_hyphen_greater:ee45;firacode_hyphen_greater_greater:ee46;firacode_hyphen_less:ee47;firacode_hyphen_less_less:ee48;firacode_hyphen_asciitilde:ee49;firacode_numbersign_braceleft:ee4a;firacode_numbersign_bracketleft:ee4b;firacode_numbersign_numbersign:ee4c;firacode_nnn:ee4d;firacode_nnnn:ee4e;firacode_numbersign_parenleft:ee4f;firacode_numbersign_question:ee50;firacode_numbersign_underscore:ee51;firacode_nup:ee52;firacode_period_hyphen:ee53;firacode_period_equal:ee54;firacode_period_period:ee55;firacode_period_period_less:ee56;firacode_period_period_period:ee57;firacode_question_equal:ee58;firacode_question_question:ee59;firacode_semicolon_semicolon:ee5a;firacode_slash_asterisk:ee5b;firacode_slash_asterisk_asterisk:ee5c;firacode_slash_equal:ee5d;firacode_slash_equal_equal:ee5e;firacode_slash_greater:ee5f;firacode_slash_slash:ee60;firacode_slash_slash_slash:ee61;firacode_ampersand_ampersand:ee62;firacode_bar_bar:ee63;firacode_bar_bar_equal:ee64;firacode_bar_equal:ee65;firacode_bar_greater:ee66;firacode_asciicircum_equal:ee67;firacode_dollar_greater:ee68;firacode_plus_plus:ee69;firacode_plus_plus_plus:ee6a;firacode_plus_greater:ee6b;firacode_equal_colon_equal:ee6c;firacode_equal_equal:ee6d;firacode_equal_equal_equal:ee6e;firacode_equal_equal_greater:ee6f;firacode_equal_greater:ee70;firacode_equal_greater_greater:ee71;firacode_equal_less:ee72;firacode_equal_less_less:ee73;firacode_equal_slash_equal:ee74;firacode_greater_hyphen:ee75;firacode_greater_equal:ee76;firacode_greater_equal_greater:ee77;firacode_greater_greater:ee78;firacode_greater_greater_hyphen:ee79;firacode_greater_greater_equal:ee7a;firacode_greater_greater_greater:ee7b;firacode_less_asterisk:ee7c;firacode_less_asterisk_greater:ee7d;firacode_less_bar:ee7e;firacode_less_bar_greater:ee7f;firacode_less_dollar:ee80;firacode_less_dollar_greater:ee81;firacode_less_exclam_hyphen_hyphen:ee82;firacode_less_hyphen:ee83;firacode_less_hyphen_hyphen:ee84;firacode_less_hyphen_greater:ee85;firacode_less_plus:ee86;firacode_less_plus_greater:ee87;firacode_less_equal:ee88;firacode_less_equal_equal:ee89;firacode_less_equal_greater:ee8a;firacode_less_equal_less:ee8b;firacode_less_greater:ee8c;firacode_less_less:ee8d;firacode_less_less_hyphen:ee8e;firacode_less_less_equal:ee8f;firacode_less_less_less:ee90;firacode_less_asciitilde:ee91;firacode_less_asciitilde_asciitilde:ee92;firacode_less_slash:ee93;firacode_less_slash_greater:ee94;firacode_asciitilde_at:ee95;firacode_asciitilde_hyphen:ee96;firacode_asciitilde_equal:ee97;firacode_asciitilde_greater:ee98;firacode_asciitilde_asciitilde:ee99;firacode_aag:ee9a;firacode_percent_percent:ee9b;firacode_x_multiply:ee9c;firacode_colon_uc:ee9d;firacode_plus_lc:ee9e;firacode_plus_tosf2:ee9f;firacode_nameme_1114119:eea0; diff --git a/nnn-4.9/icons-in-terminal/config.json b/nnn-4.9/icons-in-terminal/config.json @@ -0,0 +1,118 @@ +[ + { + "name": "octicons", + "short-name": "oct", + "path": "./fonts/octicons.ttf" + }, + { + "name": "fontawesome", + "short-name": "fa", + "path": "./fonts/FontAwesome.otf", + "start-from": "0xF000", + "map-names": "fonts/FontAwesome-map", + "until": "0xF2E1" + }, + { + "name": "material", + "short-name": "md", + "path": "./fonts/material-design-icons.ttf", + "map-names": "./fonts/material-design-map", + "start-from": "0xE000", + "move-vertically": -150 + }, + { + "name": "fileicons", + "short-name": "file", + "path": "./fonts/file-icons.ttf", + "map-names": "fonts/file-icons-map", + "move-vertically": -100 + }, + { + "name": "weather", + "path": "./fonts/weathericons.ttf", + "map-names": "./fonts/weathericons-map", + "start-from": "0xF000" + }, + { + "name": "linux", + "short-name": "linux", + "path": "./fonts/font-linux.ttf", + "map-names": "./fonts/font-linux-map", + "start-from": "0xF100" + }, + { + "name": "myicons", + "path": "./fonts/myicons.ttf", + "excludes": [ "0xFFFD" ] + }, + { + "name": "devicons", + "short-name": "dev", + "path": "./fonts/devicons.ttf", + "map-names": "./fonts/devicons-map", + "start-from": "0xE600", + "excludes": [ "0xFFFD" ] + }, + { + "name": "pomicons", + "short-name": "pom", + "path": "./fonts/Pomicons.ttf", + "start-from": "0xE000", + "excludes": [ "0x20", "0xA0" ] + }, + { + "name": "linea-arrows", + "path": "./fonts/linea/linea-arrows-10.ttf", + "map-names": "./fonts/linea/linea-arrows-10-map", + "move-vertically": -200 + }, + { + "name": "linea-basic", + "path": "./fonts/linea/linea-basic-10.ttf", + "map-names": "./fonts/linea/linea-basic-10-map", + "move-vertically": -200 + }, + { + "name": "linea-basic-elaboration", + "short-name": "linea-elaboration", + "path": "./fonts/linea/linea-basic-elaboration-10.ttf", + "map-names": "./fonts/linea/linea-basic-elaboration-10-map", + "move-vertically": -200 + }, + { + "name": "linea-ecommerce", + "path": "./fonts/linea/linea-ecommerce-10.ttf", + "map-names": "./fonts/linea/linea-ecommerce-10-map", + "move-vertically": -200 + }, + { + "name": "linea-music", + "path": "./fonts/linea/linea-music-10.ttf", + "map-names": "./fonts/linea/linea-music-10-map", + "move-vertically": -200 + }, + { + "name": "linea-software", + "path": "./fonts/linea/linea-software-10.ttf", + "map-names": "./fonts/linea/linea-software-10-map", + "move-vertically": -200 + }, + { + "name": "linea-weather", + "path": "./fonts/linea/linea-weather-10.ttf", + "map-names": "./fonts/linea/linea-weather-10-map", + "move-vertically": -200 + }, + { + "name": "mfizz", + "path": "./fonts/font-mfizz.ttf", + "map-names": "./fonts/font-mfizz-map", + "excludes": [ "0x20" ] + }, + { + "name": "firacode", + "path": "./fonts/FiraCode-Regular-Symbol.otf", + "map-names": "./fonts/FiraCode-Regular-Symbol-map", + "excludes": [ "0xE0A0", "0xE0A1", "0xE0A2", "0xE0B0", "0xE0B1", "0xE0B2", "0xE0B3" ] + } +] diff --git a/nnn-4.9/icons-in-terminal/fonts/FiraCode-Regular-Symbol-map b/nnn-4.9/icons-in-terminal/fonts/FiraCode-Regular-Symbol-map @@ -0,0 +1,124 @@ +asterisk 2a +plus 2b +hyphen 2d +sad 2639 +uniE0A0 e0a0 +uniE0A1 e0a1 +uniE0A2 e0a2 +uniE0B0 e0b0 +uniE0B1 e0b1 +uniE0B2 e0b2 +uniE0B3 e0b3 +w_w_w e100 +asterisk_asterisk e101 +asterisk_asterisk_asterisk e102 +asterisk_asterisk_slash e103 +asterisk_greater e104 +asterisk_slash e105 +backslash_backslash e106 +bbb e107 +braceleft_hyphen e108 +bracketleft_bracketright e109 +colon_colon e10a +colon_colon_colon e10b +colon_equal e10c +exclam_exclam e10d +exclam_equal e10e +exclam_equal_equal e10f +hyphen_braceright e110 +hyphen_hyphen e111 +hyphen_hyphen_hyphen e112 +hyphen_hyphen_greater e113 +hyphen_greater e114 +hyphen_greater_greater e115 +hyphen_less e116 +hyphen_less_less e117 +hyphen_asciitilde e118 +numbersign_braceleft e119 +numbersign_bracketleft e11a +numbersign_numbersign e11b +nnn e11c +nnnn e11d +numbersign_parenleft e11e +numbersign_question e11f +numbersign_underscore e120 +nup e121 +period_hyphen e122 +period_equal e123 +period_period e124 +period_period_less e125 +period_period_period e126 +question_equal e127 +question_question e128 +semicolon_semicolon e129 +slash_asterisk e12a +slash_asterisk_asterisk e12b +slash_equal e12c +slash_equal_equal e12d +slash_greater e12e +slash_slash e12f +slash_slash_slash e130 +ampersand_ampersand e131 +bar_bar e132 +bar_bar_equal e133 +bar_equal e134 +bar_greater e135 +asciicircum_equal e136 +dollar_greater e137 +plus_plus e138 +plus_plus_plus e139 +plus_greater e13a +equal_colon_equal e13b +equal_equal e13c +equal_equal_equal e13d +equal_equal_greater e13e +equal_greater e13f +equal_greater_greater e140 +equal_less e141 +equal_less_less e142 +equal_slash_equal e143 +greater_hyphen e144 +greater_equal e145 +greater_equal_greater e146 +greater_greater e147 +greater_greater_hyphen e148 +greater_greater_equal e149 +greater_greater_greater e14a +less_asterisk e14b +less_asterisk_greater e14c +less_bar e14d +less_bar_greater e14e +less_dollar e14f +less_dollar_greater e150 +less_exclam_hyphen_hyphen e151 +less_hyphen e152 +less_hyphen_hyphen e153 +less_hyphen_greater e154 +less_plus e155 +less_plus_greater e156 +less_equal e157 +less_equal_equal e158 +less_equal_greater e159 +less_equal_less e15a +less_greater e15b +less_less e15c +less_less_hyphen e15d +less_less_equal e15e +less_less_less e15f +less_asciitilde e160 +less_asciitilde_asciitilde e161 +less_slash e162 +less_slash_greater e163 +asciitilde_at e164 +asciitilde_hyphen e165 +asciitilde_equal e166 +asciitilde_greater e167 +asciitilde_asciitilde e168 +aag e169 +percent_percent e16a +x_multiply e16b +colon_uc e16c +plus_lc e16d +plus_tosf2 e16e +NameMe_1114119 e16f +_notdef 10000 diff --git a/nnn-4.9/icons-in-terminal/fonts/FiraCode-Regular-Symbol.otf b/nnn-4.9/icons-in-terminal/fonts/FiraCode-Regular-Symbol.otf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/FontAwesome-map b/nnn-4.9/icons-in-terminal/fonts/FontAwesome-map @@ -0,0 +1,786 @@ +500px f26e +address_book f2b9 +address_book_o f2ba +address_card f2bb +address_card_o f2bc +adjust f042 +adn f170 +align_center f037 +align_justify f039 +align_left f036 +align_right f038 +amazon f270 +ambulance f0f9 +american_sign_language_interpreting f2a3 +anchor f13d +android f17b +angellist f209 +angle_double_down f103 +angle_double_left f100 +angle_double_right f101 +angle_double_up f102 +angle_down f107 +angle_left f104 +angle_right f105 +angle_up f106 +apple f179 +archive f187 +area_chart f1fe +arrow_circle_down f0ab +arrow_circle_left f0a8 +arrow_circle_o_down f01a +arrow_circle_o_left f190 +arrow_circle_o_right f18e +arrow_circle_o_up f01b +arrow_circle_right f0a9 +arrow_circle_up f0aa +arrow_down f063 +arrow_left f060 +arrow_right f061 +arrow_up f062 +arrows f047 +arrows_alt f0b2 +arrows_h f07e +arrows_v f07d +asl_interpreting f2a3 +assistive_listening_systems f2a2 +asterisk f069 +at f1fa +audio_description f29e +automobile f1b9 +backward f04a +balance_scale f24e +ban f05e +bandcamp f2d5 +bank f19c +bar_chart f080 +bar_chart_o f080 +barcode f02a +bars f0c9 +bath f2cd +bathtub f2cd +battery f240 +battery_0 f244 +battery_1 f243 +battery_2 f242 +battery_3 f241 +battery_4 f240 +battery_empty f244 +battery_full f240 +battery_half f242 +battery_quarter f243 +battery_three_quarters f241 +bed f236 +beer f0fc +behance f1b4 +behance_square f1b5 +bell f0f3 +bell_o f0a2 +bell_slash f1f6 +bell_slash_o f1f7 +bicycle f206 +binoculars f1e5 +birthday_cake f1fd +bitbucket f171 +bitbucket_square f172 +bitcoin f15a +black_tie f27e +blind f29d +bluetooth f293 +bluetooth_b f294 +bold f032 +bolt f0e7 +bomb f1e2 +book f02d +bookmark f02e +bookmark_o f097 +braille f2a1 +briefcase f0b1 +btc f15a +bug f188 +building f1ad +building_o f0f7 +bullhorn f0a1 +bullseye f140 +bus f207 +buysellads f20d +cab f1ba +calculator f1ec +calendar f073 +calendar_check_o f274 +calendar_minus_o f272 +calendar_o f133 +calendar_plus_o f271 +calendar_times_o f273 +camera f030 +camera_retro f083 +car f1b9 +caret_down f0d7 +caret_left f0d9 +caret_right f0da +caret_square_o_down f150 +caret_square_o_left f191 +caret_square_o_right f152 +caret_square_o_up f151 +caret_up f0d8 +cart_arrow_down f218 +cart_plus f217 +cc f20a +cc_amex f1f3 +cc_diners_club f24c +cc_discover f1f2 +cc_jcb f24b +cc_mastercard f1f1 +cc_paypal f1f4 +cc_stripe f1f5 +cc_visa f1f0 +certificate f0a3 +chain f0c1 +chain_broken f127 +check f00c +check_circle f058 +check_circle_o f05d +check_square f14a +check_square_o f046 +chevron_circle_down f13a +chevron_circle_left f137 +chevron_circle_right f138 +chevron_circle_up f139 +chevron_down f078 +chevron_left f053 +chevron_right f054 +chevron_up f077 +child f1ae +chrome f268 +circle f111 +circle_o f10c +circle_o_notch f1ce +circle_thin f1db +clipboard f0ea +clock_o f017 +clone f24d +close f00d +cloud f0c2 +cloud_download f0ed +cloud_upload f0ee +cny f157 +code f121 +code_fork f126 +codepen f1cb +codiepie f284 +coffee f0f4 +cog f013 +cogs f085 +columns f0db +comment f075 +comment_o f0e5 +commenting f27a +commenting_o f27b +comments f086 +comments_o f0e6 +compass f14e +compress f066 +connectdevelop f20e +contao f26d +copy f0c5 +copyright f1f9 +creative_commons f25e +credit_card f09d +credit_card_alt f283 +crop f125 +crosshairs f05b +css3 f13c +cube f1b2 +cubes f1b3 +cut f0c4 +cutlery f0f5 +dashboard f0e4 +dashcube f210 +database f1c0 +deaf f2a4 +deafness f2a4 +dedent f03b +delicious f1a5 +desktop f108 +deviantart f1bd +diamond f219 +digg f1a6 +dollar f155 +dot_circle_o f192 +download f019 +dribbble f17d +drivers_license f2c2 +drivers_license_o f2c3 +dropbox f16b +drupal f1a9 +edge f282 +edit f044 +eercast f2da +eject f052 +ellipsis_h f141 +ellipsis_v f142 +empire f1d1 +envelope f0e0 +envelope_o f003 +envelope_open f2b6 +envelope_open_o f2b7 +envelope_square f199 +envira f299 +eraser f12d +etsy f2d7 +eur f153 +euro f153 +exchange f0ec +exclamation f12a +exclamation_circle f06a +exclamation_triangle f071 +expand f065 +expeditedssl f23e +external_link f08e +external_link_square f14c +eye f06e +eye_slash f070 +eyedropper f1fb +fa f2b4 +facebook f09a +facebook_f f09a +facebook_official f230 +facebook_square f082 +fast_backward f049 +fast_forward f050 +fax f1ac +feed f09e +female f182 +fighter_jet f0fb +file f15b +file_archive_o f1c6 +file_audio_o f1c7 +file_code_o f1c9 +file_excel_o f1c3 +file_image_o f1c5 +file_movie_o f1c8 +file_o f016 +file_pdf_o f1c1 +file_photo_o f1c5 +file_picture_o f1c5 +file_powerpoint_o f1c4 +file_sound_o f1c7 +file_text f15c +file_text_o f0f6 +file_video_o f1c8 +file_word_o f1c2 +file_zip_o f1c6 +files_o f0c5 +film f008 +filter f0b0 +fire f06d +fire_extinguisher f134 +firefox f269 +first_order f2b0 +flag f024 +flag_checkered f11e +flag_o f11d +flash f0e7 +flask f0c3 +flickr f16e +floppy_o f0c7 +folder f07b +folder_o f114 +folder_open f07c +folder_open_o f115 +font f031 +font_awesome f2b4 +fonticons f280 +fort_awesome f286 +forumbee f211 +forward f04e +foursquare f180 +free_code_camp f2c5 +frown_o f119 +futbol_o f1e3 +gamepad f11b +gavel f0e3 +gbp f154 +ge f1d1 +gear f013 +gears f085 +genderless f22d +get_pocket f265 +gg f260 +gg_circle f261 +gift f06b +git f1d3 +git_square f1d2 +github f09b +github_alt f113 +github_square f092 +gitlab f296 +gittip f184 +glass f000 +glide f2a5 +glide_g f2a6 +globe f0ac +google f1a0 +google_plus f0d5 +google_plus_circle f2b3 +google_plus_official f2b3 +google_plus_square f0d4 +google_wallet f1ee +graduation_cap f19d +gratipay f184 +grav f2d6 +group f0c0 +h_square f0fd +hacker_news f1d4 +hand_grab_o f255 +hand_lizard_o f258 +hand_o_down f0a7 +hand_o_left f0a5 +hand_o_right f0a4 +hand_o_up f0a6 +hand_paper_o f256 +hand_peace_o f25b +hand_pointer_o f25a +hand_rock_o f255 +hand_scissors_o f257 +hand_spock_o f259 +hand_stop_o f256 +handshake_o f2b5 +hard_of_hearing f2a4 +hashtag f292 +hdd_o f0a0 +header f1dc +headphones f025 +heart f004 +heart_o f08a +heartbeat f21e +history f1da +home f015 +hospital_o f0f8 +hotel f236 +hourglass f254 +hourglass_1 f251 +hourglass_2 f252 +hourglass_3 f253 +hourglass_end f253 +hourglass_half f252 +hourglass_o f250 +hourglass_start f251 +houzz f27c +html5 f13b +i_cursor f246 +id_badge f2c1 +id_card f2c2 +id_card_o f2c3 +ils f20b +image f03e +imdb f2d8 +inbox f01c +indent f03c +industry f275 +info f129 +info_circle f05a +inr f156 +instagram f16d +institution f19c +internet_explorer f26b +intersex f224 +ioxhost f208 +italic f033 +joomla f1aa +jpy f157 +jsfiddle f1cc +key f084 +keyboard_o f11c +krw f159 +language f1ab +laptop f109 +lastfm f202 +lastfm_square f203 +leaf f06c +leanpub f212 +legal f0e3 +lemon_o f094 +level_down f149 +level_up f148 +life_bouy f1cd +life_buoy f1cd +life_ring f1cd +life_saver f1cd +lightbulb_o f0eb +line_chart f201 +link f0c1 +linkedin f0e1 +linkedin_square f08c +linode f2b8 +linux f17c +list f03a +list_alt f022 +list_ol f0cb +list_ul f0ca +location_arrow f124 +lock f023 +long_arrow_down f175 +long_arrow_left f177 +long_arrow_right f178 +long_arrow_up f176 +low_vision f2a8 +magic f0d0 +magnet f076 +mail_forward f064 +mail_reply f112 +mail_reply_all f122 +male f183 +map f279 +map_marker f041 +map_o f278 +map_pin f276 +map_signs f277 +mars f222 +mars_double f227 +mars_stroke f229 +mars_stroke_h f22b +mars_stroke_v f22a +maxcdn f136 +meanpath f20c +medium f23a +medkit f0fa +meetup f2e0 +meh_o f11a +mercury f223 +microchip f2db +microphone f130 +microphone_slash f131 +minus f068 +minus_circle f056 +minus_square f146 +minus_square_o f147 +mixcloud f289 +mobile f10b +mobile_phone f10b +modx f285 +money f0d6 +moon_o f186 +mortar_board f19d +motorcycle f21c +mouse_pointer f245 +music f001 +navicon f0c9 +neuter f22c +newspaper_o f1ea +object_group f247 +object_ungroup f248 +odnoklassniki f263 +odnoklassniki_square f264 +opencart f23d +openid f19b +opera f26a +optin_monster f23c +outdent f03b +pagelines f18c +paint_brush f1fc +paper_plane f1d8 +paper_plane_o f1d9 +paperclip f0c6 +paragraph f1dd +paste f0ea +pause f04c +pause_circle f28b +pause_circle_o f28c +paw f1b0 +paypal f1ed +pencil f040 +pencil_square f14b +pencil_square_o f044 +percent f295 +phone f095 +phone_square f098 +photo f03e +picture_o f03e +pie_chart f200 +pied_piper f2ae +pied_piper_alt f1a8 +pied_piper_pp f1a7 +pinterest f0d2 +pinterest_p f231 +pinterest_square f0d3 +plane f072 +play f04b +play_circle f144 +play_circle_o f01d +plug f1e6 +plus f067 +plus_circle f055 +plus_square f0fe +plus_square_o f196 +podcast f2ce +power_off f011 +print f02f +product_hunt f288 +puzzle_piece f12e +qq f1d6 +qrcode f029 +question f128 +question_circle f059 +question_circle_o f29c +quora f2c4 +quote_left f10d +quote_right f10e +ra f1d0 +random f074 +ravelry f2d9 +rebel f1d0 +recycle f1b8 +reddit f1a1 +reddit_alien f281 +reddit_square f1a2 +refresh f021 +registered f25d +remove f00d +renren f18b +reorder f0c9 +repeat f01e +reply f112 +reply_all f122 +resistance f1d0 +retweet f079 +rmb f157 +road f018 +rocket f135 +rotate_left f0e2 +rotate_right f01e +rouble f158 +rss f09e +rss_square f143 +rub f158 +ruble f158 +rupee f156 +s15 f2cd +safari f267 +save f0c7 +scissors f0c4 +scribd f28a +search f002 +search_minus f010 +search_plus f00e +sellsy f213 +send f1d8 +send_o f1d9 +server f233 +share f064 +share_alt f1e0 +share_alt_square f1e1 +share_square f14d +share_square_o f045 +shekel f20b +sheqel f20b +shield f132 +ship f21a +shirtsinbulk f214 +shopping_bag f290 +shopping_basket f291 +shopping_cart f07a +shower f2cc +sign_in f090 +sign_language f2a7 +sign_out f08b +signal f012 +signing f2a7 +simplybuilt f215 +sitemap f0e8 +skyatlas f216 +skype f17e +slack f198 +sliders f1de +slideshare f1e7 +smile_o f118 +snapchat f2ab +snapchat_ghost f2ac +snapchat_square f2ad +snowflake_o f2dc +soccer_ball_o f1e3 +sort f0dc +sort_alpha_asc f15d +sort_alpha_desc f15e +sort_amount_asc f160 +sort_amount_desc f161 +sort_asc f0de +sort_desc f0dd +sort_down f0dd +sort_numeric_asc f162 +sort_numeric_desc f163 +sort_up f0de +soundcloud f1be +space_shuttle f197 +spinner f110 +spoon f1b1 +spotify f1bc +square f0c8 +square_o f096 +stack_exchange f18d +stack_overflow f16c +star f005 +star_half f089 +star_half_empty f123 +star_half_full f123 +star_half_o f123 +star_o f006 +steam f1b6 +steam_square f1b7 +step_backward f048 +step_forward f051 +stethoscope f0f1 +sticky_note f249 +sticky_note_o f24a +stop f04d +stop_circle f28d +stop_circle_o f28e +street_view f21d +strikethrough f0cc +stumbleupon f1a4 +stumbleupon_circle f1a3 +subscript f12c +subway f239 +suitcase f0f2 +sun_o f185 +superpowers f2dd +superscript f12b +support f1cd +table f0ce +tablet f10a +tachometer f0e4 +tag f02b +tags f02c +tasks f0ae +taxi f1ba +telegram f2c6 +television f26c +tencent_weibo f1d5 +terminal f120 +text_height f034 +text_width f035 +th f00a +th_large f009 +th_list f00b +themeisle f2b2 +thermometer f2c7 +thermometer_0 f2cb +thermometer_1 f2ca +thermometer_2 f2c9 +thermometer_3 f2c8 +thermometer_4 f2c7 +thermometer_empty f2cb +thermometer_full f2c7 +thermometer_half f2c9 +thermometer_quarter f2ca +thermometer_three_quarters f2c8 +thumb_tack f08d +thumbs_down f165 +thumbs_o_down f088 +thumbs_o_up f087 +thumbs_up f164 +ticket f145 +times f00d +times_circle f057 +times_circle_o f05c +times_rectangle f2d3 +times_rectangle_o f2d4 +tint f043 +toggle_down f150 +toggle_left f191 +toggle_off f204 +toggle_on f205 +toggle_right f152 +toggle_up f151 +trademark f25c +train f238 +transgender f224 +transgender_alt f225 +trash f1f8 +trash_o f014 +tree f1bb +trello f181 +tripadvisor f262 +trophy f091 +truck f0d1 +try f195 +tty f1e4 +tumblr f173 +tumblr_square f174 +turkish_lira f195 +tv f26c +twitch f1e8 +twitter f099 +twitter_square f081 +umbrella f0e9 +underline f0cd +undo f0e2 +universal_access f29a +university f19c +unlink f127 +unlock f09c +unlock_alt f13e +unsorted f0dc +upload f093 +usb f287 +usd f155 +user f007 +user_circle f2bd +user_circle_o f2be +user_md f0f0 +user_o f2c0 +user_plus f234 +user_secret f21b +user_times f235 +users f0c0 +vcard f2bb +vcard_o f2bc +venus f221 +venus_double f226 +venus_mars f228 +viacoin f237 +viadeo f2a9 +viadeo_square f2aa +video_camera f03d +vimeo f27d +vimeo_square f194 +vine f1ca +vk f189 +volume_control_phone f2a0 +volume_down f027 +volume_off f026 +volume_up f028 +warning f071 +wechat f1d7 +weibo f18a +weixin f1d7 +whatsapp f232 +wheelchair f193 +wheelchair_alt f29b +wifi f1eb +wikipedia_w f266 +window_close f2d3 +window_close_o f2d4 +window_maximize f2d0 +window_minimize f2d1 +window_restore f2d2 +windows f17a +won f159 +wordpress f19a +wpbeginner f297 +wpexplorer f2de +wpforms f298 +wrench f0ad +xing f168 +xing_square f169 +y_combinator f23b +y_combinator_square f1d4 +yahoo f19e +yc f23b +yc_square f1d4 +yelp f1e9 +yen f157 +yoast f2b1 +youtube f167 +youtube_play f16a +youtube_square f166 diff --git a/nnn-4.9/icons-in-terminal/fonts/FontAwesome.otf b/nnn-4.9/icons-in-terminal/fonts/FontAwesome.otf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/Pomicons.ttf b/nnn-4.9/icons-in-terminal/fonts/Pomicons.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/PowerlineExtraSymbols-map b/nnn-4.9/icons-in-terminal/fonts/PowerlineExtraSymbols-map @@ -0,0 +1,38 @@ +branch e0a0 +line_number e0a1 +readonly e0a2 +extra_column_number e0a3 +left_hard_divider e0b0 +left_soft_divider e0b1 +right_hard_divider e0b2 +right_soft_divider e0b3 +extra_right_half_circle_thick e0b4 +extra_right_half_circle_thin e0b5 +extra_left_half_circle_thick e0b6 +extra_left_half_circle_thin e0b7 +extra_lower_left_triangle e0b8 +extra_backslash_separator e0b9 +extra_lower_right_triangle e0ba +extra_forwardslash_separator e0bb +extra_upper_left_triangle e0bc +extra_forwardslash_separator_redundant e0bd +extra_upper_right_triangle e0be +extra_backslash_separator_redundant e0bf +extra_flame_thick e0c0 +extra_flame_thin e0c1 +extra_flame_thick_mirrored e0c2 +extra_flame_thin_mirrored e0c3 +extra_pixelated_squares_small e0c4 +extra_pixelated_squares_small_mirrored e0c5 +extra_pixelated_squares_big e0c6 +extra_pixelated_squares_big_mirrored e0c7 +extra_ice_waveform e0c8 +extra_ice_waveform_mirrored e0ca +extra_honeycomb e0cc +extra_honeycomb_outline e0cd +extra_lego_separator e0ce +extra_lego_separator_thin e0cf +extra_lego_block_facing e0d0 +extra_lego_block_sideways e0d1 +extra_trapezoid_top_bottom e0d2 +extra_trapezoid_top_bottom_mirrored e0d4 diff --git a/nnn-4.9/icons-in-terminal/fonts/PowerlineExtraSymbols.otf b/nnn-4.9/icons-in-terminal/fonts/PowerlineExtraSymbols.otf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/devicons-map b/nnn-4.9/icons-in-terminal/fonts/devicons-map @@ -0,0 +1,191 @@ +git e602 +git_compare e628 +git_branch e625 +git_commit e629 +git_pull_request e626 +git_merge e627 +bitbucket e603 +github_alt e608 +github_badge e609 +github e60a +github_full e617 +java e638 +ruby e639 +scala e637 +python e63c +go e624 +ruby_on_rails e63b +django e61d +markdown e63e +php e63d +mysql e604 +streamline e605 +database e606 +laravel e63f +javascript e64e +angular e653 +backbone e652 +coffeescript e651 +jquery e650 +modernizr e620 +jquery_ui e654 +ember e61b +dojo e61c +nodejs e619 +nodejs_small e618 +javascript_shield e64f +bootstrap e647 +sass e64b +css3_full e64a +css3 e649 +html5 e636 +html5_multimedia e632 +html5_device_access e633 +html5_3d_effects e635 +html5_connectivity e634 +ghost_small e614 +ghost e61f +magento e640 +joomla e641 +jekyll_small e60d +drupal e642 +wordpress e60b +grunt e64c +bower e64d +npm e61e +yahoo_small e62b +yahoo e615 +bing_small e600 +windows e60f +linux e612 +ubuntu e63a +android e60e +apple e611 +appstore e613 +phonegap e630 +blackberry e623 +stackoverflow e610 +techcrunch e62c +codrops e62f +css_tricks e601 +smashing_magazine e62d +netmagazine e62e +codepen e616 +cssdeck e62a +hackernews e61a +dropbox e607 +google_drive e631 +visualstudio e60c +unity_small e621 +raspberry_pi e622 +chrome e643 +ie e644 +firefox e645 +opera e646 +safari e648 +swift e655 +symfony e656 +symfony_badge e657 +less e658 +stylus e659 +trello e65a +atlassian e65b +jira e65c +envato e65d +snap_svg e65e +raphael e65f +google_analytics e660 +compass e661 +onedrive e662 +gulp e663 +atom e664 +cisco e665 +nancy e666 +clojure e668 +clojure_alt e66a +perl e669 +celluloid e66b +w3c e66c +redis e66d +postgresql e66e +webplatform e66f +jenkins e667 +requirejs e670 +opensource e671 +typo3 e672 +uikit e673 +doctrine e674 +groovy e675 +nginx e676 +haskell e677 +zend e678 +gnu e679 +yeoman e67a +heroku e67b +debian e67d +travis e67e +dotnet e67f +codeigniter e680 +javascript_badge e681 +yii e682 +msql_server e67c +composer e683 +krakenjs_badge e684 +krakenjs e685 +mozilla e686 +firebase e687 +sizzlejs e688 +creativecommons e689 +creativecommons_badge e68a +mitlicence e68b +senchatouch e68c +bugsense e68d +extjs e68e +mootools_badge e68f +mootools e690 +ruby_rough e691 +komodo e692 +coda e693 +bintray e694 +terminal e695 +code e696 +responsive e697 +dart e698 +aptana e699 +mailchimp e69a +netbeans e69b +dreamweaver e69c +brackets e69d +eclipse e69e +cloud9 e69f +scrum e6a0 +prolog e6a1 +terminal_badge e6a2 +code_badge e6a3 +mongodb e6a4 +meteor e6a5 +meteorfull e6a6 +fsharp e6a7 +rust e6a8 +ionic e6a9 +sublime e6aa +appcelerator e6ab +asterisk e6ac +aws e6ad +digital_ocean e6ae +dlang e6af +docker e6b0 +erlang e6b1 +google_cloud_platform e6b2 +grails e6b3 +illustrator e6b4 +intellij e6b5 +materializecss e6b6 +openshift e6b7 +photoshop e6b8 +rackspace e6b9 +react e6ba +redhat e6bb +scriptcs e6bc +sqllite e6c4 +vim e6c5 diff --git a/nnn-4.9/icons-in-terminal/fonts/devicons.ttf b/nnn-4.9/icons-in-terminal/fonts/devicons.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/file-icons-map b/nnn-4.9/icons-in-terminal/fonts/file-icons-map @@ -0,0 +1,429 @@ +1c a5ea +1c_alt ea28 +@arch_linux A +abap e92b +abif ea4e +access e9ea +ada e90b +ae e9f3 +ahk e932 +ai e6b4 +alex 29cb +alloy e935 +alpine e9ff +ampl e94e +amx e99b +angelscript ea5b +ansible 24b6 +ant e93e +antlr e92c +antwar 2591 +api e92d +apl 234b +apple e925 +appveyor e923 +arc e92f +arduino e930 +arttext 24d0 +as e92e +asciidoc e918 +ats e934 +audacity e9f9 +augeas e931 +aurelia ea48 +autoit e933 +babel e91f +bazel ea5a +bem ea59 +bibtex e601 +bintray ea6e +bithound ea2a +blender e9fa +bluespec e93c +boo e939 +boot f103 +brain e93a +brakeman e9d6 +bro e93b +broccoli e922 +brotli ea6c +brunch ea47 +buck ea46 +bundler ea45 +byond e962 +cabal e9c2 +caddy ea58 +cake e9e3 +cakefile e924 +cakephp ea43 +cc e9d5 +ceylon e94f +cf e929 +@chai c +chapel e950 +chartjs ea0b +chef ea42 +chuck e943 +circleci ea12 +cirru e951 +cl e972 +clarion e952 +clean e95b +click e95c +clips e940 +cljs f104 +cmake e93f +cobol ea44 +codecov 2602 +codekit ea41 +codeship ea6a +composer e683 +config f07c +coq e95f +cordova ea11 +cp e942 +creole e95e +crystal e902 +csound e9f0 +csscript e9e2 +cucumber f02b +cython e963 +d3 ea10 +darcs e964 +dashboard f07d +dbase e9f1 +default 1f5cc +delphi ea40 +devicetree ea57 +diff e960 +docker f106 +doclets ea3f +doge e946 +doxygen e928 +drone ea3d +dyalog e90c +dylib ea15 +@e E +eagle e965 +ec e9c9 +ecere e966 +editorconfig ea1b +eiffel e967 +ejs ea4b +electron ea27 +elm f102 +em e968 +emacs e926 +ember e61b +eq ea0a +esdoc ea5c +eslint ea0f +excel e9ee +fabfile e94b +factor e96a +fancy e96b +fantom e96f +fbx e9fc +ff fb00 +finder e9e9 +flow e921 +flux e969 +font e90f +fortran e90a +franca ea56 +freemarker e970 +frege e96e +fuelux ea09 +gams e973 +gap e971 +gdb ea08 +genshi e976 +gentoo e96d +gf e978 +gitlab ea3c +glade e938 +@glyphs G +gml e975 +gn ea25 +gnu e679 +go e624 +godot e974 +golo e979 +gosu e97a +gradle e903 +graphql e97c +graphviz e97d +groovy e904 +grunt e611 +gulp e610 +hack e9ce +haml f15b +hoplon ea4d +harbour e97b +hashicorp e97e +haxe e907 +haxedevelop ea3b +hg 263f +hy e97f +idl e947 +idris e983 +igorpro e980 +indesign e9f4 +infopath ea35 +inform7 e984 +inno e985 +io e981 +ioke e982 +ionic f14b +isabelle e945 +j e937 +jade e90d +jake e948 +jasmine ea3a +jenkins e667 +jest ea39 +jolie ea75 +jinja e944 +jison ea55 +jsonld e958 +jsx e9e6 +julia 26ec +jupyter e987 +karma e9cd +keynote e9e5 +khronos e9f8 +kicad ea4c +kitchenci ea38 +kivy e901 +knockout 4B +kotlin e989 +krl e988 +labview e98a +lasso e98c +leaflet ea07 +@lean L +lein f105 +lerna ea37 +lfe e94c +lightwave e9fb +lime ea36 +lisp e908 +llvm e91d +logtalk e98d +lookml e98e +ls e914 +lsl e98b +lua e91b +mako e98f +manpage e936 +mapbox e941 +marko e920 +markdownlint f0c9 +mathematica e990 +mathjax ea06 +matlab e991 +max e993 +maxscript e900 +maya e9f6 +mediawiki e954 +mercury e994 +meson ea54 +@metal M +meteor e6a5 +minecraft e9dc +minizinc ea53 +mirah e995 +miranda ea52 +mjml ea6f +mocha 26fe +model e9e8 +modula2 e996 +monkey e997 +mruby ea18 +mupad e9ca +mustache e60f +nano ea76 +nanoc ea51 +nant e9e1 +nasm ea72 +neko ea05 +netlogo e99c +newrelic e9d7 +nginx f146b +nib 2712 +nimrod e998 +nit e999 +nix e99a +nmap e94d +nodemon ea26 +normalize ea04 +npm e91c +nsis ea1e +nuclide ea34 +nuget e9d9 +numpy e99d +nunjucks e953 +nxc ea6b +nvidia e95d +objj e99e +ocaml e91a +octave ea33 +onenote e9eb +ooc e9cb +opa 2601 +opencl e99f +openoffice e9e4 +org e917 +owl e957 +ox e9a1 +oxygene e9bf +oz e9be +p4 ea50 +pan e9bd +papyrus e9bc +parrot e9bb +pascal e92a +patch e961 +pawn 265f +peg ea74 +perl6 e96c +phalcon e94a +phoenix ea5f +php f147 +phpunit ea32 +pickle e9c4 +pike e9b9 +platformio ea2c +pm2 2630 +pogo e9b8 +pointwise e977 +polymer ea2b +pony e9b7 +postcss e910 +postscript e955 +@povray P +powerbuilder ea14 +powerpoint e9ec +powershell e9da +premiere e9f5 +processing e9a0 +progress e9c0 +proselint ea6d +propeller e9b5 +protractor e9de +psd e6b8 +pug_alt e9d0 +pug ea13 +puppet f0c3 +purebasic 01b5 +purescript e9b2 +r e905 +racket e9b1 +raml e913 +rascal ea24 +rdoc e9b0 +react f100 +reason ea1d +rebol e9ae +red e9ad +redux ea30 +@regex * +rexx ea16 +rhino ea4a +riot e919 +robot e9ac +rollup ea20 +rspec ea31 +rst e9cc +sage e9ab +saltstack e915 +sas e95a +sbt e9d2 +scad e911 +scd e9a2 +scheme 03bb +scilab e9a9 +scrutinizer e9d4 +self e9a8 +sequelize ea2f +sf e9db +shen e9a7 +shipit 26f5 +shippable ea2d +shopify e9cf +shuriken 272b +sigils 1f764 +silverstripe e800 +sketch e927 +slash e9a6 +snyk ea1c +sparql e959 +sqf e9a5 +sqlite e9dd +squarespace ea5e +stan e9a4 +stata e9a3 +storyist e9ef +strings e9e0 +stylelint e93d +@stylus s +sublime e986 +svn ea17 +swagger ea29 +sysverilog e9c3 +tag f015 +tcl e956 +terminal f0c8 +tern 1f54a +terraform e916 +test_coffee ea62 +test_dir ea60 +test_generic ea63 +test_js ea64 +test_perl ea65 +test_python ea66 +test_react ea67 +test_ruby ea68 +test_ts ea69 +tex e600 +@textile t +textmate 2122 +thor e9d8 +ts 2a6 +tsx e9e7 +@tt T +turing e9b6 +twine ea5d +twig 2e19 +txl e9c1 +typedoc e9fe +typings e9df +uno e9b3 +@unreal u +urweb e9ba +v8 ea1f +@vagrant V +varnish e9b4 +verilog e949 +vhdl e9aa +video f057 +virtualbox ea3e +vmware ea49 +vue e906 +wasm ea70 +watchman ea4f +webpack ea61 +wercker ea19 +word e9ed +xamarin ea77 +x10 2169 +@xmos X +xojo e9af +xpages e9c5 +xtend e9c6 +yang 262f +yarn ea1a +yui ea00 +zbrush e9f2 +zephir e9c7 +zimpl e9c8 diff --git a/nnn-4.9/icons-in-terminal/fonts/file-icons.ttf b/nnn-4.9/icons-in-terminal/fonts/file-icons.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/font-linux-map b/nnn-4.9/icons-in-terminal/fonts/font-linux-map @@ -0,0 +1,28 @@ +alpine f11f +aosc f116 +apple f11c +archlinux f100 +centos f101 +coreos f110 +debian f102 +docker f11e +elementary f113 +fedora f103 +fedora-inverse f114 +freebsd f10f +gentoo f111 +linuxmint f105 +linuxmint-inverse f106 +mageia f107 +mandriva f108 +manjaro f11b +nixos f117 +opensuse f109 +raspberry-pi f11a +redhat f10a +sabayon f115 +slackware f10b +slackware-inverse f10c +tux f118 +ubuntu f10d +ubuntu-inverse f10e diff --git a/nnn-4.9/icons-in-terminal/fonts/font-linux.ttf b/nnn-4.9/icons-in-terminal/fonts/font-linux.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/font-mfizz-map b/nnn-4.9/icons-in-terminal/fonts/font-mfizz-map @@ -0,0 +1,137 @@ +3dprint f100 +alpinelinux f101 +angular f102 +angular_alt f103 +antenna f104 +apache f105 +archlinux f106 +aws f107 +azure f108 +backbone f109 +blackberry f10a +bomb f10b +bootstrap f10c +c f10d +cassandra f10e +centos f10f +clojure f110 +codeigniter f111 +codepen f112 +coffee_bean f113 +cplusplus f114 +csharp f115 +css f116 +css3 f117 +css3_alt f118 +d3 f119 +database f11a +database_alt f11b +database_alt2 f11c +debian f11d +docker f11e +dreamhost f11f +elixir f120 +elm f121 +erlang f122 +exherbo f123 +fedora f124 +fire_alt f125 +freebsd f126 +freecodecamp f127 +gentoo f128 +ghost f129 +git f12a +gnome f12b +go f12c +go_alt f12d +google f12e +google_alt f12f +google_code f130 +google_developers f131 +gradle f132 +grails f133 +grails_alt f134 +grunt f135 +gulp f136 +gulp_alt f137 +hadoop f138 +haskell f139 +heroku f13a +html f13b +html5 f13c +html5_alt f13d +iphone f13e +java f13f +java_bold f140 +java_duke f141 +javascript f142 +javascript_alt f143 +jetty f144 +jquery f145 +kde f146 +laravel f147 +line_graph f148 +linux_mint f149 +looking f14a +magento f14b +mariadb f14c +maven f14d +microscope f14e +mobile_device f14f +mobile_phone_alt f150 +mobile_phone_broadcast f151 +mongodb f152 +mssql f153 +mysql f154 +mysql_alt f155 +netbsd f156 +nginx f157 +nginx_alt f158 +nginx_alt2 f159 +nodejs f15a +npm f15b +objc f15c +openshift f15d +oracle f15e +oracle_alt f15f +osx f160 +perl f161 +phone_alt f162 +phone_gap f163 +phone_retro f164 +php f165 +php_alt f166 +playframework f167 +playframework_alt f168 +plone f169 +postgres f16a +postgres_alt f16b +python f16c +raspberrypi f16d +reactjs f16e +redhat f16f +redis f170 +ruby f171 +ruby_on_rails f172 +ruby_on_rails_alt f173 +rust f174 +sass f175 +satellite f176 +scala f177 +scala_alt f178 +script f179 +script_alt f17a +shell f17b +sitefinity f17c +solaris f17d +splatter f17e +spring f17f +suse f180 +svg f181 +symfony f182 +tomcat f183 +ubuntu f184 +unity f185 +wireless f186 +wordpress f187 +x11 f188 diff --git a/nnn-4.9/icons-in-terminal/fonts/font-mfizz.ttf b/nnn-4.9/icons-in-terminal/fonts/font-mfizz.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-arrows-10-map b/nnn-4.9/icons-in-terminal/fonts/linea/linea-arrows-10-map @@ -0,0 +1,136 @@ +anticlockwise e000 +anticlockwise_dashed e001 +button_down e002 +button_off e003 +button_on e004 +button_up e005 +check e006 +circle_check e007 +circle_down e008 +circle_downleft e009 +circle_downright e00a +circle_left e00b +circle_minus e00c +circle_plus e00d +circle_remove e00e +circle_right e00f +circle_up e010 +circle_upleft e011 +circle_upright e012 +clockwise e013 +clockwise_dashed e014 +compress e015 +deny e016 +diagonal e017 +diagonal2 e018 +down e019 +down_double e01a +downleft e01b +downright e01c +drag_down e01d +drag_down_dashed e01e +drag_horiz e01f +drag_left e020 +drag_left_dashed e021 +drag_right e022 +drag_right_dashed e023 +drag_up e024 +drag_up_dashed e025 +drag_vert e026 +exclamation e027 +expand e028 +expand_diagonal1 e029 +expand_horizontal1 e02a +expand_vertical1 e02b +fit_horizontal e02c +fit_vertical e02d +glide e02e +glide_horizontal e02f +glide_vertical e030 +hamburger1 e031 +hamburger_2 e032 +horizontal e033 +info e034 +keyboard_alt e035 +keyboard_cmd e036 +keyboard_delete e037 +keyboard_down e038 +keyboard_left e039 +keyboard_return e03a +keyboard_right e03b +keyboard_shift e03c +keyboard_tab e03d +keyboard_up e03e +left e03f +left_double_32 e040 +minus e041 +move e042 +move2 e043 +move_bottom e044 +move_left e045 +move_right e046 +move_top e047 +plus e048 +question e049 +remove e04a +right e04b +right_double e04c +rotate e04d +rotate_anti e04e +rotate_anti_dashed e04f +rotate_dashed e050 +shrink e051 +shrink_diagonal1 e052 +shrink_diagonal2 e053 +shrink_horizonal2 e054 +shrink_horizontal1 e055 +shrink_vertical1 e056 +shrink_vertical2 e057 +sign_down e058 +sign_left e059 +sign_right e05a +sign_up e05b +slide_down1 e05c +slide_down2 e05d +slide_left1 e05e +slide_left2 e05f +slide_right1 e060 +slide_right2 e061 +slide_up1 e062 +slide_up2 e063 +slim_down e064 +slim_down_dashed e065 +slim_left e066 +slim_left_dashed e067 +slim_right e068 +slim_right_dashed e069 +slim_up e06a +slim_up_dashed e06b +square_check e06c +square_down e06d +square_downleft e06e +square_downright e06f +square_left e070 +square_minus e071 +square_plus e072 +square_remove e073 +square_right e074 +square_up e075 +square_upleft e076 +square_upright e077 +squares e078 +stretch_diagonal1 e079 +stretch_diagonal2 e07a +stretch_diagonal3 e07b +stretch_diagonal4 e07c +stretch_horizontal1 e07d +stretch_horizontal2 e07e +stretch_vertical1 e07f +stretch_vertical2 e080 +switch_horizontal e081 +switch_vertical e082 +up e083 +up_double_33 e084 +upleft e085 +upright e086 +vertical e087 diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-arrows-10.ttf b/nnn-4.9/icons-in-terminal/fonts/linea/linea-arrows-10.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-basic-10-map b/nnn-4.9/icons-in-terminal/fonts/linea/linea-basic-10-map @@ -0,0 +1,135 @@ +@accelerator a +@alarm b +@anchor c +@anticlockwise d +@archive e +@archive_full f +@ban g +@battery_charge h +@battery_empty i +@battery_full j +@battery_half k +@bolt l +@book m +@book_pen n +@book_pencil o +@bookmark p +@calculator q +@calendar r +@cards_diamonds s +@cards_hearts t +@case u +@chronometer v +@clessidre w +@clock x +@clockwise y +@cloud z +@clubs A +@compass B +@cup C +@diamonds D +@display E +@download F +@exclamation G +@eye H +@eye_closed I +@female J +@flag1 K +@flag2 L +@floppydisk M +@folder N +@folder_multiple O +@gear P +@geolocalize_01 Q +@geolocalize_05 R +@globe S +@gunsight T +@hammer U +@headset V +@heart W +@heart_broken X +@helm Y +@home Z +@info 0 +@ipod 1 +@joypad 2 +@key 3 +@keyboard 4 +@laptop 5 +@life_buoy 6 +@lightbulb 7 +@link 8 +@lock 9 +@lock_open ! +@magic_mouse " +@magnifier # +@magnifier_minus $ +@magnifier_plus % +@mail & +@mail_multiple ' +@mail_open ( +@mail_open_text ) +@male * +@map + +@message , +@message_multiple - +@message_txt . +@mixer2 / +@mouse : +@notebook ; +@notebook_pen < +@notebook_pencil = +@paperplane > +@pencil_ruler ? +@pencil_ruler_pen @ +@photo [ +@picture ] +@picture_multiple ^ +@pin1 _ +@pin2 ` +@postcard { +@postcard_multiple | +@printer } +@question ~ +@rss \ +server e000 +server2 e001 +server_cloud e002 +server_download e003 +server_upload e004 +settings e005 +share e006 +sheet e007 +sheet_multiple e008 +sheet_pen e009 +sheet_pencil e00a +sheet_txt e00b +signs e00c +smartphone e00d +spades e00e +spread e00f +spread_bookmark e010 +spread_text e011 +spread_text_bookmark e012 +star e013 +tablet e014 +target e015 +todo e016 +todo_pen e017 +todo_pencil e018 +todo_txt e019 +todolist_pen e01a +todolist_pencil e01b +trashcan e01c +trashcan_full e01d +trashcan_refresh e01e +trashcan_remove e01f +upload e020 +usb e021 +video e022 +watch e023 +webpage e024 +webpage_img_txt e025 +webpage_multiple e026 +webpage_txt e027 +world e028 diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-basic-10.ttf b/nnn-4.9/icons-in-terminal/fonts/linea/linea-basic-10.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-basic-elaboration-10-map b/nnn-4.9/icons-in-terminal/fonts/linea/linea-basic-elaboration-10-map @@ -0,0 +1,146 @@ +@bookmark_checck a +@bookmark_minus b +@bookmark_plus c +@bookmark_remove d +@briefcase_check e +@briefcase_download f +@briefcase_flagged g +@briefcase_minus h +@briefcase_plus i +@briefcase_refresh j +@briefcase_remove k +@briefcase_search l +@briefcase_star m +@briefcase_upload n +@browser_check o +@browser_download p +@browser_minus q +@browser_plus r +@browser_refresh s +@browser_remove t +@browser_search u +@browser_star v +@browser_upload w +@calendar_check x +@calendar_cloud y +@calendar_download z +@calendar_empty A +@calendar_flagged B +@calendar_heart C +@calendar_minus D +@calendar_next E +@calendar_noaccess F +@calendar_pencil G +@calendar_plus H +@calendar_previous I +@calendar_refresh J +@calendar_remove K +@calendar_search L +@calendar_star M +@calendar_upload N +@cloud_check O +@cloud_download P +@cloud_minus Q +@cloud_noaccess R +@cloud_plus S +@cloud_refresh T +@cloud_remove U +@cloud_search V +@cloud_upload W +@document_check X +@document_cloud Y +@document_download Z +@document_flagged 0 +@document_graph 1 +@document_heart 2 +@document_minus 3 +@document_next 4 +@document_noaccess 5 +@document_note 6 +@document_pencil 7 +@document_picture 8 +@document_plus 9 +@document_previous ! +@document_refresh " +@document_remove # +@document_search $ +@document_star % +@document_upload & +@folder_check ' +@folder_cloud ( +@folder_document ) +@folder_download * +@folder_flagged + +@folder_graph , +@folder_heart - +@folder_minus . +@folder_next / +@folder_noaccess : +@folder_note ; +@folder_pencil < +@folder_picture = +@folder_plus > +@folder_previous ? +@folder_refresh @ +@folder_remove [ +@folder_search ] +@folder_star ^ +@folder_upload _ +@mail_check ` +@mail_cloud { +@mail_document | +@mail_download } +@mail_flagged ~ +@mail_heart \ + +mail_next e000 +mail_noaccess e001 +mail_note e002 +mail_pencil e003 +mail_picture e004 +mail_previous e005 +mail_refresh e006 +mail_remove e007 +mail_search e008 +mail_star e009 +mail_upload e00a +message_check e00b +message_dots e00c +message_happy e00d +message_heart e00e +message_minus e00f +message_note e010 +message_plus e011 +message_refresh e012 +message_remove e013 +message_sad e014 +smartphone_cloud e015 +smartphone_heart e016 +smartphone_noaccess e017 +smartphone_note e018 +smartphone_pencil e019 +smartphone_picture e01a +smartphone_refresh e01b +smartphone_search e01c +tablet_cloud e01d +tablet_heart e01e +tablet_noaccess e01f +tablet_note e020 +tablet_pencil e021 +tablet_picture e022 +tablet_refresh e023 +tablet_search e024 +todolist_2 e025 +todolist_check e026 +todolist_cloud e027 +todolist_download e028 +todolist_flagged e029 +todolist_minus e02a +todolist_noaccess e02b +todolist_pencil e02c +todolist_plus e02d +todolist_refresh e02e +todolist_remove e02f +todolist_search e030 +todolist_star e031 +todolist_upload e032 diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-basic-elaboration-10.ttf b/nnn-4.9/icons-in-terminal/fonts/linea/linea-basic-elaboration-10.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-ecommerce-10-map b/nnn-4.9/icons-in-terminal/fonts/linea/linea-ecommerce-10-map @@ -0,0 +1,85 @@ +@bag a +@bag_check b +@bag_cloud c +@bag_download d +@bag_minus e +@bag_plus f +@bag_refresh g +@bag_remove h +@bag_search i +@bag_upload j +@banknote k +@banknotes l +@basket m +@basket_check n +@basket_cloud o +@basket_download p +@basket_minus q +@basket_plus r +@basket_refresh s +@basket_remove t +@basket_search u +@basket_upload v +@bath w +@cart x +@cart_check y +@cart_cloud z +@cart_content A +@cart_download B +@cart_minus C +@cart_plus D +@cart_refresh E +@cart_remove F +@cart_search G +@cart_upload H +@cent I +@colon J +@creditcard K +@diamond L +@dollar M +@euro N +@franc O +@gift P +@graph1 Q +@graph2 R +@graph3 S +@graph_decrease T +@graph_increase U +@guarani V +@kips W +@lira X +@megaphone Y +@money Z +@naira 0 +@pesos 1 +@pound 2 +@receipt 3 +@receipt_bath 4 +@receipt_cent 5 +@receipt_dollar 6 +@receipt_euro 7 +@receipt_franc 8 +@receipt_guarani 9 +@receipt_kips ! +@receipt_lira " +@receipt_naira # +@receipt_pesos $ +@receipt_pound % +@receipt_rublo & +@receipt_rupee ' +@receipt_tugrik ( +@receipt_won ) +@receipt_yen * +@receipt_yen2 + +@recept_colon , +@rublo - +@rupee . +@safe / +@sale : +@sales ; +@ticket < +@tugriks = +@wallet > +@won ? +@yen @ +@yen2 [ diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-ecommerce-10.ttf b/nnn-4.9/icons-in-terminal/fonts/linea/linea-ecommerce-10.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-music-10-map b/nnn-4.9/icons-in-terminal/fonts/linea/linea-music-10-map @@ -0,0 +1,30 @@ +@beginning_button a +@bell b +@cd c +@diapason d +@eject_button e +@end_button f +@fastforward_button g +@headphones h +@ipod i +@loudspeaker j +@microphone k +@microphone_old l +@mixer m +@mute n +@note_multiple o +@note_single p +@pause_button q +@play_button r +@playlist s +@radio_ghettoblaster t +@radio_portable u +@record v +@recordplayer w +@repeat_button x +@rewind_button y +@shuffle_button z +@stop_button A +@tape B +@volume_down C +@volume_up D diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-music-10.ttf b/nnn-4.9/icons-in-terminal/fonts/linea/linea-music-10.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-software-10-map b/nnn-4.9/icons-in-terminal/fonts/linea/linea-software-10-map @@ -0,0 +1,101 @@ +@add_vectorpoint a +@box_oval b +@box_polygon c +@box_rectangle d +@box_roundedrectangle e +@character f +@crop g +@eyedropper h +@font_allcaps i +@font_baseline_shift j +@font_horizontal_scale k +@font_kerning l +@font_leading m +@font_size n +@font_smallcapital o +@font_smallcaps p +@font_strikethrough q +@font_tracking r +@font_underline s +@font_vertical_scale t +@horizontal_align_center u +@horizontal_align_left v +@horizontal_align_right w +@horizontal_distribute_center x +@horizontal_distribute_left y +@horizontal_distribute_right z +@indent_firstline A +@indent_left B +@indent_right C +@lasso D +@layers1 E +@layers2 F +@layout G +@layout_2columns H +@layout_3columns I +@layout_4boxes J +@layout_4columns K +@layout_4lines L +@layout_8boxes M +@layout_header N +@layout_header_2columns O +@layout_header_3columns P +@layout_header_4boxes Q +@layout_header_4columns R +@layout_header_complex S +@layout_header_complex2 T +@layout_header_complex3 U +@layout_header_complex4 V +@layout_header_sideleft W +@layout_header_sideright X +@layout_sidebar_left Y +@layout_sidebar_right Z +@magnete 0 +@pages 1 +@paintbrush 2 +@paintbucket 3 +@paintroller 4 +@paragraph 5 +@paragraph_align_left 6 +@paragraph_align_right 7 +@paragraph_center 8 +@paragraph_justify_all 9 +@paragraph_justify_center ! +@paragraph_justify_left " +@paragraph_justify_right # +@paragraph_space_after $ +@paragraph_space_before % +@pathfinder_exclude & +@pathfinder_intersect ' +@pathfinder_subtract ( +@pathfinder_unite ) +@pen * +@pen_add + +@pen_remove , +@pencil - +@polygonallasso . +@reflect_horizontal / +@reflect_vertical : +@remove_vectorpoint ; +@scale_expand < +@scale_reduce = +@selection_oval > +@selection_polygon ? +@selection_rectangle @ +@selection_roundedrectangle [ +@shape_oval ] +@shape_polygon ^ +@shape_rectangle _ +@shape_roundedrectangle ` +@slice { +@transform_bezier | +@vector_box } +@vector_composite ~ +@vector_line \ + +vertical_align_bottom e000 +vertical_align_center e001 +vertical_align_top e002 +vertical_distribute_bottom e003 +vertical_distribute_center e004 +vertical_distribute_top e005 diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-software-10.ttf b/nnn-4.9/icons-in-terminal/fonts/linea/linea-software-10.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-weather-10-map b/nnn-4.9/icons-in-terminal/fonts/linea/linea-weather-10-map @@ -0,0 +1,85 @@ +aquarius e000 +aries e001 +cancer e002 +capricorn e003 +cloud e004 +cloud_drop e005 +cloud_lightning e006 +cloud_snowflake e007 +downpour_fullmoon e008 +downpour_halfmoon e009 +downpour_sun e00a +drop e00b +first_quarter e00c +fog e00d +fog_fullmoon e00e +fog_halfmoon e00f +fog_sun e010 +fullmoon e011 +gemini e012 +hail e013 +hail_fullmoon e014 +hail_halfmoon e015 +hail_sun e016 +last_quarter e017 +leo e018 +libra e019 +lightning e01a +mistyrain e01b +mistyrain_fullmoon e01c +mistyrain_halfmoon e01d +mistyrain_sun e01e +moon e01f +moondown_full e020 +moondown_half e021 +moonset_full e022 +moonset_half e023 +move2 e024 +newmoon e025 +pisces e026 +rain e027 +rain_fullmoon e028 +rain_halfmoon e029 +rain_sun e02a +sagittarius e02b +scorpio e02c +snow e02d +snow_fullmoon e02e +snow_halfmoon e02f +snow_sun e030 +snowflake e031 +star e032 +storm_11 e033 +storm_32 e034 +storm_fullmoon e035 +storm_halfmoon e036 +storm_sun e037 +sun e038 +sundown e039 +sunset e03a +taurus e03b +tempest e03c +tempest_fullmoon e03d +tempest_halfmoon e03e +tempest_sun e03f +variable_fullmoon e040 +variable_halfmoon e041 +variable_sun e042 +virgo e043 +waning_cresent e044 +waning_gibbous e045 +waxing_cresent e046 +waxing_gibbous e047 +wind e048 +wind_e e049 +wind_fullmoon e04a +wind_halfmoon e04b +wind_n e04c +wind_ne e04d +wind_nw e04e +wind_s e04f +wind_se e050 +wind_sun e051 +wind_sw e052 +wind_w e053 +windgust e054 diff --git a/nnn-4.9/icons-in-terminal/fonts/linea/linea-weather-10.ttf b/nnn-4.9/icons-in-terminal/fonts/linea/linea-weather-10.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/material-design-icons.ttf b/nnn-4.9/icons-in-terminal/fonts/material-design-icons.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/material-design-map b/nnn-4.9/icons-in-terminal/fonts/material-design-map @@ -0,0 +1,932 @@ +3d_rotation e84d +ac_unit eb3b +access_alarm e190 +access_alarms e191 +access_time e192 +accessibility e84e +accessible e914 +account_balance e84f +account_balance_wallet e850 +account_box e851 +account_circle e853 +adb e60e +add e145 +add_a_photo e439 +add_alarm e193 +add_alert e003 +add_box e146 +add_circle e147 +add_circle_outline e148 +add_location e567 +add_shopping_cart e854 +add_to_photos e39d +add_to_queue e05c +adjust e39e +airline_seat_flat e630 +airline_seat_flat_angled e631 +airline_seat_individual_suite e632 +airline_seat_legroom_extra e633 +airline_seat_legroom_normal e634 +airline_seat_legroom_reduced e635 +airline_seat_recline_extra e636 +airline_seat_recline_normal e637 +airplanemode_active e195 +airplanemode_inactive e194 +airplay e055 +airport_shuttle eb3c +alarm e855 +alarm_add e856 +alarm_off e857 +alarm_on e858 +album e019 +all_inclusive eb3d +all_out e90b +android e859 +announcement e85a +apps e5c3 +archive e149 +arrow_back e5c4 +arrow_downward e5db +arrow_drop_down e5c5 +arrow_drop_down_circle e5c6 +arrow_drop_up e5c7 +arrow_forward e5c8 +arrow_upward e5d8 +art_track e060 +aspect_ratio e85b +assessment e85c +assignment e85d +assignment_ind e85e +assignment_late e85f +assignment_return e860 +assignment_returned e861 +assignment_turned_in e862 +assistant e39f +assistant_photo e3a0 +attach_file e226 +attach_money e227 +attachment e2bc +audiotrack e3a1 +autorenew e863 +av_timer e01b +backspace e14a +backup e864 +battery_alert e19c +battery_charging_full e1a3 +battery_full e1a4 +battery_std e1a5 +battery_unknown e1a6 +beach_access eb3e +beenhere e52d +block e14b +bluetooth e1a7 +bluetooth_audio e60f +bluetooth_connected e1a8 +bluetooth_disabled e1a9 +bluetooth_searching e1aa +blur_circular e3a2 +blur_linear e3a3 +blur_off e3a4 +blur_on e3a5 +book e865 +bookmark e866 +bookmark_border e867 +border_all e228 +border_bottom e229 +border_clear e22a +border_color e22b +border_horizontal e22c +border_inner e22d +border_left e22e +border_outer e22f +border_right e230 +border_style e231 +border_top e232 +border_vertical e233 +branding_watermark e06b +brightness_1 e3a6 +brightness_2 e3a7 +brightness_3 e3a8 +brightness_4 e3a9 +brightness_5 e3aa +brightness_6 e3ab +brightness_7 e3ac +brightness_auto e1ab +brightness_high e1ac +brightness_low e1ad +brightness_medium e1ae +broken_image e3ad +brush e3ae +bubble_chart e6dd +bug_report e868 +build e869 +burst_mode e43c +business e0af +business_center eb3f +cached e86a +cake e7e9 +call e0b0 +call_end e0b1 +call_made e0b2 +call_merge e0b3 +call_missed e0b4 +call_missed_outgoing e0e4 +call_received e0b5 +call_split e0b6 +call_to_action e06c +camera e3af +camera_alt e3b0 +camera_enhance e8fc +camera_front e3b1 +camera_rear e3b2 +camera_roll e3b3 +cancel e5c9 +card_giftcard e8f6 +card_membership e8f7 +card_travel e8f8 +casino eb40 +cast e307 +cast_connected e308 +center_focus_strong e3b4 +center_focus_weak e3b5 +change_history e86b +chat e0b7 +chat_bubble e0ca +chat_bubble_outline e0cb +check e5ca +check_box e834 +check_box_outline_blank e835 +check_circle e86c +chevron_left e5cb +chevron_right e5cc +child_care eb41 +child_friendly eb42 +chrome_reader_mode e86d +class e86e +clear e14c +clear_all e0b8 +close e5cd +closed_caption e01c +cloud e2bd +cloud_circle e2be +cloud_done e2bf +cloud_download e2c0 +cloud_off e2c1 +cloud_queue e2c2 +cloud_upload e2c3 +code e86f +collections e3b6 +collections_bookmark e431 +color_lens e3b7 +colorize e3b8 +comment e0b9 +compare e3b9 +compare_arrows e915 +computer e30a +confirmation_number e638 +contact_mail e0d0 +contact_phone e0cf +contacts e0ba +content_copy e14d +content_cut e14e +content_paste e14f +control_point e3ba +control_point_duplicate e3bb +copyright e90c +create e150 +create_new_folder e2cc +credit_card e870 +crop e3be +crop_16_9 e3bc +crop_3_2 e3bd +crop_5_4 e3bf +crop_7_5 e3c0 +crop_din e3c1 +crop_free e3c2 +crop_landscape e3c3 +crop_original e3c4 +crop_portrait e3c5 +crop_rotate e437 +crop_square e3c6 +dashboard e871 +data_usage e1af +date_range e916 +dehaze e3c7 +delete e872 +delete_forever e92b +delete_sweep e16c +description e873 +desktop_mac e30b +desktop_windows e30c +details e3c8 +developer_board e30d +developer_mode e1b0 +device_hub e335 +devices e1b1 +devices_other e337 +dialer_sip e0bb +dialpad e0bc +directions e52e +directions_bike e52f +directions_boat e532 +directions_bus e530 +directions_car e531 +directions_railway e534 +directions_run e566 +directions_subway e533 +directions_transit e535 +directions_walk e536 +disc_full e610 +dns e875 +do_not_disturb e612 +do_not_disturb_alt e611 +do_not_disturb_off e643 +do_not_disturb_on e644 +dock e30e +domain e7ee +done e876 +done_all e877 +donut_large e917 +donut_small e918 +drafts e151 +drag_handle e25d +drive_eta e613 +dvr e1b2 +edit e3c9 +edit_location e568 +eject e8fb +email e0be +enhanced_encryption e63f +equalizer e01d +error e000 +error_outline e001 +euro_symbol e926 +ev_station e56d +event e878 +event_available e614 +event_busy e615 +event_note e616 +event_seat e903 +exit_to_app e879 +expand_less e5ce +expand_more e5cf +explicit e01e +explore e87a +exposure e3ca +exposure_neg_1 e3cb +exposure_neg_2 e3cc +exposure_plus_1 e3cd +exposure_plus_2 e3ce +exposure_zero e3cf +extension e87b +face e87c +fast_forward e01f +fast_rewind e020 +favorite e87d +favorite_border e87e +featured_play_list e06d +featured_video e06e +feedback e87f +fiber_dvr e05d +fiber_manual_record e061 +fiber_new e05e +fiber_pin e06a +fiber_smart_record e062 +file_download e2c4 +file_upload e2c6 +filter e3d3 +filter_1 e3d0 +filter_2 e3d1 +filter_3 e3d2 +filter_4 e3d4 +filter_5 e3d5 +filter_6 e3d6 +filter_7 e3d7 +filter_8 e3d8 +filter_9 e3d9 +filter_9_plus e3da +filter_b_and_w e3db +filter_center_focus e3dc +filter_drama e3dd +filter_frames e3de +filter_hdr e3df +filter_list e152 +filter_none e3e0 +filter_tilt_shift e3e2 +filter_vintage e3e3 +find_in_page e880 +find_replace e881 +fingerprint e90d +first_page e5dc +fitness_center eb43 +flag e153 +flare e3e4 +flash_auto e3e5 +flash_off e3e6 +flash_on e3e7 +flight e539 +flight_land e904 +flight_takeoff e905 +flip e3e8 +flip_to_back e882 +flip_to_front e883 +folder e2c7 +folder_open e2c8 +folder_shared e2c9 +folder_special e617 +font_download e167 +format_align_center e234 +format_align_justify e235 +format_align_left e236 +format_align_right e237 +format_bold e238 +format_clear e239 +format_color_fill e23a +format_color_reset e23b +format_color_text e23c +format_indent_decrease e23d +format_indent_increase e23e +format_italic e23f +format_line_spacing e240 +format_list_bulleted e241 +format_list_numbered e242 +format_paint e243 +format_quote e244 +format_shapes e25e +format_size e245 +format_strikethrough e246 +format_textdirection_l_to_r e247 +format_textdirection_r_to_l e248 +format_underlined e249 +forum e0bf +forward e154 +forward_10 e056 +forward_30 e057 +forward_5 e058 +free_breakfast eb44 +fullscreen e5d0 +fullscreen_exit e5d1 +functions e24a +g_translate e927 +gamepad e30f +games e021 +gavel e90e +gesture e155 +get_app e884 +gif e908 +golf_course eb45 +gps_fixed e1b3 +gps_not_fixed e1b4 +gps_off e1b5 +grade e885 +gradient e3e9 +grain e3ea +graphic_eq e1b8 +grid_off e3eb +grid_on e3ec +group e7ef +group_add e7f0 +group_work e886 +hd e052 +hdr_off e3ed +hdr_on e3ee +hdr_strong e3f1 +hdr_weak e3f2 +headset e310 +headset_mic e311 +healing e3f3 +hearing e023 +help e887 +help_outline e8fd +high_quality e024 +highlight e25f +highlight_off e888 +history e889 +home e88a +hot_tub eb46 +hotel e53a +hourglass_empty e88b +hourglass_full e88c +http e902 +https e88d +image e3f4 +image_aspect_ratio e3f5 +import_contacts e0e0 +import_export e0c3 +important_devices e912 +inbox e156 +indeterminate_check_box e909 +info e88e +info_outline e88f +input e890 +insert_chart e24b +insert_comment e24c +insert_drive_file e24d +insert_emoticon e24e +insert_invitation e24f +insert_link e250 +insert_photo e251 +invert_colors e891 +invert_colors_off e0c4 +iso e3f6 +keyboard e312 +keyboard_arrow_down e313 +keyboard_arrow_left e314 +keyboard_arrow_right e315 +keyboard_arrow_up e316 +keyboard_backspace e317 +keyboard_capslock e318 +keyboard_hide e31a +keyboard_return e31b +keyboard_tab e31c +keyboard_voice e31d +kitchen eb47 +label e892 +label_outline e893 +landscape e3f7 +language e894 +laptop e31e +laptop_chromebook e31f +laptop_mac e320 +laptop_windows e321 +last_page e5dd +launch e895 +layers e53b +layers_clear e53c +leak_add e3f8 +leak_remove e3f9 +lens e3fa +library_add e02e +library_books e02f +library_music e030 +lightbulb_outline e90f +line_style e919 +line_weight e91a +linear_scale e260 +link e157 +linked_camera e438 +list e896 +live_help e0c6 +live_tv e639 +local_activity e53f +local_airport e53d +local_atm e53e +local_bar e540 +local_cafe e541 +local_car_wash e542 +local_convenience_store e543 +local_dining e556 +local_drink e544 +local_florist e545 +local_gas_station e546 +local_grocery_store e547 +local_hospital e548 +local_hotel e549 +local_laundry_service e54a +local_library e54b +local_mall e54c +local_movies e54d +local_offer e54e +local_parking e54f +local_pharmacy e550 +local_phone e551 +local_pizza e552 +local_play e553 +local_post_office e554 +local_printshop e555 +local_see e557 +local_shipping e558 +local_taxi e559 +location_city e7f1 +location_disabled e1b6 +location_off e0c7 +location_on e0c8 +location_searching e1b7 +lock e897 +lock_open e898 +lock_outline e899 +looks e3fc +looks_3 e3fb +looks_4 e3fd +looks_5 e3fe +looks_6 e3ff +looks_one e400 +looks_two e401 +loop e028 +loupe e402 +low_priority e16d +loyalty e89a +mail e158 +mail_outline e0e1 +map e55b +markunread e159 +markunread_mailbox e89b +memory e322 +menu e5d2 +merge_type e252 +message e0c9 +mic e029 +mic_none e02a +mic_off e02b +mms e618 +mode_comment e253 +mode_edit e254 +monetization_on e263 +money_off e25c +monochrome_photos e403 +mood e7f2 +mood_bad e7f3 +more e619 +more_horiz e5d3 +more_vert e5d4 +motorcycle e91b +mouse e323 +move_to_inbox e168 +movie e02c +movie_creation e404 +movie_filter e43a +multiline_chart e6df +music_note e405 +music_video e063 +my_location e55c +nature e406 +nature_people e407 +navigate_before e408 +navigate_next e409 +navigation e55d +near_me e569 +network_cell e1b9 +network_check e640 +network_locked e61a +network_wifi e1ba +new_releases e031 +next_week e16a +nfc e1bb +no_encryption e641 +no_sim e0cc +not_interested e033 +note e06f +note_add e89c +notifications e7f4 +notifications_active e7f7 +notifications_none e7f5 +notifications_off e7f6 +notifications_paused e7f8 +offline_pin e90a +ondemand_video e63a +opacity e91c +open_in_browser e89d +open_in_new e89e +open_with e89f +pages e7f9 +pageview e8a0 +palette e40a +pan_tool e925 +panorama e40b +panorama_fish_eye e40c +panorama_horizontal e40d +panorama_vertical e40e +panorama_wide_angle e40f +party_mode e7fa +pause e034 +pause_circle_filled e035 +pause_circle_outline e036 +payment e8a1 +people e7fb +people_outline e7fc +perm_camera_mic e8a2 +perm_contact_calendar e8a3 +perm_data_setting e8a4 +perm_device_information e8a5 +perm_identity e8a6 +perm_media e8a7 +perm_phone_msg e8a8 +perm_scan_wifi e8a9 +person e7fd +person_add e7fe +person_outline e7ff +person_pin e55a +person_pin_circle e56a +personal_video e63b +pets e91d +phone e0cd +phone_android e324 +phone_bluetooth_speaker e61b +phone_forwarded e61c +phone_in_talk e61d +phone_iphone e325 +phone_locked e61e +phone_missed e61f +phone_paused e620 +phonelink e326 +phonelink_erase e0db +phonelink_lock e0dc +phonelink_off e327 +phonelink_ring e0dd +phonelink_setup e0de +photo e410 +photo_album e411 +photo_camera e412 +photo_filter e43b +photo_library e413 +photo_size_select_actual e432 +photo_size_select_large e433 +photo_size_select_small e434 +picture_as_pdf e415 +picture_in_picture e8aa +picture_in_picture_alt e911 +pie_chart e6c4 +pie_chart_outlined e6c5 +pin_drop e55e +place e55f +play_arrow e037 +play_circle_filled e038 +play_circle_outline e039 +play_for_work e906 +playlist_add e03b +playlist_add_check e065 +playlist_play e05f +plus_one e800 +poll e801 +polymer e8ab +pool eb48 +portable_wifi_off e0ce +portrait e416 +power e63c +power_input e336 +power_settings_new e8ac +pregnant_woman e91e +present_to_all e0df +print e8ad +priority_high e645 +public e80b +publish e255 +query_builder e8ae +question_answer e8af +queue e03c +queue_music e03d +queue_play_next e066 +radio e03e +radio_button_checked e837 +radio_button_unchecked e836 +rate_review e560 +receipt e8b0 +recent_actors e03f +record_voice_over e91f +redeem e8b1 +redo e15a +refresh e5d5 +remove e15b +remove_circle e15c +remove_circle_outline e15d +remove_from_queue e067 +remove_red_eye e417 +remove_shopping_cart e928 +reorder e8fe +repeat e040 +repeat_one e041 +replay e042 +replay_10 e059 +replay_30 e05a +replay_5 e05b +reply e15e +reply_all e15f +report e160 +report_problem e8b2 +restaurant e56c +restaurant_menu e561 +restore e8b3 +restore_page e929 +ring_volume e0d1 +room e8b4 +room_service eb49 +rotate_90_degrees_ccw e418 +rotate_left e419 +rotate_right e41a +rounded_corner e920 +router e328 +rowing e921 +rss_feed e0e5 +rv_hookup e642 +satellite e562 +save e161 +scanner e329 +schedule e8b5 +school e80c +screen_lock_landscape e1be +screen_lock_portrait e1bf +screen_lock_rotation e1c0 +screen_rotation e1c1 +screen_share e0e2 +sd_card e623 +sd_storage e1c2 +search e8b6 +security e32a +select_all e162 +send e163 +sentiment_dissatisfied e811 +sentiment_neutral e812 +sentiment_satisfied e813 +sentiment_very_dissatisfied e814 +sentiment_very_satisfied e815 +settings e8b8 +settings_applications e8b9 +settings_backup_restore e8ba +settings_bluetooth e8bb +settings_brightness e8bd +settings_cell e8bc +settings_ethernet e8be +settings_input_antenna e8bf +settings_input_component e8c0 +settings_input_composite e8c1 +settings_input_hdmi e8c2 +settings_input_svideo e8c3 +settings_overscan e8c4 +settings_phone e8c5 +settings_power e8c6 +settings_remote e8c7 +settings_system_daydream e1c3 +settings_voice e8c8 +share e80d +shop e8c9 +shop_two e8ca +shopping_basket e8cb +shopping_cart e8cc +short_text e261 +show_chart e6e1 +shuffle e043 +signal_cellular_4_bar e1c8 +signal_cellular_connected_no_internet_4_bar e1cd +signal_cellular_no_sim e1ce +signal_cellular_null e1cf +signal_cellular_off e1d0 +signal_wifi_4_bar e1d8 +signal_wifi_4_bar_lock e1d9 +signal_wifi_off e1da +sim_card e32b +sim_card_alert e624 +skip_next e044 +skip_previous e045 +slideshow e41b +slow_motion_video e068 +smartphone e32c +smoke_free eb4a +smoking_rooms eb4b +sms e625 +sms_failed e626 +snooze e046 +sort e164 +sort_by_alpha e053 +spa eb4c +space_bar e256 +speaker e32d +speaker_group e32e +speaker_notes e8cd +speaker_notes_off e92a +speaker_phone e0d2 +spellcheck e8ce +star e838 +star_border e83a +star_half e839 +stars e8d0 +stay_current_landscape e0d3 +stay_current_portrait e0d4 +stay_primary_landscape e0d5 +stay_primary_portrait e0d6 +stop e047 +stop_screen_share e0e3 +storage e1db +store e8d1 +store_mall_directory e563 +straighten e41c +streetview e56e +strikethrough_s e257 +style e41d +subdirectory_arrow_left e5d9 +subdirectory_arrow_right e5da +subject e8d2 +subscriptions e064 +subtitles e048 +subway e56f +supervisor_account e8d3 +surround_sound e049 +swap_calls e0d7 +swap_horiz e8d4 +swap_vert e8d5 +swap_vertical_circle e8d6 +switch_camera e41e +switch_video e41f +sync e627 +sync_disabled e628 +sync_problem e629 +system_update e62a +system_update_alt e8d7 +tab e8d8 +tab_unselected e8d9 +tablet e32f +tablet_android e330 +tablet_mac e331 +tag_faces e420 +tap_and_play e62b +terrain e564 +text_fields e262 +text_format e165 +textsms e0d8 +texture e421 +theaters e8da +thumb_down e8db +thumb_up e8dc +thumbs_up_down e8dd +time_to_leave e62c +timelapse e422 +timeline e922 +timer e425 +timer_10 e423 +timer_3 e424 +timer_off e426 +title e264 +toc e8de +today e8df +toll e8e0 +tonality e427 +touch_app e913 +toys e332 +track_changes e8e1 +traffic e565 +train e570 +tram e571 +transfer_within_a_station e572 +transform e428 +translate e8e2 +trending_down e8e3 +trending_flat e8e4 +trending_up e8e5 +tune e429 +turned_in e8e6 +turned_in_not e8e7 +tv e333 +unarchive e169 +undo e166 +unfold_less e5d6 +unfold_more e5d7 +update e923 +usb e1e0 +verified_user e8e8 +vertical_align_bottom e258 +vertical_align_center e259 +vertical_align_top e25a +vibration e62d +video_call e070 +video_label e071 +video_library e04a +videocam e04b +videocam_off e04c +videogame_asset e338 +view_agenda e8e9 +view_array e8ea +view_carousel e8eb +view_column e8ec +view_comfy e42a +view_compact e42b +view_day e8ed +view_headline e8ee +view_list e8ef +view_module e8f0 +view_quilt e8f1 +view_stream e8f2 +view_week e8f3 +vignette e435 +visibility e8f4 +visibility_off e8f5 +voice_chat e62e +voicemail e0d9 +volume_down e04d +volume_mute e04e +volume_off e04f +volume_up e050 +vpn_key e0da +vpn_lock e62f +wallpaper e1bc +warning e002 +watch e334 +watch_later e924 +wb_auto e42c +wb_cloudy e42d +wb_incandescent e42e +wb_iridescent e436 +wb_sunny e430 +wc e63d +web e051 +web_asset e069 +weekend e16b +whatshot e80e +widgets e1bd +wifi e63e +wifi_lock e1e1 +wifi_tethering e1e2 +work e8f9 +wrap_text e25b +youtube_searched_for e8fa +zoom_in e8ff +zoom_out e900 +zoom_out_map e56b diff --git a/nnn-4.9/icons-in-terminal/fonts/myicons.ttf b/nnn-4.9/icons-in-terminal/fonts/myicons.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/octicons.ttf b/nnn-4.9/icons-in-terminal/fonts/octicons.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/fonts/weathericons-map b/nnn-4.9/icons-in-terminal/fonts/weathericons-map @@ -0,0 +1,596 @@ +day_sunny f00d +day_cloudy f002 +day_cloudy_gusts f000 +day_cloudy_windy f001 +day_fog f003 +day_hail f004 +day_haze f0b6 +day_lightning f005 +day_rain f008 +day_rain_mix f006 +day_rain_wind f007 +day_showers f009 +day_sleet f0b2 +day_sleet_storm f068 +day_snow f00a +day_snow_thunderstorm f06b +day_snow_wind f065 +day_sprinkle f00b +day_storm_showers f00e +day_sunny_overcast f00c +day_thunderstorm f010 +day_windy f085 +solar_eclipse f06e +hot f072 +day_cloudy_high f07d +day_light_wind f0c4 +night_clear f02e +night_alt_cloudy f086 +night_alt_cloudy_gusts f022 +night_alt_cloudy_windy f023 +night_alt_hail f024 +night_alt_lightning f025 +night_alt_rain f028 +night_alt_rain_mix f026 +night_alt_rain_wind f027 +night_alt_showers f029 +night_alt_sleet f0b4 +night_alt_sleet_storm f06a +night_alt_snow f02a +night_alt_snow_thunderstorm f06d +night_alt_snow_wind f067 +night_alt_sprinkle f02b +night_alt_storm_showers f02c +night_alt_thunderstorm f02d +night_cloudy f031 +night_cloudy_gusts f02f +night_cloudy_windy f030 +night_fog f04a +night_hail f032 +night_lightning f033 +night_partly_cloudy f083 +night_rain f036 +night_rain_mix f034 +night_rain_wind f035 +night_showers f037 +night_sleet f0b3 +night_sleet_storm f069 +night_snow f038 +night_snow_thunderstorm f06c +night_snow_wind f066 +night_sprinkle f039 +night_storm_showers f03a +night_thunderstorm f03b +lunar_eclipse f070 +stars f077 +storm_showers f01d +thunderstorm f01e +night_alt_cloudy_high f07e +night_cloudy_high f080 +night_alt_partly_cloudy f081 +cloud f041 +cloudy f013 +cloudy_gusts f011 +cloudy_windy f012 +fog f014 +hail f015 +rain f019 +rain_mix f017 +rain_wind f018 +showers f01a +sleet f0b5 +snow f01b +sprinkle f01c +snow_wind f064 +smog f074 +smoke f062 +lightning f016 +raindrops f04e +raindrop f078 +dust f063 +snowflake_cold f076 +windy f021 +strong_wind f050 +sandstorm f082 +earthquake f0c6 +fire f0c7 +flood f07c +meteor f071 +tsunami f0c5 +volcano f0c8 +hurricane f073 +tornado f056 +small_craft_advisory f0cc +gale_warning f0cd +storm_warning f0ce +hurricane_warning f0cf +wind_direction f0b1 +alien f075 +celsius f03c +fahrenheit f045 +degrees f042 +thermometer f055 +thermometer_exterior f053 +thermometer_internal f054 +cloud_down f03d +cloud_up f040 +cloud_refresh f03e +horizon f047 +horizon_alt f046 +sunrise f051 +sunset f052 +moonrise f0c9 +moonset f0ca +refresh f04c +refresh_alt f04b +umbrella f084 +barometer f079 +humidity f07a +na f07b +train f0cb +moon_new f095 +moon_waxing_crescent_1 f096 +moon_waxing_crescent_2 f097 +moon_waxing_crescent_3 f098 +moon_waxing_crescent_4 f099 +moon_waxing_crescent_5 f09a +moon_waxing_crescent_6 f09b +moon_first_quarter f09c +moon_waxing_gibbous_1 f09d +moon_waxing_gibbous_2 f09e +moon_waxing_gibbous_3 f09f +moon_waxing_gibbous_4 f0a0 +moon_waxing_gibbous_5 f0a1 +moon_waxing_gibbous_6 f0a2 +moon_full f0a3 +moon_waning_gibbous_1 f0a4 +moon_waning_gibbous_2 f0a5 +moon_waning_gibbous_3 f0a6 +moon_waning_gibbous_4 f0a7 +moon_waning_gibbous_5 f0a8 +moon_waning_gibbous_6 f0a9 +moon_third_quarter f0aa +moon_waning_crescent_1 f0ab +moon_waning_crescent_2 f0ac +moon_waning_crescent_3 f0ad +moon_waning_crescent_4 f0ae +moon_waning_crescent_5 f0af +moon_waning_crescent_6 f0b0 +moon_alt_new f0eb +moon_alt_waxing_crescent_1 f0d0 +moon_alt_waxing_crescent_2 f0d1 +moon_alt_waxing_crescent_3 f0d2 +moon_alt_waxing_crescent_4 f0d3 +moon_alt_waxing_crescent_5 f0d4 +moon_alt_waxing_crescent_6 f0d5 +moon_alt_first_quarter f0d6 +moon_alt_waxing_gibbous_1 f0d7 +moon_alt_waxing_gibbous_2 f0d8 +moon_alt_waxing_gibbous_3 f0d9 +moon_alt_waxing_gibbous_4 f0da +moon_alt_waxing_gibbous_5 f0db +moon_alt_waxing_gibbous_6 f0dc +moon_alt_full f0dd +moon_alt_waning_gibbous_1 f0de +moon_alt_waning_gibbous_2 f0df +moon_alt_waning_gibbous_3 f0e0 +moon_alt_waning_gibbous_4 f0e1 +moon_alt_waning_gibbous_5 f0e2 +moon_alt_waning_gibbous_6 f0e3 +moon_alt_third_quarter f0e4 +moon_alt_waning_crescent_1 f0e5 +moon_alt_waning_crescent_2 f0e6 +moon_alt_waning_crescent_3 f0e7 +moon_alt_waning_crescent_4 f0e8 +moon_alt_waning_crescent_5 f0e9 +moon_alt_waning_crescent_6 f0ea +moon_0 f095 +moon_1 f096 +moon_2 f097 +moon_3 f098 +moon_4 f099 +moon_5 f09a +moon_6 f09b +moon_7 f09c +moon_8 f09d +moon_9 f09e +moon_10 f09f +moon_11 f0a0 +moon_12 f0a1 +moon_13 f0a2 +moon_14 f0a3 +moon_15 f0a4 +moon_16 f0a5 +moon_17 f0a6 +moon_18 f0a7 +moon_19 f0a8 +moon_20 f0a9 +moon_21 f0aa +moon_22 f0ab +moon_23 f0ac +moon_24 f0ad +moon_25 f0ae +moon_26 f0af +moon_27 f0b0 +time_1 f08a +time_2 f08b +time_3 f08c +time_4 f08d +time_5 f08e +time_6 f08f +time_7 f090 +time_8 f091 +time_9 f092 +time_10 f093 +time_11 f094 +time_12 f089 +direction_up f058 +direction_up_right f057 +direction_right f04d +direction_down_right f088 +direction_down f044 +direction_down_left f043 +direction_left f048 +direction_up_left f087 +wind_beaufort_0 f0b7 +wind_beaufort_1 f0b8 +wind_beaufort_2 f0b9 +wind_beaufort_3 f0ba +wind_beaufort_4 f0bb +wind_beaufort_5 f0bc +wind_beaufort_6 f0bd +wind_beaufort_7 f0be +wind_beaufort_8 f0bf +wind_beaufort_9 f0c0 +wind_beaufort_10 f0c1 +wind_beaufort_11 f0c2 +wind_beaufort_12 f0c3 +yahoo_0 f056 +yahoo_1 f00e +yahoo_2 f073 +yahoo_3 f01e +yahoo_4 f01e +yahoo_5 f017 +yahoo_6 f017 +yahoo_7 f017 +yahoo_8 f015 +yahoo_9 f01a +yahoo_10 f015 +yahoo_11 f01a +yahoo_12 f01a +yahoo_13 f01b +yahoo_14 f00a +yahoo_15 f064 +yahoo_16 f01b +yahoo_17 f015 +yahoo_18 f017 +yahoo_19 f063 +yahoo_20 f014 +yahoo_21 f021 +yahoo_22 f062 +yahoo_23 f050 +yahoo_24 f050 +yahoo_25 f076 +yahoo_26 f013 +yahoo_27 f031 +yahoo_28 f002 +yahoo_29 f031 +yahoo_30 f002 +yahoo_31 f02e +yahoo_32 f00d +yahoo_33 f083 +yahoo_34 f00c +yahoo_35 f017 +yahoo_36 f072 +yahoo_37 f00e +yahoo_38 f00e +yahoo_39 f00e +yahoo_40 f01a +yahoo_41 f064 +yahoo_42 f01b +yahoo_43 f064 +yahoo_44 f00c +yahoo_45 f00e +yahoo_46 f01b +yahoo_47 f00e +yahoo_3200 f077 +forecast_io_clear_day f00d +forecast_io_clear_night f02e +forecast_io_rain f019 +forecast_io_snow f01b +forecast_io_sleet f0b5 +forecast_io_wind f050 +forecast_io_fog f014 +forecast_io_cloudy f013 +forecast_io_partly_cloudy_day f002 +forecast_io_partly_cloudy_night f031 +forecast_io_hail f015 +forecast_io_thunderstorm f01e +forecast_io_tornado f056 +wmo4680_0 f055 +wmo4680_00 f055 +wmo4680_1 f013 +wmo4680_01 f013 +wmo4680_2 f055 +wmo4680_02 f055 +wmo4680_3 f013 +wmo4680_03 f013 +wmo4680_4 f014 +wmo4680_04 f014 +wmo4680_5 f014 +wmo4680_05 f014 +wmo4680_10 f014 +wmo4680_11 f014 +wmo4680_12 f016 +wmo4680_18 f050 +wmo4680_20 f014 +wmo4680_21 f017 +wmo4680_22 f017 +wmo4680_23 f019 +wmo4680_24 f01b +wmo4680_25 f015 +wmo4680_26 f01e +wmo4680_27 f063 +wmo4680_28 f063 +wmo4680_29 f063 +wmo4680_30 f014 +wmo4680_31 f014 +wmo4680_32 f014 +wmo4680_33 f014 +wmo4680_34 f014 +wmo4680_35 f014 +wmo4680_40 f017 +wmo4680_41 f01c +wmo4680_42 f019 +wmo4680_43 f01c +wmo4680_44 f019 +wmo4680_45 f015 +wmo4680_46 f015 +wmo4680_47 f01b +wmo4680_48 f01b +wmo4680_50 f01c +wmo4680_51 f01c +wmo4680_52 f019 +wmo4680_53 f019 +wmo4680_54 f076 +wmo4680_55 f076 +wmo4680_56 f076 +wmo4680_57 f01c +wmo4680_58 f019 +wmo4680_60 f01c +wmo4680_61 f01c +wmo4680_62 f019 +wmo4680_63 f019 +wmo4680_64 f015 +wmo4680_65 f015 +wmo4680_66 f015 +wmo4680_67 f017 +wmo4680_68 f017 +wmo4680_70 f01b +wmo4680_71 f01b +wmo4680_72 f01b +wmo4680_73 f01b +wmo4680_74 f076 +wmo4680_75 f076 +wmo4680_76 f076 +wmo4680_77 f01b +wmo4680_78 f076 +wmo4680_80 f019 +wmo4680_81 f01c +wmo4680_82 f019 +wmo4680_83 f019 +wmo4680_84 f01d +wmo4680_85 f017 +wmo4680_86 f017 +wmo4680_87 f017 +wmo4680_89 f015 +wmo4680_90 f016 +wmo4680_91 f01d +wmo4680_92 f01e +wmo4680_93 f01e +wmo4680_94 f016 +wmo4680_95 f01e +wmo4680_96 f01e +wmo4680_99 f056 +owm_200 f01e +owm_201 f01e +owm_202 f01e +owm_210 f016 +owm_211 f016 +owm_212 f016 +owm_221 f016 +owm_230 f01e +owm_231 f01e +owm_232 f01e +owm_300 f01c +owm_301 f01c +owm_302 f019 +owm_310 f017 +owm_311 f019 +owm_312 f019 +owm_313 f01a +owm_314 f019 +owm_321 f01c +owm_500 f01c +owm_501 f019 +owm_502 f019 +owm_503 f019 +owm_504 f019 +owm_511 f017 +owm_520 f01a +owm_521 f01a +owm_522 f01a +owm_531 f01d +owm_600 f01b +owm_601 f01b +owm_602 f0b5 +owm_611 f017 +owm_612 f017 +owm_615 f017 +owm_616 f017 +owm_620 f017 +owm_621 f01b +owm_622 f01b +owm_701 f01a +owm_711 f062 +owm_721 f0b6 +owm_731 f063 +owm_741 f014 +owm_761 f063 +owm_762 f063 +owm_771 f011 +owm_781 f056 +owm_800 f00d +owm_801 f011 +owm_802 f011 +owm_803 f012 +owm_804 f013 +owm_900 f056 +owm_901 f01d +owm_902 f073 +owm_903 f076 +owm_904 f072 +owm_905 f021 +owm_906 f015 +owm_957 f050 +owm_day_200 f010 +owm_day_201 f010 +owm_day_202 f010 +owm_day_210 f005 +owm_day_211 f005 +owm_day_212 f005 +owm_day_221 f005 +owm_day_230 f010 +owm_day_231 f010 +owm_day_232 f010 +owm_day_300 f00b +owm_day_301 f00b +owm_day_302 f008 +owm_day_310 f008 +owm_day_311 f008 +owm_day_312 f008 +owm_day_313 f008 +owm_day_314 f008 +owm_day_321 f00b +owm_day_500 f00b +owm_day_501 f008 +owm_day_502 f008 +owm_day_503 f008 +owm_day_504 f008 +owm_day_511 f006 +owm_day_520 f009 +owm_day_521 f009 +owm_day_522 f009 +owm_day_531 f00e +owm_day_600 f00a +owm_day_601 f0b2 +owm_day_602 f00a +owm_day_611 f006 +owm_day_612 f006 +owm_day_615 f006 +owm_day_616 f006 +owm_day_620 f006 +owm_day_621 f00a +owm_day_622 f00a +owm_day_701 f009 +owm_day_711 f062 +owm_day_721 f0b6 +owm_day_731 f063 +owm_day_741 f003 +owm_day_761 f063 +owm_day_762 f063 +owm_day_771 f000 +owm_day_781 f056 +owm_day_800 f00d +owm_day_801 f000 +owm_day_802 f000 +owm_day_803 f000 +owm_day_804 f00c +owm_day_900 f056 +owm_day_901 f00e +owm_day_902 f073 +owm_day_903 f076 +owm_day_904 f072 +owm_day_905 f0c4 +owm_day_906 f004 +owm_day_957 f050 +owm_night_200 f02d +owm_night_201 f02d +owm_night_202 f02d +owm_night_210 f025 +owm_night_211 f025 +owm_night_212 f025 +owm_night_221 f025 +owm_night_230 f02d +owm_night_231 f02d +owm_night_232 f02d +owm_night_300 f02b +owm_night_301 f02b +owm_night_302 f028 +owm_night_310 f028 +owm_night_311 f028 +owm_night_312 f028 +owm_night_313 f028 +owm_night_314 f028 +owm_night_321 f02b +owm_night_500 f02b +owm_night_501 f028 +owm_night_502 f028 +owm_night_503 f028 +owm_night_504 f028 +owm_night_511 f026 +owm_night_520 f029 +owm_night_521 f029 +owm_night_522 f029 +owm_night_531 f02c +owm_night_600 f02a +owm_night_601 f0b4 +owm_night_602 f02a +owm_night_611 f026 +owm_night_612 f026 +owm_night_615 f026 +owm_night_616 f026 +owm_night_620 f026 +owm_night_621 f02a +owm_night_622 f02a +owm_night_701 f029 +owm_night_711 f062 +owm_night_721 f0b6 +owm_night_731 f063 +owm_night_741 f04a +owm_night_761 f063 +owm_night_762 f063 +owm_night_771 f022 +owm_night_781 f056 +owm_night_800 f02e +owm_night_801 f022 +owm_night_802 f022 +owm_night_803 f022 +owm_night_804 f086 +owm_night_900 f056 +owm_night_901 f03a +owm_night_902 f073 +owm_night_903 f076 +owm_night_904 f072 +owm_night_905 f021 +owm_night_906 f024 +owm_night_957 f050 +wu_chanceflurries f064 +wu_chancerain f019 +wu_chancesleat f0b5 +wu_chancesnow f01b +wu_chancetstorms f01e +wu_clear f00d +wu_cloudy f002 +wu_flurries f064 +wu_hazy f0b6 +wu_mostlycloudy f002 +wu_mostlysunny f00d +wu_partlycloudy f002 +wu_partlysunny f00d +wu_rain f01a +wu_sleat f0b5 +wu_snow f01b +wu_sunny f00d +wu_tstorms f01e +wu_unknown f00d diff --git a/nnn-4.9/icons-in-terminal/fonts/weathericons.ttf b/nnn-4.9/icons-in-terminal/fonts/weathericons.ttf Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/image/icons-fish.jpg b/nnn-4.9/icons-in-terminal/image/icons-fish.jpg Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/image/icons.jpg b/nnn-4.9/icons-in-terminal/image/icons.jpg Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/image/ls.jpg b/nnn-4.9/icons-in-terminal/image/ls.jpg Binary files differ. diff --git a/nnn-4.9/icons-in-terminal/install-autodetect.sh b/nnn-4.9/icons-in-terminal/install-autodetect.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +# +# What does this script ? +# +# Creates the files: +# ~/.fonts/icons-in-terminal.ttf +# ~/.config/fontconfig/conf.d/30-icons.conf +# +# Creates the directory: +# ~/.local/share/icons-in-terminal +# or $XDG_DATA_HOME/icons-in-terminal (if $XDG_DATA_HOME is set) +# +# Copy the built files in the created directory +# +# Run the command: +# fc-cache +# + +set -xe + +DATA="${XDG_DATA_HOME:-${HOME}/.local/share}/icons-in-terminal/" + +mkdir -p ~/.fonts +cp ./build/icons-in-terminal.ttf ~/.fonts/ +mkdir -p ~/.config/fontconfig/conf.d +./scripts/generate_fontconfig_autodetect.sh > ~/.config/fontconfig/conf.d/30-icons.conf +fc-cache -fvr --really-force ~/.fonts + +mkdir -p "$DATA" +cp ./build/* "$DATA" + +set +xe + +VERBOSE=1 ./scripts/generate_fontconfig_autodetect.sh + +echo -e "\nFont successfully installed. Now start a new terminal and run print_icons.sh :)" diff --git a/nnn-4.9/icons-in-terminal/install.sh b/nnn-4.9/icons-in-terminal/install.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +# +# What does this script ? +# +# Create the files: +# ~/.fonts/icons-in-terminal.ttf +# ~/.config/fontconfig/conf.d/30-icons.conf +# +# Create the directory: +# ~/.local/share/icons-in-terminal +# or $XDG_DATA_HOME/icons-in-terminal (if $XDG_DATA_HOME is set) +# +# Copy the built files in the created directory +# +# Run the command: +# fc-cache +# + +source ./scripts/colors.sh + +set -xe + +DATA="${XDG_DATA_HOME:-${HOME}/.local/share}/icons-in-terminal/" + +mkdir -p ~/.fonts +cp ./build/icons-in-terminal.ttf ~/.fonts/ +mkdir -p ~/.config/fontconfig/conf.d +./scripts/generate_fontconfig.sh > ~/.config/fontconfig/conf.d/30-icons.conf +fc-cache -fvr --really-force ~/.fonts + +mkdir -p "$DATA" +cp ./build/* "$DATA" + +set +xe + +echo -e "\n${YELLOW}Recommended additional step:" +echo "Edit ~/.config/fontconfig/conf.d/30-icons.conf" +echo "Check that the font(s) you are using in your terminal(s) is listed and remove all the others lines" +echo -e "\n${NORMAL}Font successfully installed. Now start a new terminal and run print_icons.sh :)" diff --git a/nnn-4.9/icons-in-terminal/print_icons.sh b/nnn-4.9/icons-in-terminal/print_icons.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' +filename="./build/mapping.txt" +count=0 + +while read -r line +do + if [ "${line:0:1}" = "#" ] + then + name_num=(${line//:/ }) + echo -e "\n${YELLOW}${name_num[0]:1} (${name_num[1]} glyphs)${NC}:" + count=$((count + name_num[1])) + else + str="" + IFS=';' read -ra array_glyph <<< "$line" + for glyph in "${array_glyph[@]}"; do + info=(${glyph//:/ }) + if [ $# -gt 0 ]; then + str="$str${info[0]}: \u${info[1]}\n" + else + str="$str \u${info[1]}" + fi + done + echo -e $str | sed 's/ / /g' + fi +done < "$filename" + +echo -e "\n${GREEN}Total: $count glyphes${NC}" diff --git a/nnn-4.9/icons-in-terminal/scripts/colors.sh b/nnn-4.9/icons-in-terminal/scripts/colors.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +NORMAL='\033[0m' +RED='\033[00;31m' +GREEN='\033[00;32m' +YELLOW='\033[00;33m' +BLUE='\033[00;34m' +PURPLE='\033[00;35m' +CYAN='\033[00;36m' +LIGHTGRAY='\033[00;37m' +LRED='\033[01;31m' +LGREEN='\033[01;32m' +LYELLOW='\033[01;33m' +LBLUE='\033[01;34m' +LPURPLE='\033[01;35m' +LCYAN='\033[01;36m' +WHITE='\033[01;37m' +UNDERLINE='\033[04m' diff --git a/nnn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_console.sh b/nnn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_console.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +#Useless, consoles don't support font fallback + +find() { + grep -i "fontface" $1 | cut -d '=' -f 2 +} + +FILE_CONFIG=/etc/default/console-setup + +if [ -e $FILE_CONFIG -a -r $FILE_CONFIG ];then + find "$FILE_CONFIG" +fi diff --git a/nnn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_gnometerminal.sh b/nnn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_gnometerminal.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +BASEDIR=$(dirname `readlink -f "$0"`) +source ${BASEDIR}/../colors.sh + +if [ -n "$VERBOSE" ]; then + echo -e "${CYAN}- GNOME TERMINAL:${NORMAL}" +fi + +LIST_PROFILES=`dconf read /org/gnome/terminal/legacy/profiles:/list` +LIST_PROFILES="${LIST_PROFILES:1:${#LIST_PROFILES}-2}" +LIST_PROFILES=`echo $LIST_PROFILES | sed "s/, /\n/g" | sed -e "s/^'//" -e "s/'\$//"` + +IFS=' ' read -r -a LIST_PROFILES <<< $LIST_PROFILES +for profile in "${LIST_PROFILES[@]}"; do + + NAME=`dconf read /org/gnome/terminal/legacy/profiles:/:$profile/visible-name` + if [ -z "$FONT" ]; then + NAME="'Default'" + fi + + USE_SYSTEM_FONT=`dconf read /org/gnome/terminal/legacy/profiles:/:$profile/use-system-font` + FONT=`dconf read /org/gnome/terminal/legacy/profiles:/:$profile/font | sed -e "s/^'//" -e "s/'\$//" | rev | cut -d ' ' -f 2- | rev` + + if [ "$USE_SYSTEM_FONT" = "true" ]; then + FONT=`./find_font_system.sh` + if [ -z "$FONT" ]; then + echo -e "${RED}ERROR: ${NORMAL}${0}:" + echo "Fail to retrieve font system" + echo "Please comment this issue: https://github.com/sebastiencs/icons-in-terminal/issues/1" + echo "Use install.sh instead" + exit 1 + fi + fi + + if [ -n "$VERBOSE" ]; then + echo -e " ${UNDERLINE}Profile: $NAME${NORMAL}" +# echo -e " ${UNDERLINE}Profile: $NAME ($profile)${NORMAL}" + echo -e "\tFont family:\t\t${GREEN}$FONT${NORMAL}" + echo -e "\tUse system font:\t$USE_SYSTEM_FONT" + else + echo "$FONT" + fi +done + +if [ ${#LIST_PROFILES[@]} -eq 0 ]; then + echo "No font found" +fi diff --git a/nnn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_system.sh b/nnn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_system.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +gsettings get org.gnome.desktop.interface monospace-font-name | sed -e "s/^'//" -e "s/'\$//" | rev | cut -d ' ' -f 2- | rev diff --git a/nnn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_terminator.sh b/nnn-4.9/icons-in-terminal/scripts/detect_font_terminal/find_font_terminator.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash + +BASEDIR=$(dirname `readlink -f "$0"`) +source ${BASEDIR}/../colors.sh + +if [ -n "$VERBOSE" ]; then + echo -e "${CYAN}- TERMINATOR:${NORMAL}" +fi + +GLOBAL_PROFILES=() + +# Print only the [[profiles]] section in the config file +get_profiles() { + PROFILE=0 + while IFS='' read -r LINE || [[ -n "$LINE" ]]; do + LINE=`echo $LINE | sed 's/^ *//;s/ *$//'` + case $LINE in + "[global_config]"|"[keybindings]"|"[layouts]"|"[plugins]") PROFILE=0;; + "[profiles]") PROFILE=1;; + esac + if [ $PROFILE -eq 1 -a "$LINE" != "[profiles]" ]; then + echo "${LINE[0]}" | sed 's/ = /=/g' + GLOBAL_PROFILES+=("${LINE[0]}") + fi + done < "$1" +} + +# Print names of profiles +get_names_of_profiles() { + while IFS='' read -r LINE || [[ -n "$LINE" ]]; do + case $LINE in + \[\[*\]\]) echo "$LINE";; + esac + done +} + +FOUND=0 + +# For each section name, get the value of font and use_system_font +read_profiles() { + get_profiles $1 > /dev/null # Use to initialize GLOBAL_PROFILES + NAMES=(`get_profiles $1 | get_names_of_profiles`) # because this line is executed in a subshell and doesn't modify GLOBAL_PROFILES + for NAME in "${NAMES[@]}"; do + ON_PROFILE=0 + USE_SYSTEM_FONT=1 + FONT_NAME="" + for LINE_PROFILE in "${GLOBAL_PROFILES[@]}"; do + case "$LINE_PROFILE" in + "$NAME") ON_PROFILE=1;; + \[\[*\]\]) ON_PROFILE=0;; + esac + LINE_PROFILE=`echo $LINE_PROFILE | sed 's/ = /=/g'` + if [[ $ON_PROFILE -eq 1 ]]; then + case "$LINE_PROFILE" in + font=*) FONT_NAME=`echo $LINE_PROFILE | sed 's/font=//g' | rev | cut -d ' ' -f 2- | rev`;; + use_system_font=False) USE_SYSTEM_FONT=0 ;; + esac +# echo $LINE_PROFILE + fi + done + + if [ $USE_SYSTEM_FONT -eq 1 -o "$FONT_NAME" = "" ]; then + FONT_NAME=`${BASEDIR}/find_font_system.sh` + fi + + if [ -n "$VERBOSE" ]; then + if [ $USE_SYSTEM_FONT -eq 1 ]; then + USE_SYSTEM_FONT="true" + else + USE_SYSTEM_FONT="false" + fi + echo -e " ${UNDERLINE}Profile '${NAME:2:-2}':${NORMAL}" + echo -e "\tFont familly:\t\t${GREEN}$FONT_NAME${NORMAL}" + echo -e "\tUse system font:\t$USE_SYSTEM_FONT" + else + echo "$FONT_NAME" + fi + + FOUND=1 + + done +} + +FILE_CONFIG=${XDG_CONFIG_HOME:-${HOME}/.config}/terminator/config + +if [ -e $FILE_CONFIG -a -r $FILE_CONFIG ];then + read_profiles "$FILE_CONFIG" +fi + +if [ $FOUND -eq 0 ];then + + which terminator 2> /dev/null > /dev/null + EXIST=$? + + if [ $EXIST -eq 0 -a -n "$VERBOSE" ];then + echo -e "Installed but no config file found:\nUse system font instead: \t${GREEN}`${BASEDIR}/find_font_system.sh` $NORMAL" + elif [ $EXIST -eq 0 ]; then + ./${BASEDIR}find_font_system.sh + elif [ -n "$VERBOSE" ]; then + echo "No font found" + fi +fi diff --git a/nnn-4.9/icons-in-terminal/scripts/firacode.el b/nnn-4.9/icons-in-terminal/scripts/firacode.el @@ -0,0 +1,138 @@ + +;; Taken from https://gist.github.com/mordocai/50783defab3c3d1650e068b4d1c91495 +;; Modified to point to icons-in-terminal codepoints + +(defconst firacode-codepoint-start #xedff) + +;;; Fira code +;; This works when using emacs --daemon + emacsclient +(add-hook 'after-make-frame-functions (lambda (frame) (set-fontset-font t '(#Xedff . #Xee6d) "icons-in-terminal"))) +;; This works when using emacs without server/client +(set-fontset-font t '(#Xedff . #Xee6e) "icons-in-terminal") +;; I haven't found one statement that makes both of the above situations work, so I use both for now + +(defconst fira-code-font-lock-keywords-alist + (mapcar (lambda (regex-char-pair) + `(,(car regex-char-pair) + (0 (prog1 () + (compose-region (match-beginning 1) + (match-end 1) + ;; The first argument to concat is a string containing a literal tab + ,(concat " " (list (decode-char 'ucs (cadr regex-char-pair))))))))) + `(("\\(www\\)" ,(+ firacode-codepoint-start 0)) + ("[^/]\\(\\*\\*\\)[^/]" ,(+ firacode-codepoint-start 1)) + ("\\(\\*\\*\\*\\)" ,(+ firacode-codepoint-start 2)) + ("\\(\\*\\*/\\)" ,(+ firacode-codepoint-start 3)) + ("\\(\\*>\\)" ,(+ firacode-codepoint-start 4)) + ("[^*]\\(\\*/\\)" ,(+ firacode-codepoint-start 5)) + ("\\(\\\\\\\\\\)" ,(+ firacode-codepoint-start 6)) + ("\\(\\\\\\\\\\\\\\)" ,(+ firacode-codepoint-start 7)) + ("\\({-\\)" ,(+ firacode-codepoint-start 8)) + ("\\(\\[\\]\\)" ,(+ firacode-codepoint-start 9)) + ("\\(::\\)" ,(+ firacode-codepoint-start 10)) + ("\\(:::\\)" ,(+ firacode-codepoint-start 11)) + ("[^=]\\(:=\\)" ,(+ firacode-codepoint-start 12)) + ("\\(!!\\)" ,(+ firacode-codepoint-start 13)) + ("\\(!=\\)" ,(+ firacode-codepoint-start 14)) + ("\\(!==\\)" ,(+ firacode-codepoint-start 15)) + ("\\(-}\\)" ,(+ firacode-codepoint-start 16)) + ("\\(--\\)" ,(+ firacode-codepoint-start 17)) + ("\\(---\\)" ,(+ firacode-codepoint-start 18)) + ("\\(-->\\)" ,(+ firacode-codepoint-start 19)) + ("[^-]\\(->\\)" ,(+ firacode-codepoint-start 20)) + ("\\(->>\\)" ,(+ firacode-codepoint-start 21)) + ("\\(-<\\)" ,(+ firacode-codepoint-start 22)) + ("\\(-<<\\)" ,(+ firacode-codepoint-start 23)) + ("\\(-~\\)" ,(+ firacode-codepoint-start 24)) + ("\\(#{\\)" ,(+ firacode-codepoint-start 25)) + ("\\(#\\[\\)" ,(+ firacode-codepoint-start 26)) + ("\\(##\\)" ,(+ firacode-codepoint-start 27)) + ("\\(###\\)" ,(+ firacode-codepoint-start 28)) + ("\\(####\\)" ,(+ firacode-codepoint-start 29)) + ("\\(#(\\)" ,(+ firacode-codepoint-start 30)) + ("\\(#\\?\\)" ,(+ firacode-codepoint-start 31)) + ("\\(#_\\)" ,(+ firacode-codepoint-start 32)) + ("\\(#_(\\)" ,(+ firacode-codepoint-start 33)) + ("\\(\\.-\\)" ,(+ firacode-codepoint-start 34)) + ("\\(\\.=\\)" ,(+ firacode-codepoint-start 35)) + ("\\(\\.\\.\\)" ,(+ firacode-codepoint-start 36)) + ("\\(\\.\\.<\\)" ,(+ firacode-codepoint-start 37)) + ("\\(\\.\\.\\.\\)" ,(+ firacode-codepoint-start 38)) + ("\\(\\?=\\)" ,(+ firacode-codepoint-start 39)) + ("\\(\\?\\?\\)" ,(+ firacode-codepoint-start 40)) + ("\\(;;\\)" ,(+ firacode-codepoint-start 41)) + ("\\(/\\*\\)" ,(+ firacode-codepoint-start 42)) + ("\\(/\\*\\*\\)" ,(+ firacode-codepoint-start 43)) + ("\\(/=\\)" ,(+ firacode-codepoint-start 44)) + ("\\(/==\\)" ,(+ firacode-codepoint-start 45)) + ("\\(/>\\)" ,(+ firacode-codepoint-start 46)) + ("\\(//\\)" ,(+ firacode-codepoint-start 47)) + ("\\(///\\)" ,(+ firacode-codepoint-start 48)) + ("\\(&&\\)" ,(+ firacode-codepoint-start 49)) + ("\\(||\\)" ,(+ firacode-codepoint-start 50)) + ("\\(||=\\)" ,(+ firacode-codepoint-start 51)) + ("[^|]\\(|=\\)" ,(+ firacode-codepoint-start 52)) + ("\\(|>\\)" ,(+ firacode-codepoint-start 53)) + ("\\(\\^=\\)" ,(+ firacode-codepoint-start 54)) + ("\\(\\$>\\)" ,(+ firacode-codepoint-start 55)) + ("\\(\\+\\+\\)" ,(+ firacode-codepoint-start 56)) + ("\\(\\+\\+\\+\\)" ,(+ firacode-codepoint-start 57)) + ("\\(\\+>\\)" ,(+ firacode-codepoint-start 58)) + ("\\(=:=\\)" ,(+ firacode-codepoint-start 59)) + ("[^!/]\\(==\\)[^>]" ,(+ firacode-codepoint-start 60)) + ("\\(===\\)" ,(+ firacode-codepoint-start 61)) + ("\\(==>\\)" ,(+ firacode-codepoint-start 62)) + ("[^=]\\(=>\\)" ,(+ firacode-codepoint-start 63)) + ("\\(=>>\\)" ,(+ firacode-codepoint-start 64)) + ("\\(<=\\)" ,(+ firacode-codepoint-start 65)) + ("\\(=<<\\)" ,(+ firacode-codepoint-start 66)) + ("\\(=/=\\)" ,(+ firacode-codepoint-start 67)) + ("\\(>-\\)" ,(+ firacode-codepoint-start 68)) + ("\\(>=\\)" ,(+ firacode-codepoint-start 69)) + ("\\(>=>\\)" ,(+ firacode-codepoint-start 70)) + ("[^-=]\\(>>\\)" ,(+ firacode-codepoint-start 71)) + ("\\(>>-\\)" ,(+ firacode-codepoint-start 72)) + ("\\(>>=\\)" ,(+ firacode-codepoint-start 73)) + ("\\(>>>\\)" ,(+ firacode-codepoint-start 74)) + ("\\(<\\*\\)" ,(+ firacode-codepoint-start 75)) + ("\\(<\\*>\\)" ,(+ firacode-codepoint-start 76)) + ("\\(<|\\)" ,(+ firacode-codepoint-start 77)) + ("\\(<|>\\)" ,(+ firacode-codepoint-start 78)) + ("\\(<\\$\\)" ,(+ firacode-codepoint-start 79)) + ("\\(<\\$>\\)" ,(+ firacode-codepoint-start 80)) + ("\\(<!--\\)" ,(+ firacode-codepoint-start 81)) + ("\\(<-\\)" ,(+ firacode-codepoint-start 82)) + ("\\(<--\\)" ,(+ firacode-codepoint-start 83)) + ("\\(<->\\)" ,(+ firacode-codepoint-start 84)) + ("\\(<\\+\\)" ,(+ firacode-codepoint-start 85)) + ("\\(<\\+>\\)" ,(+ firacode-codepoint-start 86)) + ("\\(<=\\)" ,(+ firacode-codepoint-start 87)) + ("\\(<==\\)" ,(+ firacode-codepoint-start 88)) + ("\\(<=>\\)" ,(+ firacode-codepoint-start 89)) + ("\\(<=<\\)" ,(+ firacode-codepoint-start 90)) + ("\\(<>\\)" ,(+ firacode-codepoint-start 91)) + ("[^-=]\\(<<\\)" ,(+ firacode-codepoint-start 92)) + ("\\(<<-\\)" ,(+ firacode-codepoint-start 93)) + ("\\(<<=\\)" ,(+ firacode-codepoint-start 94)) + ("\\(<<<\\)" ,(+ firacode-codepoint-start 95)) + ("\\(<~\\)" ,(+ firacode-codepoint-start 96)) + ("\\(<~~\\)" ,(+ firacode-codepoint-start 97)) + ("\\(</\\)" ,(+ firacode-codepoint-start 98)) + ("\\(</>\\)" ,(+ firacode-codepoint-start 99)) + ("\\(~@\\)" ,(+ firacode-codepoint-start 100)) + ("\\(~-\\)" ,(+ firacode-codepoint-start 101)) + ("\\(~=\\)" ,(+ firacode-codepoint-start 102)) + ("\\(~>\\)" ,(+ firacode-codepoint-start 103)) + ("[^<]\\(~~\\)" ,(+ firacode-codepoint-start 104)) + ("\\(~~>\\)" ,(+ firacode-codepoint-start 105)) + ("\\(%%\\)" ,(+ firacode-codepoint-start 106)) + ;;("\\(x\\)" ,(+ firacode-codepoint-start 107)) + ("[^:=]\\(:\\)[^:=]" ,(+ firacode-codepoint-start 108)) + ("[^\\+<>]\\(\\+\\)[^\\+<>]" ,(+ firacode-codepoint-start 109)) + ("[^\\*/<>]\\(\\*\\)[^\\*/<>]" ,(+ firacode-codepoint-start 110))))) + +(defun add-fira-code-symbol-keywords () + (font-lock-add-keywords nil fira-code-font-lock-keywords-alist)) + +(add-hook 'prog-mode-hook + #'add-fira-code-symbol-keywords) diff --git a/nnn-4.9/icons-in-terminal/scripts/generate_font.py b/nnn-4.9/icons-in-terminal/scripts/generate_font.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python3 + +import string +import os +import sys +import json +import fontforge +import psMat + +PUA_START = 0xE000 +PUA_END = 0xF8FF +FONT_EM = 1024 +POWERLINE_START = 0xE0A0 +POWERLINE_END = 0xE0D5 + +def read_map_names(filename): + array = [] + with open(filename) as file_map: + lines = file_map.readlines() + lines = [x.strip() for x in lines] + for line in lines: + if len(line) == 0: + continue + tab = line.split() + if tab[0][0] == '@': + array.append((tab[0][1:], ord(tab[1][0]))) + else: + array.append((tab[0], int(tab[1], 16))) + return array + +def lookup_map_name(map_names, codepoint, fallback_name): + for name, code in map_names: + if code == codepoint: + return name + return fallback_name + +# Insert the powerline glyphs at the same place that all the patched powerline fonts to make +# our font compatible with most of plugins/modules that insert those glyphs +def insert_powerline_extra(dest): + codepoint = POWERLINE_START + font = fontforge.open("./fonts/PowerlineExtraSymbols.otf") + font.em = FONT_EM + map_names = read_map_names("./fonts/PowerlineExtraSymbols-map") + excludes = [ 0xE0A4, 0xE0A5, 0xE0A6, 0xE0A7, 0xE0A8, 0xE0A9, 0xE0AA, 0xE0AB, + 0xE0AC, 0xE0AD, 0xE0AE, 0xE0AF, 0xE0C9, 0xE0CB, 0xE0D3 ] + inserted = [] + + while codepoint < POWERLINE_END: + if codepoint in excludes: + codepoint += 1 + continue + font.selection.select(codepoint) + font.copy() + dest.selection.select(codepoint) + dest.paste() + inserted.append(codepoint) + codepoint += 1 + print("#powerline-extras:" + str(len(inserted))) + for x in inserted: + number = hex(x).replace("0x", "") + name = lookup_map_name(map_names, x, number) + print("powerline_" + name + ":" + number, end=';') + print("") + +# Return true if the format of the name is something like 'uniXXXX' where X are +# hexadecimals +def is_default_name(name): + if (len(name) != 7 or + not name.startswith("uni") or + not all(c in string.hexdigits for c in name[-4:])): + return False + return True + +# Name the glyph according to the font name +def make_name(name, name_font): + name = name.lower() + if is_default_name(name): + return name_font + "_" + name[-4:] + return name_font + "_" + name.replace("-", "_") + +if len(sys.argv) < 2: + print("Give me a config file", file=sys.stderr) + sys.exit(1) + +with open(sys.argv[1]) as config_file: + config_data = json.load(config_file) + + dest = fontforge.font() + dest.em = FONT_EM +# dest.encoding = "UnicodeFull" + dest.encoding = "ISO10646" + + insert_powerline_extra(dest) + + codepoint = PUA_START + + for json_file in config_data: + + font = fontforge.open(json_file["path"]) + font.em = FONT_EM + + excludes = [] + if "excludes" in json_file: + excludes = list(map(lambda x : int(x, 16), json_file["excludes"])) + + start_from = 0 + if "start-from" in json_file: + start_from = int(json_file["start-from"], 16) + + until = -1 + if "until" in json_file: + until = int(json_file["until"], 16) + + move_vertically = 0 + if "move-vertically" in json_file: + move_vertically = int(json_file["move-vertically"]) + + name_font = json_file["name"] + if "short-name" in json_file: + name_font = json_file["short-name"] + name_font = name_font.replace("-", "_") + + map_names = [] + if "map-names" in json_file: + map_names = read_map_names(json_file["map-names"]) + + start = codepoint + inserted = [] + + for symbol in font.glyphs("encoding"): + if codepoint == POWERLINE_START: + codepoint = POWERLINE_END + if (symbol.encoding in excludes or + symbol.encoding < start_from or + (until > 0 and symbol.encoding >= until)): + continue + if symbol.width > 0 and symbol.unicode > 0: + encoding = symbol.encoding + name = symbol.glyphname + font.selection.select(encoding) + font.copy() + if encoding == 0x20: + dest.selection.select(0x20) + dest.paste() + continue + dest.selection.select(codepoint) + dest.paste() + dest.transform(psMat.translate(0, move_vertically)) + if len(map_names) > 0: + name = lookup_map_name(map_names, encoding, name) + new_name = make_name(name, name_font) + dest.createMappedChar(codepoint).glyphname = new_name + inserted.append((new_name ,codepoint)) + codepoint += 1 + + print("#" + json_file["name"] + ":" + str(len(inserted))) + for (name, x) in inserted: + print(name + ":" + str(hex(x)).replace("0x", ""), end=';') + print("") + + ascent = dest.ascent + descent = dest.descent + + dest.os2_winascent_add = 0 + dest.os2_windescent_add = 0 + dest.os2_typoascent_add = 0 + dest.os2_typodescent_add = 0 + dest.hhea_ascent_add = 0 + dest.hhea_descent_add = 0 + + # print ("ASCENT: " + str(ascent)) + # print ("DESCENT: " + str(descent)) + + dest.os2_winascent = ascent + dest.os2_windescent = descent + dest.os2_typoascent = ascent + dest.os2_typodescent = -descent + dest.hhea_ascent = ascent + dest.hhea_descent = -descent + + dest.em = FONT_EM + dest.fontname = "icons-in-terminal" + dest.familyname = "icons-in-terminal" + dest.fullname = "icons-in-terminal" + dest.appendSFNTName('English (US)', 'Preferred Family', dest.familyname) + dest.appendSFNTName('English (US)', 'Compatible Full', dest.fullname) + dest.fontname= "icons-in-terminal" + dest.generate("icons-in-terminal.ttf") + sys.exit(0) + +sys.exit(1) diff --git a/nnn-4.9/icons-in-terminal/scripts/generate_fontconfig.sh b/nnn-4.9/icons-in-terminal/scripts/generate_fontconfig.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +# Generate a fontconfig configuration file +# See /etc/fonts/conf.d/README + +echo '<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig>' + +echo ' <!-- You are supposed to remove all the lines but the one(s) where the font is used in your terminal -->' +echo ' <!-- Only monospaced fonts have been listed here -->' +echo " <!-- If your font isn't in the list, uncomment the next line and write its name -->" +echo " <!-- <alias><family>YOUR_TERMINAL_FONT</family><default><family>icons-in-terminal</family></default></alias> -->" + +while IFS='\n' read FONT_NAME; +do + FONT_NAME=`echo $FONT_NAME | tr -d '\n'` + echo ' <alias><family>'"${FONT_NAME}"'</family><prefer><family>icons-in-terminal</family></prefer></alias>' +# echo ' <alias><family>'"${FONT_NAME}"'</family><prefer><family>icons-in-terminal</family></prefer><default><family>icons-in-terminal</family></default></alias>' +done < <(fc-list :mono family | sort | sed "s/\\\-/-/g" | grep -v 'icons-in-terminal') + +echo ' <alias><family>Monospace</family><default><family>icons-in-terminal</family></default></alias>' + +echo '</fontconfig>' diff --git a/nnn-4.9/icons-in-terminal/scripts/generate_fontconfig_autodetect.sh b/nnn-4.9/icons-in-terminal/scripts/generate_fontconfig_autodetect.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +# Generate a fontconfig configuration file +# See /etc/fonts/conf.d/README + +BASEDIR=$(dirname `readlink -f "$0"`) +source ${BASEDIR}/colors.sh + +SCRIPTS[0]=${BASEDIR}/detect_font_terminal/find_font_gnometerminal.sh +SCRIPTS[1]=${BASEDIR}/detect_font_terminal/find_font_terminator.sh + +declare -A FONT_NAMES + +if [ -z $VERBOSE ]; then + echo '<?xml version="1.0"?>' + echo '<!DOCTYPE fontconfig SYSTEM "fonts.dtd">' + echo '<fontconfig>' +else + echo -e "\nDetected terminals fonts:\n" +fi + +for SCRIPT in "${SCRIPTS[@]}"; do + if [ -n "$VERBOSE" ]; then + eval "$SCRIPT" + else + while IFS='\n' read FONT_NAME; do + FONT_NAME=`echo $FONT_NAME | tr -d '\n'` + FONT_NAMES["$FONT_NAME"]=1 + done < <(eval $SCRIPT) + fi +done + +for FONT_NAME in "${!FONT_NAMES[@]}"; do + if [ -z $VERBOSE ]; then + echo ' <alias><family>'"${FONT_NAME}"'</family><prefer><family>icons-in-terminal</family></prefer></alias>' + #echo ' <alias><family>'"${FONT_NAME}"'</family><prefer><family>icons-in-terminal</family></prefer><default><family>icons-in-terminal</family></default></alias>' + fi +done + +if [ -z $VERBOSE ]; then + echo '</fontconfig>' +else + echo -e "\n${YELLOW}IMPORTANT:${NORMAL}" + echo "install-autodetect.sh is experimental" + echo -e "If your terminal isn't listed or if there is not your font, ${UNDERLINE}use install.sh instead${NORMAL}" + echo "See https://github.com/sebastiencs/icons-in-terminal/issues/1" +fi diff --git a/nnn-4.9/icons-in-terminal/scripts/inte_bash.sh b/nnn-4.9/icons-in-terminal/scripts/inte_bash.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' +filename="./build/mapping.txt" +count=0 + +name="" + +while read -r line +do + if [ "${line:0:1}" = "#" ] + then + name_num=(${line//:/ }) + name=${name_num[0]:1} + else + str="" + IFS=';' read -ra array_glyph <<< "$line" + for glyph in "${array_glyph[@]}"; do + info=(${glyph//:/ }) + echo "${info[0]}=\"\u${info[1]}\"" + done + fi + +done < "$filename" diff --git a/nnn-4.9/icons-in-terminal/scripts/inte_bash_export.sh b/nnn-4.9/icons-in-terminal/scripts/inte_bash_export.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' +filename="./build/mapping.txt" +count=0 + +name="" + +while read -r line +do + if [ "${line:0:1}" = "#" ] + then + name_num=(${line//:/ }) + name=${name_num[0]:1} + else + str="" + IFS=';' read -ra array_glyph <<< "$line" + for glyph in "${array_glyph[@]}"; do + info=(${glyph//:/ }) + echo "export ${info[0]}=\"\u${info[1]}\"" + done + fi + +done < "$filename" diff --git a/nnn-4.9/icons-in-terminal/scripts/inte_c_header.sh b/nnn-4.9/icons-in-terminal/scripts/inte_c_header.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' +filename="./build/mapping.txt" +count=0 + +name="" + +echo "#ifndef ICONS_IN_TERMINAL +# define ICONS_IN_TERMINAL +" + +while read -r line +do + if [ "${line:0:1}" = "#" ] + then + name_num=(${line//:/ }) + name=${name_num[0]:1} + else + str="" + IFS=';' read -ra array_glyph <<< "$line" + for glyph in "${array_glyph[@]}"; do + info=(${glyph//:/ }) + echo "# define ${info[0]^^} \"\u${info[1]}\"" + done + fi + +done < "$filename" + +echo " +#endif // ICONS_IN_TERMINAL +" diff --git a/nnn-4.9/icons-in-terminal/scripts/inte_emacs.sh b/nnn-4.9/icons-in-terminal/scripts/inte_emacs.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash + +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' +filename="./build/mapping.txt" +count=0 + +name="" + +echo "(require 'font-lock+) + +(defconst icons-in-terminal-alist + '(" + +while read -r line +do + if [ "${line:0:1}" = "#" ] + then + name_num=(${line//:/ }) + name=${name_num[0]:1} + else + str="" + IFS=';' read -ra array_glyph <<< "$line" + for glyph in "${array_glyph[@]}"; do + info=(${glyph//:/ }) + echo " ( ${info[0]} . \"\x${info[1]}\" )" + done + fi + +done < "$filename" + +echo " )) + + +(defun icons-in-terminal (name &rest attributes) + \"Return icon from NAME with optional ATTRIBUTES. +Attributes are face attributes or the display specification raise with :raise +the keyword :face can be use as an alias for :inherit + +Examples of use: (insert (icons-in-terminal 'oct_flame)) + (insert (icons-in-terminal 'oct_flame :foreground \\\"red\\\" :height 1.4)) + (insert (icons-in-terminal 'oct_flame :face any-face :underline t)) + (insert (icons-in-terminal 'oct_flame :inherit any-face :underline t)) ;; Similar to the line above + (insert (icons-in-terminal 'oct_flame :raise 0.2)).\" + (let* ((list-attributes (list :family \"icons-in-terminal\")) + (face (or (plist-get attributes :inherit) (plist-get attributes :face))) + (foreground (plist-get attributes :foreground)) + (distant-foreground (plist-get attributes :distant-foreground)) + (background (plist-get attributes :background)) + (width (plist-get attributes :width)) + (height (plist-get attributes :height)) + (underline (plist-get attributes :underline)) + (overline (plist-get attributes :overline)) + (box (plist-get attributes :box)) + (raise (or (plist-get attributes :raise) -0.05))) + (when face (push \`(:inherit ,face) list-attributes)) + (when foreground (push \`(:foreground ,foreground) list-attributes)) + (when distant-foreground (push \`(:distant-foreground ,distant-foreground) list-attributes)) + (when background (push \`(:background ,background) list-attributes)) + (when width (push \`(:width ,width) list-attributes)) + (when height (push \`(:height ,height) list-attributes)) + (when underline (push \`(:underline ,underline) list-attributes)) + (when overline (push \`(:overline ,overline) list-attributes)) + (when box (push \`(:box ,box) list-attributes)) + (propertize (alist-get name icons-in-terminal-alist) + 'face list-attributes + 'display \`(raise ,raise) + 'font-lock-ignore t))) + + +(provide 'icons-in-terminal)" diff --git a/nnn-4.9/icons-in-terminal/scripts/inte_fish.sh b/nnn-4.9/icons-in-terminal/scripts/inte_fish.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' +filename="./build/mapping.txt" +count=0 + +name="" + +while read -r line +do + if [ "${line:0:1}" = "#" ] + then + name_num=(${line//:/ }) + name=${name_num[0]:1} + else + str="" + IFS=';' read -ra array_glyph <<< "$line" + for glyph in "${array_glyph[@]}"; do + info=(${glyph//:/ }) + echo "set -g ${info[0]} \u${info[1]}" + done + fi + +done < "$filename" diff --git a/nnn-4.9/icons-in-terminal/scripts/inte_without_codepoint.sh b/nnn-4.9/icons-in-terminal/scripts/inte_without_codepoint.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' +filename="./build/mapping.txt" +count=0 + +name="" + +while read -r line +do + if [ "${line:0:1}" = "#" ] + then + name_num=(${line//:/ }) + name=${name_num[0]:1} + else + str="" + IFS=';' read -ra array_glyph <<< "$line" + for glyph in "${array_glyph[@]}"; do + info=(${glyph//:/ }) + echo -e "export ${info[0]}=\u${info[1]}" + # echo "export ${info[0]}=\$(echo -e \"\u${info[1]}\")" + done + fi + +done < "$filename" diff --git a/nnn-4.9/icons-in-terminal/uninstall.sh b/nnn-4.9/icons-in-terminal/uninstall.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +DATA="${XDG_DATA_HOME:-${HOME}/.local/share}/icons-in-terminal/" + +set -xe + +rm -f ~/.config/fontconfig/conf.d/30-icons.conf +rm -f ~/.fonts/icons-in-terminal.ttf +rm -rf "$DATA" + +fc-cache -fvr --really-force > /dev/null + +set +xe + +echo "icons-in-terminal uninstalled. Close all your terminal windows." diff --git a/nnn-4.9/misc/CONTRIBUTING.md b/nnn-4.9/misc/CONTRIBUTING.md @@ -0,0 +1,22 @@ +# Contributing +Contributions to nnn are welcome! There's always an open issue with the current ToDo list, which contains the proposed features for the next release you can get your hands on. Any small changes or ideas should go in there, rather than in a separate issue. + +Before suggesting changes, please read a bit about [the design principles nnn follows](https://github.com/jarun/nnn/wiki/concepts#design), and make sure you aren't breaking any of them. + +Feel free to join the [Discussions](https://github.com/jarun/nnn/discussions). We highly recommended a discussion before raising a PR. + +## Coding standard + +`nnn` follows the Linux kernel coding style closely. The C source code uses TABs and the plugins use 4 spaces for indentation. + +- Code changes should not break the patch framework. Please run `make checkpatches` to ensure. +- Run `make shellcheck` if adding/modifying plugins. + +CI runs patch framework sanity test and `shellcheck`. Please watch out for any failures after raising the PR. + +## Resources +The [wiki](https://github.com/jarun/nnn/wiki/Developer-guides) has some resources for developers you might be interested in: building, debugging... + +## Communication +* [Gitter chat](https://gitter.im/jarun/nnn) +* [GitHub team](https://github.com/nnn-devs) (if you plan on contributing regularly, ask for an invitation). diff --git a/nnn-4.9/misc/auto-completion/bash/nnn-completion.bash b/nnn-4.9/misc/auto-completion/bash/nnn-completion.bash @@ -0,0 +1,74 @@ +# +# Rudimentary Bash completion definition for nnn. +# +# Author: +# Arun Prakash Jana <engineerarun@gmail.com> +# + +_nnn () +{ + COMPREPLY=() + local IFS=$'\n' + local cur=$2 prev=$3 + local -a opts + opts=( + -a + -A + -b + -B + -c + -C + -d + -D + -e + -E + -f + -g + -H + -i + -J + -K + -l + -n + -o + -p + -P + -Q + -r + -R + -s + -S + -t + -T + -u + -U + -V + -x + -h + ) + if [[ $prev == -b ]]; then + local bookmarks=$(echo $NNN_BMS | awk -F: -v RS=\; '{print $1}') + COMPREPLY=( $(compgen -W "$bookmarks" -- "$cur") ) + elif [[ $prev == -l ]]; then + return 1 + elif [[ $prev == -p ]]; then + COMPREPLY=( $(compgen -f -d -- "$cur") ) + elif [[ $prev == -P ]]; then + local plugins=$(echo $NNN_PLUG | awk -F: -v RS=\; '{print $1}') + COMPREPLY=( $(compgen -W "$plugins" -- "$cur") ) + elif [[ $prev == -s ]]; then + local sessions_dir=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/sessions + COMPREPLY=( $(cd "$sessions_dir" && compgen -f -d -- "$cur") ) + elif [[ $prev == -t ]]; then + return 1 + elif [[ $prev == -T ]]; then + local keys=$(echo "a d e r s t v" | awk -v RS=' ' '{print $0}') + COMPREPLY=( $(compgen -W "$keys" -- "$cur") ) + elif [[ $cur == -* ]]; then + COMPREPLY=( $(compgen -W "${opts[*]}" -- "$cur") ) + else + COMPREPLY=( $(compgen -f -d -- "$cur") ) + fi +} + +complete -o filenames -F _nnn nnn diff --git a/nnn-4.9/misc/auto-completion/fish/nnn.fish b/nnn-4.9/misc/auto-completion/fish/nnn.fish @@ -0,0 +1,46 @@ +# +# Fish completion definition for nnn. +# +# Author: +# Arun Prakash Jana <engineerarun@gmail.com> +# + +if test -n "$XDG_CONFIG_HOME" + set sessions_dir $XDG_CONFIG_HOME/.config/nnn/sessions +else + set sessions_dir $HOME/.config/nnn/sessions +end + +complete -c nnn -s a -d 'auto-create NNN_FIFO' +complete -c nnn -s A -d 'disable dir auto-enter' +complete -c nnn -s b -r -d 'bookmark key to open' -x -a '(echo $NNN_BMS | awk -F: -v RS=\; \'{print $1"\t"$2}\')' +complete -c nnn -s B -d 'use bsdtar for archives' +complete -c nnn -s c -d 'cli-only opener' +complete -c nnn -s C -d 'color by context' +complete -c nnn -s d -d 'start in detail mode' +complete -c nnn -s D -d 'dirs in context color' +complete -c nnn -s e -d 'open text files in $VISUAL/$EDITOR/vi' +complete -c nnn -s E -d 'use EDITOR for undetached edits' +complete -c nnn -s f -d 'use readline history file' +complete -c nnn -s g -d 'regex filters' +complete -c nnn -s H -d 'show hidden files' +complete -c nnn -s i -d 'show current file info' +complete -c nnn -s J -d 'no auto-advance on selection' +complete -c nnn -s K -d 'detect key collision and exit' +complete -c nnn -s l -r -d 'lines to move per scroll' +complete -c nnn -s n -d 'start in type-to-nav mode' +complete -c nnn -s o -d 'open files only on Enter' +complete -c nnn -s p -r -d 'copy selection to file' -a '-\tstdout' +complete -c nnn -s P -r -d 'plugin key to run' -x -a '(echo $NNN_PLUG | awk -F: -v RS=\; \'{print $1"\t"$2}\')' +complete -c nnn -s Q -d 'disable quit confirmation' +complete -c nnn -s r -d 'show cp, mv progress (Linux-only)' +complete -c nnn -s R -d 'disable rollover at edges' +complete -c nnn -s s -r -d 'load session by name' -x -a '@\t"last session" (ls $sessions_dir)' +complete -c nnn -s S -d 'persistent session' +complete -c nnn -s t -r -d 'timeout in seconds to lock' +complete -c nnn -s T -r -d 'a d e r s t v' +complete -c nnn -s u -d 'use selection (no prompt)' +complete -c nnn -s U -d 'show user and group' +complete -c nnn -s V -d 'show program version and exit' +complete -c nnn -s x -d 'notis, sel to system clipboard, xterm title' +complete -c nnn -s h -d 'show program help' diff --git a/nnn-4.9/misc/auto-completion/zsh/_nnn b/nnn-4.9/misc/auto-completion/zsh/_nnn @@ -0,0 +1,47 @@ +#compdef nnn +# +# Completion definition for nnn. +# +# Author: +# Arun Prakash Jana <engineerarun@gmail.com> +# + +setopt localoptions noshwordsplit noksharrays +local -a args +args=( + '(-a)-a[auto-create NNN_FIFO]' + '(-A)-A[disable dir auto-enter]' + '(-b)-b[bookmark key to open]:key char' + '(-B)-B[use bsdtar for archives]' + '(-c)-c[cli-only opener]' + '(-C)-C[color by context]' + '(-d)-d[start in detail mode]' + '(-D)-D[dirs in context color]' + '(-e)-e[open text files in $VISUAL/$EDITOR/vi]' + '(-E)-E[use EDITOR for undetached edits]' + '(-f)-f[use readline history file]' + '(-g)-g[regex filters]' + '(-H)-H[show hidden files]' + '(-i)-i[show current file info]' + '(-J)-J[no auto-advance on selection]' + '(-K)-K[detect key collision and exit]' + '(-l)-l[lines to move per scroll]:val' + '(-n)-n[start in type-to-nav mode]' + '(-o)-o[open files only on Enter]' + '(-p)-p[copy selection to file]:file name' + '(-P)-P[plugin key to run]:key char' + '(-Q)-Q[disable quit confirmation]' + '(-r)-r[show cp, mv progress (Linux-only)]' + '(-R)-R[disable rollover at edges]' + '(-s)-s[load session]:session name' + '(-S)-S[persistent session]' + '(-t)-t[timeout to lock]:seconds' + '(-T)-T[a d e r s t v]:key' + '(-u)-u[use selection (no prompt)]' + '(-U)-U[show user and group]' + '(-V)-V[show program version and exit]' + '(-x)-x[notis, sel to system clipboard, xterm title]' + '(-h)-h[show program help]' + '*:filename:_files' +) +_arguments -S -s $args diff --git a/nnn-4.9/misc/desktop/nnn.desktop b/nnn-4.9/misc/desktop/nnn.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Type=Application +Name=nnn +Comment=Terminal file manager +Exec=nnn +Terminal=true +Icon=nnn +MimeType=inode/directory +Categories=System;FileTools;FileManager;ConsoleOnly +Keywords=File;Manager;Management;Explorer;Launcher diff --git a/nnn-4.9/misc/haiku/Makefile b/nnn-4.9/misc/haiku/Makefile @@ -0,0 +1,250 @@ +VERSION = $(shell grep -m1 VERSION $(SRC) | cut -f 2 -d'"') + +PREFIX ?= /boot/system/non-packaged +MANPREFIX ?= $(PREFIX)/documentation/man +STRIP ?= strip +PKG_CONFIG ?= pkg-config +INSTALL ?= install +CP ?= cp + +CFLAGS_OPTIMIZATION ?= -O3 + +O_DEBUG := 0 # debug binary +O_NORL := 0 # no readline support +O_PCRE := 0 # link with PCRE library +O_NOLC := 0 # no locale support +O_NOMOUSE := 0 # no mouse support +O_NOBATCH := 0 # no built-in batch renamer +O_NOFIFO := 0 # no FIFO previewer support +O_CTX8 := 0 # enable 8 contexts +O_ICONS := 0 # support icons-in-terminal +O_NERD := 0 # support icons-nerdfont +O_QSORT := 0 # use Alexey Tourbin's QSORT implementation +O_BENCH := 0 # benchmark mode (stops at first user input) +O_NOSSN := 0 # disable session support +O_NOUG := 0 # disable user, group name in status bar +O_NOX11 := 0 # disable X11 integration +O_MATCHFLTR := 0 # allow filters without matches + +# User patches +O_GITSTATUS := 0 # add git status to detail view +O_NAMEFIRST := 0 # print file name first, add uid and guid to detail view + +ifeq ($(strip $(O_GITSTATUS)),1) + LDLIBS += -lgit2 +endif + +# convert targets to flags for backwards compatibility +ifneq ($(filter debug,$(MAKECMDGOALS)),) + O_DEBUG := 1 +endif +ifneq ($(filter norl,$(MAKECMDGOALS)),) + O_NORL := 1 +endif +ifneq ($(filter nolc,$(MAKECMDGOALS)),) + O_NORL := 1 + O_NOLC := 1 +endif + +ifeq ($(strip $(O_DEBUG)),1) + CPPFLAGS += -DDEBUG + CFLAGS += -g + LDLIBS += -lrt +endif + +ifeq ($(strip $(O_NORL)),1) + CPPFLAGS += -DNORL +else ifeq ($(strip $(O_STATIC)),1) + CPPFLAGS += -DNORL +else + LDLIBS += -lreadline +endif + +ifeq ($(strip $(O_PCRE)),1) + CPPFLAGS += -DPCRE + LDLIBS += -lpcre +endif + +ifeq ($(strip $(O_NOLC)),1) + ifeq ($(strip $(O_ICONS)),1) +$(info *** Ignoring O_NOLC since O_ICONS is set ***) + else ifeq ($(strip $(O_NERD)),1) +$(info *** Ignoring O_NOLC since O_NERD is set ***) + else + CPPFLAGS += -DNOLC + endif +endif + +ifeq ($(strip $(O_NOMOUSE)),1) + CPPFLAGS += -DNOMOUSE +endif + +ifeq ($(strip $(O_NOBATCH)),1) + CPPFLAGS += -DNOBATCH +endif + +ifeq ($(strip $(O_NOFIFO)),1) + CPPFLAGS += -DNOFIFO +endif + +ifeq ($(strip $(O_CTX8)),1) + CPPFLAGS += -DCTX8 +endif + +ifeq ($(strip $(O_ICONS)),1) + CPPFLAGS += -DICONS +endif + +ifeq ($(strip $(O_NERD)),1) + CPPFLAGS += -DNERD +endif + +ifeq ($(strip $(O_QSORT)),1) + CPPFLAGS += -DTOURBIN_QSORT +endif + +ifeq ($(strip $(O_BENCH)),1) + CPPFLAGS += -DBENCH +endif + +ifeq ($(strip $(O_NOSSN)),1) + CPPFLAGS += -DNOSSN +endif + +ifeq ($(strip $(O_NOUG)),1) + CPPFLAGS += -DNOUG +endif + +ifeq ($(strip $(O_NOX11)),1) + CPPFLAGS += -DNOX11 +endif + +ifeq ($(strip $(O_MATCHFLTR)),1) + CPPFLAGS += -DMATCHFLTR +endif + +ifeq ($(shell $(PKG_CONFIG) ncursesw && echo 1),1) + CFLAGS_CURSES ?= $(shell $(PKG_CONFIG) --cflags ncursesw) + LDLIBS_CURSES ?= $(shell $(PKG_CONFIG) --libs ncursesw) +else ifeq ($(shell $(PKG_CONFIG) ncurses && echo 1),1) + CFLAGS_CURSES ?= $(shell $(PKG_CONFIG) --cflags ncurses) + LDLIBS_CURSES ?= $(shell $(PKG_CONFIG) --libs ncurses) +else + LDLIBS_CURSES ?= -lncurses +endif + +ifeq ($(shell uname -s), Haiku) + LDLIBS_HAIKU ?= -lstdc++ -lgnu -lbe + SRC_HAIKU ?= misc/haiku/nm.cpp + OBJS_HAIKU ?= misc/haiku/nm.o +endif + +CFLAGS += -std=c11 -Wall -Wextra -Wshadow +CFLAGS += $(CFLAGS_OPTIMIZATION) +CFLAGS += $(CFLAGS_CURSES) + +LDLIBS += $(LDLIBS_CURSES) -lpthread $(LDLIBS_HAIKU) +# static compilation needs libgpm development package +ifeq ($(strip $(O_STATIC)),1) + LDFLAGS += -static + LDLIBS += -lgpm +endif + +DISTFILES = src nnn.1 Makefile README.md LICENSE +SRC = src/nnn.c +HEADERS = src/nnn.h +BIN = nnn +OBJS := nnn.o $(OBJS_HAIKU) + +GITSTATUS = patches/gitstatus +NAMEFIRST = patches/namefirst + +all: $(BIN) + +ifeq ($(shell uname -s), Haiku) +$(OBJS_HAIKU): $(SRC_HAIKU) + $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< +endif + +nnn.o: $(SRC) $(HEADERS) + $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< + +$(BIN): $(OBJS) + @$(MAKE) --silent prepatch + $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) + @$(MAKE) --silent postpatch + +# targets for backwards compatibility +debug: $(BIN) +norl: $(BIN) +nolc: $(BIN) + +install: all + $(INSTALL) -m 0755 -d $(DESTDIR)$(PREFIX)/bin + $(INSTALL) -m 0755 $(BIN) $(DESTDIR)$(PREFIX)/bin + $(INSTALL) -m 0755 -d $(DESTDIR)$(MANPREFIX)/man1 + $(INSTALL) -m 0644 $(BIN).1 $(DESTDIR)$(MANPREFIX)/man1 + +uninstall: + $(RM) $(DESTDIR)$(PREFIX)/bin/$(BIN) + $(RM) $(DESTDIR)$(MANPREFIX)/man1/$(BIN).1 + +strip: $(BIN) + $(STRIP) $^ + +static: + # regular static binary + make O_STATIC=1 strip + mv $(BIN) $(BIN)-static + +dist: + mkdir -p nnn-$(VERSION) + $(CP) -r $(DISTFILES) nnn-$(VERSION) + mkdir -p nnn-$(VERSION)/misc + $(CP) -r misc/haiku nnn-$(VERSION)/misc + tar -cf - nnn-$(VERSION) | gzip > nnn-$(VERSION).tar.gz + $(RM) -r nnn-$(VERSION) + +sign: + git archive -o nnn-$(VERSION).tar.gz --format tar.gz --prefix=nnn-$(VERSION)/ v$(VERSION) + gpg --detach-sign --yes nnn-$(VERSION).tar.gz + rm -f nnn-$(VERSION).tar.gz + +upload-local: sign static + $(eval ID=$(shell curl -s 'https://api.github.com/repos/jarun/nnn/releases/tags/v$(VERSION)' | jq .id)) + # upload sign file + curl -XPOST 'https://uploads.github.com/repos/jarun/nnn/releases/$(ID)/assets?name=nnn-$(VERSION).tar.gz.sig' \ + -H 'Authorization: token $(NNN_SIG_UPLOAD_TOKEN)' -H 'Content-Type: application/pgp-signature' \ + --upload-file nnn-$(VERSION).tar.gz.sig + tar -zcf $(BIN)-static-$(VERSION).x86_64.tar.gz $(BIN)-static + # upload static binary + curl -XPOST 'https://uploads.github.com/repos/jarun/nnn/releases/$(ID)/assets?name=$(BIN)-static-$(VERSION).x86_64.tar.gz' \ + -H 'Authorization: token $(NNN_SIG_UPLOAD_TOKEN)' -H 'Content-Type: application/x-sharedlib' \ + --upload-file $(BIN)-static-$(VERSION).x86_64.tar.gz + +clean: + $(RM) -f $(BIN) nnn-$(VERSION).tar.gz *.sig $(BIN)-static $(BIN)-static-$(VERSION).x86_64.tar.gz + +prepatch: +ifeq ($(strip $(O_NAMEFIRST)),1) + patch --forward --strip=1 --input=$(NAMEFIRST)/mainline.diff +ifeq ($(strip $(O_GITSTATUS)),1) + patch --forward --strip=1 --input=$(GITSTATUS)/namefirst.diff +endif +else ifeq ($(strip $(O_GITSTATUS)),1) + patch --forward --strip=1 --input=$(GITSTATUS)/mainline.diff +endif + +postpatch: +ifeq ($(strip $(O_NAMEFIRST)),1) +ifeq ($(strip $(O_GITSTATUS)),1) + patch --reverse --strip=1 --input=$(GITSTATUS)/namefirst.diff +endif + patch --reverse --strip=1 --input=$(NAMEFIRST)/mainline.diff +else ifeq ($(strip $(O_GITSTATUS)),1) + patch --reverse --strip=1 --input=$(GITSTATUS)/mainline.diff +endif + +skip: ; + +.PHONY: all install uninstall strip static dist sign upload-local clean diff --git a/nnn-4.9/misc/haiku/haiku_interop.h b/nnn-4.9/misc/haiku/haiku_interop.h @@ -0,0 +1,14 @@ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct haiku_nm_t *haiku_nm_h; +haiku_nm_h haiku_init_nm(); +void haiku_close_nm(haiku_nm_h hnd); +int haiku_watch_dir(haiku_nm_h hnd, const char *path); +int haiku_stop_watch(haiku_nm_h hnd); +int haiku_is_update_needed(haiku_nm_h hnd); + +#ifdef __cplusplus +} +#endif diff --git a/nnn-4.9/misc/haiku/nm.cpp b/nnn-4.9/misc/haiku/nm.cpp @@ -0,0 +1,83 @@ +#include <Directory.h> +#include <Looper.h> +#include <NodeMonitor.h> +#include <MessageFilter.h> + +#include "haiku_interop.h" + +filter_result dir_mon_flt(BMessage *message, BHandler **hnd, BMessageFilter *fltr) { + (void) hnd; + (void) fltr; + + if (message->what == B_NODE_MONITOR) { + int32 val; + message->FindInt32("opcode", &val); + + switch (val) { + case B_ENTRY_CREATED: + case B_ENTRY_MOVED: + case B_ENTRY_REMOVED: + return B_DISPATCH_MESSAGE; + } + } + + return B_SKIP_MESSAGE; +} + +class DirectoryListener : public BLooper { +public: + bool recv_reset() { + Lock(); + bool val = _ev_on; + _ev_on = false; + Unlock(); + + return val; + } +private: + void MessageReceived(BMessage * message) override { + Lock(); + _ev_on = true; + Unlock(); + BLooper::MessageReceived(message); + } + + bool _ev_on = false; +}; + +struct haiku_nm_t { + haiku_nm_t() { + dl = new DirectoryListener(); + flt = new BMessageFilter(B_PROGRAMMED_DELIVERY, B_LOCAL_SOURCE, dir_mon_flt); + dl->AddCommonFilter(flt); + dl->Run(); + } + + DirectoryListener *dl; + BMessageFilter *flt; + node_ref nr; +}; + +haiku_nm_h haiku_init_nm() { + return new haiku_nm_t(); +} + +void haiku_close_nm(haiku_nm_h hnd) { + delete hnd->flt; + // This is the way of deleting a BLooper + hnd->dl->PostMessage(B_QUIT_REQUESTED); + delete hnd; +} +int haiku_watch_dir(haiku_nm_h hnd, const char *path) { + BDirectory dir(path); + dir.GetNodeRef(&(hnd->nr)); + + return watch_node(&(hnd->nr), B_WATCH_DIRECTORY, nullptr, hnd->dl); +} +int haiku_stop_watch(haiku_nm_h hnd) { + return watch_node(&(hnd->nr), B_STOP_WATCHING, nullptr, hnd->dl); +} + +int haiku_is_update_needed(haiku_nm_h hnd) { + return hnd->dl->recv_reset(); +} diff --git a/nnn-4.9/misc/haiku/nnn-master.recipe b/nnn-4.9/misc/haiku/nnn-master.recipe @@ -0,0 +1,58 @@ +SUMMARY="A blazing-fast lightweight terminal file manager" +DESCRIPTION="nnn is a full-featured terminal file manager. It's tiny and \ +nearly 0-config with an incredible performance. + +nnn is also a du analyzer, an app launcher, a batch renamer and a file picker. \ +The plugin repository has tons of plugins and documentation to extend the \ +capabilities further. You can plug new functionality and play with a \ +custom keybind instantly. There's an independent (neo)vim plugin. + +It runs smoothly on the Raspberry Pi, Termux on Android, Linux, macOS, BSD, \ +Cygwin, WSL, Haiku and works seamlessly with DEs and GUI utilities. + +Visit the Wiki for concepts, program usage, how-tos and troubleshooting." +HOMEPAGE="https://github.com/jarun/nnn" +COPYRIGHT="2016-2023 Arun Prakash Jana" +LICENSE="BSD (2-clause)" +REVISION="1" +SOURCE_URI="git://github.com/jarun/nnn.git" + +ARCHITECTURES="!x86_gcc2 x86_64" +SECONDARY_ARCHITECTURES="x86" + +PROVIDES=" + nnn$secondaryArchSuffix = $portVersion + cmd:nnn = $portVersion + " +REQUIRES=" + haiku$secondaryArchSuffix + file$secondaryArchSuffix + lib:libncurses$secondaryArchSuffix + lib:libreadline$secondaryArchSuffix + " + +BUILD_REQUIRES=" + haiku${secondaryArchSuffix}_devel + devel:libncurses$secondaryArchSuffix + devel:libreadline$secondaryArchSuffix + " +BUILD_PREREQUIRES=" + cmd:g++$secondaryArchSuffix + cmd:gcc$secondaryArchSuffix + cmd:install + cmd:ld$secondaryArchSuffix + cmd:make + cmd:pkg_config$secondaryArchSuffix + " + +BUILD() +{ + make -f misc/haiku/Makefile $jobArgs +} + +INSTALL() +{ + make -f misc/haiku/Makefile install PREFIX=$prefix + + addResourcesToBinaries misc/haiku/nnn.rdef $prefix/bin/nnn +} diff --git a/nnn-4.9/misc/haiku/nnn.rdef b/nnn-4.9/misc/haiku/nnn.rdef @@ -0,0 +1,140 @@ + +// How to apply this resource definition file manually (Haiku only): +// First, make sure that nnn is compiled. +// Next, run "rc nnn.rdef -o nnn.rsrc" to compile this resource file. +// Then, run "xres -o nnn nnn.rsrc" to apply the resource file to nnn. +// Finally, run "mimeset -f nnn" to refresh Haiku's MIME database. + +resource app_signature "application/x-vnd.Jarun-nnn"; + +resource app_version { + major = 4, + middle = 9, + minor = 0, + + variety = B_APPV_FINAL, + internal = 0, + + short_info = "nnn", + long_info = "A blazing-fast lightweight terminal file manager" +}; + +resource app_flags B_MULTIPLE_LAUNCH | B_BACKGROUND_APP | B_ARGV_ONLY; + +resource file_types message { + "types" = "application/x-vnd.Be-directory" +}; + +resource vector_icon { + $"6E6369660805FF032E343602011202B8E0C339BAC3B985CFB8B7E549F5FF4994" + $"000000FFFF0000020112023745BA3659FABA87063B846942D03049EBF80000FF" + $"FF0000020112033BE54D39FE49B857E23A493A4A91FF489000000000AF0000FF" + $"00FF020112022D299A3B3A49BCE2FF2ED4134A65A94C096A0000FFFF00000201" + $"1202365425358147B6C63037AFB14669664AB9F30000FFFF0000020112023673" + $"5235AC4EB7FB7138A81D481E6A48C2C50000FFFF00000F0241BE60B360BE60B3" + $"60BE5FB360BE3EB364BE46B362BE2AB369BE17B371BE1FB36DBE03B379BDF3B3" + $"85BDFCB37EBDE3B38EBDCEB3A0BDD9B398BDB8B3B1BD8BB3DDBDA4B3C5BD58B4" + $"0EBCCDB4A0BD17B450BC93B4DBBC36B539BC61B50DBC35B537BC32B536BC34B5" + $"37BBE6B50ABB0FB48BBB7EB4CEBA9EB448B9E8B3DDBA36B40AB9C1B3C5B987B3" + $"A5B9A0B3B3B97AB39FB967B394B971B399B961B391B954B38CB95DB390B94FB3" + $"89B942B385B94CB388B93FB382B92FB37EB939B381B926B37DB8FFB379B900B3" + $"79B8E9B379B87FB3A4B8B1B37DB84CB3C8B82FB418B838B3FBB81FB453B826B4" + $"89B825B466B827B4CDB841B5F9B82FB534B848B656B854B6F9B84EB6B1B85AB7" + $"41B85CB776B85CB782B85CB75BB83AB7A7B860B772B814B7DBB767B88FB7CEB8" + $"29B6E7B90DB65CB9D1B694B955B626BA4CB62ABB5AB62CBAB9B629BC54B606BC" + $"9DB634BC1BB5CDBD3EB4B1BEF5B597BDA1B445BF96B3B0C089B3DDC033B31AC1" + $"A4B318C3DAB2D2C2D1B371C536B61FC639B4ABC60FB641C680B698C6F2B65CC6" + $"CFB698C6F2B69AC6F2B69AC6F2B71EC742B838C6F9B7BDC733B8B2C6BEB96CC5" + $"E2B919C65DB99BC59FBA11C4C4B9D8C530BA78C400BB14C34ABAB4C3A1BB75C2" + $"F2BD20C209BC0BC29ABDDEC1A6BED6C108BE5244BED6C121BED8C151BED9C139" + $"BECCC24CBE29C3E9BE9AC307BDC3C4B6BC1DC63ABD84C4F7BB43C700BA57C7FA" + $"BAB9C781B9F5C872B99DC966B9BCC8EBB961CA48B95ECBBBB955CB0830CBFDB9" + $"65CC7FB962CC3DBFC3CC7F60CC7FC621CC7FCC7ECBDECC7ACA9BCC7CCB3CCC6F" + $"C6D6CA63BE51CB9AC1F5C98736C731B8ADC899BA16C5F2B76EC2C4B648C477B6" + $"A1C212B625BFF7B63643B625C013B634C04A28C02FB631C027B5E2BFE0B546C0" + $"04B593BFAFB4D8BF5EB436BF81B47BBF4DB415BF30B3E0BF3FB3F8BF28B3D3BF" + $"18B3BBBF22B3C9BF11B3B4BEFFB39DBF0CB3ABBEF8B398BEE2B385BEF1B390BE" + $"DAB380BEC5B375BED1B37ABEB9B36EBE96B364BE96B364BE96B364BE95B364BE" + $"95B364BE93B364BE93B364BE93B364BE93B364BE60B360BE60B360BE60B36002" + $"23BCA6C6D2BCA6C6D2BE0FC58CBEDFC443BE70C523BF5BC34EBFA3C159BF97C2" + $"6DBFAAC0AEBF80BFC2BF99BFDABF7ABFBBBF34BFE33FBFC7BEA9C048BCC3C154" + $"BDD9C0C2BA90C277B95BC467BA2FC2CFB926C4CCB8C5C56FB8E2C542B83EC636" + $"B702C644B780C68FB6CEC624B6A8C5B6B6B4C5FDB6A1C587B660C581B69CC584" + $"B510C56EB3DDC3A7B426C4C2B3ACC2EDB465C0E9B3E0C1E1B481C0B1B55ABF67" + $"B4F0C005B642BE10B6C7BCE0B689BD92B6F5BC5DB6F6BB5AB6F5BC55B6F7BA1A" + $"B7F5B921B6F5BA1EB8CDB84DB928B776B928B7CEB928B757B90CB5E9B91BB6A4" + $"B8EBB45DB8FFB446B8EBB446B907B446BAA6B53A31B4B4BB85B5C0BC54B62FBC" + $"47B62FBC6128BD60B52BBCDBB5BABDF2B491BE6BB42BBE5EB428BE78B42EBF27" + $"B59ABEC3B4C2BF5DB613BFCBB704BF95B68DBFDEB703C005B702BFF2B702C0F0" + $"B6F1C29CB70FC229B6F9C42AB761C6A0B93DC57CB818C7F0BA8FC9A0BE92C8CC" + $"BC13CACFC21CCBAECA9DCBA3C6F5CBAFCAFBCBB15ECBB0CB56C5D85EBA295EC0" + $"015EBA21CB0FBA61C99A32CA68BA97C8CBBCA6C6D2BAF4C858BCA6C6D20215C8" + $"1C5EC81C5EC80FCB23C7DAC9A7C805CA9DC79EC84BC6E7C4FBC747C6A251C353" + $"C5B5C054C61BC1ACC54FBEF9C4A1BD7F4DBDEFC457BD12C3C3BC5FC40EBCB4C3" + $"79BC0DC2D8BB87C32B36C285BB4BC1C8BAF0C22BBB19C195BADDC120BAC444BA" + $"D2C13EBADEC177BB1CC15CBAF6C19EBB66C1B9BC18C1B5BBBAC1BCBC74C184BD" + $"41C1ABBCD8C15CBDA9C0C1BE85C11DBE17C0683EBF5CBFD2BFF2BF64BF69BFCD" + $"BF80BFC2BF7EBFBFBF99BFDABFA3C159BFAAC0AEBF97C26DBEE1C443BF5BC34E" + $"BE70C523BCA6C6D2BE0FC58CBAF4C858BA61C99ABA97C8CB32CA68BA295EBA21" + $"CB0FBECF5EC81C5EC3755EC81C5E021CBE6BB42BBE6BB42BBE5EB428BD60B52B" + $"BDF2B491BCDBB5BABC54B62FBC6128BC47B62FBAA6B53ABB85B5C031B4B4B8FF" + $"B446B907B446B8EBB446B90CB5E9B8EBB45DB91BB6A4B928B776B928B757B928" + $"B7CEB7F5B921B8CDB84DB6F5BA1EB6F6BB5AB6F7BA1AB6F5BC55B6C7BCE0B6F5" + $"BC5DB689BD92B55ABF67B642BE10B4F0C005B465C0E9B481C0B1B3E0C1E1B3DD" + $"C3A7B3ACC2EEB426C4C2B660C581B510C56EB680C583B697C58AB68FC583B74F" + $"C477B90545B815C32CB9FCC041BC10BD70BB07BEB8BC94BCCCBD99BBBBBD18BC" + $"36BE19BB41BF0DBAA0BE96BADFBF49BA82BFBBBA5FBF82BA6BBFF3BA52C05CBA" + $"59C028BA50C090BA6143BA94C0C2BA75C103BA9FC120BAC4C110BAB6C125BAC5" + $"C130BAC7C12ABAC6C0BBB986BFCEB704C043B846BFCDB704BFCBB704BFCDB704" + $"BF95B68BBF27B59ABF5DB613BEC4B4C2BE6BB42BBE78B42EBE6BB42B0207BFCE" + $"B704BFCEB704C063B85EC18FBB10C0F9B9B7C1C2BB1DC2BCBB74C28DBB61C6B9" + $"BBACC6A0B93DCB98BF33C57CB818C29CB70FC42AB761C229B6F9C005B702C0F0" + $"B6F1BFF3B702BFCEB704BFDFB703BFCEB7040207BCA6C6D2BCA6C6D2474ACB64" + $"C69E5149CB91C805CBAECA9DCBABC963CBAFCAFBCBB15ECBB0CB56C5D85EBA29" + $"5EC0015EBA21CB0FBA61C99A32CA68BA97C8CBBCA6C6D2BAF4C858BCA6C6D206" + $"04BFB67CC579B67CC579B7C1C49BB900C2AFB8F9C22FB906C32EB6F5C5CDB841" + $"C6ABB5AA4DB67CC5790211BD5BC297BD5BC297BDC5C279BEE5C244BE49C25EBF" + $"83C22BC0E8C21FC02EC21FC19DC21FC2AAC26CC234C238C323C29CC3C4C33EC3" + $"81C2E1C40BC399C45BC485C43EC405C478C502C487C626C487C58DC487C7BCC4" + $"87CAE7C487C9514ACAE746CAE7C2EFCAE746C96B46C67346C7EF46C5A0C1DDC4" + $"ABC20BC508C1AFC44FC0C2C421C151C421C097C421C040C424C06D4BC018C428" + $"BFBFC434BFEEC42CBFBFC66FBFBFCAE7BFBFC8ACBEF3CAE7BD5BCAE7BE27CAE7" + $"BD5BC821BD5BC297BD5BC55BBD5BC2970211BE27C363BE27C363BE91C345BFB1" + $"C310BF16C32AC050C2F7C1B4C2EBC0FAC2EBC269C2EBC376C338C300C304C3EF" + $"C368C490C40AC44DC3ADC4D7C465C527C551C50AC4D1C544C5CE4EC6F24EC659" + $"4EC8454ECAE74EC9964CCAE748CAE74ACAE748C9C548C77F48C8A148C6B9C2A9" + $"C5D4C2D7C62BC27BC57FC18EC553C21DC553C163C553C10CC557C1394EC0E4C5" + $"5A42C565C0BAC55E42C73A42CAE742C91140CAE73CCAE73ECAE73CC866BE27C3" + $"63BE27C5E4BE27C3630206B669C28FB669C28FB669C25DB613C207B642C21EB5" + $"8645B4F5C338B507C245B4F1C374B4F7C3BEB4F3C3B2B503C3DAB59DC370B507" + $"C3D7B632C309B669C28FB669C2CAB669C28F0207BAE6BC94BAE6BC94BC1EBB5D" + $"BD8EB8BBBD8EB948BD8EB89BBD1AB854BD5AB86DBBF7B7E7B988B975BA7DB85F" + $"B902BA0EB763BDFCB82DBAE5B751BE42B7F5BEBCB6C13FB92ABE1DBAE6BC94B9" + $"EDBD8CBAE6BC940207B9EABBF2B9EABBF2BA4CBB90BABFBABCBABFBAE9BABFBA" + $"B2BA9BBA9CBAAEBAA3BA40BA79B97BBAF7B9C8BA9EB952BB27B85BBCCCB85BBC" + $"B7B85BBCE3B8FCBC9EB89BBCCFB95EBC6CB9EABBF2B99CBC3FB9EABBF2020FC0" + $"E42CC0E42CC0BFB7C942B801C09DB7E0C07BB825C096B86CC080B84DC0ADB889" + $"C0F8B893C0D4B899C2D4B862C515B9BAC413B8E0C617BA94C789BD20C6D6BBD2" + $"C7CFBDA0C8EFC1C5C869BF62C977C428CA19CA85C9F2C73ACA1BCAABCA4FCADD" + $"CA30CACCCA6FCAEDCAB5CAD7CA97CAEBCAD4CAC4CAE5CA7DCAE7CAA1CABDC722" + $"59C19ACA3FC408C92DBF2BC83CBCC0C89FBD76C786BB6DC599B920C6BEBA17C4" + $"73B827C0E42CC2EEB794C0E42C020AC70ABC69C70ABC69C1BB3BC864C462C353" + $"50C8CFC440C982C3CEC930C411C983C3CDC984C3CCC983C3CCC985C3CAC987C3" + $"C7C986C3C9C9D4C384CA37C2CDCA13C32DCA59C272CA1945CA19C220C9B33FC8" + $"5ABC98C9B33DC85ABC98C859BC98C859BC98C7F2BC76C70ABC69C785BC69C70A" + $"BC690220C6E2C242C6E2C242C740C242C7A5C216C782C234C7CCC1F8C7DFC1AB" + $"C7DFC1D6C7DFC141C6C8C10CC782C10CC690C10CC622C10CC659C10CC622C0A1" + $"C622BFC8C622C035C659BFC8C6C8BFC8C690BFC8C705BFC8C75FBFA5C738BFBD" + $"C785BF8DC798BF35C798BF67C798BEE3C6EBBEB9C75FBEB9C6ADBEB9C635BED9" + $"C66FBEC3C5FABEEEC587BF1BC5BFBF03C555BEB4C4F0BDE5C523BE4CC532BDBA" + $"C5E5BD79C584BD98C64ABD5AC709BD4AC6ABBD4AC774BD4AC814BD6CC7CDBD54" + $"C85EBD84C8C6BDCEC89ABDA5C8F1BDF5C922BE5CC911BE24C935BE91C93DBF04" + $"C93DBECAC93DBF3EC916BFA5C931BF73C8FEBFD4C89AC038C8D4C005C8EEC05D" + $"58C0D7C92CC092C975C117C988C1B0C988C160C988C1FAC966C27CC97DC23EC9" + $"4EC2BBC8F1C321C927C2F1C8BCC34DC821C38BC878C370C7CCC3A5C6E7C3B4C7" + $"63C3B4C68DC3B4C5C5C399C62EC3AAC562C384C4D6C348C511C36AC4F5C2D4C5" + $"34C1EAC515C25EC58CC210C616C236C5D7C229C653C23EC6E2C242C698C242C6" + $"E2C2420F0A000100000A010101000A020102000A030103000A040104000A0501" + $"05000A060106000A010107000A000108000A000109000A07010A000A00010B00" + $"0A00010C000A01010D000A00010E00" +}; diff --git a/nnn-4.9/misc/logo/logo-128x128.png b/nnn-4.9/misc/logo/logo-128x128.png Binary files differ. diff --git a/nnn-4.9/misc/logo/logo-64x64.png b/nnn-4.9/misc/logo/logo-64x64.png Binary files differ. diff --git a/nnn-4.9/misc/logo/logo.svg b/nnn-4.9/misc/logo/logo.svg @@ -0,0 +1,302 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="63.999996" + height="63.999996" + viewBox="0 0 16.933332 16.933333" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="logo.svg" + inkscape:export-filename="logo-64x64.png" + inkscape:export-xdpi="96.000008" + inkscape:export-ydpi="96.000008"> + <title + id="title1733">n³ logo</title> + <defs + id="defs2"> + <linearGradient + inkscape:collect="always" + id="linearGradient4258"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4254" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4256" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3891"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3887" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3889" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3746"> + <stop + style="stop-color:#000000;stop-opacity:0" + offset="0" + id="stop3742" /> + <stop + id="stop3750" + offset="0.68665242" + style="stop-color:#000000;stop-opacity:0" /> + <stop + style="stop-color:#000000;stop-opacity:1" + offset="1" + id="stop3744" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3628"> + <stop + style="stop-color:#000000;stop-opacity:1" + offset="0" + id="stop3624" /> + <stop + style="stop-color:#000000;stop-opacity:0" + offset="1" + id="stop3626" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3628" + id="radialGradient4190" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.10643412,0.08213184,-0.08695471,0.11268405,2.5028417,-19.507024)" + cx="80.745285" + cy="31.199144" + fx="80.745285" + fy="31.199144" + r="17.514044" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3628" + id="radialGradient4200" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.1591284,-0.22144644,0.05150741,0.03701252,-10.674157,4.5498963)" + cx="63.691868" + cy="24.91503" + fx="63.691868" + fy="24.91503" + r="16.80954" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3746" + id="radialGradient4206" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.08312121,-0.16218012,0.2763752,0.1416496,-5.8976633,2.3429863)" + cx="109.63785" + cy="27.735554" + fx="109.63785" + fy="27.735554" + r="14.917971" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3891" + id="radialGradient4208" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.77009845,-0.00589491,0.0032956,0.4305302,1.4732687,-112.12628)" + cx="10.145939" + cy="261.29977" + fx="10.145939" + fy="261.29977" + r="7.9343286" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4258" + id="radialGradient4260" + cx="38.219185" + cy="-11.155752" + fx="38.219185" + fy="-11.155752" + r="2.5266471" + gradientTransform="matrix(0.41700468,-0.5564057,0.25660676,0.1923169,-8.5901303,12.321222)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3891" + id="radialGradient4271" + cx="36.437771" + cy="11.167927" + fx="36.437771" + fy="11.167927" + r="0.92064488" + gradientTransform="matrix(0.79726776,-1.0594042,0.6692442,0.50364803,-33.972333,27.585938)" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="43.627536" + inkscape:cy="44.431591" + inkscape:document-units="mm" + inkscape:current-layer="layer2" + showgrid="true" + units="px" + inkscape:snap-bbox="true" + inkscape:snap-bbox-midpoints="false" + inkscape:bbox-nodes="true" + inkscape:object-nodes="false" + inkscape:snap-global="true" + inkscape:snap-nodes="true" + inkscape:window-width="1918" + inkscape:window-height="1060" + inkscape:window-x="0" + inkscape:window-y="18" + inkscape:window-maximized="0" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + showguides="false"> + <inkscape:grid + type="xygrid" + id="grid815" + empspacing="2" + dotted="true" + originx="0" + originy="0" /> + <inkscape:grid + type="xygrid" + id="grid1158" + spacingx="16.933333" + spacingy="16.933333" + empcolor="#3fff3f" + empopacity="0.25098039" + enabled="true" + color="#52ff3f" + opacity="0.1254902" + originx="0" + originy="0" /> + </sodipodi:namedview> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>n³ logo</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Léo Villeveygoux</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="fg" + transform="translate(1.6666665e-6,16.933336)" + style="display:inline"> + <path + sodipodi:nodetypes="ccccccccccccccccscccsccccccccccccccccscccccccccccccscccccsccsccccc" + inkscape:connector-curvature="0" + id="path4096" + d="m 7.5563837,-16.683514 c -6.37e-4,4e-5 -0.06582,0.008 -0.08984,0.0137 -0.04805,0.0106 -0.07759,0.0228 -0.101563,0.0332 -0.04795,0.0209 -0.07078,0.0351 -0.0918,0.0488 -0.04203,0.0274 -0.06833,0.0495 -0.0957,0.0723 -0.05474,0.0455 -0.10969,0.0967 -0.175781,0.16016 -0.132182,0.127 -0.300521,0.29823 -0.492188,0.50195 -0.146719,0.15595 -0.277344,0.28701 -0.388672,0.39649 -0.0057,-0.003 -0.0078,-0.004 -0.01367,-0.008 -0.197393,-0.11237 -0.466421,-0.2688 -0.753907,-0.4414 -0.292561,-0.17566 -0.563176,-0.33604 -0.765625,-0.45313 -0.101224,-0.0585 -0.185684,-0.10714 -0.25,-0.14258 -0.03216,-0.0177 -0.05714,-0.0313 -0.08398,-0.0449 -0.01342,-0.007 -0.02769,-0.0122 -0.04883,-0.0215 -0.01057,-0.005 -0.02139,-0.0114 -0.04492,-0.0195 -0.01177,-0.004 -0.02683,-0.008 -0.05078,-0.0137 -0.02395,-0.006 -0.124654,-0.0156 -0.125,-0.0156 -0.05674,0 -0.203301,0.0121 -0.333985,0.10937 -0.130683,0.0973 -0.184045,0.2292 -0.205078,0.30469 -0.04207,0.15099 -0.02811,0.20268 -0.02539,0.29102 0.0054,0.17668 0.02754,0.44302 0.07031,0.95703 0.02009,0.24144 0.03761,0.47757 0.05078,0.66211 0.01317,0.18453 0.02149,0.35714 0.02149,0.32617 -2.5e-5,-0.0716 0.0084,-0.0136 -0.08984,0.12305 -0.09824,0.13666 -0.280681,0.34121 -0.548828,0.60546 -0.331583,0.32677 -0.546477,0.51342 -0.689453,0.83204 -0.142977,0.31862 -0.12766,0.605 -0.128907,1.01953 -0.0019,0.65046 0.02339,0.50097 -0.0957,0.84179 -0.144761,0.41429 -0.289011,0.6739003 -0.884765,1.5566403 -0.27946103,0.41409 -0.54683003,0.82021 -0.66601603,1.04493 -0.389514,0.73442 -0.574283,1.51442 -0.394531,2.20507 0.234069,0.89938 1.04359803,1.46551 2.00976503,1.57227 0.08937,0.18231 0.157509,0.38673 0.316407,0.48242 h 0.002 c 0.344505,0.20741 0.757366,0.16421 1.074218,0.0137 0.316853,-0.15053 0.584433,-0.40119 0.802735,-0.72265 0.11807,-0.17388 0.279753,-0.46209 0.423828,-0.73828 0.267813,-0.5134 0.424453,-0.75918 0.673828,-0.98438 0.249375,-0.2252 0.638049,-0.4572 1.359375,-0.83203 0.492658,-0.25601 0.795852,-0.45655 1.134766,-0.66797 -3.2e-5,0.0656 0.0067,0.12864 0.0039,0.18945 -0.02949,0.65113 -0.155996,1.13801 -0.449219,1.72266 -0.266512,0.53141 -0.429772,0.70223 -1.361329,1.54102 -0.567672,0.51114 -0.922548,0.84685 -1.177734,1.16015 -0.255186,0.31331 -0.40187,0.6268 -0.484375,0.94336 -0.153164,0.58764 -0.184601,1.08693002 -0.164063,1.55274002 L 4.2498067,-3.675972e-6 H 16.933332 L 16.919662,-1.2538237 c -0.0264,-2.50458 -0.581284,-5.74387 -1.388672,-8.16016 -0.567382,-1.6980103 -1.186678,-2.8095203 -2.121093,-3.7480403 -0.824138,-0.82775 -1.808365,-1.36141 -2.937501,-1.58985 -0.460672,-0.0932 -1.2090663,-0.0911 -1.8593753,-0.0488 l 0.216796,-0.0137 -0.277343,-0.60742 c -0.129838,-0.28446 -0.245022,-0.52486 -0.335938,-0.70312 -0.04546,-0.0891 -0.0838,-0.16151 -0.121094,-0.22461 -0.01865,-0.0315 -0.03654,-0.0597 -0.06445,-0.0977 -0.01396,-0.019 -0.02894,-0.0405 -0.0625,-0.0742 -0.01678,-0.0169 -0.03866,-0.0381 -0.07617,-0.0644 -0.01876,-0.0132 -0.04084,-0.0276 -0.07227,-0.043 -0.03143,-0.0154 -0.12448,-0.0429 -0.125,-0.043 h -0.0039 l -0.0019,-0.002 c -5.15e-4,-10e-5 -0.132175,-0.01 -0.132812,-0.01 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.05833328;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <path + inkscape:connector-curvature="0" + id="path4098" + d="m 6.4080867,-3.7690437 c 0.938534,-0.84507 1.188659,-1.11552 1.48007,-1.69657 0.320921,-0.63988 0.47318,-1.22312 0.505483,-1.9363 0.02009,-0.44367 -0.02591,-0.99383 -0.08833,-1.05625 -0.01983,-0.0198 -0.09943,0.0146 -0.196664,0.0851 -0.362858,0.26298 -0.902924,0.58065 -1.625708,0.95624 -1.458811,0.75805 -1.708252,0.98331 -2.259881,2.04078 -0.136798,0.26224 -0.312882,0.57127 -0.391298,0.68675 -0.348405,0.51305 -0.842285,0.74905 -1.167444,0.55329 -0.136991,-0.0825 -0.203307,-0.18758 -0.23386,-0.37066 -0.0206,-0.1234 -0.02893,-0.12948 -0.189186,-0.13815 -0.869164,-0.047 -1.47390803,-0.49276 -1.66510103,-1.22739 -0.125725,-0.48307 0.0075,-1.1762 0.35022,-1.82239 0.076,-0.14329 0.36220403,-0.59246 0.63600503,-0.99816 0.601277,-0.89093 0.78603,-1.21845 0.946654,-1.6781303 0.120217,-0.34405 0.12288,-0.36238 0.124815,-1.01425 0.0025,-0.83103 -0.0022,-0.82067 0.662064,-1.47528 0.558243,-0.55015 0.795236,-0.87983 0.795158,-1.10615 -2.8e-5,-0.0813 -0.0332,-0.54616 -0.07371,-1.033 -0.08546,-1.02692 -0.08733,-1.08802 -0.03345,-1.08802 0.02217,0 0.515642,0.2854 1.096601,0.63421 0.58096,0.34881 1.083868,0.63511 1.117573,0.63621 0.03371,10e-4 0.347056,-0.30174 0.696336,-0.67299 0.374566,-0.39812 0.657987,-0.67043 0.690965,-0.66387 0.03324,0.007 0.230015,0.39256 0.485181,0.95161 l 0.429268,0.94049 0.146868,-0.01 c 0.609325,-0.0396 1.4254303,-0.0214 1.7210693,0.0384 1.033646,0.20912 1.909331,0.68342 2.667218,1.44463 0.872014,0.87585 1.440968,1.88647 1.994305,3.5424503 0.784909,2.34901 1.335797,5.56889 1.361403,7.99842 l 0.0076,0.71920002 H 4.7566417 c -0.01888,-0.4282 0.0079,-0.85904002 0.147789,-1.39575002 0.139882,-0.53671 0.378578,-0.83142 1.503656,-1.84447 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1.05833328;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" /> + <path + inkscape:connector-curvature="0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:url(#radialGradient4190);fill-opacity:1;stroke:none;stroke-width:1.05833328;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" + d="m 14.019296,-0.52863368 c -0.03236,-0.37147 -0.05679,-0.71947002 -0.168981,-1.35909002 -0.15856,-0.90396 -0.383199,-2.00523 -0.634071,-3.1042 -0.25087,-1.09897 -0.528185,-2.19572 -0.792716,-3.09077 -0.264533,-0.89505 -0.516175,-1.58828 -0.715719,-1.8805 -0.190129,-0.2784503 -0.377891,-0.5254103 -0.572058,-0.7420803 -0.194167,-0.21666 -0.394798,-0.40292 -0.611333,-0.5612 -0.216532,-0.15828 -0.448667,-0.28843 -0.7058983,-0.39171 -0.131273,-0.0527 -0.29119,-0.0793 -0.436667,-0.11834 0.07747,0.0695 0.156587,0.13071 0.227892,0.22944 0.09939,0.19294 0.158695,0.41322 0.167431,0.65319 0.0087,0.23998 -0.03275,0.49928 -0.135908,0.77102 -0.103153,0.2717303 -0.267553,0.5556703 -0.503845,0.8438703 -0.233789,0.28516 -0.540714,0.57454 -0.925525,0.86093 0.03184,-0.0131 0.08412,-0.0497 0.09353,-0.0403 0.06242,0.0624 0.108457,0.6126 0.08837,1.05627 -0.0323,0.71318 -0.184474,1.29644 -0.505395,1.93632 -0.291411,0.58105 -0.541995,0.85146 -1.48053,1.69653 -1.125078,1.01305 -1.363385,1.30814 -1.503267,1.84485 -0.139889,0.53671 -0.166675,0.96758002 -0.147795,1.39578002 z" + id="path4106" /> + <path + inkscape:connector-curvature="0" + id="path4116" + d="m 7.5855797,-16.154034 c -0.03298,-0.007 -0.316348,0.26592 -0.690914,0.66404 -0.34928,0.37125 -0.662888,0.67383 -0.696598,0.67283 -0.0337,-10e-4 -0.536801,-0.28733 -1.117761,-0.63614 -0.58096,-0.34881 -1.074404,-0.63407 -1.096574,-0.63407 -0.05388,0 -0.05187,0.0609 0.03359,1.08779 0.04051,0.48684 0.07387,0.95171 0.0739,1.03301 7.7e-5,0.22632 -0.237058,0.55625 -0.795301,1.1064 -0.664264,0.65461 -0.659475,0.64381 -0.661975,1.47484 -0.0019,0.65187 -0.0048,0.67036 -0.125057,1.01441 -0.160624,0.4596803 -0.345435,0.7870003 -0.946712,1.6779303 -0.273801,0.4057 -0.55962,0.8551 -0.63562003,0.99839 -0.34272,0.64619 -0.476091,1.33956 -0.350366,1.82263 0.191193,0.73463 0.79585103,1.18032 1.66501403,1.22732 0.08533,0.005 0.123824,0.005 0.147795,0.0264 0.474897,-0.71432 0.990332,-1.57106 1.609204,-2.52181 0.642554,-0.98713 1.335583,-2.00634 2.022099,-2.85977 0.343258,-0.4267203 0.685028,-0.8121303 1.018026,-1.1312003 0.332998,-0.31907 0.65726,-0.57187 0.965832,-0.73381 0.154287,-0.081 0.304578,-0.13915 0.450102,-0.17156 0.145524,-0.0324 0.286173,-0.0389 0.421163,-0.0165 0.13499,0.0223 0.264371,0.0733 0.387056,0.15658 0.04214,0.0286 0.07884,0.0836 0.119373,0.11989 0.01427,0.004 0.02839,0.008 0.04289,0.0114 l -0.920357,-2.49752 -0.0047,5.1e-4 -0.428914,-0.94051 c -0.255166,-0.55905 -0.452002,-0.94436 -0.485242,-0.95136 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:url(#radialGradient4200);fill-opacity:1;stroke:none;stroke-width:1.05833328;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:url(#radialGradient4206);fill-opacity:1;stroke:none;stroke-width:1.05833328;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" + d="m 8.5043867,-14.262674 1.165911,2.68461 c 0.133392,0.0334 0.6612493,0.21144 0.7796483,0.25898 2.649479,0.14717 5.883653,2.4870503 2.584913,-1.46978 -0.757881,-0.76121 -1.633374,-1.23575 -2.667019,-1.44487 -0.29564,-0.0598 -1.1120183,-0.0778 -1.7213433,-0.0382 z" + id="path4122" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:url(#radialGradient4208);fill-opacity:1;stroke:none;stroke-width:1.05833328;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" + d="m 6.4080867,-3.7690437 c 3.9106623,-2.0517737 6.5564953,-2.316357 9.7896183,-0.1353155 0.116365,0.9327131 0.184394,1.8392243 0.193006,2.6563355 l 0.0076,0.71920002 H 4.7566417 c -0.01888,-0.4282 0.0079,-0.85904002 0.147789,-1.39575002 0.139882,-0.53671 0.378578,-0.83142 1.503656,-1.84447 z" + id="path4124" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="display:inline;opacity:0.33200001;fill:url(#radialGradient4271);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 2.3150987,-4.6632687 c 0.84336,-0.578776 1.653646,-2.182813 1.670183,-1.852083 0.01654,0.330729 -0.496094,2.645833 -1.35599,2.067057 -0.859896,-0.578776 -0.314193,-0.214974 -0.314193,-0.214974 z" + id="path4262" + inkscape:connector-curvature="0" /> + <path + sodipodi:nodetypes="ccscccsccscsccccc" + inkscape:connector-curvature="0" + d="m 6.8791644,-6.5799967 c 0.277182,-0.0747 0.617361,-0.14533 1.020535,-0.21177 0.411575,-0.0665 0.856747,-0.0997 1.335516,-0.0997 0.470371,0 0.8609466,0.0664 1.1717256,0.19932 0.310781,0.12456 0.554366,0.30725 0.730754,0.54808 0.18479,0.23253 0.314982,0.51489 0.390577,0.8470599 0.0756,0.32387 0.113393,0.68512 0.113393,1.08374 v 3.1548598 h -1.5875 v -2.9555598 c 0,-0.5481 -0.06013,-0.94256 -0.1803996,-1.18338 -0.120264,-0.2408299 -0.364802,-0.3612399 -0.733616,-0.3612399 -0.112248,0 -0.224495,0.004 -0.336742,0.0125 -0.10423,0.008 -0.216478,0.0208 -0.336743,0.0373 v 4.4503697 h -1.5875 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.11111069px;line-height:80.00000119%;font-family:'Ubuntu Mono';-inkscape-font-specification:'Ubuntu Mono Bold';letter-spacing:0px;word-spacing:0px;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.23356323px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path4273" /> + <path + sodipodi:nodetypes="ccscccsccscsccccc" + inkscape:connector-curvature="0" + d="m 7.4083317,-6.0508267 c 0.277182,-0.0747 0.617361,-0.14533 1.020535,-0.21177 0.411575,-0.0665 0.856747,-0.0997 1.335516,-0.0997 0.4703713,0 0.8609463,0.0664 1.1717253,0.19932 0.310781,0.12456 0.554366,0.30725 0.730754,0.54808 0.18479,0.23253 0.314982,0.5148899 0.390577,0.8470599 0.0756,0.32387 0.113393,0.68512 0.113393,1.08374 v 2.6257298 h -1.5875 v -2.2633598 c 0,-0.51127 -0.06013,-0.87922 -0.180399,-1.10385 -0.120264,-0.22465 -0.364802,-0.33697 -0.7336163,-0.33697 -0.112248,0 -0.224495,0.004 -0.336742,0.0117 -0.10423,0.007 -0.216478,0.0194 -0.336743,0.0348 v 3.6577098 h -1.5875 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.11111069px;line-height:80.00000119%;font-family:'Ubuntu Mono';-inkscape-font-specification:'Ubuntu Mono Bold';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.23356323px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path4158" /> + <path + inkscape:connector-curvature="0" + id="path4160" + d="m 2.2657997,-6.5970811 c 2.39e-4,-0.13158 -0.102021,-0.29549 -0.222752,-0.3571395 -0.367285,-0.18754 -0.694817,0.1635095 -0.738403,0.7914195 -0.01108,0.15956 -0.0093,0.31791 0.0038,0.35187 0.0276,0.071 0.04155,0.0639 0.42986,-0.20266 0.388306,-0.26657 0.527201,-0.43437 0.527446,-0.58349 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.05833328;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" /> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;opacity:0.44600004;fill:url(#radialGradient4260);fill-opacity:1;stroke:none;stroke-width:3.37220645;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" + d="m 5.2460787,-10.568226 c 0.812188,-0.809811 1.765374,-2.190004 1.765374,-2.556274 0,-0.0838 -0.135642,-0.203925 -0.301459,-0.267015 -0.752294,-0.286133 -1.733457,0.02549 -2.369685,0.748534 -0.347846,0.396158 -0.900949,0.953943 -1.423035,3.0038925 -0.04718,0.1852661 -0.424024,0.9086143 0.377177,0.4985965 0.801204,-0.4100179 1.308944,-0.7869297 1.951628,-1.427734 z" + id="path4252" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ssccscs" /> + <path + inkscape:connector-curvature="0" + id="path4162" + d="m 4.5914317,-10.992111 c 0.254897,-0.254151 0.554045,-0.687311 0.554045,-0.802261 0,-0.0263 -0.04257,-0.064 -0.09461,-0.0838 -0.2361,-0.0898 -0.544028,0.008 -0.743702,0.23492 -0.109168,0.12433 -0.747614,1.164311 -0.747614,1.217801 0,0.06 0.167933,0.0101 0.419382,-0.11858 0.25145,-0.12868 0.410799,-0.24697 0.612499,-0.44808 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.05833328;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" /> + <path + inkscape:connector-curvature="0" + id="path4164" + d="m 9.2282597,-13.755752 a 0.26460981,0.26460981 0 1 0 0.05273,0.52539 c 1.2306523,-0.12455 2.0604593,0.20175 2.7285163,0.76758 0.668056,0.56582 1.165386,1.39097 1.630859,2.255861 0.179199,0.3329602 0.577259,1.4975302 0.927734,3.0839804 0.350476,1.5864495 0.671479,3.6240594 0.771485,5.8124992 a 0.26490778,0.26490778 0 1 0 0.529297,-0.0234 c -0.101686,-2.2251898 -0.428845,-4.2894697 -0.785157,-5.9023392 -0.356311,-1.6128702 -0.723527,-2.7469202 -0.978515,-3.2207004 -0.472697,-0.878311 -0.99272,-1.763511 -1.753906,-2.408211 -0.761187,-0.6447 -1.771873,-1.02737 -3.1230473,-0.89062 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:80.00000119%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ccccccccccc" + inkscape:connector-curvature="0" + id="path4275" + d="m 13.309647,-10.683461 c -3.5259213,0.8942402 -2.467588,6.4504898 0.896553,5.2949099 0.277432,-0.0861 0.529922,-0.20786 0.742188,-0.38476 l 0.0059,-0.006 0.0078,-0.008 c 0.200661,-0.17837 0.36145,-0.4014 0.457031,-0.65235 0.08874,-0.23296 -0.07914,-0.44979 -0.07914,-0.7037295 -0.264584,-1.5875002 -0.264584,-2.1166602 -1.157186,-3.4173504 -0.0012,-3.9e-4 -0.0027,3.9e-4 -0.0039,0 -0.266042,-0.0881 -0.551145,-0.12305 -0.86914,-0.12305 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.11111069px;line-height:80.00000119%;font-family:'Ubuntu Mono';-inkscape-font-specification:'Ubuntu Mono Bold';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.16429496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <path + inkscape:connector-curvature="0" + id="path4168" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.11111069px;line-height:80.00000119%;font-family:'Ubuntu Mono';-inkscape-font-specification:'Ubuntu Mono Bold';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.16429496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" + d="m 13.205251,-6.7970011 q 0.368361,0 0.506496,-0.11511 0.149645,-0.1151195 0.149645,-0.2762795 0,-0.4144001 -0.725209,-0.4144001 h -0.425918 v -0.8403301 h 0.425918 q 0.241736,0 0.391383,-0.0921 0.149647,-0.0921 0.149647,-0.28779 0,-0.32231 -0.448939,-0.32231 -0.241738,0 -0.471962,0.0806 -0.230226,0.0806 -0.448941,0.17266 l -0.391382,-0.80578 q 0.253249,-0.16115 0.63312,-0.27626 0.391383,-0.1266202 0.759743,-0.1266202 0.414405,0 0.690677,0.0921 0.28778,0.0921 0.46045,0.2532602 0.172659,0.14964 0.241735,0.36836 0.06909,0.20721 0.06909,0.43744 0,0.2187 -0.103625,0.41439 -0.09207,0.18419 -0.322314,0.3798801 0.333821,0.14965 0.471953,0.4144 0.149648,0.25326 0.149648,0.5640601 0,0.2877795 -0.09208,0.5295095 -0.09207,0.24173 -0.299287,0.42592 -0.207203,0.17268 -0.541028,0.27628 -0.333827,0.10365 -0.817301,0.10365 -0.345337,0 -0.748232,-0.0691 -0.391384,-0.0806 -0.621608,-0.20719 l 0.241736,-0.9093995 q 0.345339,0.1496595 0.587075,0.1956995 0.241736,0.0345 0.529518,0.0345 z" /> + </g> +</svg> diff --git a/nnn-4.9/misc/macos-legacy/mach_gettime.c b/nnn-4.9/misc/macos-legacy/mach_gettime.c @@ -0,0 +1,42 @@ +#include "mach_gettime.h" +#include <mach/mach_time.h> + +#define MT_NANO (+1.0E-9) +#define MT_GIGA UINT64_C(1000000000) + +// TODO create a list of timers, +static double mt_timebase = 0.0; +static uint64_t mt_timestart = 0; + +int clock_gettime(clockid_t clk_id, struct timespec *tp) +{ + kern_return_t retval = KERN_SUCCESS; + + if (clk_id == TIMER_ABSTIME) { + if (!mt_timestart) { // only one timer, initialized on the first call to the TIMER + mach_timebase_info_data_t tb; + mach_timebase_info(&tb); + mt_timebase = tb.numer; + mt_timebase /= tb.denom; + mt_timestart = mach_absolute_time(); + } + + double diff = (mach_absolute_time() - mt_timestart) * mt_timebase; + tp->tv_sec = diff * MT_NANO; + tp->tv_nsec = diff - (tp->tv_sec * MT_GIGA); + } else { // other clk_ids are mapped to the corresponding mach clock_service + clock_serv_t cclock; + mach_timespec_t mts; + + host_get_clock_service(mach_host_self(), clk_id, &cclock); + retval = clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + + tp->tv_sec = mts.tv_sec; + tp->tv_nsec = mts.tv_nsec; + } + + return retval; +} + +/* Copyright (c) 2015-2018 Alf Watt - Open Source - https://opensource.org/licenses/MIT */ diff --git a/nnn-4.9/misc/macos-legacy/mach_gettime.h b/nnn-4.9/misc/macos-legacy/mach_gettime.h @@ -0,0 +1,28 @@ +#ifndef mach_time_h +#define mach_time_h + +#include <sys/types.h> +#include <sys/_types/_timespec.h> +#include <mach/mach.h> +#include <mach/clock.h> + +/* The opengroup spec isn't clear on the mapping from REALTIME to CALENDAR + being appropriate or not. + http://pubs.opengroup.org/onlinepubs/009695299/basedefs/time.h.html */ + +// XXX only supports a single timer +#define TIMER_ABSTIME -1 +#define CLOCK_REALTIME CALENDAR_CLOCK +#define CLOCK_MONOTONIC SYSTEM_CLOCK + +typedef int clockid_t; + +/* the mach kernel uses struct mach_timespec, so struct timespec + is loaded from <sys/_types/_timespec.h> for compatibility */ +// struct timespec { time_t tv_sec; long tv_nsec; }; + +int clock_gettime(clockid_t clk_id, struct timespec *tp); + +#endif + +/* Copyright (c) 2015-2018 Alf Watt - Open Source - https://opensource.org/licenses/MIT */ diff --git a/nnn-4.9/misc/musl/musl-static-ubuntu.sh b/nnn-4.9/misc/musl/musl-static-ubuntu.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env sh + +# Statically compile nnn with netbsd-curses, musl-fts and musl libc on Ubuntu +# +# netbsd-curses: https://github.com/sabotage-linux/netbsd-curses +# musl-fts: https://github.com/void-linux/musl-fts +# musl libc: https://www.musl-libc.org/ +# +# Dependencies: git +# +# Usage: musl-static-ubuntu.sh [no_run] +# # optional argument - do not to execute the binary after compilation +# +# Notes: +# - run the script within the top-level nnn directory +# - installs musl & gits netbsd-curses, musl-fts libs +# +# Tested on Ubuntu 20.04 x86_64 +# Author: Arun Prakash Jana + +# Exit on first failure +set -e + +# Output binary name +BIN=nnn-musl-static + +# Install musl +sudo apt install -y --no-install-recommends musl musl-dev musl-tools + +# Get netbsd-curses +[ ! -d "./netbsd-curses" ] && git clone https://github.com/sabotage-linux/netbsd-curses + +# Enter the library dir +cd netbsd-curses + +# Get the last known working version +git checkout v0.3.2 + +# Compile the static netbsd-curses libraries +if [ ! -d "./libs" ]; then + mkdir libs +else + rm -vf libs/* +fi +make CC=musl-gcc CFLAGS=-O3 LDFLAGS=-static all-static -j$(($(nproc)+1)) +cp -v libcurses/libcurses.a libterminfo/libterminfo.a libs/ + +# Get musl-fts library +cd .. +[ ! -d "./musl-fts" ] && git clone https://github.com/void-linux/musl-fts --depth=1 + +# Compile the static musl-fts library +cd musl-fts +./bootstrap.sh +./configure +make CC=musl-gcc CFLAGS=-O3 LDFLAGS=-static -j$(($(nproc)+1)) + +# Compile nnn +cd .. +[ -e "./netbsd-curses" ] || rm "$BIN" +musl-gcc -O3 -DNORL -DNOMOUSE -std=c11 -Wall -Wextra -Wshadow -I./netbsd-curses/libcurses -I./musl-fts -o "$BIN" src/nnn.c -Wl,-Bsymbolic-functions -lpthread -L./netbsd-curses/libs -lcurses -lterminfo -static -L./musl-fts/.libs -lfts +strip "$BIN" + +if [ -z "$1" ]; then + # Run the binary with it selected + ./"$BIN" -d "$BIN" +fi diff --git a/nnn-4.9/misc/natool/natool b/nnn-4.9/misc/natool/natool @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 + +# ############################################################################# +# natool: a wrapper script to patool to list, extract and create archives +# +# usage: natool [-a] [-l] [-x] [archive] [file/dir] +# +# Examples: +# - create archive : natool -a archive.7z archive_dir +# - list archive : natool -l archive.7z +# - extract archive: natool -x archive.7z +# +# Brief: +# natool is written to integrate patool (instead of the default atool) with nnn +# A copies of this file should be dropped somewhere in $PATH as atool +# +# Author: Arun Prakash Jana +# Email: engineerarun@gmail.com +# Homepage: https://github.com/jarun/nnn +# Copyright © 2019 Arun Prakash Jana +# ############################################################################# + +import sys +from subprocess import Popen, PIPE + +if len(sys.argv) < 3: + print('usage: natool [-a] [-l] [-x] [archive] [file/dir]') + sys.exit(0) + +if sys.argv[1] == '-a': + cmd = ['patool', '--non-interactive', 'create', sys.argv[2]] + cmd.extend(sys.argv[3:]) +elif sys.argv[1] == '-l': + cmd = ['patool', '--non-interactive', 'list'] + cmd.extend(sys.argv[2:]) +elif sys.argv[1] == '-x': + cmd = ['patool', '--non-interactive', 'extract'] + cmd.extend(sys.argv[2:]) +else: + sys.exit(0) + +pipe = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) +out, err = pipe.communicate() +print(out.decode()) +print(err.decode()) diff --git a/nnn-4.9/misc/packagecore/packagecore.yaml b/nnn-4.9/misc/packagecore/packagecore.yaml @@ -0,0 +1,141 @@ +name: nnn +maintainer: Arun Prakash Jana <engineerarun@gmail.com> +license: BSD 2-Clause +summary: The unorthodox terminal file manager. +homepage: https://github.com/jarun/nnn +commands: + install: + - make PREFIX="/usr" strip install DESTDIR="${BP_DESTDIR}" +packages: + centos7.5: + builddeps: + - make + - gcc + - pkgconfig + - ncurses-devel + - readline-devel + deps: + - ncurses + - readline + commands: + pre: + - yum install epel-release + centos7.6: + builddeps: + - make + - gcc + - pkgconfig + - ncurses-devel + - readline-devel + deps: + - ncurses + - readline + commands: + pre: + - yum install epel-release + centos7.7: + builddeps: + - make + - gcc + - pkgconfig + - ncurses-devel + - readline-devel + deps: + - ncurses + - readline + commands: + pre: + - yum install epel-release + centos8.0: + builddeps: + - make + - gcc + - pkgconfig + - ncurses-devel + - readline-devel + deps: + - ncurses + - readline + commands: + pre: + - yum install epel-release + debian9: + builddeps: + - make + - gcc + - pkg-config + - libncursesw5-dev + - libreadline-dev + deps: + - libncursesw5 + - readline-common + debian10: + builddeps: + - make + - gcc + - pkg-config + - libncurses-dev + - libreadline-dev + deps: + - libncursesw6 + - readline-common + fedora32: + builddeps: + - make + - gcc + - pkg-config + - ncurses-devel + - readline-devel + deps: + - ncurses + - readline +# opensuse15.2: +# builddeps: +# - make +# - gcc +# - pkg-config +# - readline-devel +# - ncurses-devel +# deps: +# - libncurses6 +# - libreadline7 +# opensuse.tumbleweed: +# builddeps: +# - make +# - gcc +# - pkg-config +# - readline-devel +# - ncurses-devel +# deps: +# - libncurses6 +# - libreadline8 + ubuntu16.04: + builddeps: + - make + - gcc + - pkg-config + - libncursesw5-dev + - libreadline6-dev + deps: + - libncursesw5 + - libreadline6 + ubuntu18.04: + builddeps: + - make + - gcc + - pkg-config + - libncursesw5-dev + - libreadline-dev + deps: + - libncursesw5 + - libreadline7 + ubuntu20.04: + builddeps: + - make + - gcc + - pkg-config + - libncurses-dev + - libreadline-dev + deps: + - libncursesw6 + - libreadline8 diff --git a/nnn-4.9/misc/quitcd/quitcd.bash_sh_zsh b/nnn-4.9/misc/quitcd/quitcd.bash_sh_zsh @@ -0,0 +1,30 @@ +n () +{ + # Block nesting of nnn in subshells + [ "${NNNLVL:-0}" -eq 0 ] || { + echo "nnn is already running" + return + } + + # The behaviour is set to cd on quit (nnn checks if NNN_TMPFILE is set) + # If NNN_TMPFILE is set to a custom path, it must be exported for nnn to + # see. To cd on quit only on ^G, remove the "export" and make sure not to + # use a custom path, i.e. set NNN_TMPFILE *exactly* as follows: + # NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd" + export NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd" + + # Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn + # stty start undef + # stty stop undef + # stty lwrap undef + # stty lnext undef + + # The command builtin allows one to alias nnn to n, if desired, without + # making an infinitely recursive alias + command nnn "$@" + + [ ! -f "$NNN_TMPFILE" ] || { + . "$NNN_TMPFILE" + rm -f "$NNN_TMPFILE" > /dev/null + } +} diff --git a/nnn-4.9/misc/quitcd/quitcd.csh b/nnn-4.9/misc/quitcd/quitcd.csh @@ -0,0 +1,17 @@ +# NOTE: set NNN_TMPFILE correctly if you use 'XDG_CONFIG_HOME' + +# The behaviour is set to cd on quit (nnn checks if NNN_TMPFILE is set) +# If NNN_TMPFILE is set to a custom path, it must be exported for nnn to see. +# To cd on quit only on ^G, set NNN_TMPFILE after the nnn invocation, and make +# sure not to use a custom path. +set NNN_TMPFILE=~/.config/nnn/.lastd + +# Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn +# stty start undef +# stty stop undef +# stty lwrap undef +# stty lnext undef + +# The backslash allows one to alias n to nnn if desired without making an +# infinitely recursive alias +alias n '\nnn; source "$NNN_TMPFILE"; rm -f "$NNN_TMPFILE"' diff --git a/nnn-4.9/misc/quitcd/quitcd.elv b/nnn-4.9/misc/quitcd/quitcd.elv @@ -0,0 +1,41 @@ +# Append this file to ~/.elvish/rc.elv (Elvish > 0.17.0) + +use path + +fn n {|@a| + # Block nesting of nnn in subshells + if (has-env NNNLVL) { + try { + if (>= $E:NNNLVL 1) { + echo "nnn is already running" + return + } + } catch e { + nop + } + } + + # The behaviour is set to cd on quit (nnn checks if NNN_TMPFILE is set) + # If NNN_TMPFILE is set to a custom path, it must be exported for nnn to + # see. + if (has-env XDG_CONFIG_HOME) { + set-env NNN_TMPFILE $E:XDG_CONFIG_HOME/nnn/.lastd + } else { + set-env NNN_TMPFILE $E:HOME/.config/nnn/.lastd + } + + # Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn + # stty start undef + # stty stop undef + # stty lwrap undef + # stty lnext undef + + # The e: prefix allows one to alias n to nnn if desired without making an + # infinitely recursive alias + e:nnn $@a + + if (path:is-regular $E:NNN_TMPFILE) { + eval (slurp < $E:NNN_TMPFILE) + rm $E:NNN_TMPFILE + } +} diff --git a/nnn-4.9/misc/quitcd/quitcd.fish b/nnn-4.9/misc/quitcd/quitcd.fish @@ -0,0 +1,36 @@ +# Rename this file to match the name of the function +# e.g. ~/.config/fish/functions/n.fish +# or, add the lines to the 'config.fish' file. + +function n --wraps nnn --description 'support nnn quit and change directory' + # Block nesting of nnn in subshells + if test -n "$NNNLVL" -a "$NNNLVL" -ge 1 + echo "nnn is already running" + return + end + + # The behaviour is set to cd on quit (nnn checks if NNN_TMPFILE is set) + # If NNN_TMPFILE is set to a custom path, it must be exported for nnn to + # see. To cd on quit only on ^G, remove the "-x" from both lines below, + # without changing the paths. + if test -n "$XDG_CONFIG_HOME" + set -x NNN_TMPFILE "$XDG_CONFIG_HOME/nnn/.lastd" + else + set -x NNN_TMPFILE "$HOME/.config/nnn/.lastd" + end + + # Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn + # stty start undef + # stty stop undef + # stty lwrap undef + # stty lnext undef + + # The command function allows one to alias this function to `nnn` without + # making an infinitely recursive alias + command nnn $argv + + if test -e $NNN_TMPFILE + source $NNN_TMPFILE + rm $NNN_TMPFILE + end +end diff --git a/nnn-4.9/misc/quitcd/quitcd.nu b/nnn-4.9/misc/quitcd/quitcd.nu @@ -0,0 +1,18 @@ +# The behaviour is set to cd on quit (nnn checks if NNN_TMPFILE is set) +let cfgHome = ($env | default $"($env.HOME)/.config" XDG_CONFIG_HOME | get XDG_CONFIG_HOME) +let-env NNN_TMPFILE = $"($cfgHome)/nnn/.lastd" + +def-env n [...x] { + # Launch nnn. Add desired flags after `^nnn`, ex: `^nnn -eda ($x | str join)` + ^nnn ($x | str join) + let newpath = ( + if ($env.NNN_TMPFILE | path exists) { + let newpath = (open $env.NNN_TMPFILE | parse 'cd "{nnnpath}"').0.nnnpath + ^rm -f $env.NNN_TMPFILE + echo $newpath + } else { + pwd + } + ) + cd $newpath +} diff --git a/nnn-4.9/misc/test/benchmark.sh b/nnn-4.9/misc/test/benchmark.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# +# Usage: ./misc/test/benchmark.sh ./nnn /tmp/testdir1 ./testdir2 ... +# +# Don't forget to build nnn in benchmark mode: make O_BENCH=1 + +# Use a test dir filled with genfiles.sh to get interesting output +# (or maybe /usr/lib/) + +LANG=C + +TIME_VAL=${TIME_VAL:-"real"} + +SAMPLES=${SAMPLES:-100} + +EXE=$1 + +bench_val () { + (time "$1" "$2") 2>&1 |\ + awk '$1=="'"$TIME_VAL"'"{match($2, /[0-9]*\.[0-9]*/) ; print substr($2, RSTART, RLENGTH)}' +} + +bench_dir () { + i=$SAMPLES + printf "$2" + while [ $((i--)) -gt 0 ] ; do + printf "\t%s" "$(bench_val "$1" "$2")" + done + printf "\n" +} + +shift + +for dir in "$@" ; do + bench_dir "$EXE" "$dir" +done + diff --git a/nnn-4.9/misc/test/genfiles.sh b/nnn-4.9/misc/test/genfiles.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +# Generates 100000 files in the current directory + +i=1; while [ $i -le 100000 ]; do + mktemp -p . -t 'XXXXXXXXXXXXXXXXXXXXX' + i=$(( i + 1 )) +done diff --git a/nnn-4.9/misc/test/mktest.sh b/nnn-4.9/misc/test/mktest.sh @@ -0,0 +1,55 @@ +#!/bin/sh + +# Create test files and directories + +test -e outdir && { + echo "Remove 'outdir' and try again" + exit 1 +} + +mkdir -p outdir && cd outdir || exit 1 + +echo 'It works!' > normal.txt +echo 'Με δουλέβει;' > 'κοινό.txt' +ln -sf normal.txt ln-normal.txt +ln -sf normal.txt ln-normal +mkdir -p normal-dir +ln -sf normal-dir ln-normal-dir +ln -sf nowhere ln-nowhere +mkfifo mk-fifo +touch no-access && chmod 000 no-access +mkdir -p no-access-dir && chmod 000 no-access-dir +ln -sf ../normal.txt normal-dir/ln-normal.txt +ln -sf ../normal.txt normal-dir/ln-normal +echo 'int main(void) { *((char *)0) = 0; }' > ill.c +make ill > /dev/null +echo 'test/ill' > ill.sh +mkdir -p empty-dir +mkdir -p cage +echo 'chmod 000 test/cage' > cage/lock.sh +echo 'chmod 755 test/cage' > cage-unlock.sh +mkdir -p cage/lion +echo 'chmod 000 test/cage' > cage/lion/lock.sh +mkdir -p korean +touch 'korean/[ENG sub] PRODUCE48 울림ㅣ김채원ㅣ행복 나눠주는 천사소녀 @자기소개_1분 PR 180615 EP.0-Cgnmr6Fd82' +touch 'korean/[ENG sub] PRODUCE48 [48스페셜] 윙크요정, 내꺼야!ㅣ김채원(울림) 180615 EP.0-K7ulTiuJZK8.mp4' +touch 'korean/[FULL ENG SUB] 181008 SALEWA x IZ_ONE Long Padding Photoshoot Behind Film-[오늘의 시구] 아이즈원 (IZONE) 장원영&미야와키 사쿠라! 시구 시타! (10.06)-VmDl5eBJ3x0.mkv' +touch 'korean/IZ_ONE (아이즈원) - 1st Mini Album [COLOR_IZ] Highlight Medley-w9V2xFrYIgk.web' +touch 'korean/IZ_ONE (아이즈원) - 1st Mini Album [COLOR_IZ] MV TEASER 1-uhnJLBNBNto.mkv' +touch 'korean/IZ_ONE CHU [1회] ′순도 100%′ 우리즈원 숙소 생활 ★최초 공개★ 181025 EP.1-pcutrQN1Sbg.mkv' +touch 'korean/IZ_ONE CHU [1회_예고] 아이즈원 데뷔 준비 과정 ★독점 공개★ 아이즈원 츄 이번주 (목) 밤 11시 첫방송 181025' +touch 'korean/IZ_ONE CHU [1회] 도치기현 1호 이모 팬과의 만남! 181025 EP.1-5kYoReT5x44.mp4' +touch 'korean/IZ_ONE CHU [1회] ′12명 소녀들의 새로운 시작′ 앞으로 아이즈원 잘 부탁해♥ 181025 EP.1-RVNvgbdLQLQ' +touch 'korean/IZ_ONE CHU [1회] ′앗..그것만은!′ 자비없는 합숙생활 폭로전 181025 EP.1-AmP5KzpoI38.mkv' +touch 'korean/IZ_ONE CHU [1회] 휴게소 간식 내기 노래 맞히기 게임 181025 EP.1-LyNDKflpWYE.mp4' +touch 'korean/IZ_ONE CHU [1회] 2018 아이즈원 걸크러시능력시험 (feat. 치타쌤) 181025 EP.1-9qHWpbo0eB8.mp4' +touch 'korean/IZ_ONE CHU [1회] ′돼지요′ 아니죠, ′되지요′ 맞습니다! (feat. 꾸라먹방) 181025EP.1-WDLFqMWiKn' +touch 'korean/IZ_ONE CHU [1회] ′두근두근′ 첫 MT를 앞둔 비글력 만렙의 아이즈원 181025 EP.1' +mkdir -p unicode +touch 'unicode/Malgudi Days - मालगुडी डेज - E05. Swami and Friends - स्वामी और उसके दोस्त (Part 1)' +touch 'unicode/Malgudi Days - मालगुडी डेज - E05. Swami and Friends - स्वामी और उसके दोस्त (Part 2)' +touch 'unicode/Malgudi Days - मालगुडी डेज - E05. Swami and Friends - स्वामी और उसके दोस्त (Part 3)' +chmod +x 'unicode/Malgudi Days - मालगुडी डेज - E05. Swami and Friends - स्वामी और उसके दोस्त (Part 2)' +touch 'unicode/Führer' +touch 'unicode/Eso eso aamar ghare eso ♫ এসো এসো আমার ঘরে এসো ♫ Swagatalakshmi Dasgupta' +touch 'max_chars_filename_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' diff --git a/nnn-4.9/misc/test/plot-bench.py b/nnn-4.9/misc/test/plot-bench.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +# +# Usage: ./plot-bench.py datafile +# (where datafile is the output of benchmark.sh) + +import matplotlib.pyplot as plt +import sys + +def bench_file_to_lists(infile): + return [[float(entry) for entry in line.split('\t')[1:]] for line in infile.readlines()] + +def plot_data(data): + fig = plt.figure() + ax = fig.add_axes([0,0,1,1]) + ax.violinplot(data) + plt.savefig("plot.svg") + +filename = sys.argv[1] + +plot_data(bench_file_to_lists(open(filename))) diff --git a/nnn-4.9/nnn.1 b/nnn-4.9/nnn.1 @@ -0,0 +1,619 @@ +.Dd Aug 27, 2023 +.Dt NNN 1 +.Os +.Sh NAME +.Nm nnn +.Nd The unorthodox terminal file manager. +.Sh SYNOPSIS +.Nm +.Op Ar -aAcCdDeEfgHJKnQrRSuUVxh +.Op Ar -b key +.Op Ar -F val +.Op Ar -l val +.Op Ar -p file +.Op Ar -P key +.Op Ar -s name +.Op Ar -t secs +.Op Ar -T key +.Op Ar PATH +.Sh DESCRIPTION +.Nm +.Pq Nnn's Not Noice +is a performance-optimized, feature-packed fork of noice +.Em http://git.2f30.org/noice/ +with seamless desktop integration, simplified navigation, +.Em type-to-nav +mode with dir auto-enter, disk usage analyzer mode, bookmarks, +contexts, application launcher, familiar navigation shortcuts, +subshell spawning and much more. It remains a simple and +efficient file manager that stays out of your way. +.Pp +.Nm +opens the current working directory if +.Ar PATH +is not specified. If +.Ar PATH +is specified and it exists, +.Nm +will open it. If the +.Ar PATH +doesn't exist and ends with a \fB/\fR, +.Nm +will attempt to create the directory tree and open it. Otherwise, +.Ar PATH +is considered a path to a regular file and +.Nm +attempts to create the complete directory tree to the file, open +the parent directory and prompt to create the new file in it with +the base filename. +.Sh KEYBINDS +.Pp +Press +.Ql \&? +in +.Nm +to see the list of keybinds. +.Sh OPTIONS +.Pp +.Nm +supports the following options: +.Pp +.Fl a + auto-setup temporary \fBNNN_FIFO\fR (described in \fIENVIRONMENT\fR section) +.Pp +.Fl A + disable directory auto-enter on unique filter match +.Pp +.Fl "b key" + specify bookmark key to open +.Pp +.Fl B + use bsdtar for archives (default: atool) +.Pp +.Fl c + indicates that the opener is a cli-only opener (overrides -e) +.Pp +.Fl C + 8-color scheme - color directories by context, disable file colors +.Pp +.Fl d + detail mode +.Pp +.Fl D + show directories in context color with \fBNNN_FCOLORS\fR set +.Pp +.Fl e + open text files in $VISUAL (else $EDITOR, fallback vi) [preferably CLI] +.Pp +.Fl E + use $EDITOR for internal undetached edits +.Pp +.Fl f + use readline history file +.Pp +.Fl "F val" + fifo notification mode + 0: notify as previewer, 1: notify as explorer +.Pp +.Fl g + use regex filters instead of substring match +.Pp +.Fl H + show hidden files +.Pp +.Fl i + show current file information in info bar (may be slow) +.Pp +.Fl J + disable auto-advance on selection + (eg. selecting an entry will no longer move cursor to the next entry) +.Pp +.Fl K + test for keybind collision and exit +.Pp +.Fl "l val" + number of lines to move per mouse wheel scroll +.Pp +.Fl n + start in type-to-nav mode +.Pp +.Fl o + open files only on Enter key +.Pp +.Fl "p file" + copy (or \fIpick\fR) selection to file, or stdout if file='-' +.Pp +.Fl "P key" + specify plugin key to run +.Pp +.Fl Q + disable confirmation on quit with multiple contexts active +.Pp +.Fl r + show cp, mv progress + (Linux-only, needs \fIadvcpmv\fR; '^T' shows the progress on BSD/macOS) +.Pp +.Fl R + disable rollover at edges (eg. pressing \fIdown\fR while on the last + entry will no longer move cursor to the first entry and vice\-versa) +.Pp +.Fl "s name" + load a session by name +.Pp +.Fl S + persistent session +.Pp +.Fl "t secs" + idle timeout in seconds to lock terminal +.Pp +.Fl "T key" + sort order + keys: 'a'u / 'd'u / 'e'xtension / 'r'everse / 's'ize / 't'ime / 'v'ersion + capitalize to reverse (except 'r') +.Pp +.Fl u + use selection if available, don't prompt to choose between selection and hovered entry +.Pp +.Fl U + show user and group names in status bar +.Pp +.Fl V + show version and exit +.Pp +.Fl x + show notifications on selection cp, mv, rm completion (requires \fI.ntfy\fR plugin) + copy path to system clipboard on selection (requires \fI.cbcp\fR plugin) + show xterm title (if non-picker mode) +.Pp +.Fl h + show program help and exit +.Sh CONFIGURATION +There is no configuration file. Associated files are at +.Pp +.Pa ${XDG_CONFIG_HOME:-$HOME/.config}/nnn/ +.Pp +Configuration is done using a few optional (set if you need) environment +variables. See ENVIRONMENT section. +.Pp +.Nm +uses \fIxdg-open\fR (on Linux), \fIopen(1)\fR (on macOS), \fIcygstart\fR on +(Cygwin) and \fIopen\fR on (Haiku) as the desktop opener. It's also possible +to specify a custom opener. See ENVIRONMENT section. +.Sh CONTEXTS +Open multiple locations with 4 contexts. The status is shown in the top left +corner: +.Pp +- the current context is in reverse video +.br +- other active contexts are underlined +.br +- rest are inactive +.Pp +A new context copies the state of the previous context. Each context can have +its own color. See ENVIRONMENT section. +.Sh SESSIONS +Sessions are a way to save and restore states of work. A session stores the +settings and contexts. Sessions can be loaded at runtime or with a program +option. +.Pp +- When a session is loaded at runtime, the last working state is saved +automatically to a dedicated "auto session" session file. Session option +\fIrestore\fR would restore the "auto session". +.br +- The persistent session option is global. If it is used, the last active session +will be updated with the final state at program quit. +.br +- The "auto session" is used in persistent session mode if no session is active. +.br +- Listing input stream and opening a bookmark by key have a higher priority to +session options (-s/-S). +.Pp +All the session files are located by session name in the directory +.Pp +\fB${XDG_CONFIG_HOME:-$HOME/.config}/nnn/sessions\fR +.Pp +"@" is the "auto session" file. +.Sh FILTERS +Filters are strings (or regex patterns) to find matching entries in the current +directory instantly (\fIsearch-as-you-type\fR). Matches are case-insensitive by +default. The last filter in each context is persisted at runtime or in saved +sessions. +.br +When there's a unique match and it's a directory, +.Nm +auto enters the directory. Use the relevant program option to disable this. +.Pp +Special keys at filter prompt: +.Bd -literal +-------- + --------------------------------------- + Key | Function +-------- + --------------------------------------- + ^char | Usual keybind functionality + Esc | Exit filter prompt but skip dir refresh + Alt+Esc | Unfilter, quit context +-------- + --------------------------------------- +.Ed +.Pp +Special keys at \fBempty filter prompt\fR: +.Bd -literal +------ + --------------------------------------- + Key | Function +------ + --------------------------------------- + ? | Show help and config screen + / | Toggle between string and regex + : | Toggle case-sensitivity + ^L | Clear filter (\fIif prompt is non-empty\fR) + | OR apply last filter + Bksp | Stay at filter prompt and refresh dir + Del | Stay at filter prompt and refresh dir +------ + --------------------------------------- +.Ed +.Pp +Common regex use cases: +.Pp +(1) To list all matches starting with the filter expression, + start the expression with a '^' (caret) symbol. +.br +(2) Type '\\.mkv' to list all MKV files. +.br +(3) Use '.*' to match any character (\fIsort of\fR fuzzy search). +.br +(4) Exclude filenames having 'nnn' (compiled with PCRE lib): '^(?!nnn)' +.Pp +In the \fBtype-to-nav\fR mode directories are opened in filter +mode, allowing continuous navigation. +.Pp +Additional special keys at \fBempty filter prompt\fR +in \fBtype-to-nav\fR mode: +.Bd -literal +------ + ------------------------ + Key | Function +------ + ------------------------ + ' | Go to first non-dir file + + | Toggle file selection + , | Mark CWD + - | Go to last visited dir + . | Show hidden files + ; | Run a plugin by its key + = | Launch a GUI application + > | Export file list + @ | Visit start dir + ] | Show command prompt + ` | Visit / + ~ | Go HOME +------ + ------------------------ +.Ed +.Sh SELECTION +.Nm +allows file selection across directories and contexts! +.Pp +There are 3 groups of keybinds to add files to selection: +.Pp +(1) hovered file selection toggle + - deselects if '+' is visible before the entry, else adds to selection +.br +(2) add a range of files to selection + - repeat the range key on the same entry twice to clear selection completely +.br +(3) add all files in the current directory to selection +.Pp +A selection can be edited, copied, moved, removed, archived or linked. +.Pp +Absolute paths of the selected files are copied to \fB.selection\fR file in +the config directory. The selection file is shared between multiple program +instances. Selection from multiple instances are not merged. The last instance +writing to the file overwrites earlier contents. If you have 2 instances of +.Nm +\fIopen\fR in 2 panes of a terminal multiplexer, you can select in one pane and +use the selection in the other pane. The selection gets cleared in the +.Nm +instance where the selection was made on mv/rm (but not on cp). +.Pp +.Nm +clears the selection after a successful operation with the selection. Plugins +are allowed to define the behaviour individually. +.Pp +To edit the selection use the _edit selection_ key. Editing doesn't end the +selection mode. You can add more files to the selection and edit the list +again. If no file is selected in the current session, this option attempts +to list the selection file. +.Pp +.Nm +can show the total size of non-filtered selected files listed in a +directory. For directories, only the size of the directory is added by +default. To add the size of the contents of a directory, switch to du mode. +.Sh FIND AND LIST +There are two ways to search and list: +.Pp +- feed a list of file paths as input +.br +- search using a plugin (e.g. \fIfinder\fR) and list the results +.Pp +File paths must be NUL-separated ('\\0'). Paths and can be relative to the +current directory or absolute. Invalid paths in the input are ignored. Input +processing limit is 16,384 paths or 64 MiB (max_paths x max_path_len) of data. +.Pp +To list the input stream, start +.Nm +by writing to its standard input. E.g., to list files in current +directory larger than +1M: +.Bd -literal + find -maxdepth 1 -size +1M -print0 | nnn +.Ed +.Pp +or redirect a list from a file: +.Bd -literal + nnn < files.txt +.Ed +.Pp +Handy bash/zsh shell function to list files by mime-type in current directory: +.Bd -literal + # to show video files, run: list video + + list () + { + find . -maxdepth 1 | file -if- | grep "$1" | awk -F: '{printf "%s\0", $1}' | nnn + } +.Ed +.Pp +A temporary directory will be created containing symlinks to the given +paths. Any action performed on these symlinks will be performed only on their +targets, after which they might become invalid. +.Pp +Right arrow or 'l' on a symlink in the listing dir takes to the target +file. Press '-' to return to the listing dir. Press 'Enter' to open the symlink. +.Pp +Listing input stream can be scripted. It can be extended to pick (option -p) +selected entries from the listed results. +.Sh BOOKMARKS +There are 2 ways (can be used together) to manage bookmarks. +.Pp +(1) Bookmark keys: See \fBNNN_BMS\fR under \fIENVIORNMENT\fR section on how to set + bookmark keys. + + The select bookmark key \fIb\fR lists all the bookmark keys set in \fBNNN_BMS\fR + in the bookmarks prompt. +.Pp +(2) Symlinked bookmarks: A symlinked bookmark to the current directory can + be created with the \fIB\fR key (or manually under ~/.config/nnn/bookmarks). + + Pressing 'Enter' at the bookmarks prompt takes to this directory. + If \fBNNN_BMS\fR is not set, the select bookmark key directly opens it. +.Pp +On entering a bookmark, the directory where the select bookmark key was +pressed is set as the previous directory. Press '-' to return to it. +.Pp +.Sh UNITS +The minimum file size unit is byte (B). The rest are K, M, G, T, P, E, Z, Y +(powers of 1024), same as the default units in \fIls\fR. +.Sh ENVIRONMENT +The SHELL, VISUAL (else EDITOR) and PAGER environment variables are +used. A single combination of arguments is supported for SHELL and PAGER. +.Pp +\fBNNN_OPTS:\fR binary options to +.Nm +.Bd -literal + export NNN_OPTS="cEnrx" +.Ed +.Pp +\fBNNN_OPENER:\fR specify a custom file opener. +.Bd -literal + export NNN_OPENER=nuke + + NOTE: 'nuke' is a file opener available in the plugin repository. +.Ed +.Pp +\fBNNN_BMS:\fR bookmark string as \fIkey_char:location\fR pairs +separated by \fI;\fR: +.Bd -literal + export NNN_BMS="d:$HOME/Docs;u:/home/user/Cam Uploads;D:$HOME/Downloads/" +.Ed +.Pp +These bookmarks are listed in the help and config screen (key ?). +.Pp +\fBNNN_PLUG:\fR directly executable plugins as \fIkey_char:plugin\fR pairs +separated by \fI;\fR: +.Bd -literal + export NNN_PLUG='f:finder;o:fzopen;p:mocplay;d:diffs;t:nmount;v:imgview' + + NOTES: + 1. To run a plugin directly, press \fI;\fR followed by the key. + 2. Alternatively, combine with \fIAlt\fR (i.e. \fIAlt+key\fR). + 3. To skip directory refresh after running a plugin, prefix with \fB-\fR. + + export NNN_PLUG='p:-plugin' +.Ed +.Pp + To assign keys to arbitrary non-background cli commands and invoke like + plugins, add \fB!\fR before the command. +.Bd -literal + export NNN_PLUG='x:!chmod +x "$nnn";g:!git log;s:!smplayer "$nnn"' + + To pick and run an unassigned plugin, press \fBEnter\fR at the plugin prompt. + To run a plugin at startup, use the option `-P` followed by the plugin key. + + NOTES: + 1. Place $nnn (or exported variables) in double quotes (\fB"$nnn"\fR) + 2. Use single quotes for $NNN_PLUG so "$nnn" is not interpreted + 3. (Again) add \fB!\fR before the command + 4. To disable directory refresh after running a \fIcommand as plugin\fR, + prefix with \fB-!\fR + 5. To skip user confirmation after command execution, suffix with \fB*\fR + Note: Do not use \fB*\fR with programs those run and exit e.g. cat + + export NNN_PLUG='y:-!sync*' + + 6. To run a \fIGUI app as plugin\fR, add a \fB&\fR after \fB!\fR. + + export NNN_PLUG='m:-!&mousepad "$nnn"' + + 7. To show the output of run-and-exit commands which do not need user input, + add \fB|\fR (pipe) after \fB!\fR + Note: This option is incompatible with \fB&\fR (terminal output is masked + for GUI programs) and ignores \fB*\fR (output is already paged for user). + + export NNN_PLUG='m:-!|mediainfo "$nnn";t:-!|tree -ps;l:-!|ls -lah --group-directories-first' + + EXAMPLES: + ------------------------------------ + ------------------------------------------------- + Key:Command | Description + ------------------------------------ + ------------------------------------------------- + c:!convert "$nnn" png:- | xclip | Copy image to clipboard + -sel clipboard -t image/png* | + C:!cp -rv "$nnn" "$nnn".cp* | Create a copy of the hovered file + e:-!sudo -E vim "$nnn"* | Edit file as root in vim + g:-!git diff | Show git diff + h:-!hx "$nnn"* | Open hovered file in hx hex editor + k:-!fuser -kiv "$nnn"* | Interactively kill process(es) using hovered file + l:-!git log | Show git log + n:-!vi /home/user/Dropbox/dir/note* | Take quick notes in a synced file/dir of notes + p:-!less -iR "$nnn"* | Page through hovered file in less + s:-!&smplayer -minigui "$nnn" | Play hovered media file, even unfinished download + x:!chmod +x "$nnn" | Make the hovered file executable + y:-!sync* | Flush cached writes + ------------------------------------ + ------------------------------------------------- + + Online docs: https://github.com/jarun/nnn/tree/master/plugins +.Ed +.Pp +\fBNNN_ORDER:\fR directory-specific sort key. +.Bd -literal + export NNN_ORDER='t:/home/user/Downloads;S:/tmp' + + NOTE: Sort keys can be a/d/e/r/s/t/v (see program option -T). + Capitalize to reverse (except 'r'). + Path must be absolute. + + Timestamps for entries modified/created within 5 minutes are shown in reverse. +.Ed +.Pp +\fBNNN_COLORS:\fR string of color numbers for each context, e.g.: +.Bd -literal + # 8 color numbers: + # 0-black, 1-red, 2-green, 3-yellow, 4-blue (default), 5-magenta, 6-cyan, 7-white + export NNN_COLORS='1234' + + # xterm 256 color numbers (converted to hex, 2 symbols per context): + # see https://user-images.githubusercontent.com/1482942/93023823-46a6ba80-f5e1-11ea-9ea3-6a3c757704f4.png + export NNN_COLORS='#0a1b2c3d' + + # both (256 followed by 8 as fallback, separated by ';') + export NNN_COLORS='#0a1b2c3d;1234' + + NOTE: If only 256 colors are specified and the terminal doesn't support, default is used. +.Ed +.Pp +\fBNNN_FCOLORS:\fR specify file-type specific colors: +.Bd -literal + export NNN_FCOLORS='c1e2272e006033f7c6d6abc4' + + Specify file-specific colors in xterm 256 color hex numbers (2 symbols per color). + Order is strict, use 00 to omit/use default terminal color. Defaults: + + ------------------------- + --- + ------------- + Order | Hex | Color + ------------------------- + --- + ------------- + Block device | c1 | DarkSeaGreen1 + Char device | e2 | Yellow1 + Directory | 27 | DeepSkyBlue1 + Executable | 2e | Green1 + Regular | 00 | Normal + Hard link | 60 | Plum4 + Symbolic link | 33 | Cyan1 + Missing OR file details | f7 | Grey62 + Orphaned symbolic link | c6 | DeepPink1 + FIFO | d6 | Orange1 + Socket | ab | MediumOrchid1 + Unknown OR 0B regular/exe | c4 | Red1 + ------------------------- + --- + ------------- + + If the terminal supports xterm 256 colors or more, file-specific colors will be rendered. + To force the 8-color scheme use option -C. + If xterm 256 colors aren't supported, 8-color scheme will be used. +.Ed +.Pp +\fBNNN_ARCHIVE:\fR archive extensions to be handled silently (default: bzip2, (g)zip, tar). +.Bd -literal + export NNN_ARCHIVE="\\\\.(7z|bz2|gz|tar|tgz|zip)$" + + NOTE: Non-default formats may require a third-party utility. +.Ed +.Pp +\fBNNN_ARCHMNT:\fR optional archive mounter utility (default: archivemount). +.Bd -literal + export NNN_ARCHIVE='fuse-archive' +.Ed +.Pp +\fBNNN_SSHFS:\fR specify custom sshfs command with options: +.Bd -literal + export NNN_SSHFS='sshfs -o reconnect,idmap=user,cache_timeout=3600' + + NOTE: The options must be comma-separated without any space between them. +.Ed +.Pp +\fBNNN_RCLONE:\fR pass additional options to rclone command: +.Bd -literal + export NNN_RCLONE='rclone mount --read-only --no-checksum' + + NOTE: The options must be preceded by "rclone" and max 5 flags are supported. +.Ed +.Pp +\fBNNN_TRASH:\fR trash (instead of \fIrm -rf\fR) files to desktop Trash. +.Bd -literal + export NNN_TRASH=n + # n=1: trash-cli, n=2: gio trash +.Ed +.Pp +\fBNNN_SEL:\fR absolute path to custom selection file. +.Bd -literal + export NNN_SEL='/tmp/.sel' +.Ed +.Pp +\fBNNN_FIFO:\fR path of a named pipe to write the hovered file path: +.Bd -literal + export NNN_FIFO='/tmp/nnn.fifo' + + NOTES: + 1. Overridden by a temporary path with -a option. + 2. If the FIFO file doesn't exist it will be created, + but not removed (unless it is generated by -a option). + + Online docs: https://github.com/jarun/nnn/wiki/Live-previews +.Ed +.Pp +\fBNNN_LOCKER:\fR terminal locker program. +.Bd -literal + export NNN_LOCKER='bmon -p wlp1s0' + export NNN_LOCKER='cmatrix' +.Ed +.Pp +\fBNNN_TMPFILE:\fR \fIalways\fR cd on quit and write the command in the file specified. +.Bd -literal + export NNN_TMPFILE='/tmp/.lastd' +.Ed +.Pp +\fBNNN_HELP:\fR run a program and show the output on top of the program help page. +.Bd -literal + export NNN_HELP='fortune' +.Ed +.Pp +\fBNNN_MCLICK:\fR key emulated by a middle mouse click. +.Bd -literal + export NNN_MCLICK='^R' + + NOTE: Only the first character is considered if not a \fICtrl+key\fR combo. +.Ed +.Pp +\fBnnn:\fR this is a special variable. +.Bd -literal + Set to the hovered file name before starting the command prompt or spawning a shell. +.Ed +.Pp +\fBNO_COLOR:\fR disable ANSI color output (overridden by \fBNNN_COLORS\fR). +.Sh AUTHORS +.An Arun Prakash Jana Aq Mt engineerarun@gmail.com , +.An Lazaros Koromilas Aq Mt lostd@2f30.org , +.An Dimitris Papastamos Aq Mt sin@2f30.org . +.Sh HOME +.Em https://github.com/jarun/nnn diff --git a/nnn-4.9/notas.txt b/nnn-4.9/notas.txt @@ -0,0 +1,3 @@ +1 - ./install.sh no directorio de iconos +2 - editar o makefile O_NERD = 1 +3 - sudo make strip install diff --git a/nnn-4.9/patches/README.md b/nnn-4.9/patches/README.md @@ -0,0 +1,30 @@ +<h1 align="center">User Patch Framework</h1> + +This directory contains sizable user submitted patches that were rejected from mainline as they tend to be more subjective in nature. + +The patches will be adapted on each release when necessary (v4.1 onwards). Each patch can be applied through its respective make variable during compilation. In case inter-patch merge conflicts occur, a compatibility patch is provided and will automatically be applied. + +## List of patches + +| Patch (a-z) | Description | Make var | +| --- | --- | --- | +| colemak | Key bindings for Colemak-DH keyboard layout | `O_COLEMAK` | +| gitstatus | Add git status column to the detail view. Provides command line flag `-G` to show column in normal mode. | `O_GITSTATUS` | +| namefirst | Print filenames first in the detail view. Print user/group columns when a directory contains different users/groups. | `O_NAMEFIRST` | +| restorepreview | Add pipe to close and restore [`preview-tui`](https://github.com/jarun/nnn/blob/master/plugins/preview-tui) for internal undetached edits (<kbd>e</kbd> key)| `O_RESTOREPREVIEW` | + +To apply a patch, use the corresponding make variable, e.g.: + + make O_NAMEFIRST=1 + +When contributing/adding a new patch, make sure to add the make variable to the patches array in `./misc/test/check-patches.sh` as well so that patch failures can be easily tested. + +## Resolving patch conflicts + +Patch conflicts can be checked locally by running `make checkpatches` or by running `./patches/check-patches.sh` manually. + +Whenever patch conflicts occur on the latest master, pull requests resolving them are welcome. Let's say a conflict occurs in the `restorepreview` patch. The best way to resolve this conflict would be something along the lines of: + +- Ensure you're on latest master and run `PATCH_OPTS="--merge" make O_RESTOREPREVIEW=1`. This will generate the conflict markers in `src/nnn.c`. +- Next edit `src/nnn.c`, resolve the conflicts around the conflict markers(`<<<<<<<`), and save. +- Then run `git diff > patch.diff && sed -i -e "/^$/{r patch.diff" -e "q;}" patches/restorepreview/mainline.diff` to update the patch. diff --git a/nnn-4.9/patches/check-patches.sh b/nnn-4.9/patches/check-patches.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# +# Usage: ./misc/test/check-patches.sh +# +# Bash script that checks for any of the patches failing to apply. +# Read patches/README.md for more information. + +export PATCH_OPTS="--merge" +patches=("O_COLEMAK" "O_GITSTATUS" "O_NAMEFIRST" "O_RESTOREPREVIEW") +z=$(( 1 << ${#patches[@]} )) +pid=$$ +ret=0 +trap 'ret=1' SIGUSR1 + +for ((n=1; n < z; ++n)); do + for ((i=0; i < ${#patches[@]}; ++i)); do + printf "%s=%d " "${patches[$i]}" "$(( (n & (1 << i)) != 0 ))" + done | tee "/dev/stderr" | ( + make clean -s + if ! xargs make 2>&1; then + echo "[FAILED]" >&2 + kill -SIGUSR1 "$pid" + else + echo "[SUCCESS]" >&2 + fi + git restore src + ) >/dev/null +done +exit "$ret" diff --git a/nnn-4.9/patches/colemak-dh/mainline.diff b/nnn-4.9/patches/colemak-dh/mainline.diff @@ -0,0 +1,173 @@ +# Description: Change key bindings for comfortable use with Colemak-DH keyboard +# layout. This diff was made in 4.5 release version of nnn. +# +# Author: github.com/anjerukare + +diff --git a/src/nnn.c b/src/nnn.c +index ecedee43..9d779f90 100644 +--- a/src/nnn.c ++++ b/src/nnn.c +@@ -5098,40 +5098,40 @@ static void show_help(const char *path) + "2(___n))\n" + "0\n" + "1NAVIGATION\n" +- "9Up k Up%16PgUp ^U Page up\n" +- "9Dn j Down%14PgDn ^D Page down\n" +- "9Lt h Parent%12~ ` @ - ~, /, start, prev\n" +- "5Ret Rt l Open%20' First file/match\n" +- "9g ^A Top%21J Jump to entry/offset\n" +- "9G ^E End%20^J Toggle auto-advance on open\n" ++ "9Up e Up%16PgUp ^U Page up\n" ++ "9Dn n Down%14PgDn ^D Page down\n" ++ "9Lt m Parent%12~ ` @ - ~, /, start, prev\n" ++ "5Ret Rt i Open%20' First file/match\n" ++ "9g ^E Top%21J Jump to entry/offset\n" ++ "9G ^N End%20^J Toggle auto-advance on open\n" + "8B (,) Book(mark)%11b ^/ Select bookmark\n" + "a1-4 Context%11(Sh)Tab Cycle/new context\n" + "62Esc ^Q Quit%20q Quit context\n" + "b^G QuitCD%18Q Pick/err, quit\n" + "0\n" + "1FILTER & PROMPT\n" +- "c/ Filter%17^N Toggle type-to-nav\n" ++ "c/ Filter%17^F Toggle type-to-nav\n" + "aEsc Exit prompt%12^L Toggle last filter\n" + "c. Toggle hidden%05Alt+Esc Unfilter, quit context\n" + "0\n" + "1FILES\n" +- "9o ^O Open with%15n Create new/link\n" +- "9f ^F File stats%14d Detail mode toggle\n" ++ "9o ^O Open with%15c Create new/link\n" ++ "cf File stats%14d Detail mode toggle\n" + "b^R Rename/dup%14r Batch rename\n" +- "cz Archive%17e Edit file\n" ++ "cz Archive%17y Edit file\n" + "c* Toggle exe%14> Export list\n" +- "6Space + (Un)select%12m-m Select range/clear\n" ++ "6Space + (Un)select%12s-s Select range/clear\n" + "ca Select all%14A Invert sel\n" + "9p ^P Copy here%12w ^W Cp/mv sel as\n" +- "9v ^V Move here%15E Edit sel list\n" ++ "9v ^V Move here%15l Edit sel list\n" + "9x ^X Delete%18S Listed sel size\n" + "aEsc Send to FIFO\n" + "0\n" + "1MISC\n" + "8Alt ; Select plugin%11= Launch app\n" + "9! ^] Shell%19] Cmd prompt\n" +- "cc Connect remote%10u Unmount remote/archive\n" +- "9t ^T Sort toggles%12s Manage session\n" ++ "ch Connect remote%10u Unmount remote/archive\n" ++ "9t ^T Sort toggles%12k Manage session\n" + "cT Set time type%110 Lock\n" + "b^L Redraw%18? Help, conf\n" + }; +diff --git a/src/nnn.h b/src/nnn.h +index 3e4ea19c..c81ef392 100644 +--- a/src/nnn.h ++++ b/src/nnn.h +@@ -131,18 +131,18 @@ struct key { + static struct key bindings[] = { + /* Back */ + { KEY_LEFT, SEL_BACK }, +- { 'h', SEL_BACK }, ++ { 'm', SEL_BACK }, + /* Inside or select */ + { KEY_ENTER, SEL_OPEN }, + { '\r', SEL_OPEN }, + /* Pure navigate inside */ + { KEY_RIGHT, SEL_NAV_IN }, +- { 'l', SEL_NAV_IN }, ++ { 'i', SEL_NAV_IN }, + /* Next */ +- { 'j', SEL_NEXT }, ++ { 'n', SEL_NEXT }, + { KEY_DOWN, SEL_NEXT }, + /* Previous */ +- { 'k', SEL_PREV }, ++ { 'e', SEL_PREV }, + { KEY_UP, SEL_PREV }, + /* Page down */ + { KEY_NPAGE, SEL_PGDN }, +@@ -155,11 +155,11 @@ static struct key bindings[] = { + /* First entry */ + { KEY_HOME, SEL_HOME }, + { 'g', SEL_HOME }, +- { CONTROL('A'), SEL_HOME }, ++ { CONTROL('E'), SEL_HOME }, + /* Last entry */ + { KEY_END, SEL_END }, + { 'G', SEL_END }, +- { CONTROL('E'), SEL_END }, ++ { CONTROL('N'), SEL_END }, + /* Go to first file */ + { '\'', SEL_FIRST }, + /* Jump to an entry number/offset */ +@@ -176,7 +176,7 @@ static struct key bindings[] = { + { 'b', SEL_BMOPEN }, + { CONTROL('_'), SEL_BMOPEN }, + /* Connect to server over SSHFS */ +- { 'c', SEL_REMOTE }, ++ { 'h', SEL_REMOTE }, + /* Cycle contexts in forward direction */ + { '\t', SEL_CYCLE }, + /* Cycle contexts in reverse direction */ +@@ -199,14 +199,13 @@ static struct key bindings[] = { + /* Filter */ + { '/', SEL_FLTR }, + /* Toggle filter mode */ +- { CONTROL('N'), SEL_MFLTR }, ++ { CONTROL('F'), SEL_MFLTR }, + /* Toggle hide .dot files */ + { '.', SEL_HIDDEN }, + /* Detailed listing */ + { 'd', SEL_DETAIL }, + /* File details */ + { 'f', SEL_STATS }, +- { CONTROL('F'), SEL_STATS }, + /* Toggle executable status */ + { '*', SEL_CHMODX }, + /* Create archive */ +@@ -220,13 +219,13 @@ static struct key bindings[] = { + { ' ', SEL_SEL }, + { '+', SEL_SEL }, + /* Toggle select multiple files */ +- { 'm', SEL_SELMUL }, ++ { 's', SEL_SELMUL }, + /* Select all files in current dir */ + { 'a', SEL_SELALL }, + /* Invert selection in current dir */ + { 'A', SEL_SELINV }, + /* List, edit selection */ +- { 'E', SEL_SELEDIT }, ++ { 'l', SEL_SELEDIT }, + /* Copy from selection buffer */ + { 'p', SEL_CP }, + { CONTROL('P'), SEL_CP }, +@@ -243,7 +242,7 @@ static struct key bindings[] = { + { 'o', SEL_OPENWITH }, + { CONTROL('O'), SEL_OPENWITH }, + /* Create a new file */ +- { 'n', SEL_NEW }, ++ { 'c', SEL_NEW }, + /* Show rename prompt */ + { CONTROL('R'), SEL_RENAME }, + /* Rename contents of current dir */ +@@ -255,7 +254,7 @@ static struct key bindings[] = { + /* Toggle auto-advance on file open */ + { CONTROL('J'), SEL_AUTONEXT }, + /* Edit in EDITOR */ +- { 'e', SEL_EDIT }, ++ { 'y', SEL_EDIT }, + /* Run a plugin */ + { ';', SEL_PLUGIN }, + /* Show total size of listed selection */ +@@ -270,7 +269,7 @@ static struct key bindings[] = { + /* Lock screen */ + { '0', SEL_LOCK }, + /* Manage sessions */ +- { 's', SEL_SESSIONS }, ++ { 'k', SEL_SESSIONS }, + /* Export list */ + { '>', SEL_EXPORT }, + /* Set time type */ diff --git a/nnn-4.9/patches/colemak/mainline.diff b/nnn-4.9/patches/colemak/mainline.diff @@ -0,0 +1,120 @@ +# Description: Change key bindings for comfortable use with Colemak keyboard +# layout. This diff was made in 4.7 release version of nnn. +# +# Author: github.com/jacmoe +diff --git a/src/nnn.c b/src/nnn.c +index ecedee43..fdf5a80e 100644 +--- a/src/nnn.c ++++ b/src/nnn.c +@@ -5098,32 +5098,32 @@ static void show_help(const char *path) + "2(___n))\n" + "0\n" + "1NAVIGATION\n" +- "9Up k Up%16PgUp ^U Page up\n" +- "9Dn j Down%14PgDn ^D Page down\n" ++ "9Up e Up%16PgUp ^U Page up\n" ++ "9Dn n Down%14PgDn ^D Page down\n" + "9Lt h Parent%12~ ` @ - ~, /, start, prev\n" +- "5Ret Rt l Open%20' First file/match\n" +- "9g ^A Top%21J Jump to entry/offset\n" +- "9G ^E End%20^J Toggle auto-advance on open\n" ++ "5Ret Rt i Open%20' First file/match\n" ++ "9g ^E Top%21J Jump to entry/offset\n" ++ "9G ^N End%20^J Toggle auto-advance on open\n" + "8B (,) Book(mark)%11b ^/ Select bookmark\n" + "a1-4 Context%11(Sh)Tab Cycle/new context\n" + "62Esc ^Q Quit%20q Quit context\n" + "b^G QuitCD%18Q Pick/err, quit\n" + "0\n" + "1FILTER & PROMPT\n" +- "c/ Filter%17^N Toggle type-to-nav\n" ++ "c/ Filter%17^M Toggle type-to-nav\n" + "aEsc Exit prompt%12^L Toggle last filter\n" + "c. Toggle hidden%05Alt+Esc Unfilter, quit context\n" + "0\n" + "1FILES\n" +- "9o ^O Open with%15n Create new/link\n" ++ "9o ^O Open with%15c Create new/link\n" + "9f ^F File stats%14d Detail mode toggle\n" + "b^R Rename/dup%14r Batch rename\n" +- "cz Archive%17e Edit file\n" ++ "cz Archive%17y Edit file\n" + "c* Toggle exe%14> Export list\n" + "6Space + (Un)select%12m-m Select range/clear\n" + "ca Select all%14A Invert sel\n" + "9p ^P Copy here%12w ^W Cp/mv sel as\n" +- "9v ^V Move here%15E Edit sel list\n" ++ "9v ^V Move here%15l Edit sel list\n" + "9x ^X Delete%18S Listed sel size\n" + "aEsc Send to FIFO\n" + "0\n" +diff --git a/src/nnn.h b/src/nnn.h +index 3e4ea19c..b0eb7cdb 100644 +--- a/src/nnn.h ++++ b/src/nnn.h +@@ -137,12 +137,12 @@ static struct key bindings[] = { + { '\r', SEL_OPEN }, + /* Pure navigate inside */ + { KEY_RIGHT, SEL_NAV_IN }, +- { 'l', SEL_NAV_IN }, ++ { 'i', SEL_NAV_IN }, + /* Next */ +- { 'j', SEL_NEXT }, ++ { 'n', SEL_NEXT }, + { KEY_DOWN, SEL_NEXT }, + /* Previous */ +- { 'k', SEL_PREV }, ++ { 'e', SEL_PREV }, + { KEY_UP, SEL_PREV }, + /* Page down */ + { KEY_NPAGE, SEL_PGDN }, +@@ -155,11 +155,11 @@ static struct key bindings[] = { + /* First entry */ + { KEY_HOME, SEL_HOME }, + { 'g', SEL_HOME }, +- { CONTROL('A'), SEL_HOME }, ++ { CONTROL('E'), SEL_HOME }, + /* Last entry */ + { KEY_END, SEL_END }, + { 'G', SEL_END }, +- { CONTROL('E'), SEL_END }, ++ { CONTROL('N'), SEL_END }, + /* Go to first file */ + { '\'', SEL_FIRST }, + /* Jump to an entry number/offset */ +@@ -199,7 +199,7 @@ static struct key bindings[] = { + /* Filter */ + { '/', SEL_FLTR }, + /* Toggle filter mode */ +- { CONTROL('N'), SEL_MFLTR }, ++ { CONTROL('M'), SEL_MFLTR }, + /* Toggle hide .dot files */ + { '.', SEL_HIDDEN }, + /* Detailed listing */ +@@ -226,7 +226,7 @@ static struct key bindings[] = { + /* Invert selection in current dir */ + { 'A', SEL_SELINV }, + /* List, edit selection */ +- { 'E', SEL_SELEDIT }, ++ { 'l', SEL_SELEDIT }, + /* Copy from selection buffer */ + { 'p', SEL_CP }, + { CONTROL('P'), SEL_CP }, +@@ -243,7 +243,7 @@ static struct key bindings[] = { + { 'o', SEL_OPENWITH }, + { CONTROL('O'), SEL_OPENWITH }, + /* Create a new file */ +- { 'n', SEL_NEW }, ++ { 'c', SEL_NEW }, + /* Show rename prompt */ + { CONTROL('R'), SEL_RENAME }, + /* Rename contents of current dir */ +@@ -255,7 +255,7 @@ static struct key bindings[] = { + /* Toggle auto-advance on file open */ + { CONTROL('J'), SEL_AUTONEXT }, + /* Edit in EDITOR */ +- { 'e', SEL_EDIT }, ++ { 'y', SEL_EDIT }, + /* Run a plugin */ + { ';', SEL_PLUGIN }, + /* Show total size of listed selection */ diff --git a/nnn-4.9/patches/gitstatus/mainline.diff b/nnn-4.9/patches/gitstatus/mainline.diff @@ -0,0 +1,223 @@ +# Description: Add git status column to detail mode. Provides additional +# command line flag -G which will render the git status +# column also in normal mode. Vim plugin users may consider +# adding the -G flag to their command override. +# +# Authors: Luuk van Baal + +diff --git a/src/nnn.c b/src/nnn.c +index 83ecdb90..4397944a 100644 +--- a/src/nnn.c ++++ b/src/nnn.c +@@ -270,6 +270,25 @@ + #define VFS_USED 1 + #define VFS_SIZE 2 + ++/* Git icons */ ++#ifdef NERD ++#define GIT_ADD "" ++#define GIT_DEL "" ++#define GIT_IGN "" ++#define GIT_MOD "" ++#define GIT_NEW "" ++#define GIT_NON "-" ++#define GIT_UPD "󰚰" ++#else ++#define GIT_ADD "A" ++#define GIT_DEL "D" ++#define GIT_IGN "!" ++#define GIT_MOD "M" ++#define GIT_NEW "?" ++#define GIT_NON "-" ++#define GIT_UPD "U" ++#endif ++ + /* TYPE DEFINITIONS */ + typedef unsigned int uint_t; + typedef unsigned char uchar_t; +@@ -294,6 +313,7 @@ typedef struct entry { + uid_t uid; /* 4 bytes */ + gid_t gid; /* 4 bytes */ + #endif ++ char git_status[2][5]; + } *pEntry; + + /* Selection marker */ +@@ -349,6 +369,7 @@ typedef struct { + uint_t cliopener : 1; /* All-CLI app opener */ + uint_t waitedit : 1; /* For ops that can't be detached, used EDITOR */ + uint_t rollover : 1; /* Roll over at edges */ ++ uint_t normalgit : 1; /* Show git status in normal mode */ + } settings; + + /* Non-persistent program-internal states (alphabeical order) */ +@@ -400,7 +421,17 @@ typedef struct { + } session_header_t; + #endif + ++typedef struct { ++ char status[2]; ++ char path[PATH_MAX]; ++} git_status_t; ++ + /* GLOBALS */ ++struct { ++ bool show; ++ size_t len; ++ git_status_t *statuses; ++} git_statuses; + + /* Configuration, contexts */ + static settings cfg = { +@@ -3796,6 +3827,47 @@ static int get_kv_key(kv *kvarr, char *val, uchar_t max, uchar_t id) + return -1; + } + ++static size_t get_git_statuses(const char *path) ++{ ++ static char gst[] = "git -c core.quotePath= status -s --no-renames --ignored=matching -unormal . 2>/dev/null"; ++ FILE *fp = popen(gst, "r"); ++ char status[PATH_MAX]; ++ size_t pathindex, i = -1; ++ git_statuses.show = FALSE; ++ ++ while (fgets(status, PATH_MAX, fp)) { ++ pathindex = (status[3] == '"') ? 4 : 3; ++ if (!cfg.showhidden && status[pathindex] == '.') ++ continue; ++ status[xstrlen(status) - pathindex + 2] = '\0'; ++ git_statuses.statuses = xrealloc(git_statuses.statuses, sizeof(git_status_t) * (++i + 1)); ++ git_statuses.statuses[i].status[0] = status[0]; ++ git_statuses.statuses[i].status[1] = status[1]; ++ mkpath(path, status + pathindex, git_statuses.statuses[i].path); ++ } ++ ++ pclose(fp); ++ return (i + 1); ++} ++ ++static void set_git_status(char status[][5], uint_t nr) ++{ ++ for (int j = 0; j < 2; j++) { ++ if (status[j][0] == '-') ++ switch (git_statuses.statuses[nr].status[j]) { ++ case ' ': xstrsncpy(status[j], GIT_NON, 4); break; ++ case 'M': xstrsncpy(status[j], GIT_MOD, 4); break; ++ case 'A': xstrsncpy(status[j], GIT_ADD, 4); break; ++ case '?': xstrsncpy(status[j], GIT_NEW, 4); break; ++ case '!': xstrsncpy(status[j], GIT_IGN, 4); break; ++ case 'D': xstrsncpy(status[j], GIT_DEL, 4); break; ++ case 'U': xstrsncpy(status[j], GIT_UPD, 4); break; ++ } ++ } ++ if (git_statuses.statuses[nr].status[1] != '!') ++ git_statuses.show = TRUE; ++} ++ + static void resetdircolor(int flags) + { + /* Directories are always shown on top, clear the color when moving to first file */ +@@ -4123,6 +4195,10 @@ static void printent(const struct entry *ent, uint_t namecols, bool sel) + + uchar_t color_pair = get_color_pair_name_ind(ent, &ind, &attrs); + ++ if (git_statuses.show && (cfg.showdetail || cfg.normalgit)) ++ printw("%*s%s%s", (cfg.normalgit && !cfg.showdetail) ? 1 : 0, "", ++ ent->git_status[0], ent->git_status[1]); ++ + addch((ent->flags & FILE_SELECTED) ? '+' | A_REVERSE | A_BOLD : ' '); + + if (g_state.oldcolor) +@@ -5592,6 +5668,11 @@ static int dentfill(char *path, struct entry **ppdents) + attron(COLOR_PAIR(cfg.curctx + 1)); + } + ++ char linkpath[PATH_MAX]; ++ if ((git_statuses.len = get_git_statuses(path))) ++ if (!realpath(path, linkpath)) ++ printwarn(NULL); ++ + #if _POSIX_C_SOURCE >= 200112L + posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); + #endif +@@ -5792,6 +5873,29 @@ static int dentfill(char *path, struct entry **ppdents) + #endif + } + ++ if (git_statuses.len) { ++ char dentpath[PATH_MAX]; ++ size_t pathlen = mkpath(linkpath, dentp->name, dentpath); ++ dentp->git_status[0][0] = dentp->git_status[1][0] = '-'; ++ dentp->git_status[0][1] = dentp->git_status[1][1] = '\0'; ++ ++ if (dentp->flags & DIR_OR_DIRLNK) { ++ char prefix[PATH_MAX]; ++ memccpy(prefix, dentpath, '\0', PATH_MAX); ++ prefix[pathlen - 1] = '/'; ++ ++ for (size_t i = 0; i < git_statuses.len; ++i) ++ if (is_prefix(git_statuses.statuses[i].path, prefix, pathlen)) ++ set_git_status(dentp->git_status, i); ++ } else { ++ for (size_t i = 0; i < git_statuses.len; ++i) ++ if (!xstrcmp(git_statuses.statuses[i].path, dentpath)) { ++ set_git_status(dentp->git_status, i); ++ break; ++ } ++ } ++ } ++ + ++ndents; + } while ((dp = readdir(dirp))); + +@@ -6361,11 +6465,12 @@ static int adjust_cols(int n) + #endif + if (cfg.showdetail) { + /* Fallback to light mode if less than 35 columns */ +- if (n < 36) ++ if (n < 38) + cfg.showdetail ^= 1; + else /* 2 more accounted for below */ +- n -= 32; +- } ++ n -= (git_statuses.show ? 34 : 32); ++ } else if (cfg.normalgit && git_statuses.show) ++ n -= 3; + + /* 2 columns for preceding space and indicator */ + return (n - 2); +@@ -8143,6 +8248,7 @@ static void usage(void) + " -F val fifo mode [0:preview 1:explore]\n" + #endif + " -g regex filters\n" ++ " -G always show git status\n" + " -H show hidden files\n" + " -i show current file info\n" + " -J no auto-advance on selection\n" +@@ -8282,6 +8388,7 @@ static void cleanup(void) + fflush(stdout); + } + #endif ++ free(git_statuses.statuses); + free(selpath); + free(plgpath); + free(cfgpath); +@@ -8326,7 +8433,7 @@ int main(int argc, char *argv[]) + + while ((opt = (env_opts_id > 0 + ? env_opts[--env_opts_id] +- : getopt(argc, argv, "aAb:BcCdDeEfF:gHiJKl:nop:P:QrRs:St:T:uUVxh"))) != -1) { ++ : getopt(argc, argv, "aAb:BcCdDeEfF:gGHiJKl:nop:P:QrRs:St:T:uUVxh"))) != -1) { + switch (opt) { + #ifndef NOFIFO + case 'a': +@@ -8380,6 +8487,9 @@ int main(int argc, char *argv[]) + cfg.regex = 1; + filterfn = &visible_re; + break; ++ case 'G': ++ cfg.normalgit = 1; ++ break; + case 'H': + cfg.showhidden = 1; + break; diff --git a/nnn-4.9/patches/gitstatus/namefirst.diff b/nnn-4.9/patches/gitstatus/namefirst.diff @@ -0,0 +1,226 @@ +# Description: Add git status column to detail mode. Provides additional +# command line flag -G which will render the git status +# column also in normal mode. Vim plugin users may consider +# adding the -G flag to their command override. +# Compatibility patch for the namefirst patch. +# +# Authors: Luuk van Baal + +diff --git a/src/nnn.c b/src/nnn.c +index 88538787..d4af7c43 100644 +--- a/src/nnn.c ++++ b/src/nnn.c +@@ -270,6 +270,25 @@ + #define VFS_USED 1 + #define VFS_SIZE 2 + ++/* Git icons */ ++#ifdef NERD ++#define GIT_ADD "" ++#define GIT_DEL "" ++#define GIT_IGN "" ++#define GIT_MOD "" ++#define GIT_NEW "" ++#define GIT_NON "-" ++#define GIT_UPD "󰚰" ++#else ++#define GIT_ADD "A" ++#define GIT_DEL "D" ++#define GIT_IGN "!" ++#define GIT_MOD "M" ++#define GIT_NEW "?" ++#define GIT_NON "-" ++#define GIT_UPD "U" ++#endif ++ + /* TYPE DEFINITIONS */ + typedef unsigned int uint_t; + typedef unsigned char uchar_t; +@@ -294,6 +313,7 @@ typedef struct entry { + uid_t uid; /* 4 bytes */ + gid_t gid; /* 4 bytes */ + #endif ++ char git_status[2][5]; + } *pEntry; + + /* Selection marker */ +@@ -349,6 +369,7 @@ typedef struct { + uint_t cliopener : 1; /* All-CLI app opener */ + uint_t waitedit : 1; /* For ops that can't be detached, used EDITOR */ + uint_t rollover : 1; /* Roll over at edges */ ++ uint_t normalgit : 1; /* Show git status in normal mode */ + } settings; + + /* Non-persistent program-internal states (alphabeical order) */ +@@ -404,7 +425,17 @@ static struct { + ushort_t maxnameln, maxsizeln, maxuidln, maxgidln, maxentln, uidln, gidln, printguid; + } dtls; + ++typedef struct { ++ char status[2]; ++ char path[PATH_MAX]; ++} git_status_t; ++ + /* GLOBALS */ ++struct { ++ bool show; ++ size_t len; ++ git_status_t *statuses; ++} git_statuses; + + /* Configuration, contexts */ + static settings cfg = { +@@ -3804,6 +3835,47 @@ static int get_kv_key(kv *kvarr, char *val, uchar_t max, uchar_t id) + return -1; + } + ++static size_t get_git_statuses(const char *path) ++{ ++ static char gst[] = "git -c core.quotePath= status -s --no-renames --ignored=matching -unormal . 2>/dev/null"; ++ FILE *fp = popen(gst, "r"); ++ char status[PATH_MAX]; ++ size_t pathindex, i = -1; ++ git_statuses.show = FALSE; ++ ++ while (fgets(status, PATH_MAX, fp)) { ++ pathindex = (status[3] == '"') ? 4 : 3; ++ if (!cfg.showhidden && status[pathindex] == '.') ++ continue; ++ status[xstrlen(status) - pathindex + 2] = '\0'; ++ git_statuses.statuses = xrealloc(git_statuses.statuses, sizeof(git_status_t) * (++i + 1)); ++ git_statuses.statuses[i].status[0] = status[0]; ++ git_statuses.statuses[i].status[1] = status[1]; ++ mkpath(path, status + pathindex, git_statuses.statuses[i].path); ++ } ++ ++ pclose(fp); ++ return (i + 1); ++} ++ ++static void set_git_status(char status[][5], uint_t nr) ++{ ++ for (int j = 0; j < 2; j++) { ++ if (status[j][0] == '-') ++ switch (git_statuses.statuses[nr].status[j]) { ++ case ' ': xstrsncpy(status[j], GIT_NON, 4); break; ++ case 'M': xstrsncpy(status[j], GIT_MOD, 4); break; ++ case 'A': xstrsncpy(status[j], GIT_ADD, 4); break; ++ case '?': xstrsncpy(status[j], GIT_NEW, 4); break; ++ case '!': xstrsncpy(status[j], GIT_IGN, 4); break; ++ case 'D': xstrsncpy(status[j], GIT_DEL, 4); break; ++ case 'U': xstrsncpy(status[j], GIT_UPD, 4); break; ++ } ++ } ++ if (git_statuses.statuses[nr].status[1] != '!') ++ git_statuses.show = TRUE; ++} ++ + static void resetdircolor(int flags) + { + /* Directories are always shown on top, clear the color when moving to first file */ +@@ -4104,6 +4176,9 @@ static void printent(const struct entry *ent, uint_t namecols, bool sel) + int attrs = 0, namelen; + uchar_t color_pair = get_color_pair_name_ind(ent, &ind, &attrs); + ++ if (git_statuses.show && (cfg.showdetail || cfg.normalgit)) ++ printw(" %s%s", ent->git_status[0], ent->git_status[1]); ++ + addch((ent->flags & FILE_SELECTED) ? '+' | A_REVERSE | A_BOLD : ' '); + + if (g_state.oldcolor) +@@ -5598,6 +5673,11 @@ static int dentfill(char *path, struct entry **ppdents) + attron(COLOR_PAIR(cfg.curctx + 1)); + } + ++ char linkpath[PATH_MAX]; ++ if ((git_statuses.len = get_git_statuses(path))) ++ if (!realpath(path, linkpath)) ++ printwarn(NULL); ++ + #if _POSIX_C_SOURCE >= 200112L + posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); + #endif +@@ -5798,6 +5878,29 @@ static int dentfill(char *path, struct entry **ppdents) + #endif + } + ++ if (git_statuses.len) { ++ char dentpath[PATH_MAX]; ++ size_t pathlen = mkpath(linkpath, dentp->name, dentpath); ++ dentp->git_status[0][0] = dentp->git_status[1][0] = '-'; ++ dentp->git_status[0][1] = dentp->git_status[1][1] = '\0'; ++ ++ if (dentp->flags & DIR_OR_DIRLNK) { ++ char prefix[PATH_MAX]; ++ memccpy(prefix, dentpath, '\0', PATH_MAX); ++ prefix[pathlen - 1] = '/'; ++ ++ for (size_t i = 0; i < git_statuses.len; ++i) ++ if (is_prefix(git_statuses.statuses[i].path, prefix, pathlen)) ++ set_git_status(dentp->git_status, i); ++ } else { ++ for (size_t i = 0; i < git_statuses.len; ++i) ++ if (!xstrcmp(git_statuses.statuses[i].path, dentpath)) { ++ set_git_status(dentp->git_status, i); ++ break; ++ } ++ } ++ } ++ + ++ndents; + } while ((dp = readdir(dirp))); + +@@ -6362,7 +6465,8 @@ static int adjust_cols(int n) + cfg.showdetail ^= 1; + else /* 2 more accounted for below */ + n -= (dtls.maxentln - 2 - dtls.maxnameln); +- } ++ } else if (cfg.normalgit && git_statuses.show) ++ n -= 3; + + /* 2 columns for preceding space and indicator */ + return (n - 2); +@@ -6517,7 +6621,7 @@ static void redraw(char *path) + } + #endif + } +- dtls.maxentln = dtls.maxnameln + dtls.maxsizeln + (dtls.printguid ? (dtls.maxuidln + dtls.maxgidln + 29) : 26); ++ dtls.maxentln = dtls.maxnameln + dtls.maxsizeln + (dtls.printguid ? (dtls.maxuidln + dtls.maxgidln + 3) : 0) + (git_statuses.show ? 29 : 26); + } + + ncols = adjust_cols(ncols); +@@ -8153,6 +8257,7 @@ static void usage(void) + " -F val fifo mode [0:preview 1:explore]\n" + #endif + " -g regex filters\n" ++ " -G always show git status\n" + " -H show hidden files\n" + " -i show current file info\n" + " -J no auto-advance on selection\n" +@@ -8292,6 +8397,7 @@ static void cleanup(void) + fflush(stdout); + } + #endif ++ free(git_statuses.statuses); + free(selpath); + free(plgpath); + free(cfgpath); +@@ -8336,7 +8442,7 @@ int main(int argc, char *argv[]) + + while ((opt = (env_opts_id > 0 + ? env_opts[--env_opts_id] +- : getopt(argc, argv, "aAb:BcCdDeEfF:gHiJKl:nop:P:QrRs:St:T:uUVxh"))) != -1) { ++ : getopt(argc, argv, "aAb:BcCdDeEfF:gGHiJKl:nop:P:QrRs:St:T:uUVxh"))) != -1) { + switch (opt) { + #ifndef NOFIFO + case 'a': +@@ -8390,6 +8496,9 @@ int main(int argc, char *argv[]) + cfg.regex = 1; + filterfn = &visible_re; + break; ++ case 'G': ++ cfg.normalgit = 1; ++ break; + case 'H': + cfg.showhidden = 1; + break; diff --git a/nnn-4.9/patches/namefirst/mainline.diff b/nnn-4.9/patches/namefirst/mainline.diff @@ -0,0 +1,222 @@ +# Description: Prints filenames first in the detail view. Prints user/group +# columns when a directory contains different users/groups. +# +# Author: Luuk van Baal + +diff --git a/src/nnn.c b/src/nnn.c +index f8a2c58..9802a1f 100644 +--- a/src/nnn.c ++++ b/src/nnn.c +@@ -394,6 +394,10 @@ typedef struct { + } session_header_t; + #endif + ++static struct { ++ ushort_t maxnameln, maxsizeln, maxuidln, maxgidln, maxentln, uidln, gidln, printguid; ++} dtls; ++ + /* GLOBALS */ + + /* Configuration, contexts */ +@@ -1070,10 +1074,12 @@ static char *getpwname(uid_t uid) + static char *namecache; + + if (uidcache != uid) { ++ if (dtls.maxuidln && !dtls.printguid) dtls.printguid = 1; + struct passwd *pw = getpwuid(uid); + + uidcache = uid; + namecache = pw ? pw->pw_name : NULL; ++ dtls.uidln = xstrlen(namecache ? namecache : xitoa(uid)); + } + + return namecache ? namecache : xitoa(uid); +@@ -1085,10 +1091,12 @@ static char *getgrname(gid_t gid) + static char *grpcache; + + if (gidcache != gid) { ++ if (dtls.maxgidln && !dtls.printguid) dtls.printguid = 1; + struct group *gr = getgrgid(gid); + + gidcache = gid; + grpcache = gr ? gr->gr_name : NULL; ++ dtls.gidln = xstrlen(grpcache ? grpcache : xitoa(gid)); + } + + return grpcache ? grpcache : xitoa(gid); +@@ -3834,14 +3842,13 @@ static void resetdircolor(int flags) + * Max supported str length: NAME_MAX; + */ + #ifdef NOLC +-static char *unescape(const char *str, uint_t maxcols) ++static size_t unescape(const char *str, uint_t maxcols) + { + char * const wbuf = g_buf; + char *buf = wbuf; +- +- xstrsncpy(wbuf, str, maxcols); ++ size_t len = xstrsncpy(wbuf, str, maxcols); + #else +-static wchar_t *unescape(const char *str, uint_t maxcols) ++static size_t unescape(const char *str, uint_t maxcols) + { + wchar_t * const wbuf = (wchar_t *)g_buf; + wchar_t *buf = wbuf; +@@ -3866,7 +3873,7 @@ static wchar_t *unescape(const char *str, uint_t maxcols) + ++buf; + } + +- return wbuf; ++ return len; + } + + static off_t get_size(off_t size, off_t *pval, int comp) +@@ -4134,33 +4141,7 @@ static uchar_t get_color_pair_name_ind(const struct entry *ent, char *pind, int + static void printent(const struct entry *ent, uint_t namecols, bool sel) + { + char ind = '\0'; +- int attrs; +- +- if (cfg.showdetail) { +- int type = ent->mode & S_IFMT; +- char perms[6] = {' ', ' ', (char)('0' + ((ent->mode >> 6) & 7)), +- (char)('0' + ((ent->mode >> 3) & 7)), +- (char)('0' + (ent->mode & 7)), '\0'}; +- +- addch(' '); +- attrs = g_state.oldcolor ? (resetdircolor(ent->flags), A_DIM) +- : (fcolors[C_MIS] ? COLOR_PAIR(C_MIS) : 0); +- if (attrs) +- attron(attrs); +- +- /* Print details */ +- print_time(&ent->sec, ent->flags); +- +- printw("%s%9s ", perms, (type == S_IFREG || type == S_IFDIR) +- ? coolsize(cfg.blkorder ? (blkcnt_t)ent->blocks << blk_shift : ent->size) +- : (type = (uchar_t)get_detail_ind(ent->mode), (char *)&type)); +- +- if (attrs) +- attroff(attrs); +- } +- +- attrs = 0; +- ++ int attrs = 0, namelen; + uchar_t color_pair = get_color_pair_name_ind(ent, &ind, &attrs); + + addch((ent->flags & FILE_SELECTED) ? '+' | A_REVERSE | A_BOLD : ' '); +@@ -4185,15 +4166,40 @@ static void printent(const struct entry *ent, uint_t namecols, bool sel) + ++namecols; + + #ifndef NOLC +- addwstr(unescape(ent->name, namecols)); ++ addwstr((namelen = unescape(ent->name, namecols), (wchar_t *)g_buf)); + #else +- addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1)); ++ addstr((namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1), (char *)g_buf)); + #endif + +- if (attrs) ++ if (!sel && attrs) + attroff(attrs); + if (ind) + addch(ind); ++ if (cfg.showdetail) { ++ int type = ent->mode & S_IFMT; ++ char perms[6] = {(char)('0' + ((ent->mode >> 6) & 7)), ++ (char)('0' + ((ent->mode >> 3) & 7)), ++ (char)('0' + (ent->mode & 7)), ' ', ' ', '\0'}, *size = NULL; ++ ++ if (attrs) ++ attron(attrs); ++ if (!g_state.oldcolor && (type == S_IFDIR || (type == S_IFLNK && ent->flags & DIR_OR_DIRLNK))) ++ attroff(A_BOLD); ++ int sizelen = (type == S_IFREG || type == S_IFDIR) ? xstrlen(size = coolsize(cfg.blkorder ? ent->blocks << blk_shift : ent->size)) : 1; ++ printw("%*c%*s%s%s", 1 + MIN(namecols, dtls.maxnameln + (uint_t)(ind ? 0 : 1)) - namelen, ' ', ++ dtls.maxsizeln - sizelen, "", size ? size : (type = (uchar_t)get_detail_ind(ent->mode), (char *)&type), " "); ++#ifndef NOUG ++ if (g_state.uidgid && dtls.printguid) { ++ addstr(getpwname(ent->uid)); ++ printw("%*c%s", dtls.maxuidln + 1 - dtls.uidln, ' ', getgrname(ent->gid)); ++ printw("%*c", dtls.maxgidln + 2 - dtls.gidln, ' '); ++ } ++#endif ++ addstr(perms); ++ print_time(&ent->sec, ent->flags); ++ } ++ if (attrs) ++ attroff(attrs); + } + + static void savecurctx(char *path, char *curname, int nextctx) +@@ -6356,26 +6362,19 @@ static void statusbar(char *path) + tocursor(); + } + +-static inline void markhovered(void) +-{ +- if (cfg.showdetail && ndents) { /* Bold forward arrowhead */ +- tocursor(); +- addch('>' | A_BOLD); +- } +-} +- + static int adjust_cols(int n) + { + /* Calculate the number of cols available to print entry name */ + #ifdef ICONS_ENABLED + n -= (g_state.oldcolor ? 0 : ICON_SIZE + ICON_PADDING_LEFT_LEN + ICON_PADDING_RIGHT_LEN); + #endif ++ + if (cfg.showdetail) { + /* Fallback to light mode if less than 35 columns */ +- if (n < 36) ++ if (n < (dtls.maxentln + 1 - dtls.maxnameln)) + cfg.showdetail ^= 1; + else /* 2 more accounted for below */ +- n -= 32; ++ n -= (dtls.maxentln - 2 - dtls.maxnameln); + } + + /* 2 columns for preceding space and indicator */ +@@ -6412,8 +6411,6 @@ static void draw_line(int ncols) + /* Must reset e.g. no files in dir */ + if (dir) + attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD); +- +- markhovered(); + } + + static void redraw(char *path) +@@ -6521,6 +6518,21 @@ static void redraw(char *path) + + onscreen = MIN(onscreen + curscroll, ndents); + ++ if (cfg.showdetail) { ++ ushort_t lenbuf = dtls.maxnameln = dtls.maxsizeln = dtls.maxuidln = dtls.maxgidln = dtls.printguid = 0; ++ for (i = curscroll; i < onscreen; ++i) { ++ if ((lenbuf = pdents[i].nlen - 1) > dtls.maxnameln) dtls.maxnameln = lenbuf; ++ if ((lenbuf = xstrlen(coolsize(cfg.blkorder ? pdents[i].blocks << blk_shift : pdents[i].size))) > dtls.maxsizeln) dtls.maxsizeln = lenbuf; ++#ifndef NOUG ++ if (g_state.uidgid) { ++ if ((getpwname(pdents[i].uid), dtls.uidln) > dtls.maxuidln) dtls.maxuidln = dtls.uidln; ++ if ((getgrname(pdents[i].gid), dtls.gidln) > dtls.maxgidln) dtls.maxgidln = dtls.gidln; ++ } ++#endif ++ } ++ dtls.maxentln = dtls.maxnameln + dtls.maxsizeln + (dtls.printguid ? (dtls.maxuidln + dtls.maxgidln + 29) : 26); ++ } ++ + ncols = adjust_cols(ncols); + + int len = scanselforpath(path, FALSE); +@@ -6551,7 +6563,7 @@ static void redraw(char *path) + #endif + } + +- markhovered(); ++ statusbar(path); + } + + static bool cdprep(char *lastdir, char *lastname, char *path, char *newpath) diff --git a/nnn-4.9/patches/restorepreview/mainline.diff b/nnn-4.9/patches/restorepreview/mainline.diff @@ -0,0 +1,267 @@ +# Description: Adds preview pipe to enable closing and re-opening the preview +# pane when running an undetached editor. If you are using vim +# you might experience incorrectly resized window. Consider adding +# the following to your vimrc: +# autocmd VimEnter * :silent exec "!kill -s WINCH $PPID" +# +# Authors: Luuk van Baal + +diff --git a/src/nnn.c b/src/nnn.c +index b10143a4..76d6bc5b 100644 +--- a/src/nnn.c ++++ b/src/nnn.c +@@ -374,6 +374,7 @@ typedef struct { + uint_t trash : 2; /* Trash method 0: rm -rf, 1: trash-cli, 2: gio trash */ + uint_t uidgid : 1; /* Show owner and group info */ + uint_t usebsdtar : 1; /* Use bsdtar as default archive utility */ ++ uint_t previewer : 1; /* Run state of previewer */ + uint_t reserved : 5; /* Adjust when adding/removing a field */ + } runstate; + +@@ -500,6 +501,9 @@ static char g_tmpfpath[TMP_LEN_MAX] __attribute__ ((aligned)); + /* Buffer to store plugins control pipe location */ + static char g_pipepath[TMP_LEN_MAX] __attribute__ ((aligned)); + ++/* Buffer to store preview plugins control pipe location */ ++static char g_ppipepath[TMP_LEN_MAX] __attribute__ ((aligned)); ++ + /* Non-persistent runtime states */ + static runstate g_state; + +@@ -676,12 +680,13 @@ static const char * const messages[] = { + #define NNN_FCOLORS 5 + #define NNNLVL 6 + #define NNN_PIPE 7 +-#define NNN_MCLICK 8 +-#define NNN_SEL 9 +-#define NNN_ARCHIVE 10 +-#define NNN_ORDER 11 +-#define NNN_HELP 12 /* strings end here */ +-#define NNN_TRASH 13 /* flags begin here */ ++#define NNN_PPIPE 8 ++#define NNN_MCLICK 9 ++#define NNN_SEL 10 ++#define NNN_ARCHIVE 11 ++#define NNN_ORDER 12 ++#define NNN_HELP 13 /* strings end here */ ++#define NNN_TRASH 14 /* flags begin here */ + + static const char * const env_cfg[] = { + "NNN_OPTS", +@@ -692,6 +697,7 @@ static const char * const env_cfg[] = { + "NNN_FCOLORS", + "NNNLVL", + "NNN_PIPE", ++ "NNN_PPIPE", + "NNN_MCLICK", + "NNN_SEL", + "NNN_ARCHIVE", +@@ -833,7 +839,7 @@ static int set_sort_flags(int r); + static void statusbar(char *path); + static bool get_output(char *file, char *arg1, char *arg2, int fdout, bool multi, bool page); + #ifndef NOFIFO +-static void notify_fifo(bool force); ++static void notify_fifo(bool force, bool closepreview); + #endif + + /* Functions */ +@@ -3022,7 +3028,7 @@ try_quit: + } else { + #ifndef NOFIFO + if (!g_state.fifomode) +- notify_fifo(TRUE); /* Send hovered path to NNN_FIFO */ ++ notify_fifo(TRUE, FALSE); /* Send hovered path to NNN_FIFO */ + #endif + escaped = TRUE; + settimeout(); +@@ -5120,15 +5126,20 @@ static void run_cmd_as_plugin(const char *file, char *runfile, uchar_t flags) + + static bool plctrl_init(void) + { +- size_t len; ++ size_t len, lenbuf; ++ pid_t pid = getpid(); + + /* g_tmpfpath is used to generate tmp file names */ + g_tmpfpath[tmpfplen - 1] = '\0'; +- len = xstrsncpy(g_pipepath, g_tmpfpath, TMP_LEN_MAX); ++ len = lenbuf = xstrsncpy(g_pipepath, g_tmpfpath, TMP_LEN_MAX); + g_pipepath[len - 1] = '/'; +- len = xstrsncpy(g_pipepath + len, "nnn-pipe.", TMP_LEN_MAX - len) + len; +- xstrsncpy(g_pipepath + len - 1, xitoa(getpid()), TMP_LEN_MAX - len); ++ xstrsncpy(g_ppipepath, g_pipepath, TMP_LEN_MAX); ++ len += xstrsncpy(g_pipepath + len, "nnn-pipe.", TMP_LEN_MAX - len); ++ xstrsncpy(g_pipepath + len - 1, xitoa(pid), TMP_LEN_MAX - len); ++ len = xstrsncpy(g_ppipepath + lenbuf, "nnn-ppipe.", TMP_LEN_MAX - lenbuf) + lenbuf; ++ xstrsncpy(g_ppipepath + len - 1, xitoa(pid), TMP_LEN_MAX - len); + setenv(env_cfg[NNN_PIPE], g_pipepath, TRUE); ++ setenv(env_cfg[NNN_PPIPE], g_ppipepath, TRUE); + + return EXIT_SUCCESS; + } +@@ -5157,6 +5168,21 @@ static ssize_t read_nointr(int fd, void *buf, size_t count) + return len; + } + ++void *previewpipe(void *arg __attribute__ ((unused))) ++{ ++ int fd, buf; ++ ++ mkfifo(g_ppipepath, 0600); ++ fd = open(g_ppipepath, O_RDONLY); ++ ++ if (read(fd, &buf, 1) == 1) ++ g_state.previewer = buf; ++ ++ close(fd); ++ unlink(g_ppipepath); ++ return NULL; ++} ++ + static char *readpipe(int fd, char *ctxnum, char **path) + { + char ctx, *nextpath = NULL; +@@ -5841,7 +5867,7 @@ static void populate(char *path, char *lastname) + } + + #ifndef NOFIFO +-static void notify_fifo(bool force) ++static void notify_fifo(bool force, bool closepreview) + { + if (!fifopath) + return; +@@ -5857,6 +5883,12 @@ static void notify_fifo(bool force) + } + } + ++ if (closepreview) { ++ if (write(fifofd, "close\n", 6) != 6) ++ xerror(); ++ return; ++ } ++ + static struct entry lastentry; + + if (!force && !memcmp(&lastentry, &pdents[cur], sizeof(struct entry))) // NOLINT +@@ -5889,7 +5921,7 @@ static void send_to_explorer(int *presel) + if (fd > 1) + close(fd); + } else +- notify_fifo(TRUE); /* Send opened path to NNN_FIFO */ ++ notify_fifo(TRUE, FALSE); /* Send opened path to NNN_FIFO */ + } + #endif + +@@ -5922,7 +5954,7 @@ static void move_cursor(int target, int ignore_scrolloff) + + #ifndef NOFIFO + if (!g_state.fifomode) +- notify_fifo(FALSE); /* Send hovered path to NNN_FIFO */ ++ notify_fifo(FALSE, FALSE); /* Send hovered path to NNN_FIFO */ + #endif + } + +@@ -6539,7 +6571,7 @@ static bool browse(char *ipath, const char *session, int pkey) + pEntry pent; + enum action sel; + struct stat sb; +- int r = -1, presel, selstartid = 0, selendid = 0; ++ int r = -1, presel, selstartid = 0, selendid = 0, previewkey = 0; + const uchar_t opener_flags = (cfg.cliopener ? F_CLI : (F_NOTRACE | F_NOSTDIN | F_NOWAIT)); + bool watch = FALSE, cd = TRUE; + ino_t inode = 0; +@@ -6797,7 +6829,7 @@ nochange: + move_cursor(r, 1); + #ifndef NOFIFO + else if ((event.bstate == BUTTON1_PRESSED) && !g_state.fifomode) +- notify_fifo(TRUE); /* Send clicked path to NNN_FIFO */ ++ notify_fifo(TRUE, FALSE); /* Send clicked path to NNN_FIFO */ + #endif + /* Handle right click selection */ + if (event.bstate == BUTTON3_PRESSED) { +@@ -6959,7 +6991,14 @@ nochange: + && strstr(g_buf, "text") + #endif + ) { ++ if (g_state.previewer) ++ notify_fifo(FALSE, TRUE); + spawn(editor, newpath, NULL, NULL, F_CLI); ++ if (g_state.previewer) { ++ pkey = previewkey; ++ goto run_plugin; ++ } ++ + if (cfg.filtermode) { + presel = FILTER; + clearfilter(); +@@ -7272,8 +7311,14 @@ nochange: + copycurname(); + goto nochange; + case SEL_EDIT: ++ if (g_state.previewer) ++ notify_fifo(FALSE, TRUE); + if (!(g_state.picker || g_state.fifomode)) + spawn(editor, newpath, NULL, NULL, F_CLI); ++ if (g_state.previewer) { ++ pkey = previewkey; ++ goto run_plugin; ++ } + continue; + default: /* SEL_LOCK */ + lock_terminal(); +@@ -7642,6 +7687,7 @@ nochange: + cd = FALSE; + goto begin; + } ++run_plugin: + case SEL_PLUGIN: + /* Check if directory is accessible */ + if (!xdiraccess(plgpath)) { +@@ -7667,6 +7713,12 @@ nochange: + goto nochange; + } + ++ if (xstrcmp(tmp, "preview-tui") == 0) { ++ previewkey = r; ++ pthread_t tid; ++ pthread_create(&tid, NULL, previewpipe, NULL); ++ } ++ + if (tmp[0] == '-' && tmp[1]) { + ++tmp; + r = FALSE; /* Do not refresh dir after completion */ +@@ -7722,7 +7774,13 @@ nochange: + case SEL_SHELL: // fallthrough + case SEL_LAUNCH: // fallthrough + case SEL_PROMPT: ++ if (g_state.previewer) ++ notify_fifo(FALSE, TRUE); + r = handle_cmd(sel, newpath); ++ if (g_state.previewer) { ++ pkey = previewkey; ++ goto run_plugin; ++ } + + /* Continue in type-to-nav mode, if enabled */ + if (cfg.filtermode) +@@ -8263,8 +8321,10 @@ static void cleanup(void) + if (g_state.autofifo) + unlink(fifopath); + #endif +- if (g_state.pluginit) ++ if (g_state.pluginit){ + unlink(g_pipepath); ++ unlink(g_ppipepath); ++ } + #ifdef DEBUG + disabledbg(); + #endif +@@ -8769,7 +8829,7 @@ int main(int argc, char *argv[]) + + #ifndef NOFIFO + if (!g_state.fifomode) +- notify_fifo(FALSE); ++ notify_fifo(FALSE, TRUE); + if (fifofd != -1) + close(fifofd); + #endif diff --git a/nnn-4.9/plugins/.cbcp b/nnn-4.9/plugins/.cbcp @@ -0,0 +1,51 @@ +#!/usr/bin/env sh + +# Description: Copy selection to system clipboard as newline-separated entries +# Dependencies: +# - tr +# - xclip/xsel (Linux) +# - pbcopy (macOS) +# - termux-clipboard-set (Termux) +# - clip.exe (WSL) +# - clip (Cygwin) +# - wl-copy (Wayland) +# - clipboard (Haiku) +# +# Limitation: breaks if a filename has newline in it +# +# Note: For a space-separated list: +# xargs -0 < "$SELECTION" +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}" # protect trailing \n + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +[ -s "$selection" ] || { echo "plugin .cbcp error: empty selection" >&2 ; exit 1; } + +if [ "$XDG_SESSION_TYPE" = "wayland" ]; then + # Wayland + tr '\0' '\n' < "$selection" | wl-copy +elif type xsel >/dev/null 2>&1; then + # Linux + tr '\0' '\n' < "$selection" | xsel -bi +elif type xclip >/dev/null 2>&1; then + # Linux + tr '\0' '\n' < "$selection" | xclip -sel clip +elif type pbcopy >/dev/null 2>&1; then + # macOS + tr '\0' '\n' < "$selection" | pbcopy +elif type termux-clipboard-set >/dev/null 2>&1; then + # Termux + tr '\0' '\n' < "$selection" | termux-clipboard-set +elif type clip.exe >/dev/null 2>&1; then + # WSL + tr '\0' '\n' < "$selection" | clip.exe +elif type clip >/dev/null 2>&1; then + # Cygwin + tr '\0' '\n' < "$selection" | clip +elif type clipboard >/dev/null 2>&1; then + # Haiku + tr '\0' '\n' < "$selection" | clipboard --stdin +fi diff --git a/nnn-4.9/plugins/.iconlookup b/nnn-4.9/plugins/.iconlookup @@ -0,0 +1,441 @@ +#!/usr/bin/env sh + +# Description: Print icons in front of list of directories/files + +# Dependencies: awk + +# Usage +# 1. Set colors and/or icons to your liking +# 2. Pipe any directory listing to iconlookup and it will output prepended icons +# 3. preview-tui uses the script to prepend icon to directory listings +# 4. Aditionally you can consider adding it to your PATH and/or FZF_DEFAULT_COMMAND to +# make it work with various fzf plugins (make sure you also add --ansi to your FZF_DEFAULT_OPTS) + +# Shell: POSIX compliant + +# Author: Luuk van Baal (https://github.com/luukvbaal/iconlookup) + +icon_lookup() { +awk 'BEGIN { +# Set your ANSI colorscheme below (https://en.wikipedia.org/wiki/ANSI_escape_code#Colors). +# Default uses standard nnn icon colors, 8 and 24-bit nord themes are commented out. + colordepth=8 #colordepth=8 #colordepth=24 + color_dirtxt=39 #color_dirtxt=111 #color_dirtxt="129;161;193" + color_filetxt=15 #color_filetxt=111 #color_filetxt="129;161;193" + color_default=39 #color_default=111 #color_default="129;161;193" + color_video=93 #color_video=110 #color_video="136;192;208" + color_audio=220 #color_audio=150 #color_audio="163;190;140" + color_image=82 #color_image=150 #color_image="163;190;140" + color_docs=202 #color_docs=173 #color_docs="208;135;112" + color_archive=209 #color_archive=179 #color_archive="235;203;139" + color_c=81 #color_c=150 #color_c="163;190;140" + color_elixir=104 #color_elixir=109 #color_elixir="143;188;187" + color_java=32 #color_java=139 #color_java="180;142;173" + color_js=47 #color_js=109 #color_js="143;188;187" + color_react=39 #color_react=111 #color_react="129;161;193" + color_css=199 #color_css=110 #color_css="136;192;208" + color_python=227 #color_python=68 #color_python="94;129;172" + color_lua=19 #color_lua=167 #color_lua="191;97;106" + color_document=15 #color_document=173 #color_document="208;135;112" + color_fsharp=31 #color_fsharp=179 #color_fsharp="180;142;173" + color_ruby=160 #color_ruby=150 #color_ruby="163;190;140" + color_scala=196 #color_scala=139 #color_scala="143;188;187" + color_shell=47 #color_shell=109 #color_shell="143;188;187" + color_vim=28 #color_vim=109 #color_vim="143;188;187" + +# icons[][1] contains icon and icons[][2] contains color + icons["directory"][1] = ""; icons["directory"][2] = color_default + icons["file"][1] = "󰈔"; icons["file"][2] = color_default + icons["exec"][1] = ""; icons["exec"][2] = color_default + icons["manual"][1] = "󱓷"; icons["manual"][2] = color_docs + icons["pipe"][1] = "󰟥"; icons["pipe"][2] = color_default + icons["socket"][1] = "󰟩"; icons["socket"][2] = color_default + icons["door"][1] = "➡"; icons["door"][2] = color_default + +# top level and common icons + icons[".git"][1] = ""; icons[".git"][2] = color_default + icons["desktop"][1] = "󰟀"; icons["desktop"][2] = color_default + icons["briefcase"][1] = "󰃖"; icons["briefcase"][2] = color_default + icons["document"][1] = "󰃖"; icons["document"][2] = color_default + icons["downloads"][1] = "󰃘"; icons["downloads"][2] = color_default + icons["music"][1] = "󱍙"; icons["music"][2] = color_default + icons["musicfile"][1] = "󰎈"; icons["musicfile"][2] = color_audio + icons["pictures"][1] = "󰉔"; icons["pictures"][2] = color_default + icons["picturefile"][1] = "󰈟"; icons["picturefile"][2] = color_image + icons["public"][1] = ""; icons["public"][2] = color_default + icons["templates"][1] = "󰗇"; icons["templates"][2] = color_default + icons["videos"][1] = "󰈰"; icons["videos"][2] = color_default + icons["videofile"][1] = "󰈫"; icons["videofile"][2] = color_video + icons["changelog"][1] = "󰋚"; icons["changelog"][2] = color_docs + icons["configure"][1] = ""; icons["configure"][2] = color_default + icons["license"][1] = "󰈙"; icons["license"][2] = color_docs + icons["makefile"][1] = "󰆍"; icons["makefile"][2] = color_default + icons["archive"][1] = "󰀼"; icons["archive"][2] = color_archive + icons["rust"][1] = ""; icons["rust"][2] = color_default + icons["script"][1] = ""; icons["script"][2] = color_shell + icons["subtitle"][1] = "󰅺"; icons["subtitle"][2] = color_default + icons["cplusplus"][1] = ""; icons["cplusplus"][2] = color_c + icons["java"][1] = ""; icons["java"][2] = color_java + icons["clojure"][1] = ""; icons["clojure"][2] = color_default + icons["js"][1] = "󰌞"; icons["js"][2] = color_js + icons["linux"][1] = "󰌽"; icons["linux"][2] = color_default + icons["elixir"][1] = ""; icons["elixir"][2] = color_fsharp + icons["fsharp"][1] = ""; icons["fsharp"][2] = color_fsharp + icons["ruby"][1] = ""; icons["ruby"][2] = color_ruby + icons["c"][1] = ""; icons["c"][2] = color_c + icons["chess"][1] = "󰄺"; icons["chess"][2] = color_default + icons["haskell"][1] = ""; icons["haskell"][2] = color_vim + icons["font"][1] = ""; icons["font"][2] = color_default + icons["html"][1] = "󰌝"; icons["html"][2] = color_default + icons["react"][1] = ""; icons["react"][2] = color_react + icons["python"][1] = ""; icons["python"][2] = color_python + icons["database"][1] = "󰆼"; icons["database"][2] = color_default + icons["worddoc"][1] = "󰈬"; icons["worddoc"][2] = color_document + icons["playlist"][1] = "󱍙"; icons["playlist"][2] = color_audio + icons["opticaldisk"][1] = ""; icons["opticaldisk"][2] = color_archive + +# numbers + icons["1"][1] = icons["manual"][1]; icons["1"][2] = icons["manual"][2] + icons["7z"][1] = icons["archive"][1]; icons["7z"][2] = icons["archive"][2] + +# a + icons["a"][1] = icons["manual"][1]; icons["a"][2] = icons["manual"][2] + icons["apk"][1] = icons["archive"][1]; icons["apk"][2] = icons["archive"][2] + icons["asm"][1] = icons["file"][1]; icons["asm"][2] = icons["file"][2] + icons["aup"][1] = icons["musicfile"][1]; icons["aup"][2] = icons["musicfile"][2] + icons["avi"][1] = icons["videofile"][1]; icons["avi"][2] = icons["videofile"][2] + +# b + icons["bat"][1] = icons["script"][1]; icons["bat"][2] = icons["script"][2] + icons["bin"][1] = ""; icons["bin"][2] = color_default + icons["bmp"][1] = icons["picturefile"][1]; icons["bmp"][2] = icons["picturefile"][2] + icons["bz2"][1] = icons["archive"][1]; icons["bz2"][2] = icons["archive"][2] + +# c + icons["cplusplus"][1] = icons["cplusplus"][1]; icons["cplusplus"][2] = icons["cplusplus"][2] + icons["cabal"][1] = icons["haskell"][1]; icons["cab"][2] = icons["haskell"][2] + icons["cab"][1] = icons["archive"][1]; icons["cab"][2] = icons["archive"][2] + icons["cbr"][1] = icons["archive"][1]; icons["cbr"][2] = icons["archive"][2] + icons["cbz"][1] = icons["archive"][1]; icons["cbz"][2] = icons["archive"][2] + icons["cc"][1] = icons["cplusplus"][1]; icons["cc"][2] = icons["cplusplus"][2] + icons["class"][1] = icons["java"][1]; icons["class"][2] = icons["java"][2] + icons["clj"][1] = icons["clojure"][1]; icons["clj"][2] = icons["clojure"][2] + icons["cljc"][1] = icons["clojure"][1]; icons["cljc"][2] = icons["clojure"][2] + icons["cljs"][1] = icons["clojure"][1]; icons["cljs"][2] = icons["clojure"][2] + icons["cmake"][1] = icons["makefile"][1]; icons["cmake"][2] = icons["makefile"][2] + icons["coffee"][1] = ""; icons["coffee"][2] = color_default + icons["conf"][1] = icons["configure"][1]; icons["conf"][2] = icons["configure"][2] + icons["cpio"][1] = icons["archive"][1]; icons["cpio"][2] = icons["archive"][2] + icons["cpp"][1] = icons["cplusplus"][1]; icons["cpp"][2] = icons["cplusplus"][2] + icons["css"][1] = ""; icons["css"][2] = color_css + icons["cue"][1] = icons["playlist"][1]; icons["cue"][2] = icons["playlist"][2] + icons["cvs"][1] = icons["configure"][1]; icons["cvs"][2] = icons["configure"][2] + icons["cxx"][1] = icons["cplusplus"][1]; icons["cxx"][2] = icons["cplusplus"][2] + +# d + icons["db"][1] = icons["database"][1]; icons["db"][2] = icons["database"][2] + icons["deb"][1] = ""; icons["deb"][2] = color_archive + icons["diff"][1] = ""; icons["diff"][2] = color_default + icons["dll"][1] = icons["script"][1]; icons["dll"][2] = icons["script"][2] + icons["doc"][1] = icons["worddoc"][1]; icons["doc"][2] = icons["worddoc"][2] + icons["docx"][1] = icons["worddoc"][1]; icons["docx"][2] = icons["worddoc"][2] + +# e + icons["ejs"][1] = icons["js"][1]; icons["ejs"][2] = icons["js"][2] + icons["elf"][1] = icons["linux"][1]; icons["elf"][2] = icons["linux"][2] + icons["epub"][1] = icons["manual"][1]; icons["epub"][2] = icons["manual"][2] + icons["exe"][1] = icons["exec"][1]; icons["exe"][2] = icons["exec"][2] + icons["ex"][1] = icons["elixir"][1]; icons["ex"][2] = icons["elixir"][2] + icons["eex"][1] = icons["elixir"][1]; icons["eex"][2] = icons["elixir"][2] + icons["exs"][1] = icons["elixir"][1]; icons["exs"][2] = icons["elixir"][2] + +# f + icons["fsharp"][1] = icons["fsharp"][1]; icons["fsharp"][2] = icons["fsharp"][2] + icons["flac"][1] = icons["musicfile"][1]; icons["flac"][2] = icons["musicfile"][2] + icons["fen"][1] = icons["chess"][1]; icons["fen"][2] = icons["chess"][2] + icons["flv"][1] = icons["videofile"][1]; icons["flv"][2] = icons["videofile"][2] + icons["fs"][1] = icons["fsharp"][1]; icons["fs"][2] = icons["fsharp"][2] + icons["fsi"][1] = icons["fsharp"][1]; icons["fsi"][2] = icons["fsharp"][2] + icons["fsscript"][1] = icons["fsharp"][1]; icons["fsscript"][2] = icons["fsharp"][2] + icons["fsx"][1] = icons["fsharp"][1]; icons["fsx"][2] = icons["fsharp"][2] + +# g + icons["gem"][1] = icons["ruby"][1]; icons["gem"][2] = icons["ruby"][2] + icons["gif"][1] = icons["picturefile"][1]; icons["gif"][2] = icons["picturefile"][2] + icons["go"][1] = "󰟓"; icons["go"][2] = color_default + icons["gz"][1] = icons["archive"][1]; icons["gz"][2] = icons["archive"][2] + icons["gzip"][1] = icons["archive"][1]; icons["gzip"][2] = icons["archive"][2] + +# h + icons["h"][1] = icons["c"][1]; icons["h"][2] = icons["c"][2] + icons["hh"][1] = icons["cplusplus"][1]; icons["hh"][2] = icons["cplusplus"][2] + icons["hpp"][1] = icons["cplusplus"][1]; icons["hpp"][2] = icons["cplusplus"][2] + icons["hs"][1] = icons["haskell"][1]; icons["hs"][2] = icons["haskell"][2] + icons["htaccess"][1] = icons["configure"][1]; icons["htaccess"][2] = icons["configure"][2] + icons["htpasswd"][1] = icons["configure"][1]; icons["htpasswd"][2] = icons["configure"][2] + icons["htm"][1] = icons["html"][1]; icons["htm"][2] = icons["html"][2] + icons["hxx"][1] = icons["cplusplus"][1]; icons["hxx"][2] = icons["cplusplus"][2] + icons["heex"][1] = icons["elixir"][1]; icons["heex"][2] = icons["elixir"][2] + +# i + icons["ico"][1] = icons["picturefile"][1]; icons["ico"][2] = icons["picturefile"][2] + icons["img"][1] = icons["opticaldisk"][1]; icons["img"][2] = icons["opticaldisk"][2] + icons["ini"][1] = icons["configure"][1]; icons["ini"][2] = icons["configure"][2] + icons["iso"][1] = icons["opticaldisk"][1]; icons["iso"][2] = icons["opticaldisk"][2] + icons["isub"][1] = icons["subtitle"][1]; icons["isub"][2] = icons["subtitle"][2] + +# j + icons["jar"][1] = icons["java"][1]; icons["jar"][2] = icons["java"][2] + icons["java"][1] = icons["java"][1]; icons["java"][2] = icons["java"][2] + icons["jl"][1] = icons["configure"][1]; icons["jl"][2] = icons["configure"][2] + icons["jpeg"][1] = icons["picturefile"][1]; icons["jpeg"][2] = icons["picturefile"][2] + icons["jpg"][1] = icons["picturefile"][1]; icons["jpg"][2] = icons["picturefile"][2] + icons["json"][1] = ""; icons["json"][2] = color_js + icons["jsx"][1] = icons["react"][1]; icons["jsx"][2] = icons["react"][2] + icons["jxl"][1] = icons["picturefile"][1]; icons["jxl"][2] = icons["picturefile"][2] + +# k + icons["ksh"][1] = icons["font"][1]; icons["ksf"][2] = icons["font"][2] + +# l + icons["lha"][1] = icons["archive"][1]; icons["lha"][2] = icons["archive"][2] + icons["lhs"][1] = icons["haskell"][1]; icons["lhs"][2] = icons["haskell"][2] + icons["ilog"][1] = icons["document"][1]; icons["ilog"][2] = icons["document"][2] + icons["lua"][1] = ""; icons["lua"][2] = color_lua + icons["lzh"][1] = icons["archive"][1]; icons["lzh"][2] = icons["archive"][2] + icons["lzma"][1] = icons["archive"][1]; icons["lzma"][2] = icons["archive"][2] + +# m + icons["m"][1] = "󰠞"; icons["mat"][2] = color_c + icons["m4a"][1] = icons["musicfile"][1]; icons["m4a"][2] = icons["musicfile"][2] + icons["m4v"][1] = icons["videofile"][1]; icons["m4v"][2] = icons["videofile"][2] + icons["mat"][1] = ""; icons["mat"][2] = color_c + icons["markdown"][1] = ""; icons["markdown"][2] = color_docs + icons["md"][1] = ""; icons["md"][2] = color_docs + icons["mk"][1] = icons["makefile"][1]; icons["mk"][2] = icons["makefile"][2] + icons["mkv"][1] = icons["videofile"][1]; icons["mkv"][2] = icons["videofile"][2] + icons["mov"][1] = icons["videofile"][1]; icons["mov"][2] = icons["videofile"][2] + icons["mp3"][1] = icons["musicfile"][1]; icons["mp3"][2] = icons["musicfile"][2] + icons["mp4"][1] = icons["videofile"][1]; icons["mp4"][2] = icons["videofile"][2] + icons["mpeg"][1] = icons["videofile"][1]; icons["mpeg"][2] = icons["videofile"][2] + icons["mpg"][1] = icons["videofile"][1]; icons["mpg"][2] = icons["videofile"][2] + icons["msi"][1] = "󰍲"; icons["msi"][2] = color_default + +# n + icons["nix"][1] = ""; icons["nix"][2] = color_fsharp + +# o + icons["o"][1] = icons["manual"][1]; icons["o"][2] = icons["manual"][2] + icons["ogg"][1] = icons["musicfile"][1]; icons["ogg"][2] = icons["musicfile"][2] + icons["odownload"][1] = icons["download"][1]; icons["odownload"][2] = icons["download"][2] + icons["otf"][1] = icons["font"][1]; icons["otf"][2] = icons["font"][2] + icons["out"][1] = icons["linux"][1]; icons["out"][2] = icons["linux"][2] + +# p + icons["part"][1] = icons["download"][1]; icons["part"][2] = icons["download"][2] + icons["patch"][1] = icons["diff"][1]; icons["patch"][2] = icons["diff"][2] + icons["pdf"][1] = "󰈦"; icons["pdf"][2] = color_docs + icons["pgn"][1] = icons["chess"][1]; icons["pgn"][2] = icons["chess"][2] + icons["php"][1] = ""; icons["php"][2] = color_default + icons["png"][1] = icons["picturefile"][1]; icons["png"][2] = icons["picturefile"][2] + icons["ppt"][1] = "󰈧"; icons["ppt"][2] = color_default + icons["pptx"][1] = "󰈧"; icons["pptx"][2] = color_default + icons["psb"][1] = ""; icons["psb"][2] = color_default + icons["psd"][1] = ""; icons["psd"][2] = color_default + icons["py"][1] = icons["python"][1]; icons["py"][2] = icons["python"][2] + icons["pyc"][1] = icons["python"][1]; icons["pyc"][2] = icons["python"][2] + icons["pyd"][1] = icons["python"][1]; icons["pyd"][2] = icons["python"][2] + icons["pyo"][1] = icons["python"][1]; icons["pyo"][2] = icons["python"][2] + +# q + +# r + icons["rar"][1] = icons["archive"][1]; icons["rar"][2] = icons["archive"][2] + icons["rc"][1] = icons["configure"][1]; icons["rc"][2] = icons["configure"][2] + icons["rom"][1] = "󰊖"; icons["rom"][2] = color_default + icons["rpm"][1] = icons["archive"][1]; icons["rpm"][2] = icons["archive"][2] + icons["rss"][1] = ""; icons["rss"][2] = color_default + icons["rtf"][1] = "󰈦"; icons["rtf"][2] = color_default + +# s + icons["sass"][1] = ""; icons["sass"][2] = color_css + icons["scss"][1] = ""; icons["scss"][2] = color_css + icons["so"][1] = icons["manual"][1]; icons["so"][2] = icons["manual"][2] + icons["scala"][1] = ""; icons["scala"][2] = color_scala + icons["sh"][1] = icons["script"][1]; icons["sh"][2] = icons["script"][2] + icons["slim"][1] = icons["script"][1]; icons["slim"][2] = icons["script"][2] + icons["sln"][1] = ""; icons["sln"][2] = color_default + icons["sql"][1] = icons["database"][1]; icons["sql"][2] = icons["database"][2] + icons["srt"][1] = icons["subtitle"][1]; icons["srt"][2] = icons["subtitle"][2] + icons["svg"][1] = icons["picturefile"][1]; icons["svg"][2] = icons["picturefile"][2] + +# t + icons["tar"][1] = icons["archive"][1]; icons["tar"][2] = icons["archive"][2] + icons["tex"][1] = "󰙩"; icons["tex"][2] = color_default + icons["tgz"][1] = icons["archive"][1]; icons["tgz"][2] = icons["archive"][2] + icons["ts"][1] = ""; icons["ts"][2] = color_js + icons["tsx"][1] = icons["react"][1]; icons["tsx"][2] = icons["react"][2] + icons["txt"][1] = icons["document"][1]; icons["txt"][2] = icons["document"][2] + icons["txz"][1] = icons["archive"][1]; icons["txz"][2] = icons["archive"][2] + icons["ttf"][1] = icons["font"][1]; icons["ttf"][2] = icons["font"][2] + +# u + +# v + icons["vid"][1] = icons["videofile"][1]; icons["vid"][2] = icons["videofile"][2] + icons["vim"][1] = ""; icons["vim"][2] = color_vim + icons["vimrc"][1] = ""; icons["vimrc"][2] = color_vim + icons["vtt"][1] = icons["subtitle"][1]; icons["vtt"][2] = icons["subtitle"][2] +# w + icons["wav"][1] = icons["musicfile"][1]; icons["wav"][2] = icons["musicfile"][2] + icons["webm"][1] = icons["videofile"][1]; icons["webm"][2] = icons["videofile"][2] + icons["wma"][1] = icons["videofile"][1]; icons["wma"][2] = icons["videofile"][2] + icons["wmv"][1] = icons["videofile"][1]; icons["wmv"][2] = icons["videofile"][2] + +# x + icons["xbps"][1] = icons["archive"][1]; icons["xbps"][2] = color_archive + icons["xcf"][1] = icons["picturefile"][1]; icons["xcf"][2] = color_image + icons["xhtml"][1] = icons["html"][1]; icons["xhtml"][2] = icons["html"][2] + icons["xls"][1] = "󰈛"; icons["xls"][2] = color_default + icons["xlsx"][1] = "󰈛"; icons["xlsx"][2] = color_default + icons["xml"][1] = icons["html"][1]; icons["xml"][2] = icons["html"][2] + icons["xz"][1] = icons["archive"][1]; icons["xz"][2] = icons["archive"][2] + +# y + icons["yaml"][1] = icons["configure"][1]; icons["yaml"][2] = icons["configure"][2] + icons["yml"][1] = icons["configure"][1]; icons["yml"][2] = icons["configure"][2] +# z + icons["zip"][1] = icons["archive"][1]; icons["zip"][2] = icons["archive"][2] + icons["zsh"][1] = icons["script"][1]; icons["zsh"][2] = icons["script"][2] + icons["zst"][1] = icons["archive"][1]; icons["zst"][2] = icons["archive"][2] + + FS = "." + limit = ENVIRON["limit"] + switch (colordepth) { + case "4": + escape="\033[" + break; + case "8": + escape="\033[38;5;" + break; + case "24": + escape="\033[38;2;" + break; + } + bstr = ENVIRON["beforestr"] +} +{ + # dont print cwd . and leading ./ from tree -f + if ($0 ~/^\.$/) + next + ent = ($0 ~/^\.\//) ? substr($0, 3, length($0) - 2) : $0 + ext = $NF + + # Print icons, set color and bold directories by using ansi escape codes + if (ext in icons) + printcolor(icons[ext][1], icons[ext][2], color_filetxt, ent, "10") + else + switch (substr(ent, length(ent), 1)) { + case "/": + printcolor(icons["directory"][1], color_default, color_dirtxt, ent, "1") + break; + case "*": + printcolor(icons["exe"][1], color_default, color_filetxt, ent, "10") + break; + case "|": + printcolor(icons["pipe"][1], color_default, color_filetxt, ent, "10") + break; + case "=": + printcolor(icons["socket"][1], color_default, color_filetxt, ent, "10") + break; + case ">": + printcolor(icons["door"][1], color_default, color_filetxt, ent, "10") + break; + default: + printcolor(icons["file"][1], color_default, color_filetxt, ent, "10") + } +} +function printcolor(i, c, d, n, b) { + if (limit != "" && length(n) + 2 > limit) + n = substr(n, 1, limit - 2) + printf "\033[0m" + printf "%s%s%s;%sm%s %s%sm%s\n", bstr, escape, c, b, i, escape, d, n +}' +printf '\033[0m' +} + +print_begin() { + printf '%s\n' "$1" | sed 's/\\n/\n/g' +} + +print_end() { + printf '%s\n' "$1" | sed 's/\\n/\n/g' +} + +print_help() { + printf 'Icon Lookup\n +Usage: + iconlookup [options] + iconlookup [-bBe] [string] + iconlookup -l [number] + iconlookup (-h | --help) + + Prepend icons to list of files based on extension or appended indicator by ls/tree "-F" flag ("/" for directory, "*" for executable etc.) + +Options: + -h --help -? Show this screen. + -b --before Prepend str before icon. + -B --begin Prepend str before output. + -e --end Append str after output. + -l --limit Limit line length to [number] characters.' +} + +while :; do + case $1 in + -h|-\?|--help) + print_help + exit ;; + -B|--begin) + if [ -n "$2" ]; then + print_begin "$2" + fi + shift ;; + -e|--end) + if [ -n "$2" ]; then + end=1 + endstr="$2" + fi + shift ;; + -b|--before) + if [ -n "$2" ]; then + export beforestr="$2" + fi + shift ;; + -l|--limit) + if [ -n "$2" ]; then + export limit="$2" + shift + else + printf 'ERROR: "--limit" requires a non-empty option argument.\n' + exit + fi ;; + --) + shift + break ;; + -?*) + printf 'WARNING: Unknown option ignored: %s\n' "$1" ;; + *) break ;; + esac + shift +done + +if [ ! -t 0 ]; then + [ -n "$beforestr" ] && limit="$((limit - ${#beforestr}))" + icon_lookup +else + printf 'ERROR: no data provided...\nExpecting a directory listing in stdin\n' +fi + +if [ -n "$end" ]; then + print_end "$endstr" +fi diff --git a/nnn-4.9/plugins/.nmv b/nnn-4.9/plugins/.nmv @@ -0,0 +1,174 @@ +#!/usr/bin/env bash + +# Description: An almost fully POSIX compliant batch file renamer +# +# Note: nnn auto-detects and invokes this plugin if available +# Whitespace is used as delimiter for read. +# The plugin doesn't support filenames with leading or trailing whitespace +# To use NNN_LIST your shell must support readlink(1) +# +# Capabilities: +# 1. Basic file rename +# 2. Detects order change +# 3. Can move files +# 4. Can remove files +# 5. Switch number pairs to swap filenames +# +# Shell: bash +# Author: KlzXS + +# shellcheck disable=SC1090,SC1091 +. "$(dirname "$0")"/.nnn-plugin-helper + +EDITOR="${EDITOR:-vi}" +TMPDIR="${TMPDIR:-/tmp}" +NNN_INCLUDE_HIDDEN="${NNN_INCLUDE_HIDDEN:-0}" +VERBOSE="${VERBOSE:-0}" +RECURSIVE="${RECURSIVE:-0}" + +case "$NNN_TRASH" in + 1) + RM_UTIL="trash-put" ;; + 2) + RM_UTIL="gio trash" ;; + *) + RM_UTIL="rm -ri" ;; +esac + +exit_status=0 + +if nnn_use_selection "Rename"; then + # shellcheck disable=SC2154 + arr=$(tr '\0' '\n' < "$selection") +else + findcmd="find . ! -name ." + + if [ "$RECURSIVE" -eq 0 ]; then + findcmd="$findcmd -prune" + fi + + if [ "$NNN_INCLUDE_HIDDEN" -eq 0 ]; then + findcmd="$findcmd ! -name \".*\"" + fi + + if [ -z "$NNN_LIST" ]; then + findcmd="$findcmd -print" + else + findcmd="$findcmd -printf "'"'"$NNN_LIST/%P\n"'"' + fi + + arr=$(eval "$findcmd" | sort) +fi + +lines=$(printf "%s\n" "$arr" | wc -l) +width=${#lines} + +dst_file=$(mktemp "$TMPDIR/.nnnXXXXXX") +trap 'rm -f "$dst_file"' EXIT + +printf "%s" "$arr" | awk '{printf("%'"${width}"'d %s\n", NR, $0)}' > "$dst_file" + +items=("~") +while IFS='' read -r line; do + if [ -n "$NNN_LIST" ]; then + line=$(readlink "$line" || printf "%s" "$line") + fi + + items+=("$line"); +done < <(printf "%s\n" "$arr") + +$EDITOR "$dst_file" + +while read -r num name; do + if [ -z "$name" ]; then + if [ -z "$num" ]; then + continue + fi + + printf "%s: unable to parse line, aborting\n" "$0" + exit 1 + fi + + # check if $num is an integer + if [ ! "$num" -eq "$num" ] 2> /dev/null; then + printf "%s: unable to parse line, aborting\n" "$0" + exit 1 + fi + + src=${items[$num]} + + if [ -z "$src" ]; then + printf "%s: unknown item number %s\n" "$0" "$num" > /dev/stderr + continue + elif [ "$name" != "$src" ]; then + if [ -z "$name" ]; then + continue + fi + + if [ ! -e "$src" ] && [ ! -L "$src" ]; then + printf "%s: %s does not exit\n" "$0" "$src" > /dev/stderr + + unset "items[$num]" + continue + fi + + # handle swaps + if [ -e "$name" ] || [ -L "$name" ]; then + tmp="$name~" + c=0 + + while [ -e "$tmp" ] || [ -L "$tmp" ]; do + c=$((c+1)) + tmp="$tmp~$c" + done + + if mv "$name" "$tmp"; then + if [ "$VERBOSE" -ne 0 ]; then + printf "'%s' -> '%s'\n" "$name" "$tmp" + fi + else + printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr + exit_status=1 + fi + + for key in "${!items[@]}"; do + if [ "${items[$key]}" = "$name" ]; then + items[$key]="$tmp" + fi + done + fi + + dir=$(dirname "$name") + if [ ! -d "$dir" ] && ! mkdir -p "$dir"; then + printf "%s: failed to create directory tree %s\n" "$0" "$dir" > /dev/stderr + exit_status=1 + elif ! mv -i "$src" "$name"; then + printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr + exit_status=1 + else + if [ -d "$name" ]; then + for key in "${!items[@]}"; do + items[$key]=$(printf "%s" "${items[$key]}" | sed "s|^$src\(\$\|\/\)|$name\1|") + done + + if [ "$VERBOSE" -ne 0 ]; then + printf "'%s' => '%s'\n" "$src" "$name" + fi + else + true + if [ "$VERBOSE" -ne 0 ]; then + printf "'%s' -> '%s'\n" "$src" "$name" + fi + fi + fi + fi + + unset "items[$num]" +done <"$dst_file" + +unset "items[0]" +for item in "${items[@]}"; do + $RM_UTIL "$item" +done + +exit $exit_status diff --git a/nnn-4.9/plugins/.nnn-plugin-helper b/nnn-4.9/plugins/.nnn-plugin-helper @@ -0,0 +1,61 @@ +#!/usr/bin/env sh + +# Description: Helper script for plugins +# +# Shell: POSIX compliant +# Author: Anna Arad + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +export selection + +## Set CUR_CTX to 1 to open directory in current context +CUR_CTX=0 +export CUR_CTX + +NNN_PREFER_SELECTION="${NNN_PREFER_SELECTION:-0}" +export NNN_PREFER_SELECTION + +## Ask nnn to switch to directory $1 in context $2. +## If $2 is not provided, the function asks explicitly. +nnn_cd () { + dir="$1" + + if [ -z "$NNN_PIPE" ]; then + echo "No pipe file found" 1>&2 + return + fi + + if [ -n "$2" ]; then + context=$2 + elif [ $CUR_CTX -ne 1 ]; then + printf "Choose context 1-4 (blank for current): " + read -r context + fi + + printf "%s" "${context:-0}c$dir" > "$NNN_PIPE" +} + +cmd_exists () { + type "$1" > /dev/null 2>&1 + echo $? +} + +nnn_use_selection() { + if ! [ -s "$selection" ]; then + return 1 + fi + + if [ "$NNN_PREFER_SELECTION" -eq 1 ]; then + return 0 + else + [ -n "$1" ] && printf "%s " "$1" + printf "(s)election/(c)urrent? [default=c] " + read -r resp__ + + if [ "$resp__" = "s" ]; then + return 0 + else + return 1 + fi + fi +} diff --git a/nnn-4.9/plugins/.ntfy b/nnn-4.9/plugins/.ntfy @@ -0,0 +1,22 @@ +#!/usr/bin/env sh + +# Description: Show a notification +# +# Details: nnn invokes this plugin to show notification when a cp/mv/rm operation is complete. +# +# Dependencies: notify-send (Ubuntu)/ntfy (https://github.com/dschep/ntfy)/osascript (macOS)/notify (Haiku) +# +# Shell: POSIX compliant +# Author: Anna Arad + +OS="$(uname)" + +if type notify-send >/dev/null 2>&1; then + notify-send nnn "Done!" +elif [ "$OS" = "Darwin" ]; then + osascript -e 'display notification "Done!" with title "nnn"' +elif type ntfy >/dev/null 2>&1; then + ntfy -t nnn send "Done!" +elif [ "$OS" = "Haiku" ]; then + notify --title "nnn" "Done!" +fi diff --git a/nnn-4.9/plugins/README.md b/nnn-4.9/plugins/README.md @@ -0,0 +1,377 @@ +<h1 align="center">nnn plugins</h1> + +<p align="center"><img src="https://i.imgur.com/SpT0L2W.png" /></p> +<p align="center"><i>read ebooks with plugin gutenread (Android)</i></p> + +## Introduction + +Plugins extend the capabilities of `nnn`. They are _executable_ scripts (or binaries) `nnn` can communicate with and trigger. This mechanism fits perfectly with the fundamental design to keep the core file manager lean and fast, by delegating repetitive (but not necessarily file manager-specific) tasks to the plugins which can be run with custom hotkeys. + +`nnn` is _**language-agnostic**_ when it comes to plugins. You can write a plugin in any (scripting) language you are comfortable in! + +## List of plugins + +| Plugin (a-z) | Description [Clears selection<sup>1</sup>] | Lang | Dependencies | +| --- | --- | --- | --- | +| [autojump](autojump) | Navigate to dir/path | sh | [jump](https://github.com/gsamokovarov/jump)/autojump/<br>zoxide/z/[z.lua](https://github.com/skywind3000/z.lua) | +| [boom](boom) | Play random music from dir | sh | [moc](http://moc.daper.net/) | +| [bulknew](bulknew) | Create multiple files/dirs at once | bash | sed, xargs, mktemp | +| [cdpath](cdpath) | `cd` to the directory from `CDPATH` | sh | fzf | +| [chksum](chksum) | Create and verify checksums [✓] | sh | md5sum,<br>sha256sum | +| [cmusq](cmusq) | Queue/play files/dirs in cmus player [✓] | sh | cmus, pgrep | +| [diffs](diffs) | Diff for selection (limited to 2 for directories) [✓] | sh | vimdiff, mktemp | +| [dragdrop](dragdrop) | Drag/drop files from/into nnn | sh | [dragon](https://github.com/mwh/dragon) | +| [dups](dups) | List non-empty duplicate files in current dir | bash | find, md5sum,<br>sort uniq xargs | +| [finder](finder) | Run custom find command (**stored in histfile**) and list | sh | - | +| [fixname](fixname) | Clean filename to be more shell-friendly [✓] | bash | sed | +| [fzcd](fzcd) | Fuzzy search multiple dirs (or `$PWD`) and visit file | sh | fzf, (find) | +| [fzhist](fzhist) | Fuzzy-select a cmd from history, edit in `$EDITOR` and run | sh | fzf, mktemp | +| [fzopen](fzopen) | Fuzzy find file(s) in subtree to edit/open/pick | sh | fzf, xdg-open/open | +| [fzplug](fzplug) | Fuzzy find, preview and run other plugins | sh | fzf | +| [getplugs](getplugs) | Update plugins to installed `nnn` version | sh | curl | +| [gitroot](gitroot) | Cd to the root of current git repo | sh | git | +| [gpge](gpge) | Encrypt/decrypt files using GPG [✓] | sh | gpg | +| [gutenread](gutenread) | Browse, download, read from Project Gutenberg | sh | curl, unzip, w3m<br>[epr](https://github.com/wustho/epr) (optional) | +| [gsconnect](gsconnect) | GNOME's implementation of kdeconnect [✓] | sh | gsconnect | +| [imgresize](imgresize) | Batch resize images in dir to screen resolution | sh | [imgp](https://github.com/jarun/imgp) | +| [imgur](imgur) | Upload an image to imgur (from [imgur-screenshot](https://github.com/jomo/imgur-screenshot)) | bash | - | +| [imgview](imgview) | View (thumbnail)images, set wallpaper, [rename](https://github.com/jarun/nnn/wiki/Basic-use-cases#browse-rename-images) and [more](https://wiki.archlinux.org/index.php/Sxiv#Assigning_keyboard_shortcuts)| sh | _see in-file docs_ | +| [ipinfo](ipinfo) | Fetch external IP address and whois information | sh | curl, whois | +| [kdeconnect](kdeconnect) | Send selected files to an Android device [✓] | sh | kdeconnect-cli | +| [launch](launch) | GUI application launcher | sh | fzf | +| [mimelist](mimelist) | List files by mime in subtree | sh | - | +| [moclyrics](moclyrics) | Show lyrics of the track playing in moc | sh | [ddgr](https://github.com/jarun/ddgr), [moc](http://moc.daper.net/) | +| [mocq](mocq) | Queue/play selection/dir/file in moc [✓] | sh | [moc](http://moc.daper.net/) | +| [mp3conv](mp3conv) | Extract audio from multimedia as mp3 | sh | ffmpeg | +| [mtpmount](mtpmount) | Toggle mount of MTP device (eg. Android) | sh | gvfs-mtp | +| [nbak](nbak) | Backs up `nnn` config | sh | tar, awk, mktemp | +| [nmount](nmount) | Toggle mount status of a device as normal user | sh | pmount (optional), udisks2 | +| [nuke](nuke) | Sample file opener (CLI-only by default) | sh | _see in-file docs_ | +| [oldbigfile](oldbigfile) | List large files by access time | sh | find, sort | +| [openall](openall) | Open selected files together or one by one [✓] | bash | - | +| [organize](organize) | Auto-organize files in directories by file type [✓] | sh | file | +| [pdfread](pdfread) | Read a PDF or text file aloud | sh | pdftotext, mpv,<br>pico2wave | +| [preview-tabbed](preview-tabbed) | Preview files with Tabbed/xembed | bash | _see in-file docs_ | +| [preview-tui](preview-tui) | Preview with Tmux/kitty/[QuickLook](https://github.com/QL-Win/QuickLook)/xterm/`$TERMINAL` | sh | _see in-file docs_ | +| [pskill](pskill) | Fuzzy list by name and kill process or zombie | sh | fzf, ps, sudo/doas | +| [renamer](renamer) | Batch rename selection or files in dir [✓] | sh | [qmv](https://www.nongnu.org/renameutils/)/[vidir](https://joeyh.name/code/moreutils/) | +| [ringtone](ringtone) | Create a variable bitrate mp3 ringtone from file | sh | date, ffmpeg | +| [rsynccp](rsynccp) | Gives copy-paste verbose progress percentage [✓] | sh | rsync | +| [splitjoin](splitjoin) | Split file or join selection [✓] | sh | split, cat | +| [suedit](suedit) | Edit file using superuser permissions | sh | sudoedit/sudo/doas | +| [togglex](togglex) | Toggle executable mode for selection [✓] | sh | chmod | +| [umounttree](umounttree) | Unmount a remote mountpoint from within | sh | fusermount | +| [upload](upload) | Upload to Firefox Send or ix.io (text) or file.io (bin) | sh | [ffsend](https://github.com/timvisee/ffsend), curl, jq, tr | +| [wallpaper](wallpaper) | Set wallpaper or change colorscheme | sh | nitrogen/pywal | +| [x2sel](x2sel) | Copy file list from system clipboard to selection | sh | _see in-file docs_ | +| [xdgdefault](xdgdefault) | Set the default app for the hovered file type | sh | xdg-utils, fzf/dmenu | + +Notes: + +1. A plugin has to explicitly request `nnn` to clear the selection e.g. after operating on the selected files. +2. Files starting with a dot in the `plugins` directory are internal files and should not be used as plugins. + +### Table of contents + +- [Installation](#installation) +- [Configuration](#configuration) + - [Skip directory refresh after running a plugin](#skip-directory-refresh-after-running-a-plugin--) +- [Running commands as plugin](#running-commands-as-plugin-) + - [Skip user confirmation after command execution](#skip-user-confirmation-after-command-execution-) + - [Run a GUI app as plugin](#run-a-gui-app-as-plugin-) + - [Page non-interactive command output](#page-non-interactive-command-output-) + - [Some useful key-command examples](#some-useful-key-command-examples) +- [Access level of plugins](#access-level-of-plugins) +- [Create your own plugins](#create-your-own-plugins) + - [Send data to `nnn`](#send-data-to-nnn) + - [Get notified on file hover](#get-notified-on-file-hover) +- [Examples](#examples) +- [Contributing plugins](#contributing-plugins) + +## Installation + +The following command installs or updates (after backup) all plugins: + +```sh +sh -c "$(curl -Ls https://raw.githubusercontent.com/jarun/nnn/master/plugins/getplugs)" +``` + +Plugins are installed to `${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins`. + +## Configuration + +Set environment variable `NNN_PLUG` to assign keybinds and invoke plugins directly using the plugin shortcut (<kbd>;</kbd>) followed by the assigned key character. E.g., with the below config: + +```sh +export NNN_PLUG='f:finder;o:fzopen;p:mocq;d:diffs;t:nmount;v:imgview' +``` + +plugin `finder` can be invoked with the keybind <kbd>;f</kbd>, `fzopen` can be run with <kbd>;o</kbd> and so on... The key vs. plugin pairs are shown in the help and config screen. + +Alternatively, combine with <kbd>Alt</kbd> (i.e. <kbd>Alt+key</kbd>). + +To pick and run an unassigned plugin, press <kbd>Enter</kbd> (to _enter_ the plugin dir) at the plugin prompt. + +To run a plugin at startup, use the option `-P` followed by the plugin key. + +If the plugins list gets too long, try breaking them up into sections: + +``` +NNN_PLUG_PERSONAL='g:personal/convert2zoom;p:personal/echo' +NNN_PLUG_WORK='j:work/prettyjson;d:work/foobar' +NNN_PLUG_INLINE='e:!go run "$nnn"*' +NNN_PLUG_DEFAULT='1:ipinfo;p:preview-tui;o:fzz;b:nbak' +NNN_PLUG="$NNN_PLUG_PERSONAL;$NNN_PLUG_WORK;$NNN_PLUG_DEFAULT;$NNN_PLUG_INLINE" +export NNN_PLUG +``` + +Note: +- `'g:personal/convert2zoom'` will look in the personal sub-folder inside the plugin folder. +- `'b:boom;b:bulknew` will result in only the first definition of *b* (`b:boom`) being used. +- A keybinding definition of more than 1 character will prevent nnn from starting. + + +#### Skip directory refresh after running a plugin [`-`] + +`nnn` refreshes the directory after running a plugin to reflect any changes by the plugin. To disable this add a `-` before the plugin name: + +```sh +export NNN_PLUG='p:-plugin' +``` + +## Running commands as plugin [`!`] + +To assign keys to arbitrary non-background cli commands and invoke like plugins, add `!` before the command. + +```sh +export NNN_PLUG='x:!chmod +x "$nnn";g:!git log;s:!smplayer "$nnn"' +``` + +Now <kbd>;x</kbd> can be used to make a file executable, <kbd>;g</kbd> can be used to the git log of a git project directory, <kbd>;s</kbd> can be used to preview a partially downloaded media file. + +#### Skip user confirmation after command execution [`*`] + +`nnn` waits for user confirmation (the prompt `Press Enter to continue`) after it executes a command as plugin (unlike plugins which can add a `read` to wait). To skip this, add a `*` after the command. + +```sh +export NNN_PLUG='s:!smplayer "$nnn"*;n:-!vim /home/vaio/Dropbox/Public/synced_note*' +``` + +Now there will be no prompt after <kbd>;s</kbd> and <kbd>;n</kbd>. + +Note: Do not use `*` with programs that run and exit e.g. cat. + +#### Run a GUI app as plugin [`&`] + +To run a GUI app as plugin, add a `&` after `!`. + +```sh +export NNN_PLUG='m:-!&mousepad "$nnn"' +``` + +#### Page non-interactive command output [`|`] + +To show the output of run-and-exit commands which do not need user input, add `|` (pipe) after `!`. + +```sh +export NNN_PLUG='m:-!|mediainfo "$nnn";t:-!|tree -ps;l:-!|ls -lah --group-directories-first' +``` + +This option is incompatible with `&` (terminal output is masked for GUI programs) and ignores `*` (output is already paged for user). + +Notes: +1. Place `$nnn` (or exported variables) in double quotes (**`"$nnn"`**) +2. Use single quotes for `$NNN_PLUG` so `"$nnn"` is not interpreted +3. (_Again_) add `!` before the command +4. To disable directory refresh after running a _command as plugin_, prefix with `-!` + +#### Some useful key-command examples + +| Key:Command | Description | +|---|---| +| `c:!convert "$nnn" png:- \| xclip -sel clipboard -t image/png*` | Copy image to clipboard | +| `C:!cp -rv "$nnn" "$nnn".cp` | Create a copy of the hovered file | +| `e:-!sudo -E vim "$nnn"*` | Edit file as root in vim | +| `g:-!git diff` | Show git diff | +| `h:-!hx "$nnn"*` | Open hovered file in [hx](https://github.com/krpors/hx) hex editor | +| `k:-!fuser -kiv "$nnn"*` | Interactively kill process(es) using hovered file | +| `l:-!git log` | Show git log | +| `n:-!vi /home/user/Dropbox/dir/note*` | Take quick notes in a synced file/dir of notes | +| `p:-!less -iR "$nnn"*` | Page through hovered file in less | +| `s:-!&smplayer -minigui "$nnn"` | Play hovered media file, even unfinished download | +| `x:!chmod +x "$nnn"` | Make the hovered file executable | +| `y:-!sync*` | Flush cached writes | + +## Access level of plugins + +When `nnn` executes a plugin, it does the following: +- Changes to the directory where the plugin is to be run (`$PWD` pointing to the active directory) +- Passes three arguments to the script: + 1. `$1`: The hovered file's name. + 2. `$2`: The working directory (might differ from `$PWD` in case of symlinked paths; non-canonical). + 3. `$3`: The picker mode output file (`-` for stdout) if `nnn` is executed as a file picker. +- Sets the environment variable `NNN_PIPE` used to control `nnn` active directory. +- Sets the environment variable `NNN_INCLUDE_HIDDEN` to `1` if hidden files are active, `0` otherwise. +- Sets the environment variable `NNN_PREFER_SELECTION` to `1` if user prefers to use selection (see nnn's `-u` flag), `0` otherwise. +- Exports the [special variables](https://github.com/jarun/nnn/wiki/Concepts#special-variables). + +Plugins can also read the `.selection` file in the config directory. + +## Create your own plugins + +Plugins can be written in any scripting language. However, POSIX-compliant shell scripts runnable in `sh` are preferred. + +**Make the file executable**. Drop it in the plugin directory. Optionally add a hotkey in `$NNN_PLUG` for frequent usage. + +#### Send data to `nnn` +`nnn` provides a mechanism for plugins to send data to `nnn` to control its active directory or invoke the list mode. +The way to do so is by writing to the pipe pointed by the environment variable `NNN_PIPE`. +The plugin should write a single string in the format `(<->)<ctxcode><opcode><data>` without a newline at the end. For example, `1c/etc`. + +The optional `-` at the **beginning of the stream** instructs `nnn` to clear the selection. +In cases where the data transfer to `nnn` has to happen while the selection file is being read (e.g. in a loop), the plugin should +create a tmp copy of the selection file, inform `nnn` to clear the selection and then do the subsequent processing with the tmp file. +A paged [`|`] or GUI [`&`] cmd run as plugin cannot clear selection. + +The `ctxcode` indicates the context to change the active directory of. + +| Context code | Meaning | +|:---:| --- | +| `+` | smart context (next inactive else current) | +| `0` | current context | +| `1`-`4` | context number | + +The `opcode` indicates the operation type. + +| Opcode | Operation | +|:---:| --- | +| `c` | change directory | +| `l` | list files in list mode | +| `p` | picker file overwritten | + +For convenience, we provided a helper script named `.nnn-plugin-helper` and a function named `nnn_cd` to ease this process. `nnn_cd` receives the path to change to as the first argument, and the context as an optional second argument. +If a context is not provided, it is asked for explicitly. To skip this and choose the current context, set the `CUR_CTX` variable in `.nnn-plugin-helper` (or in the specific plugin after sourcing `.nnn-plugin-helper`) to 1. +Usage examples can be found in the Examples section below. + +#### Get notified on file hover + +If `NNN_FIFO` is set, `nnn` will open it and write every hovered files. This can be used in plugins and external scripts, e.g. to implement file previews. + +Don't forget to fork in the background to avoid blocking `nnn`. + +For more details on configuration and usage of the preview plugins, visit [Live Previews](https://github.com/jarun/nnn/wiki/Live-previews). + +## Examples + +There are many plugins provided by `nnn` which can be used as examples. Here are a few simple selected examples. + +#### Show the git log of changes to the particular file along with the code for a quick and easy review. + +```sh +#!/usr/bin/env sh + +git log -p -- "$1" +``` + +#### Change to directory in clipboard using helper script + +```sh +#!/usr/bin/env sh + +. $(dirname $0)/.nnn-plugin-helper + +nnn_cd "$(xsel -ob)" +``` + +#### Change directory to the location of a link using helper script with specific context (current) + +```sh +#!/usr/bin/env sh + +. $(dirname $0)/.nnn-plugin-helper + +nnn_cd "$(dirname $(readlink -fn $1))" 0 +``` + +#### Change to arbitrary directory without helper script + +```sh +#!/usr/bin/env sh + +printf "cd to: " +read -r dir + +printf "%s" "0c$dir" > "$NNN_PIPE" +``` + +#### Send every hovered file to X selection + +```sh +#!/usr/bin/env sh + +if [ -z "$NNN_FIFO" ] ; then + exit 1 +fi + +while read FILE ; do + printf "%s" "$FILE" | xsel +done < "$NNN_FIFO" & +disown +``` + +#### Quick `find` the first match in subtree and open in `nuke` + +```sh +#!/usr/bin/env sh + +NUKE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke" + +printf "file name: " +read -r pattern + +entry=$(find . -type f -iname "$pattern" -print -quit 2>/dev/null) + +if [ -n "$entry" ]; then + "$NUKE" "$entry" +fi +``` + +#### Quick find (using `fd`) + +```sh +#!/usr/bin/env sh + +. "$(dirname "$0")"/.nnn-plugin-helper + +printf "pattern: " +read -r pattern + +if [ -n "$pattern" ]; then + printf "%s" "+l" > "$NNN_PIPE" + eval "fd -HI $pattern -0" > "$NNN_PIPE" +fi +``` + +#### Quick grep (using `rg`) + +```sh +#!/usr/bin/env sh + +. "$(dirname "$0")"/.nnn-plugin-helper + +printf "pattern: " +read -r pattern + +if [ -n "$pattern" ]; then + printf "%s" "+l" > "$NNN_PIPE" + eval "rg -l0 --hidden -S $pattern" > "$NNN_PIPE" +fi +``` + +## Contributing plugins + +1. Add informative sections like _Description_, _Notes_, _Dependencies_, _Shell_, _Author_ etc. in the plugin. +2. Add an entry in the table above. Note that the list is alphabetically ordered by plugin name. +3. Keep non-portable commands (like `notify-send`) commented so users from any other OS/DE aren't surprised. +4. The plugin file should be executable. +5. If your plugin stores data, use `${XDG_CACHE_HOME:-$HOME/.cache}/nnn`. Document it _in-file_. diff --git a/nnn-4.9/plugins/autojump b/nnn-4.9/plugins/autojump @@ -0,0 +1,74 @@ +#!/usr/bin/env sh + +# Description: Navigate to directory using jump/autojump/zoxide/z +# +# Dependencies: +# - jump - https://github.com/gsamokovarov/jump +# - OR autojump - https://github.com/wting/autojump +# - OR zoxide - https://github.com/ajeetdsouza/zoxide +# - OR z - https://github.com/rupa/z (z requires fzf) +# - OR z (fish) - https://github.com/jethrokuan/z (z requires fzf) +# - OR z.lua - https://github.com/skywind3000/z.lua (z.lua can enhanced with fzf) +# +# Note: The dependencies STORE NAVIGATION PATTERNS +# +# to make z.lua work, you need to set $NNN_ZLUA to the path of script z.lua +# +# Shell: POSIX compliant +# Authors: Marty Buchaus, Dave Snider, Tim Adler, Nick Waywood + +if [ ! -p "$NNN_PIPE" ]; then + printf 'ERROR: NNN_PIPE is not set!' + read -r _ + exit 2 +fi + +if type jump >/dev/null 2>&1; then + printf "jump to : " + IFS= read -r line + # shellcheck disable=SC2086 + odir="$(jump cd ${line})" + printf "%s" "0c$odir" > "$NNN_PIPE" +elif type autojump >/dev/null 2>&1; then + printf "jump to : " + read -r dir + odir="$(autojump "$dir")" + printf "%s" "0c$odir" > "$NNN_PIPE" +elif type zoxide >/dev/null 2>&1; then + if type fzf >/dev/null 2>&1; then + odir="$(zoxide query -i --)" + printf "%s" "0c$odir" > "$NNN_PIPE" + else + printf "jump to : " + read -r dir + odir="$(zoxide query -- "$dir")" + printf "%s" "0c$odir" > "$NNN_PIPE" + fi +elif type lua >/dev/null 2>&1 && [ -n "$NNN_ZLUA" ]; then + printf "jump to : " + read -r line + if type fzf >/dev/null 2>&1; then + odir="$(lua "$NNN_ZLUA" -l "$line" | fzf --nth 2.. --reverse --inline-info --tac +s -e --height 35%)" + printf "%s" "0c$(echo "$odir" | awk '{print $2}')" > "$NNN_PIPE" + else + odir="$(lua "$NNN_ZLUA" -e "$line")" + printf "%s" "0c$odir" > "$NNN_PIPE" + fi +else + # rupa/z uses $_Z_DATA, jethrokuan/z (=port of z for fish) uses $Z_DATA + datafile="${_Z_DATA:-${Z_DATA:-$HOME/.z}}" + if type fzf >/dev/null 2>&1 && [ -f "$datafile" ]; then + # Read the data from z's file instead of calling + # z so the data doesn't need to be processed twice + sel=$(awk -F "|" '{print $1}' "$datafile" | fzf | awk '{$1=$1};1') + + # NOTE: Uncomment this line and comment out the line above if + # you want to see the weightings of the dir's in the fzf pane + # sel=$(awk -F "|" '{printf "%s %s\n", $2, $1}' "$datafile" | fzf | sed 's/^[0-9,.]* *//' | awk '{$1=$1};1') + + printf "%s" "0c$sel" > "$NNN_PIPE" + else + printf "No supported autojump script [jump/autojump/zoxide/z (needs fzf)] found" + read -r _ + fi +fi diff --git a/nnn-4.9/plugins/boom b/nnn-4.9/plugins/boom @@ -0,0 +1,50 @@ +#!/usr/bin/env sh + +# Description: Play random music (MP3, FLAC, M4A, WEBM, WMA) from current dir. +# +# Dependencies: mocp (or custom) +# +# Note: You may want to set GUIPLAYER. +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +GUIPLAYER="${GUIPLAYER:-""}" +NUMTRACKS="${NUMTRACKS:-100}" + +if [ -n "$GUIPLAYER" ]; then + find . -type f \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.m4a" -o -iname "*.webm" -o -iname "*.wma" \) | shuf -n "$NUMTRACKS" | xargs -d "\n" "$GUIPLAYER" > /dev/null 2>&1 & + + # detach the player + sleep 1 +elif type mocp >/dev/null 2>&1; then + cmd=$(pgrep -x mocp 2>/dev/null) + ret=$cmd + + if [ -z "$ret" ]; then + # start MOC server + mocp -S + mocp -o shuffle + else + # mocp running, check if it's playing + state=$(mocp -i | grep "State:" | cut -d' ' -f2) + if [ "$state" = 'PLAY' ]; then + # add up to 100 random audio files + find . -type f \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.m4a" -o -iname "*.webm" -o -iname "*.wma" \) | head -n "$NUMTRACKS" | xargs -d "\n" mocp -a + exit + fi + fi + + # clear MOC playlist + mocp -c + mocp -o shuffle + + # add up to 100 random audio files + find . -type f \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.m4a" -o -iname "*.webm" -o -iname "*.wma" \) | head -n "$NUMTRACKS" | xargs -d "\n" mocp -a + + # start playing + mocp -p +else + printf "moc missing" + read -r _ +fi diff --git a/nnn-4.9/plugins/bulknew b/nnn-4.9/plugins/bulknew @@ -0,0 +1,32 @@ +#!/usr/bin/env sh + +# Description: Allows for creation of multiple files/dirs simultaneously +# Creates a tmp file to write each entry in a separate line +# +# Note: Only relative paths are supported. Absolute paths are ignored +# Leading and trailing whitespace in path names is also ignored +# +# Shell: POSIX compliant +# Author: KlzXS + +EDITOR="${EDITOR:-vi}" +TMPDIR="${TMPDIR:-/tmp}" + +printf "'f'ile / 'd'ir? " +read -r resp + +if [ "$resp" = "f" ]; then + #shellcheck disable=SC2016 + cmd='mkdir -p "$(dirname "{}")" && touch "{}"' +elif [ "$resp" = "d" ]; then + cmd='mkdir -p {}' +else + exit 1 +fi + +tmpfile=$(mktemp "$TMPDIR/.nnnXXXXXX") +$EDITOR "$tmpfile" + +sed "/^\//d" "$tmpfile" | xargs -n1 -I{} sh -c "$cmd" + +rm "$tmpfile" diff --git a/nnn-4.9/plugins/cdpath b/nnn-4.9/plugins/cdpath @@ -0,0 +1,56 @@ +#!/usr/bin/env sh + +# Description: 'cd' to the directory from CDPATH +# +# Details: If the CDPATH environment variable is not set, the default value of +# ${XDG_CONFIG_HOME:-$HOME/.config}/nnn/bookmarks will be used. +# You can create this directory and fill it with symbolic links to your +# favorite directories. It's a good idea to add it to CDPATH so that it +# could also be used from the command line outside of nnn. +# The fzf search is done on the directory basename (the first column). +# +# This plugin is an extended version of the bookmarks plugin. +# If you set your CDPATH to ${XDG_CACHE_HOME:-$HOME/.cache}/nnn/bookmarks +# or to the value of BOOKMARKS_DIR, you can use it as a bookmarks replacement. +# +# Shell: POSIX compliant +# Author: Yuri Kloubakov + +# shellcheck disable=SC1090,SC1091 +. "$(dirname "$0")"/.nnn-plugin-helper + +# Get a list of (symbolic links to) directories for every element of CDPATH +get_dirs() { + IFS=':' + for path in $CDPATH; do + for entry in "$path"/*; do + if [ -d "$entry" ]; then + name=$(basename "$entry" | grep -o '^.\{1,24\}') + if [ -h "$entry" ]; then + slink=$(ls -dl -- "$entry") + entry=${slink#*" $entry -> "} + fi + printf "%-24s :%s\n" "${name}" "$entry" + fi + done + done +} + +abort() { + echo "$1" + read -r _ + exit 1 +} + +if [ -z "$CDPATH" ]; then + CDPATH="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/bookmarks" + [ -d "$CDPATH" ] || abort "CDPATH is not set and there is no \"$CDPATH\" directory" +fi + +dir_list=$(get_dirs) +[ -n "$dir_list" ] || abort "There are no directories to choose from. Check your \"$CDPATH\"." + +dir=$(echo "$dir_list" | fzf --nth=1 --delimiter=':' | awk -F: 'END { print $2 }') +if [ -n "$dir" ]; then + nnn_cd "$dir" 0 +fi diff --git a/nnn-4.9/plugins/chksum b/nnn-4.9/plugins/chksum @@ -0,0 +1,75 @@ +#!/usr/bin/env sh + +# Description: Create and verify checksums +# +# Note: On macOS, install the relevant checksum packages from Homebrew with: +# brew install coreutils +# +# Details: +# - selection: it will generate one file with the checksums and filenames +# (and with paths if they are in another directory) +# output checksum filename format: checksum_timestamp.checksum_type +# - file: if the file is a checksum, the plugin does the verification +# if the file is not a checksum, checksum will be generated for it +# the output checksum filename will be filename.checksum_type +# - directory: recursively calculates checksum for all the files in the dir +# the output checksum filename will be directory.checksum_type +# +# Shell: POSIX compliant +# Authors: ath3, Arun Prakash Jana + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +resp=f +chsum=md5 + +checksum_type() +{ + echo "possible checksums: md5, sha1, sha224, sha256, sha384, sha512" + printf "create md5 (m), sha256 (s), sha512 (S) (or type one of the above checksums) [default=m]: " + read -r chsum_resp + for chks in md5 sha1 sha224 sha256 sha384 sha512 + do + if [ "$chsum_resp" = "$chks" ]; then + chsum=$chsum_resp + return + fi + done + if [ "$chsum_resp" = "s" ]; then + chsum=sha256 + elif [ "$chsum_resp" = "S" ]; then + chsum=sha512 + fi +} + +if [ -s "$selection" ]; then + printf "work with selection (s) or current file (f) [default=f]: " + read -r resp +fi + +if [ "$resp" = "s" ]; then + checksum_type + sed 's|'"$PWD/"'||g' < "$selection" | xargs -0 -I{} ${chsum}sum {} > "checksum_$(date '+%Y%m%d%H%M').$chsum" + + # Clear selection + if [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" + fi +elif [ -n "$1" ]; then + if [ -f "$1" ]; then + for chks in md5 sha1 sha224 sha256 sha384 sha512 + do + if echo "$1" | grep -q \.${chks}$; then + ${chks}sum -c < "$1" + read -r _ + exit + fi + done + checksum_type + file=$(basename "$1").$chsum + ${chsum}sum "$1" > "$file" + elif [ -d "$1" ]; then + checksum_type + file=$(basename "$1").$chsum + find "$1" -type f -exec ${chsum}sum "{}" + > "$file" + fi +fi diff --git a/nnn-4.9/plugins/cmusq b/nnn-4.9/plugins/cmusq @@ -0,0 +1,80 @@ +#!/usr/bin/env sh + +# Description: Add selection or hovered file/directory to cmus queue +# +# Dependencies: cmus, pgrep, xdotool (optional) +# +# Notes: +# 1. If adding selection, files/dirs are added in the same order they were selected in nnn +# 2. A new window will be opened if cmus is not running already, playback will start immediately +# 3. If cmus is already running, files will be appended to the queue with no forced playback +# +# TODO: +# 1. Add cava and cmus-lyrics as optional dependencies +# 2. Start cava and/or cmus-lyrics in tmux or kitty panes next to cmus +# +# Shell: POSIX compliant +# Author: Kabouik + +# (Optional) Set preferred terminal emulator for cmus if not set in your env, +# or leave commented out to use OS default +#TERMINAL="kitty" + +if ! type cmus >/dev/null; then + printf "cmus missing" + read -r _ + exit 1 +fi + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +start_cmus() { + type xdotool >/dev/null && nnnwindow="$(xdotool getactivewindow)" + case "$TERMINAL" in + kitty | gnome-terminal | st) + nohup "$TERMINAL" -- cmus & ;; + havoc) + nohup "$TERMINAL" cmus & ;; + "") + nohup x-terminal-emulator -e cmus & ;; + *) + nohup "$TERMINAL" -e cmus & ;; + esac + # Give the new terminal some time to open + until cmus-remote -C; do sleep 0.1; done + [ -n "$nnnwindow" ] && xdotool windowactivate "$nnnwindow" +} >/dev/null 2>&1 + +fill_queue() { + if [ "$REPLY" = "s" ]; then + xargs < "$selection" -0 cmus-remote -q + elif [ -n "$1" ]; then + cmus-remote -q "$1" + fi +} + +# If active selection,then ask what to do +if [ -s "$selection" ]; then + printf "Queue [s]election or [c]urrently hovered? [default=c]: " + read -r REPLY +fi + +# If cmus is not running, start and play queue +if ! pgrep cmus >/dev/null; then + printf "cmus is not running, starting it in a new %s window.\n" "$TERMINAL" + start_cmus + fill_queue "$1" + cmus-remote -p + printf "Files added to cmus queue.\n" +else # Append to existing queue if cmus is already running + fill_queue "$1" + printf "Files appended to current cmus queue.\n" +fi + +# Change view +cmus-remote -C "view 4" + +# Clear selection +if [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" +fi diff --git a/nnn-4.9/plugins/diffs b/nnn-4.9/plugins/diffs @@ -0,0 +1,62 @@ +#!/usr/bin/env sh + +# Description: Show diff of 2 directories or multiple files in vimdiff +# +# Notes: +# 1. vim may show the warning: 'Vim: Warning: Input is not from a terminal' +# press 'Enter' to ignore and proceed. +# 2. if only one file is in selection, the hovered file is considered as the +# second file to diff with +# +# Shell: POSIX compliant +# Authors: Arun Prakash Jana, ath3 + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +if type nvim >/dev/null 2>&1; then + diffcmd="nvim -d" +else + diffcmd="vimdiff +0" +fi + +dirdiff() { + dir1=$(mktemp "${TMPDIR:-/tmp}"/nnn-"$(basename "$1")".XXXXXXXX) + dir2=$(mktemp "${TMPDIR:-/tmp}"/nnn-"$(basename "$2")".XXXXXXXX) + ls -A1 "$1" > "$dir1" + ls -A1 "$2" > "$dir2" + $diffcmd "$dir1" "$dir2" + rm "$dir1" "$dir2" +} + +if [ -s "$selection" ]; then + arr=$(tr '\0' '\n' < "$selection") + if [ "$(echo "$arr" | wc -l)" -gt 1 ]; then + f1="$(echo "$arr" | sed -n '1p')" + f2="$(echo "$arr" | sed -n '2p')" + if [ -d "$f1" ] && [ -d "$f2" ]; then + dirdiff "$f1" "$f2" + else + # If xargs supports the -o option, use it to get rid of: + # Vim: Warning: Input is not from a terminal + # xargs -0 -o vimdiff < $selection + + eval xargs -0 "$diffcmd" < "$selection" + fi + elif [ -n "$1" ]; then + f1="$(echo "$arr" | sed -n '1p')" + if [ -d "$f1" ] && [ -d "$1" ]; then + dirdiff "$f1" "$1" + elif [ -f "$f1" ] && [ -f "$1" ]; then + $diffcmd "$f1" "$1" + else + echo "cannot compare file with directory" + fi + else + echo "needs at least 2 files or directories selected for comparison" + fi +fi + +# Clear selection +if [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" +fi diff --git a/nnn-4.9/plugins/dragdrop b/nnn-4.9/plugins/dragdrop @@ -0,0 +1,77 @@ +#!/usr/bin/env sh + +# Description: Open a Drag and drop window, to drop files onto other programs. +# Also provides drag and drop window for files. +# +# Dependencies: dragon - https://github.com/mwh/dragon +# +# Notes: +# 1. Files that are dropped will be added to nnn's selection +# Some web-based files will be downloaded to current dir +# with curl and it may overwrite some existing files +# 2. The user has to mm to clear nnn's selection first +# +# Shell: POSIX compliant +# Author: 0xACE + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +resp=f +all= +if type dragon-drag-and-drop >/dev/null 2>&1; then + dnd="dragon-drag-and-drop" +elif type dragon-drop >/dev/null 2>&1; then + dnd="dragon-drop" +else + dnd="dragon" +fi + +add_file () +{ + printf '%s\0' "$@" >> "$selection" +} + +use_all () +{ + printf "mark --all (a) [default=none]: " + read -r resp + if [ "$resp" = "a" ]; then + all="--all" + else + all="" + fi +} + +if [ -s "$selection" ]; then + printf "Drop file (r). Drag selection (s), Drag current directory (d) or drag current file (f) [default=f]: " + read -r resp +else + printf "Drop file (r). Drag current directory (d) or drag current file (f) [default=f]: " + read -r resp + if [ "$resp" = "s" ]; then + resp=f + fi +fi + +if [ "$resp" = "s" ]; then + use_all + sed -z 's|'"$PWD/"'||g' < "$selection" | xargs -0 "$dnd" "$all" & +elif [ "$resp" = "d" ]; then + use_all + "$dnd" "$all" "$PWD/"* & +elif [ "$resp" = "r" ]; then + true > "$selection" + "$dnd" --print-path --target | while read -r f + do + if printf "%s" "$f" | grep '^\(https\?\|ftps\?\|s\?ftp\):\/\/' ; then + curl -LJO "$f" + add_file "$PWD/$(basename "$f")" + elif [ -e "$f" ]; then + add_file "$f" + fi + done & +else + if [ -n "$1" ] && [ -e "$1" ]; then + "$dnd" "$1" & + fi +fi + diff --git a/nnn-4.9/plugins/dups b/nnn-4.9/plugins/dups @@ -0,0 +1,70 @@ +#!/usr/bin/env sh + +# Description: List non-empty duplicates in the current dir (based on size followed by MD5) +# +# Source: https://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash +# +# Dependencies: find md5sum sort uniq xargs gsed +# +# Notes: +# 1. If the file size exceeds $size_digits digits the file will be misplaced +# 12 digits fit files up to 931GiB +# 2. Bash compatible required for mktemp +# +# Shell: Bash +# Authors: syssyphus, KlzXS + +EDITOR="${EDITOR:-vi}" +TMPDIR="${TMPDIR:-/tmp}" + +size_digits=12 +tmpfile=$(mktemp "$TMPDIR/.nnnXXXXXX") + +printf "\ +## This is an overview of all duplicate files found. +## Comment out the files you wish to remove. You will be given an option to cancel. +## Lines with double comments (##) are ignored. +## You will have the option to remove the files with force or interactively.\n +" > "$tmpfile" + +# shellcheck disable=SC2016 +find . -size +0 -type f -printf "%${size_digits}s %p\n" | sort -rn | uniq -w"${size_digits}" -D | sed -e ' +s/^ \{0,12\}\([0-9]\{0,12\}\) \(.*\)$/printf "%s %s\\n" "$(md5sum "\2")" "d\1"/ +' | tr '\n' '\0' | xargs -0 -n1 sh -c | sort | { uniq -w32 --all-repeated=separate; echo; } | sed -ne ' +h +s/^\(.\{32\}\).* d\([0-9]*\)$/## md5sum: \1 size: \2 bytes/p +g + +:loop +N +/.*\n$/!b loop +p' | sed -e 's/^.\{32\} \(.*\) d[0-9]*$/\1/' >> "$tmpfile" + +"$EDITOR" "$tmpfile" + +printf "Remove commented files? (yes/no) [default=n]: " +read -r commented + +if [ "$commented" = "y" ]; then + sedcmd="/^##.*/d; /^[^#].*/d; /^$/d; s/^# *\(.*\)$/\1/" +else + printf "Press any key to exit" + read -r _ + exit +fi + +printf "Remove with force or interactive? (f/i) [default=i]: " +read -r force + +if [ "$force" = "f" ]; then + #shellcheck disable=SC2016 + sed -e "$sedcmd" "$tmpfile" | tr '\n' '\0' | xargs -0 -r sh -c 'rm -f "$0" "$@" </dev/tty' +else + #shellcheck disable=SC2016 + sed -e "$sedcmd" "$tmpfile" | tr '\n' '\0' | xargs -0 -r sh -c 'rm -i "$0" "$@" </dev/tty' +fi + +rm "$tmpfile" + +printf "Press any key to exit" +read -r _ diff --git a/nnn-4.9/plugins/finder b/nnn-4.9/plugins/finder @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +# Description: Run custom search and list results in smart context +# +# Note: This plugin retains search history +# +# Usage: +# Run plugin and enter e.g. "-size +10M" to list files in current +# directory larger than 10M. By default entered expressions are +# interpreted as arguments to find. Results have to be NUL +# terminated which is done by default for find. Alternatively one +# can prepend a '$' to run a custom search program such as fd or +# ripgrep. Entered expressions will be saved in history file to +# be listed as bookmarks and and can be entered by index and edited. +# +# Shell: Bash +# Author: Arun Prakash Jana, Luuk van Baal +TMPDIR="${TMPDIR:-/tmp}" +NNN_FINDHIST="${NNN_FINDHIST:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/finderbms}" +NNN_FINDHISTLEN="${NNN_FINDHISTLEN:-10000}" + +printexamples() { + printf -- "-maxdepth 1 -name pattern +-maxdepth 1 -size +100M +\$fd -0 pattern +\$fd -0 -d 2 -S +100M +\$grep -rlZ pattern +\$rg -l0 pattern +\$fzf -m | tr '\\\n' '\\\0'\n" +} + +printexprs() { + for ((i = "$1"; i < ${#fexprs[@]}; i++)); do + printf '%s\t%s\n' "$((i + 1))" "${fexprs[$i]}" + done +} + +mapexpr() { + if [ "$fexpr" -eq "$fexpr" ] 2>/dev/null; then + fexpr=${fexprs[$((fexpr - 1))]} + read -r -e -p "Search expression: " -i "$fexpr" fexpr + else + return 1 + fi +} + +readexpr() { + case "$fexpr" in + h) clear + printf "Examples:\n" + mapfile -t fexprs < <(printexamples) + printexprs 0 + read -r -p "Search expression or index: " fexpr + mapexpr + [ -n "$fexpr" ] && readexpr ;; + \$*) cmd="${fexpr:1}" ;; + *) mapexpr && readexpr + cmd="find . $fexpr -print0" ;; + esac +} + +clear +[ -f "$NNN_FINDHIST" ] || printexamples > "$NNN_FINDHIST" + +mapfile -t fexprs < <(sort "$NNN_FINDHIST" | uniq -c | sort -nr | head -n5 |\ + awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}') +printf "Most used search expressions:\n" +printexprs 0 + +mapfile -t -O"$i" fexprs < <(tac "$NNN_FINDHIST" | awk '!a[$0]++' | head -n5) +printf "Most recently used search expressions:\n" +printexprs "$i" +read -r -p "Search expression or index (h for help): " fexpr + +mapexpr + +if [ -n "$fexpr" ]; then + printf "+l" > "$NNN_PIPE" + while :; do + readexpr + eval "$cmd" > "$NNN_PIPE" && break + read -r -e -p "Search expression: " -i "$fexpr" fexpr + done + if [ -n "$fexpr" ]; then + tail -n"$NNN_FINDHISTLEN" "$NNN_FINDHIST" > "$TMPDIR/finderbms" + printf "%s\n" "$fexpr" >> "$TMPDIR/finderbms" + mv "$TMPDIR/finderbms" "$NNN_FINDHIST" + fi +fi diff --git a/nnn-4.9/plugins/fixname b/nnn-4.9/plugins/fixname @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +# Description: Clean filename or dirname (either hovered or selections) +# to be more shell-friendly. This script cleans +# non A-Za-z0-9._- characters. +# and replaces it with underscore (_). +# +# It supports cleaning single/double quote, newline, +# leading, trailing spaces. +# +# eg. +# to be continued (つづく).mp4 -> to_be_continued______.mp4 +# [work] stuff.txt -> _work__stuff.txt +# home's server -> home_s_server +# qwe\trty -> __qwe_rty +# +# And if there are two almost similar filenames +# like: 'asd]f' and 'asd f' both will be renamed to 'asd_f', +# to avoid overwriting, the last file will be prepended by _. +# So they will be: 'asd_f' and '_asd_f' +# +# Dependencies: sed +# +# Shell: Bash +# Author: Benawi Adha + +prompt=true +sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +cleanup() { + # printf "%s" "$1" | sed -e 's/[^A-Za-z0-9._-]/_/g' + printf "%s" "$1" | sed 's/[^A-Za-z0-9._-]/_/g' | sed ':a;N;$!ba;s/\n/_/g' +} + +if [ -s "$sel" ]; then + targets=() + while IFS= read -r -d '' i || [ -n "$i" ]; do + targets+=( "$(basename "$i")" ) + done < "$sel" +else + targets=("$1") +fi + +for i in "${targets[@]}"; do + printf "%s -> %s\n" "$i" "$(cleanup "$i")"; +done + +if $prompt; then + echo + printf "Proceed [Yn]? " + read -r input + case "$input" in + y|Y|'') + ;; + *) + echo "Canceled" + exit + ;; + esac +fi + +for i in "${targets[@]}"; do + if [ "$i" != "$(cleanup "$i")" ]; then + tmp='' + if [ -e "$(cleanup "$i")" ]; then + tmp='_' + fi + mv "$i" "$tmp$(cleanup "$i")"; + fi +done + +# Clear selection +if [ -s "$sel" ] && [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" +fi diff --git a/nnn-4.9/plugins/fzcd b/nnn-4.9/plugins/fzcd @@ -0,0 +1,89 @@ +#!/usr/bin/env sh + +# Description: Fuzzy search multiple locations read-in from a path-list file +# (or $PWD) and open the selected file's dir in a smart context. +# Dependencies: fzf, find (only for multi-location search) +# +# Details: Paths in list file should be newline-separated absolute paths. +# Paths can be file paths; the script will scan the parent dirs. +# +# The path-list file precedence is: +# - "$1" (the hovered file) if it exists, is plain-text and the +# first line points to an existing file +# - "$LIST" if set below +# - "$2" (the current directory) [mimics plugin fzcd behaviour] +# +# The path-list file can be generated easily: +# - pick the (file)paths in picker mode to path-list file +# - OR, edit selection in nnn and save as path-list file +# +# Shell: POSIX compliant +# Author: Anna Arad, Arun Prakash Jana, KlzXS + +IFS="$(printf '\n\r')" + +# shellcheck disable=SC1090,SC1091 +. "$(dirname "$0")"/.nnn-plugin-helper + +CTX=+ +LIST="${LIST:-""}" + +if ! type fzf >/dev/null 2>&1; then + printf "fzf missing" + read -r _ + exit 1 +fi + +if [ -n "$1" ] && [ "$(file -b --mime-type "$1")" = 'text/plain' ] && [ -e "$(head -1 "$1")" ]; then + LIST="$1" +elif ! [ -s "$LIST" ]; then + sel=$(fzf) + # Show only the file and parent dir + # sel=$(fzf --delimiter / --with-nth=-2,-1 --tiebreak=begin --info=hidden) + + LIST='' +fi + +if [ -n "$LIST" ]; then + if type find >/dev/null 2>&1; then + tmpfile=$(mktemp /tmp/abc-script.XXXXXX) + + while IFS= read -r path; do + if [ -d "$path" ]; then + printf "%s\n" "$path" >> "$tmpfile" + elif [ -f "$path" ]; then + printf "%s\n" "$(dirname "$path")" >> "$tmpfile" + fi + done < "$LIST" + + sel=$(xargs -d '\n' < "$tmpfile" -I{} find {} -type f -printf "%H//%P\n" | sed '/.*\/\/\(\..*\|.*\/\..*\)/d; s:/\+:/:g' | fzf --delimiter / --tiebreak=begin --info=hidden) + # Alternative for 'fd' + # sel=$(xargs -d '\n' < "$tmpfile" fd . | fzf --delimiter / --tiebreak=begin --info=hidden) + + rm "$tmpfile" + else + printf "find missing" + read -r _ + exit 1 + fi +fi + +if [ -n "$sel" ]; then + if [ "$sel" = "." ] || { ! [ -d "$sel" ] && ! [ -f "$sel" ]; }; then + exit 0 + fi + + # Check if the selected path returned by fzf command is absolute + case $sel in + /*) nnn_cd "$sel" "$CTX" ;; + *) + # Remove "./" prefix if it exists + sel="${sel#./}" + + if [ "$PWD" = "/" ]; then + nnn_cd "/$sel" "$CTX" + else + nnn_cd "$PWD/$sel" "$CTX" + fi;; + esac +fi diff --git a/nnn-4.9/plugins/fzhist b/nnn-4.9/plugins/fzhist @@ -0,0 +1,40 @@ +#!/usr/bin/env sh + +# Description: Fuzzy find a command from history, +# edit in $EDITOR and run as a command +# +# Note: Supports only bash and fish history +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +if type fzf >/dev/null 2>&1; then + fuzzy=fzf +else + exit 1 +fi + +shellname="$(basename "$SHELL")" + +if [ "$shellname" = "bash" ]; then + hist_file="$HOME/.bash_history" + entry="$("$fuzzy" < "$hist_file")" +elif [ "$shellname" = "fish" ]; then + hist_file="$HOME/.local/share/fish/fish_history" + entry="$(grep "\- cmd: " "$hist_file" | cut -c 8- | "$fuzzy")" +fi + +if [ -n "$entry" ]; then + tmpfile=$(mktemp) + echo "$entry" >> "$tmpfile" + $EDITOR "$tmpfile" + + if [ -s "$tmpfile" ]; then + $SHELL -c "$(cat "$tmpfile")" + fi + + rm "$tmpfile" + + printf "Press any key to exit" + read -r _ +fi diff --git a/nnn-4.9/plugins/fzopen b/nnn-4.9/plugins/fzopen @@ -0,0 +1,85 @@ +#!/usr/bin/env sh + +# Description: Regular mode: +# Fuzzy find a file in directory subtree. +# Opens in $VISUAL or $EDITOR if text. +# Opens other type of files with xdg-open. +# Work only with a single file selected. +# +# Picker mode: +# If picker mode output file is passed, it +# will be overwritten with any picked files. +# Leaves untouched if no file is picked. +# Works with single/multiple files selected. +# +# Dependencies: fd/find, fzf/skim, xdg-open/open (on macOS) +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +NUKE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke" +USE_NUKE=0 + +# shellcheck disable=SC1090,SC1091 +. "$(dirname "$0")"/.nnn-plugin-helper + +if type fzf >/dev/null 2>&1; then + cmd="$FZF_DEFAULT_COMMAND" + if type fd >/dev/null 2>&1; then + [ -z "$cmd" ] && cmd="fd -t f 2>/dev/null" + else + [ -z "$cmd" ] && cmd="find . -type f 2>/dev/null" + fi + entry="$(eval "$cmd" | fzf -m)" + # To show only the file name + # entry=$(find . -type f 2>/dev/null | fzf --delimiter / --with-nth=-1 --tiebreak=begin --info=hidden) +elif type sk >/dev/null 2>&1; then + entry=$(find . -type f 2>/dev/null | sk) +else + exit 1 +fi + +# Check for picker mode +if [ "$3" ]; then + if [ "$entry" ]; then + case "$entry" in + /*) fullpath="$entry" ;; + *) fullpath="$PWD/$entry" ;; + esac + if [ "-" = "$3" ]; then + printf "%s\n" "$fullpath" + else + printf "%s\n" "$fullpath" > "$3" + fi + + # Tell `nnn` to clear its internal selection + printf "%s" "0p" > "$NNN_PIPE" + fi + + exit 0 +fi + +if [ "$entry" ]; then + if [ "$USE_NUKE" -ne 0 ]; then + "$NUKE" "$entry" + exit 0 + fi + + # Open the file (works for a single file only) + cmd_file="" + cmd_open="" + if uname | grep -q "Darwin"; then + cmd_file="file -bIL" + cmd_open="open" + else + cmd_file="file -biL" + cmd_open="xdg-open" + fi + + case "$($cmd_file "$entry")" in + *text*) + "${VISUAL:-$EDITOR}" "$entry" ;; + *) + $cmd_open "$entry" >/dev/null 2>&1 ;; + esac +fi diff --git a/nnn-4.9/plugins/fzplug b/nnn-4.9/plugins/fzplug @@ -0,0 +1,59 @@ +#!/usr/bin/env sh + +# Description: Fuzzy find and execute nnn plugins (and optionally, +# custom scripts located elsewhere). +# Description and details of plugins can be previewed +# from the fzf interface. Use `?` to toggle preview +# pane on and off, ^Up/^Dn to scroll. +# +# Dependencies: find, fzf, cat (or bat, if installed) +# +# Note: For better compatibility with as many nnn plugins as possible, +# fzplug will first execute the chosen script on the file hovered +# in nnn, and upon failure, try to run it with no target (i.e on +# an active selection, if present). +# +# Shell: POSIX compliant +# Author: Kabouik + +# Optional scripts sources + +# Leave blank or fill with the absolute path of a folder containing executable +# scripts other than nnn plugins (e.g., "$HOME/.local/share/nautilus/scripts", +# since there are numerous Nautilus script git repositories). +# Add extra variables if needed, make sure you call them in the find command. + +#CUSTOMDIR1="$HOME/.local/share/nautilus/scripts" +CUSTOMDIR1="" +CUSTOMDIR2="" + +nnnpluginsdir="$HOME/.config/nnn/plugins" + +# Preview with bat if installed +if type bat >/dev/null; then + BAT="bat --terminal-width='$(tput cols)' --decorations=always --color=always --style='${BAT_STYLE:-header,numbers}'" +fi + +plugin=$(find "$nnnpluginsdir" "$CUSTOMDIR1" "$CUSTOMDIR2" \ +-maxdepth 3 -perm -111 -type f 2>/dev/null | fzf --ansi --preview \ + "${BAT:-cat} {}" --preview-window="right:66%:wrap" --delimiter / \ + --with-nth -1 --bind="?:toggle-preview") + +# Try running the script on the hovered file, and abort +# abort if no plugin was selected (ESC or ^C pressed). +err=0 +if ! [ "$plugin" = "" ]; then + "$plugin" "$1" || err=1 +fi + +# If attempt with hovered file fails, try without any target +# (nnn selections should still be passed to the script in that case) +if [ "$err" -eq "1" ]; then + clear && "$plugin" || err=2 +fi + +# Abort and show error if both fail +if [ "$err" -eq "2" ]; then + sep="\n---\n" + printf "$sep""Failed to execute '%s'. See error above or try without fzfplug. Press return to continue. " "$plugin" && read -r _ && clear +fi diff --git a/nnn-4.9/plugins/getplugs b/nnn-4.9/plugins/getplugs @@ -0,0 +1,70 @@ +#!/usr/bin/env sh + +# Description: Update nnn plugins to installed nnn version +# +# Shell: POSIX compliant +# Authors: Arun Prakash Jana, KlzXS + +CONFIG_DIR=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/ +PLUGIN_DIR=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins + +merge () { + if type nvim >/dev/null 2>&1; then + nvim -d "$1" "$2" + else + vimdiff +0 "$1" "$2" + fi +} + +prompt () { + printf "%s\n" "Plugin $1 already exists and is different." + printf "Keep (k), merge (m), overwrite (o) [default: k]? " + read -r operation + + if [ "$operation" = "m" ]; then + op="merge" + elif [ "$operation" = "o" ]; then + op="cp -vRf" + else + op="true" + fi +} + +if [ "$1" = "master" ] ; then + VER="master" + ARCHIVE_URL=https://github.com/jarun/nnn/archive/master.tar.gz +elif type nnn >/dev/null 2>&1; then + VER=$(nnn -V) + ARCHIVE_URL=https://github.com/jarun/nnn/releases/download/v"$VER"/nnn-v"$VER".tar.gz +else + echo "nnn is not installed" + exit 1 +fi + +# backup any earlier plugins +if [ -d "$PLUGIN_DIR" ]; then + tar -C "$CONFIG_DIR" -czf "$CONFIG_DIR""plugins-$(date '+%Y%m%d%H%M').tar.gz" plugins/ +fi + +mkdir -p "$PLUGIN_DIR" +cd "$CONFIG_DIR" || exit 1 +curl -Ls "$ARCHIVE_URL" -o nnn-"$VER".tar.gz +tar -zxf nnn-"$VER".tar.gz + +cd nnn-"$VER"/plugins || exit 1 + +# shellcheck disable=SC2044 +# We do not use obnoxious names for plugins +for f in $(find . -maxdepth 1 \( ! -iname "." ! -iname "*.md" \)); do + if [ -f ../../plugins/"$f" ]; then + if [ "$(diff --brief "$f" ../../plugins/"$f")" ]; then + prompt "$f" + $op "$f" ../../plugins/ + fi + else + cp -vRf "$f" ../../plugins/ + fi +done +cd ../.. || exit 1 + +rm -rf nnn-"$VER"/ nnn-"$VER".tar.gz diff --git a/nnn-4.9/plugins/gitroot b/nnn-4.9/plugins/gitroot @@ -0,0 +1,15 @@ +#!/usr/bin/env sh + +# Description: cd to the top level of the current git repository in the current context +# Dependencies: git +# Shell: sh +# Author: https://github.com/PatrickF1 + +root="$(git rev-parse --show-toplevel 2>/dev/null)" +if [ -n "$root" ]; then + printf "%s" "0c$root" > "$NNN_PIPE" +else + printf "Not in a git repository" + read -r _ + exit 1 +fi diff --git a/nnn-4.9/plugins/gpgd b/nnn-4.9/plugins/gpgd @@ -0,0 +1,28 @@ +#!/usr/bin/env sh + +# Description: Decrypts selected files using gpg. The contents of the +# decrypted file are stored in a file with extension .dec +# +# Note: If an appropriate private key cannot be found gpg silently +# prints a message in the background and no files are written. +# +# Shell: POSIX compliant +# Author: KlzXS + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +printf "(s)election/(c)urrent? [default=c] " +read -r resp + +if [ "$resp" = "s" ]; then + files=$(tr '\0' '\n' < "$selection") +else + files=$1 +fi + +printf "%s" "$files" | xargs -n1 -I{} gpg --decrypt --output "{}.dec" {} + +# Clear selection +if [ "$resp" = "s" ] && [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" +fi diff --git a/nnn-4.9/plugins/gpge b/nnn-4.9/plugins/gpge @@ -0,0 +1,45 @@ +#!/usr/bin/env sh + +# Description: Encrypts selected files using gpg. Can encrypt +# asymmetrically (key) or symmetrically (passphrase). +# If asymmetric encryption is chosen a key can be +# chosen from the list of capable public keys using fzf. +# +# Note: Symmetric encryption only works for a single (current) file as per gpg limitations +# +# Shell: POSIX compliant +# Author: KlzXS + +# shellcheck disable=SC1090,SC1091 +. "$(dirname "$0")"/.nnn-plugin-helper + +printf "(s)ymmetric, (a)symmetric? [default=a] " +read -r symmetry + +if [ "$symmetry" = "s" ]; then + gpg --symmetric "$1" +else + if nnn_use_selection; then + clear_sel=1 + # shellcheck disable=SC2154 + files=$(tr '\0' '\n' < "$selection") + else + clear_sel=0 + files=$1 + fi + + keyids=$(gpg --list-public-keys --with-colons | grep -E "pub:(.*:){10}.*[eE].*:" | awk -F ":" '{print $5}') + + #awk needs literal $10 + #shellcheck disable=SC2016 + keyuids=$(printf "%s" "$keyids" | xargs -n1 -I{} sh -c 'gpg --list-key --with-colons "{}" | grep "uid" | awk -F ":" '\''{printf "%s %s\n", "{}", $10}'\''') + + recipient=$(printf "%s" "$keyuids" | fzf | awk '{print $1}') + + printf "%s" "$files" | xargs -n1 gpg --encrypt --recipient "$recipient" + + # Clear selection + if [ "$clear_sel" -eq 1 ] && [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" + fi +fi diff --git a/nnn-4.9/plugins/gsconnect b/nnn-4.9/plugins/gsconnect @@ -0,0 +1,21 @@ +#!/usr/bin/env sh + +#set -x +# Description: Send the selected (or hovered) files to your Android device using gsconnect daemon.js. +# GSConnect must be configured on the Android device and the PC. +# +# Shell: POSIX compliant +# Author: Darukutsu +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +gsconnect=$HOME/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/daemon.js +ids=$($gsconnect -l) + +for id in $ids; do + if [ -s "$selection" ]; then + xargs -0 < "$selection" -I{} "$gsconnect" -d "$id" --share-file="{}" + # Clear selection + printf "-" > "$NNN_PIPE" + else + "$gsconnect" -d "$id" --share-file="$2/$1" + fi +done diff --git a/nnn-4.9/plugins/gutenread b/nnn-4.9/plugins/gutenread @@ -0,0 +1,49 @@ +#!/usr/bin/env sh + +# Description: Browse Project Gutenberg catalogue by popularity, then download +# and read a book of your choice. +# +# Details: Set the variable EBOOK_ID to download in html format and read in w3m. +# Clear EBOOK_ID to browse available ebooks by popularity and set it to +# the ID once you find an interesting one. +# To download and read in epub format set READER to an epub reader like +# epr: https://github.com/wustho/epr +# +# More on EBOOK_ID: +# Wuthering Heights by Emily Brontë is at https://www.gutenberg.org/ebooks/768 +# So EBOOK_ID would be 768 +# +# Downloaded ebooks are at ${XDG_CACHE_HOME:-$HOME/.cache}/nnn/gutenbooks/ +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +EBOOK_ID="${EBOOK_ID:-""}" +DIR="${XDG_CACHE_HOME:-$HOME/.cache}/nnn/gutenbooks/$EBOOK_ID" +BROWSE_LINK="https://www.gutenberg.org/ebooks/search/?sort_order=downloads" +BROWSER="${BROWSER:-w3m}" +READER="${READER:-""}" + +if [ -n "$EBOOK_ID" ]; then + if [ ! -e "$DIR" ]; then + mkdir -p "$DIR" + cd "$DIR" || exit 1 + + if [ -z "$READER" ]; then + curl -L -O "https://www.gutenberg.org/files/$EBOOK_ID/$EBOOK_ID-h.zip" + unzip "$EBOOK_ID"-h.zip + else + curl -L -o "$EBOOK_ID".epub "https://www.gutenberg.org/ebooks/$EBOOK_ID.epub.noimages" + fi + fi + + if [ -d "$DIR" ]; then + if [ -z "$READER" ]; then + "$BROWSER" "$DIR/$EBOOK_ID-h/$EBOOK_ID-h.htm" + else + "$READER" "$DIR/$EBOOK_ID.epub" + fi + fi +else + "$BROWSER" "$BROWSE_LINK" +fi diff --git a/nnn-4.9/plugins/imgresize b/nnn-4.9/plugins/imgresize @@ -0,0 +1,31 @@ +#!/usr/bin/env sh + +# Description: Resize images in a directory to screen resolution with imgp +# +# Dependencipes: imgp - https://github.com/jarun/imgp +# +# Notes: +# 1. Set res to avoid the desktop resolution prompt each time +# 2. MINSIZE is set to 1MB by default, adjust it if you want +# 3. imgp options used: +# a - adaptive mode +# c - convert PNG to JPG +# k - skip images matching specified hres/vres +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +# set resolution (e.g. 1920x1080) +res="${RESOLUTION}" + +# set minimum image size (in bytes) to resize (default: 1MB) +MINSIZE="${MINSIZE:-1048576}" + +if [ -z "$res" ]; then + printf "desktop resolution (hxv): " + read -r res +fi + +if [ -n "$res" ] && [ -n "$MINSIZE" ]; then + imgp -ackx "$res" -s "$MINSIZE" +fi diff --git a/nnn-4.9/plugins/imgur b/nnn-4.9/plugins/imgur @@ -0,0 +1,597 @@ +#!/usr/bin/env bash + +########################################################################## +# The MIT License +# +# Copyright (c) jomo +# +# 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. +########################################################################## + +# https://github.com/jomo/imgur-screenshot +# https://help.imgur.com/hc/en-us/articles/209592766-Tools-for-Imgur +# +# Slightly modified for `nnn` integration +# +# Shell: Bash +# Description: Upload an image file to imgur + +if [ "${1}" = "--debug" ]; then + echo "########################################" + echo "Enabling debug mode" + echo "Please remove credentials before pasting" + echo "########################################" + echo "" + uname -a + for arg in ${0} "${@}"; do + echo -n "'${arg}' " + done + echo -e "\n" + shift + set -x +fi + +current_version="v1.7.4" + +function is_mac() { + uname | grep -q "Darwin" +} + +### IMGUR-SCREENSHOT DEFAULT CONFIG #### + +# You can override the config in ~/.config/imgur-screenshot/settings.conf + +imgur_anon_id="ea6c0ef2987808e" +imgur_icon_path="${HOME}/Pictures/imgur.png" + +imgur_acct_key="" +imgur_secret="" +login="false" +album_title="" +album_id="" +credentials_file="${HOME}/.config/imgur-screenshot/credentials.conf" + +file_name_format="imgur-%Y_%m_%d-%H:%M:%S.png" # when using scrot, must end with .png! +file_dir="${HOME}/Pictures" + +upload_connect_timeout="5" +upload_timeout="120" +upload_retries="1" + +# shellcheck disable=SC2034 +if is_mac; then + screenshot_select_command="screencapture -i %img" + screenshot_window_command="screencapture -iWa %img" + screenshot_full_command="screencapture %img" + open_command="open %url" +else + screenshot_select_command="scrot -s %img" + screenshot_window_command="scrot %img" + screenshot_full_command="scrot %img" + open_command="xdg-open %url" +fi +open="true" + +mode="select" +edit_command="gimp %img" +edit="false" +exit_on_album_creation_fail="true" + +log_file="${HOME}/.imgur-screenshot.log" + +auto_delete="" +copy_url="true" +keep_file="true" +check_update="true" + +# NOTICE: if you make changes here, also edit the docs at +# https://github.com/jomo/imgur-screenshot/wiki/Config + +# You can override the config in ~/.config/imgur-screenshot/settings.conf + +############## END CONFIG ############## + +settings_path="${HOME}/.config/imgur-screenshot/settings.conf" +if [ -f "${settings_path}" ]; then + # shellcheck disable=SC1090 + source "${settings_path}" +fi + +# dependency check +if [ "${1}" = "--check" ]; then + (type grep &>/dev/null && echo "OK: found grep") || echo "ERROR: grep not found" + if is_mac; then + if type growlnotify &>/dev/null; then + echo "OK: found growlnotify" + elif type terminal-notifier &>/dev/null; then + echo "OK: found terminal-notifier" + else + echo "ERROR: growlnotify nor terminal-notifier found" + fi + (type screencapture &>/dev/null && echo "OK: found screencapture") || echo "ERROR: screencapture not found" + (type pbcopy &>/dev/null && echo "OK: found pbcopy") || echo "ERROR: pbcopy not found" + else + (type notify-send &>/dev/null && echo "OK: found notify-send") || echo "ERROR: notify-send (from libnotify-bin) not found" + (type scrot &>/dev/null && echo "OK: found scrot") || echo "ERROR: scrot not found" + (type xclip &>/dev/null && echo "OK: found xclip") || echo "ERROR: xclip not found" + fi + (type curl &>/dev/null && echo "OK: found curl") || echo "ERROR: curl not found" + exit 0 +fi + + +# notify <'ok'|'error'> <title> <text> +function notify() { + if is_mac; then + if type growlnotify &>/dev/null; then + growlnotify --icon "${imgur_icon_path}" --iconpath "${imgur_icon_path}" --title "${2}" --message "${3}" + else + terminal-notifier -appIcon "${imgur_icon_path}" -contentImage "${imgur_icon_path}" -title "imgur: ${2}" -message "${3}" + fi + else + if [ "${1}" = "error" ]; then + notify-send -a ImgurScreenshot -u critical -c "im.error" -i "${imgur_icon_path}" -t 500 "imgur: ${2}" "${3}" + else + notify-send -a ImgurScreenshot -u low -c "transfer.complete" -i "${imgur_icon_path}" -t 500 "imgur: ${2}" "${3}" + fi + fi +} + +function take_screenshot() { + echo "Please select area" + is_mac || sleep 0.1 # https://bbs.archlinux.org/viewtopic.php?pid=1246173#p1246173 + + cmd="screenshot_${mode}_command" + cmd=${!cmd//\%img/${1}} + + if ! shot_err="$(${cmd} &>/dev/null)"; then #takes a screenshot with selection + echo "Failed to take screenshot '${1}': '${shot_err}'. For more information visit https://github.com/jomo/imgur-screenshot/wiki/Troubleshooting" | tee -a "${log_file}" + notify error "Something went wrong :(" "Information has been logged" + exit 1 + fi +} + +function check_for_update() { + # exit non-zero on HTTP error, output only the body (no stats) but output errors, follow redirects, output everything to stdout + remote_version="$(curl --compressed -fsSL --stderr - "https://api.github.com/repos/jomo/imgur-screenshot/releases" | grep -Em 1 --color 'tag_name":\s*".*"' | cut -d '"' -f 4)" + if [ -n "$remote_version" ]; then + if [ ! "${current_version}" = "${remote_version}" ] && [ -n "${current_version}" ] && [ -n "${remote_version}" ]; then + echo "Update found!" + echo "Version ${remote_version} is available (You have ${current_version})" + notify ok "Update found" "Version ${remote_version} is available (You have ${current_version}). https://github.com/jomo/imgur-screenshot" + echo "Check https://github.com/jomo/imgur-screenshot/releases/${remote_version} for more info." + elif [ -z "${current_version}" ] || [ -z "${remote_version}" ]; then + echo "Invalid empty version string" + echo "Current (local) version: '${current_version}'" + echo "Latest (remote) version: '${remote_version}'" + else + echo "Version ${current_version} is up to date." + fi + else + echo "Failed to check for latest version: ${remote_version}" + fi +} + +function check_oauth2_client_secrets() { + if [ -z "${imgur_acct_key}" ] || [ -z "${imgur_secret}" ]; then + echo "In order to upload to your account, register a new application at:" + echo "https://api.imgur.com/oauth2/addclient" + echo "Select 'OAuth 2 authorization without a callback URL'" + echo "Then, set the imgur_acct_key (Client ID) and imgur_secret in your config." + exit 1 + fi +} + +function load_access_token() { + token_expire_time=0 + # check for saved access_token and its expiration date + if [ -f "${credentials_file}" ]; then + # shellcheck disable=SC1090 + source "${credentials_file}" + fi + current_time="$(date +%s)" + preemptive_refresh_time="$((10*60))" + expired="$((current_time > (token_expire_time - preemptive_refresh_time)))" + if [ -n "${refresh_token}" ]; then + # token already set + if [ "${expired}" -eq "0" ]; then + # token expired + refresh_access_token "${credentials_file}" + fi + else + acquire_access_token "${credentials_file}" + fi +} + +function acquire_access_token() { + check_oauth2_client_secrets + # prompt for a PIN + authorize_url="https://api.imgur.com/oauth2/authorize?client_id=${imgur_acct_key}&response_type=pin" + echo "Go to" + echo "${authorize_url}" + echo "and grant access to this application." + read -rp "Enter the PIN: " imgur_pin + + if [ -z "${imgur_pin}" ]; then + echo "PIN not entered, exiting" + exit 1 + fi + + # exchange the PIN for access token and refresh token + response="$(curl --compressed -fsSL --stderr - \ + -F "client_id=${imgur_acct_key}" \ + -F "client_secret=${imgur_secret}" \ + -F "grant_type=pin" \ + -F "pin=${imgur_pin}" \ + https://api.imgur.com/oauth2/token)" + save_access_token "${response}" "${1}" +} + +function refresh_access_token() { + check_oauth2_client_secrets + token_url="https://api.imgur.com/oauth2/token" + # exchange the refresh token for access_token and refresh_token + if ! response="$(curl --compressed -fsSL --stderr - \ + -F "client_id=${imgur_acct_key}" \ + -F "client_secret=${imgur_secret}" \ + -F "grant_type=refresh_token" \ + -F "refresh_token=${refresh_token}" \ + "${token_url}" + )"; then + # curl failed + handle_upload_error "${response}" "${token_url}" + exit 1 + fi + save_access_token "${response}" "${1}" +} + +function save_access_token() { + if ! grep -q "access_token" <<<"${1}"; then + # server did not send access_token + echo "Error: Something is wrong with your credentials:" + echo "${1}" + exit 1 + fi + + access_token="$(grep -Eo 'access_token":".*"' <<<"${1}" | cut -d '"' -f 3)" + refresh_token="$(grep -Eo 'refresh_token":".*"' <<<"${1}" | cut -d '"' -f 3)" + expires_in="$(grep -Eo 'expires_in":[0-9]*' <<<"${1}" | cut -d ':' -f 2)" + token_expire_time="$(( $(date +%s) + expires_in ))" + + # create dir if not exist + mkdir -p "$(dirname "${2}")" 2>/dev/null + touch "${2}" && chmod 600 "${2}" + cat <<EOF > "${2}" +access_token="${access_token}" +refresh_token="${refresh_token}" +token_expire_time="${token_expire_time}" +EOF +} + +function fetch_account_info() { + response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -H "Authorization: Bearer ${access_token}" https://api.imgur.com/3/account/me)" + if grep -Eq '"success":\s*true' <<<"${response}"; then + username="$(grep -Eo '"url":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + echo "Logged in as ${username}." + echo "https://${username}.imgur.com" + else + echo "Failed to fetch info: ${response}" + fi +} + +function delete_image() { + response="$(curl --compressed -X DELETE -fsSL --stderr - -H "Authorization: Client-ID ${1}" "https://api.imgur.com/3/image/${2}")" + if grep -Eq '"success":\s*true' <<<"${response}"; then + echo "Image successfully deleted (delete hash: ${2})." >> "${3}" + else + echo "The Image could not be deleted: ${response}." >> "${3}" + fi +} + +function upload_authenticated_image() { + echo "Uploading '${1}'..." + title="$(echo "${1}" | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev)" + if [ -n "${album_id}" ]; then + response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -F "title=${title}" -F "image=@\"${1}\"" -F "album=${album_id}" -H "Authorization: Bearer ${access_token}" https://api.imgur.com/3/image)" + else + response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -F "title=${title}" -F "image=@\"${1}\"" -H "Authorization: Bearer ${access_token}" https://api.imgur.com/3/image)" + fi + + # JSON parser premium edition (not really) + if grep -Eq '"success":\s*true' <<<"${response}"; then + img_id="$(grep -Eo '"id":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + img_ext="$(grep -Eo '"link":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4 | rev | cut -d "." -f 1 | rev)" # "link" itself has ugly '\/' escaping and no https! + del_id="$(grep -Eo '"deletehash":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + + if [ -n "${auto_delete}" ]; then + export -f delete_image + echo "Deleting image in ${auto_delete} seconds." + nohup /bin/bash -c "sleep ${auto_delete} && delete_image ${imgur_anon_id} ${del_id} ${log_file}" & + fi + + handle_upload_success "https://i.imgur.com/${img_id}.${img_ext}" "https://imgur.com/delete/${del_id}" "${1}" + else # upload failed + err_msg="$(grep -Eo '"error":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + test -z "${err_msg}" && err_msg="${response}" + handle_upload_error "${err_msg}" "${1}" + fi +} + +function upload_anonymous_image() { + echo "Uploading '${1}'..." + title="$(echo "${1}" | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev)" + if [ -n "${album_id}" ]; then + response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -H "Authorization: Client-ID ${imgur_anon_id}" -F "title=${title}" -F "image=@\"${1}\"" -F "album=${album_id}" https://api.imgur.com/3/image)" + else + response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -H "Authorization: Client-ID ${imgur_anon_id}" -F "title=${title}" -F "image=@\"${1}\"" https://api.imgur.com/3/image)" + fi + # JSON parser premium edition (not really) + if grep -Eq '"success":\s*true' <<<"${response}"; then + img_id="$(grep -Eo '"id":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + img_ext="$(grep -Eo '"link":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4 | rev | cut -d "." -f 1 | rev)" # "link" itself has ugly '\/' escaping and no https! + del_id="$(grep -Eo '"deletehash":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + + if [ -n "${auto_delete}" ]; then + export -f delete_image + echo "Deleting image in ${auto_delete} seconds." + nohup /bin/bash -c "sleep ${auto_delete} && delete_image ${imgur_anon_id} ${del_id} ${log_file}" & + fi + + handle_upload_success "https://i.imgur.com/${img_id}.${img_ext}" "https://imgur.com/delete/${del_id}" "${1}" + else # upload failed + err_msg="$(grep -Eo '"error":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + test -z "${err_msg}" && err_msg="${response}" + handle_upload_error "${err_msg}" "${1}" + fi +} + +function handle_upload_success() { + echo "" + echo "image link: ${1}" + echo "delete link: ${2}" + + if [ "${copy_url}" = "true" ] && [ -z "${album_title}" ]; then + if is_mac; then + echo -n "${1}" | pbcopy + else + echo -n "${1}" | xclip -selection clipboard + fi + echo "URL copied to clipboard" + fi + + # print to log file: image link, image location, delete link + echo -e "${1}\t${3}\t${2}" >> "${log_file}" + + notify ok "Upload done!" "${1}" + +# if [ ! -z "${open_command}" ] && [ "${open}" = "true" ]; then +# open_cmd=${open_command//\%url/${1}} +# open_cmd=${open_cmd//\%img/${2}} +# echo "Opening '${open_cmd}'" +# eval "${open_cmd}" +# fi +} + +function handle_upload_error() { + error="Upload failed: \"${1}\"" + echo "${error}" + echo -e "Error\t${2}\t${error}" >> "${log_file}" + notify error "Upload failed :(" "${1}" +} + +function handle_album_creation_success() { + echo "" + echo "Album link: ${1}" + echo "Delete hash: ${2}" + echo "" + + notify ok "Album created!" "${1}" + + if [ "${copy_url}" = "true" ]; then + if is_mac; then + echo -n "${1}" | pbcopy + else + echo -n "${1}" | xclip -selection clipboard + fi + echo "URL copied to clipboard" + fi + + # print to log file: album link, album title, delete hash + echo -e "${1}\t\"${3}\"\t${2}" >> "${log_file}" +} + +function handle_album_creation_error() { + error="Album creation failed: \"${1}\"" + echo -e "Error\t${2}\t${error}" >> "${log_file}" + notify error "Album creation failed :(" "${1}" + if [ ${exit_on_album_creation_fail} ]; then + exit 1 + fi +} + +while [ ${#} != 0 ]; do + case "${1}" in + -h | --help) + echo "usage: ${0} [--debug] [-c | --check | -v | -h | -u]" + echo " ${0} [--debug] [option]... [file]..." + echo "" + echo " --debug Enable debugging, must be first option" + echo " -h, --help Show this help, exit" + echo " -v, --version Show current version, exit" + echo " --check Check if all dependencies are installed, exit" + echo " -c, --connect Show connected imgur account, exit" + echo " -o, --open <true|false> Override 'open' config" + echo " -e, --edit <true|false> Override 'edit' config" + echo " -i, --edit-command <command> Override 'edit_command' config (include '%img'), sets --edit 'true'" + echo " -l, --login <true|false> Override 'login' config" + echo " -a, --album <album_title> Create new album and upload there" + echo " -A, --album-id <album_id> Override 'album_id' config" + echo " -k, --keep-file <true|false> Override 'keep_file' config" + echo " -d, --auto-delete <s> Automatically delete image after <s> seconds" + echo " -u, --update Check for updates, exit" + echo " file Upload file instead of taking a screenshot" + exit 0;; + -v | --version) + echo "${current_version}" + exit 0;; + -s | --select) + mode="select" + shift;; + -w | --window) + mode="window" + shift;; + -f | --full) + mode="full" + shift;; + -o | --open) + # shellcheck disable=SC2034 + open="${2}" + shift 2;; + -e | --edit) + edit="${2}" + shift 2;; + -i | --edit-command) + edit_command="${2}" + edit="true" + shift 2;; + -l | --login) + login="${2}" + shift 2;; + -c | --connect) + load_access_token + fetch_account_info + exit 0;; + -a | --album) + album_title="${2}" + shift 2;; + -A | --album-id) + album_id="${2}" + shift 2;; + -k | --keep-file) + keep_file="${2}" + shift 2;; + -d | --auto-delete) + auto_delete="${2}" + shift 2;; + -u | --update) + check_for_update + exit 0;; + *) + upload_files=("${@}") + break;; + esac +done + +if [ "${login}" = "true" ]; then + # load before changing directory + load_access_token +fi + + +if [ -n "${album_title}" ]; then + if [ "${login}" = "true" ]; then + response="$(curl -fsSL --stderr - \ + -F "title=${album_title}" \ + -H "Authorization: Bearer ${access_token}" \ + https://api.imgur.com/3/album)" + else + response="$(curl -fsSL --stderr - \ + -F "title=${album_title}" \ + -H "Authorization: Client-ID ${imgur_anon_id}" \ + https://api.imgur.com/3/album)" + fi + if grep -Eq '"success":\s*true' <<<"${response}"; then # Album creation successful + echo "Album '${album_title}' successfully created" + album_id="$(grep -Eo '"id":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + del_id="$(grep -Eo '"deletehash":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + handle_album_creation_success "https://imgur.com/a/${album_id}" "${del_id}" "${album_title}" + + if [ "${login}" = "false" ]; then + album_id="${del_id}" + fi + else # Album creation failed + err_msg="$(grep -Eo '"error":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)" + test -z "${err_msg}" && err_msg="${response}" + handle_album_creation_error "${err_msg}" "${album_title}" + fi +fi + +if [ -z "${upload_files[*]}" ]; then + upload_files[0]="" +fi + +for upload_file in "${upload_files[@]}"; do + + if [ -z "${upload_file}" ]; then + cd "${file_dir}" || exit 1 + + # new filename with date + img_file="$(date +"${file_name_format}")" + take_screenshot "${img_file}" + else + # upload file instead of screenshot + img_file="${upload_file}" + fi + + # get full path + #cd "$(dirname "$(realpath "${img_file}")")" + #img_file="$(realpath "${img_file}")" + + # check if file exists + if ! [ -f "${img_file}" ]; then + echo "file '${img_file}' doesn't exist !" + read -r _ + exit 1 + fi + + # open image in editor if configured + if [ "${edit}" = "true" ]; then + edit_cmd=${edit_command//\%img/${img_file}} + echo "Opening editor '${edit_cmd}'" + if ! (eval "${edit_cmd}"); then + echo "Error for image '${img_file}': command '${edit_cmd}' failed, not uploading. For more information visit https://github.com/jomo/imgur-screenshot/wiki/Troubleshooting" | tee -a "${log_file}" + notify error "Something went wrong :(" "Information has been logged" + exit 1 + fi + fi + + if [ "${login}" = "true" ]; then + upload_authenticated_image "${img_file}" + else + upload_anonymous_image "${img_file}" + fi + + # delete file if configured + if [ "${keep_file}" = "false" ] && [ -z "${1}" ]; then + echo "Deleting temp file ${file_dir}/${img_file}" + rm -rf "${img_file}" + fi + + echo "" +done + + +if [ "${check_update}" = "true" ]; then + check_for_update +fi + +read -r _ diff --git a/nnn-4.9/plugins/imgview b/nnn-4.9/plugins/imgview @@ -0,0 +1,113 @@ +#!/usr/bin/env sh + +# Description: Open hovered or current directory in image viewer. +# Generates media thumbnails with optional dependencies. +# +# Dependencies: +# - imv (https://github.com/eXeC64/imv) or, +# - sxiv (https://github.com/muennich/sxiv) or, +# - nsxiv (https://codeberg.org/nsxiv/nsxiv) or, +# - ucollage (https://github.com/ckardaris/ucollage) or, +# - lsix (https://github.com/hackerb9/lsix), or +# - viu (https://github.com/atanunq/viu), or +# - catimg (https://github.com/posva/catimg), or +# - optional: ffmpeg for audio thumbnails (album art) +# - optional: ffmpegthumbnailer for video thumbnails +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana, Luuk van Baal +# +# Consider setting NNN_PREVIEWDIR to $XDG_CACHE_HOME/nnn/previews +# if you want to keep media thumbnails on disk between reboots. +NNN_PREVIEWDIR="${NNN_PREVIEWDIR:-${TMPDIR:-/tmp}/nnn/previews}" + +exit_prompt() { + [ -n "$1" ] && printf "%s\n" "$1" + printf "%s" "Press any key to exit..." + cfg=$(stty -g); stty raw -echo; head -c 1; stty "$cfg" + clear + exit +} + +make_thumbs() { + mkdir -p "$NNN_PREVIEWDIR$dir" || return + if [ "$1" = "viu" ] || [ "$1" = "catimg" ]; then + [ -d "$target" ] && exit_prompt "$1 can only display a single image" + mime="$(file -bL --mime-type -- "$target")" + case "$mime" in + audio/*) ffmpeg -i "$target" "$NNN_PREVIEWDIR$target.jpg" -y >/dev/null 2>&1 + ret="$NNN_PREVIEWDIR/$target.jpg" ;; + video/*) ffmpegthumbnailer -i "$target" -o "$NNN_PREVIEWDIR$target.jpg" 2> /dev/null + ret="$NNN_PREVIEWDIR/$target.jpg" ;; + *) ret="$target" ;; + esac + fi + for file in "$dir"/*; do + if [ ! -f "$NNN_PREVIEWDIR$file.jpg" ]; then + case "$(file -bL --mime-type -- "$file")" in + audio/*) [ "$1" != "sxiv" ] && + ffmpeg -i "$file" "$NNN_PREVIEWDIR$file.jpg" -y >/dev/null 2>&1 ;; + video/*) [ "$1" != "ucollage" ] && + ffmpegthumbnailer -i "$file" -o "$NNN_PREVIEWDIR$file.jpg" 2> /dev/null ;; + esac + fi + done + for file in "$NNN_PREVIEWDIR$dir"/*; do + filename="$(basename "$file" .jpg)" + [ ! -e "$dir/$filename" ] && rm "$file" 2>/dev/null + done +} + +listimages() { + find -L "$dir" "$NNN_PREVIEWDIR$dir" -maxdepth 1 -type f -print0 2>/dev/null | sort -z +} + +view_files() { + [ -f "$target" ] && count="-n $(listimages | grep -a -m 1 -ZznF "$target" | cut -d: -f1)" + case "$1" in + nsxiv) listimages | xargs -0 nsxiv -a "${count:--t}" -- ;; + sxiv) listimages | xargs -0 sxiv -a "${count:--t}" -- ;; + imv*) listimages | xargs -0 "$1" "${count:-}" -- ;; + esac +} + +target="$(readlink -f "$1")" +[ -d "$target" ] && dir="$target" || dir="${target%/*}" +if uname | grep -q "Darwin"; then + [ -f "$1" ] && open "$1" >/dev/null 2>&1 & +elif type lsix >/dev/null 2>&1; then + if [ -d "$target" ]; then + cd "$target" || exit_prompt + fi + make_thumbs lsix + clear + lsix + cd "$NNN_PREVIEWDIR$dir" && lsix + exit_prompt +elif type ucollage >/dev/null 2>&1; then + type ffmpeg >/dev/null 2>&1 && make_thumbs ucollage + UCOLLAGE_EXPAND_DIRS=1 ucollage "$dir" "$NNN_PREVIEWDIR$dir" || exit_prompt +elif type sxiv >/dev/null 2>&1; then + type ffmpegthumbnailer >/dev/null 2>&1 && make_thumbs sxiv + view_files sxiv >/dev/null 2>&1 & +elif type nsxiv >/dev/null 2>&1; then + type ffmpegthumbnailer >/dev/null 2>&1 && make_thumbs sxiv + view_files nsxiv >/dev/null 2>&1 & +elif type imv >/dev/null 2>&1; then + make_thumbs imv + view_files imv >/dev/null 2>&1 & +elif type imvr >/dev/null 2>&1; then + make_thumbs imv + view_files imvr >/dev/null 2>&1 & +elif type viu >/dev/null 2>&1; then + clear + make_thumbs viu + viu -n "$ret" + exit_prompt +elif type catimg >/dev/null 2>&1; then + make_thumbs catimg + catimg "$ret" + exit_prompt +else + exit_prompt "Please install sxiv/nsxiv/imv/viu/catimg/lsix." +fi diff --git a/nnn-4.9/plugins/ipinfo b/nnn-4.9/plugins/ipinfo @@ -0,0 +1,13 @@ +#!/usr/bin/env sh + +# Description: Shows the external IP address and whois information. Useful over VPNs. +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +IP=$(curl -s ifconfig.me) + +whois "$IP" +echo your external IP address is "$IP" + +read -r _ diff --git a/nnn-4.9/plugins/kdeconnect b/nnn-4.9/plugins/kdeconnect @@ -0,0 +1,66 @@ +#!/usr/bin/env sh + +# Description: Send files or folders to your Android device using kdeconnect-cli. +# kdeconnect must be configured on the Android device and the PC. +# +# Usage: +# - Hover over a file or a folder and call the plugin. +# - Alternatively, select the files and folders you would like to send, and activate the plugin. +# +# Shell: POSIX compliant +# Author: juacq97, raffaem, N-R-K + +# If you want system notification, put this equal to 1 +notify=0 + +note() { + if [ $notify = 1 ]; then + notify-send -a "Kdeconnect" "$1" + else + echo "[Kdeconnect] $1" + fi +} + +# kdeconnect doesn't cope with non-files +filter_files() { + xargs -0 -I{} sh -c ' + if [ -f "{}" ]; then + printf "%s\0" "{}"; + else + printf "Error: not a regular file: %s\n" "{}" >&2; + fi;' +} + +send() { + filter_files | xargs -0 -I{} kdeconnect-cli --name "$devname" --share {} + note "Files sent" +} + +# Select paired device +names=$(kdeconnect-cli --list-available --name-only 2>/dev/null) +if [ -z "$names" ]; then + note "No devices paired and available" + exit +fi + +ndevs=$(printf "%s" "$names" | awk 'END{print NR}') +if [ "$ndevs" -eq 1 ]; then + devname="$names" +else + printf "%s" "$names" | awk '{ print NR ". " $0 }' + printf "Pick a device: " + read -r pick + if [ -n "$pick" ] && [ "$pick" -eq "$pick" ]; then + devname=$(printf '%s' "$names" | awk "NR==$pick") + fi +fi + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +if [ -s "$selection" ]; then + send < "$selection" + [ -p "$NNN_PIPE" ] && printf "-" > "$NNN_PIPE" # clear selection +elif [ -n "$1" ]; then + printf "%s" "$1" | send +else + note "No selection and no hovered file" +fi diff --git a/nnn-4.9/plugins/launch b/nnn-4.9/plugins/launch @@ -0,0 +1,42 @@ +#!/usr/bin/env sh + +# Description: Independent POSIX-compliant GUI application launcher. +# Fuzzy find executables in $PATH and launch an application. +# stdin, stdout, stderr are suppressed so CLI tools exit silently. +# +# To configure launch as an independent app launcher add a keybind +# to open launch in a terminal e.g., +# +# xfce4-terminal -e "${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/launch +# +# Dependencies: fzf +# +# Usage: launch [delay] +# delay is in seconds, if omitted launch waits for 1 sec +# +# Integration with nnn: launch is installed with other plugins, nnn picks it up. +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +# shellcheck disable=SC2086 + +IFS=':' + +get_selection() { + if type fzf >/dev/null 2>&1; then + { IFS=':'; ls -H $PATH; } | sort | fzf + else + exit 1 + fi +} + +if selection=$( get_selection ); then + setsid "$selection" 2>/dev/null 1>/dev/null & + + if [ -n "$1" ]; then + sleep "$1" + else + sleep 1 + fi +fi diff --git a/nnn-4.9/plugins/mimelist b/nnn-4.9/plugins/mimelist @@ -0,0 +1,15 @@ +#!/usr/bin/env sh + +# Description: Find and list files by mime type in smart context +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +# shellcheck disable=SC1090,SC1091 +. "$(dirname "$0")"/.nnn-plugin-helper + +printf "mime (e.g., video/audio/image): " +read -r mime + +printf "%s" "+l" > "$NNN_PIPE" +find . | file -if- | grep "$mime" | awk -F: '{printf "%s\0", $1}' > "$NNN_PIPE" diff --git a/nnn-4.9/plugins/moclyrics b/nnn-4.9/plugins/moclyrics @@ -0,0 +1,40 @@ +#!/usr/bin/env sh + +# Description: Fetches the lyrics of the track currently playing in MOC +# +# Dependencies: ddgr (https://github.com/jarun/ddgr) +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +# Check if MOC server is running +cmd=$(pgrep -x mocp 2>/dev/null) +ret=$cmd +if [ -z "$ret" ]; then + exit +fi + +# Grab the output +out="$(mocp -i)" + +# Check if anything is playing +state=$(echo "$out" | grep "State:" | cut -d' ' -f2) +if ! [ "$state" = 'PLAY' ]; then + exit +fi + +# Try by Artist and Song Title first +ARTIST="$(echo "$out" | grep 'Artist:' | cut -d':' -f2 | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')" +TITLE="$(echo "$out" | grep 'SongTitle:' | cut -d':' -f2 | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')" + +if [ -n "$ARTIST" ] && [ -n "$TITLE" ]; then + ddgr -w azlyrics.com --ducky "$ARTIST" "$TITLE" +else + # Try by file name + FILENAME="$(basename "$(echo "$out" | grep 'File:' | cut -d':' -f2)")" + FILENAME="$(echo "${FILENAME%%.*}" | tr -d -)" + + if [ -n "$FILENAME" ]; then + ddgr -w azlyrics.com --ducky "$FILENAME" + fi +fi diff --git a/nnn-4.9/plugins/mocq b/nnn-4.9/plugins/mocq @@ -0,0 +1,89 @@ +#!/usr/bin/env sh + +# Description: Appends and optionally plays music in MOC +# +# Notes: +# - if selection is available, plays it, else plays the current file or directory +# - appends tracks and exits is MOC is running, else clears playlist and adds tracks +# - to let mocp shuffle tracks, set SHUFFLE=1 +# +# Shell: POSIX compliant +# Authors: Arun Prakash Jana, ath3 + +IFS="$(printf '\n\r')" +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +cmd=$(pgrep -x mocp 2>/dev/null) +ret=$cmd + +SHUFFLE="${SHUFFLE:-0}" + +mocp_add () +{ + if [ "$SHUFFLE" = 1 ]; then + if [ "$resp" = "y" ]; then + arr=$(tr '\0' '\n' < "$selection") + elif [ -n "$1" ]; then + arr="$1" + fi + + for entry in $arr + do + if [ -d "$entry" ]; then + arr2=$arr2$(find "$entry" -type f \( ! -iname "*.m3u" ! -iname "*.pls" \)) + elif echo "$entry" | grep -qv '\.m3u$\|\.pls$' ; then + arr2=$(printf "%s\n%s" "$entry" "$arr2") + fi + done + + mocp -o shuffle + echo "$arr2" | xargs -d "\n" mocp -a + else + if [ "$resp" = "y" ]; then + xargs < "$selection" -0 mocp -a + else + mocp -a "$1" + fi + fi +} + +if [ ! -s "$selection" ] && [ -z "$1" ]; then + exit +fi + +if [ "$2" = "opener" ]; then + : +elif [ -s "$selection" ]; then + printf "Work with selection? Enter 'y' to confirm: " + read -r resp +fi + +if [ -z "$ret" ]; then + # mocp not running + mocp -S +else + # mocp running, check if it's playing + state=$(mocp -i | grep "State:" | cut -d' ' -f2) + + if [ "$state" = 'PLAY' ]; then + # add to playlist and exit + mocp_add "$1" + + # uncomment the line below to show mocp interface after appending + # mocp + + exit + fi +fi + +# clear selection and play +mocp -c +mocp_add "$1" "$resp" +mocp -p + +# uncomment the line below to show mocp interface after appending +# mocp + +# Clear selection +if [ "$resp" = "y" ] && [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" +fi diff --git a/nnn-4.9/plugins/mp3conv b/nnn-4.9/plugins/mp3conv @@ -0,0 +1,41 @@ +#!/usr/bin/env sh + +# Description: Extract audio from multimedia files and convert to mp3 +# +# Dependencies: ffmpeg compiled with libmp3lame audio codec support +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +outdir=_mp3files + +handle_multimedia() { + mime="${1}" + file="${2}" + + case "${mime}" in + audio/* | video/*) + ffmpeg -i "${file}" -vn -codec:a libmp3lame -q:a 2 "${outdir}/${file%.*}.mp3" + ;; + *) + ;; + esac +} + +printf "Process 'a'll in directory or 'c'urrent? " +read -r resp + +if [ "$resp" = "a" ]; then + if ! [ -e "${outdir}" ]; then + mkdir "${outdir}" + fi + + for f in *; do + if [ -f "${f}" ]; then + mimestr="$( file --dereference --brief --mime-type -- "${f}" )" + handle_multimedia "${mimestr}" "${f}" + fi + done +elif [ "$resp" = "c" ] && [ -f "$1" ]; then + ffmpeg -i "${1}" -vn -codec:a libmp3lame -q:a 2 "${1%.*}.mp3" +fi diff --git a/nnn-4.9/plugins/mtpmount b/nnn-4.9/plugins/mtpmount @@ -0,0 +1,76 @@ +#!/usr/bin/env sh + +# Description: Toggle mount of MTP device (eg. Android device) +# 'l' to list mountable devices +# 'n' integer associated to device to mount +# 'q'/'Return' exit +# +# Dependencies: gvfs-mtp +# +# Notes: The MTP device should be mounted at /run/user/$UID/gvfs. +# Put /run/user/$UID/gvfs to bookmark entries (NNN_BMS) for faster access. +# Make sure the device is unlocked when mounting. +# +# When doing copy-paste into MTP device, you will get an error like this: +# cp: preserving times for './gambar1.png': Operation not supported +# That just means the file is copied but timestamp won't be preserved. +# It's like doing `cp -p localfile.txt file-to-SMB.txt`. +# +# Shell: POSIX compliant +# Author: Benawi Adha + +prompt="Device number ('l' to list): " + +IFS=' +' + +lsmtp () { + devs=$(gio mount -li | grep -e 'activation_root' | sed 's/\s*activation_root=//g') + c=1 + printf "Devices list:\n" + for i in $devs; do + printf "%s %s\\n" "$c" "$i" + c=$(( c + 1 )) + done + echo +} + +lsmtp +printf "%s" "$prompt" +read -r input + +while [ -n "$input" ] +do + if [ "$input" = "l" ]; then + lsmtp + elif [ "$input" = "q" ] || [ "$input" -eq 0 ]; then + exit + elif [ "$input" -le "$(printf '%s\n' "${devs}" | grep -c '^')" ]; then + # dev=$(printf "%s\n" "$devs" | cut -d$'\n' -f${input}) + c=1 + for i in $devs; do + dev=$i + if [ "$input" -eq $c ]; then + break + fi + c=$(( c + 1 )) + done + + if (gio mount -l | grep '^Mount([1-9]).*'"$dev" ) 1>/dev/null; then + if gio mount -u "${dev}"; then + printf "%s unmounted\n" "$dev" + fi + else + if gio mount "${dev}"; then + printf "%s mounted to /run/user/\$UID/gvfs\n" "$dev" + fi + fi + echo + else + printf "Invalid input\n" + fi + + printf "%s" "$prompt" + read -r input +done + diff --git a/nnn-4.9/plugins/nbak b/nnn-4.9/plugins/nbak @@ -0,0 +1,75 @@ +#!/usr/bin/env sh + +# Description: Backup nnn configuration +# - config dir content +# - environment config +# - shell functions and aliases +# +# Shell: POSIX compliant +# Author: Léo Villeveygoux + +nnn_aliases="n nnn" + +outdir="nnn-$(whoami)@$(hostname)" + +outfile="${outdir}.tar.bz2" + +shellname="$(basename "$SHELL")" + +conffile="config.txt" + +configdir="${XDG_CONFIG_HOME:-$HOME/.config}/nnn" + +workdir="$PWD" + +tempdir="$(mktemp -d)" + +mkdir "$tempdir/$outdir" + +if [ ! -d "$tempdir" ]; then + echo "Can't create work directory." >&2 + exit 1 +fi + +cd "$tempdir/$outdir" || exit 1 + +# Backing up config dir content +cp -r "$configdir" . || exit 1 + +# Environment config +env | sed "s/'/'\\\\''/" |\ + awk '/^NNN_/{print "export '\''"$0"'\''"}' > "$conffile" + +# Shell functions/aliases +case "$shellname" in + bash) + for name in $nnn_aliases ; do + if [ "$(bash -ic "type -t $name")" = "function" ] ; then + bash -ic "type $name" | tail -n+2 >> "$conffile" + elif bash -ic "alias $name" >/dev/null 2>&1 ; then + bash -ic "alias $name" >> "$conffile" + fi + done + ;; + zsh) + for name in $nnn_aliases ; do + if zsh -ic "functions $name" ; then + zsh -ic "functions $name" >> "$conffile" + elif zsh -ic "alias $name" ; then + echo alias "$(zsh -ic "alias $name")" >> "$conffile" + fi + done + ;; + + *) + echo "Unknown shell, skipping alias/function checking." >&2 + ;; +esac + +cd .. || exit 1 + +printf "Saving as '%s' ... " "$workdir/$outfile" + +tar caf "$workdir/$outfile" "$outdir" && echo "Done" || echo "Failed" + +cd "$workdir" && rm -rf "$tempdir" diff --git a/nnn-4.9/plugins/nmount b/nnn-4.9/plugins/nmount @@ -0,0 +1,88 @@ +#!/usr/bin/env sh + +# Description: Toggle mount status of a device using pmount +# If the device is not mounted, it will be mounted. +# If the device is mounted, it will be unmounted and powered down. +# +# Dependencies: lsblk, pmount (optional), udisks2 +# +# Usage: Runs `lsblk` on 'l', exits on 'Return`. +# +# Notes: +# - The script uses Linux-specific lsblk to list block devices. Alternatives: +# macOS: "diskutil list" +# BSD: "geom disk list" +# - The script uses udisksctl (from udisks2) to power down devices. This is also Linux-specific. +# Users on non-Linux platforms can comment it and use an alternative to power-down disks. +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +prompt="device name [e.g. sdXn] ('l'ist, 'q'uit): " + +lsblk + +printf "\nEnsure you aren't still in the mounted device.\n" +printf "%s" "$prompt" +read -r dev + +while [ -n "$dev" ]; do + if [ "$dev" = "l" ]; then + lsblk + elif [ "$dev" = "q" ]; then + exit + else + # LUKS volumes mounted with udisksctl appear differently than with pmount + if grep -qs "$dev " /proc/mounts || [ -n "$(lsblk -n "/dev/$dev" -o MOUNTPOINT)" ]; then + sync "$(lsblk -n "/dev/$dev" -o MOUNTPOINT | sed "/^$/d")" + if type pumount >/dev/null 2>&1; then + pumount "/dev/$dev" + exit_code="$?" + else + # Unlike pmount, udisksctl does not transparently handle LUKS volumes + # We need to manually get the unlocked device, unmount it, and then lock the volume + if lsblk -n "/dev/$dev" -o FSTYPE | grep "crypto_LUKS" >/dev/null; then + dev_map="$(udisksctl info -b /dev/"$dev" | grep "CleartextDevice" | grep -o "dm_2d[[:digit:]]*" | sed "s/_2d/-/")" + udisksctl unmount -b "/dev/$dev_map" --no-user-interaction >/dev/null + exit_code="$?" + udisksctl lock -b "/dev/$dev" --no-user-interaction >/dev/null + else + udisksctl unmount -b "/dev/$dev" --no-user-interaction >/dev/null + exit_code="$?" + fi + fi + if [ $exit_code -eq 0 ]; then + echo "/dev/$dev unmounted." + if udisksctl power-off -b "/dev/$dev" --no-user-interaction; then + echo "/dev/$dev ejected." + fi + fi + elif [ -b "/dev/$dev" ]; then + if type pmount >/dev/null 2>&1; then + pmount "/dev/$dev" + exit_code="$?" + else + # Unlike pmount, udisksctl does not transparently handle LUKS volumes + # We need to manually get the unlocked device and mount that instead of the volume itself + if [ "$(lsblk "/dev/$dev" -n -o FSTYPE)" = "crypto_LUKS" ]; then + dev_map=$(udisksctl unlock -b "/dev/$dev" --no-user-interaction | grep -o "dm-[[:digit:]]*") + udisksctl mount -b "/dev/$dev_map" --no-user-interaction >/dev/null + exit_code="$?" + else + udisksctl mount -b "/dev/$dev" --no-user-interaction >/dev/null + exit_code="$?" + fi + fi + if [ $exit_code -eq 0 ]; then + sleep 1 + echo "/dev/$dev mounted to $(lsblk -n "/dev/$dev" -o MOUNTPOINT | sed "/^$/d")." + fi + else + echo "/dev/$dev does not exist or is not a block device." + fi + fi + + echo + printf "%s" "$prompt" + read -r dev +done diff --git a/nnn-4.9/plugins/nuke b/nnn-4.9/plugins/nuke @@ -0,0 +1,555 @@ +#!/usr/bin/env sh + +# Description: Sample script to play files in apps by file type or mime +# +# Shell: POSIX compliant +# Usage: nuke filepath +# +# Integration with nnn: +# 1. Export the required config: +# export NNN_OPENER=/absolute/path/to/nuke +# # Otherwise, if nuke is in $PATH +# # export NNN_OPENER=nuke +# 2. Run nnn with the program option to indicate a CLI opener +# nnn -c +# # The -c program option overrides option -e +# 3. nuke can use nnn plugins (e.g. mocq is used for audio), $PATH is updated. +# +# Details: +# Inspired by ranger's scope.sh, modified for usage with nnn. +# +# Guards against accidentally opening mime types like executables, shared libs etc. +# +# Tries to play 'file' (1st argument) in the following order: +# 1. by extension +# 2. by mime (image, video, audio, pdf) +# 3. by mime (other file types) +# 4. by mime (prompt and run executables) +# +# Modification tips: +# 1. Invokes CLI utilities by default. Set GUI to 1 to enable GUI apps. +# 2. PAGER is "less -R". +# 3. Start GUI apps in bg to unblock. Redirect stdout and strerr if required. +# 4. Some CLI utilities are piped to the $PAGER, to wait and quit uniformly. +# 5. If the output cannot be paged use "read -r _" to wait for user input. +# 6. On a DE, try 'xdg-open' or 'open' in handle_fallback() as last resort. +# +# Feel free to change the utilities to your favourites and add more mimes. +# +# Defaults: +# By extension (only the enabled ones): +# most archives: list with atool, bsdtar +# rar: list with unrar +# 7-zip: list with 7z +# pdf: zathura (GUI), pdftotext, mutool, exiftool +# audio: mocq (nnn plugin using MOC), mpv, media_client (Haiku), mediainfo, exiftool +# avi|mkv|mp4: smplayer, mpv (GUI), ffmpegthumbnailer, mediainfo, exiftool +# log: vi +# torrent: rtorrent, transmission-show +# odt|ods|odp|sxw: odt2txt +# md: glow (https://github.com/charmbracelet/glow), lowdown (https://kristaps.bsd.lv/lowdown) +# htm|html|xhtml: w3m, lynx, elinks +# json: jq, python (json.tool module) +# Multimedia by mime: +# image/*: imv/sxiv/nsxiv (GUI), viu (https://github.com/atanunq/viu), img2txt, exiftool +# video/*: smplayer, mpv (GUI), ffmpegthumbnailer, mediainfo, exiftool +# audio/*: mocq (nnn plugin using MOC), mpv, media_client (Haiku), mediainfo, exiftool +# application/pdf: zathura (GUI), pdftotext, mutool, exiftool +# Other mimes: +# text/troff: man -l +# text/* | */xml: vi +# image/vnd.djvu): djvutxt, exiftool +# +# TODO: +# 1. Adapt, test and enable all mimes +# 2. Clean-up the unnecessary exit codes + +# set to 1 to enable GUI apps and/or BIN execution +GUI="${GUI:-0}" +BIN="${BIN:-0}" + +set -euf -o noclobber -o noglob -o nounset +IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}" # protect trailing \n + +PATH=$PATH:"${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins" +IMAGE_CACHE_PATH="$(dirname "$1")"/.thumbs + +FPATH="$1" +FNAME=$(basename "$1") +EDITOR="${VISUAL:-${EDITOR:-vi}}" +PAGER="${PAGER:-less -R}" +ext="${FNAME##*.}" +if [ -n "$ext" ]; then + ext="$(printf "%s" "${ext}" | tr '[:upper:]' '[:lower:]')" +fi + +is_mac() { + uname | grep -q "Darwin" +} + +handle_pdf() { + if [ "$GUI" -ne 0 ]; then + if is_mac; then + nohup open "${FPATH}" >/dev/null 2>&1 & + elif type zathura >/dev/null 2>&1; then + nohup zathura "${FPATH}" >/dev/null 2>&1 & + else + return + fi + elif type pdftotext >/dev/null 2>&1; then + ## Preview as text conversion + pdftotext -l 10 -nopgbrk -q -- "${FPATH}" - | eval "$PAGER" + elif type mutool >/dev/null 2>&1; then + mutool draw -F txt -i -- "${FPATH}" 1-10 | eval "$PAGER" + elif type exiftool >/dev/null 2>&1; then + exiftool "${FPATH}" | eval "$PAGER" + else + return + fi + exit 0 +} + +handle_audio() { + if type mocp >/dev/null 2>&1 && type mocq >/dev/null 2>&1; then + mocq "${FPATH}" "opener" >/dev/null 2>&1 + elif type mpv >/dev/null 2>&1; then + mpv "${FPATH}" >/dev/null 2>&1 & + elif type media_client >/dev/null 2>&1; then + media_client play "${FPATH}" >/dev/null 2>&1 & + elif type mediainfo >/dev/null 2>&1; then + mediainfo "${FPATH}" | eval "$PAGER" + elif type exiftool >/dev/null 2>&1; then + exiftool "${FPATH}"| eval "$PAGER" + else + return + fi + exit 0 +} + +handle_video() { + if [ "$GUI" -ne 0 ]; then + if is_mac; then + nohup open "${FPATH}" >/dev/null 2>&1 & + elif type smplayer >/dev/null 2>&1; then + nohup smplayer "${FPATH}" >/dev/null 2>&1 & + elif type mpv >/dev/null 2>&1; then + nohup mpv "${FPATH}" >/dev/null 2>&1 & + else + return + fi + elif type ffmpegthumbnailer >/dev/null 2>&1; then + # Thumbnail + [ -d "${IMAGE_CACHE_PATH}" ] || mkdir "${IMAGE_CACHE_PATH}" + ffmpegthumbnailer -i "${FPATH}" -o "${IMAGE_CACHE_PATH}/${FNAME}.jpg" -s 0 + viu -n "${IMAGE_CACHE_PATH}/${FNAME}.jpg" | eval "$PAGER" + elif type mediainfo >/dev/null 2>&1; then + mediainfo "${FPATH}" | eval "$PAGER" + elif type exiftool >/dev/null 2>&1; then + exiftool "${FPATH}"| eval "$PAGER" + else + return + fi + exit 0 +} + +# handle this extension and exit +handle_extension() { + case "${ext}" in + ## Archive + a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\ + rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip) + if type atool >/dev/null 2>&1; then + atool --list -- "${FPATH}" | eval "$PAGER" + exit 0 + elif type bsdtar >/dev/null 2>&1; then + bsdtar --list --file "${FPATH}" | eval "$PAGER" + exit 0 + fi + exit 1;; + rar) + if type unrar >/dev/null 2>&1; then + ## Avoid password prompt by providing empty password + unrar lt -p- -- "${FPATH}" | eval "$PAGER" + fi + exit 1;; + 7z) + if type 7z >/dev/null 2>&1; then + ## Avoid password prompt by providing empty password + 7z l -p -- "${FPATH}" | eval "$PAGER" + exit 0 + fi + exit 1;; + + ## PDF + pdf) + handle_pdf + exit 1;; + + ## Audio + aac|flac|m4a|mid|midi|mpa|mp2|mp3|ogg|wav|wma) + handle_audio + exit 1;; + + ## Video + avi|mkv|mp4) + handle_video + exit 1;; + + ## Log files + log) + "$EDITOR" "${FPATH}" + exit 0;; + + ## BitTorrent + torrent) + if type rtorrent >/dev/null 2>&1; then + rtorrent "${FPATH}" + exit 0 + elif type transmission-show >/dev/null 2>&1; then + transmission-show -- "${FPATH}" + exit 0 + fi + exit 1;; + + ## OpenDocument + odt|ods|odp|sxw) + if type odt2txt >/dev/null 2>&1; then + ## Preview as text conversion + odt2txt "${FPATH}" | eval "$PAGER" + exit 0 + fi + exit 1;; + + ## Markdown + md) + if type glow >/dev/null 2>&1; then + glow -sdark "${FPATH}" | eval "$PAGER" + exit 0 + elif type lowdown >/dev/null 2>&1; then + lowdown -Tterm "${FPATH}" | eval "$PAGER" + exit 0 + fi + ;; + + ## HTML + htm|html|xhtml) + ## Preview as text conversion + if type w3m >/dev/null 2>&1; then + w3m -dump "${FPATH}" | eval "$PAGER" + exit 0 + elif type lynx >/dev/null 2>&1; then + lynx -dump -- "${FPATH}" | eval "$PAGER" + exit 0 + elif type elinks >/dev/null 2>&1; then + elinks -dump "${FPATH}" | eval "$PAGER" + exit 0 + fi + ;; + + ## JSON + json) + if type jq >/dev/null 2>&1; then + jq --color-output . "${FPATH}" | eval "$PAGER" + exit 0 + elif type python >/dev/null 2>&1; then + python -m json.tool -- "${FPATH}" | eval "$PAGER" + exit 0 + fi + ;; + esac +} + +# sets the variable abs_target, this should be faster than calling printf +abspath() { + case "$1" in + /*) abs_target="$1";; + *) abs_target="$PWD/$1";; + esac +} + +# storing the result to a tmp file is faster than calling listimages twice +listimages() { + find -L "///${1%/*}" -maxdepth 1 -type f -print0 | + grep -izZE '\.(jpe?g|png|gif|webp|tiff|bmp|ico|svg)$' | + sort -z | tee "$tmp" +} + +load_dir() { + abspath "$2" + tmp="${TMPDIR:-/tmp}/nuke_$$" + trap 'rm -f $tmp' EXIT + count="$(listimages "$abs_target" | grep -a -m 1 -ZznF "$abs_target" | cut -d: -f1)" + + if [ -n "$count" ]; then + if [ "$GUI" -ne 0 ]; then + xargs -0 nohup "$1" -n "$count" -- < "$tmp" + else + xargs -0 "$1" -n "$count" -- < "$tmp" + fi + else + shift + "$1" -- "$@" # fallback + fi +} + +handle_multimedia() { + ## Size of the preview if there are multiple options or it has to be + ## rendered from vector graphics. If the conversion program allows + ## specifying only one dimension while keeping the aspect ratio, the width + ## will be used. + # local DEFAULT_SIZE="1920x1080" + + mimetype="${1}" + case "${mimetype}" in + ## SVG + # image/svg+xml|image/svg) + # convert -- "${FPATH}" "${IMAGE_CACHE_PATH}" && exit 6 + # exit 1;; + + ## DjVu + # image/vnd.djvu) + # ddjvu -format=tiff -quality=90 -page=1 -size="${DEFAULT_SIZE}" \ + # - "${IMAGE_CACHE_PATH}" < "${FPATH}" \ + # && exit 6 || exit 1;; + + ## Image + image/*) + if [ "$GUI" -ne 0 ]; then + if is_mac; then + nohup open "${FPATH}" >/dev/null 2>&1 & + exit 0 + elif type imv >/dev/null 2>&1; then + load_dir imv "${FPATH}" >/dev/null 2>&1 & + exit 0 + elif type imvr >/dev/null 2>&1; then + load_dir imvr "${FPATH}" >/dev/null 2>&1 & + exit 0 + elif type sxiv >/dev/null 2>&1; then + load_dir sxiv "${FPATH}" >/dev/null 2>&1 & + exit 0 + elif type nsxiv >/dev/null 2>&1; then + load_dir nsxiv "${FPATH}" >/dev/null 2>&1 & + exit 0 + fi + elif type viu >/dev/null 2>&1; then + viu -n "${FPATH}" | eval "$PAGER" + exit 0 + elif type img2txt >/dev/null 2>&1; then + img2txt --gamma=0.6 -- "${FPATH}" | eval "$PAGER" + exit 0 + elif type exiftool >/dev/null 2>&1; then + exiftool "${FPATH}" | eval "$PAGER" + exit 0 + fi + # local orientation + # orientation="$( identify -format '%[EXIF:Orientation]\n' -- "${FPATH}" )" + ## If orientation data is present and the image actually + ## needs rotating ("1" means no rotation)... + # if [[ -n "$orientation" && "$orientation" != 1 ]]; then + ## ...auto-rotate the image according to the EXIF data. + # convert -- "${FPATH}" -auto-orient "${IMAGE_CACHE_PATH}" && exit 6 + # fi + + ## `w3mimgdisplay` will be called for all images (unless overridden + ## as above), but might fail for unsupported types. + exit 7;; + + ## PDF + application/pdf) + handle_pdf + exit 1;; + + ## Audio + audio/*) + handle_audio + exit 1;; + + ## Video + video/*) + handle_video + exit 1;; + + # pdftoppm -f 1 -l 1 \ + # -scale-to-x "${DEFAULT_SIZE%x*}" \ + # -scale-to-y -1 \ + # -singlefile \ + # -jpeg -tiffcompression jpeg \ + # -- "${FPATH}" "${IMAGE_CACHE_PATH%.*}" \ + # && exit 6 || exit 1;; + + + ## ePub, MOBI, FB2 (using Calibre) + # application/epub+zip|application/x-mobipocket-ebook|\ + # application/x-fictionbook+xml) + # # ePub (using https://github.com/marianosimone/epub-thumbnailer) + # epub-thumbnailer "${FPATH}" "${IMAGE_CACHE_PATH}" \ + # "${DEFAULT_SIZE%x*}" && exit 6 + # ebook-meta --get-cover="${IMAGE_CACHE_PATH}" -- "${FPATH}" \ + # >/dev/null && exit 6 + # exit 1;; + + ## Font + # application/font*|application/*opentype) + # preview_png="/tmp/$(basename "${IMAGE_CACHE_PATH%.*}").png" + # if fontimage -o "${preview_png}" \ + # --pixelsize "120" \ + # --fontname \ + # --pixelsize "80" \ + # --text " ABCDEFGHIJKLMNOPQRSTUVWXYZ " \ + # --text " abcdefghijklmnopqrstuvwxyz " \ + # --text " 0123456789.:,;(*!?') ff fl fi ffi ffl " \ + # --text " The quick brown fox jumps over the lazy dog. " \ + # "${FPATH}"; + # then + # convert -- "${preview_png}" "${IMAGE_CACHE_PATH}" \ + # && rm "${preview_png}" \ + # && exit 6 + # else + # exit 1 + # fi + # ;; + + ## Preview archives using the first image inside. + ## (Very useful for comic book collections for example.) + # application/zip|application/x-rar|application/x-7z-compressed|\ + # application/x-xz|application/x-bzip2|application/x-gzip|application/x-tar) + # local fn=""; local fe="" + # local zip=""; local rar=""; local tar=""; local bsd="" + # case "${mimetype}" in + # application/zip) zip=1 ;; + # application/x-rar) rar=1 ;; + # application/x-7z-compressed) ;; + # *) tar=1 ;; + # esac + # { [ "$tar" ] && fn=$(tar --list --file "${FPATH}"); } || \ + # { fn=$(bsdtar --list --file "${FPATH}") && bsd=1 && tar=""; } || \ + # { [ "$rar" ] && fn=$(unrar lb -p- -- "${FPATH}"); } || \ + # { [ "$zip" ] && fn=$(zipinfo -1 -- "${FPATH}"); } || return + # + # fn=$(echo "$fn" | python -c "import sys; import mimetypes as m; \ + # [ print(l, end='') for l in sys.stdin if \ + # (m.guess_type(l[:-1])[0] or '').startswith('image/') ]" |\ + # sort -V | head -n 1) + # [ "$fn" = "" ] && return + # [ "$bsd" ] && fn=$(printf '%b' "$fn") + # + # [ "$tar" ] && tar --extract --to-stdout \ + # --file "${FPATH}" -- "$fn" > "${IMAGE_CACHE_PATH}" && exit 6 + # fe=$(echo -n "$fn" | sed 's/[][*?\]/\\\0/g') + # [ "$bsd" ] && bsdtar --extract --to-stdout \ + # --file "${FPATH}" -- "$fe" > "${IMAGE_CACHE_PATH}" && exit 6 + # [ "$bsd" ] || [ "$tar" ] && rm -- "${IMAGE_CACHE_PATH}" + # [ "$rar" ] && unrar p -p- -inul -- "${FPATH}" "$fn" > \ + # "${IMAGE_CACHE_PATH}" && exit 6 + # [ "$zip" ] && unzip -pP "" -- "${FPATH}" "$fe" > \ + # "${IMAGE_CACHE_PATH}" && exit 6 + # [ "$rar" ] || [ "$zip" ] && rm -- "${IMAGE_CACHE_PATH}" + # ;; + esac +} + +handle_mime() { + mimetype="${1}" + case "${mimetype}" in + ## Manpages + text/troff) + man -l "${FPATH}" + exit 0;; + + ## Text + text/* | */xml) + "$EDITOR" "${FPATH}" + exit 0;; + ## Syntax highlight + # if [[ "$( stat --printf='%s' -- "${FPATH}" )" -gt "${HIGHLIGHT_SIZE_MAX}" ]]; then + # exit 2 + # fi + # if [[ "$( tput colors )" -ge 256 ]]; then + # local pygmentize_format='terminal256' + # local highlight_format='xterm256' + # else + # local pygmentize_format='terminal' + # local highlight_format='ansi' + # fi + # env HIGHLIGHT_OPTIONS="${HIGHLIGHT_OPTIONS}" highlight \ + # --out-format="${highlight_format}" \ + # --force -- "${FPATH}" && exit 5 + # pygmentize -f "${pygmentize_format}" -O "style=${PYGMENTIZE_STYLE}"\ + # -- "${FPATH}" && exit 5 + # exit 2;; + + ## DjVu + image/vnd.djvu) + if type djvutxt >/dev/null 2>&1; then + ## Preview as text conversion (requires djvulibre) + djvutxt "${FPATH}" | eval "$PAGER" + exit 0 + elif type exiftool >/dev/null 2>&1; then + exiftool "${FPATH}" | eval "$PAGER" + exit 0 + fi + exit 1;; + esac +} + +handle_fallback() { + if [ "$GUI" -ne 0 ]; then + if type xdg-open >/dev/null 2>&1; then + nohup xdg-open "${FPATH}" >/dev/null 2>&1 & + exit 0 + elif type open >/dev/null 2>&1; then + nohup open "${FPATH}" >/dev/null 2>&1 & + exit 0 + fi + fi + + echo '----- File details -----' && file --dereference --brief -- "${FPATH}" + exit 1 +} + +handle_blocked() { + case "${MIMETYPE}" in + application/x-sharedlib) + exit 0;; + + application/x-shared-library-la) + exit 0;; + + application/x-executable) + exit 0;; + + application/x-shellscript) + exit 0;; + + application/octet-stream) + exit 0;; + esac +} + +handle_bin() { + case "${MIMETYPE}" in + application/x-executable|application/x-shellscript) + clear + echo '-------- Executable File --------' && file --dereference --brief -- "${FPATH}" + printf "Run executable (y/N/'a'rgs)? " + read -r answer + case "$answer" in + [Yy]* ) exec "${FPATH}";; + [Aa]* ) + printf "args: " + read -r args + exec "${FPATH}" "$args";; + [Nn]* ) exit;; + esac + esac +} + +MIMETYPE="$( file -bL --mime-type -- "${FPATH}" )" +handle_extension +handle_multimedia "${MIMETYPE}" +handle_mime "${MIMETYPE}" +[ "$BIN" -ne 0 ] && [ -x "${FPATH}" ] && handle_bin +handle_blocked "${MIMETYPE}" +handle_fallback + +exit 1 diff --git a/nnn-4.9/plugins/oldbigfile b/nnn-4.9/plugins/oldbigfile @@ -0,0 +1,16 @@ +#!/usr/bin/env sh + +# Description: List files bigger than input size by ascending access date. +# +# Dependencies: find sort +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +printf "Min file size (MB): " +read -r size + +find . -size +"$size"M -type f -printf '%A+ %s %p\n' | sort + +echo "Press any key to exit" +read -r _ diff --git a/nnn-4.9/plugins/openall b/nnn-4.9/plugins/openall @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +# Description: Open selected files in nuke one by one or in oneshot +# +# Notes: 1. Opens the hovered file if the selection is empty +# 2. nuke is the default, set OPENER below for custom +# 3. Opener is invoked once for each file in a loop +# 4. Keep pressing "Enter" to open files one by one +# +# Shell: bash +# Author: Arun Prakash Jana + +sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +OPENER="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke" + +if [ -s "$sel" ]; then + targets=() + while IFS= read -r -d '' entry || [ -n "$entry" ]; do + targets+=( "$entry" ) + done < "$sel" + + elements=${#targets[@]} + + if (( elements == 1 )); then + # If there's only one file selected, open without prompts + "$OPENER" "${targets[0]}" + else + printf "open [A]ll? " + read -r all + + for ((index=0; index <= ${#targets[@]}; index++)); do + "$OPENER" "${targets[index]}" + if [ "$all" != "A" ] && (( index+1 < elements )); then + printf "press Enter to open '%s'\n" "${targets[index+1]}" + read -r -s -n 1 key + if [[ $key != "" ]]; then + break + fi + fi + done + fi + + # Clear selection + if [ -s "$sel" ] && [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" + fi +elif [ -n "$1" ]; then + "$OPENER" "$1" +fi diff --git a/nnn-4.9/plugins/organize b/nnn-4.9/plugins/organize @@ -0,0 +1,62 @@ +#!/usr/bin/env sh + +# Description: Organize files in directories by category +# +# Note: This plugin clears the selection as it changes the contents of the current dir +# +# Shell: POSIX compliant +# Author: th3lusive + +sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +organize() { + case "$(file -biL "$1")" in + *video*) + [ ! -d "Videos" ] && mkdir "Videos" + mv "$1" "Videos/$1" + printf "Moved %s to Videos\n" "$1" ;; + + *audio*) [ ! -d "Audio" ] && mkdir "Audio" + mv "$1" "Audio/$1" + printf "Moved %s to Audio\n" "$1" ;; + + *image*) + [ ! -d "Images" ] && mkdir "Images" + mv "$1" "Images/$1" + printf "Moved %s to Images\n" "$1" ;; + + *pdf*|*document*|*epub*|*djvu*|*cb*) + [ ! -d "Documents" ] && mkdir "Documents" + mv "$1" "Documents/$1" + printf "Moved %s to Documents\n" "$1" ;; + + *text*) + [ ! -d "Plaintext" ] && mkdir "Plaintext" + mv "$1" "Plaintext/$1" + printf "Moved %s to Plaintext\n" "$1" ;; + + *tar*|*xz*|*compress*|*7z*|*rar*|*zip*) + [ ! -d "Archives" ] && mkdir "Archives" + mv "$1" "Archives/$1" + printf "Moved %s to Archives\n" "$1" ;; + + *binary*) + [ ! -d "Binaries" ] && mkdir "Binaries" + mv "$1" "Binaries/$1" + printf "Moved %s to Binaries\n" "$1" ;; + esac +} + +main() { + for file in * + do + [ -f "$file" ] && organize "$file" + done + + # Clear selection + if [ -s "$sel" ] && [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" + fi +} + +main "$@" diff --git a/nnn-4.9/plugins/pdfread b/nnn-4.9/plugins/pdfread @@ -0,0 +1,30 @@ +#!/usr/bin/env sh + +# Description: Read a text or PDF file in British English +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +if [ -n "$1" ]; then + tmpf="$(basename "$1")" + tmpf="${TMPDIR:-/tmp}"/"${tmpf%.*}" + + if [ "$(head -c 4 "$1")" = "%PDF" ]; then + # Convert using pdftotext + pdftotext -nopgbrk -layout "$1" - | sed 's/\xe2\x80\x8b//g' > "$tmpf".txt + + pico2wave -w "$tmpf".wav -l en-GB "$(tr '\n' ' ' < "$tmpf".txt)" + + rm "$tmpf".txt + else + pico2wave -w "$tmpf".wav -l en-GB "$(tr '\n' ' ' < "$1")" + fi + + # to jump around and note the time + mpv "$tmpf".wav + + # flat read but better quality + # play -qV0 "$tmpf".wav treble 2 gain -l 2 + + rm "$tmpf".wav +fi diff --git a/nnn-4.9/plugins/preview-tabbed b/nnn-4.9/plugins/preview-tabbed @@ -0,0 +1,216 @@ +#!/usr/bin/env bash + +# Description: tabbed/xembed based file previewer +# +# Dependencies: +# - tabbed (https://tools.suckless.org/tabbed): xembed host +# - xterm (or urxvt or st) : xembed client for text-based preview +# - mpv (https://mpv.io): xembed client for video/audio +# - sxiv (https://github.com/muennich/sxiv) or, +# - nsxiv (https://codeberg.org/nsxiv/nsxiv) : xembed client for images +# - zathura (https://pwmt.org/projects/zathura): xembed client for PDF +# - nnn's nuke plugin for text preview and fallback +# nuke is a fallback for 'mpv', 'sxiv'/'nsxiv', and 'zathura', but has its +# own dependencies, see the script for more information +# - vim (or any editor/pager really) +# - file +# - mktemp +# - xdotool (optional, to keep main window focused) +# +# Usage: +# - Install the dependencies. Then set a NNN_FIFO +# and set a key for the plugin, then start `nnn`: +# $ NNN_FIFO=/tmp/nnn.fifo nnn +# - Launch the plugin with the designated key from nnn +# +# Notes: +# 1. This plugin needs a "NNN_FIFO" to work. See man. +# 2. If the same NNN_FIFO is used in multiple nnn instances, there will be one +# common preview window. With different FIFO paths, they will be independent. +# 3. This plugin only works on X, not on Wayland. +# +# How it works: +# We use `tabbed` [1] as a xembed [2] host, to have a single window +# owning each previewer window. So each previewer must be a xembed client. +# For text previewers, this is not an issue, as there are a lot of +# xembed-able terminal emulator (we default to `xterm`, but examples are +# provided for `urxvt` and `st`). For graphic preview this can be trickier, +# but a few popular viewers are xembed-able, we use: +# - `mpv`: multimedia player, for video/audio preview +# - `sxiv`/`nsxiv`: image viewer +# - `zathura`: PDF viewer +# - but we always fallback to `nuke` plugin +# +# [1]: https://tools.suckless.org/tabbed/ +# [2]: https://specifications.freedesktop.org/xembed-spec/xembed-spec-latest.html +# +# Shell: Bash (job control is weakly specified in POSIX) +# Author: Léo Villeveygoux + + +XDOTOOL_TIMEOUT=2 +PAGER=${PAGER:-"vim -R"} +NUKE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke" + +if [ -n "$WAYLAND_DISPLAY" ] ; then + echo "Wayland is not supported in preview-tabbed, this plugin could freeze your session!" >&2 + exit 1 +fi + +if type xterm >/dev/null 2>&1 ; then + TERMINAL="xterm -into" +elif type urxvt >/dev/null 2>&1 ; then + TERMINAL="urxvt -embed" +elif type st >/dev/null 2>&1 ; then + TERMINAL="st -w" +else + echo "No xembed term found" >&2 +fi + + +term_nuke () { + # $1 -> $XID, $2 -> $FILE + $TERMINAL "$1" -e "$NUKE" "$2" & +} + +start_tabbed () { + FIFO="$(mktemp -u)" + mkfifo "$FIFO" + + tabbed > "$FIFO" & + + jobs # Get rid of the "Completed" entries + + TABBEDPID="$(jobs -p %%)" + + if [ -z "$TABBEDPID" ] ; then + echo "Can't start tabbed" + exit 1 + fi + + read -r XID < "$FIFO" + + rm "$FIFO" +} + +get_viewer_pid () { + VIEWERPID="$(jobs -p %%)" +} + +kill_viewer () { + if [ -n "$VIEWERPID" ] && jobs -p | grep "$VIEWERPID" ; then + kill "$VIEWERPID" + fi +} + +sigint_kill () { + kill_viewer + kill "$TABBEDPID" + exit 0 +} + +previewer_loop () { + unset -v NNN_FIFO + # mute from now + exec >/dev/null 2>&1 + + MAINWINDOW="$(xdotool getactivewindow)" + + start_tabbed + trap sigint_kill SIGINT + + xdotool windowactivate "$MAINWINDOW" + + # Bruteforce focus stealing prevention method, + # works well in floating window managers like XFCE + # but make interaction with the preview window harder + # (uncomment to use): + #xdotool behave "$XID" focus windowactivate "$MAINWINDOW" & + + while read -r FILE ; do + + jobs # Get rid of the "Completed" entries + + if ! jobs | grep tabbed ; then + break + fi + + if [ ! -e "$FILE" ] ; then + continue + fi + + kill_viewer + + MIME="$(file -bL --mime-type "$FILE")" + + case "$MIME" in + video/*) + if type mpv >/dev/null 2>&1 ; then + mpv --force-window=immediate --loop-file --wid="$XID" "$FILE" & + else + term_nuke "$XID" "$FILE" + fi + ;; + audio/*) + if type mpv >/dev/null 2>&1 ; then + mpv --force-window=immediate --loop-file --wid="$XID" "$FILE" & + else + term_nuke "$XID" "$FILE" + fi + ;; + image/*) + if type sxiv >/dev/null 2>&1 ; then + sxiv -ae "$XID" "$FILE" & + elif type nsxiv >/dev/null 2>&1 ; then + nsxiv -ae "$XID" "$FILE" & + else + term_nuke "$XID" "$FILE" + fi + ;; + application/pdf) + if type zathura >/dev/null 2>&1 ; then + zathura -e "$XID" "$FILE" & + else + term_nuke "$XID" "$FILE" + fi + ;; + inode/directory) + $TERMINAL "$XID" -e nnn "$FILE" & + ;; + text/*) + if [ -x "$NUKE" ] ; then + term_nuke "$XID" "$FILE" + else + # shellcheck disable=SC2086 + $TERMINAL "$XID" -e $PAGER "$FILE" & + fi + ;; + *) + if [ -x "$NUKE" ] ; then + term_nuke "$XID" "$FILE" + else + $TERMINAL "$XID" -e sh -c "file '$FILE' | $PAGER -" & + fi + ;; + esac + get_viewer_pid + + # following lines are not needed with the bruteforce xdotool method + ACTIVE_XID="$(xdotool getactivewindow)" + if [ $((ACTIVE_XID == XID)) -ne 0 ] ; then + xdotool windowactivate "$MAINWINDOW" + else + timeout "$XDOTOOL_TIMEOUT" xdotool behave "$XID" focus windowactivate "$MAINWINDOW" & + fi + done + kill "$TABBEDPID" + kill_viewer +} + +if [ ! -r "$NNN_FIFO" ] ; then + echo "Can't read \$NNN_FIFO ('$NNN_FIFO')" + exit 1 +fi + +previewer_loop < "$NNN_FIFO" & +disown diff --git a/nnn-4.9/plugins/preview-tui b/nnn-4.9/plugins/preview-tui @@ -0,0 +1,491 @@ +#!/usr/bin/env bash + +# Description: Terminal based file previewer +# +# Note: This plugin needs a "NNN_FIFO" to work. See man. +# +# Dependencies: +# - Supports 6 independent methods to preview with: +# - tmux (>=3.0), or +# - kitty with allow_remote_control and listen_on set in kitty.conf, or +# - wezterm (https://wezfurlong.org/wezterm), or +# - QuickLook on WSL (https://github.com/QL-Win/QuickLook), or +# - Windows Terminal (https://github.com/Microsoft/Terminal | https://aka.ms/terminal) with WSL, or +# - $NNN_TERMINAL set to a terminal (it's xterm by default). +# - less or $NNN_PAGER +# - tree or exa or (GNU) ls +# - mediainfo or file +# - mktemp +# - unzip +# - tar +# - man +# - optional: bsdtar or atool for additional archive preview +# - optional: bat for code syntax highlighting +# - optional: ueberzug, kitty terminal, wezterm terminal, viu, catimg or chafa for images +# - optional: convert(ImageMagick) for playing gif preview (required for kitty image previews) +# - optional: ffmpegthumbnailer for video thumbnails (https://github.com/dirkvdb/ffmpegthumbnailer) +# - optional: ffmpeg for audio thumbnails +# - optional: libreoffce for opendocument/officedocument preview +# - optional: pdftoppm(poppler) for pdf thumbnails +# - optional: gnome-epub-thumbnailer for epub thumbnails (https://gitlab.gnome.org/GNOME/gnome-epub-thumbnailer) +# - optional: fontpreview for font preview (https://github.com/sdushantha/fontpreview) +# - optional: djvulibre for djvu +# - optional: glow or lowdown for markdown +# - optional: w3m or lynx or elinks for html +# - optional: set/export NNN_ICONLOOKUP as 1 to enable file icons in front of directory previews with .iconlookup +# Icons and colors are configurable in .iconlookup +# - optional: scope.sh file viewer from ranger. +# 1. drop scope.sh executable in $PATH +# 2. set/export $NNN_SCOPE as 1 +# - optional: pistol file viewer (https://github.com/doronbehar/pistol). +# 1. install pistol +# 2. set/export $NNN_PISTOL as 1 +# +# Usage: +# You need to set a NNN_FIFO path and a key for the plugin with NNN_PLUG, +# then start `nnn`: +# +# $ nnn -a +# +# or +# +# $ NNN_FIFO=/tmp/nnn.fifo nnn +# +# Then launch the `preview-tui` plugin in `nnn`. +# +# If you provide the same NNN_FIFO to all nnn instances, there will be a +# single common preview window. If you provide different FIFO path (e.g. +# with -a), they will be independent. +# +# The previews will be shown in a tmux split. If that isn't possible, it +# will try to use a kitty terminal split. And as a final fallback, a +# different terminal window will be used ($NNN_TERMINAL). +# +# Kitty users need something similar to the following in their kitty.conf: +# - `allow_remote_control yes` +# - `listen_on unix:$TMPDIR/kitty` +# - `enabled_layouts splits` (optional) +# With ImageMagick installed, this terminal can use the icat kitten to display images. +# Refer to kitty documentation for further details. +# +# Wezterm should work out of the box. If `NNN_PREVIEWIMGPROG` is not specified it will use +# built in iTerm2 image protocol. +# +# Note that GNU ls is used for its `--group-directories-first` flag. +# On MacOS this may be installed with `brew install coreutils`, or the flag can be removed. +# iTerm2 users are recommended to use viu to view images without getting pixelated. +# +# Windows Terminal users can set "Profile termination behavior" under "Profile > Advanced" settings +# to automatically close pane on quit when exit code is 0. +# +# When specifying a different terminal, additional arguments are supported. In particular, you can +# append a specific title to the terminal and set it to "nofocus" in your WM config. +# E.g for alacritty and i3, you can set $NNN_TERMINAL to 'alacritty --title preview-tui' and add +# 'no_focus [title="preview-tui"]' to your i3 config file. +# +# Shell: Bash (for environment manipulation through arrays) +# Authors: Todd Yamakawa, Léo Villeveygoux, @Recidiviste, Mario Ortiz Manero, Luuk van Baal, @WanderLanz + +NNN_SPLIT=${NNN_SPLIT:-} # Set permanent split direction +NNN_TERMINAL=${NNN_TERMINAL:-} # Set external terminal to be used +NNN_SPLITSIZE=${NNN_SPLITSIZE:-50} # Set previewer split size percentage +TMPDIR=${TMPDIR:-/tmp} +NNN_PARENT=${NNN_FIFO#*.} +[ "$NNN_PARENT" -eq "$NNN_PARENT" ] 2>/dev/null || NNN_PARENT="" # Make empty if non-numeric +ENVVARS=( + "PWD=$PWD" + "PATH=$PATH" + "NNN_FIFO=$NNN_FIFO" + "NNN_SCOPE=${NNN_SCOPE:-0}" + "NNN_PISTOL=${NNN_PISTOL:-0}" + "NNN_ICONLOOKUP=${NNN_ICONLOOKUP:-0}" + "NNN_PAGER=${NNN_PAGER:-less -P?n -R -C}" + "NNN_BATTHEME=${NNN_BATTHEME:-ansi}" + "NNN_BATSTYLE=${NNN_BATSTYLE:-numbers}" + "NNN_PREVIEWWIDTH=${NNN_PREVIEWWIDTH:-1920}" + "NNN_PREVIEWHEIGHT=${NNN_PREVIEWHEIGHT:-1080}" + "NNN_PREVIEWDIR=${NNN_PREVIEWDIR:-$TMPDIR/nnn/previews}" + "NNN_PREVIEWIMGPROG=${NNN_PREVIEWIMGPROG:-}" + "FIFOPID=$TMPDIR/nnn-preview-tui-fifopid.$NNN_PARENT" + "FIFOPATH=$TMPDIR/nnn-preview-tui-fifo.$NNN_PARENT" + "PREVIEWPID=$TMPDIR/nnn-preview-tui-previewpid.$NNN_PARENT" + "CURSEL=$TMPDIR/nnn-preview-tui-selection.$NNN_PARENT" + "FIFO_UEBERZUG=$TMPDIR/nnn-preview-tui-ueberzug-fifo.$NNN_PARENT" + "POSOFFSET=$TMPDIR/nnn-preview-tui-posoffset" +) + +trap '' PIPE +exists() { type "$1" >/dev/null 2>&1 ;} +pkill() { command pkill "$@" >/dev/null 2>&1 ;} +prompt() { clear; printf "%b" "$@"; cfg=$(stty -g); stty raw -echo; head -c 1; stty "$cfg" ;} +pidkill() { + if [ -f "$1" ]; then + PID="$(cat "$1" 2>/dev/null)" || return 1 + kill "$PID" >/dev/null 2>&1 + RET=$? + wait "$PID" 2>/dev/null + return $RET + fi + return 1 +} + +start_preview() { + if [ -e "${TMUX%%,*}" ] && tmux -V | grep -q '[ -][3456789]\.'; then + NNN_TERMINAL=tmux + elif [ -n "$KITTY_LISTEN_ON" ]; then + NNN_TERMINAL=kitty + elif [ -n "$WEZTERM_PANE" ]; then + NNN_TERMINAL=wezterm + elif [ -z "$NNN_TERMINAL" ] && [ "$TERM_PROGRAM" = "iTerm.app" ]; then + NNN_TERMINAL=iterm + elif [ -n "$WT_SESSION" ]; then + NNN_TERMINAL=winterm + else + NNN_TERMINAL="${NNN_TERMINAL:-xterm}" + fi + + if [ -z "$NNN_SPLIT" ] && [ $(($(tput lines) * 2)) -gt "$(tput cols)" ]; then + NNN_SPLIT='h' + elif [ "$NNN_SPLIT" != 'h' ]; then + NNN_SPLIT='v' + fi + + ENVVARS+=("NNN_TERMINAL=$NNN_TERMINAL" "NNN_SPLIT=$NNN_SPLIT" "QLPATH=$2" "PREVIEW_MODE=1") + case "$NNN_TERMINAL" in + iterm|winterm) # need run in separate shell command: escape + ENVVARS=("${ENVVARS[@]/#/\\\"}") + ENVVARS=("${ENVVARS[@]/%/\\\"}") + command="$SHELL -c 'env ${ENVVARS[*]} \\\"$0\\\" \\\"$1\\\"'" ;; + esac + + case "$NNN_TERMINAL" in + tmux) # tmux splits are inverted + ENVVARS=("${ENVVARS[@]/#/-e}") + if [ "$NNN_SPLIT" = "v" ]; then split="h"; else split="v"; fi + tmux split-window "${ENVVARS[@]}" -d"$split" -p"$NNN_SPLITSIZE" "$0" "$1" ;; + kitty) # Setting the layout for the new window. It will be restored after the script ends. + ENVVARS=("${ENVVARS[@]/#/--env=}") + kitty @ goto-layout splits + # Trying to use kitty's integrated window management as the split window. + kitty @ launch --no-response --title "preview-tui" --keep-focus \ + --cwd "$PWD" "${ENVVARS[@]}" --location "${NNN_SPLIT}split" "$0" "$1" ;; + wezterm) + export "${ENVVARS[@]}" + if [ "$NNN_SPLIT" = "v" ]; then split="--horizontal"; else split="--bottom"; fi + wezterm cli split-pane --cwd "$PWD" $split --percent "$NNN_SPLITSIZE" "$0" "$1" >/dev/null + wezterm cli activate-pane-direction Prev ;; + iterm) + if [ "$NNN_SPLIT" = "h" ]; then split="horizontally"; else split="vertically"; fi + osascript <<-EOF + tell application "iTerm" + tell current session of current window + split $split with default profile command "$command" + end tell + end tell +EOF + ;; + winterm) + if [ "$NNN_SPLIT" = "h" ]; then split="H"; else split="V"; fi + wt -w 0 sp -$split -s"0.$NNN_SPLITSIZE" "$command" \; -w 0 mf previous 2>/dev/null ;; + *) if [ -n "$2" ]; then + env "${ENVVARS[@]}" QUICKLOOK=1 "$0" "$1" & + else + # shellcheck disable=SC2086 # (allow arguments) + env "${ENVVARS[@]}" $NNN_TERMINAL -e "$0" "$1" & + fi ;; + esac +} + +toggle_preview() { + export "${ENVVARS[@]}" + if exists QuickLook.exe; then + QLPATH="QuickLook.exe" + elif exists Bridge.exe; then + QLPATH="Bridge.exe" + fi + if pidkill "$FIFOPID"; then + [ -p "$NNN_PPIPE" ] && printf "0" > "$NNN_PPIPE" + pidkill "$PREVIEWPID" + pkill -f "tail --follow $FIFO_UEBERZUG" + if [ -n "$QLPATH" ] && stat "$1"; then + f="$(wslpath -w "$1")" && "$QLPATH" "$f" & + fi + else + [ -p "$NNN_PPIPE" ] && printf "1" > "$NNN_PPIPE" + start_preview "$1" "$QLPATH" + fi +} + +fifo_pager() { + cmd="$1" + shift + + # We use a FIFO to access $NNN_PAGER PID in jobs control + mkfifo "$FIFOPATH" || return + + $NNN_PAGER < "$FIFOPATH" & + printf "%s" "$!" > "$PREVIEWPID" + + ( + exec > "$FIFOPATH" + if [ "$cmd" = "pager" ]; then + if exists bat; then + bat --terminal-width="$cols" --decorations=always --color=always \ + --paging=never --style="$NNN_BATSTYLE" --theme="$NNN_BATTHEME" "$@" & + else + $NNN_PAGER "$@" & + fi + else + "$cmd" "$@" & + fi + ) + + rm "$FIFOPATH" +} + +# Binary file: show file info inside the pager +print_bin_info() { + printf -- "-------- \033[1;31mBinary file\033[0m --------\n" + if exists mediainfo; then + mediainfo "$1" + else + file -b "$1" + fi +} + +handle_mime() { + case "$2" in + image/jpeg) image_preview "$cols" "$lines" "$1" ;; + image/gif) generate_preview "$cols" "$lines" "$1" "gif" ;; + image/vnd.djvu) generate_preview "$cols" "$lines" "$1" "djvu" ;; + image/*) generate_preview "$cols" "$lines" "$1" "image" ;; + video/*) generate_preview "$cols" "$lines" "$1" "video" ;; + audio/*) generate_preview "$cols" "$lines" "$1" "audio" ;; + application/font*|application/*opentype|font/*) generate_preview "$cols" "$lines" "$1" "font" ;; + */*office*|*/*document*|*/*msword|*/*ms-excel) generate_preview "$cols" "$lines" "$1" "office" ;; + application/zip) fifo_pager unzip -l "$1" ;; + text/troff) + if exists man; then + fifo_pager man -Pcat -l "$1" + else + fifo_pager pager "$1" + fi ;; + *) handle_ext "$1" "$3" "$4" ;; + esac +} + +handle_ext() { + case "$2" in + epub) generate_preview "$cols" "$lines" "$1" "epub" ;; + pdf) generate_preview "$cols" "$lines" "$1" "pdf" ;; + gz|bz2) fifo_pager tar -tvf "$1" ;; + md) if exists glow; then + fifo_pager glow -s dark "$1" + elif exists lowdown; then + fifo_pager lowdown -Tterm "$1" + else + fifo_pager pager "$1" + fi ;; + htm|html|xhtml) + if exists w3m; then + fifo_pager w3m "$1" + elif exists lynx; then + fifo_pager lynx "$1" + elif exists elinks; then + fifo_pager elinks "$1" + else + fifo_pager pager "$1" + fi ;; + 7z|a|ace|alz|arc|arj|bz|cab|cpio|deb|jar|lha|lz|lzh|lzma|lzo\ + |rar|rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z) + if exists atool; then + fifo_pager atool -l "$1" + elif exists bsdtar; then + fifo_pager bsdtar -tvf "$1" + fi ;; + *) if [ "$3" = "bin" ]; then + fifo_pager print_bin_info "$1" + else + fifo_pager pager "$1" + fi ;; + esac +} + +preview_file() { + clear + # Trying to use pistol if it's available. + if [ "$NNN_PISTOL" -ne 0 ] && exists pistol; then + fifo_pager pistol "$1" + return + fi + + # Trying to use scope.sh if it's available. + if [ "$NNN_SCOPE" -ne 0 ] && exists scope.sh; then + fifo_pager scope.sh "$1" "$cols" "$lines" "$(mktemp -d)" "True" + return + fi + + # Use QuickLook if it's available. + if [ -n "$QUICKLOOK" ]; then + stat "$1" && f="$(wslpath -w "$1")" && "$QLPATH" "$f" & + return + fi + + # Detecting the exact type of the file: the encoding, mime type, and extension in lowercase. + encoding="$(file -bL --mime-encoding -- "$1")" + mimetype="$(file -bL --mime-type -- "$1")" + ext="${1##*.}" + [ -n "$ext" ] && ext="$(printf "%s" "${ext}" | tr '[:upper:]' '[:lower:]')" + lines=$(tput lines) + cols=$(tput cols) + + # Otherwise, falling back to the defaults. + if [ -d "$1" ]; then + cd "$1" || return + if [ "$NNN_ICONLOOKUP" -ne 0 ] && [ -f "$(dirname "$0")"/.iconlookup ]; then + [ "$NNN_SPLIT" = v ] && BSTR="\n" + # shellcheck disable=SC2012 + ls -F --group-directories-first | head -n "$((lines - 3))" | "$(dirname "$0")"/.iconlookup -l "$cols" -B "$BSTR" -b " " + elif exists tree; then + fifo_pager tree --filelimit "$(find . -maxdepth 1 | wc -l)" -L 3 -C -F --dirsfirst --noreport + elif exists exa; then + exa -G --group-directories-first --colour=always + else + fifo_pager ls -F --group-directories-first --color=always + fi + cd .. + elif [ "${encoding#*)}" = "binary" ]; then + handle_mime "$1" "$mimetype" "$ext" "bin" + else + handle_mime "$1" "$mimetype" "$ext" + fi +} + +generate_preview() { + if [ -n "$QLPATH" ] && stat "$3"; then + f="$(wslpath -w "$3")" && "$QLPATH" "$f" & + elif [ ! -f "$NNN_PREVIEWDIR/$3.jpg" ] || [ -n "$(find -L "$3" -newer "$NNN_PREVIEWDIR/$3.jpg")" ]; then + mkdir -p "$NNN_PREVIEWDIR/${3%/*}" + case $4 in + audio) ffmpeg -i "$3" -filter_complex "scale=iw*min(1\,min($NNN_PREVIEWWIDTH/iw\,ih)):-1" "$NNN_PREVIEWDIR/$3.jpg" -y ;; + epub) gnome-epub-thumbnailer "$3" "$NNN_PREVIEWDIR/$3.jpg" ;; + font) fontpreview -i "$3" -o "$NNN_PREVIEWDIR/$3.jpg" ;; + gif) if [ -p "$FIFO_UEBERZUG" ] && exists convert; then + frameprefix="$NNN_PREVIEWDIR/$3/${3##*/}" + if [ ! -d "$NNN_PREVIEWDIR/$3" ]; then + mkdir -p "$NNN_PREVIEWDIR/$3" + convert -coalesce -resize "$NNN_PREVIEWWIDTH"x"$NNN_PREVIEWHEIGHT"\> "$3" "$frameprefix.jpg" || + MAGICK_TMPDIR="/tmp" convert -coalesce -resize "$NNN_PREVIEWWIDTH"x"$NNN_PREVIEWHEIGHT"\> "$3" "$frameprefix.jpg" + fi + frames=$(($(find "$NNN_PREVIEWDIR/$3" | wc -l) - 2)) + [ $frames -lt 0 ] && return + while true; do + for i in $(seq 0 $frames); do + image_preview "$1" "$2" "$frameprefix-$i.jpg" + sleep 0.1 + done + done & + printf "%s" "$!" > "$PREVIEWPID" + return + else + image_preview "$1" "$2" "$3" + return + fi ;; + image) if exists convert; then + convert "$3" -flatten -resize "$NNN_PREVIEWWIDTH"x"$NNN_PREVIEWHEIGHT"\> "$NNN_PREVIEWDIR/$3.jpg" + else + image_preview "$1" "$2" "$3" && return + fi ;; + office) libreoffice --convert-to jpg "$3" --outdir "$NNN_PREVIEWDIR/${3%/*}" + filename="$(printf "%s" "${3##*/}" | cut -d. -f1)" + mv "$NNN_PREVIEWDIR/${3%/*}/$filename.jpg" "$NNN_PREVIEWDIR/$3.jpg" ;; + pdf) pdftoppm -jpeg -f 1 -singlefile "$3" "$NNN_PREVIEWDIR/$3" ;; + djvu) ddjvu -format=ppm -page=1 "$3" "$NNN_PREVIEWDIR/$3.jpg" ;; + video) ffmpegthumbnailer -m -s0 -i "$3" -o "$NNN_PREVIEWDIR/$3.jpg" || rm "$NNN_PREVIEWDIR/$3.jpg" ;; + esac + fi + if [ -f "$NNN_PREVIEWDIR/$3.jpg" ]; then + image_preview "$1" "$2" "$NNN_PREVIEWDIR/$3.jpg" + else + fifo_pager print_bin_info "$3" + fi +} >/dev/null 2>&1 + +image_preview() { + clear + exec >/dev/tty + if [ "$NNN_TERMINAL" = "kitty" ] && [ -z "$NNN_PREVIEWIMGPROG" ]; then + kitty +kitten icat --silent --scale-up --place "$1"x"$2"@0x0 --transfer-mode=stream --stdin=no "$3" & + elif [ "$NNN_TERMINAL" = "wezterm" ] && [ -z "$NNN_PREVIEWIMGPROG" ]; then + wezterm imgcat "$3" & + elif exists ueberzug && { [ -z "$NNN_PREVIEWIMGPROG" ] || [ "$NNN_PREVIEWIMGPROG" = "ueberzug" ] ;}; then + ueberzug_layer "$1" "$2" "$3" && return + elif exists catimg && { [ -z "$NNN_PREVIEWIMGPROG" ] || [ "$NNN_PREVIEWIMGPROG" = "catimg" ] ;}; then + catimg "$3" & + elif exists viu && { [ -z "$NNN_PREVIEWIMGPROG" ] || [ "$NNN_PREVIEWIMGPROG" = "viu" ] ;}; then + viu -t "$3" & + elif exists chafa && { [ -z "$NNN_PREVIEWIMGPROG" ] || [ "$NNN_PREVIEWIMGPROG" = "chafa" ] ;}; then + chafa "$3" & + else + fifo_pager print_bin_info "$3" && return + fi + printf "%s" "$!" > "$PREVIEWPID" +} + +ueberzug_layer() { + [ -f "$POSOFFSET" ] && read -r x y < "$POSOFFSET" + printf '{"action": "add", "identifier": "nnn_ueberzug", "x": %d, "y": %d, "width": "%d", "height": "%d", "scaler": "fit_contain", "path": "%s"}\n'\ + "${x:-0}" "${y:-0}" "$1" "$2" "$3" > "$FIFO_UEBERZUG" +} + +ueberzug_remove() { + printf '{"action": "remove", "identifier": "nnn_ueberzug"}\n' > "$FIFO_UEBERZUG" +} + +winch_handler() { + clear + pidkill "$PREVIEWPID" + if [ -p "$FIFO_UEBERZUG" ]; then + pkill -f "tail --follow $FIFO_UEBERZUG" + tail --follow "$FIFO_UEBERZUG" | ueberzug layer --silent --parser json & + fi + preview_file "$(cat "$CURSEL")" +} + +preview_fifo() { + while read -r selection; do + if [ -n "$selection" ]; then + pidkill "$PREVIEWPID" + [ -p "$FIFO_UEBERZUG" ] && ueberzug_remove + [ "$selection" = "close" ] && break + preview_file "$selection" + printf "%s" "$selection" > "$CURSEL" + fi + done < "$NNN_FIFO" + sleep 0.1 # make sure potential preview by winch_handler is killed + pkill -P "$$" +} + +if [ "$PREVIEW_MODE" -eq 1 ] 2>/dev/null; then + if [ "$NNN_TERMINAL" != "kitty" ] && exists ueberzug; then + mkfifo "$FIFO_UEBERZUG" + tail --follow "$FIFO_UEBERZUG" | ueberzug layer --silent --parser json & + fi + + preview_file "$PWD/$1" + preview_fifo & + printf "%s" "$!" > "$FIFOPID" + printf "%s" "$PWD/$1" > "$CURSEL" + trap 'winch_handler; wait' WINCH + trap 'rm "$PREVIEWPID" "$CURSEL" "$FIFO_UEBERZUG" "$FIFOPID" "$POSOFFSET" 2>/dev/null' INT HUP EXIT + wait "$!" 2>/dev/null + exit 0 +else + if [ ! -r "$NNN_FIFO" ]; then + prompt "No FIFO available! (\$NNN_FIFO='$NNN_FIFO')\nPlease read Usage in '$0'." + elif [ "$KITTY_WINDOW_ID" ] && [ -z "$TMUX" ] && [ -z "$KITTY_LISTEN_ON" ]; then + prompt "\$KITTY_LISTEN_ON not set!\nPlease read Usage in '$0'." + else + toggle_preview "$1" & + fi +fi diff --git a/nnn-4.9/plugins/pskill b/nnn-4.9/plugins/pskill @@ -0,0 +1,35 @@ +#!/usr/bin/env sh + +# Description: Fuzzy list and kill a (zombie) process by name +# +# Dependencies: fzf, ps +# +# Note: To kill a zombie process enter "zombie" +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +printf "Enter process name ['defunct' for zombies]: " +read -r psname + +# shellcheck disable=SC2009 +if [ -n "$psname" ]; then + if type sudo >/dev/null 2>&1; then + sucmd=sudo + elif type doas >/dev/null 2>&1; then + sucmd=doas + else + sucmd=: # noop + fi + + if type fzf >/dev/null 2>&1; then + fuzzy=fzf + else + exit 1 + fi + + cmd="$(ps -ax | grep -iw "$psname" | "$fuzzy" | sed -e 's/^[ \t]*//' | cut -d' ' -f1)" + if [ -n "$cmd" ]; then + $sucmd kill -9 "$cmd" + fi +fi diff --git a/nnn-4.9/plugins/renamer b/nnn-4.9/plugins/renamer @@ -0,0 +1,45 @@ +#!/usr/bin/env sh + +# Description: Batch rename selection or current directory with qmv or vidir +# +# Notes: +# - Try to mimic current batch rename functionality but with correct +# handling of edge cases by qmv or vidir. +# - Qmv opens with hidden files if no selection is used. Selected +# directories are shown. +# - Vidir don't show directories nor hidden files. +# +# Shell: POSIX compliant +# Author: José Neder + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +if type qmv >/dev/null 2>&1; then + batchrenamesel="qmv -fdo -da" + batchrename="qmv -fdo -a" +elif type vidir >/dev/null 2>&1; then + batchrenamesel="vidir" + batchrename="vidir" +else + printf "there is not batchrename program installed." + exit +fi + +if [ -s "$selection" ]; then + printf "rename selection? " + read -r resp +fi + +if [ "$resp" = "y" ]; then + # -o flag is necessary for interactive editors + xargs -o -0 $batchrenamesel < "$selection" + + # Clear selection + if [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" + fi +elif [ ! "$(LC_ALL=C ls -a)" = ". +.." ]; then + # On older systems that don't have ls -A + $batchrename +fi diff --git a/nnn-4.9/plugins/ringtone b/nnn-4.9/plugins/ringtone @@ -0,0 +1,36 @@ +#!/usr/bin/env sh + +# Description: Create an mp3 ringtone out of an audio file in any format +# Needs user to provide start and end where to cut the file +# Input file audio.ext results in audio_ringtone.mp3 +# +# Tip: To convert a complete media file, set start as 0 and +# the runtime of the file as end. +# +# Dependencies: date, ffmpeg +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +if [ -n "$1" ]; then + printf "start (hh:mm:ss): " + read -r start + st=$(date -d "$start" +%s) || exit 1 + + printf "end (hh:mm:ss): " + read -r end + et=$(date -d "$end" +%s) || exit 1 + + if [ "$st" -ge "$et" ]; then + printf "error: start >= end " + read -r _ + exit 1 + fi + + interval=$(( et - st )) + + outfile=$(basename "$1") + outfile="${outfile%.*}"_ringtone.mp3 + + ffmpeg -i "$1" -ss "$start" -t "$interval" -vn -sn -acodec libmp3lame -q:a 2 "$outfile" +fi diff --git a/nnn-4.9/plugins/rsynccp b/nnn-4.9/plugins/rsynccp @@ -0,0 +1,26 @@ +#!/usr/bin/env sh + +# Description: Simple script to give copy-paste a progress percentage +# by utilizing rsync. +# +# LIMITATION: this won't work when pasting to MTP device. +# +# Dependencies: rsync +# +# Shell: POSIX compliant +# Author: Benawi Adha + +sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +# Choose one of these two schemes by commenting + +# more verbose +xargs -0 -I % rsync -ah --progress % "$PWD" < "$sel" + +# less verbose +# xargs -0 -I % rsync -ah --info=progress2 % "$PWD" < "$sel" + +# Clear selection +if [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" +fi diff --git a/nnn-4.9/plugins/splitjoin b/nnn-4.9/plugins/splitjoin @@ -0,0 +1,52 @@ +#!/usr/bin/env sh + +# Description: Splits the file passed as argument or joins selection +# +# Note: Adds numeric suffix to split files +# Adds '.out suffix to the first file to be joined and saves as output file for join +# +# Shell: POSIX compliant +# Authors: Arun Prakash Jana, ath3 + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +resp=s + +if [ -s "$selection" ]; then + printf "press 's' (split current file) or 'j' (join selection): " + read -r resp +fi + +if [ "$resp" = "j" ]; then + if [ -s "$selection" ]; then + arr=$(tr '\0' '\n' < "$selection") + if [ "$(echo "$arr" | wc -l)" -lt 2 ]; then + echo "joining needs at least 2 files" + exit + fi + for entry in $arr + do + if [ -d "$entry" ]; then + echo "can't join directories" + exit + fi + done + + file="$(basename "$(echo "$arr" | sed -n '1p' | sed -e 's/[0-9][0-9]$//')")" + sort -z < "$selection" | xargs -0 -I{} cat {} > "${file}.out" + + # Clear selection + if [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" + fi + fi +elif [ "$resp" = "s" ]; then + if [ -n "$1" ] && [ -f "$1" ]; then + # a single file is passed + printf "split size in MB: " + read -r size + + if [ -n "$size" ]; then + split -d -b "$size"M "$1" "$1" + fi + fi +fi diff --git a/nnn-4.9/plugins/suedit b/nnn-4.9/plugins/suedit @@ -0,0 +1,16 @@ +#!/usr/bin/env sh + +# Description: Edit file as superuser +# +# Shell: POSIX compliant +# Author: Anna Arad + +EDITOR="${EDITOR:-vim}" + +if type sudo >/dev/null 2>&1; then + sudo -E "$EDITOR" "$1" +elif type sudoedit >/dev/null 2>&1; then + sudoedit -E "$1" +elif type doas >/dev/null 2>&1; then + doas "$EDITOR" "$1" +fi diff --git a/nnn-4.9/plugins/togglex b/nnn-4.9/plugins/togglex @@ -0,0 +1,21 @@ +#!/usr/bin/env sh + +# Description: Toggles executable mode for selection +# +# Dependencies: chmod +# +# Note: Works _only_ with selection (nnn can toggle the mode for the hovered file) +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +if [ -s "$selection" ]; then + xargs -0 -I {} sh -c 'if [ -x "{}" ] ; then chmod -x "{}" ; else chmod +x "{}" ; fi' < "$selection" + + # Clear selection + if [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" + fi +fi diff --git a/nnn-4.9/plugins/umounttree b/nnn-4.9/plugins/umounttree @@ -0,0 +1,52 @@ +#!/usr/bin/env sh + +# Description: Autodetects a nnn remote mountpoint (mounted with `c`) +# from any of its subfolders and allows unmounting it +# from the subdir without navigating to the mountppoint +# or entering the remote name. Also works when hovering +# the mountpoint directly like vanilla `u`. +# +# Dependencies: fusermount +# +# Shell: POSIX compliant +# Authors: Kabouik & 0xACE +# +# TODO: +# - Avoid lazy unmount by forcing nnn context to leave the subfolder before fusermount. +# Tried `printf "%s" "0c$m" > "$NNN_PIPE"` but it breaks the nnn interface, see #854. + +err=0 +m=$HOME/.config/nnn/mounts +if [ "$PWD" = "$m" ]; then + # Allow running the script on hovered directory if user is in ~/.config/nnn/mounts + d="$1" +else + d=$(dirname "$(readlink -f "$1")" | grep -oP "^$m\K.*" | cut -d"/" -f2) +fi + +# Test if user is within $m or a subdir, abort if not +if [ "$d" = "" ]; then + clear && printf "You are not in a remote folder mounted with nnn. Press return to continue. " && read -r _ +else + # Test if $m/$d is a mountpoint and try unmounting if it is + mountpoint -q -- "$m/$d" + if [ "$?" -eq "1" ]; then + clear && printf "Parent '%s' is not a mountpoint. Press return to continue. " "$d" && read -r _ + else + cd "$m" && fusermount -uq "$m/$d" || err=1 + if [ "$err" -eq "0" ]; then + rmdir "$m/$d" && clear && printf "Parent '%s' unmounted." "$d" + else + clear && printf "Failed to unmount. Try lazy unmount? [Yy/Nn] " && read -r + fi + fi +fi + +# If unmount fails, offer lazy unmount +if [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ]; then + err=0 + cd "$m" && fusermount -uqz "$m/$d" || err=1 + if [ "$err" -eq "0" ]; then + rmdir "$m/$d" && clear && printf "Parent '%s' unmounted with lazy unmount. " "$d" + fi +fi diff --git a/nnn-4.9/plugins/upload b/nnn-4.9/plugins/upload @@ -0,0 +1,45 @@ +#!/usr/bin/env sh + +# Description: Selections are uploaded using Firefox Send +# For single files: +# Upload to Firefox Send if ffsend is found, else +# Paste contents of a text a file http://ix.io +# Upload a binary file to file.io +# +# Dependencies: ffsend (https://github.com/timvisee/ffsend), curl, jq, tr +# +# Note: Binary file set to expire after a week +# +# Shell: POSIX compliant +# Author: Arun Prakash Jana + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +if [ -s "$selection" ]; then + if type ffsend >/dev/null 2>&1; then + # File name will be randomized foo.tar + xargs -0 < "$selection" ffsend u + else + printf "ffsend is required to upload selection." + fi + + # Clear selection + printf "-" > "$NNN_PIPE" +else + if [ -n "$1" ] && [ -s "$1" ]; then + if type ffsend >/dev/null 2>&1; then + ffsend -fiq u "$1" + elif [ "$(mimetype --output-format %m "$1" | awk -F '/' '{print $1}')" = "text" ]; then + curl -F "f:1=@$1" ix.io + else + # Upload the file, show the download link and wait till user presses any key + curl -s -F "file=@$1" https://file.io/?expires=1w | jq '.link' | tr -d '"' + + # To write download link to "$1".loc and exit + # curl -s -F "file=@$1" https://file.io/?expires=1w -o `basename "$1"`.loc + fi + else + printf "empty file!" + fi +fi + +read -r _ diff --git a/nnn-4.9/plugins/wallpaper b/nnn-4.9/plugins/wallpaper @@ -0,0 +1,37 @@ +#!/usr/bin/env sh + +# Description: Set the selected image as wallpaper. +# Uses nitrogen or pywal on X11, swww on wayland. +# +# Usage: Hover on an image and run the script to set it as wallpaper. +# +# Shell: POSIX compliant +# Author: juacq97 + +if [ -n "$1" ]; then + if [ "$(file --mime-type "$1" | awk '{print $NF}' | awk -F '/' '{print $1}')" = "image" ]; then + if [ "$XDG_SESSION_TYPE" = "x11" ]; then + if type nitrogen >/dev/null 2>&1; then + nitrogen --set-zoom-fill --save "$1" + elif type wal >/dev/null 2>&1; then + wal -i "$1" + else + printf "nitrogen or pywal missing" + read -r _ + fi + else + if type swww >/dev/null 2>&1; then + swww img "$1" + else + printf "swww missing" + read -r _ + fi + fi + + # If you want a system notification, uncomment the next 3 lines. + # notify-send -a "nnn" "Wallpaper changed!" + # else + # notify-send -a "nnn" "No image selected" + + fi +fi diff --git a/nnn-4.9/plugins/x2sel b/nnn-4.9/plugins/x2sel @@ -0,0 +1,62 @@ +#!/usr/bin/env sh + +# Description: Copy system clipboard newline-separated file list to selection +# +# Dependencies: +# - tr +# - xclip/xsel (Linux) +# - pbpaste (macOS) +# - termux-clipboard-get (Termux) +# - powershell (WSL) +# - cygwim's /dev/clipboard (Cygwin) +# - wl-paste (Wayland) +# - clipboard (Haiku) +# +# Note: +# - Limitation: breaks if a filename has newline in it +# +# Shell: POSIX compliant +# Author: Léo Villeveygoux, after Arun Prakash Jana's .cbcp + +IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}" # protect trailing \n + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +getclip () { + if [ "$XDG_SESSION_TYPE" = "wayland" ]; then + # Wayland + wl-paste + elif type xsel >/dev/null 2>&1; then + # Linux + xsel -bo + elif type xclip >/dev/null 2>&1; then + # Linux + xclip -sel clip -o + elif type pbpaste >/dev/null 2>&1; then + # macOS + pbpaste + elif type termux-clipboard-get >/dev/null 2>&1; then + # Termux + termux-clipboard-get + elif type powershell.exe >/dev/null 2>&1; then + # WSL + powershell.exe Get-Clipboard + elif [ -r /dev/clipboard ] ; then + # Cygwin + cat /dev/clipboard + elif type clipboard >/dev/null 2>&1; then + # Haiku + clipboard --print + fi +} + +CLIPBOARD=$(getclip) + +# Check if clipboard actually contains a file list +for file in $CLIPBOARD ; do + if [ ! -e "$file" ] ; then + exit 1; + fi +done + +printf "%s" "$CLIPBOARD" | tr '\n' '\0' > "$selection" diff --git a/nnn-4.9/plugins/xdgdefault b/nnn-4.9/plugins/xdgdefault @@ -0,0 +1,53 @@ +#!/usr/bin/env sh + +# Description: Sets the xdg-open's default application for the current entry's file +# type. ${XDG_DATA_DIRS} and ${XDG_DATA_HOME} are set to the recommended +# defaults if unset, as specified in XDG Base Directory Specification +# - http://specifications.freedesktop.org/basedir-spec/. +# +# Dependencies: xdg-utils, fzf or dmenu (GUI) +# +# Shell: POSIX compliant +# Author: lwnctd + +# set to 1 to enable GUI apps +GUI="${GUI:-0}" + +if [ "$GUI" -ne 0 ] && command -v dmenu > /dev/null 2>& 1; then + menu="dmenu -i -l 7" +elif command -v fzf > /dev/null 2>& 1; then + menu="fzf -e --tiebreak=begin" +fi + +if [ -z "$1" ] || [ -z "$menu" ] > /dev/null 2>& 1; then + exit 1 +fi + +ftype=$(xdg-mime query filetype "$2/$1") + +if [ -z "$ftype" ]; then + exit 1 +fi + +dirs=${XDG_DATA_DIRS:-/usr/local/share:/usr/share} +dirs=${dirs}:${XDG_DATA_HOME:-$HOME/.local/share}: + +while [ -n "$dirs" ]; do + d=${dirs%%:*} + if [ -n "$d" ] && [ -d "$d"/applications ]; then + set -- "$@" "$d"/applications + fi + dirs=${dirs#*:} +done + +app=$(find "$@" -iname '*.desktop' -exec grep '^Name=' {} + \ + | sort -u -t ':' -k 1,1 \ + | sed -e 's;..*/\(..*desktop\):Name=\(..*\);\2:\1;' \ + | sort -t ':' -k 1,1 \ + | column -t -s ':' -o "$(printf '\t')" \ + | $menu \ + | cut -f 2) + +if [ -n "$app" ]; then + xdg-mime default "${app%%[[:blank:]]*}" "$ftype" +fi diff --git a/nnn-4.9/src/.clang-tidy b/nnn-4.9/src/.clang-tidy @@ -0,0 +1,15 @@ +--- +Checks: 'clang-diagnostic-*,clang-analyzer-*,readability-*,modernize-*,bugprone-*,misc-*,-misc-unused-parameters,google-runtime-int,-llvm-header-guard,fuchsia-restrict-system-includes,-clang-analyzer-valist.Uninitialized,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,-clang-analyzer-security.insecureAPI.rand,-clang-analyzer-alpha.*,-modernize-macro-to-enum,-readability-magic-numbers,-readability-braces-around-statements,-readability-function-cognitive-complexity,-readability-identifier-length,-readability-isolate-declaration,-readability-suspicious-call-argument,-bugprone-easily-swappable-parameters,-bugprone-narrowing-conversions,-bugprone-reserved-identifier' +WarningsAsErrors: '*' +HeaderFilterRegex: '.*(?<!lookup3.c)$' +FormatStyle: 'file' +CheckOptions: + - key: readability-braces-around-statements.ShortStatementLines + value: '1' + - key: google-runtime-int.TypeSufix + value: '_t' + - key: fuchsia-restrict-system-includes.Includes + value: '*,-stdint.h,-stdbool.h' + - key: readability-function-size.StatementThreshold + value: '950' +... diff --git a/nnn-4.9/src/dbg.h b/nnn-4.9/src/dbg.h @@ -0,0 +1,91 @@ +/* + * BSD 2-Clause License + * + * Copyright (C) 2014-2016, Lazaros Koromilas <lostd@2f30.org> + * Copyright (C) 2014-2016, Dimitris Papastamos <sin@2f30.org> + * Copyright (C) 2016-2023, Arun Prakash Jana <engineerarun@gmail.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#ifdef DEBUG +static int DEBUG_FD; + +static int xprintf(int fd, const char *fmt, ...) +{ + char buf[BUFSIZ]; + int r; + va_list ap; + + va_start(ap, fmt); + r = vsnprintf(buf, sizeof(buf), fmt, ap); + if (r > 0 && (unsigned int)r < sizeof(buf)) + r = write(fd, buf, r); + va_end(ap); + return r; +} + +static int enabledbg(void) +{ + FILE *fp = fopen("/tmp/nnndbg", "w"); + + if (!fp) { + perror("dbg(1)"); + + fp = fopen("./nnndbg", "w"); + if (!fp) { + perror("dbg(2)"); + return -1; + } + } + + DEBUG_FD = dup(fileno(fp)); + fclose(fp); + if (DEBUG_FD == -1) { + perror("dbg(3)"); + return -1; + } + + return 0; +} + +static void disabledbg(void) +{ + close(DEBUG_FD); +} + +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) + +#define DPRINTF_D(x) xprintf(DEBUG_FD, "ln " TOSTRING(__LINE__) ": " #x "=%d\n", x) +#define DPRINTF_U(x) xprintf(DEBUG_FD, "ln " TOSTRING(__LINE__) ": " #x "=%u\n", x) +#define DPRINTF_S(x) xprintf(DEBUG_FD, "ln " TOSTRING(__LINE__) ": " #x "=%s\n", x) +#define DPRINTF_P(x) xprintf(DEBUG_FD, "ln " TOSTRING(__LINE__) ": " #x "=%p\n", x) +#else +#define DPRINTF_D(x) +#define DPRINTF_U(x) +#define DPRINTF_S(x) +#define DPRINTF_P(x) +#endif /* DEBUG */ diff --git a/nnn-4.9/src/icons-hash.c b/nnn-4.9/src/icons-hash.c @@ -0,0 +1,291 @@ +/* + * simple program which outputs a hash-table of `icons_ext` with low collusion. + * the hash function is case-insensitive, it also doesn't hash beyond the + * length of the longest extension. + */ + +#include <stddef.h> +#include <stdint.h> +#include <inttypes.h> + +#define GOLDEN_RATIO_32 UINT32_C(2654442313) /* golden ratio for 32bits: (2^32) / 1.61803 */ +#define GOLDEN_RATIO_64 UINT64_C(0x9E3793492EEDC3F7) +#define ICONS_TABLE_SIZE 8 /* size in bits. 8 = 256 */ + +#ifndef TOUPPER + #define TOUPPER(ch) (((ch) >= 'a' && (ch) <= 'z') ? ((ch) - 'a' + 'A') : (ch)) +#endif + +/* all of this is just for the static hash-table generation. only the hash + * function gets included in `nnn` binary. + */ +#ifdef ICONS_GENERATE + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <limits.h> +#include "icons.h" + +/* like assert, but always sticks around during generation. */ +#define ENSURE(X) do { \ + if (!(X)) { \ + fprintf(stderr, "%s:%d: `%s`\n", __FILE__, __LINE__, #X); \ + abort(); \ + } \ +} while (0) +#define ARRLEN(X) (sizeof(X) / sizeof((X)[0])) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) +#define HGEN_ITERARATION (1ul << 13) +#define ICONS_PROBE_MAX_ALLOWED 6 +#define ICONS_MATCH_MAX (512) + +#if 0 /* for logging some interesting info to stderr */ + #define log(...) fprintf(stderr, "[INFO]: " __VA_ARGS__) +#else + #define log(...) ((void)0) +#endif + +static uint32_t icon_ext_hash(const char *s); + +/* change ICONS_TABLE_SIZE to increase the size of the table */ +static struct icon_pair table[1u << ICONS_TABLE_SIZE]; +static uint8_t seen[ARRLEN(table)]; +/* arbitrarily picked starting position. change if needed. + * but ensure they're above 1 and prefer prime numbers. + */ +static uint32_t hash_start = 7; +static uint32_t hash_mul = 251; /* unused as of now */ + +/* + * use robin-hood insertion to reduce the max probe length + */ +static void +rh_insert(const struct icon_pair item, uint32_t idx, uint32_t n) +{ + ENSURE(n != 0); + for (uint32_t tries = 0; tries < ARRLEN(table); ++tries, ++n) { + if (seen[idx] < n) { + struct icon_pair tmp_item = table[idx]; + uint32_t tmp_n = seen[idx]; + + ENSURE(n < (uint8_t)-1); + table[idx] = item; + seen[idx] = n; + + if (tmp_n != 0) /* the slot we inserted to wasn't empty */ + rh_insert(tmp_item, idx, tmp_n); + return; + } + idx = (idx + 1) % ARRLEN(table); + } + ENSURE(0 && "unreachable"); +} + +enum { PROBE_MAX, PROBE_TOTAL, PROBE_CNT }; +static unsigned int * +table_populate(unsigned int p[static PROBE_CNT]) +{ + memset(seen, 0x0, sizeof seen); + memset(table, 0x0, sizeof table); + for (size_t i = 0; i < ARRLEN(icons_ext); ++i) { + if (icons_ext[i].icon[0] == '\0') /* skip empty entries */ + continue; + uint32_t h = icon_ext_hash(icons_ext[i].match); + rh_insert(icons_ext[i], h, 1); + } + + p[PROBE_MAX] = p[PROBE_TOTAL] = 0; + for (size_t i = 0; i < ARRLEN(seen); ++i) { + p[PROBE_MAX] = MAX(p[PROBE_MAX], seen[i]); + p[PROBE_TOTAL] += seen[i]; + } + return p; +} + +/* permuted congruential generator */ +static uint32_t +pcg(uint64_t *state) +{ + uint64_t oldstate = *state; + *state *= GOLDEN_RATIO_64; + uint32_t r = (oldstate >> 59); + uint32_t v = (oldstate ^ (oldstate >> 18)) >> 27; + return (v >> (-r & 31)) | (v << r); +} + +int +main(void) +{ + ENSURE(ARRLEN(icons_ext) <= ARRLEN(table)); + ENSURE(ICONS_TABLE_SIZE < 16); + ENSURE(1u << ICONS_TABLE_SIZE == ARRLEN(table)); + ENSURE((GOLDEN_RATIO_32 & 1) == 1); /* must be odd */ + ENSURE((GOLDEN_RATIO_64 & 1) == 1); /* must be odd */ + ENSURE(hash_start > 1); + ENSURE(hash_mul > 1); + /* ensure power of 2 hashtable size which allows compiler to optimize + * away mod (`%`) operations + */ + ENSURE((ARRLEN(table) & (ARRLEN(table) - 1)) == 0); + + unsigned int max_probe = (unsigned)-1; + uint32_t best_hash_start = 0, best_hash_mul = 0, best_total_probe = 9999; + uint64_t hash_start_rng = hash_start, hash_mul_rng = hash_mul; + + for (size_t i = 0; i < HGEN_ITERARATION; ++i) { + unsigned *p = table_populate((unsigned [PROBE_CNT]){0}); + if (p[PROBE_MAX] < max_probe || + (p[PROBE_MAX] == max_probe && p[PROBE_TOTAL] < best_total_probe)) + { + max_probe = p[PROBE_MAX]; + best_total_probe = p[PROBE_TOTAL]; + best_hash_start = hash_start; + best_hash_mul = hash_mul; + } + hash_start = pcg(&hash_start_rng); + hash_mul = pcg(&hash_mul_rng); + } + ENSURE(max_probe < ICONS_PROBE_MAX_ALLOWED); + hash_start = best_hash_start; + hash_mul = best_hash_mul; + { + unsigned *p = table_populate((unsigned [PROBE_CNT]){0}); + ENSURE(p[PROBE_MAX] == max_probe); + ENSURE(p[PROBE_TOTAL] == best_total_probe); + } + + /* sanity check */ + double nitems = 0; + unsigned int total_probe = 0; + for (size_t i = 0; i < ARRLEN(icons_ext); ++i) { + if (icons_ext[i].icon[0] == 0) + continue; + uint32_t found = 0, h = icon_ext_hash(icons_ext[i].match); + for (uint32_t k = 0; k < max_probe; ++k) { + uint32_t z = (h + k) % ARRLEN(table); + ++total_probe; + if (table[z].match && strcasecmp(icons_ext[i].match, table[z].match) == 0) { + found = 1; + break; + } + } + ENSURE(found); + ++nitems; + } + ENSURE(total_probe == best_total_probe); + + size_t match_max = 0, icon_max = 0; + for (size_t i = 0; i < ARRLEN(icons_name); ++i) { + match_max = MAX(match_max, strlen(icons_name[i].match) + 1); + icon_max = MAX(icon_max, strlen(icons_name[i].icon) + 1); + } + for (size_t i = 0; i < ARRLEN(icons_ext); ++i) { + match_max = MAX(match_max, strlen(icons_ext[i].match) + 1); + icon_max = MAX(icon_max, strlen(icons_ext[i].icon) + 1); + } + icon_max = MAX(icon_max, strlen(dir_icon.icon) + 1); + icon_max = MAX(icon_max, strlen(exec_icon.icon) + 1); + icon_max = MAX(icon_max, strlen(file_icon.icon) + 1); + ENSURE(icon_max < ICONS_MATCH_MAX); + + const char *uniq[ARRLEN(icons_ext)] = {0}; + size_t uniq_head = 0; + for (size_t i = 0; i < ARRLEN(icons_ext); ++i) { + if (icons_ext[i].icon[0] == 0) + continue; + int isuniq = 1; + for (size_t k = 0; k < uniq_head; ++k) { + if (strcasecmp(uniq[k], icons_ext[i].icon) == 0) { + isuniq = 0; + break; + } + } + if (isuniq) { + ENSURE(uniq_head < ARRLEN(uniq)); + uniq[uniq_head++] = icons_ext[i].icon; + } + } + ENSURE(uniq_head < (unsigned char)-1); + + log("load-factor: %.2f (%u/%zu)\n", (nitems * 100.0) / (double)ARRLEN(table), + (unsigned int)nitems, ARRLEN(table)); + log("max_probe : %6u\n", max_probe); + log("total_probe: %6u\n", total_probe); + log("uniq icons : %6zu\n", uniq_head); + log("no-compact : %6zu bytes\n", ARRLEN(table) * icon_max); + log("compaction : %6zu bytes\n", uniq_head * icon_max + ARRLEN(table)); + log("hash_start : %6" PRIu32 "\n", hash_start); + log("hash_mul : %6" PRIu32 "\n", hash_mul); + + printf("#ifndef INCLUDE_ICONS_GENERATED\n"); + printf("#define INCLUDE_ICONS_GENERATED\n\n"); + + printf("/*\n * NOTE: This file is automatically generated.\n"); + printf(" * DO NOT EDIT THIS FILE DIRECTLY.\n"); + printf(" * Use `icons.h` to customize icons\n */\n\n"); + + printf("#define hash_start UINT32_C(%" PRIu32 ")\n", hash_start); + printf("#define hash_mul UINT32_C(%" PRIu32 ")\n\n", hash_mul); + printf("#define ICONS_PROBE_MAX %uu\n", max_probe); + printf("#define ICONS_MATCH_MAX %zuu\n\n", match_max); + printf("#define ICONS_STR_MAX %zuu\n\n", icon_max); + + printf("struct icon_pair { const char match[ICONS_MATCH_MAX]; " + "const char icon[ICONS_STR_MAX]; unsigned char color; };\n\n"); + + printf("static const char icons_ext_uniq[%zu][ICONS_STR_MAX] = {\n", uniq_head); + for (size_t i = 0; i < uniq_head; ++i) + printf("\t\"%s\",\n", uniq[i]); + printf("};\n\n"); + + printf("static const struct {\n\tconst char match[ICONS_MATCH_MAX];\n" + "\tunsigned char idx;\n\tunsigned char color;\n} icons_ext[%zu] = {\n", + ARRLEN(table)); + for (size_t i = 0; i < ARRLEN(table); ++i) { + if (table[i].icon == NULL || table[i].icon[0] == '\0') /* skip empty entries */ + continue; + size_t k; + for (k = 0; k < uniq_head; ++k) { + if (strcasecmp(table[i].icon, uniq[k]) == 0) + break; + } + ENSURE(k < uniq_head); + printf("\t[%3zu] = {\"%s\", %zu, %hhu },\n", + i, table[i].match, k, table[i].color); + } + printf("};\n\n"); + + printf("#endif /* INCLUDE_ICONS_GENERATED */\n"); +} + +#else + #define ENSURE(X) ((void)0) +#endif /* ICONS_GENERATE */ + +#if defined(ICONS_GENERATE) || defined(ICONS_ENABLED) +static uint32_t +icon_ext_hash(const char *str) +{ + uint32_t i, hash = hash_start; + enum { wsz = sizeof hash * CHAR_BIT, z = wsz - ICONS_TABLE_SIZE, r = 5 }; + + /* just an xor-rotate hash. in general, this is a horrible hash + * function but for our specific input it works fine while being + * computationally cheap. + */ + for (i = 0; i < ICONS_MATCH_MAX && str[i] != '\0'; ++i) { + hash ^= TOUPPER((unsigned char)str[i]); + hash = (hash >> (wsz - r)) | (hash << r); + } + + /* finalizer: https://probablydance.com/2018/06/16 */ + hash ^= (hash >> z); + hash *= GOLDEN_RATIO_32; + + hash >>= z; + ENSURE(hash < ARRLEN(table)); + + return hash; +} +#endif diff --git a/nnn-4.9/src/icons-in-terminal.h b/nnn-4.9/src/icons-in-terminal.h @@ -0,0 +1,3736 @@ +#ifndef ICONS_IN_TERMINAL +#define ICONS_IN_TERMINAL + +# define POWERLINE_BRANCH "\ue0a0" +# define POWERLINE_LINE_NUMBER "\ue0a1" +# define POWERLINE_READONLY "\ue0a2" +# define POWERLINE_EXTRA_COLUMN_NUMBER "\ue0a3" +# define POWERLINE_LEFT_HARD_DIVIDER "\ue0b0" +# define POWERLINE_LEFT_SOFT_DIVIDER "\ue0b1" +# define POWERLINE_RIGHT_HARD_DIVIDER "\ue0b2" +# define POWERLINE_RIGHT_SOFT_DIVIDER "\ue0b3" +# define POWERLINE_EXTRA_RIGHT_HALF_CIRCLE_THICK "\ue0b4" +# define POWERLINE_EXTRA_RIGHT_HALF_CIRCLE_THIN "\ue0b5" +# define POWERLINE_EXTRA_LEFT_HALF_CIRCLE_THICK "\ue0b6" +# define POWERLINE_EXTRA_LEFT_HALF_CIRCLE_THIN "\ue0b7" +# define POWERLINE_EXTRA_LOWER_LEFT_TRIANGLE "\ue0b8" +# define POWERLINE_EXTRA_BACKSLASH_SEPARATOR "\ue0b9" +# define POWERLINE_EXTRA_LOWER_RIGHT_TRIANGLE "\ue0ba" +# define POWERLINE_EXTRA_FORWARDSLASH_SEPARATOR "\ue0bb" +# define POWERLINE_EXTRA_UPPER_LEFT_TRIANGLE "\ue0bc" +# define POWERLINE_EXTRA_FORWARDSLASH_SEPARATOR_REDUNDANT "\ue0bd" +# define POWERLINE_EXTRA_UPPER_RIGHT_TRIANGLE "\ue0be" +# define POWERLINE_EXTRA_BACKSLASH_SEPARATOR_REDUNDANT "\ue0bf" +# define POWERLINE_EXTRA_FLAME_THICK "\ue0c0" +# define POWERLINE_EXTRA_FLAME_THIN "\ue0c1" +# define POWERLINE_EXTRA_FLAME_THICK_MIRRORED "\ue0c2" +# define POWERLINE_EXTRA_FLAME_THIN_MIRRORED "\ue0c3" +# define POWERLINE_EXTRA_PIXELATED_SQUARES_SMALL "\ue0c4" +# define POWERLINE_EXTRA_PIXELATED_SQUARES_SMALL_MIRRORED "\ue0c5" +# define POWERLINE_EXTRA_PIXELATED_SQUARES_BIG "\ue0c6" +# define POWERLINE_EXTRA_PIXELATED_SQUARES_BIG_MIRRORED "\ue0c7" +# define POWERLINE_EXTRA_ICE_WAVEFORM "\ue0c8" +# define POWERLINE_EXTRA_ICE_WAVEFORM_MIRRORED "\ue0ca" +# define POWERLINE_EXTRA_HONEYCOMB "\ue0cc" +# define POWERLINE_EXTRA_HONEYCOMB_OUTLINE "\ue0cd" +# define POWERLINE_EXTRA_LEGO_SEPARATOR "\ue0ce" +# define POWERLINE_EXTRA_LEGO_SEPARATOR_THIN "\ue0cf" +# define POWERLINE_EXTRA_LEGO_BLOCK_FACING "\ue0d0" +# define POWERLINE_EXTRA_LEGO_BLOCK_SIDEWAYS "\ue0d1" +# define POWERLINE_EXTRA_TRAPEZOID_TOP_BOTTOM "\ue0d2" +# define POWERLINE_EXTRA_TRAPEZOID_TOP_BOTTOM_MIRRORED "\ue0d4" +# define OCT_HEART "\ue000" +# define OCT_ZAP "\ue001" +# define OCT_LIGHT_BULB "\ue002" +# define OCT_REPO "\ue003" +# define OCT_REPO_FORKED "\ue004" +# define OCT_REPO_PUSH "\ue005" +# define OCT_REPO_PULL "\ue006" +# define OCT_BOOK "\ue007" +# define OCT_OCTOFACE "\ue008" +# define OCT_GIT_PULL_REQUEST "\ue009" +# define OCT_MARK_GITHUB "\ue00a" +# define OCT_CLOUD_DOWNLOAD "\ue00b" +# define OCT_CLOUD_UPLOAD "\ue00c" +# define OCT_KEYBOARD "\ue00d" +# define OCT_GIST "\ue00e" +# define OCT_FILE_CODE "\ue00f" +# define OCT_FILE_TEXT "\ue010" +# define OCT_FILE_MEDIA "\ue011" +# define OCT_FILE_ZIP "\ue012" +# define OCT_FILE_PDF "\ue013" +# define OCT_TAG "\ue014" +# define OCT_FILE_DIRECTORY "\ue015" +# define OCT_FILE_SUBMODULE "\ue016" +# define OCT_PERSON "\ue017" +# define OCT_JERSEY "\ue018" +# define OCT_GIT_COMMIT "\ue019" +# define OCT_GIT_BRANCH "\ue01a" +# define OCT_GIT_MERGE "\ue01b" +# define OCT_MIRROR "\ue01c" +# define OCT_ISSUE_OPENED "\ue01d" +# define OCT_ISSUE_REOPENED "\ue01e" +# define OCT_ISSUE_CLOSED "\ue01f" +# define OCT_STAR "\ue020" +# define OCT_COMMENT "\ue021" +# define OCT_QUESTION "\ue022" +# define OCT_ALERT "\ue023" +# define OCT_SEARCH "\ue024" +# define OCT_GEAR "\ue025" +# define OCT_RADIO_TOWER "\ue026" +# define OCT_TOOLS "\ue027" +# define OCT_SIGN_OUT "\ue028" +# define OCT_ROCKET "\ue029" +# define OCT_RSS "\ue02a" +# define OCT_CLIPPY "\ue02b" +# define OCT_SIGN_IN "\ue02c" +# define OCT_ORGANIZATION "\ue02d" +# define OCT_DEVICE_MOBILE "\ue02e" +# define OCT_UNFOLD "\ue02f" +# define OCT_CHECK "\ue030" +# define OCT_MAIL "\ue031" +# define OCT_MAIL_READ "\ue032" +# define OCT_ARROW_UP "\ue033" +# define OCT_ARROW_RIGHT "\ue034" +# define OCT_ARROW_DOWN "\ue035" +# define OCT_ARROW_LEFT "\ue036" +# define OCT_PIN "\ue037" +# define OCT_GIFT "\ue038" +# define OCT_GRAPH "\ue039" +# define OCT_TRIANGLE_LEFT "\ue03a" +# define OCT_CREDIT_CARD "\ue03b" +# define OCT_CLOCK "\ue03c" +# define OCT_RUBY "\ue03d" +# define OCT_BROADCAST "\ue03e" +# define OCT_KEY "\ue03f" +# define OCT_REPO_FORCE_PUSH "\ue040" +# define OCT_REPO_CLONE "\ue041" +# define OCT_DIFF "\ue042" +# define OCT_EYE "\ue043" +# define OCT_COMMENT_DISCUSSION "\ue044" +# define OCT_MAIL_REPLY "\ue045" +# define OCT_PRIMITIVE_DOT "\ue046" +# define OCT_PRIMITIVE_SQUARE "\ue047" +# define OCT_DEVICE_CAMERA "\ue048" +# define OCT_DEVICE_CAMERA_VIDEO "\ue049" +# define OCT_PENCIL "\ue04a" +# define OCT_INFO "\ue04b" +# define OCT_TRIANGLE_RIGHT "\ue04c" +# define OCT_TRIANGLE_DOWN "\ue04d" +# define OCT_LINK "\ue04e" +# define OCT_PLUS "\ue04f" +# define OCT_THREE_BARS "\ue050" +# define OCT_CODE "\ue051" +# define OCT_LOCATION "\ue052" +# define OCT_LIST_UNORDERED "\ue053" +# define OCT_LIST_ORDERED "\ue054" +# define OCT_QUOTE "\ue055" +# define OCT_VERSIONS "\ue056" +# define OCT_CALENDAR "\ue057" +# define OCT_LOCK "\ue058" +# define OCT_DIFF_ADDED "\ue059" +# define OCT_DIFF_REMOVED "\ue05a" +# define OCT_DIFF_MODIFIED "\ue05b" +# define OCT_DIFF_RENAMED "\ue05c" +# define OCT_HORIZONTAL_RULE "\ue05d" +# define OCT_ARROW_SMALL_RIGHT "\ue05e" +# define OCT_MILESTONE "\ue05f" +# define OCT_CHECKLIST "\ue060" +# define OCT_MEGAPHONE "\ue061" +# define OCT_CHEVRON_RIGHT "\ue062" +# define OCT_BOOKMARK "\ue063" +# define OCT_SETTINGS "\ue064" +# define OCT_DASHBOARD "\ue065" +# define OCT_HISTORY "\ue066" +# define OCT_LINK_EXTERNAL "\ue067" +# define OCT_MUTE "\ue068" +# define OCT_X "\ue069" +# define OCT_CIRCLE_SLASH "\ue06a" +# define OCT_PULSE "\ue06b" +# define OCT_SYNC "\ue06c" +# define OCT_TELESCOPE "\ue06d" +# define OCT_GIST_SECRET "\ue06e" +# define OCT_HOME "\ue06f" +# define OCT_STOP "\ue070" +# define OCT_BUG "\ue071" +# define OCT_LOGO_GITHUB "\ue072" +# define OCT_FILE_BINARY "\ue073" +# define OCT_DATABASE "\ue074" +# define OCT_SERVER "\ue075" +# define OCT_DIFF_IGNORED "\ue076" +# define OCT_ELLIPSIS "\ue077" +# define OCT_NO_NEWLINE "\ue078" +# define OCT_HUBOT "\ue079" +# define OCT_ARROW_SMALL_UP "\ue07a" +# define OCT_ARROW_SMALL_DOWN "\ue07b" +# define OCT_ARROW_SMALL_LEFT "\ue07c" +# define OCT_CHEVRON_UP "\ue07d" +# define OCT_CHEVRON_DOWN "\ue07e" +# define OCT_CHEVRON_LEFT "\ue07f" +# define OCT_TRIANGLE_UP "\ue080" +# define OCT_GIT_COMPARE "\ue081" +# define OCT_LOGO_GIST "\ue082" +# define OCT_FILE_SYMLINK_FILE "\ue083" +# define OCT_FILE_SYMLINK_DIRECTORY "\ue084" +# define OCT_SQUIRREL "\ue085" +# define OCT_GLOBE "\ue086" +# define OCT_UNMUTE "\ue087" +# define OCT_MENTION "\ue088" +# define OCT_PACKAGE "\ue089" +# define OCT_BROWSER "\ue08a" +# define OCT_TERMINAL "\ue08b" +# define OCT_MARKDOWN "\ue08c" +# define OCT_DASH "\ue08d" +# define OCT_FOLD "\ue08e" +# define OCT_INBOX "\ue08f" +# define OCT_TRASHCAN "\ue090" +# define OCT_PAINTCAN "\ue091" +# define OCT_FLAME "\ue092" +# define OCT_BRIEFCASE "\ue093" +# define OCT_PLUG "\ue094" +# define OCT_CIRCUIT_BOARD "\ue095" +# define OCT_MORTAR_BOARD "\ue096" +# define OCT_LAW "\ue097" +# define OCT_THUMBSUP "\ue098" +# define OCT_THUMBSDOWN "\ue099" +# define OCT_DESKTOP_DOWNLOAD "\ue09a" +# define OCT_BEAKER "\ue09b" +# define OCT_BELL "\ue09c" +# define OCT_WATCH "\ue09d" +# define OCT_SHIELD "\ue09e" +# define OCT_BOLD "\ue09f" +# define OCT_TEXT_SIZE "\ue0d5" +# define OCT_ITALIC "\ue0d6" +# define OCT_TASKLIST "\ue0d7" +# define OCT_VERIFIED "\ue0d8" +# define OCT_SMILEY "\ue0d9" +# define OCT_UNVERIFIED "\ue0da" +# define OCT_ELLIPSES "\ue0db" +# define OCT_FILE "\ue0dc" +# define OCT_GRABBER "\ue0dd" +# define OCT_PLUS_SMALL "\ue0de" +# define OCT_REPLY "\ue0df" +# define OCT_DEVICE_DESKTOP "\ue0e0" +# define FA_GLASS "\ue0e1" +# define FA_MUSIC "\ue0e2" +# define FA_SEARCH "\ue0e3" +# define FA_ENVELOPE_O "\ue0e4" +# define FA_HEART "\ue0e5" +# define FA_STAR "\ue0e6" +# define FA_STAR_O "\ue0e7" +# define FA_USER "\ue0e8" +# define FA_FILM "\ue0e9" +# define FA_TH_LARGE "\ue0ea" +# define FA_TH "\ue0eb" +# define FA_TH_LIST "\ue0ec" +# define FA_CHECK "\ue0ed" +# define FA_CLOSE "\ue0ee" +# define FA_SEARCH_PLUS "\ue0ef" +# define FA_SEARCH_MINUS "\ue0f0" +# define FA_POWER_OFF "\ue0f1" +# define FA_SIGNAL "\ue0f2" +# define FA_COG "\ue0f3" +# define FA_TRASH_O "\ue0f4" +# define FA_HOME "\ue0f5" +# define FA_FILE_O "\ue0f6" +# define FA_CLOCK_O "\ue0f7" +# define FA_ROAD "\ue0f8" +# define FA_DOWNLOAD "\ue0f9" +# define FA_ARROW_CIRCLE_O_DOWN "\ue0fa" +# define FA_ARROW_CIRCLE_O_UP "\ue0fb" +# define FA_INBOX "\ue0fc" +# define FA_PLAY_CIRCLE_O "\ue0fd" +# define FA_REPEAT "\ue0fe" +# define FA_REFRESH "\ue0ff" +# define FA_LIST_ALT "\ue100" +# define FA_LOCK "\ue101" +# define FA_FLAG "\ue102" +# define FA_HEADPHONES "\ue103" +# define FA_VOLUME_OFF "\ue104" +# define FA_VOLUME_DOWN "\ue105" +# define FA_VOLUME_UP "\ue106" +# define FA_QRCODE "\ue107" +# define FA_BARCODE "\ue108" +# define FA_TAG "\ue109" +# define FA_TAGS "\ue10a" +# define FA_BOOK "\ue10b" +# define FA_BOOKMARK "\ue10c" +# define FA_PRINT "\ue10d" +# define FA_CAMERA "\ue10e" +# define FA_FONT "\ue10f" +# define FA_BOLD "\ue110" +# define FA_ITALIC "\ue111" +# define FA_TEXT_HEIGHT "\ue112" +# define FA_TEXT_WIDTH "\ue113" +# define FA_ALIGN_LEFT "\ue114" +# define FA_ALIGN_CENTER "\ue115" +# define FA_ALIGN_RIGHT "\ue116" +# define FA_ALIGN_JUSTIFY "\ue117" +# define FA_LIST "\ue118" +# define FA_DEDENT "\ue119" +# define FA_INDENT "\ue11a" +# define FA_VIDEO_CAMERA "\ue11b" +# define FA_IMAGE "\ue11c" +# define FA_PENCIL "\ue11d" +# define FA_MAP_MARKER "\ue11e" +# define FA_ADJUST "\ue11f" +# define FA_TINT "\ue120" +# define FA_EDIT "\ue121" +# define FA_SHARE_SQUARE_O "\ue122" +# define FA_CHECK_SQUARE_O "\ue123" +# define FA_ARROWS "\ue124" +# define FA_STEP_BACKWARD "\ue125" +# define FA_FAST_BACKWARD "\ue126" +# define FA_BACKWARD "\ue127" +# define FA_PLAY "\ue128" +# define FA_PAUSE "\ue129" +# define FA_STOP "\ue12a" +# define FA_FORWARD "\ue12b" +# define FA_FAST_FORWARD "\ue12c" +# define FA_STEP_FORWARD "\ue12d" +# define FA_EJECT "\ue12e" +# define FA_CHEVRON_LEFT "\ue12f" +# define FA_CHEVRON_RIGHT "\ue130" +# define FA_PLUS_CIRCLE "\ue131" +# define FA_MINUS_CIRCLE "\ue132" +# define FA_TIMES_CIRCLE "\ue133" +# define FA_CHECK_CIRCLE "\ue134" +# define FA_QUESTION_CIRCLE "\ue135" +# define FA_INFO_CIRCLE "\ue136" +# define FA_CROSSHAIRS "\ue137" +# define FA_TIMES_CIRCLE_O "\ue138" +# define FA_CHECK_CIRCLE_O "\ue139" +# define FA_BAN "\ue13a" +# define FA_ARROW_LEFT "\ue13b" +# define FA_ARROW_RIGHT "\ue13c" +# define FA_ARROW_UP "\ue13d" +# define FA_ARROW_DOWN "\ue13e" +# define FA_MAIL_FORWARD "\ue13f" +# define FA_EXPAND "\ue140" +# define FA_COMPRESS "\ue141" +# define FA_PLUS "\ue142" +# define FA_MINUS "\ue143" +# define FA_ASTERISK "\ue144" +# define FA_EXCLAMATION_CIRCLE "\ue145" +# define FA_GIFT "\ue146" +# define FA_LEAF "\ue147" +# define FA_FIRE "\ue148" +# define FA_EYE "\ue149" +# define FA_EYE_SLASH "\ue14a" +# define FA_EXCLAMATION_TRIANGLE "\ue14b" +# define FA_PLANE "\ue14c" +# define FA_CALENDAR "\ue14d" +# define FA_RANDOM "\ue14e" +# define FA_COMMENT "\ue14f" +# define FA_MAGNET "\ue150" +# define FA_CHEVRON_UP "\ue151" +# define FA_CHEVRON_DOWN "\ue152" +# define FA_RETWEET "\ue153" +# define FA_SHOPPING_CART "\ue154" +# define FA_FOLDER "\ue155" +# define FA_FOLDER_OPEN "\ue156" +# define FA_ARROWS_V "\ue157" +# define FA_ARROWS_H "\ue158" +# define FA_BAR_CHART "\ue159" +# define FA_TWITTER_SQUARE "\ue15a" +# define FA_FACEBOOK_SQUARE "\ue15b" +# define FA_CAMERA_RETRO "\ue15c" +# define FA_KEY "\ue15d" +# define FA_COGS "\ue15e" +# define FA_COMMENTS "\ue15f" +# define FA_THUMBS_O_UP "\ue160" +# define FA_THUMBS_O_DOWN "\ue161" +# define FA_STAR_HALF "\ue162" +# define FA_HEART_O "\ue163" +# define FA_SIGN_OUT "\ue164" +# define FA_LINKEDIN_SQUARE "\ue165" +# define FA_THUMB_TACK "\ue166" +# define FA_EXTERNAL_LINK "\ue167" +# define FA_SIGN_IN "\ue168" +# define FA_TROPHY "\ue169" +# define FA_GITHUB_SQUARE "\ue16a" +# define FA_UPLOAD "\ue16b" +# define FA_LEMON_O "\ue16c" +# define FA_PHONE "\ue16d" +# define FA_SQUARE_O "\ue16e" +# define FA_BOOKMARK_O "\ue16f" +# define FA_PHONE_SQUARE "\ue170" +# define FA_TWITTER "\ue171" +# define FA_FACEBOOK "\ue172" +# define FA_GITHUB "\ue173" +# define FA_UNLOCK "\ue174" +# define FA_CREDIT_CARD "\ue175" +# define FA_FEED "\ue176" +# define FA_HDD_O "\ue177" +# define FA_BULLHORN "\ue178" +# define FA_BELL_O "\ue179" +# define FA_CERTIFICATE "\ue17a" +# define FA_HAND_O_RIGHT "\ue17b" +# define FA_HAND_O_LEFT "\ue17c" +# define FA_HAND_O_UP "\ue17d" +# define FA_HAND_O_DOWN "\ue17e" +# define FA_ARROW_CIRCLE_LEFT "\ue17f" +# define FA_ARROW_CIRCLE_RIGHT "\ue180" +# define FA_ARROW_CIRCLE_UP "\ue181" +# define FA_ARROW_CIRCLE_DOWN "\ue182" +# define FA_GLOBE "\ue183" +# define FA_WRENCH "\ue184" +# define FA_TASKS "\ue185" +# define FA_FILTER "\ue186" +# define FA_BRIEFCASE "\ue187" +# define FA_ARROWS_ALT "\ue188" +# define FA_GROUP "\ue189" +# define FA_CHAIN "\ue18a" +# define FA_CLOUD "\ue18b" +# define FA_FLASK "\ue18c" +# define FA_CUT "\ue18d" +# define FA_COPY "\ue18e" +# define FA_PAPERCLIP "\ue18f" +# define FA_FLOPPY_O "\ue190" +# define FA_SQUARE "\ue191" +# define FA_BARS "\ue192" +# define FA_LIST_UL "\ue193" +# define FA_LIST_OL "\ue194" +# define FA_STRIKETHROUGH "\ue195" +# define FA_UNDERLINE "\ue196" +# define FA_TABLE "\ue197" +# define FA_MAGIC "\ue198" +# define FA_TRUCK "\ue199" +# define FA_PINTEREST "\ue19a" +# define FA_PINTEREST_SQUARE "\ue19b" +# define FA_GOOGLE_PLUS_SQUARE "\ue19c" +# define FA_GOOGLE_PLUS "\ue19d" +# define FA_MONEY "\ue19e" +# define FA_CARET_DOWN "\ue19f" +# define FA_CARET_UP "\ue1a0" +# define FA_CARET_LEFT "\ue1a1" +# define FA_CARET_RIGHT "\ue1a2" +# define FA_COLUMNS "\ue1a3" +# define FA_SORT "\ue1a4" +# define FA_SORT_DESC "\ue1a5" +# define FA_SORT_ASC "\ue1a6" +# define FA_ENVELOPE "\ue1a7" +# define FA_LINKEDIN "\ue1a8" +# define FA_ROTATE_LEFT "\ue1a9" +# define FA_GAVEL "\ue1aa" +# define FA_DASHBOARD "\ue1ab" +# define FA_COMMENT_O "\ue1ac" +# define FA_COMMENTS_O "\ue1ad" +# define FA_BOLT "\ue1ae" +# define FA_SITEMAP "\ue1af" +# define FA_UMBRELLA "\ue1b0" +# define FA_CLIPBOARD "\ue1b1" +# define FA_LIGHTBULB_O "\ue1b2" +# define FA_EXCHANGE "\ue1b3" +# define FA_CLOUD_DOWNLOAD "\ue1b4" +# define FA_CLOUD_UPLOAD "\ue1b5" +# define FA_USER_MD "\ue1b6" +# define FA_STETHOSCOPE "\ue1b7" +# define FA_SUITCASE "\ue1b8" +# define FA_BELL "\ue1b9" +# define FA_COFFEE "\ue1ba" +# define FA_CUTLERY "\ue1bb" +# define FA_FILE_TEXT_O "\ue1bc" +# define FA_BUILDING_O "\ue1bd" +# define FA_HOSPITAL_O "\ue1be" +# define FA_AMBULANCE "\ue1bf" +# define FA_MEDKIT "\ue1c0" +# define FA_FIGHTER_JET "\ue1c1" +# define FA_BEER "\ue1c2" +# define FA_H_SQUARE "\ue1c3" +# define FA_PLUS_SQUARE "\ue1c4" +# define FA_ANGLE_DOUBLE_LEFT "\ue1c5" +# define FA_ANGLE_DOUBLE_RIGHT "\ue1c6" +# define FA_ANGLE_DOUBLE_UP "\ue1c7" +# define FA_ANGLE_DOUBLE_DOWN "\ue1c8" +# define FA_ANGLE_LEFT "\ue1c9" +# define FA_ANGLE_RIGHT "\ue1ca" +# define FA_ANGLE_UP "\ue1cb" +# define FA_ANGLE_DOWN "\ue1cc" +# define FA_DESKTOP "\ue1cd" +# define FA_LAPTOP "\ue1ce" +# define FA_TABLET "\ue1cf" +# define FA_MOBILE "\ue1d0" +# define FA_CIRCLE_O "\ue1d1" +# define FA_QUOTE_LEFT "\ue1d2" +# define FA_QUOTE_RIGHT "\ue1d3" +# define FA_SPINNER "\ue1d4" +# define FA_CIRCLE "\ue1d5" +# define FA_MAIL_REPLY "\ue1d6" +# define FA_GITHUB_ALT "\ue1d7" +# define FA_FOLDER_O "\ue1d8" +# define FA_FOLDER_OPEN_O "\ue1d9" +# define FA_EXPAND_ALT "\ue1da" +# define FA_COLLAPSE_ALT "\ue1db" +# define FA_SMILE_O "\ue1dc" +# define FA_FROWN_O "\ue1dd" +# define FA_MEH_O "\ue1de" +# define FA_GAMEPAD "\ue1df" +# define FA_KEYBOARD_O "\ue1e0" +# define FA_FLAG_O "\ue1e1" +# define FA_FLAG_CHECKERED "\ue1e2" +# define FA_TERMINAL "\ue1e3" +# define FA_CODE "\ue1e4" +# define FA_MAIL_REPLY_ALL "\ue1e5" +# define FA_STAR_HALF_EMPTY "\ue1e6" +# define FA_LOCATION_ARROW "\ue1e7" +# define FA_CROP "\ue1e8" +# define FA_CODE_FORK "\ue1e9" +# define FA_CHAIN_BROKEN "\ue1ea" +# define FA_QUESTION "\ue1eb" +# define FA_INFO "\ue1ec" +# define FA_EXCLAMATION "\ue1ed" +# define FA_SUPERSCRIPT "\ue1ee" +# define FA_SUBSCRIPT "\ue1ef" +# define FA_ERASER "\ue1f0" +# define FA_PUZZLE_PIECE "\ue1f1" +# define FA_MICROPHONE "\ue1f2" +# define FA_MICROPHONE_SLASH "\ue1f3" +# define FA_SHIELD "\ue1f4" +# define FA_CALENDAR_O "\ue1f5" +# define FA_FIRE_EXTINGUISHER "\ue1f6" +# define FA_ROCKET "\ue1f7" +# define FA_MAXCDN "\ue1f8" +# define FA_CHEVRON_CIRCLE_LEFT "\ue1f9" +# define FA_CHEVRON_CIRCLE_RIGHT "\ue1fa" +# define FA_CHEVRON_CIRCLE_UP "\ue1fb" +# define FA_CHEVRON_CIRCLE_DOWN "\ue1fc" +# define FA_HTML5 "\ue1fd" +# define FA_CSS3 "\ue1fe" +# define FA_ANCHOR "\ue1ff" +# define FA_UNLOCK_ALT "\ue200" +# define FA_BULLSEYE "\ue201" +# define FA_ELLIPSIS_H "\ue202" +# define FA_ELLIPSIS_V "\ue203" +# define FA_RSS_SQUARE "\ue204" +# define FA_PLAY_CIRCLE "\ue205" +# define FA_TICKET "\ue206" +# define FA_MINUS_SQUARE "\ue207" +# define FA_MINUS_SQUARE_O "\ue208" +# define FA_LEVEL_UP "\ue209" +# define FA_LEVEL_DOWN "\ue20a" +# define FA_CHECK_SQUARE "\ue20b" +# define FA_PENCIL_SQUARE "\ue20c" +# define FA_EXTERNAL_LINK_SQUARE "\ue20d" +# define FA_SHARE_SQUARE "\ue20e" +# define FA_COMPASS "\ue20f" +# define FA_CARET_SQUARE_O_DOWN "\ue210" +# define FA_CARET_SQUARE_O_UP "\ue211" +# define FA_CARET_SQUARE_O_RIGHT "\ue212" +# define FA_EUR "\ue213" +# define FA_GBP "\ue214" +# define FA_DOLLAR "\ue215" +# define FA_INR "\ue216" +# define FA_CNY "\ue217" +# define FA_ROUBLE "\ue218" +# define FA_KRW "\ue219" +# define FA_BITCOIN "\ue21a" +# define FA_FILE "\ue21b" +# define FA_FILE_TEXT "\ue21c" +# define FA_SORT_ALPHA_ASC "\ue21d" +# define FA_SORT_ALPHA_DESC "\ue21e" +# define FA_SORT_AMOUNT_ASC "\ue21f" +# define FA_SORT_AMOUNT_DESC "\ue220" +# define FA_SORT_NUMERIC_ASC "\ue221" +# define FA_SORT_NUMERIC_DESC "\ue222" +# define FA_THUMBS_UP "\ue223" +# define FA_THUMBS_DOWN "\ue224" +# define FA_YOUTUBE_SQUARE "\ue225" +# define FA_YOUTUBE "\ue226" +# define FA_XING "\ue227" +# define FA_XING_SQUARE "\ue228" +# define FA_YOUTUBE_PLAY "\ue229" +# define FA_DROPBOX "\ue22a" +# define FA_STACK_OVERFLOW "\ue22b" +# define FA_INSTAGRAM "\ue22c" +# define FA_FLICKR "\ue22d" +# define FA_ADN "\ue22e" +# define FA_BITBUCKET "\ue22f" +# define FA_BITBUCKET_SQUARE "\ue230" +# define FA_TUMBLR "\ue231" +# define FA_TUMBLR_SQUARE "\ue232" +# define FA_LONG_ARROW_DOWN "\ue233" +# define FA_LONG_ARROW_UP "\ue234" +# define FA_LONG_ARROW_LEFT "\ue235" +# define FA_LONG_ARROW_RIGHT "\ue236" +# define FA_APPLE "\ue237" +# define FA_WINDOWS "\ue238" +# define FA_ANDROID "\ue239" +# define FA_LINUX "\ue23a" +# define FA_DRIBBBLE "\ue23b" +# define FA_SKYPE "\ue23c" +# define FA_FOURSQUARE "\ue23d" +# define FA_TRELLO "\ue23e" +# define FA_FEMALE "\ue23f" +# define FA_MALE "\ue240" +# define FA_GITTIP "\ue241" +# define FA_SUN_O "\ue242" +# define FA_MOON_O "\ue243" +# define FA_ARCHIVE "\ue244" +# define FA_BUG "\ue245" +# define FA_VK "\ue246" +# define FA_WEIBO "\ue247" +# define FA_RENREN "\ue248" +# define FA_PAGELINES "\ue249" +# define FA_STACK_EXCHANGE "\ue24a" +# define FA_ARROW_CIRCLE_O_RIGHT "\ue24b" +# define FA_ARROW_CIRCLE_O_LEFT "\ue24c" +# define FA_CARET_SQUARE_O_LEFT "\ue24d" +# define FA_DOT_CIRCLE_O "\ue24e" +# define FA_WHEELCHAIR "\ue24f" +# define FA_VIMEO_SQUARE "\ue250" +# define FA_TRY "\ue251" +# define FA_PLUS_SQUARE_O "\ue252" +# define FA_SPACE_SHUTTLE "\ue253" +# define FA_SLACK "\ue254" +# define FA_ENVELOPE_SQUARE "\ue255" +# define FA_WORDPRESS "\ue256" +# define FA_OPENID "\ue257" +# define FA_BANK "\ue258" +# define FA_GRADUATION_CAP "\ue259" +# define FA_YAHOO "\ue25a" +# define FA_GOOGLE "\ue25b" +# define FA_REDDIT "\ue25c" +# define FA_REDDIT_SQUARE "\ue25d" +# define FA_STUMBLEUPON_CIRCLE "\ue25e" +# define FA_STUMBLEUPON "\ue25f" +# define FA_DELICIOUS "\ue260" +# define FA_DIGG "\ue261" +# define FA_PIED_PIPER_PP "\ue262" +# define FA_PIED_PIPER_ALT "\ue263" +# define FA_DRUPAL "\ue264" +# define FA_JOOMLA "\ue265" +# define FA_LANGUAGE "\ue266" +# define FA_FAX "\ue267" +# define FA_BUILDING "\ue268" +# define FA_CHILD "\ue269" +# define FA_PAW "\ue26a" +# define FA_SPOON "\ue26b" +# define FA_CUBE "\ue26c" +# define FA_CUBES "\ue26d" +# define FA_BEHANCE "\ue26e" +# define FA_BEHANCE_SQUARE "\ue26f" +# define FA_STEAM "\ue270" +# define FA_STEAM_SQUARE "\ue271" +# define FA_RECYCLE "\ue272" +# define FA_AUTOMOBILE "\ue273" +# define FA_CAB "\ue274" +# define FA_TREE "\ue275" +# define FA_SPOTIFY "\ue276" +# define FA_DEVIANTART "\ue277" +# define FA_SOUNDCLOUD "\ue278" +# define FA_DATABASE "\ue279" +# define FA_FILE_PDF_O "\ue27a" +# define FA_FILE_WORD_O "\ue27b" +# define FA_FILE_EXCEL_O "\ue27c" +# define FA_FILE_POWERPOINT_O "\ue27d" +# define FA_FILE_IMAGE_O "\ue27e" +# define FA_FILE_ARCHIVE_O "\ue27f" +# define FA_FILE_AUDIO_O "\ue280" +# define FA_FILE_MOVIE_O "\ue281" +# define FA_FILE_CODE_O "\ue282" +# define FA_VINE "\ue283" +# define FA_CODEPEN "\ue284" +# define FA_JSFIDDLE "\ue285" +# define FA_LIFE_BOUY "\ue286" +# define FA_CIRCLE_O_NOTCH "\ue287" +# define FA_RA "\ue288" +# define FA_EMPIRE "\ue289" +# define FA_GIT_SQUARE "\ue28a" +# define FA_GIT "\ue28b" +# define FA_HACKER_NEWS "\ue28c" +# define FA_TENCENT_WEIBO "\ue28d" +# define FA_QQ "\ue28e" +# define FA_WECHAT "\ue28f" +# define FA_PAPER_PLANE "\ue290" +# define FA_PAPER_PLANE_O "\ue291" +# define FA_HISTORY "\ue292" +# define FA_CIRCLE_THIN "\ue293" +# define FA_HEADER "\ue294" +# define FA_PARAGRAPH "\ue295" +# define FA_SLIDERS "\ue296" +# define FA_SHARE_ALT "\ue297" +# define FA_SHARE_ALT_SQUARE "\ue298" +# define FA_BOMB "\ue299" +# define FA_FUTBOL_O "\ue29a" +# define FA_TTY "\ue29b" +# define FA_BINOCULARS "\ue29c" +# define FA_PLUG "\ue29d" +# define FA_SLIDESHARE "\ue29e" +# define FA_TWITCH "\ue29f" +# define FA_YELP "\ue2a0" +# define FA_NEWSPAPER_O "\ue2a1" +# define FA_WIFI "\ue2a2" +# define FA_CALCULATOR "\ue2a3" +# define FA_PAYPAL "\ue2a4" +# define FA_GOOGLE_WALLET "\ue2a5" +# define FA_CC_VISA "\ue2a6" +# define FA_CC_MASTERCARD "\ue2a7" +# define FA_CC_DISCOVER "\ue2a8" +# define FA_CC_AMEX "\ue2a9" +# define FA_CC_PAYPAL "\ue2aa" +# define FA_CC_STRIPE "\ue2ab" +# define FA_BELL_SLASH "\ue2ac" +# define FA_BELL_SLASH_O "\ue2ad" +# define FA_TRASH "\ue2ae" +# define FA_COPYRIGHT "\ue2af" +# define FA_AT "\ue2b0" +# define FA_EYEDROPPER "\ue2b1" +# define FA_PAINT_BRUSH "\ue2b2" +# define FA_BIRTHDAY_CAKE "\ue2b3" +# define FA_AREA_CHART "\ue2b4" +# define FA_PIE_CHART "\ue2b5" +# define FA_LINE_CHART "\ue2b6" +# define FA_LASTFM "\ue2b7" +# define FA_LASTFM_SQUARE "\ue2b8" +# define FA_TOGGLE_OFF "\ue2b9" +# define FA_TOGGLE_ON "\ue2ba" +# define FA_BICYCLE "\ue2bb" +# define FA_BUS "\ue2bc" +# define FA_IOXHOST "\ue2bd" +# define FA_ANGELLIST "\ue2be" +# define FA_CC "\ue2bf" +# define FA_ILS "\ue2c0" +# define FA_MEANPATH "\ue2c1" +# define FA_BUYSELLADS "\ue2c2" +# define FA_CONNECTDEVELOP "\ue2c3" +# define FA_DASHCUBE "\ue2c4" +# define FA_FORUMBEE "\ue2c5" +# define FA_LEANPUB "\ue2c6" +# define FA_SELLSY "\ue2c7" +# define FA_SHIRTSINBULK "\ue2c8" +# define FA_SIMPLYBUILT "\ue2c9" +# define FA_SKYATLAS "\ue2ca" +# define FA_CART_PLUS "\ue2cb" +# define FA_CART_ARROW_DOWN "\ue2cc" +# define FA_DIAMOND "\ue2cd" +# define FA_SHIP "\ue2ce" +# define FA_USER_SECRET "\ue2cf" +# define FA_MOTORCYCLE "\ue2d0" +# define FA_STREET_VIEW "\ue2d1" +# define FA_HEARTBEAT "\ue2d2" +# define FA_VENUS "\ue2d3" +# define FA_MARS "\ue2d4" +# define FA_MERCURY "\ue2d5" +# define FA_INTERSEX "\ue2d6" +# define FA_TRANSGENDER_ALT "\ue2d7" +# define FA_VENUS_DOUBLE "\ue2d8" +# define FA_MARS_DOUBLE "\ue2d9" +# define FA_VENUS_MARS "\ue2da" +# define FA_MARS_STROKE "\ue2db" +# define FA_MARS_STROKE_V "\ue2dc" +# define FA_MARS_STROKE_H "\ue2dd" +# define FA_NEUTER "\ue2de" +# define FA_GENDERLESS "\ue2df" +# define FA__523 "\ue2e0" +# define FA__524 "\ue2e1" +# define FA_FACEBOOK_OFFICIAL "\ue2e2" +# define FA_PINTEREST_P "\ue2e3" +# define FA_WHATSAPP "\ue2e4" +# define FA_SERVER "\ue2e5" +# define FA_USER_PLUS "\ue2e6" +# define FA_USER_TIMES "\ue2e7" +# define FA_BED "\ue2e8" +# define FA_VIACOIN "\ue2e9" +# define FA_TRAIN "\ue2ea" +# define FA_SUBWAY "\ue2eb" +# define FA_MEDIUM "\ue2ec" +# define FA_Y_COMBINATOR "\ue2ed" +# define FA_OPTIN_MONSTER "\ue2ee" +# define FA_OPENCART "\ue2ef" +# define FA_EXPEDITEDSSL "\ue2f0" +# define FA_BATTERY "\ue2f1" +# define FA_BATTERY_3 "\ue2f2" +# define FA_BATTERY_2 "\ue2f3" +# define FA_BATTERY_1 "\ue2f4" +# define FA_BATTERY_0 "\ue2f5" +# define FA_MOUSE_POINTER "\ue2f6" +# define FA_I_CURSOR "\ue2f7" +# define FA_OBJECT_GROUP "\ue2f8" +# define FA_OBJECT_UNGROUP "\ue2f9" +# define FA_STICKY_NOTE "\ue2fa" +# define FA_STICKY_NOTE_O "\ue2fb" +# define FA_CC_JCB "\ue2fc" +# define FA_CC_DINERS_CLUB "\ue2fd" +# define FA_CLONE "\ue2fe" +# define FA_BALANCE_SCALE "\ue2ff" +# define FA_HOURGLASS_O "\ue300" +# define FA_HOURGLASS_1 "\ue301" +# define FA_HOURGLASS_2 "\ue302" +# define FA_HOURGLASS_3 "\ue303" +# define FA_HOURGLASS "\ue304" +# define FA_HAND_GRAB_O "\ue305" +# define FA_HAND_PAPER_O "\ue306" +# define FA_HAND_SCISSORS_O "\ue307" +# define FA_HAND_LIZARD_O "\ue308" +# define FA_HAND_SPOCK_O "\ue309" +# define FA_HAND_POINTER_O "\ue30a" +# define FA_HAND_PEACE_O "\ue30b" +# define FA_TRADEMARK "\ue30c" +# define FA_REGISTERED "\ue30d" +# define FA_CREATIVE_COMMONS "\ue30e" +# define FA_GG "\ue30f" +# define FA_GG_CIRCLE "\ue310" +# define FA_TRIPADVISOR "\ue311" +# define FA_ODNOKLASSNIKI "\ue312" +# define FA_ODNOKLASSNIKI_SQUARE "\ue313" +# define FA_GET_POCKET "\ue314" +# define FA_WIKIPEDIA_W "\ue315" +# define FA_SAFARI "\ue316" +# define FA_CHROME "\ue317" +# define FA_FIREFOX "\ue318" +# define FA_OPERA "\ue319" +# define FA_INTERNET_EXPLORER "\ue31a" +# define FA_TELEVISION "\ue31b" +# define FA_CONTAO "\ue31c" +# define FA_500PX "\ue31d" +# define FA_AMAZON "\ue31e" +# define FA_CALENDAR_PLUS_O "\ue31f" +# define FA_CALENDAR_MINUS_O "\ue320" +# define FA_CALENDAR_TIMES_O "\ue321" +# define FA_CALENDAR_CHECK_O "\ue322" +# define FA_INDUSTRY "\ue323" +# define FA_MAP_PIN "\ue324" +# define FA_MAP_SIGNS "\ue325" +# define FA_MAP_O "\ue326" +# define FA_MAP "\ue327" +# define FA_COMMENTING "\ue328" +# define FA_COMMENTING_O "\ue329" +# define FA_HOUZZ "\ue32a" +# define FA_VIMEO "\ue32b" +# define FA_BLACK_TIE "\ue32c" +# define FA_FONTICONS "\ue32d" +# define FA_REDDIT_ALIEN "\ue32e" +# define FA_EDGE "\ue32f" +# define FA_CREDIT_CARD_ALT "\ue330" +# define FA_CODIEPIE "\ue331" +# define FA_MODX "\ue332" +# define FA_FORT_AWESOME "\ue333" +# define FA_USB "\ue334" +# define FA_PRODUCT_HUNT "\ue335" +# define FA_MIXCLOUD "\ue336" +# define FA_SCRIBD "\ue337" +# define FA_PAUSE_CIRCLE "\ue338" +# define FA_PAUSE_CIRCLE_O "\ue339" +# define FA_STOP_CIRCLE "\ue33a" +# define FA_STOP_CIRCLE_O "\ue33b" +# define FA_SHOPPING_BAG "\ue33c" +# define FA_SHOPPING_BASKET "\ue33d" +# define FA_HASHTAG "\ue33e" +# define FA_BLUETOOTH "\ue33f" +# define FA_BLUETOOTH_B "\ue340" +# define FA_PERCENT "\ue341" +# define FA_GITLAB "\ue342" +# define FA_WPBEGINNER "\ue343" +# define FA_WPFORMS "\ue344" +# define FA_ENVIRA "\ue345" +# define FA_UNIVERSAL_ACCESS "\ue346" +# define FA_WHEELCHAIR_ALT "\ue347" +# define FA_QUESTION_CIRCLE_O "\ue348" +# define FA_BLIND "\ue349" +# define FA_AUDIO_DESCRIPTION "\ue34a" +# define FA_VOLUME_CONTROL_PHONE "\ue34b" +# define FA_BRAILLE "\ue34c" +# define FA_ASSISTIVE_LISTENING_SYSTEMS "\ue34d" +# define FA_AMERICAN_SIGN_LANGUAGE_INTERPRETING "\ue34e" +# define FA_DEAF "\ue34f" +# define FA_GLIDE "\ue350" +# define FA_GLIDE_G "\ue351" +# define FA_SIGN_LANGUAGE "\ue352" +# define FA_LOW_VISION "\ue353" +# define FA_VIADEO "\ue354" +# define FA_VIADEO_SQUARE "\ue355" +# define FA_SNAPCHAT "\ue356" +# define FA_SNAPCHAT_GHOST "\ue357" +# define FA_SNAPCHAT_SQUARE "\ue358" +# define FA_PIED_PIPER "\ue359" +# define FA_FIRST_ORDER "\ue35a" +# define FA_YOAST "\ue35b" +# define FA_THEMEISLE "\ue35c" +# define FA_GOOGLE_PLUS_CIRCLE "\ue35d" +# define FA_FA "\ue35e" +# define FA_HANDSHAKE_O "\ue35f" +# define FA_ENVELOPE_OPEN "\ue360" +# define FA_ENVELOPE_OPEN_O "\ue361" +# define FA_LINODE "\ue362" +# define FA_ADDRESS_BOOK "\ue363" +# define FA_ADDRESS_BOOK_O "\ue364" +# define FA_ADDRESS_CARD "\ue365" +# define FA_ADDRESS_CARD_O "\ue366" +# define FA_USER_CIRCLE "\ue367" +# define FA_USER_CIRCLE_O "\ue368" +# define FA_USER_O "\ue369" +# define FA_ID_BADGE "\ue36a" +# define FA_DRIVERS_LICENSE "\ue36b" +# define FA_DRIVERS_LICENSE_O "\ue36c" +# define FA_QUORA "\ue36d" +# define FA_FREE_CODE_CAMP "\ue36e" +# define FA_TELEGRAM "\ue36f" +# define FA_THERMOMETER "\ue370" +# define FA_THERMOMETER_3 "\ue371" +# define FA_THERMOMETER_2 "\ue372" +# define FA_THERMOMETER_1 "\ue373" +# define FA_THERMOMETER_0 "\ue374" +# define FA_SHOWER "\ue375" +# define FA_BATH "\ue376" +# define FA_PODCAST "\ue377" +# define FA_WINDOW_MAXIMIZE "\ue378" +# define FA_WINDOW_MINIMIZE "\ue379" +# define FA_WINDOW_RESTORE "\ue37a" +# define FA_TIMES_RECTANGLE "\ue37b" +# define FA_TIMES_RECTANGLE_O "\ue37c" +# define FA_BANDCAMP "\ue37d" +# define FA_GRAV "\ue37e" +# define FA_ETSY "\ue37f" +# define FA_IMDB "\ue380" +# define FA_RAVELRY "\ue381" +# define FA_EERCAST "\ue382" +# define FA_MICROCHIP "\ue383" +# define FA_SNOWFLAKE_O "\ue384" +# define FA_SUPERPOWERS "\ue385" +# define FA_WPEXPLORER "\ue386" +# define FA_MEETUP "\ue387" +# define MD_ERROR "\ue388" +# define MD_ERROR_OUTLINE "\ue389" +# define MD_WARNING "\ue38a" +# define MD_ADD_ALERT "\ue38b" +# define MD_ALBUM "\ue38c" +# define MD_AV_TIMER "\ue38d" +# define MD_CLOSED_CAPTION "\ue38e" +# define MD_EQUALIZER "\ue38f" +# define MD_EXPLICIT "\ue390" +# define MD_FAST_FORWARD "\ue391" +# define MD_FAST_REWIND "\ue392" +# define MD_GAMES "\ue393" +# define MD_HEARING "\ue394" +# define MD_HIGH_QUALITY "\ue395" +# define MD_LOOP "\ue396" +# define MD_MIC "\ue397" +# define MD_MIC_NONE "\ue398" +# define MD_MIC_OFF "\ue399" +# define MD_MOVIE "\ue39a" +# define MD_LIBRARY_ADD "\ue39b" +# define MD_LIBRARY_BOOKS "\ue39c" +# define MD_LIBRARY_MUSIC "\ue39d" +# define MD_NEW_RELEASES "\ue39e" +# define MD_NOT_INTERESTED "\ue39f" +# define MD_PAUSE "\ue3a0" +# define MD_PAUSE_CIRCLE_FILLED "\ue3a1" +# define MD_PAUSE_CIRCLE_OUTLINE "\ue3a2" +# define MD_PLAY_ARROW "\ue3a3" +# define MD_PLAY_CIRCLE_FILLED "\ue3a4" +# define MD_PLAY_CIRCLE_OUTLINE "\ue3a5" +# define MD_PLAYLIST_ADD "\ue3a6" +# define MD_QUEUE "\ue3a7" +# define MD_QUEUE_MUSIC "\ue3a8" +# define MD_RADIO "\ue3a9" +# define MD_RECENT_ACTORS "\ue3aa" +# define MD_REPEAT "\ue3ab" +# define MD_REPEAT_ONE "\ue3ac" +# define MD_REPLAY "\ue3ad" +# define MD_SHUFFLE "\ue3ae" +# define MD_SKIP_NEXT "\ue3af" +# define MD_SKIP_PREVIOUS "\ue3b0" +# define MD_SNOOZE "\ue3b1" +# define MD_STOP "\ue3b2" +# define MD_SUBTITLES "\ue3b3" +# define MD_SURROUND_SOUND "\ue3b4" +# define MD_VIDEO_LIBRARY "\ue3b5" +# define MD_VIDEOCAM "\ue3b6" +# define MD_VIDEOCAM_OFF "\ue3b7" +# define MD_VOLUME_DOWN "\ue3b8" +# define MD_VOLUME_MUTE "\ue3b9" +# define MD_VOLUME_OFF "\ue3ba" +# define MD_VOLUME_UP "\ue3bb" +# define MD_WEB "\ue3bc" +# define MD_HD "\ue3bd" +# define MD_SORT_BY_ALPHA "\ue3be" +# define MD_AIRPLAY "\ue3bf" +# define MD_FORWARD_10 "\ue3c0" +# define MD_FORWARD_30 "\ue3c1" +# define MD_FORWARD_5 "\ue3c2" +# define MD_REPLAY_10 "\ue3c3" +# define MD_REPLAY_30 "\ue3c4" +# define MD_REPLAY_5 "\ue3c5" +# define MD_ADD_TO_QUEUE "\ue3c6" +# define MD_FIBER_DVR "\ue3c7" +# define MD_FIBER_NEW "\ue3c8" +# define MD_PLAYLIST_PLAY "\ue3c9" +# define MD_ART_TRACK "\ue3ca" +# define MD_FIBER_MANUAL_RECORD "\ue3cb" +# define MD_FIBER_SMART_RECORD "\ue3cc" +# define MD_MUSIC_VIDEO "\ue3cd" +# define MD_SUBSCRIPTIONS "\ue3ce" +# define MD_PLAYLIST_ADD_CHECK "\ue3cf" +# define MD_QUEUE_PLAY_NEXT "\ue3d0" +# define MD_REMOVE_FROM_QUEUE "\ue3d1" +# define MD_SLOW_MOTION_VIDEO "\ue3d2" +# define MD_WEB_ASSET "\ue3d3" +# define MD_FIBER_PIN "\ue3d4" +# define MD_BRANDING_WATERMARK "\ue3d5" +# define MD_CALL_TO_ACTION "\ue3d6" +# define MD_FEATURED_PLAY_LIST "\ue3d7" +# define MD_FEATURED_VIDEO "\ue3d8" +# define MD_NOTE "\ue3d9" +# define MD_VIDEO_CALL "\ue3da" +# define MD_VIDEO_LABEL "\ue3db" +# define MD_BUSINESS "\ue3dc" +# define MD_CALL "\ue3dd" +# define MD_CALL_END "\ue3de" +# define MD_CALL_MADE "\ue3df" +# define MD_CALL_MERGE "\ue3e0" +# define MD_CALL_MISSED "\ue3e1" +# define MD_CALL_RECEIVED "\ue3e2" +# define MD_CALL_SPLIT "\ue3e3" +# define MD_CHAT "\ue3e4" +# define MD_CLEAR_ALL "\ue3e5" +# define MD_COMMENT "\ue3e6" +# define MD_CONTACTS "\ue3e7" +# define MD_DIALER_SIP "\ue3e8" +# define MD_DIALPAD "\ue3e9" +# define MD_EMAIL "\ue3ea" +# define MD_FORUM "\ue3eb" +# define MD_IMPORT_EXPORT "\ue3ec" +# define MD_INVERT_COLORS_OFF "\ue3ed" +# define MD_LIVE_HELP "\ue3ee" +# define MD_LOCATION_OFF "\ue3ef" +# define MD_LOCATION_ON "\ue3f0" +# define MD_MESSAGE "\ue3f1" +# define MD_CHAT_BUBBLE "\ue3f2" +# define MD_CHAT_BUBBLE_OUTLINE "\ue3f3" +# define MD_NO_SIM "\ue3f4" +# define MD_PHONE "\ue3f5" +# define MD_PORTABLE_WIFI_OFF "\ue3f6" +# define MD_CONTACT_PHONE "\ue3f7" +# define MD_CONTACT_MAIL "\ue3f8" +# define MD_RING_VOLUME "\ue3f9" +# define MD_SPEAKER_PHONE "\ue3fa" +# define MD_STAY_CURRENT_LANDSCAPE "\ue3fb" +# define MD_STAY_CURRENT_PORTRAIT "\ue3fc" +# define MD_STAY_PRIMARY_LANDSCAPE "\ue3fd" +# define MD_STAY_PRIMARY_PORTRAIT "\ue3fe" +# define MD_SWAP_CALLS "\ue3ff" +# define MD_TEXTSMS "\ue400" +# define MD_VOICEMAIL "\ue401" +# define MD_VPN_KEY "\ue402" +# define MD_PHONELINK_ERASE "\ue403" +# define MD_PHONELINK_LOCK "\ue404" +# define MD_PHONELINK_RING "\ue405" +# define MD_PHONELINK_SETUP "\ue406" +# define MD_PRESENT_TO_ALL "\ue407" +# define MD_IMPORT_CONTACTS "\ue408" +# define MD_MAIL_OUTLINE "\ue409" +# define MD_SCREEN_SHARE "\ue40a" +# define MD_STOP_SCREEN_SHARE "\ue40b" +# define MD_CALL_MISSED_OUTGOING "\ue40c" +# define MD_RSS_FEED "\ue40d" +# define MD_ADD "\ue40e" +# define MD_ADD_BOX "\ue40f" +# define MD_ADD_CIRCLE "\ue410" +# define MD_ADD_CIRCLE_OUTLINE "\ue411" +# define MD_ARCHIVE "\ue412" +# define MD_BACKSPACE "\ue413" +# define MD_BLOCK "\ue414" +# define MD_CLEAR "\ue415" +# define MD_CONTENT_COPY "\ue416" +# define MD_CONTENT_CUT "\ue417" +# define MD_CONTENT_PASTE "\ue418" +# define MD_CREATE "\ue419" +# define MD_DRAFTS "\ue41a" +# define MD_FILTER_LIST "\ue41b" +# define MD_FLAG "\ue41c" +# define MD_FORWARD "\ue41d" +# define MD_GESTURE "\ue41e" +# define MD_INBOX "\ue41f" +# define MD_LINK "\ue420" +# define MD_MAIL "\ue421" +# define MD_MARKUNREAD "\ue422" +# define MD_REDO "\ue423" +# define MD_REMOVE "\ue424" +# define MD_REMOVE_CIRCLE "\ue425" +# define MD_REMOVE_CIRCLE_OUTLINE "\ue426" +# define MD_REPLY "\ue427" +# define MD_REPLY_ALL "\ue428" +# define MD_REPORT "\ue429" +# define MD_SAVE "\ue42a" +# define MD_SELECT_ALL "\ue42b" +# define MD_SEND "\ue42c" +# define MD_SORT "\ue42d" +# define MD_TEXT_FORMAT "\ue42e" +# define MD_UNDO "\ue42f" +# define MD_FONT_DOWNLOAD "\ue430" +# define MD_MOVE_TO_INBOX "\ue431" +# define MD_UNARCHIVE "\ue432" +# define MD_NEXT_WEEK "\ue433" +# define MD_WEEKEND "\ue434" +# define MD_DELETE_SWEEP "\ue435" +# define MD_LOW_PRIORITY "\ue436" +# define MD_ACCESS_ALARM "\ue437" +# define MD_ACCESS_ALARMS "\ue438" +# define MD_ACCESS_TIME "\ue439" +# define MD_ADD_ALARM "\ue43a" +# define MD_AIRPLANEMODE_INACTIVE "\ue43b" +# define MD_AIRPLANEMODE_ACTIVE "\ue43c" +# define MD_BATTERY_ALERT "\ue43d" +# define MD_BATTERY_CHARGING_FULL "\ue43e" +# define MD_BATTERY_FULL "\ue43f" +# define MD_BATTERY_STD "\ue440" +# define MD_BATTERY_UNKNOWN "\ue441" +# define MD_BLUETOOTH "\ue442" +# define MD_BLUETOOTH_CONNECTED "\ue443" +# define MD_BLUETOOTH_DISABLED "\ue444" +# define MD_BLUETOOTH_SEARCHING "\ue445" +# define MD_BRIGHTNESS_AUTO "\ue446" +# define MD_BRIGHTNESS_HIGH "\ue447" +# define MD_BRIGHTNESS_LOW "\ue448" +# define MD_BRIGHTNESS_MEDIUM "\ue449" +# define MD_DATA_USAGE "\ue44a" +# define MD_DEVELOPER_MODE "\ue44b" +# define MD_DEVICES "\ue44c" +# define MD_DVR "\ue44d" +# define MD_GPS_FIXED "\ue44e" +# define MD_GPS_NOT_FIXED "\ue44f" +# define MD_GPS_OFF "\ue450" +# define MD_LOCATION_DISABLED "\ue451" +# define MD_LOCATION_SEARCHING "\ue452" +# define MD_GRAPHIC_EQ "\ue453" +# define MD_NETWORK_CELL "\ue454" +# define MD_NETWORK_WIFI "\ue455" +# define MD_NFC "\ue456" +# define MD_WALLPAPER "\ue457" +# define MD_WIDGETS "\ue458" +# define MD_SCREEN_LOCK_LANDSCAPE "\ue459" +# define MD_SCREEN_LOCK_PORTRAIT "\ue45a" +# define MD_SCREEN_LOCK_ROTATION "\ue45b" +# define MD_SCREEN_ROTATION "\ue45c" +# define MD_SD_STORAGE "\ue45d" +# define MD_SETTINGS_SYSTEM_DAYDREAM "\ue45e" +# define MD_SIGNAL_CELLULAR_4_BAR "\ue45f" +# define MD_SIGNAL_CELLULAR_CONNECTED_NO_INTERNET_4_BAR "\ue460" +# define MD_SIGNAL_CELLULAR_NO_SIM "\ue461" +# define MD_SIGNAL_CELLULAR_NULL "\ue462" +# define MD_SIGNAL_CELLULAR_OFF "\ue463" +# define MD_SIGNAL_WIFI_4_BAR "\ue464" +# define MD_SIGNAL_WIFI_4_BAR_LOCK "\ue465" +# define MD_SIGNAL_WIFI_OFF "\ue466" +# define MD_STORAGE "\ue467" +# define MD_USB "\ue468" +# define MD_WIFI_LOCK "\ue469" +# define MD_WIFI_TETHERING "\ue46a" +# define MD_ATTACH_FILE "\ue46b" +# define MD_ATTACH_MONEY "\ue46c" +# define MD_BORDER_ALL "\ue46d" +# define MD_BORDER_BOTTOM "\ue46e" +# define MD_BORDER_CLEAR "\ue46f" +# define MD_BORDER_COLOR "\ue470" +# define MD_BORDER_HORIZONTAL "\ue471" +# define MD_BORDER_INNER "\ue472" +# define MD_BORDER_LEFT "\ue473" +# define MD_BORDER_OUTER "\ue474" +# define MD_BORDER_RIGHT "\ue475" +# define MD_BORDER_STYLE "\ue476" +# define MD_BORDER_TOP "\ue477" +# define MD_BORDER_VERTICAL "\ue478" +# define MD_FORMAT_ALIGN_CENTER "\ue479" +# define MD_FORMAT_ALIGN_JUSTIFY "\ue47a" +# define MD_FORMAT_ALIGN_LEFT "\ue47b" +# define MD_FORMAT_ALIGN_RIGHT "\ue47c" +# define MD_FORMAT_BOLD "\ue47d" +# define MD_FORMAT_CLEAR "\ue47e" +# define MD_FORMAT_COLOR_FILL "\ue47f" +# define MD_FORMAT_COLOR_RESET "\ue480" +# define MD_FORMAT_COLOR_TEXT "\ue481" +# define MD_FORMAT_INDENT_DECREASE "\ue482" +# define MD_FORMAT_INDENT_INCREASE "\ue483" +# define MD_FORMAT_ITALIC "\ue484" +# define MD_FORMAT_LINE_SPACING "\ue485" +# define MD_FORMAT_LIST_BULLETED "\ue486" +# define MD_FORMAT_LIST_NUMBERED "\ue487" +# define MD_FORMAT_PAINT "\ue488" +# define MD_FORMAT_QUOTE "\ue489" +# define MD_FORMAT_SIZE "\ue48a" +# define MD_FORMAT_STRIKETHROUGH "\ue48b" +# define MD_FORMAT_TEXTDIRECTION_L_TO_R "\ue48c" +# define MD_FORMAT_TEXTDIRECTION_R_TO_L "\ue48d" +# define MD_FORMAT_UNDERLINED "\ue48e" +# define MD_FUNCTIONS "\ue48f" +# define MD_INSERT_CHART "\ue490" +# define MD_INSERT_COMMENT "\ue491" +# define MD_INSERT_DRIVE_FILE "\ue492" +# define MD_INSERT_EMOTICON "\ue493" +# define MD_INSERT_INVITATION "\ue494" +# define MD_INSERT_LINK "\ue495" +# define MD_INSERT_PHOTO "\ue496" +# define MD_MERGE_TYPE "\ue497" +# define MD_MODE_COMMENT "\ue498" +# define MD_MODE_EDIT "\ue499" +# define MD_PUBLISH "\ue49a" +# define MD_SPACE_BAR "\ue49b" +# define MD_STRIKETHROUGH_S "\ue49c" +# define MD_VERTICAL_ALIGN_BOTTOM "\ue49d" +# define MD_VERTICAL_ALIGN_CENTER "\ue49e" +# define MD_VERTICAL_ALIGN_TOP "\ue49f" +# define MD_WRAP_TEXT "\ue4a0" +# define MD_MONEY_OFF "\ue4a1" +# define MD_DRAG_HANDLE "\ue4a2" +# define MD_FORMAT_SHAPES "\ue4a3" +# define MD_HIGHLIGHT "\ue4a4" +# define MD_LINEAR_SCALE "\ue4a5" +# define MD_SHORT_TEXT "\ue4a6" +# define MD_TEXT_FIELDS "\ue4a7" +# define MD_MONETIZATION_ON "\ue4a8" +# define MD_TITLE "\ue4a9" +# define MD_ATTACHMENT "\ue4aa" +# define MD_CLOUD "\ue4ab" +# define MD_CLOUD_CIRCLE "\ue4ac" +# define MD_CLOUD_DONE "\ue4ad" +# define MD_CLOUD_DOWNLOAD "\ue4ae" +# define MD_CLOUD_OFF "\ue4af" +# define MD_CLOUD_QUEUE "\ue4b0" +# define MD_CLOUD_UPLOAD "\ue4b1" +# define MD_FILE_DOWNLOAD "\ue4b2" +# define MD_FILE_UPLOAD "\ue4b3" +# define MD_FOLDER "\ue4b4" +# define MD_FOLDER_OPEN "\ue4b5" +# define MD_FOLDER_SHARED "\ue4b6" +# define MD_CREATE_NEW_FOLDER "\ue4b7" +# define MD_CAST "\ue4b8" +# define MD_CAST_CONNECTED "\ue4b9" +# define MD_COMPUTER "\ue4ba" +# define MD_DESKTOP_MAC "\ue4bb" +# define MD_DESKTOP_WINDOWS "\ue4bc" +# define MD_DEVELOPER_BOARD "\ue4bd" +# define MD_DOCK "\ue4be" +# define MD_GAMEPAD "\ue4bf" +# define MD_HEADSET "\ue4c0" +# define MD_HEADSET_MIC "\ue4c1" +# define MD_KEYBOARD "\ue4c2" +# define MD_KEYBOARD_ARROW_DOWN "\ue4c3" +# define MD_KEYBOARD_ARROW_LEFT "\ue4c4" +# define MD_KEYBOARD_ARROW_RIGHT "\ue4c5" +# define MD_KEYBOARD_ARROW_UP "\ue4c6" +# define MD_KEYBOARD_BACKSPACE "\ue4c7" +# define MD_KEYBOARD_CAPSLOCK "\ue4c8" +# define MD_KEYBOARD_HIDE "\ue4c9" +# define MD_KEYBOARD_RETURN "\ue4ca" +# define MD_KEYBOARD_TAB "\ue4cb" +# define MD_KEYBOARD_VOICE "\ue4cc" +# define MD_LAPTOP "\ue4cd" +# define MD_LAPTOP_CHROMEBOOK "\ue4ce" +# define MD_LAPTOP_MAC "\ue4cf" +# define MD_LAPTOP_WINDOWS "\ue4d0" +# define MD_MEMORY "\ue4d1" +# define MD_MOUSE "\ue4d2" +# define MD_PHONE_ANDROID "\ue4d3" +# define MD_PHONE_IPHONE "\ue4d4" +# define MD_PHONELINK "\ue4d5" +# define MD_PHONELINK_OFF "\ue4d6" +# define MD_ROUTER "\ue4d7" +# define MD_SCANNER "\ue4d8" +# define MD_SECURITY "\ue4d9" +# define MD_SIM_CARD "\ue4da" +# define MD_SMARTPHONE "\ue4db" +# define MD_SPEAKER "\ue4dc" +# define MD_SPEAKER_GROUP "\ue4dd" +# define MD_TABLET "\ue4de" +# define MD_TABLET_ANDROID "\ue4df" +# define MD_TABLET_MAC "\ue4e0" +# define MD_TOYS "\ue4e1" +# define MD_TV "\ue4e2" +# define MD_WATCH "\ue4e3" +# define MD_DEVICE_HUB "\ue4e4" +# define MD_POWER_INPUT "\ue4e5" +# define MD_DEVICES_OTHER "\ue4e6" +# define MD_VIDEOGAME_ASSET "\ue4e7" +# define MD_ADD_TO_PHOTOS "\ue4e8" +# define MD_ADJUST "\ue4e9" +# define MD_ASSISTANT "\ue4ea" +# define MD_ASSISTANT_PHOTO "\ue4eb" +# define MD_AUDIOTRACK "\ue4ec" +# define MD_BLUR_CIRCULAR "\ue4ed" +# define MD_BLUR_LINEAR "\ue4ee" +# define MD_BLUR_OFF "\ue4ef" +# define MD_BLUR_ON "\ue4f0" +# define MD_BRIGHTNESS_1 "\ue4f1" +# define MD_BRIGHTNESS_2 "\ue4f2" +# define MD_BRIGHTNESS_3 "\ue4f3" +# define MD_BRIGHTNESS_4 "\ue4f4" +# define MD_BRIGHTNESS_5 "\ue4f5" +# define MD_BRIGHTNESS_6 "\ue4f6" +# define MD_BRIGHTNESS_7 "\ue4f7" +# define MD_BROKEN_IMAGE "\ue4f8" +# define MD_BRUSH "\ue4f9" +# define MD_CAMERA "\ue4fa" +# define MD_CAMERA_ALT "\ue4fb" +# define MD_CAMERA_FRONT "\ue4fc" +# define MD_CAMERA_REAR "\ue4fd" +# define MD_CAMERA_ROLL "\ue4fe" +# define MD_CENTER_FOCUS_STRONG "\ue4ff" +# define MD_CENTER_FOCUS_WEAK "\ue500" +# define MD_COLLECTIONS "\ue501" +# define MD_COLOR_LENS "\ue502" +# define MD_COLORIZE "\ue503" +# define MD_COMPARE "\ue504" +# define MD_CONTROL_POINT "\ue505" +# define MD_CONTROL_POINT_DUPLICATE "\ue506" +# define MD_CROP_16_9 "\ue507" +# define MD_CROP_3_2 "\ue508" +# define MD_CROP "\ue509" +# define MD_CROP_5_4 "\ue50a" +# define MD_CROP_7_5 "\ue50b" +# define MD_CROP_DIN "\ue50c" +# define MD_CROP_FREE "\ue50d" +# define MD_CROP_LANDSCAPE "\ue50e" +# define MD_CROP_ORIGINAL "\ue50f" +# define MD_CROP_PORTRAIT "\ue510" +# define MD_CROP_SQUARE "\ue511" +# define MD_DEHAZE "\ue512" +# define MD_DETAILS "\ue513" +# define MD_EDIT "\ue514" +# define MD_EXPOSURE "\ue515" +# define MD_EXPOSURE_NEG_1 "\ue516" +# define MD_EXPOSURE_NEG_2 "\ue517" +# define MD_EXPOSURE_PLUS_1 "\ue518" +# define MD_EXPOSURE_PLUS_2 "\ue519" +# define MD_EXPOSURE_ZERO "\ue51a" +# define MD_FILTER_1 "\ue51b" +# define MD_FILTER_2 "\ue51c" +# define MD_FILTER_3 "\ue51d" +# define MD_FILTER "\ue51e" +# define MD_FILTER_4 "\ue51f" +# define MD_FILTER_5 "\ue520" +# define MD_FILTER_6 "\ue521" +# define MD_FILTER_7 "\ue522" +# define MD_FILTER_8 "\ue523" +# define MD_FILTER_9 "\ue524" +# define MD_FILTER_9_PLUS "\ue525" +# define MD_FILTER_B_AND_W "\ue526" +# define MD_FILTER_CENTER_FOCUS "\ue527" +# define MD_FILTER_DRAMA "\ue528" +# define MD_FILTER_FRAMES "\ue529" +# define MD_FILTER_HDR "\ue52a" +# define MD_FILTER_NONE "\ue52b" +# define MD_FILTER_TILT_SHIFT "\ue52c" +# define MD_FILTER_VINTAGE "\ue52d" +# define MD_FLARE "\ue52e" +# define MD_FLASH_AUTO "\ue52f" +# define MD_FLASH_OFF "\ue530" +# define MD_FLASH_ON "\ue531" +# define MD_FLIP "\ue532" +# define MD_GRADIENT "\ue533" +# define MD_GRAIN "\ue534" +# define MD_GRID_OFF "\ue535" +# define MD_GRID_ON "\ue536" +# define MD_HDR_OFF "\ue537" +# define MD_HDR_ON "\ue538" +# define MD_HDR_STRONG "\ue539" +# define MD_HDR_WEAK "\ue53a" +# define MD_HEALING "\ue53b" +# define MD_IMAGE "\ue53c" +# define MD_IMAGE_ASPECT_RATIO "\ue53d" +# define MD_ISO "\ue53e" +# define MD_LANDSCAPE "\ue53f" +# define MD_LEAK_ADD "\ue540" +# define MD_LEAK_REMOVE "\ue541" +# define MD_LENS "\ue542" +# define MD_LOOKS_3 "\ue543" +# define MD_LOOKS "\ue544" +# define MD_LOOKS_4 "\ue545" +# define MD_LOOKS_5 "\ue546" +# define MD_LOOKS_6 "\ue547" +# define MD_LOOKS_ONE "\ue548" +# define MD_LOOKS_TWO "\ue549" +# define MD_LOUPE "\ue54a" +# define MD_MONOCHROME_PHOTOS "\ue54b" +# define MD_MOVIE_CREATION "\ue54c" +# define MD_MUSIC_NOTE "\ue54d" +# define MD_NATURE "\ue54e" +# define MD_NATURE_PEOPLE "\ue54f" +# define MD_NAVIGATE_BEFORE "\ue550" +# define MD_NAVIGATE_NEXT "\ue551" +# define MD_PALETTE "\ue552" +# define MD_PANORAMA "\ue553" +# define MD_PANORAMA_FISH_EYE "\ue554" +# define MD_PANORAMA_HORIZONTAL "\ue555" +# define MD_PANORAMA_VERTICAL "\ue556" +# define MD_PANORAMA_WIDE_ANGLE "\ue557" +# define MD_PHOTO "\ue558" +# define MD_PHOTO_ALBUM "\ue559" +# define MD_PHOTO_CAMERA "\ue55a" +# define MD_PHOTO_LIBRARY "\ue55b" +# define MD_PICTURE_AS_PDF "\ue55c" +# define MD_PORTRAIT "\ue55d" +# define MD_REMOVE_RED_EYE "\ue55e" +# define MD_ROTATE_90_DEGREES_CCW "\ue55f" +# define MD_ROTATE_LEFT "\ue560" +# define MD_ROTATE_RIGHT "\ue561" +# define MD_SLIDESHOW "\ue562" +# define MD_STRAIGHTEN "\ue563" +# define MD_STYLE "\ue564" +# define MD_SWITCH_CAMERA "\ue565" +# define MD_SWITCH_VIDEO "\ue566" +# define MD_TAG_FACES "\ue567" +# define MD_TEXTURE "\ue568" +# define MD_TIMELAPSE "\ue569" +# define MD_TIMER_10 "\ue56a" +# define MD_TIMER_3 "\ue56b" +# define MD_TIMER "\ue56c" +# define MD_TIMER_OFF "\ue56d" +# define MD_TONALITY "\ue56e" +# define MD_TRANSFORM "\ue56f" +# define MD_TUNE "\ue570" +# define MD_VIEW_COMFY "\ue571" +# define MD_VIEW_COMPACT "\ue572" +# define MD_WB_AUTO "\ue573" +# define MD_WB_CLOUDY "\ue574" +# define MD_WB_INCANDESCENT "\ue575" +# define MD_WB_SUNNY "\ue576" +# define MD_COLLECTIONS_BOOKMARK "\ue577" +# define MD_PHOTO_SIZE_SELECT_ACTUAL "\ue578" +# define MD_PHOTO_SIZE_SELECT_LARGE "\ue579" +# define MD_PHOTO_SIZE_SELECT_SMALL "\ue57a" +# define MD_VIGNETTE "\ue57b" +# define MD_WB_IRIDESCENT "\ue57c" +# define MD_CROP_ROTATE "\ue57d" +# define MD_LINKED_CAMERA "\ue57e" +# define MD_ADD_A_PHOTO "\ue57f" +# define MD_MOVIE_FILTER "\ue580" +# define MD_PHOTO_FILTER "\ue581" +# define MD_BURST_MODE "\ue582" +# define MD_BEENHERE "\ue583" +# define MD_DIRECTIONS "\ue584" +# define MD_DIRECTIONS_BIKE "\ue585" +# define MD_DIRECTIONS_BUS "\ue586" +# define MD_DIRECTIONS_CAR "\ue587" +# define MD_DIRECTIONS_BOAT "\ue588" +# define MD_DIRECTIONS_SUBWAY "\ue589" +# define MD_DIRECTIONS_RAILWAY "\ue58a" +# define MD_DIRECTIONS_TRANSIT "\ue58b" +# define MD_DIRECTIONS_WALK "\ue58c" +# define MD_FLIGHT "\ue58d" +# define MD_HOTEL "\ue58e" +# define MD_LAYERS "\ue58f" +# define MD_LAYERS_CLEAR "\ue590" +# define MD_LOCAL_AIRPORT "\ue591" +# define MD_LOCAL_ATM "\ue592" +# define MD_LOCAL_ACTIVITY "\ue593" +# define MD_LOCAL_BAR "\ue594" +# define MD_LOCAL_CAFE "\ue595" +# define MD_LOCAL_CAR_WASH "\ue596" +# define MD_LOCAL_CONVENIENCE_STORE "\ue597" +# define MD_LOCAL_DRINK "\ue598" +# define MD_LOCAL_FLORIST "\ue599" +# define MD_LOCAL_GAS_STATION "\ue59a" +# define MD_LOCAL_GROCERY_STORE "\ue59b" +# define MD_LOCAL_HOSPITAL "\ue59c" +# define MD_LOCAL_HOTEL "\ue59d" +# define MD_LOCAL_LAUNDRY_SERVICE "\ue59e" +# define MD_LOCAL_LIBRARY "\ue59f" +# define MD_LOCAL_MALL "\ue5a0" +# define MD_LOCAL_MOVIES "\ue5a1" +# define MD_LOCAL_OFFER "\ue5a2" +# define MD_LOCAL_PARKING "\ue5a3" +# define MD_LOCAL_PHARMACY "\ue5a4" +# define MD_LOCAL_PHONE "\ue5a5" +# define MD_LOCAL_PIZZA "\ue5a6" +# define MD_LOCAL_PLAY "\ue5a7" +# define MD_LOCAL_POST_OFFICE "\ue5a8" +# define MD_LOCAL_PRINTSHOP "\ue5a9" +# define MD_LOCAL_DINING "\ue5aa" +# define MD_LOCAL_SEE "\ue5ab" +# define MD_LOCAL_SHIPPING "\ue5ac" +# define MD_LOCAL_TAXI "\ue5ad" +# define MD_PERSON_PIN "\ue5ae" +# define MD_MAP "\ue5af" +# define MD_MY_LOCATION "\ue5b0" +# define MD_NAVIGATION "\ue5b1" +# define MD_PIN_DROP "\ue5b2" +# define MD_PLACE "\ue5b3" +# define MD_RATE_REVIEW "\ue5b4" +# define MD_RESTAURANT_MENU "\ue5b5" +# define MD_SATELLITE "\ue5b6" +# define MD_STORE_MALL_DIRECTORY "\ue5b7" +# define MD_TERRAIN "\ue5b8" +# define MD_TRAFFIC "\ue5b9" +# define MD_DIRECTIONS_RUN "\ue5ba" +# define MD_ADD_LOCATION "\ue5bb" +# define MD_EDIT_LOCATION "\ue5bc" +# define MD_NEAR_ME "\ue5bd" +# define MD_PERSON_PIN_CIRCLE "\ue5be" +# define MD_ZOOM_OUT_MAP "\ue5bf" +# define MD_RESTAURANT "\ue5c0" +# define MD_EV_STATION "\ue5c1" +# define MD_STREETVIEW "\ue5c2" +# define MD_SUBWAY "\ue5c3" +# define MD_TRAIN "\ue5c4" +# define MD_TRAM "\ue5c5" +# define MD_TRANSFER_WITHIN_A_STATION "\ue5c6" +# define MD_APPS "\ue5c7" +# define MD_ARROW_BACK "\ue5c8" +# define MD_ARROW_DROP_DOWN "\ue5c9" +# define MD_ARROW_DROP_DOWN_CIRCLE "\ue5ca" +# define MD_ARROW_DROP_UP "\ue5cb" +# define MD_ARROW_FORWARD "\ue5cc" +# define MD_CANCEL "\ue5cd" +# define MD_CHECK "\ue5ce" +# define MD_CHEVRON_LEFT "\ue5cf" +# define MD_CHEVRON_RIGHT "\ue5d0" +# define MD_CLOSE "\ue5d1" +# define MD_EXPAND_LESS "\ue5d2" +# define MD_EXPAND_MORE "\ue5d3" +# define MD_FULLSCREEN "\ue5d4" +# define MD_FULLSCREEN_EXIT "\ue5d5" +# define MD_MENU "\ue5d6" +# define MD_MORE_HORIZ "\ue5d7" +# define MD_MORE_VERT "\ue5d8" +# define MD_REFRESH "\ue5d9" +# define MD_UNFOLD_LESS "\ue5da" +# define MD_UNFOLD_MORE "\ue5db" +# define MD_ARROW_UPWARD "\ue5dc" +# define MD_SUBDIRECTORY_ARROW_LEFT "\ue5dd" +# define MD_SUBDIRECTORY_ARROW_RIGHT "\ue5de" +# define MD_ARROW_DOWNWARD "\ue5df" +# define MD_FIRST_PAGE "\ue5e0" +# define MD_LAST_PAGE "\ue5e1" +# define MD_ADB "\ue5e2" +# define MD_BLUETOOTH_AUDIO "\ue5e3" +# define MD_DISC_FULL "\ue5e4" +# define MD_DO_NOT_DISTURB_ALT "\ue5e5" +# define MD_DO_NOT_DISTURB "\ue5e6" +# define MD_DRIVE_ETA "\ue5e7" +# define MD_EVENT_AVAILABLE "\ue5e8" +# define MD_EVENT_BUSY "\ue5e9" +# define MD_EVENT_NOTE "\ue5ea" +# define MD_FOLDER_SPECIAL "\ue5eb" +# define MD_MMS "\ue5ec" +# define MD_MORE "\ue5ed" +# define MD_NETWORK_LOCKED "\ue5ee" +# define MD_PHONE_BLUETOOTH_SPEAKER "\ue5ef" +# define MD_PHONE_FORWARDED "\ue5f0" +# define MD_PHONE_IN_TALK "\ue5f1" +# define MD_PHONE_LOCKED "\ue5f2" +# define MD_PHONE_MISSED "\ue5f3" +# define MD_PHONE_PAUSED "\ue5f4" +# define MD_SD_CARD "\ue5f5" +# define MD_SIM_CARD_ALERT "\ue5f6" +# define MD_SMS "\ue5f7" +# define MD_SMS_FAILED "\ue5f8" +# define MD_SYNC "\ue5f9" +# define MD_SYNC_DISABLED "\ue5fa" +# define MD_SYNC_PROBLEM "\ue5fb" +# define MD_SYSTEM_UPDATE "\ue5fc" +# define MD_TAP_AND_PLAY "\ue5fd" +# define MD_TIME_TO_LEAVE "\ue5fe" +# define MD_VIBRATION "\ue5ff" +# define MD_VOICE_CHAT "\ue600" +# define MD_VPN_LOCK "\ue601" +# define MD_AIRLINE_SEAT_FLAT "\ue602" +# define MD_AIRLINE_SEAT_FLAT_ANGLED "\ue603" +# define MD_AIRLINE_SEAT_INDIVIDUAL_SUITE "\ue604" +# define MD_AIRLINE_SEAT_LEGROOM_EXTRA "\ue605" +# define MD_AIRLINE_SEAT_LEGROOM_NORMAL "\ue606" +# define MD_AIRLINE_SEAT_LEGROOM_REDUCED "\ue607" +# define MD_AIRLINE_SEAT_RECLINE_EXTRA "\ue608" +# define MD_AIRLINE_SEAT_RECLINE_NORMAL "\ue609" +# define MD_CONFIRMATION_NUMBER "\ue60a" +# define MD_LIVE_TV "\ue60b" +# define MD_ONDEMAND_VIDEO "\ue60c" +# define MD_PERSONAL_VIDEO "\ue60d" +# define MD_POWER "\ue60e" +# define MD_WC "\ue60f" +# define MD_WIFI "\ue610" +# define MD_ENHANCED_ENCRYPTION "\ue611" +# define MD_NETWORK_CHECK "\ue612" +# define MD_NO_ENCRYPTION "\ue613" +# define MD_RV_HOOKUP "\ue614" +# define MD_DO_NOT_DISTURB_OFF "\ue615" +# define MD_DO_NOT_DISTURB_ON "\ue616" +# define MD_PRIORITY_HIGH "\ue617" +# define MD_PIE_CHART "\ue618" +# define MD_PIE_CHART_OUTLINED "\ue619" +# define MD_BUBBLE_CHART "\ue61a" +# define MD_MULTILINE_CHART "\ue61b" +# define MD_SHOW_CHART "\ue61c" +# define MD_CAKE "\ue61d" +# define MD_DOMAIN "\ue61e" +# define MD_GROUP "\ue61f" +# define MD_GROUP_ADD "\ue620" +# define MD_LOCATION_CITY "\ue621" +# define MD_MOOD "\ue622" +# define MD_MOOD_BAD "\ue623" +# define MD_NOTIFICATIONS "\ue624" +# define MD_NOTIFICATIONS_NONE "\ue625" +# define MD_NOTIFICATIONS_OFF "\ue626" +# define MD_NOTIFICATIONS_ACTIVE "\ue627" +# define MD_NOTIFICATIONS_PAUSED "\ue628" +# define MD_PAGES "\ue629" +# define MD_PARTY_MODE "\ue62a" +# define MD_PEOPLE "\ue62b" +# define MD_PEOPLE_OUTLINE "\ue62c" +# define MD_PERSON "\ue62d" +# define MD_PERSON_ADD "\ue62e" +# define MD_PERSON_OUTLINE "\ue62f" +# define MD_PLUS_ONE "\ue630" +# define MD_POLL "\ue631" +# define MD_PUBLIC "\ue632" +# define MD_SCHOOL "\ue633" +# define MD_SHARE "\ue634" +# define MD_WHATSHOT "\ue635" +# define MD_SENTIMENT_DISSATISFIED "\ue636" +# define MD_SENTIMENT_NEUTRAL "\ue637" +# define MD_SENTIMENT_SATISFIED "\ue638" +# define MD_SENTIMENT_VERY_DISSATISFIED "\ue639" +# define MD_SENTIMENT_VERY_SATISFIED "\ue63a" +# define MD_CHECK_BOX "\ue63b" +# define MD_CHECK_BOX_OUTLINE_BLANK "\ue63c" +# define MD_RADIO_BUTTON_UNCHECKED "\ue63d" +# define MD_RADIO_BUTTON_CHECKED "\ue63e" +# define MD_STAR "\ue63f" +# define MD_STAR_HALF "\ue640" +# define MD_STAR_BORDER "\ue641" +# define MD_3D_ROTATION "\ue642" +# define MD_ACCESSIBILITY "\ue643" +# define MD_ACCOUNT_BALANCE "\ue644" +# define MD_ACCOUNT_BALANCE_WALLET "\ue645" +# define MD_ACCOUNT_BOX "\ue646" +# define MD_ACCOUNT_CIRCLE "\ue647" +# define MD_ADD_SHOPPING_CART "\ue648" +# define MD_ALARM "\ue649" +# define MD_ALARM_ADD "\ue64a" +# define MD_ALARM_OFF "\ue64b" +# define MD_ALARM_ON "\ue64c" +# define MD_ANDROID "\ue64d" +# define MD_ANNOUNCEMENT "\ue64e" +# define MD_ASPECT_RATIO "\ue64f" +# define MD_ASSESSMENT "\ue650" +# define MD_ASSIGNMENT "\ue651" +# define MD_ASSIGNMENT_IND "\ue652" +# define MD_ASSIGNMENT_LATE "\ue653" +# define MD_ASSIGNMENT_RETURN "\ue654" +# define MD_ASSIGNMENT_RETURNED "\ue655" +# define MD_ASSIGNMENT_TURNED_IN "\ue656" +# define MD_AUTORENEW "\ue657" +# define MD_BACKUP "\ue658" +# define MD_BOOK "\ue659" +# define MD_BOOKMARK "\ue65a" +# define MD_BOOKMARK_BORDER "\ue65b" +# define MD_BUG_REPORT "\ue65c" +# define MD_BUILD "\ue65d" +# define MD_CACHED "\ue65e" +# define MD_CHANGE_HISTORY "\ue65f" +# define MD_CHECK_CIRCLE "\ue660" +# define MD_CHROME_READER_MODE "\ue661" +# define MD_CLASS "\ue662" +# define MD_CODE "\ue663" +# define MD_CREDIT_CARD "\ue664" +# define MD_DASHBOARD "\ue665" +# define MD_DELETE "\ue666" +# define MD_DESCRIPTION "\ue667" +# define MD_DNS "\ue668" +# define MD_DONE "\ue669" +# define MD_DONE_ALL "\ue66a" +# define MD_EVENT "\ue66b" +# define MD_EXIT_TO_APP "\ue66c" +# define MD_EXPLORE "\ue66d" +# define MD_EXTENSION "\ue66e" +# define MD_FACE "\ue66f" +# define MD_FAVORITE "\ue670" +# define MD_FAVORITE_BORDER "\ue671" +# define MD_FEEDBACK "\ue672" +# define MD_FIND_IN_PAGE "\ue673" +# define MD_FIND_REPLACE "\ue674" +# define MD_FLIP_TO_BACK "\ue675" +# define MD_FLIP_TO_FRONT "\ue676" +# define MD_GET_APP "\ue677" +# define MD_GRADE "\ue678" +# define MD_GROUP_WORK "\ue679" +# define MD_HELP "\ue67a" +# define MD_HIGHLIGHT_OFF "\ue67b" +# define MD_HISTORY "\ue67c" +# define MD_HOME "\ue67d" +# define MD_HOURGLASS_EMPTY "\ue67e" +# define MD_HOURGLASS_FULL "\ue67f" +# define MD_HTTPS "\ue680" +# define MD_INFO "\ue681" +# define MD_INFO_OUTLINE "\ue682" +# define MD_INPUT "\ue683" +# define MD_INVERT_COLORS "\ue684" +# define MD_LABEL "\ue685" +# define MD_LABEL_OUTLINE "\ue686" +# define MD_LANGUAGE "\ue687" +# define MD_LAUNCH "\ue688" +# define MD_LIST "\ue689" +# define MD_LOCK "\ue68a" +# define MD_LOCK_OPEN "\ue68b" +# define MD_LOCK_OUTLINE "\ue68c" +# define MD_LOYALTY "\ue68d" +# define MD_MARKUNREAD_MAILBOX "\ue68e" +# define MD_NOTE_ADD "\ue68f" +# define MD_OPEN_IN_BROWSER "\ue690" +# define MD_OPEN_IN_NEW "\ue691" +# define MD_OPEN_WITH "\ue692" +# define MD_PAGEVIEW "\ue693" +# define MD_PAYMENT "\ue694" +# define MD_PERM_CAMERA_MIC "\ue695" +# define MD_PERM_CONTACT_CALENDAR "\ue696" +# define MD_PERM_DATA_SETTING "\ue697" +# define MD_PERM_DEVICE_INFORMATION "\ue698" +# define MD_PERM_IDENTITY "\ue699" +# define MD_PERM_MEDIA "\ue69a" +# define MD_PERM_PHONE_MSG "\ue69b" +# define MD_PERM_SCAN_WIFI "\ue69c" +# define MD_PICTURE_IN_PICTURE "\ue69d" +# define MD_POLYMER "\ue69e" +# define MD_POWER_SETTINGS_NEW "\ue69f" +# define MD_PRINT "\ue6a0" +# define MD_QUERY_BUILDER "\ue6a1" +# define MD_QUESTION_ANSWER "\ue6a2" +# define MD_RECEIPT "\ue6a3" +# define MD_REDEEM "\ue6a4" +# define MD_REPORT_PROBLEM "\ue6a5" +# define MD_RESTORE "\ue6a6" +# define MD_ROOM "\ue6a7" +# define MD_SCHEDULE "\ue6a8" +# define MD_SEARCH "\ue6a9" +# define MD_SETTINGS "\ue6aa" +# define MD_SETTINGS_APPLICATIONS "\ue6ab" +# define MD_SETTINGS_BACKUP_RESTORE "\ue6ac" +# define MD_SETTINGS_BLUETOOTH "\ue6ad" +# define MD_SETTINGS_CELL "\ue6ae" +# define MD_SETTINGS_BRIGHTNESS "\ue6af" +# define MD_SETTINGS_ETHERNET "\ue6b0" +# define MD_SETTINGS_INPUT_ANTENNA "\ue6b1" +# define MD_SETTINGS_INPUT_COMPONENT "\ue6b2" +# define MD_SETTINGS_INPUT_COMPOSITE "\ue6b3" +# define MD_SETTINGS_INPUT_HDMI "\ue6b4" +# define MD_SETTINGS_INPUT_SVIDEO "\ue6b5" +# define MD_SETTINGS_OVERSCAN "\ue6b6" +# define MD_SETTINGS_PHONE "\ue6b7" +# define MD_SETTINGS_POWER "\ue6b8" +# define MD_SETTINGS_REMOTE "\ue6b9" +# define MD_SETTINGS_VOICE "\ue6ba" +# define MD_SHOP "\ue6bb" +# define MD_SHOP_TWO "\ue6bc" +# define MD_SHOPPING_BASKET "\ue6bd" +# define MD_SHOPPING_CART "\ue6be" +# define MD_SPEAKER_NOTES "\ue6bf" +# define MD_SPELLCHECK "\ue6c0" +# define MD_STARS "\ue6c1" +# define MD_STORE "\ue6c2" +# define MD_SUBJECT "\ue6c3" +# define MD_SUPERVISOR_ACCOUNT "\ue6c4" +# define MD_SWAP_HORIZ "\ue6c5" +# define MD_SWAP_VERT "\ue6c6" +# define MD_SWAP_VERTICAL_CIRCLE "\ue6c7" +# define MD_SYSTEM_UPDATE_ALT "\ue6c8" +# define MD_TAB "\ue6c9" +# define MD_TAB_UNSELECTED "\ue6ca" +# define MD_THEATERS "\ue6cb" +# define MD_THUMB_DOWN "\ue6cc" +# define MD_THUMB_UP "\ue6cd" +# define MD_THUMBS_UP_DOWN "\ue6ce" +# define MD_TOC "\ue6cf" +# define MD_TODAY "\ue6d0" +# define MD_TOLL "\ue6d1" +# define MD_TRACK_CHANGES "\ue6d2" +# define MD_TRANSLATE "\ue6d3" +# define MD_TRENDING_DOWN "\ue6d4" +# define MD_TRENDING_FLAT "\ue6d5" +# define MD_TRENDING_UP "\ue6d6" +# define MD_TURNED_IN "\ue6d7" +# define MD_TURNED_IN_NOT "\ue6d8" +# define MD_VERIFIED_USER "\ue6d9" +# define MD_VIEW_AGENDA "\ue6da" +# define MD_VIEW_ARRAY "\ue6db" +# define MD_VIEW_CAROUSEL "\ue6dc" +# define MD_VIEW_COLUMN "\ue6dd" +# define MD_VIEW_DAY "\ue6de" +# define MD_VIEW_HEADLINE "\ue6df" +# define MD_VIEW_LIST "\ue6e0" +# define MD_VIEW_MODULE "\ue6e1" +# define MD_VIEW_QUILT "\ue6e2" +# define MD_VIEW_STREAM "\ue6e3" +# define MD_VIEW_WEEK "\ue6e4" +# define MD_VISIBILITY "\ue6e5" +# define MD_VISIBILITY_OFF "\ue6e6" +# define MD_CARD_GIFTCARD "\ue6e7" +# define MD_CARD_MEMBERSHIP "\ue6e8" +# define MD_CARD_TRAVEL "\ue6e9" +# define MD_WORK "\ue6ea" +# define MD_YOUTUBE_SEARCHED_FOR "\ue6eb" +# define MD_EJECT "\ue6ec" +# define MD_CAMERA_ENHANCE "\ue6ed" +# define MD_HELP_OUTLINE "\ue6ee" +# define MD_REORDER "\ue6ef" +# define MD_ZOOM_IN "\ue6f0" +# define MD_ZOOM_OUT "\ue6f1" +# define MD_HTTP "\ue6f2" +# define MD_EVENT_SEAT "\ue6f3" +# define MD_FLIGHT_LAND "\ue6f4" +# define MD_FLIGHT_TAKEOFF "\ue6f5" +# define MD_PLAY_FOR_WORK "\ue6f6" +# define MD_GIF "\ue6f7" +# define MD_INDETERMINATE_CHECK_BOX "\ue6f8" +# define MD_OFFLINE_PIN "\ue6f9" +# define MD_ALL_OUT "\ue6fa" +# define MD_COPYRIGHT "\ue6fb" +# define MD_FINGERPRINT "\ue6fc" +# define MD_GAVEL "\ue6fd" +# define MD_LIGHTBULB_OUTLINE "\ue6fe" +# define MD_PICTURE_IN_PICTURE_ALT "\ue6ff" +# define MD_IMPORTANT_DEVICES "\ue700" +# define MD_TOUCH_APP "\ue701" +# define MD_ACCESSIBLE "\ue702" +# define MD_COMPARE_ARROWS "\ue703" +# define MD_DATE_RANGE "\ue704" +# define MD_DONUT_LARGE "\ue705" +# define MD_DONUT_SMALL "\ue706" +# define MD_LINE_STYLE "\ue707" +# define MD_LINE_WEIGHT "\ue708" +# define MD_MOTORCYCLE "\ue709" +# define MD_OPACITY "\ue70a" +# define MD_PETS "\ue70b" +# define MD_PREGNANT_WOMAN "\ue70c" +# define MD_RECORD_VOICE_OVER "\ue70d" +# define MD_ROUNDED_CORNER "\ue70e" +# define MD_ROWING "\ue70f" +# define MD_TIMELINE "\ue710" +# define MD_UPDATE "\ue711" +# define MD_WATCH_LATER "\ue712" +# define MD_PAN_TOOL "\ue713" +# define MD_EURO_SYMBOL "\ue714" +# define MD_G_TRANSLATE "\ue715" +# define MD_REMOVE_SHOPPING_CART "\ue716" +# define MD_RESTORE_PAGE "\ue717" +# define MD_SPEAKER_NOTES_OFF "\ue718" +# define MD_DELETE_FOREVER "\ue719" +# define MD_AC_UNIT "\ue71a" +# define MD_AIRPORT_SHUTTLE "\ue71b" +# define MD_ALL_INCLUSIVE "\ue71c" +# define MD_BEACH_ACCESS "\ue71d" +# define MD_BUSINESS_CENTER "\ue71e" +# define MD_CASINO "\ue71f" +# define MD_CHILD_CARE "\ue720" +# define MD_CHILD_FRIENDLY "\ue721" +# define MD_FITNESS_CENTER "\ue722" +# define MD_FREE_BREAKFAST "\ue723" +# define MD_GOLF_COURSE "\ue724" +# define MD_HOT_TUB "\ue725" +# define MD_KITCHEN "\ue726" +# define MD_POOL "\ue727" +# define MD_ROOM_SERVICE "\ue728" +# define MD_SMOKE_FREE "\ue729" +# define MD_SMOKING_ROOMS "\ue72a" +# define MD_SPA "\ue72b" +# define MD_U10FFFD "\ue72c" +# define FILE_REGEX "\ue72d" +# define FILE_ARCH_LINUX "\ue72e" +# define FILE_E "\ue72f" +# define FILE_GLYPHS "\ue730" +# define FILE_KNOCKOUT "\ue731" +# define FILE_LEAN "\ue732" +# define FILE_METAL "\ue733" +# define FILE_POVRAY "\ue734" +# define FILE_S "\ue735" +# define FILE_TT "\ue736" +# define FILE_VAGRANT "\ue737" +# define FILE_XMOS "\ue738" +# define FILE_A "\ue739" +# define FILE_CHAI "\ue73a" +# define FILE_STYLUS "\ue73b" +# define FILE_TEXTILE "\ue73c" +# define FILE_UNREAL "\ue73d" +# define FILE_PUREBASIC "\ue73e" +# define FILE_TS "\ue73f" +# define FILE_SCHEME "\ue740" +# define FILE_TEXTMATE "\ue741" +# define FILE_X10 "\ue742" +# define FILE_APL "\ue743" +# define FILE_ANSIBLE "\ue744" +# define FILE_ARTTEXT "\ue745" +# define FILE_ANTWAR "\ue746" +# define FILE_OPA "\ue747" +# define FILE_CODECOV "\ue748" +# define FILE_YANG "\ue749" +# define FILE_PM2 "\ue74a" +# define FILE_HG "\ue74b" +# define FILE_PAWN "\ue74c" +# define FILE_JULIA "\ue74d" +# define FILE_SHIPIT "\ue74e" +# define FILE_MOCHA "\ue74f" +# define FILE_NIB "\ue750" +# define FILE_SHURIKEN "\ue751" +# define FILE_ALEX "\ue752" +# define FILE_TWIG "\ue753" +# define FILE_1C "\ue754" +# define FILE_TEX "\ue755" +# define FILE_BIBTEX "\ue756" +# define FILE_MUSTACHE "\ue757" +# define FILE_GULP "\ue758" +# define FILE_GRUNT "\ue759" +# define FILE_EMBER "\ue75a" +# define FILE_GO "\ue75b" +# define FILE_JENKINS "\ue75c" +# define FILE_GNU "\ue75d" +# define FILE_COMPOSER "\ue75e" +# define FILE_METEOR "\ue75f" +# define FILE_AI "\ue760" +# define FILE_PSD "\ue761" +# define FILE_SILVERSTRIPE "\ue762" +# define FILE_MAXSCRIPT "\ue763" +# define FILE_KIVY "\ue764" +# define FILE_CRYSTAL "\ue765" +# define FILE_GRADLE "\ue766" +# define FILE_GROOVY "\ue767" +# define FILE_R "\ue768" +# define FILE_VUE "\ue769" +# define FILE_HAXE "\ue76a" +# define FILE_LISP "\ue76b" +# define FILE_E909 "\ue76c" +# define FILE_FORTRAN "\ue76d" +# define FILE_ADA "\ue76e" +# define FILE_DYALOG "\ue76f" +# define FILE_JADE "\ue770" +# define FILE_E90E "\ue771" +# define FILE_FONT "\ue772" +# define FILE_POSTCSS "\ue773" +# define FILE_SCAD "\ue774" +# define FILE_E912 "\ue775" +# define FILE_RAML "\ue776" +# define FILE_LS "\ue777" +# define FILE_SALTSTACK "\ue778" +# define FILE_TERRAFORM "\ue779" +# define FILE_ORG "\ue77a" +# define FILE_ASCIIDOC "\ue77b" +# define FILE_RIOT "\ue77c" +# define FILE_OCAML "\ue77d" +# define FILE_LUA "\ue77e" +# define FILE_NPM "\ue77f" +# define FILE_LLVM "\ue780" +# define FILE_E91E "\ue781" +# define FILE_BABEL "\ue782" +# define FILE_MARKO "\ue783" +# define FILE_FLOW "\ue784" +# define FILE_BROCCOLI "\ue785" +# define FILE_APPVEYOR "\ue786" +# define FILE_CAKEFILE "\ue787" +# define FILE_APPLE "\ue788" +# define FILE_EMACS "\ue789" +# define FILE_SKETCH "\ue78a" +# define FILE_DOXYGEN "\ue78b" +# define FILE_CF "\ue78c" +# define FILE_PASCAL "\ue78d" +# define FILE_ABAP "\ue78e" +# define FILE_ANTLR "\ue78f" +# define FILE_API "\ue790" +# define FILE_AS "\ue791" +# define FILE_ARC "\ue792" +# define FILE_ARDUINO "\ue793" +# define FILE_AUGEAS "\ue794" +# define FILE_AHK "\ue795" +# define FILE_AUTOIT "\ue796" +# define FILE_ATS "\ue797" +# define FILE_ALLOY "\ue798" +# define FILE_MANPAGE "\ue799" +# define FILE_J "\ue79a" +# define FILE_GLADE "\ue79b" +# define FILE_BOO "\ue79c" +# define FILE_BRAIN "\ue79d" +# define FILE_BRO "\ue79e" +# define FILE_BLUESPEC "\ue79f" +# define FILE_STYLELINT "\ue7a0" +# define FILE_ANT "\ue7a1" +# define FILE_CMAKE "\ue7a2" +# define FILE_CLIPS "\ue7a3" +# define FILE_MAPBOX "\ue7a4" +# define FILE_CP "\ue7a5" +# define FILE_CHUCK "\ue7a6" +# define FILE_JINJA "\ue7a7" +# define FILE_ISABELLE "\ue7a8" +# define FILE_DOGE "\ue7a9" +# define FILE_IDL "\ue7aa" +# define FILE_JAKE "\ue7ab" +# define FILE_VERILOG "\ue7ac" +# define FILE_PHALCON "\ue7ad" +# define FILE_FABFILE "\ue7ae" +# define FILE_LFE "\ue7af" +# define FILE_NMAP "\ue7b0" +# define FILE_AMPL "\ue7b1" +# define FILE_CEYLON "\ue7b2" +# define FILE_CHAPEL "\ue7b3" +# define FILE_CIRRU "\ue7b4" +# define FILE_CLARION "\ue7b5" +# define FILE_NUNJUCKS "\ue7b6" +# define FILE_MEDIAWIKI "\ue7b7" +# define FILE_POSTSCRIPT "\ue7b8" +# define FILE_TCL "\ue7b9" +# define FILE_OWL "\ue7ba" +# define FILE_JSONLD "\ue7bb" +# define FILE_SPARQL "\ue7bc" +# define FILE_SAS "\ue7bd" +# define FILE_CLEAN "\ue7be" +# define FILE_CLICK "\ue7bf" +# define FILE_NVIDIA "\ue7c0" +# define FILE_CREOLE "\ue7c1" +# define FILE_COQ "\ue7c2" +# define FILE_DIFF "\ue7c3" +# define FILE_PATCH "\ue7c4" +# define FILE_BYOND "\ue7c5" +# define FILE_CYTHON "\ue7c6" +# define FILE_DARCS "\ue7c7" +# define FILE_EAGLE "\ue7c8" +# define FILE_ECERE "\ue7c9" +# define FILE_EIFFEL "\ue7ca" +# define FILE_EM "\ue7cb" +# define FILE_FLUX "\ue7cc" +# define FILE_FACTOR "\ue7cd" +# define FILE_FANCY "\ue7ce" +# define FILE_PERL6 "\ue7cf" +# define FILE_GENTOO "\ue7d0" +# define FILE_FREGE "\ue7d1" +# define FILE_FANTOM "\ue7d2" +# define FILE_FREEMARKER "\ue7d3" +# define FILE_GAP "\ue7d4" +# define FILE_CL "\ue7d5" +# define FILE_GAMS "\ue7d6" +# define FILE_GODOT "\ue7d7" +# define FILE_GML "\ue7d8" +# define FILE_GENSHI "\ue7d9" +# define FILE_POINTWISE "\ue7da" +# define FILE_GF "\ue7db" +# define FILE_GOLO "\ue7dc" +# define FILE_GOSU "\ue7dd" +# define FILE_HARBOUR "\ue7de" +# define FILE_GRAPHQL "\ue7df" +# define FILE_GRAPHVIZ "\ue7e0" +# define FILE_HASHICORP "\ue7e1" +# define FILE_HY "\ue7e2" +# define FILE_IGORPRO "\ue7e3" +# define FILE_IO "\ue7e4" +# define FILE_IOKE "\ue7e5" +# define FILE_IDRIS "\ue7e6" +# define FILE_INFORM7 "\ue7e7" +# define FILE_INNO "\ue7e8" +# define FILE_SUBLIME "\ue7e9" +# define FILE_JUPYTER "\ue7ea" +# define FILE_KRL "\ue7eb" +# define FILE_KOTLIN "\ue7ec" +# define FILE_LABVIEW "\ue7ed" +# define FILE_LSL "\ue7ee" +# define FILE_LASSO "\ue7ef" +# define FILE_LOGTALK "\ue7f0" +# define FILE_LOOKML "\ue7f1" +# define FILE_MAKO "\ue7f2" +# define FILE_MATHEMATICA "\ue7f3" +# define FILE_MATLAB "\ue7f4" +# define FILE_E992 "\ue7f5" +# define FILE_MAX "\ue7f6" +# define FILE_MERCURY "\ue7f7" +# define FILE_MIRAH "\ue7f8" +# define FILE_MODULA2 "\ue7f9" +# define FILE_MONKEY "\ue7fa" +# define FILE_NIMROD "\ue7fb" +# define FILE_NIT "\ue7fc" +# define FILE_NIX "\ue7fd" +# define FILE_AMX "\ue7fe" +# define FILE_NETLOGO "\ue7ff" +# define FILE_NUMPY "\ue800" +# define FILE_OBJJ "\ue801" +# define FILE_OPENCL "\ue802" +# define FILE_PROCESSING "\ue803" +# define FILE_OX "\ue804" +# define FILE_SCD "\ue805" +# define FILE_STATA "\ue806" +# define FILE_STAN "\ue807" +# define FILE_SQF "\ue808" +# define FILE_SLASH "\ue809" +# define FILE_SHEN "\ue80a" +# define FILE_SELF "\ue80b" +# define FILE_SCILAB "\ue80c" +# define FILE_VHDL "\ue80d" +# define FILE_SAGE "\ue80e" +# define FILE_ROBOT "\ue80f" +# define FILE_RED "\ue810" +# define FILE_REBOL "\ue811" +# define FILE_XOJO "\ue812" +# define FILE_RDOC "\ue813" +# define FILE_RACKET "\ue814" +# define FILE_PURESCRIPT "\ue815" +# define FILE_UNO "\ue816" +# define FILE_VARNISH "\ue817" +# define FILE_PROPELLER "\ue818" +# define FILE_TURING "\ue819" +# define FILE_PONY "\ue81a" +# define FILE_POGO "\ue81b" +# define FILE_PIKE "\ue81c" +# define FILE_URWEB "\ue81d" +# define FILE_PARROT "\ue81e" +# define FILE_PAPYRUS "\ue81f" +# define FILE_PAN "\ue820" +# define FILE_OZ "\ue821" +# define FILE_OXYGENE "\ue822" +# define FILE_PROGRESS "\ue823" +# define FILE_TXL "\ue824" +# define FILE_CABAL "\ue825" +# define FILE_SYSVERILOG "\ue826" +# define FILE_PICKLE "\ue827" +# define FILE_XPAGES "\ue828" +# define FILE_XTEND "\ue829" +# define FILE_ZEPHIR "\ue82a" +# define FILE_ZIMPL "\ue82b" +# define FILE_EC "\ue82c" +# define FILE_MUPAD "\ue82d" +# define FILE_OOC "\ue82e" +# define FILE_RST "\ue82f" +# define FILE_KARMA "\ue830" +# define FILE_HACK "\ue831" +# define FILE_SHOPIFY "\ue832" +# define FILE_PUG_ALT "\ue833" +# define FILE_E9D1 "\ue834" +# define FILE_SBT "\ue835" +# define FILE_E9D3 "\ue836" +# define FILE_SCRUTINIZER "\ue837" +# define FILE_CC "\ue838" +# define FILE_BRAKEMAN "\ue839" +# define FILE_NEWRELIC "\ue83a" +# define FILE_THOR "\ue83b" +# define FILE_NUGET "\ue83c" +# define FILE_POWERSHELL "\ue83d" +# define FILE_SF "\ue83e" +# define FILE_MINECRAFT "\ue83f" +# define FILE_SQLITE "\ue840" +# define FILE_PROTRACTOR "\ue841" +# define FILE_TYPINGS "\ue842" +# define FILE_STRINGS "\ue843" +# define FILE_NANT "\ue844" +# define FILE_CSSCRIPT "\ue845" +# define FILE_CAKE "\ue846" +# define FILE_OPENOFFICE "\ue847" +# define FILE_KEYNOTE "\ue848" +# define FILE_JSX "\ue849" +# define FILE_TSX "\ue84a" +# define FILE_MODEL "\ue84b" +# define FILE_FINDER "\ue84c" +# define FILE_ACCESS "\ue84d" +# define FILE_ONENOTE "\ue84e" +# define FILE_POWERPOINT "\ue84f" +# define FILE_WORD "\ue850" +# define FILE_EXCEL "\ue851" +# define FILE_STORYIST "\ue852" +# define FILE_CSOUND "\ue853" +# define FILE_DBASE "\ue854" +# define FILE_ZBRUSH "\ue855" +# define FILE_AE "\ue856" +# define FILE_INDESIGN "\ue857" +# define FILE_PREMIERE "\ue858" +# define FILE_MAYA "\ue859" +# define FILE_E9F7 "\ue85a" +# define FILE_KHRONOS "\ue85b" +# define FILE_AUDACITY "\ue85c" +# define FILE_BLENDER "\ue85d" +# define FILE_LIGHTWAVE "\ue85e" +# define FILE_FBX "\ue85f" +# define FILE_E9FD "\ue860" +# define FILE_TYPEDOC "\ue861" +# define FILE_ALPINE "\ue862" +# define FILE_YUI "\ue863" +# define FILE_EA01 "\ue864" +# define FILE_EA02 "\ue865" +# define FILE_EA03 "\ue866" +# define FILE_NORMALIZE "\ue867" +# define FILE_NEKO "\ue868" +# define FILE_MATHJAX "\ue869" +# define FILE_LEAFLET "\ue86a" +# define FILE_GDB "\ue86b" +# define FILE_FUELUX "\ue86c" +# define FILE_EQ "\ue86d" +# define FILE_CHARTJS "\ue86e" +# define FILE_EA0C "\ue86f" +# define FILE_EA0D "\ue870" +# define FILE_EA0E "\ue871" +# define FILE_ESLINT "\ue872" +# define FILE_D3 "\ue873" +# define FILE_CORDOVA "\ue874" +# define FILE_CIRCLECI "\ue875" +# define FILE_PUG "\ue876" +# define FILE_POWERBUILDER "\ue877" +# define FILE_DYLIB "\ue878" +# define FILE_REXX "\ue879" +# define FILE_SVN "\ue87a" +# define FILE_MRUBY "\ue87b" +# define FILE_WERCKER "\ue87c" +# define FILE_YARN "\ue87d" +# define FILE_EDITORCONFIG "\ue87e" +# define FILE_SNYK "\ue87f" +# define FILE_REASON "\ue880" +# define FILE_NSIS "\ue881" +# define FILE_V8 "\ue882" +# define FILE_ROLLUP "\ue883" +# define FILE_EA21 "\ue884" +# define FILE_EA22 "\ue885" +# define FILE_EA23 "\ue886" +# define FILE_RASCAL "\ue887" +# define FILE_GN "\ue888" +# define FILE_NODEMON "\ue889" +# define FILE_ELECTRON "\ue88a" +# define FILE_1C_ALT "\ue88b" +# define FILE_SWAGGER "\ue88c" +# define FILE_BITHOUND "\ue88d" +# define FILE_POLYMER "\ue88e" +# define FILE_PLATFORMIO "\ue88f" +# define FILE_SHIPPABLE "\ue890" +# define FILE_EA2E "\ue891" +# define FILE_SEQUELIZE "\ue892" +# define FILE_REDUX "\ue893" +# define FILE_RSPEC "\ue894" +# define FILE_PHPUNIT "\ue895" +# define FILE_OCTAVE "\ue896" +# define FILE_NUCLIDE "\ue897" +# define FILE_INFOPATH "\ue898" +# define FILE_LIME "\ue899" +# define FILE_LERNA "\ue89a" +# define FILE_KITCHENCI "\ue89b" +# define FILE_JEST "\ue89c" +# define FILE_JASMINE "\ue89d" +# define FILE_HAXEDEVELOP "\ue89e" +# define FILE_GITLAB "\ue89f" +# define FILE_DRONE "\ue8a0" +# define FILE_VIRTUALBOX "\ue8a1" +# define FILE_DOCLETS "\ue8a2" +# define FILE_DELPHI "\ue8a3" +# define FILE_CODEKIT "\ue8a4" +# define FILE_CHEF "\ue8a5" +# define FILE_CAKEPHP "\ue8a6" +# define FILE_COBOL "\ue8a7" +# define FILE_BUNDLER "\ue8a8" +# define FILE_BUCK "\ue8a9" +# define FILE_BRUNCH "\ue8aa" +# define FILE_AURELIA "\ue8ab" +# define FILE_VMWARE "\ue8ac" +# define FILE_RHINO "\ue8ad" +# define FILE_EJS "\ue8ae" +# define FILE_KICAD "\ue8af" +# define FILE_HOPLON "\ue8b0" +# define FILE_ABIF "\ue8b1" +# define FILE_WATCHMAN "\ue8b2" +# define FILE_P4 "\ue8b3" +# define FILE_NANOC "\ue8b4" +# define FILE_MIRANDA "\ue8b5" +# define FILE_MINIZINC "\ue8b6" +# define FILE_MESON "\ue8b7" +# define FILE_JISON "\ue8b8" +# define FILE_FRANCA "\ue8b9" +# define FILE_DEVICETREE "\ue8ba" +# define FILE_CADDY "\ue8bb" +# define FILE_BEM "\ue8bc" +# define FILE_BAZEL "\ue8bd" +# define FILE_ANGELSCRIPT "\ue8be" +# define FILE_ESDOC "\ue8bf" +# define FILE_TWINE "\ue8c0" +# define FILE_SQUARESPACE "\ue8c1" +# define FILE_PHOENIX "\ue8c2" +# define FILE_TEST_DIR "\ue8c3" +# define FILE_WEBPACK "\ue8c4" +# define FILE_TEST_COFFEE "\ue8c5" +# define FILE_TEST_GENERIC "\ue8c6" +# define FILE_TEST_JS "\ue8c7" +# define FILE_TEST_PERL "\ue8c8" +# define FILE_TEST_PYTHON "\ue8c9" +# define FILE_TEST_REACT "\ue8ca" +# define FILE_TEST_RUBY "\ue8cb" +# define FILE_TEST_TS "\ue8cc" +# define FILE_CODESHIP "\ue8cd" +# define FILE_NXC "\ue8ce" +# define FILE_BROTLI "\ue8cf" +# define FILE_PROSELINT "\ue8d0" +# define FILE_BINTRAY "\ue8d1" +# define FILE_MJML "\ue8d2" +# define FILE_WASM "\ue8d3" +# define FILE_EA71 "\ue8d4" +# define FILE_NASM "\ue8d5" +# define FILE_EA73 "\ue8d6" +# define FILE_PEG "\ue8d7" +# define FILE_JOLIE "\ue8d8" +# define FILE_NANO "\ue8d9" +# define FILE_XAMARIN "\ue8da" +# define FILE_F012 "\ue8db" +# define FILE_TAG "\ue8dc" +# define FILE_CUCUMBER "\ue8dd" +# define FILE_VIDEO "\ue8de" +# define FILE_CONFIG "\ue8df" +# define FILE_DASHBOARD "\ue8e0" +# define FILE_PUPPET "\ue8e1" +# define FILE_TERMINAL "\ue8e2" +# define FILE_MARKDOWNLINT "\ue8e3" +# define FILE_REACT "\ue8e4" +# define FILE_F101 "\ue8e5" +# define FILE_ELM "\ue8e6" +# define FILE_BOOT "\ue8e7" +# define FILE_CLJS "\ue8e8" +# define FILE_LEIN "\ue8e9" +# define FILE_DOCKER "\ue8ea" +# define FILE_PHP "\ue8eb" +# define FILE_IONIC "\ue8ec" +# define FILE_HAML "\ue8ed" +# define FILE_F17B "\ue8ee" +# define FILE_FF "\ue8ef" +# define FILE_U1F3C1 "\ue8f0" +# define FILE_TERN "\ue8f1" +# define FILE_DEFAULT "\ue8f2" +# define FILE_SIGILS "\ue8f3" +# define FILE_NGINX "\ue8f4" +# define WEATHER_DAY_CLOUDY_GUSTS "\ue8f5" +# define WEATHER_DAY_CLOUDY_WINDY "\ue8f6" +# define WEATHER_DAY_CLOUDY "\ue8f7" +# define WEATHER_DAY_FOG "\ue8f8" +# define WEATHER_DAY_HAIL "\ue8f9" +# define WEATHER_DAY_LIGHTNING "\ue8fa" +# define WEATHER_DAY_RAIN_MIX "\ue8fb" +# define WEATHER_DAY_RAIN_WIND "\ue8fc" +# define WEATHER_DAY_RAIN "\ue8fd" +# define WEATHER_DAY_SHOWERS "\ue8fe" +# define WEATHER_DAY_SNOW "\ue8ff" +# define WEATHER_DAY_SPRINKLE "\ue900" +# define WEATHER_DAY_SUNNY_OVERCAST "\ue901" +# define WEATHER_DAY_SUNNY "\ue902" +# define WEATHER_DAY_STORM_SHOWERS "\ue903" +# define WEATHER_DAY_THUNDERSTORM "\ue904" +# define WEATHER_CLOUDY_GUSTS "\ue905" +# define WEATHER_CLOUDY_WINDY "\ue906" +# define WEATHER_CLOUDY "\ue907" +# define WEATHER_FOG "\ue908" +# define WEATHER_HAIL "\ue909" +# define WEATHER_LIGHTNING "\ue90a" +# define WEATHER_RAIN_MIX "\ue90b" +# define WEATHER_RAIN_WIND "\ue90c" +# define WEATHER_RAIN "\ue90d" +# define WEATHER_SHOWERS "\ue90e" +# define WEATHER_SNOW "\ue90f" +# define WEATHER_SPRINKLE "\ue910" +# define WEATHER_STORM_SHOWERS "\ue911" +# define WEATHER_THUNDERSTORM "\ue912" +# define WEATHER_WINDY "\ue913" +# define WEATHER_NIGHT_ALT_CLOUDY_GUSTS "\ue914" +# define WEATHER_NIGHT_ALT_CLOUDY_WINDY "\ue915" +# define WEATHER_NIGHT_ALT_HAIL "\ue916" +# define WEATHER_NIGHT_ALT_LIGHTNING "\ue917" +# define WEATHER_NIGHT_ALT_RAIN_MIX "\ue918" +# define WEATHER_NIGHT_ALT_RAIN_WIND "\ue919" +# define WEATHER_NIGHT_ALT_RAIN "\ue91a" +# define WEATHER_NIGHT_ALT_SHOWERS "\ue91b" +# define WEATHER_NIGHT_ALT_SNOW "\ue91c" +# define WEATHER_NIGHT_ALT_SPRINKLE "\ue91d" +# define WEATHER_NIGHT_ALT_STORM_SHOWERS "\ue91e" +# define WEATHER_NIGHT_ALT_THUNDERSTORM "\ue91f" +# define WEATHER_NIGHT_CLEAR "\ue920" +# define WEATHER_NIGHT_CLOUDY_GUSTS "\ue921" +# define WEATHER_NIGHT_CLOUDY_WINDY "\ue922" +# define WEATHER_NIGHT_CLOUDY "\ue923" +# define WEATHER_NIGHT_HAIL "\ue924" +# define WEATHER_NIGHT_LIGHTNING "\ue925" +# define WEATHER_NIGHT_RAIN_MIX "\ue926" +# define WEATHER_NIGHT_RAIN_WIND "\ue927" +# define WEATHER_NIGHT_RAIN "\ue928" +# define WEATHER_NIGHT_SHOWERS "\ue929" +# define WEATHER_NIGHT_SNOW "\ue92a" +# define WEATHER_NIGHT_SPRINKLE "\ue92b" +# define WEATHER_NIGHT_STORM_SHOWERS "\ue92c" +# define WEATHER_NIGHT_THUNDERSTORM "\ue92d" +# define WEATHER_CELSIUS "\ue92e" +# define WEATHER_CLOUD_DOWN "\ue92f" +# define WEATHER_CLOUD_REFRESH "\ue930" +# define WEATHER_CLOUD_UP "\ue931" +# define WEATHER_CLOUD "\ue932" +# define WEATHER_DEGREES "\ue933" +# define WEATHER_DIRECTION_DOWN_LEFT "\ue934" +# define WEATHER_DIRECTION_DOWN "\ue935" +# define WEATHER_FAHRENHEIT "\ue936" +# define WEATHER_HORIZON_ALT "\ue937" +# define WEATHER_HORIZON "\ue938" +# define WEATHER_DIRECTION_LEFT "\ue939" +# define WEATHER_F049 "\ue93a" +# define WEATHER_NIGHT_FOG "\ue93b" +# define WEATHER_REFRESH_ALT "\ue93c" +# define WEATHER_REFRESH "\ue93d" +# define WEATHER_DIRECTION_RIGHT "\ue93e" +# define WEATHER_RAINDROPS "\ue93f" +# define WEATHER_STRONG_WIND "\ue940" +# define WEATHER_SUNRISE "\ue941" +# define WEATHER_SUNSET "\ue942" +# define WEATHER_THERMOMETER_EXTERIOR "\ue943" +# define WEATHER_THERMOMETER_INTERNAL "\ue944" +# define WEATHER_THERMOMETER "\ue945" +# define WEATHER_TORNADO "\ue946" +# define WEATHER_DIRECTION_UP_RIGHT "\ue947" +# define WEATHER_DIRECTION_UP "\ue948" +# define WEATHER_F059 "\ue949" +# define WEATHER_F05A "\ue94a" +# define WEATHER_F05B "\ue94b" +# define WEATHER_F05C "\ue94c" +# define WEATHER_F05D "\ue94d" +# define WEATHER_F05E "\ue94e" +# define WEATHER_F060 "\ue94f" +# define WEATHER_F061 "\ue950" +# define WEATHER_SMOKE "\ue951" +# define WEATHER_DUST "\ue952" +# define WEATHER_SNOW_WIND "\ue953" +# define WEATHER_DAY_SNOW_WIND "\ue954" +# define WEATHER_NIGHT_SNOW_WIND "\ue955" +# define WEATHER_NIGHT_ALT_SNOW_WIND "\ue956" +# define WEATHER_DAY_SLEET_STORM "\ue957" +# define WEATHER_NIGHT_SLEET_STORM "\ue958" +# define WEATHER_NIGHT_ALT_SLEET_STORM "\ue959" +# define WEATHER_DAY_SNOW_THUNDERSTORM "\ue95a" +# define WEATHER_NIGHT_SNOW_THUNDERSTORM "\ue95b" +# define WEATHER_NIGHT_ALT_SNOW_THUNDERSTORM "\ue95c" +# define WEATHER_SOLAR_ECLIPSE "\ue95d" +# define WEATHER_LUNAR_ECLIPSE "\ue95e" +# define WEATHER_METEOR "\ue95f" +# define WEATHER_HOT "\ue960" +# define WEATHER_HURRICANE "\ue961" +# define WEATHER_SMOG "\ue962" +# define WEATHER_ALIEN "\ue963" +# define WEATHER_SNOWFLAKE_COLD "\ue964" +# define WEATHER_STARS "\ue965" +# define WEATHER_RAINDROP "\ue966" +# define WEATHER_BAROMETER "\ue967" +# define WEATHER_HUMIDITY "\ue968" +# define WEATHER_NA "\ue969" +# define WEATHER_FLOOD "\ue96a" +# define WEATHER_DAY_CLOUDY_HIGH "\ue96b" +# define WEATHER_NIGHT_ALT_CLOUDY_HIGH "\ue96c" +# define WEATHER_NIGHT_CLOUDY_HIGH "\ue96d" +# define WEATHER_NIGHT_ALT_PARTLY_CLOUDY "\ue96e" +# define WEATHER_SANDSTORM "\ue96f" +# define WEATHER_NIGHT_PARTLY_CLOUDY "\ue970" +# define WEATHER_UMBRELLA "\ue971" +# define WEATHER_DAY_WINDY "\ue972" +# define WEATHER_NIGHT_ALT_CLOUDY "\ue973" +# define WEATHER_DIRECTION_UP_LEFT "\ue974" +# define WEATHER_DIRECTION_DOWN_RIGHT "\ue975" +# define WEATHER_TIME_12 "\ue976" +# define WEATHER_TIME_1 "\ue977" +# define WEATHER_TIME_2 "\ue978" +# define WEATHER_TIME_3 "\ue979" +# define WEATHER_TIME_4 "\ue97a" +# define WEATHER_TIME_5 "\ue97b" +# define WEATHER_TIME_6 "\ue97c" +# define WEATHER_TIME_7 "\ue97d" +# define WEATHER_TIME_8 "\ue97e" +# define WEATHER_TIME_9 "\ue97f" +# define WEATHER_TIME_10 "\ue980" +# define WEATHER_TIME_11 "\ue981" +# define WEATHER_MOON_NEW "\ue982" +# define WEATHER_MOON_WAXING_CRESCENT_1 "\ue983" +# define WEATHER_MOON_WAXING_CRESCENT_2 "\ue984" +# define WEATHER_MOON_WAXING_CRESCENT_3 "\ue985" +# define WEATHER_MOON_WAXING_CRESCENT_4 "\ue986" +# define WEATHER_MOON_WAXING_CRESCENT_5 "\ue987" +# define WEATHER_MOON_WAXING_CRESCENT_6 "\ue988" +# define WEATHER_MOON_FIRST_QUARTER "\ue989" +# define WEATHER_MOON_WAXING_GIBBOUS_1 "\ue98a" +# define WEATHER_MOON_WAXING_GIBBOUS_2 "\ue98b" +# define WEATHER_MOON_WAXING_GIBBOUS_3 "\ue98c" +# define WEATHER_MOON_WAXING_GIBBOUS_4 "\ue98d" +# define WEATHER_MOON_WAXING_GIBBOUS_5 "\ue98e" +# define WEATHER_MOON_WAXING_GIBBOUS_6 "\ue98f" +# define WEATHER_MOON_FULL "\ue990" +# define WEATHER_MOON_WANING_GIBBOUS_1 "\ue991" +# define WEATHER_MOON_WANING_GIBBOUS_2 "\ue992" +# define WEATHER_MOON_WANING_GIBBOUS_3 "\ue993" +# define WEATHER_MOON_WANING_GIBBOUS_4 "\ue994" +# define WEATHER_MOON_WANING_GIBBOUS_5 "\ue995" +# define WEATHER_MOON_WANING_GIBBOUS_6 "\ue996" +# define WEATHER_MOON_THIRD_QUARTER "\ue997" +# define WEATHER_MOON_WANING_CRESCENT_1 "\ue998" +# define WEATHER_MOON_WANING_CRESCENT_2 "\ue999" +# define WEATHER_MOON_WANING_CRESCENT_3 "\ue99a" +# define WEATHER_MOON_WANING_CRESCENT_4 "\ue99b" +# define WEATHER_MOON_WANING_CRESCENT_5 "\ue99c" +# define WEATHER_MOON_WANING_CRESCENT_6 "\ue99d" +# define WEATHER_WIND_DIRECTION "\ue99e" +# define WEATHER_DAY_SLEET "\ue99f" +# define WEATHER_NIGHT_SLEET "\ue9a0" +# define WEATHER_NIGHT_ALT_SLEET "\ue9a1" +# define WEATHER_SLEET "\ue9a2" +# define WEATHER_DAY_HAZE "\ue9a3" +# define WEATHER_WIND_BEAUFORT_0 "\ue9a4" +# define WEATHER_WIND_BEAUFORT_1 "\ue9a5" +# define WEATHER_WIND_BEAUFORT_2 "\ue9a6" +# define WEATHER_WIND_BEAUFORT_3 "\ue9a7" +# define WEATHER_WIND_BEAUFORT_4 "\ue9a8" +# define WEATHER_WIND_BEAUFORT_5 "\ue9a9" +# define WEATHER_WIND_BEAUFORT_6 "\ue9aa" +# define WEATHER_WIND_BEAUFORT_7 "\ue9ab" +# define WEATHER_WIND_BEAUFORT_8 "\ue9ac" +# define WEATHER_WIND_BEAUFORT_9 "\ue9ad" +# define WEATHER_WIND_BEAUFORT_10 "\ue9ae" +# define WEATHER_WIND_BEAUFORT_11 "\ue9af" +# define WEATHER_WIND_BEAUFORT_12 "\ue9b0" +# define WEATHER_DAY_LIGHT_WIND "\ue9b1" +# define WEATHER_TSUNAMI "\ue9b2" +# define WEATHER_EARTHQUAKE "\ue9b3" +# define WEATHER_FIRE "\ue9b4" +# define WEATHER_VOLCANO "\ue9b5" +# define WEATHER_MOONRISE "\ue9b6" +# define WEATHER_MOONSET "\ue9b7" +# define WEATHER_TRAIN "\ue9b8" +# define WEATHER_SMALL_CRAFT_ADVISORY "\ue9b9" +# define WEATHER_GALE_WARNING "\ue9ba" +# define WEATHER_STORM_WARNING "\ue9bb" +# define WEATHER_HURRICANE_WARNING "\ue9bc" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_1 "\ue9bd" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_2 "\ue9be" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_3 "\ue9bf" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_4 "\ue9c0" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_5 "\ue9c1" +# define WEATHER_MOON_ALT_WAXING_CRESCENT_6 "\ue9c2" +# define WEATHER_MOON_ALT_FIRST_QUARTER "\ue9c3" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_1 "\ue9c4" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_2 "\ue9c5" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_3 "\ue9c6" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_4 "\ue9c7" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_5 "\ue9c8" +# define WEATHER_MOON_ALT_WAXING_GIBBOUS_6 "\ue9c9" +# define WEATHER_MOON_ALT_FULL "\ue9ca" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_1 "\ue9cb" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_2 "\ue9cc" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_3 "\ue9cd" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_4 "\ue9ce" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_5 "\ue9cf" +# define WEATHER_MOON_ALT_WANING_GIBBOUS_6 "\ue9d0" +# define WEATHER_MOON_ALT_THIRD_QUARTER "\ue9d1" +# define WEATHER_MOON_ALT_WANING_CRESCENT_1 "\ue9d2" +# define WEATHER_MOON_ALT_WANING_CRESCENT_2 "\ue9d3" +# define WEATHER_MOON_ALT_WANING_CRESCENT_3 "\ue9d4" +# define WEATHER_MOON_ALT_WANING_CRESCENT_4 "\ue9d5" +# define WEATHER_MOON_ALT_WANING_CRESCENT_5 "\ue9d6" +# define WEATHER_MOON_ALT_WANING_CRESCENT_6 "\ue9d7" +# define WEATHER_MOON_ALT_NEW "\ue9d8" +# define LINUX_ARCHLINUX "\ue9d9" +# define LINUX_CENTOS "\ue9da" +# define LINUX_DEBIAN "\ue9db" +# define LINUX_FEDORA "\ue9dc" +# define LINUX_LINUXMINT "\ue9dd" +# define LINUX_LINUXMINT_INVERSE "\ue9de" +# define LINUX_MAGEIA "\ue9df" +# define LINUX_MANDRIVA "\ue9e0" +# define LINUX_OPENSUSE "\ue9e1" +# define LINUX_REDHAT "\ue9e2" +# define LINUX_SLACKWARE "\ue9e3" +# define LINUX_SLACKWARE_INVERSE "\ue9e4" +# define LINUX_UBUNTU "\ue9e5" +# define LINUX_UBUNTU_INVERSE "\ue9e6" +# define LINUX_FREEBSD "\ue9e7" +# define LINUX_COREOS "\ue9e8" +# define LINUX_GENTOO "\ue9e9" +# define LINUX_ELEMENTARY "\ue9ea" +# define LINUX_FEDORA_INVERSE "\ue9eb" +# define LINUX_SABAYON "\ue9ec" +# define LINUX_AOSC "\ue9ed" +# define LINUX_NIXOS "\ue9ee" +# define LINUX_TUX "\ue9ef" +# define LINUX_RASPBERRY_PI "\ue9f0" +# define LINUX_MANJARO "\ue9f1" +# define LINUX_APPLE "\ue9f2" +# define LINUX_DOCKER "\ue9f3" +# define LINUX_ALPINE "\ue9f4" +# define MYICONS_0001 "\ue9f5" +# define MYICONS_0002 "\ue9f6" +# define MYICONS_0003 "\ue9f7" +# define MYICONS_0004 "\ue9f8" +# define MYICONS_0005 "\ue9f9" +# define MYICONS_0006 "\ue9fa" +# define MYICONS_0007 "\ue9fb" +# define MYICONS_0008 "\ue9fc" +# define MYICONS_0009 "\ue9fd" +# define MYICONS_000A "\ue9fe" +# define MYICONS_000B "\ue9ff" +# define MYICONS_000D "\uea00" +# define MYICONS_000E "\uea01" +# define MYICONS_0010 "\uea02" +# define MYICONS_0011 "\uea03" +# define MYICONS_0013 "\uea04" +# define MYICONS_0014 "\uea05" +# define MYICONS_ARCH_LINUX_ARROW "\uea06" +# define DEV_BING_SMALL "\uea07" +# define DEV_CSS_TRICKS "\uea08" +# define DEV_GIT "\uea09" +# define DEV_BITBUCKET "\uea0a" +# define DEV_MYSQL "\uea0b" +# define DEV_STREAMLINE "\uea0c" +# define DEV_DATABASE "\uea0d" +# define DEV_DROPBOX "\uea0e" +# define DEV_GITHUB_ALT "\uea0f" +# define DEV_GITHUB_BADGE "\uea10" +# define DEV_GITHUB "\uea11" +# define DEV_WORDPRESS "\uea12" +# define DEV_VISUALSTUDIO "\uea13" +# define DEV_JEKYLL_SMALL "\uea14" +# define DEV_ANDROID "\uea15" +# define DEV_WINDOWS "\uea16" +# define DEV_STACKOVERFLOW "\uea17" +# define DEV_APPLE "\uea18" +# define DEV_LINUX "\uea19" +# define DEV_APPSTORE "\uea1a" +# define DEV_GHOST_SMALL "\uea1b" +# define DEV_YAHOO "\uea1c" +# define DEV_CODEPEN "\uea1d" +# define DEV_GITHUB_FULL "\uea1e" +# define DEV_NODEJS_SMALL "\uea1f" +# define DEV_NODEJS "\uea20" +# define DEV_HACKERNEWS "\uea21" +# define DEV_EMBER "\uea22" +# define DEV_DOJO "\uea23" +# define DEV_DJANGO "\uea24" +# define DEV_NPM "\uea25" +# define DEV_GHOST "\uea26" +# define DEV_MODERNIZR "\uea27" +# define DEV_UNITY_SMALL "\uea28" +# define DEV_RASPBERRY_PI "\uea29" +# define DEV_BLACKBERRY "\uea2a" +# define DEV_GO "\uea2b" +# define DEV_GIT_BRANCH "\uea2c" +# define DEV_GIT_PULL_REQUEST "\uea2d" +# define DEV_GIT_MERGE "\uea2e" +# define DEV_GIT_COMPARE "\uea2f" +# define DEV_GIT_COMMIT "\uea30" +# define DEV_CSSDECK "\uea31" +# define DEV_YAHOO_SMALL "\uea32" +# define DEV_TECHCRUNCH "\uea33" +# define DEV_SMASHING_MAGAZINE "\uea34" +# define DEV_NETMAGAZINE "\uea35" +# define DEV_CODROPS "\uea36" +# define DEV_PHONEGAP "\uea37" +# define DEV_GOOGLE_DRIVE "\uea38" +# define DEV_HTML5_MULTIMEDIA "\uea39" +# define DEV_HTML5_DEVICE_ACCESS "\uea3a" +# define DEV_HTML5_CONNECTIVITY "\uea3b" +# define DEV_HTML5_3D_EFFECTS "\uea3c" +# define DEV_HTML5 "\uea3d" +# define DEV_SCALA "\uea3e" +# define DEV_JAVA "\uea3f" +# define DEV_RUBY "\uea40" +# define DEV_UBUNTU "\uea41" +# define DEV_RUBY_ON_RAILS "\uea42" +# define DEV_PYTHON "\uea43" +# define DEV_PHP "\uea44" +# define DEV_MARKDOWN "\uea45" +# define DEV_LARAVEL "\uea46" +# define DEV_MAGENTO "\uea47" +# define DEV_JOOMLA "\uea48" +# define DEV_DRUPAL "\uea49" +# define DEV_CHROME "\uea4a" +# define DEV_IE "\uea4b" +# define DEV_FIREFOX "\uea4c" +# define DEV_OPERA "\uea4d" +# define DEV_BOOTSTRAP "\uea4e" +# define DEV_SAFARI "\uea4f" +# define DEV_CSS3 "\uea50" +# define DEV_CSS3_FULL "\uea51" +# define DEV_SASS "\uea52" +# define DEV_GRUNT "\uea53" +# define DEV_BOWER "\uea54" +# define DEV_JAVASCRIPT "\uea55" +# define DEV_JAVASCRIPT_SHIELD "\uea56" +# define DEV_JQUERY "\uea57" +# define DEV_COFFEESCRIPT "\uea58" +# define DEV_BACKBONE "\uea59" +# define DEV_ANGULAR "\uea5a" +# define DEV_JQUERY_UI "\uea5b" +# define DEV_SWIFT "\uea5c" +# define DEV_SYMFONY "\uea5d" +# define DEV_SYMFONY_BADGE "\uea5e" +# define DEV_LESS "\uea5f" +# define DEV_STYLUS "\uea60" +# define DEV_TRELLO "\uea61" +# define DEV_ATLASSIAN "\uea62" +# define DEV_JIRA "\uea63" +# define DEV_ENVATO "\uea64" +# define DEV_SNAP_SVG "\uea65" +# define DEV_RAPHAEL "\uea66" +# define DEV_GOOGLE_ANALYTICS "\uea67" +# define DEV_COMPASS "\uea68" +# define DEV_ONEDRIVE "\uea69" +# define DEV_GULP "\uea6a" +# define DEV_ATOM "\uea6b" +# define DEV_CISCO "\uea6c" +# define DEV_NANCY "\uea6d" +# define DEV_JENKINS "\uea6e" +# define DEV_CLOJURE "\uea6f" +# define DEV_PERL "\uea70" +# define DEV_CLOJURE_ALT "\uea71" +# define DEV_CELLULOID "\uea72" +# define DEV_W3C "\uea73" +# define DEV_REDIS "\uea74" +# define DEV_POSTGRESQL "\uea75" +# define DEV_WEBPLATFORM "\uea76" +# define DEV_REQUIREJS "\uea77" +# define DEV_OPENSOURCE "\uea78" +# define DEV_TYPO3 "\uea79" +# define DEV_UIKIT "\uea7a" +# define DEV_DOCTRINE "\uea7b" +# define DEV_GROOVY "\uea7c" +# define DEV_NGINX "\uea7d" +# define DEV_HASKELL "\uea7e" +# define DEV_ZEND "\uea7f" +# define DEV_GNU "\uea80" +# define DEV_YEOMAN "\uea81" +# define DEV_HEROKU "\uea82" +# define DEV_MSQL_SERVER "\uea83" +# define DEV_DEBIAN "\uea84" +# define DEV_TRAVIS "\uea85" +# define DEV_DOTNET "\uea86" +# define DEV_CODEIGNITER "\uea87" +# define DEV_JAVASCRIPT_BADGE "\uea88" +# define DEV_YII "\uea89" +# define DEV_COMPOSER "\uea8a" +# define DEV_KRAKENJS_BADGE "\uea8b" +# define DEV_KRAKENJS "\uea8c" +# define DEV_MOZILLA "\uea8d" +# define DEV_FIREBASE "\uea8e" +# define DEV_SIZZLEJS "\uea8f" +# define DEV_CREATIVECOMMONS "\uea90" +# define DEV_CREATIVECOMMONS_BADGE "\uea91" +# define DEV_MITLICENCE "\uea92" +# define DEV_SENCHATOUCH "\uea93" +# define DEV_BUGSENSE "\uea94" +# define DEV_EXTJS "\uea95" +# define DEV_MOOTOOLS_BADGE "\uea96" +# define DEV_MOOTOOLS "\uea97" +# define DEV_RUBY_ROUGH "\uea98" +# define DEV_KOMODO "\uea99" +# define DEV_CODA "\uea9a" +# define DEV_BINTRAY "\uea9b" +# define DEV_TERMINAL "\uea9c" +# define DEV_CODE "\uea9d" +# define DEV_RESPONSIVE "\uea9e" +# define DEV_DART "\uea9f" +# define DEV_APTANA "\ueaa0" +# define DEV_MAILCHIMP "\ueaa1" +# define DEV_NETBEANS "\ueaa2" +# define DEV_DREAMWEAVER "\ueaa3" +# define DEV_BRACKETS "\ueaa4" +# define DEV_ECLIPSE "\ueaa5" +# define DEV_CLOUD9 "\ueaa6" +# define DEV_SCRUM "\ueaa7" +# define DEV_PROLOG "\ueaa8" +# define DEV_TERMINAL_BADGE "\ueaa9" +# define DEV_CODE_BADGE "\ueaaa" +# define DEV_MONGODB "\ueaab" +# define DEV_METEOR "\ueaac" +# define DEV_METEORFULL "\ueaad" +# define DEV_FSHARP "\ueaae" +# define DEV_RUST "\ueaaf" +# define DEV_IONIC "\ueab0" +# define DEV_SUBLIME "\ueab1" +# define DEV_APPCELERATOR "\ueab2" +# define DEV_ASTERISK "\ueab3" +# define DEV_AWS "\ueab4" +# define DEV_DIGITAL_OCEAN "\ueab5" +# define DEV_DLANG "\ueab6" +# define DEV_DOCKER "\ueab7" +# define DEV_ERLANG "\ueab8" +# define DEV_GOOGLE_CLOUD_PLATFORM "\ueab9" +# define DEV_GRAILS "\ueaba" +# define DEV_ILLUSTRATOR "\ueabb" +# define DEV_INTELLIJ "\ueabc" +# define DEV_MATERIALIZECSS "\ueabd" +# define DEV_OPENSHIFT "\ueabe" +# define DEV_PHOTOSHOP "\ueabf" +# define DEV_RACKSPACE "\ueac0" +# define DEV_REACT "\ueac1" +# define DEV_REDHAT "\ueac2" +# define DEV_SCRIPTCS "\ueac3" +# define DEV_E6BD "\ueac4" +# define DEV_E6BE "\ueac5" +# define DEV_E6BF "\ueac6" +# define DEV_E6C0 "\ueac7" +# define DEV_E6C1 "\ueac8" +# define DEV_E6C2 "\ueac9" +# define DEV_E6C3 "\ueaca" +# define DEV_SQLLITE "\ueacb" +# define DEV_VIM "\ueacc" +# define POM_CLEAN_CODE "\ueacd" +# define POM_POMODORO_DONE "\ueace" +# define POM_POMODORO_ESTIMATED "\ueacf" +# define POM_POMODORO_TICKING "\uead0" +# define POM_POMODORO_SQUASHED "\uead1" +# define POM_SHORT_PAUSE "\uead2" +# define POM_LONG_PAUSE "\uead3" +# define POM_AWAY "\uead4" +# define POM_PAIR_PROGRAMMING "\uead5" +# define POM_INTERNAL_INTERRUPTION "\uead6" +# define POM_EXTERNAL_INTERRUPTION "\uead7" +# define LINEA_ARROWS_ANTICLOCKWISE "\uead8" +# define LINEA_ARROWS_ANTICLOCKWISE_DASHED "\uead9" +# define LINEA_ARROWS_BUTTON_DOWN "\ueada" +# define LINEA_ARROWS_BUTTON_OFF "\ueadb" +# define LINEA_ARROWS_BUTTON_ON "\ueadc" +# define LINEA_ARROWS_BUTTON_UP "\ueadd" +# define LINEA_ARROWS_CHECK "\ueade" +# define LINEA_ARROWS_CIRCLE_CHECK "\ueadf" +# define LINEA_ARROWS_CIRCLE_DOWN "\ueae0" +# define LINEA_ARROWS_CIRCLE_DOWNLEFT "\ueae1" +# define LINEA_ARROWS_CIRCLE_DOWNRIGHT "\ueae2" +# define LINEA_ARROWS_CIRCLE_LEFT "\ueae3" +# define LINEA_ARROWS_CIRCLE_MINUS "\ueae4" +# define LINEA_ARROWS_CIRCLE_PLUS "\ueae5" +# define LINEA_ARROWS_CIRCLE_REMOVE "\ueae6" +# define LINEA_ARROWS_CIRCLE_RIGHT "\ueae7" +# define LINEA_ARROWS_CIRCLE_UP "\ueae8" +# define LINEA_ARROWS_CIRCLE_UPLEFT "\ueae9" +# define LINEA_ARROWS_CIRCLE_UPRIGHT "\ueaea" +# define LINEA_ARROWS_CLOCKWISE "\ueaeb" +# define LINEA_ARROWS_CLOCKWISE_DASHED "\ueaec" +# define LINEA_ARROWS_COMPRESS "\ueaed" +# define LINEA_ARROWS_DENY "\ueaee" +# define LINEA_ARROWS_DIAGONAL "\ueaef" +# define LINEA_ARROWS_DIAGONAL2 "\ueaf0" +# define LINEA_ARROWS_DOWN "\ueaf1" +# define LINEA_ARROWS_DOWN_DOUBLE "\ueaf2" +# define LINEA_ARROWS_DOWNLEFT "\ueaf3" +# define LINEA_ARROWS_DOWNRIGHT "\ueaf4" +# define LINEA_ARROWS_DRAG_DOWN "\ueaf5" +# define LINEA_ARROWS_DRAG_DOWN_DASHED "\ueaf6" +# define LINEA_ARROWS_DRAG_HORIZ "\ueaf7" +# define LINEA_ARROWS_DRAG_LEFT "\ueaf8" +# define LINEA_ARROWS_DRAG_LEFT_DASHED "\ueaf9" +# define LINEA_ARROWS_DRAG_RIGHT "\ueafa" +# define LINEA_ARROWS_DRAG_RIGHT_DASHED "\ueafb" +# define LINEA_ARROWS_DRAG_UP "\ueafc" +# define LINEA_ARROWS_DRAG_UP_DASHED "\ueafd" +# define LINEA_ARROWS_DRAG_VERT "\ueafe" +# define LINEA_ARROWS_EXCLAMATION "\ueaff" +# define LINEA_ARROWS_EXPAND "\ueb00" +# define LINEA_ARROWS_EXPAND_DIAGONAL1 "\ueb01" +# define LINEA_ARROWS_EXPAND_HORIZONTAL1 "\ueb02" +# define LINEA_ARROWS_EXPAND_VERTICAL1 "\ueb03" +# define LINEA_ARROWS_FIT_HORIZONTAL "\ueb04" +# define LINEA_ARROWS_FIT_VERTICAL "\ueb05" +# define LINEA_ARROWS_GLIDE "\ueb06" +# define LINEA_ARROWS_GLIDE_HORIZONTAL "\ueb07" +# define LINEA_ARROWS_GLIDE_VERTICAL "\ueb08" +# define LINEA_ARROWS_HAMBURGER1 "\ueb09" +# define LINEA_ARROWS_HAMBURGER_2 "\ueb0a" +# define LINEA_ARROWS_HORIZONTAL "\ueb0b" +# define LINEA_ARROWS_INFO "\ueb0c" +# define LINEA_ARROWS_KEYBOARD_ALT "\ueb0d" +# define LINEA_ARROWS_KEYBOARD_CMD "\ueb0e" +# define LINEA_ARROWS_KEYBOARD_DELETE "\ueb0f" +# define LINEA_ARROWS_KEYBOARD_DOWN "\ueb10" +# define LINEA_ARROWS_KEYBOARD_LEFT "\ueb11" +# define LINEA_ARROWS_KEYBOARD_RETURN "\ueb12" +# define LINEA_ARROWS_KEYBOARD_RIGHT "\ueb13" +# define LINEA_ARROWS_KEYBOARD_SHIFT "\ueb14" +# define LINEA_ARROWS_KEYBOARD_TAB "\ueb15" +# define LINEA_ARROWS_KEYBOARD_UP "\ueb16" +# define LINEA_ARROWS_LEFT "\ueb17" +# define LINEA_ARROWS_LEFT_DOUBLE_32 "\ueb18" +# define LINEA_ARROWS_MINUS "\ueb19" +# define LINEA_ARROWS_MOVE "\ueb1a" +# define LINEA_ARROWS_MOVE2 "\ueb1b" +# define LINEA_ARROWS_MOVE_BOTTOM "\ueb1c" +# define LINEA_ARROWS_MOVE_LEFT "\ueb1d" +# define LINEA_ARROWS_MOVE_RIGHT "\ueb1e" +# define LINEA_ARROWS_MOVE_TOP "\ueb1f" +# define LINEA_ARROWS_PLUS "\ueb20" +# define LINEA_ARROWS_QUESTION "\ueb21" +# define LINEA_ARROWS_REMOVE "\ueb22" +# define LINEA_ARROWS_RIGHT "\ueb23" +# define LINEA_ARROWS_RIGHT_DOUBLE "\ueb24" +# define LINEA_ARROWS_ROTATE "\ueb25" +# define LINEA_ARROWS_ROTATE_ANTI "\ueb26" +# define LINEA_ARROWS_ROTATE_ANTI_DASHED "\ueb27" +# define LINEA_ARROWS_ROTATE_DASHED "\ueb28" +# define LINEA_ARROWS_SHRINK "\ueb29" +# define LINEA_ARROWS_SHRINK_DIAGONAL1 "\ueb2a" +# define LINEA_ARROWS_SHRINK_DIAGONAL2 "\ueb2b" +# define LINEA_ARROWS_SHRINK_HORIZONAL2 "\ueb2c" +# define LINEA_ARROWS_SHRINK_HORIZONTAL1 "\ueb2d" +# define LINEA_ARROWS_SHRINK_VERTICAL1 "\ueb2e" +# define LINEA_ARROWS_SHRINK_VERTICAL2 "\ueb2f" +# define LINEA_ARROWS_SIGN_DOWN "\ueb30" +# define LINEA_ARROWS_SIGN_LEFT "\ueb31" +# define LINEA_ARROWS_SIGN_RIGHT "\ueb32" +# define LINEA_ARROWS_SIGN_UP "\ueb33" +# define LINEA_ARROWS_SLIDE_DOWN1 "\ueb34" +# define LINEA_ARROWS_SLIDE_DOWN2 "\ueb35" +# define LINEA_ARROWS_SLIDE_LEFT1 "\ueb36" +# define LINEA_ARROWS_SLIDE_LEFT2 "\ueb37" +# define LINEA_ARROWS_SLIDE_RIGHT1 "\ueb38" +# define LINEA_ARROWS_SLIDE_RIGHT2 "\ueb39" +# define LINEA_ARROWS_SLIDE_UP1 "\ueb3a" +# define LINEA_ARROWS_SLIDE_UP2 "\ueb3b" +# define LINEA_ARROWS_SLIM_DOWN "\ueb3c" +# define LINEA_ARROWS_SLIM_DOWN_DASHED "\ueb3d" +# define LINEA_ARROWS_SLIM_LEFT "\ueb3e" +# define LINEA_ARROWS_SLIM_LEFT_DASHED "\ueb3f" +# define LINEA_ARROWS_SLIM_RIGHT "\ueb40" +# define LINEA_ARROWS_SLIM_RIGHT_DASHED "\ueb41" +# define LINEA_ARROWS_SLIM_UP "\ueb42" +# define LINEA_ARROWS_SLIM_UP_DASHED "\ueb43" +# define LINEA_ARROWS_SQUARE_CHECK "\ueb44" +# define LINEA_ARROWS_SQUARE_DOWN "\ueb45" +# define LINEA_ARROWS_SQUARE_DOWNLEFT "\ueb46" +# define LINEA_ARROWS_SQUARE_DOWNRIGHT "\ueb47" +# define LINEA_ARROWS_SQUARE_LEFT "\ueb48" +# define LINEA_ARROWS_SQUARE_MINUS "\ueb49" +# define LINEA_ARROWS_SQUARE_PLUS "\ueb4a" +# define LINEA_ARROWS_SQUARE_REMOVE "\ueb4b" +# define LINEA_ARROWS_SQUARE_RIGHT "\ueb4c" +# define LINEA_ARROWS_SQUARE_UP "\ueb4d" +# define LINEA_ARROWS_SQUARE_UPLEFT "\ueb4e" +# define LINEA_ARROWS_SQUARE_UPRIGHT "\ueb4f" +# define LINEA_ARROWS_SQUARES "\ueb50" +# define LINEA_ARROWS_STRETCH_DIAGONAL1 "\ueb51" +# define LINEA_ARROWS_STRETCH_DIAGONAL2 "\ueb52" +# define LINEA_ARROWS_STRETCH_DIAGONAL3 "\ueb53" +# define LINEA_ARROWS_STRETCH_DIAGONAL4 "\ueb54" +# define LINEA_ARROWS_STRETCH_HORIZONTAL1 "\ueb55" +# define LINEA_ARROWS_STRETCH_HORIZONTAL2 "\ueb56" +# define LINEA_ARROWS_STRETCH_VERTICAL1 "\ueb57" +# define LINEA_ARROWS_STRETCH_VERTICAL2 "\ueb58" +# define LINEA_ARROWS_SWITCH_HORIZONTAL "\ueb59" +# define LINEA_ARROWS_SWITCH_VERTICAL "\ueb5a" +# define LINEA_ARROWS_UP "\ueb5b" +# define LINEA_ARROWS_UP_DOUBLE_33 "\ueb5c" +# define LINEA_ARROWS_UPLEFT "\ueb5d" +# define LINEA_ARROWS_UPRIGHT "\ueb5e" +# define LINEA_ARROWS_VERTICAL "\ueb5f" +# define LINEA_BASIC_LOCK_OPEN "\ueb60" +# define LINEA_BASIC_MAGIC_MOUSE "\ueb61" +# define LINEA_BASIC_MAGNIFIER "\ueb62" +# define LINEA_BASIC_MAGNIFIER_MINUS "\ueb63" +# define LINEA_BASIC_MAGNIFIER_PLUS "\ueb64" +# define LINEA_BASIC_MAIL "\ueb65" +# define LINEA_BASIC_MAIL_MULTIPLE "\ueb66" +# define LINEA_BASIC_MAIL_OPEN "\ueb67" +# define LINEA_BASIC_MAIL_OPEN_TEXT "\ueb68" +# define LINEA_BASIC_MALE "\ueb69" +# define LINEA_BASIC_MAP "\ueb6a" +# define LINEA_BASIC_MESSAGE "\ueb6b" +# define LINEA_BASIC_MESSAGE_MULTIPLE "\ueb6c" +# define LINEA_BASIC_MESSAGE_TXT "\ueb6d" +# define LINEA_BASIC_MIXER2 "\ueb6e" +# define LINEA_BASIC_INFO "\ueb6f" +# define LINEA_BASIC_IPOD "\ueb70" +# define LINEA_BASIC_JOYPAD "\ueb71" +# define LINEA_BASIC_KEY "\ueb72" +# define LINEA_BASIC_KEYBOARD "\ueb73" +# define LINEA_BASIC_LAPTOP "\ueb74" +# define LINEA_BASIC_LIFE_BUOY "\ueb75" +# define LINEA_BASIC_LIGHTBULB "\ueb76" +# define LINEA_BASIC_LINK "\ueb77" +# define LINEA_BASIC_LOCK "\ueb78" +# define LINEA_BASIC_MOUSE "\ueb79" +# define LINEA_BASIC_NOTEBOOK "\ueb7a" +# define LINEA_BASIC_NOTEBOOK_PEN "\ueb7b" +# define LINEA_BASIC_NOTEBOOK_PENCIL "\ueb7c" +# define LINEA_BASIC_PAPERPLANE "\ueb7d" +# define LINEA_BASIC_PENCIL_RULER "\ueb7e" +# define LINEA_BASIC_PENCIL_RULER_PEN "\ueb7f" +# define LINEA_BASIC_CLUBS "\ueb80" +# define LINEA_BASIC_COMPASS "\ueb81" +# define LINEA_BASIC_CUP "\ueb82" +# define LINEA_BASIC_DIAMONDS "\ueb83" +# define LINEA_BASIC_DISPLAY "\ueb84" +# define LINEA_BASIC_DOWNLOAD "\ueb85" +# define LINEA_BASIC_EXCLAMATION "\ueb86" +# define LINEA_BASIC_EYE "\ueb87" +# define LINEA_BASIC_EYE_CLOSED "\ueb88" +# define LINEA_BASIC_FEMALE "\ueb89" +# define LINEA_BASIC_FLAG1 "\ueb8a" +# define LINEA_BASIC_FLAG2 "\ueb8b" +# define LINEA_BASIC_FLOPPYDISK "\ueb8c" +# define LINEA_BASIC_FOLDER "\ueb8d" +# define LINEA_BASIC_FOLDER_MULTIPLE "\ueb8e" +# define LINEA_BASIC_GEAR "\ueb8f" +# define LINEA_BASIC_GEOLOCALIZE_01 "\ueb90" +# define LINEA_BASIC_GEOLOCALIZE_05 "\ueb91" +# define LINEA_BASIC_GLOBE "\ueb92" +# define LINEA_BASIC_GUNSIGHT "\ueb93" +# define LINEA_BASIC_HAMMER "\ueb94" +# define LINEA_BASIC_HEADSET "\ueb95" +# define LINEA_BASIC_HEART "\ueb96" +# define LINEA_BASIC_HEART_BROKEN "\ueb97" +# define LINEA_BASIC_HELM "\ueb98" +# define LINEA_BASIC_HOME "\ueb99" +# define LINEA_BASIC_PHOTO "\ueb9a" +# define LINEA_BASIC_RSS "\ueb9b" +# define LINEA_BASIC_PICTURE "\ueb9c" +# define LINEA_BASIC_PICTURE_MULTIPLE "\ueb9d" +# define LINEA_BASIC_PIN1 "\ueb9e" +# define LINEA_BASIC_PIN2 "\ueb9f" +# define LINEA_BASIC_ACCELERATOR "\ueba0" +# define LINEA_BASIC_ALARM "\ueba1" +# define LINEA_BASIC_ANCHOR "\ueba2" +# define LINEA_BASIC_ANTICLOCKWISE "\ueba3" +# define LINEA_BASIC_ARCHIVE "\ueba4" +# define LINEA_BASIC_ARCHIVE_FULL "\ueba5" +# define LINEA_BASIC_BAN "\ueba6" +# define LINEA_BASIC_BATTERY_CHARGE "\ueba7" +# define LINEA_BASIC_BATTERY_EMPTY "\ueba8" +# define LINEA_BASIC_BATTERY_FULL "\ueba9" +# define LINEA_BASIC_BATTERY_HALF "\uebaa" +# define LINEA_BASIC_BOLT "\uebab" +# define LINEA_BASIC_BOOK "\uebac" +# define LINEA_BASIC_BOOK_PEN "\uebad" +# define LINEA_BASIC_BOOK_PENCIL "\uebae" +# define LINEA_BASIC_BOOKMARK "\uebaf" +# define LINEA_BASIC_CALCULATOR "\uebb0" +# define LINEA_BASIC_CALENDAR "\uebb1" +# define LINEA_BASIC_CARDS_DIAMONDS "\uebb2" +# define LINEA_BASIC_CARDS_HEARTS "\uebb3" +# define LINEA_BASIC_CASE "\uebb4" +# define LINEA_BASIC_CHRONOMETER "\uebb5" +# define LINEA_BASIC_CLESSIDRE "\uebb6" +# define LINEA_BASIC_CLOCK "\uebb7" +# define LINEA_BASIC_CLOCKWISE "\uebb8" +# define LINEA_BASIC_CLOUD "\uebb9" +# define LINEA_BASIC_POSTCARD "\uebba" +# define LINEA_BASIC_POSTCARD_MULTIPLE "\uebbb" +# define LINEA_BASIC_PRINTER "\uebbc" +# define LINEA_BASIC_QUESTION "\uebbd" +# define LINEA_BASIC_SERVER "\uebbe" +# define LINEA_BASIC_SERVER2 "\uebbf" +# define LINEA_BASIC_SERVER_CLOUD "\uebc0" +# define LINEA_BASIC_SERVER_DOWNLOAD "\uebc1" +# define LINEA_BASIC_SERVER_UPLOAD "\uebc2" +# define LINEA_BASIC_SETTINGS "\uebc3" +# define LINEA_BASIC_SHARE "\uebc4" +# define LINEA_BASIC_SHEET "\uebc5" +# define LINEA_BASIC_SHEET_MULTIPLE "\uebc6" +# define LINEA_BASIC_SHEET_PEN "\uebc7" +# define LINEA_BASIC_SHEET_PENCIL "\uebc8" +# define LINEA_BASIC_SHEET_TXT "\uebc9" +# define LINEA_BASIC_SIGNS "\uebca" +# define LINEA_BASIC_SMARTPHONE "\uebcb" +# define LINEA_BASIC_SPADES "\uebcc" +# define LINEA_BASIC_SPREAD "\uebcd" +# define LINEA_BASIC_SPREAD_BOOKMARK "\uebce" +# define LINEA_BASIC_SPREAD_TEXT "\uebcf" +# define LINEA_BASIC_SPREAD_TEXT_BOOKMARK "\uebd0" +# define LINEA_BASIC_STAR "\uebd1" +# define LINEA_BASIC_TABLET "\uebd2" +# define LINEA_BASIC_TARGET "\uebd3" +# define LINEA_BASIC_TODO "\uebd4" +# define LINEA_BASIC_TODO_PEN "\uebd5" +# define LINEA_BASIC_TODO_PENCIL "\uebd6" +# define LINEA_BASIC_TODO_TXT "\uebd7" +# define LINEA_BASIC_TODOLIST_PEN "\uebd8" +# define LINEA_BASIC_TODOLIST_PENCIL "\uebd9" +# define LINEA_BASIC_TRASHCAN "\uebda" +# define LINEA_BASIC_TRASHCAN_FULL "\uebdb" +# define LINEA_BASIC_TRASHCAN_REFRESH "\uebdc" +# define LINEA_BASIC_TRASHCAN_REMOVE "\uebdd" +# define LINEA_BASIC_UPLOAD "\uebde" +# define LINEA_BASIC_USB "\uebdf" +# define LINEA_BASIC_VIDEO "\uebe0" +# define LINEA_BASIC_WATCH "\uebe1" +# define LINEA_BASIC_WEBPAGE "\uebe2" +# define LINEA_BASIC_WEBPAGE_IMG_TXT "\uebe3" +# define LINEA_BASIC_WEBPAGE_MULTIPLE "\uebe4" +# define LINEA_BASIC_WEBPAGE_TXT "\uebe5" +# define LINEA_BASIC_WORLD "\uebe6" +# define LINEA_ELABORATION_DOCUMENT_PREVIOUS "\uebe7" +# define LINEA_ELABORATION_DOCUMENT_REFRESH "\uebe8" +# define LINEA_ELABORATION_DOCUMENT_REMOVE "\uebe9" +# define LINEA_ELABORATION_DOCUMENT_SEARCH "\uebea" +# define LINEA_ELABORATION_DOCUMENT_STAR "\uebeb" +# define LINEA_ELABORATION_DOCUMENT_UPLOAD "\uebec" +# define LINEA_ELABORATION_FOLDER_CHECK "\uebed" +# define LINEA_ELABORATION_FOLDER_CLOUD "\uebee" +# define LINEA_ELABORATION_FOLDER_DOCUMENT "\uebef" +# define LINEA_ELABORATION_FOLDER_DOWNLOAD "\uebf0" +# define LINEA_ELABORATION_FOLDER_FLAGGED "\uebf1" +# define LINEA_ELABORATION_FOLDER_GRAPH "\uebf2" +# define LINEA_ELABORATION_FOLDER_HEART "\uebf3" +# define LINEA_ELABORATION_FOLDER_MINUS "\uebf4" +# define LINEA_ELABORATION_FOLDER_NEXT "\uebf5" +# define LINEA_ELABORATION_DOCUMENT_FLAGGED "\uebf6" +# define LINEA_ELABORATION_DOCUMENT_GRAPH "\uebf7" +# define LINEA_ELABORATION_DOCUMENT_HEART "\uebf8" +# define LINEA_ELABORATION_DOCUMENT_MINUS "\uebf9" +# define LINEA_ELABORATION_DOCUMENT_NEXT "\uebfa" +# define LINEA_ELABORATION_DOCUMENT_NOACCESS "\uebfb" +# define LINEA_ELABORATION_DOCUMENT_NOTE "\uebfc" +# define LINEA_ELABORATION_DOCUMENT_PENCIL "\uebfd" +# define LINEA_ELABORATION_DOCUMENT_PICTURE "\uebfe" +# define LINEA_ELABORATION_DOCUMENT_PLUS "\uebff" +# define LINEA_ELABORATION_FOLDER_NOACCESS "\uec00" +# define LINEA_ELABORATION_FOLDER_NOTE "\uec01" +# define LINEA_ELABORATION_FOLDER_PENCIL "\uec02" +# define LINEA_ELABORATION_FOLDER_PICTURE "\uec03" +# define LINEA_ELABORATION_FOLDER_PLUS "\uec04" +# define LINEA_ELABORATION_FOLDER_PREVIOUS "\uec05" +# define LINEA_ELABORATION_FOLDER_REFRESH "\uec06" +# define LINEA_ELABORATION_CALENDAR_EMPTY "\uec07" +# define LINEA_ELABORATION_CALENDAR_FLAGGED "\uec08" +# define LINEA_ELABORATION_CALENDAR_HEART "\uec09" +# define LINEA_ELABORATION_CALENDAR_MINUS "\uec0a" +# define LINEA_ELABORATION_CALENDAR_NEXT "\uec0b" +# define LINEA_ELABORATION_CALENDAR_NOACCESS "\uec0c" +# define LINEA_ELABORATION_CALENDAR_PENCIL "\uec0d" +# define LINEA_ELABORATION_CALENDAR_PLUS "\uec0e" +# define LINEA_ELABORATION_CALENDAR_PREVIOUS "\uec0f" +# define LINEA_ELABORATION_CALENDAR_REFRESH "\uec10" +# define LINEA_ELABORATION_CALENDAR_REMOVE "\uec11" +# define LINEA_ELABORATION_CALENDAR_SEARCH "\uec12" +# define LINEA_ELABORATION_CALENDAR_STAR "\uec13" +# define LINEA_ELABORATION_CALENDAR_UPLOAD "\uec14" +# define LINEA_ELABORATION_CLOUD_CHECK "\uec15" +# define LINEA_ELABORATION_CLOUD_DOWNLOAD "\uec16" +# define LINEA_ELABORATION_CLOUD_MINUS "\uec17" +# define LINEA_ELABORATION_CLOUD_NOACCESS "\uec18" +# define LINEA_ELABORATION_CLOUD_PLUS "\uec19" +# define LINEA_ELABORATION_CLOUD_REFRESH "\uec1a" +# define LINEA_ELABORATION_CLOUD_REMOVE "\uec1b" +# define LINEA_ELABORATION_CLOUD_SEARCH "\uec1c" +# define LINEA_ELABORATION_CLOUD_UPLOAD "\uec1d" +# define LINEA_ELABORATION_DOCUMENT_CHECK "\uec1e" +# define LINEA_ELABORATION_DOCUMENT_CLOUD "\uec1f" +# define LINEA_ELABORATION_DOCUMENT_DOWNLOAD "\uec20" +# define LINEA_ELABORATION_FOLDER_REMOVE "\uec21" +# define LINEA_ELABORATION_MAIL_HEART "\uec22" +# define LINEA_ELABORATION_FOLDER_SEARCH "\uec23" +# define LINEA_ELABORATION_FOLDER_STAR "\uec24" +# define LINEA_ELABORATION_FOLDER_UPLOAD "\uec25" +# define LINEA_ELABORATION_MAIL_CHECK "\uec26" +# define LINEA_ELABORATION_BOOKMARK_CHECCK "\uec27" +# define LINEA_ELABORATION_BOOKMARK_MINUS "\uec28" +# define LINEA_ELABORATION_BOOKMARK_PLUS "\uec29" +# define LINEA_ELABORATION_BOOKMARK_REMOVE "\uec2a" +# define LINEA_ELABORATION_BRIEFCASE_CHECK "\uec2b" +# define LINEA_ELABORATION_BRIEFCASE_DOWNLOAD "\uec2c" +# define LINEA_ELABORATION_BRIEFCASE_FLAGGED "\uec2d" +# define LINEA_ELABORATION_BRIEFCASE_MINUS "\uec2e" +# define LINEA_ELABORATION_BRIEFCASE_PLUS "\uec2f" +# define LINEA_ELABORATION_BRIEFCASE_REFRESH "\uec30" +# define LINEA_ELABORATION_BRIEFCASE_REMOVE "\uec31" +# define LINEA_ELABORATION_BRIEFCASE_SEARCH "\uec32" +# define LINEA_ELABORATION_BRIEFCASE_STAR "\uec33" +# define LINEA_ELABORATION_BRIEFCASE_UPLOAD "\uec34" +# define LINEA_ELABORATION_BROWSER_CHECK "\uec35" +# define LINEA_ELABORATION_BROWSER_DOWNLOAD "\uec36" +# define LINEA_ELABORATION_BROWSER_MINUS "\uec37" +# define LINEA_ELABORATION_BROWSER_PLUS "\uec38" +# define LINEA_ELABORATION_BROWSER_REFRESH "\uec39" +# define LINEA_ELABORATION_BROWSER_REMOVE "\uec3a" +# define LINEA_ELABORATION_BROWSER_SEARCH "\uec3b" +# define LINEA_ELABORATION_BROWSER_STAR "\uec3c" +# define LINEA_ELABORATION_BROWSER_UPLOAD "\uec3d" +# define LINEA_ELABORATION_CALENDAR_CHECK "\uec3e" +# define LINEA_ELABORATION_CALENDAR_CLOUD "\uec3f" +# define LINEA_ELABORATION_CALENDAR_DOWNLOAD "\uec40" +# define LINEA_ELABORATION_MAIL_CLOUD "\uec41" +# define LINEA_ELABORATION_MAIL_DOCUMENT "\uec42" +# define LINEA_ELABORATION_MAIL_DOWNLOAD "\uec43" +# define LINEA_ELABORATION_MAIL_FLAGGED "\uec44" +# define LINEA_ELABORATION_MAIL_NEXT "\uec45" +# define LINEA_ELABORATION_MAIL_NOACCESS "\uec46" +# define LINEA_ELABORATION_MAIL_NOTE "\uec47" +# define LINEA_ELABORATION_MAIL_PENCIL "\uec48" +# define LINEA_ELABORATION_MAIL_PICTURE "\uec49" +# define LINEA_ELABORATION_MAIL_PREVIOUS "\uec4a" +# define LINEA_ELABORATION_MAIL_REFRESH "\uec4b" +# define LINEA_ELABORATION_MAIL_REMOVE "\uec4c" +# define LINEA_ELABORATION_MAIL_SEARCH "\uec4d" +# define LINEA_ELABORATION_MAIL_STAR "\uec4e" +# define LINEA_ELABORATION_MAIL_UPLOAD "\uec4f" +# define LINEA_ELABORATION_MESSAGE_CHECK "\uec50" +# define LINEA_ELABORATION_MESSAGE_DOTS "\uec51" +# define LINEA_ELABORATION_MESSAGE_HAPPY "\uec52" +# define LINEA_ELABORATION_MESSAGE_HEART "\uec53" +# define LINEA_ELABORATION_MESSAGE_MINUS "\uec54" +# define LINEA_ELABORATION_MESSAGE_NOTE "\uec55" +# define LINEA_ELABORATION_MESSAGE_PLUS "\uec56" +# define LINEA_ELABORATION_MESSAGE_REFRESH "\uec57" +# define LINEA_ELABORATION_MESSAGE_REMOVE "\uec58" +# define LINEA_ELABORATION_MESSAGE_SAD "\uec59" +# define LINEA_ELABORATION_SMARTPHONE_CLOUD "\uec5a" +# define LINEA_ELABORATION_SMARTPHONE_HEART "\uec5b" +# define LINEA_ELABORATION_SMARTPHONE_NOACCESS "\uec5c" +# define LINEA_ELABORATION_SMARTPHONE_NOTE "\uec5d" +# define LINEA_ELABORATION_SMARTPHONE_PENCIL "\uec5e" +# define LINEA_ELABORATION_SMARTPHONE_PICTURE "\uec5f" +# define LINEA_ELABORATION_SMARTPHONE_REFRESH "\uec60" +# define LINEA_ELABORATION_SMARTPHONE_SEARCH "\uec61" +# define LINEA_ELABORATION_TABLET_CLOUD "\uec62" +# define LINEA_ELABORATION_TABLET_HEART "\uec63" +# define LINEA_ELABORATION_TABLET_NOACCESS "\uec64" +# define LINEA_ELABORATION_TABLET_NOTE "\uec65" +# define LINEA_ELABORATION_TABLET_PENCIL "\uec66" +# define LINEA_ELABORATION_TABLET_PICTURE "\uec67" +# define LINEA_ELABORATION_TABLET_REFRESH "\uec68" +# define LINEA_ELABORATION_TABLET_SEARCH "\uec69" +# define LINEA_ELABORATION_TODOLIST_2 "\uec6a" +# define LINEA_ELABORATION_TODOLIST_CHECK "\uec6b" +# define LINEA_ELABORATION_TODOLIST_CLOUD "\uec6c" +# define LINEA_ELABORATION_TODOLIST_DOWNLOAD "\uec6d" +# define LINEA_ELABORATION_TODOLIST_FLAGGED "\uec6e" +# define LINEA_ELABORATION_TODOLIST_MINUS "\uec6f" +# define LINEA_ELABORATION_TODOLIST_NOACCESS "\uec70" +# define LINEA_ELABORATION_TODOLIST_PENCIL "\uec71" +# define LINEA_ELABORATION_TODOLIST_PLUS "\uec72" +# define LINEA_ELABORATION_TODOLIST_REFRESH "\uec73" +# define LINEA_ELABORATION_TODOLIST_REMOVE "\uec74" +# define LINEA_ELABORATION_TODOLIST_SEARCH "\uec75" +# define LINEA_ELABORATION_TODOLIST_STAR "\uec76" +# define LINEA_ELABORATION_TODOLIST_UPLOAD "\uec77" +# define LINEA_ECOMMERCE_RECEIPT_KIPS "\uec78" +# define LINEA_ECOMMERCE_RECEIPT_LIRA "\uec79" +# define LINEA_ECOMMERCE_RECEIPT_NAIRA "\uec7a" +# define LINEA_ECOMMERCE_RECEIPT_PESOS "\uec7b" +# define LINEA_ECOMMERCE_RECEIPT_POUND "\uec7c" +# define LINEA_ECOMMERCE_RECEIPT_RUBLO "\uec7d" +# define LINEA_ECOMMERCE_RECEIPT_RUPEE "\uec7e" +# define LINEA_ECOMMERCE_RECEIPT_TUGRIK "\uec7f" +# define LINEA_ECOMMERCE_RECEIPT_WON "\uec80" +# define LINEA_ECOMMERCE_RECEIPT_YEN "\uec81" +# define LINEA_ECOMMERCE_RECEIPT_YEN2 "\uec82" +# define LINEA_ECOMMERCE_RECEPT_COLON "\uec83" +# define LINEA_ECOMMERCE_RUBLO "\uec84" +# define LINEA_ECOMMERCE_RUPEE "\uec85" +# define LINEA_ECOMMERCE_SAFE "\uec86" +# define LINEA_ECOMMERCE_NAIRA "\uec87" +# define LINEA_ECOMMERCE_PESOS "\uec88" +# define LINEA_ECOMMERCE_POUND "\uec89" +# define LINEA_ECOMMERCE_RECEIPT "\uec8a" +# define LINEA_ECOMMERCE_RECEIPT_BATH "\uec8b" +# define LINEA_ECOMMERCE_RECEIPT_CENT "\uec8c" +# define LINEA_ECOMMERCE_RECEIPT_DOLLAR "\uec8d" +# define LINEA_ECOMMERCE_RECEIPT_EURO "\uec8e" +# define LINEA_ECOMMERCE_RECEIPT_FRANC "\uec8f" +# define LINEA_ECOMMERCE_RECEIPT_GUARANI "\uec90" +# define LINEA_ECOMMERCE_SALE "\uec91" +# define LINEA_ECOMMERCE_SALES "\uec92" +# define LINEA_ECOMMERCE_TICKET "\uec93" +# define LINEA_ECOMMERCE_TUGRIKS "\uec94" +# define LINEA_ECOMMERCE_WALLET "\uec95" +# define LINEA_ECOMMERCE_WON "\uec96" +# define LINEA_ECOMMERCE_YEN "\uec97" +# define LINEA_ECOMMERCE_CART_CONTENT "\uec98" +# define LINEA_ECOMMERCE_CART_DOWNLOAD "\uec99" +# define LINEA_ECOMMERCE_CART_MINUS "\uec9a" +# define LINEA_ECOMMERCE_CART_PLUS "\uec9b" +# define LINEA_ECOMMERCE_CART_REFRESH "\uec9c" +# define LINEA_ECOMMERCE_CART_REMOVE "\uec9d" +# define LINEA_ECOMMERCE_CART_SEARCH "\uec9e" +# define LINEA_ECOMMERCE_CART_UPLOAD "\uec9f" +# define LINEA_ECOMMERCE_CENT "\ueca0" +# define LINEA_ECOMMERCE_COLON "\ueca1" +# define LINEA_ECOMMERCE_CREDITCARD "\ueca2" +# define LINEA_ECOMMERCE_DIAMOND "\ueca3" +# define LINEA_ECOMMERCE_DOLLAR "\ueca4" +# define LINEA_ECOMMERCE_EURO "\ueca5" +# define LINEA_ECOMMERCE_FRANC "\ueca6" +# define LINEA_ECOMMERCE_GIFT "\ueca7" +# define LINEA_ECOMMERCE_GRAPH1 "\ueca8" +# define LINEA_ECOMMERCE_GRAPH2 "\ueca9" +# define LINEA_ECOMMERCE_GRAPH3 "\uecaa" +# define LINEA_ECOMMERCE_GRAPH_DECREASE "\uecab" +# define LINEA_ECOMMERCE_GRAPH_INCREASE "\uecac" +# define LINEA_ECOMMERCE_GUARANI "\uecad" +# define LINEA_ECOMMERCE_KIPS "\uecae" +# define LINEA_ECOMMERCE_LIRA "\uecaf" +# define LINEA_ECOMMERCE_MEGAPHONE "\uecb0" +# define LINEA_ECOMMERCE_MONEY "\uecb1" +# define LINEA_ECOMMERCE_YEN2 "\uecb2" +# define LINEA_ECOMMERCE_BAG "\uecb3" +# define LINEA_ECOMMERCE_BAG_CHECK "\uecb4" +# define LINEA_ECOMMERCE_BAG_CLOUD "\uecb5" +# define LINEA_ECOMMERCE_BAG_DOWNLOAD "\uecb6" +# define LINEA_ECOMMERCE_BAG_MINUS "\uecb7" +# define LINEA_ECOMMERCE_BAG_PLUS "\uecb8" +# define LINEA_ECOMMERCE_BAG_REFRESH "\uecb9" +# define LINEA_ECOMMERCE_BAG_REMOVE "\uecba" +# define LINEA_ECOMMERCE_BAG_SEARCH "\uecbb" +# define LINEA_ECOMMERCE_BAG_UPLOAD "\uecbc" +# define LINEA_ECOMMERCE_BANKNOTE "\uecbd" +# define LINEA_ECOMMERCE_BANKNOTES "\uecbe" +# define LINEA_ECOMMERCE_BASKET "\uecbf" +# define LINEA_ECOMMERCE_BASKET_CHECK "\uecc0" +# define LINEA_ECOMMERCE_BASKET_CLOUD "\uecc1" +# define LINEA_ECOMMERCE_BASKET_DOWNLOAD "\uecc2" +# define LINEA_ECOMMERCE_BASKET_MINUS "\uecc3" +# define LINEA_ECOMMERCE_BASKET_PLUS "\uecc4" +# define LINEA_ECOMMERCE_BASKET_REFRESH "\uecc5" +# define LINEA_ECOMMERCE_BASKET_REMOVE "\uecc6" +# define LINEA_ECOMMERCE_BASKET_SEARCH "\uecc7" +# define LINEA_ECOMMERCE_BASKET_UPLOAD "\uecc8" +# define LINEA_ECOMMERCE_BATH "\uecc9" +# define LINEA_ECOMMERCE_CART "\uecca" +# define LINEA_ECOMMERCE_CART_CHECK "\ueccb" +# define LINEA_ECOMMERCE_CART_CLOUD "\ueccc" +# define LINEA_MUSIC_STOP_BUTTON "\ueccd" +# define LINEA_MUSIC_TAPE "\uecce" +# define LINEA_MUSIC_VOLUME_DOWN "\ueccf" +# define LINEA_MUSIC_VOLUME_UP "\uecd0" +# define LINEA_MUSIC_BEGINNING_BUTTON "\uecd1" +# define LINEA_MUSIC_BELL "\uecd2" +# define LINEA_MUSIC_CD "\uecd3" +# define LINEA_MUSIC_DIAPASON "\uecd4" +# define LINEA_MUSIC_EJECT_BUTTON "\uecd5" +# define LINEA_MUSIC_END_BUTTON "\uecd6" +# define LINEA_MUSIC_FASTFORWARD_BUTTON "\uecd7" +# define LINEA_MUSIC_HEADPHONES "\uecd8" +# define LINEA_MUSIC_IPOD "\uecd9" +# define LINEA_MUSIC_LOUDSPEAKER "\uecda" +# define LINEA_MUSIC_MICROPHONE "\uecdb" +# define LINEA_MUSIC_MICROPHONE_OLD "\uecdc" +# define LINEA_MUSIC_MIXER "\uecdd" +# define LINEA_MUSIC_MUTE "\uecde" +# define LINEA_MUSIC_NOTE_MULTIPLE "\uecdf" +# define LINEA_MUSIC_NOTE_SINGLE "\uece0" +# define LINEA_MUSIC_PAUSE_BUTTON "\uece1" +# define LINEA_MUSIC_PLAY_BUTTON "\uece2" +# define LINEA_MUSIC_PLAYLIST "\uece3" +# define LINEA_MUSIC_RADIO_GHETTOBLASTER "\uece4" +# define LINEA_MUSIC_RADIO_PORTABLE "\uece5" +# define LINEA_MUSIC_RECORD "\uece6" +# define LINEA_MUSIC_RECORDPLAYER "\uece7" +# define LINEA_MUSIC_REPEAT_BUTTON "\uece8" +# define LINEA_MUSIC_REWIND_BUTTON "\uece9" +# define LINEA_MUSIC_SHUFFLE_BUTTON "\uecea" +# define LINEA_SOFTWARE_PARAGRAPH_JUSTIFY_CENTER "\ueceb" +# define LINEA_SOFTWARE_PARAGRAPH_JUSTIFY_LEFT "\uecec" +# define LINEA_SOFTWARE_PARAGRAPH_JUSTIFY_RIGHT "\ueced" +# define LINEA_SOFTWARE_PARAGRAPH_SPACE_AFTER "\uecee" +# define LINEA_SOFTWARE_PARAGRAPH_SPACE_BEFORE "\uecef" +# define LINEA_SOFTWARE_PATHFINDER_EXCLUDE "\uecf0" +# define LINEA_SOFTWARE_PATHFINDER_INTERSECT "\uecf1" +# define LINEA_SOFTWARE_PATHFINDER_SUBTRACT "\uecf2" +# define LINEA_SOFTWARE_PATHFINDER_UNITE "\uecf3" +# define LINEA_SOFTWARE_PEN "\uecf4" +# define LINEA_SOFTWARE_PEN_ADD "\uecf5" +# define LINEA_SOFTWARE_PEN_REMOVE "\uecf6" +# define LINEA_SOFTWARE_PENCIL "\uecf7" +# define LINEA_SOFTWARE_POLYGONALLASSO "\uecf8" +# define LINEA_SOFTWARE_REFLECT_HORIZONTAL "\uecf9" +# define LINEA_SOFTWARE_MAGNETE "\uecfa" +# define LINEA_SOFTWARE_PAGES "\uecfb" +# define LINEA_SOFTWARE_PAINTBRUSH "\uecfc" +# define LINEA_SOFTWARE_PAINTBUCKET "\uecfd" +# define LINEA_SOFTWARE_PAINTROLLER "\uecfe" +# define LINEA_SOFTWARE_PARAGRAPH "\uecff" +# define LINEA_SOFTWARE_PARAGRAPH_ALIGN_LEFT "\ued00" +# define LINEA_SOFTWARE_PARAGRAPH_ALIGN_RIGHT "\ued01" +# define LINEA_SOFTWARE_PARAGRAPH_CENTER "\ued02" +# define LINEA_SOFTWARE_PARAGRAPH_JUSTIFY_ALL "\ued03" +# define LINEA_SOFTWARE_REFLECT_VERTICAL "\ued04" +# define LINEA_SOFTWARE_REMOVE_VECTORPOINT "\ued05" +# define LINEA_SOFTWARE_SCALE_EXPAND "\ued06" +# define LINEA_SOFTWARE_SCALE_REDUCE "\ued07" +# define LINEA_SOFTWARE_SELECTION_OVAL "\ued08" +# define LINEA_SOFTWARE_SELECTION_POLYGON "\ued09" +# define LINEA_SOFTWARE_SELECTION_RECTANGLE "\ued0a" +# define LINEA_SOFTWARE_INDENT_FIRSTLINE "\ued0b" +# define LINEA_SOFTWARE_INDENT_LEFT "\ued0c" +# define LINEA_SOFTWARE_INDENT_RIGHT "\ued0d" +# define LINEA_SOFTWARE_LASSO "\ued0e" +# define LINEA_SOFTWARE_LAYERS1 "\ued0f" +# define LINEA_SOFTWARE_LAYERS2 "\ued10" +# define LINEA_SOFTWARE_LAYOUT "\ued11" +# define LINEA_SOFTWARE_LAYOUT_2COLUMNS "\ued12" +# define LINEA_SOFTWARE_LAYOUT_3COLUMNS "\ued13" +# define LINEA_SOFTWARE_LAYOUT_4BOXES "\ued14" +# define LINEA_SOFTWARE_LAYOUT_4COLUMNS "\ued15" +# define LINEA_SOFTWARE_LAYOUT_4LINES "\ued16" +# define LINEA_SOFTWARE_LAYOUT_8BOXES "\ued17" +# define LINEA_SOFTWARE_LAYOUT_HEADER "\ued18" +# define LINEA_SOFTWARE_LAYOUT_HEADER_2COLUMNS "\ued19" +# define LINEA_SOFTWARE_LAYOUT_HEADER_3COLUMNS "\ued1a" +# define LINEA_SOFTWARE_LAYOUT_HEADER_4BOXES "\ued1b" +# define LINEA_SOFTWARE_LAYOUT_HEADER_4COLUMNS "\ued1c" +# define LINEA_SOFTWARE_LAYOUT_HEADER_COMPLEX "\ued1d" +# define LINEA_SOFTWARE_LAYOUT_HEADER_COMPLEX2 "\ued1e" +# define LINEA_SOFTWARE_LAYOUT_HEADER_COMPLEX3 "\ued1f" +# define LINEA_SOFTWARE_LAYOUT_HEADER_COMPLEX4 "\ued20" +# define LINEA_SOFTWARE_LAYOUT_HEADER_SIDELEFT "\ued21" +# define LINEA_SOFTWARE_LAYOUT_HEADER_SIDERIGHT "\ued22" +# define LINEA_SOFTWARE_LAYOUT_SIDEBAR_LEFT "\ued23" +# define LINEA_SOFTWARE_LAYOUT_SIDEBAR_RIGHT "\ued24" +# define LINEA_SOFTWARE_SELECTION_ROUNDEDRECTANGLE "\ued25" +# define LINEA_SOFTWARE_VECTOR_LINE "\ued26" +# define LINEA_SOFTWARE_SHAPE_OVAL "\ued27" +# define LINEA_SOFTWARE_SHAPE_POLYGON "\ued28" +# define LINEA_SOFTWARE_SHAPE_RECTANGLE "\ued29" +# define LINEA_SOFTWARE_SHAPE_ROUNDEDRECTANGLE "\ued2a" +# define LINEA_SOFTWARE_ADD_VECTORPOINT "\ued2b" +# define LINEA_SOFTWARE_BOX_OVAL "\ued2c" +# define LINEA_SOFTWARE_BOX_POLYGON "\ued2d" +# define LINEA_SOFTWARE_BOX_RECTANGLE "\ued2e" +# define LINEA_SOFTWARE_BOX_ROUNDEDRECTANGLE "\ued2f" +# define LINEA_SOFTWARE_CHARACTER "\ued30" +# define LINEA_SOFTWARE_CROP "\ued31" +# define LINEA_SOFTWARE_EYEDROPPER "\ued32" +# define LINEA_SOFTWARE_FONT_ALLCAPS "\ued33" +# define LINEA_SOFTWARE_FONT_BASELINE_SHIFT "\ued34" +# define LINEA_SOFTWARE_FONT_HORIZONTAL_SCALE "\ued35" +# define LINEA_SOFTWARE_FONT_KERNING "\ued36" +# define LINEA_SOFTWARE_FONT_LEADING "\ued37" +# define LINEA_SOFTWARE_FONT_SIZE "\ued38" +# define LINEA_SOFTWARE_FONT_SMALLCAPITAL "\ued39" +# define LINEA_SOFTWARE_FONT_SMALLCAPS "\ued3a" +# define LINEA_SOFTWARE_FONT_STRIKETHROUGH "\ued3b" +# define LINEA_SOFTWARE_FONT_TRACKING "\ued3c" +# define LINEA_SOFTWARE_FONT_UNDERLINE "\ued3d" +# define LINEA_SOFTWARE_FONT_VERTICAL_SCALE "\ued3e" +# define LINEA_SOFTWARE_HORIZONTAL_ALIGN_CENTER "\ued3f" +# define LINEA_SOFTWARE_HORIZONTAL_ALIGN_LEFT "\ued40" +# define LINEA_SOFTWARE_HORIZONTAL_ALIGN_RIGHT "\ued41" +# define LINEA_SOFTWARE_HORIZONTAL_DISTRIBUTE_CENTER "\ued42" +# define LINEA_SOFTWARE_HORIZONTAL_DISTRIBUTE_LEFT "\ued43" +# define LINEA_SOFTWARE_HORIZONTAL_DISTRIBUTE_RIGHT "\ued44" +# define LINEA_SOFTWARE_SLICE "\ued45" +# define LINEA_SOFTWARE_TRANSFORM_BEZIER "\ued46" +# define LINEA_SOFTWARE_VECTOR_BOX "\ued47" +# define LINEA_SOFTWARE_VECTOR_COMPOSITE "\ued48" +# define LINEA_SOFTWARE_VERTICAL_ALIGN_BOTTOM "\ued49" +# define LINEA_SOFTWARE_VERTICAL_ALIGN_CENTER "\ued4a" +# define LINEA_SOFTWARE_VERTICAL_ALIGN_TOP "\ued4b" +# define LINEA_SOFTWARE_VERTICAL_DISTRIBUTE_BOTTOM "\ued4c" +# define LINEA_SOFTWARE_VERTICAL_DISTRIBUTE_CENTER "\ued4d" +# define LINEA_SOFTWARE_VERTICAL_DISTRIBUTE_TOP "\ued4e" +# define LINEA_WEATHER_AQUARIUS "\ued4f" +# define LINEA_WEATHER_ARIES "\ued50" +# define LINEA_WEATHER_CANCER "\ued51" +# define LINEA_WEATHER_CAPRICORN "\ued52" +# define LINEA_WEATHER_CLOUD "\ued53" +# define LINEA_WEATHER_CLOUD_DROP "\ued54" +# define LINEA_WEATHER_CLOUD_LIGHTNING "\ued55" +# define LINEA_WEATHER_CLOUD_SNOWFLAKE "\ued56" +# define LINEA_WEATHER_DOWNPOUR_FULLMOON "\ued57" +# define LINEA_WEATHER_DOWNPOUR_HALFMOON "\ued58" +# define LINEA_WEATHER_DOWNPOUR_SUN "\ued59" +# define LINEA_WEATHER_DROP "\ued5a" +# define LINEA_WEATHER_FIRST_QUARTER "\ued5b" +# define LINEA_WEATHER_FOG "\ued5c" +# define LINEA_WEATHER_FOG_FULLMOON "\ued5d" +# define LINEA_WEATHER_FOG_HALFMOON "\ued5e" +# define LINEA_WEATHER_FOG_SUN "\ued5f" +# define LINEA_WEATHER_FULLMOON "\ued60" +# define LINEA_WEATHER_GEMINI "\ued61" +# define LINEA_WEATHER_HAIL "\ued62" +# define LINEA_WEATHER_HAIL_FULLMOON "\ued63" +# define LINEA_WEATHER_HAIL_HALFMOON "\ued64" +# define LINEA_WEATHER_HAIL_SUN "\ued65" +# define LINEA_WEATHER_LAST_QUARTER "\ued66" +# define LINEA_WEATHER_LEO "\ued67" +# define LINEA_WEATHER_LIBRA "\ued68" +# define LINEA_WEATHER_LIGHTNING "\ued69" +# define LINEA_WEATHER_MISTYRAIN "\ued6a" +# define LINEA_WEATHER_MISTYRAIN_FULLMOON "\ued6b" +# define LINEA_WEATHER_MISTYRAIN_HALFMOON "\ued6c" +# define LINEA_WEATHER_MISTYRAIN_SUN "\ued6d" +# define LINEA_WEATHER_MOON "\ued6e" +# define LINEA_WEATHER_MOONDOWN_FULL "\ued6f" +# define LINEA_WEATHER_MOONDOWN_HALF "\ued70" +# define LINEA_WEATHER_MOONSET_FULL "\ued71" +# define LINEA_WEATHER_MOONSET_HALF "\ued72" +# define LINEA_WEATHER_MOVE2 "\ued73" +# define LINEA_WEATHER_NEWMOON "\ued74" +# define LINEA_WEATHER_PISCES "\ued75" +# define LINEA_WEATHER_RAIN "\ued76" +# define LINEA_WEATHER_RAIN_FULLMOON "\ued77" +# define LINEA_WEATHER_RAIN_HALFMOON "\ued78" +# define LINEA_WEATHER_RAIN_SUN "\ued79" +# define LINEA_WEATHER_SAGITTARIUS "\ued7a" +# define LINEA_WEATHER_SCORPIO "\ued7b" +# define LINEA_WEATHER_SNOW "\ued7c" +# define LINEA_WEATHER_SNOW_FULLMOON "\ued7d" +# define LINEA_WEATHER_SNOW_HALFMOON "\ued7e" +# define LINEA_WEATHER_SNOW_SUN "\ued7f" +# define LINEA_WEATHER_SNOWFLAKE "\ued80" +# define LINEA_WEATHER_STAR "\ued81" +# define LINEA_WEATHER_STORM_11 "\ued82" +# define LINEA_WEATHER_STORM_32 "\ued83" +# define LINEA_WEATHER_STORM_FULLMOON "\ued84" +# define LINEA_WEATHER_STORM_HALFMOON "\ued85" +# define LINEA_WEATHER_STORM_SUN "\ued86" +# define LINEA_WEATHER_SUN "\ued87" +# define LINEA_WEATHER_SUNDOWN "\ued88" +# define LINEA_WEATHER_SUNSET "\ued89" +# define LINEA_WEATHER_TAURUS "\ued8a" +# define LINEA_WEATHER_TEMPEST "\ued8b" +# define LINEA_WEATHER_TEMPEST_FULLMOON "\ued8c" +# define LINEA_WEATHER_TEMPEST_HALFMOON "\ued8d" +# define LINEA_WEATHER_TEMPEST_SUN "\ued8e" +# define LINEA_WEATHER_VARIABLE_FULLMOON "\ued8f" +# define LINEA_WEATHER_VARIABLE_HALFMOON "\ued90" +# define LINEA_WEATHER_VARIABLE_SUN "\ued91" +# define LINEA_WEATHER_VIRGO "\ued92" +# define LINEA_WEATHER_WANING_CRESENT "\ued93" +# define LINEA_WEATHER_WANING_GIBBOUS "\ued94" +# define LINEA_WEATHER_WAXING_CRESENT "\ued95" +# define LINEA_WEATHER_WAXING_GIBBOUS "\ued96" +# define LINEA_WEATHER_WIND "\ued97" +# define LINEA_WEATHER_WIND_E "\ued98" +# define LINEA_WEATHER_WIND_FULLMOON "\ued99" +# define LINEA_WEATHER_WIND_HALFMOON "\ued9a" +# define LINEA_WEATHER_WIND_N "\ued9b" +# define LINEA_WEATHER_WIND_NE "\ued9c" +# define LINEA_WEATHER_WIND_NW "\ued9d" +# define LINEA_WEATHER_WIND_S "\ued9e" +# define LINEA_WEATHER_WIND_SE "\ued9f" +# define LINEA_WEATHER_WIND_SUN "\ueda0" +# define LINEA_WEATHER_WIND_SW "\ueda1" +# define LINEA_WEATHER_WIND_W "\ueda2" +# define LINEA_WEATHER_WINDGUST "\ueda3" +# define MFIZZ_3DPRINT "\ueda4" +# define MFIZZ_ALPINELINUX "\ueda5" +# define MFIZZ_ANGULAR "\ueda6" +# define MFIZZ_ANGULAR_ALT "\ueda7" +# define MFIZZ_ANTENNA "\ueda8" +# define MFIZZ_APACHE "\ueda9" +# define MFIZZ_ARCHLINUX "\uedaa" +# define MFIZZ_AWS "\uedab" +# define MFIZZ_AZURE "\uedac" +# define MFIZZ_BACKBONE "\uedad" +# define MFIZZ_BLACKBERRY "\uedae" +# define MFIZZ_BOMB "\uedaf" +# define MFIZZ_BOOTSTRAP "\uedb0" +# define MFIZZ_C "\uedb1" +# define MFIZZ_CASSANDRA "\uedb2" +# define MFIZZ_CENTOS "\uedb3" +# define MFIZZ_CLOJURE "\uedb4" +# define MFIZZ_CODEIGNITER "\uedb5" +# define MFIZZ_CODEPEN "\uedb6" +# define MFIZZ_COFFEE_BEAN "\uedb7" +# define MFIZZ_CPLUSPLUS "\uedb8" +# define MFIZZ_CSHARP "\uedb9" +# define MFIZZ_CSS "\uedba" +# define MFIZZ_CSS3 "\uedbb" +# define MFIZZ_CSS3_ALT "\uedbc" +# define MFIZZ_D3 "\uedbd" +# define MFIZZ_DATABASE "\uedbe" +# define MFIZZ_DATABASE_ALT "\uedbf" +# define MFIZZ_DATABASE_ALT2 "\uedc0" +# define MFIZZ_DEBIAN "\uedc1" +# define MFIZZ_DOCKER "\uedc2" +# define MFIZZ_DREAMHOST "\uedc3" +# define MFIZZ_ELIXIR "\uedc4" +# define MFIZZ_ELM "\uedc5" +# define MFIZZ_ERLANG "\uedc6" +# define MFIZZ_EXHERBO "\uedc7" +# define MFIZZ_FEDORA "\uedc8" +# define MFIZZ_FIRE_ALT "\uedc9" +# define MFIZZ_FREEBSD "\uedca" +# define MFIZZ_FREECODECAMP "\uedcb" +# define MFIZZ_GENTOO "\uedcc" +# define MFIZZ_GHOST "\uedcd" +# define MFIZZ_GIT "\uedce" +# define MFIZZ_GNOME "\uedcf" +# define MFIZZ_GO "\uedd0" +# define MFIZZ_GO_ALT "\uedd1" +# define MFIZZ_GOOGLE "\uedd2" +# define MFIZZ_GOOGLE_ALT "\uedd3" +# define MFIZZ_GOOGLE_CODE "\uedd4" +# define MFIZZ_GOOGLE_DEVELOPERS "\uedd5" +# define MFIZZ_GRADLE "\uedd6" +# define MFIZZ_GRAILS "\uedd7" +# define MFIZZ_GRAILS_ALT "\uedd8" +# define MFIZZ_GRUNT "\uedd9" +# define MFIZZ_GULP "\uedda" +# define MFIZZ_GULP_ALT "\ueddb" +# define MFIZZ_HADOOP "\ueddc" +# define MFIZZ_HASKELL "\ueddd" +# define MFIZZ_HEROKU "\uedde" +# define MFIZZ_HTML "\ueddf" +# define MFIZZ_HTML5 "\uede0" +# define MFIZZ_HTML5_ALT "\uede1" +# define MFIZZ_IPHONE "\uede2" +# define MFIZZ_JAVA "\uede3" +# define MFIZZ_JAVA_BOLD "\uede4" +# define MFIZZ_JAVA_DUKE "\uede5" +# define MFIZZ_JAVASCRIPT "\uede6" +# define MFIZZ_JAVASCRIPT_ALT "\uede7" +# define MFIZZ_JETTY "\uede8" +# define MFIZZ_JQUERY "\uede9" +# define MFIZZ_KDE "\uedea" +# define MFIZZ_LARAVEL "\uedeb" +# define MFIZZ_LINE_GRAPH "\uedec" +# define MFIZZ_LINUX_MINT "\ueded" +# define MFIZZ_LOOKING "\uedee" +# define MFIZZ_MAGENTO "\uedef" +# define MFIZZ_MARIADB "\uedf0" +# define MFIZZ_MAVEN "\uedf1" +# define MFIZZ_MICROSCOPE "\uedf2" +# define MFIZZ_MOBILE_DEVICE "\uedf3" +# define MFIZZ_MOBILE_PHONE_ALT "\uedf4" +# define MFIZZ_MOBILE_PHONE_BROADCAST "\uedf5" +# define MFIZZ_MONGODB "\uedf6" +# define MFIZZ_MSSQL "\uedf7" +# define MFIZZ_MYSQL "\uedf8" +# define MFIZZ_MYSQL_ALT "\uedf9" +# define MFIZZ_NETBSD "\uedfa" +# define MFIZZ_NGINX "\uedfb" +# define MFIZZ_NGINX_ALT "\uedfc" +# define MFIZZ_NGINX_ALT2 "\uedfd" +# define MFIZZ_NODEJS "\uedfe" +# define MFIZZ_NPM "\uedff" +# define MFIZZ_OBJC "\uee00" +# define MFIZZ_OPENSHIFT "\uee01" +# define MFIZZ_ORACLE "\uee02" +# define MFIZZ_ORACLE_ALT "\uee03" +# define MFIZZ_OSX "\uee04" +# define MFIZZ_PERL "\uee05" +# define MFIZZ_PHONE_ALT "\uee06" +# define MFIZZ_PHONE_GAP "\uee07" +# define MFIZZ_PHONE_RETRO "\uee08" +# define MFIZZ_PHP "\uee09" +# define MFIZZ_PHP_ALT "\uee0a" +# define MFIZZ_PLAYFRAMEWORK "\uee0b" +# define MFIZZ_PLAYFRAMEWORK_ALT "\uee0c" +# define MFIZZ_PLONE "\uee0d" +# define MFIZZ_POSTGRES "\uee0e" +# define MFIZZ_POSTGRES_ALT "\uee0f" +# define MFIZZ_PYTHON "\uee10" +# define MFIZZ_RASPBERRYPI "\uee11" +# define MFIZZ_REACTJS "\uee12" +# define MFIZZ_REDHAT "\uee13" +# define MFIZZ_REDIS "\uee14" +# define MFIZZ_RUBY "\uee15" +# define MFIZZ_RUBY_ON_RAILS "\uee16" +# define MFIZZ_RUBY_ON_RAILS_ALT "\uee17" +# define MFIZZ_RUST "\uee18" +# define MFIZZ_SASS "\uee19" +# define MFIZZ_SATELLITE "\uee1a" +# define MFIZZ_SCALA "\uee1b" +# define MFIZZ_SCALA_ALT "\uee1c" +# define MFIZZ_SCRIPT "\uee1d" +# define MFIZZ_SCRIPT_ALT "\uee1e" +# define MFIZZ_SHELL "\uee1f" +# define MFIZZ_SITEFINITY "\uee20" +# define MFIZZ_SOLARIS "\uee21" +# define MFIZZ_SPLATTER "\uee22" +# define MFIZZ_SPRING "\uee23" +# define MFIZZ_SUSE "\uee24" +# define MFIZZ_SVG "\uee25" +# define MFIZZ_SYMFONY "\uee26" +# define MFIZZ_TOMCAT "\uee27" +# define MFIZZ_UBUNTU "\uee28" +# define MFIZZ_UNITY "\uee29" +# define MFIZZ_WIRELESS "\uee2a" +# define MFIZZ_WORDPRESS "\uee2b" +# define MFIZZ_X11 "\uee2c" +# define FIRACODE_ASTERISK "\uee2d" +# define FIRACODE_PLUS "\uee2e" +# define FIRACODE_HYPHEN "\uee2f" +# define FIRACODE_SAD "\uee30" +# define FIRACODE_W_W_W "\uee31" +# define FIRACODE_ASTERISK_ASTERISK "\uee32" +# define FIRACODE_ASTERISK_ASTERISK_ASTERISK "\uee33" +# define FIRACODE_ASTERISK_ASTERISK_SLASH "\uee34" +# define FIRACODE_ASTERISK_GREATER "\uee35" +# define FIRACODE_ASTERISK_SLASH "\uee36" +# define FIRACODE_BACKSLASH_BACKSLASH "\uee37" +# define FIRACODE_BBB "\uee38" +# define FIRACODE_BRACELEFT_HYPHEN "\uee39" +# define FIRACODE_BRACKETLEFT_BRACKETRIGHT "\uee3a" +# define FIRACODE_COLON_COLON "\uee3b" +# define FIRACODE_COLON_COLON_COLON "\uee3c" +# define FIRACODE_COLON_EQUAL "\uee3d" +# define FIRACODE_EXCLAM_EXCLAM "\uee3e" +# define FIRACODE_EXCLAM_EQUAL "\uee3f" +# define FIRACODE_EXCLAM_EQUAL_EQUAL "\uee40" +# define FIRACODE_HYPHEN_BRACERIGHT "\uee41" +# define FIRACODE_HYPHEN_HYPHEN "\uee42" +# define FIRACODE_HYPHEN_HYPHEN_HYPHEN "\uee43" +# define FIRACODE_HYPHEN_HYPHEN_GREATER "\uee44" +# define FIRACODE_HYPHEN_GREATER "\uee45" +# define FIRACODE_HYPHEN_GREATER_GREATER "\uee46" +# define FIRACODE_HYPHEN_LESS "\uee47" +# define FIRACODE_HYPHEN_LESS_LESS "\uee48" +# define FIRACODE_HYPHEN_ASCIITILDE "\uee49" +# define FIRACODE_NUMBERSIGN_BRACELEFT "\uee4a" +# define FIRACODE_NUMBERSIGN_BRACKETLEFT "\uee4b" +# define FIRACODE_NUMBERSIGN_NUMBERSIGN "\uee4c" +# define FIRACODE_NNN "\uee4d" +# define FIRACODE_NNNN "\uee4e" +# define FIRACODE_NUMBERSIGN_PARENLEFT "\uee4f" +# define FIRACODE_NUMBERSIGN_QUESTION "\uee50" +# define FIRACODE_NUMBERSIGN_UNDERSCORE "\uee51" +# define FIRACODE_NUP "\uee52" +# define FIRACODE_PERIOD_HYPHEN "\uee53" +# define FIRACODE_PERIOD_EQUAL "\uee54" +# define FIRACODE_PERIOD_PERIOD "\uee55" +# define FIRACODE_PERIOD_PERIOD_LESS "\uee56" +# define FIRACODE_PERIOD_PERIOD_PERIOD "\uee57" +# define FIRACODE_QUESTION_EQUAL "\uee58" +# define FIRACODE_QUESTION_QUESTION "\uee59" +# define FIRACODE_SEMICOLON_SEMICOLON "\uee5a" +# define FIRACODE_SLASH_ASTERISK "\uee5b" +# define FIRACODE_SLASH_ASTERISK_ASTERISK "\uee5c" +# define FIRACODE_SLASH_EQUAL "\uee5d" +# define FIRACODE_SLASH_EQUAL_EQUAL "\uee5e" +# define FIRACODE_SLASH_GREATER "\uee5f" +# define FIRACODE_SLASH_SLASH "\uee60" +# define FIRACODE_SLASH_SLASH_SLASH "\uee61" +# define FIRACODE_AMPERSAND_AMPERSAND "\uee62" +# define FIRACODE_BAR_BAR "\uee63" +# define FIRACODE_BAR_BAR_EQUAL "\uee64" +# define FIRACODE_BAR_EQUAL "\uee65" +# define FIRACODE_BAR_GREATER "\uee66" +# define FIRACODE_ASCIICIRCUM_EQUAL "\uee67" +# define FIRACODE_DOLLAR_GREATER "\uee68" +# define FIRACODE_PLUS_PLUS "\uee69" +# define FIRACODE_PLUS_PLUS_PLUS "\uee6a" +# define FIRACODE_PLUS_GREATER "\uee6b" +# define FIRACODE_EQUAL_COLON_EQUAL "\uee6c" +# define FIRACODE_EQUAL_EQUAL "\uee6d" +# define FIRACODE_EQUAL_EQUAL_EQUAL "\uee6e" +# define FIRACODE_EQUAL_EQUAL_GREATER "\uee6f" +# define FIRACODE_EQUAL_GREATER "\uee70" +# define FIRACODE_EQUAL_GREATER_GREATER "\uee71" +# define FIRACODE_EQUAL_LESS "\uee72" +# define FIRACODE_EQUAL_LESS_LESS "\uee73" +# define FIRACODE_EQUAL_SLASH_EQUAL "\uee74" +# define FIRACODE_GREATER_HYPHEN "\uee75" +# define FIRACODE_GREATER_EQUAL "\uee76" +# define FIRACODE_GREATER_EQUAL_GREATER "\uee77" +# define FIRACODE_GREATER_GREATER "\uee78" +# define FIRACODE_GREATER_GREATER_HYPHEN "\uee79" +# define FIRACODE_GREATER_GREATER_EQUAL "\uee7a" +# define FIRACODE_GREATER_GREATER_GREATER "\uee7b" +# define FIRACODE_LESS_ASTERISK "\uee7c" +# define FIRACODE_LESS_ASTERISK_GREATER "\uee7d" +# define FIRACODE_LESS_BAR "\uee7e" +# define FIRACODE_LESS_BAR_GREATER "\uee7f" +# define FIRACODE_LESS_DOLLAR "\uee80" +# define FIRACODE_LESS_DOLLAR_GREATER "\uee81" +# define FIRACODE_LESS_EXCLAM_HYPHEN_HYPHEN "\uee82" +# define FIRACODE_LESS_HYPHEN "\uee83" +# define FIRACODE_LESS_HYPHEN_HYPHEN "\uee84" +# define FIRACODE_LESS_HYPHEN_GREATER "\uee85" +# define FIRACODE_LESS_PLUS "\uee86" +# define FIRACODE_LESS_PLUS_GREATER "\uee87" +# define FIRACODE_LESS_EQUAL "\uee88" +# define FIRACODE_LESS_EQUAL_EQUAL "\uee89" +# define FIRACODE_LESS_EQUAL_GREATER "\uee8a" +# define FIRACODE_LESS_EQUAL_LESS "\uee8b" +# define FIRACODE_LESS_GREATER "\uee8c" +# define FIRACODE_LESS_LESS "\uee8d" +# define FIRACODE_LESS_LESS_HYPHEN "\uee8e" +# define FIRACODE_LESS_LESS_EQUAL "\uee8f" +# define FIRACODE_LESS_LESS_LESS "\uee90" +# define FIRACODE_LESS_ASCIITILDE "\uee91" +# define FIRACODE_LESS_ASCIITILDE_ASCIITILDE "\uee92" +# define FIRACODE_LESS_SLASH "\uee93" +# define FIRACODE_LESS_SLASH_GREATER "\uee94" +# define FIRACODE_ASCIITILDE_AT "\uee95" +# define FIRACODE_ASCIITILDE_HYPHEN "\uee96" +# define FIRACODE_ASCIITILDE_EQUAL "\uee97" +# define FIRACODE_ASCIITILDE_GREATER "\uee98" +# define FIRACODE_ASCIITILDE_ASCIITILDE "\uee99" +# define FIRACODE_AAG "\uee9a" +# define FIRACODE_PERCENT_PERCENT "\uee9b" +# define FIRACODE_X_MULTIPLY "\uee9c" +# define FIRACODE_COLON_UC "\uee9d" +# define FIRACODE_PLUS_LC "\uee9e" +# define FIRACODE_PLUS_TOSF2 "\uee9f" +# define FIRACODE_NAMEME_1114119 "\ueea0" + +#endif // ICONS_IN_TERMINAL + diff --git a/nnn-4.9/src/icons.h b/nnn-4.9/src/icons.h @@ -0,0 +1,445 @@ +#ifndef INCLUDE_ICONS_H +#define INCLUDE_ICONS_H + +#if defined(ICONS_GENERATE) || defined(ICONS_ENABLED) + +/* + * 1st arg = ICONS_IN_TERM + * + * 2nd arg = NERD ICONS + * You can find hex codes for nerd fonts here: https://www.nerdfonts.com/cheat-sheet + * + * 3rd arg = EMOJIS + * You can find a list of emoji here: https://unicode.org/Public/emoji/5.0/emoji-test.txt + * + * Any entry with empty icon gets removed by the hash-table generator + */ +#if defined(ICONS_IN_TERM) + #define ICON_STR(I, N, E) I + #include "icons-in-terminal.h" +#elif defined(NERD) + #define ICON_STR(I, N, E) N +#elif defined(EMOJI) + #define ICON_STR(I, N, E) E +#endif + +/* + * Define a string to be printed before and after the icon + * Adjust if the icons are not printed properly + */ +#if defined(EMOJI) + /* + * NOTE: As some emojis take up two cells, all of the emoji icons must + * be of width 2. Therefore, right pad single-width emoji with a space. + */ + #define ICON_SIZE 2 + #define ICON_PADDING_RIGHT " " +#else + #define ICON_SIZE 1 + #define ICON_PADDING_RIGHT " " +#endif +#define ICON_PADDING_LEFT "" +#define ICON_PADDING_LEFT_LEN (sizeof ICON_PADDING_LEFT - 1) +#define ICON_PADDING_RIGHT_LEN (sizeof ICON_PADDING_RIGHT - 1) + +/* ARROWS */ +#define ICON_ARROW_UP ICON_STR(MD_ARROW_UPWARD, "󰁝", "⬆") +#define ICON_ARROW_FORWARD ICON_STR(MD_ARROW_FORWARD, "󰁔", "➡") +#define ICON_ARROW_DOWN ICON_STR(MD_ARROW_DOWNWARD, "󰁅", "⬇") + +/* GENERIC */ +#define ICON_DIRECTORY ICON_STR(FA_FOLDER, "", "📂") +#define ICON_FILE ICON_STR(FA_FILE, "󰈔", "📃") +#define ICON_EXEC ICON_STR(FA_COG, "", "⚙️ ") + +/* Top level and common icons */ +#define ICON_ARCHIVE ICON_STR(FA_FILE_ARCHIVE_O, "󰀼", "📦") +#define ICON_BRIEFCASE ICON_STR(FA_BRIEFCASE, "󰃖", "💼") +#define ICON_C ICON_STR(MFIZZ_C, "", "🇨 ") +#define ICON_CHANGELOG ICON_STR(FA_HISTORY, "󰋚", "🔺") +#define ICON_CHESS ICON_STR("", "󰄺", "") +#define ICON_CLOJURE ICON_STR(MFIZZ_CLOJURE, "", "") +#define ICON_CONFIGURE ICON_STR(FILE_CONFIG, "", "🔧") +#define ICON_CPLUSPLUS ICON_STR(MFIZZ_CPLUSPLUS, "", ICON_C) +#define ICON_DATABASE ICON_STR(MFIZZ_DATABASE_ALT2, "󰆼", "🗃️ ") +#define ICON_DESKTOP ICON_STR(FA_DESKTOP, "󰟀", "🖥️ ") +#define ICON_DJVU ICON_STR(FA_PAPERCLIP, "", "📎") +#define ICON_DOCUMENT ICON_STR(FA_FILE_TEXT_O, "󰈙", "🗒 ") +#define ICON_DOWNLOADS ICON_STR(FA_DOWNLOAD, "󰃘", "📥") +#define ICON_ELIXIR ICON_STR(MFIZZ_ELIXIR, "", "💧") +#define ICON_ENCRYPT ICON_STR("", "󰌆", "🔒") +#define ICON_FSHARP ICON_STR(DEV_FSHARP, "", "") +#define ICON_FONT ICON_STR(FILE_FONT, "", "") +#define ICON_GIT ICON_STR(FA_GIT, "", "🌱") +#define ICON_HASKELL ICON_STR("", "", "") +#define ICON_HTML ICON_STR(FA_FILE_CODE_O, "󰌝", "") +#define ICON_JAVA ICON_STR(MFIZZ_JAVA, "", "☕") +#define ICON_JAVASCRIPT ICON_STR(FA_FILE_CODE_O, "󰌞", "") +#define ICON_LICENSE ICON_STR(FA_COPYRIGHT, "󰈙", "⚖️ ") +#define ICON_LINUX ICON_STR(FA_LINUX, "󰌽", "🐧") +#define ICON_MAKEFILE ICON_STR(FILE_CMAKE, "󰆍", "🛠 ") +#define ICON_MANUAL ICON_STR(FILE_MANPAGE, "󱓷", "❓") +#define ICON_MS_EXCEL ICON_STR(FILE_EXCEL, "󰈛", ICON_WORDDOC) +#define ICON_MUSIC ICON_STR(FA_MUSIC, "󱍙", "🎧") +#define ICON_MUSICFILE ICON_STR(FA_FILE_AUDIO_O, "󰎈", ICON_MUSIC) +#define ICON_OPTICALDISK ICON_STR(LINEA_MUSIC_CD, "", "💿") +#define ICON_PDF ICON_STR(FA_FILE_PDF_O, "󰈦", "📕") +#define ICON_PHOTOSHOP ICON_STR(DEV_PHOTOSHOP, "", ICON_PICTUREFILE) +#define ICON_PICTUREFILE ICON_STR(FA_FILE_IMAGE_O, "󰈟", ICON_PICTURES) +#define ICON_PICTURES ICON_STR(MD_CAMERA_ALT, "󰉔", "🎨") +#define ICON_PLAYLIST ICON_STR(ICON_MUSICFILE, "󱍙", "") +#define ICON_POWERPOINT ICON_STR(FILE_POWERPOINT, "󰈧", "📊") +#define ICON_PUBLIC ICON_STR(FA_INBOX, "", "👀") +#define ICON_PYTHON ICON_STR(MFIZZ_PYTHON, "", "🐍") +#define ICON_REACT ICON_STR(FILE_JSX, "", ICON_JAVASCRIPT) +#define ICON_RUBY ICON_STR(MFIZZ_RUBY, "", "💎") +#define ICON_RUST ICON_STR(DEV_RUST, "", "") +#define ICON_SASS ICON_STR("", "", "") +#define ICON_SCRIPT ICON_STR(MFIZZ_SCRIPT, "", "📜") +#define ICON_SUBTITLE ICON_STR(FA_COMMENTS_O, "󰅺", "💬") +#define ICON_TEMPLATES ICON_STR(FA_PAPERCLIP, "󰗇", "📎") +#define ICON_TEX ICON_STR(FILE_TEX, "󰙩", ICON_DOCUMENT) +#define ICON_VIDEOFILE ICON_STR(FA_FILE_MOVIE_O, "󰈫", ICON_VIDEOS) +#define ICON_VIDEOS ICON_STR(FA_FILM, "󰈰", "🎞 ") +#define ICON_VIM ICON_STR(DEV_VIM, "", "") +#define ICON_WORDDOC ICON_STR(FILE_WORD, "󰈬", "📘") + +#define ICON_EXT_ASM ICON_STR(FILE_NASM, "", "") +#define ICON_EXT_BIN ICON_STR(OCT_FILE_BINARY, "", "📓") +#define ICON_EXT_COFFEE ICON_STR(MFIZZ_COFFEE_BEAN, "", "") +#define ICON_EXT_CSS ICON_STR(MFIZZ_CSS3, "", "🦋") +#define ICON_EXT_DEB ICON_STR(MFIZZ_DEBIAN, "", ICON_LINUX) +#define ICON_EXT_DIFF ICON_STR(FILE_DIFF, "", "📋") +#define ICON_EXT_GO ICON_STR(MFIZZ_GO, "󰟓", "") +#define ICON_EXT_JSON ICON_STR(ICON_JAVASCRIPT, "", ICON_JAVASCRIPT) +#define ICON_EXT_LUA ICON_STR(FILE_LUA, "", "🌘") +#define ICON_EXT_M ICON_STR("", "󰠞", "📊") +#define ICON_EXT_MAT ICON_STR("", "", "") +#define ICON_EXT_MD ICON_STR(DEV_MARKDOWN, "", "📝") +#define ICON_EXT_MSI ICON_STR(FA_WINDOWS, "󰍲", "🪟") +#define ICON_EXT_NIX ICON_STR("", "", "") +#define ICON_EXT_PATCH ICON_STR(FILE_PATCH, "", "🩹") +#define ICON_EXT_PHP ICON_STR(MFIZZ_PHP, "", "🌐") +#define ICON_EXT_ROM ICON_STR(FA_LOCK, "󰊖", "") +#define ICON_EXT_RSS ICON_STR(FA_RSS_SQUARE, "", "📡") +#define ICON_EXT_RTF ICON_STR(ICON_PDF, "󰈦", ICON_PDF) +#define ICON_EXT_SCALA ICON_STR(MFIZZ_SCALA, "", "") +#define ICON_EXT_SLN ICON_STR(DEV_VISUALSTUDIO, "", "") +#define ICON_EXT_TS ICON_STR(FILE_TS, "", "") + + +/* + * Hex xterm 256 color code, 0 to follow file specific (if any) + * Codes: https://jonasjacek.github.io/colors/ + * Spectrum sorted: https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg + * Color names: https://www.ditig.com/256-colors-cheat-sheet + */ +#define COLOR_LIST \ + COLOR_X(COLOR_VIDEO, 45) /* Turquoise2 */ \ + COLOR_X(COLOR_VIDEO1, 226) /* Yellow1 */ \ + COLOR_X(COLOR_AUDIO, 220) /* Gold1 */ \ + COLOR_X(COLOR_AUDIO1, 205) /* HotPink */ \ + COLOR_X(COLOR_IMAGE, 82) /* Chartreuse2 */ \ + COLOR_X(COLOR_DOCS, 202) /* OrangeRed1 */ \ + COLOR_X(COLOR_ARCHIVE, 209) /* Salmon1 */ \ + COLOR_X(COLOR_C, 81) /* SteelBlue1 */ \ + COLOR_X(COLOR_JAVA, 32) /* DeepSkyBlue3 */ \ + COLOR_X(COLOR_JAVASCRIPT, 47) /* SpringGreen2 */ \ + COLOR_X(COLOR_REACT, 39) /* DeepSkyBlue1 */ \ + COLOR_X(COLOR_CSS, 199) /* DeepPink1 */ \ + COLOR_X(COLOR_PYTHON, 227) /* LightGoldenrod1 */ \ + COLOR_X(COLOR_LUA, 19) /* Blue3 */ \ + COLOR_X(COLOR_DOCUMENT, 15) /* White */ \ + COLOR_X(COLOR_FSHARP, 31) /* DeepSkyBlue3 */ \ + COLOR_X(COLOR_RUBY, 160) /* Red3 */ \ + COLOR_X(COLOR_SCALA, 196) /* Red1 */ \ + COLOR_X(COLOR_SHELL, 47) /* SpringGreen2 */ \ + COLOR_X(COLOR_VIM, 28) /* Green4 */ \ + COLOR_X(COLOR_ELIXIR, 104) /* MediumPurple */ \ + +/* X-Macro: https://en.wikipedia.org/wiki/X_Macro */ +#define COLOR_X(N, V) N = (V), +enum { COLOR_LIST }; +#undef COLOR_X +#define COLOR_X(N, V) N, +static const unsigned char init_colors[] = { COLOR_LIST }; +#undef COLOR_X + +#ifdef ICONS_GENERATE + /* temporary struct using `char *`. the hash-table generator will + * output a more optimized version which uses `char[]` instead reducing + * indirection and the total binary size. + */ + struct icon_pair { const char *match; const char *icon; unsigned char color; }; +#endif + +struct icon { const char *icon; unsigned char color; }; + +static const struct icon dir_icon = {ICON_DIRECTORY, 0}; +static const struct icon file_icon = {ICON_FILE, 0}; +static const struct icon exec_icon = {ICON_EXEC, 0}; + +static const struct icon_pair icons_name[] = { + {".git", ICON_GIT, 0}, + {"Desktop", ICON_DESKTOP, 0}, + {"Documents", ICON_BRIEFCASE, 0}, + {"Downloads", ICON_DOWNLOADS, 0}, + {"Music", ICON_MUSIC, 0}, + {"Pictures", ICON_PICTURES, 0}, + {"Public", ICON_PUBLIC, 0}, + {"Templates", ICON_TEMPLATES, 0}, + {"Videos", ICON_VIDEOS, 0}, + {"CHANGELOG", ICON_CHANGELOG, COLOR_DOCS}, + {"configure", ICON_CONFIGURE, 0}, + {"License", ICON_LICENSE, COLOR_DOCS}, + {"Makefile", ICON_MAKEFILE, 0}, +}; + +#ifdef ICONS_GENERATE +/* + * The goal here is to provide a small set of default values. We don't try to + * provide icons for everything under the sun because keeping a _huge_ table of + * icons would: increase binary size, increase memory usage, decrease performance. + * + * Users are free to customize this *locally* as they see fit. Only open a + * pull-request if you think your changes are aligned with the goal described + * above. + */ + +static const struct icon_pair icons_ext[] = { /* All entries are case-insensitive */ + /* Numbers */ + {"1", ICON_MANUAL, COLOR_DOCS}, + {"7z", ICON_ARCHIVE, COLOR_ARCHIVE}, + + /* A */ + {"a", ICON_MANUAL, 0}, + {"apk", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"asm", ICON_EXT_ASM, 0}, + {"aup", ICON_MUSICFILE, COLOR_AUDIO}, + {"avi", ICON_VIDEOFILE, COLOR_VIDEO}, + + /* B */ + {"bat", ICON_SCRIPT, 0}, + {"bib", ICON_TEX, 0}, + {"bin", ICON_EXT_BIN, 0}, + {"bmp", ICON_PICTUREFILE, COLOR_IMAGE}, + {"bz2", ICON_ARCHIVE, COLOR_ARCHIVE}, + + /* C */ + {"c", ICON_C, COLOR_C}, + {"c++", ICON_CPLUSPLUS, COLOR_C}, + {"cabal", ICON_HASKELL, COLOR_VIDEO}, + {"cab", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"cbr", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"cbz", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"cc", ICON_CPLUSPLUS, COLOR_C}, + {"class", ICON_JAVA, COLOR_JAVA}, + {"clj", ICON_CLOJURE, 0}, + {"cljc", ICON_CLOJURE, 0}, + {"cljs", ICON_CLOJURE, 0}, + {"cls", ICON_TEX, 0}, + {"cmake", ICON_MAKEFILE, 0}, + {"coffee", ICON_EXT_COFFEE, 0}, + {"conf", ICON_CONFIGURE, 0}, + {"cpio", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"cpp", ICON_CPLUSPLUS, COLOR_C}, + {"css", ICON_EXT_CSS, COLOR_CSS}, + {"cue", ICON_PLAYLIST, COLOR_AUDIO}, + {"cvs", ICON_CONFIGURE, 0}, + {"cxx", ICON_CPLUSPLUS, COLOR_C}, + + /* D */ + {"db", ICON_DATABASE, 0}, + {"deb", ICON_EXT_DEB, COLOR_ARCHIVE}, + {"diff", ICON_EXT_DIFF, 0}, + {"dll", ICON_SCRIPT, 0}, + {"djvu", ICON_DJVU, COLOR_DOCS}, + {"doc", ICON_WORDDOC, COLOR_DOCUMENT}, + {"docx", ICON_WORDDOC, COLOR_DOCUMENT}, + + /* E */ + {"ejs", ICON_JAVASCRIPT, COLOR_JAVASCRIPT}, + {"elf", ICON_LINUX, 0}, + {"epub", ICON_PDF, COLOR_DOCS}, + {"exe", ICON_EXEC, 0}, + {"ex", ICON_ELIXIR, COLOR_ELIXIR}, + {"eex", ICON_ELIXIR, COLOR_ELIXIR}, + {"exs", ICON_ELIXIR, COLOR_ELIXIR}, + + /* F */ + {"f#", ICON_FSHARP, COLOR_FSHARP}, + {"fen", ICON_CHESS, 0}, + {"flac", ICON_MUSICFILE, COLOR_AUDIO1}, + {"flv", ICON_VIDEOFILE, COLOR_VIDEO}, + {"fs", ICON_FSHARP, COLOR_FSHARP}, + {"fsi", ICON_FSHARP, COLOR_FSHARP}, + {"fsscript", ICON_FSHARP, COLOR_FSHARP}, + {"fsx", ICON_FSHARP, COLOR_FSHARP}, + + /* G */ + {"gem", ICON_RUBY, COLOR_RUBY}, + {"gif", ICON_PICTUREFILE, COLOR_IMAGE}, + {"go", ICON_EXT_GO, COLOR_C}, + {"gpg", ICON_ENCRYPT, COLOR_ARCHIVE}, + {"gz", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"gzip", ICON_ARCHIVE, COLOR_ARCHIVE}, + + /* H */ + {"h", ICON_C, COLOR_C}, + {"hh", ICON_CPLUSPLUS, COLOR_C}, + {"hpp", ICON_CPLUSPLUS, COLOR_C}, + {"hs", ICON_HASKELL, COLOR_ELIXIR}, + {"htaccess", ICON_CONFIGURE, 0}, + {"htpasswd", ICON_CONFIGURE, 0}, + {"htm", ICON_HTML, 0}, + {"html", ICON_HTML, 0}, + {"hxx", ICON_CPLUSPLUS, COLOR_C}, + {"heex", ICON_ELIXIR, COLOR_ELIXIR}, + + /* I */ + {"ico", ICON_PICTUREFILE, COLOR_IMAGE}, + {"ini", ICON_CONFIGURE, 0}, + {"img", ICON_OPTICALDISK, COLOR_ARCHIVE}, + {"iso", ICON_OPTICALDISK, COLOR_ARCHIVE}, + + /* J */ + {"jar", ICON_JAVA, COLOR_JAVA}, + {"java", ICON_JAVA, COLOR_JAVA}, + {"jl", ICON_CONFIGURE, 0}, + {"jpeg", ICON_PICTUREFILE, COLOR_IMAGE}, + {"jpg", ICON_PICTUREFILE, COLOR_IMAGE}, + {"js", ICON_JAVASCRIPT, COLOR_JAVASCRIPT}, + {"json", ICON_EXT_JSON, COLOR_JAVASCRIPT}, + {"jsx", ICON_REACT, COLOR_REACT}, + {"jxl", ICON_PICTUREFILE, COLOR_IMAGE}, + + /* K */ + {"ksh", ICON_SCRIPT, COLOR_SHELL}, + + /* L */ + {"lha", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"lhs", ICON_HASKELL, COLOR_VIM}, + {"log", ICON_DOCUMENT, 0}, + {"lua", ICON_EXT_LUA, COLOR_LUA}, + {"lzh", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"lzma", ICON_ARCHIVE, COLOR_ARCHIVE}, + + /* M */ + {"m", ICON_EXT_M, COLOR_C}, + {"m4a", ICON_MUSICFILE, COLOR_AUDIO}, + {"m4v", ICON_VIDEOFILE, COLOR_VIDEO}, + {"markdown", ICON_EXT_MD, COLOR_DOCS}, + {"mat", ICON_EXT_MAT, COLOR_C}, + {"md", ICON_EXT_MD, COLOR_DOCS}, + {"mk", ICON_MAKEFILE, 0}, + {"mkv", ICON_VIDEOFILE, COLOR_VIDEO}, + {"mov", ICON_VIDEOFILE, COLOR_VIDEO}, + {"mp3", ICON_MUSICFILE, COLOR_AUDIO}, + {"mp4", ICON_VIDEOFILE, COLOR_VIDEO1}, + {"mpeg", ICON_VIDEOFILE, COLOR_VIDEO}, + {"mpg", ICON_VIDEOFILE, COLOR_VIDEO}, + {"msi", ICON_EXT_MSI, 0}, + + /* N */ + {"nix", ICON_EXT_NIX, COLOR_FSHARP}, + + /* O */ + {"o", ICON_MANUAL, 0}, + {"ogg", ICON_MUSICFILE, COLOR_AUDIO}, + {"opus", ICON_MUSICFILE, COLOR_AUDIO}, + {"opdownload", ICON_DOWNLOADS, 0}, + {"otf", ICON_FONT, 0}, + {"out", ICON_LINUX, 0}, + + /* P */ + {"part", ICON_DOWNLOADS, 0}, + {"patch", ICON_EXT_PATCH, 0}, + {"pdf", ICON_PDF, COLOR_DOCS}, + {"pgn", ICON_CHESS, 0}, + {"php", ICON_EXT_PHP, 0}, + {"png", ICON_PICTUREFILE, COLOR_IMAGE}, + {"ppt", ICON_POWERPOINT, 0}, + {"pptx", ICON_POWERPOINT, 0}, + {"psb", ICON_PHOTOSHOP, 0}, + {"psd", ICON_PHOTOSHOP, 0}, + {"py", ICON_PYTHON, COLOR_PYTHON}, + {"pyc", ICON_PYTHON, COLOR_PYTHON}, + {"pyd", ICON_PYTHON, COLOR_PYTHON}, + {"pyo", ICON_PYTHON, COLOR_PYTHON}, + + /* Q */ + + /* R */ + {"rar", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"rb", ICON_RUBY, COLOR_RUBY}, + {"rc", ICON_CONFIGURE, 0}, + {"rom", ICON_EXT_ROM, 0}, + {"rpm", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"rs", ICON_RUST, COLOR_DOCS}, + {"rss", ICON_EXT_RSS, 0}, + {"rtf", ICON_EXT_RTF, 0}, + + /* S */ + {"sass", ICON_SASS, COLOR_CSS}, + {"scss", ICON_SASS, COLOR_CSS}, + {"so", ICON_MANUAL, 0}, + {"scala", ICON_EXT_SCALA, COLOR_SCALA}, + {"sh", ICON_SCRIPT, COLOR_SHELL}, + {"slim", ICON_SCRIPT, COLOR_DOCUMENT}, + {"sln", ICON_EXT_SLN, 0}, + {"sql", ICON_DATABASE, 0}, + {"srt", ICON_SUBTITLE, 0}, + {"sty", ICON_TEX, 0}, + {"sub", ICON_SUBTITLE, 0}, + {"svg", ICON_PICTUREFILE, COLOR_IMAGE}, + + /* T */ + {"tar", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"tex", ICON_TEX, 0}, + {"tgz", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"ts", ICON_EXT_TS, COLOR_JAVASCRIPT}, + {"tsx", ICON_REACT, COLOR_REACT}, + {"txt", ICON_DOCUMENT, COLOR_DOCUMENT}, + {"txz", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"ttf", ICON_FONT, 0}, + + /* U */ + + /* V */ + {"vid", ICON_VIDEOFILE, COLOR_VIDEO}, + {"vim", ICON_VIM, COLOR_VIM}, + {"vimrc", ICON_VIM, COLOR_VIM}, + {"vtt", ICON_SUBTITLE, 0}, + + /* W */ + {"wav", ICON_MUSICFILE, COLOR_AUDIO}, + {"webm", ICON_VIDEOFILE, COLOR_VIDEO}, + {"webp", ICON_PICTUREFILE, COLOR_IMAGE}, + {"wma", ICON_VIDEOFILE, COLOR_AUDIO}, + {"wmv", ICON_VIDEOFILE, COLOR_VIDEO}, + + /* X */ + {"xbps", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"xcf", ICON_PICTUREFILE, COLOR_IMAGE}, + {"xhtml", ICON_HTML, 0}, + {"xls", ICON_MS_EXCEL, 0}, + {"xlsx", ICON_MS_EXCEL, 0}, + {"xml", ICON_HTML, 0}, + {"xz", ICON_ARCHIVE, COLOR_ARCHIVE}, + + /* Y */ + {"yaml", ICON_CONFIGURE, COLOR_DOCUMENT}, + {"yml", ICON_CONFIGURE, COLOR_DOCUMENT}, + + /* Z */ + {"zip", ICON_ARCHIVE, COLOR_ARCHIVE}, + {"zsh", ICON_SCRIPT, COLOR_SHELL}, + {"zst", ICON_ARCHIVE, COLOR_ARCHIVE}, + + /* Other */ +}; +#endif + +#endif /* defined(ICONS_GENERATE) || defined(ICONS_ENABLED) */ + +#endif /* INCLUDE_ICONS_H */ diff --git a/nnn-4.9/src/nnn.c b/nnn-4.9/src/nnn.c @@ -0,0 +1,9020 @@ +/* + * BSD 2-Clause License + * + * Copyright (C) 2014-2016, Lazaros Koromilas <lostd@2f30.org> + * Copyright (C) 2014-2016, Dimitris Papastamos <sin@2f30.org> + * Copyright (C) 2016-2023, Arun Prakash Jana <engineerarun@gmail.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define _FILE_OFFSET_BITS 64 /* Support large files on 32-bit glibc */ + +#if defined(__linux__) || defined(MINGW) || defined(__MINGW32__) \ + || defined(__MINGW64__) || defined(__CYGWIN__) +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#if defined(__linux__) +#include <sys/inotify.h> +#define LINUX_INOTIFY +#endif +#if !defined(__GLIBC__) +#include <sys/types.h> +#endif +#endif +#include <sys/resource.h> +#include <sys/stat.h> +#include <sys/statvfs.h> +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) +#include <sys/types.h> +#include <sys/event.h> +#include <sys/time.h> +#define BSD_KQUEUE +#elif defined(__HAIKU__) +#include "../misc/haiku/haiku_interop.h" +#define HAIKU_NM +#else +#include <sys/sysmacros.h> +#endif +#include <sys/wait.h> + +#ifdef __linux__ /* Fix failure due to mvaddnwstr() */ +#ifndef NCURSES_WIDECHAR +#define NCURSES_WIDECHAR 1 +#endif +#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \ + || defined(__APPLE__) || defined(__sun) +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#endif +#ifndef __USE_XOPEN /* Fix wcswidth() failure, ncursesw/curses.h includes whcar.h on Ubuntu 14.04 */ +#define __USE_XOPEN +#endif +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> +#include <fts.h> +#include <libgen.h> +#include <limits.h> +#ifndef NOLC +#include <locale.h> +#endif +#include <pthread.h> +#include <stdio.h> +#ifndef NORL +#include <readline/history.h> +#include <readline/readline.h> +#endif +#ifdef PCRE +#include <pcre.h> +#else +#include <regex.h> +#endif +#include <signal.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include <time.h> +#include <unistd.h> +#include <stddef.h> +#include <stdalign.h> +#ifndef __USE_XOPEN_EXTENDED +#define __USE_XOPEN_EXTENDED 1 +#endif +#include <ftw.h> +#include <pwd.h> +#include <grp.h> + +#ifdef MACOS_BELOW_1012 +#include "../misc/macos-legacy/mach_gettime.h" +#endif + +#if !defined(alloca) && defined(__GNUC__) +/* + * GCC doesn't expand alloca() to __builtin_alloca() in standards mode + * (-std=...) and not all standard libraries do or supply it, e.g. + * NetBSD/arm64 so explicitly use the builtin. + */ +#define alloca(size) __builtin_alloca(size) +#endif + +#include "nnn.h" +#include "dbg.h" + +#if defined(ICONS_IN_TERM) || defined(NERD) || defined(EMOJI) +#define ICONS_ENABLED +#include ICONS_INCLUDE +#include "icons-hash.c" +#include "icons.h" +#endif + +#if defined(ICONS_ENABLED) && defined(__APPLE__) +/* + * For some reason, wcswidth returns 2 for certain icons on macOS + * leading to duplicated first characters in filenames when navigating. + * https://github.com/jarun/nnn/issues/1692 + * There might be a better way to fix it without requiring a refresh. + */ +#define macos_icons_hack() do { clrtoeol(); refresh(); } while(0) +#else +#define macos_icons_hack() +#endif + +#ifdef TOURBIN_QSORT +#include "qsort.h" +#endif + +/* Macro definitions */ +#define VERSION "4.9" +#define GENERAL_INFO "BSD 2-Clause\nhttps://github.com/jarun/nnn" + +#ifndef NOSSN +#define SESSIONS_VERSION 1 +#endif + +#ifndef S_BLKSIZE +#define S_BLKSIZE 512 /* S_BLKSIZE is missing on Android NDK (Termux) */ +#endif + +/* + * NAME_MAX and PATH_MAX may not exist, e.g. with dirent.c_name being a + * flexible array on Illumos. Use somewhat accommodating fallback values. + */ +#ifndef NAME_MAX +#define NAME_MAX 255 +#endif + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif + +#define _ABSSUB(N, M) (((N) <= (M)) ? ((M) - (N)) : ((N) - (M))) +#define ELEMENTS(x) (sizeof(x) / sizeof(*(x))) +#undef MIN +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#undef MAX +#define MAX(x, y) ((x) > (y) ? (x) : (y)) +#define ISODD(x) ((x) & 1) +#define ISBLANK(x) ((x) == ' ' || (x) == '\t') +#define TOUPPER(ch) (((ch) >= 'a' && (ch) <= 'z') ? ((ch) - 'a' + 'A') : (ch)) +#define TOLOWER(ch) (((ch) >= 'A' && (ch) <= 'Z') ? ((ch) - 'A' + 'a') : (ch)) +#define ISUPPER_(ch) ((ch) >= 'A' && (ch) <= 'Z') +#define ISLOWER_(ch) ((ch) >= 'a' && (ch) <= 'z') +#define CMD_LEN_MAX (PATH_MAX + ((NAME_MAX + 1) << 1)) +#define ALIGN_UP(x, A) ((((x) + (A) - 1) / (A)) * (A)) +#define READLINE_MAX 256 +#define FILTER '/' +#define RFILTER '\\' +#define CASE ':' +#define MSGWAIT '$' +#define SELECT ' ' +#define PROMPT ">>> " +#define REGEX_MAX 48 +#define ENTRY_INCR 64 /* Number of dir 'entry' structures to allocate per shot */ +#define NAMEBUF_INCR 0x800 /* 64 dir entries at once, avg. 32 chars per file name = 64*32B = 2KB */ +#define DESCRIPTOR_LEN 32 +#define _ALIGNMENT 0x10 /* 16-byte alignment */ +#define _ALIGNMENT_MASK 0xF +#define TMP_LEN_MAX 64 +#define DOT_FILTER_LEN 7 +#define ASCII_MAX 128 +#define EXEC_ARGS_MAX 10 +#define LIST_FILES_MAX (1 << 14) /* Support listing 16K files */ +#define LIST_INPUT_MAX ((size_t)LIST_FILES_MAX * PATH_MAX) +#define SCROLLOFF 3 +#define COLOR_256 256 +#define CREATE_NEW_KEY (-1) + +/* Time intervals */ +#define DBLCLK_INTERVAL_NS (400000000) +#define XDELAY_INTERVAL_MS (350000) /* 350 ms delay */ + +#ifndef CTX8 +#define CTX_MAX 4 +#else +#define CTX_MAX 8 +#endif + +#ifndef SED +/* BSDs or Solaris or SunOS */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) || defined(sun) || defined(__sun) +#define SED "gsed" +#else +#define SED "sed" +#endif +#endif + +/* Large selection threshold */ +#ifndef LARGESEL +#define LARGESEL 1000 +#endif + +#define MIN_DISPLAY_COL (CTX_MAX * 2) +#define ARCHIVE_CMD_LEN 16 +#define BLK_SHIFT_512 9 + +/* Detect hardlinks in du */ +#define HASH_BITS (0xFFFFFF) +#define HASH_OCTETS (HASH_BITS >> 6) /* 2^6 = 64 */ + +/* Entry flags */ +#define DIR_OR_DIRLNK 0x01 +#define HARD_LINK 0x02 +#define SYM_ORPHAN 0x04 +#define FILE_MISSING 0x08 +#define FILE_SELECTED 0x10 +#define FILE_SCANNED 0x20 +#define FILE_YOUNG 0x40 + +/* Macros to define process spawn behaviour as flags */ +#define F_NONE 0x00 /* no flag set */ +#define F_MULTI 0x01 /* first arg can be combination of args; to be used with F_NORMAL */ +#define F_NOWAIT 0x02 /* don't wait for child process (e.g. file manager) */ +#define F_NOTRACE 0x04 /* suppress stdout and stderr (no traces) */ +#define F_NORMAL 0x08 /* spawn child process in non-curses regular CLI mode */ +#define F_CONFIRM 0x10 /* run command - show results before exit (must have F_NORMAL) */ +#define F_CHKRTN 0x20 /* wait for user prompt if cmd returns failure status */ +#define F_NOSTDIN 0x40 /* suppress stdin */ +#define F_PAGE 0x80 /* page output in run-cmd-as-plugin mode */ +#define F_TTY 0x100 /* Force stdout to go to tty if redirected to a non-tty */ +#define F_CLI (F_NORMAL | F_MULTI) +#define F_SILENT (F_CLI | F_NOTRACE) + +/* Version compare macros */ +/* + * states: S_N: normal, S_I: comparing integral part, S_F: comparing + * fractional parts, S_Z: idem but with leading Zeroes only + */ +#define S_N 0x0 +#define S_I 0x3 +#define S_F 0x6 +#define S_Z 0x9 + +/* result_type: VCMP: return diff; VLEN: compare using len_diff/diff */ +#define VCMP 2 +#define VLEN 3 + +/* Volume info */ +#define VFS_AVAIL 0 +#define VFS_USED 1 +#define VFS_SIZE 2 + +/* TYPE DEFINITIONS */ +typedef unsigned int uint_t; +typedef unsigned char uchar_t; +typedef unsigned short ushort_t; +typedef unsigned long long ullong_t; + +/* STRUCTURES */ + +/* Directory entry */ +typedef struct entry { + char *name; /* 8 bytes */ + time_t sec; /* 8 bytes */ + uint_t nsec; /* 4 bytes (enough to store nanosec) */ + mode_t mode; /* 4 bytes */ + off_t size; /* 8 bytes */ + struct { + ullong_t blocks : 40; /* 5 bytes (enough for 512 TiB in 512B blocks allocated) */ + ullong_t nlen : 16; /* 2 bytes (length of file name) */ + ullong_t flags : 8; /* 1 byte (flags specific to the file) */ + }; +#ifndef NOUG + uid_t uid; /* 4 bytes */ + gid_t gid; /* 4 bytes */ +#endif +} *pEntry; + +/* Selection marker */ +typedef struct { + char *startpos; + size_t len; +} selmark; + +/* Key-value pairs from env */ +typedef struct { + int key; + int off; +} kv; + +typedef struct { +#ifdef PCRE + const pcre *pcrex; +#else + const regex_t *regex; +#endif + const char *str; +} fltrexp_t; + +/* + * Settings + */ +typedef struct { + uint_t filtermode : 1; /* Set to enter filter mode */ + uint_t timeorder : 1; /* Set to sort by time */ + uint_t sizeorder : 1; /* Set to sort by file size */ + uint_t apparentsz : 1; /* Set to sort by apparent size (disk usage) */ + uint_t blkorder : 1; /* Set to sort by blocks used (disk usage) */ + uint_t extnorder : 1; /* Order by extension */ + uint_t showhidden : 1; /* Set to show hidden files */ + uint_t reserved0 : 1; + uint_t showdetail : 1; /* Clear to show lesser file info */ + uint_t ctxactive : 1; /* Context active or not */ + uint_t reverse : 1; /* Reverse sort */ + uint_t version : 1; /* Version sort */ + uint_t reserved1 : 1; + /* The following settings are global */ + uint_t curctx : 3; /* Current context number */ + uint_t prefersel : 1; /* Prefer selection over current, if exists */ + uint_t fileinfo : 1; /* Show file information on hover */ + uint_t nonavopen : 1; /* Open file on right arrow or `l` */ + uint_t autoenter : 1; /* auto-enter dir in type-to-nav mode */ + uint_t reserved2 : 1; + uint_t useeditor : 1; /* Use VISUAL to open text files */ + uint_t reserved3 : 3; + uint_t regex : 1; /* Use regex filters */ + uint_t x11 : 1; /* Copy to system clipboard, show notis, xterm title */ + uint_t timetype : 2; /* Time sort type (0: access, 1: change, 2: modification) */ + uint_t cliopener : 1; /* All-CLI app opener */ + uint_t waitedit : 1; /* For ops that can't be detached, used EDITOR */ + uint_t rollover : 1; /* Roll over at edges */ +} settings; + +/* Non-persistent program-internal states (alphabeical order) */ +typedef struct { + uint_t autofifo : 1; /* Auto-create NNN_FIFO */ + uint_t autonext : 1; /* Auto-advance on file open */ + uint_t dircolor : 1; /* Current status of dir color */ + uint_t dirctx : 1; /* Show dirs in context color */ + uint_t duinit : 1; /* Initialize disk usage */ + uint_t fifomode : 1; /* FIFO notify mode: 0: preview, 1: explorer */ + uint_t forcequit : 1; /* Do not prompt on quit */ + uint_t initfile : 1; /* Positional arg is a file */ + uint_t interrupt : 1; /* Program received an interrupt */ + uint_t move : 1; /* Move operation */ + uint_t oldcolor : 1; /* Use older colorscheme */ + uint_t picked : 1; /* Plugin has picked files */ + uint_t picker : 1; /* Write selection to user-specified file */ + uint_t pluginit : 1; /* Plugin framework initialized */ + uint_t prstssn : 1; /* Persistent session */ + uint_t rangesel : 1; /* Range selection on */ + uint_t runctx : 3; /* The context in which plugin is to be run */ + uint_t runplugin : 1; /* Choose plugin mode */ + uint_t selbm : 1; /* Select a bookmark from bookmarks directory */ + uint_t selmode : 1; /* Set when selecting files */ + uint_t stayonsel : 1; /* Disable auto-advance on selection */ + uint_t trash : 2; /* Trash method 0: rm -rf, 1: trash-cli, 2: gio trash */ + uint_t uidgid : 1; /* Show owner and group info */ + uint_t usebsdtar : 1; /* Use bsdtar as default archive utility */ + uint_t reserved : 5; /* Adjust when adding/removing a field */ +} runstate; + +/* Contexts or workspaces */ +typedef struct { + char c_path[PATH_MAX]; /* Current dir */ + char c_last[PATH_MAX]; /* Last visited dir */ + char c_name[NAME_MAX + 1]; /* Current file name */ + char c_fltr[REGEX_MAX]; /* Current filter */ + settings c_cfg; /* Current configuration */ + uint_t color; /* Color code for directories */ +} context; + +#ifndef NOSSN +typedef struct { + size_t ver; + size_t pathln[CTX_MAX]; + size_t lastln[CTX_MAX]; + size_t nameln[CTX_MAX]; + size_t fltrln[CTX_MAX]; +} session_header_t; +#endif + +/* GLOBALS */ + +/* Configuration, contexts */ +static settings cfg = { + .ctxactive = 1, + .autoenter = 1, + .timetype = 2, /* T_MOD */ + .rollover = 1, +}; + +alignas(max_align_t) static context g_ctx[CTX_MAX]; + +static int ndents, cur, last, curscroll, last_curscroll, total_dents = ENTRY_INCR, scroll_lines = 1; +static int nselected; +#ifndef NOFIFO +static int fifofd = -1; +#endif +static time_t gtimesecs; +static uint_t idletimeout, selbufpos, selbuflen; +static ushort_t xlines, xcols; +static ushort_t idle; +static uchar_t maxbm, maxplug, maxorder; +static uchar_t cfgsort[CTX_MAX + 1]; +static char *bmstr; +static char *pluginstr; +static char *orderstr; +static char *opener; +static char *editor; +static char *enveditor; +static char *pager; +static char *shell; +static char *home; +static char *initpath; +static char *cfgpath; +static char *selpath; +static char *listpath; +static char *listroot; +static char *plgpath; +static char *pnamebuf, *pselbuf, *findselpos; +static char *mark; +#ifndef NOX11 +static char hostname[_POSIX_HOST_NAME_MAX + 1]; +#endif +#ifndef NOFIFO +static char *fifopath; +#endif +static char *lastcmd; +static ullong_t *ihashbmp; +static struct entry *pdents; +static blkcnt_t dir_blocks; +static kv *bookmark; +static kv *plug; +static kv *order; +static uchar_t tmpfplen, homelen; +static uchar_t blk_shift = BLK_SHIFT_512; +#ifndef NOMOUSE +static int middle_click_key; +#endif +#ifdef PCRE +static pcre *archive_pcre; +#else +static regex_t archive_re; +#endif + +/* pthread related */ +#define NUM_DU_THREADS (4) /* Can use sysconf(_SC_NPROCESSORS_ONLN) */ +#define DU_TEST (((node->fts_info & FTS_F) && \ + (sb->st_nlink <= 1 || test_set_bit((uint_t)sb->st_ino))) || node->fts_info & FTS_DP) + +static int threadbmp = -1; /* Has 1 in the bit position for idle threads */ +static volatile int active_threads; +static pthread_mutex_t running_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t hardlink_mutex = PTHREAD_MUTEX_INITIALIZER; +static ullong_t *core_files; +static blkcnt_t *core_blocks; +static ullong_t num_files; + +typedef struct { + char path[PATH_MAX]; + int entnum; + ushort_t core; + bool mntpoint; +} thread_data; + +static thread_data *core_data; + +/* Retain old signal handlers */ +static struct sigaction oldsighup; +static struct sigaction oldsigtstp; +static struct sigaction oldsigwinch; + +/* For use in functions which are isolated and don't return the buffer */ +alignas(max_align_t) static char g_buf[CMD_LEN_MAX]; + +/* For use as a scratch buffer in selection manipulation */ +alignas(max_align_t) static char g_sel[PATH_MAX]; + +/* Buffer to store tmp file path to show selection, file stats and help */ +alignas(max_align_t) static char g_tmpfpath[TMP_LEN_MAX]; + +/* Buffer to store plugins control pipe location */ +alignas(max_align_t) static char g_pipepath[TMP_LEN_MAX]; + +/* Non-persistent runtime states */ +static runstate g_state; + +/* Options to identify file MIME */ +#if defined(__APPLE__) +#define FILE_MIME_OPTS "-bIL" +#elif !defined(__sun) /* no MIME option for 'file' */ +#define FILE_MIME_OPTS "-biL" +#endif + +/* Macros for utilities */ +#define UTIL_OPENER 0 +#define UTIL_ATOOL 1 +#define UTIL_BSDTAR 2 +#define UTIL_UNZIP 3 +#define UTIL_TAR 4 +#define UTIL_LOCKER 5 +#define UTIL_LAUNCH 6 +#define UTIL_SH_EXEC 7 +#define UTIL_BASH 8 +#define UTIL_SSHFS 9 +#define UTIL_RCLONE 10 +#define UTIL_VI 11 +#define UTIL_LESS 12 +#define UTIL_SH 13 +#define UTIL_FZF 14 +#define UTIL_NTFY 15 +#define UTIL_CBCP 16 +#define UTIL_NMV 17 +#define UTIL_TRASH_CLI 18 +#define UTIL_GIO_TRASH 19 +#define UTIL_RM_RF 20 +#define UTIL_ARCHMNT 21 + +/* Utilities to open files, run actions */ +static char * const utils[] = { +#ifdef __APPLE__ + "/usr/bin/open", +#elif defined __CYGWIN__ + "cygstart", +#elif defined __HAIKU__ + "open", +#else + "xdg-open", +#endif + "atool", + "bsdtar", + "unzip", + "tar", +#ifdef __APPLE__ + "bashlock", +#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) + "lock", +#elif defined __HAIKU__ + "peaclock", +#else + "vlock", +#endif + "launch", + "sh -c", + "bash", + "sshfs", + "rclone", + "vi", + "less", + "sh", + "fzf", + ".ntfy", + ".cbcp", + ".nmv", + "trash-put", + "gio trash", + "rm -rf", + "archivemount", +}; + +/* Common strings */ +#define MSG_ZERO 0 /* Unused */ +#define MSG_0_ENTRIES 1 +#define STR_TMPFILE 2 +#define MSG_0_SELECTED 3 +#define MSG_CANCEL 4 +#define MSG_FAILED 5 +#define MSG_SSN_NAME 6 +#define MSG_CP_MV_AS 7 +#define MSG_CUR_SEL_OPTS 8 +#define MSG_FORCE_RM 9 +#define MSG_SIZE_LIMIT 10 +#define MSG_NEW_OPTS 11 +#define MSG_CLI_MODE 12 +#define MSG_OVERWRITE 13 +#define MSG_SSN_OPTS 14 +#define MSG_QUIT_ALL 15 +#define MSG_HOSTNAME 16 +#define MSG_ARCHIVE_NAME 17 +#define MSG_OPEN_WITH 18 +#define MSG_NEW_PATH 19 +#define MSG_LINK_PREFIX 20 +#define MSG_COPY_NAME 21 +#define MSG_ENTER 22 +#define MSG_SEL_MISSING 23 +#define MSG_ACCESS 24 +#define MSG_EMPTY_FILE 25 +#define MSG_UNSUPPORTED 26 +#define MSG_NOT_SET 27 +#define MSG_EXISTS 28 +#define MSG_FEW_COLUMNS 29 +#define MSG_REMOTE_OPTS 30 +#define MSG_RCLONE_DELAY 31 +#define MSG_APP_NAME 32 +#define MSG_ARCHIVE_OPTS 33 +#define MSG_KEYS 34 +#define MSG_INVALID_REG 35 +#define MSG_ORDER 36 +#define MSG_LAZY 37 +#define MSG_FIRST 38 +#define MSG_RM_TMP 39 +#define MSG_INVALID_KEY 40 +#define MSG_NOCHANGE 41 +#define MSG_DIR_CHANGED 42 +#define MSG_BM_NAME 43 +#define MSG_FILE_LIMIT 44 + +static const char * const messages[] = { + "", + "0 entries", + "/.nnnXXXXXX", + "0 selected", + "cancelled", + "failed!", + "session name: ", + "'c'p/'m'v as?", + "'c'urrent/'s'el?", + "%s %s? [Esc cancels]", + "size limit exceeded", + "['f'ile]/'d'ir/'s'ym/'h'ard?", + "['g'ui]/'c'li?", + "overwrite?", + "'s'ave/'l'oad/'r'estore?", + "Quit all contexts?", + "remote name (- for hovered): ", + "archive [path/]name: ", + "open with: ", + "[path/]name: ", + "link prefix [@ for none]: ", + "copy [path/]name: ", + "\n'Enter' to continue", + "open failed", + "dir inaccessible", + "empty! edit/open with", + "?", + "not set", + "entry exists", + "too few cols!", + "'s'shfs/'r'clone?", + "refresh if slow", + "app: ", + "['l's]/'o'pen/e'x'tract/'m'nt?", + "keys:", + "invalid regex", + "'a'u/'d'u/'e'xt/'r'ev/'s'z/'t'm/'v'er/'c'lr/'^T'?", + "unmount failed! try lazy?", + "first file (\')/char?", + "remove tmp file?", + "invalid key", + "unchanged", + "dir changed, range sel off", + "name: ", + "file limit exceeded", +}; + +/* Supported configuration environment variables */ +#define NNN_OPTS 0 +#define NNN_BMS 1 +#define NNN_PLUG 2 +#define NNN_OPENER 3 +#define NNN_COLORS 4 +#define NNN_FCOLORS 5 +#define NNNLVL 6 +#define NNN_PIPE 7 +#define NNN_MCLICK 8 +#define NNN_SEL 9 +#define NNN_ARCHIVE 10 +#define NNN_ORDER 11 +#define NNN_HELP 12 /* strings end here */ +#define NNN_TRASH 13 /* flags begin here */ + +static const char * const env_cfg[] = { + "NNN_OPTS", + "NNN_BMS", + "NNN_PLUG", + "NNN_OPENER", + "NNN_COLORS", + "NNN_FCOLORS", + "NNNLVL", + "NNN_PIPE", + "NNN_MCLICK", + "NNN_SEL", + "NNN_ARCHIVE", + "NNN_ORDER", + "NNN_HELP", + "NNN_TRASH", +}; + +/* Required environment variables */ +#define ENV_SHELL 0 +#define ENV_VISUAL 1 +#define ENV_EDITOR 2 +#define ENV_PAGER 3 +#define ENV_NCUR 4 + +static const char * const envs[] = { + "SHELL", + "VISUAL", + "EDITOR", + "PAGER", + "nnn", +}; + +/* Time type used */ +#define T_ACCESS 0 +#define T_CHANGE 1 +#define T_MOD 2 + +#define PROGRESS_CP "cpg -giRp" +#define PROGRESS_MV "mvg -gi" +static char cp[sizeof PROGRESS_CP] = "cp -iRp"; +static char mv[sizeof PROGRESS_MV] = "mv -i"; + +/* Archive commands */ +static char * const archive_cmd[] = {"atool -a", "bsdtar -acvf", "zip -r", "tar -acvf"}; + +/* Tokens used for path creation */ +#define TOK_BM 0 +#define TOK_SSN 1 +#define TOK_MNT 2 +#define TOK_PLG 3 + +static const char * const toks[] = { + "bookmarks", + "sessions", + "mounts", + "plugins", /* must be the last entry */ +}; + +/* Patterns */ +#define P_CPMVFMT 0 +#define P_CPMVRNM 1 +#define P_ARCHIVE 2 +#define P_REPLACE 3 +#define P_ARCHIVE_CMD 4 + +static const char * const patterns[] = { + SED" -i 's|^\\(\\(.*/\\)\\(.*\\)$\\)|#\\1\\n\\3|' %s", + SED" 's|^\\([^#/][^/]\\?.*\\)$|%s/\\1|;s|^#\\(/.*\\)$|\\1|' " + "%s | tr '\\n' '\\0' | xargs -0 -n2 sh -c '%s \"$0\" \"$@\" < /dev/tty'", + "\\.(bz|bz2|gz|tar|taz|tbz|tbz2|tgz|z|zip)$", /* Basic formats that don't need external tools */ + SED" -i 's|^%s\\(.*\\)$|%s\\1|' %s", + "xargs -0 %s %s < '%s'", +}; + +/* Colors */ +#define C_BLK (CTX_MAX + 1) /* Block device: DarkSeaGreen1 */ +#define C_CHR (C_BLK + 1) /* Character device: Yellow1 */ +#define C_DIR (C_CHR + 1) /* Directory: DeepSkyBlue1 */ +#define C_EXE (C_DIR + 1) /* Executable file: Green1 */ +#define C_FIL (C_EXE + 1) /* Regular file: Normal */ +#define C_HRD (C_FIL + 1) /* Hard link: Plum4 */ +#define C_LNK (C_HRD + 1) /* Symbolic link: Cyan1 */ +#define C_MIS (C_LNK + 1) /* Missing file OR file details: Grey62 */ +#define C_ORP (C_MIS + 1) /* Orphaned symlink: DeepPink1 */ +#define C_PIP (C_ORP + 1) /* Named pipe (FIFO): Orange1 */ +#define C_SOC (C_PIP + 1) /* Socket: MediumOrchid1 */ +#define C_UND (C_SOC + 1) /* Unknown OR 0B regular/exe file: Red1 */ + +static char gcolors[] = "c1e2272e006033f7c6d6abc4"; +static uint_t fcolors[C_UND + 1] = {0}; + +/* Event handling */ +#ifdef LINUX_INOTIFY +#define NUM_EVENT_SLOTS 32 /* Make room for 32 events */ +#define EVENT_SIZE (sizeof(struct inotify_event)) +#define EVENT_BUF_LEN (EVENT_SIZE * NUM_EVENT_SLOTS) +static int inotify_fd, inotify_wd = -1; +static uint_t INOTIFY_MASK = /* IN_ATTRIB | */ IN_CREATE | IN_DELETE | IN_DELETE_SELF + | IN_MODIFY | IN_MOVE_SELF | IN_MOVED_FROM | IN_MOVED_TO; +#elif defined(BSD_KQUEUE) +#define NUM_EVENT_SLOTS 1 +#define NUM_EVENT_FDS 1 +static int kq, event_fd = -1; +static struct kevent events_to_monitor[NUM_EVENT_FDS]; +static uint_t KQUEUE_FFLAGS = NOTE_DELETE | NOTE_EXTEND | NOTE_LINK + | NOTE_RENAME | NOTE_REVOKE | NOTE_WRITE; +static struct timespec gtimeout; +#elif defined(HAIKU_NM) +static bool haiku_nm_active = FALSE; +static haiku_nm_h haiku_hnd; +#endif + +/* Function macros */ +#define tolastln() move(xlines - 1, 0) +#define tocursor() move(cur + 2 - curscroll, 0) +#define exitcurses() endwin() +#define printwarn(presel) printwait(strerror(errno), presel) +#define istopdir(path) ((path)[1] == '\0' && (path)[0] == '/') +#define copycurname() xstrsncpy(lastname, ndents ? pdents[cur].name : "\0", NAME_MAX + 1) +#define settimeout() timeout(1000) +#define cleartimeout() timeout(-1) +#define errexit() printerr(__LINE__) +#define setdirwatch() (cfg.filtermode ? (presel = FILTER) : (watch = TRUE)) +#define filterset() (g_ctx[cfg.curctx].c_fltr[1]) +/* We don't care about the return value from strcmp() */ +#define xstrcmp(a, b) (*(a) != *(b) ? -1 : strcmp((a), (b))) +/* A faster version of xisdigit */ +#define xisdigit(c) ((unsigned int) (c) - '0' <= 9) +#define xerror() perror(xitoa(__LINE__)) + +#ifdef TOURBIN_QSORT +#define ENTLESS(i, j) (entrycmpfn(pdents + (i), pdents + (j)) < 0) +#define ENTSWAP(i, j) (swap_ent((i), (j))) +#define ENTSORT(pdents, ndents, entrycmpfn) QSORT((ndents), ENTLESS, ENTSWAP) +#else +#define ENTSORT(pdents, ndents, entrycmpfn) qsort((pdents), (ndents), sizeof(*(pdents)), (entrycmpfn)) +#endif + +/* Forward declarations */ +static void redraw(char *path); +static int spawn(char *file, char *arg1, char *arg2, char *arg3, ushort_t flag); +static void move_cursor(int target, int ignore_scrolloff); +static char *load_input(int fd, const char *path); +static int set_sort_flags(int r); +static void statusbar(char *path); +static bool get_output(char *file, char *arg1, char *arg2, int fdout, bool page); +#ifndef NOFIFO +static void notify_fifo(bool force); +#endif + +/* Functions */ + +static void sigint_handler(int sig) +{ + (void) sig; + g_state.interrupt = 1; +} + +static void clean_exit_sighandler(int sig) +{ + (void) sig; + exitcurses(); + /* This triggers cleanup() thanks to atexit() */ + exit(EXIT_SUCCESS); +} + +static char *xitoa(uint_t val) +{ + static char dst[32] = {'\0'}; + static const char digits[201] = + "0001020304050607080910111213141516171819" + "2021222324252627282930313233343536373839" + "4041424344454647484950515253545556575859" + "6061626364656667686970717273747576777879" + "8081828384858687888990919293949596979899"; + uint_t next = 30, quo, i; + + while (val >= 100) { + quo = val / 100; + i = (val - (quo * 100)) * 2; + val = quo; + dst[next] = digits[i + 1]; + dst[--next] = digits[i]; + --next; + } + + /* Handle last 1-2 digits */ + if (val < 10) + dst[next] = '0' + val; + else { + i = val * 2; + dst[next] = digits[i + 1]; + dst[--next] = digits[i]; + } + + return &dst[next]; +} + +/* Return the integer value of a char representing HEX */ +static uchar_t xchartohex(uchar_t c) +{ + if (xisdigit(c)) + return c - '0'; + + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + + if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + + return c; +} + +/* + * Source: https://elixir.bootlin.com/linux/latest/source/arch/alpha/include/asm/bitops.h + */ +static bool test_set_bit(uint_t nr) +{ + nr &= HASH_BITS; + + pthread_mutex_lock(&hardlink_mutex); + ullong_t *m = ((ullong_t *)ihashbmp) + (nr >> 6); + + if (*m & (1 << (nr & 63))) { + pthread_mutex_unlock(&hardlink_mutex); + return FALSE; + } + + *m |= 1 << (nr & 63); + pthread_mutex_unlock(&hardlink_mutex); + + return TRUE; +} + +#ifndef __APPLE__ +/* Increase the limit on open file descriptors, if possible */ +static void max_openfds(void) +{ + struct rlimit rl; + + if (!getrlimit(RLIMIT_NOFILE, &rl)) + if (rl.rlim_cur < rl.rlim_max) { + rl.rlim_cur = rl.rlim_max; + setrlimit(RLIMIT_NOFILE, &rl); + } +} +#endif + +/* + * Wrapper to realloc() + * Frees current memory if realloc() fails and returns NULL. + * + * The *alloc() family returns aligned address: https://man7.org/linux/man-pages/man3/malloc.3.html + */ +static void *xrealloc(void *pcur, size_t len) +{ + void *pmem = realloc(pcur, len); + + if (!pmem) + free(pcur); + + return pmem; +} + +/* + * Just a safe strncpy(3) + * Always null ('\0') terminates if both src and dest are valid pointers. + * Returns the number of bytes copied including terminating null byte. + */ +static size_t xstrsncpy(char *restrict dst, const char *restrict src, size_t n) +{ + char *end = memccpy(dst, src, '\0', n); + + if (!end) { + dst[n - 1] = '\0'; // NOLINT + end = dst + n; /* If we return n here, binary size increases due to auto-inlining */ + } + + return end - dst; +} + +static inline size_t xstrlen(const char *restrict s) +{ +#if !defined(__GLIBC__) + return strlen(s); // NOLINT +#else + return (char *)rawmemchr(s, '\0') - s; // NOLINT +#endif +} + +static char *xstrdup(const char *restrict s) +{ + size_t len = xstrlen(s) + 1; + char *ptr = malloc(len); + return ptr ? memcpy(ptr, s, len) : NULL; +} + +static bool is_suffix(const char *restrict str, const char *restrict suffix) +{ + if (!str || !suffix) + return FALSE; + + size_t lenstr = xstrlen(str); + size_t lensuffix = xstrlen(suffix); + + if (lensuffix > lenstr) + return FALSE; + + return (xstrcmp(str + (lenstr - lensuffix), suffix) == 0); +} + +static inline bool is_prefix(const char *restrict str, const char *restrict prefix, size_t len) +{ + return !strncmp(str, prefix, len); +} + +static inline bool is_bad_len_or_dir(const char *restrict path) +{ + size_t len = xstrlen(path); + + return ((len >= PATH_MAX) || (path[len - 1] == '/')); +} + +static char *get_cwd_entry(const char *restrict cwdpath, char *entrypath, size_t *tokenlen) +{ + size_t len = xstrlen(cwdpath); + char *end; + + if (!is_prefix(entrypath, cwdpath, len)) + return NULL; + + entrypath += len + 1; /* Add 1 for trailing / */ + end = strchr(entrypath, '/'); + if (end) + *tokenlen = end - entrypath; + else + *tokenlen = xstrlen(entrypath); + DPRINTF_U(*tokenlen); + + return entrypath; +} + +/* + * The poor man's implementation of memrchr(3). + * We are only looking for '/' and '.' in this program. + * And we are NOT expecting a '/' at the end. + * Ideally 0 < n <= xstrlen(s). + */ +static void *xmemrchr(uchar_t *restrict s, uchar_t ch, size_t n) +{ +#if defined(__GLIBC__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) + return memrchr(s, ch, n); +#else + + if (!s || !n) + return NULL; + + uchar_t *ptr = s + n; + + do { + if (*--ptr == ch) + return ptr; + } while (s != ptr); + + return NULL; +#endif +} + +/* A very simplified implementation, changes path */ +static char *xdirname(char *path) +{ + char *base = xmemrchr((uchar_t *)path, '/', xstrlen(path)); + + if (base == path) + path[1] = '\0'; + else + *base = '\0'; + + return path; +} + +static char *xbasename(char *path) +{ + char *base = xmemrchr((uchar_t *)path, '/', xstrlen(path)); // NOLINT + + return base ? base + 1 : path; +} + +static inline char *xextension(const char *fname, size_t len) +{ + return xmemrchr((uchar_t *)fname, '.', len); +} + +#ifndef NOUG +/* + * One-shot cache for getpwuid/getgrgid. Returns the cached name if the + * provided uid is the same as the previous uid. Returns xitoa(guid) if + * the guid is not found in the password database. + */ +static char *getpwname(uid_t uid) +{ + static uint_t uidcache = UINT_MAX; + static char *namecache; + + if (uidcache != uid) { + struct passwd *pw = getpwuid(uid); + + uidcache = uid; + namecache = pw ? pw->pw_name : NULL; + } + + return namecache ? namecache : xitoa(uid); +} + +static char *getgrname(gid_t gid) +{ + static uint_t gidcache = UINT_MAX; + static char *grpcache; + + if (gidcache != gid) { + struct group *gr = getgrgid(gid); + + gidcache = gid; + grpcache = gr ? gr->gr_name : NULL; + } + + return grpcache ? grpcache : xitoa(gid); +} +#endif + +static inline bool getutil(char *util) +{ + return spawn("which", util, NULL, NULL, F_NORMAL | F_NOTRACE) == 0; +} + +static inline bool tilde_is_home(const char *s) +{ + return s[0] == '~' && (s[1] == '\0' || s[1] == '/'); +} + +static inline bool tilde_is_home_strict(const char *s) +{ + return s[0] == '~' && s[1] == '/'; +} + +/* + * Updates out with "dir/name or "/name" + * Returns the number of bytes copied including the terminating NULL byte + * + * Note: dir and out must be PATH_MAX in length to avoid macOS fault + */ +static size_t mkpath(const char *dir, const char *name, char *out) +{ + size_t len = 0; + + /* same rational for being strict as abspath() */ + if (tilde_is_home_strict(name)) { //NOLINT + len = xstrsncpy(out, home, PATH_MAX); + --len; + ++name; + } else if (name[0] != '/') { // NOLINT + /* Handle root case */ + len = istopdir(dir) ? 1 : xstrsncpy(out, dir, PATH_MAX); + out[len - 1] = '/'; // NOLINT + } + return (xstrsncpy(out + len, name, PATH_MAX - len) + len); +} + +/* Assumes both the paths passed are directories */ +static char *common_prefix(const char *path, char *prefix) +{ + const char *x = path, *y = prefix; + char *sep; + + if (!path || !*path || !prefix) + return NULL; + + if (!*prefix) { + xstrsncpy(prefix, path, PATH_MAX); + return prefix; + } + + while (*x && *y && (*x == *y)) + ++x, ++y; + + /* Strings are same */ + if (!*x && !*y) + return prefix; + + /* Path is shorter */ + if (!*x && *y == '/') { + xstrsncpy(prefix, path, y - path); + return prefix; + } + + /* Prefix is shorter */ + if (!*y && *x == '/') + return prefix; + + /* Shorten prefix */ + prefix[y - prefix] = '\0'; + + sep = xmemrchr((uchar_t *)prefix, '/', y - prefix); + if (sep != prefix) + *sep = '\0'; + else /* Just '/' */ + prefix[1] = '\0'; + + return prefix; +} + +/* + * The library function realpath() resolves symlinks. + * If there's a symlink in file list we want to show the symlink not what it's points to. + * Resolves ./../~ in filepath + */ +static char *abspath(const char *filepath, char *cwd, char *buf) +{ + const char *path = filepath; + bool allocated = FALSE; + + if (!path) + return NULL; + + /* when dealing with tilde, we need to be strict. + * otherwise a file named "~" can end up expanding to + * $HOME and causing disaster */ + if (tilde_is_home_strict(path)) { + cwd = home; + path += 2; /* advance 2 bytes past the "~/" */ + } else if ((path[0] != '/') && !cwd) { + cwd = getcwd(NULL, 0); + if (!cwd) + return NULL; + allocated = TRUE; + } + + size_t dst_size = 0, src_size = xstrlen(path), cwd_size = cwd ? xstrlen(cwd) : 0; + size_t len = src_size; + const char *src; + char *dst; + /* + * We need to add 2 chars at the end as relative paths may start with: + * ./ (find .) + * no separator (fd .): this needs an additional char for '/' + */ + char *resolved_path = buf ? buf : malloc(src_size + cwd_size + 2); + + if (!resolved_path) { + if (allocated) + free(cwd); + return NULL; + } + + /* Turn relative paths into absolute */ + if (path[0] != '/') { + if (!cwd) { + if (!buf) + free(resolved_path); + return NULL; + } + dst_size = xstrsncpy(resolved_path, cwd, cwd_size + 1) - 1; + if (allocated) + free(cwd); + } else + resolved_path[0] = '\0'; + + src = path; + dst = resolved_path + dst_size; + for (const char *next = NULL; next != path + src_size;) { + next = memchr(src, '/', len); + if (!next) + next = path + src_size; + + if (next - src == 2 && src[0] == '.' && src[1] == '.') { + if (dst - resolved_path) { + dst = xmemrchr((uchar_t *)resolved_path, '/', dst - resolved_path); + *dst = '\0'; + } + } else if (next - src == 1 && src[0] == '.') { + /* NOP */ + } else if (next - src) { + *(dst++) = '/'; + xstrsncpy(dst, src, next - src + 1); + dst += next - src; + } + + src = next + 1; + len = src_size - (src - path); + } + + if (*resolved_path == '\0') { + resolved_path[0] = '/'; + resolved_path[1] = '\0'; + } + + if (xstrlen(resolved_path) >= PATH_MAX) { + if (!buf) + free(resolved_path); + else + buf[0] = '\0'; + return NULL; + } + + return resolved_path; +} + +/* wraps the argument in single quotes so it can be safely fed to shell */ +static bool shell_escape(char *output, size_t outlen, const char *s) +{ + size_t n = xstrlen(s), w = 0; + + if (s == output) { + DPRINTF_S("s == output"); + return FALSE; + } + + output[w++] = '\''; /* begin single quote */ + for (size_t r = 0; r < n; ++r) { + /* potentially too big: 4 for the single quote case, 2 from + * outside the loop */ + if (w + 6 >= outlen) + return FALSE; + + switch (s[r]) { + /* the only thing that has special meaning inside single + * quotes are single quotes themselves. */ + case '\'': + output[w++] = '\''; /* end single quote */ + output[w++] = '\\'; /* put \' so it's treated as literal single quote */ + output[w++] = '\''; + output[w++] = '\''; /* start single quoting again */ + break; + default: + output[w++] = s[r]; + break; + } + } + output[w++] = '\''; /* end single quote */ + output[w++] = '\0'; /* nul terminator */ + return TRUE; +} + +static bool set_tilde_in_path(char *path) +{ + if (is_prefix(path, home, homelen)) { + home[homelen] = path[homelen - 1]; + path[homelen - 1] = '~'; + return TRUE; + } + + return FALSE; +} + +static void reset_tilde_in_path(char *path) +{ + path[homelen - 1] = home[homelen]; + home[homelen] = '\0'; +} + +#ifndef NOX11 +static void xterm_cfg(char *path) +{ + if (cfg.x11 && !g_state.picker) { + /* Signal CWD change to terminal */ + printf("\033]7;file://%s%s\033\\", hostname, path); + + /* Set terminal window title */ + bool r = set_tilde_in_path(path); + + printf("\033]2;%s\007", r ? &path[homelen - 1] : path); + fflush(stdout); + + if (r) + reset_tilde_in_path(path); + } +} +#endif + +static bool convert_tilde(const char *path, char *buf) +{ + if (tilde_is_home(path)) { + ssize_t len = xstrlen(home); + ssize_t loclen = xstrlen(path); + + xstrsncpy(buf, home, len + 1); + xstrsncpy(buf + len, path + 1, loclen); + return true; + } + return false; +} + +static int create_tmp_file(void) +{ + xstrsncpy(g_tmpfpath + tmpfplen - 1, messages[STR_TMPFILE], TMP_LEN_MAX - tmpfplen); + + int fd = mkstemp(g_tmpfpath); + + if (fd == -1) { + DPRINTF_S(strerror(errno)); + } + + return fd; +} + +static void msg(const char *message) +{ + dprintf(STDERR_FILENO, "%s\n", message); +} + +#ifdef KEY_RESIZE +static void handle_key_resize(void) +{ + endwin(); + refresh(); +} + +/* Clear the old prompt */ +static void clearoldprompt(void) +{ + // clear info line + move(xlines - 2, 0); + clrtoeol(); + + tolastln(); + clrtoeol(); + handle_key_resize(); +} +#endif + +/* Messages show up at the bottom */ +static inline void printmsg_nc(const char *msg) +{ + tolastln(); + addstr(msg); + clrtoeol(); +} + +static void printmsg(const char *msg) +{ + attron(COLOR_PAIR(cfg.curctx + 1)); + printmsg_nc(msg); + attroff(COLOR_PAIR(cfg.curctx + 1)); +} + +static void printwait(const char *msg, int *presel) +{ + printmsg(msg); + if (presel) { + *presel = MSGWAIT; + if (ndents) + xstrsncpy(g_ctx[cfg.curctx].c_name, pdents[cur].name, NAME_MAX + 1); + } +} + +/* Kill curses and display error before exiting */ +static void printerr(int linenum) +{ + exitcurses(); + perror(xitoa(linenum)); + if (!g_state.picker && selpath) + unlink(selpath); + free(pselbuf); + exit(1); +} + +static inline bool xconfirm(int c) +{ + return (c == 'y' || c == 'Y'); +} + +static int get_input(const char *prompt) +{ + wint_t ch[1]; + + if (prompt) + printmsg(prompt); + cleartimeout(); + + get_wch(ch); + +#ifdef KEY_RESIZE + while (*ch == KEY_RESIZE) { + if (prompt) { + clearoldprompt(); + xlines = LINES; + printmsg(prompt); + } + + get_wch(ch); + } +#endif + settimeout(); + return (int)*ch; +} + +static bool isselfileempty(void) +{ + struct stat sb; + + return (stat(selpath, &sb) == -1) || (!sb.st_size); +} + +static int get_cur_or_sel(void) +{ + bool sel = (selbufpos || !isselfileempty()); + + /* Check both local buffer and selection file for external selection */ + if (sel && ndents) { + /* If selection is preferred and we have a local selection, return selection. + * Always show the prompt in case of an external selection. + */ + if (cfg.prefersel && selbufpos) + return 's'; + + int choice = get_input(messages[MSG_CUR_SEL_OPTS]); + + return ((choice == 'c' || choice == 's') ? choice : 0); + } + + if (sel) + return 's'; + + if (ndents) + return 'c'; + + return 0; +} + +static void xdelay(useconds_t delay) +{ + refresh(); + usleep(delay); +} + +static char confirm_force(bool selection) +{ + char str[64]; + + snprintf(str, 64, messages[MSG_FORCE_RM], + g_state.trash ? utils[UTIL_GIO_TRASH] + 4 : utils[UTIL_RM_RF], + (selection ? "selected" : "hovered")); + + int r = get_input(str); + + if (r == ESC) + return '\0'; /* cancel */ + if (r == 'y' || r == 'Y') + return 'f'; /* forceful for rm */ + return (g_state.trash ? '\0' : 'i'); /* interactive for rm */ +} + +/* Writes buflen char(s) from buf to a file */ +static void writesel(const char *buf, const size_t buflen) +{ + if (!selpath) + return; + + int fd = open(selpath, O_CREAT | O_WRONLY | O_TRUNC, S_IWUSR | S_IRUSR); + + if (fd != -1) { + if (write(fd, buf, buflen) != (ssize_t)buflen) + printwarn(NULL); + close(fd); + } else + printwarn(NULL); +} + +static void appendfpath(const char *path, const size_t len) +{ + if ((selbufpos >= selbuflen) || ((len + 3) > (selbuflen - selbufpos))) { + selbuflen += PATH_MAX; + pselbuf = xrealloc(pselbuf, selbuflen); + if (!pselbuf) + errexit(); + } + + selbufpos += xstrsncpy(pselbuf + selbufpos, path, len); +} + +static void selbufrealloc(const size_t alloclen) +{ + if ((selbufpos + alloclen) > selbuflen) { + selbuflen = ALIGN_UP(selbufpos + alloclen, PATH_MAX); + pselbuf = xrealloc(pselbuf, selbuflen); + if (!pselbuf) + errexit(); + } +} + +/* Write selected file paths to fd, linefeed separated */ +static size_t seltofile(int fd, uint_t *pcount) +{ + uint_t lastpos, count = 0; + char *pbuf = pselbuf; + size_t pos = 0; + ssize_t len, prefixlen = 0, initlen = 0; + + if (pcount) + *pcount = 0; + + if (!selbufpos) + return 0; + + lastpos = selbufpos - 1; + + if (listpath) { + prefixlen = (ssize_t)xstrlen(listroot); + initlen = (ssize_t)xstrlen(listpath); + } + + while (pos <= lastpos) { + DPRINTF_S(pbuf); + len = (ssize_t)xstrlen(pbuf); + + if (!listpath || !is_prefix(pbuf, listpath, initlen)) { + if (write(fd, pbuf, len) != len) + return pos; + } else { + if (write(fd, listroot, prefixlen) != prefixlen) + return pos; + if (write(fd, pbuf + initlen, len - initlen) != (len - initlen)) + return pos; + } + + pos += len; + if (pos <= lastpos) { + if (write(fd, "\n", 1) != 1) + return pos; + pbuf += len + 1; + } + ++pos; + ++count; + } + + if (pcount) + *pcount = count; + + return pos; +} + +/* List selection from selection file (another instance) */ +static bool listselfile(void) +{ + if (isselfileempty()) + return FALSE; + + snprintf(g_buf, CMD_LEN_MAX, "tr \'\\0\' \'\\n\' < %s", selpath); + spawn(utils[UTIL_SH_EXEC], g_buf, NULL, NULL, F_CLI | F_CONFIRM); + + return TRUE; +} + +/* Reset selection indicators */ +static void resetselind(void) +{ + for (int r = 0; r < ndents; ++r) + if (pdents[r].flags & FILE_SELECTED) + pdents[r].flags &= ~FILE_SELECTED; +} + +static void startselection(void) +{ + if (!g_state.selmode) { + g_state.selmode = 1; + nselected = 0; + + if (selbufpos) { + resetselind(); + writesel(NULL, 0); + selbufpos = 0; + } + } +} + +static void clearselection(void) +{ + nselected = 0; + selbufpos = 0; + g_state.selmode = 0; + writesel(NULL, 0); +} + +static char *findinsel(char *startpos, int len) +{ + if (!selbufpos) + return FALSE; + + if (!startpos) + startpos = pselbuf; + + char *found = startpos; + size_t buflen = selbufpos - (startpos - pselbuf); + + while (1) { + /* memmem(3): not specified in POSIX.1, but present on a number of other systems. */ + found = memmem(found, buflen - (found - startpos), g_sel, len); + if (!found) + return NULL; + if (found == startpos || *(found - 1) == '\0') + return found; + found += len; /* We found g_sel as a substring of a path, move forward */ + if (found >= startpos + buflen) + return NULL; + } +} + +static int markcmp(const void *va, const void *vb) +{ + const selmark *ma = (selmark*)va; + const selmark *mb = (selmark*)vb; + + return ma->startpos - mb->startpos; +} + +/* scanselforpath() must be called before calling this */ +static inline void findmarkentry(size_t len, struct entry *dentp) +{ + if (!(dentp->flags & FILE_SCANNED)) { + if (findinsel(findselpos, len + xstrsncpy(g_sel + len, dentp->name, dentp->nlen))) + dentp->flags |= FILE_SELECTED; + dentp->flags |= FILE_SCANNED; + } +} + +/* + * scanselforpath() must be called before calling this + * pathlen = length of path + 1 (+1 for trailing slash) + */ +static void invertselbuf(const int pathlen) +{ + size_t len, endpos, shrinklen = 0, alloclen = 0; + char * const pbuf = g_sel + pathlen; + char *found; + int i, nmarked = 0, prev = 0; + struct entry *dentp; + bool scan = FALSE; + selmark *marked = malloc(nselected * sizeof(selmark)); + + if (!marked) { + printwarn(NULL); + return; + } + + /* First pass: inversion */ + for (i = 0; i < ndents; ++i) { + dentp = &pdents[i]; + + if (dentp->flags & FILE_SCANNED) { + if (dentp->flags & FILE_SELECTED) { + dentp->flags ^= FILE_SELECTED; /* Clear selection status */ + scan = TRUE; + } else { + dentp->flags |= FILE_SELECTED; + alloclen += pathlen + dentp->nlen; + } + } else { + dentp->flags |= FILE_SCANNED; + scan = TRUE; + } + + if (scan) { + len = pathlen + xstrsncpy(pbuf, dentp->name, NAME_MAX); + found = findinsel(findselpos, len); + if (found) { + if (findselpos == found) + findselpos += len; + + if (nmarked && (found + == (marked[nmarked - 1].startpos + marked[nmarked - 1].len))) + marked[nmarked - 1].len += len; + else { + marked[nmarked].startpos = found; + marked[nmarked].len = len; + ++nmarked; + } + + --nselected; + shrinklen += len; /* buffer size adjustment */ + } else { + dentp->flags |= FILE_SELECTED; + alloclen += pathlen + dentp->nlen; + } + scan = FALSE; + } + } + + /* + * Files marked for deselection could be found in arbitrary order. + * Sort by appearance in selection buffer. + * With entries sorted we can merge adjacent ones allowing us to + * move them in a single go. + */ + qsort(marked, nmarked, sizeof(selmark), &markcmp); + + /* Some files might be adjacent. Merge them into a single entry */ + for (i = 1; i < nmarked; ++i) { + if (marked[i].startpos == marked[prev].startpos + marked[prev].len) + marked[prev].len += marked[i].len; + else { + ++prev; + marked[prev].startpos = marked[i].startpos; + marked[prev].len = marked[i].len; + } + } + + /* + * Number of entries is increased by encountering a non-adjacent entry + * After we finish the loop we should increment it once more. + */ + + if (nmarked) /* Make sure there is something to deselect */ + nmarked = prev + 1; + + /* Using merged entries remove unselected chunks from selection buffer */ + for (i = 0; i < nmarked; ++i) { + /* + * found: points to where the current block starts + * variable is recycled from previous for readability + * endpos: points to where the the next block starts + * area between the end of current block (found + len) + * and endpos is selected entries. This is what we are + * moving back. + */ + found = marked[i].startpos; + endpos = (i + 1 == nmarked ? selbufpos : marked[i + 1].startpos - pselbuf); + len = marked[i].len; + + /* Move back only selected entries. No selected memory is moved twice */ + memmove(found, found + len, endpos - (found + len - pselbuf)); + } + + free(marked); + + /* Buffer size adjustment */ + selbufpos -= shrinklen; + + selbufrealloc(alloclen); + + /* Second pass: append newly selected to buffer */ + for (i = 0; i < ndents; ++i) { + if (pdents[i].flags & FILE_SELECTED) { + len = pathlen + xstrsncpy(pbuf, pdents[i].name, NAME_MAX); + appendfpath(g_sel, len); + ++nselected; + } + } + + nselected ? writesel(pselbuf, selbufpos - 1) : clearselection(); +} + +/* + * scanselforpath() must be called before calling this + * pathlen = length of path + 1 (+1 for trailing slash) + */ +static void addtoselbuf(const int pathlen, int startid, int endid) +{ + int i; + size_t len, alloclen = 0; + struct entry *dentp; + char *found; + char * const pbuf = g_sel + pathlen; + + /* Remember current selection buffer position */ + for (i = startid; i <= endid; ++i) { + dentp = &pdents[i]; + + if (findselpos) { + len = pathlen + xstrsncpy(pbuf, dentp->name, NAME_MAX); + found = findinsel(findselpos, len); + if (found) { + dentp->flags |= (FILE_SCANNED | FILE_SELECTED); + if (found == findselpos) { + findselpos += len; + if (findselpos == (pselbuf + selbufpos)) + findselpos = NULL; + } + } else + alloclen += pathlen + dentp->nlen; + } else + alloclen += pathlen + dentp->nlen; + } + + selbufrealloc(alloclen); + + for (i = startid; i <= endid; ++i) { + if (!(pdents[i].flags & FILE_SELECTED)) { + len = pathlen + xstrsncpy(pbuf, pdents[i].name, NAME_MAX); + appendfpath(g_sel, len); + ++nselected; + pdents[i].flags |= (FILE_SCANNED | FILE_SELECTED); + } + } + + writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */ +} + +/* Removes g_sel from selbuf */ +static void rmfromselbuf(size_t len) +{ + char *found = findinsel(findselpos, len); + if (!found) + return; + + memmove(found, found + len, selbufpos - (found + len - pselbuf)); + selbufpos -= len; + + nselected ? writesel(pselbuf, selbufpos - 1) : clearselection(); +} + +static int scanselforpath(const char *path, bool getsize) +{ + if (!path[1]) { /* path should always be at least two bytes (including NULL) */ + g_sel[0] = '/'; + findselpos = pselbuf; + return 1; /* Length of '/' is 1 */ + } + + size_t off = xstrsncpy(g_sel, path, PATH_MAX); + + g_sel[off - 1] = '/'; + /* + * We set findselpos only here. Directories can be listed in arbitrary order. + * This is the best best we can do for remembering position. + */ + findselpos = findinsel(NULL, off); + + if (getsize) + return off; + return (findselpos ? off : 0); +} + +/* Finish selection procedure before an operation */ +static void endselection(bool endselmode) +{ + int fd; + ssize_t count; + char buf[sizeof(patterns[P_REPLACE]) + PATH_MAX + (TMP_LEN_MAX << 1)]; + + if (endselmode && g_state.selmode) + g_state.selmode = 0; + + /* The code below is only for listing mode */ + if (!listpath || !selbufpos) + return; + + fd = create_tmp_file(); + if (fd == -1) { + DPRINTF_S("couldn't create tmp file"); + return; + } + + seltofile(fd, NULL); + if (close(fd)) { + DPRINTF_S(strerror(errno)); + printwarn(NULL); + return; + } + + snprintf(buf, sizeof(buf), patterns[P_REPLACE], listpath, listroot, g_tmpfpath); + spawn(utils[UTIL_SH_EXEC], buf, NULL, NULL, F_CLI); + + fd = open(g_tmpfpath, O_RDONLY); + if (fd == -1) { + DPRINTF_S(strerror(errno)); + printwarn(NULL); + if (unlink(g_tmpfpath)) { + DPRINTF_S(strerror(errno)); + printwarn(NULL); + } + return; + } + + count = read(fd, pselbuf, selbuflen); + if (count < 0) { + DPRINTF_S(strerror(errno)); + printwarn(NULL); + if (close(fd) || unlink(g_tmpfpath)) { + DPRINTF_S(strerror(errno)); + } + return; + } + + if (close(fd) || unlink(g_tmpfpath)) { + DPRINTF_S(strerror(errno)); + printwarn(NULL); + return; + } + + selbufpos = count; + pselbuf[--count] = '\0'; + for (--count; count > 0; --count) + if (pselbuf[count] == '\n' && pselbuf[count+1] == '/') + pselbuf[count] = '\0'; + + writesel(pselbuf, selbufpos - 1); +} + +/* Returns: 1 - success, 0 - none selected, -1 - other failure */ +static int editselection(void) +{ + int ret = -1; + int fd, lines = 0; + ssize_t count; + struct stat sb; + time_t mtime; + + if (!selbufpos) /* External selection is only editable at source */ + return listselfile(); + + fd = create_tmp_file(); + if (fd == -1) { + DPRINTF_S("couldn't create tmp file"); + return -1; + } + + seltofile(fd, NULL); + if (close(fd)) { + DPRINTF_S(strerror(errno)); + return -1; + } + + /* Save the last modification time */ + if (stat(g_tmpfpath, &sb)) { + DPRINTF_S(strerror(errno)); + unlink(g_tmpfpath); + return -1; + } + mtime = sb.st_mtime; + + spawn((cfg.waitedit ? enveditor : editor), g_tmpfpath, NULL, NULL, F_CLI); + + fd = open(g_tmpfpath, O_RDONLY); + if (fd == -1) { + DPRINTF_S(strerror(errno)); + unlink(g_tmpfpath); + return -1; + } + + fstat(fd, &sb); + + if (mtime == sb.st_mtime) { + DPRINTF_S("selection is not modified"); + unlink(g_tmpfpath); + return 1; + } + + if (sb.st_size > selbufpos) { + DPRINTF_S("edited buffer larger than previous"); + unlink(g_tmpfpath); + goto emptyedit; + } + + count = read(fd, pselbuf, selbuflen); + if (count < 0) { + DPRINTF_S(strerror(errno)); + printwarn(NULL); + if (close(fd) || unlink(g_tmpfpath)) { + DPRINTF_S(strerror(errno)); + printwarn(NULL); + } + goto emptyedit; + } + + if (close(fd) || unlink(g_tmpfpath)) { + DPRINTF_S(strerror(errno)); + printwarn(NULL); + goto emptyedit; + } + + if (!count) { + ret = 1; + goto emptyedit; + } + + resetselind(); + selbufpos = count; + /* The last character should be '\n' */ + pselbuf[--count] = '\0'; + for (--count; count > 0; --count) { + /* Replace every '\n' that separates two paths */ + if (pselbuf[count] == '\n' && pselbuf[count + 1] == '/') { + ++lines; + pselbuf[count] = '\0'; + } + } + + /* Add a line for the last file */ + ++lines; + + if (lines > nselected) { + DPRINTF_S("files added to selection"); + goto emptyedit; + } + + nselected = lines; + writesel(pselbuf, selbufpos - 1); + + return 1; + +emptyedit: + resetselind(); + clearselection(); + return ret; +} + +static bool selsafe(void) +{ + /* Fail if selection file path not generated */ + if (!selpath) { + printmsg(messages[MSG_SEL_MISSING]); + return FALSE; + } + + /* Fail if selection file path isn't accessible */ + if (access(selpath, R_OK | W_OK) == -1) { + errno == ENOENT ? printmsg(messages[MSG_0_SELECTED]) : printwarn(NULL); + return FALSE; + } + + return TRUE; +} + +static void export_file_list(void) +{ + if (!ndents) + return; + + struct entry *pdent = pdents; + int fd = create_tmp_file(); + + if (fd == -1) { + DPRINTF_S(strerror(errno)); + return; + } + + for (int r = 0; r < ndents; ++pdent, ++r) { + if (write(fd, pdent->name, pdent->nlen - 1) != (pdent->nlen - 1)) + break; + + if ((r != ndents - 1) && (write(fd, "\n", 1) != 1)) + break; + } + + if (close(fd)) { + DPRINTF_S(strerror(errno)); + } + + spawn(editor, g_tmpfpath, NULL, NULL, F_CLI); + + if (xconfirm(get_input(messages[MSG_RM_TMP]))) + unlink(g_tmpfpath); +} + +static bool init_fcolors(void) +{ + char *f_colors = getenv(env_cfg[NNN_FCOLORS]); + + if (!f_colors || !*f_colors) + f_colors = gcolors; + + for (uchar_t id = C_BLK; *f_colors && id <= C_UND; ++id) { + fcolors[id] = xchartohex(*f_colors) << 4; + if (*++f_colors) { + fcolors[id] += xchartohex(*f_colors); + if (fcolors[id]) + init_pair(id, fcolors[id], -1); + } else + return FALSE; + ++f_colors; + } + + return TRUE; +} + +/* Initialize curses mode */ +static bool initcurses(void *oldmask) +{ +#ifdef NOMOUSE + (void) oldmask; +#endif + + if (g_state.picker) { + if (!newterm(NULL, stderr, stdin)) { + msg("newterm!"); + return FALSE; + } + } else if (!initscr()) { + msg("initscr!"); + DPRINTF_S(getenv("TERM")); + return FALSE; + } + + cbreak(); + noecho(); + nonl(); + //intrflush(stdscr, FALSE); + keypad(stdscr, TRUE); +#ifndef NOMOUSE +#if NCURSES_MOUSE_VERSION <= 1 + mousemask(BUTTON1_PRESSED | BUTTON1_DOUBLE_CLICKED | BUTTON2_PRESSED | BUTTON3_PRESSED, + (mmask_t *)oldmask); +#else + mousemask(BUTTON1_PRESSED | BUTTON2_PRESSED | BUTTON3_PRESSED | BUTTON4_PRESSED + | BUTTON5_PRESSED, (mmask_t *)oldmask); +#endif + mouseinterval(0); +#endif + curs_set(FALSE); /* Hide cursor */ + + char *colors = getenv(env_cfg[NNN_COLORS]); + + if (colors || !getenv("NO_COLOR")) { + uint_t *pcode; + bool ext = FALSE; + + start_color(); + use_default_colors(); + + /* Initialize file colors */ + if (COLORS >= COLOR_256) { + if (!(g_state.oldcolor || init_fcolors())) { + exitcurses(); + msg(env_cfg[NNN_FCOLORS]); + return FALSE; + } + } else + g_state.oldcolor = 1; + + DPRINTF_D(COLORS); + DPRINTF_D(COLOR_PAIRS); + + if (colors && *colors == '#') { + char *sep = strchr(colors, ';'); + + if (!g_state.oldcolor && COLORS >= COLOR_256) { + ++colors; + ext = TRUE; + + /* + * If fallback colors are specified, set the separator + * to NULL so we don't interpret separator and fallback + * if fewer than CTX_MAX xterm 256 colors are specified. + */ + if (sep) + *sep = '\0'; + } else { + colors = sep; /* Detect if 8 colors fallback is appended */ + if (colors) + ++colors; + } + } + + /* Get and set the context colors */ + for (uchar_t i = 0; i < CTX_MAX; ++i) { + pcode = &g_ctx[i].color; + + if (colors && *colors) { + if (ext) { + *pcode = xchartohex(*colors) << 4; + if (*++colors) + fcolors[i + 1] = *pcode += xchartohex(*colors); + else { /* Each color code must be 2 hex symbols */ + exitcurses(); + msg(env_cfg[NNN_COLORS]); + return FALSE; + } + } else + *pcode = (*colors < '0' || *colors > '7') ? 4 : *colors - '0'; + ++colors; + } else + *pcode = 4; + + init_pair(i + 1, *pcode, -1); + } + } +#ifdef ICONS_ENABLED + if (!g_state.oldcolor) { + for (uint_t i = 0; i < ELEMENTS(init_colors); ++i) + init_pair(C_UND + 1 + init_colors[i], init_colors[i], -1); + } +#endif + + settimeout(); /* One second */ + set_escdelay(25); + return TRUE; +} + +/* No NULL check here as spawn() guards against it */ +static char *parseargs(char *cmd, char **argv, int *pindex) +{ + int count = 0; + size_t len = xstrlen(cmd) + 1; + char *line = (char *)malloc(len); + + if (!line) { + DPRINTF_S("malloc()!"); + return NULL; + } + + xstrsncpy(line, cmd, len); + argv[count++] = line; + cmd = line; + + while (*line) { // NOLINT + if (ISBLANK(*line)) { + *line++ = '\0'; + + if (!*line) // NOLINT + break; + + argv[count++] = line; + if (count == EXEC_ARGS_MAX) { + count = -1; + break; + } + } + + ++line; + } + + if (count == -1 || count > (EXEC_ARGS_MAX - 4)) { /* 3 args and last NULL */ + free(cmd); + cmd = NULL; + DPRINTF_S("NULL or too many args"); + } + + *pindex = count; + return cmd; +} + +static void enable_signals(void) +{ + struct sigaction dfl_act = {.sa_handler = SIG_DFL}; + + sigaction(SIGHUP, &dfl_act, NULL); + sigaction(SIGINT, &dfl_act, NULL); + sigaction(SIGQUIT, &dfl_act, NULL); + sigaction(SIGTSTP, &dfl_act, NULL); + sigaction(SIGWINCH, &dfl_act, NULL); +} + +static pid_t xfork(uchar_t flag) +{ + pid_t p = fork(); + + if (p > 0) { + /* the parent ignores the interrupt, quit and hangup signals */ + sigaction(SIGHUP, &(struct sigaction){.sa_handler = SIG_IGN}, &oldsighup); + sigaction(SIGTSTP, &(struct sigaction){.sa_handler = SIG_DFL}, &oldsigtstp); + sigaction(SIGWINCH, &(struct sigaction){.sa_handler = SIG_IGN}, &oldsigwinch); + } else if (p == 0) { + /* We create a grandchild to detach */ + if (flag & F_NOWAIT) { + p = fork(); + + if (p > 0) + _exit(EXIT_SUCCESS); + else if (p == 0) { + enable_signals(); + setsid(); + return p; + } + + perror("fork"); + _exit(EXIT_FAILURE); + } + + /* So they can be used to stop the child */ + enable_signals(); + } + + /* This is the parent waiting for the child to create grandchild */ + if (flag & F_NOWAIT) + waitpid(p, NULL, 0); + + if (p == -1) + perror("fork"); + return p; +} + +static int join(pid_t p, uchar_t flag) +{ + int status = 0xFFFF; + + if (!(flag & F_NOWAIT)) { + /* wait for the child to exit */ + do { + } while (waitpid(p, &status, 0) == -1); + + if (WIFEXITED(status)) { + status = WEXITSTATUS(status); + DPRINTF_D(status); + } + } + + /* restore parent's signal handling */ + sigaction(SIGHUP, &oldsighup, NULL); + sigaction(SIGTSTP, &oldsigtstp, NULL); + sigaction(SIGWINCH, &oldsigwinch, NULL); + + return status; +} + +/* + * Spawns a child process. Behaviour can be controlled using flag. + * Limited to 3 arguments to a program, flag works on bit set. + */ +static int spawn(char *file, char *arg1, char *arg2, char *arg3, ushort_t flag) +{ + pid_t pid; + int status = 0, retstatus = 0xFFFF; + char *argv[EXEC_ARGS_MAX] = {0}; + char *cmd = NULL; + + if (!file || !*file) + return retstatus; + + /* Swap args if the first arg is NULL and the other 2 aren't */ + if (!arg1 && arg2) { + arg1 = arg2; + if (arg3) { + arg2 = arg3; + arg3 = NULL; + } else + arg2 = NULL; + } + + if (flag & F_MULTI) { + cmd = parseargs(file, argv, &status); + if (!cmd) + return -1; + } else + argv[status++] = file; + + argv[status] = arg1; + argv[++status] = arg2; + argv[++status] = arg3; + + if (flag & F_NORMAL) + exitcurses(); + + pid = xfork(flag); + if (pid == 0) { + /* Suppress stdout and stderr */ + if (flag & F_NOTRACE) { + int fd = open("/dev/null", O_WRONLY, 0200); + + if (flag & F_NOSTDIN) + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + close(fd); + } else if (flag & F_TTY) { + /* If stdout has been redirected to a non-tty, force output to tty */ + if (!isatty(STDOUT_FILENO)) { + int fd = open(ctermid(NULL), O_WRONLY, 0200); + dup2(fd, STDOUT_FILENO); + close(fd); + } + } + + execvp(*argv, argv); + _exit(EXIT_SUCCESS); + } else { + retstatus = join(pid, flag); + DPRINTF_D(pid); + + if ((flag & F_CONFIRM) || ((flag & F_CHKRTN) && retstatus)) { + status = write(STDOUT_FILENO, messages[MSG_ENTER], xstrlen(messages[MSG_ENTER])); + (void)status; + while ((read(STDIN_FILENO, &status, 1) > 0) && (status != '\n')); + } + + if (flag & F_NORMAL) + refresh(); + + free(cmd); + } + + return retstatus; +} + +/* Get program name from env var, else return fallback program */ +static char *xgetenv(const char * const name, char *fallback) +{ + char *value = getenv(name); + + return value && value[0] ? value : fallback; +} + +/* Checks if an env variable is set to 1 */ +static inline uint_t xgetenv_val(const char *name) +{ + char *str = getenv(name); + + if (str && str[0]) + return atoi(str); + + return 0; +} + +/* Check if a dir exists, IS a dir, and is readable */ +static bool xdiraccess(const char *path) +{ + DIR *dirp = opendir(path); + + if (!dirp) { + printwarn(NULL); + return FALSE; + } + + closedir(dirp); + return TRUE; +} + +static bool plugscript(const char *plugin, uchar_t flags) +{ + mkpath(plgpath, plugin, g_buf); + if (!access(g_buf, X_OK)) { + spawn(g_buf, NULL, NULL, NULL, flags); + return TRUE; + } + + return FALSE; +} + +static void opstr(char *buf, char *op) +{ + snprintf(buf, CMD_LEN_MAX, "xargs -0 sh -c '%s \"$0\" \"$@\" . < /dev/tty' < %s", op, selpath); +} + +static bool rmmulstr(char *buf) +{ + char r = confirm_force(TRUE); + if (!r) + return FALSE; + + if (!g_state.trash) + snprintf(buf, CMD_LEN_MAX, "xargs -0 sh -c 'rm -%cr \"$0\" \"$@\" < /dev/tty' < %s", + r, selpath); + else + snprintf(buf, CMD_LEN_MAX, "xargs -0 %s < %s", + utils[(g_state.trash == 1) ? UTIL_TRASH_CLI : UTIL_GIO_TRASH], selpath); + + return TRUE; +} + +/* Returns TRUE if file is removed, else FALSE */ +static bool xrm(char * const fpath) +{ + char r = confirm_force(FALSE); + if (!r) + return FALSE; + + if (!g_state.trash) { + char rm_opts[] = "-ir"; + + rm_opts[1] = r; + spawn("rm", rm_opts, fpath, NULL, F_NORMAL | F_CHKRTN); + } else + spawn(utils[(g_state.trash == 1) ? UTIL_TRASH_CLI : UTIL_GIO_TRASH], + fpath, NULL, NULL, F_NORMAL | F_MULTI); + + return (access(fpath, F_OK) == -1); /* File is removed */ +} + +static void xrmfromsel(char *path, char *fpath) +{ +#ifndef NOX11 + bool selected = TRUE; +#endif + + if ((pdents[cur].flags & DIR_OR_DIRLNK) && scanselforpath(fpath, FALSE)) + clearselection(); + else if (pdents[cur].flags & FILE_SELECTED) { + --nselected; + rmfromselbuf(mkpath(path, pdents[cur].name, g_sel)); + } +#ifndef NOX11 + else + selected = FALSE; + + if (selected && cfg.x11) + plugscript(utils[UTIL_CBCP], F_NOWAIT | F_NOTRACE); +#endif +} + +static uint_t lines_in_file(int fd, char *buf, size_t buflen) +{ + ssize_t len; + uint_t count = 0; + + while ((len = read(fd, buf, buflen)) > 0) + while (len) + count += (buf[--len] == '\n'); + + /* For all use cases 0 linecount is considered as error */ + return ((len < 0) ? 0 : count); +} + +static bool cpmv_rename(int choice, const char *path) +{ + int fd; + uint_t count = 0, lines = 0; + bool ret = FALSE; + char *cmd = (choice == 'c' ? cp : mv); + char buf[sizeof(patterns[P_CPMVRNM]) + (MAX(sizeof(cp), sizeof(mv))) + (PATH_MAX << 1)]; + + fd = create_tmp_file(); + if (fd == -1) + return ret; + + /* selsafe() returned TRUE for this to be called */ + if (!selbufpos) { + snprintf(buf, sizeof(buf), "tr '\\0' '\\n' < %s > %s", selpath, g_tmpfpath); + spawn(utils[UTIL_SH_EXEC], buf, NULL, NULL, F_CLI); + + count = lines_in_file(fd, buf, sizeof(buf)); + if (!count) + goto finish; + } else + seltofile(fd, &count); + + close(fd); + + snprintf(buf, sizeof(buf), patterns[P_CPMVFMT], g_tmpfpath); + spawn(utils[UTIL_SH_EXEC], buf, NULL, NULL, F_CLI); + + spawn((cfg.waitedit ? enveditor : editor), g_tmpfpath, NULL, NULL, F_CLI); + + fd = open(g_tmpfpath, O_RDONLY); + if (fd == -1) + goto finish; + + lines = lines_in_file(fd, buf, sizeof(buf)); + DPRINTF_U(count); + DPRINTF_U(lines); + if (!lines || (2 * count != lines)) { + DPRINTF_S("num mismatch"); + goto finish; + } + + snprintf(buf, sizeof(buf), patterns[P_CPMVRNM], path, g_tmpfpath, cmd); + if (!spawn(utils[UTIL_SH_EXEC], buf, NULL, NULL, F_CLI | F_CHKRTN)) + ret = TRUE; +finish: + if (fd >= 0) + close(fd); + + return ret; +} + +static bool cpmvrm_selection(enum action sel, char *path) +{ + int r; + + if (isselfileempty()) { + if (nselected) + clearselection(); + printmsg(messages[MSG_0_SELECTED]); + return FALSE; + } + + if (!selsafe()) + return FALSE; + + switch (sel) { + case SEL_CP: + opstr(g_buf, cp); + break; + case SEL_MV: + opstr(g_buf, mv); + break; + case SEL_CPMVAS: + r = get_input(messages[MSG_CP_MV_AS]); + if (r != 'c' && r != 'm') { + printmsg(messages[MSG_INVALID_KEY]); + return FALSE; + } + + if (!cpmv_rename(r, path)) { + printmsg(messages[MSG_FAILED]); + return FALSE; + } + break; + default: /* SEL_RM */ + if (!rmmulstr(g_buf)) { + printmsg(messages[MSG_CANCEL]); + return FALSE; + } + } + + if (sel != SEL_CPMVAS && spawn(utils[UTIL_SH_EXEC], g_buf, NULL, NULL, F_CLI | F_CHKRTN)) { + printmsg(messages[MSG_FAILED]); + return FALSE; + } + + /* Clear selection */ + clearselection(); + + return TRUE; +} + +#ifndef NOBATCH +static bool batch_rename(void) +{ + int fd1, fd2; + uint_t count = 0, lines = 0; + bool dir = FALSE, ret = FALSE; + char foriginal[TMP_LEN_MAX] = {0}; + static const char batchrenamecmd[] = "paste -d'\n' %s %s | "SED" 'N; /^\\(.*\\)\\n\\1$/!p;d' | " + "tr '\n' '\\0' | xargs -0 -n2 sh -c 'mv -i \"$0\" \"$@\" <" + " /dev/tty'"; + char buf[sizeof(batchrenamecmd) + (PATH_MAX << 1)]; + int i = get_cur_or_sel(); + + if (!i) + return ret; + + if (i == 'c') { /* Rename entries in current dir */ + selbufpos = 0; + dir = TRUE; + } + + fd1 = create_tmp_file(); + if (fd1 == -1) + return ret; + + xstrsncpy(foriginal, g_tmpfpath, xstrlen(g_tmpfpath) + 1); + + fd2 = create_tmp_file(); + if (fd2 == -1) { + unlink(foriginal); + close(fd1); + return ret; + } + + if (dir) + for (i = 0; i < ndents; ++i) + appendfpath(pdents[i].name, NAME_MAX); + + seltofile(fd1, &count); + seltofile(fd2, NULL); + close(fd2); + + if (dir) /* Don't retain dir entries in selection */ + selbufpos = 0; + + spawn((cfg.waitedit ? enveditor : editor), g_tmpfpath, NULL, NULL, F_CLI); + + /* Reopen file descriptor to get updated contents */ + fd2 = open(g_tmpfpath, O_RDONLY); + if (fd2 == -1) + goto finish; + + lines = lines_in_file(fd2, buf, sizeof(buf)); + DPRINTF_U(count); + DPRINTF_U(lines); + if (!lines || (count != lines)) { + DPRINTF_S("cannot delete files"); + goto finish; + } + + snprintf(buf, sizeof(buf), batchrenamecmd, foriginal, g_tmpfpath); + spawn(utils[UTIL_SH_EXEC], buf, NULL, NULL, F_CLI); + ret = TRUE; + +finish: + if (fd1 >= 0) + close(fd1); + unlink(foriginal); + + if (fd2 >= 0) + close(fd2); + unlink(g_tmpfpath); + + return ret; +} +#endif + +static char *get_archive_cmd(const char *archive) +{ + uchar_t i = 3; + + if (!g_state.usebsdtar && getutil(utils[UTIL_ATOOL])) + i = 0; + else if (getutil(utils[UTIL_BSDTAR])) + i = 1; + else if (is_suffix(archive, ".zip")) + i = 2; + // else tar + + return archive_cmd[i]; +} + +static void archive_selection(const char *cmd, const char *archive) +{ + char *buf = malloc((xstrlen(patterns[P_ARCHIVE_CMD]) + xstrlen(cmd) + xstrlen(archive) + + xstrlen(selpath)) * sizeof(char)); + if (!buf) { + DPRINTF_S(strerror(errno)); + printwarn(NULL); + return; + } + + snprintf(buf, CMD_LEN_MAX, patterns[P_ARCHIVE_CMD], cmd, archive, selpath); + spawn(utils[UTIL_SH_EXEC], buf, NULL, NULL, F_CLI | F_CONFIRM); + free(buf); +} + +static void write_lastdir(const char *curpath, const char *outfile) +{ + bool tilde = false; + if (!outfile) + xstrsncpy(cfgpath + xstrlen(cfgpath), "/.lastd", 8); + else + tilde = convert_tilde(outfile, g_buf); + + int fd = open(outfile + ? (tilde ? g_buf : outfile) + : cfgpath, O_CREAT | O_WRONLY | O_TRUNC, S_IWUSR | S_IRUSR); + + if (fd != -1 && shell_escape(g_buf, sizeof(g_buf), curpath)) { + dprintf(fd, "cd %s", g_buf); + close(fd); + } +} + +/* + * We assume none of the strings are NULL. + * + * Let's have the logic to sort numeric names in numeric order. + * E.g., the order '1, 10, 2' doesn't make sense to human eyes. + * + * If the absolute numeric values are same, we fallback to alphasort. + */ +static int xstricmp(const char * const s1, const char * const s2) +{ + char *p1, *p2; + + long long v1 = strtoll(s1, &p1, 10); + long long v2 = strtoll(s2, &p2, 10); + + /* Check if at least 1 string is numeric */ + if (s1 != p1 || s2 != p2) { + /* Handle both pure numeric */ + if (s1 != p1 && s2 != p2) { + if (v2 > v1) + return -1; + + if (v1 > v2) + return 1; + } + + /* Only first string non-numeric */ + if (s1 == p1) + return 1; + + /* Only second string non-numeric */ + if (s2 == p2) + return -1; + } + + /* Handle 1. all non-numeric and 2. both same numeric value cases */ +#ifndef NOLC + return strcoll(s1, s2); +#else + return strcasecmp(s1, s2); +#endif +} + +/* + * Version comparison + * + * The code for version compare is a modified version of the GLIBC + * and uClibc implementation of strverscmp(). The source is here: + * https://elixir.bootlin.com/uclibc-ng/latest/source/libc/string/strverscmp.c + */ + +/* + * Compare S1 and S2 as strings holding indices/version numbers, + * returning less than, equal to or greater than zero if S1 is less than, + * equal to or greater than S2 (for more info, see the texinfo doc). + * + * Ignores case. + */ +static int xstrverscasecmp(const char * const s1, const char * const s2) +{ + const uchar_t *p1 = (const uchar_t *)s1; + const uchar_t *p2 = (const uchar_t *)s2; + int state, diff; + uchar_t c1, c2; + + /* + * Symbol(s) 0 [1-9] others + * Transition (10) 0 (01) d (00) x + */ + static const uint8_t next_state[] = { + /* state x d 0 */ + /* S_N */ S_N, S_I, S_Z, + /* S_I */ S_N, S_I, S_I, + /* S_F */ S_N, S_F, S_F, + /* S_Z */ S_N, S_F, S_Z + }; + + alignas(max_align_t) static const int8_t result_type[] = { + /* state x/x x/d x/0 d/x d/d d/0 0/x 0/d 0/0 */ + + /* S_N */ VCMP, VCMP, VCMP, VCMP, VLEN, VCMP, VCMP, VCMP, VCMP, + /* S_I */ VCMP, -1, -1, 1, VLEN, VLEN, 1, VLEN, VLEN, + /* S_F */ VCMP, VCMP, VCMP, VCMP, VCMP, VCMP, VCMP, VCMP, VCMP, + /* S_Z */ VCMP, 1, 1, -1, VCMP, VCMP, -1, VCMP, VCMP + }; + + if (p1 == p2) + return 0; + + c1 = TOUPPER(*p1); + ++p1; + c2 = TOUPPER(*p2); + ++p2; + + /* Hint: '0' is a digit too. */ + state = S_N + ((c1 == '0') + (xisdigit(c1) != 0)); + + while ((diff = c1 - c2) == 0) { + if (c1 == '\0') + return diff; + + state = next_state[state]; + c1 = TOUPPER(*p1); + ++p1; + c2 = TOUPPER(*p2); + ++p2; + state += (c1 == '0') + (xisdigit(c1) != 0); + } + + state = result_type[state * 3 + (((c2 == '0') + (xisdigit(c2) != 0)))]; // NOLINT + + switch (state) { + case VCMP: + return diff; + case VLEN: + while (xisdigit(*p1++)) + if (!xisdigit(*p2++)) + return 1; + return xisdigit(*p2) ? -1 : diff; + default: + return state; + } +} + +static int (*namecmpfn)(const char * const s1, const char * const s2) = &xstricmp; + +static char * (*fnstrstr)(const char *haystack, const char *needle) = &strcasestr; +#ifdef PCRE +static const unsigned char *tables; +static int pcreflags = PCRE_NO_AUTO_CAPTURE | PCRE_EXTENDED | PCRE_CASELESS | PCRE_UTF8; +#else +static int regflags = REG_NOSUB | REG_EXTENDED | REG_ICASE; +#endif + +#ifdef PCRE +static int setfilter(pcre **pcrex, const char *filter) +{ + const char *errstr = NULL; + int erroffset = 0; + + *pcrex = pcre_compile(filter, pcreflags, &errstr, &erroffset, tables); + + return errstr ? -1 : 0; +} +#else +static int setfilter(regex_t *regex, const char *filter) +{ + return regcomp(regex, filter, regflags); +} +#endif + +static int visible_re(const fltrexp_t *fltrexp, const char *fname) +{ +#ifdef PCRE + return pcre_exec(fltrexp->pcrex, NULL, fname, xstrlen(fname), 0, 0, NULL, 0) == 0; +#else + return regexec(fltrexp->regex, fname, 0, NULL, 0) == 0; +#endif +} + +static int visible_str(const fltrexp_t *fltrexp, const char *fname) +{ + return fnstrstr(fname, fltrexp->str) != NULL; +} + +static int (*filterfn)(const fltrexp_t *fltr, const char *fname) = &visible_str; + +static void clearfilter(void) +{ + char * const fltr = g_ctx[cfg.curctx].c_fltr; + + if (fltr[1]) { + fltr[REGEX_MAX - 1] = fltr[1]; + fltr[1] = '\0'; + } +} + +static int entrycmp(const void *va, const void *vb) +{ + const struct entry *pa = (pEntry)va; + const struct entry *pb = (pEntry)vb; + + if ((pb->flags & DIR_OR_DIRLNK) != (pa->flags & DIR_OR_DIRLNK)) { + if (pb->flags & DIR_OR_DIRLNK) + return 1; + return -1; + } + + /* Sort based on specified order */ + if (cfg.timeorder) { + if (pb->sec > pa->sec) + return 1; + if (pb->sec < pa->sec) + return -1; + /* If sec matches, comare nsec */ + if (pb->nsec > pa->nsec) + return 1; + if (pb->nsec < pa->nsec) + return -1; + } else if (cfg.sizeorder) { + if (pb->size > pa->size) + return 1; + if (pb->size < pa->size) + return -1; + } else if (cfg.blkorder) { + if (pb->blocks > pa->blocks) + return 1; + if (pb->blocks < pa->blocks) + return -1; + } else if (cfg.extnorder && !(pb->flags & DIR_OR_DIRLNK)) { + char *extna = xextension(pa->name, pa->nlen - 1); + char *extnb = xextension(pb->name, pb->nlen - 1); + + if (extna || extnb) { + if (!extna) + return -1; + + if (!extnb) + return 1; + + int ret = strcasecmp(extna, extnb); + + if (ret) + return ret; + } + } + + return namecmpfn(pa->name, pb->name); +} + +static int reventrycmp(const void *va, const void *vb) +{ + if ((((pEntry)vb)->flags & DIR_OR_DIRLNK) + != (((pEntry)va)->flags & DIR_OR_DIRLNK)) { + if (((pEntry)vb)->flags & DIR_OR_DIRLNK) + return 1; + return -1; + } + + return -entrycmp(va, vb); +} + +static int (*entrycmpfn)(const void *va, const void *vb) = &entrycmp; + +/* In case of an error, resets *wch to Esc */ +static int handle_alt_key(wint_t *wch) +{ + timeout(0); + + int r = get_wch(wch); + + if (r == ERR) + *wch = ESC; + cleartimeout(); + + return r; +} + +static inline int handle_event(void) +{ + if (nselected && isselfileempty()) + clearselection(); + return CONTROL('L'); +} + +/* + * Returns SEL_* if key is bound and 0 otherwise. + * Also modifies the run and env pointers (used on SEL_{RUN,RUNARG}). + * The next keyboard input can be simulated by presel. + */ +static int nextsel(int presel) +{ +#ifdef BENCH + return SEL_QUIT; +#endif + wint_t c = presel; + int i = 0; + bool escaped = FALSE; + + if (c == 0 || c == MSGWAIT) { +try_quit: + i = get_wch(&c); + //DPRINTF_D(c); + //DPRINTF_S(keyname(c)); + +#ifdef KEY_RESIZE + if (c == KEY_RESIZE) + handle_key_resize(); +#endif + + /* Handle Alt+key */ + if (c == ESC) { + timeout(0); + i = get_wch(&c); + if (i != ERR) { + if (c == ESC) + c = CONTROL('L'); + else { + unget_wch(c); + c = ';'; + } + settimeout(); + } else if (escaped) { + settimeout(); + c = CONTROL('Q'); + } else { +#ifndef NOFIFO + if (!g_state.fifomode) + notify_fifo(TRUE); /* Send hovered path to NNN_FIFO */ +#endif + escaped = TRUE; + settimeout(); + goto try_quit; + } + } + + if (i == ERR && presel == MSGWAIT) + c = (cfg.filtermode || filterset()) ? FILTER : CONTROL('L'); + else if (c == FILTER || c == CONTROL('L')) + /* Clear previous filter when manually starting */ + clearfilter(); + } + + if (i == ERR) { + ++idle; + + /* + * Do not check for directory changes in du mode. + * A redraw forces du calculation. + * Check for changes every odd second. + */ +#ifdef LINUX_INOTIFY + if (!cfg.blkorder && inotify_wd >= 0 && (idle & 1)) { + struct inotify_event *event; + char inotify_buf[EVENT_BUF_LEN] = {0}; + + i = read(inotify_fd, inotify_buf, EVENT_BUF_LEN); + if (i > 0) { + for (char *ptr = inotify_buf; + ptr + ((struct inotify_event *)ptr)->len < inotify_buf + i; + ptr += sizeof(struct inotify_event) + event->len) { + event = (struct inotify_event *)ptr; + DPRINTF_D(event->wd); + DPRINTF_D(event->mask); + if (!event->wd) + break; + + if (event->mask & INOTIFY_MASK) { + c = handle_event(); + break; + } + } + DPRINTF_S("inotify read done"); + } + } +#elif defined(BSD_KQUEUE) + if (!cfg.blkorder && event_fd >= 0 && (idle & 1)) { + struct kevent event_data[NUM_EVENT_SLOTS] = {0}; + + if (kevent(kq, events_to_monitor, NUM_EVENT_SLOTS, + event_data, NUM_EVENT_FDS, &gtimeout) > 0) + c = handle_event(); + } +#elif defined(HAIKU_NM) + if (!cfg.blkorder && haiku_nm_active && (idle & 1) && haiku_is_update_needed(haiku_hnd)) + c = handle_event(); +#endif + } else + idle = 0; + + for (i = 0; i < (int)ELEMENTS(bindings); ++i) + if (c == bindings[i].sym) + return bindings[i].act; + + return 0; +} + +static int getorderstr(char *sort) +{ + int i = 0; + + if (cfg.showhidden) + sort[i++] = 'H'; + + if (cfg.timeorder) + sort[i++] = (cfg.timetype == T_MOD) ? 'M' : ((cfg.timetype == T_ACCESS) ? 'A' : 'C'); + else if (cfg.sizeorder) + sort[i++] = 'S'; + else if (cfg.extnorder) + sort[i++] = 'E'; + + if (entrycmpfn == &reventrycmp) + sort[i++] = 'R'; + + if (namecmpfn == &xstrverscasecmp) + sort[i++] = 'V'; + + if (i) + sort[i] = ' '; + + return i; +} + +static void showfilterinfo(void) +{ + int i = 0; + char info[REGEX_MAX] = "\0\0\0\0\0"; + + i = getorderstr(info); + + if (cfg.fileinfo && ndents && get_output("file", "-b", pdents[cur].name, -1, FALSE)) + mvaddstr(xlines - 2, 2, g_buf); + else { + snprintf(info + i, REGEX_MAX - i - 1, " %s [/], %4s [:]", + (cfg.regex ? "reg" : "str"), + ((fnstrstr == &strcasestr) ? "ic" : "noic")); + } + + mvaddstr(xlines - 2, xcols - xstrlen(info), info); +} + +static void showfilter(char *str) +{ + attron(COLOR_PAIR(cfg.curctx + 1)); + showfilterinfo(); + printmsg(str); + // printmsg calls attroff() +} + +static inline void swap_ent(int id1, int id2) +{ + struct entry _dent, *pdent1 = &pdents[id1], *pdent2 = &pdents[id2]; + + *(&_dent) = *pdent1; + *pdent1 = *pdent2; + *pdent2 = *(&_dent); +} + +#ifdef PCRE +static int fill(const char *fltr, pcre *pcrex) +#else +static int fill(const char *fltr, regex_t *re) +#endif +{ +#ifdef PCRE + fltrexp_t fltrexp = { .pcrex = pcrex, .str = fltr }; +#else + fltrexp_t fltrexp = { .regex = re, .str = fltr }; +#endif + + for (int count = 0; count < ndents; ++count) { + if (filterfn(&fltrexp, pdents[count].name) == 0) { + if (count != --ndents) { + swap_ent(count, ndents); + --count; + } + + continue; + } + } + + return ndents; +} + +static int matches(const char *fltr) +{ +#ifdef PCRE + pcre *pcrex = NULL; + + /* Search filter */ + if (cfg.regex && setfilter(&pcrex, fltr)) + return -1; + + ndents = fill(fltr, pcrex); + + if (cfg.regex) + pcre_free(pcrex); +#else + regex_t re; + + /* Search filter */ + if (cfg.regex && setfilter(&re, fltr)) + return -1; + + ndents = fill(fltr, &re); + + if (cfg.regex) + regfree(&re); +#endif + + ENTSORT(pdents, ndents, entrycmpfn); + + return ndents; +} + +/* + * Return the position of the matching entry or 0 otherwise + * Note there's no NULL check for fname + */ +static int dentfind(const char *fname, int n) +{ + for (int i = 0; i < n; ++i) + if (xstrcmp(fname, pdents[i].name) == 0) + return i; + + return 0; +} + +static int filterentries(char *path, char *lastname) +{ + alignas(max_align_t) wchar_t wln[REGEX_MAX]; + char *ln = g_ctx[cfg.curctx].c_fltr; + wint_t ch[1]; + int r, total = ndents, len; + char *pln = g_ctx[cfg.curctx].c_fltr + 1; + + DPRINTF_S(__func__); + + if (ndents && (ln[0] == FILTER || ln[0] == RFILTER) && *pln) { + if (matches(pln) != -1) { + move_cursor(dentfind(lastname, ndents), 0); + redraw(path); + } + + if (!cfg.filtermode) { + statusbar(path); + return 0; + } + + len = mbstowcs(wln, ln, REGEX_MAX); + } else { + ln[0] = wln[0] = cfg.regex ? RFILTER : FILTER; + ln[1] = wln[1] = '\0'; + len = 1; + } + + cleartimeout(); + curs_set(TRUE); + showfilter(ln); + + while ((r = get_wch(ch)) != ERR) { + //DPRINTF_D(*ch); + //DPRINTF_S(keyname(*ch)); + + switch (*ch) { +#ifdef KEY_RESIZE + case 0: // fallthrough + case KEY_RESIZE: + clearoldprompt(); + redraw(path); + showfilter(ln); + continue; +#endif + case KEY_DC: // fallthrough + case KEY_BACKSPACE: // fallthrough + case '\b': // fallthrough + case DEL: /* handle DEL */ + if (len != 1) { + wln[--len] = '\0'; + wcstombs(ln, wln, REGEX_MAX); + ndents = total; + } else { + *ch = FILTER; + goto end; + } + // fallthrough + case CONTROL('L'): + if (*ch == CONTROL('L')) { + if (wln[1]) { + ln[REGEX_MAX - 1] = ln[1]; + ln[1] = wln[1] = '\0'; + len = 1; + ndents = total; + } else if (ln[REGEX_MAX - 1]) { /* Show the previous filter */ + ln[1] = ln[REGEX_MAX - 1]; + ln[REGEX_MAX - 1] = '\0'; + len = mbstowcs(wln, ln, REGEX_MAX); + } else + goto end; + } + + /* Go to the top, we don't know if the hovered file will match the filter */ + cur = 0; + + if (matches(pln) != -1) + redraw(path); + + showfilter(ln); + continue; +#ifndef NOMOUSE + case KEY_MOUSE: + goto end; +#endif + case ESC: + if (handle_alt_key(ch) != ERR) { + if (*ch == ESC) /* Handle Alt+Esc */ + *ch = 'q'; /* Quit context */ + else { + unget_wch(*ch); + *ch = ';'; /* Run plugin */ + } + } + goto end; + } + + if (r != OK) /* Handle Fn keys in main loop */ + break; + + /* Handle all control chars in main loop */ + if (*ch < ASCII_MAX && keyname(*ch)[0] == '^' && *ch != '^') + goto end; + + if (len == 1) { + if (*ch == '?') /* Help and config key, '?' is an invalid regex */ + goto end; + + if (cfg.filtermode) { + switch (*ch) { + case '\'': // fallthrough /* Go to first non-dir file */ + case '+': // fallthrough /* Toggle file selection */ + case ',': // fallthrough /* Mark CWD */ + case '-': // fallthrough /* Visit last visited dir */ + case '.': // fallthrough /* Show hidden files */ + case ';': // fallthrough /* Run plugin key */ + case '=': // fallthrough /* Launch app */ + case '>': // fallthrough /* Export file list */ + case '@': // fallthrough /* Visit start dir */ + case ']': // fallthorugh /* Prompt key */ + case '`': // fallthrough /* Visit / */ + case '~': /* Go HOME */ + goto end; + } + } + + /* Toggle case-sensitivity */ + if (*ch == CASE) { + fnstrstr = (fnstrstr == &strcasestr) ? &strstr : &strcasestr; +#ifdef PCRE + pcreflags ^= PCRE_CASELESS; +#else + regflags ^= REG_ICASE; +#endif + showfilter(ln); + continue; + } + + /* Toggle string or regex filter */ + if (*ch == FILTER) { + ln[0] = (ln[0] == FILTER) ? RFILTER : FILTER; + wln[0] = (uchar_t)ln[0]; + cfg.regex ^= 1; + filterfn = cfg.regex ? &visible_re : &visible_str; + showfilter(ln); + continue; + } + + /* Reset cur in case it's a repeat search */ + cur = 0; + } else if (len == REGEX_MAX - 1) + continue; + + wln[len] = (wchar_t)*ch; + wln[++len] = '\0'; + wcstombs(ln, wln, REGEX_MAX); + + /* Forward-filtering optimization: + * - new matches can only be a subset of current matches. + */ + /* ndents = total; */ +#ifdef MATCHFLTR + r = matches(pln); + if (r <= 0) { + !r ? unget_wch(KEY_BACKSPACE) : showfilter(ln); +#else + if (matches(pln) == -1) { + showfilter(ln); +#endif + continue; + } + + /* If the only match is a dir, auto-enter and cd into it */ + if ((ndents == 1) && cfg.autoenter && (pdents[0].flags & DIR_OR_DIRLNK)) { + *ch = KEY_ENTER; + cur = 0; + goto end; + } + + /* + * redraw() should be above the auto-enter optimization, for + * the case where there's an issue with dir auto-enter, say, + * due to a permission problem. The transition is _jumpy_ in + * case of such an error. However, we optimize for successful + * cases where the dir has permissions. This skips a redraw(). + */ + redraw(path); + showfilter(ln); + } +end: + + /* Save last working filter in-filter */ + if (ln[1]) + ln[REGEX_MAX - 1] = ln[1]; + + /* Save current */ + copycurname(); + + curs_set(FALSE); + settimeout(); + + /* Return keys for navigation etc. */ + return *ch; +} + +/* Show a prompt with input string and return the changes */ +static char *xreadline(const char *prefill, const char *prompt) +{ + size_t len, pos; + int x, r; + const int WCHAR_T_WIDTH = sizeof(wchar_t); + wint_t ch[1]; + wchar_t * const buf = malloc(sizeof(wchar_t) * READLINE_MAX); + + if (!buf) + errexit(); + + cleartimeout(); + printmsg(prompt); + + if (prefill) { + DPRINTF_S(prefill); + len = pos = mbstowcs(buf, prefill, READLINE_MAX); + } else + len = (size_t)-1; + + if (len == (size_t)-1) { + buf[0] = '\0'; + len = pos = 0; + } + + x = getcurx(stdscr); + curs_set(TRUE); + + while (1) { + buf[len] = ' '; + attron(COLOR_PAIR(cfg.curctx + 1)); + if (pos > (size_t)(xcols - x)) { + mvaddnwstr(xlines - 1, x, buf + (pos - (xcols - x) + 1), xcols - x); + move(xlines - 1, xcols - 1); + } else { + mvaddnwstr(xlines - 1, x, buf, len + 1); + move(xlines - 1, x + wcswidth(buf, pos)); + } + attroff(COLOR_PAIR(cfg.curctx + 1)); + + r = get_wch(ch); + if (r == ERR) + continue; + + if (r == OK) { + switch (*ch) { + case KEY_ENTER: // fallthrough + case '\n': // fallthrough + case '\r': + goto END; + case CONTROL('D'): + if (pos < len) + ++pos; + else if (!(pos || len)) { /* Exit on ^D at empty prompt */ + len = 0; + goto END; + } else + continue; + // fallthrough + case DEL: // fallthrough + case '\b': /* rhel25 sends '\b' for backspace */ + if (pos > 0) { + memmove(buf + pos - 1, buf + pos, + (len - pos) * WCHAR_T_WIDTH); + --len, --pos; + } + continue; + case '\t': + if (!(len || pos) && ndents) + len = pos = mbstowcs(buf, pdents[cur].name, READLINE_MAX); + continue; + case CONTROL('F'): + if (pos < len) + ++pos; + continue; + case CONTROL('B'): + if (pos > 0) + --pos; + continue; + case CONTROL('W'): + printmsg(prompt); + do { + if (pos == 0) + break; + memmove(buf + pos - 1, buf + pos, + (len - pos) * WCHAR_T_WIDTH); + --pos, --len; + } while (buf[pos - 1] != ' ' && buf[pos - 1] != '/'); // NOLINT + continue; + case CONTROL('K'): + printmsg(prompt); + len = pos; + continue; + case CONTROL('L'): + printmsg(prompt); + len = pos = 0; + continue; + case CONTROL('A'): + pos = 0; + continue; + case CONTROL('E'): + pos = len; + continue; + case CONTROL('U'): + printmsg(prompt); + memmove(buf, buf + pos, (len - pos) * WCHAR_T_WIDTH); + len -= pos; + pos = 0; + continue; + case ESC: /* Exit prompt on Esc, but just filter out Alt+key */ + if (handle_alt_key(ch) != ERR) + continue; + + len = 0; + goto END; + } + + /* Filter out all other control chars */ + if (*ch < ASCII_MAX && keyname(*ch)[0] == '^') + continue; + + if (pos < READLINE_MAX - 1) { + memmove(buf + pos + 1, buf + pos, + (len - pos) * WCHAR_T_WIDTH); + buf[pos] = *ch; + ++len, ++pos; + continue; + } + } else { + switch (*ch) { +#ifdef KEY_RESIZE + case KEY_RESIZE: + clearoldprompt(); + xlines = LINES; + printmsg(prompt); + break; +#endif + case KEY_LEFT: + if (pos > 0) + --pos; + break; + case KEY_RIGHT: + if (pos < len) + ++pos; + break; + case KEY_BACKSPACE: + if (pos > 0) { + memmove(buf + pos - 1, buf + pos, + (len - pos) * WCHAR_T_WIDTH); + --len, --pos; + } + break; + case KEY_DC: + if (pos < len) { + memmove(buf + pos, buf + pos + 1, + (len - pos - 1) * WCHAR_T_WIDTH); + --len; + } + break; + case KEY_END: + pos = len; + break; + case KEY_HOME: + pos = 0; + break; + case KEY_UP: // fallthrough + case KEY_DOWN: + if (prompt && lastcmd && (xstrcmp(prompt, PROMPT) == 0)) { + printmsg(prompt); + len = pos = mbstowcs(buf, lastcmd, READLINE_MAX); // fallthrough + } + default: + break; + } + } + } + +END: + curs_set(FALSE); + settimeout(); + printmsg(""); + + buf[len] = '\0'; + + pos = wcstombs(g_buf, buf, READLINE_MAX - 1); + if (pos >= READLINE_MAX - 1) + g_buf[READLINE_MAX - 1] = '\0'; + + free(buf); + return g_buf; +} + +#ifndef NORL +/* + * Caller should check the value of presel to confirm if it needs to wait to show warning + */ +static char *getreadline(const char *prompt) +{ + exitcurses(); + + char *input = readline(prompt); + + refresh(); + + if (input && input[0]) { + add_history(input); + xstrsncpy(g_buf, input, CMD_LEN_MAX); + free(input); + return g_buf; + } + + free(input); + return NULL; +} +#endif + +/* + * Create symbolic/hard link(s) to file(s) in selection list + * Returns the number of links created, -1 on error + */ +static int xlink(char *prefix, char *path, char *curfname, char *buf, int type) +{ + int count = 0, choice; + char *psel = pselbuf, *fname; + size_t pos = 0, len, r; + int (*link_fn)(const char *, const char *) = NULL; + char lnpath[PATH_MAX]; + + choice = get_cur_or_sel(); + if (!choice) + return -1; + + if (type == 's') /* symbolic link */ + link_fn = &symlink; + else /* hard link */ + link_fn = &link; + + if (choice == 'c' || (nselected == 1)) { + prefix = abspath(prefix, path, lnpath); /* Generate link path */ + if (!prefix) + return -1; + + if (choice == 'c') + mkpath(path, curfname, buf); /* Generate target file path */ + + if (!link_fn((choice == 'c') ? buf : pselbuf, lnpath)) { + if (choice == 's') + clearselection(); + return 1; /* One link created */ + } + return 0; + } + + r = xstrsncpy(buf, prefix, NAME_MAX + 1); /* Copy prefix */ + + while (pos < selbufpos) { + len = xstrlen(psel); + fname = xbasename(psel); + + xstrsncpy(buf + r - 1, fname, NAME_MAX - r); /* Suffix target file name */ + mkpath(path, buf, lnpath); /* Generate link path */ + + if (!link_fn(psel, lnpath)) + ++count; + + pos += len + 1; + psel += len + 1; + } + + if (count == nselected) /* Clear selection if all links are generated */ + clearselection(); + return count; +} + +static bool parsekvpair(kv **arr, char **envcpy, const uchar_t id, uchar_t *items) +{ + bool new = TRUE; + const uchar_t INCR = 8; + uint_t i = 0; + kv *kvarr = NULL; + char *ptr = getenv(env_cfg[id]); + + if (!ptr || !*ptr) + return TRUE; + + *envcpy = xstrdup(ptr); + if (!*envcpy) { + xerror(); + return FALSE; + } + + ptr = *envcpy; + + while (*ptr && i < 100) { + if (new) { + if (!(i & (INCR - 1))) { + kvarr = xrealloc(kvarr, sizeof(kv) * (i + INCR)); + *arr = kvarr; + if (!kvarr) { + xerror(); + return FALSE; + } + memset(kvarr + i, 0, sizeof(kv) * INCR); + } + kvarr[i].key = (uchar_t)*ptr; + if (*++ptr != ':' || *++ptr == '\0' || *ptr == ';') + return FALSE; + kvarr[i].off = ptr - *envcpy; + ++i; + + new = FALSE; + } + + if (*ptr == ';') { + *ptr = '\0'; + new = TRUE; + } + + ++ptr; + } + + *items = i; + return (i != 0); +} + +/* + * Get the value corresponding to a key + * + * NULL is returned in case of no match, path resolution failure etc. + * buf would be modified, so check return value before access + */ +static char *get_kv_val(kv *kvarr, char *buf, int key, uchar_t max, uchar_t id) +{ + char *val; + + if (!kvarr) + return NULL; + + for (int r = 0; r < max && kvarr[r].key; ++r) { + if (kvarr[r].key == key) { + /* Do not allocate new memory for plugin */ + if (id == NNN_PLUG) + return pluginstr + kvarr[r].off; + + val = bmstr + kvarr[r].off; + bool tilde = convert_tilde(val, g_buf); + return abspath((tilde ? g_buf : val), NULL, buf); + } + } + + DPRINTF_S("Invalid key"); + return NULL; +} + +static int get_kv_key(kv *kvarr, char *val, uchar_t max, uchar_t id) +{ + if (!kvarr) + return -1; + + if (id != NNN_ORDER) /* For now this function supports only order string */ + return -1; + + for (int r = 0; r < max && kvarr[r].key; ++r) { + if (xstrcmp((orderstr + kvarr[r].off), val) == 0) + return kvarr[r].key; + } + + return -1; +} + +static void resetdircolor(int flags) +{ + /* Directories are always shown on top, clear the color when moving to first file */ + if (g_state.dircolor && !(flags & DIR_OR_DIRLNK)) { + attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD); + g_state.dircolor = 0; + } +} + +/* + * Replace escape characters in a string with '?' + * Adjust string length to maxcols if > 0; + * Max supported str length: NAME_MAX; + */ +#ifdef NOLC +static char *unescape(const char *str, uint_t maxcols) +{ + char * const wbuf = g_buf; + char *buf = wbuf; + + xstrsncpy(wbuf, str, maxcols); +#else +static wchar_t *unescape(const char *str, uint_t maxcols) +{ + wchar_t * const wbuf = (wchar_t *)g_buf; + wchar_t *buf = wbuf; + size_t len = mbstowcs(wbuf, str, maxcols); /* Convert multi-byte to wide char */ + + len = wcswidth(wbuf, len); + + if (len >= maxcols) { + size_t lencount = maxcols; + + while (len > maxcols) /* Reduce wide chars one by one till it fits */ + len = wcswidth(wbuf, --lencount); + + wbuf[lencount] = L'\0'; + } +#endif + + while (*buf) { + if (*buf <= '\x1f' || *buf == '\x7f') + *buf = '\?'; + + ++buf; + } + + return wbuf; +} + +static off_t get_size(off_t size, off_t *pval, int comp) +{ + off_t rem = *pval; + off_t quo = rem / 10; + + if ((rem - (quo * 10)) >= 5) { + rem = quo + 1; + if (rem == comp) { + ++size; + rem = 0; + } + } else + rem = quo; + + *pval = rem; + return size; +} + +static char *coolsize(off_t size) +{ + const char * const U = "BKMGTPEZY"; + static char size_buf[12]; /* Buffer to hold human readable size */ + off_t rem = 0; + size_t ret; + int i = 0; + + while (size >= 1024) { + rem = size & (0x3FF); /* 1024 - 1 = 0x3FF */ + size >>= 10; + ++i; + } + + if (i == 1) { + rem = (rem * 1000) >> 10; + rem /= 10; + size = get_size(size, &rem, 10); + } else if (i == 2) { + rem = (rem * 1000) >> 10; + size = get_size(size, &rem, 100); + } else if (i > 2) { + rem = (rem * 10000) >> 10; + size = get_size(size, &rem, 1000); + } + + if (i > 0 && i < 6 && rem) { + ret = xstrsncpy(size_buf, xitoa(size), 12); + size_buf[ret - 1] = '.'; + + char *frac = xitoa(rem); + size_t toprint = i > 3 ? 3 : i; + size_t len = xstrlen(frac); + + if (len < toprint) { + size_buf[ret] = size_buf[ret + 1] = size_buf[ret + 2] = '0'; + xstrsncpy(size_buf + ret + (toprint - len), frac, len + 1); + } else + xstrsncpy(size_buf + ret, frac, toprint + 1); + + ret += toprint; + } else { + ret = xstrsncpy(size_buf, size ? xitoa(size) : "0", 12); + --ret; + } + + size_buf[ret] = U[i]; + size_buf[ret + 1] = '\0'; + + return size_buf; +} + +/* Convert a mode field into "ls -l" type perms field. */ +static char *get_lsperms(mode_t mode) +{ + static const char * const rwx[] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"}; + static char bits[11] = {'\0'}; + + switch (mode & S_IFMT) { + case S_IFREG: + bits[0] = '-'; + break; + case S_IFDIR: + bits[0] = 'd'; + break; + case S_IFLNK: + bits[0] = 'l'; + break; + case S_IFSOCK: + bits[0] = 's'; + break; + case S_IFIFO: + bits[0] = 'p'; + break; + case S_IFBLK: + bits[0] = 'b'; + break; + case S_IFCHR: + bits[0] = 'c'; + break; + default: + bits[0] = '?'; + break; + } + + xstrsncpy(&bits[1], rwx[(mode >> 6) & 7], 4); + xstrsncpy(&bits[4], rwx[(mode >> 3) & 7], 4); + xstrsncpy(&bits[7], rwx[(mode & 7)], 4); + + if (mode & S_ISUID) + bits[3] = (mode & 0100) ? 's' : 'S'; /* user executable */ + if (mode & S_ISGID) + bits[6] = (mode & 0010) ? 's' : 'l'; /* group executable */ + if (mode & S_ISVTX) + bits[9] = (mode & 0001) ? 't' : 'T'; /* others executable */ + + return bits; +} + +#ifdef ICONS_ENABLED +static struct icon get_icon(const struct entry *ent) +{ + for (size_t i = 0; i < ELEMENTS(icons_name); ++i) + if (strcasecmp(ent->name, icons_name[i].match) == 0) + return (struct icon){ icons_name[i].icon, icons_name[i].color }; + + if (ent->flags & DIR_OR_DIRLNK) + return dir_icon; + + char *tmp = xextension(ent->name, ent->nlen); + + if (tmp) { + uint16_t z, k, h = icon_ext_hash(++tmp); /* ++tmp to skip '.' */ + for (k = 0; k < ICONS_PROBE_MAX; ++k) { + z = (h + k) % ELEMENTS(icons_ext); + if (strcasecmp(tmp, icons_ext[z].match) == 0) + return (struct icon){ icons_ext_uniq[icons_ext[z].idx], icons_ext[z].color }; + } + } + + /* If there's no match and the file is executable, icon that */ + if (ent->mode & 0100) + return exec_icon; + return file_icon; +} + +static void print_icon(const struct entry *ent, const int attrs) +{ + const struct icon icon = get_icon(ent); + addstr(ICON_PADDING_LEFT); + if (icon.color) + attron(COLOR_PAIR(C_UND + 1 + icon.color)); + else if (attrs) + attron(attrs); + addstr(icon.icon); + if (icon.color) + attroff(COLOR_PAIR(C_UND + 1 + icon.color)); + else if (attrs) + attroff(attrs); + addstr(ICON_PADDING_RIGHT); +} +#endif + +static void print_time(const time_t *timep, const uchar_t flags) +{ + struct tm t; + + /* Highlight timestamp for entries 5 minutes young */ + if (flags & FILE_YOUNG) + attron(A_REVERSE); + + localtime_r(timep, &t); + printw("%s-%02d-%02d %02d:%02d", + xitoa(t.tm_year + 1900), t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min); + + if (flags & FILE_YOUNG) + attroff(A_REVERSE); +} + +static char get_detail_ind(const mode_t mode) +{ + switch (mode & S_IFMT) { + case S_IFDIR: // fallthrough + case S_IFREG: return ' '; + case S_IFLNK: return '@'; + case S_IFSOCK: return '='; + case S_IFIFO: return '|'; + case S_IFBLK: return 'b'; + case S_IFCHR: return 'c'; + } + return '?'; +} + +/* Note: attribute and indicator values must be initialized to 0 */ +static uchar_t get_color_pair_name_ind(const struct entry *ent, char *pind, int *pattr) +{ + switch (ent->mode & S_IFMT) { + case S_IFREG: + if (!ent->size) { + if (ent->mode & 0100) + *pind = '*'; + return C_UND; + } + if (ent->flags & HARD_LINK) { + if (ent->mode & 0100) + *pind = '*'; + return C_HRD; + } + if (ent->mode & 0100) { + *pind = '*'; + return C_EXE; + } + return C_FIL; + case S_IFDIR: + *pind = '/'; + if (g_state.oldcolor) + return C_DIR; + *pattr |= A_BOLD; + return g_state.dirctx ? cfg.curctx + 1 : C_DIR; + case S_IFLNK: + if (ent->flags & DIR_OR_DIRLNK) { + *pind = '/'; + *pattr |= g_state.oldcolor ? A_DIM : A_BOLD; + } else { + *pind = '@'; + if (g_state.oldcolor) + *pattr |= A_DIM; + } + if (!g_state.oldcolor || cfg.showdetail) + return (ent->flags & SYM_ORPHAN) ? C_ORP : C_LNK; + return 0; + case S_IFSOCK: + *pind = '='; + return C_SOC; + case S_IFIFO: + *pind = '|'; + return C_PIP; + case S_IFBLK: + return C_BLK; + case S_IFCHR: + return C_CHR; + } + + *pind = '?'; + return C_UND; +} + +static void printent(const struct entry *ent, uint_t namecols, bool sel) +{ + char ind = '\0'; + int attrs; + + if (cfg.showdetail) { + int type = ent->mode & S_IFMT; + char perms[6] = {' ', ' ', (char)('0' + ((ent->mode >> 6) & 7)), + (char)('0' + ((ent->mode >> 3) & 7)), + (char)('0' + (ent->mode & 7)), '\0'}; + + addch(' '); + attrs = g_state.oldcolor ? (resetdircolor(ent->flags), A_DIM) + : (fcolors[C_MIS] ? COLOR_PAIR(C_MIS) : 0); + if (attrs) + attron(attrs); + + /* Print details */ + print_time(&ent->sec, ent->flags); + + printw("%s%9s ", perms, (type == S_IFREG || type == S_IFDIR) + ? coolsize(cfg.blkorder ? (blkcnt_t)ent->blocks << blk_shift : ent->size) + : (type = (uchar_t)get_detail_ind(ent->mode), (char *)&type)); + + if (attrs) + attroff(attrs); + } + + attrs = 0; + + uchar_t color_pair = get_color_pair_name_ind(ent, &ind, &attrs); + + addch((ent->flags & FILE_SELECTED) ? '+' | A_REVERSE | A_BOLD : ' '); + + if (g_state.oldcolor) + resetdircolor(ent->flags); + else { + if (ent->flags & FILE_MISSING) + color_pair = C_MIS; + if (color_pair && fcolors[color_pair]) + attrs |= COLOR_PAIR(color_pair); +#ifdef ICONS_ENABLED + print_icon(ent, attrs); +#endif + } + + if (sel) + attrs |= A_REVERSE; + if (attrs) + attron(attrs); + if (!ind) + ++namecols; + +#ifndef NOLC + addwstr(unescape(ent->name, namecols)); +#else + addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1)); +#endif + + if (attrs) + attroff(attrs); + if (ind) + addch(ind); +} + +static void savecurctx(char *path, char *curname, int nextctx) +{ + settings tmpcfg = cfg; + context *ctxr = &g_ctx[nextctx]; + + /* Save current context */ + if (curname) + xstrsncpy(g_ctx[tmpcfg.curctx].c_name, curname, NAME_MAX + 1); + else + g_ctx[tmpcfg.curctx].c_name[0] = '\0'; + + g_ctx[tmpcfg.curctx].c_cfg = tmpcfg; + + if (ctxr->c_cfg.ctxactive) { /* Switch to saved context */ + tmpcfg = ctxr->c_cfg; + /* Skip ordering an open context */ + if (order) { + cfgsort[CTX_MAX] = cfgsort[nextctx]; + cfgsort[nextctx] = '0'; + } + } else { /* Set up a new context from current context */ + ctxr->c_cfg.ctxactive = 1; + xstrsncpy(ctxr->c_path, path, PATH_MAX); + ctxr->c_last[0] = ctxr->c_name[0] = ctxr->c_fltr[0] = ctxr->c_fltr[1] = '\0'; + ctxr->c_cfg = tmpcfg; + /* If already in an ordered dir, clear ordering for the new context and let it order */ + if (cfgsort[cfg.curctx] == 'z') + cfgsort[nextctx] = 'z'; + } + + tmpcfg.curctx = nextctx; + cfg = tmpcfg; +} + +#ifndef NOSSN +static void save_session(const char *sname, int *presel) +{ + int fd, i; + session_header_t header = {0}; + bool status = FALSE; + char ssnpath[PATH_MAX]; + char spath[PATH_MAX]; + + header.ver = SESSIONS_VERSION; + + for (i = 0; i < CTX_MAX; ++i) { + if (g_ctx[i].c_cfg.ctxactive) { + if (cfg.curctx == i && ndents) + /* Update current file name, arrows don't update it */ + xstrsncpy(g_ctx[i].c_name, pdents[cur].name, NAME_MAX + 1); + header.pathln[i] = MIN(xstrlen(g_ctx[i].c_path), PATH_MAX) + 1; + header.lastln[i] = MIN(xstrlen(g_ctx[i].c_last), PATH_MAX) + 1; + header.nameln[i] = MIN(xstrlen(g_ctx[i].c_name), NAME_MAX) + 1; + header.fltrln[i] = REGEX_MAX; + } + } + + mkpath(cfgpath, toks[TOK_SSN], ssnpath); + mkpath(ssnpath, sname, spath); + + fd = open(spath, O_CREAT | O_WRONLY | O_TRUNC, S_IWUSR | S_IRUSR); + if (fd == -1) { + printwait(messages[MSG_SEL_MISSING], presel); + return; + } + + if ((write(fd, &header, sizeof(header)) != (ssize_t)sizeof(header)) + || (write(fd, &cfg, sizeof(cfg)) != (ssize_t)sizeof(cfg))) + goto END; + + for (i = 0; i < CTX_MAX; ++i) + if ((write(fd, &g_ctx[i].c_cfg, sizeof(settings)) != (ssize_t)sizeof(settings)) + || (write(fd, &g_ctx[i].color, sizeof(uint_t)) != (ssize_t)sizeof(uint_t)) + || (header.nameln[i] > 0 + && write(fd, g_ctx[i].c_name, header.nameln[i]) != (ssize_t)header.nameln[i]) + || (header.lastln[i] > 0 + && write(fd, g_ctx[i].c_last, header.lastln[i]) != (ssize_t)header.lastln[i]) + || (header.fltrln[i] > 0 + && write(fd, g_ctx[i].c_fltr, header.fltrln[i]) != (ssize_t)header.fltrln[i]) + || (header.pathln[i] > 0 + && write(fd, g_ctx[i].c_path, header.pathln[i]) != (ssize_t)header.pathln[i])) + goto END; + + status = TRUE; + +END: + close(fd); + + if (!status) + printwait(messages[MSG_FAILED], presel); +} + +static bool load_session(const char *sname, char **path, char **lastdir, char **lastname, bool restore) +{ + int fd, i = 0; + session_header_t header; + bool has_loaded_dynamically = !(sname || restore); + bool status = (sname && g_state.picker); /* Picker mode with session program option */ + char ssnpath[PATH_MAX]; + char spath[PATH_MAX]; + + mkpath(cfgpath, toks[TOK_SSN], ssnpath); + + if (!restore) { + sname = sname ? sname : xreadline(NULL, messages[MSG_SSN_NAME]); + if (!sname[0]) + return FALSE; + + mkpath(ssnpath, sname, spath); + + /* If user is explicitly loading the "last session", skip auto-save */ + if ((sname[0] == '@') && !sname[1]) + has_loaded_dynamically = FALSE; + } else + mkpath(ssnpath, "@", spath); + + if (has_loaded_dynamically) + save_session("@", NULL); + + fd = open(spath, O_RDONLY, S_IWUSR | S_IRUSR); + if (fd == -1) { + if (!status) { + printmsg(messages[MSG_SEL_MISSING]); + xdelay(XDELAY_INTERVAL_MS); + } + return FALSE; + } + + status = FALSE; + + if ((read(fd, &header, sizeof(header)) != (ssize_t)sizeof(header)) + || (header.ver != SESSIONS_VERSION) + || (read(fd, &cfg, sizeof(cfg)) != (ssize_t)sizeof(cfg))) + goto END; + + g_ctx[cfg.curctx].c_name[0] = g_ctx[cfg.curctx].c_last[0] + = g_ctx[cfg.curctx].c_fltr[0] = g_ctx[cfg.curctx].c_fltr[1] = '\0'; + + for (; i < CTX_MAX; ++i) + if ((read(fd, &g_ctx[i].c_cfg, sizeof(settings)) != (ssize_t)sizeof(settings)) + || (read(fd, &g_ctx[i].color, sizeof(uint_t)) != (ssize_t)sizeof(uint_t)) + || (header.nameln[i] > 0 + && read(fd, g_ctx[i].c_name, header.nameln[i]) != (ssize_t)header.nameln[i]) + || (header.lastln[i] > 0 + && read(fd, g_ctx[i].c_last, header.lastln[i]) != (ssize_t)header.lastln[i]) + || (header.fltrln[i] > 0 + && read(fd, g_ctx[i].c_fltr, header.fltrln[i]) != (ssize_t)header.fltrln[i]) + || (header.pathln[i] > 0 + && read(fd, g_ctx[i].c_path, header.pathln[i]) != (ssize_t)header.pathln[i])) + goto END; + + *path = g_ctx[cfg.curctx].c_path; + *lastdir = g_ctx[cfg.curctx].c_last; + *lastname = g_ctx[cfg.curctx].c_name; + set_sort_flags('\0'); /* Set correct sort options */ + status = TRUE; + +END: + close(fd); + + if (!status) { + printmsg(messages[MSG_FAILED]); + xdelay(XDELAY_INTERVAL_MS); + } else if (restore) + unlink(spath); + + return status; +} +#endif + +static uchar_t get_free_ctx(void) +{ + uchar_t r = cfg.curctx; + + do + r = (r + 1) & ~CTX_MAX; + while (g_ctx[r].c_cfg.ctxactive && (r != cfg.curctx)); + + return r; +} + +/* ctx is absolute: 1 to 4, + for smart context */ +static void set_smart_ctx(int ctx, char *nextpath, char **path, char *file, char **lastname, char **lastdir) +{ + if (ctx == '+') /* Get smart context */ + ctx = (int)(get_free_ctx() + 1); + + if (ctx == 0 || ctx == cfg.curctx + 1) { /* Same context */ + clearfilter(); + xstrsncpy(*lastdir, *path, PATH_MAX); + xstrsncpy(*path, nextpath, PATH_MAX); + } else { /* New context */ + --ctx; + /* Deactivate the new context and build from scratch */ + g_ctx[ctx].c_cfg.ctxactive = 0; + DPRINTF_S(nextpath); + savecurctx(nextpath, file, ctx); + *path = g_ctx[ctx].c_path; + *lastdir = g_ctx[ctx].c_last; + *lastname = g_ctx[ctx].c_name; + } +} + +/* + * This function does one of the following depending on the values of `fdout` and `page`: + * 1) fdout == -1 && !page: Write up to CMD_LEN_MAX bytes of command output into g_buf + * 2) fdout == -1 && page: Create a temp file, write full command output into it and show in pager. + * 3) fdout != -1 && !page: Write full command output into the provided file. + * 4) fdout != -1 && page: Don't use! Returns FALSE. + * + * g_buf is modified only in case 1. + * g_tmpfpath is modified only in case 2. + */ +static bool get_output(char *file, char *arg1, char *arg2, int fdout, bool page) +{ + pid_t pid; + int pipefd[2]; + int index = 0, flags; + bool ret = FALSE; + bool have_file = fdout != -1; + int cmd_in_fd = -1; + int cmd_out_fd = -1; + ssize_t len; + + /* + * In this case the logic of the function dictates that we should write the output of the command + * to `fd` and show it in the pager. But since we didn't open the file descriptor we have no right + * to close it, the caller must do it. We don't even know the path to pass to the pager and + * it's a real hassle to get it. In general this just invites problems so we are blocking it. + */ + if (have_file && page) { + DPRINTF_S("invalid get_ouptput() call"); + return FALSE; + } + + /* Setup file descriptors for child command */ + if (!have_file && page) { + // Case 2 + fdout = create_tmp_file(); + if (fdout == -1) + return FALSE; + + cmd_in_fd = STDIN_FILENO; + cmd_out_fd = fdout; + } else if (have_file) { + // Case 3 + cmd_in_fd = STDIN_FILENO; + cmd_out_fd = fdout; + } else { + // Case 1 + if (pipe(pipefd) == -1) + errexit(); + + for (index = 0; index < 2; ++index) { + /* Get previous flags */ + flags = fcntl(pipefd[index], F_GETFL, 0); + + /* Set bit for non-blocking flag */ + flags |= O_NONBLOCK; + + /* Change flags on fd */ + fcntl(pipefd[index], F_SETFL, flags); + } + + cmd_in_fd = pipefd[0]; + cmd_out_fd = pipefd[1]; + } + + pid = fork(); + if (pid == 0) { + /* In child */ + close(cmd_in_fd); + dup2(cmd_out_fd, STDOUT_FILENO); + dup2(cmd_out_fd, STDERR_FILENO); + close(cmd_out_fd); + + spawn(file, arg1, arg2, NULL, F_MULTI); + _exit(EXIT_SUCCESS); + } + + /* In parent */ + waitpid(pid, NULL, 0); + + /* Do what each case should do */ + if (!have_file && page) { + // Case 2 + close(fdout); + + spawn(pager, g_tmpfpath, NULL, NULL, F_CLI | F_TTY); + + unlink(g_tmpfpath); + return TRUE; + } + + if (have_file) + // Case 3 + return TRUE; + + // Case 1 + len = read(pipefd[0], g_buf, CMD_LEN_MAX - 1); + if (len > 0) + ret = TRUE; + + close(pipefd[0]); + close(pipefd[1]); + return ret; +} + +/* + * Follows the stat(1) output closely + */ +static bool show_stats(char *fpath) +{ + static char * const cmds[] = { +#ifdef FILE_MIME_OPTS + ("file " FILE_MIME_OPTS), +#endif + "file -b", +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) + "stat -x", +#else + "stat", +#endif + }; + + size_t r = ELEMENTS(cmds); + int fd = create_tmp_file(); + if (fd == -1) + return FALSE; + + while (r) + get_output(cmds[--r], fpath, NULL, fd, FALSE); + + close(fd); + + spawn(pager, g_tmpfpath, NULL, NULL, F_CLI | F_TTY); + unlink(g_tmpfpath); + return TRUE; +} + +static bool xchmod(const char *fpath, mode_t *mode) +{ + /* (Un)set (S_IXUSR | S_IXGRP | S_IXOTH) */ + (0100 & *mode) ? (*mode &= ~0111) : (*mode |= 0111); + + return (chmod(fpath, *mode) == 0); +} + +static size_t get_fs_info(const char *path, uchar_t type) +{ + struct statvfs svb; + + if (statvfs(path, &svb) == -1) + return 0; + + if (type == VFS_AVAIL) + return (size_t)svb.f_bavail << ffs((int)(svb.f_frsize >> 1)); + + if (type == VFS_USED) + return ((size_t)svb.f_blocks - (size_t)svb.f_bfree) << ffs((int)(svb.f_frsize >> 1)); + + return (size_t)svb.f_blocks << ffs((int)(svb.f_frsize >> 1)); /* VFS_SIZE */ +} + +/* Create non-existent parents and a file or dir */ +static bool xmktree(char *path, bool dir) +{ + char *p = path; + char *slash = path; + + if (!p || !*p) + return FALSE; + + /* Skip the first '/' */ + ++p; + + while (*p != '\0') { + if (*p == '/') { + slash = p; + *p = '\0'; + } else { + ++p; + continue; + } + + /* Create folder from path to '\0' inserted at p */ + if (mkdir(path, 0777) == -1 && errno != EEXIST) { +#ifdef __HAIKU__ + // XDG_CONFIG_HOME contains a directory + // that is read-only, but the full path + // is writeable. + // Try to continue and see what happens. + // TODO: Find a more robust solution. + if (errno == B_READ_ONLY_DEVICE) + goto next; +#endif + DPRINTF_S("mkdir1!"); + DPRINTF_S(strerror(errno)); + *slash = '/'; + return FALSE; + } + +#ifdef __HAIKU__ +next: +#endif + /* Restore path */ + *slash = '/'; + ++p; + } + + if (dir) { + if (mkdir(path, 0777) == -1 && errno != EEXIST) { + DPRINTF_S("mkdir2!"); + DPRINTF_S(strerror(errno)); + return FALSE; + } + } else { + int fd = open(path, O_CREAT | O_TRUNC, S_IWUSR | S_IRUSR); /* Forced create mode for files */ + + if (fd == -1 && errno != EEXIST) { + DPRINTF_S("open!"); + DPRINTF_S(strerror(errno)); + return FALSE; + } + + close(fd); + } + + return TRUE; +} + +/* List or extract archive */ +static bool handle_archive(char *fpath /* in-out param */, char op) +{ + char arg[] = "-tvf"; /* options for tar/bsdtar to list files */ + char *util, *outdir = NULL; + bool x_to = FALSE; + bool is_atool = (!g_state.usebsdtar && getutil(utils[UTIL_ATOOL])); + + if (op == 'x') { + outdir = xreadline(is_atool ? "." : xbasename(fpath), messages[MSG_NEW_PATH]); + if (!outdir || !*outdir) { /* Cancelled */ + printwait(messages[MSG_CANCEL], NULL); + return FALSE; + } + /* Do not create smart context for current dir */ + if (!(*outdir == '.' && outdir[1] == '\0')) { + if (!xmktree(outdir, TRUE) || (chdir(outdir) == -1)) { + printwarn(NULL); + return FALSE; + } + /* Copy the new dir path to open it in smart context */ + outdir = getcwd(NULL, 0); + x_to = TRUE; + } + } + + if (is_atool) { + util = utils[UTIL_ATOOL]; + arg[1] = op; + arg[2] = '\0'; + } else if (getutil(utils[UTIL_BSDTAR])) { + util = utils[UTIL_BSDTAR]; + if (op == 'x') + arg[1] = op; + } else if (is_suffix(fpath, ".zip")) { + util = utils[UTIL_UNZIP]; + arg[1] = (op == 'l') ? 'v' /* verbose listing */ : '\0'; + arg[2] = '\0'; + } else { + util = utils[UTIL_TAR]; + if (op == 'x') + arg[1] = op; + } + + if (op == 'x') /* extract */ + spawn(util, arg, fpath, NULL, F_NORMAL | F_MULTI); + else /* list */ + get_output(util, arg, fpath, -1, TRUE); + + if (x_to) { + if (chdir(xdirname(fpath)) == -1) { + printwarn(NULL); + free(outdir); + return FALSE; + } + xstrsncpy(fpath, outdir, PATH_MAX); + free(outdir); + } else if (op == 'x') + fpath[0] = '\0'; + + return TRUE; +} + +static char *visit_parent(char *path, char *newpath, int *presel) +{ + char *dir; + + /* There is no going back */ + if (istopdir(path)) { + /* Continue in type-to-nav mode, if enabled */ + if (cfg.filtermode && presel) + *presel = FILTER; + return NULL; + } + + /* Use a copy as xdirname() may change the string passed */ + if (newpath) + xstrsncpy(newpath, path, PATH_MAX); + else + newpath = path; + + dir = xdirname(newpath); + if (chdir(dir) == -1) { + printwarn(presel); + return NULL; + } + + return dir; +} + +static void valid_parent(char *path, char *lastname) +{ + /* Save history */ + xstrsncpy(lastname, xbasename(path), NAME_MAX + 1); + + while (!istopdir(path)) + if (visit_parent(path, NULL, NULL)) + break; + + printwarn(NULL); + xdelay(XDELAY_INTERVAL_MS); +} + +static bool archive_mount(char *newpath) +{ + char *dir, *cmd = xgetenv("NNN_ARCHMNT", utils[UTIL_ARCHMNT]); + char *name = pdents[cur].name; + size_t len = pdents[cur].nlen; + char mntpath[PATH_MAX]; + + if (!getutil(cmd)) { + printmsg("install utility"); + return FALSE; + } + + dir = xstrdup(name); + if (!dir) { + printmsg(messages[MSG_FAILED]); + return FALSE; + } + + while (len > 1) + if (dir[--len] == '.') { + dir[len] = '\0'; + break; + } + + DPRINTF_S(dir); + + /* Create the mount point */ + mkpath(cfgpath, toks[TOK_MNT], mntpath); + mkpath(mntpath, dir, newpath); + free(dir); + + if (!xmktree(newpath, TRUE)) { + printwarn(NULL); + return FALSE; + } + + /* Mount archive */ + DPRINTF_S(name); + DPRINTF_S(newpath); + if (spawn(cmd, name, newpath, NULL, F_NORMAL)) { + printmsg(messages[MSG_FAILED]); + return FALSE; + } + + return TRUE; +} + +static bool remote_mount(char *newpath) +{ + uchar_t flag = F_CLI; + int opt; + char *tmp, *env; + bool r = getutil(utils[UTIL_RCLONE]), s = getutil(utils[UTIL_SSHFS]); + char mntpath[PATH_MAX]; + + if (!(r || s)) { + printmsg("install sshfs/rclone"); + return FALSE; + } + + if (r && s) + opt = get_input(messages[MSG_REMOTE_OPTS]); + else + opt = (!s) ? 'r' : 's'; + + if (opt == 's') + env = xgetenv("NNN_SSHFS", utils[UTIL_SSHFS]); + else if (opt == 'r') { + flag |= F_NOWAIT | F_NOTRACE; + env = xgetenv("NNN_RCLONE", "rclone mount"); + } else { + printmsg(messages[MSG_INVALID_KEY]); + return FALSE; + } + + tmp = xreadline(NULL, "host[:dir] > "); + if (!tmp[0]) { + printmsg(messages[MSG_CANCEL]); + return FALSE; + } + + char *div = strchr(tmp, ':'); + + if (div) + *div = '\0'; + + /* Create the mount point */ + mkpath(cfgpath, toks[TOK_MNT], mntpath); + mkpath(mntpath, tmp, newpath); + if (!xmktree(newpath, TRUE)) { + printwarn(NULL); + return FALSE; + } + + if (!div) { /* Convert "host" to "host:" */ + size_t len = xstrlen(tmp); + + tmp[len] = ':'; + tmp[len + 1] = '\0'; + } else + *div = ':'; + + /* Connect to remote */ + if (opt == 's') { + if (spawn(env, tmp, newpath, NULL, flag)) { + printmsg(messages[MSG_FAILED]); + return FALSE; + } + } else { + spawn(env, tmp, newpath, NULL, flag); + printmsg(messages[MSG_RCLONE_DELAY]); + xdelay(XDELAY_INTERVAL_MS << 2); /* Set 4 times the usual delay */ + } + + return TRUE; +} + +/* + * Unmounts if the directory represented by name is a mount point. + * Otherwise, asks for hostname + * Returns TRUE if directory needs to be refreshed *. + */ +static bool unmount(char *name, char *newpath, int *presel, char *currentpath) +{ +#if defined(__APPLE__) || defined(__FreeBSD__) + static char cmd[] = "umount"; +#else + static char cmd[] = "fusermount3"; /* Arch Linux utility */ + static bool found = FALSE; +#endif + char *tmp = name; + struct stat sb, psb; + bool child = FALSE; + bool parent = FALSE; + bool hovered = FALSE; + char mntpath[PATH_MAX]; + +#if !defined(__APPLE__) && !defined(__FreeBSD__) + /* On Ubuntu it's fusermount */ + if (!found && !getutil(cmd)) { + cmd[10] = '\0'; + found = TRUE; + } +#endif + + mkpath(cfgpath, toks[TOK_MNT], mntpath); + + if (tmp && strcmp(mntpath, currentpath) == 0) { + mkpath(mntpath, tmp, newpath); + child = lstat(newpath, &sb) != -1; + parent = lstat(xdirname(newpath), &psb) != -1; + if (!child && !parent) { + *presel = MSGWAIT; + return FALSE; + } + } + + if (!tmp || !child || !S_ISDIR(sb.st_mode) || (child && parent && sb.st_dev == psb.st_dev)) { + tmp = xreadline(NULL, messages[MSG_HOSTNAME]); + if (!tmp[0]) + return FALSE; + if (name && (tmp[0] == '-') && (tmp[1] == '\0')) { + mkpath(currentpath, name, newpath); + hovered = TRUE; + } + } + + if (!hovered) + mkpath(mntpath, tmp, newpath); + + if (!xdiraccess(newpath)) { + *presel = MSGWAIT; + return FALSE; + } + +#if defined(__APPLE__) || defined(__FreeBSD__) + if (spawn(cmd, newpath, NULL, NULL, F_NORMAL)) { +#else + if (spawn(cmd, "-qu", newpath, NULL, F_NORMAL)) { +#endif + if (!xconfirm(get_input(messages[MSG_LAZY]))) + return FALSE; + +#ifdef __APPLE__ + if (spawn(cmd, "-l", newpath, NULL, F_NORMAL)) { +#elif defined(__FreeBSD__) + if (spawn(cmd, "-f", newpath, NULL, F_NORMAL)) { +#else + if (spawn(cmd, "-quz", newpath, NULL, F_NORMAL)) { +#endif + printwait(messages[MSG_FAILED], presel); + return FALSE; + } + } + + if (rmdir(newpath) == -1) { + printwarn(presel); + return FALSE; + } + + return TRUE; +} + +static void lock_terminal(void) +{ + spawn(xgetenv("NNN_LOCKER", utils[UTIL_LOCKER]), NULL, NULL, NULL, F_CLI); +} + +static void printkv(kv *kvarr, int fd, uchar_t max, uchar_t id) +{ + char *val = (id == NNN_BMS) ? bmstr : pluginstr; + + for (uchar_t i = 0; i < max && kvarr[i].key; ++i) + dprintf(fd, " %c: %s\n", (char)kvarr[i].key, val + kvarr[i].off); +} + +static void printkeys(kv *kvarr, char *buf, uchar_t max) +{ + uchar_t i = 0; + + for (; i < max && kvarr[i].key; ++i) { + buf[i << 1] = ' '; + buf[(i << 1) + 1] = kvarr[i].key; + } + + buf[i << 1] = '\0'; +} + +static size_t handle_bookmark(const char *bmark, char *newpath) +{ + int fd = '\r'; + size_t r; + + if (maxbm || bmark) { + r = xstrsncpy(g_buf, messages[MSG_KEYS], CMD_LEN_MAX); + + if (bmark) { /* There is a marked directory */ + g_buf[--r] = ' '; + g_buf[++r] = ','; + g_buf[++r] = '\0'; + ++r; + } + printkeys(bookmark, g_buf + r - 1, maxbm); + printmsg(g_buf); + fd = get_input(NULL); + } + + r = FALSE; + if (fd == ',') /* Visit marked directory */ + bmark ? xstrsncpy(newpath, bmark, PATH_MAX) : (r = MSG_NOT_SET); + else if (fd == '\r') { /* Visit bookmarks directory */ + mkpath(cfgpath, toks[TOK_BM], newpath); + g_state.selbm = 1; + } else if (!get_kv_val(bookmark, newpath, fd, maxbm, NNN_BMS)) + r = MSG_INVALID_KEY; + + if (!r && chdir(newpath) == -1) { + r = MSG_ACCESS; + if (g_state.selbm) + g_state.selbm = 0; + } + + return r; +} + +static void add_bookmark(char *path, char *newpath, int *presel) +{ + char *dir = xbasename(path); + + dir = xreadline(dir[0] ? dir : NULL, messages[MSG_BM_NAME]); + if (dir && *dir) { + size_t r = mkpath(cfgpath, toks[TOK_BM], newpath); + + newpath[r - 1] = '/'; + xstrsncpy(newpath + r, dir, PATH_MAX - r); + printwait((symlink(path, newpath) == -1) ? strerror(errno) : newpath, presel); + } else + printwait(messages[MSG_CANCEL], presel); +} + +/* + * The help string tokens (each line) start with a HEX value which indicates + * the number of spaces to print before the particular token. In the middle, + * %NN can be used to insert a run of spaces, e.g %10 will print 10 spaces. + * %NN MUST be 2 characters long, e.g %05 for 5 spaces. + * + * This method was chosen instead of a flat string because the number of bytes + * in help was increasing the binary size by around a hundred bytes. This would + * only have increased as we keep adding new options. + */ +static void show_help(const char *path) +{ + static const char helpstr[] = { + "2|V\\_\n" + "2/. \\\\\n" + "1(;^; ||\n" + "3/___3\n" + "2(___n))\n" + "0\n" + "1NAVIGATION\n" + "9Up k Up%16PgUp ^U Page up\n" + "9Dn j Down%14PgDn ^D Page down\n" + "9Lt h Parent%12~ ` @ - ~, /, start, prev\n" + "5Ret Rt l Open%20' First file/match\n" + "9g ^A Top%21J Jump to entry/offset\n" + "9G ^E End%20^J Toggle auto-advance on open\n" + "8B (,) Book(mark)%11b ^/ Select bookmark\n" + "a1-4 Context%11(Sh)Tab Cycle/new context\n" + "62Esc ^Q Quit%19^y Next young\n" + "b^G QuitCD%18Q Pick/err, quit\n" + "cq Quit context\n" + "0\n" + "1FILTER & PROMPT\n" + "c/ Filter%17^N Toggle type-to-nav\n" + "aEsc Exit prompt%12^L Toggle last filter\n" + "c. Toggle hidden%05Alt+Esc Unfilter, quit context\n" + "0\n" + "1FILES\n" + "9o ^O Open with%15n Create new/link\n" + "9f ^F File stats%14d Detail mode toggle\n" + "b^R Rename/dup%14r Batch rename\n" + "cz Archive%17e Edit file\n" + "c* Toggle exe%14> Export list\n" + "6Space + (Un)select%12m-m Select range/clear\n" + "ca Select all%14A Invert sel\n" + "9p ^P Copy here%12w ^W Cp/mv sel as\n" + "9v ^V Move here%15E Edit sel list\n" + "9x ^X Delete%18S Listed sel size\n" + "aEsc Send to FIFO\n" + "0\n" + "1MISC\n" + "8Alt ; Select plugin%11= Launch app\n" + "9! ^] Shell%19] Cmd prompt\n" + "cc Connect remote%10u Unmount remote/archive\n" + "9t ^T Sort toggles%12s Manage session\n" + "cT Set time type%110 Lock\n" + "b^L Redraw%18? Help, conf\n" + }; + + int fd = create_tmp_file(); + if (fd == -1) + return; + + char *prog = xgetenv(env_cfg[NNN_HELP], NULL); + if (prog) + get_output(prog, NULL, NULL, fd, FALSE); + + bool hex = true; + char *w = g_buf; + const char *end = helpstr + (sizeof helpstr - 1); + for (const char *s = helpstr; s < end; ++s) { + if (hex) { + for (int k = 0, n = xchartohex(*s); k < n; ++k) *w++ = ' '; + } else if (*s == '%') { + int n = ((s[1] - '0') * 10) + (s[2] - '0'); + for (int k = 0; k < n; ++k) *w++ = ' '; + s += 2; + } else { + *w++ = *s; + } + hex = *s == '\n'; + } + if (write(fd, g_buf, w - g_buf)) {} // silence warning + + dprintf(fd, "\nLOCATIONS\n"); + for (uchar_t i = 0; i < CTX_MAX; ++i) + if (g_ctx[i].c_cfg.ctxactive) + dprintf(fd, " %u: %s\n", i + 1, g_ctx[i].c_path); + + dprintf(fd, "\nVOLUME: avail:%s ", coolsize(get_fs_info(path, VFS_AVAIL))); + dprintf(fd, "used:%s ", coolsize(get_fs_info(path, VFS_USED))); + dprintf(fd, "size:%s\n\n", coolsize(get_fs_info(path, VFS_SIZE))); + + if (bookmark) { + dprintf(fd, "BOOKMARKS\n"); + printkv(bookmark, fd, maxbm, NNN_BMS); + dprintf(fd, "\n"); + } + + if (plug) { + dprintf(fd, "PLUGIN KEYS\n"); + printkv(plug, fd, maxplug, NNN_PLUG); + dprintf(fd, "\n"); + } + + for (uchar_t i = NNN_OPENER; i <= NNN_TRASH; ++i) { + char *s = getenv(env_cfg[i]); + if (s) + dprintf(fd, "%s: %s\n", env_cfg[i], s); + } + + if (selpath) + dprintf(fd, "SELECTION FILE: %s\n", selpath); + + dprintf(fd, "\nv%s\n%s\n", VERSION, GENERAL_INFO); + close(fd); + + spawn(pager, g_tmpfpath, NULL, NULL, F_CLI | F_TTY); + unlink(g_tmpfpath); +} + +static void setexports(void) +{ + char dvar[] = "d0"; + char fvar[] = "f0"; + + if (ndents) { + setenv(envs[ENV_NCUR], pdents[cur].name, 1); + xstrsncpy(g_ctx[cfg.curctx].c_name, pdents[cur].name, NAME_MAX + 1); + } else if (g_ctx[cfg.curctx].c_name[0]) + g_ctx[cfg.curctx].c_name[0] = '\0'; + + for (uchar_t i = 0; i < CTX_MAX; ++i) { + if (g_ctx[i].c_cfg.ctxactive) { + dvar[1] = fvar[1] = '1' + i; + setenv(dvar, g_ctx[i].c_path, 1); + + if (g_ctx[i].c_name[0]) { + mkpath(g_ctx[i].c_path, g_ctx[i].c_name, g_buf); + setenv(fvar, g_buf, 1); + } + } + } + setenv("NNN_INCLUDE_HIDDEN", xitoa(cfg.showhidden), 1); + setenv("NNN_PREFER_SELECTION", xitoa(cfg.prefersel), 1); +} + +static void run_cmd_as_plugin(const char *file, uchar_t flags) +{ + size_t len; + + xstrsncpy(g_buf, file, PATH_MAX); + + len = xstrlen(g_buf); + if (len > 1 && g_buf[len - 1] == '*') { + flags &= ~F_CONFIRM; /* Skip user confirmation */ + g_buf[len - 1] = '\0'; /* Get rid of trailing no confirmation symbol */ + --len; + } + + if (flags & F_PAGE) + get_output(utils[UTIL_SH_EXEC], g_buf, NULL, -1, TRUE); + else + spawn(utils[UTIL_SH_EXEC], g_buf, NULL, NULL, flags); +} + +static bool plctrl_init(void) +{ + size_t len; + + /* g_tmpfpath is used to generate tmp file names */ + g_tmpfpath[tmpfplen - 1] = '\0'; + len = xstrsncpy(g_pipepath, g_tmpfpath, TMP_LEN_MAX); + g_pipepath[len - 1] = '/'; + len = xstrsncpy(g_pipepath + len, "nnn-pipe.", TMP_LEN_MAX - len) + len; + xstrsncpy(g_pipepath + len - 1, xitoa(getpid()), TMP_LEN_MAX - len); + setenv(env_cfg[NNN_PIPE], g_pipepath, TRUE); + + return EXIT_SUCCESS; +} + +static void rmlistpath(void) +{ + if (listpath) { + DPRINTF_S(__func__); + DPRINTF_S(listpath); + spawn(utils[UTIL_RM_RF], listpath, NULL, NULL, F_NOTRACE | F_MULTI); + /* Do not free if program was started in list mode */ + if (listpath != initpath) + free(listpath); + listpath = NULL; + } +} + +static ssize_t read_nointr(int fd, void *buf, size_t count) +{ + ssize_t len; + + do + len = read(fd, buf, count); + while (len == -1 && errno == EINTR); + + return len; +} + +static char *readpipe(int fd, char *ctxnum, char **path) +{ + char ctx, *nextpath = NULL; + + if (read_nointr(fd, g_buf, 1) != 1) + return NULL; + + if (g_buf[0] == '-') { /* Clear selection on '-' */ + clearselection(); + if (read_nointr(fd, g_buf, 1) != 1) + return NULL; + } + + if (g_buf[0] == '+') + ctx = (char)(get_free_ctx() + 1); + else if (g_buf[0] < '0') + return NULL; + else { + ctx = g_buf[0] - '0'; + if (ctx > CTX_MAX) + return NULL; + } + + if (read_nointr(fd, g_buf, 1) != 1) + return NULL; + + char op = g_buf[0]; + + if (op == 'c') { + ssize_t len = read_nointr(fd, g_buf, PATH_MAX); + + if (len <= 0) + return NULL; + + g_buf[len] = '\0'; /* Terminate the path read */ + if (g_buf[0] == '/') { + nextpath = g_buf; + len = xstrlen(g_buf); + while (--len && (g_buf[len] == '/')) /* Trim all trailing '/' */ + g_buf[len] = '\0'; + } + } else if (op == 'l') { + rmlistpath(); /* Remove last list mode path, if any */ + nextpath = load_input(fd, *path); + } else if (op == 'p') { + free(selpath); + selpath = NULL; + clearselection(); + g_state.picker = 0; + g_state.picked = 1; + } + + *ctxnum = ctx; + + return nextpath; +} + +static bool run_plugin(char **path, const char *file, char *runfile, char **lastname, char **lastdir) +{ + pid_t p; + char ctx = 0; + uchar_t flags = 0; + bool cmd_as_plugin = FALSE; + char *nextpath; + + if (!g_state.pluginit) { + plctrl_init(); + g_state.pluginit = 1; + } + + setexports(); + + /* Check for run-cmd-as-plugin mode */ + if (*file == '!') { + flags = F_MULTI | F_CONFIRM; + ++file; + + if (*file == '|') { /* Check if output should be paged */ + flags |= F_PAGE; + ++file; + } else if (*file == '&') { /* Check if GUI flags are to be used */ + flags = F_MULTI | F_NOTRACE | F_NOWAIT; + ++file; + } + + if (!*file) + return FALSE; + + if ((flags & F_NOTRACE) || (flags & F_PAGE)) { + run_cmd_as_plugin(file, flags); + return TRUE; + } + + cmd_as_plugin = TRUE; + } + + if (mkfifo(g_pipepath, 0600) != 0) + return FALSE; + + exitcurses(); + + p = fork(); + + if (!p) { // In child + int wfd = open(g_pipepath, O_WRONLY | O_CLOEXEC); + + if (wfd == -1) + _exit(EXIT_FAILURE); + + if (!cmd_as_plugin) { + char *sel = NULL; + char std[2] = "-"; + + /* Generate absolute path to plugin */ + mkpath(plgpath, file, g_buf); + + if (g_state.picker) + sel = selpath ? selpath : std; + + if (runfile && runfile[0]) { + xstrsncpy(*lastname, runfile, NAME_MAX); + spawn(g_buf, *lastname, *path, sel, 0); + } else + spawn(g_buf, NULL, *path, sel, 0); + } else + run_cmd_as_plugin(file, flags); + + close(wfd); + _exit(EXIT_SUCCESS); + } + + int rfd; + + do + rfd = open(g_pipepath, O_RDONLY); + while (rfd == -1 && errno == EINTR); + + nextpath = readpipe(rfd, &ctx, path); + if (nextpath) + set_smart_ctx(ctx, nextpath, path, runfile, lastname, lastdir); + + close(rfd); + + /* wait for the child to finish. no zombies allowed */ + waitpid(p, NULL, 0); + + refresh(); + + unlink(g_pipepath); + + return TRUE; +} + +static bool launch_app(char *newpath) +{ + int r = F_NORMAL; + char *tmp = newpath; + + mkpath(plgpath, utils[UTIL_LAUNCH], newpath); + + if (!getutil(utils[UTIL_FZF]) || access(newpath, X_OK) < 0) { + tmp = xreadline(NULL, messages[MSG_APP_NAME]); + r = F_NOWAIT | F_NOTRACE | F_MULTI; + } + + if (tmp && *tmp) // NOLINT + spawn(tmp, (r == F_NORMAL) ? "0" : NULL, NULL, NULL, r); + + return FALSE; +} + +/* Returns TRUE if at least one command was run */ +static bool prompt_run(void) +{ + bool ret = FALSE; + char *cmdline, *next; + int cnt_j, cnt_J, cmd_ret; + size_t len; + + const char *xargs_j = "xargs -0 -I{} %s < %s"; + const char *xargs_J = "xargs -0 %s < %s"; + char cmd[CMD_LEN_MAX + 32]; // 32 for xargs format strings + + while (1) { +#ifndef NORL + if (g_state.picker) { +#endif + cmdline = xreadline(NULL, PROMPT); +#ifndef NORL + } else + cmdline = getreadline("\n"PROMPT); +#endif + // Check for an empty command + if (!cmdline || !cmdline[0]) + break; + + free(lastcmd); + lastcmd = xstrdup(cmdline); + ret = TRUE; + + len = xstrlen(cmdline); + + cnt_j = 0; + next = cmdline; + while ((next = strstr(next, "%j"))) { + ++cnt_j; + + // replace %j with {} for xargs later + next[0] = '{'; + next[1] = '}'; + + ++next; + } + + cnt_J = 0; + next = cmdline; + while ((next = strstr(next, "%J"))) { + ++cnt_J; + + // %J should be the last thing in the command + if (next == cmdline + len - 2) { + cmdline[len - 2] = '\0'; + } + + ++next; + } + + // We can't handle both %j and %J in a single command + if (cnt_j && cnt_J) + break; + + if (cnt_j) + snprintf(cmd, CMD_LEN_MAX + 32, xargs_j, cmdline, selpath); + else if (cnt_J) + snprintf(cmd, CMD_LEN_MAX + 32, xargs_J, cmdline, selpath); + + cmd_ret = spawn(shell, "-c", (cnt_j || cnt_J) ? cmd : cmdline, NULL, F_CLI | F_CONFIRM); + if ((cnt_j || cnt_J) && cmd_ret == 0) + clearselection(); + } + + return ret; +} + +static bool handle_cmd(enum action sel, char *newpath) +{ + endselection(FALSE); + + if (sel == SEL_LAUNCH) + return launch_app(newpath); + + setexports(); + + if (sel == SEL_PROMPT) + return prompt_run(); + + /* Set nnn nesting level */ + char *tmp = getenv(env_cfg[NNNLVL]); + int r = tmp ? atoi(tmp) : 0; + + setenv(env_cfg[NNNLVL], xitoa(r + 1), 1); + spawn(shell, NULL, NULL, NULL, F_CLI); + setenv(env_cfg[NNNLVL], xitoa(r), 1); + return TRUE; +} + +static void dentfree(void) +{ + free(pnamebuf); + free(pdents); + free(mark); + + /* Thread data cleanup */ + free(core_blocks); + free(core_data); + free(core_files); +} + +static void *du_thread(void *p_data) +{ + thread_data *pdata = (thread_data *)p_data; + char *path[2] = {pdata->path, NULL}; + ullong_t tfiles = 0; + blkcnt_t tblocks = 0; + struct stat *sb; + FTS *tree = fts_open(path, FTS_PHYSICAL | FTS_XDEV | FTS_NOCHDIR, 0); + FTSENT *node; + + while ((node = fts_read(tree))) { + if (node->fts_info & FTS_D) { + if (g_state.interrupt) + break; + continue; + } + + sb = node->fts_statp; + + if (cfg.apparentsz) { + if (sb->st_size && DU_TEST) + tblocks += sb->st_size; + } else if (sb->st_blocks && DU_TEST) + tblocks += sb->st_blocks; + + ++tfiles; + } + + fts_close(tree); + + if (pdata->entnum >= 0) + pdents[pdata->entnum].blocks = tblocks; + + if (!pdata->mntpoint) { + core_blocks[pdata->core] += tblocks; + core_files[pdata->core] += tfiles; + } else + core_files[pdata->core] += 1; + + pthread_mutex_lock(&running_mutex); + threadbmp |= (1 << pdata->core); + --active_threads; + pthread_mutex_unlock(&running_mutex); + + return NULL; +} + +static void dirwalk(char *path, int entnum, bool mountpoint) +{ + /* Loop till any core is free */ + while (active_threads == NUM_DU_THREADS); + + if (g_state.interrupt) + return; + + pthread_mutex_lock(&running_mutex); + int core = ffs(threadbmp) - 1; + + threadbmp &= ~(1 << core); + ++active_threads; + pthread_mutex_unlock(&running_mutex); + + xstrsncpy(core_data[core].path, path, PATH_MAX); + core_data[core].entnum = entnum; + core_data[core].core = (ushort_t)core; + core_data[core].mntpoint = mountpoint; + + pthread_t tid = 0; + + pthread_create(&tid, NULL, du_thread, (void *)&(core_data[core])); + + tolastln(); + addstr(xbasename(path)); + addstr(" [^C aborts]\n"); + refresh(); +} + +static bool prep_threads(void) +{ + if (!g_state.duinit) { + /* drop MSB 1s */ + threadbmp >>= (32 - NUM_DU_THREADS); + + if (!core_blocks) + core_blocks = calloc(NUM_DU_THREADS, sizeof(blkcnt_t)); + if (!core_data) + core_data = calloc(NUM_DU_THREADS, sizeof(thread_data)); + if (!core_files) + core_files = calloc(NUM_DU_THREADS, sizeof(ullong_t)); + + if (!core_blocks || !core_data || !core_files) { + printwarn(NULL); + return FALSE; + } +#ifndef __APPLE__ + /* Increase current open file descriptor limit */ + max_openfds(); +#endif + g_state.duinit = TRUE; + } else { + memset(core_blocks, 0, NUM_DU_THREADS * sizeof(blkcnt_t)); + memset(core_data, 0, NUM_DU_THREADS * sizeof(thread_data)); + memset(core_files, 0, NUM_DU_THREADS * sizeof(ullong_t)); + } + return TRUE; +} + +/* Skip self and parent */ +static inline bool selforparent(const char *path) +{ + return path[0] == '.' && (path[1] == '\0' || (path[1] == '.' && path[2] == '\0')); +} + +static int dentfill(char *path, struct entry **ppdents) +{ + uchar_t entflags = 0; + int flags = 0; + struct dirent *dp; + char *namep, *pnb, *buf; + struct entry *dentp; + size_t off = 0, namebuflen = NAMEBUF_INCR; + struct stat sb_path, sb; + DIR *dirp = opendir(path); + + ndents = 0; + gtimesecs = time(NULL); + + DPRINTF_S(__func__); + + if (!dirp) + return 0; + + int fd = dirfd(dirp); + + if (cfg.blkorder) { + num_files = 0; + dir_blocks = 0; + buf = g_buf; + + if (fstatat(fd, path, &sb_path, 0) == -1) + goto exit; + + if (!ihashbmp) { + ihashbmp = calloc(1, HASH_OCTETS << 3); + if (!ihashbmp) + goto exit; + } else + memset(ihashbmp, 0, HASH_OCTETS << 3); + + if (!prep_threads()) + goto exit; + + attron(COLOR_PAIR(cfg.curctx + 1)); + } + +#if _POSIX_C_SOURCE >= 200112L + posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); +#endif + + dp = readdir(dirp); + if (!dp) + goto exit; + +#if defined(__sun) || defined(__HAIKU__) + flags = AT_SYMLINK_NOFOLLOW; /* no d_type */ +#else + if (cfg.blkorder || dp->d_type == DT_UNKNOWN) { + /* + * Optimization added for filesystems which support dirent.d_type + * see readdir(3) + * Known drawbacks: + * - the symlink size is set to 0 + * - the modification time of the symlink is set to that of the target file + */ + flags = AT_SYMLINK_NOFOLLOW; + } +#endif + + do { + namep = dp->d_name; + + if (selforparent(namep)) + continue; + + if (!cfg.showhidden && namep[0] == '.') { + if (!cfg.blkorder) + continue; + + if (fstatat(fd, namep, &sb, AT_SYMLINK_NOFOLLOW) == -1) + continue; + + if (S_ISDIR(sb.st_mode)) { + if (sb_path.st_dev == sb.st_dev) { // NOLINT + mkpath(path, namep, buf); // NOLINT + dirwalk(buf, -1, FALSE); + + if (g_state.interrupt) + goto exit; + } + } else { + /* Do not recount hard links */ + if (sb.st_nlink <= 1 || test_set_bit((uint_t)sb.st_ino)) + dir_blocks += (cfg.apparentsz ? sb.st_size : sb.st_blocks); + ++num_files; + } + + continue; + } + + if (fstatat(fd, namep, &sb, flags) == -1) { + if (flags || (fstatat(fd, namep, &sb, AT_SYMLINK_NOFOLLOW) == -1)) { + /* Missing file */ + DPRINTF_U(flags); + if (!flags) { + DPRINTF_S(namep); + DPRINTF_S(strerror(errno)); + } + + entflags = FILE_MISSING; + memset(&sb, 0, sizeof(struct stat)); + } else /* Orphaned symlink */ + entflags = SYM_ORPHAN; + } + + if (ndents == total_dents) { + if (cfg.blkorder) + while (active_threads); + + total_dents += ENTRY_INCR; + *ppdents = xrealloc(*ppdents, total_dents * sizeof(**ppdents)); + if (!*ppdents) { + free(pnamebuf); + closedir(dirp); + errexit(); + } + DPRINTF_P(*ppdents); + } + + /* If not enough bytes left to copy a file name of length NAME_MAX, re-allocate */ + if (namebuflen - off < NAME_MAX + 1) { + namebuflen += NAMEBUF_INCR; + + pnb = pnamebuf; + pnamebuf = (char *)xrealloc(pnamebuf, namebuflen); + if (!pnamebuf) { + free(*ppdents); + closedir(dirp); + errexit(); + } + DPRINTF_P(pnamebuf); + + /* realloc() may result in memory move, we must re-adjust if that happens */ + if (pnb != pnamebuf) { + dentp = *ppdents; + dentp->name = pnamebuf; + + for (int count = 1; count < ndents; ++dentp, ++count) + /* Current file name starts at last file name start + length */ + (dentp + 1)->name = (char *)((size_t)dentp->name + dentp->nlen); + } + } + + dentp = *ppdents + ndents; + + /* Selection file name */ + dentp->name = (char *)((size_t)pnamebuf + off); + dentp->nlen = xstrsncpy(dentp->name, namep, NAME_MAX + 1); + off += dentp->nlen; + + /* Copy other fields */ + if (cfg.timetype == T_MOD) { + dentp->sec = sb.st_mtime; +#ifdef __APPLE__ + dentp->nsec = (uint_t)sb.st_mtimespec.tv_nsec; +#else + dentp->nsec = (uint_t)sb.st_mtim.tv_nsec; +#endif + } else if (cfg.timetype == T_ACCESS) { + dentp->sec = sb.st_atime; +#ifdef __APPLE__ + dentp->nsec = (uint_t)sb.st_atimespec.tv_nsec; +#else + dentp->nsec = (uint_t)sb.st_atim.tv_nsec; +#endif + } else { + dentp->sec = sb.st_ctime; +#ifdef __APPLE__ + dentp->nsec = (uint_t)sb.st_ctimespec.tv_nsec; +#else + dentp->nsec = (uint_t)sb.st_ctim.tv_nsec; +#endif + } + + if ((gtimesecs - sb.st_mtime <= 300) || (gtimesecs - sb.st_ctime <= 300)) + entflags |= FILE_YOUNG; + +#if !(defined(__sun) || defined(__HAIKU__)) + if (!flags && dp->d_type == DT_LNK) { + /* Do not add sizes for links */ + dentp->mode = (sb.st_mode & ~S_IFMT) | S_IFLNK; + dentp->size = listpath ? sb.st_size : 0; + } else { + dentp->mode = sb.st_mode; + dentp->size = sb.st_size; + } +#else + dentp->mode = sb.st_mode; + dentp->size = sb.st_size; +#endif + +#ifndef NOUG + dentp->uid = sb.st_uid; + dentp->gid = sb.st_gid; +#endif + + dentp->flags = S_ISDIR(sb.st_mode) ? 0 : ((sb.st_nlink > 1) ? HARD_LINK : 0); + if (entflags) { + dentp->flags |= entflags; + entflags = 0; + } + + if (cfg.blkorder) { + if (S_ISDIR(sb.st_mode)) { + mkpath(path, namep, buf); // NOLINT + + /* Need to show the disk usage of this dir */ + dirwalk(buf, ndents, (sb_path.st_dev != sb.st_dev)); // NOLINT + + if (g_state.interrupt) + goto exit; + } else { + dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks); + /* Do not recount hard links */ + if (sb.st_nlink <= 1 || test_set_bit((uint_t)sb.st_ino)) + dir_blocks += dentp->blocks; + ++num_files; + } + } + + if (flags) { + /* Flag if this is a dir or symlink to a dir */ + if (S_ISLNK(sb.st_mode)) { + sb.st_mode = 0; + fstatat(fd, namep, &sb, 0); + } + + if (S_ISDIR(sb.st_mode)) + dentp->flags |= DIR_OR_DIRLNK; +#if !(defined(__sun) || defined(__HAIKU__)) /* no d_type */ + } else if (dp->d_type == DT_DIR || ((dp->d_type == DT_LNK + || dp->d_type == DT_UNKNOWN) && S_ISDIR(sb.st_mode))) { + dentp->flags |= DIR_OR_DIRLNK; +#endif + } + + ++ndents; + } while ((dp = readdir(dirp))); + +exit: + if (g_state.duinit && cfg.blkorder) { + while (active_threads); + + attroff(COLOR_PAIR(cfg.curctx + 1)); + for (int i = 0; i < NUM_DU_THREADS; ++i) { + num_files += core_files[i]; + dir_blocks += core_blocks[i]; + } + } + + /* Should never be null */ + if (closedir(dirp) == -1) + errexit(); + + return ndents; +} + +static void populate(char *path, char *lastname) +{ +#ifdef DEBUG + struct timespec ts1, ts2; + + clock_gettime(CLOCK_REALTIME, &ts1); /* Use CLOCK_MONOTONIC on FreeBSD */ +#endif + + ndents = dentfill(path, &pdents); + if (!ndents) + return; + +#ifndef NOSORT + ENTSORT(pdents, ndents, entrycmpfn); +#endif + +#ifdef DEBUG + clock_gettime(CLOCK_REALTIME, &ts2); + DPRINTF_U(ts2.tv_nsec - ts1.tv_nsec); +#endif + + /* Find cur from history */ + /* No NULL check for lastname, always points to an array */ + move_cursor(*lastname ? dentfind(lastname, ndents) : 0, 0); + + // Force full redraw + last_curscroll = -1; +} + +#ifndef NOFIFO +static void notify_fifo(bool force) +{ + if (!fifopath) + return; + + if (fifofd == -1) { + fifofd = open(fifopath, O_WRONLY|O_NONBLOCK|O_CLOEXEC); + if (fifofd == -1) { + if (errno != ENXIO) + /* Unexpected error, the FIFO file might have been removed */ + /* We give up FIFO notification */ + fifopath = NULL; + return; + } + } + + static struct entry lastentry; + + if (!force && !memcmp(&lastentry, &pdents[cur], sizeof(struct entry))) // NOLINT + return; + + lastentry = pdents[cur]; + + char path[PATH_MAX]; + size_t len = mkpath(g_ctx[cfg.curctx].c_path, ndents ? pdents[cur].name : "", path); + + path[len - 1] = '\n'; + + ssize_t ret = write(fifofd, path, len); + + if (ret != (ssize_t)len && !(ret == -1 && (errno == EAGAIN || errno == EPIPE))) { + DPRINTF_S(strerror(errno)); + } +} + +static void send_to_explorer(int *presel) +{ + if (nselected) { + int fd = open(fifopath, O_WRONLY|O_NONBLOCK|O_CLOEXEC, 0600); + if ((fd == -1) || (seltofile(fd, NULL) != (size_t)(selbufpos))) + printwarn(presel); + else { + resetselind(); + clearselection(); + } + if (fd > 1) + close(fd); + } else + notify_fifo(TRUE); /* Send opened path to NNN_FIFO */ +} +#endif + +static void move_cursor(int target, int ignore_scrolloff) +{ + int onscreen = xlines - 4; /* Leave top 2 and bottom 2 lines */ + + target = MAX(0, MIN(ndents - 1, target)); + last_curscroll = curscroll; + last = cur; + cur = target; + + if (!ignore_scrolloff) { + int delta = target - last; + int scrolloff = MIN(SCROLLOFF, onscreen >> 1); + + /* + * When ignore_scrolloff is 1, the cursor can jump into the scrolloff + * margin area, but when ignore_scrolloff is 0, act like a boa + * constrictor and squeeze the cursor towards the middle region of the + * screen by allowing it to move inward and disallowing it to move + * outward (deeper into the scrolloff margin area). + */ + if (((cur < (curscroll + scrolloff)) && delta < 0) + || ((cur > (curscroll + onscreen - scrolloff - 1)) && delta > 0)) + curscroll += delta; + } + curscroll = MIN(curscroll, MIN(cur, ndents - onscreen)); + curscroll = MAX(curscroll, MAX(cur - (onscreen - 1), 0)); + +#ifndef NOFIFO + if (!g_state.fifomode) + notify_fifo(FALSE); /* Send hovered path to NNN_FIFO */ +#endif +} + +static void handle_screen_move(enum action sel) +{ + int onscreen; + + switch (sel) { + case SEL_NEXT: + if (cfg.rollover || (cur != ndents - 1)) + move_cursor((cur + 1) % ndents, 0); + break; + case SEL_PREV: + if (cfg.rollover || cur) + move_cursor((cur + ndents - 1) % ndents, 0); + break; + case SEL_PGDN: + onscreen = xlines - 4; + move_cursor(curscroll + (onscreen - 1), 1); + curscroll += onscreen - 1; + break; + case SEL_CTRL_D: + onscreen = xlines - 4; + move_cursor(curscroll + (onscreen - 1), 1); + curscroll += onscreen >> 1; + break; + case SEL_PGUP: + onscreen = xlines - 4; + move_cursor(curscroll, 1); + curscroll -= onscreen - 1; + break; + case SEL_CTRL_U: + onscreen = xlines - 4; + move_cursor(curscroll, 1); + curscroll -= onscreen >> 1; + break; + case SEL_JUMP: + { + char *input = xreadline(NULL, "jump (+n/-n/n): "); + + if (!input || !*input) + break; + if (input[0] == '-') { + cur -= atoi(input + 1); + if (cur < 0) + cur = 0; + } else if (input[0] == '+') { + cur += atoi(input + 1); + if (cur >= ndents) + cur = ndents - 1; + } else { + int index = atoi(input); + + if ((index < 1) || (index > ndents)) + break; + cur = index - 1; + } + onscreen = xlines - 4; + move_cursor(cur, 1); + curscroll -= onscreen >> 1; + break; + } + case SEL_HOME: + move_cursor(0, 1); + break; + case SEL_END: + move_cursor(ndents - 1, 1); + break; + case SEL_YOUNG: + { + for (int r = cur;;) { + if (++r >= ndents) + r = 0; + if (r == cur) + break; + if (pdents[r].flags & FILE_YOUNG) { + move_cursor(r, 0); + break; + } + } + break; + } + default: /* case SEL_FIRST */ + { + int c = get_input(messages[MSG_FIRST]); + + if (!c) + break; + + c = TOUPPER(c); + + int r = (c == TOUPPER(*pdents[cur].name)) ? (cur + 1) : 0; + + for (; r < ndents; ++r) { + if (((c == '\'') && !(pdents[r].flags & DIR_OR_DIRLNK)) + || (c == TOUPPER(*pdents[r].name))) { + move_cursor((r) % ndents, 0); + break; + } + } + break; + } + } +} + +static void handle_openwith(const char *path, const char *name, char *newpath, char *tmp) +{ + /* Confirm if app is CLI or GUI */ + int r = get_input(messages[MSG_CLI_MODE]); + + r = (r == 'c' ? F_CLI : + ((r == 'g' || r == '\r') ? (F_NOWAIT | F_NOTRACE | F_MULTI) : 0)); + if (r) { + mkpath(path, name, newpath); + spawn(tmp, newpath, NULL, NULL, r); + } +} + +static void copynextname(char *lastname) +{ + if (cur) { + cur += (cur != (ndents - 1)) ? 1 : -1; + copycurname(); + } else + lastname[0] = '\0'; +} + +static int handle_context_switch(enum action sel) +{ + int r = -1; + + switch (sel) { + case SEL_CYCLE: // fallthrough + case SEL_CYCLER: + /* visit next and previous contexts */ + r = cfg.curctx; + if (sel == SEL_CYCLE) + do + r = (r + 1) & ~CTX_MAX; + while (!g_ctx[r].c_cfg.ctxactive); + else { + do /* Attempt to create a new context */ + r = (r + 1) & ~CTX_MAX; + while (g_ctx[r].c_cfg.ctxactive && (r != cfg.curctx)); + + if (r == cfg.curctx) /* If all contexts are active, reverse cycle */ + do + r = (r + (CTX_MAX - 1)) & (CTX_MAX - 1); + while (!g_ctx[r].c_cfg.ctxactive); + } // fallthrough + default: /* SEL_CTXN */ + if (sel >= SEL_CTX1) /* CYCLE keys are lesser in value */ + r = sel - SEL_CTX1; /* Save the next context id */ + + if (cfg.curctx == r) { + if (sel == SEL_CYCLE) + (r == CTX_MAX - 1) ? (r = 0) : ++r; + else if (sel == SEL_CYCLER) + (r == 0) ? (r = CTX_MAX - 1) : --r; + else + return -1; + } + } + + return r; +} + +static int set_sort_flags(int r) +{ + bool session = (r == '\0'); + bool reverse = FALSE; + + if (ISUPPER_(r) && (r != 'R') && (r != 'C')) { + reverse = TRUE; + r = TOLOWER(r); + } + + /* Set the correct input in case of a session load */ + if (session) { + if (cfg.apparentsz) { + cfg.apparentsz = 0; + r = 'a'; + } else if (cfg.blkorder) { + cfg.blkorder = 0; + r = 'd'; + } + + if (cfg.version) + namecmpfn = &xstrverscasecmp; + + if (cfg.reverse) + entrycmpfn = &reventrycmp; + } else if (r == CONTROL('T')) { + /* Cycling order: clear -> size -> time -> clear */ + if (cfg.timeorder) + r = 's'; + else if (cfg.sizeorder) + r = 'c'; + else + r = 't'; + } + + switch (r) { + case 'a': /* Apparent du */ + cfg.apparentsz ^= 1; + if (cfg.apparentsz) { + cfg.blkorder = 1; + blk_shift = 0; + } else + cfg.blkorder = 0; + // fallthrough + case 'd': /* Disk usage */ + if (r == 'd') { + if (!cfg.apparentsz) + cfg.blkorder ^= 1; + cfg.apparentsz = 0; + blk_shift = ffs(S_BLKSIZE) - 1; + } + + if (cfg.blkorder) + cfg.showdetail = 1; + cfg.timeorder = 0; + cfg.sizeorder = 0; + cfg.extnorder = 0; + if (!session) { + cfg.reverse = 0; + entrycmpfn = &entrycmp; + } + endselection(TRUE); /* We are going to reload dir */ + break; + case 'c': + cfg.timeorder = 0; + cfg.sizeorder = 0; + cfg.apparentsz = 0; + cfg.blkorder = 0; + cfg.extnorder = 0; + cfg.reverse = 0; + cfg.version = 0; + entrycmpfn = &entrycmp; + namecmpfn = &xstricmp; + break; + case 'e': /* File extension */ + cfg.extnorder ^= 1; + cfg.sizeorder = 0; + cfg.timeorder = 0; + cfg.apparentsz = 0; + cfg.blkorder = 0; + cfg.reverse = 0; + entrycmpfn = &entrycmp; + break; + case 'r': /* Reverse sort */ + cfg.reverse ^= 1; + entrycmpfn = cfg.reverse ? &reventrycmp : &entrycmp; + break; + case 's': /* File size */ + cfg.sizeorder ^= 1; + cfg.timeorder = 0; + cfg.apparentsz = 0; + cfg.blkorder = 0; + cfg.extnorder = 0; + cfg.reverse = 0; + entrycmpfn = &entrycmp; + break; + case 't': /* Time */ + cfg.timeorder ^= 1; + cfg.sizeorder = 0; + cfg.apparentsz = 0; + cfg.blkorder = 0; + cfg.extnorder = 0; + cfg.reverse = 0; + entrycmpfn = &entrycmp; + break; + case 'v': /* Version */ + cfg.version ^= 1; + namecmpfn = cfg.version ? &xstrverscasecmp : &xstricmp; + cfg.timeorder = 0; + cfg.sizeorder = 0; + cfg.apparentsz = 0; + cfg.blkorder = 0; + cfg.extnorder = 0; + break; + default: + return 0; + } + + if (reverse) { + cfg.reverse = 1; + entrycmpfn = &reventrycmp; + } + + cfgsort[cfg.curctx] = (uchar_t)r; + + return r; +} + +static bool set_time_type(int *presel) +{ + bool ret = FALSE; + char buf[] = "'a'ccess / 'c'hange / 'm'od [ ]"; + + buf[sizeof(buf) - 3] = cfg.timetype == T_MOD ? 'm' : (cfg.timetype == T_ACCESS ? 'a' : 'c'); + + int r = get_input(buf); + + if (r == 'a' || r == 'c' || r == 'm') { + r = (r == 'm') ? T_MOD : ((r == 'a') ? T_ACCESS : T_CHANGE); + if (cfg.timetype != r) { + cfg.timetype = r; + + if (cfg.filtermode || g_ctx[cfg.curctx].c_fltr[1]) + *presel = FILTER; + + ret = TRUE; + } else + r = MSG_NOCHANGE; + } else + r = MSG_INVALID_KEY; + + if (!ret) + printwait(messages[r], presel); + + return ret; +} + +static void statusbar(char *path) +{ + int i = 0, len = 0; + char *ptr; + pEntry pent = &pdents[cur]; + + if (!ndents) { + printmsg("0/0"); + return; + } + + /* Get the file extension for regular files */ + if (S_ISREG(pent->mode)) { + i = (int)(pent->nlen - 1); + ptr = xextension(pent->name, i); + if (ptr) + len = i - (ptr - pent->name); + if (!ptr || len > 5 || len < 2) + ptr = "\b"; + } else + ptr = "\b"; + + attron(COLOR_PAIR(cfg.curctx + 1)); + + if (cfg.fileinfo && get_output("file", "-b", pdents[cur].name, -1, FALSE)) + mvaddstr(xlines - 2, 2, g_buf); + + tolastln(); + + printw("%d/%s ", cur + 1, xitoa(ndents)); + + if (g_state.selmode || nselected) { + attron(A_REVERSE); + addch(' '); + if (g_state.rangesel) + addch('*'); + else if (g_state.selmode) + addch('+'); + if (nselected) + addstr(xitoa(nselected)); + addch(' '); + attroff(A_REVERSE); + addch(' '); + } + + if (cfg.blkorder) { /* du mode */ + char buf[24]; + + xstrsncpy(buf, coolsize(dir_blocks << blk_shift), 12); + + printw("%cu:%s avail:%s files:%llu %lluB %s\n", + (cfg.apparentsz ? 'a' : 'd'), buf, coolsize(get_fs_info(path, VFS_AVAIL)), + num_files, (ullong_t)pent->blocks << blk_shift, ptr); + } else { /* light or detail mode */ + char sort[] = "\0\0\0\0\0"; + + if (getorderstr(sort)) + addstr(sort); + + /* Timestamp */ + print_time(&pent->sec, pent->flags); + + addch(' '); + addstr(get_lsperms(pent->mode)); + addch(' '); +#ifndef NOUG + if (g_state.uidgid) { + addstr(getpwname(pent->uid)); + addch(':'); + addstr(getgrname(pent->gid)); + addch(' '); + } +#endif + if (S_ISLNK(pent->mode)) { + if (!cfg.fileinfo) { + i = readlink(pent->name, g_buf, PATH_MAX); + addstr(coolsize(i >= 0 ? i : pent->size)); /* Show symlink size */ + if (i > 1) { /* Show symlink target */ + int y; + + addstr(" ->"); + getyx(stdscr, len, y); + i = MIN(i, xcols - y); + g_buf[i] = '\0'; + addstr(g_buf); + } + } + } else { + addstr(coolsize(pent->size)); + addch(' '); + addstr(ptr); + if (pent->flags & HARD_LINK) { + struct stat sb; + + if (stat(pent->name, &sb) != -1) { + addch(' '); + addstr(xitoa((int)sb.st_nlink)); /* Show number of links */ + addch('-'); + addstr(xitoa((int)sb.st_ino)); /* Show inode number */ + } + } + } + clrtoeol(); + } + + attroff(COLOR_PAIR(cfg.curctx + 1)); + /* Place HW cursor on current for Braille systems */ + tocursor(); +} + +static inline void markhovered(void) +{ + if (cfg.showdetail && ndents) { /* Bold forward arrowhead */ + tocursor(); + addch('>' | A_BOLD); + } +} + +static int adjust_cols(int n) +{ + /* Calculate the number of cols available to print entry name */ +#ifdef ICONS_ENABLED + n -= (g_state.oldcolor ? 0 : ICON_SIZE + ICON_PADDING_LEFT_LEN + ICON_PADDING_RIGHT_LEN); +#endif + if (cfg.showdetail) { + /* Fallback to light mode if less than 35 columns */ + if (n < 36) + cfg.showdetail ^= 1; + else /* 2 more accounted for below */ + n -= 32; + } + + /* 2 columns for preceding space and indicator */ + return (n - 2); +} + +static void draw_line(int ncols) +{ + bool dir = FALSE; + + ncols = adjust_cols(ncols); + + if (g_state.oldcolor && (pdents[last].flags & DIR_OR_DIRLNK)) { + attron(COLOR_PAIR(cfg.curctx + 1) | A_BOLD); + dir = TRUE; + } + + move(2 + last - curscroll, 0); + macos_icons_hack(); + printent(&pdents[last], ncols, FALSE); + + if (g_state.oldcolor && (pdents[cur].flags & DIR_OR_DIRLNK)) { + if (!dir) {/* First file is not a directory */ + attron(COLOR_PAIR(cfg.curctx + 1) | A_BOLD); + dir = TRUE; + } + } else if (dir) { /* Second file is not a directory */ + attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD); + dir = FALSE; + } + + move(2 + cur - curscroll, 0); + macos_icons_hack(); + printent(&pdents[cur], ncols, TRUE); + + /* Must reset e.g. no files in dir */ + if (dir) + attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD); + + markhovered(); +} + +static void redraw(char *path) +{ + getmaxyx(stdscr, xlines, xcols); + + int ncols = (xcols <= PATH_MAX) ? xcols : PATH_MAX; + int onscreen = xlines - 4; + int i, j = 1; + + // Fast redraw + if (g_state.move) { + g_state.move = 0; + + if (ndents && (last_curscroll == curscroll)) + return draw_line(ncols); + } + + DPRINTF_S(__func__); + + /* Clear screen */ + erase(); + + /* Enforce scroll/cursor invariants */ + move_cursor(cur, 1); + + /* Fail redraw if < than 10 columns, context info prints 10 chars */ + if (ncols <= MIN_DISPLAY_COL) { + printmsg(messages[MSG_FEW_COLUMNS]); + return; + } + + //DPRINTF_D(cur); + DPRINTF_S(path); + + for (i = 0; i < CTX_MAX; ++i) { /* 8 chars printed for contexts - "1 2 3 4 " */ + if (!g_ctx[i].c_cfg.ctxactive) + addch(i + '1'); + else + addch((i + '1') | (COLOR_PAIR(i + 1) | A_BOLD + /* active: underline, current: reverse */ + | ((cfg.curctx != i) ? A_UNDERLINE : A_REVERSE))); + + addch(' '); + } + + attron(A_UNDERLINE | COLOR_PAIR(cfg.curctx + 1)); + + /* Print path */ + bool in_home = set_tilde_in_path(path); + char *ptr = in_home ? &path[homelen - 1] : path; + + i = (int)xstrlen(ptr); + if ((i + MIN_DISPLAY_COL) <= ncols) + addnstr(ptr, ncols - MIN_DISPLAY_COL); + else { + char *base = xmemrchr((uchar_t *)ptr, '/', i); + + if (in_home) { + addch(*ptr); + ++ptr; + i = 1; + } else + i = 0; + + if (ptr && (base != ptr)) { + while (ptr < base) { + if (*ptr == '/') { + i += 2; /* 2 characters added */ + if (ncols < i + MIN_DISPLAY_COL) { + base = NULL; /* Can't print more characters */ + break; + } + + addch(*ptr); + addch(*(++ptr)); + } + ++ptr; + } + } + + if (base) + addnstr(base, ncols - (MIN_DISPLAY_COL + i)); + } + + if (in_home) + reset_tilde_in_path(path); + + attroff(A_UNDERLINE | COLOR_PAIR(cfg.curctx + 1)); + + /* Go to first entry */ + if (curscroll > 0) { + move(1, 0); +#ifdef ICONS_ENABLED + addstr(ICON_ARROW_UP); +#else + addch('^'); +#endif + } + + if (g_state.oldcolor) { + attron(COLOR_PAIR(cfg.curctx + 1) | A_BOLD); + g_state.dircolor = 1; + } + + onscreen = MIN(onscreen + curscroll, ndents); + + ncols = adjust_cols(ncols); + + int len = scanselforpath(path, FALSE); + + /* Print listing */ + for (i = curscroll; i < onscreen; ++i) { + move(++j, 0); + + if (len) + findmarkentry(len, &pdents[i]); + + printent(&pdents[i], ncols, i == cur); + } + + /* Must reset e.g. no files in dir */ + if (g_state.dircolor) { + attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD); + g_state.dircolor = 0; + } + + /* Go to last entry */ + if (onscreen < ndents) { + move(xlines - 2, 0); +#ifdef ICONS_ENABLED + addstr(ICON_ARROW_DOWN); +#else + addch('v'); +#endif + } + + markhovered(); +} + +static bool cdprep(char *lastdir, char *lastname, char *path, char *newpath) +{ + if (lastname) + lastname[0] = '\0'; + + /* Save last working directory */ + xstrsncpy(lastdir, path, PATH_MAX); + + /* Save the newly opted dir in path */ + xstrsncpy(path, newpath, PATH_MAX); + DPRINTF_S(path); + + clearfilter(); + return cfg.filtermode; +} + +static void showselsize(const char *path) +{ + off_t sz = 0; + int len = scanselforpath(path, FALSE); + + for (int r = 0, selcount = nselected; (r < ndents) && selcount; ++r) + if (findinsel(findselpos, len + xstrsncpy(g_sel + len, pdents[r].name, pdents[r].nlen))) { + sz += cfg.blkorder ? pdents[r].blocks : pdents[r].size; + --selcount; + } + + printmsg(coolsize(cfg.blkorder ? sz << blk_shift : sz)); +} + +static bool browse(char *ipath, const char *session, int pkey) +{ + alignas(max_align_t) char newpath[PATH_MAX]; + alignas(max_align_t) char runfile[NAME_MAX + 1]; + char *path, *lastdir, *lastname, *dir, *tmp; + pEntry pent; + enum action sel; + struct stat sb; + int r = -1, presel, selstartid = 0, selendid = 0; + const uchar_t opener_flags = (cfg.cliopener ? F_CLI : (F_NOTRACE | F_NOSTDIN | F_NOWAIT)); + bool watch = FALSE, cd = TRUE; + ino_t inode = 0; + +#ifndef NOMOUSE + MEVENT event = {0}; + struct timespec mousetimings[2] = {{.tv_sec = 0, .tv_nsec = 0}, {.tv_sec = 0, .tv_nsec = 0}}; + int mousedent[2] = {-1, -1}; + bool currentmouse = 1, rightclicksel = 0; +#endif + + atexit(dentfree); + + getmaxyx(stdscr, xlines, xcols); + +#ifndef NOSSN + /* set-up first context */ + if (!session || !load_session(session, &path, &lastdir, &lastname, FALSE)) { +#else + (void)session; +#endif + g_ctx[0].c_last[0] = '\0'; + lastdir = g_ctx[0].c_last; /* last visited directory */ + + if (g_state.initfile) { + xstrsncpy(g_ctx[0].c_name, xbasename(ipath), sizeof(g_ctx[0].c_name)); + xdirname(ipath); + } else + g_ctx[0].c_name[0] = '\0'; + + lastname = g_ctx[0].c_name; /* last visited file name */ + + xstrsncpy(g_ctx[0].c_path, ipath, PATH_MAX); + /* If the initial path is a file, retain a way to return to start dir */ + if (g_state.initfile) { + free(initpath); + initpath = ipath = getcwd(NULL, 0); + } + path = g_ctx[0].c_path; /* current directory */ + + g_ctx[0].c_fltr[0] = g_ctx[0].c_fltr[1] = '\0'; + g_ctx[0].c_cfg = cfg; /* current configuration */ +#ifndef NOSSN + } +#endif + + newpath[0] = runfile[0] = '\0'; + + presel = pkey ? ((pkey == CREATE_NEW_KEY) ? 'n' : ';') : ((cfg.filtermode + || (session && (g_ctx[cfg.curctx].c_fltr[0] == FILTER + || g_ctx[cfg.curctx].c_fltr[0] == RFILTER) + && g_ctx[cfg.curctx].c_fltr[1])) ? FILTER : 0); + + pdents = xrealloc(pdents, total_dents * sizeof(struct entry)); + if (!pdents) + errexit(); + + /* Allocate buffer to hold names */ + pnamebuf = (char *)xrealloc(pnamebuf, NAMEBUF_INCR); + if (!pnamebuf) + errexit(); + + /* The following call is added to handle a broken window at start */ + if (presel == FILTER) + handle_key_resize(); + +begin: + /* + * Can fail when permissions change while browsing. + * It's assumed that path IS a directory when we are here. + */ + if (chdir(path) == -1) { + DPRINTF_S("directory inaccessible"); + valid_parent(path, lastname); + setdirwatch(); + } + +#ifndef NOX11 + xterm_cfg(path); +#endif + +#ifdef LINUX_INOTIFY + if ((presel == FILTER || watch) && inotify_wd >= 0) { + inotify_rm_watch(inotify_fd, inotify_wd); + inotify_wd = -1; + watch = FALSE; + } +#elif defined(BSD_KQUEUE) + if ((presel == FILTER || watch) && event_fd >= 0) { + close(event_fd); + event_fd = -1; + watch = FALSE; + } +#elif defined(HAIKU_NM) + if ((presel == FILTER || watch) && haiku_hnd != NULL) { + haiku_stop_watch(haiku_hnd); + haiku_nm_active = FALSE; + watch = FALSE; + } +#endif + + if (order && cd) { + if (cfgsort[cfg.curctx] != '0') { + if (cfgsort[cfg.curctx] == 'z') + set_sort_flags('c'); + if ((!cfgsort[cfg.curctx] || (cfgsort[cfg.curctx] == 'c')) + && ((r = get_kv_key(order, path, maxorder, NNN_ORDER)) > 0)) { // NOLINT + set_sort_flags(r); + cfgsort[cfg.curctx] = 'z'; + } + } else + cfgsort[cfg.curctx] = cfgsort[CTX_MAX]; + } + cd = TRUE; + + populate(path, lastname); + if (g_state.interrupt) { + g_state.interrupt = cfg.apparentsz = cfg.blkorder = 0; + blk_shift = BLK_SHIFT_512; + presel = CONTROL('L'); + } + +#ifdef LINUX_INOTIFY + if (presel != FILTER && inotify_wd == -1) + inotify_wd = inotify_add_watch(inotify_fd, path, INOTIFY_MASK); +#elif defined(BSD_KQUEUE) + if (presel != FILTER && event_fd == -1) { +#if defined(O_EVTONLY) + event_fd = open(path, O_EVTONLY); +#else + event_fd = open(path, O_RDONLY); +#endif + if (event_fd >= 0) + EV_SET(&events_to_monitor[0], event_fd, EVFILT_VNODE, + EV_ADD | EV_CLEAR, KQUEUE_FFLAGS, 0, path); + } +#elif defined(HAIKU_NM) + haiku_nm_active = haiku_watch_dir(haiku_hnd, path) == EXIT_SUCCESS; +#endif + + while (1) { + /* Do not do a double redraw in filterentries */ + if ((presel != FILTER) || !filterset()) { + redraw(path); + statusbar(path); + } + +nochange: + /* Exit if parent has exited */ + if (getppid() == 1) + _exit(EXIT_FAILURE); + + /* If CWD is deleted or moved or perms changed, find an accessible parent */ + if (chdir(path) == -1) + goto begin; + + /* If STDIN is no longer a tty (closed) we should exit */ + if (!isatty(STDIN_FILENO) && !g_state.picker) + return EXIT_FAILURE; + + sel = nextsel(presel); + if (presel) + presel = 0; + + switch (sel) { +#ifndef NOMOUSE + case SEL_CLICK: + if (getmouse(&event) != OK) + goto nochange; + + /* Handle clicking on a context at the top */ + if (event.bstate == BUTTON1_PRESSED && event.y == 0) { + /* Get context from: "[1 2 3 4]..." */ + r = event.x >> 1; + + /* If clicked after contexts, go to parent */ + if (r >= CTX_MAX) + sel = SEL_BACK; + else if (r >= 0 && r != cfg.curctx) { + savecurctx(path, ndents ? pdents[cur].name : NULL, r); + + /* Reset the pointers */ + path = g_ctx[r].c_path; + lastdir = g_ctx[r].c_last; + lastname = g_ctx[r].c_name; + + setdirwatch(); + goto begin; + } + } +#endif + // fallthrough + case SEL_BACK: +#ifndef NOMOUSE + if (sel == SEL_BACK) { +#endif + dir = visit_parent(path, newpath, &presel); + if (!dir) + goto nochange; + + /* Save history */ + xstrsncpy(lastname, xbasename(path), NAME_MAX + 1); + + cdprep(lastdir, NULL, path, dir) ? (presel = FILTER) : (watch = TRUE); + goto begin; +#ifndef NOMOUSE + } +#endif + +#ifndef NOMOUSE + /* Middle click action */ + if (event.bstate == BUTTON2_PRESSED) { + presel = middle_click_key; + goto nochange; + } +#if NCURSES_MOUSE_VERSION > 1 + /* Scroll up */ + if (event.bstate == BUTTON4_PRESSED && ndents && (cfg.rollover || cur)) { + move_cursor((!cfg.rollover && cur < scroll_lines + ? 0 : (cur + ndents - scroll_lines) % ndents), 0); + break; + } + + /* Scroll down */ + if (event.bstate == BUTTON5_PRESSED && ndents + && (cfg.rollover || (cur != ndents - 1))) { + move_cursor((!cfg.rollover && cur >= ndents - scroll_lines) + ? (ndents - 1) : ((cur + scroll_lines) % ndents), 0); + break; + } +#endif + + /* Toggle filter mode on left click on last 2 lines */ + if (event.y >= xlines - 2 && event.bstate == BUTTON1_PRESSED) { + clearfilter(); + cfg.filtermode ^= 1; + if (cfg.filtermode) { + presel = FILTER; + goto nochange; + } + + /* Start watching the directory */ + watch = TRUE; + copycurname(); + cd = FALSE; + goto begin; + } + + /* Handle clicking on a file */ + if (event.y >= 2 && event.y <= ndents + 1 && + (event.bstate == BUTTON1_PRESSED || + event.bstate == BUTTON3_PRESSED)) { + r = curscroll + (event.y - 2); + if (r != cur) + move_cursor(r, 1); +#ifndef NOFIFO + else if ((event.bstate == BUTTON1_PRESSED) && !g_state.fifomode) + notify_fifo(TRUE); /* Send clicked path to NNN_FIFO */ +#endif + /* Handle right click selection */ + if (event.bstate == BUTTON3_PRESSED) { + rightclicksel = 1; + presel = SELECT; + goto nochange; + } + + currentmouse ^= 1; + clock_gettime( +#if defined(CLOCK_MONOTONIC_RAW) + CLOCK_MONOTONIC_RAW, +#elif defined(CLOCK_MONOTONIC) + CLOCK_MONOTONIC, +#else + CLOCK_REALTIME, +#endif + &mousetimings[currentmouse]); + mousedent[currentmouse] = cur; + + /* Single click just selects, double click falls through to SEL_OPEN */ + if ((mousedent[0] != mousedent[1]) || + (((_ABSSUB(mousetimings[0].tv_sec, mousetimings[1].tv_sec) << 30) + + (_ABSSUB(mousetimings[0].tv_nsec, mousetimings[1].tv_nsec))) + > DBLCLK_INTERVAL_NS)) + break; + /* Double click */ + mousetimings[currentmouse].tv_sec = 0; + mousedent[currentmouse] = -1; + sel = SEL_OPEN; + } else { + if (cfg.filtermode || filterset()) + presel = FILTER; + copycurname(); + goto nochange; + } +#endif + // fallthrough + case SEL_NAV_IN: // fallthrough + case SEL_OPEN: + /* Cannot descend in empty directories */ + if (!ndents) { + cd = FALSE; + g_state.selbm = g_state.runplugin = 0; + goto begin; + } + + pent = &pdents[cur]; + if (!g_state.selbm || !(S_ISLNK(pent->mode) && + realpath(pent->name, newpath) && + xstrsncpy(path, lastdir, PATH_MAX))) + mkpath(path, pent->name, newpath); + g_state.selbm = 0; + DPRINTF_S(newpath); + + /* Visit directory */ + if (pent->flags & DIR_OR_DIRLNK) { + if (chdir(newpath) == -1) { + printwarn(&presel); + goto nochange; + } + + cdprep(lastdir, lastname, path, newpath) ? (presel = FILTER) : (watch = TRUE); + goto begin; + } + + /* Cannot use stale data in entry, file may be missing by now */ + if (stat(newpath, &sb) == -1) { + printwarn(&presel); + goto nochange; + } + DPRINTF_U(sb.st_mode); + + /* Do not open non-regular files */ + if (!S_ISREG(sb.st_mode)) { + printwait(messages[MSG_UNSUPPORTED], &presel); + goto nochange; + } + + /* Handle plugin selection mode */ + if (g_state.runplugin) { + g_state.runplugin = 0; + /* Must be in plugin dir and same context to select plugin */ + if ((g_state.runctx == cfg.curctx) && !strcmp(path, plgpath)) { + endselection(FALSE); + /* Copy path so we can return back to earlier dir */ + xstrsncpy(path, lastdir, PATH_MAX); + clearfilter(); + + if (chdir(path) == -1 + || !run_plugin(&path, pent->name, runfile, &lastname, &lastdir)) { + DPRINTF_S("plugin failed!"); + } + + if (g_state.picked) + return EXIT_SUCCESS; + + if (runfile[0]) { + xstrsncpy(lastname, runfile, NAME_MAX + 1); + runfile[0] = '\0'; + } + setdirwatch(); + goto begin; + } + } + +#ifndef NOFIFO + if (g_state.fifomode && (sel == SEL_OPEN)) { + send_to_explorer(&presel); /* Write selection to explorer fifo */ + break; + } +#endif + /* If opened as vim plugin and Enter/^M pressed, pick */ + if (g_state.picker && (sel == SEL_OPEN)) { + if (nselected == 0) /* Pick if none selected */ + appendfpath(newpath, mkpath(path, pent->name, newpath)); + return EXIT_SUCCESS; + } + + if (sel == SEL_NAV_IN) { + /* If in listing dir, go to target on `l` or Right on symlink */ + if (listpath && S_ISLNK(pent->mode) + && is_prefix(path, listpath, xstrlen(listpath))) { + if (!realpath(pent->name, newpath)) { + printwarn(&presel); + goto nochange; + } + + xdirname(newpath); + + if (chdir(newpath) == -1) { + printwarn(&presel); + goto nochange; + } + + cdprep(lastdir, NULL, path, newpath) + ? (presel = FILTER) : (watch = TRUE); + xstrsncpy(lastname, pent->name, NAME_MAX + 1); + goto begin; + } + + /* Open file disabled on right arrow or `l` */ + if (cfg.nonavopen) + goto nochange; + } + + if (!sb.st_size) { + printwait(messages[MSG_EMPTY_FILE], &presel); + goto nochange; + } + + if (cfg.useeditor +#ifdef FILE_MIME_OPTS + && get_output("file", FILE_MIME_OPTS, newpath, -1, FALSE) + && is_prefix(g_buf, "text/", 5) +#else + /* no MIME option; guess from description instead */ + && get_output("file", "-bL", newpath, -1, FALSE) + && strstr(g_buf, "text") +#endif + ) { + spawn(editor, newpath, NULL, NULL, F_CLI); + if (cfg.filtermode) { + presel = FILTER; + clearfilter(); + } + continue; + } + + /* Get the extension for regex match */ + tmp = xextension(pent->name, pent->nlen - 1); +#ifdef PCRE + if (tmp && !pcre_exec(archive_pcre, NULL, tmp, + pent->nlen - (tmp - pent->name) - 1, 0, 0, NULL, 0)) { +#else + if (tmp && !regexec(&archive_re, tmp, 0, NULL, 0)) { +#endif + r = get_input(messages[MSG_ARCHIVE_OPTS]); + if (r == '\r') + r = 'l'; + if (r == 'l' || r == 'x') { + mkpath(path, pent->name, newpath); + if (!handle_archive(newpath, r)) { + presel = MSGWAIT; + goto nochange; + } + if (r == 'l') { + statusbar(path); + goto nochange; + } + } + + if ((r == 'm') && !archive_mount(newpath)) { + presel = MSGWAIT; + goto nochange; + } + + if (r == 'x' || r == 'm') { + if (newpath[0]) + set_smart_ctx('+', newpath, &path, + ndents ? pdents[cur].name : NULL, + &lastname, &lastdir); + else + copycurname(); + clearfilter(); + goto begin; + } + + if (r != 'o') { + printwait(messages[MSG_INVALID_KEY], &presel); + goto nochange; + } + } + + /* Invoke desktop opener as last resort */ + spawn(opener, newpath, NULL, NULL, opener_flags); + + /* Move cursor to the next entry if not the last entry */ + if (g_state.autonext && cur != ndents - 1) + move_cursor((cur + 1) % ndents, 0); + if (cfg.filtermode) { + presel = FILTER; + clearfilter(); + } + continue; + case SEL_NEXT: // fallthrough + case SEL_PREV: // fallthrough + case SEL_PGDN: // fallthrough + case SEL_CTRL_D: // fallthrough + case SEL_PGUP: // fallthrough + case SEL_CTRL_U: // fallthrough + case SEL_HOME: // fallthrough + case SEL_END: // fallthrough + case SEL_FIRST: // fallthrough + case SEL_JUMP: // fallthrough + case SEL_YOUNG: + if (ndents) { + g_state.move = 1; + handle_screen_move(sel); + } + break; + case SEL_CDHOME: // fallthrough + case SEL_CDBEGIN: // fallthrough + case SEL_CDLAST: // fallthrough + case SEL_CDROOT: + dir = (sel == SEL_CDHOME) ? home + : ((sel == SEL_CDBEGIN) ? ipath + : ((sel == SEL_CDLAST) ? lastdir + : "/" /* SEL_CDROOT */)); + + if (!dir || !*dir) { + printwait(messages[MSG_NOT_SET], &presel); + goto nochange; + } + + g_state.selbm = 0; + if (strcmp(path, dir) == 0) { + if (dir == ipath) { + if (cfg.filtermode) + presel = FILTER; + goto nochange; + } + dir = lastdir; /* Go to last dir on home/root key repeat */ + } + + if (chdir(dir) == -1) { + presel = MSGWAIT; + goto nochange; + } + + /* SEL_CDLAST: dir pointing to lastdir */ + xstrsncpy(newpath, dir, PATH_MAX); // fallthrough + case SEL_BMOPEN: + if (sel == SEL_BMOPEN) { + r = (int)handle_bookmark(mark, newpath); + if (r) { + printwait(messages[r], &presel); + goto nochange; + } + + if (g_state.selbm == 1) /* Allow filtering in bookmarks directory */ + presel = FILTER; + if (strcmp(path, newpath) == 0) + break; + } + + /* In list mode, retain the last file name to highlight it, if possible */ + cdprep(lastdir, listpath && sel == SEL_CDLAST ? NULL : lastname, path, newpath) + ? (presel = FILTER) : (watch = TRUE); + goto begin; + case SEL_REMOTE: + if ((sel == SEL_REMOTE) && !remote_mount(newpath)) { + presel = MSGWAIT; + goto nochange; + } + + set_smart_ctx('+', newpath, &path, + ndents ? pdents[cur].name : NULL, &lastname, &lastdir); + clearfilter(); + goto begin; + case SEL_CYCLE: // fallthrough + case SEL_CYCLER: // fallthrough + case SEL_CTX1: // fallthrough + case SEL_CTX2: // fallthrough + case SEL_CTX3: // fallthrough + case SEL_CTX4: +#ifdef CTX8 + case SEL_CTX5: + case SEL_CTX6: + case SEL_CTX7: + case SEL_CTX8: +#endif + r = handle_context_switch(sel); + if (r < 0) + continue; + savecurctx(path, ndents ? pdents[cur].name : NULL, r); + + /* Reset the pointers */ + path = g_ctx[r].c_path; + lastdir = g_ctx[r].c_last; + lastname = g_ctx[r].c_name; + tmp = g_ctx[r].c_fltr; + + if (cfg.filtermode || ((tmp[0] == FILTER || tmp[0] == RFILTER) && tmp[1])) + presel = FILTER; + else + watch = TRUE; + + goto begin; + case SEL_MARK: + free(mark); + mark = xstrdup(path); + printwait(mark, &presel); + goto nochange; + case SEL_BMARK: + add_bookmark(path, newpath, &presel); + goto nochange; + case SEL_FLTR: + /* Unwatch dir if we are still in a filtered view */ +#ifdef LINUX_INOTIFY + if (inotify_wd >= 0) { + inotify_rm_watch(inotify_fd, inotify_wd); + inotify_wd = -1; + } +#elif defined(BSD_KQUEUE) + if (event_fd >= 0) { + close(event_fd); + event_fd = -1; + } +#elif defined(HAIKU_NM) + if (haiku_nm_active) { + haiku_stop_watch(haiku_hnd); + haiku_nm_active = FALSE; + } +#endif + presel = filterentries(path, lastname); + if (presel == ESC) { + presel = 0; + break; + } + if (presel == FILTER) { /* Refresh dir and filter again */ + cd = FALSE; + goto begin; + } + goto nochange; + case SEL_MFLTR: // fallthrough + case SEL_HIDDEN: // fallthrough + case SEL_DETAIL: // fallthrough + case SEL_SORT: + switch (sel) { + case SEL_MFLTR: + cfg.filtermode ^= 1; + if (cfg.filtermode) { + presel = FILTER; + clearfilter(); + goto nochange; + } + + watch = TRUE; // fallthrough + case SEL_HIDDEN: + if (sel == SEL_HIDDEN) { + cfg.showhidden ^= 1; + if (cfg.filtermode) + presel = FILTER; + clearfilter(); + } + copycurname(); + cd = FALSE; + goto begin; + case SEL_DETAIL: + cfg.showdetail ^= 1; + cfg.blkorder = 0; + continue; + default: /* SEL_SORT */ + r = set_sort_flags(get_input(messages[MSG_ORDER])); + if (!r) { + printwait(messages[MSG_INVALID_KEY], &presel); + goto nochange; + } + } + + if (cfg.filtermode || filterset()) + presel = FILTER; + + if (ndents) { + copycurname(); + + if (r == 'd' || r == 'a') { + presel = 0; + goto begin; + } + + ENTSORT(pdents, ndents, entrycmpfn); + move_cursor(ndents ? dentfind(lastname, ndents) : 0, 0); + } + continue; + case SEL_STATS: // fallthrough + case SEL_CHMODX: + if (ndents) { + tmp = (listpath && xstrcmp(path, listpath) == 0) ? listroot : path; + mkpath(tmp, pdents[cur].name, newpath); + + if ((sel == SEL_STATS && !show_stats(newpath)) + || (lstat(newpath, &sb) == -1) + || (sel == SEL_CHMODX && !xchmod(newpath, &sb.st_mode))) { + printwarn(&presel); + goto nochange; + } + + if (sel == SEL_CHMODX) + pdents[cur].mode = sb.st_mode; + } + break; + case SEL_REDRAW: // fallthrough + case SEL_RENAMEMUL: // fallthrough + case SEL_HELP: // fallthrough + case SEL_AUTONEXT: // fallthrough + case SEL_EDIT: // fallthrough + case SEL_LOCK: + { + bool refresh = FALSE; + + if (ndents) + mkpath(path, pdents[cur].name, newpath); + else if (sel == SEL_EDIT) /* Avoid trying to edit a non-existing file */ + goto nochange; + + switch (sel) { + case SEL_REDRAW: + refresh = TRUE; + break; + case SEL_RENAMEMUL: + endselection(TRUE); + setenv("NNN_INCLUDE_HIDDEN", xitoa(cfg.showhidden), 1); + setenv("NNN_PREFER_SELECTION", xitoa(cfg.prefersel), 1); + setenv("NNN_LIST", listpath ? listroot : "", 1); + + if (!(getutil(utils[UTIL_BASH]) + && plugscript(utils[UTIL_NMV], F_CLI)) +#ifndef NOBATCH + && !batch_rename() +#endif + ) { + printwait(messages[MSG_FAILED], &presel); + goto nochange; + } + clearselection(); + refresh = TRUE; + break; + case SEL_HELP: + show_help(path); // fallthrough + case SEL_AUTONEXT: + if (sel == SEL_AUTONEXT) + g_state.autonext ^= 1; + if (cfg.filtermode) + presel = FILTER; + copycurname(); + goto nochange; + case SEL_EDIT: + if (!(g_state.picker || g_state.fifomode)) + spawn(editor, newpath, NULL, NULL, F_CLI); + continue; + default: /* SEL_LOCK */ + lock_terminal(); + break; + } + + /* In case of successful operation, reload contents */ + + /* Continue in type-to-nav mode, if enabled */ + if ((cfg.filtermode || filterset()) && !refresh) { + presel = FILTER; + goto nochange; + } + + /* Save current */ + copycurname(); + /* Repopulate as directory content may have changed */ + cd = FALSE; + goto begin; + } + case SEL_SEL: + if (!ndents) + goto nochange; + + startselection(); + if (g_state.rangesel) + g_state.rangesel = 0; + + /* Toggle selection status */ + pdents[cur].flags ^= FILE_SELECTED; + + if (pdents[cur].flags & FILE_SELECTED) { + ++nselected; + appendfpath(newpath, mkpath(path, pdents[cur].name, newpath)); + writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */ + } else { + --nselected; + rmfromselbuf(mkpath(path, pdents[cur].name, g_sel)); + } + +#ifndef NOX11 + if (cfg.x11) + plugscript(utils[UTIL_CBCP], F_NOWAIT | F_NOTRACE); +#endif +#ifndef NOMOUSE + if (rightclicksel) + rightclicksel = 0; + else +#endif + /* move cursor to the next entry if this is not the last entry */ + if (!g_state.stayonsel && (cur != ndents - 1)) + move_cursor((cur + 1) % ndents, 0); + break; + case SEL_SELMUL: + if (!ndents) + goto nochange; + + startselection(); + g_state.rangesel ^= 1; + + if (stat(path, &sb) == -1) { + printwarn(&presel); + goto nochange; + } + + if (g_state.rangesel) { /* Range selection started */ + inode = sb.st_ino; + selstartid = cur; + continue; + } + + if (inode != sb.st_ino) { + printwait(messages[MSG_DIR_CHANGED], &presel); + goto nochange; + } + + if (cur < selstartid) { + selendid = selstartid; + selstartid = cur; + } else + selendid = cur; + + /* Clear selection on repeat on same file */ + if (selstartid == selendid) { + resetselind(); + clearselection(); + break; + } // fallthrough + case SEL_SELALL: // fallthrough + case SEL_SELINV: + if (sel == SEL_SELALL || sel == SEL_SELINV) { + if (!ndents) + goto nochange; + + startselection(); + if (g_state.rangesel) + g_state.rangesel = 0; + + selstartid = 0; + selendid = ndents - 1; + } + + if ((nselected > LARGESEL) || (nselected && (ndents > LARGESEL))) { + printmsg("processing..."); + refresh(); + } + + r = scanselforpath(path, TRUE); /* Get path length suffixed by '/' */ + ((sel == SEL_SELINV) && findselpos) + ? invertselbuf(r) : addtoselbuf(r, selstartid, selendid); + +#ifndef NOX11 + if (cfg.x11) + plugscript(utils[UTIL_CBCP], F_NOWAIT | F_NOTRACE); +#endif + continue; + case SEL_SELEDIT: + r = editselection(); + if (r <= 0) { + r = !r ? MSG_0_SELECTED : MSG_FAILED; + printwait(messages[r], &presel); + } else { +#ifndef NOX11 + if (cfg.x11) + plugscript(utils[UTIL_CBCP], F_NOWAIT | F_NOTRACE); +#endif + cfg.filtermode ? presel = FILTER : statusbar(path); + } + goto nochange; + case SEL_CP: // fallthrough + case SEL_MV: // fallthrough + case SEL_CPMVAS: // fallthrough + case SEL_RM: + { + if (sel == SEL_RM) { + r = get_cur_or_sel(); + if (!r) { + statusbar(path); + goto nochange; + } + + if (r == 'c') { + tmp = (listpath && xstrcmp(path, listpath) == 0) + ? listroot : path; + mkpath(tmp, pdents[cur].name, newpath); + if (!xrm(newpath)) + continue; + + xrmfromsel(tmp, newpath); + + copynextname(lastname); + + if (cfg.filtermode || filterset()) + presel = FILTER; + cd = FALSE; + goto begin; + } + } + + (nselected == 1 && (sel == SEL_CP || sel == SEL_MV)) + ? mkpath(path, xbasename(pselbuf), newpath) + : (newpath[0] = '\0'); + + endselection(TRUE); + + if (!cpmvrm_selection(sel, path)) { + presel = MSGWAIT; + goto nochange; + } + + if (cfg.filtermode) + presel = FILTER; + clearfilter(); + +#ifndef NOX11 + /* Show notification on operation complete */ + if (cfg.x11) + plugscript(utils[UTIL_NTFY], F_NOWAIT | F_NOTRACE); +#endif + + if (newpath[0] && !access(newpath, F_OK)) + xstrsncpy(lastname, xbasename(newpath), NAME_MAX+1); + else + copycurname(); + cd = FALSE; + goto begin; + } + case SEL_ARCHIVE: // fallthrough + case SEL_OPENWITH: // fallthrough + case SEL_NEW: // fallthrough + case SEL_RENAME: + { + int ret = 'n'; + size_t len; + + if (!ndents && (sel == SEL_OPENWITH || sel == SEL_RENAME)) + break; + + if (sel != SEL_OPENWITH) + endselection(TRUE); + + switch (sel) { + case SEL_ARCHIVE: + r = get_cur_or_sel(); + if (!r) { + statusbar(path); + goto nochange; + } + + if (r == 's') { + if (!selsafe()) { + presel = MSGWAIT; + goto nochange; + } + + tmp = NULL; + } else + tmp = pdents[cur].name; + + tmp = xreadline(tmp, messages[MSG_ARCHIVE_NAME]); + break; + case SEL_OPENWITH: +#ifndef NORL + if (g_state.picker) { +#endif + tmp = xreadline(NULL, messages[MSG_OPEN_WITH]); +#ifndef NORL + } else + tmp = getreadline(messages[MSG_OPEN_WITH]); +#endif + break; + case SEL_NEW: + if (!pkey) { + r = get_input(messages[MSG_NEW_OPTS]); + if (r == '\r') + r = 'f'; + tmp = NULL; + } else { + r = 'f'; + tmp = g_ctx[0].c_name; + pkey = '\0'; + } + + if (r == 'f' || r == 'd') + tmp = xreadline(tmp, messages[MSG_NEW_PATH]); + else if (r == 's' || r == 'h') + tmp = xreadline((nselected == 1 && cfg.prefersel) ? xbasename(pselbuf) : NULL, + messages[nselected <= 1 ? MSG_NEW_PATH : MSG_LINK_PREFIX]); + else + tmp = NULL; + break; + default: /* SEL_RENAME */ + tmp = xreadline(pdents[cur].name, ""); + break; + } + + if (!tmp || !*tmp || is_bad_len_or_dir(tmp)) + break; + + switch (sel) { + case SEL_ARCHIVE: + if (r == 'c' && strcmp(tmp, pdents[cur].name) == 0) + continue; /* Cannot overwrite the hovered file */ + + tmp = abspath(tmp, NULL, newpath); + if (!tmp) + continue; + if (access(tmp, F_OK) == 0) { + if (!xconfirm(get_input(messages[MSG_OVERWRITE]))) { + statusbar(path); + goto nochange; + } + } + + (r == 's') ? archive_selection(get_archive_cmd(tmp), tmp) + : spawn(get_archive_cmd(tmp), tmp, pdents[cur].name, + NULL, F_CLI | F_CONFIRM); + + if (tmp && (access(tmp, F_OK) == 0)) { /* File created */ + if (r == 's') + clearselection(); /* Archive operation complete */ + + /* Check if any entry is created in the current directory */ + tmp = get_cwd_entry(path, tmp, &len); + if (tmp) { + xstrsncpy(lastname, tmp, len + 1); + clearfilter(); /* Archive name may not match */ + } if (cfg.filtermode) + presel = FILTER; + cd = FALSE; + goto begin; + } + continue; + case SEL_OPENWITH: + handle_openwith(path, pdents[cur].name, newpath, tmp); + + cfg.filtermode ? presel = FILTER : statusbar(path); + copycurname(); + goto nochange; + case SEL_RENAME: + r = 0; + /* Skip renaming to same name */ + if (strcmp(tmp, pdents[cur].name) == 0) { + tmp = xreadline(pdents[cur].name, messages[MSG_COPY_NAME]); + if (!tmp || !tmp[0] || is_bad_len_or_dir(tmp) + || !strcmp(tmp, pdents[cur].name)) { + cfg.filtermode ? presel = FILTER : statusbar(path); + copycurname(); + goto nochange; + } + ret = 'd'; + } + break; + default: /* SEL_NEW */ + break; + } + + if (!(r == 's' || r == 'h')) { + tmp = abspath(tmp, NULL, newpath); + if (!tmp) { + printwarn(&presel); + goto nochange; + } + } + + /* Check if another file with same name exists */ + if (lstat(tmp, &sb) == 0) { + if ((sel == SEL_RENAME) || ((r == 'f') && (S_ISREG(sb.st_mode)))) { + /* Overwrite file with same name? */ + if (!xconfirm(get_input(messages[MSG_OVERWRITE]))) + break; + } else { + /* Do nothing for SEL_NEW if a non-regular entry exists */ + printwait(messages[MSG_EXISTS], &presel); + goto nochange; + } + } + + if (sel == SEL_RENAME) { + /* Rename the file */ + if (ret == 'd') + spawn("cp -rp", pdents[cur].name, tmp, NULL, F_SILENT); + else if (rename(pdents[cur].name, tmp) != 0) { + printwarn(&presel); + goto nochange; + } + + /* Check if any entry is created in the current directory */ + tmp = get_cwd_entry(path, tmp, &len); + if (tmp) + xstrsncpy(lastname, tmp, len + 1); + /* Directory must be reloeaded for rename case */ + } else { /* SEL_NEW */ + presel = 0; + + /* Check if it's a dir or file */ + if (r == 'f' || r == 'd') { + ret = xmktree(tmp, r == 'f' ? FALSE : TRUE); + } else if (r == 's' || r == 'h') { + if (nselected > 1 && tmp[0] == '@' && tmp[1] == '\0') + tmp[0] = '\0'; + ret = xlink(tmp, path, (ndents ? pdents[cur].name : NULL), newpath, r); + } + + if (!ret) + printwarn(&presel); + + if (ret <= 0) + goto nochange; + + if (r == 'f' || r == 'd') { + tmp = get_cwd_entry(path, tmp, &len); + if (tmp) + xstrsncpy(lastname, tmp, len + 1); + else + continue; /* No change in directory */ + } else if (ndents) { + if (cfg.filtermode) + presel = FILTER; + copycurname(); + } + } + clearfilter(); + + cd = FALSE; + goto begin; + } + case SEL_PLUGIN: + /* Check if directory is accessible */ + if (!xdiraccess(plgpath)) { + printwarn(&presel); + goto nochange; + } + + if (!pkey) { + r = xstrsncpy(g_buf, messages[MSG_KEYS], CMD_LEN_MAX); + printkeys(plug, g_buf + r - 1, maxplug); + printmsg(g_buf); + r = get_input(NULL); + } else { + r = pkey; + pkey = '\0'; + } + + if (r != '\r') { + endselection(FALSE); + tmp = get_kv_val(plug, NULL, r, maxplug, NNN_PLUG); + if (!tmp) { + printwait(messages[MSG_INVALID_KEY], &presel); + goto nochange; + } + + if (tmp[0] == '-' && tmp[1]) { + ++tmp; + r = FALSE; /* Do not refresh dir after completion */ + } else + r = TRUE; + + if (!run_plugin(&path, tmp, (ndents ? pdents[cur].name : NULL), + &lastname, &lastdir)) { + printwait(messages[MSG_FAILED], &presel); + goto nochange; + } + + if (g_state.picked) + return EXIT_SUCCESS; + + copycurname(); + + if (!r) { + cfg.filtermode ? presel = FILTER : statusbar(path); + goto nochange; + } + } else { /* 'Return/Enter' enters the plugin directory */ + g_state.runplugin ^= 1; + if (!g_state.runplugin) { + /* + * If toggled, and still in the plugin dir, + * switch to original directory + */ + if (strcmp(path, plgpath) == 0) { + xstrsncpy(path, lastdir, PATH_MAX); + xstrsncpy(lastname, runfile, NAME_MAX + 1); + runfile[0] = '\0'; + setdirwatch(); + goto begin; + } + + /* Otherwise, initiate choosing plugin again */ + g_state.runplugin = 1; + } + + xstrsncpy(lastdir, path, PATH_MAX); + xstrsncpy(path, plgpath, PATH_MAX); + if (ndents) + xstrsncpy(runfile, pdents[cur].name, NAME_MAX); + g_state.runctx = cfg.curctx; + lastname[0] = '\0'; + clearfilter(); + } + setdirwatch(); + if (g_state.runplugin == 1) /* Allow filtering in plugins directory */ + presel = FILTER; + goto begin; + case SEL_SELSIZE: + showselsize(path); + goto nochange; + case SEL_SHELL: // fallthrough + case SEL_LAUNCH: // fallthrough + case SEL_PROMPT: + r = handle_cmd(sel, newpath); + + /* Continue in type-to-nav mode, if enabled */ + if (cfg.filtermode) + presel = FILTER; + + /* Save current */ + copycurname(); + + if (!r) + goto nochange; + + /* Repopulate as directory content may have changed */ + cd = FALSE; + goto begin; + case SEL_UMOUNT: + presel = MSG_ZERO; + if (!unmount((ndents ? pdents[cur].name : NULL), newpath, &presel, path)) { + if (presel == MSG_ZERO) + statusbar(path); + goto nochange; + } + + /* Dir removed, go to next entry */ + copynextname(lastname); + cd = FALSE; + goto begin; +#ifndef NOSSN + case SEL_SESSIONS: + r = get_input(messages[MSG_SSN_OPTS]); + + if (r == 's') { + tmp = xreadline(NULL, messages[MSG_SSN_NAME]); + if (tmp && *tmp) + save_session(tmp, &presel); + } else if (r == 'l' || r == 'r') { + if (load_session(NULL, &path, &lastdir, &lastname, r == 'r')) { + setdirwatch(); + goto begin; + } + } + + statusbar(path); + goto nochange; +#endif + case SEL_EXPORT: + export_file_list(); + cfg.filtermode ? presel = FILTER : statusbar(path); + goto nochange; + case SEL_TIMETYPE: + if (!set_time_type(&presel)) + goto nochange; + cd = FALSE; + goto begin; + case SEL_QUITCTX: // fallthrough + case SEL_QUITCD: // fallthrough + case SEL_QUIT: + case SEL_QUITERR: + if (sel == SEL_QUITCTX) { + int ctx = cfg.curctx; + + for (r = (ctx - 1) & (CTX_MAX - 1); + (r != ctx) && !g_ctx[r].c_cfg.ctxactive; + r = ((r - 1) & (CTX_MAX - 1))) { + }; + + if (r != ctx) { + g_ctx[ctx].c_cfg.ctxactive = 0; + + /* Switch to next active context */ + path = g_ctx[r].c_path; + lastdir = g_ctx[r].c_last; + lastname = g_ctx[r].c_name; + + cfg = g_ctx[r].c_cfg; + + cfg.curctx = r; + setdirwatch(); + goto begin; + } + } else if (!g_state.forcequit) { + for (r = 0; r < CTX_MAX; ++r) + if (r != cfg.curctx && g_ctx[r].c_cfg.ctxactive) { + r = get_input(messages[MSG_QUIT_ALL]); + break; + } + + if (!(r == CTX_MAX || xconfirm(r))) + break; // fallthrough + } + + /* CD on Quit */ + tmp = getenv("NNN_TMPFILE"); + if ((sel == SEL_QUITCD) || tmp) { + write_lastdir(path, tmp); + /* ^G is a way to quit picker mode without picking anything */ + if ((sel == SEL_QUITCD) && g_state.picker) + selbufpos = 0; + } + + if (sel != SEL_QUITERR) + return EXIT_SUCCESS; + + if (selbufpos && !g_state.picker) { + /* Pick files to stdout and exit */ + g_state.picker = 1; + free(selpath); + selpath = NULL; + return EXIT_SUCCESS; + } + + return EXIT_FAILURE; + default: + if (xlines != LINES || xcols != COLS) + continue; + + if (idletimeout && idle == idletimeout) { + lock_terminal(); /* Locker */ + idle = 0; + } + + copycurname(); + goto nochange; + } /* switch (sel) */ + } +} + +static char *make_tmp_tree(char **paths, ssize_t entries, const char *prefix) +{ + /* tmpdir holds the full path */ + /* tmp holds the path without the tmp dir prefix */ + int err; + struct stat sb; + char *slash, *tmp; + ssize_t len = xstrlen(prefix); + char *tmpdir = malloc(PATH_MAX); + + if (!tmpdir) { + DPRINTF_S(strerror(errno)); + return NULL; + } + + tmp = tmpdir + tmpfplen - 1; + xstrsncpy(tmpdir, g_tmpfpath, tmpfplen); + xstrsncpy(tmp, "/nnnXXXXXX", 11); + + /* Points right after the base tmp dir */ + tmp += 10; + + /* handle the case where files are directly under / */ + if (!prefix[1] && (prefix[0] == '/')) + len = 0; + + if (!mkdtemp(tmpdir)) { + free(tmpdir); + + DPRINTF_S(strerror(errno)); + return NULL; + } + + listpath = tmpdir; + + for (ssize_t i = 0; i < entries; ++i) { + if (!paths[i]) + continue; + + err = stat(paths[i], &sb); + if (err && errno == ENOENT) + continue; + + /* Don't copy the common prefix */ + xstrsncpy(tmp, paths[i] + len, xstrlen(paths[i]) - len + 1); + + /* Get the dir containing the path */ + slash = xmemrchr((uchar_t *)tmp, '/', xstrlen(paths[i]) - len); + if (slash) + *slash = '\0'; + + if (access(tmpdir, F_OK)) /* Create directory if it doesn't exist */ + xmktree(tmpdir, TRUE); + + if (slash) + *slash = '/'; + + if (symlink(paths[i], tmpdir)) { + DPRINTF_S(paths[i]); + DPRINTF_S(strerror(errno)); + } + } + + /* Get the dir in which to start */ + *tmp = '\0'; + return tmpdir; +} + +static char *load_input(int fd, const char *path) +{ + size_t i, chunk_count = 1, chunk = 512UL * 1024 /* 512 KiB chunk size */, entries = 0; + char *input = malloc(sizeof(char) * chunk), *tmpdir = NULL; + char cwd[PATH_MAX], *next; + size_t offsets[LIST_FILES_MAX]; + char **paths = NULL; + ssize_t input_read, total_read = 0, off = 0; + int msgnum = 0; + + if (!input) { + DPRINTF_S(strerror(errno)); + return NULL; + } + + if (!path) { + if (!getcwd(cwd, PATH_MAX)) { + free(input); + return NULL; + } + } else + xstrsncpy(cwd, path, PATH_MAX); + + while (chunk_count < LIST_INPUT_MAX / chunk && !msgnum) { + input_read = read(fd, input + total_read, chunk); + if (input_read < 0) { + if (errno == EINTR) + continue; + + DPRINTF_S(strerror(errno)); + goto malloc_1; + } + + if (input_read == 0) + break; + + total_read += input_read; + + while (off < total_read) { + next = memchr(input + off, '\0', total_read - off); + if (!next) + break; + ++next; + + if (next - input == off + 1) { + off = next - input; + continue; + } + + if (entries == LIST_FILES_MAX) { + msgnum = MSG_FILE_LIMIT; + break; + } + + offsets[entries++] = off; + off = next - input; + } + + /* We don't need to allocate another chunk */ + if (chunk_count > (total_read + chunk - 1) / chunk) + continue; + + /* We can never need more than one additional chunk */ + ++chunk_count; + if (chunk_count > LIST_INPUT_MAX / chunk) { + msgnum = MSG_SIZE_LIMIT; + break; + } + + input = xrealloc(input, chunk_count * chunk); + if (!input) + goto malloc_1; + } + + /* We close fd outside this function. Any extra data is left to the kernel to handle */ + + if (off != total_read) { + if (entries == LIST_FILES_MAX) + msgnum = MSG_FILE_LIMIT; + else + offsets[entries++] = off; + } + + DPRINTF_D(entries); + DPRINTF_D(total_read); + DPRINTF_D(chunk_count); + + if (!entries) { + msgnum = MSG_0_ENTRIES; + goto malloc_1; + } + + input[total_read] = '\0'; + + paths = malloc(entries * sizeof(char *)); + if (!paths) + goto malloc_1; + + for (i = 0; i < entries; ++i) + paths[i] = input + offsets[i]; + + listroot = malloc(sizeof(char) * PATH_MAX); + if (!listroot) + goto malloc_1; + listroot[0] = '\0'; + + DPRINTF_S(paths[0]); + + for (i = 0; i < entries; ++i) { + if (paths[i][0] == '\n' || selforparent(paths[i])) { + paths[i] = NULL; + continue; + } + + paths[i] = abspath(paths[i], cwd, NULL); + if (!paths[i]) { + entries = i; // free from the previous entry + goto malloc_2; + } + + DPRINTF_S(paths[i]); + + xstrsncpy(g_buf, paths[i], PATH_MAX); + if (!common_prefix(xdirname(g_buf), listroot)) { + entries = i + 1; // free from the current entry + goto malloc_2; + } + + DPRINTF_S(listroot); + } + + DPRINTF_S(listroot); + + if (listroot[0]) + tmpdir = make_tmp_tree(paths, entries, listroot); + +malloc_2: + for (i = 0; i < entries; ++i) + free(paths[i]); +malloc_1: + if (msgnum) { /* Check if we are past init stage and show msg */ + if (home) { + printmsg(messages[msgnum]); + xdelay(XDELAY_INTERVAL_MS << 2); + } else { + msg(messages[msgnum]); + usleep(XDELAY_INTERVAL_MS << 2); + } + } + + free(input); + free(paths); + return tmpdir; +} + +static void check_key_collision(void) +{ + wint_t key; + bool bitmap[KEY_MAX] = {FALSE}; + + for (ullong_t i = 0; i < ELEMENTS(bindings); ++i) { + key = bindings[i].sym; + + if (bitmap[key]) + dprintf(STDERR_FILENO, "key collision! [%s]\n", keyname(key)); + else + bitmap[key] = TRUE; + } +} + +static void usage(void) +{ + dprintf(STDOUT_FILENO, + "%s: nnn [OPTIONS] [PATH]\n\n" + "The unorthodox terminal file manager.\n\n" + "positional args:\n" + " PATH start dir/file [default: .]\n\n" + "optional args:\n" +#ifndef NOFIFO + " -a auto NNN_FIFO\n" +#endif + " -A no dir auto-enter during filter\n" + " -b key open bookmark key (trumps -s/S)\n" + " -B use bsdtar for archives\n" + " -c cli-only NNN_OPENER (trumps -e)\n" + " -C 8-color scheme\n" + " -d detail mode\n" + " -D dirs in context color\n" + " -e text in $VISUAL/$EDITOR/vi\n" + " -E internal edits in EDITOR\n" +#ifndef NORL + " -f use readline history file\n" +#endif +#ifndef NOFIFO + " -F val fifo mode [0:preview 1:explore]\n" +#endif + " -g regex filters\n" + " -H show hidden files\n" + " -i show current file info\n" + " -J no auto-advance on selection\n" + " -K detect key collision and exit\n" + " -l val set scroll lines\n" + " -n type-to-nav mode\n" + " -o open files only on Enter\n" + " -p file selection file [-:stdout]\n" + " -P key run plugin key\n" + " -Q no quit confirmation\n" + " -r use advcpmv patched cp, mv\n" + " -R no rollover at edges\n" +#ifndef NOSSN + " -s name load session by name\n" + " -S persistent session\n" +#endif + " -t secs timeout to lock\n" + " -T key sort order [a/d/e/r/s/t/v]\n" + " -u use selection (no prompt)\n" +#ifndef NOUG + " -U show user and group\n" +#endif + " -V show version\n" +#ifndef NOX11 + " -x notis, selection sync, xterm title\n" +#endif + " -h show help\n\n" + "v%s\n%s\n", __func__, VERSION, GENERAL_INFO); +} + +static bool setup_config(void) +{ + size_t r, len; + char *xdgcfg = getenv("XDG_CONFIG_HOME"); + bool xdg = FALSE; + + /* Set up configuration file paths */ + if (xdgcfg && xdgcfg[0]) { + DPRINTF_S(xdgcfg); + if (tilde_is_home(xdgcfg)) { + r = xstrsncpy(g_buf, home, PATH_MAX); + xstrsncpy(g_buf + r - 1, xdgcfg + 1, PATH_MAX); + xdgcfg = g_buf; + DPRINTF_S(xdgcfg); + } + + if (!xdiraccess(xdgcfg)) { + xerror(); + return FALSE; + } + + len = xstrlen(xdgcfg) + xstrlen("/nnn/bookmarks") + 1; + xdg = TRUE; + } + + if (!xdg) + len = xstrlen(home) + xstrlen("/.config/nnn/bookmarks") + 1; + + cfgpath = (char *)malloc(len); + plgpath = (char *)malloc(len); + if (!cfgpath || !plgpath) { + xerror(); + return FALSE; + } + + if (xdg) { + xstrsncpy(cfgpath, xdgcfg, len); + r = len - xstrlen("/nnn/bookmarks"); + } else { + r = xstrsncpy(cfgpath, home, len); + + /* Create ~/.config */ + xstrsncpy(cfgpath + r - 1, "/.config", len - r); + DPRINTF_S(cfgpath); + r += 8; /* length of "/.config" */ + } + + /* Create ~/.config/nnn */ + xstrsncpy(cfgpath + r - 1, "/nnn", len - r); + DPRINTF_S(cfgpath); + + /* Create bookmarks, sessions, mounts and plugins directories */ + for (r = 0; r < ELEMENTS(toks); ++r) { + mkpath(cfgpath, toks[r], plgpath); + /* The dirs are created on first run, check if they already exist */ + if (access(plgpath, F_OK) && !xmktree(plgpath, TRUE)) { + DPRINTF_S(toks[r]); + xerror(); + return FALSE; + } + } + + /* Set selection file path */ + if (!g_state.picker) { + char *env_sel = xgetenv(env_cfg[NNN_SEL], NULL); + + selpath = env_sel ? xstrdup(env_sel) + : (char *)malloc(len + 3); /* Length of "/.config/nnn/.selection" */ + + if (!selpath) { + xerror(); + return FALSE; + } + + if (!env_sel) { + r = xstrsncpy(selpath, cfgpath, len + 3); + xstrsncpy(selpath + r - 1, "/.selection", 12); + DPRINTF_S(selpath); + } + } + + return TRUE; +} + +static bool set_tmp_path(void) +{ + char *tmp = "/tmp"; + char *path = xdiraccess(tmp) ? tmp : getenv("TMPDIR"); + + if (!path) { + msg("set TMPDIR"); + return FALSE; + } + + tmpfplen = (uchar_t)xstrsncpy(g_tmpfpath, path, TMP_LEN_MAX); + DPRINTF_S(g_tmpfpath); + DPRINTF_U(tmpfplen); + + return TRUE; +} + +static void cleanup(void) +{ +#ifndef NOX11 + if (cfg.x11 && !g_state.picker) { + printf("\033[23;0t"); /* reset terminal window title */ + fflush(stdout); + } +#endif + free(selpath); + free(plgpath); + free(cfgpath); + free(initpath); + free(bmstr); + free(pluginstr); + free(listroot); + free(ihashbmp); + free(bookmark); + free(plug); + free(lastcmd); +#ifndef NOFIFO + if (g_state.autofifo) + unlink(fifopath); +#endif + if (g_state.pluginit) + unlink(g_pipepath); +#ifdef DEBUG + disabledbg(); +#endif +} + +int main(int argc, char *argv[]) +{ + char *arg = NULL; + char *session = NULL; + int fd, opt, sort = 0, pkey = '\0'; /* Plugin key */ +#ifndef NOMOUSE + mmask_t mask; + char *middle_click_env = xgetenv(env_cfg[NNN_MCLICK], "\0"); + + middle_click_key = (middle_click_env[0] == '^' && middle_click_env[1]) + ? CONTROL(middle_click_env[1]) + : (uchar_t)middle_click_env[0]; +#endif + + const char * const env_opts = xgetenv(env_cfg[NNN_OPTS], NULL); + int env_opts_id = env_opts ? (int)xstrlen(env_opts) : -1; +#ifndef NORL + bool rlhist = FALSE; +#endif + + while ((opt = (env_opts_id > 0 + ? env_opts[--env_opts_id] + : getopt(argc, argv, "aAb:BcCdDeEfF:gHiJKl:nop:P:QrRs:St:T:uUVxh"))) != -1) { + switch (opt) { +#ifndef NOFIFO + case 'a': + g_state.autofifo = 1; + break; +#endif + case 'A': + cfg.autoenter = 0; + break; + case 'b': + if (env_opts_id < 0) + arg = optarg; + break; + case 'B': + g_state.usebsdtar = 1; + break; + case 'c': + cfg.cliopener = 1; + break; + case 'C': + g_state.oldcolor = 1; + break; + case 'd': + cfg.showdetail = 1; + break; + case 'D': + g_state.dirctx = 1; + break; + case 'e': + cfg.useeditor = 1; + break; + case 'E': + cfg.waitedit = 1; + break; + case 'f': +#ifndef NORL + rlhist = TRUE; +#endif + break; +#ifndef NOFIFO + case 'F': + if (env_opts_id < 0) { + fd = atoi(optarg); + if ((fd < 0) || (fd > 1)) + return EXIT_FAILURE; + g_state.fifomode = fd; + } + break; +#endif + case 'g': + cfg.regex = 1; + filterfn = &visible_re; + break; + case 'H': + cfg.showhidden = 1; + break; + case 'i': + cfg.fileinfo = 1; + break; + case 'J': + g_state.stayonsel = 1; + break; + case 'K': + check_key_collision(); + return EXIT_SUCCESS; + case 'l': + if (env_opts_id < 0) + scroll_lines = atoi(optarg); + break; + case 'n': + cfg.filtermode = 1; + break; + case 'o': + cfg.nonavopen = 1; + break; + case 'p': + if (env_opts_id >= 0) + break; + + g_state.picker = 1; + if (!(optarg[0] == '-' && optarg[1] == '\0')) { + fd = open(optarg, O_WRONLY | O_CREAT, 0600); + if (fd == -1) { + xerror(); + return EXIT_FAILURE; + } + + close(fd); + selpath = abspath(optarg, NULL, NULL); + unlink(selpath); + } + break; + case 'P': + if (env_opts_id < 0 && !optarg[1]) + pkey = (uchar_t)optarg[0]; + break; + case 'Q': + g_state.forcequit = 1; + break; + case 'r': +#ifdef __linux__ + memcpy(cp, PROGRESS_CP, sizeof PROGRESS_CP); + memcpy(mv, PROGRESS_MV, sizeof PROGRESS_MV); +#endif + break; + case 'R': + cfg.rollover = 0; + break; +#ifndef NOSSN + case 's': + if (env_opts_id < 0) + session = optarg; + break; + case 'S': + g_state.prstssn = 1; + if (!session) /* Support named persistent sessions */ + session = "@"; + break; +#endif + case 't': + if (env_opts_id < 0) + idletimeout = atoi(optarg); + break; + case 'T': + if (env_opts_id < 0) + sort = (uchar_t)optarg[0]; + break; + case 'u': + cfg.prefersel = 1; + break; + case 'U': + g_state.uidgid = 1; + break; + case 'V': + dprintf(STDOUT_FILENO, "%s\n", VERSION); + return EXIT_SUCCESS; + case 'x': + cfg.x11 = 1; + break; + case 'h': + usage(); + return EXIT_SUCCESS; + default: + usage(); + return EXIT_FAILURE; + } + if (env_opts_id == 0) + env_opts_id = -1; + } + +#ifdef DEBUG + enabledbg(); + DPRINTF_S(VERSION); +#endif + + /* Prefix for temporary files */ + if (!set_tmp_path()) + return EXIT_FAILURE; + + atexit(cleanup); + + /* Check if we are in path list mode */ + if (!isatty(STDIN_FILENO)) { + /* This is the same as listpath */ + initpath = load_input(STDIN_FILENO, NULL); + if (!initpath) + return EXIT_FAILURE; + + /* We return to tty */ + if (!isatty(STDOUT_FILENO)) { + fd = open(ctermid(NULL), O_RDONLY, 0400); + dup2(fd, STDIN_FILENO); + close(fd); + } else + dup2(STDOUT_FILENO, STDIN_FILENO); + + if (session) + session = NULL; + } + + home = getenv("HOME"); + if (!home) { + msg("set HOME"); + return EXIT_FAILURE; + } + DPRINTF_S(home); + homelen = (uchar_t)xstrlen(home); + + if (!setup_config()) + return EXIT_FAILURE; + + /* Get custom opener, if set */ + opener = xgetenv(env_cfg[NNN_OPENER], utils[UTIL_OPENER]); + DPRINTF_S(opener); + + /* Parse bookmarks string */ + if (!parsekvpair(&bookmark, &bmstr, NNN_BMS, &maxbm)) { + msg(env_cfg[NNN_BMS]); + return EXIT_FAILURE; + } + + /* Parse plugins string */ + if (!parsekvpair(&plug, &pluginstr, NNN_PLUG, &maxplug)) { + msg(env_cfg[NNN_PLUG]); + return EXIT_FAILURE; + } + + /* Parse order string */ + if (!parsekvpair(&order, &orderstr, NNN_ORDER, &maxorder)) { + msg(env_cfg[NNN_ORDER]); + return EXIT_FAILURE; + } + + if (!initpath) { + if (arg) { /* Open a bookmark directly */ + if (!arg[1]) /* Bookmarks keys are single char */ + initpath = get_kv_val(bookmark, NULL, *arg, maxbm, NNN_BMS); + + if (!initpath) { + msg(messages[MSG_INVALID_KEY]); + return EXIT_FAILURE; + } + + if (session) + session = NULL; + } else if (argc == optind) { + /* Start in the current directory */ + char *startpath = getenv("PWD"); + + initpath = (startpath && *startpath) ? xstrdup(startpath) : getcwd(NULL, 0); + if (!initpath) + initpath = "/"; + } else { /* Open a file */ + arg = argv[optind]; + DPRINTF_S(arg); + size_t len = xstrlen(arg); + + if (len > 7 && is_prefix(arg, "file://", 7)) { + arg = arg + 7; + len -= 7; + } + initpath = abspath(arg, NULL, NULL); + DPRINTF_S(initpath); + if (!initpath) { + xerror(); + return EXIT_FAILURE; + } + + /* If the file is hidden, enable hidden option */ + if (*xbasename(initpath) == '.') + cfg.showhidden = 1; + + /* + * If nnn is set as the file manager, applications may try to open + * files by invoking nnn. In that case pass the file path to the + * desktop opener and exit. + */ + struct stat sb; + + if (stat(initpath, &sb) == -1) { + bool dir = (arg[len - 1] == '/'); + + if (!dir) { + arg = xbasename(initpath); + initpath = xdirname(initpath); + + pkey = CREATE_NEW_KEY; /* Override plugin key */ + g_state.initfile = 1; + } + if (dir || (arg != initpath)) { /* We have a directory */ + if (!xdiraccess(initpath) && !xmktree(initpath, TRUE)) { + xerror(); /* Fail if directory cannot be created */ + return EXIT_FAILURE; + } + if (!dir) /* Restore the complete path */ + *--arg = '/'; + } + } else if (!S_ISDIR(sb.st_mode)) + g_state.initfile = 1; + + if (session) + session = NULL; + } + } + + /* Set archive handling (enveditor used as tmp var) */ + enveditor = getenv(env_cfg[NNN_ARCHIVE]); +#ifdef PCRE + if (setfilter(&archive_pcre, (enveditor ? enveditor : patterns[P_ARCHIVE]))) { +#else + if (setfilter(&archive_re, (enveditor ? enveditor : patterns[P_ARCHIVE]))) { +#endif + msg(messages[MSG_INVALID_REG]); + return EXIT_FAILURE; + } + + /* An all-CLI opener overrides option -e) */ + if (cfg.cliopener) + cfg.useeditor = 0; + + /* Get VISUAL/EDITOR */ + enveditor = xgetenv(envs[ENV_EDITOR], utils[UTIL_VI]); + editor = xgetenv(envs[ENV_VISUAL], enveditor); + DPRINTF_S(getenv(envs[ENV_VISUAL])); + DPRINTF_S(getenv(envs[ENV_EDITOR])); + DPRINTF_S(editor); + + /* Get PAGER */ + pager = xgetenv(envs[ENV_PAGER], utils[UTIL_LESS]); + DPRINTF_S(pager); + + /* Get SHELL */ + shell = xgetenv(envs[ENV_SHELL], utils[UTIL_SH]); + DPRINTF_S(shell); + + DPRINTF_S(getenv("PWD")); + +#ifndef NOFIFO + /* Create fifo */ + if (g_state.autofifo) { + g_tmpfpath[tmpfplen - 1] = '\0'; + + size_t r = mkpath(g_tmpfpath, "nnn-fifo.", g_buf); + + xstrsncpy(g_buf + r - 1, xitoa(getpid()), PATH_MAX - r); + setenv("NNN_FIFO", g_buf, TRUE); + } + + fifopath = xgetenv("NNN_FIFO", NULL); + if (fifopath) { + if (mkfifo(fifopath, 0600) != 0 && !(errno == EEXIST && access(fifopath, W_OK) == 0)) { + xerror(); + return EXIT_FAILURE; + } + + sigaction(SIGPIPE, &(struct sigaction){.sa_handler = SIG_IGN}, NULL); + } +#endif + +#ifdef LINUX_INOTIFY + /* Initialize inotify */ + inotify_fd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC); + if (inotify_fd < 0) { + xerror(); + return EXIT_FAILURE; + } +#elif defined(BSD_KQUEUE) + kq = kqueue(); + if (kq < 0) { + xerror(); + return EXIT_FAILURE; + } +#elif defined(HAIKU_NM) + haiku_hnd = haiku_init_nm(); + if (!haiku_hnd) { + xerror(); + return EXIT_FAILURE; + } +#endif + + /* Configure trash preference */ + opt = xgetenv_val(env_cfg[NNN_TRASH]); + if (opt && opt <= 2) + g_state.trash = opt; + + /* Ignore/handle certain signals */ + struct sigaction act = {.sa_handler = sigint_handler}; + + if (sigaction(SIGINT, &act, NULL) < 0) { + xerror(); + return EXIT_FAILURE; + } + + act.sa_handler = clean_exit_sighandler; + + if (sigaction(SIGTERM, &act, NULL) < 0 || sigaction(SIGHUP, &act, NULL) < 0) { + xerror(); + return EXIT_FAILURE; + } + + act.sa_handler = SIG_IGN; + + if (sigaction(SIGQUIT, &act, NULL) < 0) { + xerror(); + return EXIT_FAILURE; + } + +#ifndef NOLC + /* Set locale */ + setlocale(LC_ALL, ""); +#ifdef PCRE + tables = pcre_maketables(); +#endif +#endif + +#ifndef NORL +#if RL_READLINE_VERSION >= 0x0603 + /* readline would overwrite the WINCH signal hook */ + rl_change_environment = 0; +#endif + /* Bind TAB to cycling */ + rl_variable_bind("completion-ignore-case", "on"); +#ifdef __linux__ + rl_bind_key('\t', rl_menu_complete); +#else + rl_bind_key('\t', rl_complete); +#endif + if (rlhist) { + mkpath(cfgpath, ".history", g_buf); + read_history(g_buf); + } +#endif + +#ifndef NOX11 + if (cfg.x11 && !g_state.picker) { + /* Save terminal window title */ + printf("\033[22;0t"); + fflush(stdout); + gethostname(hostname, sizeof(hostname)); + hostname[sizeof(hostname) - 1] = '\0'; + } +#endif + +#ifndef NOMOUSE + if (!initcurses(&mask)) +#else + if (!initcurses(NULL)) +#endif + return EXIT_FAILURE; + + if (sort) + set_sort_flags(sort); + + opt = browse(initpath, session, pkey); + +#ifndef NOSSN + if (session && g_state.prstssn) + save_session(session, NULL); +#endif + +#ifndef NOMOUSE + mousemask(mask, NULL); +#endif + + exitcurses(); + +#ifndef NORL + if (rlhist) { + mkpath(cfgpath, ".history", g_buf); + write_history(g_buf); + } +#endif + + if (g_state.picker) { + if (selbufpos) { + fd = selpath ? open(selpath, O_WRONLY | O_CREAT | O_TRUNC, 0600) : STDOUT_FILENO; + if ((fd == -1) || (seltofile(fd, NULL) != (size_t)(selbufpos))) + xerror(); + + if (fd > 1) + close(fd); + } + } else if (selpath) + unlink(selpath); + + /* Remove tmp dir in list mode */ + rmlistpath(); + + /* Free the regex */ +#ifdef PCRE + pcre_free(archive_pcre); +#else + regfree(&archive_re); +#endif + + /* Free the selection buffer */ + free(pselbuf); + +#ifdef LINUX_INOTIFY + /* Shutdown inotify */ + if (inotify_wd >= 0) + inotify_rm_watch(inotify_fd, inotify_wd); + close(inotify_fd); +#elif defined(BSD_KQUEUE) + if (event_fd >= 0) + close(event_fd); + close(kq); +#elif defined(HAIKU_NM) + haiku_close_nm(haiku_hnd); +#endif + +#ifndef NOFIFO + if (!g_state.fifomode) + notify_fifo(FALSE); + if (fifofd != -1) + close(fifofd); +#endif + + return opt; +} diff --git a/nnn-4.9/src/nnn.h b/nnn-4.9/src/nnn.h @@ -0,0 +1,291 @@ +/* + * BSD 2-Clause License + * + * Copyright (C) 2014-2016, Lazaros Koromilas <lostd@2f30.org> + * Copyright (C) 2014-2016, Dimitris Papastamos <sin@2f30.org> + * Copyright (C) 2016-2023, Arun Prakash Jana <engineerarun@gmail.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include <curses.h> +#include <wchar.h> + +#define CONTROL(c) ((c) & 0x1f) + +#ifndef ESC +#define ESC (27) +#endif + +#ifndef DEL +#define DEL (127) +#endif + +/* Supported actions */ +enum action { + SEL_BACK = 1, + SEL_OPEN, + SEL_NAV_IN, + SEL_NEXT, + SEL_PREV, + SEL_PGDN, + SEL_PGUP, + SEL_CTRL_D, + SEL_CTRL_U, + SEL_HOME, + SEL_END, + SEL_FIRST, + SEL_JUMP, + SEL_YOUNG, + SEL_CDHOME, + SEL_CDBEGIN, + SEL_CDLAST, + SEL_CDROOT, + SEL_BMOPEN, + SEL_REMOTE, + SEL_CYCLE, + SEL_CYCLER, + SEL_CTX1, + SEL_CTX2, + SEL_CTX3, + SEL_CTX4, +#ifdef CTX8 + SEL_CTX5, + SEL_CTX6, + SEL_CTX7, + SEL_CTX8, +#endif + SEL_MARK, + SEL_BMARK, + SEL_FLTR, + SEL_MFLTR, + SEL_HIDDEN, + SEL_DETAIL, + SEL_STATS, + SEL_CHMODX, + SEL_ARCHIVE, + SEL_SORT, + SEL_REDRAW, + SEL_SEL, + SEL_SELMUL, + SEL_SELALL, + SEL_SELINV, + SEL_SELEDIT, + SEL_CP, + SEL_MV, + SEL_CPMVAS, + SEL_RM, + SEL_OPENWITH, + SEL_NEW, + SEL_RENAME, + SEL_RENAMEMUL, + SEL_UMOUNT, + SEL_HELP, + SEL_AUTONEXT, + SEL_EDIT, + SEL_PLUGIN, + SEL_SELSIZE, + SEL_SHELL, + SEL_LAUNCH, + SEL_PROMPT, + SEL_LOCK, + SEL_SESSIONS, + SEL_EXPORT, + SEL_TIMETYPE, + SEL_QUITCTX, + SEL_QUITCD, + SEL_QUIT, + SEL_QUITERR, +#ifndef NOMOUSE + SEL_CLICK, +#endif +}; + +/* Associate a pressed key to an action */ +struct key { + wint_t sym; /* Key pressed */ + enum action act; /* Action */ +}; + +static struct key bindings[] = { + /* Back */ + { KEY_LEFT, SEL_BACK }, + { 'h', SEL_BACK }, + /* Inside or select */ + { KEY_ENTER, SEL_OPEN }, + { '\r', SEL_OPEN }, + /* Pure navigate inside */ + { KEY_RIGHT, SEL_NAV_IN }, + { 'l', SEL_NAV_IN }, + /* Next */ + { 'j', SEL_NEXT }, + { KEY_DOWN, SEL_NEXT }, + /* Previous */ + { 'k', SEL_PREV }, + { KEY_UP, SEL_PREV }, + /* Page down */ + { KEY_NPAGE, SEL_PGDN }, + /* Page up */ + { KEY_PPAGE, SEL_PGUP }, + /* Ctrl+D */ + { CONTROL('D'), SEL_CTRL_D }, + /* Ctrl+U */ + { CONTROL('U'), SEL_CTRL_U }, + /* First entry */ + { KEY_HOME, SEL_HOME }, + { 'g', SEL_HOME }, + { CONTROL('A'), SEL_HOME }, + /* Last entry */ + { KEY_END, SEL_END }, + { 'G', SEL_END }, + { CONTROL('E'), SEL_END }, + /* Go to first file */ + { '\'', SEL_FIRST }, + /* Jump to an entry number/offset */ + { 'J', SEL_JUMP }, + { CONTROL('Y'), SEL_YOUNG }, + /* HOME */ + { '~', SEL_CDHOME }, + /* Initial directory */ + { '@', SEL_CDBEGIN }, + /* Last visited dir */ + { '-', SEL_CDLAST }, + /* Go to / */ + { '`', SEL_CDROOT }, + /* Leader key */ + { 'b', SEL_BMOPEN }, + { CONTROL('_'), SEL_BMOPEN }, + /* Connect to server over SSHFS */ + { 'c', SEL_REMOTE }, + /* Cycle contexts in forward direction */ + { '\t', SEL_CYCLE }, + /* Cycle contexts in reverse direction */ + { KEY_BTAB, SEL_CYCLER }, + /* Go to/create context N */ + { '1', SEL_CTX1 }, + { '2', SEL_CTX2 }, + { '3', SEL_CTX3 }, + { '4', SEL_CTX4 }, +#ifdef CTX8 + { '5', SEL_CTX5 }, + { '6', SEL_CTX6 }, + { '7', SEL_CTX7 }, + { '8', SEL_CTX8 }, +#endif + /* Mark a path to visit later */ + { ',', SEL_MARK }, + /* Create a bookmark */ + { 'B', SEL_BMARK }, + /* Filter */ + { '/', SEL_FLTR }, + /* Toggle filter mode */ + { CONTROL('N'), SEL_MFLTR }, + /* Toggle hide .dot files */ + { '.', SEL_HIDDEN }, + /* Detailed listing */ + { 'd', SEL_DETAIL }, + /* File details */ + { 'f', SEL_STATS }, + { CONTROL('F'), SEL_STATS }, + /* Toggle executable status */ + { '*', SEL_CHMODX }, + /* Create archive */ + { 'z', SEL_ARCHIVE }, + /* Sort toggles */ + { 't', SEL_SORT }, + { CONTROL('T'), SEL_SORT }, + /* Redraw window */ + { CONTROL('L'), SEL_REDRAW }, + /* Select current file path */ + { ' ', SEL_SEL }, + { '+', SEL_SEL }, + /* Toggle select multiple files */ + { 'm', SEL_SELMUL }, + /* Select all files in current dir */ + { 'a', SEL_SELALL }, + /* Invert selection in current dir */ + { 'A', SEL_SELINV }, + /* List, edit selection */ + { 'E', SEL_SELEDIT }, + /* Copy from selection buffer */ + { 'p', SEL_CP }, + { CONTROL('P'), SEL_CP }, + /* Move from selection buffer */ + { 'v', SEL_MV }, + { CONTROL('V'), SEL_MV }, + /* Copy/move from selection buffer and rename */ + { 'w', SEL_CPMVAS }, + { CONTROL('W'), SEL_CPMVAS }, + /* Delete from selection buffer */ + { 'x', SEL_RM }, + { CONTROL('X'), SEL_RM }, + /* Open in a custom application */ + { 'o', SEL_OPENWITH }, + { CONTROL('O'), SEL_OPENWITH }, + /* Create a new file */ + { 'n', SEL_NEW }, + /* Show rename prompt */ + { CONTROL('R'), SEL_RENAME }, + /* Rename contents of current dir */ + { 'r', SEL_RENAMEMUL }, + /* Disconnect a SSHFS mount point */ + { 'u', SEL_UMOUNT }, + /* Show help */ + { '?', SEL_HELP }, + /* Toggle auto-advance on file open */ + { CONTROL('J'), SEL_AUTONEXT }, + /* Edit in EDITOR */ + { 'e', SEL_EDIT }, + /* Run a plugin */ + { ';', SEL_PLUGIN }, + /* Show total size of listed selection */ + { 'S', SEL_SELSIZE }, + /* Run command */ + { '!', SEL_SHELL }, + { CONTROL(']'), SEL_SHELL }, + /* Launcher */ + { '=', SEL_LAUNCH }, + /* Show command prompt */ + { ']', SEL_PROMPT }, + /* Lock screen */ + { '0', SEL_LOCK }, + /* Manage sessions */ + { 's', SEL_SESSIONS }, + /* Export list */ + { '>', SEL_EXPORT }, + /* Set time type */ + { 'T', SEL_TIMETYPE }, + /* Quit a context */ + { 'q', SEL_QUITCTX }, + /* Change dir on quit */ + { CONTROL('G'), SEL_QUITCD }, + /* Quit */ + { CONTROL('Q'), SEL_QUIT }, + /* Quit with an error code */ + { 'Q', SEL_QUITERR }, +#ifndef NOMOUSE + { KEY_MOUSE, SEL_CLICK }, +#endif +}; diff --git a/nnn-4.9/src/qsort.h b/nnn-4.9/src/qsort.h @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2013, 2017 Alexey Tourbin + * + * 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. + */ + +/* + * This is a traditional Quicksort implementation which mostly follows + * [Sedgewick 1978]. Sorting is performed entirely on array indices, + * while actual access to the array elements is abstracted out with the + * user-defined `LESS` and `SWAP` primitives. + * + * Synopsis: + * QSORT(N, LESS, SWAP); + * where + * N - the number of elements in A[]; + * LESS(i, j) - compares A[i] to A[j]; + * SWAP(i, j) - exchanges A[i] with A[j]. + */ + +#ifndef QSORT_H +#define QSORT_H + +/* Sort 3 elements. */ +#define Q_SORT3(q_a1, q_a2, q_a3, Q_LESS, Q_SWAP) \ +do { \ + if (Q_LESS(q_a2, q_a1)) { \ + if (Q_LESS(q_a3, q_a2)) \ + Q_SWAP(q_a1, q_a3); \ + else { \ + Q_SWAP(q_a1, q_a2); \ + if (Q_LESS(q_a3, q_a2)) \ + Q_SWAP(q_a2, q_a3); \ + } \ + } \ + else if (Q_LESS(q_a3, q_a2)) { \ + Q_SWAP(q_a2, q_a3); \ + if (Q_LESS(q_a2, q_a1)) \ + Q_SWAP(q_a1, q_a2); \ + } \ +} while (0) + +/* Partition [q_l,q_r] around a pivot. After partitioning, + * [q_l,q_j] are the elements that are less than or equal to the pivot, + * while [q_i,q_r] are the elements greater than or equal to the pivot. */ +#define Q_PARTITION(q_l, q_r, q_i, q_j, Q_UINT, Q_LESS, Q_SWAP) \ +do { \ + /* The middle element, not to be confused with the median. */ \ + Q_UINT q_m = (q_l) + (((q_r) - (q_l)) >> 1); \ + /* Reorder the second, the middle, and the last items. \ + * As [Edelkamp Weiss 2016] explain, using the second element \ + * instead of the first one helps avoid bad behaviour for \ + * decreasingly sorted arrays. This method is used in recent \ + * versions of gcc's std::sort, see gcc bug 58437#c13, although \ + * the details are somewhat different (cf. #c14). */ \ + Q_SORT3((q_l) + 1, q_m, q_r, Q_LESS, Q_SWAP); \ + /* Place the median at the beginning. */ \ + Q_SWAP(q_l, q_m); \ + /* Partition [q_l+2, q_r-1] around the median which is in q_l. \ + * q_i and q_j are initially off by one, they get decremented \ + * in the do-while loops. */ \ + (q_i) = (q_l) + 1; (q_j) = q_r; \ + while (1) { \ + do (q_i)++; while (Q_LESS(q_i, q_l)); \ + do (q_j)--; while (Q_LESS(q_l, q_j)); \ + if ((q_i) >= (q_j)) break; /* Sedgewick says "until j < i" */ \ + Q_SWAP(q_i, q_j); \ + } \ + /* Compensate for the i==j case. */ \ + (q_i) = (q_j) + 1; \ + /* Put the median to its final place. */ \ + Q_SWAP(q_l, q_j); \ + /* The median is not part of the left subfile. */ \ + (q_j)--; \ +} while (0) + +/* Insertion sort is applied to small subfiles - this is contrary to + * Sedgewick's suggestion to run a separate insertion sort pass after + * the partitioning is done. The reason I don't like a separate pass + * is that it triggers extra comparisons, because it can't see that the + * medians are already in their final positions and need not be rechecked. + * Since I do not assume that comparisons are cheap, I also do not try + * to eliminate the (q_j > q_l) boundary check. */ +#define Q_INSERTION_SORT(q_l, q_r, Q_UINT, Q_LESS, Q_SWAP) \ +do { \ + Q_UINT q_i, q_j; \ + /* For each item starting with the second... */ \ + for (q_i = (q_l) + 1; q_i <= (q_r); q_i++) \ + /* move it down the array so that the first part is sorted. */ \ + for (q_j = q_i; q_j > (q_l) && (Q_LESS(q_j, q_j - 1)); q_j--) \ + Q_SWAP(q_j, q_j - 1); \ +} while (0) + +/* When the size of [q_l,q_r], i.e. q_r-q_l+1, is greater than or equal to + * Q_THRESH, the algorithm performs recursive partitioning. When the size + * drops below Q_THRESH, the algorithm switches to insertion sort. + * The minimum valid value is probably 5 (with 5 items, the second and + * the middle items, the middle itself being rounded down, are distinct). */ +#define Q_THRESH 16 + +/* The main loop. */ +#define Q_LOOP(Q_UINT, Q_N, Q_LESS, Q_SWAP) \ +do { \ + Q_UINT q_l = 0; \ + Q_UINT q_r = (Q_N) - 1; \ + Q_UINT q_sp = 0; /* the number of frames pushed to the stack */ \ + struct { Q_UINT q_l, q_r; } \ + /* On 32-bit platforms, to sort a "char[3GB+]" array, \ + * it may take full 32 stack frames. On 64-bit CPUs, \ + * though, the address space is limited to 48 bits. \ + * The usage is further reduced if Q_N has a 32-bit type. */ \ + q_st[sizeof(Q_UINT) > 4 && sizeof(Q_N) > 4 ? 48 : 32]; \ + while (1) { \ + if (q_r - q_l + 1 >= Q_THRESH) { \ + Q_UINT q_i, q_j; \ + Q_PARTITION(q_l, q_r, q_i, q_j, Q_UINT, Q_LESS, Q_SWAP); \ + /* Now have two subfiles: [q_l,q_j] and [q_i,q_r]. \ + * Dealing with them depends on which one is bigger. */ \ + if (q_j - q_l >= q_r - q_i) \ + Q_SUBFILES(q_l, q_j, q_i, q_r); \ + else \ + Q_SUBFILES(q_i, q_r, q_l, q_j); \ + } \ + else { \ + Q_INSERTION_SORT(q_l, q_r, Q_UINT, Q_LESS, Q_SWAP); \ + /* Pop subfiles from the stack, until it gets empty. */ \ + if (q_sp == 0) break; \ + q_sp--; \ + q_l = q_st[q_sp].q_l; \ + q_r = q_st[q_sp].q_r; \ + } \ + } \ +} while (0) + +/* The missing part: dealing with subfiles. + * Assumes that the first subfile is not smaller than the second. */ +#define Q_SUBFILES(q_l1, q_r1, q_l2, q_r2) \ +do { \ + /* If the second subfile is only a single element, it needs \ + * no further processing. The first subfile will be processed \ + * on the next iteration (both subfiles cannot be only a single \ + * element, due to Q_THRESH). */ \ + if ((q_l2) == (q_r2)) { \ + q_l = q_l1; \ + q_r = q_r1; \ + } \ + else { \ + /* Otherwise, both subfiles need processing. \ + * Push the larger subfile onto the stack. */ \ + q_st[q_sp].q_l = q_l1; \ + q_st[q_sp].q_r = q_r1; \ + q_sp++; \ + /* Process the smaller subfile on the next iteration. */ \ + q_l = q_l2; \ + q_r = q_r2; \ + } \ +} while (0) + +/* And now, ladies and gentlemen, may I proudly present to you... */ +#define QSORT(Q_N, Q_LESS, Q_SWAP) \ +do { \ + if ((Q_N) > 1) \ + /* We could check sizeof(Q_N) and use "unsigned", but at least \ + * on x86_64, this has the performance penalty of up to 5%. */ \ + Q_LOOP(unsigned long, Q_N, Q_LESS, Q_SWAP); \ +} while (0) + +#endif + +/* ex:set ts=8 sts=4 sw=4 noet: */ diff --git a/portatil/bashrc b/portatil/bashrc @@ -21,7 +21,7 @@ export EDITOR=nvim # Cousas de NNN export NNN_PLUG='p:preview-tui;t:preview-tabbed;i:imgview;' export NNN_USE_EDITOR=1 -export NNN_OPENER=/home/chinomin/.config/nnn/plugins/nuke +export NNN_OPENER=/home/$USER/.config/nnn/plugins/nuke export NNN_FIFO=/tmp/nnn.fifo alias pdf=zathura alias v=nvim