diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 6c3eac6e7..0cb9410fc 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -5,6 +5,7 @@ plugins/genpass/ @atoponce
plugins/git-lfs/ @hellovietduc
plugins/gitfast/ @felipec
plugins/sdk/ @rgoldberg
+plugins/shell-proxy/ @septs
plugins/universalarchive/ @Konfekt
plugins/wp-cli/ @joshmedeski
plugins/zoxide/ @ajeetdsouza
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index c44bb2475..484a8cf53 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,2 +1,2 @@
-github: [robbyrussell, mcornella, larson-carter]
+github: [ohmyzsh, robbyrussell, mcornella, larson-carter]
open_collective: ohmyzsh
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index af2973fec..98f66b1d2 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -1,12 +1,11 @@
-name: Bug report
-description: Create a report to help us improve Oh My Zsh
-labels: 'Bug'
+name: Report a bug
+description: Report a bug that isn't caused by Oh My Zsh. If unsure, use this form
body:
- type: markdown
attributes:
value: |
## Self Check
- - Try searching existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed) for similar issues.
+ - Look for similar errors in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed).
- Try reaching out on the [Discord server](https://discord.gg/ohmyzsh) for help.
- type: textarea
validations:
@@ -41,21 +40,21 @@ body:
validations:
required: true
attributes:
- label: OS / Distro
- placeholder: e.g. Windows 10, Ubuntu 20.04, Arch Linux, macOS 10.15...
+ label: OS / Linux distribution
+ placeholder: Windows 10, Ubuntu 20.04, Arch Linux, macOS 10.15...
- type: input
validations:
required: true
attributes:
label: Zsh version
description: Run `echo $ZSH_VERSION` to check.
- placeholder: e.g. 5.6
+ placeholder: "5.6"
- type: input
validations:
required: true
attributes:
label: Terminal emulator
- placeholder: e.g. iTerm2, Gnome Terminal...
+ placeholder: iTerm2, GNOME Terminal, Terminal.app...
- type: dropdown
attributes:
label: If using WSL on Windows, which version of WSL
diff --git a/.github/ISSUE_TEMPLATE/bug_report_omz.yml b/.github/ISSUE_TEMPLATE/bug_report_omz.yml
new file mode 100644
index 000000000..96f5ad934
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report_omz.yml
@@ -0,0 +1,77 @@
+name: Report a bug in Oh My Zsh
+description: Create a report to help us improve Oh My Zsh
+labels: ['Bug']
+body:
+ - type: markdown
+ attributes:
+ value: |
+ ## Self Check
+ - **Make sure this bug only happens with Oh My Zsh enabled**.
+ - Look for similar errors in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed).
+ - Try reaching out on the [Discord server](https://discord.gg/ohmyzsh) for help.
+ - type: textarea
+ validations:
+ required: true
+ attributes:
+ label: Describe the bug
+ description: A clear description of what the bug is.
+ - type: textarea
+ validations:
+ required: true
+ attributes:
+ label: Steps to reproduce
+ description: |
+ Steps to reproduce the problem.
+ placeholder: |
+ For example:
+ 1. Enable plugin '...'
+ 2. Run command '...' or try to complete command '...'
+ 3. See error
+ - type: textarea
+ validations:
+ required: true
+ attributes:
+ label: Expected behavior
+ description: A brief description of what should happen.
+ - type: textarea
+ attributes:
+ label: Screenshots and recordings
+ description: |
+ If applicable, add screenshots to help explain your problem. You can also record an asciinema session: https://asciinema.org/
+ - type: input
+ validations:
+ required: true
+ attributes:
+ label: OS / Linux distribution
+ placeholder: Windows 10, Ubuntu 20.04, Arch Linux, macOS 10.15...
+ - type: input
+ validations:
+ required: true
+ attributes:
+ label: Zsh version
+ description: Run `echo $ZSH_VERSION` to check.
+ placeholder: "5.6"
+ - type: input
+ validations:
+ required: true
+ attributes:
+ label: Oh My Zsh version
+ description: Run `omz version` to check.
+ placeholder: master (bf303965)
+ - type: input
+ validations:
+ required: true
+ attributes:
+ label: Terminal emulator
+ placeholder: iTerm2, GNOME Terminal, Terminal.app...
+ - type: dropdown
+ attributes:
+ label: If using WSL on Windows, which version of WSL
+ description: Run `wsl -l -v` to check.
+ options:
+ - WSL1
+ - WSL2
+ - type: textarea
+ attributes:
+ label: Additional context
+ description: Add any other context about the problem here. This can be themes, plugins, custom settings...
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index dc4baf2b1..ac966dfd9 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -1,7 +1,12 @@
name: Feature request
description: Suggest a feature for Oh My Zsh
-labels: 'Feature'
+labels: ["Feature"]
body:
+ - type: markdown
+ attributes:
+ value: |
+ ## Self Check
+ - Look for similar features in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed).
- type: input
attributes:
label: If the feature request is for a plugin or theme, specify it here.
diff --git a/.github/actions/spelling/README.md b/.github/actions/spelling/README.md
new file mode 100644
index 000000000..dcd237ba2
--- /dev/null
+++ b/.github/actions/spelling/README.md
@@ -0,0 +1,15 @@
+# check-spelling/check-spelling configuration
+
+File | Purpose | Format | Info
+-|-|-|-
+[dictionary.txt](dictionary.txt) | Replacement dictionary (creating this file will override the default dictionary) | one word per line | [dictionary](https://github.com/check-spelling/check-spelling/wiki/Configuration#dictionary)
+[allow.txt](allow.txt) | Add words to the dictionary | one word per line (only letters and `'`s allowed) | [allow](https://github.com/check-spelling/check-spelling/wiki/Configuration#allow)
+[reject.txt](reject.txt) | Remove words from the dictionary (after allow) | grep pattern matching whole dictionary words | [reject](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-reject)
+[excludes.txt](excludes.txt) | Files to ignore entirely | perl regular expression | [excludes](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-excludes)
+[only.txt](only.txt) | Only check matching files (applied after excludes) | perl regular expression | [only](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-only)
+[patterns.txt](patterns.txt) | Patterns to ignore from checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns)
+[expect.txt](expect.txt) | Expected words that aren't in the dictionary | one word per line (sorted, alphabetically) | [expect](https://github.com/check-spelling/check-spelling/wiki/Configuration#expect)
+[advice.md](advice.md) | Supplement for GitHub comment when unrecognized words are found | GitHub Markdown | [advice](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice)
+
+Note: you can replace any of these files with a directory by the same name (minus the suffix)
+and then include multiple files inside that directory (with that suffix) to merge multiple files together.
diff --git a/.github/actions/spelling/advice.md b/.github/actions/spelling/advice.md
new file mode 100644
index 000000000..c83423a8e
--- /dev/null
+++ b/.github/actions/spelling/advice.md
@@ -0,0 +1,25 @@
+
+If the flagged items do not appear to be text
+
+If items relate to a ...
+* well-formed pattern.
+
+ If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
+ try adding it to the `patterns.txt` file.
+
+ Patterns are Perl 5 Regular Expressions - you can [test](
+https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.
+
+ Note that patterns can't match multiline strings.
+
+* binary file.
+
+ Please add a file path to the `excludes.txt` file matching the containing file.
+
+ File paths are Perl 5 Regular Expressions - you can [test](
+https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.
+
+ `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
+../tree/HEAD/README.md) (on whichever branch you're using).
+
+
diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt
new file mode 100644
index 000000000..f1cfeefbb
--- /dev/null
+++ b/.github/actions/spelling/excludes.txt
@@ -0,0 +1,41 @@
+# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-excludes
+(?:^|/)(?i)COPYRIGHT
+(?:^|/)(?i)LICEN[CS]E
+(?:^|/)package(?:-lock|)\.json$
+(?:^|/)vendor/
+ignore$
+\.avi$
+\.ico$
+\.jpe?g$
+\.lock$
+\.map$
+\.min\..
+\.mod$
+\.mp[34]$
+\.png$
+\.wav$
+^\.github/
+^\Qplugins/archlinux/archlinux.plugin.zsh\E$
+^\Qplugins/cp/cp.plugin.zsh\E$
+^\Qplugins/extract/_extract\E$
+^\Qplugins/genpass/genpass.plugin.zsh\E$
+^\Qplugins/gitignore/gitignore.plugin.zsh\E$
+^\Qplugins/gnu-utils/gnu-utils.plugin.zsh\E$
+^\Qplugins/hitchhiker/fortunes/hitchhiker\E$
+^\Qplugins/jhbuild/jhbuild.plugin.zsh\E$
+^\Qplugins/jhbuild/README.md\E$
+^\Qplugins/jruby/jruby.plugin.zsh\E$
+^\Qplugins/kubectl/kubectl.plugin.zsh\E$
+^\Qplugins/lol/lol.plugin.zsh\E$
+^\Qplugins/mosh/mosh.plugin.zsh\E$
+^\Qplugins/npx/npx.plugin.zsh\E$
+^\Qplugins/powder/_powder\E$
+^\Qplugins/suse/suse.plugin.zsh\E$
+^\Qplugins/thor/_thor\E$
+^\Qplugins/universalarchive/_universalarchive\E$
+^\Qplugins/vagrant/vagrant.plugin.zsh\E$
+^\Qplugins/wp-cli/README.md\E$
+^\Qplugins/wp-cli/wp-cli.plugin.zsh\E$
+^\Qthemes/clean.zsh-theme\E$
+^\Qthemes/philips.zsh-theme\E$
+^\Qthemes/tonotdo.zsh-theme\E$
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
new file mode 100644
index 000000000..5c5a04ff1
--- /dev/null
+++ b/.github/actions/spelling/expect.txt
@@ -0,0 +1,4494 @@
+AAAAC
+aac
+aar
+abcdefghjkmnpqrstvwxyz
+ABRT
+absorbgitdirs
+abspath
+abtvfr
+acceptorthreads
+accessip
+ACDIM
+acking
+ackmate
+ackup
+ACLs
+acon
+aconf
+acp
+acpi
+acpitool
+acr
+acroread
+acs
+acsc
+acsp
+acss
+actionformats
+Adamantium
+adb
+adbd
+adben
+addgroups
+addhistory
+addon
+addprincipals
+addrport
+addrs
+addusergroups
+addwin
+adelcampo
+adg
+ADK
+adminalias
+adminport
+Admins
+adoc
+adu
+aeiouy
+afh
+afind
+afmagic
+afs
+afu
+agb
+agc
+agd
+agentpath
+agi
+agignore
+agli
+aglu
+agnoster
+agp
+agrimaldi
+ags
+agu
+agud
+agug
+aguu
+AHg
+ainv
+aip
+Airbender
+ajp
+ajs
+Akinori
+akoenig
+alacritty
+albers
+alberto
+alertmanager
+alex
+alexandre
+aliasfiletype
+aliaspassword
+allexport
+alloc
+allocstatus
+allownoncomponentcallers
+allpkgs
+alnum
+ALRM
+altchar
+Altoid
+alwayz
+amanda
+amazonaws
+amazonec
+ambyj
+amd
+amqp
+AMRD
+anche
+andi
+andrewrdwyer
+angularjs
+anley
+anlp
+annots
+anonymize
+anotherfolder
+ansible
+antrun
+anycommand
+apexcodefile
+apextests
+api
+apidocs
+apiversion
+apjanke
+apk
+apklib
+aplaybook
+appid
+applica
+applist
+appname
+apps
+appup
+aps
+apull
+arachnophobia
+araxis
+ARCHFLAGS
+archimport
+archlinux
+arci
+arcizan
+ard
+ardc
+ardnu
+ardnupc
+ardp
+ardpc
+ARGC
+args
+argset
+argslist
+argu
+argv
+ARGZERO
+arh
+arinit
+arl
+arli
+arpa
+arquillian
+artifactory
+asadmin
+asc
+asciicast
+asciidoc
+asciidoctor
+asciinema
+asdeps
+asdf
+askpass
+asm
+asmo
+asrc
+assem
+associatewiththread
+ASTs
+asyncreplication
+atlassian
+attr
+ATTRIBUTENAME
+aufs
+auin
+auinsd
+auloc
+auls
+aulst
+aumir
+auown
+auownloc
+auownls
+aur
+aure
+aurem
+aurep
+aurinsd
+aurph
+aurrep
+authmethods
+authorizationdb
+authpriv
+authrealmname
+authz
+autoapplyenabled
+autoclean
+autocomplete
+autocompleted
+autocompletion
+AUTOCONNECT
+autocrlf
+autodetermine
+autodie
+autoenv
+autohadboverride
+autoipd
+autojump
+autoload
+autolock
+autolocking
+autopep
+AUTOQUIT
+autoreload
+autoreloading
+autoremove
+autorun
+autoscale
+autoscaling
+autoselect
+autoshortened
+autosquash
+autostart
+autostash
+autoupdate
+auupd
+auupg
+availabilityenabled
+avh
+avi
+AVIT
+avivrosenberg
+avneet
+avz
+avzu
+aws
+awscli
+awslogs
+babakks
+backend
+backendconfig
+backtick
+backupconfig
+backupdir
+backupfile
+backuptheme
+bactrian
+baidu
+bamshuf
+bamtobed
+bamtofastq
+Barsi
+Basecamp
+basedir
+basedn
+basefile
+baseurl
+basevmdk
+bashcompinit
+bashdefault
+bashrc
+batchid
+baz
+bazel
+bazelbuild
+bbd
+bbdiff
+bbedit
+BBM
+bbpb
+bcc
+bcdfghjklmnpqrstvwxz
+bck
+bcn
+bcubc
+bcubo
+beaglidx
+becc
+bedcov
+BEDGRAPH
+BEDPE
+bedpetobam
+bedtobam
+bedtools
+Belarus
+bem
+benchmarker
+benchmem
+benchtime
+bento
+benwilcock
+berks
+Bertinelli
+bgnotify
+bgrewriteeaof
+bgsave
+binarynights
+bindaddress
+binded
+bindir
+bindkey
+binpack
+binstub
+bintray
+bip
+bira
+bisd
+bitboxer
+bitbucket
+bitswap
+bitwarden
+blkio
+blockprofile
+blockprofilerate
+blod
+blog
+blogger
+blogspot
+blpop
+bluebox
+Bluetooth
+bobwilliams
+bodycc
+Bonetti
+bookmarked
+booknames
+bootclasspath
+bootscript
+bootsnipp
+borland
+borrowck
+Boudreau
+Boushh
+Bouvet
+BPtmux
+bpython
+bqr
+brainstormr
+Brainville
+branchformat
+branchname
+branchrefs
+brewp
+brewsp
+briancarper
+bringz
+Broadcom
+Brodersen
+brpop
+brpoplpush
+btannous
+btih
+btn
+btrestart
+btrfs
+btw
+bubc
+bubu
+buf
+buffersizebytes
+buflines
+bugfix
+bugfixes
+bugreport
+bugsnag
+Buildfile
+buildinstance
+buildnumber
+buildpackage
+buildpacks
+buildscript
+builtins
+bundlephobia
+bunzip
+Burkina
+Busybox
+bwaht
+Bxegedabagacad
+bypjyp
+bytebuffertype
+bytecode
+bytewise
+byznis
+bzip
+bzr
+cabextract
+CACERT
+cacertfile
+cacheinfo
+cachename
+caiifr
+Cakefile
+cakephp
+callvim
+calmd
+calways
+caname
+caniuse
+cano
+capath
+Capfile
+capify
+capistrano
+capistranorb
+capit
+CARETCOLOR
+caserta
+Caskroom
+catimg
+catserver
+catspeak
+cbr
+ccat
+cccmd
+ccflags
+ccl
+ccomp
+ccp
+cdargs
+cdcmd
+cdo
+CDPATH
+cdu
+cdx
+cdylib
+cecho
+cehlrtx
+celerybeat
+celeryev
+celerymon
+celeryproject
+Celso
+celsomiranda
+certfile
+certname
+certs
+cfa
+cfap
+cfbpk
+cfbs
+cfc
+cfdel
+cfdm
+cfdor
+cfds
+cfe
+cfev
+cfg
+cfgfile
+cfhu
+cfl
+cflg
+cflr
+cfp
+cfpc
+cfpm
+cfr
+cfsc
+cfsh
+cfsp
+cfsrt
+cfsrtall
+cfstg
+cfstp
+cfstpall
+cft
+cfup
+cfus
+cget
+cgi
+cgit
+cgr
+cgrm
+cgroup
+cgroupns
+cgu
+changelog
+changepassword
+changeset
+charmap
+charset
+chaselinks
+chcid
+chdir
+cheatsheet
+checkin
+checkinit
+checkonly
+checkports
+checkstyle
+cheeseshops
+Chesal
+chiark
+childlogdir
+chlrtx
+chmod
+chown
+chpwd
+chroot
+chruby
+chrubydirs
+chsh
+chucknorris
+chucknorrisfacts
+Chucktatorship
+Chucktober
+chunker
+cidfile
+cidr
+CIDs
+cidv
+ciici
+cim
+cirw
+citool
+civis
+cjk
+clamav
+classfile
+classloaders
+classloading
+classmap
+classname
+classpath
+CLDR
+cleardump
+cless
+CLICOLOR
+clientauthenabled
+clientid
+clipcmd
+clipcopy
+clippaste
+Clipperton
+clj
+Clojure
+closelim
+cloudfoundry
+cloudproviders
+CLOUDSDK
+clrz
+clustertype
+cmdargs
+cmdline
+cmds
+Cmp
+CMR
+cms
+cmt
+cnorm
+cobertura
+cocoapods
+codebase
+codeclimate
+codecompare
+codecoverage
+codegen
+codepen
+coderwall
+CODESET
+codium
+coffeescript
+colemak
+Colindres
+collectstatic
+colorbool
+colorcoded
+colorcoding
+colorify
+colorized
+colorls
+colorpair
+colorset
+colorspec
+colourised
+Colouriser
+colsearch
+COMMANDLINE
+commandlinefu
+committerdate
+Comoros
+compadd
+comparguments
+compassdoc
+compaudit
+compbiome
+compcall
+compctl
+compdef
+compdescribe
+compdump
+compfiles
+compfix
+compgen
+compgroups
+compilemessages
+compinit
+compl
+completemarks
+completionsdir
+complist
+componentname
+compopt
+compquote
+COMPREPLY
+COMPRESSSPARSESTATE
+compset
+compstate
+comptags
+comptry
+compvalues
+CONDA
+CONFG
+config
+configfile
+confighelp
+configmap
+configstoretype
+connectiondefinition
+connectionpoolid
+conssec
+Consts
+contacto
+containerd
+contenttype
+contextinitialization
+contextroot
+contoroll
+contreras
+controlargs
+conventionalcommits
+COOKBOOKNAME
+cookbookversion
+coproc
+copybuffer
+copydir
+copyfile
+copypaste
+copypasteable
+cordova
+coreutil
+cors
+cowsay
+cowthink
+cpan
+cpanm
+cpanminus
+cpantesters
+cpio
+cpp
+cprint
+cprof
+cpuprofile
+cpuset
+cpv
+createcachetable
+createdlastdays
+createsuperuser
+createtables
+creationretryattempts
+creationretryinterval
+cription
+crlf
+crm
+crockford
+cron
+cronjob
+crt
+cseuckr
+cseucpkdfmtjapanese
+csh
+csibm
+csiso
+csisolatin
+cskoi
+csksc
+css
+cssflow
+cssh
+csshiftjis
+csu
+csv
+csvfile
+ctag
+ctl
+ctlseqs
+ctx
+ctype
+culater
+Cunha
+curcontext
+curdir
+curhistsize
+curkeyword
+curpath
+currentartist
+currentdir
+currenttrack
+cursored
+curtheme
+Customisation
+CUTBUFFER
+cvccvc
+cvf
+cvhs
+cvjf
+cvs
+cvsexportcommit
+cvsimport
+cvsserver
+cvvis
+cvzf
+cwd
+cword
+cxx
+cya
+cycledleft
+cycledright
+cygpath
+cygstart
+cygwin
+cygwyn
+czf
+daemonize
+daemonized
+daemonizing
+daemonset
+dalias
+dango
+danielcsgomes
+darcs
+dartdoc
+dartlang
+dashdoc
+DATABAGNAME
+datafieldenc
+datasift
+datasourceclassname
+datastore
+datestamp
+datetime
+daylerees
+dbbolton
+dbconsole
+dbfile
+dbhome
+dbhost
+dbport
+dbshell
+dbsize
+dburl
+dbus
+dbuser
+dbvendor
+dbvendorname
+dccmd
+dcdn
+dce
+dck
+dcl
+dclf
+dco
+dcom
+dcommit
+dcps
+dcpull
+dcr
+dcrestart
+dcrm
+dcstart
+dcstop
+dcup
+dcupb
+dcupd
+ddg
+ddl
+deadwyler
+debian
+debman
+debuginfo
+debuglevel
+decr
+decrby
+DECSCUSR
+defaultleasettl
+defaultpackagedir
+Defaultsfdx
+defaultvs
+defaultwebmodule
+definitionfile
+definitionjson
+deinit
+deinstall
+delwin
+denable
+deno
+dependencyfile
+deploydir
+deployers
+deploymentplan
+deps
+depthfrom
+dequote
+dequoted
+deref
+derek
+descr
+dest
+DESTDIR
+destroot
+desttype
+devcenter
+devdocs
+devfolder
+devicehost
+devicemapper
+deviceport
+devlog
+devops
+devpath
+dfa
+dffx
+dflt
+dfmt
+dfs
+dhcp
+dhcpd
+dhcpip
+dht
+dhtrc
+dhtt
+diagdump
+didexit
+diffcore
+diffmerge
+diffs
+diffsettings
+difftool
+digitalocean
+diiirrrty
+dijcaf
+dircolors
+dircycle
+direnv
+dirhistory
+dirname
+dirpath
+dirpersist
+dirs
+dirstack
+DIRSTACKSIZE
+dirstat
+dirver
+disablemasking
+disksize
+diskutil
+displayconfiguration
+displayname
+distcache
+distcheck
+distclean
+distro
+dists
+django
+djangojs
+djangoproject
+djangopypi
+djview
+djvu
+dli
+dlist
+dls
+dman
+dmatching
+dmesg
+dmg
+dna
+dnf
+dnfc
+dnfgi
+dnfgl
+dnfgr
+dnfi
+dnfl
+dnfli
+dnfmc
+dnfp
+dnfr
+dnfu
+dng
+dnote
+dns
+dnsmasq
+dnsrr
+doap
+docck
+dockerd
+dockerdaemon
+dockerenv
+Dockerfile
+dockerport
+dockersearch
+docopt
+docset
+docstring
+doctl
+doctorjellyface
+dogenpunk
+doitclient
+domaindir
+domainname
+domainproperties
+domterm
+Donenfeld
+dongweiming
+donotwant
+dopts
+dotall
+dotenv
+dotest
+dotfile
+dotnet
+doubledash
+doublequotes
+dowant
+dpkg
+drca
+drcb
+drcg
+drcj
+drcm
+drcml
+drcr
+drct
+drcv
+drdmp
+dren
+dreurmail
+drf
+drfi
+drfr
+drfra
+drfu
+Driessen
+drif
+dris
+driverclassname
+drn
+drnew
+droid
+dropandcreatetables
+dropindexes
+droplr
+dropreplace
+droptables
+drpm
+drpu
+drst
+drup
+drush
+drushrc
+drv
+drvd
+drvg
+drw
+dsa
+dselect
+dsl
+dssh
+dst
+dsupport
+Dtest
+dtrace
+dts
+duckduckgo
+duf
+dumpconfig
+dumpdata
+dumpfiles
+duplessis
+durationdays
+durrheimer
+dutchcoders
+dvd
+dvi
+dwim
+dwr
+dylib
+eal
+eastermonday
+eauth
+ebuild
+ecd
+ecdsa
+echotc
+echoti
+ecma
+ecmerge
+ecosia
+ecto
+editorcmd
+edu
+eecms
+eed
+eeval
+efforted
+efile
+eframe
+egrep
+ein
+Eisentraut
+ejb
+ekzsh
+Eley
+ELGNRCIS
+elidable
+elif
+elim
+elisp
+elllen
+elot
+emacs
+emacsclient
+emacsfun
+emacswiki
+emails
+emberjs
+Emelianenko
+emoji
+emotty
+enablesnoop
+enacs
+endswith
+ent
+entrypoint
+enum
+envsubst
+envvar
+enwom
+eocw
+EOH
+eol
+eoq
+eow
+eoww
+eoy
+EPOCHREALTIME
+epochseconds
+eprof
+eread
+erl
+errlog
+Errored
+esac
+escripts
+essembeh
+etcd
+ethanschoonover
+ets
+etwlogs
+euc
+EUID
+EULAs
+eunit
+evals
+evalstatus
+evan
+eventlet
+eventname
+Evernote
+Evt
+exe
+executables
+execv
+exfxcxdxbxbxbxbxbxbxbx
+exfxcxdxbxegedabagacad
+existentials
+exitcode
+exoscale
+expandvars
+expaning
+expireat
+expl
+explaintypes
+explicitouter
+expn
+expr
+exps
+exs
+extcmd
+extdirs
+extendedglob
+externalid
+extmethods
+fabfile
+facebook
+factoryclass
+faidx
+failconnection
+failfast
+failurefatal
+fakeroot
+faqs
+fargs
+Faroe
+fasd
+FASTA
+fastcgi
+fastfile
+fastprint
+FASTQ
+favlist
+fbterm
+fcap
+Fcart
+fcgi
+Fcrt
+fcss
+fdfind
+fdlimit
+feditor
+fedoraproject
+felipe
+felixr
+ffls
+ffp
+ffrm
+ffsync
+fghijk
+fgrep
+Fiala
+fieldlist
+Filemode
+filepath
+filesize
+filestore
+filesystem
+filetype
+filevaultmaster
+FILLBAR
+filtername
+findpeer
+findprovs
+finetune
+firefox
+firewalld
+firewalls
+firstline
+fishshell
+fitzpatrick
+fixmate
+fixme
+fixperms
+FIXTERM
+fizsh
+fjs
+flagstat
+flatlist
+flattach
+flc
+fldoc
+flget
+flickr
+flowgraph
+flowtype
+flr
+fluentd
+flup
+flushall
+flushdb
+flv
+fnd
+fnm
+fns
+Fnv
+Folgers
+fontello
+foodcritic
+foqtam
+forall
+forceoverwrite
+forceupgrade
+foreach
+forrest
+fortunecity
+forw
+fosmid
+fotqoh
+fpath
+fprof
+fqn
+framep
+frecency
+frecent
+freebsd
+freenode
+freqs
+fri
+Friesel
+fromaddress
+frontend
+frontmost
+fsc
+fscache
+fsck
+fsl
+fsmonitor
+FSsh
+fstgpy
+ftp
+fts
+fucnul
+func
+funcsourcetrace
+functrace
+funtoo
+Futuna
+futuret
+fwl
+fwp
+fwr
+fwrp
+fzf
+fzfdirs
+gaa
+gallifrey
+gamc
+Gamera
+gamscp
+gapt
+gasconfig
+Gatorade
+gatsbyjs
+gav
+gba
+gbd
+gbda
+gbk
+gbl
+gbnm
+gbr
+gbs
+gbsb
+gbsg
+gbsr
+gca
+gcam
+gcan
+gcasm
+gcb
+gcc
+gccd
+gccgo
+gccgoflags
+gcf
+gcflags
+gch
+gcl
+gclean
+gcloud
+gcm
+gcmsg
+gcn
+gco
+gcor
+gcount
+gcp
+gcpa
+gcpc
+gcplogs
+gcr
+gcs
+gcsm
+gcssm
+gdc
+gdca
+gdct
+gdcw
+gdd
+gdm
+gdnolock
+gdt
+gdup
+gdv
+gdw
+geca
+gecb
+gecho
+geclup
+gecr
+geeknote
+gegi
+geh
+gei
+geiall
+gelcyv
+gelf
+geli
+gemb
+gemfile
+gemoji
+gemp
+gemset
+gemspec
+gemy
+generatekey
+generatermistubs
+genomecov
+genpass
+genpaths
+genzshcomp
+geoe
+geoff
+geoffgarside
+getattr
+getbit
+getcomposer
+getdir
+geteip
+getenv
+getfasta
+getgb
+getip
+getline
+getln
+getopt
+getrange
+getset
+gettext
+geun
+gevent
+Geza
+gezalore
+gfa
+gfg
+gfl
+gflf
+gflff
+gflfp
+gflfpll
+gflh
+gflhf
+gflhp
+gfli
+gflr
+gflrf
+gflrp
+gfo
+gga
+ggf
+ggfl
+ggl
+ggp
+ggpnp
+ggpull
+ggpur
+ggpush
+ggsup
+ggu
+ghci
+ghf
+ghff
+ghfh
+ghfr
+ghfu
+ghh
+ghostrevery
+gignore
+gignored
+gimmeh
+giobi
+gistcomment
+gitbranch
+gitbranchsize
+gitcomp
+gitcompadd
+gitcompappend
+gitcompletion
+gitdir
+gitex
+gitfast
+gitflow
+github
+gitignore
+gitinfo
+gitk
+gitmodules
+gitpod
+GITSS
+gitstatus
+gitstring
+gitweb
+givero
+gke
+gkrellmd
+glfsi
+glfsls
+glfsmi
+glfst
+glg
+glgg
+glgga
+glgm
+glgp
+glidenote
+glo
+globalias
+globals
+globbing
+globsubst
+glods
+glog
+gloga
+glol
+glola
+glp
+gls
+gma
+gmail
+gmom
+gmtl
+gmtlvim
+gmum
+Gneat
+Gniazdowski
+gnore
+gnupg
+goc
+godoc
+Godzilla
+gof
+gofa
+gofmt
+goga
+Gohr
+golang
+gom
+GOMAXPROCS
+Gomes
+Gonz
+goodreads
+google
+googlecode
+gop
+gopath
+gopb
+GOROOT
+goroutine
+gota
+gpf
+gpg
+gpgconf
+gplfs
+GPLv
+gpoat
+gpr
+gpristine
+gpsup
+gpu
+gpus
+gpv
+gradle
+gradlew
+graphviz
+grb
+grba
+grbc
+grbd
+grbi
+grbm
+grbo
+grbom
+grc
+greenend
+greer
+grename
+grep
+grepping
+grev
+grh
+grhh
+GRIMALDI
+grk
+Grlm
+grm
+grmc
+grml
+grmv
+groh
+grok
+Grosenbach
+groupby
+groupinstall
+grouplist
+groupremove
+groupsmap
+growlnotify
+grrm
+grset
+grss
+grst
+grt
+gru
+gruntfile
+grup
+grv
+gsb
+gsd
+gsemet
+gsh
+gsi
+gsps
+gsr
+gss
+gst
+gsta
+gstaa
+gstall
+gstc
+gstd
+gstl
+gstp
+gstu
+gsu
+gsub
+gsw
+gswc
+gswd
+gswm
+gtb
+gtfo
+gtl
+gts
+gtv
+gua
+Guake
+Guerci
+gui
+guidovansteen
+guitool
+gulpfile
+gulpjs
+gunignore
+gunwip
+gunzip
+gupa
+gupav
+gupv
+gvim
+gvimdiff
+gwc
+gwch
+gwip
+gwt
+Gxfxcxdxbxegedabagacad
+gxvx
+gyazo
+Gyver
+gzip
+Hackage
+Hacktoberfest
+hackzor
+hacluster
+hadouken
+hai
+haldaemon
+Halis
+Hamelink
+hammertest
+hanami
+hanamirb
+har
+hardcoded
+hardlinks
+hardstatus
+harishnarayanan
+hashh
+Hashicorp
+haskell
+haskellstack
+Hasklig
+hawaga
+hax
+HBAR
+hbm
+Hcode
+hda
+hdc
+hdd
+hdel
+hdp
+hdrs
+hdtp
+hdv
+hea
+healthcheck
+healthcheckerinterval
+healthcheckertimeout
+healthcheckerurl
+heduled
+heg
+Helens
+helpmojo
+heroku
+hexdocs
+hexdump
+hexists
+hga
+hgb
+hgba
+hgbk
+hgc
+hgca
+hgchangeset
+hgco
+hgd
+hged
+hget
+hgetall
+hgi
+hgic
+hgl
+hglg
+hglgp
+hglr
+hgm
+hgo
+hgoc
+hgp
+hgrc
+hgrep
+hgs
+hgsl
+hgun
+hhatto
+hhh
+hidefiles
+highlighter
+hincrby
+HISTCMD
+HISTFILE
+HISTNO
+historywords
+histsize
+histsubstrsrch
+hitokoto
+hkeys
+hkscs
+hlen
+hmget
+hmset
+Hocevar
+hocho
+hoeg
+Homeboy
+homepage
+hostip
+hostname
+hostpath
+hotfix
+hotfixes
+hotlist
+hotpink
+howto
+howtorun
+hpodder
+href
+hrg
+hscolour
+hscroll
+hset
+hsetnx
+hsi
+hsp
+hsqldb
+htm
+html
+htmlsingle
+htop
+htslib
+HTT
+http
+httpd
+httpie
+httplisteners
+httpparams
+httpsrouting
+httpstatus
+hubflow
+hukkan
+humza
+huyy
+hvals
+hyperlink
+hypermedia
+hyperv
+hypervisor
+iam
+ian
+ianchesal
+ibest
+icanhas
+icanhazip
+icba
+icbi
+icc
+icode
+icpaa
+icpai
+icpra
+icpri
+icra
+icri
+icrosoft
+icrsa
+icrsi
+idlekeytimeoutseconds
+idletimeout
+idmv
+idx
+idxstats
+ietf
+ifargs
+ifconfig
+iflist
+iglob
+ignoredescriptoritem
+ignoreerrors
+ignorenonexistent
+ignorewarnings
+igv
+ihasbucket
+iiop
+iiopport
+ilikenwf
+ilkka
+ima
+imageshack
+imap
+imatch
+imatches
+img
+imgur
+iminurbase
+imnp
+imonit
+impl
+implicits
+importpath
+inbox
+incrby
+indexopts
+inet
+infocmp
+ini
+initsql
+inkytonik
+inl
+inliner
+inlining
+inplace
+inprogress
+Inproper
+inputenc
+inr
+insecureskipverify
+insns
+inspectdb
+inspr
+instagram
+Installable
+installationkey
+installationkeybypass
+installdeps
+installdir
+installsuffix
+instancealias
+instanceport
+instanceurl
+instaweb
+instrs
+integ
+Intellij
+interactivecomments
+interdiff
+interfacename
+interoperability
+interp
+Intf
+inur
+invicem
+iojs
+iokit
+ionescu
+ionicframework
+iops
+ioreg
+ipa
+ipaddr
+ipam
+ipamdriver
+ipapp
+ipc
+ipcidr
+ipe
+ipfs
+ipld
+ipns
+IPREFIX
+ipsw
+iptables
+ipv
+ipython
+irb
+irc
+IRTY
+isconnectvalidatereq
+isdefaultprovider
+isdeleted
+isearch
+isfile
+isisolationguaranteed
+isodate
+isodatesec
+isolationlevel
+isredeploy
+istio
+ISUFFIX
+isundeploy
+iterm
+itertools
+itunes
+ivan
+Ivoire
+ixfuk
+izakaya
+ize
+jacc
+jaccard
+jaddr
+jaischeema
+jakefile
+jakejs
+Janke
+japvyz
+jarfile
+JARIN
+jarsigner
+javabootclasspath
+javac
+javadoc
+javaextdirs
+javamail
+javap
+javascript
+javax
+jbm
+jboss
+jcon
+jdbc
+jdc
+jdcds
+jde
+jdeps
+JDK
+jdkinternals
+jdl
+jdlr
+jdm
+jdmds
+jdwp
+jeb
+jecdyq
+ject
+Jedis
+jeffmhubbard
+jenv
+jenvdir
+jepgad
+jerryling
+jestjs
+jex
+jexec
+jfrog
+jgitflow
+jgpagent
+jid
+jimhester
+jimweirich
+jira
+jis
+jisse
+jkc
+jkenabled
+JLine
+jlist
+jmc
+jmsdbpassword
+jmsdest
+jmx
+jndi
+jndilookupname
+jnrowe
+jobid
+jobspec
+jobstates
+jobtexts
+jof
+johnhamelink
+joly
+jonas
+jonmosco
+jorge
+journald
+jpeg
+jpg
+jpo
+jprofile
+jql
+jquery
+jra
+jraw
+jrel
+jreld
+jrm
+jrmds
+jrmrel
+jrmsas
+jrp
+jrs
+jrspec
+jruby
+jsa
+jsh
+jshc
+jshm
+json
+jsonfunc
+jsonpath
+jsontool
+jsp
+jspa
+jssl
+jst
+jstj
+jsu
+jsw
+jukie
+junegunn
+junex
+junit
+junkbust
+JUNKFOOD
+Juraj
+jvenant
+jvm
+jvmargs
+jvmoptions
+jwt
+jwtkeyfile
+jxr
+kajrod
+kalsi
+kapeli
+kapow
+kate
+Kaving
+kbd
+kca
+kcbt
+kccc
+kcdc
+kcgc
+kclean
+kcn
+kcp
+kcsc
+kcub
+kcuc
+kcud
+kcuf
+kcuu
+kdch
+kdcj
+kdcm
+kdd
+kde
+kdel
+kdelcj
+kdelcm
+kdeld
+kdelf
+kdeli
+kdelno
+kdelns
+kdelp
+kdelpvc
+kdelsa
+kdelsec
+kdelss
+kdi
+kdialog
+kdiff
+kdm
+kdno
+kdns
+kdp
+kdpvc
+kds
+kdsa
+kdsec
+Keanu
+kecj
+kecm
+keds
+keepfailedstubs
+keepreposdir
+keepstate
+kei
+kepvc
+kerndeb
+kes
+keti
+kevinkirkup
+kexec
+kextload
+kextunload
+keybindings
+keycap
+keychain
+keyfile
+keygen
+keymap
+keymetrics
+keypair
+keyring
+keyshares
+keysize
+keyspace
+keythreshold
+KEYTIMEOUT
+keytooloptions
+keywordisfresh
+keywordmsg
+keywordquickly
+kga
+kgaa
+kgcj
+kgcm
+kgd
+kgdsw
+kgdw
+kgdwide
+kgi
+kgno
+kgns
+kgp
+kgpl
+kgpn
+kgpvc
+kgpvcw
+kgpw
+kgpwide
+kgrs
+kgs
+kgsec
+kgssw
+kgsswide
+kgsw
+kgswide
+Khas
+khome
+killall
+killit
+Kindergarteners
+Kitts
+kiwiirc
+kiwish
+kjx
+klf
+Klingberg
+knative
+kni
+knifecmd
+knifesubcmd
+knp
+knu
+koenig
+Kombat
+kompare
+konsole
+kotlin
+kotlintest
+kpf
+kphoen
+kpkg
+kpp
+kres
+krh
+Krivitsky
+krsd
+krsss
+kru
+ksc
+ksd
+ksh
+ksharrays
+kshautoload
+kshglob
+kshoptionprint
+ksshaskpass
+ksss
+kthxbai
+kts
+kube
+kubeconfig
+kubectl
+kubectx
+kubens
+kubeoff
+kubeon
+kubernetes
+kungfoo
+Kurapati
+kwargs
+kypkvcw
+Kyrgyzstan
+Lacheze
+lambdalift
+lando
+langinfo
+laravel
+lart
+lastcategory
+lastcmd
+lastfull
+lastrun
+lastsave
+launchctl
+lazyconnectionassociation
+lazyconnectionenlistment
+lazyvals
+lbenableallapplications
+lbenableallinstances
+lbenabled
+lblue
+lbname
+lbpolicy
+lbpolicymodule
+lbtargets
+lbuf
+LBUFFER
+lbweight
+lcmd
+ldap
+ldflags
+ldot
+leakreclaim
+leaktimeout
+leavebrowseropen
+lein
+leiningen
+lemy
+len
+Lengyel
+leonhartx
+LESSCLOSE
+lesskey
+LESSKEYIN
+LESSOPEN
+letcat
+leter
+lexduv
+lexer
+lfs
+lho
+lhs
+libc
+libedit
+libexec
+libnotify
+libp
+libreadline
+libsecret
+lifecycle
+lighthouseapp
+limegreen
+lindex
+linearizer
+linewords
+linkcheck
+linkname
+linsert
+linux
+linuxcommando
+linuxcontainers
+linuxmain
+liquibase
+listeneraddress
+listenerport
+livecheck
+liveserver
+llc
+LLCORNER
+llen
+llr
+llvm
+lmnop
+lname
+loadconfig
+loaddata
+loadorder
+localhost
+localonly
+localoptions
+localtime
+localtraps
+lockdown
+lockfile
+lodash
+logcat
+logdriver
+logentries
+logfile
+logid
+loginurl
+loglevel
+logname
+logreportederrors
+logrotate
+logtype
+lol
+lowerip
+lpop
+lpr
+lpush
+lpushx
+lrange
+lrbu
+LRCORNER
+lrem
+lrh
+lrp
+lrt
+lrunzip
+lrz
+lrzip
+lrzuntar
+lsa
+lsb
+lscolors
+lset
+lsof
+lstheme
+lstrip
+lto
+ltrim
+lubs
+lucentbeing
+lvi
+lways
+lwc
+lwd
+lxc
+lxd
+lzcat
+lzip
+lzma
+lzo
+lzop
+LZW
+Maarten
+macos
+macports
+macromates
+Maeda
+Magento
+magerun
+magicequalsubst
+magick
+mailhost
+mailinfo
+mailmap
+mailnull
+mailrc
+mailsplit
+mailuser
+mainporcelain
+maintail
+maintainership
+makecache
+MAKEFLAGS
+makemessages
+makemigrations
+makewindows
+managedreleased
+managepy
+manni
+manpage
+manpath
+mapcar
+mapfile
+mappedpassword
+mappedusername
+markname
+markpath
+maskfasta
+maskray
+masq
+massimiliano
+matchconnections
+mathfunc
+Mattern
+Matth
+matthewratzloff
+matthr
+maxbytes
+maxchildren
+maxconnectionscount
+maxconnectionusagecount
+maxdepth
+maxleasettl
+maxpoolsize
+maxqueuesize
+maxrank
+maxrate
+maxrequests
+maxspare
+maxtasksperchild
+maxthreadpoolsize
+maxwait
+Mayen
+Mayra
+mbean
+mbegin
+mbologna
+mbox
+mboxrd
+mbp
+mca
+mcl
+mcm
+mco
+mcornella
+mct
+mdapi
+mdb
+mde
+mdi
+mdn
+mds
+meanlife
+mediawiki
+megazord
+meh
+Mek
+mekanics
+memprofile
+memprofilerate
+memq
+menuselect
+MENUSIZE
+mergetool
+mergewebxml
+merkledag
+Mery
+messagebus
+messagestoretype
+metacpan
+metadata
+metricscollector
+mfa
+mfaerevaag
+mfs
+mget
+miam
+michelebologna
+microk
+microsoft
+middleware
+midsommar
+midsommarafton
+mikeh
+millis
+mindepth
+minfds
+minidisc
+minikube
+minlogprob
+minprocs
+minspare
+minthreadpoolsize
+mirko
+mirrorlist
+mixin
+mkcd
+mkdir
+mkdirs
+mktag
+mktemp
+mktree
+mkv
+mkvirtualenv
+mla
+mldonkey
+Mleb
+MLH
+mli
+mlo
+mlog
+mlp
+mls
+mlterm
+MMA
+mmap
+mmin
+mng
+mnt
+moar
+modded
+modifiedlastdays
+modulename
+Moldova
+mongocli
+mongodb
+monit
+monitorable
+monokai
+Morote
+Mosco
+mosh
+mostfrequent
+MOTD
+mountpoint
+mov
+moyai
+mozilla
+mpa
+mpeg
+mpileup
+mpkg
+mplayer
+mplex
+mpr
+mputniorz
+mqhost
+mqpassword
+mqport
+mquser
+mre
+mrp
+mset
+msetnx
+msgnum
+msgs
+msh
+msil
+msp
+mst
+msvs
+msw
+msys
+msysgit
+mtime
+mtu
+Mudkipz
+multiaddresses
+multibase
+multicastaddress
+multicastport
+multicov
+multihashes
+multiinter
+multiline
+multios
+multiset
+mumpub
+munication
+MURI
+muscato
+mutex
+muxer
+mvim
+mvn
+mvnag
+mvnboot
+mvnc
+mvncd
+mvnce
+mvnci
+mvncie
+mvncini
+mvncist
+mvncisto
+mvncom
+mvncp
+mvnct
+mvncv
+mvncvst
+mvnd
+mvndocs
+mvndt
+mvne
+mvnfmt
+mvnjetty
+mvnp
+mvnqdev
+mvnsrc
+mvnt
+mvntc
+mvnw
+Mvt
+Myanmar
+myapp
+myargs
+myd
+mydeb
+myers
+myfile
+myfirstnamemylastname
+mygit
+myissues
+mymark
+myns
+myprop
+mypy
+myrole
+myserver
+mysql
+mysqladmin
+mysqlrestart
+mysqlstart
+mysqlstatus
+mysqlstop
+mytime
+myuser
+myvalue
+myvirtualenv
+myzsh
+nables
+nagios
+naliases
+nameddirs
+namespace
+namesys
+nanoant
+nanoc
+Narayanan
+Naruto
+nativelibrarypath
+ncd
+ncipe
+NCOLOR
+ncpu
+ncs
+ncv
+ndjson
+NDUw
+NEm
+nenv
+neovim
+netbsd
+netdump
+netloc
+netmask
+netstat
+networkdriver
+networklisteners
+neuralsandwich
+newcons
+newpl
+newvol
+nextgenthemes
+nfsnobody
+nfunctions
+nginx
+ngnix
+ngth
+nhelp
+nhistory
+nhughes
+nicoulaj
+Nicoulaud
+nixos
+nkeywords
+nkill
+nle
+nlinux
+nlist
+nmap
+nmatches
+Nmh
+Nms
+Nmw
+noacl
+noancestors
+noargs
+noautonamedirs
+noautopushd
+noblock
+nobootcp
+nobreak
+nocache
+nochunk
+nocleanup
+nocolor
+nocopy
+nocorrect
+nodaemon
+nodedir
+nodefaultpolicy
+nodegroup
+nodehost
+nodeid
+nodejs
+nodense
+nodestatus
+noexec
+noexpand
+noglob
+noheading
+nohelpers
+nohup
+noinput
+nojline
+noksh
+nomadproject
+nomnom
+nomz
+nonamespace
+nondistributable
+nongnu
+NONINFRINGEMENT
+nonomatch
+NONSELECTABLE
+nontransactionalconnections
+nopassword
+noposixbuiltins
+noprofile
+noprompt
+nopromptsubst
+noptions
+nopushdminus
+norc
+noreload
+NORMARG
+NORRIS
+noshortloops
+noshwordsplit
+nospace
+nosplash
+nostatic
+nostatus
+nostream
+notactive
+notailcalls
+notest
+nothreading
+notifu
+notnull
+nounit
+noverbose
+nowai
+nowarn
+noword
+noyes
+NPAGE
+npanelize
+npm
+npmd
+npmg
+npmi
+npmjs
+npmrc
+npmst
+npmt
+npr
+nproc
+npu
+npx
+nroff
+nscd
+nsu
+nthemes
+ntlp
+ntp
+ntu
+nubxa
+nuc
+nuget
+numstat
+nvcsformats
+nvie
+nvimdiff
+nvm
+nvmrc
+Oakv
+oanward
+oathtool
+OAuth
+objectname
+objectsize
+objecttype
+obsrun
+obtw
+octocat
+octozen
+oden
+ofd
+ogg
+ogm
+ohmyz
+ohmyzsh
+oid
+oldp
+oldpatmat
+OLDPWD
+OMITSPARSESTATE
+OMMIT
+omz
+omztemp
+onbehalfof
+oneline
+onlyrepos
+onoz
+ooanward
+oom
+openbsd
+opendiff
+openr
+openshift
+opensource
+openssh
+openstack
+opensuse
+openvpn
+openw
+OPTARG
+optimisations
+OPTIND
+orderby
+orgdir
+orgs
+oris
+ority
+orm
+ornicar
+orss
+osascript
+osname
+osscan
+ostype
+osver
+osx
+oth
+otp
+otpcode
+Ouellet
+oug
+outfh
+outfile
+outfilebase
+outfilename
+outlog
+outputdir
+outputtedto
+Outputters
+pacac
+pacaur
+pacdisowned
+pacfiles
+pacfileupg
+pacin
+pacinsd
+packagecreaterequestid
+packageid
+packagekitd
+packagename
+packageobjects
+packagephobia
+packagetype
+packageversionid
+paclist
+pacloc
+pacls
+paclsorphans
+pacman
+pacmanallkeys
+pacmansignkeys
+pacmir
+pacoc
+pacown
+pacre
+pacrem
+pacrep
+pacrmorphans
+pacupd
+pacupg
+pacweb
+pagage
+pagename
+painsd
+pairtobed
+pairtopair
+paloc
+palst
+pamc
+pame
+pamf
+pamfa
+pamir
+pamj
+paml
+pamm
+pamn
+pamp
+pampp
+pamr
+pamt
+panelize
+paorph
+paperclips
+paqf
+paqft
+paql
+paqr
+paqt
+paqw
+paralint
+params
+parem
+parep
+PARGON
+parhaat
+paroc
+parseable
+parseopt
+parwok
+passivepopup
+passphrase
+passthrough
+passthru
+passwd
+passwordstore
+pastebin
+pasu
+patchformat
+pathspec
+patmat
+patshead
+paupd
+paupg
+pausedservices
+pavic
+paypal
+paypalobjects
+pbcopy
+pbi
+pbl
+pbo
+pbpaste
+pbs
+pbu
+pcap
+pch
+pchk
+pcl
+pcmode
+pcpu
+PCR
+pcre
+pdf
+PDoc
+peb
+peepcode
+peerid
+pem
+percol
+perflog
+perl
+perlbrew
+perldoc
+permset
+permsetname
+petere
+peterhoeg
+Pfenniger
+pfs
+pgp
+pgpkeys
+pgr
+pgrep
+pgs
+phab
+phing
+phome
+php
+phx
+pid
+pidev
+pidfile
+pidof
+pigz
+pipenv
+pipestatus
+pipfile
+pipir
+piplist
+pipreq
+pipunall
+pipupall
+Pitcairn
+pjdb
+pjo
+PKGBUILD
+pkgfile
+plaetinck
+planetargon
+playlists
+playpause
+ple
+pleted
+plist
+Plug'n
+plugin
+pluginsdir
+plz
+pmat
+pmd
+pmin
+pmset
+png
+pnp
+podfile
+podspec
+policyconfigfactoryclass
+policyproviderclass
+polipo
+polkitd
+poo
+poolname
+poolresize
+Poorter
+popd
+Popen
+porcheron
+portbase
+portdir
+Portfile
+portlist
+portname
+posix
+possen
+posteo
+posterasure
+postgres
+postinstallurl
+posva
+powd
+powed
+Powerline
+poweroff
+powershell
+powify
+powit
+PPAGE
+ppap
+ppid
+ppy
+precache
+precaire
+precmd
+precompilejsp
+precompilewait
+predef
+preexec
+prefetching
+prefiltered
+prefork
+preload
+premajor
+preminor
+prepatch
+prepends
+prepopulate
+prettylist
+previewer
+prevword
+pri
+princ
+principalsmap
+printenv
+printf
+printflags
+printprompt
+privhist
+privoxy
+procfs
+procs
+prodlog
+progfile
+projectname
+PROMPTCOLOR
+PROMPTPREFIX
+promptsize
+promptsubst
+promptvars
+propget
+proplist
+protobuf
+providertype
+prun
+pscpu
+pseudoword
+psgrep
+psh
+psmem
+psprint
+pstadler
+pstree
+psu
+psubscribe
+psy
+psykorebase
+pthree
+ptot
+ptree
+pubgrub
+publishwait
+pubsub
+puni
+punsubscribe
+puo
+pushd
+pushdefault
+pushdf
+pushdignoredups
+pushdminus
+pushdsilent
+pushln
+pushremote
+pushurl
+Putniorz
+pvc
+pvenv
+pvm
+pwd
+PWDCASECORRECT
+PWDLEN
+pwdsize
+pwdx
+pwgen
+pwh
+pwned
+pxd
+pxy
+pybundles
+pyc
+pycache
+pyclean
+pyenv
+pyenvdirs
+pyfind
+pygmentize
+pygments
+pygrep
+pylint
+pypa
+pypi
+pytb
+pytest
+pythonhosted
+pythonpath
+pythonrc
+PYTHONSTARTUP
+PYTHONUSERBASE
+pyuserpaths
+Qdt
+qiqmiq
+qkey
+qlmanage
+qpwd
+Qql
+Qqo
+qqq
+qqwtzgejwgqve
+Qtdq
+quarkus
+quicklisp
+quickstart
+quiltimport
+qunit
+qunitjs
+quotationspage
+quotedir
+quu
+quux
+qwant
+qwerty
+qxtm
+qyjti
+rabin
+rackspace
+rackup
+radvd
+raek
+Rakefile
+raname
+randomkey
+rangepos
+rar
+ratijas
+rawurldecode
+rawurlencode
+rbenv
+rbenvdirs
+rbfu
+RBUFFER
+rbw
+rcfile
+Rchive
+rcs
+rdargument
+rdb
+rdc
+rdd
+rdependents
+rdeps
+rdm
+rdmd
+rdmr
+rdmtc
+rdmu
+rdoc
+rdp
+rdr
+rds
+rdsl
+rdtc
+rdtp
+reactjs
+readline
+readlink
+readme
+readonly
+readthedocs
+readtimeoutmillis
+Reagle
+realcmd
+reauthor
+rebased
+rebases
+rebasing
+receivepack
+reddit
+redirectport
+redis
+rediscli
+redistrubute
+redzone
+reencode
+reexec
+refactor
+refchecks
+reflogs
+refmap
+refname
+refspec
+regex
+regexes
+regexn
+regexp
+reheader
+reintializes
+Reitsma
+rej
+reldates
+reldist
+releasenotesurl
+releaseversion
+relid
+reloadinterval
+reloadpost
+reltool
+remco
+remoteonly
+remotetestdir
+removegroups
+removeprincipals
+removeusergroups
+renamenx
+rephorm
+replacetokens
+repow
+reprovider
+requestauthrecipient
+requestauthsource
+requestid
+rerere
+resetstat
+resolv
+resolvemsg
+responseauthrecipient
+responseauthsource
+responsetimeout
+restartpost
+restype
+resultformat
+retcode
+retlog
+retrievefile
+retrievetargetdir
+returncode
+RETVAL
+revdeps
+revlist
+rfa
+rfakeroot
+rfap
+rfbu
+rfc
+RFh
+rfind
+rgm
+rhash
+rinass
+rinf
+ripgrep
+riseup
+RIXIUS
+rlc
+Rli
+rlib
+Rlvi
+rmacs
+rmcup
+rmd
+rmdir
+rmdsstore
+rmdup
+rmi
+rmkx
+rnand
+rnatv
+rnaw
+rnios
+rniosse
+rniosx
+rniosxr
+rniosxsm
+rnipad
+rnipada
+rnipadm
+rnipadp
+rnipadr
+rnland
+rnlink
+rnlios
+rns
+robby
+robbyrussell
+ROLENAME
+rollbackonerror
+rootdir
+rosrc
+roswell
+ROSWELLPATH
+roundhoused
+routecookie
+rpath
+rpc
+rpcuser
+rpmpackage
+rpms
+rpo
+rpop
+rpoplpush
+rprompt
+rpush
+rpushx
+rra
+rrg
+rsa
+rsb
+rsd
+rset
+rsh
+rsp
+rspec
+rsrra
+rst
+rsto
+rstrip
+rsync
+rtfm
+rtkit
+rtorrent
+rts
+rubocop
+rubygems
+rubyonrails
+rubyprompt
+rubypromptsize
+rubyversion
+Rudkin
+rulz
+runfcgi
+runningservers
+runningservices
+runpy
+runserver
+runtests
+runtfile
+runtimes
+RUNZSH
+Ruslan
+ruslanspivak
+rustc
+rustup
+Rvi
+rvm
+rvmprompt
+rvmpromptsize
+rxvt
+saas
+sadd
+salesforce
+samtools
+sandboxed
+SAVEHIST
+savelogin
+savemasterpassword
+sba
+sbc
+sbcc
+sbcln
+sbco
+sbcp
+sbcq
+sbd
+sbdc
+sbdi
+sbgi
+sbin
+sbp
+sbpl
+sbr
+sbrake
+sbrm
+sbt
+sbu
+sbx
+scalac
+scaladoc
+scalatest
+scaleway
+scandeps
+scard
+scd
+scdalias
+scdaliases
+scdhistory
+scdignore
+scgi
+sched
+scheduledrundatetime
+Schlatow
+scm
+scmpublish
+scorpius
+scottkidder
+scp
+screencast
+screenshot
+SCTP
+scu
+scutil
+scw
+scwsearch
+sdiff
+sdiffstore
+sdist
+sdk
+sdkman
+Sdl
+sdurrheimer
+Seagal
+searchterm
+seccomp
+securityenabled
+securitymap
+securitytype
+segfault
+selectables
+selectionkeyhandler
+selectiveanf
+selectivecps
+selectorpolltimeoutmillis
+selfupdate
+selinux
+semver
+sendemail
+sendperiod
+serialfile
+serialno
+serverlist
+servername
+serverurl
+serviceproperties
+serviceuser
+servlet
+setab
+setaf
+setalias
+setapp
+setbit
+setdefaultdevhubusername
+setdefaulttimeout
+setdefaultusername
+setenv
+setex
+setnx
+setopt
+setprompt
+setrange
+sfcl
+sfcontainer
+sfcw
+sfdc
+sfdev
+sfdx
+sfdxcli
+sfdxurl
+sfdxurlfile
+sfffe
+sfgb
+sfgc
+sfgcom
+sfge
+sfn
+sfprod
+sfroute
+SFSB
+sfsr
+sfsu
+sftp
+sfx
+sgem
+sgr
+sgrep
+sgtatham
+shasum
+sheerun
+shellcheck
+shellinit
+shellperson
+SHELLPROXY
+shitload
+SHLVL
+shm
+Shohei
+shopt
+shortlist
+shortlog
+shortname
+shortstat
+SHOWCOLORHINTS
+showcurrentpatch
+showdeprecated
+SHOWDIRTYSTATE
+showfiles
+showformat
+showmigrations
+showpkg
+SHOWSTASHSTATE
+showsubclasses
+SHOWUNTRACKEDFILES
+showupstream
+shpotify
+shuf
+shunit
+Shyamshankar
+sid
+sidekiq
+sideload
+SIGINT
+SIGKILL
+sigs
+SIMBL
+Sindre
+sindresorhus
+singlechar
+singlepackage
+Sint
+sinterstore
+sirech
+sismember
+sitecookbooks
+sitesearch
+sjis
+skintone
+skiptraceflag
+skitch
+slaveof
+slicehost
+sln
+slogin
+slp
+smacs
+smartlist
+smartsync
+smcup
+smembers
+smerge
+smkx
+Smood
+smove
+smt
+smtp
+Smurf
+snapshotname
+snowboarder
+sobject
+sobjectid
+sobjecttreefiles
+sobjecttype
+sobjecttypecategory
+socio
+socw
+softlayer
+solaris
+som
+soq
+soql
+Sorhus
+sorin
+sortconip
+sortcons
+sortnr
+sortr
+sourceapiversion
+sourced
+sourcedir
+sourcefile
+sourceforge
+sourceorg
+sourcepath
+sourcetype
+sourcing
+soww
+soyc
+spacewander
+spam
+spd
+spearce
+speartail
+spf
+spi
+Spivak
+splitbrain
+splitlines
+splunk
+spock
+spop
+spork
+spotify
+springframework
+sprintf
+sprunge
+spu
+spx
+sql
+sqlall
+sqlc
+sqlclear
+sqlcustom
+sqldropindexes
+sqlflush
+sqlindexes
+sqlinitialdata
+sqlq
+sqlsan
+sqlsequencereset
+sqltracelisteners
+squashmigrations
+srake
+srandmember
+src
+srem
+ssh
+sshd
+sshkey
+sshkeyfile
+sshkeypassphrase
+sshpassword
+sshport
+sshpublickeyfile
+sshuser
+ssl
+sslproxyhost
+sslproxyport
+ssm
+sso
+sst
+sstat
+stackoverflow
+stacktrace
+stagedstr
+standalone
+standaloneonly
+startapp
+startpage
+startpost
+startproject
+startswith
+startus
+statd
+statedb
+statefile
+statefulset
+statelist
+statementcachesize
+statementleakreclaim
+statementleaktimeout
+statementtimeout
+STATESEPARATOR
+staticlib
+statuspost
+stderr
+stdin
+stdio
+stdlayout
+stdlib
+stdout
+steadypoolsize
+stedolan
+steeef
+sterr
+stevelosh
+stgit
+stil
+STITLE
+stn
+stoppedservers
+stoppedservices
+stoppost
+stopwait
+storeprotocol
+storeprotocolclass
+stp
+strfile
+strftime
+stringification
+stringified
+stringify
+stripspace
+strlen
+strverscmp
+Strzelecki
+sts
+stt
+stty
+stu
+stylesheets
+subcmds
+subdigital
+subdir
+subdomain
+subfolder
+Subhaditya
+subl
+sublimemerge
+sublimetext
+subm
+subnut
+subpage
+subpath
+subscriberfile
+subscriberorg
+subservices
+subshells
+subspec
+substr
+subsubcmds
+Subsubcommands
+Subsubsubcommands
+sudo
+sudoedit
+suitenames
+sunaku
+sunion
+sunionstore
+supad
+superaccessors
+supervisorctl
+supervisord
+suppresscc
+suprl
+suprm
+suprr
+suprs
+supso
+supsr
+supu
+Suraj
+surryhill
+suse
+svcat
+svg
+svm
+svn
+svnsync
+svntrunk
+swiftc
+swiftpm
+sxa
+sxc
+sxd
+sxf
+sxfn
+sxm
+sxn
+sxp
+sxu
+sxw
+sxy
+sykora
+symfony
+symkinds
+symlink
+Symlinking
+symref
+syms
+syncdb
+SYNOPSYS
+syns
+syohex
+sys
+sysadmins
+sysctl
+syslog
+sysread
+sysroot
+systemadmin
+systemctl
+systemd
+systeminfo
+systemproperties
+Syu
+Syua
+Syy
+Tabone
+tagname
+tailcalls
+Tajikistan
+takedir
+takegit
+takeurl
+tanabata
+tarball
+tarfile
+targetcut
+targetdevhubusername
+targetprotocol
+targetted
+targetusername
+Tasche
+Tascii
+taskwarrior
+Tassilo
+tatooine
+tavric
+tbz
+tcl
+tcp
+tcpdump
+tcpip
+tcpnodelay
+tcsh
+tdiff
+tdiffstr
+tempdir
+tempfile
+tempfilename
+TEMPLATENAME
+terday
+termcap
+termcolor
+Termfile
+terminalapp
+terminfo
+terminitor
+termsupport
+termux
+TERMWIDTH
+terraform
+terremark
+testflag
+testfunc
+testlevel
+testlog
+testname
+testng
+testrb
+testrunid
+testrunner
+testserver
+textastic
+textasticapp
+textconv
+textfile
+textmate
+tformat
+tfstate
+tftp
+tfvars
+tgz
+thedir
+thefuck
+themeisfresh
+thememsg
+there're
+thibault
+thisfcn
+Thoumie
+threadpool
+threadpoolid
+thu
+tif
+timeoutmsec
+timeremaining
+timetolive
+timewait
+timothybasanov
+tion
+titlebar
+tjkirch
+tkachenko
+tkdiff
+tkss
+tksv
+tldr
+Tlp
+tls
+tlscacert
+tlscert
+tlsciphers
+tlsenabled
+tlskey
+tlsrollbackenabled
+tlsverify
+tlz
+tmp
+tmpdir
+tmpfile
+tmpfs
+tmux
+tmuxinator
+tne
+tnn
+tobed
+todo
+Tokenise
+tokenized
+tolower
+tomee
+tonotdo
+toolchain
+toolcp
+toplevel
+Toponce
+torrez
+torromeo
+tortoisemerge
+totp
+totpkey
+Touron
+tput
+traceroute
+trackball
+transactionlogdir
+transactionsupport
+transferencoding
+transprotocol
+transprotocolclass
+trapd
+trconf
+triggerevents
+triggername
+trins
+trinsd
+trizen
+trloc
+trlst
+trmir
+Troiae
+Trojanowski
+trorph
+trre
+trrem
+trrep
+trsu
+trunc
+trupd
+trupg
+tsdh
+tsl
+ttl
+ttr
+ttyctl
+ttys
+tview
+twohead
+txl
+txn
+txo
+txs
+txz
+tycho
+typechecking
+typescriptlang
+typesetsilent
+typespec
+typoes
+tzst
+uapprox
+uberjar
+Ubfksu
+ubuntu
+udp
+uescape
+UFE
+ufw
+uid
+ukpog
+ULCORNER
+ulimit
+Ullrich
+ultiple
+umask
+umd
+umich
+unace
+unalias
+uname
+unarchive
+Uncomment
+uncommit
+uncompress
+uncurry
+undelete
+undeploy
+unedit
+unescape
+unexport
+unexpose
+unfunction
+unhash
+unheap
+unhost
+unicode
+unidiff
+unindex
+uninst
+uninstall
+uninstalling
+unionbedg
+uniq
+uniqid
+uniquetablenames
+unittest
+universalarchive
+unixfs
+unixstamp
+unlimit
+unlzma
+unmark
+unmatch
+unmonitor
+unmute
+unpause
+unrar
+unreachability
+unsetopt
+unshallow
+unshare
+unstagedstr
+unstartup
+unsubscribe
+untag
+unversioned
+unwatch
+unwip
+unxz
+unzstd
+updatedb
+updateonsave
+updatestartuptty
+upgr
+upgradable
+upgradetype
+uploadpack
+upperip
+upsert
+urandom
+URCORNER
+uri
+url
+urldecode
+urlencode
+urllib
+urlmatch
+urlonly
+urlparse
+urlstring
+urltools
+urxvt
+usb
+usbmux
+usejavacp
+uselimit
+usemasterpassword
+usergroups
+userguide
+userland
+username
+userns
+userpass
+userpassword
+usetoolingapi
+usetty
+usr
+utc
+utf
+utils
+utm
+uucp
+UUID
+Vagrantfile
+vagrantup
+valentinbud
+validateatmostonceperiod
+validateddeployrequestid
+validateschema
+validationclassname
+validationmethod
+validationtable
+Valodim
+vals
+varargs
+vared
+varkey
+varname
+vaultproject
+vba
+vbl
+vbm
+vbo
+vbox
+vbqs
+vbr
+vbu
+vcf
+vcmp
+vcs
+vcsa
+vdf
+vectorize
+Venant
+vendored
+venv
+Verhoef
+Verma
+VERSINFO
+versioncomp
+versiondescription
+versioned
+versioning
+versionname
+versionnumber
+versiontagprefix
+verstr
+vfs
+vgi
+vgrepping
+vgs
+vguerci
+vhost
+vhsp
+vicmd
+viewtopic
+viins
+vimdiff
+vimgrep
+vimrc
+violenz
+viopp
+virtenv
+virtualbox
+virtualenv
+virtualenvwrapper
+virtualizing
+virtualservers
+virumque
+visitpage
+visualforce
+visualstudio
+VMDK
+VMs
+vmwarefusion
+vmwarevcloudair
+vmwarevsphere
+vnc
+vncviewer
+vnd
+voggom
+Voldemort
+volumedriver
+vonnegut
+Vop
+vopts
+vpaivatorres
+vpc
+vpli
+vpll
+vplu
+vplun
+vpr
+vrdp
+vre
+vrp
+vsc
+vsca
+vscd
+vscde
+vscg
+vscie
+vscl
+vscn
+vscode
+vscodium
+vscr
+vscu
+vscue
+vscv
+vscw
+vsh
+vsix
+vsp
+vsplit
+vssh
+vsshc
+vssp
+vst
+VTE
+vterm
+Vue
+vuejs
+vulns
+vulscan
+vundle
+vup
+vvsp
+vvv
+vwxyz
+vydpig
+waittime
+wakeonlan
+walle
+wantlist
+warpdir
+warprc
+wav
+wclip
+wcomp
+Webchat
+weblog
+webm
+webrick
+webscr
+webserver
+website
+webtraffic
+Wegner
+Weiming
+Weirich
+Wez
+wfilter
+wget
+whatchanged
+whatisthor
+whatthecommit
+whatwg
+whitespacelist
+whl
+whoami
+wiki
+wikipedia
+wil
+willmendesneto
+wincmd
+windowid
+windowsdomain
+windowspassword
+windowsuser
+wip
+wjst
+wks
+wlne
+wolframalpha
+womens
+wordbits
+WORDBREAKS
+WORDCHARS
+wordlist
+wordpress
+workaround
+workdir
+workflow
+workon
+workpass
+workqueues
+workspaces
+worktree
+would've
+wrapjdbcobjects
+writetimeoutmillis
+WSL
+wslpath
+wtf
+wtfpl
+www
+wwwrun
+Wzf
+xargs
+xcb
+xcconfig
+xcdd
+xchm
+xclick
+xclip
+xcode
+xcodebuild
+xcodeproj
+xcp
+xcsel
+xcselv
+xcworkspace
+XDCHDSBDSDG
+xdg
+xdvi
+xfn
+xfree
+xfs
+xit
+XIVIEWER
+xjnmahqewy
+xkcd
+Xkten
+XLBUFFER
+xlbuflines
+xml
+xnode
+xontab
+xor
+Xout
+xperl
+xphp
+xpi
+xpm
+xpowered
+xprop
+xpython
+XRBUFFER
+xrbuflines
+xruby
+xsel
+xshell
+xstrat
+xterm
+XTRACE
+xudmec
+xunit
+xvf
+xvjf
+xxd
+xxdiff
+Xxjn
+xzcat
+yaconf
+yain
+yainsd
+yaloc
+yalst
+yamir
+yaml
+yandex
+yandsearch
+Yanovich
+yaorph
+yarem
+yarep
+yarnpkg
+yarnrc
+yasu
+yaupd
+yaupg
+ybalrid
+ycc
+yesorno
+yga
+ygi
+ygl
+ygr
+ygrm
+ygu
+yii
+yiic
+yiiframework
+yireo
+yleo
+ylep
+yli
+yln
+ylnf
+yls
+ymc
+yml
+yolo
+Yonchu
+YOSHIDA
+yout
+youtube
+yrl
+yrm
+yrun
+yst
+ytc
+yuc
+yui
+yuil
+yuyuchu
+yws
+yyy
+yzf
+zadd
+zake
+zal
+zall
+zas
+zbell
+ZCA
+zcard
+zcl
+zcompcache
+zcompdump
+zcompile
+Zconvey
+zcount
+zcu
+zcurses
+zdbc
+zdbcm
+zdbm
+zdbmigrate
+zdbr
+zdbreset
+ZDgw
+zdharma
+zdirs
+zdotdir
+zdup
+zenerate
+zenmap
+zerver
+zfs
+zgen
+zgrep
+zhimingwang
+zhse
+zic
+zif
+zin
+zincrby
+zinit
+zinr
+zinterstore
+zipalign
+zipfile
+zkat
+zle
+zleparameter
+zlicenses
+zll
+zlogin
+zlogout
+zlp
+zlr
+zls
+zlu
+zma
+zmodload
+zmr
+zms
+znr
+znt
+zocmez
+zonsole
+zoxide
+zpa
+zparseopts
+zpatch
+zpattern
+zpch
+zpchk
+zpd
+zplg
+zplug
+zplugin
+zproduct
+zprofile
+zps
+zpt
+zrake
+zrange
+zrangebyscore
+zrank
+zref
+zregexparse
+zrem
+zremrangebyrank
+zremrangebyscore
+zrevrange
+zrevrangebyscore
+zrevrank
+zrl
+zrm
+zrn
+zrr
+zrs
+zscore
+zse
+zsh
+zsh'ed
+zshaddhistory
+zshcmd
+zshcommands
+zshcompfunc
+zshconfig
+zshell
+zshenv
+zshexpn
+zshids
+zshrc
+zshtheme
+zshwiki
+zshzle
+zsi
+zsocket
+Zsolt
+zsource
+zspec
+zsr
+zsrc
+zst
+Zstandard
+zstat
+zstd
+zstdcat
+zstyle
+zsw
+ztart
+ztos
+zucumber
+zunctional
+zunionstore
+zunits
+zunner
+zup
+zutil
+zvcmp
+zve
+zweep
+zwip
+ZWJ
+zwp
+zxvf
+zyg
+zypper
+zzz
diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt
new file mode 100644
index 000000000..93dfa201c
--- /dev/null
+++ b/.github/actions/spelling/patterns.txt
@@ -0,0 +1,73 @@
+# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns
+
+# YouTube
+https?://(?:(?:www\.|)youtube\.com|youtu.be)/(?:channel/|embed/|playlist\?list=|watch\?v=|v/|)[-a-zA-Z0-9?&=_]*
+<\s*youtube\s+id=['"][-a-zA-Z0-9?_]*['"]
+\bimg\.youtube\.com/vi/[-a-zA-Z0-9?&=_]*
+# Google Analytics
+\bgoogle-analytics\.com/collect.[-0-9a-zA-Z?%=&_.~]*
+# Google APIs
+\bgoogleapis\.com/[a-z]+/v\d+/[a-z]+/[@./?=\w]+
+\b[-a-zA-Z0-9.]*\bstorage\d*\.googleapis\.com(?:/\S*|)
+# Google Calendar
+\bcalendar\.google\.com/calendar(?:/u/\d+|)/embed\?src=[@./?=\w&%]+
+\w+\@group\.calendar\.google\.com\b
+# Google DataStudio
+\bdatastudio\.google\.com/(?:(?:c/|)u/\d+/|)(?:embed/|)(?:open|reporting|datasources|s)/[-0-9a-zA-Z]+(?:/page/[-0-9a-zA-Z]+|)
+# The leading `/` here is as opposed to the `\b` above
+# ... a short way to match `https://` or `http://` since most urls have one of those prefixes
+# Google Docs
+/docs\.google\.com/[a-z]+/d/(?:e/|)[0-9a-zA-Z_-]+/?
+# Google Drive
+\bdrive\.google\.com/file/d/[0-9a-zA-Z_?=]*
+# Google Groups
+\bgroups\.google\.com/(?:forum/#!|d/)(?:msg|topic)/[^/]+/[a-zA-Z0-9]+(?:/[a-zA-Z0-9]+|)
+# Google themes
+themes\.googleusercontent\.com/static/fonts/[^/]+/v\d+/[^.]+.
+# Google CDN
+\bclients2\.google(?:usercontent|)\.com[-0-9a-zA-Z/.]*
+# Goo.gl
+/goo\.gl/[a-zA-Z0-9]+
+# Google Chrome Store
+\bchrome\.google\.com/webstore/detail/\w*(?:/\w*|)
+# Google Books
+\bbooks\.google\.(?:\w{2,4})/books\?[-\w\d=.]*
+# Google Fonts
+\bfonts\.(?:googleapis|gstatic)\.com/[-/?=:;+&0-9a-zA-Z]*
+
+# GitHub SHAs
+\bapi.github\.com/repos/[^/]+/[^/]+/[^/]+/[0-9a-f]+\b
+(?:\[[0-9a-f]+\]\(https:/|)/(?:www\.|)github\.com/[^/]+/[^/]+(?:/[^/]+/[0-9a-f]+(?:[-0-9a-zA-Z/#.]*|)\b|)
+\bgithub\.com/[^/]+/[^/]+[@#][0-9a-f]+\b
+# githubusercontent
+/[-a-z0-9]+\.githubusercontent\.com/[-a-zA-Z0-9?&=_\/.]*
+# gist github
+/gist\.github\.com/[^/]+/[0-9a-f]+
+# git.io
+\bgit\.io/[0-9a-zA-Z]+
+# GitHub JSON
+"node_id": "[-a-zA-Z=;:/0-9+]*"
+# Contributor
+\[[^\]]+]\(https://github\.com/[^/]+\)
+# GHSA
+GHSA(?:-[0-9a-z]{4}){3}
+
+LS_COLORS=(["']).*?\g{-1}
+
+(\\?)%[a-zA-Z]+\g{-1}(?!%)
+
+# URL escaped characters
+\%[0-9A-F]{2}
+# hex digits including css/html color classes:
+(?:[\\0][xX]|\\u|[uU]\+|#x?|\%23)[0-9a-fA-FgGrR_]{2,}(?:[uU]?[lL]{0,2}|u\d+)\b
+
+# https://www.gnu.org/software/groff/manual/groff.html
+# man troff content
+\\f[BCIPR]
+
+# Compiler flags
+[\t "'`=]-[LPWXY]
+[\t "'`=]-D(?!ebian)
+
+# ignore long runs of a single character:
+\b([A-Za-z])\g{-1}{3,}\b
diff --git a/.github/actions/spelling/reject.txt b/.github/actions/spelling/reject.txt
new file mode 100644
index 000000000..a5ba6f639
--- /dev/null
+++ b/.github/actions/spelling/reject.txt
@@ -0,0 +1,7 @@
+^attache$
+benefitting
+occurence
+Sorce
+^[Ss]pae
+^untill
+^wether
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 7ab7efdd6..cdadc1434 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -14,6 +14,7 @@ jobs:
tests:
name: Run tests
runs-on: ${{ matrix.os }}
+ if: github.repository == 'ohmyzsh/ohmyzsh'
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
diff --git a/.github/workflows/project.yml b/.github/workflows/project.yml
new file mode 100644
index 000000000..800761554
--- /dev/null
+++ b/.github/workflows/project.yml
@@ -0,0 +1,131 @@
+name: Project tracking
+on:
+ issues:
+ types: [opened]
+ pull_request_target:
+ types: [opened, synchronize]
+
+jobs:
+ add-to-project:
+ name: Add to project
+ runs-on: ubuntu-latest
+ if: github.repository == 'ohmyzsh/ohmyzsh'
+ env:
+ GITHUB_TOKEN: ${{ secrets.PROJECT_TOKEN }}
+ steps:
+ - name: Read project data
+ env:
+ ORGANIZATION: ohmyzsh
+ PROJECT_NUMBER: "1"
+ run: |
+ # Get Project data
+ gh api graphql -f query='
+ query($org: String!, $number: Int!) {
+ organization(login: $org){
+ projectNext(number: $number) {
+ id
+ fields(first:20) {
+ nodes {
+ id
+ name
+ }
+ }
+ }
+ }
+ }
+ ' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json
+
+ # Parse project data
+ cat >> $GITHUB_ENV <> $GITHUB_ENV
+
+ - name: Classify Pull Request
+ if: github.event_name == 'pull_request_target'
+ run: |
+ touch plugins.list themes.list
+
+ gh pr view ${{ github.event.pull_request.number }} \
+ --repo ${{ github.repository }} \
+ --json files --jq '.files.[].path' | awk -F/ '
+ /^plugins\// {
+ plugins[$2] = 1
+ }
+ /^themes\// {
+ gsub(/\.zsh-theme$/, "", $2)
+ themes[$2] = 1
+ }
+ END {
+ for (plugin in plugins) {
+ print plugin >> "plugins.list"
+ }
+ for (theme in themes) {
+ print theme >> "themes.list"
+ }
+ }
+ '
+ # If only one plugin is modified, add it to the plugin field
+ if [[ $(wc -l < plugins.list) = 1 ]]; then
+ echo "PLUGIN=$(cat plugins.list)" >> $GITHUB_ENV
+ fi
+ # If only one theme is modified, add it to the theme field
+ if [[ $(wc -l < themes.list) = 1 ]]; then
+ echo "THEME=$(cat themes.list)" >> $GITHUB_ENV
+ fi
+
+ - name: Fill Pull Request fields in project
+ if: github.event_name == 'pull_request_target'
+ run: |
+ gh api graphql -f query='
+ mutation (
+ $project: ID!
+ $item: ID!
+ $plugin_field: ID!
+ $plugin_value: String!
+ $theme_field: ID!
+ $theme_value: String!
+ ) {
+ set_plugin: updateProjectNextItemField(input: {
+ projectId: $project
+ itemId: $item
+ fieldId: $plugin_field
+ value: $plugin_value
+ }) {
+ projectNextItem {
+ id
+ }
+ }
+ set_theme: updateProjectNextItemField(input: {
+ projectId: $project
+ itemId: $item
+ fieldId: $theme_field
+ value: $theme_value
+ }) {
+ projectNextItem {
+ id
+ }
+ }
+ }
+ ' -f project=$PROJECT_ID -f item=$ITEM_ID \
+ -f plugin_field=$PLUGIN_FIELD_ID -f plugin_value=$PLUGIN \
+ -f theme_field=$THEME_FIELD_ID -f theme_value=$THEME \
+ --silent
+
diff --git a/README.md b/README.md
index 5712c1701..94a200850 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,7 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi
[![Follow @ohmyzsh](https://img.shields.io/twitter/follow/ohmyzsh?label=Follow+@ohmyzsh&style=flat)](https://twitter.com/intent/follow?screen_name=ohmyzsh)
[![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh)
[![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh)
+[![huntr.dev](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev/bounties/disclose/?utm_campaign=ohmyzsh%2Fohmyzsh&utm_medium=social&utm_source=github&target=https%3A%2F%2Fgithub.com%2Fohmyzsh%2Fohmyzsh)
## Getting Started
@@ -36,6 +37,8 @@ Oh My Zsh is installed by running one of the following commands in your terminal
| **wget** | `sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` |
| **fetch** | `sh -c "$(fetch -o - https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` |
+_Note that previous configuration in `.zshrc` will be placed in `.pre-oh-my-zsh`. After installation you can move configuration you want to preserve into `.zshrc`._
+
#### Manual inspection
It's a good idea to inspect the install script from projects you don't yet know. You can do
diff --git a/SECURITY.md b/SECURITY.md
index cda53379f..7e5c8eed0 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -3,7 +3,8 @@
## Supported Versions
At the moment Oh My Zsh only considers the very latest commit to be supported.
-We combine that with our fast response to incidents, so risk is minimized.
+We combine that with our fast response to incidents and the automated updates
+to minimize the time between vulnerability publication and patch release.
| Version | Supported |
|:-------------- |:------------------ |
@@ -14,9 +15,10 @@ In the near future we will introduce versioning, so expect this section to chang
## Reporting a Vulnerability
-If you find a vulnerability, email all the maintainers directly at:
+**Do not submit an issue or pull request**: this might reveal the vulnerability.
-- Robby: robby [at] planetargon.com
-- Marc: hello [at] mcornella.com
+Instead, you should email the maintainers directly at: [**security@ohmyz.sh**](mailto:security@ohmyz.sh).
-**Do not open an issue or Pull Request directly**, because it might reveal the vulnerability.
+We will deal with the vulnerability privately and submit a patch as soon as possible.
+
+You can also submit your vulnerability report to [huntr.dev](https://huntr.dev/bounties/disclose/?utm_campaign=ohmyzsh%2Fohmyzsh&utm_medium=social&utm_source=github&target=https%3A%2F%2Fgithub.com%2Fohmyzsh%2Fohmyzsh) and see if you can get a bounty reward.
diff --git a/lib/cli.zsh b/lib/cli.zsh
index d90cc6469..edc10e722 100644
--- a/lib/cli.zsh
+++ b/lib/cli.zsh
@@ -29,6 +29,7 @@ function _omz {
'reload:Reload the current zsh session'
'theme:Manage themes'
'update:Update Oh My Zsh'
+ 'version:Show the version'
)
if (( CURRENT == 2 )); then
@@ -36,7 +37,7 @@ function _omz {
elif (( CURRENT == 3 )); then
case "$words[2]" in
changelog) local -a refs
- refs=("${(@f)$(cd "$ZSH"; command git for-each-ref --format="%(refname:short):%(subject)" refs/heads refs/tags)}")
+ refs=("${(@f)$(builtin cd -q "$ZSH"; command git for-each-ref --format="%(refname:short):%(subject)" refs/heads refs/tags)}")
_describe 'command' refs ;;
plugin) subcmds=(
'disable:Disable plugin(s)'
@@ -60,17 +61,19 @@ function _omz {
# if command is "disable", only offer already enabled plugins
valid_plugins=($plugins)
else
- valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(.N:h:t))
+ valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
# if command is "enable", remove already enabled plugins
[[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
fi
_describe 'plugin' valid_plugins ;;
plugin::info)
- local -aU plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(.N:h:t))
+ local -aU plugins
+ plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
_describe 'plugin' plugins ;;
theme::(set|use))
- local -aU themes=("$ZSH"/themes/*.zsh-theme(.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
+ local -aU themes
+ themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
_describe 'theme' themes ;;
esac
elif (( CURRENT > 4 )); then
@@ -82,7 +85,7 @@ function _omz {
# if command is "disable", only offer already enabled plugins
valid_plugins=($plugins)
else
- valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(.N:h:t))
+ valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
# if command is "enable", remove already enabled plugins
[[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
fi
@@ -164,6 +167,7 @@ Available commands:
reload Reload the current zsh session
theme Manage themes
update Update Oh My Zsh
+ version Show the version
EOF
}
@@ -172,13 +176,13 @@ function _omz::changelog {
local version=${1:-HEAD} format=${3:-"--text"}
if (
- cd "$ZSH"
+ builtin cd -q "$ZSH"
! command git show-ref --verify refs/heads/$version && \
! command git show-ref --verify refs/tags/$version && \
! command git rev-parse --verify "${version}^{commit}"
) &>/dev/null; then
cat >&2 < must be a valid branch, tag or commit.
EOF
@@ -189,9 +193,9 @@ EOF
}
function _omz::plugin {
- (( $# > 0 && $+functions[_omz::plugin::$1] )) || {
+ (( $# > 0 && $+functions[$0::$1] )) || {
cat >&2 < [options]
+Usage: ${(j: :)${(s.::.)0#_}} [options]
Available commands:
@@ -208,12 +212,12 @@ EOF
local command="$1"
shift
- _omz::plugin::$command "$@"
+ $0::$command "$@"
}
function _omz::plugin::disable {
if [[ -z "$1" ]]; then
- echo >&2 "Usage: omz plugin disable [...]"
+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} [...]"
return 1
fi
@@ -272,9 +276,10 @@ multi == 1 && length(\$0) > 0 {
{ print \$0 }
"
- awk "$awk_script" ~/.zshrc > ~/.zshrc.new \
- && command mv -f ~/.zshrc ~/.zshrc.bck \
- && command mv -f ~/.zshrc.new ~/.zshrc
+ local zdot="${ZDOTDIR:-$HOME}"
+ awk "$awk_script" "$zdot/.zshrc" > "$zdot/.zshrc.new" \
+ && command mv -f "$zdot/.zshrc" "$zdot/.zshrc.bck" \
+ && command mv -f "$zdot/.zshrc.new" "$zdot/.zshrc"
# Exit if the new .zshrc file wasn't created correctly
[[ $? -eq 0 ]] || {
@@ -284,10 +289,10 @@ multi == 1 && length(\$0) > 0 {
}
# Exit if the new .zshrc file has syntax errors
- if ! zsh -n ~/.zshrc; then
- _omz::log error "broken syntax in ~/.zshrc. Rolling back changes..."
- command mv -f ~/.zshrc ~/.zshrc.new
- command mv -f ~/.zshrc.bck ~/.zshrc
+ if ! command zsh -n "$zdot/.zshrc"; then
+ _omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..."
+ command mv -f "$zdot/.zshrc" "$zdot/.zshrc.new"
+ command mv -f "$zdot/.zshrc.bck" "$zdot/.zshrc"
return 1
fi
@@ -302,7 +307,7 @@ multi == 1 && length(\$0) > 0 {
function _omz::plugin::enable {
if [[ -z "$1" ]]; then
- echo >&2 "Usage: omz plugin enable [...]"
+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} [...]"
return 1
fi
@@ -347,9 +352,10 @@ multi == 1 && /^[^#]*\)/ {
{ print \$0 }
"
- awk "$awk_script" ~/.zshrc > ~/.zshrc.new \
- && command mv -f ~/.zshrc ~/.zshrc.bck \
- && command mv -f ~/.zshrc.new ~/.zshrc
+ local zdot="${ZDOTDIR:-$HOME}"
+ awk "$awk_script" "$zdot/.zshrc" > "$zdot/.zshrc.new" \
+ && command mv -f "$zdot/.zshrc" "$zdot/.zshrc.bck" \
+ && command mv -f "$zdot/.zshrc.new" "$zdot/.zshrc"
# Exit if the new .zshrc file wasn't created correctly
[[ $? -eq 0 ]] || {
@@ -359,10 +365,10 @@ multi == 1 && /^[^#]*\)/ {
}
# Exit if the new .zshrc file has syntax errors
- if ! zsh -n ~/.zshrc; then
- _omz::log error "broken syntax in ~/.zshrc. Rolling back changes..."
- command mv -f ~/.zshrc ~/.zshrc.new
- command mv -f ~/.zshrc.bck ~/.zshrc
+ if ! command zsh -n "$zdot/.zshrc"; then
+ _omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..."
+ command mv -f "$zdot/.zshrc" "$zdot/.zshrc.new"
+ command mv -f "$zdot/.zshrc.bck" "$zdot/.zshrc"
return 1
fi
@@ -377,7 +383,7 @@ multi == 1 && /^[^#]*\)/ {
function _omz::plugin::info {
if [[ -z "$1" ]]; then
- echo >&2 "Usage: omz plugin info "
+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} "
return 1
fi
@@ -424,7 +430,7 @@ function _omz::plugin::list {
function _omz::plugin::load {
if [[ -z "$1" ]]; then
- echo >&2 "Usage: omz plugin load [...]"
+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} [...]"
return 1
fi
@@ -471,9 +477,9 @@ function _omz::plugin::load {
}
function _omz::pr {
- (( $# > 0 && $+functions[_omz::pr::$1] )) || {
+ (( $# > 0 && $+functions[$0::$1] )) || {
cat >&2 < [options]
+Usage: ${(j: :)${(s.::.)0#_}} [options]
Available commands:
@@ -487,7 +493,7 @@ EOF
local command="$1"
shift
- _omz::pr::$command "$@"
+ $0::$command "$@"
}
function _omz::pr::clean {
@@ -528,7 +534,7 @@ function _omz::pr::test {
# Check the input
if ! [[ -n "$1" && "$1" =~ ^[[:digit:]]+$ ]]; then
- echo >&2 "Usage: omz pr test "
+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} "
return 1
fi
@@ -613,9 +619,9 @@ function _omz::reload {
}
function _omz::theme {
- (( $# > 0 && $+functions[_omz::theme::$1] )) || {
+ (( $# > 0 && $+functions[$0::$1] )) || {
cat >&2 < [options]
+Usage: ${(j: :)${(s.::.)0#_}} [options]
Available commands:
@@ -630,7 +636,7 @@ EOF
local command="$1"
shift
- _omz::theme::$command "$@"
+ $0::$command "$@"
}
function _omz::theme::list {
@@ -665,7 +671,7 @@ function _omz::theme::list {
function _omz::theme::set {
if [[ -z "$1" ]]; then
- echo >&2 "Usage: omz theme set "
+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} "
return 1
fi
@@ -694,17 +700,18 @@ END {
}
'
- awk "$awk_script" ~/.zshrc > ~/.zshrc.new \
+ local zdot="${ZDOTDIR:-$HOME}"
+ awk "$awk_script" "$zdot/.zshrc" > "$zdot/.zshrc.new" \
|| {
# Prepend ZSH_THEME= line to .zshrc if it doesn't exist
cat < ~/.zshrc.new \
- && command mv -f ~/.zshrc ~/.zshrc.bck \
- && command mv -f ~/.zshrc.new ~/.zshrc
+ cat "$zdot/.zshrc"
+ } > "$zdot/.zshrc.new" \
+ && command mv -f "$zdot/.zshrc" "$zdot/.zshrc.bck" \
+ && command mv -f "$zdot/.zshrc.new" "$zdot/.zshrc"
# Exit if the new .zshrc file wasn't created correctly
[[ $? -eq 0 ]] || {
@@ -714,10 +721,10 @@ EOF
}
# Exit if the new .zshrc file has syntax errors
- if ! zsh -n ~/.zshrc; then
- _omz::log error "broken syntax in ~/.zshrc. Rolling back changes..."
- command mv -f ~/.zshrc ~/.zshrc.new
- command mv -f ~/.zshrc.bck ~/.zshrc
+ if ! command zsh -n "$zdot/.zshrc"; then
+ _omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..."
+ command mv -f "$zdot/.zshrc" "$zdot/.zshrc.new"
+ command mv -f "$zdot/.zshrc.bck" "$zdot/.zshrc"
return 1
fi
@@ -732,7 +739,7 @@ EOF
function _omz::theme::use {
if [[ -z "$1" ]]; then
- echo >&2 "Usage: omz theme use "
+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} "
return 1
fi
@@ -754,13 +761,13 @@ function _omz::theme::use {
}
function _omz::update {
- local last_commit=$(cd "$ZSH"; git rev-parse HEAD)
+ local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD)
# Run update script
if [[ "$1" != --unattended ]]; then
- ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh" --interactive || return $?
+ ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" --interactive || return $?
else
- ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh" || return $?
+ ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" || return $?
fi
# Update last updated file
@@ -770,10 +777,32 @@ function _omz::update {
command rm -rf "$ZSH/log/update.lock"
# Restart the zsh session if there were changes
- if [[ "$1" != --unattended && "$(cd "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then
+ if [[ "$1" != --unattended && "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then
# Old zsh versions don't have ZSH_ARGZERO
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
# Check whether to run a login shell
[[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
fi
}
+
+function _omz::version {
+ (
+ builtin cd -q "$ZSH"
+
+ # Get the version name:
+ # 1) try tag-like version
+ # 2) try branch name
+ # 3) try name-rev (tag~ or branch~)
+ local version
+ version=$(command git describe --tags HEAD 2>/dev/null) \
+ || version=$(command git symbolic-ref --quiet --short HEAD 2>/dev/null) \
+ || version=$(command git name-rev --no-undefined --name-only --exclude="remotes/*" HEAD 2>/dev/null) \
+ || version=""
+
+ # Get short hash for the current HEAD
+ local commit=$(command git rev-parse --short HEAD 2>/dev/null)
+
+ # Show version and commit hash
+ printf "%s (%s)\n" "$version" "$commit"
+ )
+}
diff --git a/lib/git.zsh b/lib/git.zsh
index 8623473b0..be9fa7e67 100644
--- a/lib/git.zsh
+++ b/lib/git.zsh
@@ -29,7 +29,7 @@ function git_prompt_info() {
&& upstream=" -> ${upstream}"
fi
- echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref}${upstream}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
+ echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
}
# Checks if working tree is dirty
@@ -82,7 +82,7 @@ function git_remote_status() {
fi
if [[ -n $ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_DETAILED ]]; then
- git_remote_status="$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_PREFIX$remote$git_remote_status_detailed$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_SUFFIX"
+ git_remote_status="$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_PREFIX${remote:gs/%/%%}$git_remote_status_detailed$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_SUFFIX"
fi
echo $git_remote_status
diff --git a/lib/nvm.zsh b/lib/nvm.zsh
index 2fe57a8f4..a8989f9fe 100644
--- a/lib/nvm.zsh
+++ b/lib/nvm.zsh
@@ -2,5 +2,5 @@
function nvm_prompt_info() {
which nvm &>/dev/null || return
local nvm_prompt=${$(nvm current)#v}
- echo "${ZSH_THEME_NVM_PROMPT_PREFIX}${nvm_prompt}${ZSH_THEME_NVM_PROMPT_SUFFIX}"
+ echo "${ZSH_THEME_NVM_PROMPT_PREFIX}${nvm_prompt:gs/%/%%}${ZSH_THEME_NVM_PROMPT_SUFFIX}"
}
diff --git a/lib/prompt_info_functions.zsh b/lib/prompt_info_functions.zsh
index 48f033da6..e5535848b 100644
--- a/lib/prompt_info_functions.zsh
+++ b/lib/prompt_info_functions.zsh
@@ -30,7 +30,7 @@ function rvm_prompt_info() {
local rvm_prompt
rvm_prompt=$($HOME/.rvm/bin/rvm-prompt ${=ZSH_THEME_RVM_PROMPT_OPTIONS} 2>/dev/null)
[[ -z "${rvm_prompt}" ]] && return 1
- echo "${ZSH_THEME_RUBY_PROMPT_PREFIX}${rvm_prompt}${ZSH_THEME_RUBY_PROMPT_SUFFIX}"
+ echo "${ZSH_THEME_RUBY_PROMPT_PREFIX}${rvm_prompt:gs/%/%%}${ZSH_THEME_RUBY_PROMPT_SUFFIX}"
}
ZSH_THEME_RVM_PROMPT_OPTIONS="i v g"
diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh
index 49f64400b..4035d10a1 100644
--- a/lib/termsupport.zsh
+++ b/lib/termsupport.zsh
@@ -10,7 +10,7 @@ function title {
setopt localoptions nopromptsubst
# Don't set the title if inside emacs, unless using vterm
- [[ -n "$INSIDE_EMACS" && "$INSIDE_EMACS" != vterm ]] && return
+ [[ -n "${INSIDE_EMACS:-}" && "$INSIDE_EMACS" != vterm ]] && return
# if $2 is unset use $1 as default
# if it is set and empty, leave it as is
diff --git a/plugins/1password/1password.plugin.zsh b/plugins/1password/1password.plugin.zsh
new file mode 100644
index 000000000..5af5ebb2b
--- /dev/null
+++ b/plugins/1password/1password.plugin.zsh
@@ -0,0 +1,46 @@
+if (( ${+commands[op]} )); then
+ eval "$(op completion zsh)"
+ compdef _op op
+fi
+
+# opswd puts the password of the named service into the clipboard. If there's a
+# one time password, it will be copied into the clipboard after 5 seconds. The
+# clipboard is cleared after another 10 seconds.
+function opswd() {
+ if [[ $# -lt 1 ]]; then
+ echo "Usage: opswd "
+ return 1
+ fi
+
+ local service=$1
+
+ # If not logged in, print error and return
+ op list users > /dev/null || return
+
+ local password
+ # Copy the password to the clipboard
+ if ! password=$(op get item "$service" --fields password 2>/dev/null); then
+ echo "error: could not obtain password for $service"
+ return 1
+ fi
+
+ echo -n "$password" | clipcopy
+ echo "✔ password for $service copied to clipboard"
+
+ # If there's a one time password, copy it to the clipboard after 5 seconds
+ local totp
+ if totp=$(op get totp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then
+ sleep 10 && echo -n "$totp" | clipcopy
+ echo "✔ TOTP for $service copied to clipboard"
+ fi
+
+ (sleep 20 && clipcopy /dev/null) &!
+}
+
+function _opswd() {
+ local -a services
+ services=("${(@f)$(op list items --categories Login 2>/dev/null | op get item - --fields title 2>/dev/null)}")
+ [[ -z "$services" ]] || compadd -a -- services
+}
+
+compdef _opswd opswd
diff --git a/plugins/1password/README.md b/plugins/1password/README.md
new file mode 100644
index 000000000..f6790ca8a
--- /dev/null
+++ b/plugins/1password/README.md
@@ -0,0 +1,35 @@
+# 1Password
+
+This plugin adds 1Password functionality to oh-my-zsh.
+
+To use, add `1password` to the list of plugins in your `.zshrc` file:
+
+```zsh
+plugins=(... 1password)
+```
+
+Then, you can use the command `opswd` to copy passwords for services into your
+clipboard.
+
+## `opswd`
+
+The `opswd` command is a wrapper around the `op` command. It takes a service
+name as an argument and copies the password for that service to the clipboard.
+
+If the service also contains a TOTP, it is copied to the clipboard after 10 seconds.
+Finally, after 20 seconds, the clipboard is cleared.
+
+The function has completion support, so you can use tab completion to select
+which service you want to get.
+
+For example, `opswd github.com` will put your GitHub password into your clipboard, and if
+a TOTP is available, it will be copied to the clipboard after 10 seconds.
+
+> NOTE: you need to be logged in for `opswd` to work. See:
+>
+> - [Sign in or out](https://support.1password.com/command-line/#sign-in-or-out)
+> - [Session management](https://support.1password.com/command-line/#appendix-session-management)
+
+## Requirements
+
+- [1Password's command line utility](https://1password.com/downloads/command-line/).
diff --git a/plugins/aliases/.gitignore b/plugins/aliases/.gitignore
new file mode 100644
index 000000000..bee8a64b7
--- /dev/null
+++ b/plugins/aliases/.gitignore
@@ -0,0 +1 @@
+__pycache__
diff --git a/plugins/aliases/README.md b/plugins/aliases/README.md
index 481c1bd4e..bfb6ab8c4 100644
--- a/plugins/aliases/README.md
+++ b/plugins/aliases/README.md
@@ -1,21 +1,22 @@
-## Aliases Cheatsheet
+# Aliases cheatsheet
**Maintainer:** [@hqingyi](https://github.com/hqingyi)
With lots of 3rd-party amazing aliases installed, this plugin helps list the shortcuts
that are currently available based on the plugins you have enabled.
-Enable this plugin by adding it to your `plugins` definition in `~/.zshrc`.
+To use it, add `aliases` to the plugins array in your zshrc file:
- ```
- plugins=(aliases)
- ```
+```zsh
+plugins=(aliases)
+```
Requirements: Python needs to be installed.
-### Usage
+## Usage
-```
- acs: group all alias
- acs $keywordquickly filter alias & highlight
-```
+- `acs`: show all aliases by group.
+
+- `acs `: filter aliases by `` and highlight.
+
+ ![screenshot](https://cloud.githubusercontent.com/assets/3602957/11581913/cb54fb8a-9a82-11e5-846b-5a67f67ad9ad.png)
diff --git a/plugins/aliases/aliases.plugin.zsh b/plugins/aliases/aliases.plugin.zsh
index 28d8fba24..b3d9340f0 100644
--- a/plugins/aliases/aliases.plugin.zsh
+++ b/plugins/aliases/aliases.plugin.zsh
@@ -2,9 +2,10 @@
#
# - acs: alias cheatsheet
# group alias by command, pass addition argv to grep.
-ALIASES_PLUGIN_ROOT=$(cd `dirname $0` && pwd)
function acs(){
- which python >>/dev/null
- [[ $? -eq 1 ]] && echo "[error]no python executable detected!" && return
- alias | python $ALIASES_PLUGIN_ROOT/cheatsheet.py $@
+ (( $+commands[python] )) || {
+ echo "[error] No python executable detected"
+ return
+ }
+ alias | python ${functions_source[$0]:h}/cheatsheet.py $@
}
diff --git a/plugins/aliases/cheatsheet.py b/plugins/aliases/cheatsheet.py
index d6d507b92..694afd31c 100644
--- a/plugins/aliases/cheatsheet.py
+++ b/plugins/aliases/cheatsheet.py
@@ -26,16 +26,16 @@ def cheatsheet(lines):
target_aliases.extend(group_list)
return cheatsheet
-def pretty_print_group(key, aliases, hightlight=None):
+def pretty_print_group(key, aliases, highlight=None):
if len(aliases) == 0:
return
group_hl_formatter = lambda g, hl: termcolor.colored(hl, 'yellow').join([termcolor.colored(part, 'red') for part in ('[%s]' % g).split(hl)])
alias_hl_formatter = lambda alias, hl: termcolor.colored(hl, 'yellow').join([termcolor.colored(part, 'green') for part in ('\t%s = %s' % alias[0:2]).split(hl)])
group_formatter = lambda g: termcolor.colored('[%s]' % g, 'red')
alias_formatter = lambda alias: termcolor.colored('\t%s = %s' % alias[0:2], 'green')
- if hightlight and len(hightlight)>0:
- print (group_hl_formatter(key, hightlight))
- print ('\n'.join([alias_hl_formatter(alias, hightlight) for alias in aliases]))
+ if highlight and len(highlight)>0:
+ print (group_hl_formatter(key, highlight))
+ print ('\n'.join([alias_hl_formatter(alias, highlight) for alias in aliases]))
else:
print (group_formatter(key))
print ('\n'.join([alias_formatter(alias) for alias in aliases]))
diff --git a/plugins/aliases/termcolor.py b/plugins/aliases/termcolor.py
index f11b824b2..bb725e905 100644
--- a/plugins/aliases/termcolor.py
+++ b/plugins/aliases/termcolor.py
@@ -21,7 +21,7 @@
#
# Author: Konstantin Lepa
-"""ANSII Color formatting for output in terminal."""
+"""ANSI Color formatting for output in terminal."""
from __future__ import print_function
import os
diff --git a/plugins/ant/README.md b/plugins/ant/README.md
index 5f88984ac..571237223 100644
--- a/plugins/ant/README.md
+++ b/plugins/ant/README.md
@@ -2,9 +2,9 @@
This plugin provides completion for [Ant](https://ant.apache.org/).
-To use it add ant to the plugins array in your zshrc file.
+To use it, add `ant` to the plugins array in your zshrc file:
-```bash
+```zsh
plugins=(... ant)
```
diff --git a/plugins/ant/_ant b/plugins/ant/_ant
new file mode 100644
index 000000000..24a8e3667
--- /dev/null
+++ b/plugins/ant/_ant
@@ -0,0 +1,22 @@
+#compdef ant
+
+_ant_does_target_list_need_generating () {
+ [[ ! -f .ant_targets ]] && return 0
+ [[ build.xml -nt .ant_targets ]] && return 0
+ return 1
+}
+
+_ant () {
+ if [[ ! -f build.xml ]]; then
+ return
+ fi
+
+ if ! _ant_does_target_list_need_generating; then
+ return
+ fi
+
+ ant -p | awk -F " " 'NR > 5 { print lastTarget } { lastTarget = $1 }' >| .ant_targets
+ compadd -- "$(cat .ant_targets)"
+}
+
+_ant "$@"
diff --git a/plugins/ant/ant.plugin.zsh b/plugins/ant/ant.plugin.zsh
index 0b738c94f..5f6382521 100644
--- a/plugins/ant/ant.plugin.zsh
+++ b/plugins/ant/ant.plugin.zsh
@@ -1,16 +1,2 @@
-_ant_does_target_list_need_generating () {
- [ ! -f .ant_targets ] && return 0;
- [ build.xml -nt .ant_targets ] && return 0;
- return 1;
-}
-
-_ant () {
- if [ -f build.xml ]; then
- if _ant_does_target_list_need_generating; then
- ant -p | awk -F " " 'NR > 5 { print lastTarget }{lastTarget = $1}' > .ant_targets
- fi
- compadd -- `cat .ant_targets`
- fi
-}
-
-compdef _ant ant
+# Default to colored output
+export ANT_ARGS='-logger org.apache.tools.ant.listener.AnsiColorLogger'
diff --git a/plugins/arcanist/README.md b/plugins/arcanist/README.md
index f49e4344b..07e766977 100644
--- a/plugins/arcanist/README.md
+++ b/plugins/arcanist/README.md
@@ -14,6 +14,7 @@ plugins=(... arcanist)
| ------- | ---------------------------------- |
| ara | `arc amend` |
| arb | `arc branch` |
+| arbl | `arc bland` |
| arco | `arc cover` |
| arci | `arc commit` |
| ard | `arc diff` |
@@ -24,6 +25,7 @@ plugins=(... arcanist)
| ardpc | `arc diff --plan-changes` |
| are | `arc export` |
| arh | `arc help` |
+| arho | `arc hotfix` |
| arl | `arc land` |
| arli | `arc lint` |
| arls | `arc list` |
diff --git a/plugins/arcanist/arcanist.plugin.zsh b/plugins/arcanist/arcanist.plugin.zsh
index 88e6713e4..380eede75 100644
--- a/plugins/arcanist/arcanist.plugin.zsh
+++ b/plugins/arcanist/arcanist.plugin.zsh
@@ -5,6 +5,7 @@
alias ara='arc amend'
alias arb='arc branch'
+alias arbl='arc bland'
alias arco='arc cover'
alias arci='arc commit'
@@ -17,6 +18,7 @@ alias ardp='arc diff --preview' # creates a new diff in the phab interface
alias are='arc export'
alias arh='arc help'
+alias arho='arc hotfix'
alias arl='arc land'
alias arli='arc lint'
alias arls='arc list'
diff --git a/plugins/archlinux/README.md b/plugins/archlinux/README.md
index c8ec1de1e..fd772c61a 100644
--- a/plugins/archlinux/README.md
+++ b/plugins/archlinux/README.md
@@ -17,8 +17,10 @@ plugins=(... archlinux)
| pacin | `sudo pacman -S` | Install packages from the repositories |
| pacins | `sudo pacman -U` | Install a package from a local file |
| pacinsd | `sudo pacman -S --asdeps` | Install packages as dependencies of another package |
+| paclean | `sudo pacman -Sc` | Clean out old and unused caches and packages |
| pacloc | `pacman -Qi` | Display information about a package in the local database |
| paclocs | `pacman -Qs` | Search for packages in the local database |
+| paclr | `sudo pacman -Scc` | Remove all files from the cache |
| paclsorphans | `sudo pacman -Qdt` | List all orphaned packages |
| pacmir | `sudo pacman -Syy` | Force refresh of all package lists after updating mirrorlist |
| pacre | `sudo pacman -R` | Remove packages, keeping its settings and dependencies |
@@ -52,6 +54,8 @@ upgrades were available. Use `pacman -Que` instead.
| Alias | Command | Description |
|---------|-------------------------------------------------|-------------------------------------------------------------------------|
+| auclean | `sudo aura -Sc` | Clean out old and unused caches and packages |
+| auclr | `sudo aura -Scc` | Remove all files from the cache |
| auin | `sudo aura -S` | Install packages from the repositories |
| aurin | `sudo aura -A` | Install packages from the repositories |
| auins | `sudo aura -U` | Install a package from a local file |
@@ -84,6 +88,8 @@ upgrades were available. Use `pacman -Que` instead.
| Alias | Command | Description |
|---------|-----------------------------------|---------------------------------------------------------------------|
+| pacclean| `pacaur -Sc` | Clean out old and unused caches and packages |
+| pacclr | `pacaur -Scc` | Remove all files from the cache |
| pain | `pacaur -S` | Install packages from the repositories |
| pains | `pacaur -U` | Install a package from a local file |
| painsd | `pacaur -S --asdeps` | Install packages as dependencies of another package |
@@ -106,6 +112,8 @@ upgrades were available. Use `pacman -Que` instead.
| Alias | Command | Description |
|---------|-----------------------------------|---------------------------------------------------------------------|
| trconf | `trizen -C` | Fix all configuration files with vimdiff |
+| trclean | `trizen -Sc` | Clean out old and unused caches and packages |
+| trclr | `trizen -Scc` | Remove all files from the cache |
| trin | `trizen -S` | Install packages from the repositories |
| trins | `trizen -U` | Install a package from a local file |
| trinsd | `trizen -S --asdeps` | Install packages as dependencies of another package |
@@ -128,6 +136,8 @@ upgrades were available. Use `pacman -Que` instead.
| Alias | Command | Description |
|---------|--------------------------------|-------------------------------------------------------------------|
| yaconf | `yay -Pg` | Print current configuration |
+| yaclean | `yay -Sc` | Clean out old and unused caches and packages |
+| yaclr | `yay -Scc` | Remove all files from the cache |
| yain | `yay -S` | Install packages from the repositories |
| yains | `yay -U` | Install a package from a local file |
| yainsd | `yay -S --asdeps` | Install packages as dependencies of another package |
@@ -170,3 +180,4 @@ whether the package manager is installed, checked in the following order:
- ornicar - thibault.duplessis@gmail.com
- Ybalrid (Arthur Brainville) - ybalrid@ybalrid.info
- Jeff M. Hubbard - jeffmhubbard@gmail.com
+- K. Harishankar(harishnkr) - hari2menon1234@gmail.com
diff --git a/plugins/archlinux/archlinux.plugin.zsh b/plugins/archlinux/archlinux.plugin.zsh
index 0c5782d98..4f1364779 100644
--- a/plugins/archlinux/archlinux.plugin.zsh
+++ b/plugins/archlinux/archlinux.plugin.zsh
@@ -5,7 +5,9 @@
# Pacman - https://wiki.archlinux.org/index.php/Pacman_Tips
alias pacupg='sudo pacman -Syu'
alias pacin='sudo pacman -S'
+alias paclean='sudo pacman -Sc'
alias pacins='sudo pacman -U'
+alias paclr='sudo pacman -Scc'
alias pacre='sudo pacman -R'
alias pacrem='sudo pacman -Rns'
alias pacrep='pacman -Si'
@@ -88,6 +90,8 @@ fi
if (( $+commands[aura] )); then
alias auin='sudo aura -S'
alias aurin='sudo aura -A'
+ alias auclean='sudo aura -Sc'
+ alias auclr='sudo aura -Scc'
alias auins='sudo aura -U'
alias auinsd='sudo aura -S --asdeps'
alias aurinsd='sudo aura -A --asdeps'
@@ -115,6 +119,8 @@ if (( $+commands[aura] )); then
fi
if (( $+commands[pacaur] )); then
+ alias pacclean='pacaur -Sc'
+ alias pacclr='pacaur -Scc'
alias paupg='pacaur -Syu'
alias pasu='pacaur -Syu --noconfirm'
alias pain='pacaur -S'
@@ -138,6 +144,8 @@ if (( $+commands[trizen] )); then
alias trupg='trizen -Syua'
alias trsu='trizen -Syua --noconfirm'
alias trin='trizen -S'
+ alias trclean='trizen -Sc'
+ alias trclr='trizen -Scc'
alias trins='trizen -U'
alias trre='trizen -R'
alias trrem='trizen -Rns'
@@ -155,6 +163,8 @@ fi
if (( $+commands[yay] )); then
alias yaconf='yay -Pg'
+ alias yaclean='yay -Sc'
+ alias yaclr='yay -Scc'
alias yaupg='yay -Syu'
alias yasu='yay -Syu --noconfirm'
alias yain='yay -S'
diff --git a/plugins/asdf/asdf.plugin.zsh b/plugins/asdf/asdf.plugin.zsh
index c386d57ed..3016282c6 100644
--- a/plugins/asdf/asdf.plugin.zsh
+++ b/plugins/asdf/asdf.plugin.zsh
@@ -2,18 +2,26 @@
ASDF_DIR="${ASDF_DIR:-$HOME/.asdf}"
ASDF_COMPLETIONS="$ASDF_DIR/completions"
+# If not found, check for archlinux/AUR package (/opt/asdf-vm/)
+if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/asdf.bash" ]] && [[ -f "/opt/asdf-vm/asdf.sh" ]]; then
+ ASDF_DIR="/opt/asdf-vm"
+ ASDF_COMPLETIONS="$ASDF_DIR"
+fi
+
# If not found, check for Homebrew package
if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/asdf.bash" ]] && (( $+commands[brew] )); then
- ASDF_DIR="$(brew --prefix asdf)"
- ASDF_COMPLETIONS="$ASDF_DIR/etc/bash_completion.d"
+ brew_prefix="$(brew --prefix asdf)"
+ ASDF_DIR="${brew_prefix}/libexec"
+ ASDF_COMPLETIONS="${brew_prefix}/etc/bash_completion.d"
+ unset brew_prefix
fi
# Load command
if [[ -f "$ASDF_DIR/asdf.sh" ]]; then
- . "$ASDF_DIR/asdf.sh"
+ . "$ASDF_DIR/asdf.sh"
- # Load completions
- if [[ -f "$ASDF_COMPLETIONS/asdf.bash" ]]; then
- . "$ASDF_COMPLETIONS/asdf.bash"
- fi
+ # Load completions
+ if [[ -f "$ASDF_COMPLETIONS/asdf.bash" ]]; then
+ . "$ASDF_COMPLETIONS/asdf.bash"
+ fi
fi
diff --git a/plugins/autojump/autojump.plugin.zsh b/plugins/autojump/autojump.plugin.zsh
index 3117c6da4..8593353b2 100644
--- a/plugins/autojump/autojump.plugin.zsh
+++ b/plugins/autojump/autojump.plugin.zsh
@@ -8,6 +8,7 @@ autojump_paths=(
/etc/profile.d/autojump.zsh # manual installation
/etc/profile.d/autojump.sh # Gentoo installation
/usr/local/share/autojump/autojump.zsh # FreeBSD installation
+ /usr/pkg/share/autojump/autojump.zsh # NetBSD installation
/opt/local/etc/profile.d/autojump.sh # macOS with MacPorts
/usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default)
/opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs)
diff --git a/plugins/aws/README.md b/plugins/aws/README.md
index 011bbd8b4..d6f4f4600 100644
--- a/plugins/aws/README.md
+++ b/plugins/aws/README.md
@@ -14,11 +14,12 @@ plugins=(... aws)
* `asp []`: sets `$AWS_PROFILE` and `$AWS_DEFAULT_PROFILE` (legacy) to ``.
It also sets `$AWS_EB_PROFILE` to `` for the Elastic Beanstalk CLI.
Run `asp` without arguments to clear the profile.
+* `asp [] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection.
-* `acp []`: in addition to `asp` functionality, it actually changes the profile by
- assuming the role specified in the `` configuration. It supports MFA and sets
- `$AWS_ACCESS_KEY_ID`, `$AWS_SECRET_ACCESS_KEY` and `$AWS_SESSION_TOKEN`, if obtained. It
- requires the roles to be configured as per the
+* `acp [] []`: in addition to `asp` functionality, it actually changes
+ the profile by assuming the role specified in the `` configuration. It supports
+ MFA and sets `$AWS_ACCESS_KEY_ID`, `$AWS_SECRET_ACCESS_KEY` and `$AWS_SESSION_TOKEN`, if
+ obtained. It requires the roles to be configured as per the
[official guide](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html).
Run `acp` without arguments to clear the profile.
diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh
index 2d095635b..920a7139d 100644
--- a/plugins/aws/aws.plugin.zsh
+++ b/plugins/aws/aws.plugin.zsh
@@ -21,6 +21,10 @@ function asp() {
export AWS_DEFAULT_PROFILE=$1
export AWS_PROFILE=$1
export AWS_EB_PROFILE=$1
+
+ if [[ "$2" == "login" ]]; then
+ aws sso login
+ fi
}
# AWS profile switch
@@ -41,6 +45,7 @@ function acp() {
fi
local profile="$1"
+ local mfa_token="$2"
# Get fallback credentials for if the aws command fails or no command is run
local aws_access_key_id="$(aws configure get aws_access_key_id --profile $profile)"
@@ -54,9 +59,10 @@ function acp() {
if [[ -n "$mfa_serial" ]]; then
local -a mfa_opt
- local mfa_token
- echo -n "Please enter your MFA token for $mfa_serial: "
- read -r mfa_token
+ if [[ -z "$mfa_token" ]]; then
+ echo -n "Please enter your MFA token for $mfa_serial: "
+ read -r mfa_token
+ fi
if [[ -z "$sess_duration" ]]; then
echo -n "Please enter the session duration in seconds (900-43200; default: 3600, which is the default maximum for a role): "
read -r sess_duration
@@ -151,8 +157,8 @@ compctl -K _aws_profiles asp acp aws_change_access_key
# AWS prompt
function aws_prompt_info() {
- [[ -z $AWS_PROFILE ]] && return
- echo "${ZSH_THEME_AWS_PREFIX:=}"
+ [[ -n "$AWS_PROFILE" ]] || return
+ echo "${ZSH_THEME_AWS_PREFIX:=}"
}
if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; then
diff --git a/plugins/bazel/_bazel b/plugins/bazel/_bazel
index 827ce545c..c34c572b0 100644
--- a/plugins/bazel/_bazel
+++ b/plugins/bazel/_bazel
@@ -164,7 +164,7 @@ _get_build_targets() {
;;
esac
completions=(${$(_bazel_b query "kind(\"${rule_re}\", ${pkg}:all)" 2>/dev/null)##*:})
- if ( (( ${#completions} > 0 )) && [[ $target_type != run ]] ); then
+ if ( (( ${#completions} > 0 )) && [[ $target_type != bin ]] ); then
completions+=(all)
fi
echo ${completions[*]}
diff --git a/plugins/bower/bower.plugin.zsh b/plugins/bower/bower.plugin.zsh
index 3a40b3af0..c4f71c2ae 100644
--- a/plugins/bower/bower.plugin.zsh
+++ b/plugins/bower/bower.plugin.zsh
@@ -9,7 +9,7 @@ _bower_installed_packages () {
}
_bower ()
{
- local -a _1st_arguments _no_color _dopts _save_dev _force_lastest _production
+ local -a _1st_arguments _no_color _dopts _save_dev _force_latest _production
local expl
typeset -A opt_args
@@ -22,7 +22,7 @@ _bower ()
_save_dev=('(--save-dev)--save-dev[Save installed packages into the project"s bower.json devDependencies]')
- _force_lastest=('(--force-latest)--force-latest[Force latest version on conflict]')
+ _force_latest=('(--force-latest)--force-latest[Force latest version on conflict]')
_production=('(--production)--production[Do not install project devDependencies]')
@@ -54,7 +54,7 @@ _bower ()
_arguments \
$_dopts \
$_save_dev \
- $_force_lastest \
+ $_force_latest \
$_no_color \
$_production
;;
@@ -62,7 +62,7 @@ _bower ()
_arguments \
$_dopts \
$_no_color \
- $_force_lastest
+ $_force_latest
_bower_installed_packages
compadd "$@" $(echo $bower_package_list)
;;
diff --git a/plugins/branch/README.md b/plugins/branch/README.md
index 56ab8da4b..a15dd22df 100644
--- a/plugins/branch/README.md
+++ b/plugins/branch/README.md
@@ -1,31 +1,47 @@
-# Branch
+# Branch plugin
-Displays the current Git or Mercurial branch fast.
+This plugin displays the current Git or Mercurial branch, fast. If in a Mercurial repository,
+also display the current bookmark, if present.
+
+To use it, add `branch` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... branch)
+```
## Speed test
-### Mercurial
+- `hg branch`:
-```shell
-$ time hg branch
-0.11s user 0.14s system 70% cpu 0.355 total
-```
+ ```console
+ $ time hg branch
+ 0.11s user 0.14s system 70% cpu 0.355 total
+ ```
-### Branch plugin
+- branch plugin:
-```shell
-$ time zsh /tmp/branch_prompt_info_test.zsh
-0.00s user 0.01s system 78% cpu 0.014 total
-```
+ ```console
+ $ time zsh /tmp/branch_prompt_info_test.zsh
+ 0.00s user 0.01s system 78% cpu 0.014 total
+ ```
## Usage
-Edit your theme file (eg.: `~/.oh-my-zsh/theme/robbyrussell.zsh-theme`)
-adding `$(branch_prompt_info)` in your prompt like this:
+Copy your theme to `$ZSH_CUSTOM/themes/` and modify it to add `$(branch_prompt_info)` in your prompt.
+This example is for the `robbyrussell` theme:
```diff
-- PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'
-+ PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)$(branch_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'
+diff --git a/themes/robbyrussell.zsh-theme b/themes/robbyrussell.zsh-theme
+index 2fd5f2cd..9d89a464 100644
+--- a/themes/robbyrussell.zsh-theme
++++ b/themes/robbyrussell.zsh-theme
+@@ -1,5 +1,5 @@
+ PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
+-PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'
++PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(branch_prompt_info)'
+
+ ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}"
+ ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
```
## Maintainer
diff --git a/plugins/branch/branch.plugin.zsh b/plugins/branch/branch.plugin.zsh
index 2e5659bdf..dd5871fdc 100644
--- a/plugins/branch/branch.plugin.zsh
+++ b/plugins/branch/branch.plugin.zsh
@@ -3,29 +3,33 @@
# Oct 2, 2015
function branch_prompt_info() {
- # Defines path as current directory
- local current_dir=$PWD
- # While current path is not root path
- while [[ $current_dir != '/' ]]
- do
- # Git repository
- if [[ -d "${current_dir}/.git" ]]
- then
- echo '±' ${"$(<"$current_dir/.git/HEAD")"##*/}
- return;
+ # Start checking in current working directory
+ local branch="" dir="$PWD"
+ while [[ "$dir" != '/' ]]; do
+ # Found .git directory
+ if [[ -d "${dir}/.git" ]]; then
+ branch="${"$(<"${dir}/.git/HEAD")"##*/}"
+ echo '±' "${branch:gs/%/%%}"
+ return
fi
- # Mercurial repository
- if [[ -d "${current_dir}/.hg" ]]
- then
- if [[ -f "$current_dir/.hg/branch" ]]
- then
- echo '☿' $(<"$current_dir/.hg/branch")
+
+ # Found .hg directory
+ if [[ -d "${dir}/.hg" ]]; then
+ if [[ -f "${dir}/.hg/branch" ]]; then
+ branch="$(<"${dir}/.hg/branch")"
else
- echo '☿ default'
+ branch="default"
fi
- return;
+
+ if [[ -f "${dir}/.hg/bookmarks.current" ]]; then
+ branch="${branch}/$(<"${dir}/.hg/bookmarks.current")"
+ fi
+
+ echo '☿' "${branch:gs/%/%%}"
+ return
fi
- # Defines path as parent directory and keeps looking for :)
- current_dir="${current_dir:h}"
+
+ # Check parent directory
+ dir="${dir:h}"
done
}
diff --git a/plugins/brew/brew.plugin.zsh b/plugins/brew/brew.plugin.zsh
index 532dd9be7..070a083d0 100644
--- a/plugins/brew/brew.plugin.zsh
+++ b/plugins/brew/brew.plugin.zsh
@@ -1,5 +1,4 @@
alias brewp='brew pin'
-alias brews='brew list -1'
alias brewsp='brew list --pinned'
alias bubo='brew update && brew outdated'
alias bubc='brew upgrade && brew cleanup'
@@ -7,3 +6,16 @@ alias bubu='bubo && bubc'
alias buf='brew upgrade --formula'
alias bcubo='brew update && brew outdated --cask'
alias bcubc='brew upgrade --cask && brew cleanup'
+
+function brews() {
+ local formulae="$(brew leaves | xargs brew deps --installed --for-each)"
+ local casks="$(brew list --cask)"
+
+ local blue="$(tput setaf 4)"
+ local bold="$(tput bold)"
+ local off="$(tput sgr0)"
+
+ echo "${blue}==>${off} ${bold}Formulae${off}"
+ echo "${formulae}" | sed "s/^\(.*\):\(.*\)$/\1${blue}\2${off}/"
+ echo "\n${blue}==>${off} ${bold}Casks${off}\n${casks}"
+}
diff --git a/plugins/bundler/_bundler b/plugins/bundler/_bundler
index ba647ab80..51678dd7c 100644
--- a/plugins/bundler/_bundler
+++ b/plugins/bundler/_bundler
@@ -18,6 +18,7 @@ case $state in
"check[Determine whether the requirements for your application are installed]" \
"list[Show all of the gems in the current bundle]" \
"show[Show the source location of a particular gem in the bundle]" \
+ "info[Show details of a particular gem in the bundle]" \
"outdated[Show all of the outdated gems in the current bundle]" \
"console[Start an IRB session in the context of the current bundle]" \
"open[Open an installed gem in the editor]" \
@@ -84,7 +85,7 @@ case $state in
'(--verbose)--verbose[Enable verbose output mode]'
ret=0
;;
- (open|show)
+ (open|show|info)
_gems=( $(bundle show 2> /dev/null | sed -e '/^ \*/!d; s/^ \* \([^ ]*\) .*/\1/') )
if [[ $_gems != "" ]]; then
_values 'gems' $_gems && ret=0
diff --git a/plugins/cargo/README.md b/plugins/cargo/README.md
index 31bae4efe..93e69ae7f 100644
--- a/plugins/cargo/README.md
+++ b/plugins/cargo/README.md
@@ -1,11 +1,3 @@
# cargo
-This plugin adds completion for the Rust build tool [`Cargo`](https://github.com/rust-lang/cargo).
-
-To use it, add `cargo` to the plugins array in your zshrc file:
-
-```zsh
-plugins=(... cargo)
-```
-
-Updated on March 3rd, 2019, from [Cargo 0.34.0](https://github.com/rust-lang/cargo/releases/tag/0.34.0).
+**Deprecated: use the [`rust`](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/rust) plugin instead.**
diff --git a/plugins/cargo/cargo.plugin.zsh b/plugins/cargo/cargo.plugin.zsh
index 7082d2d55..e4b338207 100644
--- a/plugins/cargo/cargo.plugin.zsh
+++ b/plugins/cargo/cargo.plugin.zsh
@@ -1,23 +1,15 @@
-if (( $+commands[rustup] && $+commands[cargo] )); then
- # remove old generated completion file
- command rm -f "${0:A:h}/_cargo"
+print ${(%):-'%F{yellow}The `cargo` plugin is deprecated and has been moved to the `rust` plugin.'}
+print ${(%):-'Please update your .zshrc to use the `%Brust%b` plugin instead.%f'}
- # generate new completion file
- ver="$(cargo --version)"
- ver_file="$ZSH_CACHE_DIR/cargo_version"
- comp_file="$ZSH_CACHE_DIR/completions/_cargo"
+# TODO: 2021-12-28: remove this block
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+# Remove old generated completion file
+command rm -f "${0:A:h}/_cargo" "$ZSH_CACHE_DIR/cargo_version"
- mkdir -p "${comp_file:h}"
- (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
-
- if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
- rustup completions zsh cargo >| "$comp_file"
- echo "$ver" >| "$ver_file"
- fi
-
- declare -A _comps
- autoload -Uz _cargo
- _comps[cargo]=_cargo
-
- unset ver ver_file comp_file
-fi
+(( ${fpath[(Ie)$ZSH/plugins/rust]} )) || {
+ fpath=("$ZSH/plugins/rust" $fpath)
+ source "$ZSH/plugins/rust/rust.plugin.zsh"
+}
diff --git a/plugins/catimg/catimg.plugin.zsh b/plugins/catimg/catimg.plugin.zsh
index ca46444cc..f4ff6f856 100644
--- a/plugins/catimg/catimg.plugin.zsh
+++ b/plugins/catimg/catimg.plugin.zsh
@@ -2,7 +2,7 @@
# catimg script by Eduardo San Martin Morote aka Posva #
# https://posva.net #
# #
-# Ouput the content of an image to the stdout using the 256 colors of the #
+# Output the content of an image to the stdout using the 256 colors of the #
# terminal. #
# GitHub: https://github.com/posva/catimg #
################################################################################
diff --git a/plugins/catimg/catimg.sh b/plugins/catimg/catimg.sh
index 713a03291..f58392428 100644
--- a/plugins/catimg/catimg.sh
+++ b/plugins/catimg/catimg.sh
@@ -2,7 +2,7 @@
# catimg script by Eduardo San Martin Morote aka Posva #
# https://posva.net #
# #
-# Ouput the content of an image to the stdout using the 256 colors of the #
+# Output the content of an image to the stdout using the 256 colors of the #
# terminal. #
# GitHub: https://github.com/posva/catimg #
################################################################################
diff --git a/plugins/chruby/README.md b/plugins/chruby/README.md
index d373006a5..19eb15a8d 100644
--- a/plugins/chruby/README.md
+++ b/plugins/chruby/README.md
@@ -5,6 +5,7 @@ current Ruby version, and completion and a prompt function to display the Ruby v
Supports brew and manual installation of chruby.
To use it, add `chruby` to the plugins array in your zshrc file:
+
```zsh
plugins=(... chruby)
```
@@ -14,7 +15,7 @@ plugins=(... chruby)
If you'd prefer to specify an explicit path to load chruby from
you can set variables like so:
-```
+```zsh
zstyle :omz:plugins:chruby path /local/path/to/chruby.sh
zstyle :omz:plugins:chruby auto /local/path/to/auto.sh
```
diff --git a/plugins/chruby/chruby.plugin.zsh b/plugins/chruby/chruby.plugin.zsh
index 32f0525aa..d7a28d4e2 100644
--- a/plugins/chruby/chruby.plugin.zsh
+++ b/plugins/chruby/chruby.plugin.zsh
@@ -1,121 +1,94 @@
-#
-# INSTRUCTIONS
-#
-# With either a manual or brew installed chruby things should just work.
-#
-# If you'd prefer to specify an explicit path to load chruby from
-# you can set variables like so:
-#
-# zstyle :omz:plugins:chruby path /local/path/to/chruby.sh
-# zstyle :omz:plugins:chruby auto /local/path/to/auto.sh
-#
-# TODO
-# - autodetermine correct source path on non OS X systems
-# - completion if ruby-install exists
+## load chruby from different locations
+
+_source-from-omz-settings() {
+ local _chruby_path _chruby_auto
+
+ zstyle -s :omz:plugins:chruby path _chruby_path || return 1
+ zstyle -s :omz:plugins:chruby auto _chruby_auto || return 1
+
+ if [[ -r ${_chruby_path} ]]; then
+ source ${_chruby_path}
+ fi
+
+ if [[ -r ${_chruby_auto} ]]; then
+ source ${_chruby_auto}
+ fi
+}
+
+_source-from-homebrew() {
+ (( $+commands[brew] )) || return 1
+
+ local _brew_prefix
+ # check default brew prefix
+ if [[ -h /usr/local/opt/chruby ]];then
+ _brew_prefix="/usr/local/opt/chruby"
+ else
+ # ok , it is not default prefix
+ # this call to brew is expensive ( about 400 ms ), so at least let's make it only once
+ _brew_prefix=$(brew --prefix chruby)
+ fi
+
+ [[ -r "$_brew_prefix" ]] || return 1
+
+ source $_brew_prefix/share/chruby/chruby.sh
+ source $_brew_prefix/share/chruby/auto.sh
+}
+
+_load-chruby-dirs() {
+ local dir
+ for dir in "$HOME/.rubies" "$PREFIX/opt/rubies"; do
+ if [[ -d "$dir" ]]; then
+ RUBIES+=("$dir")
+ fi
+ done
+}
+
+# Load chruby
+if _source-from-omz-settings; then
+ _load-chruby-dirs
+elif [[ -r "/usr/local/share/chruby/chruby.sh" ]] ; then
+ source /usr/local/share/chruby/chruby.sh
+ source /usr/local/share/chruby/auto.sh
+ _load-chruby-dirs
+elif _source-from-homebrew; then
+ _load-chruby-dirs
+fi
+
+unfunction _source-from-homebrew _source-from-omz-settings _load-chruby-dirs
+
+
+## chruby utility functions and aliases
# rvm and rbenv plugins also provide this alias
alias rubies='chruby'
-
-_homebrew-installed() {
- whence brew &> /dev/null
- _xit=$?
- if [ $_xit -eq 0 ];then
- # ok , we have brew installed
- # speculatively we check default brew prefix
- if [ -h /usr/local/opt/chruby ];then
- _brew_prefix="/usr/local/opt/chruby"
- else
- # ok , it is not default prefix
- # this call to brew is expensive ( about 400 ms ), so at least let's make it only once
- _brew_prefix=$(brew --prefix chruby)
- fi
- return 0
- else
- return $_xit
- fi
-}
-
-_chruby-from-homebrew-installed() {
- [ -r $_brew_prefix ] &> /dev/null
-}
-
-_ruby-build_installed() {
- whence ruby-build &> /dev/null
-}
-
-_ruby-install-installed() {
- whence ruby-install &> /dev/null
-}
-
-# Simple definition completer for ruby-build
-if _ruby-build_installed; then
- _ruby-build() { compadd $(ruby-build --definitions) }
- compdef _ruby-build ruby-build
-fi
-
-_source_from_omz_settings() {
- local _chruby_path
- local _chruby_auto
-
- zstyle -s :omz:plugins:chruby path _chruby_path
- zstyle -s :omz:plugins:chruby auto _chruby_auto
-
- if [[ -r ${_chruby_path} ]]; then
- source ${_chruby_path}
- fi
-
- if [[ -r ${_chruby_auto} ]]; then
- source ${_chruby_auto}
- fi
-}
-
-_chruby_dirs() {
- chrubydirs=($HOME/.rubies/ $PREFIX/opt/rubies)
- for dir in chrubydirs; do
- if [[ -d $dir ]]; then
- RUBIES+=$dir
- fi
- done
-}
-
-if _homebrew-installed && _chruby-from-homebrew-installed ; then
- source $_brew_prefix/share/chruby/chruby.sh
- source $_brew_prefix/share/chruby/auto.sh
- _chruby_dirs
-elif [[ -r "/usr/local/share/chruby/chruby.sh" ]] ; then
- source /usr/local/share/chruby/chruby.sh
- source /usr/local/share/chruby/auto.sh
- _chruby_dirs
-else
- _source_from_omz_settings
- _chruby_dirs
-fi
-
-function ensure_chruby() {
- $(whence chruby)
-}
-
function current_ruby() {
- local _ruby
- _ruby="$(chruby |grep \* |tr -d '* ')"
- if [[ $(chruby |grep -c \*) -eq 1 ]]; then
- echo ${_ruby}
- else
- echo "system"
- fi
+ local ruby
+ ruby="$(chruby | grep \* | tr -d '* ')"
+ if [[ $(chruby | grep -c \*) -eq 1 ]]; then
+ echo ${ruby}
+ else
+ echo "system"
+ fi
}
function chruby_prompt_info() {
- echo "$(current_ruby)"
+ echo "${$(current_ruby):gs/%/%%}"
}
-# complete on installed rubies
+# Complete chruby command with installed rubies
_chruby() {
- compadd $(chruby | tr -d '* ')
- local default_path='/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin'
- if PATH=${default_path} type ruby &> /dev/null; then
- compadd system
- fi
+ compadd $(chruby | tr -d '* ')
+ if PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" command ruby &>/dev/null; then
+ compadd system
+ fi
}
+
compdef _chruby chruby
+
+
+# Simple definition completer for ruby-build
+if command ruby-build &> /dev/null; then
+ _ruby-build() { compadd $(ruby-build --definitions) }
+ compdef _ruby-build ruby-build
+fi
diff --git a/plugins/chucknorris/fortunes/chucknorris b/plugins/chucknorris/fortunes/chucknorris
index 6ba5bb9b5..9e36ce89a 100644
--- a/plugins/chucknorris/fortunes/chucknorris
+++ b/plugins/chucknorris/fortunes/chucknorris
@@ -228,7 +228,7 @@ Chuck Norris once punched the ground to stop an earthquake. The resulting afters
%
Chuck Norris once round-house kicked a salesman. Over the phone.
%
-Chuck Norris once rounhouse kicked a football. The astronomical society now considers it a planet.
+Chuck Norris once roundhouse kicked a football. The astronomical society now considers it a planet.
%
Chuck Norris once thought he was wrong. He was, however, mistaken.
%
@@ -342,7 +342,7 @@ Every time there's an earthquake, you know Chuck Norris is hungry. The earthquak
%
Evolution's driving mechanism is nature's desperate attempt to escape Chuck Norris.
%
-Fear of spiders is arachnaphobia. Fear of tight spaces is claustrophobia. Fear of Chuck Norris is called Logic.
+Fear of spiders is arachnophobia. Fear of tight spaces is claustrophobia. Fear of Chuck Norris is called Logic.
%
Fool me once, shame on you. Fool Chuck Norris once and he will roundhouse you in the face.
%
@@ -426,7 +426,7 @@ Some people ask for a Kleenex when they sneeze, Chuck Norris asks for a body bag
%
Someone once videotaped Chuck Norris getting pissed off. It was called Walker: Texas Chain Saw Massacre.
%
-Staring at Chuck Norris for extended periods of time without proper eye protection will cause blindess, and possibly foot sized brusies on the face.
+Staring at Chuck Norris for extended periods of time without proper eye protection will cause blindness, and possibly foot sized bruises on the face.
%
Taking Karate Lessons = $100, Buying MMA DVD's = $150, Subscribing to a UFC event = $50, Getting a Roundhouse Kick from Chuck Norris = PRICELESS.
%
@@ -452,7 +452,7 @@ The best part of waking up is not Folgers in your cup. it's knowing that Chuck N
%
The chief export of Chuck Norris is pain.
%
-The dictionary references Chuck Norris several times, he is metioned under Fear, Law, Order and Chucktatorship.
+The dictionary references Chuck Norris several times, he is mentioned under Fear, Law, Order and Chucktatorship.
%
The leading causes of death in the United States are: 1. Heart Disease 2. Chuck Norris 3. Cancer.
%
@@ -468,7 +468,7 @@ The only way sharks will come near CN underwater is when CN is inside of a cage.
%
The only word that rhymes with orange is Chuck Norris.
%
-The producers of the movie "The Last Airbender" are now in talks with Chuck Norris in Order to star him in their next sequal "The Last Skull Bender".
+The producers of the movie "The Last Airbender" are now in talks with Chuck Norris in Order to star him in their next sequel "The Last Skull Bender".
%
The quickest way to a man's heart is with Chuck Norris' fist.
%
diff --git a/plugins/colemak/colemak.plugin.zsh b/plugins/colemak/colemak.plugin.zsh
index 8d3393c44..e6a46f296 100644
--- a/plugins/colemak/colemak.plugin.zsh
+++ b/plugins/colemak/colemak.plugin.zsh
@@ -19,6 +19,11 @@ bindkey -a 'N' vi-join
bindkey -a 'j' vi-forward-word-end
bindkey -a 'J' vi-forward-blank-word-end
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
# New less versions will read this file directly
export LESSKEYIN="${0:h:A}/colemak-less"
diff --git a/plugins/colored-man-pages/colored-man-pages.plugin.zsh b/plugins/colored-man-pages/colored-man-pages.plugin.zsh
index 37faed672..981992d88 100644
--- a/plugins/colored-man-pages/colored-man-pages.plugin.zsh
+++ b/plugins/colored-man-pages/colored-man-pages.plugin.zsh
@@ -16,8 +16,13 @@ less_termcap[se]="${reset_color}"
less_termcap[us]="${fg_bold[green]}"
less_termcap[ue]="${reset_color}"
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
# Absolute path to this file's directory.
-typeset __colored_man_pages_dir="${0:A:h}"
+typeset -g __colored_man_pages_dir="${0:A:h}"
function colored() {
local -a environment
diff --git a/plugins/colorize/colorize.plugin.zsh b/plugins/colorize/colorize.plugin.zsh
index 8ea98f80a..a9da6cf83 100644
--- a/plugins/colorize/colorize.plugin.zsh
+++ b/plugins/colorize/colorize.plugin.zsh
@@ -82,7 +82,7 @@ colorize_less() {
# This variable tells less to pipe every file through the specified command
# (see the man page of less INPUT PREPROCESSOR).
# 'zsh -ic "colorize_cat %s 2> /dev/null"' would not work for huge files like
- # the ~/.zsh_history. For such files the tty of the preprocessor will be supended.
+ # the ~/.zsh_history. For such files the tty of the preprocessor will be suspended.
# Therefore we must source this file to make colorize_cat available in the
# preprocessor without the interactive mode.
# `2>/dev/null` will suppress the error for large files 'broken pipe' of the python
diff --git a/plugins/command-not-found/README.md b/plugins/command-not-found/README.md
index f267f0c89..5a373c537 100644
--- a/plugins/command-not-found/README.md
+++ b/plugins/command-not-found/README.md
@@ -29,5 +29,6 @@ It works out of the box with the command-not-found packages for:
- [Fedora](https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound)
- [NixOS](https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found)
- [Termux](https://github.com/termux/command-not-found)
+- [SUSE](https://www.unix.com/man-page/suse/1/command-not-found/)
You can add support for other platforms by submitting a Pull Request.
diff --git a/plugins/command-not-found/command-not-found.plugin.zsh b/plugins/command-not-found/command-not-found.plugin.zsh
index e46350604..cb8a8989c 100644
--- a/plugins/command-not-found/command-not-found.plugin.zsh
+++ b/plugins/command-not-found/command-not-found.plugin.zsh
@@ -60,3 +60,10 @@ if [[ -x /data/data/com.termux/files/usr/libexec/termux/command-not-found ]]; th
/data/data/com.termux/files/usr/libexec/termux/command-not-found "$1"
}
fi
+
+# SUSE and derivates: https://www.unix.com/man-page/suse/1/command-not-found/
+if [[ -x /usr/bin/command-not-found ]]; then
+ command_not_found_handler() {
+ /usr/bin/command-not-found "$1"
+ }
+fi
diff --git a/plugins/common-aliases/README.md b/plugins/common-aliases/README.md
index b6f34cb54..0354c7a3f 100644
--- a/plugins/common-aliases/README.md
+++ b/plugins/common-aliases/README.md
@@ -12,51 +12,53 @@ plugins=(... common-aliases)
### ls command
-| Alias | Command | Description |
-|-------|---------------|--------------------------------------------------------------------------------|
-| l | `ls -lFh` | List files as a long list, show size, type, human-readable |
-| la | `ls -lAFh` | List almost all files as a long list show size, type, human-readable |
-| lr | `ls -tRFh` | List files recursively sorted by date, show type, human-readable |
-| lt | `ls -ltFh` | List files as a long list sorted by date, show type, human-readable |
-| ll | `ls -l` | List files as a long list |
-| ldot | `ls -ld .*` | List dot files as a long list |
-| lS | `ls -1FSsh` | List files showing only size and name sorted by size |
-| lart | `ls -1Fcart` | List all files sorted in reverse of create/modification time (oldest first) |
-| lrt | `ls -1Fcrt` | List files sorted in reverse of create/modification time(oldest first) |
+| Alias | Command | Description |
+| ----- | ------------ | --------------------------------------------------------------------------- |
+| l | `ls -lFh` | List files as a long list, show size, type, human-readable |
+| la | `ls -lAFh` | List almost all files as a long list show size, type, human-readable |
+| lr | `ls -tRFh` | List files recursively sorted by date, show type, human-readable |
+| lt | `ls -ltFh` | List files as a long list sorted by date, show type, human-readable |
+| ll | `ls -l` | List files as a long list |
+| ldot | `ls -ld .*` | List dot files as a long list |
+| lS | `ls -1FSsh` | List files showing only size and name sorted by size |
+| lart | `ls -1Fcart` | List all files sorted in reverse of create/modification time (oldest first) |
+| lrt | `ls -1Fcrt` | List files sorted in reverse of create/modification time(oldest first) |
+| lsr | `ls -lARFh` | List all files and directories recursively |
+| lsn | `ls -1` | List files and directories in a single column |
### File handling
-| Alias | Command | Description |
-|-------|-----------------------|------------------------------------------------------------------------------------|
-| rm | `rm -i` | Remove a file |
-| cp | `cp -i` | Copy a file |
-| mv | `mv -i` | Move a file |
-| zshrc | `${=EDITOR} ~/.zshrc` | Quickly access the ~/.zshrc file |
-| dud | `du -d 1 -h` | Display the size of files at depth 1 in current location in human-readable form |
-| duf | `du -sh` | Display the size of files in current location in human-readable form |
-| t | `tail -f` | Shorthand for tail which outputs the last part of a file |
+| Alias | Command | Description |
+| ----- | --------------------- | ------------------------------------------------------------------------------- |
+| rm | `rm -i` | Remove a file |
+| cp | `cp -i` | Copy a file |
+| mv | `mv -i` | Move a file |
+| zshrc | `${=EDITOR} ~/.zshrc` | Quickly access the ~/.zshrc file |
+| dud | `du -d 1 -h` | Display the size of files at depth 1 in current location in human-readable form |
+| duf | `du -sh` | Display the size of files in current location in human-readable form |
+| t | `tail -f` | Shorthand for tail which outputs the last part of a file |
### find and grep
-| Alias | Command | Description |
-|-------|-----------------------------------------------------|-----------------------------------------|
-| fd\* | `find . -type d -name` | Find a directory with the given name |
-| ff | `find . -type f -name` | Find a file with the given name |
-| grep | `grep --color` | Searches for a query string |
-| sgrep | `grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS}` | Useful for searching within files |
+| Alias | Command | Description |
+| ----- | -------------------------------------------------- | ------------------------------------ |
+| fd\* | `find . -type d -name` | Find a directory with the given name |
+| ff | `find . -type f -name` | Find a file with the given name |
+| grep | `grep --color` | Searches for a query string |
+| sgrep | `grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS}` | Useful for searching within files |
\* Only if the [`fd`](https://github.com/sharkdp/fd) command isn't installed.
### Other Aliases
-| Alias | Command | Description |
-|-----------|---------------------|-------------------------------------------------------------|
-| h | `history` | Lists all recently used commands |
-| hgrep | `fc -El 0 \| grep` | Searches for a word in the list of previously used commands |
-| help | `man` | Opens up the man page for a command |
-| p | `ps -f` | Displays currently executing processes |
-| sortnr | `sort -n -r` | Used to sort the lines of a text file |
-| unexport | `unset` | Used to unset an environment variable |
+| Alias | Command | Description |
+| -------- | ------------------ | ----------------------------------------------------------- |
+| h | `history` | Lists all recently used commands |
+| hgrep | `fc -El 0 \| grep` | Searches for a word in the list of previously used commands |
+| help | `man` | Opens up the man page for a command |
+| p | `ps -f` | Displays currently executing processes |
+| sortnr | `sort -n -r` | Used to sort the lines of a text file |
+| unexport | `unset` | Used to unset an environment variable |
## Global aliases
@@ -77,7 +79,7 @@ $ find . -type f 2>/dev/null
```
| Alias | Command | Description |
-|-------|-----------------------------|-------------------------------------------------------------|
+| ----- | --------------------------- | ----------------------------------------------------------- |
| H | `\| head` | Pipes output to head which outputs the first part of a file |
| T | `\| tail` | Pipes output to tail which outputs the last part of a file |
| G | `\| grep` | Pipes output to grep to search for some word |
@@ -97,23 +99,23 @@ that file will be open with `acroread`.
### Reading Docs
-| Alias | Command | Description |
-|-------|-------------|-------------------------------------|
-| pdf | `acroread` | Opens up a document using acroread |
-| ps | `gv` | Opens up a .ps file using gv |
-| dvi | `xdvi` | Opens up a .dvi file using xdvi |
-| chm | `xchm` | Opens up a .chm file using xchm |
-| djvu | `djview` | Opens up a .djvu file using djview |
+| Alias | Command | Description |
+| ----- | ---------- | ---------------------------------- |
+| pdf | `acroread` | Opens up a document using acroread |
+| ps | `gv` | Opens up a .ps file using gv |
+| dvi | `xdvi` | Opens up a .dvi file using xdvi |
+| chm | `xchm` | Opens up a .chm file using xchm |
+| djvu | `djview` | Opens up a .djvu file using djview |
### Listing files inside a packed file
-| Alias | Command | Description |
-|---------|-------------|-------------------------------------|
-| zip | `unzip -l` | Lists files inside a .zip file |
-| rar | `unrar l` | Lists files inside a .rar file |
-| tar | `tar tf` | Lists files inside a .tar file |
-| tar.gz | `echo` | Lists files inside a .tar.gz file |
-| ace | `unace l` | Lists files inside a .ace file |
+| Alias | Command | Description |
+| ------ | ---------- | --------------------------------- |
+| zip | `unzip -l` | Lists files inside a .zip file |
+| rar | `unrar l` | Lists files inside a .rar file |
+| tar | `tar tf` | Lists files inside a .tar file |
+| tar.gz | `echo` | Lists files inside a .tar.gz file |
+| ace | `unace l` | Lists files inside a .ace file |
### Some other features
diff --git a/plugins/common-aliases/common-aliases.plugin.zsh b/plugins/common-aliases/common-aliases.plugin.zsh
index 4e5ff848f..8b58b6310 100644
--- a/plugins/common-aliases/common-aliases.plugin.zsh
+++ b/plugins/common-aliases/common-aliases.plugin.zsh
@@ -12,6 +12,8 @@ alias ldot='ls -ld .*'
alias lS='ls -1FSsh'
alias lart='ls -1Fcart'
alias lrt='ls -1Fcrt'
+alias lsr='ls -lARFh' #Recursive list of files and directories
+alias lsn='ls -1' #A column contains name of files and directories
alias zshrc='${=EDITOR} ${ZDOTDIR:-$HOME}/.zshrc' # Quick access to the .zshrc file
diff --git a/plugins/composer/README.md b/plugins/composer/README.md
index 7a5f7256e..ad6ed24bc 100644
--- a/plugins/composer/README.md
+++ b/plugins/composer/README.md
@@ -10,22 +10,26 @@ To use it add `composer` to the plugins array in your zshrc file.
plugins=(... composer)
```
+Original author: Daniel Gomes
+
## Aliases
-| Alias | Command | Description |
-| ------ | ------------------------------------------- | --------------------------------------------------------------------------------------- |
-| `c` | `composer` | Starts composer |
-| `csu` | `composer self-update` | Updates composer to the latest version |
-| `cu` | `composer update` | Updates composer dependencies and `composer.lock` file |
-| `cr` | `composer require` | Adds new packages to `composer.json` |
-| `crm` | `composer remove` | Removes packages from `composer.json` |
-| `ci` | `composer install` | Resolves and installs dependencies from `composer.json` |
-| `ccp` | `composer create-project` | Create new project from an existing package |
-| `cdu` | `composer dump-autoload` | Updates the autoloader |
-| `cdo` | `composer dump-autoload -o` | Converts PSR-0/4 autoloading to classmap for a faster autoloader (good for production) |
-| `cgu` | `composer global update` | Allows update command to run on COMPOSER_HOME directory |
-| `cgr` | `composer global require` | Allows require command to run on COMPOSER_HOME directory |
-| `cgrm` | `composer global remove` | Allows remove command to run on COMPOSER_HOME directory |
-| `cget` | `curl -s https://getcomposer.org/installer` | Installs composer in the current directory |
-| `co` | `composer outdated` | Shows a list of installed packages with available updates |
-| `cod` | `composer outdated --direct` | Shows a list of installed packages with available updates which are direct dependencies |
+| Alias | Command | Description |
+| ------ | ---------------------------------- | --------------------------------------------------------------------------------------- |
+| `c` | `composer` | Starts composer |
+| `ccp` | `composer create-project` | Create new project from an existing package |
+| `cdo` | `composer dump-autoload -o` | Converts PSR-0/4 autoloading to classmap for a faster autoloader (good for production) |
+| `cdu` | `composer dump-autoload` | Updates the autoloader |
+| `cget` | `curl -s \| php` | Installs composer in the current directory |
+| `cgr` | `composer global require` | Allows require command to run on COMPOSER_HOME directory |
+| `cgrm` | `composer global remove` | Allows remove command to run on COMPOSER_HOME directory |
+| `cgu` | `composer global update` | Allows update command to run on COMPOSER_HOME directory |
+| `ci` | `composer install` | Resolves and installs dependencies from `composer.json` |
+| `co` | `composer outdated` | Shows a list of installed packages with available updates |
+| `cod` | `composer outdated --direct` | Shows a list of installed packages with available updates which are direct dependencies |
+| `cr` | `composer require` | Adds new packages to `composer.json` |
+| `crm` | `composer remove` | Removes packages from `composer.json` |
+| `cs` | `composer show` | Lists available packages, with optional filtering |
+| `csu` | `composer self-update` | Updates composer to the latest version |
+| `cu` | `composer update` | Updates composer dependencies and `composer.lock` file |
+| `cuh` | `composer update -d ` | Updates globally installed packages |
diff --git a/plugins/composer/composer.plugin.zsh b/plugins/composer/composer.plugin.zsh
index 218a13e5f..dd0b18e27 100644
--- a/plugins/composer/composer.plugin.zsh
+++ b/plugins/composer/composer.plugin.zsh
@@ -1,70 +1,76 @@
-# ------------------------------------------------------------------------------
-# FILE: composer.plugin.zsh
-# DESCRIPTION: oh-my-zsh composer plugin file.
-# AUTHOR: Daniel Gomes (me@danielcsgomes.com)
-# VERSION: 1.0.0
-# ------------------------------------------------------------------------------
-
-# Composer basic command completion
-_composer_get_command_list () {
- $_comp_command1 --no-ansi 2>/dev/null | sed "1,/Available commands/d" | awk '/^[ \t]*[a-z]+/ { print $1 }'
-}
-
-_composer_get_required_list () {
- $_comp_command1 show -s --no-ansi 2>/dev/null | sed '1,/requires/d' | awk 'NF > 0 && !/^requires \(dev\)/{ print $1 }'
-}
-
-_composer () {
+## Basic Composer command completion
+# Since Zsh 5.7, an improved composer command completion is provided
+if ! is-at-least 5.7; then
+ _composer () {
local curcontext="$curcontext" state line
typeset -A opt_args
- _arguments \
- '*:: :->subcmds'
+ _arguments '*:: :->subcmds'
- if (( CURRENT == 1 )) || ( ((CURRENT == 2)) && [ "$words[1]" = "global" ] ) ; then
- compadd $(_composer_get_command_list)
+ if (( CURRENT == 1 )) || ( (( CURRENT == 2 )) && [[ "$words[1]" = "global" ]] ); then
+ # Command list
+ local -a subcmds
+ subcmds=("${(@f)"$($_comp_command1 --no-ansi 2>/dev/null | awk '
+ /Available commands/{ r=1 }
+ r == 1 && /^[ \t]*[a-z]+/{
+ gsub(/^[ \t]+/, "")
+ gsub(/ +/, ":")
+ print $0
+ }
+ ')"}")
+ _describe -t commands 'composer command' subcmds
else
- compadd $(_composer_get_required_list)
+ # Required list
+ compadd $($_comp_command1 show -s --no-ansi 2>/dev/null \
+ | sed '1,/requires/d' \
+ | awk 'NF > 0 && !/^requires \(dev\)/{ print $1 }')
fi
-}
+ }
-compdef _composer composer
-compdef _composer composer.phar
+ compdef _composer composer
+ compdef _composer composer.phar
+fi
-# Aliases
+
+## Aliases
alias c='composer'
-alias csu='composer self-update'
-alias cu='composer update'
-alias cr='composer require'
-alias crm='composer remove'
-alias ci='composer install'
alias ccp='composer create-project'
-alias cdu='composer dump-autoload'
alias cdo='composer dump-autoload -o'
-alias cgu='composer global update'
+alias cdu='composer dump-autoload'
+alias cget='curl -s https://getcomposer.org/installer | php'
alias cgr='composer global require'
alias cgrm='composer global remove'
+alias cgu='composer global update'
+alias ci='composer install'
alias co='composer outdated'
alias cod='composer outdated --direct'
+alias cr='composer require'
+alias crm='composer remove'
+alias cs='composer show'
+alias csu='composer self-update'
+alias cu='composer update'
+alias cuh='composer update --working-dir=$(composer config -g home)'
-# install composer in the current directory
-alias cget='curl -s https://getcomposer.org/installer | php'
-# Add Composer's global binaries to PATH, using Composer if available.
-if (( $+commands[composer] )); then
- autoload -Uz _store_cache _retrieve_cache _cache_invalid
+## If Composer not found, try to add known directories to $PATH
+if (( ! $+commands[composer] )); then
+ [[ -d "$HOME/.composer/vendor/bin" ]] && export PATH="$PATH:$HOME/.composer/vendor/bin"
+ [[ -d "$HOME/.config/composer/vendor/bin" ]] && export PATH="$PATH:$HOME/.config/composer/vendor/bin"
- _retrieve_cache composer
-
- if [[ -z $__composer_bin_dir ]]; then
- __composer_bin_dir=$(composer global config bin-dir --absolute 2>/dev/null)
- _store_cache composer __composer_bin_dir
- fi
-
- # Add Composer's global binaries to PATH
- export PATH="$PATH:$__composer_bin_dir"
-
- unset __composer_bin_dir
-else
- [ -d $HOME/.composer/vendor/bin ] && export PATH=$PATH:$HOME/.composer/vendor/bin
- [ -d $HOME/.config/composer/vendor/bin ] && export PATH=$PATH:$HOME/.config/composer/vendor/bin
+ # If still not found, don't do the rest of the script
+ (( $+commands[composer] )) || return 0
fi
+
+
+## Add Composer's global binaries to PATH
+autoload -Uz _store_cache _retrieve_cache _cache_invalid
+_retrieve_cache composer
+
+if [[ -z $__composer_bin_dir ]]; then
+ __composer_bin_dir=$(composer global config bin-dir --absolute 2>/dev/null)
+ _store_cache composer __composer_bin_dir
+fi
+
+# Add Composer's global binaries to PATH
+export PATH="$PATH:$__composer_bin_dir"
+
+unset __composer_bin_dir
diff --git a/plugins/cpanm/_cpanm b/plugins/cpanm/_cpanm
index ff9ae1c15..f328dd997 100644
--- a/plugins/cpanm/_cpanm
+++ b/plugins/cpanm/_cpanm
@@ -36,7 +36,7 @@ arguments=(
'--reinstall[Reinstall the distribution even if you already have the latest version installed]'
'--interactive[Turn on interactive configure]'
- '--scandeps[Scan the depencencies of given modules and output the tree in a text format]'
+ '--scandeps[Scan the dependencies of given modules and output the tree in a text format]'
'--format[Specify what format to display the scanned dependency tree]:scandeps format:(tree json yaml dists)'
'--save-dists[Specify the optional directory path to copy downloaded tarballs]'
diff --git a/plugins/debian/README.md b/plugins/debian/README.md
index 922d68cb3..2ce206cfb 100644
--- a/plugins/debian/README.md
+++ b/plugins/debian/README.md
@@ -33,20 +33,22 @@ Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh
| Alias | Command | Description |
| -------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| `aac` | `sudo $apt_pref autoclean` | Clears out the local repository of retrieved package files |
+| `aar` | `sudo $apt_pref autoremove` | Removes packages installed automatically that are no longer needed |
| `abd` | `sudo $apt_pref build-dep` | Installs all dependencies for building packages |
| `ac` | `sudo $apt_pref clean` | Clears out the local repository of retrieved package files except lock files |
| `ad` | `sudo $apt_pref update` | Updates the package lists for upgrades for packages |
| `adg` | `sudo $apt_pref update && sudo $apt_pref $apt_upgr` | Update and upgrade packages |
+| `ads` | `sudo apt-get dselect-upgrade` | Installs packages from list and removes all not in the list |
| `adu` | `sudo $apt_pref update && sudo $apt_pref dist-upgrade` | Smart upgrade that handles dependencies |
| `afu` | `sudo apt-file update` | Update the files in packages |
-| `au` | `sudo $apt_pref $apt_upgr` | Install package upgrades |
| `ai` | `sudo $apt_pref install` | Command-line tool to install package |
| `ail` | `sed -e 's/ */ /g' -e 's/ *//' \| cut -s -d ' ' -f 1 \| xargs sudo $apt_pref install` | Install all packages given on the command line while using only the first word of each line |
+| `alu` | `sudo apt update && apt list -u && sudo apt upgrade` | Update, list and upgrade packages |
| `ap` | `sudo $apt_pref purge` | Removes packages along with configuration files |
| `ar` | `sudo $apt_pref remove` | Removes packages, keeps the configuration files |
-| `ads` | `sudo apt-get dselect-upgrade` | Installs packages from list and removes all not in the list |
-| `dia` | `sudo dpkg -i ./*.deb` | Install all .deb files in the current directory |
+| `au` | `sudo $apt_pref $apt_upgr` | Install package upgrades |
| `di` | `sudo dpkg -i` | Install all .deb files in the current directory |
+| `dia` | `sudo dpkg -i ./*.deb` | Install all .deb files in the current directory |
| `kclean` | `sudo aptitude remove -P ?and(~i~nlinux-(ima\|hea) ?not(~n$(uname -r)))` | Remove ALL kernel images and headers EXCEPT the one in use |
## Aliases - Commands using `su`
@@ -54,6 +56,7 @@ Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh
| Alias | Command |
| ----- | --------------------------------------------------------- |
| `aac` | `su -ls "$apt_pref autoclean" root` |
+| `aar` | `su -ls "$apt_pref autoremove" root` |
| `ac` | `su -ls "$apt_pref clean" root` |
| `ad` | `su -lc "$apt_pref update" root` |
| `adg` | `su -lc "$apt_pref update && aptitude $apt_upgr" root` |
@@ -75,8 +78,8 @@ Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh
| ------------------- | --------------------------------------------------------------- |
| `apt-copy` | Create a simple script that can be used to 'duplicate' a system |
| `apt-history` | Displays apt history for a command |
-| `kerndeb` | Builds kernel packages |
| `apt-list-packages` | List packages by size |
+| `kerndeb` | Builds kernel packages |
## Authors
diff --git a/plugins/debian/debian.plugin.zsh b/plugins/debian/debian.plugin.zsh
index bde97cd30..e4db8fe33 100644
--- a/plugins/debian/debian.plugin.zsh
+++ b/plugins/debian/debian.plugin.zsh
@@ -52,13 +52,18 @@ if [[ $use_sudo -eq 1 ]]; then
alias ai="sudo $apt_pref install"
# Install all packages given on the command line while using only the first word of each line:
# acs ... | ail
+
alias ail="sed -e 's/ */ /g' -e 's/ *//' | cut -s -d ' ' -f 1 | xargs sudo $apt_pref install"
alias ap="sudo $apt_pref purge"
alias ar="sudo $apt_pref remove"
+ alias aar="sudo $apt_pref autoremove"
# apt-get only
alias ads="sudo apt-get dselect-upgrade"
+ # apt only
+ alias alu="sudo apt update && apt list -u && sudo apt upgrade"
+
# Install all .deb files in the current directory.
# Warning: you will need to put the glob in single quotes if you use:
# glob_subst
@@ -98,7 +103,11 @@ else
print "$cmd"
eval "$cmd"
}
-
+ function aar() {
+ cmd="su -lc '$apt_pref -P autoremove $@' root"
+ print "$cmd"
+ eval "$cmd"
+ }
# Install all .deb files in the current directory
# Assumes glob_subst is off
alias dia='su -lc "dpkg -i ./*.deb" root'
@@ -139,6 +148,7 @@ apt_pref_compdef ai "install"
apt_pref_compdef ail "install"
apt_pref_compdef ap "purge"
apt_pref_compdef ar "remove"
+apt_pref_compdef aar "autoremove"
apt_pref_compdef ads "dselect-upgrade"
# Misc. #####################################################################
diff --git a/plugins/deno/README.md b/plugins/deno/README.md
index 828e6af39..691318397 100644
--- a/plugins/deno/README.md
+++ b/plugins/deno/README.md
@@ -13,6 +13,7 @@ This plugin sets up completion and aliases for [Deno](https://deno.land).
| dh | deno help |
| dli | deno lint |
| drn | deno run |
+| drA | deno run -A |
| drw | deno run --watch |
| dts | deno test |
| dup | deno upgrade |
diff --git a/plugins/deno/deno.plugin.zsh b/plugins/deno/deno.plugin.zsh
index 34adddc37..6c12bae13 100644
--- a/plugins/deno/deno.plugin.zsh
+++ b/plugins/deno/deno.plugin.zsh
@@ -6,30 +6,35 @@ alias dfmt='deno fmt'
alias dh='deno help'
alias dli='deno lint'
alias drn='deno run'
+alias drA='deno run -A'
alias drw='deno run --watch'
alias dts='deno test'
alias dup='deno upgrade'
# COMPLETION FUNCTION
-if (( $+commands[deno] )); then
- # remove old generated completion file
- command rm -f "${0:A:h}/_deno"
+if (( ! $+commands[deno] )); then
+ return
+fi
- ver="$(deno --version)"
- ver_file="$ZSH_CACHE_DIR/deno_version"
- comp_file="$ZSH_CACHE_DIR/completions/_deno"
+# TODO: 2021-12-28: remove this block
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+# Remove old generated files
+command rm -f "${0:A:h}/_deno" "$ZSH_CACHE_DIR/deno_version"
- mkdir -p "${comp_file:h}"
- (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
+# TODO: 2021-12-28: remove this bit of code as it exists in oh-my-zsh.sh
+# Add completions folder in $ZSH_CACHE_DIR
+command mkdir -p "$ZSH_CACHE_DIR/completions"
+(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
- if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
- deno completions zsh >| "$comp_file"
- echo "$ver" >| "$ver_file"
- fi
-
- declare -A _comps
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `deno`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_deno" ]]; then
+ typeset -g -A _comps
autoload -Uz _deno
_comps[deno]=_deno
-
- unset ver ver_file comp_file
fi
+
+deno completions zsh >| "$ZSH_CACHE_DIR/completions/_deno" &|
diff --git a/plugins/dirhistory/dirhistory.plugin.zsh b/plugins/dirhistory/dirhistory.plugin.zsh
index 9f39264cf..7021fc03a 100644
--- a/plugins/dirhistory/dirhistory.plugin.zsh
+++ b/plugins/dirhistory/dirhistory.plugin.zsh
@@ -19,14 +19,14 @@ export DIRHISTORY_SIZE=30
# Returns the element if the array was not empty,
# otherwise returns empty string.
function pop_past() {
- print -v $1 "${dirhistory_past[$#dirhistory_past]}"
+ typeset -g $1="${dirhistory_past[$#dirhistory_past]}"
if [[ $#dirhistory_past -gt 0 ]]; then
dirhistory_past[$#dirhistory_past]=()
fi
}
function pop_future() {
- print -v $1 "${dirhistory_future[$#dirhistory_future]}"
+ typeset -g $1="${dirhistory_future[$#dirhistory_future]}"
if [[ $#dirhistory_future -gt 0 ]]; then
dirhistory_future[$#dirhistory_future]=()
fi
@@ -121,31 +121,39 @@ function dirhistory_zle_dirhistory_future() {
}
zle -N dirhistory_zle_dirhistory_back
-bindkey "\e[3D" dirhistory_zle_dirhistory_back # xterm in normal mode
-bindkey "\e[1;3D" dirhistory_zle_dirhistory_back # xterm in normal mode
-bindkey "\e\e[D" dirhistory_zle_dirhistory_back # Putty
-bindkey "\eO3D" dirhistory_zle_dirhistory_back # GNU screen
-case "$TERM_PROGRAM" in
-iTerm.app) bindkey "^[^[[D" dirhistory_zle_dirhistory_back ;; # iTerm2
-Apple_Terminal) bindkey "^[b" dirhistory_zle_dirhistory_back ;; # Terminal.app
-esac
-if (( ${+terminfo[kcub1]} )); then
- bindkey "^[${terminfo[kcub1]}" dirhistory_zle_dirhistory_back # urxvt
-fi
-
zle -N dirhistory_zle_dirhistory_future
-bindkey "\e[3C" dirhistory_zle_dirhistory_future # xterm in normal mode
-bindkey "\e[1;3C" dirhistory_zle_dirhistory_future # xterm in normal mode
-bindkey "\e\e[C" dirhistory_zle_dirhistory_future # Putty
-bindkey "\eO3C" dirhistory_zle_dirhistory_future # GNU screen
-case "$TERM_PROGRAM" in
-iTerm.app) bindkey "^[^[[C" dirhistory_zle_dirhistory_future ;; # iTerm2
-Apple_Terminal) bindkey "^[f" dirhistory_zle_dirhistory_future ;; # Terminal.app
-esac
-if (( ${+terminfo[kcuf1]} )); then
- bindkey "^[${terminfo[kcuf1]}" dirhistory_zle_dirhistory_future # urxvt
-fi
+for keymap in emacs vicmd viins; do
+ # dirhistory_back
+ bindkey -M $keymap "\e[3D" dirhistory_zle_dirhistory_back # xterm in normal mode
+ bindkey -M $keymap "\e[1;3D" dirhistory_zle_dirhistory_back # xterm in normal mode
+ bindkey -M $keymap "\e\e[D" dirhistory_zle_dirhistory_back # Putty
+ bindkey -M $keymap "\eO3D" dirhistory_zle_dirhistory_back # GNU screen
+
+ case "$TERM_PROGRAM" in
+ Apple_Terminal) bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back ;; # Terminal.app
+ iTerm.app) bindkey -M $keymap "^[^[[D" dirhistory_zle_dirhistory_back ;; # iTerm2
+ esac
+
+ if (( ${+terminfo[kcub1]} )); then
+ bindkey -M $keymap "^[${terminfo[kcub1]}" dirhistory_zle_dirhistory_back # urxvt
+ fi
+
+ # dirhistory_future
+ bindkey -M $keymap "\e[3C" dirhistory_zle_dirhistory_future # xterm in normal mode
+ bindkey -M $keymap "\e[1;3C" dirhistory_zle_dirhistory_future # xterm in normal mode
+ bindkey -M $keymap "\e\e[C" dirhistory_zle_dirhistory_future # Putty
+ bindkey -M $keymap "\eO3C" dirhistory_zle_dirhistory_future # GNU screen
+
+ case "$TERM_PROGRAM" in
+ Apple_Terminal) bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future ;; # Terminal.app
+ iTerm.app) bindkey -M $keymap "^[^[[C" dirhistory_zle_dirhistory_future ;; # iTerm2
+ esac
+
+ if (( ${+terminfo[kcuf1]} )); then
+ bindkey -M $keymap "^[${terminfo[kcuf1]}" dirhistory_zle_dirhistory_future # urxvt
+ fi
+done
#
# HIERARCHY Implemented in this section, in case someone wants to split it to another plugin if it clashes bindings
@@ -176,27 +184,38 @@ function dirhistory_zle_dirhistory_down() {
}
zle -N dirhistory_zle_dirhistory_up
-bindkey "\e[3A" dirhistory_zle_dirhistory_up # xterm in normal mode
-bindkey "\e[1;3A" dirhistory_zle_dirhistory_up # xterm in normal mode
-bindkey "\e\e[A" dirhistory_zle_dirhistory_up # Putty
-bindkey "\eO3A" dirhistory_zle_dirhistory_up # GNU screen
-case "$TERM_PROGRAM" in
-iTerm.app) bindkey "^[^[[A" dirhistory_zle_dirhistory_up ;; # iTerm2
-Apple_Terminal) bindkey "^[[A" dirhistory_zle_dirhistory_up ;; # Terminal.app
-esac
-if (( ${+terminfo[kcuu1]} )); then
- bindkey "^[${terminfo[kcuu1]}" dirhistory_zle_dirhistory_up # urxvt
-fi
-
zle -N dirhistory_zle_dirhistory_down
-bindkey "\e[3B" dirhistory_zle_dirhistory_down # xterm in normal mode
-bindkey "\e[1;3B" dirhistory_zle_dirhistory_down # xterm in normal mode
-bindkey "\e\e[B" dirhistory_zle_dirhistory_down # Putty
-bindkey "\eO3B" dirhistory_zle_dirhistory_down # GNU screen
-case "$TERM_PROGRAM" in
-iTerm.app) bindkey "^[^[[B" dirhistory_zle_dirhistory_down ;; # iTerm2
-Apple_Terminal) bindkey "^[[B" dirhistory_zle_dirhistory_down ;; # Terminal.app
-esac
-if (( ${+terminfo[kcud1]} )); then
- bindkey "^[${terminfo[kcud1]}" dirhistory_zle_dirhistory_down # urxvt
-fi
+
+for keymap in emacs vicmd viins; do
+ # dirhistory_up
+ bindkey -M $keymap "\e[3A" dirhistory_zle_dirhistory_up # xterm in normal mode
+ bindkey -M $keymap "\e[1;3A" dirhistory_zle_dirhistory_up # xterm in normal mode
+ bindkey -M $keymap "\e\e[A" dirhistory_zle_dirhistory_up # Putty
+ bindkey -M $keymap "\eO3A" dirhistory_zle_dirhistory_up # GNU screen
+
+ case "$TERM_PROGRAM" in
+ Apple_Terminal) bindkey -M $keymap "^[[A" dirhistory_zle_dirhistory_up ;; # Terminal.app
+ iTerm.app) bindkey -M $keymap "^[^[[A" dirhistory_zle_dirhistory_up ;; # iTerm2
+ esac
+
+ if (( ${+terminfo[kcuu1]} )); then
+ bindkey -M $keymap "^[${terminfo[kcuu1]}" dirhistory_zle_dirhistory_up # urxvt
+ fi
+
+ # dirhistory_down
+ bindkey -M $keymap "\e[3B" dirhistory_zle_dirhistory_down # xterm in normal mode
+ bindkey -M $keymap "\e[1;3B" dirhistory_zle_dirhistory_down # xterm in normal mode
+ bindkey -M $keymap "\e\e[B" dirhistory_zle_dirhistory_down # Putty
+ bindkey -M $keymap "\eO3B" dirhistory_zle_dirhistory_down # GNU screen
+
+ case "$TERM_PROGRAM" in
+ Apple_Terminal) bindkey -M $keymap "^[[B" dirhistory_zle_dirhistory_down ;; # Terminal.app
+ iTerm.app) bindkey -M $keymap "^[^[[B" dirhistory_zle_dirhistory_down ;; # iTerm2
+ esac
+
+ if (( ${+terminfo[kcud1]} )); then
+ bindkey -M $keymap "^[${terminfo[kcud1]}" dirhistory_zle_dirhistory_down # urxvt
+ fi
+done
+
+unset keymap
diff --git a/plugins/docker-machine/_docker-machine b/plugins/docker-machine/_docker-machine
index 7c19ba8e7..fbd36d7c6 100644
--- a/plugins/docker-machine/_docker-machine
+++ b/plugins/docker-machine/_docker-machine
@@ -90,7 +90,7 @@ __docker-machine_filters() {
}
__get_swarm_discovery() {
- declare -a masters serivces
+ declare -a masters services
local service
services=()
masters=($(docker-machine ls -f {{.Swarm}} |grep '(master)' |awk '{print $1}'))
@@ -169,7 +169,7 @@ __get_create_argument() {
__docker-machine_subcommand() {
local -a opts_help
opts_help=("(- :)--help[Print usage]")
- local -a opts_only_host opts_driver opts_storage_driver opts_stragery
+ local -a opts_only_host opts_driver opts_storage_driver opts_state
opts_only_host=(
"$opts_help"
"*:host:__docker-machine_hosts_all"
@@ -330,7 +330,7 @@ _docker-machine() {
_arguments -C \
"(- :)"{-h,--help}"[Show help]" \
"(-D --debug)"{-D,--debug}"[Enable debug mode]" \
- '(-s --stroage-path)'{-s,--storage-path}'[Configures storage path]:file:_files' \
+ '(-s --storage-path)'{-s,--storage-path}'[Configures storage path]:file:_files' \
'--tls-ca-cert[CA to verify remotes against]:file:_files' \
'--tls-ca-key[Private key to generate certificates]:file:_files' \
'--tls-client-cert[Client cert to use for TLS]:file:_files' \
diff --git a/plugins/dotenv/dotenv.plugin.zsh b/plugins/dotenv/dotenv.plugin.zsh
index 40ec5c46f..394455ae1 100644
--- a/plugins/dotenv/dotenv.plugin.zsh
+++ b/plugins/dotenv/dotenv.plugin.zsh
@@ -23,12 +23,12 @@ source_env() {
touch "$ZSH_DOTENV_DISALLOWED_LIST"
# early return if disallowed
- if command grep -q "$dirpath" "$ZSH_DOTENV_DISALLOWED_LIST" &>/dev/null; then
+ if command grep -Fx -q "$dirpath" "$ZSH_DOTENV_DISALLOWED_LIST" &>/dev/null; then
return
fi
# check if current directory's .env file is allowed or ask for confirmation
- if ! command grep -q "$dirpath" "$ZSH_DOTENV_ALLOWED_LIST" &>/dev/null; then
+ if ! command grep -Fx -q "$dirpath" "$ZSH_DOTENV_ALLOWED_LIST" &>/dev/null; then
# get cursor column and print new line before prompt if not at line beginning
local column
echo -ne "\e[6n" > /dev/tty
diff --git a/plugins/dotnet/README.md b/plugins/dotnet/README.md
index 7554b4e3c..87dfd8f8d 100644
--- a/plugins/dotnet/README.md
+++ b/plugins/dotnet/README.md
@@ -21,3 +21,4 @@ plugins=(... dotnet)
| da | dotnet add | Add a package or reference to a .NET project. |
| dp | dotnet pack | Create a NuGet package. |
| dng | dotnet nuget | Provides additional NuGet commands. |
+| db | dotnet build | Build a .NET project |
diff --git a/plugins/dotnet/dotnet.plugin.zsh b/plugins/dotnet/dotnet.plugin.zsh
index 6bd4b7af8..8ea31cdbd 100644
--- a/plugins/dotnet/dotnet.plugin.zsh
+++ b/plugins/dotnet/dotnet.plugin.zsh
@@ -12,7 +12,7 @@ _dotnet_zsh_complete()
return
fi
- # This is not a variable assigment, don't remove spaces!
+ # This is not a variable assignment, don't remove spaces!
_values = "${(ps:\n:)completions}"
}
@@ -30,3 +30,4 @@ alias ds='dotnet sln'
alias da='dotnet add'
alias dp='dotnet pack'
alias dng='dotnet nuget'
+alias db='dotnet build'
diff --git a/plugins/drush/README.md b/plugins/drush/README.md
index df7b82bdd..29b429e3b 100644
--- a/plugins/drush/README.md
+++ b/plugins/drush/README.md
@@ -1,83 +1,66 @@
# Drush
-## Description
-This plugin offers aliases and functions to make the work with drush easier and more productive.
+This plugin adds aliases and functions for [Drush](https://www.drush.org), a command-line shell
+and Unix scripting interface for Drupal. It also adds completion for the `drush` command.
-To enable it, add the `drush` to your `plugins` array in `~/.zshrc`:
+To enable it, add `drush` to the plugins array in zshrc file:
-```
+```zsh
plugins=(... drush)
```
## Aliases
-| Alias | Description | Command |
-|-------|-----------------------------------------------------------------------|-----------------------------|
-| dr | Display drush help | drush |
-| drca | Clear all drupal caches. | drush cc all |
-| drcb | Clear block cache. | drush cc block |
-| drcg | Clear registry cache. | drush cc registry |
-| drcj | Clear css-js cache. | drush cc css-js |
-| drcm | Clear menu cache. | drush cc menu |
-| drcml | Clear module-list cache. | drush cc module-list |
-| drcr | Run all cron hooks in all active modules for specified site. | drush core-cron |
-| drct | Clear theme-registry cache. | drush cc theme-registry |
-| drcv | Clear views cache. (Make sure that the views module is enabled) | drush cc views |
-| drdmp | Backup database in a new dump.sql file | drush drush sql-dump --ordered-dump --result-file=dump.sql|
-| drf | Display features status | drush features |
-| drfr | Revert a feature module on your site. | drush features-revert -y |
-| drfu | Update a feature module on your site. | drush features-update -y |
-| drfra | Revert all enabled feature module on your site. | drush features-revert-all |
-| drif | Flush all derived images. | drush image-flush --all |
-| drpm | Show a list of available modules. | drush pm-list --type=module |
-| drst | Provides a birds-eye view of the current Drupal installation, if any. | drush core-status |
-| drup | Apply any database updates required (as with running update.php). | drush updatedb |
-| drups | List any pending database updates. | drush updatedb-status |
-| drv | Show drush version. | drush version |
-| drvd | Delete a variable. | drush variable-del |
-| drvg | Get a list of some or all site variables and values. | drush variable-get |
-| drvs | Set a variable. | drush variable-set |
+
+| Alias | Command | Description |
+| ------- | ----------------------------------------------------------- | -------------------------------------------------------------------- |
+| `dr` | `drush` | Display drush help |
+| `drca` | `drush cc all` | _(Deprecated in Drush 8)_ Clear all drupal caches |
+| `drcb` | `drush cc block` | _(Deprecated in Drush 8)_ Clear block cache |
+| `drcex` | `drush config:export -y` | Export Drupal configuration to a directory |
+| `drcg` | `drush cc registry` | _(Deprecated in Drush 8)_ Clear registry cache |
+| `drcim` | `drush config:import -y` | Import config from a config directory |
+| `drcj` | `drush cc css-js` | Clear css-js cache |
+| `drcm` | `drush cc menu` | Clear menu cache |
+| `drcml` | `drush cc module-list` | Clear module-list cache |
+| `drcr` | `drush core-cron` | Run all cron hooks in all active modules for specified site |
+| `drct` | `drush cc theme-registry` | Clear theme-registry cache |
+| `drcv` | `drush cc views` | Clear views cache _(make sure that the views module is enabled)_ |
+| `drdmp` | `drush drush sql-dump --ordered-dump --result-file=dumpsql` | Backup database in a new dump.sql file |
+| `drf` | `drush features` | Display features status |
+| `drfr` | `drush features-revert -y` | Revert a feature module on your site |
+| `drfra` | `drush features-revert-all` | Revert all enabled feature module on your site |
+| `drfu` | `drush features-update -y` | Update a feature module on your site |
+| `drif` | `drush image-flush --all` | Flush all derived images |
+| `drpm` | `drush pm-list --type=module` | Show a list of available modules |
+| `drst` | `drush core-status` | Provides a birds-eye view of the current Drupal installation, if any |
+| `druli` | `drush user:login` | Display a one time login link for user ID 1, or another user |
+| `drup` | `drush updatedb` | Apply any database updates required (as with running update.php) |
+| `drups` | `drush updatedb-status` | List any pending database updates |
+| `drv` | `drush version` | Show drush version |
+| `drvd` | `drush variable-del` | Delete a variable |
+| `drvg` | `drush variable-get` | Get a list of some or all site variables and values |
+| `drvs` | `drush variable-set` | Set a variable |
+| `drws` | `drush watchdog:show` | Show watchdog messages |
+| `drwse` | `drush watchdog:show --extended` | Show watchdog messages with extended information |
+| `drwst` | `drush watchdog:tail` | Tail watchdog messages |
## Functions
-### dren
-Download and enable one or more extensions (modules or themes).
-Must be invoked with one or more parameters. e.g.:
-`dren devel` or `dren devel module_filter views`
+- `dren`: download and enable one or more extensions (modules or themes). Must be
+ invoked with one or more parameters, e.g.: `dren devel` or `dren devel module_filter views`.
-### drf
-Edit drushrc, site alias, and Drupal settings.php files.
-Can be invoked with one or without parameters. e.g.:
-`drf 1`
+- `drf`: edit drushrc, site alias, and Drupal settings.php files.
+ Can be invoked with one or without parameters, e.g.: `drf 1`.
-### dris
-Disable one or more extensions (modules or themes)
-Must be invoked with one or more parameters. e.g.:
-`dris devel` or `dris devel module_filter views`
+- `dris`: disable one or more extensions (modules or themes). Must be invoked with
+ one or more parameters, e.g.: `dris devel` or `dris devel module_filter views`.
-### drpu
-Uninstall one or more modules.
-Must be invoked with one or more parameters. e.g.:
-`drpu devel` or `drpu devel module_filter views`
+- `drpu`: uninstall one or more modules. Must be invoked with one or more
+ parameters, e.g.: `drpu devel` or `drpu devel module_filter views`.
-### drnew
-Creates a brand new drupal website.
-Note: As soon as the installation is complete, drush will print a username and a random password into the terminal:
-```
-Installation complete. User name: admin User password: cf7t8yqNEm
-```
+- `drnew`: creates a brand new drupal website. Note: as soon as the installation
+ is complete, `drush` will print a username and a random password into the terminal:
-## Additional features
-
-### Autocomplete
-The [completion script for drush](https://github.com/drush-ops/drush/blob/8.0.1/drush.complete.sh) comes enabled with this plugin.
-So, it is possible to type a command:
-```
-drush sql
-```
-
-And as soon as the tab key is pressed, the script will display the available commands:
-```
-drush sql
-sqlc sql-conf sql-create sql-dump sql-query sql-sanitize
-sql-cli sql-connect sql-drop sqlq sqlsan sql-sync
-```
+ ```text
+ Installation complete. User name: admin User password: cf7t8yqNEm
+ ```
diff --git a/plugins/drush/drush.plugin.zsh b/plugins/drush/drush.plugin.zsh
index 8a20d79f2..48e8ddb1e 100644
--- a/plugins/drush/drush.plugin.zsh
+++ b/plugins/drush/drush.plugin.zsh
@@ -1,19 +1,18 @@
-# Drush support.
-
+# Functions
function dren() {
- drush en $@ -y
+ drush en "$@" -y
}
function dris() {
- drush pm-disable $@ -y
+ drush pm-disable "$@" -y
}
function drpu() {
- drush pm-uninstall $@ -y
+ drush pm-uninstall "$@" -y
}
function drf() {
- if [[ $1 == "" ]] then
+ if [[ -z "$1" ]] then
drush core-config
else
drush core-config --choice=$1
@@ -21,62 +20,62 @@ function drf() {
}
function drfi() {
- if [[ $1 == "fields" ]]; then
- drush field-info fields
- elif [[ $1 == "types" ]]; then
- drush field-info types
- else
- drush field-info
- fi
+ case "$1" in
+ fields) drush field-info fields ;;
+ types) drush field-info types ;;
+ *) drush field-info ;;
+ esac
}
function drnew() {
+ (
+ cd
+ echo "Website's name: "
+ read WEBSITE_NAME
- cd ~
- echo "Website's name: "
- read WEBSITE_NAME
+ HOST=http://$(hostname -i)/
- HOST=http://$(hostname -i)/
+ if [[ $WEBSITE_NAME == "" ]] then
+ MINUTES=$(date +%M:%S)
+ WEBSITE_NAME="Drupal-$MINUTES"
+ echo "Your website will be named: $WEBSITE_NAME"
+ fi
- if [[ $WEBSITE_NAME == "" ]] then
- MINUTES=$(date +%M:%S)
- WEBSITE_NAME="Drupal-$MINUTES"
- echo "Your website will be named: $WEBSITE_NAME"
- fi
+ drush dl drupal --drupal-project-rename=$WEBSITE_NAME
- drush dl drupal --drupal-project-rename=$WEBSITE_NAME
+ echo "Type your localhost directory: (Leave empty for /var/www/html/)"
+ read DIRECTORY
- echo "Type your localhost directory: (Leave empty for /var/www/html/)"
- read DIRECTORY
+ if [[ $DIRECTORY == "" ]] then
+ DIRECTORY="/var/www/html/"
+ fi
- if [[ $DIRECTORY == "" ]] then
- DIRECTORY="/var/www/html/"
- fi
+ echo "Moving to $DIRECTORY$WEBSITE_NAME"
+ sudo mv $WEBSITE_NAME $DIRECTORY
+ cd $DIRECTORY$WEBSITE_NAME
- echo "Moving to $DIRECTORY$WEBSITE_NAME"
- sudo mv $WEBSITE_NAME $DIRECTORY
- cd $DIRECTORY$WEBSITE_NAME
+ echo "Database's user: "
+ read DATABASE_USR
+ echo "Database's password: "
+ read -s DATABASE_PWD
+ echo "Database's name for your project: "
+ read DATABASE
- echo "Database's user: "
- read DATABASE_USR
- echo "Database's password: "
- read -s DATABASE_PWD
- echo "Database's name for your project: "
- read DATABASE
-
- DB_URL="mysql://$DATABASE_USR:$DATABASE_PWD@localhost/$DATABASE"
- drush site-install standard --db-url=$DB_URL --site-name=$WEBSITE_NAME
-
- open_command $HOST$WEBSITE_NAME
- echo "Done"
+ DB_URL="mysql://$DATABASE_USR:$DATABASE_PWD@localhost/$DATABASE"
+ drush site-install standard --db-url=$DB_URL --site-name=$WEBSITE_NAME
+ open_command $HOST$WEBSITE_NAME
+ echo "Done"
+ )
}
-# Aliases, sorted alphabetically.
+# Aliases
alias dr="drush"
alias drca="drush cc all" # Deprecated for Drush 8
alias drcb="drush cc block" # Deprecated for Drush 8
+alias drcex="drush config:export -y"
alias drcg="drush cc registry" # Deprecated for Drush 8
+alias drcim="drush config:import -y"
alias drcj="drush cc css-js"
alias drcm="drush cc menu"
alias drcml="drush cc module-list"
@@ -86,17 +85,21 @@ alias drcv="drush cc views"
alias drdmp="drush sql-dump --ordered-dump --result-file=dump.sql"
alias drf="drush features"
alias drfr="drush features-revert -y"
-alias drfu="drush features-update -y"
alias drfra="drush features-revert-all"
+alias drfu="drush features-update -y"
alias drif="drush image-flush --all"
alias drpm="drush pm-list --type=module"
alias drst="drush core-status"
+alias druli="drush user:login"
alias drup="drush updatedb"
alias drups="drush updatedb-status"
alias drv="drush version"
alias drvd="drush variable-del"
alias drvg="drush variable-get"
alias drvs="drush variable-set"
+alias drws="drush watchdog:show"
+alias drwse="drush watchdog:show --extended"
+alias drwst="drush watchdog:tail"
# Enable drush autocomplete support
autoload bashcompinit
diff --git a/plugins/emacs/emacs.plugin.zsh b/plugins/emacs/emacs.plugin.zsh
index 027c7550f..fede5b0c4 100644
--- a/plugins/emacs/emacs.plugin.zsh
+++ b/plugins/emacs/emacs.plugin.zsh
@@ -13,6 +13,11 @@
autoload -Uz is-at-least
is-at-least 24 "${${(Az)"$(emacsclient --version 2>/dev/null)"}[2]}" || return 0
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
# Path to custom emacsclient launcher
export EMACS_PLUGIN_LAUNCHER="${0:A:h}/emacsclient.sh"
diff --git a/plugins/ember-cli/README.md b/plugins/ember-cli/README.md
index b46373619..419704ade 100644
--- a/plugins/ember-cli/README.md
+++ b/plugins/ember-cli/README.md
@@ -1,22 +1,33 @@
# Ember CLI
-**Maintainers:** [BilalBudhani](https://github.com/BilalBudhani), [eubenesa](https://github.com/eubenesa), [scottkidder](https://github.com/scottkidder]
+This plugin adds completion and aliases for using [`ember-cli`](https://cli.emberjs.com/).
-Ember CLI (https://www.ember-cli.com/)
+To use it, add `ember-cli` to the plugins array in your zshrc file:
-### List of Aliases
+```zsh
+plugins=(... ember-cli)
+```
-Alias | Ember-CLI command
------ | -----------------
-**es** | *ember serve*
-**ea** | *ember addon*
-**eb** | *ember build*
-**ed** | *ember destroy*
-**eg** | *ember generate*
-**eh** | *ember help*
-**ein** | *ember init*
-**ei** | *ember install*
-**et** | *ember test*
-**ets** | *ember test --serve*
-**eu** | *ember update*
-**ev** | *ember version*
+## Aliases
+
+| Alias | Command |
+| ----- | -------------------- |
+| `ea` | `ember addon` |
+| `eb` | `ember build` |
+| `ed` | `ember destroy` |
+| `eg` | `ember generate` |
+| `eh` | `ember help` |
+| `ei` | `ember install` |
+| `ein` | `ember init` |
+| `es` | `ember serve` |
+| `et` | `ember test` |
+| `ets` | `ember test --serve` |
+| `eu` | `ember update` |
+| `ev` | `ember version` |
+
+## Maintainers
+
+- [BilalBudhani](https://github.com/BilalBudhani)
+- [eubenesa](https://github.com/eubenesa)
+- [scottkidder](https://github.com/scottkidder]
+- [t-sauer](https://www.github.com/t-sauer)
diff --git a/plugins/ember-cli/_ember-cli b/plugins/ember-cli/_ember-cli
new file mode 100644
index 000000000..41c3c1fd4
--- /dev/null
+++ b/plugins/ember-cli/_ember-cli
@@ -0,0 +1,189 @@
+#compdef ember
+
+local curcontext="$curcontext" state line ret=1
+
+_arguments -C -A "--version" -A "--help" \
+ '(- 1 *)--help' \
+ '(- 1 *)--version' \
+ '1: :->cmds' \
+ '*:: :->args' && ret=0
+
+case $state in
+ cmds)
+ _values "ember command" \
+ "addon[Generates a new folder structure for building an addon, complete with test harness]" \
+ "asset-sizes[Shows the sizes of your asset files]" \
+ "build[Builds your app and places it into the output path (dist/ by default)]" \
+ "destroy[Destroys code generated by generate command]" \
+ "generate[Generates new code from blueprints]" \
+ "help[Outputs the usage instructions for all commands or the provided command]" \
+ "init[Creates a new ember-cli project in the current folder]" \
+ "install[Installs an ember-cli addon from npm]" \
+ "new[Creates a new directory and runs ember init in it]" \
+ "serve[Builds and serves your app, rebuilding on file changes]" \
+ "test[Runs your app's test suite]" \
+ "version[outputs ember-cli version]"
+ ret=0
+ ;;
+ args)
+ case $line[1] in
+ help)
+ _values 'commands' \
+ 'addon' \
+ 'asset-sizes' \
+ 'build' \
+ 'destroy' \
+ 'generate' \
+ 'help' \
+ 'init' \
+ 'install' \
+ 'new' \
+ 'serve' \
+ 'test' \
+ 'vesion' && ret=0
+ ;;
+ addon)
+ _arguments \
+ '(--blueprint)--blueprint=-' \
+ '(--directory)--directory=-' \
+ '(--dry-run)--dry-run' \
+ '(--skip-bower)--skip-bower' \
+ '(--skip-git)--skip-git' \
+ '(--skip-npm)--skip-npm' \
+ '(--verbose)--verbose'
+ ;;
+ asset-sizes)
+ _arguments \
+ '(--output-path)--output-path=-'
+ ;;
+ build)
+ _arguments \
+ '(--environment)--environment=-' \
+ '(--output-path)--output-path=-' \
+ '(--output-path)--suppress-sizes' \
+ '(--watch)--watch' \
+ '(--watcher)--watcher=-' \
+ '(-dev)-dev' \
+ '(-prod)-prod'
+ ;;
+ destroy|generate)
+ _values 'arguments' \
+ '(--classic)--classic' \
+ '(--dry-run)--dry-run' \
+ '(--dummy)--dummy' \
+ '(--in-repo-addon)--in-repo-addon-=' \
+ '(--pod)--pod' \
+ '(--verbose)--verbose' && ret=0
+ _values 'blueprints' \
+ 'acceptance-test' \
+ 'adapter' \
+ 'adapter-test' \
+ 'component' \
+ 'component-addon' \
+ 'component-test' \
+ 'controller' \
+ 'controller-test' \
+ 'helper' \
+ 'helper-addon' \
+ 'helper-test' \
+ 'initializer' \
+ 'initializer-addon' \
+ 'initializer-test' \
+ 'instance-initializer' \
+ 'instance-initializer-addon' \
+ 'instance-initializer-test' \
+ 'mixin' \
+ 'mixin-test' \
+ 'model' \
+ 'model-test' \
+ 'resource' \
+ 'route' \
+ 'route-addon' \
+ 'route-test' \
+ 'serializer' \
+ 'serializer-test' \
+ 'service' \
+ 'service-test' \
+ 'template' \
+ 'test-helper' \
+ 'transform' \
+ 'transform-test' \
+ 'util' \
+ 'util-test' \
+ 'view' \
+ 'view-test' \
+ 'addon' \
+ 'addon-import' \
+ 'app' \
+ 'blueprint' \
+ 'http-mock' \
+ 'http-proxy' \
+ 'in-repo-addon' \
+ 'lib' \
+ 'server' \
+ 'vendor-shim' && ret=0
+ ;;
+ init)
+ _arguments \
+ '(--blueprint)--blueprint=-' \
+ '(--name)--name=-' \
+ '(--dry-run)--dry-run' \
+ '(--skip-bower)--skip-bower' \
+ '(--skip-npm)--skip-npm' \
+ '(--verbose)--verbose'
+ ;;
+ install)
+ _arguments \
+ '(--save-dev)--save-dev' \
+ '(--save)--save'
+ ;;
+ new)
+ _arguments \
+ '(--blueprint)--blueprint=-' \
+ '(--directory)--directory=-' \
+ '(--dry-run)--dry-run' \
+ '(--skip-bower)--skip-bower' \
+ '(--skip-git)--skip-git' \
+ '(--skip-npm)--skip-npm' \
+ '(--verbose)--verbose'
+ ;;
+ serve)
+ _arguments \
+ '(--port)--port=-[To use a port different than 4200. Pass 0 to automatically pick an available port.]' \
+ '(--host)--host=-[Listens on all interfaces by default]' \
+ '(--proxy)--proxy=-' \
+ '(--secure-proxy)--secure-proxy[Set to false to proxy self-signed SSL certificates]' \
+ '(--transparent-proxy)--transparent-proxy[Set to false to omit x-forwarded-* headers when proxying]' \
+ '(--watcher)--watcher=-' \
+ '(--live-reload)--live-reload' \
+ '(--live-reload-host)--live-reload-host=-[Defaults to host]' \
+ '(--live-reload-base-url)--live-reload-base-url=-[Defaults to baseURL]' \
+ '(--live-reload-port)--live-reload-port=-[Defaults to port number within \[49152...65535\]]' \
+ '(--environment)--environment=-' \
+ '(--output-path)--output-path=-' \
+ '(--ssl)--ssl' \
+ '(--ssl-key)--ssl-key=-' \
+ '(--ssl-cert)--ssl-cert=-'
+ ;;
+ test)
+ _arguments \
+ '(--environment)--environment=-' \
+ '(--config-file)--config-file=-' \
+ '(--server)--server' \
+ '(--host)--host=-' \
+ '(--test-port)--test-port=-[The test port to use when running with --server.]' \
+ '(--filter)--filter=-[A string to filter tests to run]' \
+ '(--module)--module=-[The name of a test module to run]' \
+ '(--watcher)--watcher=-' \
+ '(--launch)--launch=-[A comma separated list of browsers to launch for tests.]' \
+ '(--reporter)--reporter=-[Test reporter to use \[tap|dot|xunit\] (default: tap)]' \
+ '(--silent)--silent[Suppress any output except for the test report]' \
+ '(--test-page)--test-page=-[Test page to invoke]' \
+ '(--path)--path=-[Reuse an existing build at given path.]' \
+ '(--query)--query=-[A query string to append to the test page URL.]'
+ ;;
+ esac
+ ;;
+esac
+
+return ret
diff --git a/plugins/ember-cli/ember-cli.plugin.zsh b/plugins/ember-cli/ember-cli.plugin.zsh
index 67842c120..de46b9827 100644
--- a/plugins/ember-cli/ember-cli.plugin.zsh
+++ b/plugins/ember-cli/ember-cli.plugin.zsh
@@ -1,17 +1,12 @@
-# Ember CLI
-# Visit https://www.ember-cli.com/ to view user guide
-
-alias es='ember serve'
alias ea='ember addon'
alias eb='ember build'
alias ed='ember destroy'
alias eg='ember generate'
alias eh='ember help'
-alias ein='ember init'
alias ei='ember install'
+alias ein='ember init'
+alias es='ember serve'
alias et='ember test'
alias ets='ember test --serve'
alias eu='ember update'
-
-# version
alias ev='ember version'
diff --git a/plugins/emoji/README.md b/plugins/emoji/README.md
index 8b8860a86..4154ea0dc 100644
--- a/plugins/emoji/README.md
+++ b/plugins/emoji/README.md
@@ -10,7 +10,7 @@ This plugin provides support for working with Unicode emoji characters in `zsh`
Variable | Description
----------------- | --------------------------------
- $emoji | Maps emoji names to characters
+ $emoji | Maps emoji names to characters (except flags)
$emoji_flags | Maps country names to flag characters (using region indicators)
$emoji_groups | Named groups of emoji. Keys are group names; values are whitespace-separated lists of character names
@@ -55,10 +55,8 @@ The defined group names can be found with `echo ${(k)emoji_groups}`.
To list all available emoji with their names, use:
```
$> display_emoji
-$> display_emoji fruits
-$> display_emoji animals
-$> display_emoji vehicles
$> display_emoji faces
+$> display_emoji people
```
To use emoji in a prompt:
@@ -73,13 +71,13 @@ PROMPT="$surfer > "
The emoji names and codes are sourced from Unicode Technical Report \#51, which provides information on emoji support in Unicode. It can be found at https://www.unicode.org/reports/tr51/index.html.
-The group definitions are added by this OMZ plugin. They are not based on external definitions. (As far as I can tell. -apjanke)
+The group definitions are added by this OMZ plugin. They are not based on external definitions.
The values in the `$emoji*` maps are the emoji characters themselves, not escape sequences or other forms that require interpretation. They can be used in any context and do not require escape sequence support from commands like `echo` or `print`.
The emoji in the main `$emoji` map are standalone character sequences which can all be output on their own, without worrying about combining characters. The values may actually be multi-code-point sequences, instead of a single code point, and may include combining characters in those sequences. But they're arranged so their effects do not extend beyond that sequence.
-The exception to this is the skin tone variation selectors. These are included in the main `$emoji` map because they can be displayed on their own, as well as used as combining characters. (If they follow a character that is not one of the emoji characters they combine with, they are displayed as color swatches.)
+The exception to this is the skin tone / hair style variation selectors. These are included in the main `$emoji` map because they can be displayed on their own, as well as used as combining characters. (If they follow a character that is not one of the emoji characters they combine with, they are displayed as color swatches.)
## Experimental Features
@@ -90,7 +88,6 @@ Variables:
Variable | Description
----------------- | --------------------------------
- $emoji2 | Auxiliary and combining characters
$emoji_skintone | Skin tone modifiers (from Unicode 8.0)
@@ -105,31 +102,26 @@ The "variation selectors" are combining characters which change the appearance o
The `$emoji_skintone` associative array maps skin tone IDs to the variation selector characters. To use one, output it immediately following a smiley or other human emoji.
```
-echo "$emoji[smiling_face_with_open_mouth]$emoji_skintone[4]"
+echo $emoji[waving_hand]$emoji_skintone[5]
```
Note that `$emoji_skintone` is an associative array, and its keys are the *names* of "Fitzpatrick Skin Type" groups, not linear indexes into a normal array. The names are `1_2`, `3`, `4`, `5`, and `6`. (Types 1 and 2 are combined into a single color.) See the [Diversity section in Unicode TR 51](https://www.unicode.org/reports/tr51/index.html#Diversity) for details.
+#### Gemoji support
+
+The [gemoji project](https://github.com/github/gemoji) seems to be the de facto main source for short names and other emoji-related metadata that isn't included in the official Unicode reports. So, our list of emojis incorporates some of their aliases to make your life more convenient:
+
+```
+echo $emoji[grinning_face_with_smiling_eyes]
+echo $emoji[smile]
+```
+
+These two commands yield the same emoji (😄). The first name is the official one, in the Unicode reference, and the second one is the alias that was in Gemoji's database.
+
## TODO
These are things that could be enhanced in future revisions of the plugin.
* Incorporate CLDR data for ordering and groupings
* Short :bracket: style names (from gemoji)
-* Incorporate `gemoji` data
-* Country codes for flags
-* ZWJ combining function?
-
-#### Gemoji support
-
-The [gemoji project](https://github.com/github/gemoji) seems to be the de facto main source for short names and other emoji-related metadata that isn't included in the official Unicode reports. (I'm saying this just from looking at the google results for "emoji short names" and related searches. -apjanke)
-
-If this plugin is updated to provide short names, CLDR sorting data, and similar stuff, it should probably be changed to use the Gemoji project, and the `update_emoji.pl` script be rewritten in Ruby so it can use the Gemoji library directly instead of parsing its data files.
-
-This does *not* mean that it should use Gemoji at run time. None of the `zsh` plugin stuff should call Gemoji or Ruby code. Rather, the "build time" `update_emoji.pl` script should be rewritten to use Gemoji to generate a pure-native-`zsh` character definition file which would be checked in to the repo and can be called by OMZ users without having Gemoji installed.
-
-#### ZWJ combining function
-
-One of the newer features of Unicode emoji is the ability to use the "Zero-Width Joiner" character to compose multiple emoji characters in to a single "emoji ligature" glyph. For example, this is [how Apple supports "family" emoji with various genders and skin tones](https://www.unicode.org/reports/tr51/index.html#ZWJ_Sequences).
-
-These are a pain to write out (and probably worse to read), and it might be convenient to have a couple functions for concisely composing them, if wider support for them appears.
+* ZWJ combining function?
\ No newline at end of file
diff --git a/plugins/emoji/emoji-char-definitions.zsh b/plugins/emoji/emoji-char-definitions.zsh
index 04693da05..b37c142a1 100644
--- a/plugins/emoji/emoji-char-definitions.zsh
+++ b/plugins/emoji/emoji-char-definitions.zsh
@@ -1,11 +1,18 @@
-# emoji-char-definitions.zsh - Emoji character definitions for oh-my-zsh emoji plugin
+# emoji-char-definitions.zsh - Emoji definitions for oh-my-zsh emoji plugin
#
-# This file is auto-generated by update_emoji.pl. Do not edit it manually.
+# This file is auto-generated by update_emoji.py. Do not edit it manually.
#
# This contains the definition for:
# $emoji - which maps character names to Unicode characters
-# $emoji_flags - maps country names to Unicode flag characters using region indicators
+# $emoji_flags - maps country names to Unicode flag characters using region
+# indicators
+# $emoji_mod - maps modifier components to Unicode characters
+# $emoji_groups - a single associative array to avoid cluttering up the
+# global namespace, and to allow adding additional group
+# definitions at run time. The keys are the group names, and
+# the values are whitespace-separated lists of emoji
+# character names.
# Main emoji
typeset -gAH emoji
@@ -13,938 +20,3102 @@ typeset -gAH emoji
typeset -gAH emoji_flags
# Combining modifiers
typeset -gAH emoji_mod
-
-emoji[copyright_sign]=$'\U00A9'
-emoji[registered_sign]=$'\U00AE'
-emoji[double_exclamation_mark]=$'\U203C'
-emoji[exclamation_question_mark]=$'\U2049'
-emoji[trade_mark_sign]=$'\U2122'
-emoji[information_source]=$'\U2139'
-emoji[left_right_arrow]=$'\U2194'
-emoji[up_down_arrow]=$'\U2195'
-emoji[north_west_arrow]=$'\U2196'
-emoji[north_east_arrow]=$'\U2197'
-emoji[south_east_arrow]=$'\U2198'
-emoji[south_west_arrow]=$'\U2199'
-emoji[leftwards_arrow_with_hook]=$'\U21A9'
-emoji[rightwards_arrow_with_hook]=$'\U21AA'
-emoji[watch]=$'\U231A'
-emoji[hourglass]=$'\U231B'
-emoji[keyboard]=$'\U2328'
-emoji[eject_symbol]=$'\U23CF'
-emoji[black_right_pointing_double_triangle]=$'\U23E9'
-emoji[black_left_pointing_double_triangle]=$'\U23EA'
-emoji[black_up_pointing_double_triangle]=$'\U23EB'
-emoji[black_down_pointing_double_triangle]=$'\U23EC'
-emoji[black_right_pointing_double_triangle_with_vertical_bar]=$'\U23ED'
-emoji[black_left_pointing_double_triangle_with_vertical_bar]=$'\U23EE'
-emoji[black_right_pointing_triangle_with_double_vertical_bar]=$'\U23EF'
-emoji[alarm_clock]=$'\U23F0'
-emoji[stopwatch]=$'\U23F1'
-emoji[timer_clock]=$'\U23F2'
-emoji[hourglass_with_flowing_sand]=$'\U23F3'
-emoji[double_vertical_bar]=$'\U23F8'
-emoji[black_square_for_stop]=$'\U23F9'
-emoji[black_circle_for_record]=$'\U23FA'
-emoji[circled_latin_capital_letter_m]=$'\U24C2'
-emoji[black_small_square]=$'\U25AA'
-emoji[white_small_square]=$'\U25AB'
-emoji[black_right_pointing_triangle]=$'\U25B6'
-emoji[black_left_pointing_triangle]=$'\U25C0'
-emoji[white_medium_square]=$'\U25FB'
-emoji[black_medium_square]=$'\U25FC'
-emoji[white_medium_small_square]=$'\U25FD'
-emoji[black_medium_small_square]=$'\U25FE'
-emoji[black_sun_with_rays]=$'\U2600'
-emoji[cloud]=$'\U2601'
-emoji[umbrella]=$'\U2602'
-emoji[snowman]=$'\U2603'
-emoji[comet]=$'\U2604'
-emoji[black_telephone]=$'\U260E'
-emoji[ballot_box_with_check]=$'\U2611'
-emoji[umbrella_with_rain_drops]=$'\U2614'
-emoji[hot_beverage]=$'\U2615'
-emoji[shamrock]=$'\U2618'
-emoji[white_up_pointing_index]=$'\U261D'
-emoji[skull_and_crossbones]=$'\U2620'
-emoji[radioactive_sign]=$'\U2622'
-emoji[biohazard_sign]=$'\U2623'
-emoji[orthodox_cross]=$'\U2626'
-emoji[star_and_crescent]=$'\U262A'
-emoji[peace_symbol]=$'\U262E'
-emoji[yin_yang]=$'\U262F'
-emoji[wheel_of_dharma]=$'\U2638'
-emoji[white_frowning_face]=$'\U2639'
-emoji[white_smiling_face]=$'\U263A'
-emoji[aries]=$'\U2648'
-emoji[taurus]=$'\U2649'
-emoji[gemini]=$'\U264A'
-emoji[cancer]=$'\U264B'
-emoji[leo]=$'\U264C'
-emoji[virgo]=$'\U264D'
-emoji[libra]=$'\U264E'
-emoji[scorpius]=$'\U264F'
-emoji[sagittarius]=$'\U2650'
-emoji[capricorn]=$'\U2651'
-emoji[aquarius]=$'\U2652'
-emoji[pisces]=$'\U2653'
-emoji[black_spade_suit]=$'\U2660'
-emoji[black_club_suit]=$'\U2663'
-emoji[black_heart_suit]=$'\U2665'
-emoji[black_diamond_suit]=$'\U2666'
-emoji[hot_springs]=$'\U2668'
-emoji[black_universal_recycling_symbol]=$'\U267B'
-emoji[wheelchair_symbol]=$'\U267F'
-emoji[hammer_and_pick]=$'\U2692'
-emoji[anchor]=$'\U2693'
-emoji[crossed_swords]=$'\U2694'
-emoji[scales]=$'\U2696'
-emoji[alembic]=$'\U2697'
-emoji[gear]=$'\U2699'
-emoji[atom_symbol]=$'\U269B'
-emoji[fleur_de_lis]=$'\U269C'
-emoji[warning_sign]=$'\U26A0'
-emoji[high_voltage_sign]=$'\U26A1'
-emoji[medium_white_circle]=$'\U26AA'
-emoji[medium_black_circle]=$'\U26AB'
-emoji[coffin]=$'\U26B0'
-emoji[funeral_urn]=$'\U26B1'
-emoji[soccer_ball]=$'\U26BD'
-emoji[baseball]=$'\U26BE'
-emoji[snowman_without_snow]=$'\U26C4'
-emoji[sun_behind_cloud]=$'\U26C5'
-emoji[thunder_cloud_and_rain]=$'\U26C8'
-emoji[ophiuchus]=$'\U26CE'
-emoji[pick]=$'\U26CF'
-emoji[helmet_with_white_cross]=$'\U26D1'
-emoji[chains]=$'\U26D3'
-emoji[no_entry]=$'\U26D4'
-emoji[shinto_shrine]=$'\U26E9'
-emoji[church]=$'\U26EA'
-emoji[mountain]=$'\U26F0'
-emoji[umbrella_on_ground]=$'\U26F1'
-emoji[fountain]=$'\U26F2'
-emoji[flag_in_hole]=$'\U26F3'
-emoji[ferry]=$'\U26F4'
-emoji[sailboat]=$'\U26F5'
-emoji[skier]=$'\U26F7'
-emoji[ice_skate]=$'\U26F8'
-emoji[person_with_ball]=$'\U26F9'
-emoji[tent]=$'\U26FA'
-emoji[fuel_pump]=$'\U26FD'
-emoji[black_scissors]=$'\U2702'
-emoji[white_heavy_check_mark]=$'\U2705'
-emoji[airplane]=$'\U2708'
-emoji[envelope]=$'\U2709'
-emoji[raised_fist]=$'\U270A'
+# Emoji groups
+typeset -gAH emoji_groups
+emoji[grinning_face]=$'\U1F600'
+emoji[grinning]=$'\U1F600'
+emoji[grinning_face_with_big_eyes]=$'\U1F603'
+emoji[smiley]=$'\U1F603'
+emoji[grinning_face_with_smiling_eyes]=$'\U1F604'
+emoji[smile]=$'\U1F604'
+emoji[beaming_face_with_smiling_eyes]=$'\U1F601'
+emoji[grin]=$'\U1F601'
+emoji[grinning_squinting_face]=$'\U1F606'
+emoji[laughing]=$'\U1F606'
+emoji[satisfied]=$'\U1F606'
+emoji[grinning_face_with_sweat]=$'\U1F605'
+emoji[sweat_smile]=$'\U1F605'
+emoji[rolling_on_the_floor_laughing]=$'\U1F923'
+emoji[rofl]=$'\U1F923'
+emoji[face_with_tears_of_joy]=$'\U1F602'
+emoji[joy]=$'\U1F602'
+emoji[slightly_smiling_face]=$'\U1F642'
+emoji[upside_down_face]=$'\U1F643'
+emoji[winking_face]=$'\U1F609'
+emoji[wink]=$'\U1F609'
+emoji[smiling_face_with_smiling_eyes]=$'\U1F60A'
+emoji[blush]=$'\U1F60A'
+emoji[smiling_face_with_halo]=$'\U1F607'
+emoji[innocent]=$'\U1F607'
+emoji[smiling_face_with_hearts]=$'\U1F970'
+emoji[smiling_face_with_three_hearts]=$'\U1F970'
+emoji[smiling_face_with_heart_eyes]=$'\U1F60D'
+emoji[heart_eyes]=$'\U1F60D'
+emoji[star_struck]=$'\U1F929'
+emoji[face_blowing_a_kiss]=$'\U1F618'
+emoji[kissing_heart]=$'\U1F618'
+emoji[kissing_face]=$'\U1F617'
+emoji[kissing]=$'\U1F617'
+emoji[smiling_face]=$'\U263A\UFE0F'
+emoji[relaxed]=$'\U263A\UFE0F'
+emoji[smiling_face_unqualified]=$'\U263A'
+emoji[kissing_face_with_closed_eyes]=$'\U1F61A'
+emoji[kissing_closed_eyes]=$'\U1F61A'
+emoji[kissing_face_with_smiling_eyes]=$'\U1F619'
+emoji[kissing_smiling_eyes]=$'\U1F619'
+emoji[face_savoring_food]=$'\U1F60B'
+emoji[yum]=$'\U1F60B'
+emoji[face_with_tongue]=$'\U1F61B'
+emoji[stuck_out_tongue]=$'\U1F61B'
+emoji[winking_face_with_tongue]=$'\U1F61C'
+emoji[stuck_out_tongue_winking_eye]=$'\U1F61C'
+emoji[zany_face]=$'\U1F92A'
+emoji[squinting_face_with_tongue]=$'\U1F61D'
+emoji[stuck_out_tongue_closed_eyes]=$'\U1F61D'
+emoji[money_mouth_face]=$'\U1F911'
+emoji[hugging_face]=$'\U1F917'
+emoji[hugs]=$'\U1F917'
+emoji[face_with_hand_over_mouth]=$'\U1F92D'
+emoji[hand_over_mouth]=$'\U1F92D'
+emoji[shushing_face]=$'\U1F92B'
+emoji[thinking_face]=$'\U1F914'
+emoji[thinking]=$'\U1F914'
+emoji[zipper_mouth_face]=$'\U1F910'
+emoji[face_with_raised_eyebrow]=$'\U1F928'
+emoji[raised_eyebrow]=$'\U1F928'
+emoji[neutral_face]=$'\U1F610'
+emoji[expressionless_face]=$'\U1F611'
+emoji[expressionless]=$'\U1F611'
+emoji[face_without_mouth]=$'\U1F636'
+emoji[no_mouth]=$'\U1F636'
+emoji[smirking_face]=$'\U1F60F'
+emoji[smirk]=$'\U1F60F'
+emoji[unamused_face]=$'\U1F612'
+emoji[unamused]=$'\U1F612'
+emoji[face_with_rolling_eyes]=$'\U1F644'
+emoji[roll_eyes]=$'\U1F644'
+emoji[grimacing_face]=$'\U1F62C'
+emoji[grimacing]=$'\U1F62C'
+emoji[lying_face]=$'\U1F925'
+emoji[relieved_face]=$'\U1F60C'
+emoji[relieved]=$'\U1F60C'
+emoji[pensive_face]=$'\U1F614'
+emoji[pensive]=$'\U1F614'
+emoji[sleepy_face]=$'\U1F62A'
+emoji[sleepy]=$'\U1F62A'
+emoji[drooling_face]=$'\U1F924'
+emoji[sleeping_face]=$'\U1F634'
+emoji[sleeping]=$'\U1F634'
+emoji[face_with_medical_mask]=$'\U1F637'
+emoji[mask]=$'\U1F637'
+emoji[face_with_thermometer]=$'\U1F912'
+emoji[face_with_head_bandage]=$'\U1F915'
+emoji[nauseated_face]=$'\U1F922'
+emoji[face_vomiting]=$'\U1F92E'
+emoji[vomiting_face]=$'\U1F92E'
+emoji[sneezing_face]=$'\U1F927'
+emoji[hot_face]=$'\U1F975'
+emoji[cold_face]=$'\U1F976'
+emoji[woozy_face]=$'\U1F974'
+emoji[dizzy_face]=$'\U1F635'
+emoji[exploding_head]=$'\U1F92F'
+emoji[cowboy_hat_face]=$'\U1F920'
+emoji[partying_face]=$'\U1F973'
+emoji[smiling_face_with_sunglasses]=$'\U1F60E'
+emoji[nerd_face]=$'\U1F913'
+emoji[face_with_monocle]=$'\U1F9D0'
+emoji[monocle_face]=$'\U1F9D0'
+emoji[confused_face]=$'\U1F615'
+emoji[confused]=$'\U1F615'
+emoji[worried_face]=$'\U1F61F'
+emoji[worried]=$'\U1F61F'
+emoji[slightly_frowning_face]=$'\U1F641'
+emoji[slightly_frowning_face_1]=$'\U2639\UFE0F'
+emoji[frowning_face_unqualified]=$'\U2639'
+emoji[frowning_face]=$'\U2639'
+emoji[face_with_open_mouth]=$'\U1F62E'
+emoji[open_mouth]=$'\U1F62E'
+emoji[hushed_face]=$'\U1F62F'
+emoji[hushed]=$'\U1F62F'
+emoji[astonished_face]=$'\U1F632'
+emoji[astonished]=$'\U1F632'
+emoji[flushed_face]=$'\U1F633'
+emoji[flushed]=$'\U1F633'
+emoji[pleading_face]=$'\U1F97A'
+emoji[frowning_face_with_open_mouth]=$'\U1F626'
+emoji[frowning]=$'\U1F626'
+emoji[anguished_face]=$'\U1F627'
+emoji[anguished]=$'\U1F627'
+emoji[fearful_face]=$'\U1F628'
+emoji[fearful]=$'\U1F628'
+emoji[anxious_face_with_sweat]=$'\U1F630'
+emoji[cold_sweat]=$'\U1F630'
+emoji[sad_but_relieved_face]=$'\U1F625'
+emoji[disappointed_relieved]=$'\U1F625'
+emoji[crying_face]=$'\U1F622'
+emoji[cry]=$'\U1F622'
+emoji[loudly_crying_face]=$'\U1F62D'
+emoji[sob]=$'\U1F62D'
+emoji[face_screaming_in_fear]=$'\U1F631'
+emoji[scream]=$'\U1F631'
+emoji[confounded_face]=$'\U1F616'
+emoji[confounded]=$'\U1F616'
+emoji[persevering_face]=$'\U1F623'
+emoji[persevere]=$'\U1F623'
+emoji[disappointed_face]=$'\U1F61E'
+emoji[disappointed]=$'\U1F61E'
+emoji[downcast_face_with_sweat]=$'\U1F613'
+emoji[sweat]=$'\U1F613'
+emoji[weary_face]=$'\U1F629'
+emoji[weary]=$'\U1F629'
+emoji[tired_face]=$'\U1F62B'
+emoji[yawning_face]=$'\U1F971'
+emoji[face_with_steam_from_nose]=$'\U1F624'
+emoji[triumph]=$'\U1F624'
+emoji[pouting_face]=$'\U1F621'
+emoji[rage]=$'\U1F621'
+emoji[pout]=$'\U1F621'
+emoji[angry_face]=$'\U1F620'
+emoji[angry]=$'\U1F620'
+emoji[face_with_symbols_on_mouth]=$'\U1F92C'
+emoji[cursing_face]=$'\U1F92C'
+emoji[smiling_face_with_horns]=$'\U1F608'
+emoji[smiling_imp]=$'\U1F608'
+emoji[angry_face_with_horns]=$'\U1F47F'
+emoji[imp]=$'\U1F47F'
+emoji[skull]=$'\U1F480'
+emoji[skull_and_crossbones]=$'\U2620\UFE0F'
+emoji[skull_and_crossbones_unqualified]=$'\U2620'
+emoji[pile_of_poo]=$'\U1F4A9'
+emoji[hankey]=$'\U1F4A9'
+emoji[poop]=$'\U1F4A9'
+emoji[shit]=$'\U1F4A9'
+emoji[clown_face]=$'\U1F921'
+emoji[ogre]=$'\U1F479'
+emoji[japanese_ogre]=$'\U1F479'
+emoji[goblin]=$'\U1F47A'
+emoji[japanese_goblin]=$'\U1F47A'
+emoji[ghost]=$'\U1F47B'
+emoji[alien]=$'\U1F47D'
+emoji[alien_monster]=$'\U1F47E'
+emoji[space_invader]=$'\U1F47E'
+emoji[robot]=$'\U1F916'
+emoji[grinning_cat]=$'\U1F63A'
+emoji[smiley_cat]=$'\U1F63A'
+emoji[grinning_cat_with_smiling_eyes]=$'\U1F638'
+emoji[smile_cat]=$'\U1F638'
+emoji[cat_with_tears_of_joy]=$'\U1F639'
+emoji[joy_cat]=$'\U1F639'
+emoji[smiling_cat_with_heart_eyes]=$'\U1F63B'
+emoji[heart_eyes_cat]=$'\U1F63B'
+emoji[cat_with_wry_smile]=$'\U1F63C'
+emoji[smirk_cat]=$'\U1F63C'
+emoji[kissing_cat]=$'\U1F63D'
+emoji[weary_cat]=$'\U1F640'
+emoji[scream_cat]=$'\U1F640'
+emoji[crying_cat]=$'\U1F63F'
+emoji[crying_cat_face]=$'\U1F63F'
+emoji[pouting_cat]=$'\U1F63E'
+emoji[see_no_evil_monkey]=$'\U1F648'
+emoji[see_no_evil]=$'\U1F648'
+emoji[hear_no_evil_monkey]=$'\U1F649'
+emoji[hear_no_evil]=$'\U1F649'
+emoji[speak_no_evil_monkey]=$'\U1F64A'
+emoji[speak_no_evil]=$'\U1F64A'
+emoji[kiss_mark]=$'\U1F48B'
+emoji[love_letter]=$'\U1F48C'
+emoji[heart_with_arrow]=$'\U1F498'
+emoji[cupid]=$'\U1F498'
+emoji[heart_with_ribbon]=$'\U1F49D'
+emoji[gift_heart]=$'\U1F49D'
+emoji[sparkling_heart]=$'\U1F496'
+emoji[growing_heart]=$'\U1F497'
+emoji[heartpulse]=$'\U1F497'
+emoji[beating_heart]=$'\U1F493'
+emoji[heartbeat]=$'\U1F493'
+emoji[revolving_hearts]=$'\U1F49E'
+emoji[two_hearts]=$'\U1F495'
+emoji[heart_decoration]=$'\U1F49F'
+emoji[heart_exclamation]=$'\U2763\UFE0F'
+emoji[heavy_heart_exclamation]=$'\U2763\UFE0F'
+emoji[heart_exclamation_unqualified]=$'\U2763'
+emoji[broken_heart]=$'\U1F494'
+emoji[red_heart]=$'\U2764\UFE0F'
+emoji[heart]=$'\U2764\UFE0F'
+emoji[red_heart_unqualified]=$'\U2764'
+emoji[orange_heart]=$'\U1F9E1'
+emoji[yellow_heart]=$'\U1F49B'
+emoji[green_heart]=$'\U1F49A'
+emoji[blue_heart]=$'\U1F499'
+emoji[purple_heart]=$'\U1F49C'
+emoji[brown_heart]=$'\U1F90E'
+emoji[black_heart]=$'\U1F5A4'
+emoji[white_heart]=$'\U1F90D'
+emoji[hundred_points]=$'\U1F4AF'
+emoji[100]=$'\U1F4AF'
+emoji[anger_symbol]=$'\U1F4A2'
+emoji[anger]=$'\U1F4A2'
+emoji[collision]=$'\U1F4A5'
+emoji[boom]=$'\U1F4A5'
+emoji[dizzy]=$'\U1F4AB'
+emoji[sweat_droplets]=$'\U1F4A6'
+emoji[sweat_drops]=$'\U1F4A6'
+emoji[dashing_away]=$'\U1F4A8'
+emoji[dash]=$'\U1F4A8'
+emoji[hole]=$'\U1F573\UFE0F'
+emoji[hole_unqualified]=$'\U1F573'
+emoji[bomb]=$'\U1F4A3'
+emoji[speech_balloon]=$'\U1F4AC'
+emoji[eye_in_speech_bubble]=$'\U1F441\UFE0F\U200D\U1F5E8\UFE0F'
+emoji[eye_speech_bubble]=$'\U1F441\UFE0F\U200D\U1F5E8\UFE0F'
+emoji[eye_in_speech_bubble_unqualified]=$'\U1F441\U200D\U1F5E8\UFE0F'
+emoji[eye_in_speech_bubble_unqualified_1]=$'\U1F441\UFE0F\U200D\U1F5E8'
+emoji[eye_in_speech_bubble_unqualified_2]=$'\U1F441\U200D\U1F5E8'
+emoji[left_speech_bubble]=$'\U1F5E8\UFE0F'
+emoji[left_speech_bubble_unqualified]=$'\U1F5E8'
+emoji[right_anger_bubble]=$'\U1F5EF\UFE0F'
+emoji[right_anger_bubble_unqualified]=$'\U1F5EF'
+emoji[thought_balloon]=$'\U1F4AD'
+emoji[zzz]=$'\U1F4A4'
+emoji[waving_hand]=$'\U1F44B'
+emoji[wave]=$'\U1F44B'
+emoji[waving_hand_light_skin_tone]=$'\U1F44B\U1F3FB'
+emoji[waving_hand_medium_light_skin_tone]=$'\U1F44B\U1F3FC'
+emoji[waving_hand_medium_skin_tone]=$'\U1F44B\U1F3FD'
+emoji[waving_hand_medium_dark_skin_tone]=$'\U1F44B\U1F3FE'
+emoji[waving_hand_dark_skin_tone]=$'\U1F44B\U1F3FF'
+emoji[raised_back_of_hand]=$'\U1F91A'
+emoji[raised_back_of_hand_light_skin_tone]=$'\U1F91A\U1F3FB'
+emoji[raised_back_of_hand_medium_light_skin_tone]=$'\U1F91A\U1F3FC'
+emoji[raised_back_of_hand_medium_skin_tone]=$'\U1F91A\U1F3FD'
+emoji[raised_back_of_hand_medium_dark_skin_tone]=$'\U1F91A\U1F3FE'
+emoji[raised_back_of_hand_dark_skin_tone]=$'\U1F91A\U1F3FF'
+emoji[hand_with_fingers_splayed]=$'\U1F590\UFE0F'
+emoji[hand_with_fingers_splayed_unqualified]=$'\U1F590'
+emoji[raised_hand_with_fingers_splayed]=$'\U1F590'
+emoji[hand_with_fingers_splayed_light_skin_tone]=$'\U1F590\U1F3FB'
+emoji[hand_with_fingers_splayed_medium_light_skin_tone]=$'\U1F590\U1F3FC'
+emoji[hand_with_fingers_splayed_medium_skin_tone]=$'\U1F590\U1F3FD'
+emoji[hand_with_fingers_splayed_medium_dark_skin_tone]=$'\U1F590\U1F3FE'
+emoji[hand_with_fingers_splayed_dark_skin_tone]=$'\U1F590\U1F3FF'
emoji[raised_hand]=$'\U270B'
-emoji[victory_hand]=$'\U270C'
-emoji[writing_hand]=$'\U270D'
-emoji[pencil]=$'\U270F'
-emoji[black_nib]=$'\U2712'
-emoji[heavy_check_mark]=$'\U2714'
-emoji[heavy_multiplication_x]=$'\U2716'
-emoji[latin_cross]=$'\U271D'
-emoji[star_of_david]=$'\U2721'
-emoji[sparkles]=$'\U2728'
-emoji[eight_spoked_asterisk]=$'\U2733'
-emoji[eight_pointed_black_star]=$'\U2734'
-emoji[snowflake]=$'\U2744'
-emoji[sparkle]=$'\U2747'
-emoji[cross_mark]=$'\U274C'
-emoji[negative_squared_cross_mark]=$'\U274E'
-emoji[black_question_mark_ornament]=$'\U2753'
-emoji[white_question_mark_ornament]=$'\U2754'
-emoji[white_exclamation_mark_ornament]=$'\U2755'
-emoji[heavy_exclamation_mark_symbol]=$'\U2757'
-emoji[heavy_heart_exclamation_mark_ornament]=$'\U2763'
-emoji[heavy_black_heart]=$'\U2764'
-emoji[heavy_plus_sign]=$'\U2795'
-emoji[heavy_minus_sign]=$'\U2796'
-emoji[heavy_division_sign]=$'\U2797'
-emoji[black_rightwards_arrow]=$'\U27A1'
-emoji[curly_loop]=$'\U27B0'
-emoji[double_curly_loop]=$'\U27BF'
-emoji[arrow_pointing_rightwards_then_curving_upwards]=$'\U2934'
-emoji[arrow_pointing_rightwards_then_curving_downwards]=$'\U2935'
-emoji[leftwards_black_arrow]=$'\U2B05'
-emoji[upwards_black_arrow]=$'\U2B06'
-emoji[downwards_black_arrow]=$'\U2B07'
-emoji[black_large_square]=$'\U2B1B'
-emoji[white_large_square]=$'\U2B1C'
-emoji[white_medium_star]=$'\U2B50'
-emoji[heavy_large_circle]=$'\U2B55'
-emoji[wavy_dash]=$'\U3030'
-emoji[part_alternation_mark]=$'\U303D'
-emoji[circled_ideograph_congratulation]=$'\U3297'
-emoji[circled_ideograph_secret]=$'\U3299'
-emoji[mahjong_tile_red_dragon]=$'\U1F004'
-emoji[playing_card_black_joker]=$'\U1F0CF'
-emoji[negative_squared_latin_capital_letter_a]=$'\U1F170'
-emoji[negative_squared_latin_capital_letter_b]=$'\U1F171'
-emoji[negative_squared_latin_capital_letter_o]=$'\U1F17E'
-emoji[negative_squared_latin_capital_letter_p]=$'\U1F17F'
-emoji[negative_squared_ab]=$'\U1F18E'
-emoji[squared_cl]=$'\U1F191'
-emoji[squared_cool]=$'\U1F192'
-emoji[squared_free]=$'\U1F193'
-emoji[squared_id]=$'\U1F194'
-emoji[squared_new]=$'\U1F195'
-emoji[squared_ng]=$'\U1F196'
-emoji[squared_ok]=$'\U1F197'
-emoji[squared_sos]=$'\U1F198'
-emoji[squared_up_with_exclamation_mark]=$'\U1F199'
-emoji[squared_vs]=$'\U1F19A'
-emoji[squared_katakana_koko]=$'\U1F201'
-emoji[squared_katakana_sa]=$'\U1F202'
-emoji[squared_cjk_unified_ideograph_7121]=$'\U1F21A'
-emoji[squared_cjk_unified_ideograph_6307]=$'\U1F22F'
-emoji[squared_cjk_unified_ideograph_7981]=$'\U1F232'
-emoji[squared_cjk_unified_ideograph_7a7a]=$'\U1F233'
-emoji[squared_cjk_unified_ideograph_5408]=$'\U1F234'
-emoji[squared_cjk_unified_ideograph_6e80]=$'\U1F235'
-emoji[squared_cjk_unified_ideograph_6709]=$'\U1F236'
-emoji[squared_cjk_unified_ideograph_6708]=$'\U1F237'
-emoji[squared_cjk_unified_ideograph_7533]=$'\U1F238'
-emoji[squared_cjk_unified_ideograph_5272]=$'\U1F239'
-emoji[squared_cjk_unified_ideograph_55b6]=$'\U1F23A'
-emoji[circled_ideograph_advantage]=$'\U1F250'
-emoji[circled_ideograph_accept]=$'\U1F251'
-emoji[cyclone]=$'\U1F300'
-emoji[foggy]=$'\U1F301'
-emoji[closed_umbrella]=$'\U1F302'
-emoji[night_with_stars]=$'\U1F303'
-emoji[sunrise_over_mountains]=$'\U1F304'
-emoji[sunrise]=$'\U1F305'
-emoji[cityscape_at_dusk]=$'\U1F306'
-emoji[sunset_over_buildings]=$'\U1F307'
-emoji[rainbow]=$'\U1F308'
-emoji[bridge_at_night]=$'\U1F309'
-emoji[water_wave]=$'\U1F30A'
-emoji[volcano]=$'\U1F30B'
-emoji[milky_way]=$'\U1F30C'
-emoji[earth_globe_europe_africa]=$'\U1F30D'
-emoji[earth_globe_americas]=$'\U1F30E'
-emoji[earth_globe_asia_australia]=$'\U1F30F'
-emoji[globe_with_meridians]=$'\U1F310'
-emoji[new_moon_symbol]=$'\U1F311'
-emoji[waxing_crescent_moon_symbol]=$'\U1F312'
-emoji[first_quarter_moon_symbol]=$'\U1F313'
-emoji[waxing_gibbous_moon_symbol]=$'\U1F314'
-emoji[full_moon_symbol]=$'\U1F315'
-emoji[waning_gibbous_moon_symbol]=$'\U1F316'
-emoji[last_quarter_moon_symbol]=$'\U1F317'
-emoji[waning_crescent_moon_symbol]=$'\U1F318'
-emoji[crescent_moon]=$'\U1F319'
-emoji[new_moon_with_face]=$'\U1F31A'
-emoji[first_quarter_moon_with_face]=$'\U1F31B'
-emoji[last_quarter_moon_with_face]=$'\U1F31C'
-emoji[full_moon_with_face]=$'\U1F31D'
-emoji[sun_with_face]=$'\U1F31E'
-emoji[glowing_star]=$'\U1F31F'
-emoji[shooting_star]=$'\U1F320'
-emoji[thermometer]=$'\U1F321'
-emoji[white_sun_with_small_cloud]=$'\U1F324'
-emoji[white_sun_behind_cloud]=$'\U1F325'
-emoji[white_sun_behind_cloud_with_rain]=$'\U1F326'
-emoji[cloud_with_rain]=$'\U1F327'
-emoji[cloud_with_snow]=$'\U1F328'
-emoji[cloud_with_lightning]=$'\U1F329'
-emoji[cloud_with_tornado]=$'\U1F32A'
-emoji[fog]=$'\U1F32B'
-emoji[wind_blowing_face]=$'\U1F32C'
-emoji[hot_dog]=$'\U1F32D'
-emoji[taco]=$'\U1F32E'
-emoji[burrito]=$'\U1F32F'
-emoji[chestnut]=$'\U1F330'
+emoji[hand]=$'\U270B'
+emoji[raised_hand_light_skin_tone]=$'\U270B\U1F3FB'
+emoji[raised_hand_medium_light_skin_tone]=$'\U270B\U1F3FC'
+emoji[raised_hand_medium_skin_tone]=$'\U270B\U1F3FD'
+emoji[raised_hand_medium_dark_skin_tone]=$'\U270B\U1F3FE'
+emoji[raised_hand_dark_skin_tone]=$'\U270B\U1F3FF'
+emoji[vulcan_salute]=$'\U1F596'
+emoji[vulcan_salute_light_skin_tone]=$'\U1F596\U1F3FB'
+emoji[vulcan_salute_medium_light_skin_tone]=$'\U1F596\U1F3FC'
+emoji[vulcan_salute_medium_skin_tone]=$'\U1F596\U1F3FD'
+emoji[vulcan_salute_medium_dark_skin_tone]=$'\U1F596\U1F3FE'
+emoji[vulcan_salute_dark_skin_tone]=$'\U1F596\U1F3FF'
+emoji[OK_hand]=$'\U1F44C'
+emoji[ok_hand]=$'\U1F44C'
+emoji[OK_hand_light_skin_tone]=$'\U1F44C\U1F3FB'
+emoji[OK_hand_medium_light_skin_tone]=$'\U1F44C\U1F3FC'
+emoji[OK_hand_medium_skin_tone]=$'\U1F44C\U1F3FD'
+emoji[OK_hand_medium_dark_skin_tone]=$'\U1F44C\U1F3FE'
+emoji[OK_hand_dark_skin_tone]=$'\U1F44C\U1F3FF'
+emoji[pinching_hand]=$'\U1F90F'
+emoji[pinching_hand_light_skin_tone]=$'\U1F90F\U1F3FB'
+emoji[pinching_hand_medium_light_skin_tone]=$'\U1F90F\U1F3FC'
+emoji[pinching_hand_medium_skin_tone]=$'\U1F90F\U1F3FD'
+emoji[pinching_hand_medium_dark_skin_tone]=$'\U1F90F\U1F3FE'
+emoji[pinching_hand_dark_skin_tone]=$'\U1F90F\U1F3FF'
+emoji[victory_hand]=$'\U270C\UFE0F'
+emoji[v]=$'\U270C\UFE0F'
+emoji[victory_hand_unqualified]=$'\U270C'
+emoji[victory_hand_light_skin_tone]=$'\U270C\U1F3FB'
+emoji[victory_hand_medium_light_skin_tone]=$'\U270C\U1F3FC'
+emoji[victory_hand_medium_skin_tone]=$'\U270C\U1F3FD'
+emoji[victory_hand_medium_dark_skin_tone]=$'\U270C\U1F3FE'
+emoji[victory_hand_dark_skin_tone]=$'\U270C\U1F3FF'
+emoji[crossed_fingers]=$'\U1F91E'
+emoji[crossed_fingers_light_skin_tone]=$'\U1F91E\U1F3FB'
+emoji[crossed_fingers_medium_light_skin_tone]=$'\U1F91E\U1F3FC'
+emoji[crossed_fingers_medium_skin_tone]=$'\U1F91E\U1F3FD'
+emoji[crossed_fingers_medium_dark_skin_tone]=$'\U1F91E\U1F3FE'
+emoji[crossed_fingers_dark_skin_tone]=$'\U1F91E\U1F3FF'
+emoji[love_you_gesture]=$'\U1F91F'
+emoji[love_you_gesture_light_skin_tone]=$'\U1F91F\U1F3FB'
+emoji[love_you_gesture_medium_light_skin_tone]=$'\U1F91F\U1F3FC'
+emoji[love_you_gesture_medium_skin_tone]=$'\U1F91F\U1F3FD'
+emoji[love_you_gesture_medium_dark_skin_tone]=$'\U1F91F\U1F3FE'
+emoji[love_you_gesture_dark_skin_tone]=$'\U1F91F\U1F3FF'
+emoji[sign_of_the_horns]=$'\U1F918'
+emoji[metal]=$'\U1F918'
+emoji[sign_of_the_horns_light_skin_tone]=$'\U1F918\U1F3FB'
+emoji[sign_of_the_horns_medium_light_skin_tone]=$'\U1F918\U1F3FC'
+emoji[sign_of_the_horns_medium_skin_tone]=$'\U1F918\U1F3FD'
+emoji[sign_of_the_horns_medium_dark_skin_tone]=$'\U1F918\U1F3FE'
+emoji[sign_of_the_horns_dark_skin_tone]=$'\U1F918\U1F3FF'
+emoji[call_me_hand]=$'\U1F919'
+emoji[call_me_hand_light_skin_tone]=$'\U1F919\U1F3FB'
+emoji[call_me_hand_medium_light_skin_tone]=$'\U1F919\U1F3FC'
+emoji[call_me_hand_medium_skin_tone]=$'\U1F919\U1F3FD'
+emoji[call_me_hand_medium_dark_skin_tone]=$'\U1F919\U1F3FE'
+emoji[call_me_hand_dark_skin_tone]=$'\U1F919\U1F3FF'
+emoji[backhand_index_pointing_left]=$'\U1F448'
+emoji[point_left]=$'\U1F448'
+emoji[backhand_index_pointing_left_light_skin_tone]=$'\U1F448\U1F3FB'
+emoji[backhand_index_pointing_left_medium_light_skin_tone]=$'\U1F448\U1F3FC'
+emoji[backhand_index_pointing_left_medium_skin_tone]=$'\U1F448\U1F3FD'
+emoji[backhand_index_pointing_left_medium_dark_skin_tone]=$'\U1F448\U1F3FE'
+emoji[backhand_index_pointing_left_dark_skin_tone]=$'\U1F448\U1F3FF'
+emoji[backhand_index_pointing_right]=$'\U1F449'
+emoji[point_right]=$'\U1F449'
+emoji[backhand_index_pointing_right_light_skin_tone]=$'\U1F449\U1F3FB'
+emoji[backhand_index_pointing_right_medium_light_skin_tone]=$'\U1F449\U1F3FC'
+emoji[backhand_index_pointing_right_medium_skin_tone]=$'\U1F449\U1F3FD'
+emoji[backhand_index_pointing_right_medium_dark_skin_tone]=$'\U1F449\U1F3FE'
+emoji[backhand_index_pointing_right_dark_skin_tone]=$'\U1F449\U1F3FF'
+emoji[backhand_index_pointing_up]=$'\U1F446'
+emoji[point_up_2]=$'\U1F446'
+emoji[backhand_index_pointing_up_light_skin_tone]=$'\U1F446\U1F3FB'
+emoji[backhand_index_pointing_up_medium_light_skin_tone]=$'\U1F446\U1F3FC'
+emoji[backhand_index_pointing_up_medium_skin_tone]=$'\U1F446\U1F3FD'
+emoji[backhand_index_pointing_up_medium_dark_skin_tone]=$'\U1F446\U1F3FE'
+emoji[backhand_index_pointing_up_dark_skin_tone]=$'\U1F446\U1F3FF'
+emoji[middle_finger]=$'\U1F595'
+emoji[fu]=$'\U1F595'
+emoji[middle_finger_light_skin_tone]=$'\U1F595\U1F3FB'
+emoji[middle_finger_medium_light_skin_tone]=$'\U1F595\U1F3FC'
+emoji[middle_finger_medium_skin_tone]=$'\U1F595\U1F3FD'
+emoji[middle_finger_medium_dark_skin_tone]=$'\U1F595\U1F3FE'
+emoji[middle_finger_dark_skin_tone]=$'\U1F595\U1F3FF'
+emoji[backhand_index_pointing_down]=$'\U1F447'
+emoji[point_down]=$'\U1F447'
+emoji[backhand_index_pointing_down_light_skin_tone]=$'\U1F447\U1F3FB'
+emoji[backhand_index_pointing_down_medium_light_skin_tone]=$'\U1F447\U1F3FC'
+emoji[backhand_index_pointing_down_medium_skin_tone]=$'\U1F447\U1F3FD'
+emoji[backhand_index_pointing_down_medium_dark_skin_tone]=$'\U1F447\U1F3FE'
+emoji[backhand_index_pointing_down_dark_skin_tone]=$'\U1F447\U1F3FF'
+emoji[index_pointing_up]=$'\U261D\UFE0F'
+emoji[point_up]=$'\U261D\UFE0F'
+emoji[index_pointing_up_unqualified]=$'\U261D'
+emoji[index_pointing_up_light_skin_tone]=$'\U261D\U1F3FB'
+emoji[index_pointing_up_medium_light_skin_tone]=$'\U261D\U1F3FC'
+emoji[index_pointing_up_medium_skin_tone]=$'\U261D\U1F3FD'
+emoji[index_pointing_up_medium_dark_skin_tone]=$'\U261D\U1F3FE'
+emoji[index_pointing_up_dark_skin_tone]=$'\U261D\U1F3FF'
+emoji[thumbs_up]=$'\U1F44D'
+emoji[+1]=$'\U1F44D'
+emoji[thumbsup]=$'\U1F44D'
+emoji[thumbs_up_light_skin_tone]=$'\U1F44D\U1F3FB'
+emoji[thumbs_up_medium_light_skin_tone]=$'\U1F44D\U1F3FC'
+emoji[thumbs_up_medium_skin_tone]=$'\U1F44D\U1F3FD'
+emoji[thumbs_up_medium_dark_skin_tone]=$'\U1F44D\U1F3FE'
+emoji[thumbs_up_dark_skin_tone]=$'\U1F44D\U1F3FF'
+emoji[thumbs_down]=$'\U1F44E'
+emoji[-1]=$'\U1F44E'
+emoji[thumbsdown]=$'\U1F44E'
+emoji[thumbs_down_light_skin_tone]=$'\U1F44E\U1F3FB'
+emoji[thumbs_down_medium_light_skin_tone]=$'\U1F44E\U1F3FC'
+emoji[thumbs_down_medium_skin_tone]=$'\U1F44E\U1F3FD'
+emoji[thumbs_down_medium_dark_skin_tone]=$'\U1F44E\U1F3FE'
+emoji[thumbs_down_dark_skin_tone]=$'\U1F44E\U1F3FF'
+emoji[raised_fist]=$'\U270A'
+emoji[fist_raised]=$'\U270A'
+emoji[fist]=$'\U270A'
+emoji[raised_fist_light_skin_tone]=$'\U270A\U1F3FB'
+emoji[raised_fist_medium_light_skin_tone]=$'\U270A\U1F3FC'
+emoji[raised_fist_medium_skin_tone]=$'\U270A\U1F3FD'
+emoji[raised_fist_medium_dark_skin_tone]=$'\U270A\U1F3FE'
+emoji[raised_fist_dark_skin_tone]=$'\U270A\U1F3FF'
+emoji[oncoming_fist]=$'\U1F44A'
+emoji[fist_oncoming]=$'\U1F44A'
+emoji[facepunch]=$'\U1F44A'
+emoji[punch]=$'\U1F44A'
+emoji[oncoming_fist_light_skin_tone]=$'\U1F44A\U1F3FB'
+emoji[oncoming_fist_medium_light_skin_tone]=$'\U1F44A\U1F3FC'
+emoji[oncoming_fist_medium_skin_tone]=$'\U1F44A\U1F3FD'
+emoji[oncoming_fist_medium_dark_skin_tone]=$'\U1F44A\U1F3FE'
+emoji[oncoming_fist_dark_skin_tone]=$'\U1F44A\U1F3FF'
+emoji[left_facing_fist]=$'\U1F91B'
+emoji[fist_left]=$'\U1F91B'
+emoji[left_facing_fist_light_skin_tone]=$'\U1F91B\U1F3FB'
+emoji[left_facing_fist_medium_light_skin_tone]=$'\U1F91B\U1F3FC'
+emoji[left_facing_fist_medium_skin_tone]=$'\U1F91B\U1F3FD'
+emoji[left_facing_fist_medium_dark_skin_tone]=$'\U1F91B\U1F3FE'
+emoji[left_facing_fist_dark_skin_tone]=$'\U1F91B\U1F3FF'
+emoji[right_facing_fist]=$'\U1F91C'
+emoji[fist_right]=$'\U1F91C'
+emoji[right_facing_fist_light_skin_tone]=$'\U1F91C\U1F3FB'
+emoji[right_facing_fist_medium_light_skin_tone]=$'\U1F91C\U1F3FC'
+emoji[right_facing_fist_medium_skin_tone]=$'\U1F91C\U1F3FD'
+emoji[right_facing_fist_medium_dark_skin_tone]=$'\U1F91C\U1F3FE'
+emoji[right_facing_fist_dark_skin_tone]=$'\U1F91C\U1F3FF'
+emoji[clapping_hands]=$'\U1F44F'
+emoji[clap]=$'\U1F44F'
+emoji[clapping_hands_light_skin_tone]=$'\U1F44F\U1F3FB'
+emoji[clapping_hands_medium_light_skin_tone]=$'\U1F44F\U1F3FC'
+emoji[clapping_hands_medium_skin_tone]=$'\U1F44F\U1F3FD'
+emoji[clapping_hands_medium_dark_skin_tone]=$'\U1F44F\U1F3FE'
+emoji[clapping_hands_dark_skin_tone]=$'\U1F44F\U1F3FF'
+emoji[raising_hands]=$'\U1F64C'
+emoji[raised_hands]=$'\U1F64C'
+emoji[raising_hands_light_skin_tone]=$'\U1F64C\U1F3FB'
+emoji[raising_hands_medium_light_skin_tone]=$'\U1F64C\U1F3FC'
+emoji[raising_hands_medium_skin_tone]=$'\U1F64C\U1F3FD'
+emoji[raising_hands_medium_dark_skin_tone]=$'\U1F64C\U1F3FE'
+emoji[raising_hands_dark_skin_tone]=$'\U1F64C\U1F3FF'
+emoji[open_hands]=$'\U1F450'
+emoji[open_hands_light_skin_tone]=$'\U1F450\U1F3FB'
+emoji[open_hands_medium_light_skin_tone]=$'\U1F450\U1F3FC'
+emoji[open_hands_medium_skin_tone]=$'\U1F450\U1F3FD'
+emoji[open_hands_medium_dark_skin_tone]=$'\U1F450\U1F3FE'
+emoji[open_hands_dark_skin_tone]=$'\U1F450\U1F3FF'
+emoji[palms_up_together]=$'\U1F932'
+emoji[palms_up_together_light_skin_tone]=$'\U1F932\U1F3FB'
+emoji[palms_up_together_medium_light_skin_tone]=$'\U1F932\U1F3FC'
+emoji[palms_up_together_medium_skin_tone]=$'\U1F932\U1F3FD'
+emoji[palms_up_together_medium_dark_skin_tone]=$'\U1F932\U1F3FE'
+emoji[palms_up_together_dark_skin_tone]=$'\U1F932\U1F3FF'
+emoji[handshake]=$'\U1F91D'
+emoji[folded_hands]=$'\U1F64F'
+emoji[pray]=$'\U1F64F'
+emoji[folded_hands_light_skin_tone]=$'\U1F64F\U1F3FB'
+emoji[folded_hands_medium_light_skin_tone]=$'\U1F64F\U1F3FC'
+emoji[folded_hands_medium_skin_tone]=$'\U1F64F\U1F3FD'
+emoji[folded_hands_medium_dark_skin_tone]=$'\U1F64F\U1F3FE'
+emoji[folded_hands_dark_skin_tone]=$'\U1F64F\U1F3FF'
+emoji[writing_hand]=$'\U270D\UFE0F'
+emoji[writing_hand_unqualified]=$'\U270D'
+emoji[writing_hand_light_skin_tone]=$'\U270D\U1F3FB'
+emoji[writing_hand_medium_light_skin_tone]=$'\U270D\U1F3FC'
+emoji[writing_hand_medium_skin_tone]=$'\U270D\U1F3FD'
+emoji[writing_hand_medium_dark_skin_tone]=$'\U270D\U1F3FE'
+emoji[writing_hand_dark_skin_tone]=$'\U270D\U1F3FF'
+emoji[nail_polish]=$'\U1F485'
+emoji[nail_care]=$'\U1F485'
+emoji[nail_polish_light_skin_tone]=$'\U1F485\U1F3FB'
+emoji[nail_polish_medium_light_skin_tone]=$'\U1F485\U1F3FC'
+emoji[nail_polish_medium_skin_tone]=$'\U1F485\U1F3FD'
+emoji[nail_polish_medium_dark_skin_tone]=$'\U1F485\U1F3FE'
+emoji[nail_polish_dark_skin_tone]=$'\U1F485\U1F3FF'
+emoji[selfie]=$'\U1F933'
+emoji[selfie_light_skin_tone]=$'\U1F933\U1F3FB'
+emoji[selfie_medium_light_skin_tone]=$'\U1F933\U1F3FC'
+emoji[selfie_medium_skin_tone]=$'\U1F933\U1F3FD'
+emoji[selfie_medium_dark_skin_tone]=$'\U1F933\U1F3FE'
+emoji[selfie_dark_skin_tone]=$'\U1F933\U1F3FF'
+emoji[flexed_biceps]=$'\U1F4AA'
+emoji[muscle]=$'\U1F4AA'
+emoji[flexed_biceps_light_skin_tone]=$'\U1F4AA\U1F3FB'
+emoji[flexed_biceps_medium_light_skin_tone]=$'\U1F4AA\U1F3FC'
+emoji[flexed_biceps_medium_skin_tone]=$'\U1F4AA\U1F3FD'
+emoji[flexed_biceps_medium_dark_skin_tone]=$'\U1F4AA\U1F3FE'
+emoji[flexed_biceps_dark_skin_tone]=$'\U1F4AA\U1F3FF'
+emoji[mechanical_arm]=$'\U1F9BE'
+emoji[mechanical_leg]=$'\U1F9BF'
+emoji[mechanical_leg_1]=$'\U1F9B5'
+emoji[leg]=$'\U1F9B5'
+emoji[leg_light_skin_tone]=$'\U1F9B5\U1F3FB'
+emoji[leg_medium_light_skin_tone]=$'\U1F9B5\U1F3FC'
+emoji[leg_medium_skin_tone]=$'\U1F9B5\U1F3FD'
+emoji[leg_medium_dark_skin_tone]=$'\U1F9B5\U1F3FE'
+emoji[leg_dark_skin_tone]=$'\U1F9B5\U1F3FF'
+emoji[foot]=$'\U1F9B6'
+emoji[foot_light_skin_tone]=$'\U1F9B6\U1F3FB'
+emoji[foot_medium_light_skin_tone]=$'\U1F9B6\U1F3FC'
+emoji[foot_medium_skin_tone]=$'\U1F9B6\U1F3FD'
+emoji[foot_medium_dark_skin_tone]=$'\U1F9B6\U1F3FE'
+emoji[foot_dark_skin_tone]=$'\U1F9B6\U1F3FF'
+emoji[ear]=$'\U1F442'
+emoji[ear_light_skin_tone]=$'\U1F442\U1F3FB'
+emoji[ear_medium_light_skin_tone]=$'\U1F442\U1F3FC'
+emoji[ear_medium_skin_tone]=$'\U1F442\U1F3FD'
+emoji[ear_medium_dark_skin_tone]=$'\U1F442\U1F3FE'
+emoji[ear_dark_skin_tone]=$'\U1F442\U1F3FF'
+emoji[ear_with_hearing_aid]=$'\U1F9BB'
+emoji[ear_with_hearing_aid_light_skin_tone]=$'\U1F9BB\U1F3FB'
+emoji[ear_with_hearing_aid_medium_light_skin_tone]=$'\U1F9BB\U1F3FC'
+emoji[ear_with_hearing_aid_medium_skin_tone]=$'\U1F9BB\U1F3FD'
+emoji[ear_with_hearing_aid_medium_dark_skin_tone]=$'\U1F9BB\U1F3FE'
+emoji[ear_with_hearing_aid_dark_skin_tone]=$'\U1F9BB\U1F3FF'
+emoji[nose]=$'\U1F443'
+emoji[nose_light_skin_tone]=$'\U1F443\U1F3FB'
+emoji[nose_medium_light_skin_tone]=$'\U1F443\U1F3FC'
+emoji[nose_medium_skin_tone]=$'\U1F443\U1F3FD'
+emoji[nose_medium_dark_skin_tone]=$'\U1F443\U1F3FE'
+emoji[nose_dark_skin_tone]=$'\U1F443\U1F3FF'
+emoji[brain]=$'\U1F9E0'
+emoji[tooth]=$'\U1F9B7'
+emoji[bone]=$'\U1F9B4'
+emoji[eyes]=$'\U1F440'
+emoji[eyes_1]=$'\U1F441\UFE0F'
+emoji[eye_unqualified]=$'\U1F441'
+emoji[eye]=$'\U1F441'
+emoji[tongue]=$'\U1F445'
+emoji[mouth]=$'\U1F444'
+emoji[lips]=$'\U1F444'
+emoji[baby]=$'\U1F476'
+emoji[baby_light_skin_tone]=$'\U1F476\U1F3FB'
+emoji[baby_medium_light_skin_tone]=$'\U1F476\U1F3FC'
+emoji[baby_medium_skin_tone]=$'\U1F476\U1F3FD'
+emoji[baby_medium_dark_skin_tone]=$'\U1F476\U1F3FE'
+emoji[baby_dark_skin_tone]=$'\U1F476\U1F3FF'
+emoji[child]=$'\U1F9D2'
+emoji[child_light_skin_tone]=$'\U1F9D2\U1F3FB'
+emoji[child_medium_light_skin_tone]=$'\U1F9D2\U1F3FC'
+emoji[child_medium_skin_tone]=$'\U1F9D2\U1F3FD'
+emoji[child_medium_dark_skin_tone]=$'\U1F9D2\U1F3FE'
+emoji[child_dark_skin_tone]=$'\U1F9D2\U1F3FF'
+emoji[boy]=$'\U1F466'
+emoji[boy_light_skin_tone]=$'\U1F466\U1F3FB'
+emoji[boy_medium_light_skin_tone]=$'\U1F466\U1F3FC'
+emoji[boy_medium_skin_tone]=$'\U1F466\U1F3FD'
+emoji[boy_medium_dark_skin_tone]=$'\U1F466\U1F3FE'
+emoji[boy_dark_skin_tone]=$'\U1F466\U1F3FF'
+emoji[girl]=$'\U1F467'
+emoji[girl_light_skin_tone]=$'\U1F467\U1F3FB'
+emoji[girl_medium_light_skin_tone]=$'\U1F467\U1F3FC'
+emoji[girl_medium_skin_tone]=$'\U1F467\U1F3FD'
+emoji[girl_medium_dark_skin_tone]=$'\U1F467\U1F3FE'
+emoji[girl_dark_skin_tone]=$'\U1F467\U1F3FF'
+emoji[person]=$'\U1F9D1'
+emoji[adult]=$'\U1F9D1'
+emoji[person_light_skin_tone]=$'\U1F9D1\U1F3FB'
+emoji[person_medium_light_skin_tone]=$'\U1F9D1\U1F3FC'
+emoji[person_medium_skin_tone]=$'\U1F9D1\U1F3FD'
+emoji[person_medium_dark_skin_tone]=$'\U1F9D1\U1F3FE'
+emoji[person_dark_skin_tone]=$'\U1F9D1\U1F3FF'
+emoji[person_blond_hair]=$'\U1F471'
+emoji[blond_haired_person]=$'\U1F471'
+emoji[person_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB'
+emoji[person_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC'
+emoji[person_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD'
+emoji[person_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE'
+emoji[person_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF'
+emoji[man]=$'\U1F468'
+emoji[man_light_skin_tone]=$'\U1F468\U1F3FB'
+emoji[man_medium_light_skin_tone]=$'\U1F468\U1F3FC'
+emoji[man_medium_skin_tone]=$'\U1F468\U1F3FD'
+emoji[man_medium_dark_skin_tone]=$'\U1F468\U1F3FE'
+emoji[man_dark_skin_tone]=$'\U1F468\U1F3FF'
+emoji[man_beard]=$'\U1F9D4'
+emoji[bearded_person]=$'\U1F9D4'
+emoji[man_light_skin_tone_beard]=$'\U1F9D4\U1F3FB'
+emoji[man_medium_light_skin_tone_beard]=$'\U1F9D4\U1F3FC'
+emoji[man_medium_skin_tone_beard]=$'\U1F9D4\U1F3FD'
+emoji[man_medium_dark_skin_tone_beard]=$'\U1F9D4\U1F3FE'
+emoji[man_dark_skin_tone_beard]=$'\U1F9D4\U1F3FF'
+emoji[man_blond_hair]=$'\U1F471\U200D\U2642\UFE0F'
+emoji[man_blond_hair_minimally]=$'\U1F471\U200D\U2642'
+emoji[blond_haired_man]=$'\U1F471\U200D\U2642'
+emoji[man_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FB\U200D\U2642'
+emoji[man_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_medium_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FC\U200D\U2642'
+emoji[man_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_medium_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FD\U200D\U2642'
+emoji[man_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_medium_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FE\U200D\U2642'
+emoji[man_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FF\U200D\U2642'
+emoji[man_red_hair]=$'\U1F468\U200D\U1F9B0'
+emoji[red_haired_man]=$'\U1F468\U200D\U1F9B0'
+emoji[man_light_skin_tone_red_hair]=$'\U1F468\U1F3FB\U200D\U1F9B0'
+emoji[man_medium_light_skin_tone_red_hair]=$'\U1F468\U1F3FC\U200D\U1F9B0'
+emoji[man_medium_skin_tone_red_hair]=$'\U1F468\U1F3FD\U200D\U1F9B0'
+emoji[man_medium_dark_skin_tone_red_hair]=$'\U1F468\U1F3FE\U200D\U1F9B0'
+emoji[man_dark_skin_tone_red_hair]=$'\U1F468\U1F3FF\U200D\U1F9B0'
+emoji[man_curly_hair]=$'\U1F468\U200D\U1F9B1'
+emoji[curly_haired_man]=$'\U1F468\U200D\U1F9B1'
+emoji[man_light_skin_tone_curly_hair]=$'\U1F468\U1F3FB\U200D\U1F9B1'
+emoji[man_medium_light_skin_tone_curly_hair]=$'\U1F468\U1F3FC\U200D\U1F9B1'
+emoji[man_medium_skin_tone_curly_hair]=$'\U1F468\U1F3FD\U200D\U1F9B1'
+emoji[man_medium_dark_skin_tone_curly_hair]=$'\U1F468\U1F3FE\U200D\U1F9B1'
+emoji[man_dark_skin_tone_curly_hair]=$'\U1F468\U1F3FF\U200D\U1F9B1'
+emoji[man_white_hair]=$'\U1F468\U200D\U1F9B3'
+emoji[white_haired_man]=$'\U1F468\U200D\U1F9B3'
+emoji[man_light_skin_tone_white_hair]=$'\U1F468\U1F3FB\U200D\U1F9B3'
+emoji[man_medium_light_skin_tone_white_hair]=$'\U1F468\U1F3FC\U200D\U1F9B3'
+emoji[man_medium_skin_tone_white_hair]=$'\U1F468\U1F3FD\U200D\U1F9B3'
+emoji[man_medium_dark_skin_tone_white_hair]=$'\U1F468\U1F3FE\U200D\U1F9B3'
+emoji[man_dark_skin_tone_white_hair]=$'\U1F468\U1F3FF\U200D\U1F9B3'
+emoji[man_bald]=$'\U1F468\U200D\U1F9B2'
+emoji[bald_man]=$'\U1F468\U200D\U1F9B2'
+emoji[man_light_skin_tone_bald]=$'\U1F468\U1F3FB\U200D\U1F9B2'
+emoji[man_medium_light_skin_tone_bald]=$'\U1F468\U1F3FC\U200D\U1F9B2'
+emoji[man_medium_skin_tone_bald]=$'\U1F468\U1F3FD\U200D\U1F9B2'
+emoji[man_medium_dark_skin_tone_bald]=$'\U1F468\U1F3FE\U200D\U1F9B2'
+emoji[man_dark_skin_tone_bald]=$'\U1F468\U1F3FF\U200D\U1F9B2'
+emoji[woman]=$'\U1F469'
+emoji[woman_light_skin_tone]=$'\U1F469\U1F3FB'
+emoji[woman_medium_light_skin_tone]=$'\U1F469\U1F3FC'
+emoji[woman_medium_skin_tone]=$'\U1F469\U1F3FD'
+emoji[woman_medium_dark_skin_tone]=$'\U1F469\U1F3FE'
+emoji[woman_dark_skin_tone]=$'\U1F469\U1F3FF'
+emoji[woman_blond_hair]=$'\U1F471\U200D\U2640\UFE0F'
+emoji[woman_blond_hair_minimally]=$'\U1F471\U200D\U2640'
+emoji[blond_haired_woman]=$'\U1F471\U200D\U2640'
+emoji[blonde_woman]=$'\U1F471\U200D\U2640'
+emoji[woman_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FB\U200D\U2640'
+emoji[woman_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_medium_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FC\U200D\U2640'
+emoji[woman_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_medium_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FD\U200D\U2640'
+emoji[woman_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_medium_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FE\U200D\U2640'
+emoji[woman_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FF\U200D\U2640'
+emoji[woman_red_hair]=$'\U1F469\U200D\U1F9B0'
+emoji[red_haired_woman]=$'\U1F469\U200D\U1F9B0'
+emoji[woman_light_skin_tone_red_hair]=$'\U1F469\U1F3FB\U200D\U1F9B0'
+emoji[woman_medium_light_skin_tone_red_hair]=$'\U1F469\U1F3FC\U200D\U1F9B0'
+emoji[woman_medium_skin_tone_red_hair]=$'\U1F469\U1F3FD\U200D\U1F9B0'
+emoji[woman_medium_dark_skin_tone_red_hair]=$'\U1F469\U1F3FE\U200D\U1F9B0'
+emoji[woman_dark_skin_tone_red_hair]=$'\U1F469\U1F3FF\U200D\U1F9B0'
+emoji[woman_curly_hair]=$'\U1F469\U200D\U1F9B1'
+emoji[curly_haired_woman]=$'\U1F469\U200D\U1F9B1'
+emoji[woman_light_skin_tone_curly_hair]=$'\U1F469\U1F3FB\U200D\U1F9B1'
+emoji[woman_medium_light_skin_tone_curly_hair]=$'\U1F469\U1F3FC\U200D\U1F9B1'
+emoji[woman_medium_skin_tone_curly_hair]=$'\U1F469\U1F3FD\U200D\U1F9B1'
+emoji[woman_medium_dark_skin_tone_curly_hair]=$'\U1F469\U1F3FE\U200D\U1F9B1'
+emoji[woman_dark_skin_tone_curly_hair]=$'\U1F469\U1F3FF\U200D\U1F9B1'
+emoji[woman_white_hair]=$'\U1F469\U200D\U1F9B3'
+emoji[white_haired_woman]=$'\U1F469\U200D\U1F9B3'
+emoji[woman_light_skin_tone_white_hair]=$'\U1F469\U1F3FB\U200D\U1F9B3'
+emoji[woman_medium_light_skin_tone_white_hair]=$'\U1F469\U1F3FC\U200D\U1F9B3'
+emoji[woman_medium_skin_tone_white_hair]=$'\U1F469\U1F3FD\U200D\U1F9B3'
+emoji[woman_medium_dark_skin_tone_white_hair]=$'\U1F469\U1F3FE\U200D\U1F9B3'
+emoji[woman_dark_skin_tone_white_hair]=$'\U1F469\U1F3FF\U200D\U1F9B3'
+emoji[woman_bald]=$'\U1F469\U200D\U1F9B2'
+emoji[bald_woman]=$'\U1F469\U200D\U1F9B2'
+emoji[woman_light_skin_tone_bald]=$'\U1F469\U1F3FB\U200D\U1F9B2'
+emoji[woman_medium_light_skin_tone_bald]=$'\U1F469\U1F3FC\U200D\U1F9B2'
+emoji[woman_medium_skin_tone_bald]=$'\U1F469\U1F3FD\U200D\U1F9B2'
+emoji[woman_medium_dark_skin_tone_bald]=$'\U1F469\U1F3FE\U200D\U1F9B2'
+emoji[woman_dark_skin_tone_bald]=$'\U1F469\U1F3FF\U200D\U1F9B2'
+emoji[older_person]=$'\U1F9D3'
+emoji[older_adult]=$'\U1F9D3'
+emoji[older_person_light_skin_tone]=$'\U1F9D3\U1F3FB'
+emoji[older_person_medium_light_skin_tone]=$'\U1F9D3\U1F3FC'
+emoji[older_person_medium_skin_tone]=$'\U1F9D3\U1F3FD'
+emoji[older_person_medium_dark_skin_tone]=$'\U1F9D3\U1F3FE'
+emoji[older_person_dark_skin_tone]=$'\U1F9D3\U1F3FF'
+emoji[old_man]=$'\U1F474'
+emoji[older_man]=$'\U1F474'
+emoji[old_man_light_skin_tone]=$'\U1F474\U1F3FB'
+emoji[old_man_medium_light_skin_tone]=$'\U1F474\U1F3FC'
+emoji[old_man_medium_skin_tone]=$'\U1F474\U1F3FD'
+emoji[old_man_medium_dark_skin_tone]=$'\U1F474\U1F3FE'
+emoji[old_man_dark_skin_tone]=$'\U1F474\U1F3FF'
+emoji[old_woman]=$'\U1F475'
+emoji[older_woman]=$'\U1F475'
+emoji[old_woman_light_skin_tone]=$'\U1F475\U1F3FB'
+emoji[old_woman_medium_light_skin_tone]=$'\U1F475\U1F3FC'
+emoji[old_woman_medium_skin_tone]=$'\U1F475\U1F3FD'
+emoji[old_woman_medium_dark_skin_tone]=$'\U1F475\U1F3FE'
+emoji[old_woman_dark_skin_tone]=$'\U1F475\U1F3FF'
+emoji[person_frowning]=$'\U1F64D'
+emoji[frowning_person]=$'\U1F64D'
+emoji[person_frowning_light_skin_tone]=$'\U1F64D\U1F3FB'
+emoji[person_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC'
+emoji[person_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD'
+emoji[person_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE'
+emoji[person_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF'
+emoji[man_frowning]=$'\U1F64D\U200D\U2642\UFE0F'
+emoji[man_frowning_minimally]=$'\U1F64D\U200D\U2642'
+emoji[frowning_man]=$'\U1F64D\U200D\U2642'
+emoji[man_frowning_light_skin_tone]=$'\U1F64D\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_frowning_light_skin_tone_minimally]=$'\U1F64D\U1F3FB\U200D\U2642'
+emoji[man_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_frowning_medium_light_skin_tone_minimally]=$'\U1F64D\U1F3FC\U200D\U2642'
+emoji[man_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_frowning_medium_skin_tone_minimally]=$'\U1F64D\U1F3FD\U200D\U2642'
+emoji[man_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_frowning_medium_dark_skin_tone_minimally]=$'\U1F64D\U1F3FE\U200D\U2642'
+emoji[man_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_frowning_dark_skin_tone_minimally]=$'\U1F64D\U1F3FF\U200D\U2642'
+emoji[woman_frowning]=$'\U1F64D\U200D\U2640\UFE0F'
+emoji[woman_frowning_minimally]=$'\U1F64D\U200D\U2640'
+emoji[frowning_woman]=$'\U1F64D\U200D\U2640'
+emoji[woman_frowning_light_skin_tone]=$'\U1F64D\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_frowning_light_skin_tone_minimally]=$'\U1F64D\U1F3FB\U200D\U2640'
+emoji[woman_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_frowning_medium_light_skin_tone_minimally]=$'\U1F64D\U1F3FC\U200D\U2640'
+emoji[woman_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_frowning_medium_skin_tone_minimally]=$'\U1F64D\U1F3FD\U200D\U2640'
+emoji[woman_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_frowning_medium_dark_skin_tone_minimally]=$'\U1F64D\U1F3FE\U200D\U2640'
+emoji[woman_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_frowning_dark_skin_tone_minimally]=$'\U1F64D\U1F3FF\U200D\U2640'
+emoji[person_pouting]=$'\U1F64E'
+emoji[person_pouting_light_skin_tone]=$'\U1F64E\U1F3FB'
+emoji[person_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC'
+emoji[person_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD'
+emoji[person_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE'
+emoji[person_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF'
+emoji[man_pouting]=$'\U1F64E\U200D\U2642\UFE0F'
+emoji[man_pouting_minimally]=$'\U1F64E\U200D\U2642'
+emoji[pouting_man]=$'\U1F64E\U200D\U2642'
+emoji[man_pouting_light_skin_tone]=$'\U1F64E\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_pouting_light_skin_tone_minimally]=$'\U1F64E\U1F3FB\U200D\U2642'
+emoji[man_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_pouting_medium_light_skin_tone_minimally]=$'\U1F64E\U1F3FC\U200D\U2642'
+emoji[man_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_pouting_medium_skin_tone_minimally]=$'\U1F64E\U1F3FD\U200D\U2642'
+emoji[man_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_pouting_medium_dark_skin_tone_minimally]=$'\U1F64E\U1F3FE\U200D\U2642'
+emoji[man_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_pouting_dark_skin_tone_minimally]=$'\U1F64E\U1F3FF\U200D\U2642'
+emoji[woman_pouting]=$'\U1F64E\U200D\U2640\UFE0F'
+emoji[woman_pouting_minimally]=$'\U1F64E\U200D\U2640'
+emoji[pouting_woman]=$'\U1F64E\U200D\U2640'
+emoji[woman_pouting_light_skin_tone]=$'\U1F64E\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_pouting_light_skin_tone_minimally]=$'\U1F64E\U1F3FB\U200D\U2640'
+emoji[woman_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_pouting_medium_light_skin_tone_minimally]=$'\U1F64E\U1F3FC\U200D\U2640'
+emoji[woman_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_pouting_medium_skin_tone_minimally]=$'\U1F64E\U1F3FD\U200D\U2640'
+emoji[woman_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_pouting_medium_dark_skin_tone_minimally]=$'\U1F64E\U1F3FE\U200D\U2640'
+emoji[woman_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_pouting_dark_skin_tone_minimally]=$'\U1F64E\U1F3FF\U200D\U2640'
+emoji[person_gesturing_NO]=$'\U1F645'
+emoji[no_good]=$'\U1F645'
+emoji[person_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB'
+emoji[person_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC'
+emoji[person_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD'
+emoji[person_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE'
+emoji[person_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF'
+emoji[man_gesturing_NO]=$'\U1F645\U200D\U2642\UFE0F'
+emoji[man_gesturing_NO_minimally]=$'\U1F645\U200D\U2642'
+emoji[no_good_man]=$'\U1F645\U200D\U2642'
+emoji[ng_man]=$'\U1F645\U200D\U2642'
+emoji[man_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_gesturing_NO_light_skin_tone_minimally]=$'\U1F645\U1F3FB\U200D\U2642'
+emoji[man_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_gesturing_NO_medium_light_skin_tone_minimally]=$'\U1F645\U1F3FC\U200D\U2642'
+emoji[man_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_gesturing_NO_medium_skin_tone_minimally]=$'\U1F645\U1F3FD\U200D\U2642'
+emoji[man_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_gesturing_NO_medium_dark_skin_tone_minimally]=$'\U1F645\U1F3FE\U200D\U2642'
+emoji[man_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_gesturing_NO_dark_skin_tone_minimally]=$'\U1F645\U1F3FF\U200D\U2642'
+emoji[woman_gesturing_NO]=$'\U1F645\U200D\U2640\UFE0F'
+emoji[woman_gesturing_NO_minimally]=$'\U1F645\U200D\U2640'
+emoji[no_good_woman]=$'\U1F645\U200D\U2640'
+emoji[ng_woman]=$'\U1F645\U200D\U2640'
+emoji[woman_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_gesturing_NO_light_skin_tone_minimally]=$'\U1F645\U1F3FB\U200D\U2640'
+emoji[woman_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_gesturing_NO_medium_light_skin_tone_minimally]=$'\U1F645\U1F3FC\U200D\U2640'
+emoji[woman_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_gesturing_NO_medium_skin_tone_minimally]=$'\U1F645\U1F3FD\U200D\U2640'
+emoji[woman_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_gesturing_NO_medium_dark_skin_tone_minimally]=$'\U1F645\U1F3FE\U200D\U2640'
+emoji[woman_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_gesturing_NO_dark_skin_tone_minimally]=$'\U1F645\U1F3FF\U200D\U2640'
+emoji[person_gesturing_OK]=$'\U1F646'
+emoji[ok_person]=$'\U1F646'
+emoji[person_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB'
+emoji[person_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC'
+emoji[person_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD'
+emoji[person_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE'
+emoji[person_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF'
+emoji[man_gesturing_OK]=$'\U1F646\U200D\U2642\UFE0F'
+emoji[man_gesturing_OK_minimally]=$'\U1F646\U200D\U2642'
+emoji[ok_man]=$'\U1F646\U200D\U2642'
+emoji[man_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_gesturing_OK_light_skin_tone_minimally]=$'\U1F646\U1F3FB\U200D\U2642'
+emoji[man_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_gesturing_OK_medium_light_skin_tone_minimally]=$'\U1F646\U1F3FC\U200D\U2642'
+emoji[man_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_gesturing_OK_medium_skin_tone_minimally]=$'\U1F646\U1F3FD\U200D\U2642'
+emoji[man_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_gesturing_OK_medium_dark_skin_tone_minimally]=$'\U1F646\U1F3FE\U200D\U2642'
+emoji[man_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_gesturing_OK_dark_skin_tone_minimally]=$'\U1F646\U1F3FF\U200D\U2642'
+emoji[woman_gesturing_OK]=$'\U1F646\U200D\U2640\UFE0F'
+emoji[woman_gesturing_OK_minimally]=$'\U1F646\U200D\U2640'
+emoji[ok_woman]=$'\U1F646\U200D\U2640'
+emoji[woman_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_gesturing_OK_light_skin_tone_minimally]=$'\U1F646\U1F3FB\U200D\U2640'
+emoji[woman_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_gesturing_OK_medium_light_skin_tone_minimally]=$'\U1F646\U1F3FC\U200D\U2640'
+emoji[woman_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_gesturing_OK_medium_skin_tone_minimally]=$'\U1F646\U1F3FD\U200D\U2640'
+emoji[woman_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_gesturing_OK_medium_dark_skin_tone_minimally]=$'\U1F646\U1F3FE\U200D\U2640'
+emoji[woman_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_gesturing_OK_dark_skin_tone_minimally]=$'\U1F646\U1F3FF\U200D\U2640'
+emoji[person_tipping_hand]=$'\U1F481'
+emoji[tipping_hand_person]=$'\U1F481'
+emoji[information_desk_person]=$'\U1F481'
+emoji[person_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB'
+emoji[person_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC'
+emoji[person_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD'
+emoji[person_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE'
+emoji[person_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF'
+emoji[man_tipping_hand]=$'\U1F481\U200D\U2642\UFE0F'
+emoji[man_tipping_hand_minimally]=$'\U1F481\U200D\U2642'
+emoji[tipping_hand_man]=$'\U1F481\U200D\U2642'
+emoji[sassy_man]=$'\U1F481\U200D\U2642'
+emoji[man_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_tipping_hand_light_skin_tone_minimally]=$'\U1F481\U1F3FB\U200D\U2642'
+emoji[man_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_tipping_hand_medium_light_skin_tone_minimally]=$'\U1F481\U1F3FC\U200D\U2642'
+emoji[man_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_tipping_hand_medium_skin_tone_minimally]=$'\U1F481\U1F3FD\U200D\U2642'
+emoji[man_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_tipping_hand_medium_dark_skin_tone_minimally]=$'\U1F481\U1F3FE\U200D\U2642'
+emoji[man_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_tipping_hand_dark_skin_tone_minimally]=$'\U1F481\U1F3FF\U200D\U2642'
+emoji[woman_tipping_hand]=$'\U1F481\U200D\U2640\UFE0F'
+emoji[woman_tipping_hand_minimally]=$'\U1F481\U200D\U2640'
+emoji[tipping_hand_woman]=$'\U1F481\U200D\U2640'
+emoji[sassy_woman]=$'\U1F481\U200D\U2640'
+emoji[woman_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_tipping_hand_light_skin_tone_minimally]=$'\U1F481\U1F3FB\U200D\U2640'
+emoji[woman_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_tipping_hand_medium_light_skin_tone_minimally]=$'\U1F481\U1F3FC\U200D\U2640'
+emoji[woman_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_tipping_hand_medium_skin_tone_minimally]=$'\U1F481\U1F3FD\U200D\U2640'
+emoji[woman_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_tipping_hand_medium_dark_skin_tone_minimally]=$'\U1F481\U1F3FE\U200D\U2640'
+emoji[woman_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_tipping_hand_dark_skin_tone_minimally]=$'\U1F481\U1F3FF\U200D\U2640'
+emoji[person_raising_hand]=$'\U1F64B'
+emoji[raising_hand]=$'\U1F64B'
+emoji[person_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB'
+emoji[person_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC'
+emoji[person_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD'
+emoji[person_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE'
+emoji[person_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF'
+emoji[man_raising_hand]=$'\U1F64B\U200D\U2642\UFE0F'
+emoji[man_raising_hand_minimally]=$'\U1F64B\U200D\U2642'
+emoji[raising_hand_man]=$'\U1F64B\U200D\U2642'
+emoji[man_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_raising_hand_light_skin_tone_minimally]=$'\U1F64B\U1F3FB\U200D\U2642'
+emoji[man_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_raising_hand_medium_light_skin_tone_minimally]=$'\U1F64B\U1F3FC\U200D\U2642'
+emoji[man_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_raising_hand_medium_skin_tone_minimally]=$'\U1F64B\U1F3FD\U200D\U2642'
+emoji[man_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_raising_hand_medium_dark_skin_tone_minimally]=$'\U1F64B\U1F3FE\U200D\U2642'
+emoji[man_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_raising_hand_dark_skin_tone_minimally]=$'\U1F64B\U1F3FF\U200D\U2642'
+emoji[woman_raising_hand]=$'\U1F64B\U200D\U2640\UFE0F'
+emoji[woman_raising_hand_minimally]=$'\U1F64B\U200D\U2640'
+emoji[raising_hand_woman]=$'\U1F64B\U200D\U2640'
+emoji[woman_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_raising_hand_light_skin_tone_minimally]=$'\U1F64B\U1F3FB\U200D\U2640'
+emoji[woman_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_raising_hand_medium_light_skin_tone_minimally]=$'\U1F64B\U1F3FC\U200D\U2640'
+emoji[woman_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_raising_hand_medium_skin_tone_minimally]=$'\U1F64B\U1F3FD\U200D\U2640'
+emoji[woman_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_raising_hand_medium_dark_skin_tone_minimally]=$'\U1F64B\U1F3FE\U200D\U2640'
+emoji[woman_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_raising_hand_dark_skin_tone_minimally]=$'\U1F64B\U1F3FF\U200D\U2640'
+emoji[deaf_person]=$'\U1F9CF'
+emoji[deaf_person_light_skin_tone]=$'\U1F9CF\U1F3FB'
+emoji[deaf_person_medium_light_skin_tone]=$'\U1F9CF\U1F3FC'
+emoji[deaf_person_medium_skin_tone]=$'\U1F9CF\U1F3FD'
+emoji[deaf_person_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE'
+emoji[deaf_person_dark_skin_tone]=$'\U1F9CF\U1F3FF'
+emoji[deaf_man]=$'\U1F9CF\U200D\U2642\UFE0F'
+emoji[deaf_man_minimally]=$'\U1F9CF\U200D\U2642'
+emoji[deaf_man_light_skin_tone]=$'\U1F9CF\U1F3FB\U200D\U2642\UFE0F'
+emoji[deaf_man_light_skin_tone_minimally]=$'\U1F9CF\U1F3FB\U200D\U2642'
+emoji[deaf_man_medium_light_skin_tone]=$'\U1F9CF\U1F3FC\U200D\U2642\UFE0F'
+emoji[deaf_man_medium_light_skin_tone_minimally]=$'\U1F9CF\U1F3FC\U200D\U2642'
+emoji[deaf_man_medium_skin_tone]=$'\U1F9CF\U1F3FD\U200D\U2642\UFE0F'
+emoji[deaf_man_medium_skin_tone_minimally]=$'\U1F9CF\U1F3FD\U200D\U2642'
+emoji[deaf_man_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE\U200D\U2642\UFE0F'
+emoji[deaf_man_medium_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FE\U200D\U2642'
+emoji[deaf_man_dark_skin_tone]=$'\U1F9CF\U1F3FF\U200D\U2642\UFE0F'
+emoji[deaf_man_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FF\U200D\U2642'
+emoji[deaf_woman]=$'\U1F9CF\U200D\U2640\UFE0F'
+emoji[deaf_woman_minimally]=$'\U1F9CF\U200D\U2640'
+emoji[deaf_woman_light_skin_tone]=$'\U1F9CF\U1F3FB\U200D\U2640\UFE0F'
+emoji[deaf_woman_light_skin_tone_minimally]=$'\U1F9CF\U1F3FB\U200D\U2640'
+emoji[deaf_woman_medium_light_skin_tone]=$'\U1F9CF\U1F3FC\U200D\U2640\UFE0F'
+emoji[deaf_woman_medium_light_skin_tone_minimally]=$'\U1F9CF\U1F3FC\U200D\U2640'
+emoji[deaf_woman_medium_skin_tone]=$'\U1F9CF\U1F3FD\U200D\U2640\UFE0F'
+emoji[deaf_woman_medium_skin_tone_minimally]=$'\U1F9CF\U1F3FD\U200D\U2640'
+emoji[deaf_woman_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE\U200D\U2640\UFE0F'
+emoji[deaf_woman_medium_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FE\U200D\U2640'
+emoji[deaf_woman_dark_skin_tone]=$'\U1F9CF\U1F3FF\U200D\U2640\UFE0F'
+emoji[deaf_woman_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FF\U200D\U2640'
+emoji[person_bowing]=$'\U1F647'
+emoji[bow]=$'\U1F647'
+emoji[person_bowing_light_skin_tone]=$'\U1F647\U1F3FB'
+emoji[person_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC'
+emoji[person_bowing_medium_skin_tone]=$'\U1F647\U1F3FD'
+emoji[person_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE'
+emoji[person_bowing_dark_skin_tone]=$'\U1F647\U1F3FF'
+emoji[man_bowing]=$'\U1F647\U200D\U2642\UFE0F'
+emoji[man_bowing_minimally]=$'\U1F647\U200D\U2642'
+emoji[bowing_man]=$'\U1F647\U200D\U2642'
+emoji[man_bowing_light_skin_tone]=$'\U1F647\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_bowing_light_skin_tone_minimally]=$'\U1F647\U1F3FB\U200D\U2642'
+emoji[man_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_bowing_medium_light_skin_tone_minimally]=$'\U1F647\U1F3FC\U200D\U2642'
+emoji[man_bowing_medium_skin_tone]=$'\U1F647\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_bowing_medium_skin_tone_minimally]=$'\U1F647\U1F3FD\U200D\U2642'
+emoji[man_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_bowing_medium_dark_skin_tone_minimally]=$'\U1F647\U1F3FE\U200D\U2642'
+emoji[man_bowing_dark_skin_tone]=$'\U1F647\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_bowing_dark_skin_tone_minimally]=$'\U1F647\U1F3FF\U200D\U2642'
+emoji[woman_bowing]=$'\U1F647\U200D\U2640\UFE0F'
+emoji[woman_bowing_minimally]=$'\U1F647\U200D\U2640'
+emoji[bowing_woman]=$'\U1F647\U200D\U2640'
+emoji[woman_bowing_light_skin_tone]=$'\U1F647\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_bowing_light_skin_tone_minimally]=$'\U1F647\U1F3FB\U200D\U2640'
+emoji[woman_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_bowing_medium_light_skin_tone_minimally]=$'\U1F647\U1F3FC\U200D\U2640'
+emoji[woman_bowing_medium_skin_tone]=$'\U1F647\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_bowing_medium_skin_tone_minimally]=$'\U1F647\U1F3FD\U200D\U2640'
+emoji[woman_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_bowing_medium_dark_skin_tone_minimally]=$'\U1F647\U1F3FE\U200D\U2640'
+emoji[woman_bowing_dark_skin_tone]=$'\U1F647\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_bowing_dark_skin_tone_minimally]=$'\U1F647\U1F3FF\U200D\U2640'
+emoji[person_facepalming]=$'\U1F926'
+emoji[facepalm]=$'\U1F926'
+emoji[person_facepalming_light_skin_tone]=$'\U1F926\U1F3FB'
+emoji[person_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC'
+emoji[person_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD'
+emoji[person_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE'
+emoji[person_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF'
+emoji[man_facepalming]=$'\U1F926\U200D\U2642\UFE0F'
+emoji[man_facepalming_minimally]=$'\U1F926\U200D\U2642'
+emoji[man_facepalming_light_skin_tone]=$'\U1F926\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_facepalming_light_skin_tone_minimally]=$'\U1F926\U1F3FB\U200D\U2642'
+emoji[man_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_facepalming_medium_light_skin_tone_minimally]=$'\U1F926\U1F3FC\U200D\U2642'
+emoji[man_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_facepalming_medium_skin_tone_minimally]=$'\U1F926\U1F3FD\U200D\U2642'
+emoji[man_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_facepalming_medium_dark_skin_tone_minimally]=$'\U1F926\U1F3FE\U200D\U2642'
+emoji[man_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_facepalming_dark_skin_tone_minimally]=$'\U1F926\U1F3FF\U200D\U2642'
+emoji[woman_facepalming]=$'\U1F926\U200D\U2640\UFE0F'
+emoji[woman_facepalming_minimally]=$'\U1F926\U200D\U2640'
+emoji[woman_facepalming_light_skin_tone]=$'\U1F926\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_facepalming_light_skin_tone_minimally]=$'\U1F926\U1F3FB\U200D\U2640'
+emoji[woman_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_facepalming_medium_light_skin_tone_minimally]=$'\U1F926\U1F3FC\U200D\U2640'
+emoji[woman_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_facepalming_medium_skin_tone_minimally]=$'\U1F926\U1F3FD\U200D\U2640'
+emoji[woman_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_facepalming_medium_dark_skin_tone_minimally]=$'\U1F926\U1F3FE\U200D\U2640'
+emoji[woman_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_facepalming_dark_skin_tone_minimally]=$'\U1F926\U1F3FF\U200D\U2640'
+emoji[person_shrugging]=$'\U1F937'
+emoji[shrug]=$'\U1F937'
+emoji[person_shrugging_light_skin_tone]=$'\U1F937\U1F3FB'
+emoji[person_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC'
+emoji[person_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD'
+emoji[person_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE'
+emoji[person_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF'
+emoji[man_shrugging]=$'\U1F937\U200D\U2642\UFE0F'
+emoji[man_shrugging_minimally]=$'\U1F937\U200D\U2642'
+emoji[man_shrugging_light_skin_tone]=$'\U1F937\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_shrugging_light_skin_tone_minimally]=$'\U1F937\U1F3FB\U200D\U2642'
+emoji[man_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_shrugging_medium_light_skin_tone_minimally]=$'\U1F937\U1F3FC\U200D\U2642'
+emoji[man_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_shrugging_medium_skin_tone_minimally]=$'\U1F937\U1F3FD\U200D\U2642'
+emoji[man_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_shrugging_medium_dark_skin_tone_minimally]=$'\U1F937\U1F3FE\U200D\U2642'
+emoji[man_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_shrugging_dark_skin_tone_minimally]=$'\U1F937\U1F3FF\U200D\U2642'
+emoji[woman_shrugging]=$'\U1F937\U200D\U2640\UFE0F'
+emoji[woman_shrugging_minimally]=$'\U1F937\U200D\U2640'
+emoji[woman_shrugging_light_skin_tone]=$'\U1F937\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_shrugging_light_skin_tone_minimally]=$'\U1F937\U1F3FB\U200D\U2640'
+emoji[woman_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_shrugging_medium_light_skin_tone_minimally]=$'\U1F937\U1F3FC\U200D\U2640'
+emoji[woman_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_shrugging_medium_skin_tone_minimally]=$'\U1F937\U1F3FD\U200D\U2640'
+emoji[woman_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_shrugging_medium_dark_skin_tone_minimally]=$'\U1F937\U1F3FE\U200D\U2640'
+emoji[woman_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_shrugging_dark_skin_tone_minimally]=$'\U1F937\U1F3FF\U200D\U2640'
+emoji[man_health_worker]=$'\U1F468\U200D\U2695\UFE0F'
+emoji[man_health_worker_minimally]=$'\U1F468\U200D\U2695'
+emoji[man_health_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2695\UFE0F'
+emoji[man_health_worker_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2695'
+emoji[man_health_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2695\UFE0F'
+emoji[man_health_worker_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2695'
+emoji[man_health_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2695\UFE0F'
+emoji[man_health_worker_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2695'
+emoji[man_health_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2695\UFE0F'
+emoji[man_health_worker_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2695'
+emoji[man_health_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2695\UFE0F'
+emoji[man_health_worker_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2695'
+emoji[woman_health_worker]=$'\U1F469\U200D\U2695\UFE0F'
+emoji[woman_health_worker_minimally]=$'\U1F469\U200D\U2695'
+emoji[woman_health_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2695\UFE0F'
+emoji[woman_health_worker_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2695'
+emoji[woman_health_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2695\UFE0F'
+emoji[woman_health_worker_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2695'
+emoji[woman_health_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2695\UFE0F'
+emoji[woman_health_worker_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2695'
+emoji[woman_health_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2695\UFE0F'
+emoji[woman_health_worker_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2695'
+emoji[woman_health_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2695\UFE0F'
+emoji[woman_health_worker_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2695'
+emoji[man_student]=$'\U1F468\U200D\U1F393'
+emoji[man_student_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F393'
+emoji[man_student_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F393'
+emoji[man_student_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F393'
+emoji[man_student_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F393'
+emoji[man_student_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F393'
+emoji[woman_student]=$'\U1F469\U200D\U1F393'
+emoji[woman_student_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F393'
+emoji[woman_student_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F393'
+emoji[woman_student_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F393'
+emoji[woman_student_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F393'
+emoji[woman_student_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F393'
+emoji[man_teacher]=$'\U1F468\U200D\U1F3EB'
+emoji[man_teacher_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3EB'
+emoji[man_teacher_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3EB'
+emoji[man_teacher_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3EB'
+emoji[man_teacher_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3EB'
+emoji[man_teacher_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3EB'
+emoji[woman_teacher]=$'\U1F469\U200D\U1F3EB'
+emoji[woman_teacher_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3EB'
+emoji[woman_teacher_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3EB'
+emoji[woman_teacher_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3EB'
+emoji[woman_teacher_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3EB'
+emoji[woman_teacher_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3EB'
+emoji[man_judge]=$'\U1F468\U200D\U2696\UFE0F'
+emoji[man_judge_minimally]=$'\U1F468\U200D\U2696'
+emoji[man_judge_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2696\UFE0F'
+emoji[man_judge_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2696'
+emoji[man_judge_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2696\UFE0F'
+emoji[man_judge_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2696'
+emoji[man_judge_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2696\UFE0F'
+emoji[man_judge_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2696'
+emoji[man_judge_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2696\UFE0F'
+emoji[man_judge_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2696'
+emoji[man_judge_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2696\UFE0F'
+emoji[man_judge_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2696'
+emoji[woman_judge]=$'\U1F469\U200D\U2696\UFE0F'
+emoji[woman_judge_minimally]=$'\U1F469\U200D\U2696'
+emoji[woman_judge_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2696\UFE0F'
+emoji[woman_judge_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2696'
+emoji[woman_judge_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2696\UFE0F'
+emoji[woman_judge_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2696'
+emoji[woman_judge_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2696\UFE0F'
+emoji[woman_judge_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2696'
+emoji[woman_judge_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2696\UFE0F'
+emoji[woman_judge_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2696'
+emoji[woman_judge_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2696\UFE0F'
+emoji[woman_judge_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2696'
+emoji[man_farmer]=$'\U1F468\U200D\U1F33E'
+emoji[man_farmer_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F33E'
+emoji[man_farmer_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F33E'
+emoji[man_farmer_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F33E'
+emoji[man_farmer_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F33E'
+emoji[man_farmer_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F33E'
+emoji[woman_farmer]=$'\U1F469\U200D\U1F33E'
+emoji[woman_farmer_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F33E'
+emoji[woman_farmer_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F33E'
+emoji[woman_farmer_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F33E'
+emoji[woman_farmer_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F33E'
+emoji[woman_farmer_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F33E'
+emoji[man_cook]=$'\U1F468\U200D\U1F373'
+emoji[man_cook_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F373'
+emoji[man_cook_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F373'
+emoji[man_cook_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F373'
+emoji[man_cook_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F373'
+emoji[man_cook_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F373'
+emoji[woman_cook]=$'\U1F469\U200D\U1F373'
+emoji[woman_cook_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F373'
+emoji[woman_cook_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F373'
+emoji[woman_cook_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F373'
+emoji[woman_cook_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F373'
+emoji[woman_cook_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F373'
+emoji[man_mechanic]=$'\U1F468\U200D\U1F527'
+emoji[man_mechanic_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F527'
+emoji[man_mechanic_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F527'
+emoji[man_mechanic_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F527'
+emoji[man_mechanic_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F527'
+emoji[man_mechanic_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F527'
+emoji[woman_mechanic]=$'\U1F469\U200D\U1F527'
+emoji[woman_mechanic_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F527'
+emoji[woman_mechanic_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F527'
+emoji[woman_mechanic_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F527'
+emoji[woman_mechanic_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F527'
+emoji[woman_mechanic_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F527'
+emoji[man_factory_worker]=$'\U1F468\U200D\U1F3ED'
+emoji[man_factory_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3ED'
+emoji[man_factory_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3ED'
+emoji[man_factory_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3ED'
+emoji[man_factory_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3ED'
+emoji[man_factory_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3ED'
+emoji[woman_factory_worker]=$'\U1F469\U200D\U1F3ED'
+emoji[woman_factory_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3ED'
+emoji[woman_factory_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3ED'
+emoji[woman_factory_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3ED'
+emoji[woman_factory_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3ED'
+emoji[woman_factory_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3ED'
+emoji[man_office_worker]=$'\U1F468\U200D\U1F4BC'
+emoji[man_office_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F4BC'
+emoji[man_office_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F4BC'
+emoji[man_office_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F4BC'
+emoji[man_office_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F4BC'
+emoji[man_office_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F4BC'
+emoji[woman_office_worker]=$'\U1F469\U200D\U1F4BC'
+emoji[woman_office_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F4BC'
+emoji[woman_office_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F4BC'
+emoji[woman_office_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F4BC'
+emoji[woman_office_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F4BC'
+emoji[woman_office_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F4BC'
+emoji[man_scientist]=$'\U1F468\U200D\U1F52C'
+emoji[man_scientist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F52C'
+emoji[man_scientist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F52C'
+emoji[man_scientist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F52C'
+emoji[man_scientist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F52C'
+emoji[man_scientist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F52C'
+emoji[woman_scientist]=$'\U1F469\U200D\U1F52C'
+emoji[woman_scientist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F52C'
+emoji[woman_scientist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F52C'
+emoji[woman_scientist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F52C'
+emoji[woman_scientist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F52C'
+emoji[woman_scientist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F52C'
+emoji[man_technologist]=$'\U1F468\U200D\U1F4BB'
+emoji[man_technologist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F4BB'
+emoji[man_technologist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F4BB'
+emoji[man_technologist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F4BB'
+emoji[man_technologist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F4BB'
+emoji[man_technologist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F4BB'
+emoji[woman_technologist]=$'\U1F469\U200D\U1F4BB'
+emoji[woman_technologist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F4BB'
+emoji[woman_technologist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F4BB'
+emoji[woman_technologist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F4BB'
+emoji[woman_technologist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F4BB'
+emoji[woman_technologist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F4BB'
+emoji[man_singer]=$'\U1F468\U200D\U1F3A4'
+emoji[man_singer_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3A4'
+emoji[man_singer_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3A4'
+emoji[man_singer_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3A4'
+emoji[man_singer_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3A4'
+emoji[man_singer_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3A4'
+emoji[woman_singer]=$'\U1F469\U200D\U1F3A4'
+emoji[woman_singer_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3A4'
+emoji[woman_singer_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3A4'
+emoji[woman_singer_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3A4'
+emoji[woman_singer_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3A4'
+emoji[woman_singer_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3A4'
+emoji[man_artist]=$'\U1F468\U200D\U1F3A8'
+emoji[man_artist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3A8'
+emoji[man_artist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3A8'
+emoji[man_artist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3A8'
+emoji[man_artist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3A8'
+emoji[man_artist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3A8'
+emoji[woman_artist]=$'\U1F469\U200D\U1F3A8'
+emoji[woman_artist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3A8'
+emoji[woman_artist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3A8'
+emoji[woman_artist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3A8'
+emoji[woman_artist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3A8'
+emoji[woman_artist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3A8'
+emoji[man_pilot]=$'\U1F468\U200D\U2708\UFE0F'
+emoji[man_pilot_minimally]=$'\U1F468\U200D\U2708'
+emoji[man_pilot_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2708\UFE0F'
+emoji[man_pilot_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2708'
+emoji[man_pilot_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2708\UFE0F'
+emoji[man_pilot_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2708'
+emoji[man_pilot_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2708\UFE0F'
+emoji[man_pilot_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2708'
+emoji[man_pilot_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2708\UFE0F'
+emoji[man_pilot_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2708'
+emoji[man_pilot_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2708\UFE0F'
+emoji[man_pilot_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2708'
+emoji[woman_pilot]=$'\U1F469\U200D\U2708\UFE0F'
+emoji[woman_pilot_minimally]=$'\U1F469\U200D\U2708'
+emoji[woman_pilot_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2708\UFE0F'
+emoji[woman_pilot_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2708'
+emoji[woman_pilot_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2708\UFE0F'
+emoji[woman_pilot_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2708'
+emoji[woman_pilot_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2708\UFE0F'
+emoji[woman_pilot_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2708'
+emoji[woman_pilot_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2708\UFE0F'
+emoji[woman_pilot_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2708'
+emoji[woman_pilot_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2708\UFE0F'
+emoji[woman_pilot_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2708'
+emoji[man_astronaut]=$'\U1F468\U200D\U1F680'
+emoji[man_astronaut_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F680'
+emoji[man_astronaut_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F680'
+emoji[man_astronaut_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F680'
+emoji[man_astronaut_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F680'
+emoji[man_astronaut_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F680'
+emoji[woman_astronaut]=$'\U1F469\U200D\U1F680'
+emoji[woman_astronaut_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F680'
+emoji[woman_astronaut_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F680'
+emoji[woman_astronaut_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F680'
+emoji[woman_astronaut_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F680'
+emoji[woman_astronaut_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F680'
+emoji[man_firefighter]=$'\U1F468\U200D\U1F692'
+emoji[man_firefighter_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F692'
+emoji[man_firefighter_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F692'
+emoji[man_firefighter_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F692'
+emoji[man_firefighter_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F692'
+emoji[man_firefighter_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F692'
+emoji[woman_firefighter]=$'\U1F469\U200D\U1F692'
+emoji[woman_firefighter_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F692'
+emoji[woman_firefighter_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F692'
+emoji[woman_firefighter_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F692'
+emoji[woman_firefighter_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F692'
+emoji[woman_firefighter_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F692'
+emoji[police_officer]=$'\U1F46E'
+emoji[cop]=$'\U1F46E'
+emoji[police_officer_light_skin_tone]=$'\U1F46E\U1F3FB'
+emoji[police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC'
+emoji[police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD'
+emoji[police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE'
+emoji[police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF'
+emoji[man_police_officer]=$'\U1F46E\U200D\U2642\UFE0F'
+emoji[man_police_officer_minimally]=$'\U1F46E\U200D\U2642'
+emoji[policeman]=$'\U1F46E\U200D\U2642'
+emoji[man_police_officer_light_skin_tone]=$'\U1F46E\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_police_officer_light_skin_tone_minimally]=$'\U1F46E\U1F3FB\U200D\U2642'
+emoji[man_police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_police_officer_medium_light_skin_tone_minimally]=$'\U1F46E\U1F3FC\U200D\U2642'
+emoji[man_police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_police_officer_medium_skin_tone_minimally]=$'\U1F46E\U1F3FD\U200D\U2642'
+emoji[man_police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_police_officer_medium_dark_skin_tone_minimally]=$'\U1F46E\U1F3FE\U200D\U2642'
+emoji[man_police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_police_officer_dark_skin_tone_minimally]=$'\U1F46E\U1F3FF\U200D\U2642'
+emoji[woman_police_officer]=$'\U1F46E\U200D\U2640\UFE0F'
+emoji[woman_police_officer_minimally]=$'\U1F46E\U200D\U2640'
+emoji[policewoman]=$'\U1F46E\U200D\U2640'
+emoji[woman_police_officer_light_skin_tone]=$'\U1F46E\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_police_officer_light_skin_tone_minimally]=$'\U1F46E\U1F3FB\U200D\U2640'
+emoji[woman_police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_police_officer_medium_light_skin_tone_minimally]=$'\U1F46E\U1F3FC\U200D\U2640'
+emoji[woman_police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_police_officer_medium_skin_tone_minimally]=$'\U1F46E\U1F3FD\U200D\U2640'
+emoji[woman_police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_police_officer_medium_dark_skin_tone_minimally]=$'\U1F46E\U1F3FE\U200D\U2640'
+emoji[woman_police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_police_officer_dark_skin_tone_minimally]=$'\U1F46E\U1F3FF\U200D\U2640'
+emoji[detective]=$'\U1F575\UFE0F'
+emoji[detective_unqualified]=$'\U1F575'
+emoji[detective_light_skin_tone]=$'\U1F575\U1F3FB'
+emoji[detective_medium_light_skin_tone]=$'\U1F575\U1F3FC'
+emoji[detective_medium_skin_tone]=$'\U1F575\U1F3FD'
+emoji[detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE'
+emoji[detective_dark_skin_tone]=$'\U1F575\U1F3FF'
+emoji[man_detective]=$'\U1F575\UFE0F\U200D\U2642\UFE0F'
+emoji[male_detective]=$'\U1F575\UFE0F\U200D\U2642\UFE0F'
+emoji[man_detective_unqualified]=$'\U1F575\U200D\U2642\UFE0F'
+emoji[man_detective_unqualified_1]=$'\U1F575\UFE0F\U200D\U2642'
+emoji[man_detective_unqualified_2]=$'\U1F575\U200D\U2642'
+emoji[man_detective_light_skin_tone]=$'\U1F575\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_detective_light_skin_tone_minimally]=$'\U1F575\U1F3FB\U200D\U2642'
+emoji[man_detective_medium_light_skin_tone]=$'\U1F575\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_detective_medium_light_skin_tone_minimally]=$'\U1F575\U1F3FC\U200D\U2642'
+emoji[man_detective_medium_skin_tone]=$'\U1F575\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_detective_medium_skin_tone_minimally]=$'\U1F575\U1F3FD\U200D\U2642'
+emoji[man_detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_detective_medium_dark_skin_tone_minimally]=$'\U1F575\U1F3FE\U200D\U2642'
+emoji[man_detective_dark_skin_tone]=$'\U1F575\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_detective_dark_skin_tone_minimally]=$'\U1F575\U1F3FF\U200D\U2642'
+emoji[woman_detective]=$'\U1F575\UFE0F\U200D\U2640\UFE0F'
+emoji[female_detective]=$'\U1F575\UFE0F\U200D\U2640\UFE0F'
+emoji[woman_detective_unqualified]=$'\U1F575\U200D\U2640\UFE0F'
+emoji[woman_detective_unqualified_1]=$'\U1F575\UFE0F\U200D\U2640'
+emoji[woman_detective_unqualified_2]=$'\U1F575\U200D\U2640'
+emoji[woman_detective_light_skin_tone]=$'\U1F575\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_detective_light_skin_tone_minimally]=$'\U1F575\U1F3FB\U200D\U2640'
+emoji[woman_detective_medium_light_skin_tone]=$'\U1F575\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_detective_medium_light_skin_tone_minimally]=$'\U1F575\U1F3FC\U200D\U2640'
+emoji[woman_detective_medium_skin_tone]=$'\U1F575\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_detective_medium_skin_tone_minimally]=$'\U1F575\U1F3FD\U200D\U2640'
+emoji[woman_detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_detective_medium_dark_skin_tone_minimally]=$'\U1F575\U1F3FE\U200D\U2640'
+emoji[woman_detective_dark_skin_tone]=$'\U1F575\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_detective_dark_skin_tone_minimally]=$'\U1F575\U1F3FF\U200D\U2640'
+emoji[guard]=$'\U1F482'
+emoji[guard_light_skin_tone]=$'\U1F482\U1F3FB'
+emoji[guard_medium_light_skin_tone]=$'\U1F482\U1F3FC'
+emoji[guard_medium_skin_tone]=$'\U1F482\U1F3FD'
+emoji[guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE'
+emoji[guard_dark_skin_tone]=$'\U1F482\U1F3FF'
+emoji[man_guard]=$'\U1F482\U200D\U2642\UFE0F'
+emoji[man_guard_minimally]=$'\U1F482\U200D\U2642'
+emoji[guardsman]=$'\U1F482\U200D\U2642'
+emoji[man_guard_light_skin_tone]=$'\U1F482\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_guard_light_skin_tone_minimally]=$'\U1F482\U1F3FB\U200D\U2642'
+emoji[man_guard_medium_light_skin_tone]=$'\U1F482\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_guard_medium_light_skin_tone_minimally]=$'\U1F482\U1F3FC\U200D\U2642'
+emoji[man_guard_medium_skin_tone]=$'\U1F482\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_guard_medium_skin_tone_minimally]=$'\U1F482\U1F3FD\U200D\U2642'
+emoji[man_guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_guard_medium_dark_skin_tone_minimally]=$'\U1F482\U1F3FE\U200D\U2642'
+emoji[man_guard_dark_skin_tone]=$'\U1F482\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_guard_dark_skin_tone_minimally]=$'\U1F482\U1F3FF\U200D\U2642'
+emoji[woman_guard]=$'\U1F482\U200D\U2640\UFE0F'
+emoji[woman_guard_minimally]=$'\U1F482\U200D\U2640'
+emoji[guardswoman]=$'\U1F482\U200D\U2640'
+emoji[woman_guard_light_skin_tone]=$'\U1F482\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_guard_light_skin_tone_minimally]=$'\U1F482\U1F3FB\U200D\U2640'
+emoji[woman_guard_medium_light_skin_tone]=$'\U1F482\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_guard_medium_light_skin_tone_minimally]=$'\U1F482\U1F3FC\U200D\U2640'
+emoji[woman_guard_medium_skin_tone]=$'\U1F482\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_guard_medium_skin_tone_minimally]=$'\U1F482\U1F3FD\U200D\U2640'
+emoji[woman_guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_guard_medium_dark_skin_tone_minimally]=$'\U1F482\U1F3FE\U200D\U2640'
+emoji[woman_guard_dark_skin_tone]=$'\U1F482\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_guard_dark_skin_tone_minimally]=$'\U1F482\U1F3FF\U200D\U2640'
+emoji[construction_worker]=$'\U1F477'
+emoji[construction_worker_light_skin_tone]=$'\U1F477\U1F3FB'
+emoji[construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC'
+emoji[construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD'
+emoji[construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE'
+emoji[construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF'
+emoji[man_construction_worker]=$'\U1F477\U200D\U2642\UFE0F'
+emoji[man_construction_worker_minimally]=$'\U1F477\U200D\U2642'
+emoji[construction_worker_man]=$'\U1F477\U200D\U2642'
+emoji[man_construction_worker_light_skin_tone]=$'\U1F477\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_construction_worker_light_skin_tone_minimally]=$'\U1F477\U1F3FB\U200D\U2642'
+emoji[man_construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_construction_worker_medium_light_skin_tone_minimally]=$'\U1F477\U1F3FC\U200D\U2642'
+emoji[man_construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_construction_worker_medium_skin_tone_minimally]=$'\U1F477\U1F3FD\U200D\U2642'
+emoji[man_construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_construction_worker_medium_dark_skin_tone_minimally]=$'\U1F477\U1F3FE\U200D\U2642'
+emoji[man_construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_construction_worker_dark_skin_tone_minimally]=$'\U1F477\U1F3FF\U200D\U2642'
+emoji[woman_construction_worker]=$'\U1F477\U200D\U2640\UFE0F'
+emoji[woman_construction_worker_minimally]=$'\U1F477\U200D\U2640'
+emoji[construction_worker_woman]=$'\U1F477\U200D\U2640'
+emoji[woman_construction_worker_light_skin_tone]=$'\U1F477\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_construction_worker_light_skin_tone_minimally]=$'\U1F477\U1F3FB\U200D\U2640'
+emoji[woman_construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_construction_worker_medium_light_skin_tone_minimally]=$'\U1F477\U1F3FC\U200D\U2640'
+emoji[woman_construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_construction_worker_medium_skin_tone_minimally]=$'\U1F477\U1F3FD\U200D\U2640'
+emoji[woman_construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_construction_worker_medium_dark_skin_tone_minimally]=$'\U1F477\U1F3FE\U200D\U2640'
+emoji[woman_construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_construction_worker_dark_skin_tone_minimally]=$'\U1F477\U1F3FF\U200D\U2640'
+emoji[prince]=$'\U1F934'
+emoji[prince_light_skin_tone]=$'\U1F934\U1F3FB'
+emoji[prince_medium_light_skin_tone]=$'\U1F934\U1F3FC'
+emoji[prince_medium_skin_tone]=$'\U1F934\U1F3FD'
+emoji[prince_medium_dark_skin_tone]=$'\U1F934\U1F3FE'
+emoji[prince_dark_skin_tone]=$'\U1F934\U1F3FF'
+emoji[princess]=$'\U1F478'
+emoji[princess_light_skin_tone]=$'\U1F478\U1F3FB'
+emoji[princess_medium_light_skin_tone]=$'\U1F478\U1F3FC'
+emoji[princess_medium_skin_tone]=$'\U1F478\U1F3FD'
+emoji[princess_medium_dark_skin_tone]=$'\U1F478\U1F3FE'
+emoji[princess_dark_skin_tone]=$'\U1F478\U1F3FF'
+emoji[person_wearing_turban]=$'\U1F473'
+emoji[person_with_turban]=$'\U1F473'
+emoji[person_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB'
+emoji[person_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC'
+emoji[person_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD'
+emoji[person_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE'
+emoji[person_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF'
+emoji[man_wearing_turban]=$'\U1F473\U200D\U2642\UFE0F'
+emoji[man_wearing_turban_minimally]=$'\U1F473\U200D\U2642'
+emoji[man_with_turban]=$'\U1F473\U200D\U2642'
+emoji[man_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_wearing_turban_light_skin_tone_minimally]=$'\U1F473\U1F3FB\U200D\U2642'
+emoji[man_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_wearing_turban_medium_light_skin_tone_minimally]=$'\U1F473\U1F3FC\U200D\U2642'
+emoji[man_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_wearing_turban_medium_skin_tone_minimally]=$'\U1F473\U1F3FD\U200D\U2642'
+emoji[man_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_wearing_turban_medium_dark_skin_tone_minimally]=$'\U1F473\U1F3FE\U200D\U2642'
+emoji[man_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_wearing_turban_dark_skin_tone_minimally]=$'\U1F473\U1F3FF\U200D\U2642'
+emoji[woman_wearing_turban]=$'\U1F473\U200D\U2640\UFE0F'
+emoji[woman_wearing_turban_minimally]=$'\U1F473\U200D\U2640'
+emoji[woman_with_turban]=$'\U1F473\U200D\U2640'
+emoji[woman_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_wearing_turban_light_skin_tone_minimally]=$'\U1F473\U1F3FB\U200D\U2640'
+emoji[woman_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_wearing_turban_medium_light_skin_tone_minimally]=$'\U1F473\U1F3FC\U200D\U2640'
+emoji[woman_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_wearing_turban_medium_skin_tone_minimally]=$'\U1F473\U1F3FD\U200D\U2640'
+emoji[woman_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_wearing_turban_medium_dark_skin_tone_minimally]=$'\U1F473\U1F3FE\U200D\U2640'
+emoji[woman_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_wearing_turban_dark_skin_tone_minimally]=$'\U1F473\U1F3FF\U200D\U2640'
+emoji[man_with_Chinese_cap]=$'\U1F472'
+emoji[man_with_gua_pi_mao]=$'\U1F472'
+emoji[man_with_Chinese_cap_light_skin_tone]=$'\U1F472\U1F3FB'
+emoji[man_with_Chinese_cap_medium_light_skin_tone]=$'\U1F472\U1F3FC'
+emoji[man_with_Chinese_cap_medium_skin_tone]=$'\U1F472\U1F3FD'
+emoji[man_with_Chinese_cap_medium_dark_skin_tone]=$'\U1F472\U1F3FE'
+emoji[man_with_Chinese_cap_dark_skin_tone]=$'\U1F472\U1F3FF'
+emoji[woman_with_headscarf]=$'\U1F9D5'
+emoji[woman_with_headscarf_light_skin_tone]=$'\U1F9D5\U1F3FB'
+emoji[woman_with_headscarf_medium_light_skin_tone]=$'\U1F9D5\U1F3FC'
+emoji[woman_with_headscarf_medium_skin_tone]=$'\U1F9D5\U1F3FD'
+emoji[woman_with_headscarf_medium_dark_skin_tone]=$'\U1F9D5\U1F3FE'
+emoji[woman_with_headscarf_dark_skin_tone]=$'\U1F9D5\U1F3FF'
+emoji[man_in_tuxedo]=$'\U1F935'
+emoji[man_in_tuxedo_light_skin_tone]=$'\U1F935\U1F3FB'
+emoji[man_in_tuxedo_medium_light_skin_tone]=$'\U1F935\U1F3FC'
+emoji[man_in_tuxedo_medium_skin_tone]=$'\U1F935\U1F3FD'
+emoji[man_in_tuxedo_medium_dark_skin_tone]=$'\U1F935\U1F3FE'
+emoji[man_in_tuxedo_dark_skin_tone]=$'\U1F935\U1F3FF'
+emoji[bride_with_veil]=$'\U1F470'
+emoji[bride_with_veil_light_skin_tone]=$'\U1F470\U1F3FB'
+emoji[bride_with_veil_medium_light_skin_tone]=$'\U1F470\U1F3FC'
+emoji[bride_with_veil_medium_skin_tone]=$'\U1F470\U1F3FD'
+emoji[bride_with_veil_medium_dark_skin_tone]=$'\U1F470\U1F3FE'
+emoji[bride_with_veil_dark_skin_tone]=$'\U1F470\U1F3FF'
+emoji[pregnant_woman]=$'\U1F930'
+emoji[pregnant_woman_light_skin_tone]=$'\U1F930\U1F3FB'
+emoji[pregnant_woman_medium_light_skin_tone]=$'\U1F930\U1F3FC'
+emoji[pregnant_woman_medium_skin_tone]=$'\U1F930\U1F3FD'
+emoji[pregnant_woman_medium_dark_skin_tone]=$'\U1F930\U1F3FE'
+emoji[pregnant_woman_dark_skin_tone]=$'\U1F930\U1F3FF'
+emoji[breast_feeding]=$'\U1F931'
+emoji[breast_feeding_light_skin_tone]=$'\U1F931\U1F3FB'
+emoji[breast_feeding_medium_light_skin_tone]=$'\U1F931\U1F3FC'
+emoji[breast_feeding_medium_skin_tone]=$'\U1F931\U1F3FD'
+emoji[breast_feeding_medium_dark_skin_tone]=$'\U1F931\U1F3FE'
+emoji[breast_feeding_dark_skin_tone]=$'\U1F931\U1F3FF'
+emoji[baby_angel]=$'\U1F47C'
+emoji[angel]=$'\U1F47C'
+emoji[baby_angel_light_skin_tone]=$'\U1F47C\U1F3FB'
+emoji[baby_angel_medium_light_skin_tone]=$'\U1F47C\U1F3FC'
+emoji[baby_angel_medium_skin_tone]=$'\U1F47C\U1F3FD'
+emoji[baby_angel_medium_dark_skin_tone]=$'\U1F47C\U1F3FE'
+emoji[baby_angel_dark_skin_tone]=$'\U1F47C\U1F3FF'
+emoji[Santa_Claus]=$'\U1F385'
+emoji[santa]=$'\U1F385'
+emoji[Santa_Claus_light_skin_tone]=$'\U1F385\U1F3FB'
+emoji[Santa_Claus_medium_light_skin_tone]=$'\U1F385\U1F3FC'
+emoji[Santa_Claus_medium_skin_tone]=$'\U1F385\U1F3FD'
+emoji[Santa_Claus_medium_dark_skin_tone]=$'\U1F385\U1F3FE'
+emoji[Santa_Claus_dark_skin_tone]=$'\U1F385\U1F3FF'
+emoji[Mrs_Claus]=$'\U1F936'
+emoji[mrs_claus]=$'\U1F936'
+emoji[Mrs_Claus_light_skin_tone]=$'\U1F936\U1F3FB'
+emoji[Mrs_Claus_medium_light_skin_tone]=$'\U1F936\U1F3FC'
+emoji[Mrs_Claus_medium_skin_tone]=$'\U1F936\U1F3FD'
+emoji[Mrs_Claus_medium_dark_skin_tone]=$'\U1F936\U1F3FE'
+emoji[Mrs_Claus_dark_skin_tone]=$'\U1F936\U1F3FF'
+emoji[superhero]=$'\U1F9B8'
+emoji[superhero_light_skin_tone]=$'\U1F9B8\U1F3FB'
+emoji[superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC'
+emoji[superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD'
+emoji[superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE'
+emoji[superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF'
+emoji[man_superhero]=$'\U1F9B8\U200D\U2642\UFE0F'
+emoji[man_superhero_minimally]=$'\U1F9B8\U200D\U2642'
+emoji[superhero_man]=$'\U1F9B8\U200D\U2642'
+emoji[man_superhero_light_skin_tone]=$'\U1F9B8\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_superhero_light_skin_tone_minimally]=$'\U1F9B8\U1F3FB\U200D\U2642'
+emoji[man_superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_superhero_medium_light_skin_tone_minimally]=$'\U1F9B8\U1F3FC\U200D\U2642'
+emoji[man_superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_superhero_medium_skin_tone_minimally]=$'\U1F9B8\U1F3FD\U200D\U2642'
+emoji[man_superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_superhero_medium_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FE\U200D\U2642'
+emoji[man_superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_superhero_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FF\U200D\U2642'
+emoji[woman_superhero]=$'\U1F9B8\U200D\U2640\UFE0F'
+emoji[woman_superhero_minimally]=$'\U1F9B8\U200D\U2640'
+emoji[superhero_woman]=$'\U1F9B8\U200D\U2640'
+emoji[woman_superhero_light_skin_tone]=$'\U1F9B8\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_superhero_light_skin_tone_minimally]=$'\U1F9B8\U1F3FB\U200D\U2640'
+emoji[woman_superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_superhero_medium_light_skin_tone_minimally]=$'\U1F9B8\U1F3FC\U200D\U2640'
+emoji[woman_superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_superhero_medium_skin_tone_minimally]=$'\U1F9B8\U1F3FD\U200D\U2640'
+emoji[woman_superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_superhero_medium_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FE\U200D\U2640'
+emoji[woman_superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_superhero_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FF\U200D\U2640'
+emoji[supervillain]=$'\U1F9B9'
+emoji[supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB'
+emoji[supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC'
+emoji[supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD'
+emoji[supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE'
+emoji[supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF'
+emoji[man_supervillain]=$'\U1F9B9\U200D\U2642\UFE0F'
+emoji[man_supervillain_minimally]=$'\U1F9B9\U200D\U2642'
+emoji[supervillain_man]=$'\U1F9B9\U200D\U2642'
+emoji[man_supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_supervillain_light_skin_tone_minimally]=$'\U1F9B9\U1F3FB\U200D\U2642'
+emoji[man_supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_supervillain_medium_light_skin_tone_minimally]=$'\U1F9B9\U1F3FC\U200D\U2642'
+emoji[man_supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_supervillain_medium_skin_tone_minimally]=$'\U1F9B9\U1F3FD\U200D\U2642'
+emoji[man_supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_supervillain_medium_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FE\U200D\U2642'
+emoji[man_supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_supervillain_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FF\U200D\U2642'
+emoji[woman_supervillain]=$'\U1F9B9\U200D\U2640\UFE0F'
+emoji[woman_supervillain_minimally]=$'\U1F9B9\U200D\U2640'
+emoji[supervillain_woman]=$'\U1F9B9\U200D\U2640'
+emoji[woman_supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_supervillain_light_skin_tone_minimally]=$'\U1F9B9\U1F3FB\U200D\U2640'
+emoji[woman_supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_supervillain_medium_light_skin_tone_minimally]=$'\U1F9B9\U1F3FC\U200D\U2640'
+emoji[woman_supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_supervillain_medium_skin_tone_minimally]=$'\U1F9B9\U1F3FD\U200D\U2640'
+emoji[woman_supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_supervillain_medium_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FE\U200D\U2640'
+emoji[woman_supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_supervillain_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FF\U200D\U2640'
+emoji[mage]=$'\U1F9D9'
+emoji[mage_light_skin_tone]=$'\U1F9D9\U1F3FB'
+emoji[mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC'
+emoji[mage_medium_skin_tone]=$'\U1F9D9\U1F3FD'
+emoji[mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE'
+emoji[mage_dark_skin_tone]=$'\U1F9D9\U1F3FF'
+emoji[man_mage]=$'\U1F9D9\U200D\U2642\UFE0F'
+emoji[man_mage_minimally]=$'\U1F9D9\U200D\U2642'
+emoji[mage_man]=$'\U1F9D9\U200D\U2642'
+emoji[man_mage_light_skin_tone]=$'\U1F9D9\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_mage_light_skin_tone_minimally]=$'\U1F9D9\U1F3FB\U200D\U2642'
+emoji[man_mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_mage_medium_light_skin_tone_minimally]=$'\U1F9D9\U1F3FC\U200D\U2642'
+emoji[man_mage_medium_skin_tone]=$'\U1F9D9\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_mage_medium_skin_tone_minimally]=$'\U1F9D9\U1F3FD\U200D\U2642'
+emoji[man_mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_mage_medium_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FE\U200D\U2642'
+emoji[man_mage_dark_skin_tone]=$'\U1F9D9\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_mage_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FF\U200D\U2642'
+emoji[woman_mage]=$'\U1F9D9\U200D\U2640\UFE0F'
+emoji[woman_mage_minimally]=$'\U1F9D9\U200D\U2640'
+emoji[mage_woman]=$'\U1F9D9\U200D\U2640'
+emoji[woman_mage_light_skin_tone]=$'\U1F9D9\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_mage_light_skin_tone_minimally]=$'\U1F9D9\U1F3FB\U200D\U2640'
+emoji[woman_mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_mage_medium_light_skin_tone_minimally]=$'\U1F9D9\U1F3FC\U200D\U2640'
+emoji[woman_mage_medium_skin_tone]=$'\U1F9D9\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_mage_medium_skin_tone_minimally]=$'\U1F9D9\U1F3FD\U200D\U2640'
+emoji[woman_mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_mage_medium_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FE\U200D\U2640'
+emoji[woman_mage_dark_skin_tone]=$'\U1F9D9\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_mage_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FF\U200D\U2640'
+emoji[fairy]=$'\U1F9DA'
+emoji[fairy_light_skin_tone]=$'\U1F9DA\U1F3FB'
+emoji[fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC'
+emoji[fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD'
+emoji[fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE'
+emoji[fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF'
+emoji[man_fairy]=$'\U1F9DA\U200D\U2642\UFE0F'
+emoji[man_fairy_minimally]=$'\U1F9DA\U200D\U2642'
+emoji[fairy_man]=$'\U1F9DA\U200D\U2642'
+emoji[man_fairy_light_skin_tone]=$'\U1F9DA\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_fairy_light_skin_tone_minimally]=$'\U1F9DA\U1F3FB\U200D\U2642'
+emoji[man_fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_fairy_medium_light_skin_tone_minimally]=$'\U1F9DA\U1F3FC\U200D\U2642'
+emoji[man_fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_fairy_medium_skin_tone_minimally]=$'\U1F9DA\U1F3FD\U200D\U2642'
+emoji[man_fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_fairy_medium_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FE\U200D\U2642'
+emoji[man_fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_fairy_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FF\U200D\U2642'
+emoji[woman_fairy]=$'\U1F9DA\U200D\U2640\UFE0F'
+emoji[woman_fairy_minimally]=$'\U1F9DA\U200D\U2640'
+emoji[fairy_woman]=$'\U1F9DA\U200D\U2640'
+emoji[woman_fairy_light_skin_tone]=$'\U1F9DA\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_fairy_light_skin_tone_minimally]=$'\U1F9DA\U1F3FB\U200D\U2640'
+emoji[woman_fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_fairy_medium_light_skin_tone_minimally]=$'\U1F9DA\U1F3FC\U200D\U2640'
+emoji[woman_fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_fairy_medium_skin_tone_minimally]=$'\U1F9DA\U1F3FD\U200D\U2640'
+emoji[woman_fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_fairy_medium_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FE\U200D\U2640'
+emoji[woman_fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_fairy_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FF\U200D\U2640'
+emoji[vampire]=$'\U1F9DB'
+emoji[vampire_light_skin_tone]=$'\U1F9DB\U1F3FB'
+emoji[vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC'
+emoji[vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD'
+emoji[vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE'
+emoji[vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF'
+emoji[man_vampire]=$'\U1F9DB\U200D\U2642\UFE0F'
+emoji[man_vampire_minimally]=$'\U1F9DB\U200D\U2642'
+emoji[vampire_man]=$'\U1F9DB\U200D\U2642'
+emoji[man_vampire_light_skin_tone]=$'\U1F9DB\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_vampire_light_skin_tone_minimally]=$'\U1F9DB\U1F3FB\U200D\U2642'
+emoji[man_vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_vampire_medium_light_skin_tone_minimally]=$'\U1F9DB\U1F3FC\U200D\U2642'
+emoji[man_vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_vampire_medium_skin_tone_minimally]=$'\U1F9DB\U1F3FD\U200D\U2642'
+emoji[man_vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_vampire_medium_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FE\U200D\U2642'
+emoji[man_vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_vampire_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FF\U200D\U2642'
+emoji[woman_vampire]=$'\U1F9DB\U200D\U2640\UFE0F'
+emoji[woman_vampire_minimally]=$'\U1F9DB\U200D\U2640'
+emoji[vampire_woman]=$'\U1F9DB\U200D\U2640'
+emoji[woman_vampire_light_skin_tone]=$'\U1F9DB\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_vampire_light_skin_tone_minimally]=$'\U1F9DB\U1F3FB\U200D\U2640'
+emoji[woman_vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_vampire_medium_light_skin_tone_minimally]=$'\U1F9DB\U1F3FC\U200D\U2640'
+emoji[woman_vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_vampire_medium_skin_tone_minimally]=$'\U1F9DB\U1F3FD\U200D\U2640'
+emoji[woman_vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_vampire_medium_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FE\U200D\U2640'
+emoji[woman_vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_vampire_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FF\U200D\U2640'
+emoji[merperson]=$'\U1F9DC'
+emoji[merperson_light_skin_tone]=$'\U1F9DC\U1F3FB'
+emoji[merperson_medium_light_skin_tone]=$'\U1F9DC\U1F3FC'
+emoji[merperson_medium_skin_tone]=$'\U1F9DC\U1F3FD'
+emoji[merperson_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE'
+emoji[merperson_dark_skin_tone]=$'\U1F9DC\U1F3FF'
+emoji[merman]=$'\U1F9DC\U200D\U2642\UFE0F'
+emoji[merman_minimally]=$'\U1F9DC\U200D\U2642'
+emoji[merman_light_skin_tone]=$'\U1F9DC\U1F3FB\U200D\U2642\UFE0F'
+emoji[merman_light_skin_tone_minimally]=$'\U1F9DC\U1F3FB\U200D\U2642'
+emoji[merman_medium_light_skin_tone]=$'\U1F9DC\U1F3FC\U200D\U2642\UFE0F'
+emoji[merman_medium_light_skin_tone_minimally]=$'\U1F9DC\U1F3FC\U200D\U2642'
+emoji[merman_medium_skin_tone]=$'\U1F9DC\U1F3FD\U200D\U2642\UFE0F'
+emoji[merman_medium_skin_tone_minimally]=$'\U1F9DC\U1F3FD\U200D\U2642'
+emoji[merman_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE\U200D\U2642\UFE0F'
+emoji[merman_medium_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FE\U200D\U2642'
+emoji[merman_dark_skin_tone]=$'\U1F9DC\U1F3FF\U200D\U2642\UFE0F'
+emoji[merman_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FF\U200D\U2642'
+emoji[mermaid]=$'\U1F9DC\U200D\U2640\UFE0F'
+emoji[mermaid_minimally]=$'\U1F9DC\U200D\U2640'
+emoji[mermaid_light_skin_tone]=$'\U1F9DC\U1F3FB\U200D\U2640\UFE0F'
+emoji[mermaid_light_skin_tone_minimally]=$'\U1F9DC\U1F3FB\U200D\U2640'
+emoji[mermaid_medium_light_skin_tone]=$'\U1F9DC\U1F3FC\U200D\U2640\UFE0F'
+emoji[mermaid_medium_light_skin_tone_minimally]=$'\U1F9DC\U1F3FC\U200D\U2640'
+emoji[mermaid_medium_skin_tone]=$'\U1F9DC\U1F3FD\U200D\U2640\UFE0F'
+emoji[mermaid_medium_skin_tone_minimally]=$'\U1F9DC\U1F3FD\U200D\U2640'
+emoji[mermaid_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE\U200D\U2640\UFE0F'
+emoji[mermaid_medium_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FE\U200D\U2640'
+emoji[mermaid_dark_skin_tone]=$'\U1F9DC\U1F3FF\U200D\U2640\UFE0F'
+emoji[mermaid_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FF\U200D\U2640'
+emoji[elf]=$'\U1F9DD'
+emoji[elf_light_skin_tone]=$'\U1F9DD\U1F3FB'
+emoji[elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC'
+emoji[elf_medium_skin_tone]=$'\U1F9DD\U1F3FD'
+emoji[elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE'
+emoji[elf_dark_skin_tone]=$'\U1F9DD\U1F3FF'
+emoji[man_elf]=$'\U1F9DD\U200D\U2642\UFE0F'
+emoji[man_elf_minimally]=$'\U1F9DD\U200D\U2642'
+emoji[elf_man]=$'\U1F9DD\U200D\U2642'
+emoji[man_elf_light_skin_tone]=$'\U1F9DD\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_elf_light_skin_tone_minimally]=$'\U1F9DD\U1F3FB\U200D\U2642'
+emoji[man_elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_elf_medium_light_skin_tone_minimally]=$'\U1F9DD\U1F3FC\U200D\U2642'
+emoji[man_elf_medium_skin_tone]=$'\U1F9DD\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_elf_medium_skin_tone_minimally]=$'\U1F9DD\U1F3FD\U200D\U2642'
+emoji[man_elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_elf_medium_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FE\U200D\U2642'
+emoji[man_elf_dark_skin_tone]=$'\U1F9DD\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_elf_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FF\U200D\U2642'
+emoji[woman_elf]=$'\U1F9DD\U200D\U2640\UFE0F'
+emoji[woman_elf_minimally]=$'\U1F9DD\U200D\U2640'
+emoji[elf_woman]=$'\U1F9DD\U200D\U2640'
+emoji[woman_elf_light_skin_tone]=$'\U1F9DD\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_elf_light_skin_tone_minimally]=$'\U1F9DD\U1F3FB\U200D\U2640'
+emoji[woman_elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_elf_medium_light_skin_tone_minimally]=$'\U1F9DD\U1F3FC\U200D\U2640'
+emoji[woman_elf_medium_skin_tone]=$'\U1F9DD\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_elf_medium_skin_tone_minimally]=$'\U1F9DD\U1F3FD\U200D\U2640'
+emoji[woman_elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_elf_medium_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FE\U200D\U2640'
+emoji[woman_elf_dark_skin_tone]=$'\U1F9DD\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_elf_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FF\U200D\U2640'
+emoji[genie]=$'\U1F9DE'
+emoji[man_genie]=$'\U1F9DE\U200D\U2642\UFE0F'
+emoji[man_genie_minimally]=$'\U1F9DE\U200D\U2642'
+emoji[genie_man]=$'\U1F9DE\U200D\U2642'
+emoji[woman_genie]=$'\U1F9DE\U200D\U2640\UFE0F'
+emoji[woman_genie_minimally]=$'\U1F9DE\U200D\U2640'
+emoji[genie_woman]=$'\U1F9DE\U200D\U2640'
+emoji[zombie]=$'\U1F9DF'
+emoji[man_zombie]=$'\U1F9DF\U200D\U2642\UFE0F'
+emoji[man_zombie_minimally]=$'\U1F9DF\U200D\U2642'
+emoji[zombie_man]=$'\U1F9DF\U200D\U2642'
+emoji[woman_zombie]=$'\U1F9DF\U200D\U2640\UFE0F'
+emoji[woman_zombie_minimally]=$'\U1F9DF\U200D\U2640'
+emoji[zombie_woman]=$'\U1F9DF\U200D\U2640'
+emoji[person_getting_massage]=$'\U1F486'
+emoji[massage]=$'\U1F486'
+emoji[person_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB'
+emoji[person_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC'
+emoji[person_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD'
+emoji[person_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE'
+emoji[person_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF'
+emoji[man_getting_massage]=$'\U1F486\U200D\U2642\UFE0F'
+emoji[man_getting_massage_minimally]=$'\U1F486\U200D\U2642'
+emoji[massage_man]=$'\U1F486\U200D\U2642'
+emoji[man_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_getting_massage_light_skin_tone_minimally]=$'\U1F486\U1F3FB\U200D\U2642'
+emoji[man_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_getting_massage_medium_light_skin_tone_minimally]=$'\U1F486\U1F3FC\U200D\U2642'
+emoji[man_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_getting_massage_medium_skin_tone_minimally]=$'\U1F486\U1F3FD\U200D\U2642'
+emoji[man_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_getting_massage_medium_dark_skin_tone_minimally]=$'\U1F486\U1F3FE\U200D\U2642'
+emoji[man_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_getting_massage_dark_skin_tone_minimally]=$'\U1F486\U1F3FF\U200D\U2642'
+emoji[woman_getting_massage]=$'\U1F486\U200D\U2640\UFE0F'
+emoji[woman_getting_massage_minimally]=$'\U1F486\U200D\U2640'
+emoji[massage_woman]=$'\U1F486\U200D\U2640'
+emoji[woman_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_getting_massage_light_skin_tone_minimally]=$'\U1F486\U1F3FB\U200D\U2640'
+emoji[woman_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_getting_massage_medium_light_skin_tone_minimally]=$'\U1F486\U1F3FC\U200D\U2640'
+emoji[woman_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_getting_massage_medium_skin_tone_minimally]=$'\U1F486\U1F3FD\U200D\U2640'
+emoji[woman_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_getting_massage_medium_dark_skin_tone_minimally]=$'\U1F486\U1F3FE\U200D\U2640'
+emoji[woman_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_getting_massage_dark_skin_tone_minimally]=$'\U1F486\U1F3FF\U200D\U2640'
+emoji[person_getting_haircut]=$'\U1F487'
+emoji[haircut]=$'\U1F487'
+emoji[person_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB'
+emoji[person_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC'
+emoji[person_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD'
+emoji[person_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE'
+emoji[person_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF'
+emoji[man_getting_haircut]=$'\U1F487\U200D\U2642\UFE0F'
+emoji[man_getting_haircut_minimally]=$'\U1F487\U200D\U2642'
+emoji[haircut_man]=$'\U1F487\U200D\U2642'
+emoji[man_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_getting_haircut_light_skin_tone_minimally]=$'\U1F487\U1F3FB\U200D\U2642'
+emoji[man_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_getting_haircut_medium_light_skin_tone_minimally]=$'\U1F487\U1F3FC\U200D\U2642'
+emoji[man_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_getting_haircut_medium_skin_tone_minimally]=$'\U1F487\U1F3FD\U200D\U2642'
+emoji[man_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_getting_haircut_medium_dark_skin_tone_minimally]=$'\U1F487\U1F3FE\U200D\U2642'
+emoji[man_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_getting_haircut_dark_skin_tone_minimally]=$'\U1F487\U1F3FF\U200D\U2642'
+emoji[woman_getting_haircut]=$'\U1F487\U200D\U2640\UFE0F'
+emoji[woman_getting_haircut_minimally]=$'\U1F487\U200D\U2640'
+emoji[haircut_woman]=$'\U1F487\U200D\U2640'
+emoji[woman_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_getting_haircut_light_skin_tone_minimally]=$'\U1F487\U1F3FB\U200D\U2640'
+emoji[woman_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_getting_haircut_medium_light_skin_tone_minimally]=$'\U1F487\U1F3FC\U200D\U2640'
+emoji[woman_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_getting_haircut_medium_skin_tone_minimally]=$'\U1F487\U1F3FD\U200D\U2640'
+emoji[woman_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_getting_haircut_medium_dark_skin_tone_minimally]=$'\U1F487\U1F3FE\U200D\U2640'
+emoji[woman_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_getting_haircut_dark_skin_tone_minimally]=$'\U1F487\U1F3FF\U200D\U2640'
+emoji[person_walking]=$'\U1F6B6'
+emoji[walking]=$'\U1F6B6'
+emoji[person_walking_light_skin_tone]=$'\U1F6B6\U1F3FB'
+emoji[person_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC'
+emoji[person_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD'
+emoji[person_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE'
+emoji[person_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF'
+emoji[man_walking]=$'\U1F6B6\U200D\U2642\UFE0F'
+emoji[man_walking_minimally]=$'\U1F6B6\U200D\U2642'
+emoji[walking_man]=$'\U1F6B6\U200D\U2642'
+emoji[man_walking_light_skin_tone]=$'\U1F6B6\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_walking_light_skin_tone_minimally]=$'\U1F6B6\U1F3FB\U200D\U2642'
+emoji[man_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_walking_medium_light_skin_tone_minimally]=$'\U1F6B6\U1F3FC\U200D\U2642'
+emoji[man_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_walking_medium_skin_tone_minimally]=$'\U1F6B6\U1F3FD\U200D\U2642'
+emoji[man_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_walking_medium_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FE\U200D\U2642'
+emoji[man_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_walking_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FF\U200D\U2642'
+emoji[woman_walking]=$'\U1F6B6\U200D\U2640\UFE0F'
+emoji[woman_walking_minimally]=$'\U1F6B6\U200D\U2640'
+emoji[walking_woman]=$'\U1F6B6\U200D\U2640'
+emoji[woman_walking_light_skin_tone]=$'\U1F6B6\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_walking_light_skin_tone_minimally]=$'\U1F6B6\U1F3FB\U200D\U2640'
+emoji[woman_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_walking_medium_light_skin_tone_minimally]=$'\U1F6B6\U1F3FC\U200D\U2640'
+emoji[woman_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_walking_medium_skin_tone_minimally]=$'\U1F6B6\U1F3FD\U200D\U2640'
+emoji[woman_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_walking_medium_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FE\U200D\U2640'
+emoji[woman_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_walking_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FF\U200D\U2640'
+emoji[person_standing]=$'\U1F9CD'
+emoji[standing_person]=$'\U1F9CD'
+emoji[person_standing_light_skin_tone]=$'\U1F9CD\U1F3FB'
+emoji[person_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC'
+emoji[person_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD'
+emoji[person_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE'
+emoji[person_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF'
+emoji[man_standing]=$'\U1F9CD\U200D\U2642\UFE0F'
+emoji[man_standing_minimally]=$'\U1F9CD\U200D\U2642'
+emoji[standing_man]=$'\U1F9CD\U200D\U2642'
+emoji[man_standing_light_skin_tone]=$'\U1F9CD\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_standing_light_skin_tone_minimally]=$'\U1F9CD\U1F3FB\U200D\U2642'
+emoji[man_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_standing_medium_light_skin_tone_minimally]=$'\U1F9CD\U1F3FC\U200D\U2642'
+emoji[man_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_standing_medium_skin_tone_minimally]=$'\U1F9CD\U1F3FD\U200D\U2642'
+emoji[man_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_standing_medium_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FE\U200D\U2642'
+emoji[man_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_standing_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FF\U200D\U2642'
+emoji[woman_standing]=$'\U1F9CD\U200D\U2640\UFE0F'
+emoji[woman_standing_minimally]=$'\U1F9CD\U200D\U2640'
+emoji[standing_woman]=$'\U1F9CD\U200D\U2640'
+emoji[woman_standing_light_skin_tone]=$'\U1F9CD\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_standing_light_skin_tone_minimally]=$'\U1F9CD\U1F3FB\U200D\U2640'
+emoji[woman_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_standing_medium_light_skin_tone_minimally]=$'\U1F9CD\U1F3FC\U200D\U2640'
+emoji[woman_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_standing_medium_skin_tone_minimally]=$'\U1F9CD\U1F3FD\U200D\U2640'
+emoji[woman_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_standing_medium_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FE\U200D\U2640'
+emoji[woman_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_standing_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FF\U200D\U2640'
+emoji[person_kneeling]=$'\U1F9CE'
+emoji[kneeling_person]=$'\U1F9CE'
+emoji[person_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB'
+emoji[person_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC'
+emoji[person_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD'
+emoji[person_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE'
+emoji[person_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF'
+emoji[man_kneeling]=$'\U1F9CE\U200D\U2642\UFE0F'
+emoji[man_kneeling_minimally]=$'\U1F9CE\U200D\U2642'
+emoji[kneeling_man]=$'\U1F9CE\U200D\U2642'
+emoji[man_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_kneeling_light_skin_tone_minimally]=$'\U1F9CE\U1F3FB\U200D\U2642'
+emoji[man_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_kneeling_medium_light_skin_tone_minimally]=$'\U1F9CE\U1F3FC\U200D\U2642'
+emoji[man_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_kneeling_medium_skin_tone_minimally]=$'\U1F9CE\U1F3FD\U200D\U2642'
+emoji[man_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_kneeling_medium_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FE\U200D\U2642'
+emoji[man_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_kneeling_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FF\U200D\U2642'
+emoji[woman_kneeling]=$'\U1F9CE\U200D\U2640\UFE0F'
+emoji[woman_kneeling_minimally]=$'\U1F9CE\U200D\U2640'
+emoji[kneeling_woman]=$'\U1F9CE\U200D\U2640'
+emoji[woman_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_kneeling_light_skin_tone_minimally]=$'\U1F9CE\U1F3FB\U200D\U2640'
+emoji[woman_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_kneeling_medium_light_skin_tone_minimally]=$'\U1F9CE\U1F3FC\U200D\U2640'
+emoji[woman_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_kneeling_medium_skin_tone_minimally]=$'\U1F9CE\U1F3FD\U200D\U2640'
+emoji[woman_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_kneeling_medium_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FE\U200D\U2640'
+emoji[woman_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_kneeling_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FF\U200D\U2640'
+emoji[man_with_probing_cane]=$'\U1F468\U200D\U1F9AF'
+emoji[man_with_probing_cane_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9AF'
+emoji[man_with_probing_cane_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9AF'
+emoji[man_with_probing_cane_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9AF'
+emoji[man_with_probing_cane_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9AF'
+emoji[man_with_probing_cane_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9AF'
+emoji[woman_with_probing_cane]=$'\U1F469\U200D\U1F9AF'
+emoji[woman_with_probing_cane_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9AF'
+emoji[woman_with_probing_cane_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9AF'
+emoji[woman_with_probing_cane_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9AF'
+emoji[woman_with_probing_cane_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9AF'
+emoji[woman_with_probing_cane_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9AF'
+emoji[man_in_motorized_wheelchair]=$'\U1F468\U200D\U1F9BC'
+emoji[man_in_motorized_wheelchair_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9BC'
+emoji[man_in_motorized_wheelchair_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9BC'
+emoji[man_in_motorized_wheelchair_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9BC'
+emoji[man_in_motorized_wheelchair_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9BC'
+emoji[man_in_motorized_wheelchair_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9BC'
+emoji[woman_in_motorized_wheelchair]=$'\U1F469\U200D\U1F9BC'
+emoji[woman_in_motorized_wheelchair_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9BC'
+emoji[woman_in_motorized_wheelchair_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9BC'
+emoji[woman_in_motorized_wheelchair_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9BC'
+emoji[woman_in_motorized_wheelchair_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9BC'
+emoji[woman_in_motorized_wheelchair_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9BC'
+emoji[man_in_manual_wheelchair]=$'\U1F468\U200D\U1F9BD'
+emoji[man_in_manual_wheelchair_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9BD'
+emoji[man_in_manual_wheelchair_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9BD'
+emoji[man_in_manual_wheelchair_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9BD'
+emoji[man_in_manual_wheelchair_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9BD'
+emoji[man_in_manual_wheelchair_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9BD'
+emoji[woman_in_manual_wheelchair]=$'\U1F469\U200D\U1F9BD'
+emoji[woman_in_manual_wheelchair_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9BD'
+emoji[woman_in_manual_wheelchair_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9BD'
+emoji[woman_in_manual_wheelchair_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9BD'
+emoji[woman_in_manual_wheelchair_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9BD'
+emoji[woman_in_manual_wheelchair_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9BD'
+emoji[person_running]=$'\U1F3C3'
+emoji[runner]=$'\U1F3C3'
+emoji[running]=$'\U1F3C3'
+emoji[person_running_light_skin_tone]=$'\U1F3C3\U1F3FB'
+emoji[person_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC'
+emoji[person_running_medium_skin_tone]=$'\U1F3C3\U1F3FD'
+emoji[person_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE'
+emoji[person_running_dark_skin_tone]=$'\U1F3C3\U1F3FF'
+emoji[man_running]=$'\U1F3C3\U200D\U2642\UFE0F'
+emoji[man_running_minimally]=$'\U1F3C3\U200D\U2642'
+emoji[running_man]=$'\U1F3C3\U200D\U2642'
+emoji[man_running_light_skin_tone]=$'\U1F3C3\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_running_light_skin_tone_minimally]=$'\U1F3C3\U1F3FB\U200D\U2642'
+emoji[man_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_running_medium_light_skin_tone_minimally]=$'\U1F3C3\U1F3FC\U200D\U2642'
+emoji[man_running_medium_skin_tone]=$'\U1F3C3\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_running_medium_skin_tone_minimally]=$'\U1F3C3\U1F3FD\U200D\U2642'
+emoji[man_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_running_medium_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FE\U200D\U2642'
+emoji[man_running_dark_skin_tone]=$'\U1F3C3\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_running_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FF\U200D\U2642'
+emoji[woman_running]=$'\U1F3C3\U200D\U2640\UFE0F'
+emoji[woman_running_minimally]=$'\U1F3C3\U200D\U2640'
+emoji[running_woman]=$'\U1F3C3\U200D\U2640'
+emoji[woman_running_light_skin_tone]=$'\U1F3C3\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_running_light_skin_tone_minimally]=$'\U1F3C3\U1F3FB\U200D\U2640'
+emoji[woman_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_running_medium_light_skin_tone_minimally]=$'\U1F3C3\U1F3FC\U200D\U2640'
+emoji[woman_running_medium_skin_tone]=$'\U1F3C3\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_running_medium_skin_tone_minimally]=$'\U1F3C3\U1F3FD\U200D\U2640'
+emoji[woman_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_running_medium_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FE\U200D\U2640'
+emoji[woman_running_dark_skin_tone]=$'\U1F3C3\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_running_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FF\U200D\U2640'
+emoji[woman_dancing]=$'\U1F483'
+emoji[dancer]=$'\U1F483'
+emoji[woman_dancing_light_skin_tone]=$'\U1F483\U1F3FB'
+emoji[woman_dancing_medium_light_skin_tone]=$'\U1F483\U1F3FC'
+emoji[woman_dancing_medium_skin_tone]=$'\U1F483\U1F3FD'
+emoji[woman_dancing_medium_dark_skin_tone]=$'\U1F483\U1F3FE'
+emoji[woman_dancing_dark_skin_tone]=$'\U1F483\U1F3FF'
+emoji[woman_dancing_dark_skin_tone_1]=$'\U1F57A'
+emoji[man_dancing]=$'\U1F57A'
+emoji[man_dancing_light_skin_tone]=$'\U1F57A\U1F3FB'
+emoji[man_dancing_medium_light_skin_tone]=$'\U1F57A\U1F3FC'
+emoji[man_dancing_medium_skin_tone]=$'\U1F57A\U1F3FD'
+emoji[man_dancing_medium_dark_skin_tone]=$'\U1F57A\U1F3FE'
+emoji[man_dancing_dark_skin_tone]=$'\U1F57A\U1F3FF'
+emoji[man_in_suit_levitating]=$'\U1F574\UFE0F'
+emoji[man_in_suit_levitating_unqualified]=$'\U1F574'
+emoji[business_suit_levitating]=$'\U1F574'
+emoji[man_in_suit_levitating_light_skin_tone]=$'\U1F574\U1F3FB'
+emoji[man_in_suit_levitating_medium_light_skin_tone]=$'\U1F574\U1F3FC'
+emoji[man_in_suit_levitating_medium_skin_tone]=$'\U1F574\U1F3FD'
+emoji[man_in_suit_levitating_medium_dark_skin_tone]=$'\U1F574\U1F3FE'
+emoji[man_in_suit_levitating_dark_skin_tone]=$'\U1F574\U1F3FF'
+emoji[people_with_bunny_ears]=$'\U1F46F'
+emoji[dancers]=$'\U1F46F'
+emoji[men_with_bunny_ears]=$'\U1F46F\U200D\U2642\UFE0F'
+emoji[men_with_bunny_ears_minimally]=$'\U1F46F\U200D\U2642'
+emoji[dancing_men]=$'\U1F46F\U200D\U2642'
+emoji[women_with_bunny_ears]=$'\U1F46F\U200D\U2640\UFE0F'
+emoji[women_with_bunny_ears_minimally]=$'\U1F46F\U200D\U2640'
+emoji[dancing_women]=$'\U1F46F\U200D\U2640'
+emoji[person_in_steamy_room]=$'\U1F9D6'
+emoji[sauna_person]=$'\U1F9D6'
+emoji[person_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB'
+emoji[person_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC'
+emoji[person_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD'
+emoji[person_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE'
+emoji[person_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF'
+emoji[man_in_steamy_room]=$'\U1F9D6\U200D\U2642\UFE0F'
+emoji[man_in_steamy_room_minimally]=$'\U1F9D6\U200D\U2642'
+emoji[sauna_man]=$'\U1F9D6\U200D\U2642'
+emoji[man_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_in_steamy_room_light_skin_tone_minimally]=$'\U1F9D6\U1F3FB\U200D\U2642'
+emoji[man_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_in_steamy_room_medium_light_skin_tone_minimally]=$'\U1F9D6\U1F3FC\U200D\U2642'
+emoji[man_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_in_steamy_room_medium_skin_tone_minimally]=$'\U1F9D6\U1F3FD\U200D\U2642'
+emoji[man_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_in_steamy_room_medium_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FE\U200D\U2642'
+emoji[man_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_in_steamy_room_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FF\U200D\U2642'
+emoji[woman_in_steamy_room]=$'\U1F9D6\U200D\U2640\UFE0F'
+emoji[woman_in_steamy_room_minimally]=$'\U1F9D6\U200D\U2640'
+emoji[sauna_woman]=$'\U1F9D6\U200D\U2640'
+emoji[woman_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_in_steamy_room_light_skin_tone_minimally]=$'\U1F9D6\U1F3FB\U200D\U2640'
+emoji[woman_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_in_steamy_room_medium_light_skin_tone_minimally]=$'\U1F9D6\U1F3FC\U200D\U2640'
+emoji[woman_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_in_steamy_room_medium_skin_tone_minimally]=$'\U1F9D6\U1F3FD\U200D\U2640'
+emoji[woman_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_in_steamy_room_medium_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FE\U200D\U2640'
+emoji[woman_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_in_steamy_room_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FF\U200D\U2640'
+emoji[person_climbing]=$'\U1F9D7'
+emoji[climbing]=$'\U1F9D7'
+emoji[person_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB'
+emoji[person_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC'
+emoji[person_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD'
+emoji[person_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE'
+emoji[person_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF'
+emoji[man_climbing]=$'\U1F9D7\U200D\U2642\UFE0F'
+emoji[man_climbing_minimally]=$'\U1F9D7\U200D\U2642'
+emoji[climbing_man]=$'\U1F9D7\U200D\U2642'
+emoji[man_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_climbing_light_skin_tone_minimally]=$'\U1F9D7\U1F3FB\U200D\U2642'
+emoji[man_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_climbing_medium_light_skin_tone_minimally]=$'\U1F9D7\U1F3FC\U200D\U2642'
+emoji[man_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_climbing_medium_skin_tone_minimally]=$'\U1F9D7\U1F3FD\U200D\U2642'
+emoji[man_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_climbing_medium_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FE\U200D\U2642'
+emoji[man_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_climbing_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FF\U200D\U2642'
+emoji[woman_climbing]=$'\U1F9D7\U200D\U2640\UFE0F'
+emoji[woman_climbing_minimally]=$'\U1F9D7\U200D\U2640'
+emoji[climbing_woman]=$'\U1F9D7\U200D\U2640'
+emoji[woman_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_climbing_light_skin_tone_minimally]=$'\U1F9D7\U1F3FB\U200D\U2640'
+emoji[woman_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_climbing_medium_light_skin_tone_minimally]=$'\U1F9D7\U1F3FC\U200D\U2640'
+emoji[woman_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_climbing_medium_skin_tone_minimally]=$'\U1F9D7\U1F3FD\U200D\U2640'
+emoji[woman_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_climbing_medium_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FE\U200D\U2640'
+emoji[woman_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_climbing_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FF\U200D\U2640'
+emoji[person_fencing]=$'\U1F93A'
+emoji[horse_racing]=$'\U1F3C7'
+emoji[horse_racing_light_skin_tone]=$'\U1F3C7\U1F3FB'
+emoji[horse_racing_medium_light_skin_tone]=$'\U1F3C7\U1F3FC'
+emoji[horse_racing_medium_skin_tone]=$'\U1F3C7\U1F3FD'
+emoji[horse_racing_medium_dark_skin_tone]=$'\U1F3C7\U1F3FE'
+emoji[horse_racing_dark_skin_tone]=$'\U1F3C7\U1F3FF'
+emoji[skier]=$'\U26F7\UFE0F'
+emoji[skier_unqualified]=$'\U26F7'
+emoji[snowboarder]=$'\U1F3C2'
+emoji[snowboarder_light_skin_tone]=$'\U1F3C2\U1F3FB'
+emoji[snowboarder_medium_light_skin_tone]=$'\U1F3C2\U1F3FC'
+emoji[snowboarder_medium_skin_tone]=$'\U1F3C2\U1F3FD'
+emoji[snowboarder_medium_dark_skin_tone]=$'\U1F3C2\U1F3FE'
+emoji[snowboarder_dark_skin_tone]=$'\U1F3C2\U1F3FF'
+emoji[person_golfing]=$'\U1F3CC\UFE0F'
+emoji[person_golfing_unqualified]=$'\U1F3CC'
+emoji[golfing]=$'\U1F3CC'
+emoji[person_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB'
+emoji[person_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC'
+emoji[person_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD'
+emoji[person_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE'
+emoji[person_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF'
+emoji[man_golfing]=$'\U1F3CC\UFE0F\U200D\U2642\UFE0F'
+emoji[golfing_man]=$'\U1F3CC\UFE0F\U200D\U2642\UFE0F'
+emoji[man_golfing_unqualified]=$'\U1F3CC\U200D\U2642\UFE0F'
+emoji[man_golfing_unqualified_1]=$'\U1F3CC\UFE0F\U200D\U2642'
+emoji[man_golfing_unqualified_2]=$'\U1F3CC\U200D\U2642'
+emoji[man_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_golfing_light_skin_tone_minimally]=$'\U1F3CC\U1F3FB\U200D\U2642'
+emoji[man_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_golfing_medium_light_skin_tone_minimally]=$'\U1F3CC\U1F3FC\U200D\U2642'
+emoji[man_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_golfing_medium_skin_tone_minimally]=$'\U1F3CC\U1F3FD\U200D\U2642'
+emoji[man_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_golfing_medium_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FE\U200D\U2642'
+emoji[man_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_golfing_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FF\U200D\U2642'
+emoji[woman_golfing]=$'\U1F3CC\UFE0F\U200D\U2640\UFE0F'
+emoji[golfing_woman]=$'\U1F3CC\UFE0F\U200D\U2640\UFE0F'
+emoji[woman_golfing_unqualified]=$'\U1F3CC\U200D\U2640\UFE0F'
+emoji[woman_golfing_unqualified_1]=$'\U1F3CC\UFE0F\U200D\U2640'
+emoji[woman_golfing_unqualified_2]=$'\U1F3CC\U200D\U2640'
+emoji[woman_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_golfing_light_skin_tone_minimally]=$'\U1F3CC\U1F3FB\U200D\U2640'
+emoji[woman_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_golfing_medium_light_skin_tone_minimally]=$'\U1F3CC\U1F3FC\U200D\U2640'
+emoji[woman_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_golfing_medium_skin_tone_minimally]=$'\U1F3CC\U1F3FD\U200D\U2640'
+emoji[woman_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_golfing_medium_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FE\U200D\U2640'
+emoji[woman_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_golfing_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FF\U200D\U2640'
+emoji[person_surfing]=$'\U1F3C4'
+emoji[surfer]=$'\U1F3C4'
+emoji[person_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB'
+emoji[person_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC'
+emoji[person_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD'
+emoji[person_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE'
+emoji[person_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF'
+emoji[man_surfing]=$'\U1F3C4\U200D\U2642\UFE0F'
+emoji[man_surfing_minimally]=$'\U1F3C4\U200D\U2642'
+emoji[surfing_man]=$'\U1F3C4\U200D\U2642'
+emoji[man_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_surfing_light_skin_tone_minimally]=$'\U1F3C4\U1F3FB\U200D\U2642'
+emoji[man_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_surfing_medium_light_skin_tone_minimally]=$'\U1F3C4\U1F3FC\U200D\U2642'
+emoji[man_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_surfing_medium_skin_tone_minimally]=$'\U1F3C4\U1F3FD\U200D\U2642'
+emoji[man_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_surfing_medium_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FE\U200D\U2642'
+emoji[man_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_surfing_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FF\U200D\U2642'
+emoji[woman_surfing]=$'\U1F3C4\U200D\U2640\UFE0F'
+emoji[woman_surfing_minimally]=$'\U1F3C4\U200D\U2640'
+emoji[surfing_woman]=$'\U1F3C4\U200D\U2640'
+emoji[woman_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_surfing_light_skin_tone_minimally]=$'\U1F3C4\U1F3FB\U200D\U2640'
+emoji[woman_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_surfing_medium_light_skin_tone_minimally]=$'\U1F3C4\U1F3FC\U200D\U2640'
+emoji[woman_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_surfing_medium_skin_tone_minimally]=$'\U1F3C4\U1F3FD\U200D\U2640'
+emoji[woman_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_surfing_medium_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FE\U200D\U2640'
+emoji[woman_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_surfing_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FF\U200D\U2640'
+emoji[person_rowing_boat]=$'\U1F6A3'
+emoji[rowboat]=$'\U1F6A3'
+emoji[person_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB'
+emoji[person_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC'
+emoji[person_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD'
+emoji[person_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE'
+emoji[person_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF'
+emoji[man_rowing_boat]=$'\U1F6A3\U200D\U2642\UFE0F'
+emoji[man_rowing_boat_minimally]=$'\U1F6A3\U200D\U2642'
+emoji[rowing_man]=$'\U1F6A3\U200D\U2642'
+emoji[man_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_rowing_boat_light_skin_tone_minimally]=$'\U1F6A3\U1F3FB\U200D\U2642'
+emoji[man_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_rowing_boat_medium_light_skin_tone_minimally]=$'\U1F6A3\U1F3FC\U200D\U2642'
+emoji[man_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_rowing_boat_medium_skin_tone_minimally]=$'\U1F6A3\U1F3FD\U200D\U2642'
+emoji[man_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_rowing_boat_medium_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FE\U200D\U2642'
+emoji[man_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_rowing_boat_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FF\U200D\U2642'
+emoji[woman_rowing_boat]=$'\U1F6A3\U200D\U2640\UFE0F'
+emoji[woman_rowing_boat_minimally]=$'\U1F6A3\U200D\U2640'
+emoji[rowing_woman]=$'\U1F6A3\U200D\U2640'
+emoji[woman_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_rowing_boat_light_skin_tone_minimally]=$'\U1F6A3\U1F3FB\U200D\U2640'
+emoji[woman_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_rowing_boat_medium_light_skin_tone_minimally]=$'\U1F6A3\U1F3FC\U200D\U2640'
+emoji[woman_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_rowing_boat_medium_skin_tone_minimally]=$'\U1F6A3\U1F3FD\U200D\U2640'
+emoji[woman_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_rowing_boat_medium_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FE\U200D\U2640'
+emoji[woman_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_rowing_boat_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FF\U200D\U2640'
+emoji[person_swimming]=$'\U1F3CA'
+emoji[swimmer]=$'\U1F3CA'
+emoji[person_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB'
+emoji[person_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC'
+emoji[person_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD'
+emoji[person_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE'
+emoji[person_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF'
+emoji[man_swimming]=$'\U1F3CA\U200D\U2642\UFE0F'
+emoji[man_swimming_minimally]=$'\U1F3CA\U200D\U2642'
+emoji[swimming_man]=$'\U1F3CA\U200D\U2642'
+emoji[man_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_swimming_light_skin_tone_minimally]=$'\U1F3CA\U1F3FB\U200D\U2642'
+emoji[man_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_swimming_medium_light_skin_tone_minimally]=$'\U1F3CA\U1F3FC\U200D\U2642'
+emoji[man_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_swimming_medium_skin_tone_minimally]=$'\U1F3CA\U1F3FD\U200D\U2642'
+emoji[man_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_swimming_medium_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FE\U200D\U2642'
+emoji[man_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_swimming_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FF\U200D\U2642'
+emoji[woman_swimming]=$'\U1F3CA\U200D\U2640\UFE0F'
+emoji[woman_swimming_minimally]=$'\U1F3CA\U200D\U2640'
+emoji[swimming_woman]=$'\U1F3CA\U200D\U2640'
+emoji[woman_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_swimming_light_skin_tone_minimally]=$'\U1F3CA\U1F3FB\U200D\U2640'
+emoji[woman_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_swimming_medium_light_skin_tone_minimally]=$'\U1F3CA\U1F3FC\U200D\U2640'
+emoji[woman_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_swimming_medium_skin_tone_minimally]=$'\U1F3CA\U1F3FD\U200D\U2640'
+emoji[woman_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_swimming_medium_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FE\U200D\U2640'
+emoji[woman_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_swimming_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FF\U200D\U2640'
+emoji[person_bouncing_ball]=$'\U26F9\UFE0F'
+emoji[person_bouncing_ball_unqualified]=$'\U26F9'
+emoji[bouncing_ball_person]=$'\U26F9'
+emoji[person_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB'
+emoji[person_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC'
+emoji[person_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD'
+emoji[person_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE'
+emoji[person_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF'
+emoji[man_bouncing_ball]=$'\U26F9\UFE0F\U200D\U2642\UFE0F'
+emoji[bouncing_ball_man]=$'\U26F9\UFE0F\U200D\U2642\UFE0F'
+emoji[basketball_man]=$'\U26F9\UFE0F\U200D\U2642\UFE0F'
+emoji[man_bouncing_ball_unqualified]=$'\U26F9\U200D\U2642\UFE0F'
+emoji[man_bouncing_ball_unqualified_1]=$'\U26F9\UFE0F\U200D\U2642'
+emoji[man_bouncing_ball_unqualified_2]=$'\U26F9\U200D\U2642'
+emoji[man_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_bouncing_ball_light_skin_tone_minimally]=$'\U26F9\U1F3FB\U200D\U2642'
+emoji[man_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_bouncing_ball_medium_light_skin_tone_minimally]=$'\U26F9\U1F3FC\U200D\U2642'
+emoji[man_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_bouncing_ball_medium_skin_tone_minimally]=$'\U26F9\U1F3FD\U200D\U2642'
+emoji[man_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_bouncing_ball_medium_dark_skin_tone_minimally]=$'\U26F9\U1F3FE\U200D\U2642'
+emoji[man_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_bouncing_ball_dark_skin_tone_minimally]=$'\U26F9\U1F3FF\U200D\U2642'
+emoji[woman_bouncing_ball]=$'\U26F9\UFE0F\U200D\U2640\UFE0F'
+emoji[bouncing_ball_woman]=$'\U26F9\UFE0F\U200D\U2640\UFE0F'
+emoji[basketball_woman]=$'\U26F9\UFE0F\U200D\U2640\UFE0F'
+emoji[woman_bouncing_ball_unqualified]=$'\U26F9\U200D\U2640\UFE0F'
+emoji[woman_bouncing_ball_unqualified_1]=$'\U26F9\UFE0F\U200D\U2640'
+emoji[woman_bouncing_ball_unqualified_2]=$'\U26F9\U200D\U2640'
+emoji[woman_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_bouncing_ball_light_skin_tone_minimally]=$'\U26F9\U1F3FB\U200D\U2640'
+emoji[woman_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_bouncing_ball_medium_light_skin_tone_minimally]=$'\U26F9\U1F3FC\U200D\U2640'
+emoji[woman_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_bouncing_ball_medium_skin_tone_minimally]=$'\U26F9\U1F3FD\U200D\U2640'
+emoji[woman_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_bouncing_ball_medium_dark_skin_tone_minimally]=$'\U26F9\U1F3FE\U200D\U2640'
+emoji[woman_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_bouncing_ball_dark_skin_tone_minimally]=$'\U26F9\U1F3FF\U200D\U2640'
+emoji[person_lifting_weights]=$'\U1F3CB\UFE0F'
+emoji[person_lifting_weights_unqualified]=$'\U1F3CB'
+emoji[weight_lifting]=$'\U1F3CB'
+emoji[person_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB'
+emoji[person_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC'
+emoji[person_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD'
+emoji[person_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE'
+emoji[person_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF'
+emoji[man_lifting_weights]=$'\U1F3CB\UFE0F\U200D\U2642\UFE0F'
+emoji[weight_lifting_man]=$'\U1F3CB\UFE0F\U200D\U2642\UFE0F'
+emoji[man_lifting_weights_unqualified]=$'\U1F3CB\U200D\U2642\UFE0F'
+emoji[man_lifting_weights_unqualified_1]=$'\U1F3CB\UFE0F\U200D\U2642'
+emoji[man_lifting_weights_unqualified_2]=$'\U1F3CB\U200D\U2642'
+emoji[man_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_lifting_weights_light_skin_tone_minimally]=$'\U1F3CB\U1F3FB\U200D\U2642'
+emoji[man_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_lifting_weights_medium_light_skin_tone_minimally]=$'\U1F3CB\U1F3FC\U200D\U2642'
+emoji[man_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_lifting_weights_medium_skin_tone_minimally]=$'\U1F3CB\U1F3FD\U200D\U2642'
+emoji[man_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_lifting_weights_medium_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FE\U200D\U2642'
+emoji[man_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_lifting_weights_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FF\U200D\U2642'
+emoji[woman_lifting_weights]=$'\U1F3CB\UFE0F\U200D\U2640\UFE0F'
+emoji[weight_lifting_woman]=$'\U1F3CB\UFE0F\U200D\U2640\UFE0F'
+emoji[woman_lifting_weights_unqualified]=$'\U1F3CB\U200D\U2640\UFE0F'
+emoji[woman_lifting_weights_unqualified_1]=$'\U1F3CB\UFE0F\U200D\U2640'
+emoji[woman_lifting_weights_unqualified_2]=$'\U1F3CB\U200D\U2640'
+emoji[woman_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_lifting_weights_light_skin_tone_minimally]=$'\U1F3CB\U1F3FB\U200D\U2640'
+emoji[woman_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_lifting_weights_medium_light_skin_tone_minimally]=$'\U1F3CB\U1F3FC\U200D\U2640'
+emoji[woman_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_lifting_weights_medium_skin_tone_minimally]=$'\U1F3CB\U1F3FD\U200D\U2640'
+emoji[woman_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_lifting_weights_medium_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FE\U200D\U2640'
+emoji[woman_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_lifting_weights_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FF\U200D\U2640'
+emoji[person_biking]=$'\U1F6B4'
+emoji[bicyclist]=$'\U1F6B4'
+emoji[person_biking_light_skin_tone]=$'\U1F6B4\U1F3FB'
+emoji[person_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC'
+emoji[person_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD'
+emoji[person_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE'
+emoji[person_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF'
+emoji[man_biking]=$'\U1F6B4\U200D\U2642\UFE0F'
+emoji[man_biking_minimally]=$'\U1F6B4\U200D\U2642'
+emoji[biking_man]=$'\U1F6B4\U200D\U2642'
+emoji[man_biking_light_skin_tone]=$'\U1F6B4\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_biking_light_skin_tone_minimally]=$'\U1F6B4\U1F3FB\U200D\U2642'
+emoji[man_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_biking_medium_light_skin_tone_minimally]=$'\U1F6B4\U1F3FC\U200D\U2642'
+emoji[man_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_biking_medium_skin_tone_minimally]=$'\U1F6B4\U1F3FD\U200D\U2642'
+emoji[man_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_biking_medium_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FE\U200D\U2642'
+emoji[man_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_biking_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FF\U200D\U2642'
+emoji[woman_biking]=$'\U1F6B4\U200D\U2640\UFE0F'
+emoji[woman_biking_minimally]=$'\U1F6B4\U200D\U2640'
+emoji[biking_woman]=$'\U1F6B4\U200D\U2640'
+emoji[woman_biking_light_skin_tone]=$'\U1F6B4\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_biking_light_skin_tone_minimally]=$'\U1F6B4\U1F3FB\U200D\U2640'
+emoji[woman_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_biking_medium_light_skin_tone_minimally]=$'\U1F6B4\U1F3FC\U200D\U2640'
+emoji[woman_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_biking_medium_skin_tone_minimally]=$'\U1F6B4\U1F3FD\U200D\U2640'
+emoji[woman_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_biking_medium_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FE\U200D\U2640'
+emoji[woman_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_biking_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FF\U200D\U2640'
+emoji[person_mountain_biking]=$'\U1F6B5'
+emoji[mountain_bicyclist]=$'\U1F6B5'
+emoji[person_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB'
+emoji[person_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC'
+emoji[person_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD'
+emoji[person_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE'
+emoji[person_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF'
+emoji[man_mountain_biking]=$'\U1F6B5\U200D\U2642\UFE0F'
+emoji[man_mountain_biking_minimally]=$'\U1F6B5\U200D\U2642'
+emoji[mountain_biking_man]=$'\U1F6B5\U200D\U2642'
+emoji[man_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_mountain_biking_light_skin_tone_minimally]=$'\U1F6B5\U1F3FB\U200D\U2642'
+emoji[man_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_mountain_biking_medium_light_skin_tone_minimally]=$'\U1F6B5\U1F3FC\U200D\U2642'
+emoji[man_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_mountain_biking_medium_skin_tone_minimally]=$'\U1F6B5\U1F3FD\U200D\U2642'
+emoji[man_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_mountain_biking_medium_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FE\U200D\U2642'
+emoji[man_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_mountain_biking_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FF\U200D\U2642'
+emoji[woman_mountain_biking]=$'\U1F6B5\U200D\U2640\UFE0F'
+emoji[woman_mountain_biking_minimally]=$'\U1F6B5\U200D\U2640'
+emoji[mountain_biking_woman]=$'\U1F6B5\U200D\U2640'
+emoji[woman_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_mountain_biking_light_skin_tone_minimally]=$'\U1F6B5\U1F3FB\U200D\U2640'
+emoji[woman_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_mountain_biking_medium_light_skin_tone_minimally]=$'\U1F6B5\U1F3FC\U200D\U2640'
+emoji[woman_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_mountain_biking_medium_skin_tone_minimally]=$'\U1F6B5\U1F3FD\U200D\U2640'
+emoji[woman_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_mountain_biking_medium_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FE\U200D\U2640'
+emoji[woman_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_mountain_biking_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FF\U200D\U2640'
+emoji[person_cartwheeling]=$'\U1F938'
+emoji[cartwheeling]=$'\U1F938'
+emoji[person_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB'
+emoji[person_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC'
+emoji[person_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD'
+emoji[person_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE'
+emoji[person_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF'
+emoji[man_cartwheeling]=$'\U1F938\U200D\U2642\UFE0F'
+emoji[man_cartwheeling_minimally]=$'\U1F938\U200D\U2642'
+emoji[man_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_cartwheeling_light_skin_tone_minimally]=$'\U1F938\U1F3FB\U200D\U2642'
+emoji[man_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_cartwheeling_medium_light_skin_tone_minimally]=$'\U1F938\U1F3FC\U200D\U2642'
+emoji[man_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_cartwheeling_medium_skin_tone_minimally]=$'\U1F938\U1F3FD\U200D\U2642'
+emoji[man_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_cartwheeling_medium_dark_skin_tone_minimally]=$'\U1F938\U1F3FE\U200D\U2642'
+emoji[man_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_cartwheeling_dark_skin_tone_minimally]=$'\U1F938\U1F3FF\U200D\U2642'
+emoji[woman_cartwheeling]=$'\U1F938\U200D\U2640\UFE0F'
+emoji[woman_cartwheeling_minimally]=$'\U1F938\U200D\U2640'
+emoji[woman_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_cartwheeling_light_skin_tone_minimally]=$'\U1F938\U1F3FB\U200D\U2640'
+emoji[woman_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_cartwheeling_medium_light_skin_tone_minimally]=$'\U1F938\U1F3FC\U200D\U2640'
+emoji[woman_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_cartwheeling_medium_skin_tone_minimally]=$'\U1F938\U1F3FD\U200D\U2640'
+emoji[woman_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_cartwheeling_medium_dark_skin_tone_minimally]=$'\U1F938\U1F3FE\U200D\U2640'
+emoji[woman_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_cartwheeling_dark_skin_tone_minimally]=$'\U1F938\U1F3FF\U200D\U2640'
+emoji[people_wrestling]=$'\U1F93C'
+emoji[wrestling]=$'\U1F93C'
+emoji[men_wrestling]=$'\U1F93C\U200D\U2642\UFE0F'
+emoji[men_wrestling_minimally]=$'\U1F93C\U200D\U2642'
+emoji[women_wrestling]=$'\U1F93C\U200D\U2640\UFE0F'
+emoji[women_wrestling_minimally]=$'\U1F93C\U200D\U2640'
+emoji[person_playing_water_polo]=$'\U1F93D'
+emoji[water_polo]=$'\U1F93D'
+emoji[person_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB'
+emoji[person_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC'
+emoji[person_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD'
+emoji[person_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE'
+emoji[person_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF'
+emoji[man_playing_water_polo]=$'\U1F93D\U200D\U2642\UFE0F'
+emoji[man_playing_water_polo_minimally]=$'\U1F93D\U200D\U2642'
+emoji[man_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_playing_water_polo_light_skin_tone_minimally]=$'\U1F93D\U1F3FB\U200D\U2642'
+emoji[man_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_playing_water_polo_medium_light_skin_tone_minimally]=$'\U1F93D\U1F3FC\U200D\U2642'
+emoji[man_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_playing_water_polo_medium_skin_tone_minimally]=$'\U1F93D\U1F3FD\U200D\U2642'
+emoji[man_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_playing_water_polo_medium_dark_skin_tone_minimally]=$'\U1F93D\U1F3FE\U200D\U2642'
+emoji[man_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_playing_water_polo_dark_skin_tone_minimally]=$'\U1F93D\U1F3FF\U200D\U2642'
+emoji[woman_playing_water_polo]=$'\U1F93D\U200D\U2640\UFE0F'
+emoji[woman_playing_water_polo_minimally]=$'\U1F93D\U200D\U2640'
+emoji[woman_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_playing_water_polo_light_skin_tone_minimally]=$'\U1F93D\U1F3FB\U200D\U2640'
+emoji[woman_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_playing_water_polo_medium_light_skin_tone_minimally]=$'\U1F93D\U1F3FC\U200D\U2640'
+emoji[woman_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_playing_water_polo_medium_skin_tone_minimally]=$'\U1F93D\U1F3FD\U200D\U2640'
+emoji[woman_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_playing_water_polo_medium_dark_skin_tone_minimally]=$'\U1F93D\U1F3FE\U200D\U2640'
+emoji[woman_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_playing_water_polo_dark_skin_tone_minimally]=$'\U1F93D\U1F3FF\U200D\U2640'
+emoji[person_playing_handball]=$'\U1F93E'
+emoji[handball_person]=$'\U1F93E'
+emoji[person_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB'
+emoji[person_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC'
+emoji[person_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD'
+emoji[person_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE'
+emoji[person_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF'
+emoji[man_playing_handball]=$'\U1F93E\U200D\U2642\UFE0F'
+emoji[man_playing_handball_minimally]=$'\U1F93E\U200D\U2642'
+emoji[man_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_playing_handball_light_skin_tone_minimally]=$'\U1F93E\U1F3FB\U200D\U2642'
+emoji[man_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_playing_handball_medium_light_skin_tone_minimally]=$'\U1F93E\U1F3FC\U200D\U2642'
+emoji[man_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_playing_handball_medium_skin_tone_minimally]=$'\U1F93E\U1F3FD\U200D\U2642'
+emoji[man_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_playing_handball_medium_dark_skin_tone_minimally]=$'\U1F93E\U1F3FE\U200D\U2642'
+emoji[man_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_playing_handball_dark_skin_tone_minimally]=$'\U1F93E\U1F3FF\U200D\U2642'
+emoji[woman_playing_handball]=$'\U1F93E\U200D\U2640\UFE0F'
+emoji[woman_playing_handball_minimally]=$'\U1F93E\U200D\U2640'
+emoji[woman_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_playing_handball_light_skin_tone_minimally]=$'\U1F93E\U1F3FB\U200D\U2640'
+emoji[woman_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_playing_handball_medium_light_skin_tone_minimally]=$'\U1F93E\U1F3FC\U200D\U2640'
+emoji[woman_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_playing_handball_medium_skin_tone_minimally]=$'\U1F93E\U1F3FD\U200D\U2640'
+emoji[woman_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_playing_handball_medium_dark_skin_tone_minimally]=$'\U1F93E\U1F3FE\U200D\U2640'
+emoji[woman_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_playing_handball_dark_skin_tone_minimally]=$'\U1F93E\U1F3FF\U200D\U2640'
+emoji[person_juggling]=$'\U1F939'
+emoji[juggling_person]=$'\U1F939'
+emoji[person_juggling_light_skin_tone]=$'\U1F939\U1F3FB'
+emoji[person_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC'
+emoji[person_juggling_medium_skin_tone]=$'\U1F939\U1F3FD'
+emoji[person_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE'
+emoji[person_juggling_dark_skin_tone]=$'\U1F939\U1F3FF'
+emoji[man_juggling]=$'\U1F939\U200D\U2642\UFE0F'
+emoji[man_juggling_minimally]=$'\U1F939\U200D\U2642'
+emoji[man_juggling_light_skin_tone]=$'\U1F939\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_juggling_light_skin_tone_minimally]=$'\U1F939\U1F3FB\U200D\U2642'
+emoji[man_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_juggling_medium_light_skin_tone_minimally]=$'\U1F939\U1F3FC\U200D\U2642'
+emoji[man_juggling_medium_skin_tone]=$'\U1F939\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_juggling_medium_skin_tone_minimally]=$'\U1F939\U1F3FD\U200D\U2642'
+emoji[man_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_juggling_medium_dark_skin_tone_minimally]=$'\U1F939\U1F3FE\U200D\U2642'
+emoji[man_juggling_dark_skin_tone]=$'\U1F939\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_juggling_dark_skin_tone_minimally]=$'\U1F939\U1F3FF\U200D\U2642'
+emoji[woman_juggling]=$'\U1F939\U200D\U2640\UFE0F'
+emoji[woman_juggling_minimally]=$'\U1F939\U200D\U2640'
+emoji[woman_juggling_light_skin_tone]=$'\U1F939\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_juggling_light_skin_tone_minimally]=$'\U1F939\U1F3FB\U200D\U2640'
+emoji[woman_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_juggling_medium_light_skin_tone_minimally]=$'\U1F939\U1F3FC\U200D\U2640'
+emoji[woman_juggling_medium_skin_tone]=$'\U1F939\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_juggling_medium_skin_tone_minimally]=$'\U1F939\U1F3FD\U200D\U2640'
+emoji[woman_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_juggling_medium_dark_skin_tone_minimally]=$'\U1F939\U1F3FE\U200D\U2640'
+emoji[woman_juggling_dark_skin_tone]=$'\U1F939\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_juggling_dark_skin_tone_minimally]=$'\U1F939\U1F3FF\U200D\U2640'
+emoji[person_in_lotus_position]=$'\U1F9D8'
+emoji[lotus_position]=$'\U1F9D8'
+emoji[person_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB'
+emoji[person_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC'
+emoji[person_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD'
+emoji[person_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE'
+emoji[person_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF'
+emoji[man_in_lotus_position]=$'\U1F9D8\U200D\U2642\UFE0F'
+emoji[man_in_lotus_position_minimally]=$'\U1F9D8\U200D\U2642'
+emoji[lotus_position_man]=$'\U1F9D8\U200D\U2642'
+emoji[man_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB\U200D\U2642\UFE0F'
+emoji[man_in_lotus_position_light_skin_tone_minimally]=$'\U1F9D8\U1F3FB\U200D\U2642'
+emoji[man_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC\U200D\U2642\UFE0F'
+emoji[man_in_lotus_position_medium_light_skin_tone_minimally]=$'\U1F9D8\U1F3FC\U200D\U2642'
+emoji[man_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD\U200D\U2642\UFE0F'
+emoji[man_in_lotus_position_medium_skin_tone_minimally]=$'\U1F9D8\U1F3FD\U200D\U2642'
+emoji[man_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE\U200D\U2642\UFE0F'
+emoji[man_in_lotus_position_medium_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FE\U200D\U2642'
+emoji[man_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF\U200D\U2642\UFE0F'
+emoji[man_in_lotus_position_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FF\U200D\U2642'
+emoji[woman_in_lotus_position]=$'\U1F9D8\U200D\U2640\UFE0F'
+emoji[woman_in_lotus_position_minimally]=$'\U1F9D8\U200D\U2640'
+emoji[lotus_position_woman]=$'\U1F9D8\U200D\U2640'
+emoji[woman_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB\U200D\U2640\UFE0F'
+emoji[woman_in_lotus_position_light_skin_tone_minimally]=$'\U1F9D8\U1F3FB\U200D\U2640'
+emoji[woman_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC\U200D\U2640\UFE0F'
+emoji[woman_in_lotus_position_medium_light_skin_tone_minimally]=$'\U1F9D8\U1F3FC\U200D\U2640'
+emoji[woman_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD\U200D\U2640\UFE0F'
+emoji[woman_in_lotus_position_medium_skin_tone_minimally]=$'\U1F9D8\U1F3FD\U200D\U2640'
+emoji[woman_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE\U200D\U2640\UFE0F'
+emoji[woman_in_lotus_position_medium_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FE\U200D\U2640'
+emoji[woman_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF\U200D\U2640\UFE0F'
+emoji[woman_in_lotus_position_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FF\U200D\U2640'
+emoji[person_taking_bath]=$'\U1F6C0'
+emoji[bath]=$'\U1F6C0'
+emoji[person_taking_bath_light_skin_tone]=$'\U1F6C0\U1F3FB'
+emoji[person_taking_bath_medium_light_skin_tone]=$'\U1F6C0\U1F3FC'
+emoji[person_taking_bath_medium_skin_tone]=$'\U1F6C0\U1F3FD'
+emoji[person_taking_bath_medium_dark_skin_tone]=$'\U1F6C0\U1F3FE'
+emoji[person_taking_bath_dark_skin_tone]=$'\U1F6C0\U1F3FF'
+emoji[person_in_bed]=$'\U1F6CC'
+emoji[sleeping_bed]=$'\U1F6CC'
+emoji[person_in_bed_light_skin_tone]=$'\U1F6CC\U1F3FB'
+emoji[person_in_bed_medium_light_skin_tone]=$'\U1F6CC\U1F3FC'
+emoji[person_in_bed_medium_skin_tone]=$'\U1F6CC\U1F3FD'
+emoji[person_in_bed_medium_dark_skin_tone]=$'\U1F6CC\U1F3FE'
+emoji[person_in_bed_dark_skin_tone]=$'\U1F6CC\U1F3FF'
+emoji[people_holding_hands]=$'\U1F9D1\U200D\U1F91D\U200D\U1F9D1'
+emoji[people_holding_hands_light_skin_tone]=$'\U1F9D1\U1F3FB\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
+emoji[people_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FC\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
+emoji[people_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F9D1\U1F3FC\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
+emoji[people_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
+emoji[people_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
+emoji[people_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FD'
+emoji[people_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
+emoji[people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
+emoji[people_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FD'
+emoji[people_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FE'
+emoji[people_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
+emoji[people_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
+emoji[people_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FD'
+emoji[people_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FE'
+emoji[people_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FF'
+emoji[women_holding_hands]=$'\U1F46D'
+emoji[two_women_holding_hands]=$'\U1F46D'
+emoji[women_holding_hands_light_skin_tone]=$'\U1F46D\U1F3FB'
+emoji[women_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F469\U1F3FB'
+emoji[women_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46D\U1F3FC'
+emoji[women_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F469\U1F3FB'
+emoji[women_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F469\U1F3FC'
+emoji[women_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46D\U1F3FD'
+emoji[women_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FB'
+emoji[women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FC'
+emoji[women_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FD'
+emoji[women_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46D\U1F3FE'
+emoji[women_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FB'
+emoji[women_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FC'
+emoji[women_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FD'
+emoji[women_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FE'
+emoji[women_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46D\U1F3FF'
+emoji[woman_and_man_holding_hands]=$'\U1F46B'
+emoji[couple]=$'\U1F46B'
+emoji[woman_and_man_holding_hands_light_skin_tone]=$'\U1F46B\U1F3FB'
+emoji[woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FC'
+emoji[woman_and_man_holding_hands_light_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FD'
+emoji[woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FE'
+emoji[woman_and_man_holding_hands_light_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FF'
+emoji[woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FB'
+emoji[woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46B\U1F3FC'
+emoji[woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FD'
+emoji[woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FE'
+emoji[woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FF'
+emoji[woman_and_man_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FB'
+emoji[woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FC'
+emoji[woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46B\U1F3FD'
+emoji[woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FE'
+emoji[woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FF'
+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FB'
+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FC'
+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FD'
+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46B\U1F3FE'
+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FF'
+emoji[woman_and_man_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FB'
+emoji[woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FC'
+emoji[woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FD'
+emoji[woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FE'
+emoji[woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46B\U1F3FF'
+emoji[men_holding_hands]=$'\U1F46C'
+emoji[two_men_holding_hands]=$'\U1F46C'
+emoji[men_holding_hands_light_skin_tone]=$'\U1F46C\U1F3FB'
+emoji[men_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FB'
+emoji[men_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46C\U1F3FC'
+emoji[men_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FB'
+emoji[men_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FC'
+emoji[men_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46C\U1F3FD'
+emoji[men_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FB'
+emoji[men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FC'
+emoji[men_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FD'
+emoji[men_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46C\U1F3FE'
+emoji[men_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FB'
+emoji[men_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FC'
+emoji[men_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FD'
+emoji[men_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FE'
+emoji[men_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46C\U1F3FF'
+emoji[kiss]=$'\U1F48F'
+emoji[couplekiss]=$'\U1F48F'
+emoji[kiss_woman_man]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
+emoji[couplekiss_man_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
+emoji[kiss_woman_man_minimally]=$'\U1F469\U200D\U2764\U200D\U1F48B\U200D\U1F468'
+emoji[kiss_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
+emoji[couplekiss_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
+emoji[kiss_man_man_minimally]=$'\U1F468\U200D\U2764\U200D\U1F48B\U200D\U1F468'
+emoji[kiss_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F469'
+emoji[couplekiss_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F469'
+emoji[kiss_woman_woman_minimally]=$'\U1F469\U200D\U2764\U200D\U1F48B\U200D\U1F469'
+emoji[couple_with_heart]=$'\U1F491'
+emoji[couple_with_heart_woman_man]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F468'
+emoji[couple_with_heart_woman_man_minimally]=$'\U1F469\U200D\U2764\U200D\U1F468'
+emoji[couple_with_heart_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F468'
+emoji[couple_with_heart_man_man_minimally]=$'\U1F468\U200D\U2764\U200D\U1F468'
+emoji[couple_with_heart_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F469'
+emoji[couple_with_heart_woman_woman_minimally]=$'\U1F469\U200D\U2764\U200D\U1F469'
+emoji[family]=$'\U1F46A'
+emoji[family_man_woman_boy]=$'\U1F468\U200D\U1F469\U200D\U1F466'
+emoji[family_man_woman_girl]=$'\U1F468\U200D\U1F469\U200D\U1F467'
+emoji[family_man_woman_girl_boy]=$'\U1F468\U200D\U1F469\U200D\U1F467\U200D\U1F466'
+emoji[family_man_woman_boy_boy]=$'\U1F468\U200D\U1F469\U200D\U1F466\U200D\U1F466'
+emoji[family_man_woman_girl_girl]=$'\U1F468\U200D\U1F469\U200D\U1F467\U200D\U1F467'
+emoji[family_man_man_boy]=$'\U1F468\U200D\U1F468\U200D\U1F466'
+emoji[family_man_man_girl]=$'\U1F468\U200D\U1F468\U200D\U1F467'
+emoji[family_man_man_girl_boy]=$'\U1F468\U200D\U1F468\U200D\U1F467\U200D\U1F466'
+emoji[family_man_man_boy_boy]=$'\U1F468\U200D\U1F468\U200D\U1F466\U200D\U1F466'
+emoji[family_man_man_girl_girl]=$'\U1F468\U200D\U1F468\U200D\U1F467\U200D\U1F467'
+emoji[family_woman_woman_boy]=$'\U1F469\U200D\U1F469\U200D\U1F466'
+emoji[family_woman_woman_girl]=$'\U1F469\U200D\U1F469\U200D\U1F467'
+emoji[family_woman_woman_girl_boy]=$'\U1F469\U200D\U1F469\U200D\U1F467\U200D\U1F466'
+emoji[family_woman_woman_boy_boy]=$'\U1F469\U200D\U1F469\U200D\U1F466\U200D\U1F466'
+emoji[family_woman_woman_girl_girl]=$'\U1F469\U200D\U1F469\U200D\U1F467\U200D\U1F467'
+emoji[family_man_boy]=$'\U1F468\U200D\U1F466'
+emoji[family_man_boy_boy]=$'\U1F468\U200D\U1F466\U200D\U1F466'
+emoji[family_man_girl]=$'\U1F468\U200D\U1F467'
+emoji[family_man_girl_boy]=$'\U1F468\U200D\U1F467\U200D\U1F466'
+emoji[family_man_girl_girl]=$'\U1F468\U200D\U1F467\U200D\U1F467'
+emoji[family_woman_boy]=$'\U1F469\U200D\U1F466'
+emoji[family_woman_boy_boy]=$'\U1F469\U200D\U1F466\U200D\U1F466'
+emoji[family_woman_girl]=$'\U1F469\U200D\U1F467'
+emoji[family_woman_girl_boy]=$'\U1F469\U200D\U1F467\U200D\U1F466'
+emoji[family_woman_girl_girl]=$'\U1F469\U200D\U1F467\U200D\U1F467'
+emoji[speaking_head]=$'\U1F5E3\UFE0F'
+emoji[speaking_head_unqualified]=$'\U1F5E3'
+emoji[bust_in_silhouette]=$'\U1F464'
+emoji[busts_in_silhouette]=$'\U1F465'
+emoji[footprints]=$'\U1F463'
+emoji_mod[light_skin_tone]=$'\U1F3FB'
+emoji_mod[medium_light_skin_tone]=$'\U1F3FC'
+emoji_mod[medium_skin_tone]=$'\U1F3FD'
+emoji_mod[medium_dark_skin_tone]=$'\U1F3FE'
+emoji_mod[medium_dark_skin_tone_1]=$'\U1F3FF'
+emoji_mod[red_hair]=$'\U1F9B0'
+emoji_mod[curly_hair]=$'\U1F9B1'
+emoji_mod[white_hair]=$'\U1F9B3'
+emoji_mod[bald]=$'\U1F9B2'
+emoji[monkey_face]=$'\U1F435'
+emoji[monkey_face_1]=$'\U1F412'
+emoji[monkey]=$'\U1F412'
+emoji[gorilla]=$'\U1F98D'
+emoji[orangutan]=$'\U1F9A7'
+emoji[dog_face]=$'\U1F436'
+emoji[dog]=$'\U1F436'
+emoji[dog_face_1]=$'\U1F415'
+emoji[dog2]=$'\U1F415'
+emoji[guide_dog]=$'\U1F9AE'
+emoji[service_dog]=$'\U1F415\U200D\U1F9BA'
+emoji[poodle]=$'\U1F429'
+emoji[wolf]=$'\U1F43A'
+emoji[fox]=$'\U1F98A'
+emoji[fox_face]=$'\U1F98A'
+emoji[raccoon]=$'\U1F99D'
+emoji[cat_face]=$'\U1F431'
+emoji[cat]=$'\U1F431'
+emoji[cat_face_1]=$'\U1F408'
+emoji[cat2]=$'\U1F408'
+emoji[lion]=$'\U1F981'
+emoji[tiger_face]=$'\U1F42F'
+emoji[tiger]=$'\U1F42F'
+emoji[tiger_face_1]=$'\U1F405'
+emoji[tiger2]=$'\U1F405'
+emoji[leopard]=$'\U1F406'
+emoji[horse_face]=$'\U1F434'
+emoji[horse]=$'\U1F434'
+emoji[horse_face_1]=$'\U1F40E'
+emoji[racehorse]=$'\U1F40E'
+emoji[unicorn]=$'\U1F984'
+emoji[zebra]=$'\U1F993'
+emoji[deer]=$'\U1F98C'
+emoji[cow_face]=$'\U1F42E'
+emoji[ox]=$'\U1F402'
+emoji[water_buffalo]=$'\U1F403'
+emoji[cow]=$'\U1F404'
+emoji[cow2]=$'\U1F404'
+emoji[pig_face]=$'\U1F437'
+emoji[pig]=$'\U1F437'
+emoji[pig_face_1]=$'\U1F416'
+emoji[pig2]=$'\U1F416'
+emoji[boar]=$'\U1F417'
+emoji[pig_nose]=$'\U1F43D'
+emoji[ram]=$'\U1F40F'
+emoji[ewe]=$'\U1F411'
+emoji[sheep]=$'\U1F411'
+emoji[goat]=$'\U1F410'
+emoji[camel]=$'\U1F42A'
+emoji[dromedary_camel]=$'\U1F42A'
+emoji[two_hump_camel]=$'\U1F42B'
+emoji[llama]=$'\U1F999'
+emoji[giraffe]=$'\U1F992'
+emoji[elephant]=$'\U1F418'
+emoji[rhinoceros]=$'\U1F98F'
+emoji[hippopotamus]=$'\U1F99B'
+emoji[mouse_face]=$'\U1F42D'
+emoji[mouse]=$'\U1F42D'
+emoji[mouse_face_1]=$'\U1F401'
+emoji[mouse2]=$'\U1F401'
+emoji[rat]=$'\U1F400'
+emoji[hamster]=$'\U1F439'
+emoji[rabbit_face]=$'\U1F430'
+emoji[rabbit]=$'\U1F430'
+emoji[rabbit_face_1]=$'\U1F407'
+emoji[rabbit2]=$'\U1F407'
+emoji[chipmunk]=$'\U1F43F\UFE0F'
+emoji[chipmunk_unqualified]=$'\U1F43F'
+emoji[hedgehog]=$'\U1F994'
+emoji[bat]=$'\U1F987'
+emoji[bear]=$'\U1F43B'
+emoji[koala]=$'\U1F428'
+emoji[panda]=$'\U1F43C'
+emoji[panda_face]=$'\U1F43C'
+emoji[sloth]=$'\U1F9A5'
+emoji[otter]=$'\U1F9A6'
+emoji[skunk]=$'\U1F9A8'
+emoji[kangaroo]=$'\U1F998'
+emoji[badger]=$'\U1F9A1'
+emoji[paw_prints]=$'\U1F43E'
+emoji[feet]=$'\U1F43E'
+emoji[turkey]=$'\U1F983'
+emoji[chicken]=$'\U1F414'
+emoji[rooster]=$'\U1F413'
+emoji[hatching_chick]=$'\U1F423'
+emoji[baby_chick]=$'\U1F424'
+emoji[front_facing_baby_chick]=$'\U1F425'
+emoji[hatched_chick]=$'\U1F425'
+emoji[bird]=$'\U1F426'
+emoji[penguin]=$'\U1F427'
+emoji[dove]=$'\U1F54A\UFE0F'
+emoji[dove_unqualified]=$'\U1F54A'
+emoji[eagle]=$'\U1F985'
+emoji[duck]=$'\U1F986'
+emoji[swan]=$'\U1F9A2'
+emoji[owl]=$'\U1F989'
+emoji[flamingo]=$'\U1F9A9'
+emoji[peacock]=$'\U1F99A'
+emoji[parrot]=$'\U1F99C'
+emoji[frog]=$'\U1F438'
+emoji[crocodile]=$'\U1F40A'
+emoji[turtle]=$'\U1F422'
+emoji[lizard]=$'\U1F98E'
+emoji[snake]=$'\U1F40D'
+emoji[dragon_face]=$'\U1F432'
+emoji[dragon_face_1]=$'\U1F409'
+emoji[dragon]=$'\U1F409'
+emoji[sauropod]=$'\U1F995'
+emoji[T_Rex]=$'\U1F996'
+emoji[t-rex]=$'\U1F996'
+emoji[spouting_whale]=$'\U1F433'
+emoji[whale]=$'\U1F433'
+emoji[spouting_whale_1]=$'\U1F40B'
+emoji[whale2]=$'\U1F40B'
+emoji[dolphin]=$'\U1F42C'
+emoji[flipper]=$'\U1F42C'
+emoji[fish]=$'\U1F41F'
+emoji[tropical_fish]=$'\U1F420'
+emoji[blowfish]=$'\U1F421'
+emoji[shark]=$'\U1F988'
+emoji[octopus]=$'\U1F419'
+emoji[spiral_shell]=$'\U1F41A'
+emoji[shell]=$'\U1F41A'
+emoji[snail]=$'\U1F40C'
+emoji[butterfly]=$'\U1F98B'
+emoji[bug]=$'\U1F41B'
+emoji[ant]=$'\U1F41C'
+emoji[honeybee]=$'\U1F41D'
+emoji[bee]=$'\U1F41D'
+emoji[lady_beetle]=$'\U1F41E'
+emoji[beetle]=$'\U1F41E'
+emoji[cricket]=$'\U1F997'
+emoji[spider]=$'\U1F577\UFE0F'
+emoji[spider_unqualified]=$'\U1F577'
+emoji[spider_web]=$'\U1F578\UFE0F'
+emoji[spider_web_unqualified]=$'\U1F578'
+emoji[scorpion]=$'\U1F982'
+emoji[mosquito]=$'\U1F99F'
+emoji[microbe]=$'\U1F9A0'
+emoji[bouquet]=$'\U1F490'
+emoji[cherry_blossom]=$'\U1F338'
+emoji[white_flower]=$'\U1F4AE'
+emoji[rosette]=$'\U1F3F5\UFE0F'
+emoji[rosette_unqualified]=$'\U1F3F5'
+emoji[rosette_unqualified_1]=$'\U1F339'
+emoji[rose]=$'\U1F339'
+emoji[wilted_flower]=$'\U1F940'
+emoji[hibiscus]=$'\U1F33A'
+emoji[sunflower]=$'\U1F33B'
+emoji[blossom]=$'\U1F33C'
+emoji[tulip]=$'\U1F337'
emoji[seedling]=$'\U1F331'
emoji[evergreen_tree]=$'\U1F332'
emoji[deciduous_tree]=$'\U1F333'
emoji[palm_tree]=$'\U1F334'
emoji[cactus]=$'\U1F335'
-emoji[hot_pepper]=$'\U1F336'
-emoji[tulip]=$'\U1F337'
-emoji[cherry_blossom]=$'\U1F338'
-emoji[rose]=$'\U1F339'
-emoji[hibiscus]=$'\U1F33A'
-emoji[sunflower]=$'\U1F33B'
-emoji[blossom]=$'\U1F33C'
-emoji[ear_of_maize]=$'\U1F33D'
+emoji[sheaf_of_rice]=$'\U1F33E'
emoji[ear_of_rice]=$'\U1F33E'
emoji[herb]=$'\U1F33F'
+emoji[shamrock]=$'\U2618\UFE0F'
+emoji[shamrock_unqualified]=$'\U2618'
emoji[four_leaf_clover]=$'\U1F340'
emoji[maple_leaf]=$'\U1F341'
emoji[fallen_leaf]=$'\U1F342'
emoji[leaf_fluttering_in_wind]=$'\U1F343'
-emoji[mushroom]=$'\U1F344'
-emoji[tomato]=$'\U1F345'
-emoji[aubergine]=$'\U1F346'
+emoji[leaves]=$'\U1F343'
emoji[grapes]=$'\U1F347'
emoji[melon]=$'\U1F348'
emoji[watermelon]=$'\U1F349'
emoji[tangerine]=$'\U1F34A'
+emoji[orange]=$'\U1F34A'
+emoji[mandarin]=$'\U1F34A'
emoji[lemon]=$'\U1F34B'
emoji[banana]=$'\U1F34C'
emoji[pineapple]=$'\U1F34D'
+emoji[mango]=$'\U1F96D'
emoji[red_apple]=$'\U1F34E'
+emoji[apple]=$'\U1F34E'
emoji[green_apple]=$'\U1F34F'
emoji[pear]=$'\U1F350'
emoji[peach]=$'\U1F351'
emoji[cherries]=$'\U1F352'
emoji[strawberry]=$'\U1F353'
-emoji[hamburger]=$'\U1F354'
-emoji[slice_of_pizza]=$'\U1F355'
+emoji[kiwi_fruit]=$'\U1F95D'
+emoji[tomato]=$'\U1F345'
+emoji[coconut]=$'\U1F965'
+emoji[avocado]=$'\U1F951'
+emoji[eggplant]=$'\U1F346'
+emoji[potato]=$'\U1F954'
+emoji[carrot]=$'\U1F955'
+emoji[ear_of_corn]=$'\U1F33D'
+emoji[corn]=$'\U1F33D'
+emoji[hot_pepper]=$'\U1F336\UFE0F'
+emoji[hot_pepper_unqualified]=$'\U1F336'
+emoji[cucumber]=$'\U1F952'
+emoji[leafy_green]=$'\U1F96C'
+emoji[broccoli]=$'\U1F966'
+emoji[garlic]=$'\U1F9C4'
+emoji[onion]=$'\U1F9C5'
+emoji[mushroom]=$'\U1F344'
+emoji[peanuts]=$'\U1F95C'
+emoji[chestnut]=$'\U1F330'
+emoji[bread]=$'\U1F35E'
+emoji[croissant]=$'\U1F950'
+emoji[baguette_bread]=$'\U1F956'
+emoji[pretzel]=$'\U1F968'
+emoji[bagel]=$'\U1F96F'
+emoji[pancakes]=$'\U1F95E'
+emoji[waffle]=$'\U1F9C7'
+emoji[cheese_wedge]=$'\U1F9C0'
+emoji[cheese]=$'\U1F9C0'
emoji[meat_on_bone]=$'\U1F356'
emoji[poultry_leg]=$'\U1F357'
+emoji[cut_of_meat]=$'\U1F969'
+emoji[bacon]=$'\U1F953'
+emoji[hamburger]=$'\U1F354'
+emoji[french_fries]=$'\U1F35F'
+emoji[fries]=$'\U1F35F'
+emoji[pizza]=$'\U1F355'
+emoji[hot_dog]=$'\U1F32D'
+emoji[hotdog]=$'\U1F32D'
+emoji[sandwich]=$'\U1F96A'
+emoji[taco]=$'\U1F32E'
+emoji[burrito]=$'\U1F32F'
+emoji[stuffed_flatbread]=$'\U1F959'
+emoji[falafel]=$'\U1F9C6'
+emoji[egg]=$'\U1F95A'
+emoji[cooking]=$'\U1F373'
+emoji[fried_egg]=$'\U1F373'
+emoji[shallow_pan_of_food]=$'\U1F958'
+emoji[pot_of_food]=$'\U1F372'
+emoji[stew]=$'\U1F372'
+emoji[bowl_with_spoon]=$'\U1F963'
+emoji[green_salad]=$'\U1F957'
+emoji[popcorn]=$'\U1F37F'
+emoji[butter]=$'\U1F9C8'
+emoji[salt]=$'\U1F9C2'
+emoji[canned_food]=$'\U1F96B'
+emoji[bento_box]=$'\U1F371'
+emoji[bento]=$'\U1F371'
emoji[rice_cracker]=$'\U1F358'
emoji[rice_ball]=$'\U1F359'
emoji[cooked_rice]=$'\U1F35A'
-emoji[curry_and_rice]=$'\U1F35B'
+emoji[rice]=$'\U1F35A'
+emoji[curry_rice]=$'\U1F35B'
+emoji[curry]=$'\U1F35B'
emoji[steaming_bowl]=$'\U1F35C'
+emoji[ramen]=$'\U1F35C'
emoji[spaghetti]=$'\U1F35D'
-emoji[bread]=$'\U1F35E'
-emoji[french_fries]=$'\U1F35F'
emoji[roasted_sweet_potato]=$'\U1F360'
-emoji[dango]=$'\U1F361'
+emoji[sweet_potato]=$'\U1F360'
emoji[oden]=$'\U1F362'
emoji[sushi]=$'\U1F363'
emoji[fried_shrimp]=$'\U1F364'
-emoji[fish_cake_with_swirl_design]=$'\U1F365'
+emoji[fish_cake_with_swirl]=$'\U1F365'
+emoji[fish_cake]=$'\U1F365'
+emoji[moon_cake]=$'\U1F96E'
+emoji[dango]=$'\U1F361'
+emoji[dumpling]=$'\U1F95F'
+emoji[fortune_cookie]=$'\U1F960'
+emoji[takeout_box]=$'\U1F961'
+emoji[crab]=$'\U1F980'
+emoji[lobster]=$'\U1F99E'
+emoji[shrimp]=$'\U1F990'
+emoji[squid]=$'\U1F991'
+emoji[oyster]=$'\U1F9AA'
emoji[soft_ice_cream]=$'\U1F366'
+emoji[icecream]=$'\U1F366'
emoji[shaved_ice]=$'\U1F367'
emoji[ice_cream]=$'\U1F368'
emoji[doughnut]=$'\U1F369'
emoji[cookie]=$'\U1F36A'
+emoji[birthday_cake]=$'\U1F382'
+emoji[birthday]=$'\U1F382'
+emoji[shortcake]=$'\U1F370'
+emoji[cake]=$'\U1F370'
+emoji[cupcake]=$'\U1F9C1'
+emoji[pie]=$'\U1F967'
emoji[chocolate_bar]=$'\U1F36B'
emoji[candy]=$'\U1F36C'
emoji[lollipop]=$'\U1F36D'
emoji[custard]=$'\U1F36E'
emoji[honey_pot]=$'\U1F36F'
-emoji[shortcake]=$'\U1F370'
-emoji[bento_box]=$'\U1F371'
-emoji[pot_of_food]=$'\U1F372'
-emoji[cooking]=$'\U1F373'
-emoji[fork_and_knife]=$'\U1F374'
+emoji[baby_bottle]=$'\U1F37C'
+emoji[glass_of_milk]=$'\U1F95B'
+emoji[milk_glass]=$'\U1F95B'
+emoji[hot_beverage]=$'\U2615'
+emoji[coffee]=$'\U2615'
emoji[teacup_without_handle]=$'\U1F375'
-emoji[sake_bottle_and_cup]=$'\U1F376'
+emoji[tea]=$'\U1F375'
+emoji[sake]=$'\U1F376'
+emoji[bottle_with_popping_cork]=$'\U1F37E'
+emoji[champagne]=$'\U1F37E'
emoji[wine_glass]=$'\U1F377'
emoji[cocktail_glass]=$'\U1F378'
+emoji[cocktail]=$'\U1F378'
emoji[tropical_drink]=$'\U1F379'
emoji[beer_mug]=$'\U1F37A'
+emoji[beer]=$'\U1F37A'
emoji[clinking_beer_mugs]=$'\U1F37B'
-emoji[baby_bottle]=$'\U1F37C'
-emoji[fork_and_knife_with_plate]=$'\U1F37D'
-emoji[bottle_with_popping_cork]=$'\U1F37E'
-emoji[popcorn]=$'\U1F37F'
-emoji[ribbon]=$'\U1F380'
-emoji[wrapped_present]=$'\U1F381'
-emoji[birthday_cake]=$'\U1F382'
-emoji[jack_o_lantern]=$'\U1F383'
-emoji[christmas_tree]=$'\U1F384'
-emoji[father_christmas]=$'\U1F385'
-emoji[fireworks]=$'\U1F386'
-emoji[firework_sparkler]=$'\U1F387'
-emoji[balloon]=$'\U1F388'
-emoji[party_popper]=$'\U1F389'
-emoji[confetti_ball]=$'\U1F38A'
-emoji[tanabata_tree]=$'\U1F38B'
-emoji[crossed_flags]=$'\U1F38C'
-emoji[pine_decoration]=$'\U1F38D'
-emoji[japanese_dolls]=$'\U1F38E'
-emoji[carp_streamer]=$'\U1F38F'
-emoji[wind_chime]=$'\U1F390'
-emoji[moon_viewing_ceremony]=$'\U1F391'
-emoji[school_satchel]=$'\U1F392'
-emoji[graduation_cap]=$'\U1F393'
-emoji[military_medal]=$'\U1F396'
-emoji[reminder_ribbon]=$'\U1F397'
-emoji[studio_microphone]=$'\U1F399'
-emoji[level_slider]=$'\U1F39A'
-emoji[control_knobs]=$'\U1F39B'
-emoji[film_frames]=$'\U1F39E'
-emoji[admission_tickets]=$'\U1F39F'
-emoji[carousel_horse]=$'\U1F3A0'
-emoji[ferris_wheel]=$'\U1F3A1'
-emoji[roller_coaster]=$'\U1F3A2'
-emoji[fishing_pole_and_fish]=$'\U1F3A3'
-emoji[microphone]=$'\U1F3A4'
-emoji[movie_camera]=$'\U1F3A5'
-emoji[cinema]=$'\U1F3A6'
-emoji[headphone]=$'\U1F3A7'
-emoji[artist_palette]=$'\U1F3A8'
-emoji[top_hat]=$'\U1F3A9'
-emoji[circus_tent]=$'\U1F3AA'
-emoji[ticket]=$'\U1F3AB'
-emoji[clapper_board]=$'\U1F3AC'
-emoji[performing_arts]=$'\U1F3AD'
-emoji[video_game]=$'\U1F3AE'
-emoji[direct_hit]=$'\U1F3AF'
-emoji[slot_machine]=$'\U1F3B0'
-emoji[billiards]=$'\U1F3B1'
-emoji[game_die]=$'\U1F3B2'
-emoji[bowling]=$'\U1F3B3'
-emoji[flower_playing_cards]=$'\U1F3B4'
-emoji[musical_note]=$'\U1F3B5'
-emoji[multiple_musical_notes]=$'\U1F3B6'
-emoji[saxophone]=$'\U1F3B7'
-emoji[guitar]=$'\U1F3B8'
-emoji[musical_keyboard]=$'\U1F3B9'
-emoji[trumpet]=$'\U1F3BA'
-emoji[violin]=$'\U1F3BB'
-emoji[musical_score]=$'\U1F3BC'
-emoji[running_shirt_with_sash]=$'\U1F3BD'
-emoji[tennis_racquet_and_ball]=$'\U1F3BE'
-emoji[ski_and_ski_boot]=$'\U1F3BF'
-emoji[basketball_and_hoop]=$'\U1F3C0'
-emoji[chequered_flag]=$'\U1F3C1'
-emoji[snowboarder]=$'\U1F3C2'
-emoji[runner]=$'\U1F3C3'
-emoji[surfer]=$'\U1F3C4'
-emoji[sports_medal]=$'\U1F3C5'
-emoji[trophy]=$'\U1F3C6'
-emoji[horse_racing]=$'\U1F3C7'
-emoji[american_football]=$'\U1F3C8'
-emoji[rugby_football]=$'\U1F3C9'
-emoji[swimmer]=$'\U1F3CA'
-emoji[weight_lifter]=$'\U1F3CB'
-emoji[golfer]=$'\U1F3CC'
-emoji[racing_motorcycle]=$'\U1F3CD'
-emoji[racing_car]=$'\U1F3CE'
-emoji[cricket_bat_and_ball]=$'\U1F3CF'
-emoji[volleyball]=$'\U1F3D0'
-emoji[field_hockey_stick_and_ball]=$'\U1F3D1'
-emoji[ice_hockey_stick_and_puck]=$'\U1F3D2'
-emoji[table_tennis_paddle_and_ball]=$'\U1F3D3'
-emoji[snow_capped_mountain]=$'\U1F3D4'
-emoji[camping]=$'\U1F3D5'
-emoji[beach_with_umbrella]=$'\U1F3D6'
-emoji[building_construction]=$'\U1F3D7'
-emoji[house_buildings]=$'\U1F3D8'
-emoji[cityscape]=$'\U1F3D9'
-emoji[derelict_house_building]=$'\U1F3DA'
-emoji[classical_building]=$'\U1F3DB'
-emoji[desert]=$'\U1F3DC'
-emoji[desert_island]=$'\U1F3DD'
-emoji[national_park]=$'\U1F3DE'
-emoji[stadium]=$'\U1F3DF'
-emoji[house_building]=$'\U1F3E0'
+emoji[beers]=$'\U1F37B'
+emoji[clinking_glasses]=$'\U1F942'
+emoji[tumbler_glass]=$'\U1F943'
+emoji[cup_with_straw]=$'\U1F964'
+emoji[beverage_box]=$'\U1F9C3'
+emoji[mate]=$'\U1F9C9'
+emoji[ice_cube]=$'\U1F9CA'
+emoji[chopsticks]=$'\U1F962'
+emoji[fork_and_knife_with_plate]=$'\U1F37D\UFE0F'
+emoji[fork_and_knife_with_plate_unqualified]=$'\U1F37D'
+emoji[plate_with_cutlery]=$'\U1F37D'
+emoji[fork_and_knife_with_plate_unqualified_1]=$'\U1F374'
+emoji[fork_and_knife]=$'\U1F374'
+emoji[spoon]=$'\U1F944'
+emoji[kitchen_knife]=$'\U1F52A'
+emoji[hocho]=$'\U1F52A'
+emoji[knife]=$'\U1F52A'
+emoji[amphora]=$'\U1F3FA'
+emoji[globe_showing_Europe_Africa]=$'\U1F30D'
+emoji[earth_africa]=$'\U1F30D'
+emoji[globe_showing_Americas]=$'\U1F30E'
+emoji[earth_americas]=$'\U1F30E'
+emoji[globe_showing_Asia_Australia]=$'\U1F30F'
+emoji[earth_asia]=$'\U1F30F'
+emoji[globe_with_meridians]=$'\U1F310'
+emoji[world_map]=$'\U1F5FA\UFE0F'
+emoji[world_map_unqualified]=$'\U1F5FA'
+emoji[map_of_Japan]=$'\U1F5FE'
+emoji[japan]=$'\U1F5FE'
+emoji[compass]=$'\U1F9ED'
+emoji[snow_capped_mountain]=$'\U1F3D4\UFE0F'
+emoji[snow_capped_mountain_unqualified]=$'\U1F3D4'
+emoji[mountain_snow]=$'\U1F3D4'
+emoji[snow_capped_mountain_unqualified_1]=$'\U26F0\UFE0F'
+emoji[snow_capped_mountain_unqualified_2]=$'\U26F0'
+emoji[mountain]=$'\U26F0'
+emoji[volcano]=$'\U1F30B'
+emoji[mount_fuji]=$'\U1F5FB'
+emoji[camping]=$'\U1F3D5\UFE0F'
+emoji[camping_unqualified]=$'\U1F3D5'
+emoji[beach_with_umbrella]=$'\U1F3D6\UFE0F'
+emoji[beach_with_umbrella_unqualified]=$'\U1F3D6'
+emoji[beach_umbrella]=$'\U1F3D6'
+emoji[desert]=$'\U1F3DC\UFE0F'
+emoji[desert_unqualified]=$'\U1F3DC'
+emoji[desert_island]=$'\U1F3DD\UFE0F'
+emoji[desert_island_unqualified]=$'\U1F3DD'
+emoji[national_park]=$'\U1F3DE\UFE0F'
+emoji[national_park_unqualified]=$'\U1F3DE'
+emoji[stadium]=$'\U1F3DF\UFE0F'
+emoji[stadium_unqualified]=$'\U1F3DF'
+emoji[classical_building]=$'\U1F3DB\UFE0F'
+emoji[classical_building_unqualified]=$'\U1F3DB'
+emoji[building_construction]=$'\U1F3D7\UFE0F'
+emoji[building_construction_unqualified]=$'\U1F3D7'
+emoji[brick]=$'\U1F9F1'
+emoji[bricks]=$'\U1F9F1'
+emoji[houses]=$'\U1F3D8\UFE0F'
+emoji[houses_unqualified]=$'\U1F3D8'
+emoji[derelict_house]=$'\U1F3DA\UFE0F'
+emoji[derelict_house_unqualified]=$'\U1F3DA'
+emoji[derelict_house_unqualified_1]=$'\U1F3E0'
+emoji[house]=$'\U1F3E0'
emoji[house_with_garden]=$'\U1F3E1'
emoji[office_building]=$'\U1F3E2'
-emoji[japanese_post_office]=$'\U1F3E3'
+emoji[office]=$'\U1F3E2'
+emoji[Japanese_post_office]=$'\U1F3E3'
+emoji[post_office]=$'\U1F3E3'
+emoji[Japanese_post_office_1]=$'\U1F3E4'
emoji[european_post_office]=$'\U1F3E4'
emoji[hospital]=$'\U1F3E5'
emoji[bank]=$'\U1F3E6'
-emoji[automated_teller_machine]=$'\U1F3E7'
emoji[hotel]=$'\U1F3E8'
emoji[love_hotel]=$'\U1F3E9'
emoji[convenience_store]=$'\U1F3EA'
emoji[school]=$'\U1F3EB'
emoji[department_store]=$'\U1F3EC'
emoji[factory]=$'\U1F3ED'
-emoji[izakaya_lantern]=$'\U1F3EE'
+emoji[Japanese_castle]=$'\U1F3EF'
emoji[japanese_castle]=$'\U1F3EF'
+emoji[Japanese_castle_1]=$'\U1F3F0'
emoji[european_castle]=$'\U1F3F0'
-emoji[waving_white_flag]=$'\U1F3F3'
-emoji[waving_black_flag]=$'\U1F3F4'
-emoji[rosette]=$'\U1F3F5'
-emoji[label]=$'\U1F3F7'
-emoji[badminton_racquet_and_shuttlecock]=$'\U1F3F8'
-emoji[bow_and_arrow]=$'\U1F3F9'
-emoji[amphora]=$'\U1F3FA'
-emoji[emoji_modifier_fitzpatrick_type_1_2]=$'\U1F3FB'
-emoji_mod[emoji_modifier_fitzpatrick_type_1_2]=$'\U1F3FB'
-emoji[emoji_modifier_fitzpatrick_type_3]=$'\U1F3FC'
-emoji_mod[emoji_modifier_fitzpatrick_type_3]=$'\U1F3FC'
-emoji[emoji_modifier_fitzpatrick_type_4]=$'\U1F3FD'
-emoji_mod[emoji_modifier_fitzpatrick_type_4]=$'\U1F3FD'
-emoji[emoji_modifier_fitzpatrick_type_5]=$'\U1F3FE'
-emoji_mod[emoji_modifier_fitzpatrick_type_5]=$'\U1F3FE'
-emoji[emoji_modifier_fitzpatrick_type_6]=$'\U1F3FF'
-emoji_mod[emoji_modifier_fitzpatrick_type_6]=$'\U1F3FF'
-emoji[rat]=$'\U1F400'
-emoji[mouse]=$'\U1F401'
-emoji[ox]=$'\U1F402'
-emoji[water_buffalo]=$'\U1F403'
-emoji[cow]=$'\U1F404'
-emoji[tiger]=$'\U1F405'
-emoji[leopard]=$'\U1F406'
-emoji[rabbit]=$'\U1F407'
-emoji[cat]=$'\U1F408'
-emoji[dragon]=$'\U1F409'
-emoji[crocodile]=$'\U1F40A'
-emoji[whale]=$'\U1F40B'
-emoji[snail]=$'\U1F40C'
-emoji[snake]=$'\U1F40D'
-emoji[horse]=$'\U1F40E'
-emoji[ram]=$'\U1F40F'
-emoji[goat]=$'\U1F410'
-emoji[sheep]=$'\U1F411'
-emoji[monkey]=$'\U1F412'
-emoji[rooster]=$'\U1F413'
-emoji[chicken]=$'\U1F414'
-emoji[dog]=$'\U1F415'
-emoji[pig]=$'\U1F416'
-emoji[boar]=$'\U1F417'
-emoji[elephant]=$'\U1F418'
-emoji[octopus]=$'\U1F419'
-emoji[spiral_shell]=$'\U1F41A'
-emoji[bug]=$'\U1F41B'
-emoji[ant]=$'\U1F41C'
-emoji[honeybee]=$'\U1F41D'
-emoji[lady_beetle]=$'\U1F41E'
-emoji[fish]=$'\U1F41F'
-emoji[tropical_fish]=$'\U1F420'
-emoji[blowfish]=$'\U1F421'
-emoji[turtle]=$'\U1F422'
-emoji[hatching_chick]=$'\U1F423'
-emoji[baby_chick]=$'\U1F424'
-emoji[front_facing_baby_chick]=$'\U1F425'
-emoji[bird]=$'\U1F426'
-emoji[penguin]=$'\U1F427'
-emoji[koala]=$'\U1F428'
-emoji[poodle]=$'\U1F429'
-emoji[dromedary_camel]=$'\U1F42A'
-emoji[bactrian_camel]=$'\U1F42B'
-emoji[dolphin]=$'\U1F42C'
-emoji[mouse_face]=$'\U1F42D'
-emoji[cow_face]=$'\U1F42E'
-emoji[tiger_face]=$'\U1F42F'
-emoji[rabbit_face]=$'\U1F430'
-emoji[cat_face]=$'\U1F431'
-emoji[dragon_face]=$'\U1F432'
-emoji[spouting_whale]=$'\U1F433'
-emoji[horse_face]=$'\U1F434'
-emoji[monkey_face]=$'\U1F435'
-emoji[dog_face]=$'\U1F436'
-emoji[pig_face]=$'\U1F437'
-emoji[frog_face]=$'\U1F438'
-emoji[hamster_face]=$'\U1F439'
-emoji[wolf_face]=$'\U1F43A'
-emoji[bear_face]=$'\U1F43B'
-emoji[panda_face]=$'\U1F43C'
-emoji[pig_nose]=$'\U1F43D'
-emoji[paw_prints]=$'\U1F43E'
-emoji[chipmunk]=$'\U1F43F'
-emoji[eyes]=$'\U1F440'
-emoji[eye]=$'\U1F441'
-emoji[ear]=$'\U1F442'
-emoji[nose]=$'\U1F443'
-emoji[mouth]=$'\U1F444'
-emoji[tongue]=$'\U1F445'
-emoji[white_up_pointing_backhand_index]=$'\U1F446'
-emoji[white_down_pointing_backhand_index]=$'\U1F447'
-emoji[white_left_pointing_backhand_index]=$'\U1F448'
-emoji[white_right_pointing_backhand_index]=$'\U1F449'
-emoji[fisted_hand_sign]=$'\U1F44A'
-emoji[waving_hand_sign]=$'\U1F44B'
-emoji[ok_hand_sign]=$'\U1F44C'
-emoji[thumbs_up_sign]=$'\U1F44D'
-emoji[thumbs_down_sign]=$'\U1F44E'
-emoji[clapping_hands_sign]=$'\U1F44F'
-emoji[open_hands_sign]=$'\U1F450'
-emoji[crown]=$'\U1F451'
-emoji[womans_hat]=$'\U1F452'
-emoji[eyeglasses]=$'\U1F453'
-emoji[necktie]=$'\U1F454'
-emoji[t_shirt]=$'\U1F455'
-emoji[jeans]=$'\U1F456'
-emoji[dress]=$'\U1F457'
-emoji[kimono]=$'\U1F458'
-emoji[bikini]=$'\U1F459'
-emoji[womans_clothes]=$'\U1F45A'
-emoji[purse]=$'\U1F45B'
-emoji[handbag]=$'\U1F45C'
-emoji[pouch]=$'\U1F45D'
-emoji[mans_shoe]=$'\U1F45E'
-emoji[athletic_shoe]=$'\U1F45F'
-emoji[high_heeled_shoe]=$'\U1F460'
-emoji[womans_sandal]=$'\U1F461'
-emoji[womans_boots]=$'\U1F462'
-emoji[footprints]=$'\U1F463'
-emoji[bust_in_silhouette]=$'\U1F464'
-emoji[busts_in_silhouette]=$'\U1F465'
-emoji[boy]=$'\U1F466'
-emoji[girl]=$'\U1F467'
-emoji[man]=$'\U1F468'
-emoji[woman]=$'\U1F469'
-emoji[family]=$'\U1F46A'
-emoji[man_and_woman_holding_hands]=$'\U1F46B'
-emoji[two_men_holding_hands]=$'\U1F46C'
-emoji[two_women_holding_hands]=$'\U1F46D'
-emoji[police_officer]=$'\U1F46E'
-emoji[woman_with_bunny_ears]=$'\U1F46F'
-emoji[bride_with_veil]=$'\U1F470'
-emoji[person_with_blond_hair]=$'\U1F471'
-emoji[man_with_gua_pi_mao]=$'\U1F472'
-emoji[man_with_turban]=$'\U1F473'
-emoji[older_man]=$'\U1F474'
-emoji[older_woman]=$'\U1F475'
-emoji[baby]=$'\U1F476'
-emoji[construction_worker]=$'\U1F477'
-emoji[princess]=$'\U1F478'
-emoji[japanese_ogre]=$'\U1F479'
-emoji[japanese_goblin]=$'\U1F47A'
-emoji[ghost]=$'\U1F47B'
-emoji[baby_angel]=$'\U1F47C'
-emoji[extraterrestrial_alien]=$'\U1F47D'
-emoji[alien_monster]=$'\U1F47E'
-emoji[imp]=$'\U1F47F'
-emoji[skull]=$'\U1F480'
-emoji[information_desk_person]=$'\U1F481'
-emoji[guardsman]=$'\U1F482'
-emoji[dancer]=$'\U1F483'
-emoji[lipstick]=$'\U1F484'
-emoji[nail_polish]=$'\U1F485'
-emoji[face_massage]=$'\U1F486'
-emoji[haircut]=$'\U1F487'
-emoji[barber_pole]=$'\U1F488'
-emoji[syringe]=$'\U1F489'
-emoji[pill]=$'\U1F48A'
-emoji[kiss_mark]=$'\U1F48B'
-emoji[love_letter]=$'\U1F48C'
-emoji[ring]=$'\U1F48D'
-emoji[gem_stone]=$'\U1F48E'
-emoji[kiss]=$'\U1F48F'
-emoji[bouquet]=$'\U1F490'
-emoji[couple_with_heart]=$'\U1F491'
emoji[wedding]=$'\U1F492'
-emoji[beating_heart]=$'\U1F493'
-emoji[broken_heart]=$'\U1F494'
-emoji[two_hearts]=$'\U1F495'
-emoji[sparkling_heart]=$'\U1F496'
-emoji[growing_heart]=$'\U1F497'
-emoji[heart_with_arrow]=$'\U1F498'
-emoji[blue_heart]=$'\U1F499'
-emoji[green_heart]=$'\U1F49A'
-emoji[yellow_heart]=$'\U1F49B'
-emoji[purple_heart]=$'\U1F49C'
-emoji[heart_with_ribbon]=$'\U1F49D'
-emoji[revolving_hearts]=$'\U1F49E'
-emoji[heart_decoration]=$'\U1F49F'
-emoji[diamond_shape_with_a_dot_inside]=$'\U1F4A0'
-emoji[electric_light_bulb]=$'\U1F4A1'
-emoji[anger_symbol]=$'\U1F4A2'
-emoji[bomb]=$'\U1F4A3'
-emoji[sleeping_symbol]=$'\U1F4A4'
-emoji[collision_symbol]=$'\U1F4A5'
-emoji[splashing_sweat_symbol]=$'\U1F4A6'
-emoji[droplet]=$'\U1F4A7'
-emoji[dash_symbol]=$'\U1F4A8'
-emoji[pile_of_poo]=$'\U1F4A9'
-emoji[flexed_biceps]=$'\U1F4AA'
-emoji[dizzy_symbol]=$'\U1F4AB'
-emoji[speech_balloon]=$'\U1F4AC'
-emoji[thought_balloon]=$'\U1F4AD'
-emoji[white_flower]=$'\U1F4AE'
-emoji[hundred_points_symbol]=$'\U1F4AF'
-emoji[money_bag]=$'\U1F4B0'
-emoji[currency_exchange]=$'\U1F4B1'
-emoji[heavy_dollar_sign]=$'\U1F4B2'
-emoji[credit_card]=$'\U1F4B3'
-emoji[banknote_with_yen_sign]=$'\U1F4B4'
-emoji[banknote_with_dollar_sign]=$'\U1F4B5'
-emoji[banknote_with_euro_sign]=$'\U1F4B6'
-emoji[banknote_with_pound_sign]=$'\U1F4B7'
-emoji[money_with_wings]=$'\U1F4B8'
-emoji[chart_with_upwards_trend_and_yen_sign]=$'\U1F4B9'
-emoji[seat]=$'\U1F4BA'
-emoji[personal_computer]=$'\U1F4BB'
-emoji[briefcase]=$'\U1F4BC'
-emoji[minidisc]=$'\U1F4BD'
-emoji[floppy_disk]=$'\U1F4BE'
-emoji[optical_disc]=$'\U1F4BF'
-emoji[dvd]=$'\U1F4C0'
-emoji[file_folder]=$'\U1F4C1'
-emoji[open_file_folder]=$'\U1F4C2'
-emoji[page_with_curl]=$'\U1F4C3'
-emoji[page_facing_up]=$'\U1F4C4'
-emoji[calendar]=$'\U1F4C5'
-emoji[tear_off_calendar]=$'\U1F4C6'
-emoji[card_index]=$'\U1F4C7'
-emoji[chart_with_upwards_trend]=$'\U1F4C8'
-emoji[chart_with_downwards_trend]=$'\U1F4C9'
-emoji[bar_chart]=$'\U1F4CA'
-emoji[clipboard]=$'\U1F4CB'
-emoji[pushpin]=$'\U1F4CC'
-emoji[round_pushpin]=$'\U1F4CD'
-emoji[paperclip]=$'\U1F4CE'
-emoji[straight_ruler]=$'\U1F4CF'
-emoji[triangular_ruler]=$'\U1F4D0'
-emoji[bookmark_tabs]=$'\U1F4D1'
-emoji[ledger]=$'\U1F4D2'
-emoji[notebook]=$'\U1F4D3'
-emoji[notebook_with_decorative_cover]=$'\U1F4D4'
-emoji[closed_book]=$'\U1F4D5'
-emoji[open_book]=$'\U1F4D6'
-emoji[green_book]=$'\U1F4D7'
-emoji[blue_book]=$'\U1F4D8'
-emoji[orange_book]=$'\U1F4D9'
-emoji[books]=$'\U1F4DA'
-emoji[name_badge]=$'\U1F4DB'
-emoji[scroll]=$'\U1F4DC'
-emoji[memo]=$'\U1F4DD'
-emoji[telephone_receiver]=$'\U1F4DE'
-emoji[pager]=$'\U1F4DF'
-emoji[fax_machine]=$'\U1F4E0'
-emoji[satellite_antenna]=$'\U1F4E1'
-emoji[public_address_loudspeaker]=$'\U1F4E2'
-emoji[cheering_megaphone]=$'\U1F4E3'
-emoji[outbox_tray]=$'\U1F4E4'
-emoji[inbox_tray]=$'\U1F4E5'
-emoji[package]=$'\U1F4E6'
-emoji[e_mail_symbol]=$'\U1F4E7'
-emoji[incoming_envelope]=$'\U1F4E8'
-emoji[envelope_with_downwards_arrow_above]=$'\U1F4E9'
-emoji[closed_mailbox_with_lowered_flag]=$'\U1F4EA'
-emoji[closed_mailbox_with_raised_flag]=$'\U1F4EB'
-emoji[open_mailbox_with_raised_flag]=$'\U1F4EC'
-emoji[open_mailbox_with_lowered_flag]=$'\U1F4ED'
-emoji[postbox]=$'\U1F4EE'
-emoji[postal_horn]=$'\U1F4EF'
-emoji[newspaper]=$'\U1F4F0'
-emoji[mobile_phone]=$'\U1F4F1'
-emoji[mobile_phone_with_rightwards_arrow_at_left]=$'\U1F4F2'
-emoji[vibration_mode]=$'\U1F4F3'
-emoji[mobile_phone_off]=$'\U1F4F4'
-emoji[no_mobile_phones]=$'\U1F4F5'
-emoji[antenna_with_bars]=$'\U1F4F6'
-emoji[camera]=$'\U1F4F7'
-emoji[camera_with_flash]=$'\U1F4F8'
-emoji[video_camera]=$'\U1F4F9'
-emoji[television]=$'\U1F4FA'
-emoji[radio]=$'\U1F4FB'
-emoji[videocassette]=$'\U1F4FC'
-emoji[film_projector]=$'\U1F4FD'
-emoji[prayer_beads]=$'\U1F4FF'
-emoji[twisted_rightwards_arrows]=$'\U1F500'
-emoji[clockwise_rightwards_and_leftwards_open_circle_arrows]=$'\U1F501'
-emoji[clockwise_rightwards_and_leftwards_open_circle_arrows_with_circled_one_overlay]=$'\U1F502'
-emoji[clockwise_downwards_and_upwards_open_circle_arrows]=$'\U1F503'
-emoji[anticlockwise_downwards_and_upwards_open_circle_arrows]=$'\U1F504'
-emoji[low_brightness_symbol]=$'\U1F505'
-emoji[high_brightness_symbol]=$'\U1F506'
-emoji[speaker_with_cancellation_stroke]=$'\U1F507'
-emoji[speaker]=$'\U1F508'
-emoji[speaker_with_one_sound_wave]=$'\U1F509'
-emoji[speaker_with_three_sound_waves]=$'\U1F50A'
-emoji[battery]=$'\U1F50B'
-emoji[electric_plug]=$'\U1F50C'
-emoji[left_pointing_magnifying_glass]=$'\U1F50D'
-emoji[right_pointing_magnifying_glass]=$'\U1F50E'
-emoji[lock_with_ink_pen]=$'\U1F50F'
-emoji[closed_lock_with_key]=$'\U1F510'
-emoji[key]=$'\U1F511'
-emoji[lock]=$'\U1F512'
-emoji[open_lock]=$'\U1F513'
-emoji[bell]=$'\U1F514'
-emoji[bell_with_cancellation_stroke]=$'\U1F515'
-emoji[bookmark]=$'\U1F516'
-emoji[link_symbol]=$'\U1F517'
-emoji[radio_button]=$'\U1F518'
-emoji[back_with_leftwards_arrow_above]=$'\U1F519'
-emoji[end_with_leftwards_arrow_above]=$'\U1F51A'
-emoji[on_with_exclamation_mark_with_left_right_arrow_above]=$'\U1F51B'
-emoji[soon_with_rightwards_arrow_above]=$'\U1F51C'
-emoji[top_with_upwards_arrow_above]=$'\U1F51D'
-emoji[no_one_under_eighteen_symbol]=$'\U1F51E'
-emoji[keycap_ten]=$'\U1F51F'
-emoji[input_symbol_for_latin_capital_letters]=$'\U1F520'
-emoji[input_symbol_for_latin_small_letters]=$'\U1F521'
-emoji[input_symbol_for_numbers]=$'\U1F522'
-emoji[input_symbol_for_symbols]=$'\U1F523'
-emoji[input_symbol_for_latin_letters]=$'\U1F524'
-emoji[fire]=$'\U1F525'
-emoji[electric_torch]=$'\U1F526'
-emoji[wrench]=$'\U1F527'
-emoji[hammer]=$'\U1F528'
-emoji[nut_and_bolt]=$'\U1F529'
-emoji[hocho]=$'\U1F52A'
-emoji[pistol]=$'\U1F52B'
-emoji[microscope]=$'\U1F52C'
-emoji[telescope]=$'\U1F52D'
-emoji[crystal_ball]=$'\U1F52E'
-emoji[six_pointed_star_with_middle_dot]=$'\U1F52F'
-emoji[japanese_symbol_for_beginner]=$'\U1F530'
-emoji[trident_emblem]=$'\U1F531'
-emoji[black_square_button]=$'\U1F532'
-emoji[white_square_button]=$'\U1F533'
-emoji[large_red_circle]=$'\U1F534'
-emoji[large_blue_circle]=$'\U1F535'
-emoji[large_orange_diamond]=$'\U1F536'
-emoji[large_blue_diamond]=$'\U1F537'
-emoji[small_orange_diamond]=$'\U1F538'
-emoji[small_blue_diamond]=$'\U1F539'
-emoji[up_pointing_red_triangle]=$'\U1F53A'
-emoji[down_pointing_red_triangle]=$'\U1F53B'
-emoji[up_pointing_small_red_triangle]=$'\U1F53C'
-emoji[down_pointing_small_red_triangle]=$'\U1F53D'
-emoji[om_symbol]=$'\U1F549'
-emoji[dove_of_peace]=$'\U1F54A'
-emoji[kaaba]=$'\U1F54B'
-emoji[mosque]=$'\U1F54C'
-emoji[synagogue]=$'\U1F54D'
-emoji[menorah_with_nine_branches]=$'\U1F54E'
-emoji[clock_face_one_oclock]=$'\U1F550'
-emoji[clock_face_two_oclock]=$'\U1F551'
-emoji[clock_face_three_oclock]=$'\U1F552'
-emoji[clock_face_four_oclock]=$'\U1F553'
-emoji[clock_face_five_oclock]=$'\U1F554'
-emoji[clock_face_six_oclock]=$'\U1F555'
-emoji[clock_face_seven_oclock]=$'\U1F556'
-emoji[clock_face_eight_oclock]=$'\U1F557'
-emoji[clock_face_nine_oclock]=$'\U1F558'
-emoji[clock_face_ten_oclock]=$'\U1F559'
-emoji[clock_face_eleven_oclock]=$'\U1F55A'
-emoji[clock_face_twelve_oclock]=$'\U1F55B'
-emoji[clock_face_one_thirty]=$'\U1F55C'
-emoji[clock_face_two_thirty]=$'\U1F55D'
-emoji[clock_face_three_thirty]=$'\U1F55E'
-emoji[clock_face_four_thirty]=$'\U1F55F'
-emoji[clock_face_five_thirty]=$'\U1F560'
-emoji[clock_face_six_thirty]=$'\U1F561'
-emoji[clock_face_seven_thirty]=$'\U1F562'
-emoji[clock_face_eight_thirty]=$'\U1F563'
-emoji[clock_face_nine_thirty]=$'\U1F564'
-emoji[clock_face_ten_thirty]=$'\U1F565'
-emoji[clock_face_eleven_thirty]=$'\U1F566'
-emoji[clock_face_twelve_thirty]=$'\U1F567'
-emoji[candle]=$'\U1F56F'
-emoji[mantelpiece_clock]=$'\U1F570'
-emoji[hole]=$'\U1F573'
-emoji[man_in_business_suit_levitating]=$'\U1F574'
-emoji[sleuth_or_spy]=$'\U1F575'
-emoji[dark_sunglasses]=$'\U1F576'
-emoji[spider]=$'\U1F577'
-emoji[spider_web]=$'\U1F578'
-emoji[joystick]=$'\U1F579'
-emoji[linked_paperclips]=$'\U1F587'
-emoji[lower_left_ballpoint_pen]=$'\U1F58A'
-emoji[lower_left_fountain_pen]=$'\U1F58B'
-emoji[lower_left_paintbrush]=$'\U1F58C'
-emoji[lower_left_crayon]=$'\U1F58D'
-emoji[raised_hand_with_fingers_splayed]=$'\U1F590'
-emoji[reversed_hand_with_middle_finger_extended]=$'\U1F595'
-emoji[raised_hand_with_part_between_middle_and_ring_fingers]=$'\U1F596'
-emoji[desktop_computer]=$'\U1F5A5'
-emoji[printer]=$'\U1F5A8'
-emoji[three_button_mouse]=$'\U1F5B1'
-emoji[trackball]=$'\U1F5B2'
-emoji[frame_with_picture]=$'\U1F5BC'
-emoji[card_index_dividers]=$'\U1F5C2'
-emoji[card_file_box]=$'\U1F5C3'
-emoji[file_cabinet]=$'\U1F5C4'
-emoji[wastebasket]=$'\U1F5D1'
-emoji[spiral_note_pad]=$'\U1F5D2'
-emoji[spiral_calendar_pad]=$'\U1F5D3'
-emoji[compression]=$'\U1F5DC'
-emoji[old_key]=$'\U1F5DD'
-emoji[rolled_up_newspaper]=$'\U1F5DE'
-emoji[dagger_knife]=$'\U1F5E1'
-emoji[speaking_head_in_silhouette]=$'\U1F5E3'
-emoji[right_anger_bubble]=$'\U1F5EF'
-emoji[ballot_box_with_ballot]=$'\U1F5F3'
-emoji[world_map]=$'\U1F5FA'
-emoji[mount_fuji]=$'\U1F5FB'
+emoji[Tokyo_tower]=$'\U1F5FC'
emoji[tokyo_tower]=$'\U1F5FC'
+emoji[Statue_of_Liberty]=$'\U1F5FD'
emoji[statue_of_liberty]=$'\U1F5FD'
-emoji[silhouette_of_japan]=$'\U1F5FE'
-emoji[moyai]=$'\U1F5FF'
-emoji[grinning_face]=$'\U1F600'
-emoji[grinning_face_with_smiling_eyes]=$'\U1F601'
-emoji[face_with_tears_of_joy]=$'\U1F602'
-emoji[smiling_face_with_open_mouth]=$'\U1F603'
-emoji[smiling_face_with_open_mouth_and_smiling_eyes]=$'\U1F604'
-emoji[smiling_face_with_open_mouth_and_cold_sweat]=$'\U1F605'
-emoji[smiling_face_with_open_mouth_and_tightly_closed_eyes]=$'\U1F606'
-emoji[smiling_face_with_halo]=$'\U1F607'
-emoji[smiling_face_with_horns]=$'\U1F608'
-emoji[winking_face]=$'\U1F609'
-emoji[smiling_face_with_smiling_eyes]=$'\U1F60A'
-emoji[face_savouring_delicious_food]=$'\U1F60B'
-emoji[relieved_face]=$'\U1F60C'
-emoji[smiling_face_with_heart_shaped_eyes]=$'\U1F60D'
-emoji[smiling_face_with_sunglasses]=$'\U1F60E'
-emoji[smirking_face]=$'\U1F60F'
-emoji[neutral_face]=$'\U1F610'
-emoji[expressionless_face]=$'\U1F611'
-emoji[unamused_face]=$'\U1F612'
-emoji[face_with_cold_sweat]=$'\U1F613'
-emoji[pensive_face]=$'\U1F614'
-emoji[confused_face]=$'\U1F615'
-emoji[confounded_face]=$'\U1F616'
-emoji[kissing_face]=$'\U1F617'
-emoji[face_throwing_a_kiss]=$'\U1F618'
-emoji[kissing_face_with_smiling_eyes]=$'\U1F619'
-emoji[kissing_face_with_closed_eyes]=$'\U1F61A'
-emoji[face_with_stuck_out_tongue]=$'\U1F61B'
-emoji[face_with_stuck_out_tongue_and_winking_eye]=$'\U1F61C'
-emoji[face_with_stuck_out_tongue_and_tightly_closed_eyes]=$'\U1F61D'
-emoji[disappointed_face]=$'\U1F61E'
-emoji[worried_face]=$'\U1F61F'
-emoji[angry_face]=$'\U1F620'
-emoji[pouting_face]=$'\U1F621'
-emoji[crying_face]=$'\U1F622'
-emoji[persevering_face]=$'\U1F623'
-emoji[face_with_look_of_triumph]=$'\U1F624'
-emoji[disappointed_but_relieved_face]=$'\U1F625'
-emoji[frowning_face_with_open_mouth]=$'\U1F626'
-emoji[anguished_face]=$'\U1F627'
-emoji[fearful_face]=$'\U1F628'
-emoji[weary_face]=$'\U1F629'
-emoji[sleepy_face]=$'\U1F62A'
-emoji[tired_face]=$'\U1F62B'
-emoji[grimacing_face]=$'\U1F62C'
-emoji[loudly_crying_face]=$'\U1F62D'
-emoji[face_with_open_mouth]=$'\U1F62E'
-emoji[hushed_face]=$'\U1F62F'
-emoji[face_with_open_mouth_and_cold_sweat]=$'\U1F630'
-emoji[face_screaming_in_fear]=$'\U1F631'
-emoji[astonished_face]=$'\U1F632'
-emoji[flushed_face]=$'\U1F633'
-emoji[sleeping_face]=$'\U1F634'
-emoji[dizzy_face]=$'\U1F635'
-emoji[face_without_mouth]=$'\U1F636'
-emoji[face_with_medical_mask]=$'\U1F637'
-emoji[grinning_cat_face_with_smiling_eyes]=$'\U1F638'
-emoji[cat_face_with_tears_of_joy]=$'\U1F639'
-emoji[smiling_cat_face_with_open_mouth]=$'\U1F63A'
-emoji[smiling_cat_face_with_heart_shaped_eyes]=$'\U1F63B'
-emoji[cat_face_with_wry_smile]=$'\U1F63C'
-emoji[kissing_cat_face_with_closed_eyes]=$'\U1F63D'
-emoji[pouting_cat_face]=$'\U1F63E'
-emoji[crying_cat_face]=$'\U1F63F'
-emoji[weary_cat_face]=$'\U1F640'
-emoji[slightly_frowning_face]=$'\U1F641'
-emoji[slightly_smiling_face]=$'\U1F642'
-emoji[upside_down_face]=$'\U1F643'
-emoji[face_with_rolling_eyes]=$'\U1F644'
-emoji[face_with_no_good_gesture]=$'\U1F645'
-emoji[face_with_ok_gesture]=$'\U1F646'
-emoji[person_bowing_deeply]=$'\U1F647'
-emoji[see_no_evil_monkey]=$'\U1F648'
-emoji[hear_no_evil_monkey]=$'\U1F649'
-emoji[speak_no_evil_monkey]=$'\U1F64A'
-emoji[happy_person_raising_one_hand]=$'\U1F64B'
-emoji[person_raising_both_hands_in_celebration]=$'\U1F64C'
-emoji[person_frowning]=$'\U1F64D'
-emoji[person_with_pouting_face]=$'\U1F64E'
-emoji[person_with_folded_hands]=$'\U1F64F'
-emoji[rocket]=$'\U1F680'
-emoji[helicopter]=$'\U1F681'
+emoji[church]=$'\U26EA'
+emoji[mosque]=$'\U1F54C'
+emoji[hindu_temple]=$'\U1F6D5'
+emoji[synagogue]=$'\U1F54D'
+emoji[shinto_shrine]=$'\U26E9\UFE0F'
+emoji[shinto_shrine_unqualified]=$'\U26E9'
+emoji[kaaba]=$'\U1F54B'
+emoji[fountain]=$'\U26F2'
+emoji[tent]=$'\U26FA'
+emoji[foggy]=$'\U1F301'
+emoji[night_with_stars]=$'\U1F303'
+emoji[cityscape]=$'\U1F3D9\UFE0F'
+emoji[cityscape_unqualified]=$'\U1F3D9'
+emoji[sunrise_over_mountains]=$'\U1F304'
+emoji[sunrise_over_mountains_1]=$'\U1F305'
+emoji[sunrise]=$'\U1F305'
+emoji[cityscape_at_dusk]=$'\U1F306'
+emoji[city_sunset]=$'\U1F306'
+emoji[sunset]=$'\U1F307'
+emoji[city_sunrise]=$'\U1F307'
+emoji[bridge_at_night]=$'\U1F309'
+emoji[hot_springs]=$'\U2668\UFE0F'
+emoji[hotsprings]=$'\U2668\UFE0F'
+emoji[hot_springs_unqualified]=$'\U2668'
+emoji[carousel_horse]=$'\U1F3A0'
+emoji[ferris_wheel]=$'\U1F3A1'
+emoji[roller_coaster]=$'\U1F3A2'
+emoji[barber_pole]=$'\U1F488'
+emoji[barber]=$'\U1F488'
+emoji[circus_tent]=$'\U1F3AA'
+emoji[locomotive]=$'\U1F682'
emoji[steam_locomotive]=$'\U1F682'
emoji[railway_car]=$'\U1F683'
emoji[high_speed_train]=$'\U1F684'
-emoji[high_speed_train_with_bullet_nose]=$'\U1F685'
-emoji[train]=$'\U1F686'
+emoji[bullettrain_side]=$'\U1F684'
+emoji[bullet_train]=$'\U1F685'
+emoji[bullettrain_front]=$'\U1F685'
+emoji[bullet_train_1]=$'\U1F686'
+emoji[train2]=$'\U1F686'
emoji[metro]=$'\U1F687'
emoji[light_rail]=$'\U1F688'
emoji[station]=$'\U1F689'
emoji[tram]=$'\U1F68A'
+emoji[monorail]=$'\U1F69D'
+emoji[mountain_railway]=$'\U1F69E'
emoji[tram_car]=$'\U1F68B'
+emoji[train]=$'\U1F68B'
emoji[bus]=$'\U1F68C'
emoji[oncoming_bus]=$'\U1F68D'
emoji[trolleybus]=$'\U1F68E'
-emoji[bus_stop]=$'\U1F68F'
emoji[minibus]=$'\U1F690'
emoji[ambulance]=$'\U1F691'
emoji[fire_engine]=$'\U1F692'
@@ -953,351 +3124,4151 @@ emoji[oncoming_police_car]=$'\U1F694'
emoji[taxi]=$'\U1F695'
emoji[oncoming_taxi]=$'\U1F696'
emoji[automobile]=$'\U1F697'
+emoji[car]=$'\U1F697'
+emoji[red_car]=$'\U1F697'
emoji[oncoming_automobile]=$'\U1F698'
-emoji[recreational_vehicle]=$'\U1F699'
+emoji[sport_utility_vehicle]=$'\U1F699'
+emoji[blue_car]=$'\U1F699'
emoji[delivery_truck]=$'\U1F69A'
+emoji[truck]=$'\U1F69A'
emoji[articulated_lorry]=$'\U1F69B'
emoji[tractor]=$'\U1F69C'
-emoji[monorail]=$'\U1F69D'
-emoji[mountain_railway]=$'\U1F69E'
+emoji[racing_car]=$'\U1F3CE\UFE0F'
+emoji[racing_car_unqualified]=$'\U1F3CE'
+emoji[motorcycle]=$'\U1F3CD\UFE0F'
+emoji[motorcycle_unqualified]=$'\U1F3CD'
+emoji[motor_scooter]=$'\U1F6F5'
+emoji[manual_wheelchair]=$'\U1F9BD'
+emoji[motorized_wheelchair]=$'\U1F9BC'
+emoji[auto_rickshaw]=$'\U1F6FA'
+emoji[bicycle]=$'\U1F6B2'
+emoji[bike]=$'\U1F6B2'
+emoji[kick_scooter]=$'\U1F6F4'
+emoji[skateboard]=$'\U1F6F9'
+emoji[bus_stop]=$'\U1F68F'
+emoji[busstop]=$'\U1F68F'
+emoji[motorway]=$'\U1F6E3\UFE0F'
+emoji[motorway_unqualified]=$'\U1F6E3'
+emoji[railway_track]=$'\U1F6E4\UFE0F'
+emoji[railway_track_unqualified]=$'\U1F6E4'
+emoji[oil_drum]=$'\U1F6E2\UFE0F'
+emoji[oil_drum_unqualified]=$'\U1F6E2'
+emoji[fuel_pump]=$'\U26FD'
+emoji[fuelpump]=$'\U26FD'
+emoji[police_car_light]=$'\U1F6A8'
+emoji[rotating_light]=$'\U1F6A8'
+emoji[horizontal_traffic_light]=$'\U1F6A5'
+emoji[traffic_light]=$'\U1F6A5'
+emoji[vertical_traffic_light]=$'\U1F6A6'
+emoji[stop_sign]=$'\U1F6D1'
+emoji[construction]=$'\U1F6A7'
+emoji[anchor]=$'\U2693'
+emoji[sailboat]=$'\U26F5'
+emoji[boat]=$'\U26F5'
+emoji[canoe]=$'\U1F6F6'
+emoji[speedboat]=$'\U1F6A4'
+emoji[passenger_ship]=$'\U1F6F3\UFE0F'
+emoji[passenger_ship_unqualified]=$'\U1F6F3'
+emoji[ferry]=$'\U26F4\UFE0F'
+emoji[ferry_unqualified]=$'\U26F4'
+emoji[motor_boat]=$'\U1F6E5\UFE0F'
+emoji[motor_boat_unqualified]=$'\U1F6E5'
+emoji[ship]=$'\U1F6A2'
+emoji[airplane]=$'\U2708\UFE0F'
+emoji[airplane_unqualified]=$'\U2708'
+emoji[small_airplane]=$'\U1F6E9\UFE0F'
+emoji[small_airplane_unqualified]=$'\U1F6E9'
+emoji[airplane_departure]=$'\U1F6EB'
+emoji[flight_departure]=$'\U1F6EB'
+emoji[airplane_arrival]=$'\U1F6EC'
+emoji[flight_arrival]=$'\U1F6EC'
+emoji[parachute]=$'\U1FA82'
+emoji[seat]=$'\U1F4BA'
+emoji[helicopter]=$'\U1F681'
emoji[suspension_railway]=$'\U1F69F'
emoji[mountain_cableway]=$'\U1F6A0'
emoji[aerial_tramway]=$'\U1F6A1'
-emoji[ship]=$'\U1F6A2'
-emoji[rowboat]=$'\U1F6A3'
-emoji[speedboat]=$'\U1F6A4'
-emoji[horizontal_traffic_light]=$'\U1F6A5'
-emoji[vertical_traffic_light]=$'\U1F6A6'
-emoji[construction_sign]=$'\U1F6A7'
-emoji[police_cars_revolving_light]=$'\U1F6A8'
-emoji[triangular_flag_on_post]=$'\U1F6A9'
+emoji[satellite]=$'\U1F6F0\UFE0F'
+emoji[satellite_unqualified]=$'\U1F6F0'
+emoji[artificial_satellite]=$'\U1F6F0'
+emoji[rocket]=$'\U1F680'
+emoji[flying_saucer]=$'\U1F6F8'
+emoji[bellhop_bell]=$'\U1F6CE\UFE0F'
+emoji[bellhop_bell_unqualified]=$'\U1F6CE'
+emoji[luggage]=$'\U1F9F3'
+emoji[hourglass_done]=$'\U231B'
+emoji[hourglass]=$'\U231B'
+emoji[hourglass_not_done]=$'\U23F3'
+emoji[hourglass_flowing_sand]=$'\U23F3'
+emoji[watch]=$'\U231A'
+emoji[alarm_clock]=$'\U23F0'
+emoji[stopwatch]=$'\U23F1\UFE0F'
+emoji[stopwatch_unqualified]=$'\U23F1'
+emoji[timer_clock]=$'\U23F2\UFE0F'
+emoji[timer_clock_unqualified]=$'\U23F2'
+emoji[mantelpiece_clock]=$'\U1F570\UFE0F'
+emoji[mantelpiece_clock_unqualified]=$'\U1F570'
+emoji[twelve_o_clock]=$'\U1F55B'
+emoji[clock12]=$'\U1F55B'
+emoji[twelve_thirty]=$'\U1F567'
+emoji[clock1230]=$'\U1F567'
+emoji[one_o_clock]=$'\U1F550'
+emoji[clock1]=$'\U1F550'
+emoji[one_thirty]=$'\U1F55C'
+emoji[clock130]=$'\U1F55C'
+emoji[two_o_clock]=$'\U1F551'
+emoji[clock2]=$'\U1F551'
+emoji[two_thirty]=$'\U1F55D'
+emoji[clock230]=$'\U1F55D'
+emoji[three_o_clock]=$'\U1F552'
+emoji[clock3]=$'\U1F552'
+emoji[three_thirty]=$'\U1F55E'
+emoji[clock330]=$'\U1F55E'
+emoji[four_o_clock]=$'\U1F553'
+emoji[clock4]=$'\U1F553'
+emoji[four_thirty]=$'\U1F55F'
+emoji[clock430]=$'\U1F55F'
+emoji[five_o_clock]=$'\U1F554'
+emoji[clock5]=$'\U1F554'
+emoji[five_thirty]=$'\U1F560'
+emoji[clock530]=$'\U1F560'
+emoji[six_o_clock]=$'\U1F555'
+emoji[clock6]=$'\U1F555'
+emoji[six_thirty]=$'\U1F561'
+emoji[clock630]=$'\U1F561'
+emoji[seven_o_clock]=$'\U1F556'
+emoji[clock7]=$'\U1F556'
+emoji[seven_thirty]=$'\U1F562'
+emoji[clock730]=$'\U1F562'
+emoji[eight_o_clock]=$'\U1F557'
+emoji[clock8]=$'\U1F557'
+emoji[eight_thirty]=$'\U1F563'
+emoji[clock830]=$'\U1F563'
+emoji[nine_o_clock]=$'\U1F558'
+emoji[clock9]=$'\U1F558'
+emoji[nine_thirty]=$'\U1F564'
+emoji[clock930]=$'\U1F564'
+emoji[ten_o_clock]=$'\U1F559'
+emoji[clock10]=$'\U1F559'
+emoji[ten_thirty]=$'\U1F565'
+emoji[clock1030]=$'\U1F565'
+emoji[eleven_o_clock]=$'\U1F55A'
+emoji[clock11]=$'\U1F55A'
+emoji[eleven_thirty]=$'\U1F566'
+emoji[clock1130]=$'\U1F566'
+emoji[new_moon]=$'\U1F311'
+emoji[waxing_crescent_moon]=$'\U1F312'
+emoji[first_quarter_moon]=$'\U1F313'
+emoji[waxing_gibbous_moon]=$'\U1F314'
+emoji[moon]=$'\U1F314'
+emoji[full_moon]=$'\U1F315'
+emoji[waning_gibbous_moon]=$'\U1F316'
+emoji[last_quarter_moon]=$'\U1F317'
+emoji[waning_crescent_moon]=$'\U1F318'
+emoji[waning_crescent_moon_1]=$'\U1F319'
+emoji[crescent_moon]=$'\U1F319'
+emoji[new_moon_face]=$'\U1F31A'
+emoji[new_moon_with_face]=$'\U1F31A'
+emoji[first_quarter_moon_face]=$'\U1F31B'
+emoji[first_quarter_moon_with_face]=$'\U1F31B'
+emoji[last_quarter_moon_face]=$'\U1F31C'
+emoji[last_quarter_moon_with_face]=$'\U1F31C'
+emoji[thermometer]=$'\U1F321\UFE0F'
+emoji[thermometer_unqualified]=$'\U1F321'
+emoji[sun]=$'\U2600\UFE0F'
+emoji[sunny]=$'\U2600\UFE0F'
+emoji[sun_unqualified]=$'\U2600'
+emoji[full_moon_face]=$'\U1F31D'
+emoji[full_moon_with_face]=$'\U1F31D'
+emoji[sun_with_face]=$'\U1F31E'
+emoji[ringed_planet]=$'\U1FA90'
+emoji[star]=$'\U2B50'
+emoji[glowing_star]=$'\U1F31F'
+emoji[star2]=$'\U1F31F'
+emoji[shooting_star]=$'\U1F320'
+emoji[stars]=$'\U1F320'
+emoji[milky_way]=$'\U1F30C'
+emoji[cloud]=$'\U2601\UFE0F'
+emoji[cloud_unqualified]=$'\U2601'
+emoji[sun_behind_cloud]=$'\U26C5'
+emoji[partly_sunny]=$'\U26C5'
+emoji[cloud_with_lightning_and_rain]=$'\U26C8\UFE0F'
+emoji[cloud_with_lightning_and_rain_unqualified]=$'\U26C8'
+emoji[sun_behind_small_cloud]=$'\U1F324\UFE0F'
+emoji[sun_behind_small_cloud_unqualified]=$'\U1F324'
+emoji[sun_behind_large_cloud]=$'\U1F325\UFE0F'
+emoji[sun_behind_large_cloud_unqualified]=$'\U1F325'
+emoji[sun_behind_rain_cloud]=$'\U1F326\UFE0F'
+emoji[sun_behind_rain_cloud_unqualified]=$'\U1F326'
+emoji[cloud_with_rain]=$'\U1F327\UFE0F'
+emoji[cloud_with_rain_unqualified]=$'\U1F327'
+emoji[cloud_with_snow]=$'\U1F328\UFE0F'
+emoji[cloud_with_snow_unqualified]=$'\U1F328'
+emoji[cloud_with_lightning]=$'\U1F329\UFE0F'
+emoji[cloud_with_lightning_unqualified]=$'\U1F329'
+emoji[tornado]=$'\U1F32A\UFE0F'
+emoji[tornado_unqualified]=$'\U1F32A'
+emoji[fog]=$'\U1F32B\UFE0F'
+emoji[fog_unqualified]=$'\U1F32B'
+emoji[wind_face]=$'\U1F32C\UFE0F'
+emoji[wind_face_unqualified]=$'\U1F32C'
+emoji[cyclone]=$'\U1F300'
+emoji[rainbow]=$'\U1F308'
+emoji[closed_umbrella]=$'\U1F302'
+emoji[closed_umbrella_1]=$'\U2602\UFE0F'
+emoji[open_umbrella]=$'\U2602\UFE0F'
+emoji[umbrella_unqualified]=$'\U2602'
+emoji[umbrella_with_rain_drops]=$'\U2614'
+emoji[umbrella]=$'\U2614'
+emoji[umbrella_on_ground]=$'\U26F1\UFE0F'
+emoji[umbrella_on_ground_unqualified]=$'\U26F1'
+emoji[parasol_on_ground]=$'\U26F1'
+emoji[high_voltage]=$'\U26A1'
+emoji[zap]=$'\U26A1'
+emoji[snowflake]=$'\U2744\UFE0F'
+emoji[snowflake_unqualified]=$'\U2744'
+emoji[snowman]=$'\U2603\UFE0F'
+emoji[snowman_with_snow]=$'\U2603\UFE0F'
+emoji[snowman_unqualified]=$'\U2603'
+emoji[snowman_without_snow]=$'\U26C4'
+emoji[comet]=$'\U2604\UFE0F'
+emoji[comet_unqualified]=$'\U2604'
+emoji[fire]=$'\U1F525'
+emoji[droplet]=$'\U1F4A7'
+emoji[water_wave]=$'\U1F30A'
+emoji[ocean]=$'\U1F30A'
+emoji[jack_o_lantern]=$'\U1F383'
+emoji[Christmas_tree]=$'\U1F384'
+emoji[christmas_tree]=$'\U1F384'
+emoji[fireworks]=$'\U1F386'
+emoji[sparkler]=$'\U1F387'
+emoji[firecracker]=$'\U1F9E8'
+emoji[sparkles]=$'\U2728'
+emoji[balloon]=$'\U1F388'
+emoji[party_popper]=$'\U1F389'
+emoji[tada]=$'\U1F389'
+emoji[confetti_ball]=$'\U1F38A'
+emoji[tanabata_tree]=$'\U1F38B'
+emoji[pine_decoration]=$'\U1F38D'
+emoji[bamboo]=$'\U1F38D'
+emoji[Japanese_dolls]=$'\U1F38E'
+emoji[dolls]=$'\U1F38E'
+emoji[carp_streamer]=$'\U1F38F'
+emoji[flags]=$'\U1F38F'
+emoji[wind_chime]=$'\U1F390'
+emoji[moon_viewing_ceremony]=$'\U1F391'
+emoji[rice_scene]=$'\U1F391'
+emoji[red_envelope]=$'\U1F9E7'
+emoji[ribbon]=$'\U1F380'
+emoji[wrapped_gift]=$'\U1F381'
+emoji[gift]=$'\U1F381'
+emoji[reminder_ribbon]=$'\U1F397\UFE0F'
+emoji[reminder_ribbon_unqualified]=$'\U1F397'
+emoji[admission_tickets]=$'\U1F39F\UFE0F'
+emoji[admission_tickets_unqualified]=$'\U1F39F'
+emoji[tickets]=$'\U1F39F'
+emoji[admission_tickets_unqualified_1]=$'\U1F3AB'
+emoji[ticket]=$'\U1F3AB'
+emoji[military_medal]=$'\U1F396\UFE0F'
+emoji[military_medal_unqualified]=$'\U1F396'
+emoji[medal_military]=$'\U1F396'
+emoji[trophy]=$'\U1F3C6'
+emoji[sports_medal]=$'\U1F3C5'
+emoji[medal_sports]=$'\U1F3C5'
+emoji[1st_place_medal]=$'\U1F947'
+emoji[2nd_place_medal]=$'\U1F948'
+emoji[3rd_place_medal]=$'\U1F949'
+emoji[soccer_ball]=$'\U26BD'
+emoji[soccer]=$'\U26BD'
+emoji[baseball]=$'\U26BE'
+emoji[softball]=$'\U1F94E'
+emoji[basketball]=$'\U1F3C0'
+emoji[volleyball]=$'\U1F3D0'
+emoji[american_football]=$'\U1F3C8'
+emoji[football]=$'\U1F3C8'
+emoji[rugby_football]=$'\U1F3C9'
+emoji[tennis]=$'\U1F3BE'
+emoji[flying_disc]=$'\U1F94F'
+emoji[bowling]=$'\U1F3B3'
+emoji[cricket_game]=$'\U1F3CF'
+emoji[field_hockey]=$'\U1F3D1'
+emoji[ice_hockey]=$'\U1F3D2'
+emoji[lacrosse]=$'\U1F94D'
+emoji[ping_pong]=$'\U1F3D3'
+emoji[badminton]=$'\U1F3F8'
+emoji[boxing_glove]=$'\U1F94A'
+emoji[martial_arts_uniform]=$'\U1F94B'
+emoji[goal_net]=$'\U1F945'
+emoji[flag_in_hole]=$'\U26F3'
+emoji[golf]=$'\U26F3'
+emoji[ice_skate]=$'\U26F8\UFE0F'
+emoji[ice_skate_unqualified]=$'\U26F8'
+emoji[fishing_pole]=$'\U1F3A3'
+emoji[fishing_pole_and_fish]=$'\U1F3A3'
+emoji[diving_mask]=$'\U1F93F'
+emoji[running_shirt]=$'\U1F3BD'
+emoji[running_shirt_with_sash]=$'\U1F3BD'
+emoji[skis]=$'\U1F3BF'
+emoji[ski]=$'\U1F3BF'
+emoji[sled]=$'\U1F6F7'
+emoji[curling_stone]=$'\U1F94C'
+emoji[direct_hit]=$'\U1F3AF'
+emoji[dart]=$'\U1F3AF'
+emoji[yo_yo]=$'\U1FA80'
+emoji[kite]=$'\U1FA81'
+emoji[pool_8_ball]=$'\U1F3B1'
+emoji[8ball]=$'\U1F3B1'
+emoji[crystal_ball]=$'\U1F52E'
+emoji[nazar_amulet]=$'\U1F9FF'
+emoji[video_game]=$'\U1F3AE'
+emoji[joystick]=$'\U1F579\UFE0F'
+emoji[joystick_unqualified]=$'\U1F579'
+emoji[slot_machine]=$'\U1F3B0'
+emoji[game_die]=$'\U1F3B2'
+emoji[puzzle_piece]=$'\U1F9E9'
+emoji[jigsaw]=$'\U1F9E9'
+emoji[teddy_bear]=$'\U1F9F8'
+emoji[spade_suit]=$'\U2660\UFE0F'
+emoji[spades]=$'\U2660\UFE0F'
+emoji[spade_suit_unqualified]=$'\U2660'
+emoji[heart_suit]=$'\U2665\UFE0F'
+emoji[hearts]=$'\U2665\UFE0F'
+emoji[heart_suit_unqualified]=$'\U2665'
+emoji[diamond_suit]=$'\U2666\UFE0F'
+emoji[diamonds]=$'\U2666\UFE0F'
+emoji[diamond_suit_unqualified]=$'\U2666'
+emoji[club_suit]=$'\U2663\UFE0F'
+emoji[clubs]=$'\U2663\UFE0F'
+emoji[club_suit_unqualified]=$'\U2663'
+emoji[chess_pawn]=$'\U265F\UFE0F'
+emoji[chess_pawn_unqualified]=$'\U265F'
+emoji[joker]=$'\U1F0CF'
+emoji[black_joker]=$'\U1F0CF'
+emoji[mahjong_red_dragon]=$'\U1F004'
+emoji[mahjong]=$'\U1F004'
+emoji[flower_playing_cards]=$'\U1F3B4'
+emoji[performing_arts]=$'\U1F3AD'
+emoji[framed_picture]=$'\U1F5BC\UFE0F'
+emoji[framed_picture_unqualified]=$'\U1F5BC'
+emoji[artist_palette]=$'\U1F3A8'
+emoji[art]=$'\U1F3A8'
+emoji[thread]=$'\U1F9F5'
+emoji[yarn]=$'\U1F9F6'
+emoji[glasses]=$'\U1F453'
+emoji[eyeglasses]=$'\U1F453'
+emoji[sunglasses]=$'\U1F576\UFE0F'
+emoji[sunglasses_unqualified]=$'\U1F576'
+emoji[dark_sunglasses]=$'\U1F576'
+emoji[goggles]=$'\U1F97D'
+emoji[lab_coat]=$'\U1F97C'
+emoji[safety_vest]=$'\U1F9BA'
+emoji[necktie]=$'\U1F454'
+emoji[t_shirt]=$'\U1F455'
+emoji[shirt]=$'\U1F455'
+emoji[tshirt]=$'\U1F455'
+emoji[jeans]=$'\U1F456'
+emoji[scarf]=$'\U1F9E3'
+emoji[gloves]=$'\U1F9E4'
+emoji[coat]=$'\U1F9E5'
+emoji[socks]=$'\U1F9E6'
+emoji[dress]=$'\U1F457'
+emoji[kimono]=$'\U1F458'
+emoji[sari]=$'\U1F97B'
+emoji[one_piece_swimsuit]=$'\U1FA71'
+emoji[swim_brief]=$'\U1FA72'
+emoji[shorts]=$'\U1FA73'
+emoji[bikini]=$'\U1F459'
+emoji[woman_s_clothes]=$'\U1F45A'
+emoji[womans_clothes]=$'\U1F45A'
+emoji[purse]=$'\U1F45B'
+emoji[handbag]=$'\U1F45C'
+emoji[clutch_bag]=$'\U1F45D'
+emoji[pouch]=$'\U1F45D'
+emoji[shopping_bags]=$'\U1F6CD\UFE0F'
+emoji[shopping_bags_unqualified]=$'\U1F6CD'
+emoji[shopping]=$'\U1F6CD'
+emoji[backpack]=$'\U1F392'
+emoji[school_satchel]=$'\U1F392'
+emoji[man_s_shoe]=$'\U1F45E'
+emoji[mans_shoe]=$'\U1F45E'
+emoji[shoe]=$'\U1F45E'
+emoji[running_shoe]=$'\U1F45F'
+emoji[athletic_shoe]=$'\U1F45F'
+emoji[hiking_boot]=$'\U1F97E'
+emoji[flat_shoe]=$'\U1F97F'
+emoji[high_heeled_shoe]=$'\U1F460'
+emoji[high_heel]=$'\U1F460'
+emoji[woman_s_sandal]=$'\U1F461'
+emoji[sandal]=$'\U1F461'
+emoji[ballet_shoes]=$'\U1FA70'
+emoji[woman_s_boot]=$'\U1F462'
+emoji[boot]=$'\U1F462'
+emoji[crown]=$'\U1F451'
+emoji[woman_s_hat]=$'\U1F452'
+emoji[womans_hat]=$'\U1F452'
+emoji[top_hat]=$'\U1F3A9'
+emoji[tophat]=$'\U1F3A9'
+emoji[graduation_cap]=$'\U1F393'
+emoji[mortar_board]=$'\U1F393'
+emoji[billed_cap]=$'\U1F9E2'
+emoji[rescue_worker_s_helmet]=$'\U26D1\UFE0F'
+emoji[rescue_worker_s_helmet_unqualified]=$'\U26D1'
+emoji[rescue_worker_helmet]=$'\U26D1'
+emoji[prayer_beads]=$'\U1F4FF'
+emoji[lipstick]=$'\U1F484'
+emoji[ring]=$'\U1F48D'
+emoji[gem_stone]=$'\U1F48E'
+emoji[gem]=$'\U1F48E'
+emoji[muted_speaker]=$'\U1F507'
+emoji[mute]=$'\U1F507'
+emoji[speaker_low_volume]=$'\U1F508'
+emoji[speaker]=$'\U1F508'
+emoji[speaker_medium_volume]=$'\U1F509'
+emoji[sound]=$'\U1F509'
+emoji[speaker_high_volume]=$'\U1F50A'
+emoji[loud_sound]=$'\U1F50A'
+emoji[loudspeaker]=$'\U1F4E2'
+emoji[megaphone]=$'\U1F4E3'
+emoji[mega]=$'\U1F4E3'
+emoji[postal_horn]=$'\U1F4EF'
+emoji[bell]=$'\U1F514'
+emoji[bell_with_slash]=$'\U1F515'
+emoji[no_bell]=$'\U1F515'
+emoji[musical_score]=$'\U1F3BC'
+emoji[musical_note]=$'\U1F3B5'
+emoji[musical_notes]=$'\U1F3B6'
+emoji[notes]=$'\U1F3B6'
+emoji[studio_microphone]=$'\U1F399\UFE0F'
+emoji[studio_microphone_unqualified]=$'\U1F399'
+emoji[level_slider]=$'\U1F39A\UFE0F'
+emoji[level_slider_unqualified]=$'\U1F39A'
+emoji[control_knobs]=$'\U1F39B\UFE0F'
+emoji[control_knobs_unqualified]=$'\U1F39B'
+emoji[microphone]=$'\U1F3A4'
+emoji[headphone]=$'\U1F3A7'
+emoji[headphones]=$'\U1F3A7'
+emoji[radio]=$'\U1F4FB'
+emoji[saxophone]=$'\U1F3B7'
+emoji[guitar]=$'\U1F3B8'
+emoji[musical_keyboard]=$'\U1F3B9'
+emoji[trumpet]=$'\U1F3BA'
+emoji[violin]=$'\U1F3BB'
+emoji[banjo]=$'\U1FA95'
+emoji[drum]=$'\U1F941'
+emoji[mobile_phone]=$'\U1F4F1'
+emoji[iphone]=$'\U1F4F1'
+emoji[mobile_phone_with_arrow]=$'\U1F4F2'
+emoji[calling]=$'\U1F4F2'
+emoji[telephone]=$'\U260E\UFE0F'
+emoji[phone]=$'\U260E\UFE0F'
+emoji[telephone_unqualified]=$'\U260E'
+emoji[telephone_receiver]=$'\U1F4DE'
+emoji[pager]=$'\U1F4DF'
+emoji[fax_machine]=$'\U1F4E0'
+emoji[fax]=$'\U1F4E0'
+emoji[battery]=$'\U1F50B'
+emoji[electric_plug]=$'\U1F50C'
+emoji[laptop_computer]=$'\U1F4BB'
+emoji[computer]=$'\U1F4BB'
+emoji[desktop_computer]=$'\U1F5A5\UFE0F'
+emoji[desktop_computer_unqualified]=$'\U1F5A5'
+emoji[printer]=$'\U1F5A8\UFE0F'
+emoji[printer_unqualified]=$'\U1F5A8'
+emoji[keyboard]=$'\U2328\UFE0F'
+emoji[keyboard_unqualified]=$'\U2328'
+emoji[computer_mouse]=$'\U1F5B1\UFE0F'
+emoji[computer_mouse_unqualified]=$'\U1F5B1'
+emoji[trackball]=$'\U1F5B2\UFE0F'
+emoji[trackball_unqualified]=$'\U1F5B2'
+emoji[computer_disk]=$'\U1F4BD'
+emoji[minidisc]=$'\U1F4BD'
+emoji[floppy_disk]=$'\U1F4BE'
+emoji[optical_disk]=$'\U1F4BF'
+emoji[cd]=$'\U1F4BF'
+emoji[dvd]=$'\U1F4C0'
+emoji[abacus]=$'\U1F9EE'
+emoji[movie_camera]=$'\U1F3A5'
+emoji[film_frames]=$'\U1F39E\UFE0F'
+emoji[film_frames_unqualified]=$'\U1F39E'
+emoji[film_strip]=$'\U1F39E'
+emoji[film_projector]=$'\U1F4FD\UFE0F'
+emoji[film_projector_unqualified]=$'\U1F4FD'
+emoji[clapper_board]=$'\U1F3AC'
+emoji[clapper]=$'\U1F3AC'
+emoji[television]=$'\U1F4FA'
+emoji[tv]=$'\U1F4FA'
+emoji[camera]=$'\U1F4F7'
+emoji[camera_with_flash]=$'\U1F4F8'
+emoji[camera_flash]=$'\U1F4F8'
+emoji[video_camera]=$'\U1F4F9'
+emoji[videocassette]=$'\U1F4FC'
+emoji[vhs]=$'\U1F4FC'
+emoji[magnifying_glass_tilted_left]=$'\U1F50D'
+emoji[mag]=$'\U1F50D'
+emoji[magnifying_glass_tilted_right]=$'\U1F50E'
+emoji[mag_right]=$'\U1F50E'
+emoji[candle]=$'\U1F56F\UFE0F'
+emoji[candle_unqualified]=$'\U1F56F'
+emoji[light_bulb]=$'\U1F4A1'
+emoji[bulb]=$'\U1F4A1'
+emoji[flashlight]=$'\U1F526'
+emoji[red_paper_lantern]=$'\U1F3EE'
+emoji[izakaya_lantern]=$'\U1F3EE'
+emoji[lantern]=$'\U1F3EE'
+emoji[diya_lamp]=$'\U1FA94'
+emoji[notebook_with_decorative_cover]=$'\U1F4D4'
+emoji[closed_book]=$'\U1F4D5'
+emoji[open_book]=$'\U1F4D6'
+emoji[book]=$'\U1F4D6'
+emoji[green_book]=$'\U1F4D7'
+emoji[blue_book]=$'\U1F4D8'
+emoji[orange_book]=$'\U1F4D9'
+emoji[books]=$'\U1F4DA'
+emoji[notebook]=$'\U1F4D3'
+emoji[ledger]=$'\U1F4D2'
+emoji[page_with_curl]=$'\U1F4C3'
+emoji[scroll]=$'\U1F4DC'
+emoji[page_facing_up]=$'\U1F4C4'
+emoji[newspaper]=$'\U1F4F0'
+emoji[rolled_up_newspaper]=$'\U1F5DE\UFE0F'
+emoji[rolled_up_newspaper_unqualified]=$'\U1F5DE'
+emoji[newspaper_roll]=$'\U1F5DE'
+emoji[bookmark_tabs]=$'\U1F4D1'
+emoji[bookmark_tabs_1]=$'\U1F516'
+emoji[bookmark]=$'\U1F516'
+emoji[label]=$'\U1F3F7\UFE0F'
+emoji[label_unqualified]=$'\U1F3F7'
+emoji[money_bag]=$'\U1F4B0'
+emoji[moneybag]=$'\U1F4B0'
+emoji[yen_banknote]=$'\U1F4B4'
+emoji[yen]=$'\U1F4B4'
+emoji[dollar_banknote]=$'\U1F4B5'
+emoji[dollar]=$'\U1F4B5'
+emoji[euro_banknote]=$'\U1F4B6'
+emoji[euro]=$'\U1F4B6'
+emoji[pound_banknote]=$'\U1F4B7'
+emoji[pound]=$'\U1F4B7'
+emoji[money_with_wings]=$'\U1F4B8'
+emoji[credit_card]=$'\U1F4B3'
+emoji[receipt]=$'\U1F9FE'
+emoji[chart_increasing_with_yen]=$'\U1F4B9'
+emoji[chart]=$'\U1F4B9'
+emoji[currency_exchange]=$'\U1F4B1'
+emoji[heavy_dollar_sign]=$'\U1F4B2'
+emoji[envelope]=$'\U2709\UFE0F'
+emoji[email]=$'\U2709\UFE0F'
+emoji[envelope_unqualified]=$'\U2709'
+emoji[e_mail]=$'\U1F4E7'
+emoji[e-mail]=$'\U1F4E7'
+emoji[incoming_envelope]=$'\U1F4E8'
+emoji[envelope_with_arrow]=$'\U1F4E9'
+emoji[outbox_tray]=$'\U1F4E4'
+emoji[inbox_tray]=$'\U1F4E5'
+emoji[package]=$'\U1F4E6'
+emoji[closed_mailbox_with_raised_flag]=$'\U1F4EB'
+emoji[mailbox]=$'\U1F4EB'
+emoji[closed_mailbox_with_lowered_flag]=$'\U1F4EA'
+emoji[mailbox_closed]=$'\U1F4EA'
+emoji[open_mailbox_with_raised_flag]=$'\U1F4EC'
+emoji[mailbox_with_mail]=$'\U1F4EC'
+emoji[open_mailbox_with_lowered_flag]=$'\U1F4ED'
+emoji[mailbox_with_no_mail]=$'\U1F4ED'
+emoji[postbox]=$'\U1F4EE'
+emoji[ballot_box_with_ballot]=$'\U1F5F3\UFE0F'
+emoji[ballot_box_with_ballot_unqualified]=$'\U1F5F3'
+emoji[ballot_box]=$'\U1F5F3'
+emoji[pencil]=$'\U270F\UFE0F'
+emoji[pencil2]=$'\U270F\UFE0F'
+emoji[pencil_unqualified]=$'\U270F'
+emoji[black_nib]=$'\U2712\UFE0F'
+emoji[black_nib_unqualified]=$'\U2712'
+emoji[fountain_pen]=$'\U1F58B\UFE0F'
+emoji[fountain_pen_unqualified]=$'\U1F58B'
+emoji[fountain_pen_unqualified_1]=$'\U1F58A\UFE0F'
+emoji[fountain_pen_unqualified_2]=$'\U1F58A'
+emoji[pen]=$'\U1F58A'
+emoji[paintbrush]=$'\U1F58C\UFE0F'
+emoji[paintbrush_unqualified]=$'\U1F58C'
+emoji[crayon]=$'\U1F58D\UFE0F'
+emoji[crayon_unqualified]=$'\U1F58D'
+emoji[memo]=$'\U1F4DD'
+emoji[briefcase]=$'\U1F4BC'
+emoji[file_folder]=$'\U1F4C1'
+emoji[open_file_folder]=$'\U1F4C2'
+emoji[card_index_dividers]=$'\U1F5C2\UFE0F'
+emoji[card_index_dividers_unqualified]=$'\U1F5C2'
+emoji[calendar]=$'\U1F4C5'
+emoji[date]=$'\U1F4C5'
+emoji[tear_off_calendar]=$'\U1F4C6'
+emoji[spiral_notepad]=$'\U1F5D2\UFE0F'
+emoji[spiral_notepad_unqualified]=$'\U1F5D2'
+emoji[spiral_calendar]=$'\U1F5D3\UFE0F'
+emoji[spiral_calendar_unqualified]=$'\U1F5D3'
+emoji[card_index]=$'\U1F4C7'
+emoji[chart_increasing]=$'\U1F4C8'
+emoji[chart_with_upwards_trend]=$'\U1F4C8'
+emoji[chart_decreasing]=$'\U1F4C9'
+emoji[chart_with_downwards_trend]=$'\U1F4C9'
+emoji[bar_chart]=$'\U1F4CA'
+emoji[clipboard]=$'\U1F4CB'
+emoji[pushpin]=$'\U1F4CC'
+emoji[round_pushpin]=$'\U1F4CD'
+emoji[paperclip]=$'\U1F4CE'
+emoji[linked_paperclips]=$'\U1F587\UFE0F'
+emoji[linked_paperclips_unqualified]=$'\U1F587'
+emoji[paperclips]=$'\U1F587'
+emoji[straight_ruler]=$'\U1F4CF'
+emoji[triangular_ruler]=$'\U1F4D0'
+emoji[scissors]=$'\U2702\UFE0F'
+emoji[scissors_unqualified]=$'\U2702'
+emoji[card_file_box]=$'\U1F5C3\UFE0F'
+emoji[card_file_box_unqualified]=$'\U1F5C3'
+emoji[file_cabinet]=$'\U1F5C4\UFE0F'
+emoji[file_cabinet_unqualified]=$'\U1F5C4'
+emoji[wastebasket]=$'\U1F5D1\UFE0F'
+emoji[wastebasket_unqualified]=$'\U1F5D1'
+emoji[locked]=$'\U1F512'
+emoji[lock]=$'\U1F512'
+emoji[unlocked]=$'\U1F513'
+emoji[unlock]=$'\U1F513'
+emoji[locked_with_pen]=$'\U1F50F'
+emoji[lock_with_ink_pen]=$'\U1F50F'
+emoji[locked_with_key]=$'\U1F510'
+emoji[closed_lock_with_key]=$'\U1F510'
+emoji[locked_with_key_1]=$'\U1F511'
+emoji[key]=$'\U1F511'
+emoji[old_key]=$'\U1F5DD\UFE0F'
+emoji[old_key_unqualified]=$'\U1F5DD'
+emoji[hammer]=$'\U1F528'
+emoji[axe]=$'\U1FA93'
+emoji[pick]=$'\U26CF\UFE0F'
+emoji[pick_unqualified]=$'\U26CF'
+emoji[hammer_and_pick]=$'\U2692\UFE0F'
+emoji[hammer_and_pick_unqualified]=$'\U2692'
+emoji[hammer_and_wrench]=$'\U1F6E0\UFE0F'
+emoji[hammer_and_wrench_unqualified]=$'\U1F6E0'
+emoji[dagger]=$'\U1F5E1\UFE0F'
+emoji[dagger_unqualified]=$'\U1F5E1'
+emoji[crossed_swords]=$'\U2694\UFE0F'
+emoji[crossed_swords_unqualified]=$'\U2694'
+emoji[pistol]=$'\U1F52B'
+emoji[gun]=$'\U1F52B'
+emoji[bow_and_arrow]=$'\U1F3F9'
+emoji[shield]=$'\U1F6E1\UFE0F'
+emoji[shield_unqualified]=$'\U1F6E1'
+emoji[wrench]=$'\U1F527'
+emoji[nut_and_bolt]=$'\U1F529'
+emoji[gear]=$'\U2699\UFE0F'
+emoji[gear_unqualified]=$'\U2699'
+emoji[clamp]=$'\U1F5DC\UFE0F'
+emoji[clamp_unqualified]=$'\U1F5DC'
+emoji[balance_scale]=$'\U2696\UFE0F'
+emoji[balance_scale_unqualified]=$'\U2696'
+emoji[probing_cane]=$'\U1F9AF'
+emoji[link]=$'\U1F517'
+emoji[chains]=$'\U26D3\UFE0F'
+emoji[chains_unqualified]=$'\U26D3'
+emoji[toolbox]=$'\U1F9F0'
+emoji[magnet]=$'\U1F9F2'
+emoji[alembic]=$'\U2697\UFE0F'
+emoji[alembic_unqualified]=$'\U2697'
+emoji[test_tube]=$'\U1F9EA'
+emoji[petri_dish]=$'\U1F9EB'
+emoji[dna]=$'\U1F9EC'
+emoji[microscope]=$'\U1F52C'
+emoji[telescope]=$'\U1F52D'
+emoji[satellite_antenna]=$'\U1F4E1'
+emoji[syringe]=$'\U1F489'
+emoji[drop_of_blood]=$'\U1FA78'
+emoji[pill]=$'\U1F48A'
+emoji[adhesive_bandage]=$'\U1FA79'
+emoji[stethoscope]=$'\U1FA7A'
emoji[door]=$'\U1F6AA'
-emoji[no_entry_sign]=$'\U1F6AB'
-emoji[smoking_symbol]=$'\U1F6AC'
-emoji[no_smoking_symbol]=$'\U1F6AD'
-emoji[put_litter_in_its_place_symbol]=$'\U1F6AE'
-emoji[do_not_litter_symbol]=$'\U1F6AF'
-emoji[potable_water_symbol]=$'\U1F6B0'
-emoji[non_potable_water_symbol]=$'\U1F6B1'
-emoji[bicycle]=$'\U1F6B2'
-emoji[no_bicycles]=$'\U1F6B3'
-emoji[bicyclist]=$'\U1F6B4'
-emoji[mountain_bicyclist]=$'\U1F6B5'
-emoji[pedestrian]=$'\U1F6B6'
-emoji[no_pedestrians]=$'\U1F6B7'
-emoji[children_crossing]=$'\U1F6B8'
-emoji[mens_symbol]=$'\U1F6B9'
-emoji[womens_symbol]=$'\U1F6BA'
+emoji[bed]=$'\U1F6CF\UFE0F'
+emoji[bed_unqualified]=$'\U1F6CF'
+emoji[couch_and_lamp]=$'\U1F6CB\UFE0F'
+emoji[couch_and_lamp_unqualified]=$'\U1F6CB'
+emoji[chair]=$'\U1FA91'
+emoji[toilet]=$'\U1F6BD'
+emoji[shower]=$'\U1F6BF'
+emoji[bathtub]=$'\U1F6C1'
+emoji[razor]=$'\U1FA92'
+emoji[lotion_bottle]=$'\U1F9F4'
+emoji[safety_pin]=$'\U1F9F7'
+emoji[broom]=$'\U1F9F9'
+emoji[basket]=$'\U1F9FA'
+emoji[roll_of_paper]=$'\U1F9FB'
+emoji[soap]=$'\U1F9FC'
+emoji[sponge]=$'\U1F9FD'
+emoji[fire_extinguisher]=$'\U1F9EF'
+emoji[shopping_cart]=$'\U1F6D2'
+emoji[cigarette]=$'\U1F6AC'
+emoji[smoking]=$'\U1F6AC'
+emoji[coffin]=$'\U26B0\UFE0F'
+emoji[coffin_unqualified]=$'\U26B0'
+emoji[funeral_urn]=$'\U26B1\UFE0F'
+emoji[funeral_urn_unqualified]=$'\U26B1'
+emoji[moai]=$'\U1F5FF'
+emoji[moyai]=$'\U1F5FF'
+emoji[ATM_sign]=$'\U1F3E7'
+emoji[atm]=$'\U1F3E7'
+emoji[litter_in_bin_sign]=$'\U1F6AE'
+emoji[put_litter_in_its_place]=$'\U1F6AE'
+emoji[potable_water]=$'\U1F6B0'
+emoji[wheelchair_symbol]=$'\U267F'
+emoji[wheelchair]=$'\U267F'
+emoji[men_s_room]=$'\U1F6B9'
+emoji[mens]=$'\U1F6B9'
+emoji[women_s_room]=$'\U1F6BA'
+emoji[womens]=$'\U1F6BA'
emoji[restroom]=$'\U1F6BB'
emoji[baby_symbol]=$'\U1F6BC'
-emoji[toilet]=$'\U1F6BD'
emoji[water_closet]=$'\U1F6BE'
-emoji[shower]=$'\U1F6BF'
-emoji[bath]=$'\U1F6C0'
-emoji[bathtub]=$'\U1F6C1'
+emoji[wc]=$'\U1F6BE'
emoji[passport_control]=$'\U1F6C2'
emoji[customs]=$'\U1F6C3'
emoji[baggage_claim]=$'\U1F6C4'
emoji[left_luggage]=$'\U1F6C5'
-emoji[couch_and_lamp]=$'\U1F6CB'
-emoji[sleeping_accommodation]=$'\U1F6CC'
-emoji[shopping_bags]=$'\U1F6CD'
-emoji[bellhop_bell]=$'\U1F6CE'
-emoji[bed]=$'\U1F6CF'
+emoji[warning]=$'\U26A0\UFE0F'
+emoji[warning_unqualified]=$'\U26A0'
+emoji[children_crossing]=$'\U1F6B8'
+emoji[no_entry]=$'\U26D4'
+emoji[prohibited]=$'\U1F6AB'
+emoji[no_entry_sign]=$'\U1F6AB'
+emoji[no_bicycles]=$'\U1F6B3'
+emoji[no_smoking]=$'\U1F6AD'
+emoji[no_littering]=$'\U1F6AF'
+emoji[do_not_litter]=$'\U1F6AF'
+emoji[non_potable_water]=$'\U1F6B1'
+emoji[non-potable_water]=$'\U1F6B1'
+emoji[no_pedestrians]=$'\U1F6B7'
+emoji[no_mobile_phones]=$'\U1F4F5'
+emoji[no_one_under_eighteen]=$'\U1F51E'
+emoji[underage]=$'\U1F51E'
+emoji[radioactive]=$'\U2622\UFE0F'
+emoji[radioactive_unqualified]=$'\U2622'
+emoji[biohazard]=$'\U2623\UFE0F'
+emoji[biohazard_unqualified]=$'\U2623'
+emoji[up_arrow]=$'\U2B06\UFE0F'
+emoji[arrow_up]=$'\U2B06\UFE0F'
+emoji[up_arrow_unqualified]=$'\U2B06'
+emoji[up_right_arrow]=$'\U2197\UFE0F'
+emoji[arrow_upper_right]=$'\U2197\UFE0F'
+emoji[up_right_arrow_unqualified]=$'\U2197'
+emoji[up_right_arrow_unqualified_1]=$'\U27A1\UFE0F'
+emoji[arrow_right]=$'\U27A1\UFE0F'
+emoji[up_right_arrow_unqualified_2]=$'\U27A1'
+emoji[down_right_arrow]=$'\U2198\UFE0F'
+emoji[arrow_lower_right]=$'\U2198\UFE0F'
+emoji[down_right_arrow_unqualified]=$'\U2198'
+emoji[down_arrow]=$'\U2B07\UFE0F'
+emoji[arrow_down]=$'\U2B07\UFE0F'
+emoji[down_arrow_unqualified]=$'\U2B07'
+emoji[down_left_arrow]=$'\U2199\UFE0F'
+emoji[arrow_lower_left]=$'\U2199\UFE0F'
+emoji[down_left_arrow_unqualified]=$'\U2199'
+emoji[down_left_arrow_unqualified_1]=$'\U2B05\UFE0F'
+emoji[arrow_left]=$'\U2B05\UFE0F'
+emoji[down_left_arrow_unqualified_2]=$'\U2B05'
+emoji[up_left_arrow]=$'\U2196\UFE0F'
+emoji[arrow_upper_left]=$'\U2196\UFE0F'
+emoji[up_left_arrow_unqualified]=$'\U2196'
+emoji[up_down_arrow]=$'\U2195\UFE0F'
+emoji[arrow_up_down]=$'\U2195\UFE0F'
+emoji[up_down_arrow_unqualified]=$'\U2195'
+emoji[left_right_arrow]=$'\U2194\UFE0F'
+emoji[left_right_arrow_unqualified]=$'\U2194'
+emoji[right_arrow_curving_left]=$'\U21A9\UFE0F'
+emoji[leftwards_arrow_with_hook]=$'\U21A9\UFE0F'
+emoji[right_arrow_curving_left_unqualified]=$'\U21A9'
+emoji[left_arrow_curving_right]=$'\U21AA\UFE0F'
+emoji[arrow_right_hook]=$'\U21AA\UFE0F'
+emoji[left_arrow_curving_right_unqualified]=$'\U21AA'
+emoji[right_arrow_curving_up]=$'\U2934\UFE0F'
+emoji[arrow_heading_up]=$'\U2934\UFE0F'
+emoji[right_arrow_curving_up_unqualified]=$'\U2934'
+emoji[right_arrow_curving_down]=$'\U2935\UFE0F'
+emoji[arrow_heading_down]=$'\U2935\UFE0F'
+emoji[right_arrow_curving_down_unqualified]=$'\U2935'
+emoji[clockwise_vertical_arrows]=$'\U1F503'
+emoji[arrows_clockwise]=$'\U1F503'
+emoji[counterclockwise_arrows_button]=$'\U1F504'
+emoji[arrows_counterclockwise]=$'\U1F504'
+emoji[BACK_arrow]=$'\U1F519'
+emoji[back]=$'\U1F519'
+emoji[END_arrow]=$'\U1F51A'
+emoji[end]=$'\U1F51A'
+emoji[ON_arrow]=$'\U1F51B'
+emoji[on]=$'\U1F51B'
+emoji[SOON_arrow]=$'\U1F51C'
+emoji[soon]=$'\U1F51C'
+emoji[TOP_arrow]=$'\U1F51D'
+emoji[top]=$'\U1F51D'
emoji[place_of_worship]=$'\U1F6D0'
-emoji[hammer_and_wrench]=$'\U1F6E0'
-emoji[shield]=$'\U1F6E1'
-emoji[oil_drum]=$'\U1F6E2'
-emoji[motorway]=$'\U1F6E3'
-emoji[railway_track]=$'\U1F6E4'
-emoji[motor_boat]=$'\U1F6E5'
-emoji[small_airplane]=$'\U1F6E9'
-emoji[airplane_departure]=$'\U1F6EB'
-emoji[airplane_arriving]=$'\U1F6EC'
-emoji[satellite]=$'\U1F6F0'
-emoji[passenger_ship]=$'\U1F6F3'
-emoji[zipper_mouth_face]=$'\U1F910'
-emoji[money_mouth_face]=$'\U1F911'
-emoji[face_with_thermometer]=$'\U1F912'
-emoji[nerd_face]=$'\U1F913'
-emoji[thinking_face]=$'\U1F914'
-emoji[face_with_head_bandage]=$'\U1F915'
-emoji[robot_face]=$'\U1F916'
-emoji[hugging_face]=$'\U1F917'
-emoji[sign_of_the_horns]=$'\U1F918'
-emoji[crab]=$'\U1F980'
-emoji[lion_face]=$'\U1F981'
-emoji[scorpion]=$'\U1F982'
-emoji[turkey]=$'\U1F983'
-emoji[unicorn_face]=$'\U1F984'
-emoji[cheese_wedge]=$'\U1F9C0'
-emoji[keycap_number_sign]=$'\U0023\U20E3'
-emoji[keycap_asterisk]=$'\U002A\U20E3'
-emoji[keycap_digit_zero]=$'\U0030\U20E3'
-emoji[keycap_digit_one]=$'\U0031\U20E3'
-emoji[keycap_digit_two]=$'\U0032\U20E3'
-emoji[keycap_digit_three]=$'\U0033\U20E3'
-emoji[keycap_digit_four]=$'\U0034\U20E3'
-emoji[keycap_digit_five]=$'\U0035\U20E3'
-emoji[keycap_digit_six]=$'\U0036\U20E3'
-emoji[keycap_digit_seven]=$'\U0037\U20E3'
-emoji[keycap_digit_eight]=$'\U0038\U20E3'
-emoji[keycap_digit_nine]=$'\U0039\U20E3'
+emoji[atom_symbol]=$'\U269B\UFE0F'
+emoji[atom_symbol_unqualified]=$'\U269B'
+emoji[atom_symbol_unqualified_1]=$'\U1F549\UFE0F'
+emoji[om_unqualified]=$'\U1F549'
+emoji[om]=$'\U1F549'
+emoji[star_of_David]=$'\U2721\UFE0F'
+emoji[star_of_david]=$'\U2721\UFE0F'
+emoji[star_of_David_unqualified]=$'\U2721'
+emoji[wheel_of_dharma]=$'\U2638\UFE0F'
+emoji[wheel_of_dharma_unqualified]=$'\U2638'
+emoji[yin_yang]=$'\U262F\UFE0F'
+emoji[yin_yang_unqualified]=$'\U262F'
+emoji[latin_cross]=$'\U271D\UFE0F'
+emoji[latin_cross_unqualified]=$'\U271D'
+emoji[orthodox_cross]=$'\U2626\UFE0F'
+emoji[orthodox_cross_unqualified]=$'\U2626'
+emoji[star_and_crescent]=$'\U262A\UFE0F'
+emoji[star_and_crescent_unqualified]=$'\U262A'
+emoji[peace_symbol]=$'\U262E\UFE0F'
+emoji[peace_symbol_unqualified]=$'\U262E'
+emoji[menorah]=$'\U1F54E'
+emoji[dotted_six_pointed_star]=$'\U1F52F'
+emoji[six_pointed_star]=$'\U1F52F'
+emoji[Aries]=$'\U2648'
+emoji[aries]=$'\U2648'
+emoji[Taurus]=$'\U2649'
+emoji[taurus]=$'\U2649'
+emoji[Gemini]=$'\U264A'
+emoji[gemini]=$'\U264A'
+emoji[Cancer]=$'\U264B'
+emoji[cancer]=$'\U264B'
+emoji[Leo]=$'\U264C'
+emoji[leo]=$'\U264C'
+emoji[Virgo]=$'\U264D'
+emoji[virgo]=$'\U264D'
+emoji[Libra]=$'\U264E'
+emoji[libra]=$'\U264E'
+emoji[Scorpio]=$'\U264F'
+emoji[scorpius]=$'\U264F'
+emoji[Sagittarius]=$'\U2650'
+emoji[sagittarius]=$'\U2650'
+emoji[Capricorn]=$'\U2651'
+emoji[capricorn]=$'\U2651'
+emoji[Aquarius]=$'\U2652'
+emoji[aquarius]=$'\U2652'
+emoji[Pisces]=$'\U2653'
+emoji[pisces]=$'\U2653'
+emoji[Ophiuchus]=$'\U26CE'
+emoji[ophiuchus]=$'\U26CE'
+emoji[shuffle_tracks_button]=$'\U1F500'
+emoji[twisted_rightwards_arrows]=$'\U1F500'
+emoji[repeat_button]=$'\U1F501'
+emoji[repeat]=$'\U1F501'
+emoji[repeat_single_button]=$'\U1F502'
+emoji[repeat_one]=$'\U1F502'
+emoji[play_button]=$'\U25B6\UFE0F'
+emoji[arrow_forward]=$'\U25B6\UFE0F'
+emoji[play_button_unqualified]=$'\U25B6'
+emoji[fast_forward_button]=$'\U23E9'
+emoji[fast_forward]=$'\U23E9'
+emoji[next_track_button]=$'\U23ED\UFE0F'
+emoji[next_track_button_unqualified]=$'\U23ED'
+emoji[play_or_pause_button]=$'\U23EF\UFE0F'
+emoji[play_or_pause_button_unqualified]=$'\U23EF'
+emoji[reverse_button]=$'\U25C0\UFE0F'
+emoji[arrow_backward]=$'\U25C0\UFE0F'
+emoji[reverse_button_unqualified]=$'\U25C0'
+emoji[fast_reverse_button]=$'\U23EA'
+emoji[rewind]=$'\U23EA'
+emoji[last_track_button]=$'\U23EE\UFE0F'
+emoji[last_track_button_unqualified]=$'\U23EE'
+emoji[previous_track_button]=$'\U23EE'
+emoji[upwards_button]=$'\U1F53C'
+emoji[arrow_up_small]=$'\U1F53C'
+emoji[fast_up_button]=$'\U23EB'
+emoji[arrow_double_up]=$'\U23EB'
+emoji[downwards_button]=$'\U1F53D'
+emoji[arrow_down_small]=$'\U1F53D'
+emoji[fast_down_button]=$'\U23EC'
+emoji[arrow_double_down]=$'\U23EC'
+emoji[pause_button]=$'\U23F8\UFE0F'
+emoji[pause_button_unqualified]=$'\U23F8'
+emoji[stop_button]=$'\U23F9\UFE0F'
+emoji[stop_button_unqualified]=$'\U23F9'
+emoji[record_button]=$'\U23FA\UFE0F'
+emoji[record_button_unqualified]=$'\U23FA'
+emoji[eject_button]=$'\U23CF\UFE0F'
+emoji[eject_button_unqualified]=$'\U23CF'
+emoji[cinema]=$'\U1F3A6'
+emoji[dim_button]=$'\U1F505'
+emoji[low_brightness]=$'\U1F505'
+emoji[bright_button]=$'\U1F506'
+emoji[high_brightness]=$'\U1F506'
+emoji[antenna_bars]=$'\U1F4F6'
+emoji[signal_strength]=$'\U1F4F6'
+emoji[vibration_mode]=$'\U1F4F3'
+emoji[mobile_phone_off]=$'\U1F4F4'
+emoji[female_sign]=$'\U2640\UFE0F'
+emoji[female_sign_unqualified]=$'\U2640'
+emoji[female_sign_unqualified_1]=$'\U2642\UFE0F'
+emoji[male_sign]=$'\U2642\UFE0F'
+emoji[female_sign_unqualified_2]=$'\U2642'
+emoji[medical_symbol]=$'\U2695\UFE0F'
+emoji[medical_symbol_unqualified]=$'\U2695'
+emoji[infinity]=$'\U267E\UFE0F'
+emoji[infinity_unqualified]=$'\U267E'
+emoji[recycling_symbol]=$'\U267B\UFE0F'
+emoji[recycle]=$'\U267B\UFE0F'
+emoji[recycling_symbol_unqualified]=$'\U267B'
+emoji[fleur_de_lis]=$'\U269C\UFE0F'
+emoji[fleur_de_lis_unqualified]=$'\U269C'
+emoji[trident_emblem]=$'\U1F531'
+emoji[trident]=$'\U1F531'
+emoji[name_badge]=$'\U1F4DB'
+emoji[Japanese_symbol_for_beginner]=$'\U1F530'
+emoji[beginner]=$'\U1F530'
+emoji[hollow_red_circle]=$'\U2B55'
+emoji[o]=$'\U2B55'
+emoji[check_mark_button]=$'\U2705'
+emoji[white_check_mark]=$'\U2705'
+emoji[check_box_with_check]=$'\U2611\UFE0F'
+emoji[ballot_box_with_check]=$'\U2611\UFE0F'
+emoji[check_box_with_check_unqualified]=$'\U2611'
+emoji[check_mark]=$'\U2714\UFE0F'
+emoji[heavy_check_mark]=$'\U2714\UFE0F'
+emoji[check_mark_unqualified]=$'\U2714'
+emoji[multiplication_sign]=$'\U2716\UFE0F'
+emoji[heavy_multiplication_x]=$'\U2716\UFE0F'
+emoji[multiplication_sign_unqualified]=$'\U2716'
+emoji[cross_mark]=$'\U274C'
+emoji[x]=$'\U274C'
+emoji[cross_mark_button]=$'\U274E'
+emoji[negative_squared_cross_mark]=$'\U274E'
+emoji[plus_sign]=$'\U2795'
+emoji[heavy_plus_sign]=$'\U2795'
+emoji[minus_sign]=$'\U2796'
+emoji[heavy_minus_sign]=$'\U2796'
+emoji[division_sign]=$'\U2797'
+emoji[heavy_division_sign]=$'\U2797'
+emoji[curly_loop]=$'\U27B0'
+emoji[double_curly_loop]=$'\U27BF'
+emoji[loop]=$'\U27BF'
+emoji[part_alternation_mark]=$'\U303D\UFE0F'
+emoji[part_alternation_mark_unqualified]=$'\U303D'
+emoji[eight_spoked_asterisk]=$'\U2733\UFE0F'
+emoji[eight_spoked_asterisk_unqualified]=$'\U2733'
+emoji[eight_pointed_star]=$'\U2734\UFE0F'
+emoji[eight_pointed_black_star]=$'\U2734\UFE0F'
+emoji[eight_pointed_star_unqualified]=$'\U2734'
+emoji[sparkle]=$'\U2747\UFE0F'
+emoji[sparkle_unqualified]=$'\U2747'
+emoji[double_exclamation_mark]=$'\U203C\UFE0F'
+emoji[bangbang]=$'\U203C\UFE0F'
+emoji[double_exclamation_mark_unqualified]=$'\U203C'
+emoji[exclamation_question_mark]=$'\U2049\UFE0F'
+emoji[interrobang]=$'\U2049\UFE0F'
+emoji[exclamation_question_mark_unqualified]=$'\U2049'
+emoji[exclamation_question_mark_unqualified_1]=$'\U2753'
+emoji[question]=$'\U2753'
+emoji[white_question_mark]=$'\U2754'
+emoji[grey_question]=$'\U2754'
+emoji[white_exclamation_mark]=$'\U2755'
+emoji[grey_exclamation]=$'\U2755'
+emoji[white_exclamation_mark_1]=$'\U2757'
+emoji[exclamation]=$'\U2757'
+emoji[heavy_exclamation_mark]=$'\U2757'
+emoji[wavy_dash]=$'\U3030\UFE0F'
+emoji[wavy_dash_unqualified]=$'\U3030'
+emoji[copyright]=$'\U00A9\UFE0F'
+emoji[copyright_unqualified]=$'\U00A9'
+emoji[registered]=$'\U00AE\UFE0F'
+emoji[registered_unqualified]=$'\U00AE'
+emoji[trade_mark]=$'\U2122\UFE0F'
+emoji[tm]=$'\U2122\UFE0F'
+emoji[trade_mark_unqualified]=$'\U2122'
+emoji[keycap_#]=$'\U0023\UFE0F\U20E3'
+emoji[hash]=$'\U0023\UFE0F\U20E3'
+emoji[keycap_#_unqualified]=$'\U0023\U20E3'
+emoji[keycap_*]=$'\U002A\UFE0F\U20E3'
+emoji[asterisk]=$'\U002A\UFE0F\U20E3'
+emoji[keycap_*_unqualified]=$'\U002A\U20E3'
+emoji[keycap_0]=$'\U0030\UFE0F\U20E3'
+emoji[zero]=$'\U0030\UFE0F\U20E3'
+emoji[keycap_0_unqualified]=$'\U0030\U20E3'
+emoji[keycap_1]=$'\U0031\UFE0F\U20E3'
+emoji[one]=$'\U0031\UFE0F\U20E3'
+emoji[keycap_1_unqualified]=$'\U0031\U20E3'
+emoji[keycap_2]=$'\U0032\UFE0F\U20E3'
+emoji[two]=$'\U0032\UFE0F\U20E3'
+emoji[keycap_2_unqualified]=$'\U0032\U20E3'
+emoji[keycap_3]=$'\U0033\UFE0F\U20E3'
+emoji[three]=$'\U0033\UFE0F\U20E3'
+emoji[keycap_3_unqualified]=$'\U0033\U20E3'
+emoji[keycap_4]=$'\U0034\UFE0F\U20E3'
+emoji[four]=$'\U0034\UFE0F\U20E3'
+emoji[keycap_4_unqualified]=$'\U0034\U20E3'
+emoji[keycap_5]=$'\U0035\UFE0F\U20E3'
+emoji[five]=$'\U0035\UFE0F\U20E3'
+emoji[keycap_5_unqualified]=$'\U0035\U20E3'
+emoji[keycap_6]=$'\U0036\UFE0F\U20E3'
+emoji[six]=$'\U0036\UFE0F\U20E3'
+emoji[keycap_6_unqualified]=$'\U0036\U20E3'
+emoji[keycap_7]=$'\U0037\UFE0F\U20E3'
+emoji[seven]=$'\U0037\UFE0F\U20E3'
+emoji[keycap_7_unqualified]=$'\U0037\U20E3'
+emoji[keycap_8]=$'\U0038\UFE0F\U20E3'
+emoji[eight]=$'\U0038\UFE0F\U20E3'
+emoji[keycap_8_unqualified]=$'\U0038\U20E3'
+emoji[keycap_9]=$'\U0039\UFE0F\U20E3'
+emoji[nine]=$'\U0039\UFE0F\U20E3'
+emoji[keycap_9_unqualified]=$'\U0039\U20E3'
+emoji[keycap_10]=$'\U1F51F'
+emoji[keycap_ten]=$'\U1F51F'
+emoji[input_latin_uppercase]=$'\U1F520'
+emoji[capital_abcd]=$'\U1F520'
+emoji[input_latin_lowercase]=$'\U1F521'
+emoji[abcd]=$'\U1F521'
+emoji[input_numbers]=$'\U1F522'
+emoji[1234]=$'\U1F522'
+emoji[input_symbols]=$'\U1F523'
+emoji[symbols]=$'\U1F523'
+emoji[input_latin_letters]=$'\U1F524'
+emoji[abc]=$'\U1F524'
+emoji[A_button_blood_type_]=$'\U1F170\UFE0F'
+emoji[a]=$'\U1F170\UFE0F'
+emoji[A_button_blood_type__unqualified]=$'\U1F170'
+emoji[AB_button_blood_type_]=$'\U1F18E'
+emoji[ab]=$'\U1F18E'
+emoji[AB_button_blood_type__1]=$'\U1F171\UFE0F'
+emoji[b]=$'\U1F171\UFE0F'
+emoji[B_button_blood_type__unqualified]=$'\U1F171'
+emoji[CL_button]=$'\U1F191'
+emoji[cl]=$'\U1F191'
+emoji[COOL_button]=$'\U1F192'
+emoji[cool]=$'\U1F192'
+emoji[FREE_button]=$'\U1F193'
+emoji[free]=$'\U1F193'
+emoji[information]=$'\U2139\UFE0F'
+emoji[information_source]=$'\U2139\UFE0F'
+emoji[information_unqualified]=$'\U2139'
+emoji[ID_button]=$'\U1F194'
+emoji[id]=$'\U1F194'
+emoji[circled_M]=$'\U24C2\UFE0F'
+emoji[m]=$'\U24C2\UFE0F'
+emoji[circled_M_unqualified]=$'\U24C2'
+emoji[NEW_button]=$'\U1F195'
+emoji[new]=$'\U1F195'
+emoji[NG_button]=$'\U1F196'
+emoji[ng]=$'\U1F196'
+emoji[O_button_blood_type_]=$'\U1F17E\UFE0F'
+emoji[o2]=$'\U1F17E\UFE0F'
+emoji[O_button_blood_type__unqualified]=$'\U1F17E'
+emoji[OK_button]=$'\U1F197'
+emoji[ok]=$'\U1F197'
+emoji[P_button]=$'\U1F17F\UFE0F'
+emoji[parking]=$'\U1F17F\UFE0F'
+emoji[P_button_unqualified]=$'\U1F17F'
+emoji[SOS_button]=$'\U1F198'
+emoji[sos]=$'\U1F198'
+emoji[UP_button]=$'\U1F199'
+emoji[up]=$'\U1F199'
+emoji[VS_button]=$'\U1F19A'
+emoji[vs]=$'\U1F19A'
+emoji[Japanese_here_button]=$'\U1F201'
+emoji[koko]=$'\U1F201'
+emoji[Japanese_service_charge_button]=$'\U1F202\UFE0F'
+emoji[sa]=$'\U1F202\UFE0F'
+emoji[Japanese_service_charge_button_unqualified]=$'\U1F202'
+emoji[Japanese_monthly_amount_button]=$'\U1F237\UFE0F'
+emoji[u6708]=$'\U1F237\UFE0F'
+emoji[Japanese_monthly_amount_button_unqualified]=$'\U1F237'
+emoji[Japanese_not_free_of_charge_button]=$'\U1F236'
+emoji[u6709]=$'\U1F236'
+emoji[Japanese_reserved_button]=$'\U1F22F'
+emoji[u6307]=$'\U1F22F'
+emoji[Japanese_bargain_button]=$'\U1F250'
+emoji[ideograph_advantage]=$'\U1F250'
+emoji[Japanese_discount_button]=$'\U1F239'
+emoji[u5272]=$'\U1F239'
+emoji[Japanese_free_of_charge_button]=$'\U1F21A'
+emoji[u7121]=$'\U1F21A'
+emoji[Japanese_prohibited_button]=$'\U1F232'
+emoji[u7981]=$'\U1F232'
+emoji[Japanese_acceptable_button]=$'\U1F251'
+emoji[accept]=$'\U1F251'
+emoji[Japanese_application_button]=$'\U1F238'
+emoji[u7533]=$'\U1F238'
+emoji[Japanese_passing_grade_button]=$'\U1F234'
+emoji[u5408]=$'\U1F234'
+emoji[Japanese_vacancy_button]=$'\U1F233'
+emoji[u7a7a]=$'\U1F233'
+emoji[Japanese_congratulations_button]=$'\U3297\UFE0F'
+emoji[congratulations]=$'\U3297\UFE0F'
+emoji[Japanese_congratulations_button_unqualified]=$'\U3297'
+emoji[Japanese_secret_button]=$'\U3299\UFE0F'
+emoji[secret]=$'\U3299\UFE0F'
+emoji[Japanese_secret_button_unqualified]=$'\U3299'
+emoji[Japanese_open_for_business_button]=$'\U1F23A'
+emoji[u55b6]=$'\U1F23A'
+emoji[Japanese_no_vacancy_button]=$'\U1F235'
+emoji[u6e80]=$'\U1F235'
+emoji[red_circle]=$'\U1F534'
+emoji[orange_circle]=$'\U1F7E0'
+emoji[yellow_circle]=$'\U1F7E1'
+emoji[green_circle]=$'\U1F7E2'
+emoji[blue_circle]=$'\U1F535'
+emoji[large_blue_circle]=$'\U1F535'
+emoji[purple_circle]=$'\U1F7E3'
+emoji[brown_circle]=$'\U1F7E4'
+emoji[black_circle]=$'\U26AB'
+emoji[white_circle]=$'\U26AA'
+emoji[red_square]=$'\U1F7E5'
+emoji[orange_square]=$'\U1F7E7'
+emoji[yellow_square]=$'\U1F7E8'
+emoji[green_square]=$'\U1F7E9'
+emoji[blue_square]=$'\U1F7E6'
+emoji[purple_square]=$'\U1F7EA'
+emoji[brown_square]=$'\U1F7EB'
+emoji[black_large_square]=$'\U2B1B'
+emoji[white_large_square]=$'\U2B1C'
+emoji[black_medium_square]=$'\U25FC\UFE0F'
+emoji[black_medium_square_unqualified]=$'\U25FC'
+emoji[white_medium_square]=$'\U25FB\UFE0F'
+emoji[white_medium_square_unqualified]=$'\U25FB'
+emoji[black_medium_small_square]=$'\U25FE'
+emoji[white_medium_small_square]=$'\U25FD'
+emoji[black_small_square]=$'\U25AA\UFE0F'
+emoji[black_small_square_unqualified]=$'\U25AA'
+emoji[white_small_square]=$'\U25AB\UFE0F'
+emoji[white_small_square_unqualified]=$'\U25AB'
+emoji[large_orange_diamond]=$'\U1F536'
+emoji[large_blue_diamond]=$'\U1F537'
+emoji[small_orange_diamond]=$'\U1F538'
+emoji[small_blue_diamond]=$'\U1F539'
+emoji[red_triangle_pointed_up]=$'\U1F53A'
+emoji[small_red_triangle]=$'\U1F53A'
+emoji[red_triangle_pointed_down]=$'\U1F53B'
+emoji[small_red_triangle_down]=$'\U1F53B'
+emoji[diamond_with_a_dot]=$'\U1F4A0'
+emoji[diamond_shape_with_a_dot_inside]=$'\U1F4A0'
+emoji[radio_button]=$'\U1F518'
+emoji[white_square_button]=$'\U1F533'
+emoji[black_square_button]=$'\U1F532'
+emoji_flags[chequered_flag]=$'\U1F3C1'
+emoji_flags[checkered_flag]=$'\U1F3C1'
+emoji_flags[triangular_flag]=$'\U1F6A9'
+emoji_flags[triangular_flag_on_post]=$'\U1F6A9'
+emoji_flags[crossed_flags]=$'\U1F38C'
+emoji_flags[black_flag]=$'\U1F3F4'
+emoji_flags[white_flag]=$'\U1F3F3\UFE0F'
+emoji_flags[white_flag_unqualified]=$'\U1F3F3'
+emoji_flags[rainbow_flag]=$'\U1F3F3\UFE0F\U200D\U1F308'
+emoji_flags[rainbow_flag_unqualified]=$'\U1F3F3\U200D\U1F308'
+emoji_flags[pirate_flag]=$'\U1F3F4\U200D\U2620\UFE0F'
+emoji_flags[pirate_flag_minimally]=$'\U1F3F4\U200D\U2620'
emoji_flags[Ascension_Island]=$'\U1F1E6\U1F1E8'
+emoji_flags[ascension_island]=$'\U1F1E6\U1F1E8'
emoji_flags[Andorra]=$'\U1F1E6\U1F1E9'
+emoji_flags[AD]=$'\U1F1E6\U1F1E9'
+emoji_flags[AND]=$'\U1F1E6\U1F1E9'
+emoji_flags[andorra]=$'\U1F1E6\U1F1E9'
emoji_flags[United_Arab_Emirates]=$'\U1F1E6\U1F1EA'
+emoji_flags[AE]=$'\U1F1E6\U1F1EA'
+emoji_flags[ARE]=$'\U1F1E6\U1F1EA'
+emoji_flags[united_arab_emirates]=$'\U1F1E6\U1F1EA'
emoji_flags[Afghanistan]=$'\U1F1E6\U1F1EB'
-emoji_flags[Antigua___Barbuda]=$'\U1F1E6\U1F1EC'
+emoji_flags[AF]=$'\U1F1E6\U1F1EB'
+emoji_flags[AFG]=$'\U1F1E6\U1F1EB'
+emoji_flags[afghanistan]=$'\U1F1E6\U1F1EB'
+emoji_flags[Antigua_and_Barbuda]=$'\U1F1E6\U1F1EC'
+emoji_flags[AG]=$'\U1F1E6\U1F1EC'
+emoji_flags[ATG]=$'\U1F1E6\U1F1EC'
+emoji_flags[antigua_barbuda]=$'\U1F1E6\U1F1EC'
emoji_flags[Anguilla]=$'\U1F1E6\U1F1EE'
+emoji_flags[AI]=$'\U1F1E6\U1F1EE'
+emoji_flags[AIA]=$'\U1F1E6\U1F1EE'
+emoji_flags[anguilla]=$'\U1F1E6\U1F1EE'
emoji_flags[Albania]=$'\U1F1E6\U1F1F1'
+emoji_flags[AL]=$'\U1F1E6\U1F1F1'
+emoji_flags[ALB]=$'\U1F1E6\U1F1F1'
+emoji_flags[albania]=$'\U1F1E6\U1F1F1'
emoji_flags[Armenia]=$'\U1F1E6\U1F1F2'
+emoji_flags[AM]=$'\U1F1E6\U1F1F2'
+emoji_flags[ARM]=$'\U1F1E6\U1F1F2'
+emoji_flags[armenia]=$'\U1F1E6\U1F1F2'
emoji_flags[Angola]=$'\U1F1E6\U1F1F4'
+emoji_flags[AO]=$'\U1F1E6\U1F1F4'
+emoji_flags[AGO]=$'\U1F1E6\U1F1F4'
+emoji_flags[angola]=$'\U1F1E6\U1F1F4'
emoji_flags[Antarctica]=$'\U1F1E6\U1F1F6'
+emoji_flags[AQ]=$'\U1F1E6\U1F1F6'
+emoji_flags[ATA]=$'\U1F1E6\U1F1F6'
+emoji_flags[antarctica]=$'\U1F1E6\U1F1F6'
emoji_flags[Argentina]=$'\U1F1E6\U1F1F7'
+emoji_flags[AR]=$'\U1F1E6\U1F1F7'
+emoji_flags[ARG]=$'\U1F1E6\U1F1F7'
+emoji_flags[argentina]=$'\U1F1E6\U1F1F7'
emoji_flags[American_Samoa]=$'\U1F1E6\U1F1F8'
+emoji_flags[AS]=$'\U1F1E6\U1F1F8'
+emoji_flags[ASM]=$'\U1F1E6\U1F1F8'
+emoji_flags[american_samoa]=$'\U1F1E6\U1F1F8'
emoji_flags[Austria]=$'\U1F1E6\U1F1F9'
+emoji_flags[AT]=$'\U1F1E6\U1F1F9'
+emoji_flags[AUT]=$'\U1F1E6\U1F1F9'
+emoji_flags[austria]=$'\U1F1E6\U1F1F9'
emoji_flags[Australia]=$'\U1F1E6\U1F1FA'
+emoji_flags[AU]=$'\U1F1E6\U1F1FA'
+emoji_flags[AUS]=$'\U1F1E6\U1F1FA'
+emoji_flags[australia]=$'\U1F1E6\U1F1FA'
emoji_flags[Aruba]=$'\U1F1E6\U1F1FC'
-emoji_flags[_land_Islands]=$'\U1F1E6\U1F1FD'
+emoji_flags[AW]=$'\U1F1E6\U1F1FC'
+emoji_flags[ABW]=$'\U1F1E6\U1F1FC'
+emoji_flags[aruba]=$'\U1F1E6\U1F1FC'
+emoji_flags[Åland_Islands]=$'\U1F1E6\U1F1FD'
+emoji_flags[AX]=$'\U1F1E6\U1F1FD'
+emoji_flags[ALA]=$'\U1F1E6\U1F1FD'
+emoji_flags[aland_islands]=$'\U1F1E6\U1F1FD'
emoji_flags[Azerbaijan]=$'\U1F1E6\U1F1FF'
-emoji_flags[Bosnia___Herzegovina]=$'\U1F1E7\U1F1E6'
+emoji_flags[AZ]=$'\U1F1E6\U1F1FF'
+emoji_flags[AZE]=$'\U1F1E6\U1F1FF'
+emoji_flags[azerbaijan]=$'\U1F1E6\U1F1FF'
+emoji_flags[Bosnia_and_Herzegovina]=$'\U1F1E7\U1F1E6'
+emoji_flags[BA]=$'\U1F1E7\U1F1E6'
+emoji_flags[BIH]=$'\U1F1E7\U1F1E6'
+emoji_flags[bosnia_herzegovina]=$'\U1F1E7\U1F1E6'
emoji_flags[Barbados]=$'\U1F1E7\U1F1E7'
+emoji_flags[BB]=$'\U1F1E7\U1F1E7'
+emoji_flags[BRB]=$'\U1F1E7\U1F1E7'
+emoji_flags[barbados]=$'\U1F1E7\U1F1E7'
emoji_flags[Bangladesh]=$'\U1F1E7\U1F1E9'
+emoji_flags[BD]=$'\U1F1E7\U1F1E9'
+emoji_flags[BGD]=$'\U1F1E7\U1F1E9'
+emoji_flags[bangladesh]=$'\U1F1E7\U1F1E9'
emoji_flags[Belgium]=$'\U1F1E7\U1F1EA'
+emoji_flags[BE]=$'\U1F1E7\U1F1EA'
+emoji_flags[BEL]=$'\U1F1E7\U1F1EA'
+emoji_flags[belgium]=$'\U1F1E7\U1F1EA'
emoji_flags[Burkina_Faso]=$'\U1F1E7\U1F1EB'
+emoji_flags[BF]=$'\U1F1E7\U1F1EB'
+emoji_flags[BFA]=$'\U1F1E7\U1F1EB'
+emoji_flags[burkina_faso]=$'\U1F1E7\U1F1EB'
emoji_flags[Bulgaria]=$'\U1F1E7\U1F1EC'
+emoji_flags[BG]=$'\U1F1E7\U1F1EC'
+emoji_flags[BGR]=$'\U1F1E7\U1F1EC'
+emoji_flags[bulgaria]=$'\U1F1E7\U1F1EC'
emoji_flags[Bahrain]=$'\U1F1E7\U1F1ED'
+emoji_flags[BH]=$'\U1F1E7\U1F1ED'
+emoji_flags[BHR]=$'\U1F1E7\U1F1ED'
+emoji_flags[bahrain]=$'\U1F1E7\U1F1ED'
emoji_flags[Burundi]=$'\U1F1E7\U1F1EE'
+emoji_flags[BI]=$'\U1F1E7\U1F1EE'
+emoji_flags[BDI]=$'\U1F1E7\U1F1EE'
+emoji_flags[burundi]=$'\U1F1E7\U1F1EE'
emoji_flags[Benin]=$'\U1F1E7\U1F1EF'
-emoji_flags[St__Barth_lemy]=$'\U1F1E7\U1F1F1'
+emoji_flags[BJ]=$'\U1F1E7\U1F1EF'
+emoji_flags[BEN]=$'\U1F1E7\U1F1EF'
+emoji_flags[benin]=$'\U1F1E7\U1F1EF'
+emoji_flags[St_Barthélemy]=$'\U1F1E7\U1F1F1'
+emoji_flags[BL]=$'\U1F1E7\U1F1F1'
+emoji_flags[BLM]=$'\U1F1E7\U1F1F1'
+emoji_flags[st_barthelemy]=$'\U1F1E7\U1F1F1'
emoji_flags[Bermuda]=$'\U1F1E7\U1F1F2'
+emoji_flags[BM]=$'\U1F1E7\U1F1F2'
+emoji_flags[BMU]=$'\U1F1E7\U1F1F2'
+emoji_flags[bermuda]=$'\U1F1E7\U1F1F2'
emoji_flags[Brunei]=$'\U1F1E7\U1F1F3'
+emoji_flags[BN]=$'\U1F1E7\U1F1F3'
+emoji_flags[BRN]=$'\U1F1E7\U1F1F3'
+emoji_flags[brunei]=$'\U1F1E7\U1F1F3'
emoji_flags[Bolivia]=$'\U1F1E7\U1F1F4'
+emoji_flags[BO]=$'\U1F1E7\U1F1F4'
+emoji_flags[BOL]=$'\U1F1E7\U1F1F4'
+emoji_flags[bolivia]=$'\U1F1E7\U1F1F4'
emoji_flags[Caribbean_Netherlands]=$'\U1F1E7\U1F1F6'
+emoji_flags[BQ]=$'\U1F1E7\U1F1F6'
+emoji_flags[BES]=$'\U1F1E7\U1F1F6'
+emoji_flags[caribbean_netherlands]=$'\U1F1E7\U1F1F6'
emoji_flags[Brazil]=$'\U1F1E7\U1F1F7'
+emoji_flags[BR]=$'\U1F1E7\U1F1F7'
+emoji_flags[BRA]=$'\U1F1E7\U1F1F7'
+emoji_flags[brazil]=$'\U1F1E7\U1F1F7'
emoji_flags[Bahamas]=$'\U1F1E7\U1F1F8'
+emoji_flags[BS]=$'\U1F1E7\U1F1F8'
+emoji_flags[BHS]=$'\U1F1E7\U1F1F8'
+emoji_flags[bahamas]=$'\U1F1E7\U1F1F8'
emoji_flags[Bhutan]=$'\U1F1E7\U1F1F9'
+emoji_flags[BT]=$'\U1F1E7\U1F1F9'
+emoji_flags[BTN]=$'\U1F1E7\U1F1F9'
+emoji_flags[bhutan]=$'\U1F1E7\U1F1F9'
emoji_flags[Bouvet_Island]=$'\U1F1E7\U1F1FB'
+emoji_flags[BV]=$'\U1F1E7\U1F1FB'
+emoji_flags[BVT]=$'\U1F1E7\U1F1FB'
+emoji_flags[bouvet_island]=$'\U1F1E7\U1F1FB'
emoji_flags[Botswana]=$'\U1F1E7\U1F1FC'
+emoji_flags[BW]=$'\U1F1E7\U1F1FC'
+emoji_flags[BWA]=$'\U1F1E7\U1F1FC'
+emoji_flags[botswana]=$'\U1F1E7\U1F1FC'
emoji_flags[Belarus]=$'\U1F1E7\U1F1FE'
+emoji_flags[BY]=$'\U1F1E7\U1F1FE'
+emoji_flags[BLR]=$'\U1F1E7\U1F1FE'
+emoji_flags[belarus]=$'\U1F1E7\U1F1FE'
emoji_flags[Belize]=$'\U1F1E7\U1F1FF'
+emoji_flags[BZ]=$'\U1F1E7\U1F1FF'
+emoji_flags[BLZ]=$'\U1F1E7\U1F1FF'
+emoji_flags[belize]=$'\U1F1E7\U1F1FF'
emoji_flags[Canada]=$'\U1F1E8\U1F1E6'
-emoji_flags[Cocos__Islands]=$'\U1F1E8\U1F1E8'
-emoji_flags[Congo___Kinshasa]=$'\U1F1E8\U1F1E9'
+emoji_flags[CA]=$'\U1F1E8\U1F1E6'
+emoji_flags[CAN]=$'\U1F1E8\U1F1E6'
+emoji_flags[canada]=$'\U1F1E8\U1F1E6'
+emoji_flags[Cocos_Keeling_Islands]=$'\U1F1E8\U1F1E8'
+emoji_flags[CC]=$'\U1F1E8\U1F1E8'
+emoji_flags[CCK]=$'\U1F1E8\U1F1E8'
+emoji_flags[cocos_islands]=$'\U1F1E8\U1F1E8'
+emoji_flags[Congo__Kinshasa]=$'\U1F1E8\U1F1E9'
+emoji_flags[CD]=$'\U1F1E8\U1F1E9'
+emoji_flags[COD]=$'\U1F1E8\U1F1E9'
+emoji_flags[congo_kinshasa]=$'\U1F1E8\U1F1E9'
emoji_flags[Central_African_Republic]=$'\U1F1E8\U1F1EB'
-emoji_flags[Congo___Brazzaville]=$'\U1F1E8\U1F1EC'
+emoji_flags[CF]=$'\U1F1E8\U1F1EB'
+emoji_flags[CAF]=$'\U1F1E8\U1F1EB'
+emoji_flags[central_african_republic]=$'\U1F1E8\U1F1EB'
+emoji_flags[Congo__Brazzaville]=$'\U1F1E8\U1F1EC'
+emoji_flags[CG]=$'\U1F1E8\U1F1EC'
+emoji_flags[COG]=$'\U1F1E8\U1F1EC'
+emoji_flags[congo_brazzaville]=$'\U1F1E8\U1F1EC'
emoji_flags[Switzerland]=$'\U1F1E8\U1F1ED'
-emoji_flags[C_te_d__Ivoire]=$'\U1F1E8\U1F1EE'
+emoji_flags[CH]=$'\U1F1E8\U1F1ED'
+emoji_flags[CHE]=$'\U1F1E8\U1F1ED'
+emoji_flags[switzerland]=$'\U1F1E8\U1F1ED'
+emoji_flags[Côte_d_Ivoire]=$'\U1F1E8\U1F1EE'
+emoji_flags[CI]=$'\U1F1E8\U1F1EE'
+emoji_flags[CIV]=$'\U1F1E8\U1F1EE'
+emoji_flags[cote_divoire]=$'\U1F1E8\U1F1EE'
emoji_flags[Cook_Islands]=$'\U1F1E8\U1F1F0'
+emoji_flags[CK]=$'\U1F1E8\U1F1F0'
+emoji_flags[COK]=$'\U1F1E8\U1F1F0'
+emoji_flags[cook_islands]=$'\U1F1E8\U1F1F0'
emoji_flags[Chile]=$'\U1F1E8\U1F1F1'
+emoji_flags[CL]=$'\U1F1E8\U1F1F1'
+emoji_flags[CHL]=$'\U1F1E8\U1F1F1'
+emoji_flags[chile]=$'\U1F1E8\U1F1F1'
emoji_flags[Cameroon]=$'\U1F1E8\U1F1F2'
+emoji_flags[CM]=$'\U1F1E8\U1F1F2'
+emoji_flags[CMR]=$'\U1F1E8\U1F1F2'
+emoji_flags[cameroon]=$'\U1F1E8\U1F1F2'
emoji_flags[China]=$'\U1F1E8\U1F1F3'
+emoji_flags[CN]=$'\U1F1E8\U1F1F3'
+emoji_flags[CHN]=$'\U1F1E8\U1F1F3'
+emoji_flags[cn]=$'\U1F1E8\U1F1F3'
emoji_flags[Colombia]=$'\U1F1E8\U1F1F4'
+emoji_flags[CO]=$'\U1F1E8\U1F1F4'
+emoji_flags[COL]=$'\U1F1E8\U1F1F4'
+emoji_flags[colombia]=$'\U1F1E8\U1F1F4'
emoji_flags[Clipperton_Island]=$'\U1F1E8\U1F1F5'
+emoji_flags[clipperton_island]=$'\U1F1E8\U1F1F5'
emoji_flags[Costa_Rica]=$'\U1F1E8\U1F1F7'
+emoji_flags[CR]=$'\U1F1E8\U1F1F7'
+emoji_flags[CRI]=$'\U1F1E8\U1F1F7'
+emoji_flags[costa_rica]=$'\U1F1E8\U1F1F7'
emoji_flags[Cuba]=$'\U1F1E8\U1F1FA'
+emoji_flags[CU]=$'\U1F1E8\U1F1FA'
+emoji_flags[CUB]=$'\U1F1E8\U1F1FA'
+emoji_flags[cuba]=$'\U1F1E8\U1F1FA'
emoji_flags[Cape_Verde]=$'\U1F1E8\U1F1FB'
-emoji_flags[Cura_ao]=$'\U1F1E8\U1F1FC'
+emoji_flags[CV]=$'\U1F1E8\U1F1FB'
+emoji_flags[CPV]=$'\U1F1E8\U1F1FB'
+emoji_flags[cape_verde]=$'\U1F1E8\U1F1FB'
+emoji_flags[Curaçao]=$'\U1F1E8\U1F1FC'
+emoji_flags[CW]=$'\U1F1E8\U1F1FC'
+emoji_flags[CUW]=$'\U1F1E8\U1F1FC'
+emoji_flags[curacao]=$'\U1F1E8\U1F1FC'
emoji_flags[Christmas_Island]=$'\U1F1E8\U1F1FD'
+emoji_flags[CX]=$'\U1F1E8\U1F1FD'
+emoji_flags[CXR]=$'\U1F1E8\U1F1FD'
+emoji_flags[christmas_island]=$'\U1F1E8\U1F1FD'
emoji_flags[Cyprus]=$'\U1F1E8\U1F1FE'
-emoji_flags[Czech_Republic]=$'\U1F1E8\U1F1FF'
+emoji_flags[CY]=$'\U1F1E8\U1F1FE'
+emoji_flags[CYP]=$'\U1F1E8\U1F1FE'
+emoji_flags[cyprus]=$'\U1F1E8\U1F1FE'
+emoji_flags[Czechia]=$'\U1F1E8\U1F1FF'
+emoji_flags[CZ]=$'\U1F1E8\U1F1FF'
+emoji_flags[CZE]=$'\U1F1E8\U1F1FF'
+emoji_flags[czech_republic]=$'\U1F1E8\U1F1FF'
emoji_flags[Germany]=$'\U1F1E9\U1F1EA'
+emoji_flags[DE]=$'\U1F1E9\U1F1EA'
+emoji_flags[DEU]=$'\U1F1E9\U1F1EA'
+emoji_flags[de]=$'\U1F1E9\U1F1EA'
emoji_flags[Diego_Garcia]=$'\U1F1E9\U1F1EC'
+emoji_flags[diego_garcia]=$'\U1F1E9\U1F1EC'
emoji_flags[Djibouti]=$'\U1F1E9\U1F1EF'
+emoji_flags[DJ]=$'\U1F1E9\U1F1EF'
+emoji_flags[DJI]=$'\U1F1E9\U1F1EF'
+emoji_flags[djibouti]=$'\U1F1E9\U1F1EF'
emoji_flags[Denmark]=$'\U1F1E9\U1F1F0'
+emoji_flags[DK]=$'\U1F1E9\U1F1F0'
+emoji_flags[DNK]=$'\U1F1E9\U1F1F0'
+emoji_flags[denmark]=$'\U1F1E9\U1F1F0'
emoji_flags[Dominica]=$'\U1F1E9\U1F1F2'
+emoji_flags[DM]=$'\U1F1E9\U1F1F2'
+emoji_flags[DMA]=$'\U1F1E9\U1F1F2'
+emoji_flags[dominica]=$'\U1F1E9\U1F1F2'
emoji_flags[Dominican_Republic]=$'\U1F1E9\U1F1F4'
+emoji_flags[DO]=$'\U1F1E9\U1F1F4'
+emoji_flags[DOM]=$'\U1F1E9\U1F1F4'
+emoji_flags[dominican_republic]=$'\U1F1E9\U1F1F4'
emoji_flags[Algeria]=$'\U1F1E9\U1F1FF'
-emoji_flags[Ceuta___Melilla]=$'\U1F1EA\U1F1E6'
+emoji_flags[DZ]=$'\U1F1E9\U1F1FF'
+emoji_flags[DZA]=$'\U1F1E9\U1F1FF'
+emoji_flags[algeria]=$'\U1F1E9\U1F1FF'
+emoji_flags[Ceuta_and_Melilla]=$'\U1F1EA\U1F1E6'
+emoji_flags[ceuta_melilla]=$'\U1F1EA\U1F1E6'
emoji_flags[Ecuador]=$'\U1F1EA\U1F1E8'
+emoji_flags[EC]=$'\U1F1EA\U1F1E8'
+emoji_flags[ECU]=$'\U1F1EA\U1F1E8'
+emoji_flags[ecuador]=$'\U1F1EA\U1F1E8'
emoji_flags[Estonia]=$'\U1F1EA\U1F1EA'
+emoji_flags[EE]=$'\U1F1EA\U1F1EA'
+emoji_flags[EST]=$'\U1F1EA\U1F1EA'
+emoji_flags[estonia]=$'\U1F1EA\U1F1EA'
emoji_flags[Egypt]=$'\U1F1EA\U1F1EC'
+emoji_flags[EG]=$'\U1F1EA\U1F1EC'
+emoji_flags[EGY]=$'\U1F1EA\U1F1EC'
+emoji_flags[egypt]=$'\U1F1EA\U1F1EC'
emoji_flags[Western_Sahara]=$'\U1F1EA\U1F1ED'
+emoji_flags[EH]=$'\U1F1EA\U1F1ED'
+emoji_flags[ESH]=$'\U1F1EA\U1F1ED'
+emoji_flags[western_sahara]=$'\U1F1EA\U1F1ED'
emoji_flags[Eritrea]=$'\U1F1EA\U1F1F7'
+emoji_flags[ER]=$'\U1F1EA\U1F1F7'
+emoji_flags[ERI]=$'\U1F1EA\U1F1F7'
+emoji_flags[eritrea]=$'\U1F1EA\U1F1F7'
emoji_flags[Spain]=$'\U1F1EA\U1F1F8'
+emoji_flags[ES]=$'\U1F1EA\U1F1F8'
+emoji_flags[ESP]=$'\U1F1EA\U1F1F8'
+emoji_flags[es]=$'\U1F1EA\U1F1F8'
emoji_flags[Ethiopia]=$'\U1F1EA\U1F1F9'
+emoji_flags[ET]=$'\U1F1EA\U1F1F9'
+emoji_flags[ETH]=$'\U1F1EA\U1F1F9'
+emoji_flags[ethiopia]=$'\U1F1EA\U1F1F9'
emoji_flags[European_Union]=$'\U1F1EA\U1F1FA'
+emoji_flags[eu]=$'\U1F1EA\U1F1FA'
+emoji_flags[european_union]=$'\U1F1EA\U1F1FA'
emoji_flags[Finland]=$'\U1F1EB\U1F1EE'
+emoji_flags[FI]=$'\U1F1EB\U1F1EE'
+emoji_flags[FIN]=$'\U1F1EB\U1F1EE'
+emoji_flags[finland]=$'\U1F1EB\U1F1EE'
emoji_flags[Fiji]=$'\U1F1EB\U1F1EF'
+emoji_flags[FJ]=$'\U1F1EB\U1F1EF'
+emoji_flags[FJI]=$'\U1F1EB\U1F1EF'
+emoji_flags[fiji]=$'\U1F1EB\U1F1EF'
emoji_flags[Falkland_Islands]=$'\U1F1EB\U1F1F0'
+emoji_flags[FK]=$'\U1F1EB\U1F1F0'
+emoji_flags[FLK]=$'\U1F1EB\U1F1F0'
+emoji_flags[falkland_islands]=$'\U1F1EB\U1F1F0'
emoji_flags[Micronesia]=$'\U1F1EB\U1F1F2'
+emoji_flags[FM]=$'\U1F1EB\U1F1F2'
+emoji_flags[FSM]=$'\U1F1EB\U1F1F2'
+emoji_flags[micronesia]=$'\U1F1EB\U1F1F2'
emoji_flags[Faroe_Islands]=$'\U1F1EB\U1F1F4'
+emoji_flags[FO]=$'\U1F1EB\U1F1F4'
+emoji_flags[FRO]=$'\U1F1EB\U1F1F4'
+emoji_flags[faroe_islands]=$'\U1F1EB\U1F1F4'
emoji_flags[France]=$'\U1F1EB\U1F1F7'
+emoji_flags[FR]=$'\U1F1EB\U1F1F7'
+emoji_flags[FRA]=$'\U1F1EB\U1F1F7'
+emoji_flags[fr]=$'\U1F1EB\U1F1F7'
emoji_flags[Gabon]=$'\U1F1EC\U1F1E6'
+emoji_flags[GA]=$'\U1F1EC\U1F1E6'
+emoji_flags[GAB]=$'\U1F1EC\U1F1E6'
+emoji_flags[gabon]=$'\U1F1EC\U1F1E6'
emoji_flags[United_Kingdom]=$'\U1F1EC\U1F1E7'
+emoji_flags[GB]=$'\U1F1EC\U1F1E7'
+emoji_flags[GBR]=$'\U1F1EC\U1F1E7'
+emoji_flags[gb]=$'\U1F1EC\U1F1E7'
+emoji_flags[uk]=$'\U1F1EC\U1F1E7'
emoji_flags[Grenada]=$'\U1F1EC\U1F1E9'
+emoji_flags[GD]=$'\U1F1EC\U1F1E9'
+emoji_flags[GRD]=$'\U1F1EC\U1F1E9'
+emoji_flags[grenada]=$'\U1F1EC\U1F1E9'
emoji_flags[Georgia]=$'\U1F1EC\U1F1EA'
+emoji_flags[GE]=$'\U1F1EC\U1F1EA'
+emoji_flags[GEO]=$'\U1F1EC\U1F1EA'
+emoji_flags[georgia]=$'\U1F1EC\U1F1EA'
emoji_flags[French_Guiana]=$'\U1F1EC\U1F1EB'
+emoji_flags[GF]=$'\U1F1EC\U1F1EB'
+emoji_flags[GUF]=$'\U1F1EC\U1F1EB'
+emoji_flags[french_guiana]=$'\U1F1EC\U1F1EB'
emoji_flags[Guernsey]=$'\U1F1EC\U1F1EC'
+emoji_flags[GG]=$'\U1F1EC\U1F1EC'
+emoji_flags[GGY]=$'\U1F1EC\U1F1EC'
+emoji_flags[guernsey]=$'\U1F1EC\U1F1EC'
emoji_flags[Ghana]=$'\U1F1EC\U1F1ED'
+emoji_flags[GH]=$'\U1F1EC\U1F1ED'
+emoji_flags[GHA]=$'\U1F1EC\U1F1ED'
+emoji_flags[ghana]=$'\U1F1EC\U1F1ED'
emoji_flags[Gibraltar]=$'\U1F1EC\U1F1EE'
+emoji_flags[GI]=$'\U1F1EC\U1F1EE'
+emoji_flags[GIB]=$'\U1F1EC\U1F1EE'
+emoji_flags[gibraltar]=$'\U1F1EC\U1F1EE'
emoji_flags[Greenland]=$'\U1F1EC\U1F1F1'
+emoji_flags[GL]=$'\U1F1EC\U1F1F1'
+emoji_flags[GRL]=$'\U1F1EC\U1F1F1'
+emoji_flags[greenland]=$'\U1F1EC\U1F1F1'
emoji_flags[Gambia]=$'\U1F1EC\U1F1F2'
+emoji_flags[GM]=$'\U1F1EC\U1F1F2'
+emoji_flags[GMB]=$'\U1F1EC\U1F1F2'
+emoji_flags[gambia]=$'\U1F1EC\U1F1F2'
emoji_flags[Guinea]=$'\U1F1EC\U1F1F3'
+emoji_flags[GN]=$'\U1F1EC\U1F1F3'
+emoji_flags[GIN]=$'\U1F1EC\U1F1F3'
+emoji_flags[guinea]=$'\U1F1EC\U1F1F3'
emoji_flags[Guadeloupe]=$'\U1F1EC\U1F1F5'
+emoji_flags[GP]=$'\U1F1EC\U1F1F5'
+emoji_flags[GLP]=$'\U1F1EC\U1F1F5'
+emoji_flags[guadeloupe]=$'\U1F1EC\U1F1F5'
emoji_flags[Equatorial_Guinea]=$'\U1F1EC\U1F1F6'
+emoji_flags[GQ]=$'\U1F1EC\U1F1F6'
+emoji_flags[GNQ]=$'\U1F1EC\U1F1F6'
+emoji_flags[equatorial_guinea]=$'\U1F1EC\U1F1F6'
emoji_flags[Greece]=$'\U1F1EC\U1F1F7'
-emoji_flags[South_Georgia___South_Sandwich_Islands]=$'\U1F1EC\U1F1F8'
+emoji_flags[GR]=$'\U1F1EC\U1F1F7'
+emoji_flags[GRC]=$'\U1F1EC\U1F1F7'
+emoji_flags[greece]=$'\U1F1EC\U1F1F7'
+emoji_flags[South_Georgia_and_South_Sandwich_Islands]=$'\U1F1EC\U1F1F8'
+emoji_flags[GS]=$'\U1F1EC\U1F1F8'
+emoji_flags[SGS]=$'\U1F1EC\U1F1F8'
+emoji_flags[south_georgia_south_sandwich_islands]=$'\U1F1EC\U1F1F8'
emoji_flags[Guatemala]=$'\U1F1EC\U1F1F9'
+emoji_flags[GT]=$'\U1F1EC\U1F1F9'
+emoji_flags[GTM]=$'\U1F1EC\U1F1F9'
+emoji_flags[guatemala]=$'\U1F1EC\U1F1F9'
emoji_flags[Guam]=$'\U1F1EC\U1F1FA'
+emoji_flags[GU]=$'\U1F1EC\U1F1FA'
+emoji_flags[GUM]=$'\U1F1EC\U1F1FA'
+emoji_flags[guam]=$'\U1F1EC\U1F1FA'
emoji_flags[Guinea_Bissau]=$'\U1F1EC\U1F1FC'
+emoji_flags[GW]=$'\U1F1EC\U1F1FC'
+emoji_flags[GNB]=$'\U1F1EC\U1F1FC'
+emoji_flags[guinea_bissau]=$'\U1F1EC\U1F1FC'
emoji_flags[Guyana]=$'\U1F1EC\U1F1FE'
-emoji_flags[Hong_Kong]=$'\U1F1ED\U1F1F0'
-emoji_flags[Heard___McDonald_Islands]=$'\U1F1ED\U1F1F2'
+emoji_flags[GY]=$'\U1F1EC\U1F1FE'
+emoji_flags[GUY]=$'\U1F1EC\U1F1FE'
+emoji_flags[guyana]=$'\U1F1EC\U1F1FE'
+emoji_flags[Hong_Kong_SAR_China]=$'\U1F1ED\U1F1F0'
+emoji_flags[HK]=$'\U1F1ED\U1F1F0'
+emoji_flags[HKG]=$'\U1F1ED\U1F1F0'
+emoji_flags[hong_kong]=$'\U1F1ED\U1F1F0'
+emoji_flags[Heard_and_McDonald_Islands]=$'\U1F1ED\U1F1F2'
+emoji_flags[HM]=$'\U1F1ED\U1F1F2'
+emoji_flags[HMD]=$'\U1F1ED\U1F1F2'
+emoji_flags[heard_mcdonald_islands]=$'\U1F1ED\U1F1F2'
emoji_flags[Honduras]=$'\U1F1ED\U1F1F3'
+emoji_flags[HN]=$'\U1F1ED\U1F1F3'
+emoji_flags[HND]=$'\U1F1ED\U1F1F3'
+emoji_flags[honduras]=$'\U1F1ED\U1F1F3'
emoji_flags[Croatia]=$'\U1F1ED\U1F1F7'
+emoji_flags[HR]=$'\U1F1ED\U1F1F7'
+emoji_flags[HRV]=$'\U1F1ED\U1F1F7'
+emoji_flags[croatia]=$'\U1F1ED\U1F1F7'
emoji_flags[Haiti]=$'\U1F1ED\U1F1F9'
+emoji_flags[HT]=$'\U1F1ED\U1F1F9'
+emoji_flags[HTI]=$'\U1F1ED\U1F1F9'
+emoji_flags[haiti]=$'\U1F1ED\U1F1F9'
emoji_flags[Hungary]=$'\U1F1ED\U1F1FA'
+emoji_flags[HU]=$'\U1F1ED\U1F1FA'
+emoji_flags[HUN]=$'\U1F1ED\U1F1FA'
+emoji_flags[hungary]=$'\U1F1ED\U1F1FA'
emoji_flags[Canary_Islands]=$'\U1F1EE\U1F1E8'
+emoji_flags[canary_islands]=$'\U1F1EE\U1F1E8'
emoji_flags[Indonesia]=$'\U1F1EE\U1F1E9'
+emoji_flags[ID]=$'\U1F1EE\U1F1E9'
+emoji_flags[IDN]=$'\U1F1EE\U1F1E9'
+emoji_flags[indonesia]=$'\U1F1EE\U1F1E9'
emoji_flags[Ireland]=$'\U1F1EE\U1F1EA'
+emoji_flags[IE]=$'\U1F1EE\U1F1EA'
+emoji_flags[IRL]=$'\U1F1EE\U1F1EA'
+emoji_flags[ireland]=$'\U1F1EE\U1F1EA'
emoji_flags[Israel]=$'\U1F1EE\U1F1F1'
+emoji_flags[IL]=$'\U1F1EE\U1F1F1'
+emoji_flags[ISR]=$'\U1F1EE\U1F1F1'
+emoji_flags[israel]=$'\U1F1EE\U1F1F1'
emoji_flags[Isle_of_Man]=$'\U1F1EE\U1F1F2'
+emoji_flags[IM]=$'\U1F1EE\U1F1F2'
+emoji_flags[IMN]=$'\U1F1EE\U1F1F2'
+emoji_flags[isle_of_man]=$'\U1F1EE\U1F1F2'
emoji_flags[India]=$'\U1F1EE\U1F1F3'
+emoji_flags[IN]=$'\U1F1EE\U1F1F3'
+emoji_flags[IND]=$'\U1F1EE\U1F1F3'
+emoji_flags[india]=$'\U1F1EE\U1F1F3'
emoji_flags[British_Indian_Ocean_Territory]=$'\U1F1EE\U1F1F4'
+emoji_flags[IO]=$'\U1F1EE\U1F1F4'
+emoji_flags[IOT]=$'\U1F1EE\U1F1F4'
+emoji_flags[british_indian_ocean_territory]=$'\U1F1EE\U1F1F4'
emoji_flags[Iraq]=$'\U1F1EE\U1F1F6'
+emoji_flags[IQ]=$'\U1F1EE\U1F1F6'
+emoji_flags[IRQ]=$'\U1F1EE\U1F1F6'
+emoji_flags[iraq]=$'\U1F1EE\U1F1F6'
emoji_flags[Iran]=$'\U1F1EE\U1F1F7'
+emoji_flags[IR]=$'\U1F1EE\U1F1F7'
+emoji_flags[IRN]=$'\U1F1EE\U1F1F7'
+emoji_flags[iran]=$'\U1F1EE\U1F1F7'
emoji_flags[Iceland]=$'\U1F1EE\U1F1F8'
+emoji_flags[IS]=$'\U1F1EE\U1F1F8'
+emoji_flags[ISL]=$'\U1F1EE\U1F1F8'
+emoji_flags[iceland]=$'\U1F1EE\U1F1F8'
emoji_flags[Italy]=$'\U1F1EE\U1F1F9'
+emoji_flags[IT]=$'\U1F1EE\U1F1F9'
+emoji_flags[ITA]=$'\U1F1EE\U1F1F9'
+emoji_flags[it]=$'\U1F1EE\U1F1F9'
emoji_flags[Jersey]=$'\U1F1EF\U1F1EA'
+emoji_flags[JE]=$'\U1F1EF\U1F1EA'
+emoji_flags[JEY]=$'\U1F1EF\U1F1EA'
+emoji_flags[jersey]=$'\U1F1EF\U1F1EA'
emoji_flags[Jamaica]=$'\U1F1EF\U1F1F2'
+emoji_flags[JM]=$'\U1F1EF\U1F1F2'
+emoji_flags[JAM]=$'\U1F1EF\U1F1F2'
+emoji_flags[jamaica]=$'\U1F1EF\U1F1F2'
emoji_flags[Jordan]=$'\U1F1EF\U1F1F4'
+emoji_flags[JO]=$'\U1F1EF\U1F1F4'
+emoji_flags[JOR]=$'\U1F1EF\U1F1F4'
+emoji_flags[jordan]=$'\U1F1EF\U1F1F4'
emoji_flags[Japan]=$'\U1F1EF\U1F1F5'
+emoji_flags[JP]=$'\U1F1EF\U1F1F5'
+emoji_flags[JPN]=$'\U1F1EF\U1F1F5'
+emoji_flags[jp]=$'\U1F1EF\U1F1F5'
emoji_flags[Kenya]=$'\U1F1F0\U1F1EA'
+emoji_flags[KE]=$'\U1F1F0\U1F1EA'
+emoji_flags[KEN]=$'\U1F1F0\U1F1EA'
+emoji_flags[kenya]=$'\U1F1F0\U1F1EA'
emoji_flags[Kyrgyzstan]=$'\U1F1F0\U1F1EC'
+emoji_flags[KG]=$'\U1F1F0\U1F1EC'
+emoji_flags[KGZ]=$'\U1F1F0\U1F1EC'
+emoji_flags[kyrgyzstan]=$'\U1F1F0\U1F1EC'
emoji_flags[Cambodia]=$'\U1F1F0\U1F1ED'
+emoji_flags[KH]=$'\U1F1F0\U1F1ED'
+emoji_flags[KHM]=$'\U1F1F0\U1F1ED'
+emoji_flags[cambodia]=$'\U1F1F0\U1F1ED'
emoji_flags[Kiribati]=$'\U1F1F0\U1F1EE'
+emoji_flags[KI]=$'\U1F1F0\U1F1EE'
+emoji_flags[KIR]=$'\U1F1F0\U1F1EE'
+emoji_flags[kiribati]=$'\U1F1F0\U1F1EE'
emoji_flags[Comoros]=$'\U1F1F0\U1F1F2'
-emoji_flags[St__Kitts___Nevis]=$'\U1F1F0\U1F1F3'
+emoji_flags[KM]=$'\U1F1F0\U1F1F2'
+emoji_flags[COM]=$'\U1F1F0\U1F1F2'
+emoji_flags[comoros]=$'\U1F1F0\U1F1F2'
+emoji_flags[St_Kitts_and_Nevis]=$'\U1F1F0\U1F1F3'
+emoji_flags[KN]=$'\U1F1F0\U1F1F3'
+emoji_flags[KNA]=$'\U1F1F0\U1F1F3'
+emoji_flags[st_kitts_nevis]=$'\U1F1F0\U1F1F3'
emoji_flags[North_Korea]=$'\U1F1F0\U1F1F5'
+emoji_flags[KP]=$'\U1F1F0\U1F1F5'
+emoji_flags[PRK]=$'\U1F1F0\U1F1F5'
+emoji_flags[north_korea]=$'\U1F1F0\U1F1F5'
emoji_flags[South_Korea]=$'\U1F1F0\U1F1F7'
+emoji_flags[KR]=$'\U1F1F0\U1F1F7'
+emoji_flags[KOR]=$'\U1F1F0\U1F1F7'
+emoji_flags[kr]=$'\U1F1F0\U1F1F7'
emoji_flags[Kuwait]=$'\U1F1F0\U1F1FC'
+emoji_flags[KW]=$'\U1F1F0\U1F1FC'
+emoji_flags[KWT]=$'\U1F1F0\U1F1FC'
+emoji_flags[kuwait]=$'\U1F1F0\U1F1FC'
emoji_flags[Cayman_Islands]=$'\U1F1F0\U1F1FE'
+emoji_flags[KY]=$'\U1F1F0\U1F1FE'
+emoji_flags[CYM]=$'\U1F1F0\U1F1FE'
+emoji_flags[cayman_islands]=$'\U1F1F0\U1F1FE'
emoji_flags[Kazakhstan]=$'\U1F1F0\U1F1FF'
+emoji_flags[KZ]=$'\U1F1F0\U1F1FF'
+emoji_flags[KAZ]=$'\U1F1F0\U1F1FF'
+emoji_flags[kazakhstan]=$'\U1F1F0\U1F1FF'
emoji_flags[Laos]=$'\U1F1F1\U1F1E6'
+emoji_flags[LA]=$'\U1F1F1\U1F1E6'
+emoji_flags[LAO]=$'\U1F1F1\U1F1E6'
+emoji_flags[laos]=$'\U1F1F1\U1F1E6'
emoji_flags[Lebanon]=$'\U1F1F1\U1F1E7'
-emoji_flags[St__Lucia]=$'\U1F1F1\U1F1E8'
+emoji_flags[LB]=$'\U1F1F1\U1F1E7'
+emoji_flags[LBN]=$'\U1F1F1\U1F1E7'
+emoji_flags[lebanon]=$'\U1F1F1\U1F1E7'
+emoji_flags[St_Lucia]=$'\U1F1F1\U1F1E8'
+emoji_flags[LC]=$'\U1F1F1\U1F1E8'
+emoji_flags[LCA]=$'\U1F1F1\U1F1E8'
+emoji_flags[st_lucia]=$'\U1F1F1\U1F1E8'
emoji_flags[Liechtenstein]=$'\U1F1F1\U1F1EE'
+emoji_flags[LI]=$'\U1F1F1\U1F1EE'
+emoji_flags[LIE]=$'\U1F1F1\U1F1EE'
+emoji_flags[liechtenstein]=$'\U1F1F1\U1F1EE'
emoji_flags[Sri_Lanka]=$'\U1F1F1\U1F1F0'
+emoji_flags[LK]=$'\U1F1F1\U1F1F0'
+emoji_flags[LKA]=$'\U1F1F1\U1F1F0'
+emoji_flags[sri_lanka]=$'\U1F1F1\U1F1F0'
emoji_flags[Liberia]=$'\U1F1F1\U1F1F7'
+emoji_flags[LR]=$'\U1F1F1\U1F1F7'
+emoji_flags[LBR]=$'\U1F1F1\U1F1F7'
+emoji_flags[liberia]=$'\U1F1F1\U1F1F7'
emoji_flags[Lesotho]=$'\U1F1F1\U1F1F8'
+emoji_flags[LS]=$'\U1F1F1\U1F1F8'
+emoji_flags[LSO]=$'\U1F1F1\U1F1F8'
+emoji_flags[lesotho]=$'\U1F1F1\U1F1F8'
emoji_flags[Lithuania]=$'\U1F1F1\U1F1F9'
+emoji_flags[LT]=$'\U1F1F1\U1F1F9'
+emoji_flags[LTU]=$'\U1F1F1\U1F1F9'
+emoji_flags[lithuania]=$'\U1F1F1\U1F1F9'
emoji_flags[Luxembourg]=$'\U1F1F1\U1F1FA'
+emoji_flags[LU]=$'\U1F1F1\U1F1FA'
+emoji_flags[LUX]=$'\U1F1F1\U1F1FA'
+emoji_flags[luxembourg]=$'\U1F1F1\U1F1FA'
emoji_flags[Latvia]=$'\U1F1F1\U1F1FB'
+emoji_flags[LV]=$'\U1F1F1\U1F1FB'
+emoji_flags[LVA]=$'\U1F1F1\U1F1FB'
+emoji_flags[latvia]=$'\U1F1F1\U1F1FB'
emoji_flags[Libya]=$'\U1F1F1\U1F1FE'
+emoji_flags[LY]=$'\U1F1F1\U1F1FE'
+emoji_flags[LBY]=$'\U1F1F1\U1F1FE'
+emoji_flags[libya]=$'\U1F1F1\U1F1FE'
emoji_flags[Morocco]=$'\U1F1F2\U1F1E6'
+emoji_flags[MA]=$'\U1F1F2\U1F1E6'
+emoji_flags[MAR]=$'\U1F1F2\U1F1E6'
+emoji_flags[morocco]=$'\U1F1F2\U1F1E6'
emoji_flags[Monaco]=$'\U1F1F2\U1F1E8'
+emoji_flags[MC]=$'\U1F1F2\U1F1E8'
+emoji_flags[MCO]=$'\U1F1F2\U1F1E8'
+emoji_flags[monaco]=$'\U1F1F2\U1F1E8'
emoji_flags[Moldova]=$'\U1F1F2\U1F1E9'
+emoji_flags[MD]=$'\U1F1F2\U1F1E9'
+emoji_flags[MDA]=$'\U1F1F2\U1F1E9'
+emoji_flags[moldova]=$'\U1F1F2\U1F1E9'
emoji_flags[Montenegro]=$'\U1F1F2\U1F1EA'
-emoji_flags[St__Martin]=$'\U1F1F2\U1F1EB'
+emoji_flags[ME]=$'\U1F1F2\U1F1EA'
+emoji_flags[MNE]=$'\U1F1F2\U1F1EA'
+emoji_flags[montenegro]=$'\U1F1F2\U1F1EA'
+emoji_flags[St_Martin]=$'\U1F1F2\U1F1EB'
+emoji_flags[MF]=$'\U1F1F2\U1F1EB'
+emoji_flags[MAF]=$'\U1F1F2\U1F1EB'
+emoji_flags[st_martin]=$'\U1F1F2\U1F1EB'
emoji_flags[Madagascar]=$'\U1F1F2\U1F1EC'
+emoji_flags[MG]=$'\U1F1F2\U1F1EC'
+emoji_flags[MDG]=$'\U1F1F2\U1F1EC'
+emoji_flags[madagascar]=$'\U1F1F2\U1F1EC'
emoji_flags[Marshall_Islands]=$'\U1F1F2\U1F1ED'
+emoji_flags[MH]=$'\U1F1F2\U1F1ED'
+emoji_flags[MHL]=$'\U1F1F2\U1F1ED'
+emoji_flags[marshall_islands]=$'\U1F1F2\U1F1ED'
emoji_flags[Macedonia]=$'\U1F1F2\U1F1F0'
+emoji_flags[MK]=$'\U1F1F2\U1F1F0'
+emoji_flags[MKD]=$'\U1F1F2\U1F1F0'
+emoji_flags[macedonia]=$'\U1F1F2\U1F1F0'
emoji_flags[Mali]=$'\U1F1F2\U1F1F1'
-emoji_flags[Myanmar]=$'\U1F1F2\U1F1F2'
+emoji_flags[ML]=$'\U1F1F2\U1F1F1'
+emoji_flags[MLI]=$'\U1F1F2\U1F1F1'
+emoji_flags[mali]=$'\U1F1F2\U1F1F1'
+emoji_flags[Myanmar_Burma_]=$'\U1F1F2\U1F1F2'
+emoji_flags[MM]=$'\U1F1F2\U1F1F2'
+emoji_flags[MMR]=$'\U1F1F2\U1F1F2'
+emoji_flags[myanmar]=$'\U1F1F2\U1F1F2'
emoji_flags[Mongolia]=$'\U1F1F2\U1F1F3'
-emoji_flags[Macau]=$'\U1F1F2\U1F1F4'
+emoji_flags[MN]=$'\U1F1F2\U1F1F3'
+emoji_flags[MNG]=$'\U1F1F2\U1F1F3'
+emoji_flags[mongolia]=$'\U1F1F2\U1F1F3'
+emoji_flags[Macao_SAR_China]=$'\U1F1F2\U1F1F4'
+emoji_flags[MO]=$'\U1F1F2\U1F1F4'
+emoji_flags[MAC]=$'\U1F1F2\U1F1F4'
+emoji_flags[macau]=$'\U1F1F2\U1F1F4'
emoji_flags[Northern_Mariana_Islands]=$'\U1F1F2\U1F1F5'
+emoji_flags[MP]=$'\U1F1F2\U1F1F5'
+emoji_flags[MNP]=$'\U1F1F2\U1F1F5'
+emoji_flags[northern_mariana_islands]=$'\U1F1F2\U1F1F5'
emoji_flags[Martinique]=$'\U1F1F2\U1F1F6'
+emoji_flags[MQ]=$'\U1F1F2\U1F1F6'
+emoji_flags[MTQ]=$'\U1F1F2\U1F1F6'
+emoji_flags[martinique]=$'\U1F1F2\U1F1F6'
emoji_flags[Mauritania]=$'\U1F1F2\U1F1F7'
+emoji_flags[MR]=$'\U1F1F2\U1F1F7'
+emoji_flags[MRT]=$'\U1F1F2\U1F1F7'
+emoji_flags[mauritania]=$'\U1F1F2\U1F1F7'
emoji_flags[Montserrat]=$'\U1F1F2\U1F1F8'
+emoji_flags[MS]=$'\U1F1F2\U1F1F8'
+emoji_flags[MSR]=$'\U1F1F2\U1F1F8'
+emoji_flags[montserrat]=$'\U1F1F2\U1F1F8'
emoji_flags[Malta]=$'\U1F1F2\U1F1F9'
+emoji_flags[MT]=$'\U1F1F2\U1F1F9'
+emoji_flags[MLT]=$'\U1F1F2\U1F1F9'
+emoji_flags[malta]=$'\U1F1F2\U1F1F9'
emoji_flags[Mauritius]=$'\U1F1F2\U1F1FA'
+emoji_flags[MU]=$'\U1F1F2\U1F1FA'
+emoji_flags[MUS]=$'\U1F1F2\U1F1FA'
+emoji_flags[mauritius]=$'\U1F1F2\U1F1FA'
emoji_flags[Maldives]=$'\U1F1F2\U1F1FB'
+emoji_flags[MV]=$'\U1F1F2\U1F1FB'
+emoji_flags[MDV]=$'\U1F1F2\U1F1FB'
+emoji_flags[maldives]=$'\U1F1F2\U1F1FB'
emoji_flags[Malawi]=$'\U1F1F2\U1F1FC'
+emoji_flags[MW]=$'\U1F1F2\U1F1FC'
+emoji_flags[MWI]=$'\U1F1F2\U1F1FC'
+emoji_flags[malawi]=$'\U1F1F2\U1F1FC'
emoji_flags[Mexico]=$'\U1F1F2\U1F1FD'
+emoji_flags[MX]=$'\U1F1F2\U1F1FD'
+emoji_flags[MEX]=$'\U1F1F2\U1F1FD'
+emoji_flags[mexico]=$'\U1F1F2\U1F1FD'
emoji_flags[Malaysia]=$'\U1F1F2\U1F1FE'
+emoji_flags[MY]=$'\U1F1F2\U1F1FE'
+emoji_flags[MYS]=$'\U1F1F2\U1F1FE'
+emoji_flags[malaysia]=$'\U1F1F2\U1F1FE'
emoji_flags[Mozambique]=$'\U1F1F2\U1F1FF'
+emoji_flags[MZ]=$'\U1F1F2\U1F1FF'
+emoji_flags[MOZ]=$'\U1F1F2\U1F1FF'
+emoji_flags[mozambique]=$'\U1F1F2\U1F1FF'
emoji_flags[Namibia]=$'\U1F1F3\U1F1E6'
+emoji_flags[NA]=$'\U1F1F3\U1F1E6'
+emoji_flags[NAM]=$'\U1F1F3\U1F1E6'
+emoji_flags[namibia]=$'\U1F1F3\U1F1E6'
emoji_flags[New_Caledonia]=$'\U1F1F3\U1F1E8'
+emoji_flags[NC]=$'\U1F1F3\U1F1E8'
+emoji_flags[NCL]=$'\U1F1F3\U1F1E8'
+emoji_flags[new_caledonia]=$'\U1F1F3\U1F1E8'
emoji_flags[Niger]=$'\U1F1F3\U1F1EA'
+emoji_flags[NE]=$'\U1F1F3\U1F1EA'
+emoji_flags[NER]=$'\U1F1F3\U1F1EA'
+emoji_flags[niger]=$'\U1F1F3\U1F1EA'
emoji_flags[Norfolk_Island]=$'\U1F1F3\U1F1EB'
+emoji_flags[NF]=$'\U1F1F3\U1F1EB'
+emoji_flags[NFK]=$'\U1F1F3\U1F1EB'
+emoji_flags[norfolk_island]=$'\U1F1F3\U1F1EB'
emoji_flags[Nigeria]=$'\U1F1F3\U1F1EC'
+emoji_flags[NG]=$'\U1F1F3\U1F1EC'
+emoji_flags[NGA]=$'\U1F1F3\U1F1EC'
+emoji_flags[nigeria]=$'\U1F1F3\U1F1EC'
emoji_flags[Nicaragua]=$'\U1F1F3\U1F1EE'
+emoji_flags[NI]=$'\U1F1F3\U1F1EE'
+emoji_flags[NIC]=$'\U1F1F3\U1F1EE'
+emoji_flags[nicaragua]=$'\U1F1F3\U1F1EE'
emoji_flags[Netherlands]=$'\U1F1F3\U1F1F1'
+emoji_flags[NL]=$'\U1F1F3\U1F1F1'
+emoji_flags[NLD]=$'\U1F1F3\U1F1F1'
+emoji_flags[netherlands]=$'\U1F1F3\U1F1F1'
emoji_flags[Norway]=$'\U1F1F3\U1F1F4'
+emoji_flags[NO]=$'\U1F1F3\U1F1F4'
+emoji_flags[NOR]=$'\U1F1F3\U1F1F4'
+emoji_flags[norway]=$'\U1F1F3\U1F1F4'
emoji_flags[Nepal]=$'\U1F1F3\U1F1F5'
+emoji_flags[NP]=$'\U1F1F3\U1F1F5'
+emoji_flags[NPL]=$'\U1F1F3\U1F1F5'
+emoji_flags[nepal]=$'\U1F1F3\U1F1F5'
emoji_flags[Nauru]=$'\U1F1F3\U1F1F7'
+emoji_flags[NR]=$'\U1F1F3\U1F1F7'
+emoji_flags[NRU]=$'\U1F1F3\U1F1F7'
+emoji_flags[nauru]=$'\U1F1F3\U1F1F7'
emoji_flags[Niue]=$'\U1F1F3\U1F1FA'
+emoji_flags[NU]=$'\U1F1F3\U1F1FA'
+emoji_flags[NIU]=$'\U1F1F3\U1F1FA'
+emoji_flags[niue]=$'\U1F1F3\U1F1FA'
emoji_flags[New_Zealand]=$'\U1F1F3\U1F1FF'
+emoji_flags[NZ]=$'\U1F1F3\U1F1FF'
+emoji_flags[NZL]=$'\U1F1F3\U1F1FF'
+emoji_flags[new_zealand]=$'\U1F1F3\U1F1FF'
emoji_flags[Oman]=$'\U1F1F4\U1F1F2'
+emoji_flags[OM]=$'\U1F1F4\U1F1F2'
+emoji_flags[OMN]=$'\U1F1F4\U1F1F2'
+emoji_flags[oman]=$'\U1F1F4\U1F1F2'
emoji_flags[Panama]=$'\U1F1F5\U1F1E6'
+emoji_flags[PA]=$'\U1F1F5\U1F1E6'
+emoji_flags[PAN]=$'\U1F1F5\U1F1E6'
+emoji_flags[panama]=$'\U1F1F5\U1F1E6'
emoji_flags[Peru]=$'\U1F1F5\U1F1EA'
+emoji_flags[PE]=$'\U1F1F5\U1F1EA'
+emoji_flags[PER]=$'\U1F1F5\U1F1EA'
+emoji_flags[peru]=$'\U1F1F5\U1F1EA'
emoji_flags[French_Polynesia]=$'\U1F1F5\U1F1EB'
+emoji_flags[PF]=$'\U1F1F5\U1F1EB'
+emoji_flags[PYF]=$'\U1F1F5\U1F1EB'
+emoji_flags[french_polynesia]=$'\U1F1F5\U1F1EB'
emoji_flags[Papua_New_Guinea]=$'\U1F1F5\U1F1EC'
+emoji_flags[PG]=$'\U1F1F5\U1F1EC'
+emoji_flags[PNG]=$'\U1F1F5\U1F1EC'
+emoji_flags[papua_new_guinea]=$'\U1F1F5\U1F1EC'
emoji_flags[Philippines]=$'\U1F1F5\U1F1ED'
+emoji_flags[PH]=$'\U1F1F5\U1F1ED'
+emoji_flags[PHL]=$'\U1F1F5\U1F1ED'
+emoji_flags[philippines]=$'\U1F1F5\U1F1ED'
emoji_flags[Pakistan]=$'\U1F1F5\U1F1F0'
+emoji_flags[PK]=$'\U1F1F5\U1F1F0'
+emoji_flags[PAK]=$'\U1F1F5\U1F1F0'
+emoji_flags[pakistan]=$'\U1F1F5\U1F1F0'
emoji_flags[Poland]=$'\U1F1F5\U1F1F1'
-emoji_flags[St__Pierre___Miquelon]=$'\U1F1F5\U1F1F2'
+emoji_flags[PL]=$'\U1F1F5\U1F1F1'
+emoji_flags[POL]=$'\U1F1F5\U1F1F1'
+emoji_flags[poland]=$'\U1F1F5\U1F1F1'
+emoji_flags[St_Pierre_and_Miquelon]=$'\U1F1F5\U1F1F2'
+emoji_flags[PM]=$'\U1F1F5\U1F1F2'
+emoji_flags[SPM]=$'\U1F1F5\U1F1F2'
+emoji_flags[st_pierre_miquelon]=$'\U1F1F5\U1F1F2'
emoji_flags[Pitcairn_Islands]=$'\U1F1F5\U1F1F3'
+emoji_flags[PN]=$'\U1F1F5\U1F1F3'
+emoji_flags[PCN]=$'\U1F1F5\U1F1F3'
+emoji_flags[pitcairn_islands]=$'\U1F1F5\U1F1F3'
emoji_flags[Puerto_Rico]=$'\U1F1F5\U1F1F7'
+emoji_flags[PR]=$'\U1F1F5\U1F1F7'
+emoji_flags[PRI]=$'\U1F1F5\U1F1F7'
+emoji_flags[puerto_rico]=$'\U1F1F5\U1F1F7'
emoji_flags[Palestinian_Territories]=$'\U1F1F5\U1F1F8'
+emoji_flags[PS]=$'\U1F1F5\U1F1F8'
+emoji_flags[PSE]=$'\U1F1F5\U1F1F8'
+emoji_flags[palestinian_territories]=$'\U1F1F5\U1F1F8'
emoji_flags[Portugal]=$'\U1F1F5\U1F1F9'
+emoji_flags[PT]=$'\U1F1F5\U1F1F9'
+emoji_flags[PRT]=$'\U1F1F5\U1F1F9'
+emoji_flags[portugal]=$'\U1F1F5\U1F1F9'
emoji_flags[Palau]=$'\U1F1F5\U1F1FC'
+emoji_flags[PW]=$'\U1F1F5\U1F1FC'
+emoji_flags[PLW]=$'\U1F1F5\U1F1FC'
+emoji_flags[palau]=$'\U1F1F5\U1F1FC'
emoji_flags[Paraguay]=$'\U1F1F5\U1F1FE'
+emoji_flags[PY]=$'\U1F1F5\U1F1FE'
+emoji_flags[PRY]=$'\U1F1F5\U1F1FE'
+emoji_flags[paraguay]=$'\U1F1F5\U1F1FE'
emoji_flags[Qatar]=$'\U1F1F6\U1F1E6'
-emoji_flags[R_union]=$'\U1F1F7\U1F1EA'
+emoji_flags[QA]=$'\U1F1F6\U1F1E6'
+emoji_flags[QAT]=$'\U1F1F6\U1F1E6'
+emoji_flags[qatar]=$'\U1F1F6\U1F1E6'
+emoji_flags[Réunion]=$'\U1F1F7\U1F1EA'
+emoji_flags[RE]=$'\U1F1F7\U1F1EA'
+emoji_flags[REU]=$'\U1F1F7\U1F1EA'
+emoji_flags[reunion]=$'\U1F1F7\U1F1EA'
emoji_flags[Romania]=$'\U1F1F7\U1F1F4'
+emoji_flags[RO]=$'\U1F1F7\U1F1F4'
+emoji_flags[ROU]=$'\U1F1F7\U1F1F4'
+emoji_flags[romania]=$'\U1F1F7\U1F1F4'
emoji_flags[Serbia]=$'\U1F1F7\U1F1F8'
+emoji_flags[RS]=$'\U1F1F7\U1F1F8'
+emoji_flags[SRB]=$'\U1F1F7\U1F1F8'
+emoji_flags[serbia]=$'\U1F1F7\U1F1F8'
emoji_flags[Russia]=$'\U1F1F7\U1F1FA'
+emoji_flags[RU]=$'\U1F1F7\U1F1FA'
+emoji_flags[RUS]=$'\U1F1F7\U1F1FA'
+emoji_flags[ru]=$'\U1F1F7\U1F1FA'
emoji_flags[Rwanda]=$'\U1F1F7\U1F1FC'
+emoji_flags[RW]=$'\U1F1F7\U1F1FC'
+emoji_flags[RWA]=$'\U1F1F7\U1F1FC'
+emoji_flags[rwanda]=$'\U1F1F7\U1F1FC'
emoji_flags[Saudi_Arabia]=$'\U1F1F8\U1F1E6'
+emoji_flags[SA]=$'\U1F1F8\U1F1E6'
+emoji_flags[SAU]=$'\U1F1F8\U1F1E6'
+emoji_flags[saudi_arabia]=$'\U1F1F8\U1F1E6'
emoji_flags[Solomon_Islands]=$'\U1F1F8\U1F1E7'
+emoji_flags[SB]=$'\U1F1F8\U1F1E7'
+emoji_flags[SLB]=$'\U1F1F8\U1F1E7'
+emoji_flags[solomon_islands]=$'\U1F1F8\U1F1E7'
emoji_flags[Seychelles]=$'\U1F1F8\U1F1E8'
+emoji_flags[SC]=$'\U1F1F8\U1F1E8'
+emoji_flags[SYC]=$'\U1F1F8\U1F1E8'
+emoji_flags[seychelles]=$'\U1F1F8\U1F1E8'
emoji_flags[Sudan]=$'\U1F1F8\U1F1E9'
+emoji_flags[SD]=$'\U1F1F8\U1F1E9'
+emoji_flags[SDN]=$'\U1F1F8\U1F1E9'
+emoji_flags[sudan]=$'\U1F1F8\U1F1E9'
emoji_flags[Sweden]=$'\U1F1F8\U1F1EA'
+emoji_flags[SE]=$'\U1F1F8\U1F1EA'
+emoji_flags[SWE]=$'\U1F1F8\U1F1EA'
+emoji_flags[sweden]=$'\U1F1F8\U1F1EA'
emoji_flags[Singapore]=$'\U1F1F8\U1F1EC'
-emoji_flags[St__Helena]=$'\U1F1F8\U1F1ED'
+emoji_flags[SG]=$'\U1F1F8\U1F1EC'
+emoji_flags[SGP]=$'\U1F1F8\U1F1EC'
+emoji_flags[singapore]=$'\U1F1F8\U1F1EC'
+emoji_flags[St_Helena]=$'\U1F1F8\U1F1ED'
+emoji_flags[SH]=$'\U1F1F8\U1F1ED'
+emoji_flags[SHN]=$'\U1F1F8\U1F1ED'
+emoji_flags[st_helena]=$'\U1F1F8\U1F1ED'
emoji_flags[Slovenia]=$'\U1F1F8\U1F1EE'
-emoji_flags[Svalbard___Jan_Mayen]=$'\U1F1F8\U1F1EF'
+emoji_flags[SI]=$'\U1F1F8\U1F1EE'
+emoji_flags[SVN]=$'\U1F1F8\U1F1EE'
+emoji_flags[slovenia]=$'\U1F1F8\U1F1EE'
+emoji_flags[Svalbard_and_Jan_Mayen]=$'\U1F1F8\U1F1EF'
+emoji_flags[SJ]=$'\U1F1F8\U1F1EF'
+emoji_flags[SJM]=$'\U1F1F8\U1F1EF'
+emoji_flags[svalbard_jan_mayen]=$'\U1F1F8\U1F1EF'
emoji_flags[Slovakia]=$'\U1F1F8\U1F1F0'
+emoji_flags[SK]=$'\U1F1F8\U1F1F0'
+emoji_flags[SVK]=$'\U1F1F8\U1F1F0'
+emoji_flags[slovakia]=$'\U1F1F8\U1F1F0'
emoji_flags[Sierra_Leone]=$'\U1F1F8\U1F1F1'
+emoji_flags[SL]=$'\U1F1F8\U1F1F1'
+emoji_flags[SLE]=$'\U1F1F8\U1F1F1'
+emoji_flags[sierra_leone]=$'\U1F1F8\U1F1F1'
emoji_flags[San_Marino]=$'\U1F1F8\U1F1F2'
+emoji_flags[SM]=$'\U1F1F8\U1F1F2'
+emoji_flags[SMR]=$'\U1F1F8\U1F1F2'
+emoji_flags[san_marino]=$'\U1F1F8\U1F1F2'
emoji_flags[Senegal]=$'\U1F1F8\U1F1F3'
+emoji_flags[SN]=$'\U1F1F8\U1F1F3'
+emoji_flags[SEN]=$'\U1F1F8\U1F1F3'
+emoji_flags[senegal]=$'\U1F1F8\U1F1F3'
emoji_flags[Somalia]=$'\U1F1F8\U1F1F4'
+emoji_flags[SO]=$'\U1F1F8\U1F1F4'
+emoji_flags[SOM]=$'\U1F1F8\U1F1F4'
+emoji_flags[somalia]=$'\U1F1F8\U1F1F4'
emoji_flags[Suriname]=$'\U1F1F8\U1F1F7'
+emoji_flags[SR]=$'\U1F1F8\U1F1F7'
+emoji_flags[SUR]=$'\U1F1F8\U1F1F7'
+emoji_flags[suriname]=$'\U1F1F8\U1F1F7'
emoji_flags[South_Sudan]=$'\U1F1F8\U1F1F8'
-emoji_flags[S_o_Tom____Pr_ncipe]=$'\U1F1F8\U1F1F9'
+emoji_flags[SS]=$'\U1F1F8\U1F1F8'
+emoji_flags[SSD]=$'\U1F1F8\U1F1F8'
+emoji_flags[south_sudan]=$'\U1F1F8\U1F1F8'
+emoji_flags[São_Tomé_and_Príncipe]=$'\U1F1F8\U1F1F9'
+emoji_flags[sao_tome_principe]=$'\U1F1F8\U1F1F9'
emoji_flags[El_Salvador]=$'\U1F1F8\U1F1FB'
+emoji_flags[SV]=$'\U1F1F8\U1F1FB'
+emoji_flags[SLV]=$'\U1F1F8\U1F1FB'
+emoji_flags[el_salvador]=$'\U1F1F8\U1F1FB'
emoji_flags[Sint_Maarten]=$'\U1F1F8\U1F1FD'
+emoji_flags[SX]=$'\U1F1F8\U1F1FD'
+emoji_flags[SXM]=$'\U1F1F8\U1F1FD'
+emoji_flags[sint_maarten]=$'\U1F1F8\U1F1FD'
emoji_flags[Syria]=$'\U1F1F8\U1F1FE'
-emoji_flags[Swaziland]=$'\U1F1F8\U1F1FF'
+emoji_flags[SY]=$'\U1F1F8\U1F1FE'
+emoji_flags[SYR]=$'\U1F1F8\U1F1FE'
+emoji_flags[syria]=$'\U1F1F8\U1F1FE'
+emoji_flags[Eswatini]=$'\U1F1F8\U1F1FF'
+emoji_flags[SZ]=$'\U1F1F8\U1F1FF'
+emoji_flags[SWZ]=$'\U1F1F8\U1F1FF'
+emoji_flags[swaziland]=$'\U1F1F8\U1F1FF'
emoji_flags[Tristan_da_Cunha]=$'\U1F1F9\U1F1E6'
-emoji_flags[Turks___Caicos_Islands]=$'\U1F1F9\U1F1E8'
+emoji_flags[tristan_da_cunha]=$'\U1F1F9\U1F1E6'
+emoji_flags[Turks_and_Caicos_Islands]=$'\U1F1F9\U1F1E8'
+emoji_flags[TC]=$'\U1F1F9\U1F1E8'
+emoji_flags[TCA]=$'\U1F1F9\U1F1E8'
+emoji_flags[turks_caicos_islands]=$'\U1F1F9\U1F1E8'
emoji_flags[Chad]=$'\U1F1F9\U1F1E9'
+emoji_flags[TD]=$'\U1F1F9\U1F1E9'
+emoji_flags[TCD]=$'\U1F1F9\U1F1E9'
+emoji_flags[chad]=$'\U1F1F9\U1F1E9'
emoji_flags[French_Southern_Territories]=$'\U1F1F9\U1F1EB'
+emoji_flags[TF]=$'\U1F1F9\U1F1EB'
+emoji_flags[ATF]=$'\U1F1F9\U1F1EB'
+emoji_flags[french_southern_territories]=$'\U1F1F9\U1F1EB'
emoji_flags[Togo]=$'\U1F1F9\U1F1EC'
+emoji_flags[TG]=$'\U1F1F9\U1F1EC'
+emoji_flags[TGO]=$'\U1F1F9\U1F1EC'
+emoji_flags[togo]=$'\U1F1F9\U1F1EC'
emoji_flags[Thailand]=$'\U1F1F9\U1F1ED'
+emoji_flags[TH]=$'\U1F1F9\U1F1ED'
+emoji_flags[THA]=$'\U1F1F9\U1F1ED'
+emoji_flags[thailand]=$'\U1F1F9\U1F1ED'
emoji_flags[Tajikistan]=$'\U1F1F9\U1F1EF'
+emoji_flags[TJ]=$'\U1F1F9\U1F1EF'
+emoji_flags[TJK]=$'\U1F1F9\U1F1EF'
+emoji_flags[tajikistan]=$'\U1F1F9\U1F1EF'
emoji_flags[Tokelau]=$'\U1F1F9\U1F1F0'
+emoji_flags[TK]=$'\U1F1F9\U1F1F0'
+emoji_flags[TKL]=$'\U1F1F9\U1F1F0'
+emoji_flags[tokelau]=$'\U1F1F9\U1F1F0'
emoji_flags[Timor_Leste]=$'\U1F1F9\U1F1F1'
+emoji_flags[TL]=$'\U1F1F9\U1F1F1'
+emoji_flags[TLS]=$'\U1F1F9\U1F1F1'
+emoji_flags[timor_leste]=$'\U1F1F9\U1F1F1'
emoji_flags[Turkmenistan]=$'\U1F1F9\U1F1F2'
+emoji_flags[TM]=$'\U1F1F9\U1F1F2'
+emoji_flags[TKM]=$'\U1F1F9\U1F1F2'
+emoji_flags[turkmenistan]=$'\U1F1F9\U1F1F2'
emoji_flags[Tunisia]=$'\U1F1F9\U1F1F3'
+emoji_flags[TN]=$'\U1F1F9\U1F1F3'
+emoji_flags[TUN]=$'\U1F1F9\U1F1F3'
+emoji_flags[tunisia]=$'\U1F1F9\U1F1F3'
emoji_flags[Tonga]=$'\U1F1F9\U1F1F4'
+emoji_flags[TO]=$'\U1F1F9\U1F1F4'
+emoji_flags[TON]=$'\U1F1F9\U1F1F4'
+emoji_flags[tonga]=$'\U1F1F9\U1F1F4'
emoji_flags[Turkey]=$'\U1F1F9\U1F1F7'
-emoji_flags[Trinidad___Tobago]=$'\U1F1F9\U1F1F9'
+emoji_flags[TR]=$'\U1F1F9\U1F1F7'
+emoji_flags[TUR]=$'\U1F1F9\U1F1F7'
+emoji_flags[tr]=$'\U1F1F9\U1F1F7'
+emoji_flags[Trinidad_and_Tobago]=$'\U1F1F9\U1F1F9'
+emoji_flags[TT]=$'\U1F1F9\U1F1F9'
+emoji_flags[TTO]=$'\U1F1F9\U1F1F9'
+emoji_flags[trinidad_tobago]=$'\U1F1F9\U1F1F9'
emoji_flags[Tuvalu]=$'\U1F1F9\U1F1FB'
+emoji_flags[TV]=$'\U1F1F9\U1F1FB'
+emoji_flags[TUV]=$'\U1F1F9\U1F1FB'
+emoji_flags[tuvalu]=$'\U1F1F9\U1F1FB'
emoji_flags[Taiwan]=$'\U1F1F9\U1F1FC'
+emoji_flags[TW]=$'\U1F1F9\U1F1FC'
+emoji_flags[TWN]=$'\U1F1F9\U1F1FC'
+emoji_flags[taiwan]=$'\U1F1F9\U1F1FC'
emoji_flags[Tanzania]=$'\U1F1F9\U1F1FF'
+emoji_flags[TZ]=$'\U1F1F9\U1F1FF'
+emoji_flags[TZA]=$'\U1F1F9\U1F1FF'
+emoji_flags[tanzania]=$'\U1F1F9\U1F1FF'
emoji_flags[Ukraine]=$'\U1F1FA\U1F1E6'
+emoji_flags[UA]=$'\U1F1FA\U1F1E6'
+emoji_flags[UKR]=$'\U1F1FA\U1F1E6'
+emoji_flags[ukraine]=$'\U1F1FA\U1F1E6'
emoji_flags[Uganda]=$'\U1F1FA\U1F1EC'
-emoji_flags[U_S__Outlying_Islands]=$'\U1F1FA\U1F1F2'
+emoji_flags[UG]=$'\U1F1FA\U1F1EC'
+emoji_flags[UGA]=$'\U1F1FA\U1F1EC'
+emoji_flags[uganda]=$'\U1F1FA\U1F1EC'
+emoji_flags[U_S_Outlying_Islands]=$'\U1F1FA\U1F1F2'
+emoji_flags[us_outlying_islands]=$'\U1F1FA\U1F1F2'
+emoji_flags[United_Nations]=$'\U1F1FA\U1F1F3'
+emoji_flags[united_nations]=$'\U1F1FA\U1F1F3'
emoji_flags[United_States]=$'\U1F1FA\U1F1F8'
+emoji_flags[US]=$'\U1F1FA\U1F1F8'
+emoji_flags[USA]=$'\U1F1FA\U1F1F8'
+emoji_flags[us]=$'\U1F1FA\U1F1F8'
emoji_flags[Uruguay]=$'\U1F1FA\U1F1FE'
+emoji_flags[UY]=$'\U1F1FA\U1F1FE'
+emoji_flags[URY]=$'\U1F1FA\U1F1FE'
+emoji_flags[uruguay]=$'\U1F1FA\U1F1FE'
emoji_flags[Uzbekistan]=$'\U1F1FA\U1F1FF'
+emoji_flags[UZ]=$'\U1F1FA\U1F1FF'
+emoji_flags[UZB]=$'\U1F1FA\U1F1FF'
+emoji_flags[uzbekistan]=$'\U1F1FA\U1F1FF'
emoji_flags[Vatican_City]=$'\U1F1FB\U1F1E6'
-emoji_flags[St__Vincent___Grenadines]=$'\U1F1FB\U1F1E8'
+emoji_flags[VA]=$'\U1F1FB\U1F1E6'
+emoji_flags[VAT]=$'\U1F1FB\U1F1E6'
+emoji_flags[vatican_city]=$'\U1F1FB\U1F1E6'
+emoji_flags[St_Vincent_and_Grenadines]=$'\U1F1FB\U1F1E8'
+emoji_flags[VC]=$'\U1F1FB\U1F1E8'
+emoji_flags[VCT]=$'\U1F1FB\U1F1E8'
+emoji_flags[st_vincent_grenadines]=$'\U1F1FB\U1F1E8'
emoji_flags[Venezuela]=$'\U1F1FB\U1F1EA'
+emoji_flags[VE]=$'\U1F1FB\U1F1EA'
+emoji_flags[VEN]=$'\U1F1FB\U1F1EA'
+emoji_flags[venezuela]=$'\U1F1FB\U1F1EA'
emoji_flags[British_Virgin_Islands]=$'\U1F1FB\U1F1EC'
-emoji_flags[U_S__Virgin_Islands]=$'\U1F1FB\U1F1EE'
+emoji_flags[VG]=$'\U1F1FB\U1F1EC'
+emoji_flags[VGB]=$'\U1F1FB\U1F1EC'
+emoji_flags[british_virgin_islands]=$'\U1F1FB\U1F1EC'
+emoji_flags[U_S_Virgin_Islands]=$'\U1F1FB\U1F1EE'
+emoji_flags[VI]=$'\U1F1FB\U1F1EE'
+emoji_flags[VIR]=$'\U1F1FB\U1F1EE'
+emoji_flags[us_virgin_islands]=$'\U1F1FB\U1F1EE'
emoji_flags[Vietnam]=$'\U1F1FB\U1F1F3'
+emoji_flags[VN]=$'\U1F1FB\U1F1F3'
+emoji_flags[VNM]=$'\U1F1FB\U1F1F3'
+emoji_flags[vietnam]=$'\U1F1FB\U1F1F3'
emoji_flags[Vanuatu]=$'\U1F1FB\U1F1FA'
-emoji_flags[Wallis___Futuna]=$'\U1F1FC\U1F1EB'
+emoji_flags[VU]=$'\U1F1FB\U1F1FA'
+emoji_flags[VUT]=$'\U1F1FB\U1F1FA'
+emoji_flags[vanuatu]=$'\U1F1FB\U1F1FA'
+emoji_flags[Wallis_and_Futuna]=$'\U1F1FC\U1F1EB'
+emoji_flags[WF]=$'\U1F1FC\U1F1EB'
+emoji_flags[WLF]=$'\U1F1FC\U1F1EB'
+emoji_flags[wallis_futuna]=$'\U1F1FC\U1F1EB'
emoji_flags[Samoa]=$'\U1F1FC\U1F1F8'
+emoji_flags[WS]=$'\U1F1FC\U1F1F8'
+emoji_flags[WSM]=$'\U1F1FC\U1F1F8'
+emoji_flags[samoa]=$'\U1F1FC\U1F1F8'
emoji_flags[Kosovo]=$'\U1F1FD\U1F1F0'
+emoji_flags[XK]=$'\U1F1FD\U1F1F0'
+emoji_flags[XKX]=$'\U1F1FD\U1F1F0'
+emoji_flags[kosovo]=$'\U1F1FD\U1F1F0'
emoji_flags[Yemen]=$'\U1F1FE\U1F1EA'
+emoji_flags[YE]=$'\U1F1FE\U1F1EA'
+emoji_flags[YEM]=$'\U1F1FE\U1F1EA'
+emoji_flags[yemen]=$'\U1F1FE\U1F1EA'
emoji_flags[Mayotte]=$'\U1F1FE\U1F1F9'
+emoji_flags[YT]=$'\U1F1FE\U1F1F9'
+emoji_flags[MYT]=$'\U1F1FE\U1F1F9'
+emoji_flags[mayotte]=$'\U1F1FE\U1F1F9'
emoji_flags[South_Africa]=$'\U1F1FF\U1F1E6'
+emoji_flags[ZA]=$'\U1F1FF\U1F1E6'
+emoji_flags[ZAF]=$'\U1F1FF\U1F1E6'
+emoji_flags[south_africa]=$'\U1F1FF\U1F1E6'
emoji_flags[Zambia]=$'\U1F1FF\U1F1F2'
+emoji_flags[ZM]=$'\U1F1FF\U1F1F2'
+emoji_flags[ZMB]=$'\U1F1FF\U1F1F2'
+emoji_flags[zambia]=$'\U1F1FF\U1F1F2'
emoji_flags[Zimbabwe]=$'\U1F1FF\U1F1FC'
+emoji_flags[ZW]=$'\U1F1FF\U1F1FC'
+emoji_flags[ZWE]=$'\U1F1FF\U1F1FC'
+emoji_flags[zimbabwe]=$'\U1F1FF\U1F1FC'
+emoji_flags[England]=$'\U1F3F4\UE0067\UE0062\UE0065\UE006E\UE0067\UE007F'
+emoji_flags[england]=$'\U1F3F4\UE0067\UE0062\UE0065\UE006E\UE0067\UE007F'
+emoji_flags[Scotland]=$'\U1F3F4\UE0067\UE0062\UE0073\UE0063\UE0074\UE007F'
+emoji_flags[scotland]=$'\U1F3F4\UE0067\UE0062\UE0073\UE0063\UE0074\UE007F'
+emoji_flags[Wales]=$'\U1F3F4\UE0067\UE0062\UE0077\UE006C\UE0073\UE007F'
+emoji_flags[wales]=$'\U1F3F4\UE0067\UE0062\UE0077\UE006C\UE0073\UE007F'
+emoji_groups[fruits]="
+ grapes
+ melon
+ watermelon
+ tangerine
+ lemon
+ banana
+ pineapple
+ mango
+ red_apple
+ green_apple
+ pear
+ peach
+ cherries
+ strawberry
+ kiwi_fruit
+ tomato
+ coconut
+"
+
+emoji_groups[vehicles]="
+ locomotive
+ railway_car
+ high_speed_train
+ bullet_train
+ bullet_train_1
+ metro
+ light_rail
+ station
+ tram
+ monorail
+ mountain_railway
+ tram_car
+ bus
+ oncoming_bus
+ trolleybus
+ minibus
+ ambulance
+ fire_engine
+ police_car
+ oncoming_police_car
+ taxi
+ oncoming_taxi
+ automobile
+ oncoming_automobile
+ sport_utility_vehicle
+ delivery_truck
+ articulated_lorry
+ tractor
+ racing_car
+ motorcycle
+ motor_scooter
+ manual_wheelchair
+ motorized_wheelchair
+ auto_rickshaw
+ bicycle
+ kick_scooter
+ skateboard
+ bus_stop
+ motorway
+ railway_track
+ oil_drum
+ fuel_pump
+ police_car_light
+ horizontal_traffic_light
+ vertical_traffic_light
+ stop_sign
+ construction
+ anchor
+ sailboat
+ canoe
+ speedboat
+ passenger_ship
+ ferry
+ motor_boat
+ ship
+ airplane
+ small_airplane
+ airplane_departure
+ airplane_arrival
+ parachute
+ seat
+ helicopter
+ suspension_railway
+ mountain_cableway
+ aerial_tramway
+ satellite
+ rocket
+ flying_saucer
+ ATM_sign
+ litter_in_bin_sign
+ potable_water
+ wheelchair_symbol
+ men_s_room
+ women_s_room
+ restroom
+ baby_symbol
+ water_closet
+ passport_control
+ customs
+ baggage_claim
+ left_luggage
+"
+
+emoji_groups[hands]="
+ waving_hand
+ waving_hand_light_skin_tone
+ waving_hand_medium_light_skin_tone
+ waving_hand_medium_skin_tone
+ waving_hand_medium_dark_skin_tone
+ waving_hand_dark_skin_tone
+ raised_back_of_hand
+ raised_back_of_hand_light_skin_tone
+ raised_back_of_hand_medium_light_skin_tone
+ raised_back_of_hand_medium_skin_tone
+ raised_back_of_hand_medium_dark_skin_tone
+ raised_back_of_hand_dark_skin_tone
+ hand_with_fingers_splayed
+ hand_with_fingers_splayed_light_skin_tone
+ hand_with_fingers_splayed_medium_light_skin_tone
+ hand_with_fingers_splayed_medium_skin_tone
+ hand_with_fingers_splayed_medium_dark_skin_tone
+ hand_with_fingers_splayed_dark_skin_tone
+ raised_hand
+ raised_hand_light_skin_tone
+ raised_hand_medium_light_skin_tone
+ raised_hand_medium_skin_tone
+ raised_hand_medium_dark_skin_tone
+ raised_hand_dark_skin_tone
+ vulcan_salute
+ vulcan_salute_light_skin_tone
+ vulcan_salute_medium_light_skin_tone
+ vulcan_salute_medium_skin_tone
+ vulcan_salute_medium_dark_skin_tone
+ vulcan_salute_dark_skin_tone
+ OK_hand
+ OK_hand_light_skin_tone
+ OK_hand_medium_light_skin_tone
+ OK_hand_medium_skin_tone
+ OK_hand_medium_dark_skin_tone
+ OK_hand_dark_skin_tone
+ pinching_hand
+ pinching_hand_light_skin_tone
+ pinching_hand_medium_light_skin_tone
+ pinching_hand_medium_skin_tone
+ pinching_hand_medium_dark_skin_tone
+ pinching_hand_dark_skin_tone
+ victory_hand
+ victory_hand_light_skin_tone
+ victory_hand_medium_light_skin_tone
+ victory_hand_medium_skin_tone
+ victory_hand_medium_dark_skin_tone
+ victory_hand_dark_skin_tone
+ crossed_fingers
+ crossed_fingers_light_skin_tone
+ crossed_fingers_medium_light_skin_tone
+ crossed_fingers_medium_skin_tone
+ crossed_fingers_medium_dark_skin_tone
+ crossed_fingers_dark_skin_tone
+ love_you_gesture
+ love_you_gesture_light_skin_tone
+ love_you_gesture_medium_light_skin_tone
+ love_you_gesture_medium_skin_tone
+ love_you_gesture_medium_dark_skin_tone
+ love_you_gesture_dark_skin_tone
+ sign_of_the_horns
+ sign_of_the_horns_light_skin_tone
+ sign_of_the_horns_medium_light_skin_tone
+ sign_of_the_horns_medium_skin_tone
+ sign_of_the_horns_medium_dark_skin_tone
+ sign_of_the_horns_dark_skin_tone
+ call_me_hand
+ call_me_hand_light_skin_tone
+ call_me_hand_medium_light_skin_tone
+ call_me_hand_medium_skin_tone
+ call_me_hand_medium_dark_skin_tone
+ call_me_hand_dark_skin_tone
+ backhand_index_pointing_left
+ backhand_index_pointing_left_light_skin_tone
+ backhand_index_pointing_left_medium_light_skin_tone
+ backhand_index_pointing_left_medium_skin_tone
+ backhand_index_pointing_left_medium_dark_skin_tone
+ backhand_index_pointing_left_dark_skin_tone
+ backhand_index_pointing_right
+ backhand_index_pointing_right_light_skin_tone
+ backhand_index_pointing_right_medium_light_skin_tone
+ backhand_index_pointing_right_medium_skin_tone
+ backhand_index_pointing_right_medium_dark_skin_tone
+ backhand_index_pointing_right_dark_skin_tone
+ backhand_index_pointing_up
+ backhand_index_pointing_up_light_skin_tone
+ backhand_index_pointing_up_medium_light_skin_tone
+ backhand_index_pointing_up_medium_skin_tone
+ backhand_index_pointing_up_medium_dark_skin_tone
+ backhand_index_pointing_up_dark_skin_tone
+ middle_finger
+ middle_finger_light_skin_tone
+ middle_finger_medium_light_skin_tone
+ middle_finger_medium_skin_tone
+ middle_finger_medium_dark_skin_tone
+ middle_finger_dark_skin_tone
+ backhand_index_pointing_down
+ backhand_index_pointing_down_light_skin_tone
+ backhand_index_pointing_down_medium_light_skin_tone
+ backhand_index_pointing_down_medium_skin_tone
+ backhand_index_pointing_down_medium_dark_skin_tone
+ backhand_index_pointing_down_dark_skin_tone
+ index_pointing_up
+ index_pointing_up_light_skin_tone
+ index_pointing_up_medium_light_skin_tone
+ index_pointing_up_medium_skin_tone
+ index_pointing_up_medium_dark_skin_tone
+ index_pointing_up_dark_skin_tone
+ thumbs_up
+ thumbs_up_light_skin_tone
+ thumbs_up_medium_light_skin_tone
+ thumbs_up_medium_skin_tone
+ thumbs_up_medium_dark_skin_tone
+ thumbs_up_dark_skin_tone
+ thumbs_down
+ thumbs_down_light_skin_tone
+ thumbs_down_medium_light_skin_tone
+ thumbs_down_medium_skin_tone
+ thumbs_down_medium_dark_skin_tone
+ thumbs_down_dark_skin_tone
+ raised_fist
+ raised_fist_light_skin_tone
+ raised_fist_medium_light_skin_tone
+ raised_fist_medium_skin_tone
+ raised_fist_medium_dark_skin_tone
+ raised_fist_dark_skin_tone
+ oncoming_fist
+ oncoming_fist_light_skin_tone
+ oncoming_fist_medium_light_skin_tone
+ oncoming_fist_medium_skin_tone
+ oncoming_fist_medium_dark_skin_tone
+ oncoming_fist_dark_skin_tone
+ left_facing_fist
+ left_facing_fist_light_skin_tone
+ left_facing_fist_medium_light_skin_tone
+ left_facing_fist_medium_skin_tone
+ left_facing_fist_medium_dark_skin_tone
+ left_facing_fist_dark_skin_tone
+ right_facing_fist
+ right_facing_fist_light_skin_tone
+ right_facing_fist_medium_light_skin_tone
+ right_facing_fist_medium_skin_tone
+ right_facing_fist_medium_dark_skin_tone
+ right_facing_fist_dark_skin_tone
+ writing_hand
+ writing_hand_light_skin_tone
+ writing_hand_medium_light_skin_tone
+ writing_hand_medium_skin_tone
+ writing_hand_medium_dark_skin_tone
+ writing_hand_dark_skin_tone
+ nail_polish
+ nail_polish_light_skin_tone
+ nail_polish_medium_light_skin_tone
+ nail_polish_medium_skin_tone
+ nail_polish_medium_dark_skin_tone
+ nail_polish_dark_skin_tone
+ selfie
+ selfie_light_skin_tone
+ selfie_medium_light_skin_tone
+ selfie_medium_skin_tone
+ selfie_medium_dark_skin_tone
+ selfie_dark_skin_tone
+"
+
+emoji_groups[people]="
+ person_frowning
+ person_frowning_light_skin_tone
+ person_frowning_medium_light_skin_tone
+ person_frowning_medium_skin_tone
+ person_frowning_medium_dark_skin_tone
+ person_frowning_dark_skin_tone
+ man_frowning
+ man_frowning_light_skin_tone
+ man_frowning_medium_light_skin_tone
+ man_frowning_medium_skin_tone
+ man_frowning_medium_dark_skin_tone
+ man_frowning_dark_skin_tone
+ woman_frowning
+ woman_frowning_light_skin_tone
+ woman_frowning_medium_light_skin_tone
+ woman_frowning_medium_skin_tone
+ woman_frowning_medium_dark_skin_tone
+ woman_frowning_dark_skin_tone
+ person_pouting
+ person_pouting_light_skin_tone
+ person_pouting_medium_light_skin_tone
+ person_pouting_medium_skin_tone
+ person_pouting_medium_dark_skin_tone
+ person_pouting_dark_skin_tone
+ man_pouting
+ man_pouting_light_skin_tone
+ man_pouting_medium_light_skin_tone
+ man_pouting_medium_skin_tone
+ man_pouting_medium_dark_skin_tone
+ man_pouting_dark_skin_tone
+ woman_pouting
+ woman_pouting_light_skin_tone
+ woman_pouting_medium_light_skin_tone
+ woman_pouting_medium_skin_tone
+ woman_pouting_medium_dark_skin_tone
+ woman_pouting_dark_skin_tone
+ person_gesturing_NO
+ person_gesturing_NO_light_skin_tone
+ person_gesturing_NO_medium_light_skin_tone
+ person_gesturing_NO_medium_skin_tone
+ person_gesturing_NO_medium_dark_skin_tone
+ person_gesturing_NO_dark_skin_tone
+ man_gesturing_NO
+ man_gesturing_NO_light_skin_tone
+ man_gesturing_NO_medium_light_skin_tone
+ man_gesturing_NO_medium_skin_tone
+ man_gesturing_NO_medium_dark_skin_tone
+ man_gesturing_NO_dark_skin_tone
+ woman_gesturing_NO
+ woman_gesturing_NO_light_skin_tone
+ woman_gesturing_NO_medium_light_skin_tone
+ woman_gesturing_NO_medium_skin_tone
+ woman_gesturing_NO_medium_dark_skin_tone
+ woman_gesturing_NO_dark_skin_tone
+ person_gesturing_OK
+ person_gesturing_OK_light_skin_tone
+ person_gesturing_OK_medium_light_skin_tone
+ person_gesturing_OK_medium_skin_tone
+ person_gesturing_OK_medium_dark_skin_tone
+ person_gesturing_OK_dark_skin_tone
+ man_gesturing_OK
+ man_gesturing_OK_light_skin_tone
+ man_gesturing_OK_medium_light_skin_tone
+ man_gesturing_OK_medium_skin_tone
+ man_gesturing_OK_medium_dark_skin_tone
+ man_gesturing_OK_dark_skin_tone
+ woman_gesturing_OK
+ woman_gesturing_OK_light_skin_tone
+ woman_gesturing_OK_medium_light_skin_tone
+ woman_gesturing_OK_medium_skin_tone
+ woman_gesturing_OK_medium_dark_skin_tone
+ woman_gesturing_OK_dark_skin_tone
+ person_tipping_hand
+ person_tipping_hand_light_skin_tone
+ person_tipping_hand_medium_light_skin_tone
+ person_tipping_hand_medium_skin_tone
+ person_tipping_hand_medium_dark_skin_tone
+ person_tipping_hand_dark_skin_tone
+ man_tipping_hand
+ man_tipping_hand_light_skin_tone
+ man_tipping_hand_medium_light_skin_tone
+ man_tipping_hand_medium_skin_tone
+ man_tipping_hand_medium_dark_skin_tone
+ man_tipping_hand_dark_skin_tone
+ woman_tipping_hand
+ woman_tipping_hand_light_skin_tone
+ woman_tipping_hand_medium_light_skin_tone
+ woman_tipping_hand_medium_skin_tone
+ woman_tipping_hand_medium_dark_skin_tone
+ woman_tipping_hand_dark_skin_tone
+ person_raising_hand
+ person_raising_hand_light_skin_tone
+ person_raising_hand_medium_light_skin_tone
+ person_raising_hand_medium_skin_tone
+ person_raising_hand_medium_dark_skin_tone
+ person_raising_hand_dark_skin_tone
+ man_raising_hand
+ man_raising_hand_light_skin_tone
+ man_raising_hand_medium_light_skin_tone
+ man_raising_hand_medium_skin_tone
+ man_raising_hand_medium_dark_skin_tone
+ man_raising_hand_dark_skin_tone
+ woman_raising_hand
+ woman_raising_hand_light_skin_tone
+ woman_raising_hand_medium_light_skin_tone
+ woman_raising_hand_medium_skin_tone
+ woman_raising_hand_medium_dark_skin_tone
+ woman_raising_hand_dark_skin_tone
+ deaf_person
+ deaf_person_light_skin_tone
+ deaf_person_medium_light_skin_tone
+ deaf_person_medium_skin_tone
+ deaf_person_medium_dark_skin_tone
+ deaf_person_dark_skin_tone
+ deaf_man
+ deaf_man_light_skin_tone
+ deaf_man_medium_light_skin_tone
+ deaf_man_medium_skin_tone
+ deaf_man_medium_dark_skin_tone
+ deaf_man_dark_skin_tone
+ deaf_woman
+ deaf_woman_light_skin_tone
+ deaf_woman_medium_light_skin_tone
+ deaf_woman_medium_skin_tone
+ deaf_woman_medium_dark_skin_tone
+ deaf_woman_dark_skin_tone
+ person_bowing
+ person_bowing_light_skin_tone
+ person_bowing_medium_light_skin_tone
+ person_bowing_medium_skin_tone
+ person_bowing_medium_dark_skin_tone
+ person_bowing_dark_skin_tone
+ man_bowing
+ man_bowing_light_skin_tone
+ man_bowing_medium_light_skin_tone
+ man_bowing_medium_skin_tone
+ man_bowing_medium_dark_skin_tone
+ man_bowing_dark_skin_tone
+ woman_bowing
+ woman_bowing_light_skin_tone
+ woman_bowing_medium_light_skin_tone
+ woman_bowing_medium_skin_tone
+ woman_bowing_medium_dark_skin_tone
+ woman_bowing_dark_skin_tone
+ person_facepalming
+ person_facepalming_light_skin_tone
+ person_facepalming_medium_light_skin_tone
+ person_facepalming_medium_skin_tone
+ person_facepalming_medium_dark_skin_tone
+ person_facepalming_dark_skin_tone
+ man_facepalming
+ man_facepalming_light_skin_tone
+ man_facepalming_medium_light_skin_tone
+ man_facepalming_medium_skin_tone
+ man_facepalming_medium_dark_skin_tone
+ man_facepalming_dark_skin_tone
+ woman_facepalming
+ woman_facepalming_light_skin_tone
+ woman_facepalming_medium_light_skin_tone
+ woman_facepalming_medium_skin_tone
+ woman_facepalming_medium_dark_skin_tone
+ woman_facepalming_dark_skin_tone
+ person_shrugging
+ person_shrugging_light_skin_tone
+ person_shrugging_medium_light_skin_tone
+ person_shrugging_medium_skin_tone
+ person_shrugging_medium_dark_skin_tone
+ person_shrugging_dark_skin_tone
+ man_shrugging
+ man_shrugging_light_skin_tone
+ man_shrugging_medium_light_skin_tone
+ man_shrugging_medium_skin_tone
+ man_shrugging_medium_dark_skin_tone
+ man_shrugging_dark_skin_tone
+ woman_shrugging
+ woman_shrugging_light_skin_tone
+ woman_shrugging_medium_light_skin_tone
+ woman_shrugging_medium_skin_tone
+ woman_shrugging_medium_dark_skin_tone
+ woman_shrugging_dark_skin_tone
+ man_health_worker
+ man_health_worker_light_skin_tone
+ man_health_worker_medium_light_skin_tone
+ man_health_worker_medium_skin_tone
+ man_health_worker_medium_dark_skin_tone
+ man_health_worker_dark_skin_tone
+ woman_health_worker
+ woman_health_worker_light_skin_tone
+ woman_health_worker_medium_light_skin_tone
+ woman_health_worker_medium_skin_tone
+ woman_health_worker_medium_dark_skin_tone
+ woman_health_worker_dark_skin_tone
+ man_student
+ man_student_light_skin_tone
+ man_student_medium_light_skin_tone
+ man_student_medium_skin_tone
+ man_student_medium_dark_skin_tone
+ man_student_dark_skin_tone
+ woman_student
+ woman_student_light_skin_tone
+ woman_student_medium_light_skin_tone
+ woman_student_medium_skin_tone
+ woman_student_medium_dark_skin_tone
+ woman_student_dark_skin_tone
+ man_teacher
+ man_teacher_light_skin_tone
+ man_teacher_medium_light_skin_tone
+ man_teacher_medium_skin_tone
+ man_teacher_medium_dark_skin_tone
+ man_teacher_dark_skin_tone
+ woman_teacher
+ woman_teacher_light_skin_tone
+ woman_teacher_medium_light_skin_tone
+ woman_teacher_medium_skin_tone
+ woman_teacher_medium_dark_skin_tone
+ woman_teacher_dark_skin_tone
+ man_judge
+ man_judge_light_skin_tone
+ man_judge_medium_light_skin_tone
+ man_judge_medium_skin_tone
+ man_judge_medium_dark_skin_tone
+ man_judge_dark_skin_tone
+ woman_judge
+ woman_judge_light_skin_tone
+ woman_judge_medium_light_skin_tone
+ woman_judge_medium_skin_tone
+ woman_judge_medium_dark_skin_tone
+ woman_judge_dark_skin_tone
+ man_farmer
+ man_farmer_light_skin_tone
+ man_farmer_medium_light_skin_tone
+ man_farmer_medium_skin_tone
+ man_farmer_medium_dark_skin_tone
+ man_farmer_dark_skin_tone
+ woman_farmer
+ woman_farmer_light_skin_tone
+ woman_farmer_medium_light_skin_tone
+ woman_farmer_medium_skin_tone
+ woman_farmer_medium_dark_skin_tone
+ woman_farmer_dark_skin_tone
+ man_cook
+ man_cook_light_skin_tone
+ man_cook_medium_light_skin_tone
+ man_cook_medium_skin_tone
+ man_cook_medium_dark_skin_tone
+ man_cook_dark_skin_tone
+ woman_cook
+ woman_cook_light_skin_tone
+ woman_cook_medium_light_skin_tone
+ woman_cook_medium_skin_tone
+ woman_cook_medium_dark_skin_tone
+ woman_cook_dark_skin_tone
+ man_mechanic
+ man_mechanic_light_skin_tone
+ man_mechanic_medium_light_skin_tone
+ man_mechanic_medium_skin_tone
+ man_mechanic_medium_dark_skin_tone
+ man_mechanic_dark_skin_tone
+ woman_mechanic
+ woman_mechanic_light_skin_tone
+ woman_mechanic_medium_light_skin_tone
+ woman_mechanic_medium_skin_tone
+ woman_mechanic_medium_dark_skin_tone
+ woman_mechanic_dark_skin_tone
+ man_factory_worker
+ man_factory_worker_light_skin_tone
+ man_factory_worker_medium_light_skin_tone
+ man_factory_worker_medium_skin_tone
+ man_factory_worker_medium_dark_skin_tone
+ man_factory_worker_dark_skin_tone
+ woman_factory_worker
+ woman_factory_worker_light_skin_tone
+ woman_factory_worker_medium_light_skin_tone
+ woman_factory_worker_medium_skin_tone
+ woman_factory_worker_medium_dark_skin_tone
+ woman_factory_worker_dark_skin_tone
+ man_office_worker
+ man_office_worker_light_skin_tone
+ man_office_worker_medium_light_skin_tone
+ man_office_worker_medium_skin_tone
+ man_office_worker_medium_dark_skin_tone
+ man_office_worker_dark_skin_tone
+ woman_office_worker
+ woman_office_worker_light_skin_tone
+ woman_office_worker_medium_light_skin_tone
+ woman_office_worker_medium_skin_tone
+ woman_office_worker_medium_dark_skin_tone
+ woman_office_worker_dark_skin_tone
+ man_scientist
+ man_scientist_light_skin_tone
+ man_scientist_medium_light_skin_tone
+ man_scientist_medium_skin_tone
+ man_scientist_medium_dark_skin_tone
+ man_scientist_dark_skin_tone
+ woman_scientist
+ woman_scientist_light_skin_tone
+ woman_scientist_medium_light_skin_tone
+ woman_scientist_medium_skin_tone
+ woman_scientist_medium_dark_skin_tone
+ woman_scientist_dark_skin_tone
+ man_technologist
+ man_technologist_light_skin_tone
+ man_technologist_medium_light_skin_tone
+ man_technologist_medium_skin_tone
+ man_technologist_medium_dark_skin_tone
+ man_technologist_dark_skin_tone
+ woman_technologist
+ woman_technologist_light_skin_tone
+ woman_technologist_medium_light_skin_tone
+ woman_technologist_medium_skin_tone
+ woman_technologist_medium_dark_skin_tone
+ woman_technologist_dark_skin_tone
+ man_singer
+ man_singer_light_skin_tone
+ man_singer_medium_light_skin_tone
+ man_singer_medium_skin_tone
+ man_singer_medium_dark_skin_tone
+ man_singer_dark_skin_tone
+ woman_singer
+ woman_singer_light_skin_tone
+ woman_singer_medium_light_skin_tone
+ woman_singer_medium_skin_tone
+ woman_singer_medium_dark_skin_tone
+ woman_singer_dark_skin_tone
+ man_artist
+ man_artist_light_skin_tone
+ man_artist_medium_light_skin_tone
+ man_artist_medium_skin_tone
+ man_artist_medium_dark_skin_tone
+ man_artist_dark_skin_tone
+ woman_artist
+ woman_artist_light_skin_tone
+ woman_artist_medium_light_skin_tone
+ woman_artist_medium_skin_tone
+ woman_artist_medium_dark_skin_tone
+ woman_artist_dark_skin_tone
+ man_pilot
+ man_pilot_light_skin_tone
+ man_pilot_medium_light_skin_tone
+ man_pilot_medium_skin_tone
+ man_pilot_medium_dark_skin_tone
+ man_pilot_dark_skin_tone
+ woman_pilot
+ woman_pilot_light_skin_tone
+ woman_pilot_medium_light_skin_tone
+ woman_pilot_medium_skin_tone
+ woman_pilot_medium_dark_skin_tone
+ woman_pilot_dark_skin_tone
+ man_astronaut
+ man_astronaut_light_skin_tone
+ man_astronaut_medium_light_skin_tone
+ man_astronaut_medium_skin_tone
+ man_astronaut_medium_dark_skin_tone
+ man_astronaut_dark_skin_tone
+ woman_astronaut
+ woman_astronaut_light_skin_tone
+ woman_astronaut_medium_light_skin_tone
+ woman_astronaut_medium_skin_tone
+ woman_astronaut_medium_dark_skin_tone
+ woman_astronaut_dark_skin_tone
+ man_firefighter
+ man_firefighter_light_skin_tone
+ man_firefighter_medium_light_skin_tone
+ man_firefighter_medium_skin_tone
+ man_firefighter_medium_dark_skin_tone
+ man_firefighter_dark_skin_tone
+ woman_firefighter
+ woman_firefighter_light_skin_tone
+ woman_firefighter_medium_light_skin_tone
+ woman_firefighter_medium_skin_tone
+ woman_firefighter_medium_dark_skin_tone
+ woman_firefighter_dark_skin_tone
+ police_officer
+ police_officer_light_skin_tone
+ police_officer_medium_light_skin_tone
+ police_officer_medium_skin_tone
+ police_officer_medium_dark_skin_tone
+ police_officer_dark_skin_tone
+ man_police_officer
+ man_police_officer_light_skin_tone
+ man_police_officer_medium_light_skin_tone
+ man_police_officer_medium_skin_tone
+ man_police_officer_medium_dark_skin_tone
+ man_police_officer_dark_skin_tone
+ woman_police_officer
+ woman_police_officer_light_skin_tone
+ woman_police_officer_medium_light_skin_tone
+ woman_police_officer_medium_skin_tone
+ woman_police_officer_medium_dark_skin_tone
+ woman_police_officer_dark_skin_tone
+ detective
+ detective_light_skin_tone
+ detective_medium_light_skin_tone
+ detective_medium_skin_tone
+ detective_medium_dark_skin_tone
+ detective_dark_skin_tone
+ man_detective
+ man_detective_light_skin_tone
+ man_detective_medium_light_skin_tone
+ man_detective_medium_skin_tone
+ man_detective_medium_dark_skin_tone
+ man_detective_dark_skin_tone
+ woman_detective
+ woman_detective_light_skin_tone
+ woman_detective_medium_light_skin_tone
+ woman_detective_medium_skin_tone
+ woman_detective_medium_dark_skin_tone
+ woman_detective_dark_skin_tone
+ guard
+ guard_light_skin_tone
+ guard_medium_light_skin_tone
+ guard_medium_skin_tone
+ guard_medium_dark_skin_tone
+ guard_dark_skin_tone
+ man_guard
+ man_guard_light_skin_tone
+ man_guard_medium_light_skin_tone
+ man_guard_medium_skin_tone
+ man_guard_medium_dark_skin_tone
+ man_guard_dark_skin_tone
+ woman_guard
+ woman_guard_light_skin_tone
+ woman_guard_medium_light_skin_tone
+ woman_guard_medium_skin_tone
+ woman_guard_medium_dark_skin_tone
+ woman_guard_dark_skin_tone
+ construction_worker
+ construction_worker_light_skin_tone
+ construction_worker_medium_light_skin_tone
+ construction_worker_medium_skin_tone
+ construction_worker_medium_dark_skin_tone
+ construction_worker_dark_skin_tone
+ man_construction_worker
+ man_construction_worker_light_skin_tone
+ man_construction_worker_medium_light_skin_tone
+ man_construction_worker_medium_skin_tone
+ man_construction_worker_medium_dark_skin_tone
+ man_construction_worker_dark_skin_tone
+ woman_construction_worker
+ woman_construction_worker_light_skin_tone
+ woman_construction_worker_medium_light_skin_tone
+ woman_construction_worker_medium_skin_tone
+ woman_construction_worker_medium_dark_skin_tone
+ woman_construction_worker_dark_skin_tone
+ prince
+ prince_light_skin_tone
+ prince_medium_light_skin_tone
+ prince_medium_skin_tone
+ prince_medium_dark_skin_tone
+ prince_dark_skin_tone
+ princess
+ princess_light_skin_tone
+ princess_medium_light_skin_tone
+ princess_medium_skin_tone
+ princess_medium_dark_skin_tone
+ princess_dark_skin_tone
+ person_wearing_turban
+ person_wearing_turban_light_skin_tone
+ person_wearing_turban_medium_light_skin_tone
+ person_wearing_turban_medium_skin_tone
+ person_wearing_turban_medium_dark_skin_tone
+ person_wearing_turban_dark_skin_tone
+ man_wearing_turban
+ man_wearing_turban_light_skin_tone
+ man_wearing_turban_medium_light_skin_tone
+ man_wearing_turban_medium_skin_tone
+ man_wearing_turban_medium_dark_skin_tone
+ man_wearing_turban_dark_skin_tone
+ woman_wearing_turban
+ woman_wearing_turban_light_skin_tone
+ woman_wearing_turban_medium_light_skin_tone
+ woman_wearing_turban_medium_skin_tone
+ woman_wearing_turban_medium_dark_skin_tone
+ woman_wearing_turban_dark_skin_tone
+ man_with_Chinese_cap
+ man_with_Chinese_cap_light_skin_tone
+ man_with_Chinese_cap_medium_light_skin_tone
+ man_with_Chinese_cap_medium_skin_tone
+ man_with_Chinese_cap_medium_dark_skin_tone
+ man_with_Chinese_cap_dark_skin_tone
+ woman_with_headscarf
+ woman_with_headscarf_light_skin_tone
+ woman_with_headscarf_medium_light_skin_tone
+ woman_with_headscarf_medium_skin_tone
+ woman_with_headscarf_medium_dark_skin_tone
+ woman_with_headscarf_dark_skin_tone
+ man_in_tuxedo
+ man_in_tuxedo_light_skin_tone
+ man_in_tuxedo_medium_light_skin_tone
+ man_in_tuxedo_medium_skin_tone
+ man_in_tuxedo_medium_dark_skin_tone
+ man_in_tuxedo_dark_skin_tone
+ bride_with_veil
+ bride_with_veil_light_skin_tone
+ bride_with_veil_medium_light_skin_tone
+ bride_with_veil_medium_skin_tone
+ bride_with_veil_medium_dark_skin_tone
+ bride_with_veil_dark_skin_tone
+ pregnant_woman
+ pregnant_woman_light_skin_tone
+ pregnant_woman_medium_light_skin_tone
+ pregnant_woman_medium_skin_tone
+ pregnant_woman_medium_dark_skin_tone
+ pregnant_woman_dark_skin_tone
+ breast_feeding
+ breast_feeding_light_skin_tone
+ breast_feeding_medium_light_skin_tone
+ breast_feeding_medium_skin_tone
+ breast_feeding_medium_dark_skin_tone
+ breast_feeding_dark_skin_tone
+ baby_angel
+ baby_angel_light_skin_tone
+ baby_angel_medium_light_skin_tone
+ baby_angel_medium_skin_tone
+ baby_angel_medium_dark_skin_tone
+ baby_angel_dark_skin_tone
+ Santa_Claus
+ Santa_Claus_light_skin_tone
+ Santa_Claus_medium_light_skin_tone
+ Santa_Claus_medium_skin_tone
+ Santa_Claus_medium_dark_skin_tone
+ Santa_Claus_dark_skin_tone
+ Mrs_Claus
+ Mrs_Claus_light_skin_tone
+ Mrs_Claus_medium_light_skin_tone
+ Mrs_Claus_medium_skin_tone
+ Mrs_Claus_medium_dark_skin_tone
+ Mrs_Claus_dark_skin_tone
+ superhero
+ superhero_light_skin_tone
+ superhero_medium_light_skin_tone
+ superhero_medium_skin_tone
+ superhero_medium_dark_skin_tone
+ superhero_dark_skin_tone
+ man_superhero
+ man_superhero_light_skin_tone
+ man_superhero_medium_light_skin_tone
+ man_superhero_medium_skin_tone
+ man_superhero_medium_dark_skin_tone
+ man_superhero_dark_skin_tone
+ woman_superhero
+ woman_superhero_light_skin_tone
+ woman_superhero_medium_light_skin_tone
+ woman_superhero_medium_skin_tone
+ woman_superhero_medium_dark_skin_tone
+ woman_superhero_dark_skin_tone
+ supervillain
+ supervillain_light_skin_tone
+ supervillain_medium_light_skin_tone
+ supervillain_medium_skin_tone
+ supervillain_medium_dark_skin_tone
+ supervillain_dark_skin_tone
+ man_supervillain
+ man_supervillain_light_skin_tone
+ man_supervillain_medium_light_skin_tone
+ man_supervillain_medium_skin_tone
+ man_supervillain_medium_dark_skin_tone
+ man_supervillain_dark_skin_tone
+ woman_supervillain
+ woman_supervillain_light_skin_tone
+ woman_supervillain_medium_light_skin_tone
+ woman_supervillain_medium_skin_tone
+ woman_supervillain_medium_dark_skin_tone
+ woman_supervillain_dark_skin_tone
+ mage
+ mage_light_skin_tone
+ mage_medium_light_skin_tone
+ mage_medium_skin_tone
+ mage_medium_dark_skin_tone
+ mage_dark_skin_tone
+ man_mage
+ man_mage_light_skin_tone
+ man_mage_medium_light_skin_tone
+ man_mage_medium_skin_tone
+ man_mage_medium_dark_skin_tone
+ man_mage_dark_skin_tone
+ woman_mage
+ woman_mage_light_skin_tone
+ woman_mage_medium_light_skin_tone
+ woman_mage_medium_skin_tone
+ woman_mage_medium_dark_skin_tone
+ woman_mage_dark_skin_tone
+ fairy
+ fairy_light_skin_tone
+ fairy_medium_light_skin_tone
+ fairy_medium_skin_tone
+ fairy_medium_dark_skin_tone
+ fairy_dark_skin_tone
+ man_fairy
+ man_fairy_light_skin_tone
+ man_fairy_medium_light_skin_tone
+ man_fairy_medium_skin_tone
+ man_fairy_medium_dark_skin_tone
+ man_fairy_dark_skin_tone
+ woman_fairy
+ woman_fairy_light_skin_tone
+ woman_fairy_medium_light_skin_tone
+ woman_fairy_medium_skin_tone
+ woman_fairy_medium_dark_skin_tone
+ woman_fairy_dark_skin_tone
+ vampire
+ vampire_light_skin_tone
+ vampire_medium_light_skin_tone
+ vampire_medium_skin_tone
+ vampire_medium_dark_skin_tone
+ vampire_dark_skin_tone
+ man_vampire
+ man_vampire_light_skin_tone
+ man_vampire_medium_light_skin_tone
+ man_vampire_medium_skin_tone
+ man_vampire_medium_dark_skin_tone
+ man_vampire_dark_skin_tone
+ woman_vampire
+ woman_vampire_light_skin_tone
+ woman_vampire_medium_light_skin_tone
+ woman_vampire_medium_skin_tone
+ woman_vampire_medium_dark_skin_tone
+ woman_vampire_dark_skin_tone
+ merperson
+ merperson_light_skin_tone
+ merperson_medium_light_skin_tone
+ merperson_medium_skin_tone
+ merperson_medium_dark_skin_tone
+ merperson_dark_skin_tone
+ merman
+ merman_light_skin_tone
+ merman_medium_light_skin_tone
+ merman_medium_skin_tone
+ merman_medium_dark_skin_tone
+ merman_dark_skin_tone
+ mermaid
+ mermaid_light_skin_tone
+ mermaid_medium_light_skin_tone
+ mermaid_medium_skin_tone
+ mermaid_medium_dark_skin_tone
+ mermaid_dark_skin_tone
+ elf
+ elf_light_skin_tone
+ elf_medium_light_skin_tone
+ elf_medium_skin_tone
+ elf_medium_dark_skin_tone
+ elf_dark_skin_tone
+ man_elf
+ man_elf_light_skin_tone
+ man_elf_medium_light_skin_tone
+ man_elf_medium_skin_tone
+ man_elf_medium_dark_skin_tone
+ man_elf_dark_skin_tone
+ woman_elf
+ woman_elf_light_skin_tone
+ woman_elf_medium_light_skin_tone
+ woman_elf_medium_skin_tone
+ woman_elf_medium_dark_skin_tone
+ woman_elf_dark_skin_tone
+ genie
+ man_genie
+ woman_genie
+ zombie
+ man_zombie
+ woman_zombie
+ person_getting_massage
+ person_getting_massage_light_skin_tone
+ person_getting_massage_medium_light_skin_tone
+ person_getting_massage_medium_skin_tone
+ person_getting_massage_medium_dark_skin_tone
+ person_getting_massage_dark_skin_tone
+ man_getting_massage
+ man_getting_massage_light_skin_tone
+ man_getting_massage_medium_light_skin_tone
+ man_getting_massage_medium_skin_tone
+ man_getting_massage_medium_dark_skin_tone
+ man_getting_massage_dark_skin_tone
+ woman_getting_massage
+ woman_getting_massage_light_skin_tone
+ woman_getting_massage_medium_light_skin_tone
+ woman_getting_massage_medium_skin_tone
+ woman_getting_massage_medium_dark_skin_tone
+ woman_getting_massage_dark_skin_tone
+ person_getting_haircut
+ person_getting_haircut_light_skin_tone
+ person_getting_haircut_medium_light_skin_tone
+ person_getting_haircut_medium_skin_tone
+ person_getting_haircut_medium_dark_skin_tone
+ person_getting_haircut_dark_skin_tone
+ man_getting_haircut
+ man_getting_haircut_light_skin_tone
+ man_getting_haircut_medium_light_skin_tone
+ man_getting_haircut_medium_skin_tone
+ man_getting_haircut_medium_dark_skin_tone
+ man_getting_haircut_dark_skin_tone
+ woman_getting_haircut
+ woman_getting_haircut_light_skin_tone
+ woman_getting_haircut_medium_light_skin_tone
+ woman_getting_haircut_medium_skin_tone
+ woman_getting_haircut_medium_dark_skin_tone
+ woman_getting_haircut_dark_skin_tone
+ person_walking
+ person_walking_light_skin_tone
+ person_walking_medium_light_skin_tone
+ person_walking_medium_skin_tone
+ person_walking_medium_dark_skin_tone
+ person_walking_dark_skin_tone
+ man_walking
+ man_walking_light_skin_tone
+ man_walking_medium_light_skin_tone
+ man_walking_medium_skin_tone
+ man_walking_medium_dark_skin_tone
+ man_walking_dark_skin_tone
+ woman_walking
+ woman_walking_light_skin_tone
+ woman_walking_medium_light_skin_tone
+ woman_walking_medium_skin_tone
+ woman_walking_medium_dark_skin_tone
+ woman_walking_dark_skin_tone
+ person_standing
+ person_standing_light_skin_tone
+ person_standing_medium_light_skin_tone
+ person_standing_medium_skin_tone
+ person_standing_medium_dark_skin_tone
+ person_standing_dark_skin_tone
+ man_standing
+ man_standing_light_skin_tone
+ man_standing_medium_light_skin_tone
+ man_standing_medium_skin_tone
+ man_standing_medium_dark_skin_tone
+ man_standing_dark_skin_tone
+ woman_standing
+ woman_standing_light_skin_tone
+ woman_standing_medium_light_skin_tone
+ woman_standing_medium_skin_tone
+ woman_standing_medium_dark_skin_tone
+ woman_standing_dark_skin_tone
+ person_kneeling
+ person_kneeling_light_skin_tone
+ person_kneeling_medium_light_skin_tone
+ person_kneeling_medium_skin_tone
+ person_kneeling_medium_dark_skin_tone
+ person_kneeling_dark_skin_tone
+ man_kneeling
+ man_kneeling_light_skin_tone
+ man_kneeling_medium_light_skin_tone
+ man_kneeling_medium_skin_tone
+ man_kneeling_medium_dark_skin_tone
+ man_kneeling_dark_skin_tone
+ woman_kneeling
+ woman_kneeling_light_skin_tone
+ woman_kneeling_medium_light_skin_tone
+ woman_kneeling_medium_skin_tone
+ woman_kneeling_medium_dark_skin_tone
+ woman_kneeling_dark_skin_tone
+ man_with_probing_cane
+ man_with_probing_cane_light_skin_tone
+ man_with_probing_cane_medium_light_skin_tone
+ man_with_probing_cane_medium_skin_tone
+ man_with_probing_cane_medium_dark_skin_tone
+ man_with_probing_cane_dark_skin_tone
+ woman_with_probing_cane
+ woman_with_probing_cane_light_skin_tone
+ woman_with_probing_cane_medium_light_skin_tone
+ woman_with_probing_cane_medium_skin_tone
+ woman_with_probing_cane_medium_dark_skin_tone
+ woman_with_probing_cane_dark_skin_tone
+ man_in_motorized_wheelchair
+ man_in_motorized_wheelchair_light_skin_tone
+ man_in_motorized_wheelchair_medium_light_skin_tone
+ man_in_motorized_wheelchair_medium_skin_tone
+ man_in_motorized_wheelchair_medium_dark_skin_tone
+ man_in_motorized_wheelchair_dark_skin_tone
+ woman_in_motorized_wheelchair
+ woman_in_motorized_wheelchair_light_skin_tone
+ woman_in_motorized_wheelchair_medium_light_skin_tone
+ woman_in_motorized_wheelchair_medium_skin_tone
+ woman_in_motorized_wheelchair_medium_dark_skin_tone
+ woman_in_motorized_wheelchair_dark_skin_tone
+ man_in_manual_wheelchair
+ man_in_manual_wheelchair_light_skin_tone
+ man_in_manual_wheelchair_medium_light_skin_tone
+ man_in_manual_wheelchair_medium_skin_tone
+ man_in_manual_wheelchair_medium_dark_skin_tone
+ man_in_manual_wheelchair_dark_skin_tone
+ woman_in_manual_wheelchair
+ woman_in_manual_wheelchair_light_skin_tone
+ woman_in_manual_wheelchair_medium_light_skin_tone
+ woman_in_manual_wheelchair_medium_skin_tone
+ woman_in_manual_wheelchair_medium_dark_skin_tone
+ woman_in_manual_wheelchair_dark_skin_tone
+ person_running
+ person_running_light_skin_tone
+ person_running_medium_light_skin_tone
+ person_running_medium_skin_tone
+ person_running_medium_dark_skin_tone
+ person_running_dark_skin_tone
+ man_running
+ man_running_light_skin_tone
+ man_running_medium_light_skin_tone
+ man_running_medium_skin_tone
+ man_running_medium_dark_skin_tone
+ man_running_dark_skin_tone
+ woman_running
+ woman_running_light_skin_tone
+ woman_running_medium_light_skin_tone
+ woman_running_medium_skin_tone
+ woman_running_medium_dark_skin_tone
+ woman_running_dark_skin_tone
+ woman_dancing
+ woman_dancing_light_skin_tone
+ woman_dancing_medium_light_skin_tone
+ woman_dancing_medium_skin_tone
+ woman_dancing_medium_dark_skin_tone
+ woman_dancing_dark_skin_tone
+ woman_dancing_dark_skin_tone_1
+ man_dancing_light_skin_tone
+ man_dancing_medium_light_skin_tone
+ man_dancing_medium_skin_tone
+ man_dancing_medium_dark_skin_tone
+ man_dancing_dark_skin_tone
+ man_in_suit_levitating
+ man_in_suit_levitating_light_skin_tone
+ man_in_suit_levitating_medium_light_skin_tone
+ man_in_suit_levitating_medium_skin_tone
+ man_in_suit_levitating_medium_dark_skin_tone
+ man_in_suit_levitating_dark_skin_tone
+ people_with_bunny_ears
+ men_with_bunny_ears
+ women_with_bunny_ears
+ person_in_steamy_room
+ person_in_steamy_room_light_skin_tone
+ person_in_steamy_room_medium_light_skin_tone
+ person_in_steamy_room_medium_skin_tone
+ person_in_steamy_room_medium_dark_skin_tone
+ person_in_steamy_room_dark_skin_tone
+ man_in_steamy_room
+ man_in_steamy_room_light_skin_tone
+ man_in_steamy_room_medium_light_skin_tone
+ man_in_steamy_room_medium_skin_tone
+ man_in_steamy_room_medium_dark_skin_tone
+ man_in_steamy_room_dark_skin_tone
+ woman_in_steamy_room
+ woman_in_steamy_room_light_skin_tone
+ woman_in_steamy_room_medium_light_skin_tone
+ woman_in_steamy_room_medium_skin_tone
+ woman_in_steamy_room_medium_dark_skin_tone
+ woman_in_steamy_room_dark_skin_tone
+ person_climbing
+ person_climbing_light_skin_tone
+ person_climbing_medium_light_skin_tone
+ person_climbing_medium_skin_tone
+ person_climbing_medium_dark_skin_tone
+ person_climbing_dark_skin_tone
+ man_climbing
+ man_climbing_light_skin_tone
+ man_climbing_medium_light_skin_tone
+ man_climbing_medium_skin_tone
+ man_climbing_medium_dark_skin_tone
+ man_climbing_dark_skin_tone
+ woman_climbing
+ woman_climbing_light_skin_tone
+ woman_climbing_medium_light_skin_tone
+ woman_climbing_medium_skin_tone
+ woman_climbing_medium_dark_skin_tone
+ woman_climbing_dark_skin_tone
+ person_fencing
+ horse_racing
+ horse_racing_light_skin_tone
+ horse_racing_medium_light_skin_tone
+ horse_racing_medium_skin_tone
+ horse_racing_medium_dark_skin_tone
+ horse_racing_dark_skin_tone
+ skier
+ snowboarder
+ snowboarder_light_skin_tone
+ snowboarder_medium_light_skin_tone
+ snowboarder_medium_skin_tone
+ snowboarder_medium_dark_skin_tone
+ snowboarder_dark_skin_tone
+ person_golfing
+ person_golfing_light_skin_tone
+ person_golfing_medium_light_skin_tone
+ person_golfing_medium_skin_tone
+ person_golfing_medium_dark_skin_tone
+ person_golfing_dark_skin_tone
+ man_golfing
+ man_golfing_light_skin_tone
+ man_golfing_medium_light_skin_tone
+ man_golfing_medium_skin_tone
+ man_golfing_medium_dark_skin_tone
+ man_golfing_dark_skin_tone
+ woman_golfing
+ woman_golfing_light_skin_tone
+ woman_golfing_medium_light_skin_tone
+ woman_golfing_medium_skin_tone
+ woman_golfing_medium_dark_skin_tone
+ woman_golfing_dark_skin_tone
+ person_surfing
+ person_surfing_light_skin_tone
+ person_surfing_medium_light_skin_tone
+ person_surfing_medium_skin_tone
+ person_surfing_medium_dark_skin_tone
+ person_surfing_dark_skin_tone
+ man_surfing
+ man_surfing_light_skin_tone
+ man_surfing_medium_light_skin_tone
+ man_surfing_medium_skin_tone
+ man_surfing_medium_dark_skin_tone
+ man_surfing_dark_skin_tone
+ woman_surfing
+ woman_surfing_light_skin_tone
+ woman_surfing_medium_light_skin_tone
+ woman_surfing_medium_skin_tone
+ woman_surfing_medium_dark_skin_tone
+ woman_surfing_dark_skin_tone
+ person_rowing_boat
+ person_rowing_boat_light_skin_tone
+ person_rowing_boat_medium_light_skin_tone
+ person_rowing_boat_medium_skin_tone
+ person_rowing_boat_medium_dark_skin_tone
+ person_rowing_boat_dark_skin_tone
+ man_rowing_boat
+ man_rowing_boat_light_skin_tone
+ man_rowing_boat_medium_light_skin_tone
+ man_rowing_boat_medium_skin_tone
+ man_rowing_boat_medium_dark_skin_tone
+ man_rowing_boat_dark_skin_tone
+ woman_rowing_boat
+ woman_rowing_boat_light_skin_tone
+ woman_rowing_boat_medium_light_skin_tone
+ woman_rowing_boat_medium_skin_tone
+ woman_rowing_boat_medium_dark_skin_tone
+ woman_rowing_boat_dark_skin_tone
+ person_swimming
+ person_swimming_light_skin_tone
+ person_swimming_medium_light_skin_tone
+ person_swimming_medium_skin_tone
+ person_swimming_medium_dark_skin_tone
+ person_swimming_dark_skin_tone
+ man_swimming
+ man_swimming_light_skin_tone
+ man_swimming_medium_light_skin_tone
+ man_swimming_medium_skin_tone
+ man_swimming_medium_dark_skin_tone
+ man_swimming_dark_skin_tone
+ woman_swimming
+ woman_swimming_light_skin_tone
+ woman_swimming_medium_light_skin_tone
+ woman_swimming_medium_skin_tone
+ woman_swimming_medium_dark_skin_tone
+ woman_swimming_dark_skin_tone
+ person_bouncing_ball
+ person_bouncing_ball_light_skin_tone
+ person_bouncing_ball_medium_light_skin_tone
+ person_bouncing_ball_medium_skin_tone
+ person_bouncing_ball_medium_dark_skin_tone
+ person_bouncing_ball_dark_skin_tone
+ man_bouncing_ball
+ man_bouncing_ball_light_skin_tone
+ man_bouncing_ball_medium_light_skin_tone
+ man_bouncing_ball_medium_skin_tone
+ man_bouncing_ball_medium_dark_skin_tone
+ man_bouncing_ball_dark_skin_tone
+ woman_bouncing_ball
+ woman_bouncing_ball_light_skin_tone
+ woman_bouncing_ball_medium_light_skin_tone
+ woman_bouncing_ball_medium_skin_tone
+ woman_bouncing_ball_medium_dark_skin_tone
+ woman_bouncing_ball_dark_skin_tone
+ person_lifting_weights
+ person_lifting_weights_light_skin_tone
+ person_lifting_weights_medium_light_skin_tone
+ person_lifting_weights_medium_skin_tone
+ person_lifting_weights_medium_dark_skin_tone
+ person_lifting_weights_dark_skin_tone
+ man_lifting_weights
+ man_lifting_weights_light_skin_tone
+ man_lifting_weights_medium_light_skin_tone
+ man_lifting_weights_medium_skin_tone
+ man_lifting_weights_medium_dark_skin_tone
+ man_lifting_weights_dark_skin_tone
+ woman_lifting_weights
+ woman_lifting_weights_light_skin_tone
+ woman_lifting_weights_medium_light_skin_tone
+ woman_lifting_weights_medium_skin_tone
+ woman_lifting_weights_medium_dark_skin_tone
+ woman_lifting_weights_dark_skin_tone
+ person_biking
+ person_biking_light_skin_tone
+ person_biking_medium_light_skin_tone
+ person_biking_medium_skin_tone
+ person_biking_medium_dark_skin_tone
+ person_biking_dark_skin_tone
+ man_biking
+ man_biking_light_skin_tone
+ man_biking_medium_light_skin_tone
+ man_biking_medium_skin_tone
+ man_biking_medium_dark_skin_tone
+ man_biking_dark_skin_tone
+ woman_biking
+ woman_biking_light_skin_tone
+ woman_biking_medium_light_skin_tone
+ woman_biking_medium_skin_tone
+ woman_biking_medium_dark_skin_tone
+ woman_biking_dark_skin_tone
+ person_mountain_biking
+ person_mountain_biking_light_skin_tone
+ person_mountain_biking_medium_light_skin_tone
+ person_mountain_biking_medium_skin_tone
+ person_mountain_biking_medium_dark_skin_tone
+ person_mountain_biking_dark_skin_tone
+ man_mountain_biking
+ man_mountain_biking_light_skin_tone
+ man_mountain_biking_medium_light_skin_tone
+ man_mountain_biking_medium_skin_tone
+ man_mountain_biking_medium_dark_skin_tone
+ man_mountain_biking_dark_skin_tone
+ woman_mountain_biking
+ woman_mountain_biking_light_skin_tone
+ woman_mountain_biking_medium_light_skin_tone
+ woman_mountain_biking_medium_skin_tone
+ woman_mountain_biking_medium_dark_skin_tone
+ woman_mountain_biking_dark_skin_tone
+ person_cartwheeling
+ person_cartwheeling_light_skin_tone
+ person_cartwheeling_medium_light_skin_tone
+ person_cartwheeling_medium_skin_tone
+ person_cartwheeling_medium_dark_skin_tone
+ person_cartwheeling_dark_skin_tone
+ man_cartwheeling
+ man_cartwheeling_light_skin_tone
+ man_cartwheeling_medium_light_skin_tone
+ man_cartwheeling_medium_skin_tone
+ man_cartwheeling_medium_dark_skin_tone
+ man_cartwheeling_dark_skin_tone
+ woman_cartwheeling
+ woman_cartwheeling_light_skin_tone
+ woman_cartwheeling_medium_light_skin_tone
+ woman_cartwheeling_medium_skin_tone
+ woman_cartwheeling_medium_dark_skin_tone
+ woman_cartwheeling_dark_skin_tone
+ people_wrestling
+ men_wrestling
+ women_wrestling
+ person_playing_water_polo
+ person_playing_water_polo_light_skin_tone
+ person_playing_water_polo_medium_light_skin_tone
+ person_playing_water_polo_medium_skin_tone
+ person_playing_water_polo_medium_dark_skin_tone
+ person_playing_water_polo_dark_skin_tone
+ man_playing_water_polo
+ man_playing_water_polo_light_skin_tone
+ man_playing_water_polo_medium_light_skin_tone
+ man_playing_water_polo_medium_skin_tone
+ man_playing_water_polo_medium_dark_skin_tone
+ man_playing_water_polo_dark_skin_tone
+ woman_playing_water_polo
+ woman_playing_water_polo_light_skin_tone
+ woman_playing_water_polo_medium_light_skin_tone
+ woman_playing_water_polo_medium_skin_tone
+ woman_playing_water_polo_medium_dark_skin_tone
+ woman_playing_water_polo_dark_skin_tone
+ person_playing_handball
+ person_playing_handball_light_skin_tone
+ person_playing_handball_medium_light_skin_tone
+ person_playing_handball_medium_skin_tone
+ person_playing_handball_medium_dark_skin_tone
+ person_playing_handball_dark_skin_tone
+ man_playing_handball
+ man_playing_handball_light_skin_tone
+ man_playing_handball_medium_light_skin_tone
+ man_playing_handball_medium_skin_tone
+ man_playing_handball_medium_dark_skin_tone
+ man_playing_handball_dark_skin_tone
+ woman_playing_handball
+ woman_playing_handball_light_skin_tone
+ woman_playing_handball_medium_light_skin_tone
+ woman_playing_handball_medium_skin_tone
+ woman_playing_handball_medium_dark_skin_tone
+ woman_playing_handball_dark_skin_tone
+ person_juggling
+ person_juggling_light_skin_tone
+ person_juggling_medium_light_skin_tone
+ person_juggling_medium_skin_tone
+ person_juggling_medium_dark_skin_tone
+ person_juggling_dark_skin_tone
+ man_juggling
+ man_juggling_light_skin_tone
+ man_juggling_medium_light_skin_tone
+ man_juggling_medium_skin_tone
+ man_juggling_medium_dark_skin_tone
+ man_juggling_dark_skin_tone
+ woman_juggling
+ woman_juggling_light_skin_tone
+ woman_juggling_medium_light_skin_tone
+ woman_juggling_medium_skin_tone
+ woman_juggling_medium_dark_skin_tone
+ woman_juggling_dark_skin_tone
+ person_in_lotus_position
+ person_in_lotus_position_light_skin_tone
+ person_in_lotus_position_medium_light_skin_tone
+ person_in_lotus_position_medium_skin_tone
+ person_in_lotus_position_medium_dark_skin_tone
+ person_in_lotus_position_dark_skin_tone
+ man_in_lotus_position
+ man_in_lotus_position_light_skin_tone
+ man_in_lotus_position_medium_light_skin_tone
+ man_in_lotus_position_medium_skin_tone
+ man_in_lotus_position_medium_dark_skin_tone
+ man_in_lotus_position_dark_skin_tone
+ woman_in_lotus_position
+ woman_in_lotus_position_light_skin_tone
+ woman_in_lotus_position_medium_light_skin_tone
+ woman_in_lotus_position_medium_skin_tone
+ woman_in_lotus_position_medium_dark_skin_tone
+ woman_in_lotus_position_dark_skin_tone
+ person_taking_bath
+ person_taking_bath_light_skin_tone
+ person_taking_bath_medium_light_skin_tone
+ person_taking_bath_medium_skin_tone
+ person_taking_bath_medium_dark_skin_tone
+ person_taking_bath_dark_skin_tone
+ person_in_bed
+ person_in_bed_light_skin_tone
+ person_in_bed_medium_light_skin_tone
+ person_in_bed_medium_skin_tone
+ person_in_bed_medium_dark_skin_tone
+ person_in_bed_dark_skin_tone
+ people_holding_hands
+ people_holding_hands_light_skin_tone
+ people_holding_hands_medium_light_skin_tone_light_skin_tone
+ people_holding_hands_medium_light_skin_tone_light_skin_tone_1
+ people_holding_hands_medium_skin_tone_light_skin_tone
+ people_holding_hands_medium_skin_tone_medium_light_skin_tone
+ people_holding_hands_medium_skin_tone_medium_light_skin_tone_1
+ people_holding_hands_medium_dark_skin_tone_light_skin_tone
+ people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
+ people_holding_hands_medium_dark_skin_tone_medium_skin_tone
+ people_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
+ people_holding_hands_dark_skin_tone_light_skin_tone
+ people_holding_hands_dark_skin_tone_medium_light_skin_tone
+ people_holding_hands_dark_skin_tone_medium_skin_tone
+ people_holding_hands_dark_skin_tone_medium_dark_skin_tone
+ people_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
+ women_holding_hands
+ women_holding_hands_light_skin_tone
+ women_holding_hands_medium_light_skin_tone_light_skin_tone
+ women_holding_hands_medium_light_skin_tone_light_skin_tone_1
+ women_holding_hands_medium_skin_tone_light_skin_tone
+ women_holding_hands_medium_skin_tone_medium_light_skin_tone
+ women_holding_hands_medium_skin_tone_medium_light_skin_tone_1
+ women_holding_hands_medium_dark_skin_tone_light_skin_tone
+ women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
+ women_holding_hands_medium_dark_skin_tone_medium_skin_tone
+ women_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
+ women_holding_hands_dark_skin_tone_light_skin_tone
+ women_holding_hands_dark_skin_tone_medium_light_skin_tone
+ women_holding_hands_dark_skin_tone_medium_skin_tone
+ women_holding_hands_dark_skin_tone_medium_dark_skin_tone
+ women_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
+ woman_and_man_holding_hands
+ woman_and_man_holding_hands_light_skin_tone
+ woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone
+ woman_and_man_holding_hands_light_skin_tone_medium_skin_tone
+ woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone
+ woman_and_man_holding_hands_light_skin_tone_dark_skin_tone
+ woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone
+ woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone_1
+ woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone
+ woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone
+ woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone
+ woman_and_man_holding_hands_medium_skin_tone_light_skin_tone
+ woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone
+ woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone_1
+ woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone
+ woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone
+ woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone
+ woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
+ woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone
+ woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
+ woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone
+ woman_and_man_holding_hands_dark_skin_tone_light_skin_tone
+ woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone
+ woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone
+ woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone
+ woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
+ men_holding_hands
+ men_holding_hands_light_skin_tone
+ men_holding_hands_medium_light_skin_tone_light_skin_tone
+ men_holding_hands_medium_light_skin_tone_light_skin_tone_1
+ men_holding_hands_medium_skin_tone_light_skin_tone
+ men_holding_hands_medium_skin_tone_medium_light_skin_tone
+ men_holding_hands_medium_skin_tone_medium_light_skin_tone_1
+ men_holding_hands_medium_dark_skin_tone_light_skin_tone
+ men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
+ men_holding_hands_medium_dark_skin_tone_medium_skin_tone
+ men_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
+ men_holding_hands_dark_skin_tone_light_skin_tone
+ men_holding_hands_dark_skin_tone_medium_light_skin_tone
+ men_holding_hands_dark_skin_tone_medium_skin_tone
+ men_holding_hands_dark_skin_tone_medium_dark_skin_tone
+ men_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
+ kiss
+ kiss_woman_man
+ kiss_man_man
+ kiss_woman_woman
+ couple_with_heart
+ couple_with_heart_woman_man
+ couple_with_heart_man_man
+ couple_with_heart_woman_woman
+ family
+ family_man_woman_boy
+ family_man_woman_girl
+ family_man_woman_girl_boy
+ family_man_woman_boy_boy
+ family_man_woman_girl_girl
+ family_man_man_boy
+ family_man_man_girl
+ family_man_man_girl_boy
+ family_man_man_boy_boy
+ family_man_man_girl_girl
+ family_woman_woman_boy
+ family_woman_woman_girl
+ family_woman_woman_girl_boy
+ family_woman_woman_boy_boy
+ family_woman_woman_girl_girl
+ family_man_boy
+ family_man_boy_boy
+ family_man_girl
+ family_man_girl_boy
+ family_man_girl_girl
+ family_woman_boy
+ family_woman_boy_boy
+ family_woman_girl
+ family_woman_girl_boy
+ family_woman_girl_girl
+ speaking_head
+ bust_in_silhouette
+ busts_in_silhouette
+ footprints
+"
+
+emoji_groups[animals]="
+ monkey_face
+ monkey_face_1
+ gorilla
+ orangutan
+ dog_face
+ dog_face_1
+ guide_dog
+ service_dog
+ poodle
+ wolf
+ fox
+ raccoon
+ cat_face
+ cat_face_1
+ lion
+ tiger_face
+ tiger_face_1
+ leopard
+ horse_face
+ horse_face_1
+ unicorn
+ zebra
+ deer
+ cow_face
+ ox
+ water_buffalo
+ cow
+ pig_face
+ pig_face_1
+ boar
+ pig_nose
+ ram
+ ewe
+ goat
+ camel
+ two_hump_camel
+ llama
+ giraffe
+ elephant
+ rhinoceros
+ hippopotamus
+ mouse_face
+ mouse_face_1
+ rat
+ hamster
+ rabbit_face
+ rabbit_face_1
+ chipmunk
+ hedgehog
+ bat
+ bear
+ koala
+ panda
+ sloth
+ otter
+ skunk
+ kangaroo
+ badger
+ paw_prints
+ turkey
+ chicken
+ rooster
+ hatching_chick
+ baby_chick
+ front_facing_baby_chick
+ bird
+ penguin
+ dove
+ eagle
+ duck
+ swan
+ owl
+ flamingo
+ peacock
+ parrot
+ frog
+ crocodile
+ turtle
+ lizard
+ snake
+ dragon_face
+ dragon_face_1
+ sauropod
+ T_Rex
+ spouting_whale
+ spouting_whale_1
+ dolphin
+ fish
+ tropical_fish
+ blowfish
+ shark
+ octopus
+ spiral_shell
+ snail
+ butterfly
+ bug
+ ant
+ honeybee
+ lady_beetle
+ cricket
+ spider
+ spider_web
+ scorpion
+ mosquito
+ microbe
+"
+
+emoji_groups[faces]="
+ grinning_face
+ grinning_face_with_big_eyes
+ grinning_face_with_smiling_eyes
+ beaming_face_with_smiling_eyes
+ grinning_squinting_face
+ grinning_face_with_sweat
+ rolling_on_the_floor_laughing
+ face_with_tears_of_joy
+ slightly_smiling_face
+ upside_down_face
+ winking_face
+ smiling_face_with_smiling_eyes
+ smiling_face_with_halo
+ smiling_face_with_hearts
+ smiling_face_with_heart_eyes
+ star_struck
+ face_blowing_a_kiss
+ kissing_face
+ smiling_face
+ kissing_face_with_closed_eyes
+ kissing_face_with_smiling_eyes
+ face_savoring_food
+ face_with_tongue
+ winking_face_with_tongue
+ zany_face
+ squinting_face_with_tongue
+ money_mouth_face
+ hugging_face
+ face_with_hand_over_mouth
+ shushing_face
+ thinking_face
+ zipper_mouth_face
+ face_with_raised_eyebrow
+ neutral_face
+ expressionless_face
+ face_without_mouth
+ smirking_face
+ unamused_face
+ face_with_rolling_eyes
+ grimacing_face
+ lying_face
+ relieved_face
+ pensive_face
+ sleepy_face
+ drooling_face
+ sleeping_face
+ face_with_medical_mask
+ face_with_thermometer
+ face_with_head_bandage
+ nauseated_face
+ face_vomiting
+ sneezing_face
+ hot_face
+ cold_face
+ woozy_face
+ dizzy_face
+ exploding_head
+ cowboy_hat_face
+ partying_face
+ smiling_face_with_sunglasses
+ nerd_face
+ face_with_monocle
+ confused_face
+ worried_face
+ slightly_frowning_face
+ slightly_frowning_face_1
+ face_with_open_mouth
+ hushed_face
+ astonished_face
+ flushed_face
+ pleading_face
+ frowning_face_with_open_mouth
+ anguished_face
+ fearful_face
+ anxious_face_with_sweat
+ sad_but_relieved_face
+ crying_face
+ loudly_crying_face
+ face_screaming_in_fear
+ confounded_face
+ persevering_face
+ disappointed_face
+ downcast_face_with_sweat
+ weary_face
+ tired_face
+ yawning_face
+ face_with_steam_from_nose
+ pouting_face
+ angry_face
+ face_with_symbols_on_mouth
+ smiling_face_with_horns
+ angry_face_with_horns
+ skull
+ skull_and_crossbones
+ pile_of_poo
+ clown_face
+ ogre
+ goblin
+ ghost
+ alien
+ alien_monster
+ robot
+"
+
+emoji_groups[flags]="
+ chequered_flag
+ triangular_flag
+ crossed_flags
+ black_flag
+ white_flag
+ rainbow_flag
+ pirate_flag
+ Ascension_Island
+ Andorra
+ United_Arab_Emirates
+ Afghanistan
+ Antigua_and_Barbuda
+ Anguilla
+ Albania
+ Armenia
+ Angola
+ Antarctica
+ Argentina
+ American_Samoa
+ Austria
+ Australia
+ Aruba
+ Åland_Islands
+ Azerbaijan
+ Bosnia_and_Herzegovina
+ Barbados
+ Bangladesh
+ Belgium
+ Burkina_Faso
+ Bulgaria
+ Bahrain
+ Burundi
+ Benin
+ St_Barthélemy
+ Bermuda
+ Brunei
+ Bolivia
+ Caribbean_Netherlands
+ Brazil
+ Bahamas
+ Bhutan
+ Bouvet_Island
+ Botswana
+ Belarus
+ Belize
+ Canada
+ Cocos_Keeling_Islands
+ Congo__Kinshasa
+ Central_African_Republic
+ Congo__Brazzaville
+ Switzerland
+ Côte_d_Ivoire
+ Cook_Islands
+ Chile
+ Cameroon
+ China
+ Colombia
+ Clipperton_Island
+ Costa_Rica
+ Cuba
+ Cape_Verde
+ Curaçao
+ Christmas_Island
+ Cyprus
+ Czechia
+ Germany
+ Diego_Garcia
+ Djibouti
+ Denmark
+ Dominica
+ Dominican_Republic
+ Algeria
+ Ceuta_and_Melilla
+ Ecuador
+ Estonia
+ Egypt
+ Western_Sahara
+ Eritrea
+ Spain
+ Ethiopia
+ European_Union
+ Finland
+ Fiji
+ Falkland_Islands
+ Micronesia
+ Faroe_Islands
+ France
+ Gabon
+ United_Kingdom
+ Grenada
+ Georgia
+ French_Guiana
+ Guernsey
+ Ghana
+ Gibraltar
+ Greenland
+ Gambia
+ Guinea
+ Guadeloupe
+ Equatorial_Guinea
+ Greece
+ South_Georgia_and_South_Sandwich_Islands
+ Guatemala
+ Guam
+ Guinea_Bissau
+ Guyana
+ Hong_Kong_SAR_China
+ Heard_and_McDonald_Islands
+ Honduras
+ Croatia
+ Haiti
+ Hungary
+ Canary_Islands
+ Indonesia
+ Ireland
+ Israel
+ Isle_of_Man
+ India
+ British_Indian_Ocean_Territory
+ Iraq
+ Iran
+ Iceland
+ Italy
+ Jersey
+ Jamaica
+ Jordan
+ Japan
+ Kenya
+ Kyrgyzstan
+ Cambodia
+ Kiribati
+ Comoros
+ St_Kitts_and_Nevis
+ North_Korea
+ South_Korea
+ Kuwait
+ Cayman_Islands
+ Kazakhstan
+ Laos
+ Lebanon
+ St_Lucia
+ Liechtenstein
+ Sri_Lanka
+ Liberia
+ Lesotho
+ Lithuania
+ Luxembourg
+ Latvia
+ Libya
+ Morocco
+ Monaco
+ Moldova
+ Montenegro
+ St_Martin
+ Madagascar
+ Marshall_Islands
+ Macedonia
+ Mali
+ Myanmar_Burma_
+ Mongolia
+ Macao_SAR_China
+ Northern_Mariana_Islands
+ Martinique
+ Mauritania
+ Montserrat
+ Malta
+ Mauritius
+ Maldives
+ Malawi
+ Mexico
+ Malaysia
+ Mozambique
+ Namibia
+ New_Caledonia
+ Niger
+ Norfolk_Island
+ Nigeria
+ Nicaragua
+ Netherlands
+ Norway
+ Nepal
+ Nauru
+ Niue
+ New_Zealand
+ Oman
+ Panama
+ Peru
+ French_Polynesia
+ Papua_New_Guinea
+ Philippines
+ Pakistan
+ Poland
+ St_Pierre_and_Miquelon
+ Pitcairn_Islands
+ Puerto_Rico
+ Palestinian_Territories
+ Portugal
+ Palau
+ Paraguay
+ Qatar
+ Réunion
+ Romania
+ Serbia
+ Russia
+ Rwanda
+ Saudi_Arabia
+ Solomon_Islands
+ Seychelles
+ Sudan
+ Sweden
+ Singapore
+ St_Helena
+ Slovenia
+ Svalbard_and_Jan_Mayen
+ Slovakia
+ Sierra_Leone
+ San_Marino
+ Senegal
+ Somalia
+ Suriname
+ South_Sudan
+ São_Tomé_and_Príncipe
+ El_Salvador
+ Sint_Maarten
+ Syria
+ Eswatini
+ Tristan_da_Cunha
+ Turks_and_Caicos_Islands
+ Chad
+ French_Southern_Territories
+ Togo
+ Thailand
+ Tajikistan
+ Tokelau
+ Timor_Leste
+ Turkmenistan
+ Tunisia
+ Tonga
+ Turkey
+ Trinidad_and_Tobago
+ Tuvalu
+ Taiwan
+ Tanzania
+ Ukraine
+ Uganda
+ U_S_Outlying_Islands
+ United_Nations
+ United_States
+ Uruguay
+ Uzbekistan
+ Vatican_City
+ St_Vincent_and_Grenadines
+ Venezuela
+ British_Virgin_Islands
+ U_S_Virgin_Islands
+ Vietnam
+ Vanuatu
+ Wallis_and_Futuna
+ Samoa
+ Kosovo
+ Yemen
+ Mayotte
+ South_Africa
+ Zambia
+ Zimbabwe
+ England
+ Scotland
+ Wales
+"
diff --git a/plugins/emoji/emoji-data.txt b/plugins/emoji/emoji-data.txt
index 2d6d64e2b..59b7e92d7 100644
--- a/plugins/emoji/emoji-data.txt
+++ b/plugins/emoji/emoji-data.txt
@@ -1,1308 +1,4122 @@
-# DRAFT emoji-data.txt
-# For details about the format and other information, see /../../../reports/tr51/index.html#Data_Files.
+# emoji-data.txt
+# (Originally emoji-test.txt)
+# (Retrieved from https://unicode.org/Public/emoji/12.0/emoji-test.txt)
+
+# Date: 2019-01-27, 15:43:01 GMT
+# © 2019 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
#
-# Format: Code ; Default_Emoji_Style ; Emoji_Level ; Emoji_Modifier_Status ; Emoji_Sources # Comment
+# Emoji Keyboard/Display Test Data for UTS #51
+# Version: 12.0
#
-# Field 1 — Default_Emoji_Style:
-# text: default text presentation
-# emoji: default emoji presentation
-# Field 2 — Emoji_Level:
-# L1: level 1 emoji
-# L2: level 2 emoji
-# NA: not applicable
-# Field 3 — Emoji_Modifier_Status:
-# modifier: an emoji modifier
-# primary: a primary emoji modifier base
-# secondary: a secondary emoji modifier base
-# none: not applicable
-# Field 4 — Emoji_Sources:
-# one or more values from {z, a, j, w, x}
-# see the key in https://www.unicode.org/draft/reports/tr51/tr51.html#Major_Sources
-# NA: not applicable
-# Comment — currently contains the version where the character was first encoded,
-# followed by:
-# - a character name in uppercase (for a single character),
-# - a keycap name,
-# - an associated flag, where is associated with value unicode region code
+# For documentation and usage, see http://www.unicode.org/reports/tr51
#
-00A9 ; text ; L1 ; none ; j # V1.1 (©) COPYRIGHT SIGN
-00AE ; text ; L1 ; none ; j # V1.1 (®) REGISTERED SIGN
-203C ; text ; L1 ; none ; a j # V1.1 (‼) DOUBLE EXCLAMATION MARK
-2049 ; text ; L1 ; none ; a j # V3.0 (⁉) EXCLAMATION QUESTION MARK
-2122 ; text ; L1 ; none ; j # V1.1 (™) TRADE MARK SIGN
-2139 ; text ; L1 ; none ; j # V3.0 (ℹ) INFORMATION SOURCE
-2194 ; text ; L1 ; none ; z j # V1.1 (↔) LEFT RIGHT ARROW
-2195 ; text ; L1 ; none ; z j # V1.1 (↕) UP DOWN ARROW
-2196 ; text ; L1 ; none ; j # V1.1 (↖) NORTH WEST ARROW
-2197 ; text ; L1 ; none ; j # V1.1 (↗) NORTH EAST ARROW
-2198 ; text ; L1 ; none ; j # V1.1 (↘) SOUTH EAST ARROW
-2199 ; text ; L1 ; none ; j # V1.1 (↙) SOUTH WEST ARROW
-21A9 ; text ; L1 ; none ; j # V1.1 (↩) LEFTWARDS ARROW WITH HOOK
-21AA ; text ; L1 ; none ; j # V1.1 (↪) RIGHTWARDS ARROW WITH HOOK
-231A ; emoji ; L1 ; none ; j # V1.1 (⌚) WATCH
-231B ; emoji ; L1 ; none ; j # V1.1 (⌛) HOURGLASS
-2328 ; text ; L2 ; none ; x # V1.1 (⌨) KEYBOARD
-23CF ; text ; L2 ; none ; x # V4.0 (⏏) EJECT SYMBOL
-23E9 ; emoji ; L1 ; none ; j w # V6.0 (⏩) BLACK RIGHT-POINTING DOUBLE TRIANGLE
-23EA ; emoji ; L1 ; none ; j w # V6.0 (⏪) BLACK LEFT-POINTING DOUBLE TRIANGLE
-23EB ; emoji ; L1 ; none ; j # V6.0 (⏫) BLACK UP-POINTING DOUBLE TRIANGLE
-23EC ; emoji ; L1 ; none ; j # V6.0 (⏬) BLACK DOWN-POINTING DOUBLE TRIANGLE
-23ED ; text ; L2 ; none ; w # V6.0 (⏭) BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR
-23EE ; text ; L2 ; none ; w # V6.0 (⏮) BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR
-23EF ; text ; L2 ; none ; x # V6.0 (⏯) BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR
-23F0 ; emoji ; L1 ; none ; j # V6.0 (⏰) ALARM CLOCK
-23F1 ; text ; L2 ; none ; x # V6.0 (⏱) STOPWATCH
-23F2 ; text ; L2 ; none ; x # V6.0 (⏲) TIMER CLOCK
-23F3 ; emoji ; L1 ; none ; j w # V6.0 (⏳) HOURGLASS WITH FLOWING SAND
-23F8 ; text ; L2 ; none ; w # V7.0 (⏸) DOUBLE VERTICAL BAR
-23F9 ; text ; L2 ; none ; w # V7.0 (⏹) BLACK SQUARE FOR STOP
-23FA ; text ; L2 ; none ; w # V7.0 (⏺) BLACK CIRCLE FOR RECORD
-24C2 ; text ; L1 ; none ; j # V1.1 (Ⓜ) CIRCLED LATIN CAPITAL LETTER M
-25AA ; text ; L1 ; none ; j w # V1.1 (▪) BLACK SMALL SQUARE
-25AB ; text ; L1 ; none ; j # V1.1 (▫) WHITE SMALL SQUARE
-25B6 ; text ; L1 ; none ; a j w # V1.1 (▶) BLACK RIGHT-POINTING TRIANGLE
-25C0 ; text ; L1 ; none ; a j w # V1.1 (◀) BLACK LEFT-POINTING TRIANGLE
-25FB ; text ; L1 ; none ; j # V3.2 (◻) WHITE MEDIUM SQUARE
-25FC ; text ; L1 ; none ; j w # V3.2 (◼) BLACK MEDIUM SQUARE
-25FD ; emoji ; L1 ; none ; j # V3.2 (◽) WHITE MEDIUM SMALL SQUARE
-25FE ; emoji ; L1 ; none ; j w # V3.2 (◾) BLACK MEDIUM SMALL SQUARE
-2600 ; text ; L1 ; none ; a j # V1.1 (☀) BLACK SUN WITH RAYS
-2601 ; text ; L1 ; none ; a j w # V1.1 (☁) CLOUD
-2602 ; text ; L2 ; none ; a # V1.1 (☂) UMBRELLA
-2603 ; text ; L2 ; none ; a # V1.1 (☃) SNOWMAN
-2604 ; text ; L2 ; none ; x # V1.1 (☄) COMET
-260E ; text ; L1 ; none ; z a j # V1.1 (☎) BLACK TELEPHONE
-2611 ; text ; L1 ; none ; j w # V1.1 (☑) BALLOT BOX WITH CHECK
-2614 ; emoji ; L1 ; none ; a j # V4.0 (☔) UMBRELLA WITH RAIN DROPS
-2615 ; emoji ; L1 ; none ; j # V4.0 (☕) HOT BEVERAGE
-2618 ; text ; L2 ; none ; x # V4.1 (☘) SHAMROCK
-261D ; text ; L1 ; secondary ; j w # V1.1 (☝) WHITE UP POINTING INDEX
-2620 ; text ; L2 ; none ; x # V1.1 (☠) SKULL AND CROSSBONES
-2622 ; text ; L2 ; none ; x # V1.1 (☢) RADIOACTIVE SIGN
-2623 ; text ; L2 ; none ; x # V1.1 (☣) BIOHAZARD SIGN
-2626 ; text ; L2 ; none ; x # V1.1 (☦) ORTHODOX CROSS
-262A ; text ; L2 ; none ; w # V1.1 (☪) STAR AND CRESCENT
-262E ; text ; L2 ; none ; x # V1.1 (☮) PEACE SYMBOL
-262F ; text ; L2 ; none ; w # V1.1 (☯) YIN YANG
-2638 ; text ; L2 ; none ; w # V1.1 (☸) WHEEL OF DHARMA
-2639 ; text ; L2 ; secondary ; w # V1.1 (☹) WHITE FROWNING FACE
-263A ; text ; L1 ; secondary ; j w # V1.1 (☺) WHITE SMILING FACE
-2648 ; emoji ; L1 ; none ; j w # V1.1 (♈) ARIES
-2649 ; emoji ; L1 ; none ; j w # V1.1 (♉) TAURUS
-264A ; emoji ; L1 ; none ; j w # V1.1 (♊) GEMINI
-264B ; emoji ; L1 ; none ; j w # V1.1 (♋) CANCER
-264C ; emoji ; L1 ; none ; j w # V1.1 (♌) LEO
-264D ; emoji ; L1 ; none ; j w # V1.1 (♍) VIRGO
-264E ; emoji ; L1 ; none ; j w # V1.1 (♎) LIBRA
-264F ; emoji ; L1 ; none ; j w # V1.1 (♏) SCORPIUS
-2650 ; emoji ; L1 ; none ; j w # V1.1 (♐) SAGITTARIUS
-2651 ; emoji ; L1 ; none ; j w # V1.1 (♑) CAPRICORN
-2652 ; emoji ; L1 ; none ; j w # V1.1 (♒) AQUARIUS
-2653 ; emoji ; L1 ; none ; j w # V1.1 (♓) PISCES
-2660 ; text ; L1 ; none ; z a j # V1.1 (♠) BLACK SPADE SUIT
-2663 ; text ; L1 ; none ; z a j # V1.1 (♣) BLACK CLUB SUIT
-2665 ; text ; L1 ; none ; z a j # V1.1 (♥) BLACK HEART SUIT
-2666 ; text ; L1 ; none ; z a j # V1.1 (♦) BLACK DIAMOND SUIT
-2668 ; text ; L1 ; none ; a j # V1.1 (♨) HOT SPRINGS
-267B ; text ; L1 ; none ; j # V3.2 (♻) BLACK UNIVERSAL RECYCLING SYMBOL
-267F ; emoji ; L1 ; none ; j w # V4.1 (♿) WHEELCHAIR SYMBOL
-2692 ; text ; L2 ; none ; x # V4.1 (⚒) HAMMER AND PICK
-2693 ; emoji ; L1 ; none ; a j # V4.1 (⚓) ANCHOR
-2694 ; text ; L2 ; none ; x # V4.1 (⚔) CROSSED SWORDS
-2696 ; text ; L2 ; none ; x # V4.1 (⚖) SCALES
-2697 ; text ; L2 ; none ; x # V4.1 (⚗) ALEMBIC
-2699 ; text ; L2 ; none ; x # V4.1 (⚙) GEAR
-269B ; text ; L2 ; none ; x # V4.1 (⚛) ATOM SYMBOL
-269C ; text ; L2 ; none ; x # V4.1 (⚜) FLEUR-DE-LIS
-26A0 ; text ; L1 ; none ; j # V4.0 (⚠) WARNING SIGN
-26A1 ; emoji ; L1 ; none ; a j # V4.0 (⚡) HIGH VOLTAGE SIGN
-26AA ; emoji ; L1 ; none ; j # V4.1 (⚪) MEDIUM WHITE CIRCLE
-26AB ; emoji ; L1 ; none ; j w # V4.1 (⚫) MEDIUM BLACK CIRCLE
-26B0 ; text ; L2 ; none ; x # V4.1 (⚰) COFFIN
-26B1 ; text ; L2 ; none ; x # V4.1 (⚱) FUNERAL URN
-26BD ; emoji ; L1 ; none ; j # V5.2 (⚽) SOCCER BALL
-26BE ; emoji ; L1 ; none ; a j # V5.2 (⚾) BASEBALL
-26C4 ; emoji ; L1 ; none ; a j # V5.2 (⛄) SNOWMAN WITHOUT SNOW
-26C5 ; emoji ; L1 ; none ; a j # V5.2 (⛅) SUN BEHIND CLOUD
-26C8 ; text ; L2 ; none ; a # V5.2 (⛈) THUNDER CLOUD AND RAIN
-26CE ; emoji ; L1 ; none ; a j # V6.0 (⛎) OPHIUCHUS
-26CF ; text ; L2 ; none ; a # V5.2 (⛏) PICK
-26D1 ; text ; L2 ; none ; a # V5.2 (⛑) HELMET WITH WHITE CROSS
-26D3 ; text ; L2 ; none ; a # V5.2 (⛓) CHAINS
-26D4 ; emoji ; L1 ; none ; a j # V5.2 (⛔) NO ENTRY
-26E9 ; text ; L2 ; none ; a # V5.2 (⛩) SHINTO SHRINE
-26EA ; emoji ; L1 ; none ; a j # V5.2 (⛪) CHURCH
-26F0 ; text ; L2 ; none ; a # V5.2 (⛰) MOUNTAIN
-26F1 ; text ; L2 ; none ; a # V5.2 (⛱) UMBRELLA ON GROUND
-26F2 ; emoji ; L1 ; none ; a j # V5.2 (⛲) FOUNTAIN
-26F3 ; emoji ; L1 ; none ; a j w # V5.2 (⛳) FLAG IN HOLE
-26F4 ; text ; L2 ; none ; a # V5.2 (⛴) FERRY
-26F5 ; emoji ; L1 ; none ; a j # V5.2 (⛵) SAILBOAT
-26F7 ; text ; L2 ; none ; a w # V5.2 (⛷) SKIER
-26F8 ; text ; L2 ; none ; a # V5.2 (⛸) ICE SKATE
-26F9 ; text ; L2 ; none ; a # V5.2 (⛹) PERSON WITH BALL
-26FA ; emoji ; L1 ; none ; a j # V5.2 (⛺) TENT
-26FD ; emoji ; L1 ; none ; a j # V5.2 (⛽) FUEL PUMP
-2702 ; text ; L1 ; none ; z j w # V1.1 (✂) BLACK SCISSORS
-2705 ; emoji ; L1 ; none ; j # V6.0 (✅) WHITE HEAVY CHECK MARK
-2708 ; text ; L1 ; none ; z a j w # V1.1 (✈) AIRPLANE
-2709 ; text ; L1 ; none ; z j # V1.1 (✉) ENVELOPE
-270A ; emoji ; L1 ; secondary ; j # V6.0 (✊) RAISED FIST
-270B ; emoji ; L1 ; secondary ; j # V6.0 (✋) RAISED HAND
-270C ; text ; L1 ; secondary ; z j w # V1.1 (✌) VICTORY HAND
-270D ; text ; L2 ; secondary ; z w # V1.1 (✍) WRITING HAND
-270F ; text ; L1 ; none ; z j # V1.1 (✏) PENCIL
-2712 ; text ; L1 ; none ; z j # V1.1 (✒) BLACK NIB
-2714 ; text ; L1 ; none ; z j w # V1.1 (✔) HEAVY CHECK MARK
-2716 ; text ; L1 ; none ; z j # V1.1 (✖) HEAVY MULTIPLICATION X
-271D ; text ; L2 ; none ; w # V1.1 (✝) LATIN CROSS
-2721 ; text ; L2 ; none ; w # V1.1 (✡) STAR OF DAVID
-2728 ; emoji ; L1 ; none ; j # V6.0 (✨) SPARKLES
-2733 ; text ; L1 ; none ; z j # V1.1 (✳) EIGHT SPOKED ASTERISK
-2734 ; text ; L1 ; none ; z j # V1.1 (✴) EIGHT POINTED BLACK STAR
-2744 ; text ; L1 ; none ; z j w # V1.1 (❄) SNOWFLAKE
-2747 ; text ; L1 ; none ; z j # V1.1 (❇) SPARKLE
-274C ; emoji ; L1 ; none ; j # V6.0 (❌) CROSS MARK
-274E ; emoji ; L1 ; none ; j # V6.0 (❎) NEGATIVE SQUARED CROSS MARK
-2753 ; emoji ; L1 ; none ; j w # V6.0 (❓) BLACK QUESTION MARK ORNAMENT
-2754 ; emoji ; L1 ; none ; j # V6.0 (❔) WHITE QUESTION MARK ORNAMENT
-2755 ; emoji ; L1 ; none ; j # V6.0 (❕) WHITE EXCLAMATION MARK ORNAMENT
-2757 ; emoji ; L1 ; none ; j # V5.2 (❗) HEAVY EXCLAMATION MARK SYMBOL
-2763 ; text ; L2 ; none ; z # V1.1 (❣) HEAVY HEART EXCLAMATION MARK ORNAMENT
-2764 ; text ; L1 ; none ; z j # V1.1 (❤) HEAVY BLACK HEART
-2795 ; emoji ; L1 ; none ; j # V6.0 (➕) HEAVY PLUS SIGN
-2796 ; emoji ; L1 ; none ; j # V6.0 (➖) HEAVY MINUS SIGN
-2797 ; emoji ; L1 ; none ; j # V6.0 (➗) HEAVY DIVISION SIGN
-27A1 ; text ; L1 ; none ; z a j # V1.1 (➡) BLACK RIGHTWARDS ARROW
-27B0 ; emoji ; L1 ; none ; j # V6.0 (➰) CURLY LOOP
-27BF ; emoji ; L1 ; none ; x # V6.0 (➿) DOUBLE CURLY LOOP
-2934 ; text ; L1 ; none ; j # V3.2 (⤴) ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
-2935 ; text ; L1 ; none ; j # V3.2 (⤵) ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
-2B05 ; text ; L1 ; none ; a j # V4.0 (⬅) LEFTWARDS BLACK ARROW
-2B06 ; text ; L1 ; none ; a j # V4.0 (⬆) UPWARDS BLACK ARROW
-2B07 ; text ; L1 ; none ; a j # V4.0 (⬇) DOWNWARDS BLACK ARROW
-2B1B ; emoji ; L1 ; none ; a j w # V5.1 (⬛) BLACK LARGE SQUARE
-2B1C ; emoji ; L1 ; none ; j w # V5.1 (⬜) WHITE LARGE SQUARE
-2B50 ; emoji ; L1 ; none ; j # V5.1 (⭐) WHITE MEDIUM STAR
-2B55 ; emoji ; L1 ; none ; j # V5.2 (⭕) HEAVY LARGE CIRCLE
-3030 ; text ; L1 ; none ; j # V1.1 (〰) WAVY DASH
-303D ; text ; L1 ; none ; j # V3.2 (〽) PART ALTERNATION MARK
-3297 ; text ; L1 ; none ; j # V1.1 (㊗) CIRCLED IDEOGRAPH CONGRATULATION
-3299 ; text ; L1 ; none ; a j # V1.1 (㊙) CIRCLED IDEOGRAPH SECRET
-1F004 ; emoji ; L1 ; none ; j # V5.1 (🀄) MAHJONG TILE RED DRAGON
-1F0CF ; emoji ; L1 ; none ; j # V6.0 (🃏) PLAYING CARD BLACK JOKER
-1F170 ; text ; L1 ; none ; j # V6.0 (🅰) NEGATIVE SQUARED LATIN CAPITAL LETTER A
-1F171 ; text ; L1 ; none ; j # V6.0 (🅱) NEGATIVE SQUARED LATIN CAPITAL LETTER B
-1F17E ; text ; L1 ; none ; j # V6.0 (🅾) NEGATIVE SQUARED LATIN CAPITAL LETTER O
-1F17F ; text ; L1 ; none ; a j # V5.2 (🅿) NEGATIVE SQUARED LATIN CAPITAL LETTER P
-1F18E ; emoji ; L1 ; none ; j # V6.0 (🆎) NEGATIVE SQUARED AB
-1F191 ; emoji ; L1 ; none ; j # V6.0 (🆑) SQUARED CL
-1F192 ; emoji ; L1 ; none ; j # V6.0 (🆒) SQUARED COOL
-1F193 ; emoji ; L1 ; none ; j # V6.0 (🆓) SQUARED FREE
-1F194 ; emoji ; L1 ; none ; j # V6.0 (🆔) SQUARED ID
-1F195 ; emoji ; L1 ; none ; j # V6.0 (🆕) SQUARED NEW
-1F196 ; emoji ; L1 ; none ; j # V6.0 (🆖) SQUARED NG
-1F197 ; emoji ; L1 ; none ; j # V6.0 (🆗) SQUARED OK
-1F198 ; emoji ; L1 ; none ; j # V6.0 (🆘) SQUARED SOS
-1F199 ; emoji ; L1 ; none ; j # V6.0 (🆙) SQUARED UP WITH EXCLAMATION MARK
-1F19A ; emoji ; L1 ; none ; j # V6.0 (🆚) SQUARED VS
-1F201 ; emoji ; L1 ; none ; j # V6.0 (🈁) SQUARED KATAKANA KOKO
-1F202 ; text ; L1 ; none ; j # V6.0 (🈂) SQUARED KATAKANA SA
-1F21A ; emoji ; L1 ; none ; a j # V5.2 (🈚) SQUARED CJK UNIFIED IDEOGRAPH-7121
-1F22F ; emoji ; L1 ; none ; a j # V5.2 (🈯) SQUARED CJK UNIFIED IDEOGRAPH-6307
-1F232 ; emoji ; L1 ; none ; j # V6.0 (🈲) SQUARED CJK UNIFIED IDEOGRAPH-7981
-1F233 ; emoji ; L1 ; none ; j # V6.0 (🈳) SQUARED CJK UNIFIED IDEOGRAPH-7A7A
-1F234 ; emoji ; L1 ; none ; j # V6.0 (🈴) SQUARED CJK UNIFIED IDEOGRAPH-5408
-1F235 ; emoji ; L1 ; none ; j # V6.0 (🈵) SQUARED CJK UNIFIED IDEOGRAPH-6E80
-1F236 ; emoji ; L1 ; none ; j # V6.0 (🈶) SQUARED CJK UNIFIED IDEOGRAPH-6709
-1F237 ; text ; L1 ; none ; j # V6.0 (🈷) SQUARED CJK UNIFIED IDEOGRAPH-6708
-1F238 ; emoji ; L1 ; none ; j # V6.0 (🈸) SQUARED CJK UNIFIED IDEOGRAPH-7533
-1F239 ; emoji ; L1 ; none ; j # V6.0 (🈹) SQUARED CJK UNIFIED IDEOGRAPH-5272
-1F23A ; emoji ; L1 ; none ; j # V6.0 (🈺) SQUARED CJK UNIFIED IDEOGRAPH-55B6
-1F250 ; emoji ; L1 ; none ; j # V6.0 (🉐) CIRCLED IDEOGRAPH ADVANTAGE
-1F251 ; emoji ; L1 ; none ; j # V6.0 (🉑) CIRCLED IDEOGRAPH ACCEPT
-1F300 ; emoji ; L1 ; none ; j # V6.0 (🌀) CYCLONE
-1F301 ; emoji ; L1 ; none ; j # V6.0 (🌁) FOGGY
-1F302 ; emoji ; L1 ; none ; j # V6.0 (🌂) CLOSED UMBRELLA
-1F303 ; emoji ; L1 ; none ; j # V6.0 (🌃) NIGHT WITH STARS
-1F304 ; emoji ; L1 ; none ; j # V6.0 (🌄) SUNRISE OVER MOUNTAINS
-1F305 ; emoji ; L1 ; none ; j # V6.0 (🌅) SUNRISE
-1F306 ; emoji ; L1 ; none ; j # V6.0 (🌆) CITYSCAPE AT DUSK
-1F307 ; emoji ; L1 ; none ; j # V6.0 (🌇) SUNSET OVER BUILDINGS
-1F308 ; emoji ; L1 ; none ; j # V6.0 (🌈) RAINBOW
-1F309 ; emoji ; L1 ; none ; j # V6.0 (🌉) BRIDGE AT NIGHT
-1F30A ; emoji ; L1 ; none ; j # V6.0 (🌊) WATER WAVE
-1F30B ; emoji ; L1 ; none ; j # V6.0 (🌋) VOLCANO
-1F30C ; emoji ; L1 ; none ; j # V6.0 (🌌) MILKY WAY
-1F30D ; emoji ; L1 ; none ; w # V6.0 (🌍) EARTH GLOBE EUROPE-AFRICA
-1F30E ; emoji ; L1 ; none ; w # V6.0 (🌎) EARTH GLOBE AMERICAS
-1F30F ; emoji ; L1 ; none ; j w # V6.0 (🌏) EARTH GLOBE ASIA-AUSTRALIA
-1F310 ; emoji ; L1 ; none ; x # V6.0 (🌐) GLOBE WITH MERIDIANS
-1F311 ; emoji ; L1 ; none ; j # V6.0 (🌑) NEW MOON SYMBOL
-1F312 ; emoji ; L1 ; none ; x # V6.0 (🌒) WAXING CRESCENT MOON SYMBOL
-1F313 ; emoji ; L1 ; none ; j # V6.0 (🌓) FIRST QUARTER MOON SYMBOL
-1F314 ; emoji ; L1 ; none ; j # V6.0 (🌔) WAXING GIBBOUS MOON SYMBOL
-1F315 ; emoji ; L1 ; none ; j w # V6.0 (🌕) FULL MOON SYMBOL
-1F316 ; emoji ; L1 ; none ; x # V6.0 (🌖) WANING GIBBOUS MOON SYMBOL
-1F317 ; emoji ; L1 ; none ; x # V6.0 (🌗) LAST QUARTER MOON SYMBOL
-1F318 ; emoji ; L1 ; none ; x # V6.0 (🌘) WANING CRESCENT MOON SYMBOL
-1F319 ; emoji ; L1 ; none ; j # V6.0 (🌙) CRESCENT MOON
-1F31A ; emoji ; L1 ; none ; x # V6.0 (🌚) NEW MOON WITH FACE
-1F31B ; emoji ; L1 ; none ; j # V6.0 (🌛) FIRST QUARTER MOON WITH FACE
-1F31C ; emoji ; L1 ; none ; w # V6.0 (🌜) LAST QUARTER MOON WITH FACE
-1F31D ; emoji ; L1 ; none ; x # V6.0 (🌝) FULL MOON WITH FACE
-1F31E ; emoji ; L1 ; none ; x # V6.0 (🌞) SUN WITH FACE
-1F31F ; emoji ; L1 ; none ; j # V6.0 (🌟) GLOWING STAR
-1F320 ; emoji ; L1 ; none ; j # V6.0 (🌠) SHOOTING STAR
-1F321 ; text ; L2 ; none ; w # V7.0 (🌡) THERMOMETER
-1F324 ; text ; L2 ; none ; w # V7.0 (🌤) WHITE SUN WITH SMALL CLOUD
-1F325 ; text ; L2 ; none ; w # V7.0 (🌥) WHITE SUN BEHIND CLOUD
-1F326 ; text ; L2 ; none ; w # V7.0 (🌦) WHITE SUN BEHIND CLOUD WITH RAIN
-1F327 ; text ; L2 ; none ; w # V7.0 (🌧) CLOUD WITH RAIN
-1F328 ; text ; L2 ; none ; w # V7.0 (🌨) CLOUD WITH SNOW
-1F329 ; text ; L2 ; none ; w # V7.0 (🌩) CLOUD WITH LIGHTNING
-1F32A ; text ; L2 ; none ; w # V7.0 (🌪) CLOUD WITH TORNADO
-1F32B ; text ; L2 ; none ; w # V7.0 (🌫) FOG
-1F32C ; text ; L2 ; none ; w # V7.0 (🌬) WIND BLOWING FACE
-1F32D ; emoji ; L2 ; none ; x # V8.0 (🌭) HOT DOG
-1F32E ; emoji ; L2 ; none ; x # V8.0 (🌮) TACO
-1F32F ; emoji ; L2 ; none ; x # V8.0 (🌯) BURRITO
-1F330 ; emoji ; L1 ; none ; j # V6.0 (🌰) CHESTNUT
-1F331 ; emoji ; L1 ; none ; j # V6.0 (🌱) SEEDLING
-1F332 ; emoji ; L1 ; none ; x # V6.0 (🌲) EVERGREEN TREE
-1F333 ; emoji ; L1 ; none ; x # V6.0 (🌳) DECIDUOUS TREE
-1F334 ; emoji ; L1 ; none ; j # V6.0 (🌴) PALM TREE
-1F335 ; emoji ; L1 ; none ; j # V6.0 (🌵) CACTUS
-1F336 ; text ; L2 ; none ; w # V7.0 (🌶) HOT PEPPER
-1F337 ; emoji ; L1 ; none ; j # V6.0 (🌷) TULIP
-1F338 ; emoji ; L1 ; none ; j # V6.0 (🌸) CHERRY BLOSSOM
-1F339 ; emoji ; L1 ; none ; j # V6.0 (🌹) ROSE
-1F33A ; emoji ; L1 ; none ; j # V6.0 (🌺) HIBISCUS
-1F33B ; emoji ; L1 ; none ; j # V6.0 (🌻) SUNFLOWER
-1F33C ; emoji ; L1 ; none ; j # V6.0 (🌼) BLOSSOM
-1F33D ; emoji ; L1 ; none ; j # V6.0 (🌽) EAR OF MAIZE
-1F33E ; emoji ; L1 ; none ; j # V6.0 (🌾) EAR OF RICE
-1F33F ; emoji ; L1 ; none ; j # V6.0 (🌿) HERB
-1F340 ; emoji ; L1 ; none ; j # V6.0 (🍀) FOUR LEAF CLOVER
-1F341 ; emoji ; L1 ; none ; j # V6.0 (🍁) MAPLE LEAF
-1F342 ; emoji ; L1 ; none ; j # V6.0 (🍂) FALLEN LEAF
-1F343 ; emoji ; L1 ; none ; j # V6.0 (🍃) LEAF FLUTTERING IN WIND
-1F344 ; emoji ; L1 ; none ; j # V6.0 (🍄) MUSHROOM
-1F345 ; emoji ; L1 ; none ; j # V6.0 (🍅) TOMATO
-1F346 ; emoji ; L1 ; none ; j # V6.0 (🍆) AUBERGINE
-1F347 ; emoji ; L1 ; none ; j # V6.0 (🍇) GRAPES
-1F348 ; emoji ; L1 ; none ; j # V6.0 (🍈) MELON
-1F349 ; emoji ; L1 ; none ; j # V6.0 (🍉) WATERMELON
-1F34A ; emoji ; L1 ; none ; j # V6.0 (🍊) TANGERINE
-1F34B ; emoji ; L1 ; none ; x # V6.0 (🍋) LEMON
-1F34C ; emoji ; L1 ; none ; j # V6.0 (🍌) BANANA
-1F34D ; emoji ; L1 ; none ; j # V6.0 (🍍) PINEAPPLE
-1F34E ; emoji ; L1 ; none ; j # V6.0 (🍎) RED APPLE
-1F34F ; emoji ; L1 ; none ; j # V6.0 (🍏) GREEN APPLE
-1F350 ; emoji ; L1 ; none ; x # V6.0 (🍐) PEAR
-1F351 ; emoji ; L1 ; none ; j # V6.0 (🍑) PEACH
-1F352 ; emoji ; L1 ; none ; j # V6.0 (🍒) CHERRIES
-1F353 ; emoji ; L1 ; none ; j # V6.0 (🍓) STRAWBERRY
-1F354 ; emoji ; L1 ; none ; j # V6.0 (🍔) HAMBURGER
-1F355 ; emoji ; L1 ; none ; j # V6.0 (🍕) SLICE OF PIZZA
-1F356 ; emoji ; L1 ; none ; j # V6.0 (🍖) MEAT ON BONE
-1F357 ; emoji ; L1 ; none ; j # V6.0 (🍗) POULTRY LEG
-1F358 ; emoji ; L1 ; none ; j # V6.0 (🍘) RICE CRACKER
-1F359 ; emoji ; L1 ; none ; j # V6.0 (🍙) RICE BALL
-1F35A ; emoji ; L1 ; none ; j # V6.0 (🍚) COOKED RICE
-1F35B ; emoji ; L1 ; none ; j # V6.0 (🍛) CURRY AND RICE
-1F35C ; emoji ; L1 ; none ; j # V6.0 (🍜) STEAMING BOWL
-1F35D ; emoji ; L1 ; none ; j # V6.0 (🍝) SPAGHETTI
-1F35E ; emoji ; L1 ; none ; j # V6.0 (🍞) BREAD
-1F35F ; emoji ; L1 ; none ; j # V6.0 (🍟) FRENCH FRIES
-1F360 ; emoji ; L1 ; none ; j # V6.0 (🍠) ROASTED SWEET POTATO
-1F361 ; emoji ; L1 ; none ; j # V6.0 (🍡) DANGO
-1F362 ; emoji ; L1 ; none ; j # V6.0 (🍢) ODEN
-1F363 ; emoji ; L1 ; none ; j # V6.0 (🍣) SUSHI
-1F364 ; emoji ; L1 ; none ; j # V6.0 (🍤) FRIED SHRIMP
-1F365 ; emoji ; L1 ; none ; j # V6.0 (🍥) FISH CAKE WITH SWIRL DESIGN
-1F366 ; emoji ; L1 ; none ; j # V6.0 (🍦) SOFT ICE CREAM
-1F367 ; emoji ; L1 ; none ; j # V6.0 (🍧) SHAVED ICE
-1F368 ; emoji ; L1 ; none ; j # V6.0 (🍨) ICE CREAM
-1F369 ; emoji ; L1 ; none ; j # V6.0 (🍩) DOUGHNUT
-1F36A ; emoji ; L1 ; none ; j # V6.0 (🍪) COOKIE
-1F36B ; emoji ; L1 ; none ; j # V6.0 (🍫) CHOCOLATE BAR
-1F36C ; emoji ; L1 ; none ; j # V6.0 (🍬) CANDY
-1F36D ; emoji ; L1 ; none ; j # V6.0 (🍭) LOLLIPOP
-1F36E ; emoji ; L1 ; none ; j # V6.0 (🍮) CUSTARD
-1F36F ; emoji ; L1 ; none ; j # V6.0 (🍯) HONEY POT
-1F370 ; emoji ; L1 ; none ; j # V6.0 (🍰) SHORTCAKE
-1F371 ; emoji ; L1 ; none ; j # V6.0 (🍱) BENTO BOX
-1F372 ; emoji ; L1 ; none ; j # V6.0 (🍲) POT OF FOOD
-1F373 ; emoji ; L1 ; none ; j # V6.0 (🍳) COOKING
-1F374 ; emoji ; L1 ; none ; j # V6.0 (🍴) FORK AND KNIFE
-1F375 ; emoji ; L1 ; none ; j # V6.0 (🍵) TEACUP WITHOUT HANDLE
-1F376 ; emoji ; L1 ; none ; j # V6.0 (🍶) SAKE BOTTLE AND CUP
-1F377 ; emoji ; L1 ; none ; j # V6.0 (🍷) WINE GLASS
-1F378 ; emoji ; L1 ; none ; j w # V6.0 (🍸) COCKTAIL GLASS
-1F379 ; emoji ; L1 ; none ; j # V6.0 (🍹) TROPICAL DRINK
-1F37A ; emoji ; L1 ; none ; j # V6.0 (🍺) BEER MUG
-1F37B ; emoji ; L1 ; none ; j # V6.0 (🍻) CLINKING BEER MUGS
-1F37C ; emoji ; L1 ; none ; x # V6.0 (🍼) BABY BOTTLE
-1F37D ; text ; L2 ; none ; w # V7.0 (🍽) FORK AND KNIFE WITH PLATE
-1F37E ; emoji ; L2 ; none ; x # V8.0 (🍾) BOTTLE WITH POPPING CORK
-1F37F ; emoji ; L2 ; none ; x # V8.0 (🍿) POPCORN
-1F380 ; emoji ; L1 ; none ; j # V6.0 (🎀) RIBBON
-1F381 ; emoji ; L1 ; none ; j # V6.0 (🎁) WRAPPED PRESENT
-1F382 ; emoji ; L1 ; none ; j # V6.0 (🎂) BIRTHDAY CAKE
-1F383 ; emoji ; L1 ; none ; j # V6.0 (🎃) JACK-O-LANTERN
-1F384 ; emoji ; L1 ; none ; j # V6.0 (🎄) CHRISTMAS TREE
-1F385 ; emoji ; L1 ; primary ; j # V6.0 (🎅) FATHER CHRISTMAS
-1F386 ; emoji ; L1 ; none ; j # V6.0 (🎆) FIREWORKS
-1F387 ; emoji ; L1 ; none ; j # V6.0 (🎇) FIREWORK SPARKLER
-1F388 ; emoji ; L1 ; none ; j # V6.0 (🎈) BALLOON
-1F389 ; emoji ; L1 ; none ; j # V6.0 (🎉) PARTY POPPER
-1F38A ; emoji ; L1 ; none ; j # V6.0 (🎊) CONFETTI BALL
-1F38B ; emoji ; L1 ; none ; j # V6.0 (🎋) TANABATA TREE
-1F38C ; emoji ; L1 ; none ; j # V6.0 (🎌) CROSSED FLAGS
-1F38D ; emoji ; L1 ; none ; j # V6.0 (🎍) PINE DECORATION
-1F38E ; emoji ; L1 ; none ; j # V6.0 (🎎) JAPANESE DOLLS
-1F38F ; emoji ; L1 ; none ; j # V6.0 (🎏) CARP STREAMER
-1F390 ; emoji ; L1 ; none ; j # V6.0 (🎐) WIND CHIME
-1F391 ; emoji ; L1 ; none ; j # V6.0 (🎑) MOON VIEWING CEREMONY
-1F392 ; emoji ; L1 ; none ; j # V6.0 (🎒) SCHOOL SATCHEL
-1F393 ; emoji ; L1 ; none ; j w # V6.0 (🎓) GRADUATION CAP
-1F396 ; text ; L2 ; none ; w # V7.0 (🎖) MILITARY MEDAL
-1F397 ; text ; L2 ; none ; w # V7.0 (🎗) REMINDER RIBBON
-1F399 ; text ; L2 ; none ; w # V7.0 (🎙) STUDIO MICROPHONE
-1F39A ; text ; L2 ; none ; w # V7.0 (🎚) LEVEL SLIDER
-1F39B ; text ; L2 ; none ; w # V7.0 (🎛) CONTROL KNOBS
-1F39E ; text ; L2 ; none ; w # V7.0 (🎞) FILM FRAMES
-1F39F ; text ; L2 ; none ; w # V7.0 (🎟) ADMISSION TICKETS
-1F3A0 ; emoji ; L1 ; none ; j # V6.0 (🎠) CAROUSEL HORSE
-1F3A1 ; emoji ; L1 ; none ; j # V6.0 (🎡) FERRIS WHEEL
-1F3A2 ; emoji ; L1 ; none ; j # V6.0 (🎢) ROLLER COASTER
-1F3A3 ; emoji ; L1 ; none ; j # V6.0 (🎣) FISHING POLE AND FISH
-1F3A4 ; emoji ; L1 ; none ; j # V6.0 (🎤) MICROPHONE
-1F3A5 ; emoji ; L1 ; none ; j # V6.0 (🎥) MOVIE CAMERA
-1F3A6 ; emoji ; L1 ; none ; j # V6.0 (🎦) CINEMA
-1F3A7 ; emoji ; L1 ; none ; j w # V6.0 (🎧) HEADPHONE
-1F3A8 ; emoji ; L1 ; none ; j # V6.0 (🎨) ARTIST PALETTE
-1F3A9 ; emoji ; L1 ; none ; j # V6.0 (🎩) TOP HAT
-1F3AA ; emoji ; L1 ; none ; j # V6.0 (🎪) CIRCUS TENT
-1F3AB ; emoji ; L1 ; none ; j # V6.0 (🎫) TICKET
-1F3AC ; emoji ; L1 ; none ; j w # V6.0 (🎬) CLAPPER BOARD
-1F3AD ; emoji ; L1 ; none ; j w # V6.0 (🎭) PERFORMING ARTS
-1F3AE ; emoji ; L1 ; none ; j w # V6.0 (🎮) VIDEO GAME
-1F3AF ; emoji ; L1 ; none ; j # V6.0 (🎯) DIRECT HIT
-1F3B0 ; emoji ; L1 ; none ; j # V6.0 (🎰) SLOT MACHINE
-1F3B1 ; emoji ; L1 ; none ; j # V6.0 (🎱) BILLIARDS
-1F3B2 ; emoji ; L1 ; none ; j # V6.0 (🎲) GAME DIE
-1F3B3 ; emoji ; L1 ; none ; j # V6.0 (🎳) BOWLING
-1F3B4 ; emoji ; L1 ; none ; j # V6.0 (🎴) FLOWER PLAYING CARDS
-1F3B5 ; emoji ; L1 ; none ; j # V6.0 (🎵) MUSICAL NOTE
-1F3B6 ; emoji ; L1 ; none ; j # V6.0 (🎶) MULTIPLE MUSICAL NOTES
-1F3B7 ; emoji ; L1 ; none ; j # V6.0 (🎷) SAXOPHONE
-1F3B8 ; emoji ; L1 ; none ; j # V6.0 (🎸) GUITAR
-1F3B9 ; emoji ; L1 ; none ; j # V6.0 (🎹) MUSICAL KEYBOARD
-1F3BA ; emoji ; L1 ; none ; j # V6.0 (🎺) TRUMPET
-1F3BB ; emoji ; L1 ; none ; j # V6.0 (🎻) VIOLIN
-1F3BC ; emoji ; L1 ; none ; j # V6.0 (🎼) MUSICAL SCORE
-1F3BD ; emoji ; L1 ; none ; j # V6.0 (🎽) RUNNING SHIRT WITH SASH
-1F3BE ; emoji ; L1 ; none ; j # V6.0 (🎾) TENNIS RACQUET AND BALL
-1F3BF ; emoji ; L1 ; none ; j # V6.0 (🎿) SKI AND SKI BOOT
-1F3C0 ; emoji ; L1 ; none ; j # V6.0 (🏀) BASKETBALL AND HOOP
-1F3C1 ; emoji ; L1 ; none ; j # V6.0 (🏁) CHEQUERED FLAG
-1F3C2 ; emoji ; L1 ; secondary ; j w # V6.0 (🏂) SNOWBOARDER
-1F3C3 ; emoji ; L1 ; secondary ; j # V6.0 (🏃) RUNNER
-1F3C4 ; emoji ; L1 ; secondary ; j w # V6.0 (🏄) SURFER
-1F3C5 ; emoji ; L2 ; none ; x # V7.0 (🏅) SPORTS MEDAL
-1F3C6 ; emoji ; L1 ; none ; j w # V6.0 (🏆) TROPHY
-1F3C7 ; emoji ; L1 ; secondary ; x # V6.0 (🏇) HORSE RACING
-1F3C8 ; emoji ; L1 ; none ; j # V6.0 (🏈) AMERICAN FOOTBALL
-1F3C9 ; emoji ; L1 ; none ; x # V6.0 (🏉) RUGBY FOOTBALL
-1F3CA ; emoji ; L1 ; secondary ; j w # V6.0 (🏊) SWIMMER
-1F3CB ; text ; L2 ; none ; w # V7.0 (🏋) WEIGHT LIFTER
-1F3CC ; text ; L2 ; none ; w # V7.0 (🏌) GOLFER
-1F3CD ; text ; L2 ; none ; w # V7.0 (🏍) RACING MOTORCYCLE
-1F3CE ; text ; L2 ; none ; w # V7.0 (🏎) RACING CAR
-1F3CF ; emoji ; L2 ; none ; x # V8.0 (🏏) CRICKET BAT AND BALL
-1F3D0 ; emoji ; L2 ; none ; x # V8.0 (🏐) VOLLEYBALL
-1F3D1 ; emoji ; L2 ; none ; x # V8.0 (🏑) FIELD HOCKEY STICK AND BALL
-1F3D2 ; emoji ; L2 ; none ; x # V8.0 (🏒) ICE HOCKEY STICK AND PUCK
-1F3D3 ; emoji ; L2 ; none ; x # V8.0 (🏓) TABLE TENNIS PADDLE AND BALL
-1F3D4 ; text ; L2 ; none ; w # V7.0 (🏔) SNOW CAPPED MOUNTAIN
-1F3D5 ; text ; L2 ; none ; w # V7.0 (🏕) CAMPING
-1F3D6 ; text ; L2 ; none ; w # V7.0 (🏖) BEACH WITH UMBRELLA
-1F3D7 ; text ; L2 ; none ; w # V7.0 (🏗) BUILDING CONSTRUCTION
-1F3D8 ; text ; L2 ; none ; w # V7.0 (🏘) HOUSE BUILDINGS
-1F3D9 ; text ; L2 ; none ; w # V7.0 (🏙) CITYSCAPE
-1F3DA ; text ; L2 ; none ; w # V7.0 (🏚) DERELICT HOUSE BUILDING
-1F3DB ; text ; L2 ; none ; w # V7.0 (🏛) CLASSICAL BUILDING
-1F3DC ; text ; L2 ; none ; w # V7.0 (🏜) DESERT
-1F3DD ; text ; L2 ; none ; w # V7.0 (🏝) DESERT ISLAND
-1F3DE ; text ; L2 ; none ; w # V7.0 (🏞) NATIONAL PARK
-1F3DF ; text ; L2 ; none ; w # V7.0 (🏟) STADIUM
-1F3E0 ; emoji ; L1 ; none ; j w # V6.0 (🏠) HOUSE BUILDING
-1F3E1 ; emoji ; L1 ; none ; j # V6.0 (🏡) HOUSE WITH GARDEN
-1F3E2 ; emoji ; L1 ; none ; j # V6.0 (🏢) OFFICE BUILDING
-1F3E3 ; emoji ; L1 ; none ; j # V6.0 (🏣) JAPANESE POST OFFICE
-1F3E4 ; emoji ; L1 ; none ; x # V6.0 (🏤) EUROPEAN POST OFFICE
-1F3E5 ; emoji ; L1 ; none ; j # V6.0 (🏥) HOSPITAL
-1F3E6 ; emoji ; L1 ; none ; j # V6.0 (🏦) BANK
-1F3E7 ; emoji ; L1 ; none ; j # V6.0 (🏧) AUTOMATED TELLER MACHINE
-1F3E8 ; emoji ; L1 ; none ; j # V6.0 (🏨) HOTEL
-1F3E9 ; emoji ; L1 ; none ; j # V6.0 (🏩) LOVE HOTEL
-1F3EA ; emoji ; L1 ; none ; j # V6.0 (🏪) CONVENIENCE STORE
-1F3EB ; emoji ; L1 ; none ; j # V6.0 (🏫) SCHOOL
-1F3EC ; emoji ; L1 ; none ; j # V6.0 (🏬) DEPARTMENT STORE
-1F3ED ; emoji ; L1 ; none ; j w # V6.0 (🏭) FACTORY
-1F3EE ; emoji ; L1 ; none ; j # V6.0 (🏮) IZAKAYA LANTERN
-1F3EF ; emoji ; L1 ; none ; j # V6.0 (🏯) JAPANESE CASTLE
-1F3F0 ; emoji ; L1 ; none ; j # V6.0 (🏰) EUROPEAN CASTLE
-1F3F3 ; text ; L2 ; none ; w # V7.0 (🏳) WAVING WHITE FLAG
-1F3F4 ; emoji ; L2 ; none ; x # V7.0 (🏴) WAVING BLACK FLAG
-1F3F5 ; text ; L2 ; none ; w # V7.0 (🏵) ROSETTE
-1F3F7 ; text ; L2 ; none ; w # V7.0 (🏷) LABEL
-1F3F8 ; emoji ; L2 ; none ; x # V8.0 (🏸) BADMINTON RACQUET AND SHUTTLECOCK
-1F3F9 ; emoji ; L2 ; none ; x # V8.0 (🏹) BOW AND ARROW
-1F3FA ; emoji ; L2 ; none ; x # V8.0 (🏺) AMPHORA
-1F3FB ; emoji ; L2 ; modifier ; x # V8.0 (🏻) EMOJI MODIFIER FITZPATRICK TYPE-1-2
-1F3FC ; emoji ; L2 ; modifier ; x # V8.0 (🏼) EMOJI MODIFIER FITZPATRICK TYPE-3
-1F3FD ; emoji ; L2 ; modifier ; x # V8.0 (🏽) EMOJI MODIFIER FITZPATRICK TYPE-4
-1F3FE ; emoji ; L2 ; modifier ; x # V8.0 (🏾) EMOJI MODIFIER FITZPATRICK TYPE-5
-1F3FF ; emoji ; L2 ; modifier ; x # V8.0 (🏿) EMOJI MODIFIER FITZPATRICK TYPE-6
-1F400 ; emoji ; L1 ; none ; x # V6.0 (🐀) RAT
-1F401 ; emoji ; L1 ; none ; x # V6.0 (🐁) MOUSE
-1F402 ; emoji ; L1 ; none ; x # V6.0 (🐂) OX
-1F403 ; emoji ; L1 ; none ; x # V6.0 (🐃) WATER BUFFALO
-1F404 ; emoji ; L1 ; none ; x # V6.0 (🐄) COW
-1F405 ; emoji ; L1 ; none ; x # V6.0 (🐅) TIGER
-1F406 ; emoji ; L1 ; none ; x # V6.0 (🐆) LEOPARD
-1F407 ; emoji ; L1 ; none ; x # V6.0 (🐇) RABBIT
-1F408 ; emoji ; L1 ; none ; w # V6.0 (🐈) CAT
-1F409 ; emoji ; L1 ; none ; x # V6.0 (🐉) DRAGON
-1F40A ; emoji ; L1 ; none ; x # V6.0 (🐊) CROCODILE
-1F40B ; emoji ; L1 ; none ; x # V6.0 (🐋) WHALE
-1F40C ; emoji ; L1 ; none ; j # V6.0 (🐌) SNAIL
-1F40D ; emoji ; L1 ; none ; j # V6.0 (🐍) SNAKE
-1F40E ; emoji ; L1 ; none ; j # V6.0 (🐎) HORSE
-1F40F ; emoji ; L1 ; none ; x # V6.0 (🐏) RAM
-1F410 ; emoji ; L1 ; none ; x # V6.0 (🐐) GOAT
-1F411 ; emoji ; L1 ; none ; j # V6.0 (🐑) SHEEP
-1F412 ; emoji ; L1 ; none ; j # V6.0 (🐒) MONKEY
-1F413 ; emoji ; L1 ; none ; x # V6.0 (🐓) ROOSTER
-1F414 ; emoji ; L1 ; none ; j # V6.0 (🐔) CHICKEN
-1F415 ; emoji ; L1 ; none ; w # V6.0 (🐕) DOG
-1F416 ; emoji ; L1 ; none ; x # V6.0 (🐖) PIG
-1F417 ; emoji ; L1 ; none ; j # V6.0 (🐗) BOAR
-1F418 ; emoji ; L1 ; none ; j # V6.0 (🐘) ELEPHANT
-1F419 ; emoji ; L1 ; none ; j # V6.0 (🐙) OCTOPUS
-1F41A ; emoji ; L1 ; none ; j # V6.0 (🐚) SPIRAL SHELL
-1F41B ; emoji ; L1 ; none ; j # V6.0 (🐛) BUG
-1F41C ; emoji ; L1 ; none ; j # V6.0 (🐜) ANT
-1F41D ; emoji ; L1 ; none ; j # V6.0 (🐝) HONEYBEE
-1F41E ; emoji ; L1 ; none ; j # V6.0 (🐞) LADY BEETLE
-1F41F ; emoji ; L1 ; none ; j w # V6.0 (🐟) FISH
-1F420 ; emoji ; L1 ; none ; j # V6.0 (🐠) TROPICAL FISH
-1F421 ; emoji ; L1 ; none ; j # V6.0 (🐡) BLOWFISH
-1F422 ; emoji ; L1 ; none ; j # V6.0 (🐢) TURTLE
-1F423 ; emoji ; L1 ; none ; j # V6.0 (🐣) HATCHING CHICK
-1F424 ; emoji ; L1 ; none ; j # V6.0 (🐤) BABY CHICK
-1F425 ; emoji ; L1 ; none ; j # V6.0 (🐥) FRONT-FACING BABY CHICK
-1F426 ; emoji ; L1 ; none ; j w # V6.0 (🐦) BIRD
-1F427 ; emoji ; L1 ; none ; j # V6.0 (🐧) PENGUIN
-1F428 ; emoji ; L1 ; none ; j # V6.0 (🐨) KOALA
-1F429 ; emoji ; L1 ; none ; j # V6.0 (🐩) POODLE
-1F42A ; emoji ; L1 ; none ; x # V6.0 (🐪) DROMEDARY CAMEL
-1F42B ; emoji ; L1 ; none ; j # V6.0 (🐫) BACTRIAN CAMEL
-1F42C ; emoji ; L1 ; none ; j # V6.0 (🐬) DOLPHIN
-1F42D ; emoji ; L1 ; none ; j # V6.0 (🐭) MOUSE FACE
-1F42E ; emoji ; L1 ; none ; j # V6.0 (🐮) COW FACE
-1F42F ; emoji ; L1 ; none ; j # V6.0 (🐯) TIGER FACE
-1F430 ; emoji ; L1 ; none ; j # V6.0 (🐰) RABBIT FACE
-1F431 ; emoji ; L1 ; none ; j # V6.0 (🐱) CAT FACE
-1F432 ; emoji ; L1 ; none ; j # V6.0 (🐲) DRAGON FACE
-1F433 ; emoji ; L1 ; none ; j # V6.0 (🐳) SPOUTING WHALE
-1F434 ; emoji ; L1 ; none ; j # V6.0 (🐴) HORSE FACE
-1F435 ; emoji ; L1 ; none ; j # V6.0 (🐵) MONKEY FACE
-1F436 ; emoji ; L1 ; none ; j # V6.0 (🐶) DOG FACE
-1F437 ; emoji ; L1 ; none ; j # V6.0 (🐷) PIG FACE
-1F438 ; emoji ; L1 ; none ; j # V6.0 (🐸) FROG FACE
-1F439 ; emoji ; L1 ; none ; j # V6.0 (🐹) HAMSTER FACE
-1F43A ; emoji ; L1 ; none ; j # V6.0 (🐺) WOLF FACE
-1F43B ; emoji ; L1 ; none ; j # V6.0 (🐻) BEAR FACE
-1F43C ; emoji ; L1 ; none ; j # V6.0 (🐼) PANDA FACE
-1F43D ; emoji ; L1 ; none ; j # V6.0 (🐽) PIG NOSE
-1F43E ; emoji ; L1 ; none ; j # V6.0 (🐾) PAW PRINTS
-1F43F ; text ; L2 ; none ; w # V7.0 (🐿) CHIPMUNK
-1F440 ; emoji ; L1 ; none ; j # V6.0 (👀) EYES
-1F441 ; text ; L2 ; none ; w # V7.0 (👁) EYE
-1F442 ; emoji ; L1 ; secondary ; j w # V6.0 (👂) EAR
-1F443 ; emoji ; L1 ; secondary ; j # V6.0 (👃) NOSE
-1F444 ; emoji ; L1 ; none ; j # V6.0 (👄) MOUTH
-1F445 ; emoji ; L1 ; none ; j # V6.0 (👅) TONGUE
-1F446 ; emoji ; L1 ; secondary ; j w # V6.0 (👆) WHITE UP POINTING BACKHAND INDEX
-1F447 ; emoji ; L1 ; secondary ; j w # V6.0 (👇) WHITE DOWN POINTING BACKHAND INDEX
-1F448 ; emoji ; L1 ; secondary ; j w # V6.0 (👈) WHITE LEFT POINTING BACKHAND INDEX
-1F449 ; emoji ; L1 ; secondary ; j w # V6.0 (👉) WHITE RIGHT POINTING BACKHAND INDEX
-1F44A ; emoji ; L1 ; secondary ; j # V6.0 (👊) FISTED HAND SIGN
-1F44B ; emoji ; L1 ; secondary ; j # V6.0 (👋) WAVING HAND SIGN
-1F44C ; emoji ; L1 ; secondary ; j # V6.0 (👌) OK HAND SIGN
-1F44D ; emoji ; L1 ; secondary ; j w # V6.0 (👍) THUMBS UP SIGN
-1F44E ; emoji ; L1 ; secondary ; j w # V6.0 (👎) THUMBS DOWN SIGN
-1F44F ; emoji ; L1 ; secondary ; j # V6.0 (👏) CLAPPING HANDS SIGN
-1F450 ; emoji ; L1 ; secondary ; j # V6.0 (👐) OPEN HANDS SIGN
-1F451 ; emoji ; L1 ; none ; j # V6.0 (👑) CROWN
-1F452 ; emoji ; L1 ; none ; j # V6.0 (👒) WOMANS HAT
-1F453 ; emoji ; L1 ; none ; j w # V6.0 (👓) EYEGLASSES
-1F454 ; emoji ; L1 ; none ; j # V6.0 (👔) NECKTIE
-1F455 ; emoji ; L1 ; none ; j # V6.0 (👕) T-SHIRT
-1F456 ; emoji ; L1 ; none ; j # V6.0 (👖) JEANS
-1F457 ; emoji ; L1 ; none ; j # V6.0 (👗) DRESS
-1F458 ; emoji ; L1 ; none ; j # V6.0 (👘) KIMONO
-1F459 ; emoji ; L1 ; none ; j # V6.0 (👙) BIKINI
-1F45A ; emoji ; L1 ; none ; j # V6.0 (👚) WOMANS CLOTHES
-1F45B ; emoji ; L1 ; none ; j # V6.0 (👛) PURSE
-1F45C ; emoji ; L1 ; none ; j # V6.0 (👜) HANDBAG
-1F45D ; emoji ; L1 ; none ; j # V6.0 (👝) POUCH
-1F45E ; emoji ; L1 ; none ; j # V6.0 (👞) MANS SHOE
-1F45F ; emoji ; L1 ; none ; j # V6.0 (👟) ATHLETIC SHOE
-1F460 ; emoji ; L1 ; none ; j # V6.0 (👠) HIGH-HEELED SHOE
-1F461 ; emoji ; L1 ; none ; j # V6.0 (👡) WOMANS SANDAL
-1F462 ; emoji ; L1 ; none ; j # V6.0 (👢) WOMANS BOOTS
-1F463 ; emoji ; L1 ; none ; j # V6.0 (👣) FOOTPRINTS
-1F464 ; emoji ; L1 ; none ; j # V6.0 (👤) BUST IN SILHOUETTE
-1F465 ; emoji ; L1 ; none ; x # V6.0 (👥) BUSTS IN SILHOUETTE
-1F466 ; emoji ; L1 ; primary ; j # V6.0 (👦) BOY
-1F467 ; emoji ; L1 ; primary ; j # V6.0 (👧) GIRL
-1F468 ; emoji ; L1 ; primary ; j # V6.0 (👨) MAN
-1F469 ; emoji ; L1 ; primary ; j # V6.0 (👩) WOMAN
-1F46A ; emoji ; L1 ; none ; j w # V6.0 (👪) FAMILY
-1F46B ; emoji ; L1 ; none ; j # V6.0 (👫) MAN AND WOMAN HOLDING HANDS
-1F46C ; emoji ; L1 ; none ; x # V6.0 (👬) TWO MEN HOLDING HANDS
-1F46D ; emoji ; L1 ; none ; x # V6.0 (👭) TWO WOMEN HOLDING HANDS
-1F46E ; emoji ; L1 ; primary ; j # V6.0 (👮) POLICE OFFICER
-1F46F ; emoji ; L1 ; none ; j # V6.0 (👯) WOMAN WITH BUNNY EARS
-1F470 ; emoji ; L1 ; primary ; j # V6.0 (👰) BRIDE WITH VEIL
-1F471 ; emoji ; L1 ; primary ; j # V6.0 (👱) PERSON WITH BLOND HAIR
-1F472 ; emoji ; L1 ; primary ; j # V6.0 (👲) MAN WITH GUA PI MAO
-1F473 ; emoji ; L1 ; primary ; j # V6.0 (👳) MAN WITH TURBAN
-1F474 ; emoji ; L1 ; primary ; j # V6.0 (👴) OLDER MAN
-1F475 ; emoji ; L1 ; primary ; j # V6.0 (👵) OLDER WOMAN
-1F476 ; emoji ; L1 ; primary ; j # V6.0 (👶) BABY
-1F477 ; emoji ; L1 ; primary ; j # V6.0 (👷) CONSTRUCTION WORKER
-1F478 ; emoji ; L1 ; primary ; j # V6.0 (👸) PRINCESS
-1F479 ; emoji ; L1 ; none ; j # V6.0 (👹) JAPANESE OGRE
-1F47A ; emoji ; L1 ; none ; j # V6.0 (👺) JAPANESE GOBLIN
-1F47B ; emoji ; L1 ; none ; j # V6.0 (👻) GHOST
-1F47C ; emoji ; L1 ; primary ; j # V6.0 (👼) BABY ANGEL
-1F47D ; emoji ; L1 ; none ; j w # V6.0 (👽) EXTRATERRESTRIAL ALIEN
-1F47E ; emoji ; L1 ; none ; j # V6.0 (👾) ALIEN MONSTER
-1F47F ; emoji ; L1 ; secondary ; j # V6.0 (👿) IMP
-1F480 ; emoji ; L1 ; none ; j # V6.0 (💀) SKULL
-1F481 ; emoji ; L1 ; primary ; j # V6.0 (💁) INFORMATION DESK PERSON
-1F482 ; emoji ; L1 ; primary ; j # V6.0 (💂) GUARDSMAN
-1F483 ; emoji ; L1 ; secondary ; j # V6.0 (💃) DANCER
-1F484 ; emoji ; L1 ; none ; j # V6.0 (💄) LIPSTICK
-1F485 ; emoji ; L1 ; secondary ; j # V6.0 (💅) NAIL POLISH
-1F486 ; emoji ; L1 ; primary ; j # V6.0 (💆) FACE MASSAGE
-1F487 ; emoji ; L1 ; primary ; j # V6.0 (💇) HAIRCUT
-1F488 ; emoji ; L1 ; none ; j # V6.0 (💈) BARBER POLE
-1F489 ; emoji ; L1 ; none ; j # V6.0 (💉) SYRINGE
-1F48A ; emoji ; L1 ; none ; j # V6.0 (💊) PILL
-1F48B ; emoji ; L1 ; none ; j # V6.0 (💋) KISS MARK
-1F48C ; emoji ; L1 ; none ; j # V6.0 (💌) LOVE LETTER
-1F48D ; emoji ; L1 ; none ; j # V6.0 (💍) RING
-1F48E ; emoji ; L1 ; none ; j # V6.0 (💎) GEM STONE
-1F48F ; emoji ; L1 ; none ; j # V6.0 (💏) KISS
-1F490 ; emoji ; L1 ; none ; j # V6.0 (💐) BOUQUET
-1F491 ; emoji ; L1 ; none ; j # V6.0 (💑) COUPLE WITH HEART
-1F492 ; emoji ; L1 ; none ; j # V6.0 (💒) WEDDING
-1F493 ; emoji ; L1 ; none ; j # V6.0 (💓) BEATING HEART
-1F494 ; emoji ; L1 ; none ; j # V6.0 (💔) BROKEN HEART
-1F495 ; emoji ; L1 ; none ; j # V6.0 (💕) TWO HEARTS
-1F496 ; emoji ; L1 ; none ; j # V6.0 (💖) SPARKLING HEART
-1F497 ; emoji ; L1 ; none ; j # V6.0 (💗) GROWING HEART
-1F498 ; emoji ; L1 ; none ; j # V6.0 (💘) HEART WITH ARROW
-1F499 ; emoji ; L1 ; none ; j # V6.0 (💙) BLUE HEART
-1F49A ; emoji ; L1 ; none ; j # V6.0 (💚) GREEN HEART
-1F49B ; emoji ; L1 ; none ; j # V6.0 (💛) YELLOW HEART
-1F49C ; emoji ; L1 ; none ; j # V6.0 (💜) PURPLE HEART
-1F49D ; emoji ; L1 ; none ; j # V6.0 (💝) HEART WITH RIBBON
-1F49E ; emoji ; L1 ; none ; j # V6.0 (💞) REVOLVING HEARTS
-1F49F ; emoji ; L1 ; none ; j # V6.0 (💟) HEART DECORATION
-1F4A0 ; emoji ; L1 ; none ; j # V6.0 (💠) DIAMOND SHAPE WITH A DOT INSIDE
-1F4A1 ; emoji ; L1 ; none ; j # V6.0 (💡) ELECTRIC LIGHT BULB
-1F4A2 ; emoji ; L1 ; none ; j # V6.0 (💢) ANGER SYMBOL
-1F4A3 ; emoji ; L1 ; none ; j w # V6.0 (💣) BOMB
-1F4A4 ; emoji ; L1 ; none ; j # V6.0 (💤) SLEEPING SYMBOL
-1F4A5 ; emoji ; L1 ; none ; j # V6.0 (💥) COLLISION SYMBOL
-1F4A6 ; emoji ; L1 ; none ; j # V6.0 (💦) SPLASHING SWEAT SYMBOL
-1F4A7 ; emoji ; L1 ; none ; j # V6.0 (💧) DROPLET
-1F4A8 ; emoji ; L1 ; none ; j # V6.0 (💨) DASH SYMBOL
-1F4A9 ; emoji ; L1 ; none ; j # V6.0 (💩) PILE OF POO
-1F4AA ; emoji ; L1 ; secondary ; j # V6.0 (💪) FLEXED BICEPS
-1F4AB ; emoji ; L1 ; none ; j # V6.0 (💫) DIZZY SYMBOL
-1F4AC ; emoji ; L1 ; none ; j # V6.0 (💬) SPEECH BALLOON
-1F4AD ; emoji ; L1 ; none ; x # V6.0 (💭) THOUGHT BALLOON
-1F4AE ; emoji ; L1 ; none ; j # V6.0 (💮) WHITE FLOWER
-1F4AF ; emoji ; L1 ; none ; j # V6.0 (💯) HUNDRED POINTS SYMBOL
-1F4B0 ; emoji ; L1 ; none ; j w # V6.0 (💰) MONEY BAG
-1F4B1 ; emoji ; L1 ; none ; j # V6.0 (💱) CURRENCY EXCHANGE
-1F4B2 ; emoji ; L1 ; none ; j # V6.0 (💲) HEAVY DOLLAR SIGN
-1F4B3 ; emoji ; L1 ; none ; j w # V6.0 (💳) CREDIT CARD
-1F4B4 ; emoji ; L1 ; none ; j # V6.0 (💴) BANKNOTE WITH YEN SIGN
-1F4B5 ; emoji ; L1 ; none ; j # V6.0 (💵) BANKNOTE WITH DOLLAR SIGN
-1F4B6 ; emoji ; L1 ; none ; x # V6.0 (💶) BANKNOTE WITH EURO SIGN
-1F4B7 ; emoji ; L1 ; none ; x # V6.0 (💷) BANKNOTE WITH POUND SIGN
-1F4B8 ; emoji ; L1 ; none ; j # V6.0 (💸) MONEY WITH WINGS
-1F4B9 ; emoji ; L1 ; none ; j # V6.0 (💹) CHART WITH UPWARDS TREND AND YEN SIGN
-1F4BA ; emoji ; L1 ; none ; j # V6.0 (💺) SEAT
-1F4BB ; emoji ; L1 ; none ; j w # V6.0 (💻) PERSONAL COMPUTER
-1F4BC ; emoji ; L1 ; none ; j # V6.0 (💼) BRIEFCASE
-1F4BD ; emoji ; L1 ; none ; j # V6.0 (💽) MINIDISC
-1F4BE ; emoji ; L1 ; none ; j # V6.0 (💾) FLOPPY DISK
-1F4BF ; emoji ; L1 ; none ; j w # V6.0 (💿) OPTICAL DISC
-1F4C0 ; emoji ; L1 ; none ; j # V6.0 (📀) DVD
-1F4C1 ; emoji ; L1 ; none ; j # V6.0 (📁) FILE FOLDER
-1F4C2 ; emoji ; L1 ; none ; j # V6.0 (📂) OPEN FILE FOLDER
-1F4C3 ; emoji ; L1 ; none ; j # V6.0 (📃) PAGE WITH CURL
-1F4C4 ; emoji ; L1 ; none ; j # V6.0 (📄) PAGE FACING UP
-1F4C5 ; emoji ; L1 ; none ; j # V6.0 (📅) CALENDAR
-1F4C6 ; emoji ; L1 ; none ; j # V6.0 (📆) TEAR-OFF CALENDAR
-1F4C7 ; emoji ; L1 ; none ; j # V6.0 (📇) CARD INDEX
-1F4C8 ; emoji ; L1 ; none ; j # V6.0 (📈) CHART WITH UPWARDS TREND
-1F4C9 ; emoji ; L1 ; none ; j # V6.0 (📉) CHART WITH DOWNWARDS TREND
-1F4CA ; emoji ; L1 ; none ; j # V6.0 (📊) BAR CHART
-1F4CB ; emoji ; L1 ; none ; j w # V6.0 (📋) CLIPBOARD
-1F4CC ; emoji ; L1 ; none ; j # V6.0 (📌) PUSHPIN
-1F4CD ; emoji ; L1 ; none ; j # V6.0 (📍) ROUND PUSHPIN
-1F4CE ; emoji ; L1 ; none ; j # V6.0 (📎) PAPERCLIP
-1F4CF ; emoji ; L1 ; none ; j # V6.0 (📏) STRAIGHT RULER
-1F4D0 ; emoji ; L1 ; none ; j # V6.0 (📐) TRIANGULAR RULER
-1F4D1 ; emoji ; L1 ; none ; j # V6.0 (📑) BOOKMARK TABS
-1F4D2 ; emoji ; L1 ; none ; j # V6.0 (📒) LEDGER
-1F4D3 ; emoji ; L1 ; none ; j # V6.0 (📓) NOTEBOOK
-1F4D4 ; emoji ; L1 ; none ; j # V6.0 (📔) NOTEBOOK WITH DECORATIVE COVER
-1F4D5 ; emoji ; L1 ; none ; j # V6.0 (📕) CLOSED BOOK
-1F4D6 ; emoji ; L1 ; none ; j # V6.0 (📖) OPEN BOOK
-1F4D7 ; emoji ; L1 ; none ; j # V6.0 (📗) GREEN BOOK
-1F4D8 ; emoji ; L1 ; none ; j # V6.0 (📘) BLUE BOOK
-1F4D9 ; emoji ; L1 ; none ; j # V6.0 (📙) ORANGE BOOK
-1F4DA ; emoji ; L1 ; none ; j w # V6.0 (📚) BOOKS
-1F4DB ; emoji ; L1 ; none ; j # V6.0 (📛) NAME BADGE
-1F4DC ; emoji ; L1 ; none ; j # V6.0 (📜) SCROLL
-1F4DD ; emoji ; L1 ; none ; j # V6.0 (📝) MEMO
-1F4DE ; emoji ; L1 ; none ; j # V6.0 (📞) TELEPHONE RECEIVER
-1F4DF ; emoji ; L1 ; none ; j w # V6.0 (📟) PAGER
-1F4E0 ; emoji ; L1 ; none ; j # V6.0 (📠) FAX MACHINE
-1F4E1 ; emoji ; L1 ; none ; j # V6.0 (📡) SATELLITE ANTENNA
-1F4E2 ; emoji ; L1 ; none ; j # V6.0 (📢) PUBLIC ADDRESS LOUDSPEAKER
-1F4E3 ; emoji ; L1 ; none ; j # V6.0 (📣) CHEERING MEGAPHONE
-1F4E4 ; emoji ; L1 ; none ; j w # V6.0 (📤) OUTBOX TRAY
-1F4E5 ; emoji ; L1 ; none ; j w # V6.0 (📥) INBOX TRAY
-1F4E6 ; emoji ; L1 ; none ; j w # V6.0 (📦) PACKAGE
-1F4E7 ; emoji ; L1 ; none ; j # V6.0 (📧) E-MAIL SYMBOL
-1F4E8 ; emoji ; L1 ; none ; j # V6.0 (📨) INCOMING ENVELOPE
-1F4E9 ; emoji ; L1 ; none ; j # V6.0 (📩) ENVELOPE WITH DOWNWARDS ARROW ABOVE
-1F4EA ; emoji ; L1 ; none ; j w # V6.0 (📪) CLOSED MAILBOX WITH LOWERED FLAG
-1F4EB ; emoji ; L1 ; none ; j w # V6.0 (📫) CLOSED MAILBOX WITH RAISED FLAG
-1F4EC ; emoji ; L1 ; none ; w # V6.0 (📬) OPEN MAILBOX WITH RAISED FLAG
-1F4ED ; emoji ; L1 ; none ; w # V6.0 (📭) OPEN MAILBOX WITH LOWERED FLAG
-1F4EE ; emoji ; L1 ; none ; j # V6.0 (📮) POSTBOX
-1F4EF ; emoji ; L1 ; none ; x # V6.0 (📯) POSTAL HORN
-1F4F0 ; emoji ; L1 ; none ; j # V6.0 (📰) NEWSPAPER
-1F4F1 ; emoji ; L1 ; none ; j # V6.0 (📱) MOBILE PHONE
-1F4F2 ; emoji ; L1 ; none ; j # V6.0 (📲) MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT
-1F4F3 ; emoji ; L1 ; none ; j # V6.0 (📳) VIBRATION MODE
-1F4F4 ; emoji ; L1 ; none ; j # V6.0 (📴) MOBILE PHONE OFF
-1F4F5 ; emoji ; L1 ; none ; x # V6.0 (📵) NO MOBILE PHONES
-1F4F6 ; emoji ; L1 ; none ; j # V6.0 (📶) ANTENNA WITH BARS
-1F4F7 ; emoji ; L1 ; none ; j w # V6.0 (📷) CAMERA
-1F4F8 ; emoji ; L2 ; none ; x # V7.0 (📸) CAMERA WITH FLASH
-1F4F9 ; emoji ; L1 ; none ; j w # V6.0 (📹) VIDEO CAMERA
-1F4FA ; emoji ; L1 ; none ; j w # V6.0 (📺) TELEVISION
-1F4FB ; emoji ; L1 ; none ; j w # V6.0 (📻) RADIO
-1F4FC ; emoji ; L1 ; none ; j # V6.0 (📼) VIDEOCASSETTE
-1F4FD ; text ; L2 ; none ; w # V7.0 (📽) FILM PROJECTOR
-1F4FF ; emoji ; L2 ; none ; x # V8.0 (📿) PRAYER BEADS
-1F500 ; emoji ; L1 ; none ; x # V6.0 (🔀) TWISTED RIGHTWARDS ARROWS
-1F501 ; emoji ; L1 ; none ; x # V6.0 (🔁) CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS
-1F502 ; emoji ; L1 ; none ; x # V6.0 (🔂) CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY
-1F503 ; emoji ; L1 ; none ; j # V6.0 (🔃) CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS
-1F504 ; emoji ; L1 ; none ; x # V6.0 (🔄) ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS
-1F505 ; emoji ; L1 ; none ; x # V6.0 (🔅) LOW BRIGHTNESS SYMBOL
-1F506 ; emoji ; L1 ; none ; x # V6.0 (🔆) HIGH BRIGHTNESS SYMBOL
-1F507 ; emoji ; L1 ; none ; x # V6.0 (🔇) SPEAKER WITH CANCELLATION STROKE
-1F508 ; emoji ; L1 ; none ; w # V6.0 (🔈) SPEAKER
-1F509 ; emoji ; L1 ; none ; x # V6.0 (🔉) SPEAKER WITH ONE SOUND WAVE
-1F50A ; emoji ; L1 ; none ; j # V6.0 (🔊) SPEAKER WITH THREE SOUND WAVES
-1F50B ; emoji ; L1 ; none ; j # V6.0 (🔋) BATTERY
-1F50C ; emoji ; L1 ; none ; j # V6.0 (🔌) ELECTRIC PLUG
-1F50D ; emoji ; L1 ; none ; j w # V6.0 (🔍) LEFT-POINTING MAGNIFYING GLASS
-1F50E ; emoji ; L1 ; none ; j # V6.0 (🔎) RIGHT-POINTING MAGNIFYING GLASS
-1F50F ; emoji ; L1 ; none ; j # V6.0 (🔏) LOCK WITH INK PEN
-1F510 ; emoji ; L1 ; none ; j # V6.0 (🔐) CLOSED LOCK WITH KEY
-1F511 ; emoji ; L1 ; none ; j # V6.0 (🔑) KEY
-1F512 ; emoji ; L1 ; none ; j w # V6.0 (🔒) LOCK
-1F513 ; emoji ; L1 ; none ; j w # V6.0 (🔓) OPEN LOCK
-1F514 ; emoji ; L1 ; none ; j # V6.0 (🔔) BELL
-1F515 ; emoji ; L1 ; none ; x # V6.0 (🔕) BELL WITH CANCELLATION STROKE
-1F516 ; emoji ; L1 ; none ; j # V6.0 (🔖) BOOKMARK
-1F517 ; emoji ; L1 ; none ; j # V6.0 (🔗) LINK SYMBOL
-1F518 ; emoji ; L1 ; none ; j # V6.0 (🔘) RADIO BUTTON
-1F519 ; emoji ; L1 ; none ; j # V6.0 (🔙) BACK WITH LEFTWARDS ARROW ABOVE
-1F51A ; emoji ; L1 ; none ; j # V6.0 (🔚) END WITH LEFTWARDS ARROW ABOVE
-1F51B ; emoji ; L1 ; none ; j # V6.0 (🔛) ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE
-1F51C ; emoji ; L1 ; none ; j # V6.0 (🔜) SOON WITH RIGHTWARDS ARROW ABOVE
-1F51D ; emoji ; L1 ; none ; j # V6.0 (🔝) TOP WITH UPWARDS ARROW ABOVE
-1F51E ; emoji ; L1 ; none ; j # V6.0 (🔞) NO ONE UNDER EIGHTEEN SYMBOL
-1F51F ; emoji ; L1 ; none ; j # V6.0 (🔟) KEYCAP TEN
-1F520 ; emoji ; L1 ; none ; j # V6.0 (🔠) INPUT SYMBOL FOR LATIN CAPITAL LETTERS
-1F521 ; emoji ; L1 ; none ; j # V6.0 (🔡) INPUT SYMBOL FOR LATIN SMALL LETTERS
-1F522 ; emoji ; L1 ; none ; j # V6.0 (🔢) INPUT SYMBOL FOR NUMBERS
-1F523 ; emoji ; L1 ; none ; j # V6.0 (🔣) INPUT SYMBOL FOR SYMBOLS
-1F524 ; emoji ; L1 ; none ; j # V6.0 (🔤) INPUT SYMBOL FOR LATIN LETTERS
-1F525 ; emoji ; L1 ; none ; j # V6.0 (🔥) FIRE
-1F526 ; emoji ; L1 ; none ; j # V6.0 (🔦) ELECTRIC TORCH
-1F527 ; emoji ; L1 ; none ; j # V6.0 (🔧) WRENCH
-1F528 ; emoji ; L1 ; none ; j # V6.0 (🔨) HAMMER
-1F529 ; emoji ; L1 ; none ; j # V6.0 (🔩) NUT AND BOLT
-1F52A ; emoji ; L1 ; none ; j # V6.0 (🔪) HOCHO
-1F52B ; emoji ; L1 ; none ; j # V6.0 (🔫) PISTOL
-1F52C ; emoji ; L1 ; none ; x # V6.0 (🔬) MICROSCOPE
-1F52D ; emoji ; L1 ; none ; x # V6.0 (🔭) TELESCOPE
-1F52E ; emoji ; L1 ; none ; j # V6.0 (🔮) CRYSTAL BALL
-1F52F ; emoji ; L1 ; none ; j # V6.0 (🔯) SIX POINTED STAR WITH MIDDLE DOT
-1F530 ; emoji ; L1 ; none ; j # V6.0 (🔰) JAPANESE SYMBOL FOR BEGINNER
-1F531 ; emoji ; L1 ; none ; j # V6.0 (🔱) TRIDENT EMBLEM
-1F532 ; emoji ; L1 ; none ; j # V6.0 (🔲) BLACK SQUARE BUTTON
-1F533 ; emoji ; L1 ; none ; j # V6.0 (🔳) WHITE SQUARE BUTTON
-1F534 ; emoji ; L1 ; none ; j # V6.0 (🔴) LARGE RED CIRCLE
-1F535 ; emoji ; L1 ; none ; j # V6.0 (🔵) LARGE BLUE CIRCLE
-1F536 ; emoji ; L1 ; none ; j # V6.0 (🔶) LARGE ORANGE DIAMOND
-1F537 ; emoji ; L1 ; none ; j # V6.0 (🔷) LARGE BLUE DIAMOND
-1F538 ; emoji ; L1 ; none ; j # V6.0 (🔸) SMALL ORANGE DIAMOND
-1F539 ; emoji ; L1 ; none ; j # V6.0 (🔹) SMALL BLUE DIAMOND
-1F53A ; emoji ; L1 ; none ; j # V6.0 (🔺) UP-POINTING RED TRIANGLE
-1F53B ; emoji ; L1 ; none ; j # V6.0 (🔻) DOWN-POINTING RED TRIANGLE
-1F53C ; emoji ; L1 ; none ; j # V6.0 (🔼) UP-POINTING SMALL RED TRIANGLE
-1F53D ; emoji ; L1 ; none ; j # V6.0 (🔽) DOWN-POINTING SMALL RED TRIANGLE
-1F549 ; text ; L2 ; none ; w # V7.0 (🕉) OM SYMBOL
-1F54A ; text ; L2 ; none ; w # V7.0 (🕊) DOVE OF PEACE
-1F54B ; emoji ; L2 ; none ; x # V8.0 (🕋) KAABA
-1F54C ; emoji ; L2 ; none ; x # V8.0 (🕌) MOSQUE
-1F54D ; emoji ; L2 ; none ; x # V8.0 (🕍) SYNAGOGUE
-1F54E ; emoji ; L2 ; none ; x # V8.0 (🕎) MENORAH WITH NINE BRANCHES
-1F550 ; emoji ; L1 ; none ; j w # V6.0 (🕐) CLOCK FACE ONE OCLOCK
-1F551 ; emoji ; L1 ; none ; j w # V6.0 (🕑) CLOCK FACE TWO OCLOCK
-1F552 ; emoji ; L1 ; none ; j w # V6.0 (🕒) CLOCK FACE THREE OCLOCK
-1F553 ; emoji ; L1 ; none ; j w # V6.0 (🕓) CLOCK FACE FOUR OCLOCK
-1F554 ; emoji ; L1 ; none ; j w # V6.0 (🕔) CLOCK FACE FIVE OCLOCK
-1F555 ; emoji ; L1 ; none ; j w # V6.0 (🕕) CLOCK FACE SIX OCLOCK
-1F556 ; emoji ; L1 ; none ; j w # V6.0 (🕖) CLOCK FACE SEVEN OCLOCK
-1F557 ; emoji ; L1 ; none ; j w # V6.0 (🕗) CLOCK FACE EIGHT OCLOCK
-1F558 ; emoji ; L1 ; none ; j w # V6.0 (🕘) CLOCK FACE NINE OCLOCK
-1F559 ; emoji ; L1 ; none ; j w # V6.0 (🕙) CLOCK FACE TEN OCLOCK
-1F55A ; emoji ; L1 ; none ; j w # V6.0 (🕚) CLOCK FACE ELEVEN OCLOCK
-1F55B ; emoji ; L1 ; none ; j w # V6.0 (🕛) CLOCK FACE TWELVE OCLOCK
-1F55C ; emoji ; L1 ; none ; w # V6.0 (🕜) CLOCK FACE ONE-THIRTY
-1F55D ; emoji ; L1 ; none ; w # V6.0 (🕝) CLOCK FACE TWO-THIRTY
-1F55E ; emoji ; L1 ; none ; w # V6.0 (🕞) CLOCK FACE THREE-THIRTY
-1F55F ; emoji ; L1 ; none ; w # V6.0 (🕟) CLOCK FACE FOUR-THIRTY
-1F560 ; emoji ; L1 ; none ; w # V6.0 (🕠) CLOCK FACE FIVE-THIRTY
-1F561 ; emoji ; L1 ; none ; w # V6.0 (🕡) CLOCK FACE SIX-THIRTY
-1F562 ; emoji ; L1 ; none ; w # V6.0 (🕢) CLOCK FACE SEVEN-THIRTY
-1F563 ; emoji ; L1 ; none ; w # V6.0 (🕣) CLOCK FACE EIGHT-THIRTY
-1F564 ; emoji ; L1 ; none ; w # V6.0 (🕤) CLOCK FACE NINE-THIRTY
-1F565 ; emoji ; L1 ; none ; w # V6.0 (🕥) CLOCK FACE TEN-THIRTY
-1F566 ; emoji ; L1 ; none ; w # V6.0 (🕦) CLOCK FACE ELEVEN-THIRTY
-1F567 ; emoji ; L1 ; none ; w # V6.0 (🕧) CLOCK FACE TWELVE-THIRTY
-1F56F ; text ; L2 ; none ; w # V7.0 (🕯) CANDLE
-1F570 ; text ; L2 ; none ; w # V7.0 (🕰) MANTELPIECE CLOCK
-1F573 ; text ; L2 ; none ; w # V7.0 (🕳) HOLE
-1F574 ; text ; L2 ; none ; w # V7.0 (🕴) MAN IN BUSINESS SUIT LEVITATING
-1F575 ; text ; L2 ; none ; w # V7.0 (🕵) SLEUTH OR SPY
-1F576 ; text ; L2 ; none ; w # V7.0 (🕶) DARK SUNGLASSES
-1F577 ; text ; L2 ; none ; w # V7.0 (🕷) SPIDER
-1F578 ; text ; L2 ; none ; w # V7.0 (🕸) SPIDER WEB
-1F579 ; text ; L2 ; none ; w # V7.0 (🕹) JOYSTICK
-1F587 ; text ; L2 ; none ; w # V7.0 (🖇) LINKED PAPERCLIPS
-1F58A ; text ; L2 ; none ; w # V7.0 (🖊) LOWER LEFT BALLPOINT PEN
-1F58B ; text ; L2 ; none ; w # V7.0 (🖋) LOWER LEFT FOUNTAIN PEN
-1F58C ; text ; L2 ; none ; w # V7.0 (🖌) LOWER LEFT PAINTBRUSH
-1F58D ; text ; L2 ; none ; w # V7.0 (🖍) LOWER LEFT CRAYON
-1F590 ; text ; L2 ; secondary ; w # V7.0 (🖐) RAISED HAND WITH FINGERS SPLAYED
-1F595 ; emoji ; L2 ; secondary ; x # V7.0 (🖕) REVERSED HAND WITH MIDDLE FINGER EXTENDED
-1F596 ; emoji ; L2 ; secondary ; x # V7.0 (🖖) RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS
-1F5A5 ; text ; L2 ; none ; w # V7.0 (🖥) DESKTOP COMPUTER
-1F5A8 ; text ; L2 ; none ; w # V7.0 (🖨) PRINTER
-1F5B1 ; text ; L2 ; none ; w # V7.0 (🖱) THREE BUTTON MOUSE
-1F5B2 ; text ; L2 ; none ; w # V7.0 (🖲) TRACKBALL
-1F5BC ; text ; L2 ; none ; w # V7.0 (🖼) FRAME WITH PICTURE
-1F5C2 ; text ; L2 ; none ; w # V7.0 (🗂) CARD INDEX DIVIDERS
-1F5C3 ; text ; L2 ; none ; w # V7.0 (🗃) CARD FILE BOX
-1F5C4 ; text ; L2 ; none ; w # V7.0 (🗄) FILE CABINET
-1F5D1 ; text ; L2 ; none ; w # V7.0 (🗑) WASTEBASKET
-1F5D2 ; text ; L2 ; none ; w # V7.0 (🗒) SPIRAL NOTE PAD
-1F5D3 ; text ; L2 ; none ; w # V7.0 (🗓) SPIRAL CALENDAR PAD
-1F5DC ; text ; L2 ; none ; w # V7.0 (🗜) COMPRESSION
-1F5DD ; text ; L2 ; none ; w # V7.0 (🗝) OLD KEY
-1F5DE ; text ; L2 ; none ; w # V7.0 (🗞) ROLLED-UP NEWSPAPER
-1F5E1 ; text ; L2 ; none ; w # V7.0 (🗡) DAGGER KNIFE
-1F5E3 ; text ; L2 ; none ; w # V7.0 (🗣) SPEAKING HEAD IN SILHOUETTE
-1F5EF ; text ; L2 ; none ; w # V7.0 (🗯) RIGHT ANGER BUBBLE
-1F5F3 ; text ; L2 ; none ; w # V7.0 (🗳) BALLOT BOX WITH BALLOT
-1F5FA ; text ; L2 ; none ; w # V7.0 (🗺) WORLD MAP
-1F5FB ; emoji ; L1 ; none ; j # V6.0 (🗻) MOUNT FUJI
-1F5FC ; emoji ; L1 ; none ; j # V6.0 (🗼) TOKYO TOWER
-1F5FD ; emoji ; L1 ; none ; j # V6.0 (🗽) STATUE OF LIBERTY
-1F5FE ; emoji ; L1 ; none ; j # V6.0 (🗾) SILHOUETTE OF JAPAN
-1F5FF ; emoji ; L1 ; none ; j # V6.0 (🗿) MOYAI
-1F600 ; emoji ; L1 ; secondary ; x # V6.1 (😀) GRINNING FACE
-1F601 ; emoji ; L1 ; secondary ; j # V6.0 (😁) GRINNING FACE WITH SMILING EYES
-1F602 ; emoji ; L1 ; secondary ; j # V6.0 (😂) FACE WITH TEARS OF JOY
-1F603 ; emoji ; L1 ; secondary ; j # V6.0 (😃) SMILING FACE WITH OPEN MOUTH
-1F604 ; emoji ; L1 ; secondary ; j # V6.0 (😄) SMILING FACE WITH OPEN MOUTH AND SMILING EYES
-1F605 ; emoji ; L1 ; secondary ; j # V6.0 (😅) SMILING FACE WITH OPEN MOUTH AND COLD SWEAT
-1F606 ; emoji ; L1 ; secondary ; j # V6.0 (😆) SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES
-1F607 ; emoji ; L1 ; secondary ; x # V6.0 (😇) SMILING FACE WITH HALO
-1F608 ; emoji ; L1 ; secondary ; x # V6.0 (😈) SMILING FACE WITH HORNS
-1F609 ; emoji ; L1 ; secondary ; j # V6.0 (😉) WINKING FACE
-1F60A ; emoji ; L1 ; secondary ; j # V6.0 (😊) SMILING FACE WITH SMILING EYES
-1F60B ; emoji ; L1 ; secondary ; j # V6.0 (😋) FACE SAVOURING DELICIOUS FOOD
-1F60C ; emoji ; L1 ; secondary ; j # V6.0 (😌) RELIEVED FACE
-1F60D ; emoji ; L1 ; secondary ; j # V6.0 (😍) SMILING FACE WITH HEART-SHAPED EYES
-1F60E ; emoji ; L1 ; secondary ; x # V6.0 (😎) SMILING FACE WITH SUNGLASSES
-1F60F ; emoji ; L1 ; secondary ; j # V6.0 (😏) SMIRKING FACE
-1F610 ; emoji ; L1 ; secondary ; w # V6.0 (😐) NEUTRAL FACE
-1F611 ; emoji ; L1 ; secondary ; x # V6.1 (😑) EXPRESSIONLESS FACE
-1F612 ; emoji ; L1 ; secondary ; j # V6.0 (😒) UNAMUSED FACE
-1F613 ; emoji ; L1 ; secondary ; j # V6.0 (😓) FACE WITH COLD SWEAT
-1F614 ; emoji ; L1 ; secondary ; j # V6.0 (😔) PENSIVE FACE
-1F615 ; emoji ; L1 ; secondary ; x # V6.1 (😕) CONFUSED FACE
-1F616 ; emoji ; L1 ; secondary ; j # V6.0 (😖) CONFOUNDED FACE
-1F617 ; emoji ; L1 ; secondary ; x # V6.1 (😗) KISSING FACE
-1F618 ; emoji ; L1 ; secondary ; j # V6.0 (😘) FACE THROWING A KISS
-1F619 ; emoji ; L1 ; secondary ; x # V6.1 (😙) KISSING FACE WITH SMILING EYES
-1F61A ; emoji ; L1 ; secondary ; j # V6.0 (😚) KISSING FACE WITH CLOSED EYES
-1F61B ; emoji ; L1 ; secondary ; x # V6.1 (😛) FACE WITH STUCK-OUT TONGUE
-1F61C ; emoji ; L1 ; secondary ; j # V6.0 (😜) FACE WITH STUCK-OUT TONGUE AND WINKING EYE
-1F61D ; emoji ; L1 ; secondary ; j # V6.0 (😝) FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES
-1F61E ; emoji ; L1 ; secondary ; j # V6.0 (😞) DISAPPOINTED FACE
-1F61F ; emoji ; L1 ; secondary ; x # V6.1 (😟) WORRIED FACE
-1F620 ; emoji ; L1 ; secondary ; j # V6.0 (😠) ANGRY FACE
-1F621 ; emoji ; L1 ; secondary ; j # V6.0 (😡) POUTING FACE
-1F622 ; emoji ; L1 ; secondary ; j # V6.0 (😢) CRYING FACE
-1F623 ; emoji ; L1 ; secondary ; j # V6.0 (😣) PERSEVERING FACE
-1F624 ; emoji ; L1 ; secondary ; j # V6.0 (😤) FACE WITH LOOK OF TRIUMPH
-1F625 ; emoji ; L1 ; secondary ; j # V6.0 (😥) DISAPPOINTED BUT RELIEVED FACE
-1F626 ; emoji ; L1 ; secondary ; x # V6.1 (😦) FROWNING FACE WITH OPEN MOUTH
-1F627 ; emoji ; L1 ; secondary ; x # V6.1 (😧) ANGUISHED FACE
-1F628 ; emoji ; L1 ; secondary ; j # V6.0 (😨) FEARFUL FACE
-1F629 ; emoji ; L1 ; secondary ; j # V6.0 (😩) WEARY FACE
-1F62A ; emoji ; L1 ; secondary ; j # V6.0 (😪) SLEEPY FACE
-1F62B ; emoji ; L1 ; secondary ; j # V6.0 (😫) TIRED FACE
-1F62C ; emoji ; L1 ; secondary ; x # V6.1 (😬) GRIMACING FACE
-1F62D ; emoji ; L1 ; secondary ; j # V6.0 (😭) LOUDLY CRYING FACE
-1F62E ; emoji ; L1 ; secondary ; x # V6.1 (😮) FACE WITH OPEN MOUTH
-1F62F ; emoji ; L1 ; secondary ; x # V6.1 (😯) HUSHED FACE
-1F630 ; emoji ; L1 ; secondary ; j # V6.0 (😰) FACE WITH OPEN MOUTH AND COLD SWEAT
-1F631 ; emoji ; L1 ; secondary ; j # V6.0 (😱) FACE SCREAMING IN FEAR
-1F632 ; emoji ; L1 ; secondary ; j # V6.0 (😲) ASTONISHED FACE
-1F633 ; emoji ; L1 ; secondary ; j # V6.0 (😳) FLUSHED FACE
-1F634 ; emoji ; L1 ; secondary ; x # V6.1 (😴) SLEEPING FACE
-1F635 ; emoji ; L1 ; secondary ; j # V6.0 (😵) DIZZY FACE
-1F636 ; emoji ; L1 ; secondary ; x # V6.0 (😶) FACE WITHOUT MOUTH
-1F637 ; emoji ; L1 ; secondary ; j # V6.0 (😷) FACE WITH MEDICAL MASK
-1F638 ; emoji ; L1 ; none ; j # V6.0 (😸) GRINNING CAT FACE WITH SMILING EYES
-1F639 ; emoji ; L1 ; none ; j # V6.0 (😹) CAT FACE WITH TEARS OF JOY
-1F63A ; emoji ; L1 ; none ; j # V6.0 (😺) SMILING CAT FACE WITH OPEN MOUTH
-1F63B ; emoji ; L1 ; none ; j # V6.0 (😻) SMILING CAT FACE WITH HEART-SHAPED EYES
-1F63C ; emoji ; L1 ; none ; j # V6.0 (😼) CAT FACE WITH WRY SMILE
-1F63D ; emoji ; L1 ; none ; j # V6.0 (😽) KISSING CAT FACE WITH CLOSED EYES
-1F63E ; emoji ; L1 ; none ; j # V6.0 (😾) POUTING CAT FACE
-1F63F ; emoji ; L1 ; none ; j # V6.0 (😿) CRYING CAT FACE
-1F640 ; emoji ; L1 ; none ; j # V6.0 (🙀) WEARY CAT FACE
-1F641 ; emoji ; L2 ; secondary ; x # V7.0 (🙁) SLIGHTLY FROWNING FACE
-1F642 ; emoji ; L2 ; secondary ; x # V7.0 (🙂) SLIGHTLY SMILING FACE
-1F643 ; emoji ; L2 ; secondary ; x # V8.0 (🙃) UPSIDE-DOWN FACE
-1F644 ; emoji ; L2 ; secondary ; x # V8.0 (🙄) FACE WITH ROLLING EYES
-1F645 ; emoji ; L1 ; primary ; j # V6.0 (🙅) FACE WITH NO GOOD GESTURE
-1F646 ; emoji ; L1 ; primary ; j # V6.0 (🙆) FACE WITH OK GESTURE
-1F647 ; emoji ; L1 ; primary ; j # V6.0 (🙇) PERSON BOWING DEEPLY
-1F648 ; emoji ; L1 ; none ; j # V6.0 (🙈) SEE-NO-EVIL MONKEY
-1F649 ; emoji ; L1 ; none ; j # V6.0 (🙉) HEAR-NO-EVIL MONKEY
-1F64A ; emoji ; L1 ; none ; j # V6.0 (🙊) SPEAK-NO-EVIL MONKEY
-1F64B ; emoji ; L1 ; primary ; j # V6.0 (🙋) HAPPY PERSON RAISING ONE HAND
-1F64C ; emoji ; L1 ; secondary ; j # V6.0 (🙌) PERSON RAISING BOTH HANDS IN CELEBRATION
-1F64D ; emoji ; L1 ; primary ; j # V6.0 (🙍) PERSON FROWNING
-1F64E ; emoji ; L1 ; primary ; j # V6.0 (🙎) PERSON WITH POUTING FACE
-1F64F ; emoji ; L1 ; secondary ; j # V6.0 (🙏) PERSON WITH FOLDED HANDS
-1F680 ; emoji ; L1 ; none ; j # V6.0 (🚀) ROCKET
-1F681 ; emoji ; L1 ; none ; x # V6.0 (🚁) HELICOPTER
-1F682 ; emoji ; L1 ; none ; x # V6.0 (🚂) STEAM LOCOMOTIVE
-1F683 ; emoji ; L1 ; none ; j # V6.0 (🚃) RAILWAY CAR
-1F684 ; emoji ; L1 ; none ; j # V6.0 (🚄) HIGH-SPEED TRAIN
-1F685 ; emoji ; L1 ; none ; j # V6.0 (🚅) HIGH-SPEED TRAIN WITH BULLET NOSE
-1F686 ; emoji ; L1 ; none ; x # V6.0 (🚆) TRAIN
-1F687 ; emoji ; L1 ; none ; j w # V6.0 (🚇) METRO
-1F688 ; emoji ; L1 ; none ; x # V6.0 (🚈) LIGHT RAIL
-1F689 ; emoji ; L1 ; none ; j # V6.0 (🚉) STATION
-1F68A ; emoji ; L1 ; none ; x # V6.0 (🚊) TRAM
-1F68B ; emoji ; L1 ; none ; x # V6.0 (🚋) TRAM CAR
-1F68C ; emoji ; L1 ; none ; j # V6.0 (🚌) BUS
-1F68D ; emoji ; L1 ; none ; w # V6.0 (🚍) ONCOMING BUS
-1F68E ; emoji ; L1 ; none ; x # V6.0 (🚎) TROLLEYBUS
-1F68F ; emoji ; L1 ; none ; j # V6.0 (🚏) BUS STOP
-1F690 ; emoji ; L1 ; none ; x # V6.0 (🚐) MINIBUS
-1F691 ; emoji ; L1 ; none ; j w # V6.0 (🚑) AMBULANCE
-1F692 ; emoji ; L1 ; none ; j # V6.0 (🚒) FIRE ENGINE
-1F693 ; emoji ; L1 ; none ; j # V6.0 (🚓) POLICE CAR
-1F694 ; emoji ; L1 ; none ; w # V6.0 (🚔) ONCOMING POLICE CAR
-1F695 ; emoji ; L1 ; none ; j # V6.0 (🚕) TAXI
-1F696 ; emoji ; L1 ; none ; x # V6.0 (🚖) ONCOMING TAXI
-1F697 ; emoji ; L1 ; none ; j # V6.0 (🚗) AUTOMOBILE
-1F698 ; emoji ; L1 ; none ; w # V6.0 (🚘) ONCOMING AUTOMOBILE
-1F699 ; emoji ; L1 ; none ; j # V6.0 (🚙) RECREATIONAL VEHICLE
-1F69A ; emoji ; L1 ; none ; j # V6.0 (🚚) DELIVERY TRUCK
-1F69B ; emoji ; L1 ; none ; x # V6.0 (🚛) ARTICULATED LORRY
-1F69C ; emoji ; L1 ; none ; x # V6.0 (🚜) TRACTOR
-1F69D ; emoji ; L1 ; none ; x # V6.0 (🚝) MONORAIL
-1F69E ; emoji ; L1 ; none ; x # V6.0 (🚞) MOUNTAIN RAILWAY
-1F69F ; emoji ; L1 ; none ; x # V6.0 (🚟) SUSPENSION RAILWAY
-1F6A0 ; emoji ; L1 ; none ; x # V6.0 (🚠) MOUNTAIN CABLEWAY
-1F6A1 ; emoji ; L1 ; none ; x # V6.0 (🚡) AERIAL TRAMWAY
-1F6A2 ; emoji ; L1 ; none ; j # V6.0 (🚢) SHIP
-1F6A3 ; emoji ; L1 ; secondary ; x # V6.0 (🚣) ROWBOAT
-1F6A4 ; emoji ; L1 ; none ; j # V6.0 (🚤) SPEEDBOAT
-1F6A5 ; emoji ; L1 ; none ; j # V6.0 (🚥) HORIZONTAL TRAFFIC LIGHT
-1F6A6 ; emoji ; L1 ; none ; x # V6.0 (🚦) VERTICAL TRAFFIC LIGHT
-1F6A7 ; emoji ; L1 ; none ; j # V6.0 (🚧) CONSTRUCTION SIGN
-1F6A8 ; emoji ; L1 ; none ; j # V6.0 (🚨) POLICE CARS REVOLVING LIGHT
-1F6A9 ; emoji ; L1 ; none ; j # V6.0 (🚩) TRIANGULAR FLAG ON POST
-1F6AA ; emoji ; L1 ; none ; j # V6.0 (🚪) DOOR
-1F6AB ; emoji ; L1 ; none ; j # V6.0 (🚫) NO ENTRY SIGN
-1F6AC ; emoji ; L1 ; none ; j # V6.0 (🚬) SMOKING SYMBOL
-1F6AD ; emoji ; L1 ; none ; j w # V6.0 (🚭) NO SMOKING SYMBOL
-1F6AE ; emoji ; L1 ; none ; x # V6.0 (🚮) PUT LITTER IN ITS PLACE SYMBOL
-1F6AF ; emoji ; L1 ; none ; x # V6.0 (🚯) DO NOT LITTER SYMBOL
-1F6B0 ; emoji ; L1 ; none ; x # V6.0 (🚰) POTABLE WATER SYMBOL
-1F6B1 ; emoji ; L1 ; none ; x # V6.0 (🚱) NON-POTABLE WATER SYMBOL
-1F6B2 ; emoji ; L1 ; none ; j w # V6.0 (🚲) BICYCLE
-1F6B3 ; emoji ; L1 ; none ; x # V6.0 (🚳) NO BICYCLES
-1F6B4 ; emoji ; L1 ; secondary ; x # V6.0 (🚴) BICYCLIST
-1F6B5 ; emoji ; L1 ; secondary ; x # V6.0 (🚵) MOUNTAIN BICYCLIST
-1F6B6 ; emoji ; L1 ; secondary ; j # V6.0 (🚶) PEDESTRIAN
-1F6B7 ; emoji ; L1 ; none ; x # V6.0 (🚷) NO PEDESTRIANS
-1F6B8 ; emoji ; L1 ; none ; x # V6.0 (🚸) CHILDREN CROSSING
-1F6B9 ; emoji ; L1 ; none ; j w # V6.0 (🚹) MENS SYMBOL
-1F6BA ; emoji ; L1 ; none ; j w # V6.0 (🚺) WOMENS SYMBOL
-1F6BB ; emoji ; L1 ; none ; j # V6.0 (🚻) RESTROOM
-1F6BC ; emoji ; L1 ; none ; j w # V6.0 (🚼) BABY SYMBOL
-1F6BD ; emoji ; L1 ; none ; j # V6.0 (🚽) TOILET
-1F6BE ; emoji ; L1 ; none ; j # V6.0 (🚾) WATER CLOSET
-1F6BF ; emoji ; L1 ; none ; x # V6.0 (🚿) SHOWER
-1F6C0 ; emoji ; L1 ; secondary ; j # V6.0 (🛀) BATH
-1F6C1 ; emoji ; L1 ; none ; x # V6.0 (🛁) BATHTUB
-1F6C2 ; emoji ; L1 ; none ; x # V6.0 (🛂) PASSPORT CONTROL
-1F6C3 ; emoji ; L1 ; none ; x # V6.0 (🛃) CUSTOMS
-1F6C4 ; emoji ; L1 ; none ; x # V6.0 (🛄) BAGGAGE CLAIM
-1F6C5 ; emoji ; L1 ; none ; x # V6.0 (🛅) LEFT LUGGAGE
-1F6CB ; text ; L2 ; none ; w # V7.0 (🛋) COUCH AND LAMP
-1F6CC ; emoji ; L2 ; none ; x # V7.0 (🛌) SLEEPING ACCOMMODATION
-1F6CD ; text ; L2 ; none ; w # V7.0 (🛍) SHOPPING BAGS
-1F6CE ; text ; L2 ; none ; w # V7.0 (🛎) BELLHOP BELL
-1F6CF ; text ; L2 ; none ; w # V7.0 (🛏) BED
-1F6D0 ; emoji ; L2 ; none ; x # V8.0 (🛐) PLACE OF WORSHIP
-1F6E0 ; text ; L2 ; none ; w # V7.0 (🛠) HAMMER AND WRENCH
-1F6E1 ; text ; L2 ; none ; w # V7.0 (🛡) SHIELD
-1F6E2 ; text ; L2 ; none ; w # V7.0 (🛢) OIL DRUM
-1F6E3 ; text ; L2 ; none ; w # V7.0 (🛣) MOTORWAY
-1F6E4 ; text ; L2 ; none ; w # V7.0 (🛤) RAILWAY TRACK
-1F6E5 ; text ; L2 ; none ; w # V7.0 (🛥) MOTOR BOAT
-1F6E9 ; text ; L2 ; none ; w # V7.0 (🛩) SMALL AIRPLANE
-1F6EB ; emoji ; L2 ; none ; x # V7.0 (🛫) AIRPLANE DEPARTURE
-1F6EC ; emoji ; L2 ; none ; x # V7.0 (🛬) AIRPLANE ARRIVING
-1F6F0 ; text ; L2 ; none ; w # V7.0 (🛰) SATELLITE
-1F6F3 ; text ; L2 ; none ; w # V7.0 (🛳) PASSENGER SHIP
-1F910 ; emoji ; L2 ; secondary ; x # V8.0 (🤐) ZIPPER-MOUTH FACE
-1F911 ; emoji ; L2 ; secondary ; x # V8.0 (🤑) MONEY-MOUTH FACE
-1F912 ; emoji ; L2 ; secondary ; x # V8.0 (🤒) FACE WITH THERMOMETER
-1F913 ; emoji ; L2 ; secondary ; x # V8.0 (🤓) NERD FACE
-1F914 ; emoji ; L2 ; secondary ; x # V8.0 (🤔) THINKING FACE
-1F915 ; emoji ; L2 ; secondary ; x # V8.0 (🤕) FACE WITH HEAD-BANDAGE
-1F916 ; emoji ; L2 ; none ; x # V8.0 (🤖) ROBOT FACE
-1F917 ; emoji ; L2 ; secondary ; x # V8.0 (🤗) HUGGING FACE
-1F918 ; emoji ; L2 ; secondary ; x # V8.0 (🤘) SIGN OF THE HORNS
-1F980 ; emoji ; L2 ; none ; x # V8.0 (🦀) CRAB
-1F981 ; emoji ; L2 ; none ; x # V8.0 (🦁) LION FACE
-1F982 ; emoji ; L2 ; none ; x # V8.0 (🦂) SCORPION
-1F983 ; emoji ; L2 ; none ; x # V8.0 (🦃) TURKEY
-1F984 ; emoji ; L2 ; none ; x # V8.0 (🦄) UNICORN FACE
-1F9C0 ; emoji ; L2 ; none ; x # V8.0 (🧀) CHEESE WEDGE
-0023 20E3 ; text ; L1 ; none ; j # V3.0 (#⃣) keycap NUMBER SIGN
-002A 20E3 ; text ; L2 ; none ; x # V3.0 (*⃣) keycap ASTERISK
-0030 20E3 ; text ; L1 ; none ; j # V3.0 (0⃣) keycap DIGIT ZERO
-0031 20E3 ; text ; L1 ; none ; j # V3.0 (1⃣) keycap DIGIT ONE
-0032 20E3 ; text ; L1 ; none ; j # V3.0 (2⃣) keycap DIGIT TWO
-0033 20E3 ; text ; L1 ; none ; j # V3.0 (3⃣) keycap DIGIT THREE
-0034 20E3 ; text ; L1 ; none ; j # V3.0 (4⃣) keycap DIGIT FOUR
-0035 20E3 ; text ; L1 ; none ; j # V3.0 (5⃣) keycap DIGIT FIVE
-0036 20E3 ; text ; L1 ; none ; j # V3.0 (6⃣) keycap DIGIT SIX
-0037 20E3 ; text ; L1 ; none ; j # V3.0 (7⃣) keycap DIGIT SEVEN
-0038 20E3 ; text ; L1 ; none ; j # V3.0 (8⃣) keycap DIGIT EIGHT
-0039 20E3 ; text ; L1 ; none ; j # V3.0 (9⃣) keycap DIGIT NINE
-1F1E6 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇦🇨) flag for Ascension Island
-1F1E6 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇦🇩) flag for Andorra
-1F1E6 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇦🇪) flag for United Arab Emirates
-1F1E6 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇦🇫) flag for Afghanistan
-1F1E6 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇦🇬) flag for Antigua & Barbuda
-1F1E6 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇦🇮) flag for Anguilla
-1F1E6 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇦🇱) flag for Albania
-1F1E6 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇦🇲) flag for Armenia
-1F1E6 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇦🇴) flag for Angola
-1F1E6 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇦🇶) flag for Antarctica
-1F1E6 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇦🇷) flag for Argentina
-1F1E6 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇦🇸) flag for American Samoa
-1F1E6 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇦🇹) flag for Austria
-1F1E6 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇦🇺) flag for Australia
-1F1E6 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇦🇼) flag for Aruba
-1F1E6 1F1FD ; emoji ; L2 ; none ; x # V6.0 (🇦🇽) flag for Åland Islands
-1F1E6 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇦🇿) flag for Azerbaijan
-1F1E7 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇧🇦) flag for Bosnia & Herzegovina
-1F1E7 1F1E7 ; emoji ; L2 ; none ; x # V6.0 (🇧🇧) flag for Barbados
-1F1E7 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇧🇩) flag for Bangladesh
-1F1E7 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇧🇪) flag for Belgium
-1F1E7 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇧🇫) flag for Burkina Faso
-1F1E7 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇧🇬) flag for Bulgaria
-1F1E7 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇧🇭) flag for Bahrain
-1F1E7 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇧🇮) flag for Burundi
-1F1E7 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇧🇯) flag for Benin
-1F1E7 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇧🇱) flag for St. Barthélemy
-1F1E7 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇧🇲) flag for Bermuda
-1F1E7 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇧🇳) flag for Brunei
-1F1E7 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇧🇴) flag for Bolivia
-1F1E7 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇧🇶) flag for Caribbean Netherlands
-1F1E7 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇧🇷) flag for Brazil
-1F1E7 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇧🇸) flag for Bahamas
-1F1E7 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇧🇹) flag for Bhutan
-1F1E7 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇧🇻) flag for Bouvet Island
-1F1E7 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇧🇼) flag for Botswana
-1F1E7 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇧🇾) flag for Belarus
-1F1E7 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇧🇿) flag for Belize
-1F1E8 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇨🇦) flag for Canada
-1F1E8 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇨🇨) flag for Cocos Islands
-1F1E8 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇨🇩) flag for Congo - Kinshasa
-1F1E8 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇨🇫) flag for Central African Republic
-1F1E8 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇨🇬) flag for Congo - Brazzaville
-1F1E8 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇨🇭) flag for Switzerland
-1F1E8 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇨🇮) flag for Côte d’Ivoire
-1F1E8 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇨🇰) flag for Cook Islands
-1F1E8 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇨🇱) flag for Chile
-1F1E8 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇨🇲) flag for Cameroon
-1F1E8 1F1F3 ; emoji ; L1 ; none ; j # V6.0 (🇨🇳) flag for China
-1F1E8 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇨🇴) flag for Colombia
-1F1E8 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇨🇵) flag for Clipperton Island
-1F1E8 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇨🇷) flag for Costa Rica
-1F1E8 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇨🇺) flag for Cuba
-1F1E8 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇨🇻) flag for Cape Verde
-1F1E8 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇨🇼) flag for Curaçao
-1F1E8 1F1FD ; emoji ; L2 ; none ; x # V6.0 (🇨🇽) flag for Christmas Island
-1F1E8 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇨🇾) flag for Cyprus
-1F1E8 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇨🇿) flag for Czech Republic
-1F1E9 1F1EA ; emoji ; L1 ; none ; j # V6.0 (🇩🇪) flag for Germany
-1F1E9 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇩🇬) flag for Diego Garcia
-1F1E9 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇩🇯) flag for Djibouti
-1F1E9 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇩🇰) flag for Denmark
-1F1E9 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇩🇲) flag for Dominica
-1F1E9 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇩🇴) flag for Dominican Republic
-1F1E9 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇩🇿) flag for Algeria
-1F1EA 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇪🇦) flag for Ceuta & Melilla
-1F1EA 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇪🇨) flag for Ecuador
-1F1EA 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇪🇪) flag for Estonia
-1F1EA 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇪🇬) flag for Egypt
-1F1EA 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇪🇭) flag for Western Sahara
-1F1EA 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇪🇷) flag for Eritrea
-1F1EA 1F1F8 ; emoji ; L1 ; none ; j # V6.0 (🇪🇸) flag for Spain
-1F1EA 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇪🇹) flag for Ethiopia
-1F1EA 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇪🇺) flag for European Union
-1F1EB 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇫🇮) flag for Finland
-1F1EB 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇫🇯) flag for Fiji
-1F1EB 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇫🇰) flag for Falkland Islands
-1F1EB 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇫🇲) flag for Micronesia
-1F1EB 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇫🇴) flag for Faroe Islands
-1F1EB 1F1F7 ; emoji ; L1 ; none ; j # V6.0 (🇫🇷) flag for France
-1F1EC 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇬🇦) flag for Gabon
-1F1EC 1F1E7 ; emoji ; L1 ; none ; j # V6.0 (🇬🇧) flag for United Kingdom
-1F1EC 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇬🇩) flag for Grenada
-1F1EC 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇬🇪) flag for Georgia
-1F1EC 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇬🇫) flag for French Guiana
-1F1EC 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇬🇬) flag for Guernsey
-1F1EC 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇬🇭) flag for Ghana
-1F1EC 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇬🇮) flag for Gibraltar
-1F1EC 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇬🇱) flag for Greenland
-1F1EC 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇬🇲) flag for Gambia
-1F1EC 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇬🇳) flag for Guinea
-1F1EC 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇬🇵) flag for Guadeloupe
-1F1EC 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇬🇶) flag for Equatorial Guinea
-1F1EC 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇬🇷) flag for Greece
-1F1EC 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇬🇸) flag for South Georgia & South Sandwich Islands
-1F1EC 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇬🇹) flag for Guatemala
-1F1EC 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇬🇺) flag for Guam
-1F1EC 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇬🇼) flag for Guinea-Bissau
-1F1EC 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇬🇾) flag for Guyana
-1F1ED 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇭🇰) flag for Hong Kong
-1F1ED 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇭🇲) flag for Heard & McDonald Islands
-1F1ED 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇭🇳) flag for Honduras
-1F1ED 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇭🇷) flag for Croatia
-1F1ED 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇭🇹) flag for Haiti
-1F1ED 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇭🇺) flag for Hungary
-1F1EE 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇮🇨) flag for Canary Islands
-1F1EE 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇮🇩) flag for Indonesia
-1F1EE 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇮🇪) flag for Ireland
-1F1EE 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇮🇱) flag for Israel
-1F1EE 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇮🇲) flag for Isle of Man
-1F1EE 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇮🇳) flag for India
-1F1EE 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇮🇴) flag for British Indian Ocean Territory
-1F1EE 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇮🇶) flag for Iraq
-1F1EE 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇮🇷) flag for Iran
-1F1EE 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇮🇸) flag for Iceland
-1F1EE 1F1F9 ; emoji ; L1 ; none ; j # V6.0 (🇮🇹) flag for Italy
-1F1EF 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇯🇪) flag for Jersey
-1F1EF 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇯🇲) flag for Jamaica
-1F1EF 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇯🇴) flag for Jordan
-1F1EF 1F1F5 ; emoji ; L1 ; none ; j # V6.0 (🇯🇵) flag for Japan
-1F1F0 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇰🇪) flag for Kenya
-1F1F0 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇰🇬) flag for Kyrgyzstan
-1F1F0 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇰🇭) flag for Cambodia
-1F1F0 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇰🇮) flag for Kiribati
-1F1F0 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇰🇲) flag for Comoros
-1F1F0 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇰🇳) flag for St. Kitts & Nevis
-1F1F0 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇰🇵) flag for North Korea
-1F1F0 1F1F7 ; emoji ; L1 ; none ; j # V6.0 (🇰🇷) flag for South Korea
-1F1F0 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇰🇼) flag for Kuwait
-1F1F0 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇰🇾) flag for Cayman Islands
-1F1F0 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇰🇿) flag for Kazakhstan
-1F1F1 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇱🇦) flag for Laos
-1F1F1 1F1E7 ; emoji ; L2 ; none ; x # V6.0 (🇱🇧) flag for Lebanon
-1F1F1 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇱🇨) flag for St. Lucia
-1F1F1 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇱🇮) flag for Liechtenstein
-1F1F1 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇱🇰) flag for Sri Lanka
-1F1F1 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇱🇷) flag for Liberia
-1F1F1 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇱🇸) flag for Lesotho
-1F1F1 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇱🇹) flag for Lithuania
-1F1F1 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇱🇺) flag for Luxembourg
-1F1F1 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇱🇻) flag for Latvia
-1F1F1 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇱🇾) flag for Libya
-1F1F2 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇲🇦) flag for Morocco
-1F1F2 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇲🇨) flag for Monaco
-1F1F2 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇲🇩) flag for Moldova
-1F1F2 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇲🇪) flag for Montenegro
-1F1F2 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇲🇫) flag for St. Martin
-1F1F2 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇲🇬) flag for Madagascar
-1F1F2 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇲🇭) flag for Marshall Islands
-1F1F2 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇲🇰) flag for Macedonia
-1F1F2 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇲🇱) flag for Mali
-1F1F2 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇲🇲) flag for Myanmar
-1F1F2 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇲🇳) flag for Mongolia
-1F1F2 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇲🇴) flag for Macau
-1F1F2 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇲🇵) flag for Northern Mariana Islands
-1F1F2 1F1F6 ; emoji ; L2 ; none ; x # V6.0 (🇲🇶) flag for Martinique
-1F1F2 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇲🇷) flag for Mauritania
-1F1F2 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇲🇸) flag for Montserrat
-1F1F2 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇲🇹) flag for Malta
-1F1F2 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇲🇺) flag for Mauritius
-1F1F2 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇲🇻) flag for Maldives
-1F1F2 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇲🇼) flag for Malawi
-1F1F2 1F1FD ; emoji ; L2 ; none ; x # V6.0 (🇲🇽) flag for Mexico
-1F1F2 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇲🇾) flag for Malaysia
-1F1F2 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇲🇿) flag for Mozambique
-1F1F3 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇳🇦) flag for Namibia
-1F1F3 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇳🇨) flag for New Caledonia
-1F1F3 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇳🇪) flag for Niger
-1F1F3 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇳🇫) flag for Norfolk Island
-1F1F3 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇳🇬) flag for Nigeria
-1F1F3 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇳🇮) flag for Nicaragua
-1F1F3 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇳🇱) flag for Netherlands
-1F1F3 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇳🇴) flag for Norway
-1F1F3 1F1F5 ; emoji ; L2 ; none ; x # V6.0 (🇳🇵) flag for Nepal
-1F1F3 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇳🇷) flag for Nauru
-1F1F3 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇳🇺) flag for Niue
-1F1F3 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇳🇿) flag for New Zealand
-1F1F4 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇴🇲) flag for Oman
-1F1F5 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇵🇦) flag for Panama
-1F1F5 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇵🇪) flag for Peru
-1F1F5 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇵🇫) flag for French Polynesia
-1F1F5 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇵🇬) flag for Papua New Guinea
-1F1F5 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇵🇭) flag for Philippines
-1F1F5 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇵🇰) flag for Pakistan
-1F1F5 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇵🇱) flag for Poland
-1F1F5 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇵🇲) flag for St. Pierre & Miquelon
-1F1F5 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇵🇳) flag for Pitcairn Islands
-1F1F5 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇵🇷) flag for Puerto Rico
-1F1F5 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇵🇸) flag for Palestinian Territories
-1F1F5 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇵🇹) flag for Portugal
-1F1F5 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇵🇼) flag for Palau
-1F1F5 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇵🇾) flag for Paraguay
-1F1F6 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇶🇦) flag for Qatar
-1F1F7 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇷🇪) flag for Réunion
-1F1F7 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇷🇴) flag for Romania
-1F1F7 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇷🇸) flag for Serbia
-1F1F7 1F1FA ; emoji ; L1 ; none ; j # V6.0 (🇷🇺) flag for Russia
-1F1F7 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇷🇼) flag for Rwanda
-1F1F8 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇸🇦) flag for Saudi Arabia
-1F1F8 1F1E7 ; emoji ; L2 ; none ; x # V6.0 (🇸🇧) flag for Solomon Islands
-1F1F8 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇸🇨) flag for Seychelles
-1F1F8 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇸🇩) flag for Sudan
-1F1F8 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇸🇪) flag for Sweden
-1F1F8 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇸🇬) flag for Singapore
-1F1F8 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇸🇭) flag for St. Helena
-1F1F8 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇸🇮) flag for Slovenia
-1F1F8 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇸🇯) flag for Svalbard & Jan Mayen
-1F1F8 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇸🇰) flag for Slovakia
-1F1F8 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇸🇱) flag for Sierra Leone
-1F1F8 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇸🇲) flag for San Marino
-1F1F8 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇸🇳) flag for Senegal
-1F1F8 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇸🇴) flag for Somalia
-1F1F8 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇸🇷) flag for Suriname
-1F1F8 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇸🇸) flag for South Sudan
-1F1F8 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇸🇹) flag for São Tomé & Príncipe
-1F1F8 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇸🇻) flag for El Salvador
-1F1F8 1F1FD ; emoji ; L2 ; none ; x # V6.0 (🇸🇽) flag for Sint Maarten
-1F1F8 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇸🇾) flag for Syria
-1F1F8 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇸🇿) flag for Swaziland
-1F1F9 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇹🇦) flag for Tristan da Cunha
-1F1F9 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇹🇨) flag for Turks & Caicos Islands
-1F1F9 1F1E9 ; emoji ; L2 ; none ; x # V6.0 (🇹🇩) flag for Chad
-1F1F9 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇹🇫) flag for French Southern Territories
-1F1F9 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇹🇬) flag for Togo
-1F1F9 1F1ED ; emoji ; L2 ; none ; x # V6.0 (🇹🇭) flag for Thailand
-1F1F9 1F1EF ; emoji ; L2 ; none ; x # V6.0 (🇹🇯) flag for Tajikistan
-1F1F9 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇹🇰) flag for Tokelau
-1F1F9 1F1F1 ; emoji ; L2 ; none ; x # V6.0 (🇹🇱) flag for Timor-Leste
-1F1F9 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇹🇲) flag for Turkmenistan
-1F1F9 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇹🇳) flag for Tunisia
-1F1F9 1F1F4 ; emoji ; L2 ; none ; x # V6.0 (🇹🇴) flag for Tonga
-1F1F9 1F1F7 ; emoji ; L2 ; none ; x # V6.0 (🇹🇷) flag for Turkey
-1F1F9 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇹🇹) flag for Trinidad & Tobago
-1F1F9 1F1FB ; emoji ; L2 ; none ; x # V6.0 (🇹🇻) flag for Tuvalu
-1F1F9 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇹🇼) flag for Taiwan
-1F1F9 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇹🇿) flag for Tanzania
-1F1FA 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇺🇦) flag for Ukraine
-1F1FA 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇺🇬) flag for Uganda
-1F1FA 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇺🇲) flag for U.S. Outlying Islands
-1F1FA 1F1F8 ; emoji ; L1 ; none ; j # V6.0 (🇺🇸) flag for United States
-1F1FA 1F1FE ; emoji ; L2 ; none ; x # V6.0 (🇺🇾) flag for Uruguay
-1F1FA 1F1FF ; emoji ; L2 ; none ; x # V6.0 (🇺🇿) flag for Uzbekistan
-1F1FB 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇻🇦) flag for Vatican City
-1F1FB 1F1E8 ; emoji ; L2 ; none ; x # V6.0 (🇻🇨) flag for St. Vincent & Grenadines
-1F1FB 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇻🇪) flag for Venezuela
-1F1FB 1F1EC ; emoji ; L2 ; none ; x # V6.0 (🇻🇬) flag for British Virgin Islands
-1F1FB 1F1EE ; emoji ; L2 ; none ; x # V6.0 (🇻🇮) flag for U.S. Virgin Islands
-1F1FB 1F1F3 ; emoji ; L2 ; none ; x # V6.0 (🇻🇳) flag for Vietnam
-1F1FB 1F1FA ; emoji ; L2 ; none ; x # V6.0 (🇻🇺) flag for Vanuatu
-1F1FC 1F1EB ; emoji ; L2 ; none ; x # V6.0 (🇼🇫) flag for Wallis & Futuna
-1F1FC 1F1F8 ; emoji ; L2 ; none ; x # V6.0 (🇼🇸) flag for Samoa
-1F1FD 1F1F0 ; emoji ; L2 ; none ; x # V6.0 (🇽🇰) flag for Kosovo
-1F1FE 1F1EA ; emoji ; L2 ; none ; x # V6.0 (🇾🇪) flag for Yemen
-1F1FE 1F1F9 ; emoji ; L2 ; none ; x # V6.0 (🇾🇹) flag for Mayotte
-1F1FF 1F1E6 ; emoji ; L2 ; none ; x # V6.0 (🇿🇦) flag for South Africa
-1F1FF 1F1F2 ; emoji ; L2 ; none ; x # V6.0 (🇿🇲) flag for Zambia
-1F1FF 1F1FC ; emoji ; L2 ; none ; x # V6.0 (🇿🇼) flag for Zimbabwe
+# This file provides data for testing which emoji forms should be in keyboards and which should also be displayed/processed.
+# Format: code points; status # emoji name
+# Code points — list of one or more hex code points, separated by spaces
+# Status
+# component — an Emoji_Component,
+# excluding Regional_Indicators, ASCII, and non-Emoji.
+# fully-qualified — a fully-qualified emoji (see ED-18 in UTS #51),
+# excluding Emoji_Component
+# minimally-qualified — a minimally-qualified emoji (see ED-18a in UTS #51)
+# unqualified — a unqualified emoji (See ED-19 in UTS #51)
+# Notes:
+# • This includes the emoji components that need emoji presentation (skin tone and hair)
+# when isolated, but omits the components that need not have an emoji
+# presentation when isolated.
+# • The RGI set is covered by the listed fully-qualified emoji.
+# • The listed minimally-qualified and unqualified cover all cases where an
+# element of the RGI set is missing one or more emoji presentation selectors.
+# • The file is in CLDR order, not codepoint order. This is recommended (but not required!) for keyboard palettes.
+# • The groups and subgroups are illustrative. See the Emoji Order chart for more information.
+
+
+# group: Smileys & Emotion
+
+# subgroup: face-smiling
+1F600 ; fully-qualified # 😀 grinning face
+1F603 ; fully-qualified # 😃 grinning face with big eyes
+1F604 ; fully-qualified # 😄 grinning face with smiling eyes
+1F601 ; fully-qualified # 😁 beaming face with smiling eyes
+1F606 ; fully-qualified # 😆 grinning squinting face
+1F605 ; fully-qualified # 😅 grinning face with sweat
+1F923 ; fully-qualified # 🤣 rolling on the floor laughing
+1F602 ; fully-qualified # 😂 face with tears of joy
+1F642 ; fully-qualified # 🙂 slightly smiling face
+1F643 ; fully-qualified # 🙃 upside-down face
+1F609 ; fully-qualified # 😉 winking face
+1F60A ; fully-qualified # 😊 smiling face with smiling eyes
+1F607 ; fully-qualified # 😇 smiling face with halo
+
+# subgroup: face-affection
+1F970 ; fully-qualified # 🥰 smiling face with hearts
+1F60D ; fully-qualified # 😍 smiling face with heart-eyes
+1F929 ; fully-qualified # 🤩 star-struck
+1F618 ; fully-qualified # 😘 face blowing a kiss
+1F617 ; fully-qualified # 😗 kissing face
+263A FE0F ; fully-qualified # ☺️ smiling face
+263A ; unqualified # ☺ smiling face
+1F61A ; fully-qualified # 😚 kissing face with closed eyes
+1F619 ; fully-qualified # 😙 kissing face with smiling eyes
+
+# subgroup: face-tongue
+1F60B ; fully-qualified # 😋 face savoring food
+1F61B ; fully-qualified # 😛 face with tongue
+1F61C ; fully-qualified # 😜 winking face with tongue
+1F92A ; fully-qualified # 🤪 zany face
+1F61D ; fully-qualified # 😝 squinting face with tongue
+1F911 ; fully-qualified # 🤑 money-mouth face
+
+# subgroup: face-hand
+1F917 ; fully-qualified # 🤗 hugging face
+1F92D ; fully-qualified # 🤭 face with hand over mouth
+1F92B ; fully-qualified # 🤫 shushing face
+1F914 ; fully-qualified # 🤔 thinking face
+
+# subgroup: face-neutral-skeptical
+1F910 ; fully-qualified # 🤐 zipper-mouth face
+1F928 ; fully-qualified # 🤨 face with raised eyebrow
+1F610 ; fully-qualified # 😐 neutral face
+1F611 ; fully-qualified # 😑 expressionless face
+1F636 ; fully-qualified # 😶 face without mouth
+1F60F ; fully-qualified # 😏 smirking face
+1F612 ; fully-qualified # 😒 unamused face
+1F644 ; fully-qualified # 🙄 face with rolling eyes
+1F62C ; fully-qualified # 😬 grimacing face
+1F925 ; fully-qualified # 🤥 lying face
+
+# subgroup: face-sleepy
+1F60C ; fully-qualified # 😌 relieved face
+1F614 ; fully-qualified # 😔 pensive face
+1F62A ; fully-qualified # 😪 sleepy face
+1F924 ; fully-qualified # 🤤 drooling face
+1F634 ; fully-qualified # 😴 sleeping face
+
+# subgroup: face-unwell
+1F637 ; fully-qualified # 😷 face with medical mask
+1F912 ; fully-qualified # 🤒 face with thermometer
+1F915 ; fully-qualified # 🤕 face with head-bandage
+1F922 ; fully-qualified # 🤢 nauseated face
+1F92E ; fully-qualified # 🤮 face vomiting
+1F927 ; fully-qualified # 🤧 sneezing face
+1F975 ; fully-qualified # 🥵 hot face
+1F976 ; fully-qualified # 🥶 cold face
+1F974 ; fully-qualified # 🥴 woozy face
+1F635 ; fully-qualified # 😵 dizzy face
+1F92F ; fully-qualified # 🤯 exploding head
+
+# subgroup: face-hat
+1F920 ; fully-qualified # 🤠 cowboy hat face
+1F973 ; fully-qualified # 🥳 partying face
+
+# subgroup: face-glasses
+1F60E ; fully-qualified # 😎 smiling face with sunglasses
+1F913 ; fully-qualified # 🤓 nerd face
+1F9D0 ; fully-qualified # 🧐 face with monocle
+
+# subgroup: face-concerned
+1F615 ; fully-qualified # 😕 confused face
+1F61F ; fully-qualified # 😟 worried face
+1F641 ; fully-qualified # 🙁 slightly frowning face
+2639 FE0F ; fully-qualified # ☹️ frowning face
+2639 ; unqualified # ☹ frowning face
+1F62E ; fully-qualified # 😮 face with open mouth
+1F62F ; fully-qualified # 😯 hushed face
+1F632 ; fully-qualified # 😲 astonished face
+1F633 ; fully-qualified # 😳 flushed face
+1F97A ; fully-qualified # 🥺 pleading face
+1F626 ; fully-qualified # 😦 frowning face with open mouth
+1F627 ; fully-qualified # 😧 anguished face
+1F628 ; fully-qualified # 😨 fearful face
+1F630 ; fully-qualified # 😰 anxious face with sweat
+1F625 ; fully-qualified # 😥 sad but relieved face
+1F622 ; fully-qualified # 😢 crying face
+1F62D ; fully-qualified # 😭 loudly crying face
+1F631 ; fully-qualified # 😱 face screaming in fear
+1F616 ; fully-qualified # 😖 confounded face
+1F623 ; fully-qualified # 😣 persevering face
+1F61E ; fully-qualified # 😞 disappointed face
+1F613 ; fully-qualified # 😓 downcast face with sweat
+1F629 ; fully-qualified # 😩 weary face
+1F62B ; fully-qualified # 😫 tired face
+1F971 ; fully-qualified # 🥱 yawning face
+
+# subgroup: face-negative
+1F624 ; fully-qualified # 😤 face with steam from nose
+1F621 ; fully-qualified # 😡 pouting face
+1F620 ; fully-qualified # 😠 angry face
+1F92C ; fully-qualified # 🤬 face with symbols on mouth
+1F608 ; fully-qualified # 😈 smiling face with horns
+1F47F ; fully-qualified # 👿 angry face with horns
+1F480 ; fully-qualified # 💀 skull
+2620 FE0F ; fully-qualified # ☠️ skull and crossbones
+2620 ; unqualified # ☠ skull and crossbones
+
+# subgroup: face-costume
+1F4A9 ; fully-qualified # 💩 pile of poo
+1F921 ; fully-qualified # 🤡 clown face
+1F479 ; fully-qualified # 👹 ogre
+1F47A ; fully-qualified # 👺 goblin
+1F47B ; fully-qualified # 👻 ghost
+1F47D ; fully-qualified # 👽 alien
+1F47E ; fully-qualified # 👾 alien monster
+1F916 ; fully-qualified # 🤖 robot
+
+# subgroup: cat-face
+1F63A ; fully-qualified # 😺 grinning cat
+1F638 ; fully-qualified # 😸 grinning cat with smiling eyes
+1F639 ; fully-qualified # 😹 cat with tears of joy
+1F63B ; fully-qualified # 😻 smiling cat with heart-eyes
+1F63C ; fully-qualified # 😼 cat with wry smile
+1F63D ; fully-qualified # 😽 kissing cat
+1F640 ; fully-qualified # 🙀 weary cat
+1F63F ; fully-qualified # 😿 crying cat
+1F63E ; fully-qualified # 😾 pouting cat
+
+# subgroup: monkey-face
+1F648 ; fully-qualified # 🙈 see-no-evil monkey
+1F649 ; fully-qualified # 🙉 hear-no-evil monkey
+1F64A ; fully-qualified # 🙊 speak-no-evil monkey
+
+# subgroup: emotion
+1F48B ; fully-qualified # 💋 kiss mark
+1F48C ; fully-qualified # 💌 love letter
+1F498 ; fully-qualified # 💘 heart with arrow
+1F49D ; fully-qualified # 💝 heart with ribbon
+1F496 ; fully-qualified # 💖 sparkling heart
+1F497 ; fully-qualified # 💗 growing heart
+1F493 ; fully-qualified # 💓 beating heart
+1F49E ; fully-qualified # 💞 revolving hearts
+1F495 ; fully-qualified # 💕 two hearts
+1F49F ; fully-qualified # 💟 heart decoration
+2763 FE0F ; fully-qualified # ❣️ heart exclamation
+2763 ; unqualified # ❣ heart exclamation
+1F494 ; fully-qualified # 💔 broken heart
+2764 FE0F ; fully-qualified # ❤️ red heart
+2764 ; unqualified # ❤ red heart
+1F9E1 ; fully-qualified # 🧡 orange heart
+1F49B ; fully-qualified # 💛 yellow heart
+1F49A ; fully-qualified # 💚 green heart
+1F499 ; fully-qualified # 💙 blue heart
+1F49C ; fully-qualified # 💜 purple heart
+1F90E ; fully-qualified # 🤎 brown heart
+1F5A4 ; fully-qualified # 🖤 black heart
+1F90D ; fully-qualified # 🤍 white heart
+1F4AF ; fully-qualified # 💯 hundred points
+1F4A2 ; fully-qualified # 💢 anger symbol
+1F4A5 ; fully-qualified # 💥 collision
+1F4AB ; fully-qualified # 💫 dizzy
+1F4A6 ; fully-qualified # 💦 sweat droplets
+1F4A8 ; fully-qualified # 💨 dashing away
+1F573 FE0F ; fully-qualified # 🕳️ hole
+1F573 ; unqualified # 🕳 hole
+1F4A3 ; fully-qualified # 💣 bomb
+1F4AC ; fully-qualified # 💬 speech balloon
+1F441 FE0F 200D 1F5E8 FE0F ; fully-qualified # 👁️🗨️ eye in speech bubble
+1F441 200D 1F5E8 FE0F ; unqualified # 👁🗨️ eye in speech bubble
+1F441 FE0F 200D 1F5E8 ; unqualified # 👁️🗨 eye in speech bubble
+1F441 200D 1F5E8 ; unqualified # 👁🗨 eye in speech bubble
+1F5E8 FE0F ; fully-qualified # 🗨️ left speech bubble
+1F5E8 ; unqualified # 🗨 left speech bubble
+1F5EF FE0F ; fully-qualified # 🗯️ right anger bubble
+1F5EF ; unqualified # 🗯 right anger bubble
+1F4AD ; fully-qualified # 💭 thought balloon
+1F4A4 ; fully-qualified # 💤 zzz
+
+# Smileys & Emotion subtotal: 160
+# Smileys & Emotion subtotal: 160 w/o modifiers
+
+# group: People & Body
+
+# subgroup: hand-fingers-open
+1F44B ; fully-qualified # 👋 waving hand
+1F44B 1F3FB ; fully-qualified # 👋🏻 waving hand: light skin tone
+1F44B 1F3FC ; fully-qualified # 👋🏼 waving hand: medium-light skin tone
+1F44B 1F3FD ; fully-qualified # 👋🏽 waving hand: medium skin tone
+1F44B 1F3FE ; fully-qualified # 👋🏾 waving hand: medium-dark skin tone
+1F44B 1F3FF ; fully-qualified # 👋🏿 waving hand: dark skin tone
+1F91A ; fully-qualified # 🤚 raised back of hand
+1F91A 1F3FB ; fully-qualified # 🤚🏻 raised back of hand: light skin tone
+1F91A 1F3FC ; fully-qualified # 🤚🏼 raised back of hand: medium-light skin tone
+1F91A 1F3FD ; fully-qualified # 🤚🏽 raised back of hand: medium skin tone
+1F91A 1F3FE ; fully-qualified # 🤚🏾 raised back of hand: medium-dark skin tone
+1F91A 1F3FF ; fully-qualified # 🤚🏿 raised back of hand: dark skin tone
+1F590 FE0F ; fully-qualified # 🖐️ hand with fingers splayed
+1F590 ; unqualified # 🖐 hand with fingers splayed
+1F590 1F3FB ; fully-qualified # 🖐🏻 hand with fingers splayed: light skin tone
+1F590 1F3FC ; fully-qualified # 🖐🏼 hand with fingers splayed: medium-light skin tone
+1F590 1F3FD ; fully-qualified # 🖐🏽 hand with fingers splayed: medium skin tone
+1F590 1F3FE ; fully-qualified # 🖐🏾 hand with fingers splayed: medium-dark skin tone
+1F590 1F3FF ; fully-qualified # 🖐🏿 hand with fingers splayed: dark skin tone
+270B ; fully-qualified # ✋ raised hand
+270B 1F3FB ; fully-qualified # ✋🏻 raised hand: light skin tone
+270B 1F3FC ; fully-qualified # ✋🏼 raised hand: medium-light skin tone
+270B 1F3FD ; fully-qualified # ✋🏽 raised hand: medium skin tone
+270B 1F3FE ; fully-qualified # ✋🏾 raised hand: medium-dark skin tone
+270B 1F3FF ; fully-qualified # ✋🏿 raised hand: dark skin tone
+1F596 ; fully-qualified # 🖖 vulcan salute
+1F596 1F3FB ; fully-qualified # 🖖🏻 vulcan salute: light skin tone
+1F596 1F3FC ; fully-qualified # 🖖🏼 vulcan salute: medium-light skin tone
+1F596 1F3FD ; fully-qualified # 🖖🏽 vulcan salute: medium skin tone
+1F596 1F3FE ; fully-qualified # 🖖🏾 vulcan salute: medium-dark skin tone
+1F596 1F3FF ; fully-qualified # 🖖🏿 vulcan salute: dark skin tone
+
+# subgroup: hand-fingers-partial
+1F44C ; fully-qualified # 👌 OK hand
+1F44C 1F3FB ; fully-qualified # 👌🏻 OK hand: light skin tone
+1F44C 1F3FC ; fully-qualified # 👌🏼 OK hand: medium-light skin tone
+1F44C 1F3FD ; fully-qualified # 👌🏽 OK hand: medium skin tone
+1F44C 1F3FE ; fully-qualified # 👌🏾 OK hand: medium-dark skin tone
+1F44C 1F3FF ; fully-qualified # 👌🏿 OK hand: dark skin tone
+1F90F ; fully-qualified # 🤏 pinching hand
+1F90F 1F3FB ; fully-qualified # 🤏🏻 pinching hand: light skin tone
+1F90F 1F3FC ; fully-qualified # 🤏🏼 pinching hand: medium-light skin tone
+1F90F 1F3FD ; fully-qualified # 🤏🏽 pinching hand: medium skin tone
+1F90F 1F3FE ; fully-qualified # 🤏🏾 pinching hand: medium-dark skin tone
+1F90F 1F3FF ; fully-qualified # 🤏🏿 pinching hand: dark skin tone
+270C FE0F ; fully-qualified # ✌️ victory hand
+270C ; unqualified # ✌ victory hand
+270C 1F3FB ; fully-qualified # ✌🏻 victory hand: light skin tone
+270C 1F3FC ; fully-qualified # ✌🏼 victory hand: medium-light skin tone
+270C 1F3FD ; fully-qualified # ✌🏽 victory hand: medium skin tone
+270C 1F3FE ; fully-qualified # ✌🏾 victory hand: medium-dark skin tone
+270C 1F3FF ; fully-qualified # ✌🏿 victory hand: dark skin tone
+1F91E ; fully-qualified # 🤞 crossed fingers
+1F91E 1F3FB ; fully-qualified # 🤞🏻 crossed fingers: light skin tone
+1F91E 1F3FC ; fully-qualified # 🤞🏼 crossed fingers: medium-light skin tone
+1F91E 1F3FD ; fully-qualified # 🤞🏽 crossed fingers: medium skin tone
+1F91E 1F3FE ; fully-qualified # 🤞🏾 crossed fingers: medium-dark skin tone
+1F91E 1F3FF ; fully-qualified # 🤞🏿 crossed fingers: dark skin tone
+1F91F ; fully-qualified # 🤟 love-you gesture
+1F91F 1F3FB ; fully-qualified # 🤟🏻 love-you gesture: light skin tone
+1F91F 1F3FC ; fully-qualified # 🤟🏼 love-you gesture: medium-light skin tone
+1F91F 1F3FD ; fully-qualified # 🤟🏽 love-you gesture: medium skin tone
+1F91F 1F3FE ; fully-qualified # 🤟🏾 love-you gesture: medium-dark skin tone
+1F91F 1F3FF ; fully-qualified # 🤟🏿 love-you gesture: dark skin tone
+1F918 ; fully-qualified # 🤘 sign of the horns
+1F918 1F3FB ; fully-qualified # 🤘🏻 sign of the horns: light skin tone
+1F918 1F3FC ; fully-qualified # 🤘🏼 sign of the horns: medium-light skin tone
+1F918 1F3FD ; fully-qualified # 🤘🏽 sign of the horns: medium skin tone
+1F918 1F3FE ; fully-qualified # 🤘🏾 sign of the horns: medium-dark skin tone
+1F918 1F3FF ; fully-qualified # 🤘🏿 sign of the horns: dark skin tone
+1F919 ; fully-qualified # 🤙 call me hand
+1F919 1F3FB ; fully-qualified # 🤙🏻 call me hand: light skin tone
+1F919 1F3FC ; fully-qualified # 🤙🏼 call me hand: medium-light skin tone
+1F919 1F3FD ; fully-qualified # 🤙🏽 call me hand: medium skin tone
+1F919 1F3FE ; fully-qualified # 🤙🏾 call me hand: medium-dark skin tone
+1F919 1F3FF ; fully-qualified # 🤙🏿 call me hand: dark skin tone
+
+# subgroup: hand-single-finger
+1F448 ; fully-qualified # 👈 backhand index pointing left
+1F448 1F3FB ; fully-qualified # 👈🏻 backhand index pointing left: light skin tone
+1F448 1F3FC ; fully-qualified # 👈🏼 backhand index pointing left: medium-light skin tone
+1F448 1F3FD ; fully-qualified # 👈🏽 backhand index pointing left: medium skin tone
+1F448 1F3FE ; fully-qualified # 👈🏾 backhand index pointing left: medium-dark skin tone
+1F448 1F3FF ; fully-qualified # 👈🏿 backhand index pointing left: dark skin tone
+1F449 ; fully-qualified # 👉 backhand index pointing right
+1F449 1F3FB ; fully-qualified # 👉🏻 backhand index pointing right: light skin tone
+1F449 1F3FC ; fully-qualified # 👉🏼 backhand index pointing right: medium-light skin tone
+1F449 1F3FD ; fully-qualified # 👉🏽 backhand index pointing right: medium skin tone
+1F449 1F3FE ; fully-qualified # 👉🏾 backhand index pointing right: medium-dark skin tone
+1F449 1F3FF ; fully-qualified # 👉🏿 backhand index pointing right: dark skin tone
+1F446 ; fully-qualified # 👆 backhand index pointing up
+1F446 1F3FB ; fully-qualified # 👆🏻 backhand index pointing up: light skin tone
+1F446 1F3FC ; fully-qualified # 👆🏼 backhand index pointing up: medium-light skin tone
+1F446 1F3FD ; fully-qualified # 👆🏽 backhand index pointing up: medium skin tone
+1F446 1F3FE ; fully-qualified # 👆🏾 backhand index pointing up: medium-dark skin tone
+1F446 1F3FF ; fully-qualified # 👆🏿 backhand index pointing up: dark skin tone
+1F595 ; fully-qualified # 🖕 middle finger
+1F595 1F3FB ; fully-qualified # 🖕🏻 middle finger: light skin tone
+1F595 1F3FC ; fully-qualified # 🖕🏼 middle finger: medium-light skin tone
+1F595 1F3FD ; fully-qualified # 🖕🏽 middle finger: medium skin tone
+1F595 1F3FE ; fully-qualified # 🖕🏾 middle finger: medium-dark skin tone
+1F595 1F3FF ; fully-qualified # 🖕🏿 middle finger: dark skin tone
+1F447 ; fully-qualified # 👇 backhand index pointing down
+1F447 1F3FB ; fully-qualified # 👇🏻 backhand index pointing down: light skin tone
+1F447 1F3FC ; fully-qualified # 👇🏼 backhand index pointing down: medium-light skin tone
+1F447 1F3FD ; fully-qualified # 👇🏽 backhand index pointing down: medium skin tone
+1F447 1F3FE ; fully-qualified # 👇🏾 backhand index pointing down: medium-dark skin tone
+1F447 1F3FF ; fully-qualified # 👇🏿 backhand index pointing down: dark skin tone
+261D FE0F ; fully-qualified # ☝️ index pointing up
+261D ; unqualified # ☝ index pointing up
+261D 1F3FB ; fully-qualified # ☝🏻 index pointing up: light skin tone
+261D 1F3FC ; fully-qualified # ☝🏼 index pointing up: medium-light skin tone
+261D 1F3FD ; fully-qualified # ☝🏽 index pointing up: medium skin tone
+261D 1F3FE ; fully-qualified # ☝🏾 index pointing up: medium-dark skin tone
+261D 1F3FF ; fully-qualified # ☝🏿 index pointing up: dark skin tone
+
+# subgroup: hand-fingers-closed
+1F44D ; fully-qualified # 👍 thumbs up
+1F44D 1F3FB ; fully-qualified # 👍🏻 thumbs up: light skin tone
+1F44D 1F3FC ; fully-qualified # 👍🏼 thumbs up: medium-light skin tone
+1F44D 1F3FD ; fully-qualified # 👍🏽 thumbs up: medium skin tone
+1F44D 1F3FE ; fully-qualified # 👍🏾 thumbs up: medium-dark skin tone
+1F44D 1F3FF ; fully-qualified # 👍🏿 thumbs up: dark skin tone
+1F44E ; fully-qualified # 👎 thumbs down
+1F44E 1F3FB ; fully-qualified # 👎🏻 thumbs down: light skin tone
+1F44E 1F3FC ; fully-qualified # 👎🏼 thumbs down: medium-light skin tone
+1F44E 1F3FD ; fully-qualified # 👎🏽 thumbs down: medium skin tone
+1F44E 1F3FE ; fully-qualified # 👎🏾 thumbs down: medium-dark skin tone
+1F44E 1F3FF ; fully-qualified # 👎🏿 thumbs down: dark skin tone
+270A ; fully-qualified # ✊ raised fist
+270A 1F3FB ; fully-qualified # ✊🏻 raised fist: light skin tone
+270A 1F3FC ; fully-qualified # ✊🏼 raised fist: medium-light skin tone
+270A 1F3FD ; fully-qualified # ✊🏽 raised fist: medium skin tone
+270A 1F3FE ; fully-qualified # ✊🏾 raised fist: medium-dark skin tone
+270A 1F3FF ; fully-qualified # ✊🏿 raised fist: dark skin tone
+1F44A ; fully-qualified # 👊 oncoming fist
+1F44A 1F3FB ; fully-qualified # 👊🏻 oncoming fist: light skin tone
+1F44A 1F3FC ; fully-qualified # 👊🏼 oncoming fist: medium-light skin tone
+1F44A 1F3FD ; fully-qualified # 👊🏽 oncoming fist: medium skin tone
+1F44A 1F3FE ; fully-qualified # 👊🏾 oncoming fist: medium-dark skin tone
+1F44A 1F3FF ; fully-qualified # 👊🏿 oncoming fist: dark skin tone
+1F91B ; fully-qualified # 🤛 left-facing fist
+1F91B 1F3FB ; fully-qualified # 🤛🏻 left-facing fist: light skin tone
+1F91B 1F3FC ; fully-qualified # 🤛🏼 left-facing fist: medium-light skin tone
+1F91B 1F3FD ; fully-qualified # 🤛🏽 left-facing fist: medium skin tone
+1F91B 1F3FE ; fully-qualified # 🤛🏾 left-facing fist: medium-dark skin tone
+1F91B 1F3FF ; fully-qualified # 🤛🏿 left-facing fist: dark skin tone
+1F91C ; fully-qualified # 🤜 right-facing fist
+1F91C 1F3FB ; fully-qualified # 🤜🏻 right-facing fist: light skin tone
+1F91C 1F3FC ; fully-qualified # 🤜🏼 right-facing fist: medium-light skin tone
+1F91C 1F3FD ; fully-qualified # 🤜🏽 right-facing fist: medium skin tone
+1F91C 1F3FE ; fully-qualified # 🤜🏾 right-facing fist: medium-dark skin tone
+1F91C 1F3FF ; fully-qualified # 🤜🏿 right-facing fist: dark skin tone
+
+# subgroup: hands
+1F44F ; fully-qualified # 👏 clapping hands
+1F44F 1F3FB ; fully-qualified # 👏🏻 clapping hands: light skin tone
+1F44F 1F3FC ; fully-qualified # 👏🏼 clapping hands: medium-light skin tone
+1F44F 1F3FD ; fully-qualified # 👏🏽 clapping hands: medium skin tone
+1F44F 1F3FE ; fully-qualified # 👏🏾 clapping hands: medium-dark skin tone
+1F44F 1F3FF ; fully-qualified # 👏🏿 clapping hands: dark skin tone
+1F64C ; fully-qualified # 🙌 raising hands
+1F64C 1F3FB ; fully-qualified # 🙌🏻 raising hands: light skin tone
+1F64C 1F3FC ; fully-qualified # 🙌🏼 raising hands: medium-light skin tone
+1F64C 1F3FD ; fully-qualified # 🙌🏽 raising hands: medium skin tone
+1F64C 1F3FE ; fully-qualified # 🙌🏾 raising hands: medium-dark skin tone
+1F64C 1F3FF ; fully-qualified # 🙌🏿 raising hands: dark skin tone
+1F450 ; fully-qualified # 👐 open hands
+1F450 1F3FB ; fully-qualified # 👐🏻 open hands: light skin tone
+1F450 1F3FC ; fully-qualified # 👐🏼 open hands: medium-light skin tone
+1F450 1F3FD ; fully-qualified # 👐🏽 open hands: medium skin tone
+1F450 1F3FE ; fully-qualified # 👐🏾 open hands: medium-dark skin tone
+1F450 1F3FF ; fully-qualified # 👐🏿 open hands: dark skin tone
+1F932 ; fully-qualified # 🤲 palms up together
+1F932 1F3FB ; fully-qualified # 🤲🏻 palms up together: light skin tone
+1F932 1F3FC ; fully-qualified # 🤲🏼 palms up together: medium-light skin tone
+1F932 1F3FD ; fully-qualified # 🤲🏽 palms up together: medium skin tone
+1F932 1F3FE ; fully-qualified # 🤲🏾 palms up together: medium-dark skin tone
+1F932 1F3FF ; fully-qualified # 🤲🏿 palms up together: dark skin tone
+1F91D ; fully-qualified # 🤝 handshake
+1F64F ; fully-qualified # 🙏 folded hands
+1F64F 1F3FB ; fully-qualified # 🙏🏻 folded hands: light skin tone
+1F64F 1F3FC ; fully-qualified # 🙏🏼 folded hands: medium-light skin tone
+1F64F 1F3FD ; fully-qualified # 🙏🏽 folded hands: medium skin tone
+1F64F 1F3FE ; fully-qualified # 🙏🏾 folded hands: medium-dark skin tone
+1F64F 1F3FF ; fully-qualified # 🙏🏿 folded hands: dark skin tone
+
+# subgroup: hand-prop
+270D FE0F ; fully-qualified # ✍️ writing hand
+270D ; unqualified # ✍ writing hand
+270D 1F3FB ; fully-qualified # ✍🏻 writing hand: light skin tone
+270D 1F3FC ; fully-qualified # ✍🏼 writing hand: medium-light skin tone
+270D 1F3FD ; fully-qualified # ✍🏽 writing hand: medium skin tone
+270D 1F3FE ; fully-qualified # ✍🏾 writing hand: medium-dark skin tone
+270D 1F3FF ; fully-qualified # ✍🏿 writing hand: dark skin tone
+1F485 ; fully-qualified # 💅 nail polish
+1F485 1F3FB ; fully-qualified # 💅🏻 nail polish: light skin tone
+1F485 1F3FC ; fully-qualified # 💅🏼 nail polish: medium-light skin tone
+1F485 1F3FD ; fully-qualified # 💅🏽 nail polish: medium skin tone
+1F485 1F3FE ; fully-qualified # 💅🏾 nail polish: medium-dark skin tone
+1F485 1F3FF ; fully-qualified # 💅🏿 nail polish: dark skin tone
+1F933 ; fully-qualified # 🤳 selfie
+1F933 1F3FB ; fully-qualified # 🤳🏻 selfie: light skin tone
+1F933 1F3FC ; fully-qualified # 🤳🏼 selfie: medium-light skin tone
+1F933 1F3FD ; fully-qualified # 🤳🏽 selfie: medium skin tone
+1F933 1F3FE ; fully-qualified # 🤳🏾 selfie: medium-dark skin tone
+1F933 1F3FF ; fully-qualified # 🤳🏿 selfie: dark skin tone
+
+# subgroup: body-parts
+1F4AA ; fully-qualified # 💪 flexed biceps
+1F4AA 1F3FB ; fully-qualified # 💪🏻 flexed biceps: light skin tone
+1F4AA 1F3FC ; fully-qualified # 💪🏼 flexed biceps: medium-light skin tone
+1F4AA 1F3FD ; fully-qualified # 💪🏽 flexed biceps: medium skin tone
+1F4AA 1F3FE ; fully-qualified # 💪🏾 flexed biceps: medium-dark skin tone
+1F4AA 1F3FF ; fully-qualified # 💪🏿 flexed biceps: dark skin tone
+1F9BE ; fully-qualified # 🦾 mechanical arm
+1F9BF ; fully-qualified # 🦿 mechanical leg
+1F9B5 ; fully-qualified # 🦵 leg
+1F9B5 1F3FB ; fully-qualified # 🦵🏻 leg: light skin tone
+1F9B5 1F3FC ; fully-qualified # 🦵🏼 leg: medium-light skin tone
+1F9B5 1F3FD ; fully-qualified # 🦵🏽 leg: medium skin tone
+1F9B5 1F3FE ; fully-qualified # 🦵🏾 leg: medium-dark skin tone
+1F9B5 1F3FF ; fully-qualified # 🦵🏿 leg: dark skin tone
+1F9B6 ; fully-qualified # 🦶 foot
+1F9B6 1F3FB ; fully-qualified # 🦶🏻 foot: light skin tone
+1F9B6 1F3FC ; fully-qualified # 🦶🏼 foot: medium-light skin tone
+1F9B6 1F3FD ; fully-qualified # 🦶🏽 foot: medium skin tone
+1F9B6 1F3FE ; fully-qualified # 🦶🏾 foot: medium-dark skin tone
+1F9B6 1F3FF ; fully-qualified # 🦶🏿 foot: dark skin tone
+1F442 ; fully-qualified # 👂 ear
+1F442 1F3FB ; fully-qualified # 👂🏻 ear: light skin tone
+1F442 1F3FC ; fully-qualified # 👂🏼 ear: medium-light skin tone
+1F442 1F3FD ; fully-qualified # 👂🏽 ear: medium skin tone
+1F442 1F3FE ; fully-qualified # 👂🏾 ear: medium-dark skin tone
+1F442 1F3FF ; fully-qualified # 👂🏿 ear: dark skin tone
+1F9BB ; fully-qualified # 🦻 ear with hearing aid
+1F9BB 1F3FB ; fully-qualified # 🦻🏻 ear with hearing aid: light skin tone
+1F9BB 1F3FC ; fully-qualified # 🦻🏼 ear with hearing aid: medium-light skin tone
+1F9BB 1F3FD ; fully-qualified # 🦻🏽 ear with hearing aid: medium skin tone
+1F9BB 1F3FE ; fully-qualified # 🦻🏾 ear with hearing aid: medium-dark skin tone
+1F9BB 1F3FF ; fully-qualified # 🦻🏿 ear with hearing aid: dark skin tone
+1F443 ; fully-qualified # 👃 nose
+1F443 1F3FB ; fully-qualified # 👃🏻 nose: light skin tone
+1F443 1F3FC ; fully-qualified # 👃🏼 nose: medium-light skin tone
+1F443 1F3FD ; fully-qualified # 👃🏽 nose: medium skin tone
+1F443 1F3FE ; fully-qualified # 👃🏾 nose: medium-dark skin tone
+1F443 1F3FF ; fully-qualified # 👃🏿 nose: dark skin tone
+1F9E0 ; fully-qualified # 🧠 brain
+1F9B7 ; fully-qualified # 🦷 tooth
+1F9B4 ; fully-qualified # 🦴 bone
+1F440 ; fully-qualified # 👀 eyes
+1F441 FE0F ; fully-qualified # 👁️ eye
+1F441 ; unqualified # 👁 eye
+1F445 ; fully-qualified # 👅 tongue
+1F444 ; fully-qualified # 👄 mouth
+
+# subgroup: person
+1F476 ; fully-qualified # 👶 baby
+1F476 1F3FB ; fully-qualified # 👶🏻 baby: light skin tone
+1F476 1F3FC ; fully-qualified # 👶🏼 baby: medium-light skin tone
+1F476 1F3FD ; fully-qualified # 👶🏽 baby: medium skin tone
+1F476 1F3FE ; fully-qualified # 👶🏾 baby: medium-dark skin tone
+1F476 1F3FF ; fully-qualified # 👶🏿 baby: dark skin tone
+1F9D2 ; fully-qualified # 🧒 child
+1F9D2 1F3FB ; fully-qualified # 🧒🏻 child: light skin tone
+1F9D2 1F3FC ; fully-qualified # 🧒🏼 child: medium-light skin tone
+1F9D2 1F3FD ; fully-qualified # 🧒🏽 child: medium skin tone
+1F9D2 1F3FE ; fully-qualified # 🧒🏾 child: medium-dark skin tone
+1F9D2 1F3FF ; fully-qualified # 🧒🏿 child: dark skin tone
+1F466 ; fully-qualified # 👦 boy
+1F466 1F3FB ; fully-qualified # 👦🏻 boy: light skin tone
+1F466 1F3FC ; fully-qualified # 👦🏼 boy: medium-light skin tone
+1F466 1F3FD ; fully-qualified # 👦🏽 boy: medium skin tone
+1F466 1F3FE ; fully-qualified # 👦🏾 boy: medium-dark skin tone
+1F466 1F3FF ; fully-qualified # 👦🏿 boy: dark skin tone
+1F467 ; fully-qualified # 👧 girl
+1F467 1F3FB ; fully-qualified # 👧🏻 girl: light skin tone
+1F467 1F3FC ; fully-qualified # 👧🏼 girl: medium-light skin tone
+1F467 1F3FD ; fully-qualified # 👧🏽 girl: medium skin tone
+1F467 1F3FE ; fully-qualified # 👧🏾 girl: medium-dark skin tone
+1F467 1F3FF ; fully-qualified # 👧🏿 girl: dark skin tone
+1F9D1 ; fully-qualified # 🧑 person
+1F9D1 1F3FB ; fully-qualified # 🧑🏻 person: light skin tone
+1F9D1 1F3FC ; fully-qualified # 🧑🏼 person: medium-light skin tone
+1F9D1 1F3FD ; fully-qualified # 🧑🏽 person: medium skin tone
+1F9D1 1F3FE ; fully-qualified # 🧑🏾 person: medium-dark skin tone
+1F9D1 1F3FF ; fully-qualified # 🧑🏿 person: dark skin tone
+1F471 ; fully-qualified # 👱 person: blond hair
+1F471 1F3FB ; fully-qualified # 👱🏻 person: light skin tone, blond hair
+1F471 1F3FC ; fully-qualified # 👱🏼 person: medium-light skin tone, blond hair
+1F471 1F3FD ; fully-qualified # 👱🏽 person: medium skin tone, blond hair
+1F471 1F3FE ; fully-qualified # 👱🏾 person: medium-dark skin tone, blond hair
+1F471 1F3FF ; fully-qualified # 👱🏿 person: dark skin tone, blond hair
+1F468 ; fully-qualified # 👨 man
+1F468 1F3FB ; fully-qualified # 👨🏻 man: light skin tone
+1F468 1F3FC ; fully-qualified # 👨🏼 man: medium-light skin tone
+1F468 1F3FD ; fully-qualified # 👨🏽 man: medium skin tone
+1F468 1F3FE ; fully-qualified # 👨🏾 man: medium-dark skin tone
+1F468 1F3FF ; fully-qualified # 👨🏿 man: dark skin tone
+1F9D4 ; fully-qualified # 🧔 man: beard
+1F9D4 1F3FB ; fully-qualified # 🧔🏻 man: light skin tone, beard
+1F9D4 1F3FC ; fully-qualified # 🧔🏼 man: medium-light skin tone, beard
+1F9D4 1F3FD ; fully-qualified # 🧔🏽 man: medium skin tone, beard
+1F9D4 1F3FE ; fully-qualified # 🧔🏾 man: medium-dark skin tone, beard
+1F9D4 1F3FF ; fully-qualified # 🧔🏿 man: dark skin tone, beard
+1F471 200D 2642 FE0F ; fully-qualified # 👱♂️ man: blond hair
+1F471 200D 2642 ; minimally-qualified # 👱♂ man: blond hair
+1F471 1F3FB 200D 2642 FE0F ; fully-qualified # 👱🏻♂️ man: light skin tone, blond hair
+1F471 1F3FB 200D 2642 ; minimally-qualified # 👱🏻♂ man: light skin tone, blond hair
+1F471 1F3FC 200D 2642 FE0F ; fully-qualified # 👱🏼♂️ man: medium-light skin tone, blond hair
+1F471 1F3FC 200D 2642 ; minimally-qualified # 👱🏼♂ man: medium-light skin tone, blond hair
+1F471 1F3FD 200D 2642 FE0F ; fully-qualified # 👱🏽♂️ man: medium skin tone, blond hair
+1F471 1F3FD 200D 2642 ; minimally-qualified # 👱🏽♂ man: medium skin tone, blond hair
+1F471 1F3FE 200D 2642 FE0F ; fully-qualified # 👱🏾♂️ man: medium-dark skin tone, blond hair
+1F471 1F3FE 200D 2642 ; minimally-qualified # 👱🏾♂ man: medium-dark skin tone, blond hair
+1F471 1F3FF 200D 2642 FE0F ; fully-qualified # 👱🏿♂️ man: dark skin tone, blond hair
+1F471 1F3FF 200D 2642 ; minimally-qualified # 👱🏿♂ man: dark skin tone, blond hair
+1F468 200D 1F9B0 ; fully-qualified # 👨🦰 man: red hair
+1F468 1F3FB 200D 1F9B0 ; fully-qualified # 👨🏻🦰 man: light skin tone, red hair
+1F468 1F3FC 200D 1F9B0 ; fully-qualified # 👨🏼🦰 man: medium-light skin tone, red hair
+1F468 1F3FD 200D 1F9B0 ; fully-qualified # 👨🏽🦰 man: medium skin tone, red hair
+1F468 1F3FE 200D 1F9B0 ; fully-qualified # 👨🏾🦰 man: medium-dark skin tone, red hair
+1F468 1F3FF 200D 1F9B0 ; fully-qualified # 👨🏿🦰 man: dark skin tone, red hair
+1F468 200D 1F9B1 ; fully-qualified # 👨🦱 man: curly hair
+1F468 1F3FB 200D 1F9B1 ; fully-qualified # 👨🏻🦱 man: light skin tone, curly hair
+1F468 1F3FC 200D 1F9B1 ; fully-qualified # 👨🏼🦱 man: medium-light skin tone, curly hair
+1F468 1F3FD 200D 1F9B1 ; fully-qualified # 👨🏽🦱 man: medium skin tone, curly hair
+1F468 1F3FE 200D 1F9B1 ; fully-qualified # 👨🏾🦱 man: medium-dark skin tone, curly hair
+1F468 1F3FF 200D 1F9B1 ; fully-qualified # 👨🏿🦱 man: dark skin tone, curly hair
+1F468 200D 1F9B3 ; fully-qualified # 👨🦳 man: white hair
+1F468 1F3FB 200D 1F9B3 ; fully-qualified # 👨🏻🦳 man: light skin tone, white hair
+1F468 1F3FC 200D 1F9B3 ; fully-qualified # 👨🏼🦳 man: medium-light skin tone, white hair
+1F468 1F3FD 200D 1F9B3 ; fully-qualified # 👨🏽🦳 man: medium skin tone, white hair
+1F468 1F3FE 200D 1F9B3 ; fully-qualified # 👨🏾🦳 man: medium-dark skin tone, white hair
+1F468 1F3FF 200D 1F9B3 ; fully-qualified # 👨🏿🦳 man: dark skin tone, white hair
+1F468 200D 1F9B2 ; fully-qualified # 👨🦲 man: bald
+1F468 1F3FB 200D 1F9B2 ; fully-qualified # 👨🏻🦲 man: light skin tone, bald
+1F468 1F3FC 200D 1F9B2 ; fully-qualified # 👨🏼🦲 man: medium-light skin tone, bald
+1F468 1F3FD 200D 1F9B2 ; fully-qualified # 👨🏽🦲 man: medium skin tone, bald
+1F468 1F3FE 200D 1F9B2 ; fully-qualified # 👨🏾🦲 man: medium-dark skin tone, bald
+1F468 1F3FF 200D 1F9B2 ; fully-qualified # 👨🏿🦲 man: dark skin tone, bald
+1F469 ; fully-qualified # 👩 woman
+1F469 1F3FB ; fully-qualified # 👩🏻 woman: light skin tone
+1F469 1F3FC ; fully-qualified # 👩🏼 woman: medium-light skin tone
+1F469 1F3FD ; fully-qualified # 👩🏽 woman: medium skin tone
+1F469 1F3FE ; fully-qualified # 👩🏾 woman: medium-dark skin tone
+1F469 1F3FF ; fully-qualified # 👩🏿 woman: dark skin tone
+1F471 200D 2640 FE0F ; fully-qualified # 👱♀️ woman: blond hair
+1F471 200D 2640 ; minimally-qualified # 👱♀ woman: blond hair
+1F471 1F3FB 200D 2640 FE0F ; fully-qualified # 👱🏻♀️ woman: light skin tone, blond hair
+1F471 1F3FB 200D 2640 ; minimally-qualified # 👱🏻♀ woman: light skin tone, blond hair
+1F471 1F3FC 200D 2640 FE0F ; fully-qualified # 👱🏼♀️ woman: medium-light skin tone, blond hair
+1F471 1F3FC 200D 2640 ; minimally-qualified # 👱🏼♀ woman: medium-light skin tone, blond hair
+1F471 1F3FD 200D 2640 FE0F ; fully-qualified # 👱🏽♀️ woman: medium skin tone, blond hair
+1F471 1F3FD 200D 2640 ; minimally-qualified # 👱🏽♀ woman: medium skin tone, blond hair
+1F471 1F3FE 200D 2640 FE0F ; fully-qualified # 👱🏾♀️ woman: medium-dark skin tone, blond hair
+1F471 1F3FE 200D 2640 ; minimally-qualified # 👱🏾♀ woman: medium-dark skin tone, blond hair
+1F471 1F3FF 200D 2640 FE0F ; fully-qualified # 👱🏿♀️ woman: dark skin tone, blond hair
+1F471 1F3FF 200D 2640 ; minimally-qualified # 👱🏿♀ woman: dark skin tone, blond hair
+1F469 200D 1F9B0 ; fully-qualified # 👩🦰 woman: red hair
+1F469 1F3FB 200D 1F9B0 ; fully-qualified # 👩🏻🦰 woman: light skin tone, red hair
+1F469 1F3FC 200D 1F9B0 ; fully-qualified # 👩🏼🦰 woman: medium-light skin tone, red hair
+1F469 1F3FD 200D 1F9B0 ; fully-qualified # 👩🏽🦰 woman: medium skin tone, red hair
+1F469 1F3FE 200D 1F9B0 ; fully-qualified # 👩🏾🦰 woman: medium-dark skin tone, red hair
+1F469 1F3FF 200D 1F9B0 ; fully-qualified # 👩🏿🦰 woman: dark skin tone, red hair
+1F469 200D 1F9B1 ; fully-qualified # 👩🦱 woman: curly hair
+1F469 1F3FB 200D 1F9B1 ; fully-qualified # 👩🏻🦱 woman: light skin tone, curly hair
+1F469 1F3FC 200D 1F9B1 ; fully-qualified # 👩🏼🦱 woman: medium-light skin tone, curly hair
+1F469 1F3FD 200D 1F9B1 ; fully-qualified # 👩🏽🦱 woman: medium skin tone, curly hair
+1F469 1F3FE 200D 1F9B1 ; fully-qualified # 👩🏾🦱 woman: medium-dark skin tone, curly hair
+1F469 1F3FF 200D 1F9B1 ; fully-qualified # 👩🏿🦱 woman: dark skin tone, curly hair
+1F469 200D 1F9B3 ; fully-qualified # 👩🦳 woman: white hair
+1F469 1F3FB 200D 1F9B3 ; fully-qualified # 👩🏻🦳 woman: light skin tone, white hair
+1F469 1F3FC 200D 1F9B3 ; fully-qualified # 👩🏼🦳 woman: medium-light skin tone, white hair
+1F469 1F3FD 200D 1F9B3 ; fully-qualified # 👩🏽🦳 woman: medium skin tone, white hair
+1F469 1F3FE 200D 1F9B3 ; fully-qualified # 👩🏾🦳 woman: medium-dark skin tone, white hair
+1F469 1F3FF 200D 1F9B3 ; fully-qualified # 👩🏿🦳 woman: dark skin tone, white hair
+1F469 200D 1F9B2 ; fully-qualified # 👩🦲 woman: bald
+1F469 1F3FB 200D 1F9B2 ; fully-qualified # 👩🏻🦲 woman: light skin tone, bald
+1F469 1F3FC 200D 1F9B2 ; fully-qualified # 👩🏼🦲 woman: medium-light skin tone, bald
+1F469 1F3FD 200D 1F9B2 ; fully-qualified # 👩🏽🦲 woman: medium skin tone, bald
+1F469 1F3FE 200D 1F9B2 ; fully-qualified # 👩🏾🦲 woman: medium-dark skin tone, bald
+1F469 1F3FF 200D 1F9B2 ; fully-qualified # 👩🏿🦲 woman: dark skin tone, bald
+1F9D3 ; fully-qualified # 🧓 older person
+1F9D3 1F3FB ; fully-qualified # 🧓🏻 older person: light skin tone
+1F9D3 1F3FC ; fully-qualified # 🧓🏼 older person: medium-light skin tone
+1F9D3 1F3FD ; fully-qualified # 🧓🏽 older person: medium skin tone
+1F9D3 1F3FE ; fully-qualified # 🧓🏾 older person: medium-dark skin tone
+1F9D3 1F3FF ; fully-qualified # 🧓🏿 older person: dark skin tone
+1F474 ; fully-qualified # 👴 old man
+1F474 1F3FB ; fully-qualified # 👴🏻 old man: light skin tone
+1F474 1F3FC ; fully-qualified # 👴🏼 old man: medium-light skin tone
+1F474 1F3FD ; fully-qualified # 👴🏽 old man: medium skin tone
+1F474 1F3FE ; fully-qualified # 👴🏾 old man: medium-dark skin tone
+1F474 1F3FF ; fully-qualified # 👴🏿 old man: dark skin tone
+1F475 ; fully-qualified # 👵 old woman
+1F475 1F3FB ; fully-qualified # 👵🏻 old woman: light skin tone
+1F475 1F3FC ; fully-qualified # 👵🏼 old woman: medium-light skin tone
+1F475 1F3FD ; fully-qualified # 👵🏽 old woman: medium skin tone
+1F475 1F3FE ; fully-qualified # 👵🏾 old woman: medium-dark skin tone
+1F475 1F3FF ; fully-qualified # 👵🏿 old woman: dark skin tone
+
+# subgroup: person-gesture
+1F64D ; fully-qualified # 🙍 person frowning
+1F64D 1F3FB ; fully-qualified # 🙍🏻 person frowning: light skin tone
+1F64D 1F3FC ; fully-qualified # 🙍🏼 person frowning: medium-light skin tone
+1F64D 1F3FD ; fully-qualified # 🙍🏽 person frowning: medium skin tone
+1F64D 1F3FE ; fully-qualified # 🙍🏾 person frowning: medium-dark skin tone
+1F64D 1F3FF ; fully-qualified # 🙍🏿 person frowning: dark skin tone
+1F64D 200D 2642 FE0F ; fully-qualified # 🙍♂️ man frowning
+1F64D 200D 2642 ; minimally-qualified # 🙍♂ man frowning
+1F64D 1F3FB 200D 2642 FE0F ; fully-qualified # 🙍🏻♂️ man frowning: light skin tone
+1F64D 1F3FB 200D 2642 ; minimally-qualified # 🙍🏻♂ man frowning: light skin tone
+1F64D 1F3FC 200D 2642 FE0F ; fully-qualified # 🙍🏼♂️ man frowning: medium-light skin tone
+1F64D 1F3FC 200D 2642 ; minimally-qualified # 🙍🏼♂ man frowning: medium-light skin tone
+1F64D 1F3FD 200D 2642 FE0F ; fully-qualified # 🙍🏽♂️ man frowning: medium skin tone
+1F64D 1F3FD 200D 2642 ; minimally-qualified # 🙍🏽♂ man frowning: medium skin tone
+1F64D 1F3FE 200D 2642 FE0F ; fully-qualified # 🙍🏾♂️ man frowning: medium-dark skin tone
+1F64D 1F3FE 200D 2642 ; minimally-qualified # 🙍🏾♂ man frowning: medium-dark skin tone
+1F64D 1F3FF 200D 2642 FE0F ; fully-qualified # 🙍🏿♂️ man frowning: dark skin tone
+1F64D 1F3FF 200D 2642 ; minimally-qualified # 🙍🏿♂ man frowning: dark skin tone
+1F64D 200D 2640 FE0F ; fully-qualified # 🙍♀️ woman frowning
+1F64D 200D 2640 ; minimally-qualified # 🙍♀ woman frowning
+1F64D 1F3FB 200D 2640 FE0F ; fully-qualified # 🙍🏻♀️ woman frowning: light skin tone
+1F64D 1F3FB 200D 2640 ; minimally-qualified # 🙍🏻♀ woman frowning: light skin tone
+1F64D 1F3FC 200D 2640 FE0F ; fully-qualified # 🙍🏼♀️ woman frowning: medium-light skin tone
+1F64D 1F3FC 200D 2640 ; minimally-qualified # 🙍🏼♀ woman frowning: medium-light skin tone
+1F64D 1F3FD 200D 2640 FE0F ; fully-qualified # 🙍🏽♀️ woman frowning: medium skin tone
+1F64D 1F3FD 200D 2640 ; minimally-qualified # 🙍🏽♀ woman frowning: medium skin tone
+1F64D 1F3FE 200D 2640 FE0F ; fully-qualified # 🙍🏾♀️ woman frowning: medium-dark skin tone
+1F64D 1F3FE 200D 2640 ; minimally-qualified # 🙍🏾♀ woman frowning: medium-dark skin tone
+1F64D 1F3FF 200D 2640 FE0F ; fully-qualified # 🙍🏿♀️ woman frowning: dark skin tone
+1F64D 1F3FF 200D 2640 ; minimally-qualified # 🙍🏿♀ woman frowning: dark skin tone
+1F64E ; fully-qualified # 🙎 person pouting
+1F64E 1F3FB ; fully-qualified # 🙎🏻 person pouting: light skin tone
+1F64E 1F3FC ; fully-qualified # 🙎🏼 person pouting: medium-light skin tone
+1F64E 1F3FD ; fully-qualified # 🙎🏽 person pouting: medium skin tone
+1F64E 1F3FE ; fully-qualified # 🙎🏾 person pouting: medium-dark skin tone
+1F64E 1F3FF ; fully-qualified # 🙎🏿 person pouting: dark skin tone
+1F64E 200D 2642 FE0F ; fully-qualified # 🙎♂️ man pouting
+1F64E 200D 2642 ; minimally-qualified # 🙎♂ man pouting
+1F64E 1F3FB 200D 2642 FE0F ; fully-qualified # 🙎🏻♂️ man pouting: light skin tone
+1F64E 1F3FB 200D 2642 ; minimally-qualified # 🙎🏻♂ man pouting: light skin tone
+1F64E 1F3FC 200D 2642 FE0F ; fully-qualified # 🙎🏼♂️ man pouting: medium-light skin tone
+1F64E 1F3FC 200D 2642 ; minimally-qualified # 🙎🏼♂ man pouting: medium-light skin tone
+1F64E 1F3FD 200D 2642 FE0F ; fully-qualified # 🙎🏽♂️ man pouting: medium skin tone
+1F64E 1F3FD 200D 2642 ; minimally-qualified # 🙎🏽♂ man pouting: medium skin tone
+1F64E 1F3FE 200D 2642 FE0F ; fully-qualified # 🙎🏾♂️ man pouting: medium-dark skin tone
+1F64E 1F3FE 200D 2642 ; minimally-qualified # 🙎🏾♂ man pouting: medium-dark skin tone
+1F64E 1F3FF 200D 2642 FE0F ; fully-qualified # 🙎🏿♂️ man pouting: dark skin tone
+1F64E 1F3FF 200D 2642 ; minimally-qualified # 🙎🏿♂ man pouting: dark skin tone
+1F64E 200D 2640 FE0F ; fully-qualified # 🙎♀️ woman pouting
+1F64E 200D 2640 ; minimally-qualified # 🙎♀ woman pouting
+1F64E 1F3FB 200D 2640 FE0F ; fully-qualified # 🙎🏻♀️ woman pouting: light skin tone
+1F64E 1F3FB 200D 2640 ; minimally-qualified # 🙎🏻♀ woman pouting: light skin tone
+1F64E 1F3FC 200D 2640 FE0F ; fully-qualified # 🙎🏼♀️ woman pouting: medium-light skin tone
+1F64E 1F3FC 200D 2640 ; minimally-qualified # 🙎🏼♀ woman pouting: medium-light skin tone
+1F64E 1F3FD 200D 2640 FE0F ; fully-qualified # 🙎🏽♀️ woman pouting: medium skin tone
+1F64E 1F3FD 200D 2640 ; minimally-qualified # 🙎🏽♀ woman pouting: medium skin tone
+1F64E 1F3FE 200D 2640 FE0F ; fully-qualified # 🙎🏾♀️ woman pouting: medium-dark skin tone
+1F64E 1F3FE 200D 2640 ; minimally-qualified # 🙎🏾♀ woman pouting: medium-dark skin tone
+1F64E 1F3FF 200D 2640 FE0F ; fully-qualified # 🙎🏿♀️ woman pouting: dark skin tone
+1F64E 1F3FF 200D 2640 ; minimally-qualified # 🙎🏿♀ woman pouting: dark skin tone
+1F645 ; fully-qualified # 🙅 person gesturing NO
+1F645 1F3FB ; fully-qualified # 🙅🏻 person gesturing NO: light skin tone
+1F645 1F3FC ; fully-qualified # 🙅🏼 person gesturing NO: medium-light skin tone
+1F645 1F3FD ; fully-qualified # 🙅🏽 person gesturing NO: medium skin tone
+1F645 1F3FE ; fully-qualified # 🙅🏾 person gesturing NO: medium-dark skin tone
+1F645 1F3FF ; fully-qualified # 🙅🏿 person gesturing NO: dark skin tone
+1F645 200D 2642 FE0F ; fully-qualified # 🙅♂️ man gesturing NO
+1F645 200D 2642 ; minimally-qualified # 🙅♂ man gesturing NO
+1F645 1F3FB 200D 2642 FE0F ; fully-qualified # 🙅🏻♂️ man gesturing NO: light skin tone
+1F645 1F3FB 200D 2642 ; minimally-qualified # 🙅🏻♂ man gesturing NO: light skin tone
+1F645 1F3FC 200D 2642 FE0F ; fully-qualified # 🙅🏼♂️ man gesturing NO: medium-light skin tone
+1F645 1F3FC 200D 2642 ; minimally-qualified # 🙅🏼♂ man gesturing NO: medium-light skin tone
+1F645 1F3FD 200D 2642 FE0F ; fully-qualified # 🙅🏽♂️ man gesturing NO: medium skin tone
+1F645 1F3FD 200D 2642 ; minimally-qualified # 🙅🏽♂ man gesturing NO: medium skin tone
+1F645 1F3FE 200D 2642 FE0F ; fully-qualified # 🙅🏾♂️ man gesturing NO: medium-dark skin tone
+1F645 1F3FE 200D 2642 ; minimally-qualified # 🙅🏾♂ man gesturing NO: medium-dark skin tone
+1F645 1F3FF 200D 2642 FE0F ; fully-qualified # 🙅🏿♂️ man gesturing NO: dark skin tone
+1F645 1F3FF 200D 2642 ; minimally-qualified # 🙅🏿♂ man gesturing NO: dark skin tone
+1F645 200D 2640 FE0F ; fully-qualified # 🙅♀️ woman gesturing NO
+1F645 200D 2640 ; minimally-qualified # 🙅♀ woman gesturing NO
+1F645 1F3FB 200D 2640 FE0F ; fully-qualified # 🙅🏻♀️ woman gesturing NO: light skin tone
+1F645 1F3FB 200D 2640 ; minimally-qualified # 🙅🏻♀ woman gesturing NO: light skin tone
+1F645 1F3FC 200D 2640 FE0F ; fully-qualified # 🙅🏼♀️ woman gesturing NO: medium-light skin tone
+1F645 1F3FC 200D 2640 ; minimally-qualified # 🙅🏼♀ woman gesturing NO: medium-light skin tone
+1F645 1F3FD 200D 2640 FE0F ; fully-qualified # 🙅🏽♀️ woman gesturing NO: medium skin tone
+1F645 1F3FD 200D 2640 ; minimally-qualified # 🙅🏽♀ woman gesturing NO: medium skin tone
+1F645 1F3FE 200D 2640 FE0F ; fully-qualified # 🙅🏾♀️ woman gesturing NO: medium-dark skin tone
+1F645 1F3FE 200D 2640 ; minimally-qualified # 🙅🏾♀ woman gesturing NO: medium-dark skin tone
+1F645 1F3FF 200D 2640 FE0F ; fully-qualified # 🙅🏿♀️ woman gesturing NO: dark skin tone
+1F645 1F3FF 200D 2640 ; minimally-qualified # 🙅🏿♀ woman gesturing NO: dark skin tone
+1F646 ; fully-qualified # 🙆 person gesturing OK
+1F646 1F3FB ; fully-qualified # 🙆🏻 person gesturing OK: light skin tone
+1F646 1F3FC ; fully-qualified # 🙆🏼 person gesturing OK: medium-light skin tone
+1F646 1F3FD ; fully-qualified # 🙆🏽 person gesturing OK: medium skin tone
+1F646 1F3FE ; fully-qualified # 🙆🏾 person gesturing OK: medium-dark skin tone
+1F646 1F3FF ; fully-qualified # 🙆🏿 person gesturing OK: dark skin tone
+1F646 200D 2642 FE0F ; fully-qualified # 🙆♂️ man gesturing OK
+1F646 200D 2642 ; minimally-qualified # 🙆♂ man gesturing OK
+1F646 1F3FB 200D 2642 FE0F ; fully-qualified # 🙆🏻♂️ man gesturing OK: light skin tone
+1F646 1F3FB 200D 2642 ; minimally-qualified # 🙆🏻♂ man gesturing OK: light skin tone
+1F646 1F3FC 200D 2642 FE0F ; fully-qualified # 🙆🏼♂️ man gesturing OK: medium-light skin tone
+1F646 1F3FC 200D 2642 ; minimally-qualified # 🙆🏼♂ man gesturing OK: medium-light skin tone
+1F646 1F3FD 200D 2642 FE0F ; fully-qualified # 🙆🏽♂️ man gesturing OK: medium skin tone
+1F646 1F3FD 200D 2642 ; minimally-qualified # 🙆🏽♂ man gesturing OK: medium skin tone
+1F646 1F3FE 200D 2642 FE0F ; fully-qualified # 🙆🏾♂️ man gesturing OK: medium-dark skin tone
+1F646 1F3FE 200D 2642 ; minimally-qualified # 🙆🏾♂ man gesturing OK: medium-dark skin tone
+1F646 1F3FF 200D 2642 FE0F ; fully-qualified # 🙆🏿♂️ man gesturing OK: dark skin tone
+1F646 1F3FF 200D 2642 ; minimally-qualified # 🙆🏿♂ man gesturing OK: dark skin tone
+1F646 200D 2640 FE0F ; fully-qualified # 🙆♀️ woman gesturing OK
+1F646 200D 2640 ; minimally-qualified # 🙆♀ woman gesturing OK
+1F646 1F3FB 200D 2640 FE0F ; fully-qualified # 🙆🏻♀️ woman gesturing OK: light skin tone
+1F646 1F3FB 200D 2640 ; minimally-qualified # 🙆🏻♀ woman gesturing OK: light skin tone
+1F646 1F3FC 200D 2640 FE0F ; fully-qualified # 🙆🏼♀️ woman gesturing OK: medium-light skin tone
+1F646 1F3FC 200D 2640 ; minimally-qualified # 🙆🏼♀ woman gesturing OK: medium-light skin tone
+1F646 1F3FD 200D 2640 FE0F ; fully-qualified # 🙆🏽♀️ woman gesturing OK: medium skin tone
+1F646 1F3FD 200D 2640 ; minimally-qualified # 🙆🏽♀ woman gesturing OK: medium skin tone
+1F646 1F3FE 200D 2640 FE0F ; fully-qualified # 🙆🏾♀️ woman gesturing OK: medium-dark skin tone
+1F646 1F3FE 200D 2640 ; minimally-qualified # 🙆🏾♀ woman gesturing OK: medium-dark skin tone
+1F646 1F3FF 200D 2640 FE0F ; fully-qualified # 🙆🏿♀️ woman gesturing OK: dark skin tone
+1F646 1F3FF 200D 2640 ; minimally-qualified # 🙆🏿♀ woman gesturing OK: dark skin tone
+1F481 ; fully-qualified # 💁 person tipping hand
+1F481 1F3FB ; fully-qualified # 💁🏻 person tipping hand: light skin tone
+1F481 1F3FC ; fully-qualified # 💁🏼 person tipping hand: medium-light skin tone
+1F481 1F3FD ; fully-qualified # 💁🏽 person tipping hand: medium skin tone
+1F481 1F3FE ; fully-qualified # 💁🏾 person tipping hand: medium-dark skin tone
+1F481 1F3FF ; fully-qualified # 💁🏿 person tipping hand: dark skin tone
+1F481 200D 2642 FE0F ; fully-qualified # 💁♂️ man tipping hand
+1F481 200D 2642 ; minimally-qualified # 💁♂ man tipping hand
+1F481 1F3FB 200D 2642 FE0F ; fully-qualified # 💁🏻♂️ man tipping hand: light skin tone
+1F481 1F3FB 200D 2642 ; minimally-qualified # 💁🏻♂ man tipping hand: light skin tone
+1F481 1F3FC 200D 2642 FE0F ; fully-qualified # 💁🏼♂️ man tipping hand: medium-light skin tone
+1F481 1F3FC 200D 2642 ; minimally-qualified # 💁🏼♂ man tipping hand: medium-light skin tone
+1F481 1F3FD 200D 2642 FE0F ; fully-qualified # 💁🏽♂️ man tipping hand: medium skin tone
+1F481 1F3FD 200D 2642 ; minimally-qualified # 💁🏽♂ man tipping hand: medium skin tone
+1F481 1F3FE 200D 2642 FE0F ; fully-qualified # 💁🏾♂️ man tipping hand: medium-dark skin tone
+1F481 1F3FE 200D 2642 ; minimally-qualified # 💁🏾♂ man tipping hand: medium-dark skin tone
+1F481 1F3FF 200D 2642 FE0F ; fully-qualified # 💁🏿♂️ man tipping hand: dark skin tone
+1F481 1F3FF 200D 2642 ; minimally-qualified # 💁🏿♂ man tipping hand: dark skin tone
+1F481 200D 2640 FE0F ; fully-qualified # 💁♀️ woman tipping hand
+1F481 200D 2640 ; minimally-qualified # 💁♀ woman tipping hand
+1F481 1F3FB 200D 2640 FE0F ; fully-qualified # 💁🏻♀️ woman tipping hand: light skin tone
+1F481 1F3FB 200D 2640 ; minimally-qualified # 💁🏻♀ woman tipping hand: light skin tone
+1F481 1F3FC 200D 2640 FE0F ; fully-qualified # 💁🏼♀️ woman tipping hand: medium-light skin tone
+1F481 1F3FC 200D 2640 ; minimally-qualified # 💁🏼♀ woman tipping hand: medium-light skin tone
+1F481 1F3FD 200D 2640 FE0F ; fully-qualified # 💁🏽♀️ woman tipping hand: medium skin tone
+1F481 1F3FD 200D 2640 ; minimally-qualified # 💁🏽♀ woman tipping hand: medium skin tone
+1F481 1F3FE 200D 2640 FE0F ; fully-qualified # 💁🏾♀️ woman tipping hand: medium-dark skin tone
+1F481 1F3FE 200D 2640 ; minimally-qualified # 💁🏾♀ woman tipping hand: medium-dark skin tone
+1F481 1F3FF 200D 2640 FE0F ; fully-qualified # 💁🏿♀️ woman tipping hand: dark skin tone
+1F481 1F3FF 200D 2640 ; minimally-qualified # 💁🏿♀ woman tipping hand: dark skin tone
+1F64B ; fully-qualified # 🙋 person raising hand
+1F64B 1F3FB ; fully-qualified # 🙋🏻 person raising hand: light skin tone
+1F64B 1F3FC ; fully-qualified # 🙋🏼 person raising hand: medium-light skin tone
+1F64B 1F3FD ; fully-qualified # 🙋🏽 person raising hand: medium skin tone
+1F64B 1F3FE ; fully-qualified # 🙋🏾 person raising hand: medium-dark skin tone
+1F64B 1F3FF ; fully-qualified # 🙋🏿 person raising hand: dark skin tone
+1F64B 200D 2642 FE0F ; fully-qualified # 🙋♂️ man raising hand
+1F64B 200D 2642 ; minimally-qualified # 🙋♂ man raising hand
+1F64B 1F3FB 200D 2642 FE0F ; fully-qualified # 🙋🏻♂️ man raising hand: light skin tone
+1F64B 1F3FB 200D 2642 ; minimally-qualified # 🙋🏻♂ man raising hand: light skin tone
+1F64B 1F3FC 200D 2642 FE0F ; fully-qualified # 🙋🏼♂️ man raising hand: medium-light skin tone
+1F64B 1F3FC 200D 2642 ; minimally-qualified # 🙋🏼♂ man raising hand: medium-light skin tone
+1F64B 1F3FD 200D 2642 FE0F ; fully-qualified # 🙋🏽♂️ man raising hand: medium skin tone
+1F64B 1F3FD 200D 2642 ; minimally-qualified # 🙋🏽♂ man raising hand: medium skin tone
+1F64B 1F3FE 200D 2642 FE0F ; fully-qualified # 🙋🏾♂️ man raising hand: medium-dark skin tone
+1F64B 1F3FE 200D 2642 ; minimally-qualified # 🙋🏾♂ man raising hand: medium-dark skin tone
+1F64B 1F3FF 200D 2642 FE0F ; fully-qualified # 🙋🏿♂️ man raising hand: dark skin tone
+1F64B 1F3FF 200D 2642 ; minimally-qualified # 🙋🏿♂ man raising hand: dark skin tone
+1F64B 200D 2640 FE0F ; fully-qualified # 🙋♀️ woman raising hand
+1F64B 200D 2640 ; minimally-qualified # 🙋♀ woman raising hand
+1F64B 1F3FB 200D 2640 FE0F ; fully-qualified # 🙋🏻♀️ woman raising hand: light skin tone
+1F64B 1F3FB 200D 2640 ; minimally-qualified # 🙋🏻♀ woman raising hand: light skin tone
+1F64B 1F3FC 200D 2640 FE0F ; fully-qualified # 🙋🏼♀️ woman raising hand: medium-light skin tone
+1F64B 1F3FC 200D 2640 ; minimally-qualified # 🙋🏼♀ woman raising hand: medium-light skin tone
+1F64B 1F3FD 200D 2640 FE0F ; fully-qualified # 🙋🏽♀️ woman raising hand: medium skin tone
+1F64B 1F3FD 200D 2640 ; minimally-qualified # 🙋🏽♀ woman raising hand: medium skin tone
+1F64B 1F3FE 200D 2640 FE0F ; fully-qualified # 🙋🏾♀️ woman raising hand: medium-dark skin tone
+1F64B 1F3FE 200D 2640 ; minimally-qualified # 🙋🏾♀ woman raising hand: medium-dark skin tone
+1F64B 1F3FF 200D 2640 FE0F ; fully-qualified # 🙋🏿♀️ woman raising hand: dark skin tone
+1F64B 1F3FF 200D 2640 ; minimally-qualified # 🙋🏿♀ woman raising hand: dark skin tone
+1F9CF ; fully-qualified # 🧏 deaf person
+1F9CF 1F3FB ; fully-qualified # 🧏🏻 deaf person: light skin tone
+1F9CF 1F3FC ; fully-qualified # 🧏🏼 deaf person: medium-light skin tone
+1F9CF 1F3FD ; fully-qualified # 🧏🏽 deaf person: medium skin tone
+1F9CF 1F3FE ; fully-qualified # 🧏🏾 deaf person: medium-dark skin tone
+1F9CF 1F3FF ; fully-qualified # 🧏🏿 deaf person: dark skin tone
+1F9CF 200D 2642 FE0F ; fully-qualified # 🧏♂️ deaf man
+1F9CF 200D 2642 ; minimally-qualified # 🧏♂ deaf man
+1F9CF 1F3FB 200D 2642 FE0F ; fully-qualified # 🧏🏻♂️ deaf man: light skin tone
+1F9CF 1F3FB 200D 2642 ; minimally-qualified # 🧏🏻♂ deaf man: light skin tone
+1F9CF 1F3FC 200D 2642 FE0F ; fully-qualified # 🧏🏼♂️ deaf man: medium-light skin tone
+1F9CF 1F3FC 200D 2642 ; minimally-qualified # 🧏🏼♂ deaf man: medium-light skin tone
+1F9CF 1F3FD 200D 2642 FE0F ; fully-qualified # 🧏🏽♂️ deaf man: medium skin tone
+1F9CF 1F3FD 200D 2642 ; minimally-qualified # 🧏🏽♂ deaf man: medium skin tone
+1F9CF 1F3FE 200D 2642 FE0F ; fully-qualified # 🧏🏾♂️ deaf man: medium-dark skin tone
+1F9CF 1F3FE 200D 2642 ; minimally-qualified # 🧏🏾♂ deaf man: medium-dark skin tone
+1F9CF 1F3FF 200D 2642 FE0F ; fully-qualified # 🧏🏿♂️ deaf man: dark skin tone
+1F9CF 1F3FF 200D 2642 ; minimally-qualified # 🧏🏿♂ deaf man: dark skin tone
+1F9CF 200D 2640 FE0F ; fully-qualified # 🧏♀️ deaf woman
+1F9CF 200D 2640 ; minimally-qualified # 🧏♀ deaf woman
+1F9CF 1F3FB 200D 2640 FE0F ; fully-qualified # 🧏🏻♀️ deaf woman: light skin tone
+1F9CF 1F3FB 200D 2640 ; minimally-qualified # 🧏🏻♀ deaf woman: light skin tone
+1F9CF 1F3FC 200D 2640 FE0F ; fully-qualified # 🧏🏼♀️ deaf woman: medium-light skin tone
+1F9CF 1F3FC 200D 2640 ; minimally-qualified # 🧏🏼♀ deaf woman: medium-light skin tone
+1F9CF 1F3FD 200D 2640 FE0F ; fully-qualified # 🧏🏽♀️ deaf woman: medium skin tone
+1F9CF 1F3FD 200D 2640 ; minimally-qualified # 🧏🏽♀ deaf woman: medium skin tone
+1F9CF 1F3FE 200D 2640 FE0F ; fully-qualified # 🧏🏾♀️ deaf woman: medium-dark skin tone
+1F9CF 1F3FE 200D 2640 ; minimally-qualified # 🧏🏾♀ deaf woman: medium-dark skin tone
+1F9CF 1F3FF 200D 2640 FE0F ; fully-qualified # 🧏🏿♀️ deaf woman: dark skin tone
+1F9CF 1F3FF 200D 2640 ; minimally-qualified # 🧏🏿♀ deaf woman: dark skin tone
+1F647 ; fully-qualified # 🙇 person bowing
+1F647 1F3FB ; fully-qualified # 🙇🏻 person bowing: light skin tone
+1F647 1F3FC ; fully-qualified # 🙇🏼 person bowing: medium-light skin tone
+1F647 1F3FD ; fully-qualified # 🙇🏽 person bowing: medium skin tone
+1F647 1F3FE ; fully-qualified # 🙇🏾 person bowing: medium-dark skin tone
+1F647 1F3FF ; fully-qualified # 🙇🏿 person bowing: dark skin tone
+1F647 200D 2642 FE0F ; fully-qualified # 🙇♂️ man bowing
+1F647 200D 2642 ; minimally-qualified # 🙇♂ man bowing
+1F647 1F3FB 200D 2642 FE0F ; fully-qualified # 🙇🏻♂️ man bowing: light skin tone
+1F647 1F3FB 200D 2642 ; minimally-qualified # 🙇🏻♂ man bowing: light skin tone
+1F647 1F3FC 200D 2642 FE0F ; fully-qualified # 🙇🏼♂️ man bowing: medium-light skin tone
+1F647 1F3FC 200D 2642 ; minimally-qualified # 🙇🏼♂ man bowing: medium-light skin tone
+1F647 1F3FD 200D 2642 FE0F ; fully-qualified # 🙇🏽♂️ man bowing: medium skin tone
+1F647 1F3FD 200D 2642 ; minimally-qualified # 🙇🏽♂ man bowing: medium skin tone
+1F647 1F3FE 200D 2642 FE0F ; fully-qualified # 🙇🏾♂️ man bowing: medium-dark skin tone
+1F647 1F3FE 200D 2642 ; minimally-qualified # 🙇🏾♂ man bowing: medium-dark skin tone
+1F647 1F3FF 200D 2642 FE0F ; fully-qualified # 🙇🏿♂️ man bowing: dark skin tone
+1F647 1F3FF 200D 2642 ; minimally-qualified # 🙇🏿♂ man bowing: dark skin tone
+1F647 200D 2640 FE0F ; fully-qualified # 🙇♀️ woman bowing
+1F647 200D 2640 ; minimally-qualified # 🙇♀ woman bowing
+1F647 1F3FB 200D 2640 FE0F ; fully-qualified # 🙇🏻♀️ woman bowing: light skin tone
+1F647 1F3FB 200D 2640 ; minimally-qualified # 🙇🏻♀ woman bowing: light skin tone
+1F647 1F3FC 200D 2640 FE0F ; fully-qualified # 🙇🏼♀️ woman bowing: medium-light skin tone
+1F647 1F3FC 200D 2640 ; minimally-qualified # 🙇🏼♀ woman bowing: medium-light skin tone
+1F647 1F3FD 200D 2640 FE0F ; fully-qualified # 🙇🏽♀️ woman bowing: medium skin tone
+1F647 1F3FD 200D 2640 ; minimally-qualified # 🙇🏽♀ woman bowing: medium skin tone
+1F647 1F3FE 200D 2640 FE0F ; fully-qualified # 🙇🏾♀️ woman bowing: medium-dark skin tone
+1F647 1F3FE 200D 2640 ; minimally-qualified # 🙇🏾♀ woman bowing: medium-dark skin tone
+1F647 1F3FF 200D 2640 FE0F ; fully-qualified # 🙇🏿♀️ woman bowing: dark skin tone
+1F647 1F3FF 200D 2640 ; minimally-qualified # 🙇🏿♀ woman bowing: dark skin tone
+1F926 ; fully-qualified # 🤦 person facepalming
+1F926 1F3FB ; fully-qualified # 🤦🏻 person facepalming: light skin tone
+1F926 1F3FC ; fully-qualified # 🤦🏼 person facepalming: medium-light skin tone
+1F926 1F3FD ; fully-qualified # 🤦🏽 person facepalming: medium skin tone
+1F926 1F3FE ; fully-qualified # 🤦🏾 person facepalming: medium-dark skin tone
+1F926 1F3FF ; fully-qualified # 🤦🏿 person facepalming: dark skin tone
+1F926 200D 2642 FE0F ; fully-qualified # 🤦♂️ man facepalming
+1F926 200D 2642 ; minimally-qualified # 🤦♂ man facepalming
+1F926 1F3FB 200D 2642 FE0F ; fully-qualified # 🤦🏻♂️ man facepalming: light skin tone
+1F926 1F3FB 200D 2642 ; minimally-qualified # 🤦🏻♂ man facepalming: light skin tone
+1F926 1F3FC 200D 2642 FE0F ; fully-qualified # 🤦🏼♂️ man facepalming: medium-light skin tone
+1F926 1F3FC 200D 2642 ; minimally-qualified # 🤦🏼♂ man facepalming: medium-light skin tone
+1F926 1F3FD 200D 2642 FE0F ; fully-qualified # 🤦🏽♂️ man facepalming: medium skin tone
+1F926 1F3FD 200D 2642 ; minimally-qualified # 🤦🏽♂ man facepalming: medium skin tone
+1F926 1F3FE 200D 2642 FE0F ; fully-qualified # 🤦🏾♂️ man facepalming: medium-dark skin tone
+1F926 1F3FE 200D 2642 ; minimally-qualified # 🤦🏾♂ man facepalming: medium-dark skin tone
+1F926 1F3FF 200D 2642 FE0F ; fully-qualified # 🤦🏿♂️ man facepalming: dark skin tone
+1F926 1F3FF 200D 2642 ; minimally-qualified # 🤦🏿♂ man facepalming: dark skin tone
+1F926 200D 2640 FE0F ; fully-qualified # 🤦♀️ woman facepalming
+1F926 200D 2640 ; minimally-qualified # 🤦♀ woman facepalming
+1F926 1F3FB 200D 2640 FE0F ; fully-qualified # 🤦🏻♀️ woman facepalming: light skin tone
+1F926 1F3FB 200D 2640 ; minimally-qualified # 🤦🏻♀ woman facepalming: light skin tone
+1F926 1F3FC 200D 2640 FE0F ; fully-qualified # 🤦🏼♀️ woman facepalming: medium-light skin tone
+1F926 1F3FC 200D 2640 ; minimally-qualified # 🤦🏼♀ woman facepalming: medium-light skin tone
+1F926 1F3FD 200D 2640 FE0F ; fully-qualified # 🤦🏽♀️ woman facepalming: medium skin tone
+1F926 1F3FD 200D 2640 ; minimally-qualified # 🤦🏽♀ woman facepalming: medium skin tone
+1F926 1F3FE 200D 2640 FE0F ; fully-qualified # 🤦🏾♀️ woman facepalming: medium-dark skin tone
+1F926 1F3FE 200D 2640 ; minimally-qualified # 🤦🏾♀ woman facepalming: medium-dark skin tone
+1F926 1F3FF 200D 2640 FE0F ; fully-qualified # 🤦🏿♀️ woman facepalming: dark skin tone
+1F926 1F3FF 200D 2640 ; minimally-qualified # 🤦🏿♀ woman facepalming: dark skin tone
+1F937 ; fully-qualified # 🤷 person shrugging
+1F937 1F3FB ; fully-qualified # 🤷🏻 person shrugging: light skin tone
+1F937 1F3FC ; fully-qualified # 🤷🏼 person shrugging: medium-light skin tone
+1F937 1F3FD ; fully-qualified # 🤷🏽 person shrugging: medium skin tone
+1F937 1F3FE ; fully-qualified # 🤷🏾 person shrugging: medium-dark skin tone
+1F937 1F3FF ; fully-qualified # 🤷🏿 person shrugging: dark skin tone
+1F937 200D 2642 FE0F ; fully-qualified # 🤷♂️ man shrugging
+1F937 200D 2642 ; minimally-qualified # 🤷♂ man shrugging
+1F937 1F3FB 200D 2642 FE0F ; fully-qualified # 🤷🏻♂️ man shrugging: light skin tone
+1F937 1F3FB 200D 2642 ; minimally-qualified # 🤷🏻♂ man shrugging: light skin tone
+1F937 1F3FC 200D 2642 FE0F ; fully-qualified # 🤷🏼♂️ man shrugging: medium-light skin tone
+1F937 1F3FC 200D 2642 ; minimally-qualified # 🤷🏼♂ man shrugging: medium-light skin tone
+1F937 1F3FD 200D 2642 FE0F ; fully-qualified # 🤷🏽♂️ man shrugging: medium skin tone
+1F937 1F3FD 200D 2642 ; minimally-qualified # 🤷🏽♂ man shrugging: medium skin tone
+1F937 1F3FE 200D 2642 FE0F ; fully-qualified # 🤷🏾♂️ man shrugging: medium-dark skin tone
+1F937 1F3FE 200D 2642 ; minimally-qualified # 🤷🏾♂ man shrugging: medium-dark skin tone
+1F937 1F3FF 200D 2642 FE0F ; fully-qualified # 🤷🏿♂️ man shrugging: dark skin tone
+1F937 1F3FF 200D 2642 ; minimally-qualified # 🤷🏿♂ man shrugging: dark skin tone
+1F937 200D 2640 FE0F ; fully-qualified # 🤷♀️ woman shrugging
+1F937 200D 2640 ; minimally-qualified # 🤷♀ woman shrugging
+1F937 1F3FB 200D 2640 FE0F ; fully-qualified # 🤷🏻♀️ woman shrugging: light skin tone
+1F937 1F3FB 200D 2640 ; minimally-qualified # 🤷🏻♀ woman shrugging: light skin tone
+1F937 1F3FC 200D 2640 FE0F ; fully-qualified # 🤷🏼♀️ woman shrugging: medium-light skin tone
+1F937 1F3FC 200D 2640 ; minimally-qualified # 🤷🏼♀ woman shrugging: medium-light skin tone
+1F937 1F3FD 200D 2640 FE0F ; fully-qualified # 🤷🏽♀️ woman shrugging: medium skin tone
+1F937 1F3FD 200D 2640 ; minimally-qualified # 🤷🏽♀ woman shrugging: medium skin tone
+1F937 1F3FE 200D 2640 FE0F ; fully-qualified # 🤷🏾♀️ woman shrugging: medium-dark skin tone
+1F937 1F3FE 200D 2640 ; minimally-qualified # 🤷🏾♀ woman shrugging: medium-dark skin tone
+1F937 1F3FF 200D 2640 FE0F ; fully-qualified # 🤷🏿♀️ woman shrugging: dark skin tone
+1F937 1F3FF 200D 2640 ; minimally-qualified # 🤷🏿♀ woman shrugging: dark skin tone
+
+# subgroup: person-role
+1F468 200D 2695 FE0F ; fully-qualified # 👨⚕️ man health worker
+1F468 200D 2695 ; minimally-qualified # 👨⚕ man health worker
+1F468 1F3FB 200D 2695 FE0F ; fully-qualified # 👨🏻⚕️ man health worker: light skin tone
+1F468 1F3FB 200D 2695 ; minimally-qualified # 👨🏻⚕ man health worker: light skin tone
+1F468 1F3FC 200D 2695 FE0F ; fully-qualified # 👨🏼⚕️ man health worker: medium-light skin tone
+1F468 1F3FC 200D 2695 ; minimally-qualified # 👨🏼⚕ man health worker: medium-light skin tone
+1F468 1F3FD 200D 2695 FE0F ; fully-qualified # 👨🏽⚕️ man health worker: medium skin tone
+1F468 1F3FD 200D 2695 ; minimally-qualified # 👨🏽⚕ man health worker: medium skin tone
+1F468 1F3FE 200D 2695 FE0F ; fully-qualified # 👨🏾⚕️ man health worker: medium-dark skin tone
+1F468 1F3FE 200D 2695 ; minimally-qualified # 👨🏾⚕ man health worker: medium-dark skin tone
+1F468 1F3FF 200D 2695 FE0F ; fully-qualified # 👨🏿⚕️ man health worker: dark skin tone
+1F468 1F3FF 200D 2695 ; minimally-qualified # 👨🏿⚕ man health worker: dark skin tone
+1F469 200D 2695 FE0F ; fully-qualified # 👩⚕️ woman health worker
+1F469 200D 2695 ; minimally-qualified # 👩⚕ woman health worker
+1F469 1F3FB 200D 2695 FE0F ; fully-qualified # 👩🏻⚕️ woman health worker: light skin tone
+1F469 1F3FB 200D 2695 ; minimally-qualified # 👩🏻⚕ woman health worker: light skin tone
+1F469 1F3FC 200D 2695 FE0F ; fully-qualified # 👩🏼⚕️ woman health worker: medium-light skin tone
+1F469 1F3FC 200D 2695 ; minimally-qualified # 👩🏼⚕ woman health worker: medium-light skin tone
+1F469 1F3FD 200D 2695 FE0F ; fully-qualified # 👩🏽⚕️ woman health worker: medium skin tone
+1F469 1F3FD 200D 2695 ; minimally-qualified # 👩🏽⚕ woman health worker: medium skin tone
+1F469 1F3FE 200D 2695 FE0F ; fully-qualified # 👩🏾⚕️ woman health worker: medium-dark skin tone
+1F469 1F3FE 200D 2695 ; minimally-qualified # 👩🏾⚕ woman health worker: medium-dark skin tone
+1F469 1F3FF 200D 2695 FE0F ; fully-qualified # 👩🏿⚕️ woman health worker: dark skin tone
+1F469 1F3FF 200D 2695 ; minimally-qualified # 👩🏿⚕ woman health worker: dark skin tone
+1F468 200D 1F393 ; fully-qualified # 👨🎓 man student
+1F468 1F3FB 200D 1F393 ; fully-qualified # 👨🏻🎓 man student: light skin tone
+1F468 1F3FC 200D 1F393 ; fully-qualified # 👨🏼🎓 man student: medium-light skin tone
+1F468 1F3FD 200D 1F393 ; fully-qualified # 👨🏽🎓 man student: medium skin tone
+1F468 1F3FE 200D 1F393 ; fully-qualified # 👨🏾🎓 man student: medium-dark skin tone
+1F468 1F3FF 200D 1F393 ; fully-qualified # 👨🏿🎓 man student: dark skin tone
+1F469 200D 1F393 ; fully-qualified # 👩🎓 woman student
+1F469 1F3FB 200D 1F393 ; fully-qualified # 👩🏻🎓 woman student: light skin tone
+1F469 1F3FC 200D 1F393 ; fully-qualified # 👩🏼🎓 woman student: medium-light skin tone
+1F469 1F3FD 200D 1F393 ; fully-qualified # 👩🏽🎓 woman student: medium skin tone
+1F469 1F3FE 200D 1F393 ; fully-qualified # 👩🏾🎓 woman student: medium-dark skin tone
+1F469 1F3FF 200D 1F393 ; fully-qualified # 👩🏿🎓 woman student: dark skin tone
+1F468 200D 1F3EB ; fully-qualified # 👨🏫 man teacher
+1F468 1F3FB 200D 1F3EB ; fully-qualified # 👨🏻🏫 man teacher: light skin tone
+1F468 1F3FC 200D 1F3EB ; fully-qualified # 👨🏼🏫 man teacher: medium-light skin tone
+1F468 1F3FD 200D 1F3EB ; fully-qualified # 👨🏽🏫 man teacher: medium skin tone
+1F468 1F3FE 200D 1F3EB ; fully-qualified # 👨🏾🏫 man teacher: medium-dark skin tone
+1F468 1F3FF 200D 1F3EB ; fully-qualified # 👨🏿🏫 man teacher: dark skin tone
+1F469 200D 1F3EB ; fully-qualified # 👩🏫 woman teacher
+1F469 1F3FB 200D 1F3EB ; fully-qualified # 👩🏻🏫 woman teacher: light skin tone
+1F469 1F3FC 200D 1F3EB ; fully-qualified # 👩🏼🏫 woman teacher: medium-light skin tone
+1F469 1F3FD 200D 1F3EB ; fully-qualified # 👩🏽🏫 woman teacher: medium skin tone
+1F469 1F3FE 200D 1F3EB ; fully-qualified # 👩🏾🏫 woman teacher: medium-dark skin tone
+1F469 1F3FF 200D 1F3EB ; fully-qualified # 👩🏿🏫 woman teacher: dark skin tone
+1F468 200D 2696 FE0F ; fully-qualified # 👨⚖️ man judge
+1F468 200D 2696 ; minimally-qualified # 👨⚖ man judge
+1F468 1F3FB 200D 2696 FE0F ; fully-qualified # 👨🏻⚖️ man judge: light skin tone
+1F468 1F3FB 200D 2696 ; minimally-qualified # 👨🏻⚖ man judge: light skin tone
+1F468 1F3FC 200D 2696 FE0F ; fully-qualified # 👨🏼⚖️ man judge: medium-light skin tone
+1F468 1F3FC 200D 2696 ; minimally-qualified # 👨🏼⚖ man judge: medium-light skin tone
+1F468 1F3FD 200D 2696 FE0F ; fully-qualified # 👨🏽⚖️ man judge: medium skin tone
+1F468 1F3FD 200D 2696 ; minimally-qualified # 👨🏽⚖ man judge: medium skin tone
+1F468 1F3FE 200D 2696 FE0F ; fully-qualified # 👨🏾⚖️ man judge: medium-dark skin tone
+1F468 1F3FE 200D 2696 ; minimally-qualified # 👨🏾⚖ man judge: medium-dark skin tone
+1F468 1F3FF 200D 2696 FE0F ; fully-qualified # 👨🏿⚖️ man judge: dark skin tone
+1F468 1F3FF 200D 2696 ; minimally-qualified # 👨🏿⚖ man judge: dark skin tone
+1F469 200D 2696 FE0F ; fully-qualified # 👩⚖️ woman judge
+1F469 200D 2696 ; minimally-qualified # 👩⚖ woman judge
+1F469 1F3FB 200D 2696 FE0F ; fully-qualified # 👩🏻⚖️ woman judge: light skin tone
+1F469 1F3FB 200D 2696 ; minimally-qualified # 👩🏻⚖ woman judge: light skin tone
+1F469 1F3FC 200D 2696 FE0F ; fully-qualified # 👩🏼⚖️ woman judge: medium-light skin tone
+1F469 1F3FC 200D 2696 ; minimally-qualified # 👩🏼⚖ woman judge: medium-light skin tone
+1F469 1F3FD 200D 2696 FE0F ; fully-qualified # 👩🏽⚖️ woman judge: medium skin tone
+1F469 1F3FD 200D 2696 ; minimally-qualified # 👩🏽⚖ woman judge: medium skin tone
+1F469 1F3FE 200D 2696 FE0F ; fully-qualified # 👩🏾⚖️ woman judge: medium-dark skin tone
+1F469 1F3FE 200D 2696 ; minimally-qualified # 👩🏾⚖ woman judge: medium-dark skin tone
+1F469 1F3FF 200D 2696 FE0F ; fully-qualified # 👩🏿⚖️ woman judge: dark skin tone
+1F469 1F3FF 200D 2696 ; minimally-qualified # 👩🏿⚖ woman judge: dark skin tone
+1F468 200D 1F33E ; fully-qualified # 👨🌾 man farmer
+1F468 1F3FB 200D 1F33E ; fully-qualified # 👨🏻🌾 man farmer: light skin tone
+1F468 1F3FC 200D 1F33E ; fully-qualified # 👨🏼🌾 man farmer: medium-light skin tone
+1F468 1F3FD 200D 1F33E ; fully-qualified # 👨🏽🌾 man farmer: medium skin tone
+1F468 1F3FE 200D 1F33E ; fully-qualified # 👨🏾🌾 man farmer: medium-dark skin tone
+1F468 1F3FF 200D 1F33E ; fully-qualified # 👨🏿🌾 man farmer: dark skin tone
+1F469 200D 1F33E ; fully-qualified # 👩🌾 woman farmer
+1F469 1F3FB 200D 1F33E ; fully-qualified # 👩🏻🌾 woman farmer: light skin tone
+1F469 1F3FC 200D 1F33E ; fully-qualified # 👩🏼🌾 woman farmer: medium-light skin tone
+1F469 1F3FD 200D 1F33E ; fully-qualified # 👩🏽🌾 woman farmer: medium skin tone
+1F469 1F3FE 200D 1F33E ; fully-qualified # 👩🏾🌾 woman farmer: medium-dark skin tone
+1F469 1F3FF 200D 1F33E ; fully-qualified # 👩🏿🌾 woman farmer: dark skin tone
+1F468 200D 1F373 ; fully-qualified # 👨🍳 man cook
+1F468 1F3FB 200D 1F373 ; fully-qualified # 👨🏻🍳 man cook: light skin tone
+1F468 1F3FC 200D 1F373 ; fully-qualified # 👨🏼🍳 man cook: medium-light skin tone
+1F468 1F3FD 200D 1F373 ; fully-qualified # 👨🏽🍳 man cook: medium skin tone
+1F468 1F3FE 200D 1F373 ; fully-qualified # 👨🏾🍳 man cook: medium-dark skin tone
+1F468 1F3FF 200D 1F373 ; fully-qualified # 👨🏿🍳 man cook: dark skin tone
+1F469 200D 1F373 ; fully-qualified # 👩🍳 woman cook
+1F469 1F3FB 200D 1F373 ; fully-qualified # 👩🏻🍳 woman cook: light skin tone
+1F469 1F3FC 200D 1F373 ; fully-qualified # 👩🏼🍳 woman cook: medium-light skin tone
+1F469 1F3FD 200D 1F373 ; fully-qualified # 👩🏽🍳 woman cook: medium skin tone
+1F469 1F3FE 200D 1F373 ; fully-qualified # 👩🏾🍳 woman cook: medium-dark skin tone
+1F469 1F3FF 200D 1F373 ; fully-qualified # 👩🏿🍳 woman cook: dark skin tone
+1F468 200D 1F527 ; fully-qualified # 👨🔧 man mechanic
+1F468 1F3FB 200D 1F527 ; fully-qualified # 👨🏻🔧 man mechanic: light skin tone
+1F468 1F3FC 200D 1F527 ; fully-qualified # 👨🏼🔧 man mechanic: medium-light skin tone
+1F468 1F3FD 200D 1F527 ; fully-qualified # 👨🏽🔧 man mechanic: medium skin tone
+1F468 1F3FE 200D 1F527 ; fully-qualified # 👨🏾🔧 man mechanic: medium-dark skin tone
+1F468 1F3FF 200D 1F527 ; fully-qualified # 👨🏿🔧 man mechanic: dark skin tone
+1F469 200D 1F527 ; fully-qualified # 👩🔧 woman mechanic
+1F469 1F3FB 200D 1F527 ; fully-qualified # 👩🏻🔧 woman mechanic: light skin tone
+1F469 1F3FC 200D 1F527 ; fully-qualified # 👩🏼🔧 woman mechanic: medium-light skin tone
+1F469 1F3FD 200D 1F527 ; fully-qualified # 👩🏽🔧 woman mechanic: medium skin tone
+1F469 1F3FE 200D 1F527 ; fully-qualified # 👩🏾🔧 woman mechanic: medium-dark skin tone
+1F469 1F3FF 200D 1F527 ; fully-qualified # 👩🏿🔧 woman mechanic: dark skin tone
+1F468 200D 1F3ED ; fully-qualified # 👨🏭 man factory worker
+1F468 1F3FB 200D 1F3ED ; fully-qualified # 👨🏻🏭 man factory worker: light skin tone
+1F468 1F3FC 200D 1F3ED ; fully-qualified # 👨🏼🏭 man factory worker: medium-light skin tone
+1F468 1F3FD 200D 1F3ED ; fully-qualified # 👨🏽🏭 man factory worker: medium skin tone
+1F468 1F3FE 200D 1F3ED ; fully-qualified # 👨🏾🏭 man factory worker: medium-dark skin tone
+1F468 1F3FF 200D 1F3ED ; fully-qualified # 👨🏿🏭 man factory worker: dark skin tone
+1F469 200D 1F3ED ; fully-qualified # 👩🏭 woman factory worker
+1F469 1F3FB 200D 1F3ED ; fully-qualified # 👩🏻🏭 woman factory worker: light skin tone
+1F469 1F3FC 200D 1F3ED ; fully-qualified # 👩🏼🏭 woman factory worker: medium-light skin tone
+1F469 1F3FD 200D 1F3ED ; fully-qualified # 👩🏽🏭 woman factory worker: medium skin tone
+1F469 1F3FE 200D 1F3ED ; fully-qualified # 👩🏾🏭 woman factory worker: medium-dark skin tone
+1F469 1F3FF 200D 1F3ED ; fully-qualified # 👩🏿🏭 woman factory worker: dark skin tone
+1F468 200D 1F4BC ; fully-qualified # 👨💼 man office worker
+1F468 1F3FB 200D 1F4BC ; fully-qualified # 👨🏻💼 man office worker: light skin tone
+1F468 1F3FC 200D 1F4BC ; fully-qualified # 👨🏼💼 man office worker: medium-light skin tone
+1F468 1F3FD 200D 1F4BC ; fully-qualified # 👨🏽💼 man office worker: medium skin tone
+1F468 1F3FE 200D 1F4BC ; fully-qualified # 👨🏾💼 man office worker: medium-dark skin tone
+1F468 1F3FF 200D 1F4BC ; fully-qualified # 👨🏿💼 man office worker: dark skin tone
+1F469 200D 1F4BC ; fully-qualified # 👩💼 woman office worker
+1F469 1F3FB 200D 1F4BC ; fully-qualified # 👩🏻💼 woman office worker: light skin tone
+1F469 1F3FC 200D 1F4BC ; fully-qualified # 👩🏼💼 woman office worker: medium-light skin tone
+1F469 1F3FD 200D 1F4BC ; fully-qualified # 👩🏽💼 woman office worker: medium skin tone
+1F469 1F3FE 200D 1F4BC ; fully-qualified # 👩🏾💼 woman office worker: medium-dark skin tone
+1F469 1F3FF 200D 1F4BC ; fully-qualified # 👩🏿💼 woman office worker: dark skin tone
+1F468 200D 1F52C ; fully-qualified # 👨🔬 man scientist
+1F468 1F3FB 200D 1F52C ; fully-qualified # 👨🏻🔬 man scientist: light skin tone
+1F468 1F3FC 200D 1F52C ; fully-qualified # 👨🏼🔬 man scientist: medium-light skin tone
+1F468 1F3FD 200D 1F52C ; fully-qualified # 👨🏽🔬 man scientist: medium skin tone
+1F468 1F3FE 200D 1F52C ; fully-qualified # 👨🏾🔬 man scientist: medium-dark skin tone
+1F468 1F3FF 200D 1F52C ; fully-qualified # 👨🏿🔬 man scientist: dark skin tone
+1F469 200D 1F52C ; fully-qualified # 👩🔬 woman scientist
+1F469 1F3FB 200D 1F52C ; fully-qualified # 👩🏻🔬 woman scientist: light skin tone
+1F469 1F3FC 200D 1F52C ; fully-qualified # 👩🏼🔬 woman scientist: medium-light skin tone
+1F469 1F3FD 200D 1F52C ; fully-qualified # 👩🏽🔬 woman scientist: medium skin tone
+1F469 1F3FE 200D 1F52C ; fully-qualified # 👩🏾🔬 woman scientist: medium-dark skin tone
+1F469 1F3FF 200D 1F52C ; fully-qualified # 👩🏿🔬 woman scientist: dark skin tone
+1F468 200D 1F4BB ; fully-qualified # 👨💻 man technologist
+1F468 1F3FB 200D 1F4BB ; fully-qualified # 👨🏻💻 man technologist: light skin tone
+1F468 1F3FC 200D 1F4BB ; fully-qualified # 👨🏼💻 man technologist: medium-light skin tone
+1F468 1F3FD 200D 1F4BB ; fully-qualified # 👨🏽💻 man technologist: medium skin tone
+1F468 1F3FE 200D 1F4BB ; fully-qualified # 👨🏾💻 man technologist: medium-dark skin tone
+1F468 1F3FF 200D 1F4BB ; fully-qualified # 👨🏿💻 man technologist: dark skin tone
+1F469 200D 1F4BB ; fully-qualified # 👩💻 woman technologist
+1F469 1F3FB 200D 1F4BB ; fully-qualified # 👩🏻💻 woman technologist: light skin tone
+1F469 1F3FC 200D 1F4BB ; fully-qualified # 👩🏼💻 woman technologist: medium-light skin tone
+1F469 1F3FD 200D 1F4BB ; fully-qualified # 👩🏽💻 woman technologist: medium skin tone
+1F469 1F3FE 200D 1F4BB ; fully-qualified # 👩🏾💻 woman technologist: medium-dark skin tone
+1F469 1F3FF 200D 1F4BB ; fully-qualified # 👩🏿💻 woman technologist: dark skin tone
+1F468 200D 1F3A4 ; fully-qualified # 👨🎤 man singer
+1F468 1F3FB 200D 1F3A4 ; fully-qualified # 👨🏻🎤 man singer: light skin tone
+1F468 1F3FC 200D 1F3A4 ; fully-qualified # 👨🏼🎤 man singer: medium-light skin tone
+1F468 1F3FD 200D 1F3A4 ; fully-qualified # 👨🏽🎤 man singer: medium skin tone
+1F468 1F3FE 200D 1F3A4 ; fully-qualified # 👨🏾🎤 man singer: medium-dark skin tone
+1F468 1F3FF 200D 1F3A4 ; fully-qualified # 👨🏿🎤 man singer: dark skin tone
+1F469 200D 1F3A4 ; fully-qualified # 👩🎤 woman singer
+1F469 1F3FB 200D 1F3A4 ; fully-qualified # 👩🏻🎤 woman singer: light skin tone
+1F469 1F3FC 200D 1F3A4 ; fully-qualified # 👩🏼🎤 woman singer: medium-light skin tone
+1F469 1F3FD 200D 1F3A4 ; fully-qualified # 👩🏽🎤 woman singer: medium skin tone
+1F469 1F3FE 200D 1F3A4 ; fully-qualified # 👩🏾🎤 woman singer: medium-dark skin tone
+1F469 1F3FF 200D 1F3A4 ; fully-qualified # 👩🏿🎤 woman singer: dark skin tone
+1F468 200D 1F3A8 ; fully-qualified # 👨🎨 man artist
+1F468 1F3FB 200D 1F3A8 ; fully-qualified # 👨🏻🎨 man artist: light skin tone
+1F468 1F3FC 200D 1F3A8 ; fully-qualified # 👨🏼🎨 man artist: medium-light skin tone
+1F468 1F3FD 200D 1F3A8 ; fully-qualified # 👨🏽🎨 man artist: medium skin tone
+1F468 1F3FE 200D 1F3A8 ; fully-qualified # 👨🏾🎨 man artist: medium-dark skin tone
+1F468 1F3FF 200D 1F3A8 ; fully-qualified # 👨🏿🎨 man artist: dark skin tone
+1F469 200D 1F3A8 ; fully-qualified # 👩🎨 woman artist
+1F469 1F3FB 200D 1F3A8 ; fully-qualified # 👩🏻🎨 woman artist: light skin tone
+1F469 1F3FC 200D 1F3A8 ; fully-qualified # 👩🏼🎨 woman artist: medium-light skin tone
+1F469 1F3FD 200D 1F3A8 ; fully-qualified # 👩🏽🎨 woman artist: medium skin tone
+1F469 1F3FE 200D 1F3A8 ; fully-qualified # 👩🏾🎨 woman artist: medium-dark skin tone
+1F469 1F3FF 200D 1F3A8 ; fully-qualified # 👩🏿🎨 woman artist: dark skin tone
+1F468 200D 2708 FE0F ; fully-qualified # 👨✈️ man pilot
+1F468 200D 2708 ; minimally-qualified # 👨✈ man pilot
+1F468 1F3FB 200D 2708 FE0F ; fully-qualified # 👨🏻✈️ man pilot: light skin tone
+1F468 1F3FB 200D 2708 ; minimally-qualified # 👨🏻✈ man pilot: light skin tone
+1F468 1F3FC 200D 2708 FE0F ; fully-qualified # 👨🏼✈️ man pilot: medium-light skin tone
+1F468 1F3FC 200D 2708 ; minimally-qualified # 👨🏼✈ man pilot: medium-light skin tone
+1F468 1F3FD 200D 2708 FE0F ; fully-qualified # 👨🏽✈️ man pilot: medium skin tone
+1F468 1F3FD 200D 2708 ; minimally-qualified # 👨🏽✈ man pilot: medium skin tone
+1F468 1F3FE 200D 2708 FE0F ; fully-qualified # 👨🏾✈️ man pilot: medium-dark skin tone
+1F468 1F3FE 200D 2708 ; minimally-qualified # 👨🏾✈ man pilot: medium-dark skin tone
+1F468 1F3FF 200D 2708 FE0F ; fully-qualified # 👨🏿✈️ man pilot: dark skin tone
+1F468 1F3FF 200D 2708 ; minimally-qualified # 👨🏿✈ man pilot: dark skin tone
+1F469 200D 2708 FE0F ; fully-qualified # 👩✈️ woman pilot
+1F469 200D 2708 ; minimally-qualified # 👩✈ woman pilot
+1F469 1F3FB 200D 2708 FE0F ; fully-qualified # 👩🏻✈️ woman pilot: light skin tone
+1F469 1F3FB 200D 2708 ; minimally-qualified # 👩🏻✈ woman pilot: light skin tone
+1F469 1F3FC 200D 2708 FE0F ; fully-qualified # 👩🏼✈️ woman pilot: medium-light skin tone
+1F469 1F3FC 200D 2708 ; minimally-qualified # 👩🏼✈ woman pilot: medium-light skin tone
+1F469 1F3FD 200D 2708 FE0F ; fully-qualified # 👩🏽✈️ woman pilot: medium skin tone
+1F469 1F3FD 200D 2708 ; minimally-qualified # 👩🏽✈ woman pilot: medium skin tone
+1F469 1F3FE 200D 2708 FE0F ; fully-qualified # 👩🏾✈️ woman pilot: medium-dark skin tone
+1F469 1F3FE 200D 2708 ; minimally-qualified # 👩🏾✈ woman pilot: medium-dark skin tone
+1F469 1F3FF 200D 2708 FE0F ; fully-qualified # 👩🏿✈️ woman pilot: dark skin tone
+1F469 1F3FF 200D 2708 ; minimally-qualified # 👩🏿✈ woman pilot: dark skin tone
+1F468 200D 1F680 ; fully-qualified # 👨🚀 man astronaut
+1F468 1F3FB 200D 1F680 ; fully-qualified # 👨🏻🚀 man astronaut: light skin tone
+1F468 1F3FC 200D 1F680 ; fully-qualified # 👨🏼🚀 man astronaut: medium-light skin tone
+1F468 1F3FD 200D 1F680 ; fully-qualified # 👨🏽🚀 man astronaut: medium skin tone
+1F468 1F3FE 200D 1F680 ; fully-qualified # 👨🏾🚀 man astronaut: medium-dark skin tone
+1F468 1F3FF 200D 1F680 ; fully-qualified # 👨🏿🚀 man astronaut: dark skin tone
+1F469 200D 1F680 ; fully-qualified # 👩🚀 woman astronaut
+1F469 1F3FB 200D 1F680 ; fully-qualified # 👩🏻🚀 woman astronaut: light skin tone
+1F469 1F3FC 200D 1F680 ; fully-qualified # 👩🏼🚀 woman astronaut: medium-light skin tone
+1F469 1F3FD 200D 1F680 ; fully-qualified # 👩🏽🚀 woman astronaut: medium skin tone
+1F469 1F3FE 200D 1F680 ; fully-qualified # 👩🏾🚀 woman astronaut: medium-dark skin tone
+1F469 1F3FF 200D 1F680 ; fully-qualified # 👩🏿🚀 woman astronaut: dark skin tone
+1F468 200D 1F692 ; fully-qualified # 👨🚒 man firefighter
+1F468 1F3FB 200D 1F692 ; fully-qualified # 👨🏻🚒 man firefighter: light skin tone
+1F468 1F3FC 200D 1F692 ; fully-qualified # 👨🏼🚒 man firefighter: medium-light skin tone
+1F468 1F3FD 200D 1F692 ; fully-qualified # 👨🏽🚒 man firefighter: medium skin tone
+1F468 1F3FE 200D 1F692 ; fully-qualified # 👨🏾🚒 man firefighter: medium-dark skin tone
+1F468 1F3FF 200D 1F692 ; fully-qualified # 👨🏿🚒 man firefighter: dark skin tone
+1F469 200D 1F692 ; fully-qualified # 👩🚒 woman firefighter
+1F469 1F3FB 200D 1F692 ; fully-qualified # 👩🏻🚒 woman firefighter: light skin tone
+1F469 1F3FC 200D 1F692 ; fully-qualified # 👩🏼🚒 woman firefighter: medium-light skin tone
+1F469 1F3FD 200D 1F692 ; fully-qualified # 👩🏽🚒 woman firefighter: medium skin tone
+1F469 1F3FE 200D 1F692 ; fully-qualified # 👩🏾🚒 woman firefighter: medium-dark skin tone
+1F469 1F3FF 200D 1F692 ; fully-qualified # 👩🏿🚒 woman firefighter: dark skin tone
+1F46E ; fully-qualified # 👮 police officer
+1F46E 1F3FB ; fully-qualified # 👮🏻 police officer: light skin tone
+1F46E 1F3FC ; fully-qualified # 👮🏼 police officer: medium-light skin tone
+1F46E 1F3FD ; fully-qualified # 👮🏽 police officer: medium skin tone
+1F46E 1F3FE ; fully-qualified # 👮🏾 police officer: medium-dark skin tone
+1F46E 1F3FF ; fully-qualified # 👮🏿 police officer: dark skin tone
+1F46E 200D 2642 FE0F ; fully-qualified # 👮♂️ man police officer
+1F46E 200D 2642 ; minimally-qualified # 👮♂ man police officer
+1F46E 1F3FB 200D 2642 FE0F ; fully-qualified # 👮🏻♂️ man police officer: light skin tone
+1F46E 1F3FB 200D 2642 ; minimally-qualified # 👮🏻♂ man police officer: light skin tone
+1F46E 1F3FC 200D 2642 FE0F ; fully-qualified # 👮🏼♂️ man police officer: medium-light skin tone
+1F46E 1F3FC 200D 2642 ; minimally-qualified # 👮🏼♂ man police officer: medium-light skin tone
+1F46E 1F3FD 200D 2642 FE0F ; fully-qualified # 👮🏽♂️ man police officer: medium skin tone
+1F46E 1F3FD 200D 2642 ; minimally-qualified # 👮🏽♂ man police officer: medium skin tone
+1F46E 1F3FE 200D 2642 FE0F ; fully-qualified # 👮🏾♂️ man police officer: medium-dark skin tone
+1F46E 1F3FE 200D 2642 ; minimally-qualified # 👮🏾♂ man police officer: medium-dark skin tone
+1F46E 1F3FF 200D 2642 FE0F ; fully-qualified # 👮🏿♂️ man police officer: dark skin tone
+1F46E 1F3FF 200D 2642 ; minimally-qualified # 👮🏿♂ man police officer: dark skin tone
+1F46E 200D 2640 FE0F ; fully-qualified # 👮♀️ woman police officer
+1F46E 200D 2640 ; minimally-qualified # 👮♀ woman police officer
+1F46E 1F3FB 200D 2640 FE0F ; fully-qualified # 👮🏻♀️ woman police officer: light skin tone
+1F46E 1F3FB 200D 2640 ; minimally-qualified # 👮🏻♀ woman police officer: light skin tone
+1F46E 1F3FC 200D 2640 FE0F ; fully-qualified # 👮🏼♀️ woman police officer: medium-light skin tone
+1F46E 1F3FC 200D 2640 ; minimally-qualified # 👮🏼♀ woman police officer: medium-light skin tone
+1F46E 1F3FD 200D 2640 FE0F ; fully-qualified # 👮🏽♀️ woman police officer: medium skin tone
+1F46E 1F3FD 200D 2640 ; minimally-qualified # 👮🏽♀ woman police officer: medium skin tone
+1F46E 1F3FE 200D 2640 FE0F ; fully-qualified # 👮🏾♀️ woman police officer: medium-dark skin tone
+1F46E 1F3FE 200D 2640 ; minimally-qualified # 👮🏾♀ woman police officer: medium-dark skin tone
+1F46E 1F3FF 200D 2640 FE0F ; fully-qualified # 👮🏿♀️ woman police officer: dark skin tone
+1F46E 1F3FF 200D 2640 ; minimally-qualified # 👮🏿♀ woman police officer: dark skin tone
+1F575 FE0F ; fully-qualified # 🕵️ detective
+1F575 ; unqualified # 🕵 detective
+1F575 1F3FB ; fully-qualified # 🕵🏻 detective: light skin tone
+1F575 1F3FC ; fully-qualified # 🕵🏼 detective: medium-light skin tone
+1F575 1F3FD ; fully-qualified # 🕵🏽 detective: medium skin tone
+1F575 1F3FE ; fully-qualified # 🕵🏾 detective: medium-dark skin tone
+1F575 1F3FF ; fully-qualified # 🕵🏿 detective: dark skin tone
+1F575 FE0F 200D 2642 FE0F ; fully-qualified # 🕵️♂️ man detective
+1F575 200D 2642 FE0F ; unqualified # 🕵♂️ man detective
+1F575 FE0F 200D 2642 ; unqualified # 🕵️♂ man detective
+1F575 200D 2642 ; unqualified # 🕵♂ man detective
+1F575 1F3FB 200D 2642 FE0F ; fully-qualified # 🕵🏻♂️ man detective: light skin tone
+1F575 1F3FB 200D 2642 ; minimally-qualified # 🕵🏻♂ man detective: light skin tone
+1F575 1F3FC 200D 2642 FE0F ; fully-qualified # 🕵🏼♂️ man detective: medium-light skin tone
+1F575 1F3FC 200D 2642 ; minimally-qualified # 🕵🏼♂ man detective: medium-light skin tone
+1F575 1F3FD 200D 2642 FE0F ; fully-qualified # 🕵🏽♂️ man detective: medium skin tone
+1F575 1F3FD 200D 2642 ; minimally-qualified # 🕵🏽♂ man detective: medium skin tone
+1F575 1F3FE 200D 2642 FE0F ; fully-qualified # 🕵🏾♂️ man detective: medium-dark skin tone
+1F575 1F3FE 200D 2642 ; minimally-qualified # 🕵🏾♂ man detective: medium-dark skin tone
+1F575 1F3FF 200D 2642 FE0F ; fully-qualified # 🕵🏿♂️ man detective: dark skin tone
+1F575 1F3FF 200D 2642 ; minimally-qualified # 🕵🏿♂ man detective: dark skin tone
+1F575 FE0F 200D 2640 FE0F ; fully-qualified # 🕵️♀️ woman detective
+1F575 200D 2640 FE0F ; unqualified # 🕵♀️ woman detective
+1F575 FE0F 200D 2640 ; unqualified # 🕵️♀ woman detective
+1F575 200D 2640 ; unqualified # 🕵♀ woman detective
+1F575 1F3FB 200D 2640 FE0F ; fully-qualified # 🕵🏻♀️ woman detective: light skin tone
+1F575 1F3FB 200D 2640 ; minimally-qualified # 🕵🏻♀ woman detective: light skin tone
+1F575 1F3FC 200D 2640 FE0F ; fully-qualified # 🕵🏼♀️ woman detective: medium-light skin tone
+1F575 1F3FC 200D 2640 ; minimally-qualified # 🕵🏼♀ woman detective: medium-light skin tone
+1F575 1F3FD 200D 2640 FE0F ; fully-qualified # 🕵🏽♀️ woman detective: medium skin tone
+1F575 1F3FD 200D 2640 ; minimally-qualified # 🕵🏽♀ woman detective: medium skin tone
+1F575 1F3FE 200D 2640 FE0F ; fully-qualified # 🕵🏾♀️ woman detective: medium-dark skin tone
+1F575 1F3FE 200D 2640 ; minimally-qualified # 🕵🏾♀ woman detective: medium-dark skin tone
+1F575 1F3FF 200D 2640 FE0F ; fully-qualified # 🕵🏿♀️ woman detective: dark skin tone
+1F575 1F3FF 200D 2640 ; minimally-qualified # 🕵🏿♀ woman detective: dark skin tone
+1F482 ; fully-qualified # 💂 guard
+1F482 1F3FB ; fully-qualified # 💂🏻 guard: light skin tone
+1F482 1F3FC ; fully-qualified # 💂🏼 guard: medium-light skin tone
+1F482 1F3FD ; fully-qualified # 💂🏽 guard: medium skin tone
+1F482 1F3FE ; fully-qualified # 💂🏾 guard: medium-dark skin tone
+1F482 1F3FF ; fully-qualified # 💂🏿 guard: dark skin tone
+1F482 200D 2642 FE0F ; fully-qualified # 💂♂️ man guard
+1F482 200D 2642 ; minimally-qualified # 💂♂ man guard
+1F482 1F3FB 200D 2642 FE0F ; fully-qualified # 💂🏻♂️ man guard: light skin tone
+1F482 1F3FB 200D 2642 ; minimally-qualified # 💂🏻♂ man guard: light skin tone
+1F482 1F3FC 200D 2642 FE0F ; fully-qualified # 💂🏼♂️ man guard: medium-light skin tone
+1F482 1F3FC 200D 2642 ; minimally-qualified # 💂🏼♂ man guard: medium-light skin tone
+1F482 1F3FD 200D 2642 FE0F ; fully-qualified # 💂🏽♂️ man guard: medium skin tone
+1F482 1F3FD 200D 2642 ; minimally-qualified # 💂🏽♂ man guard: medium skin tone
+1F482 1F3FE 200D 2642 FE0F ; fully-qualified # 💂🏾♂️ man guard: medium-dark skin tone
+1F482 1F3FE 200D 2642 ; minimally-qualified # 💂🏾♂ man guard: medium-dark skin tone
+1F482 1F3FF 200D 2642 FE0F ; fully-qualified # 💂🏿♂️ man guard: dark skin tone
+1F482 1F3FF 200D 2642 ; minimally-qualified # 💂🏿♂ man guard: dark skin tone
+1F482 200D 2640 FE0F ; fully-qualified # 💂♀️ woman guard
+1F482 200D 2640 ; minimally-qualified # 💂♀ woman guard
+1F482 1F3FB 200D 2640 FE0F ; fully-qualified # 💂🏻♀️ woman guard: light skin tone
+1F482 1F3FB 200D 2640 ; minimally-qualified # 💂🏻♀ woman guard: light skin tone
+1F482 1F3FC 200D 2640 FE0F ; fully-qualified # 💂🏼♀️ woman guard: medium-light skin tone
+1F482 1F3FC 200D 2640 ; minimally-qualified # 💂🏼♀ woman guard: medium-light skin tone
+1F482 1F3FD 200D 2640 FE0F ; fully-qualified # 💂🏽♀️ woman guard: medium skin tone
+1F482 1F3FD 200D 2640 ; minimally-qualified # 💂🏽♀ woman guard: medium skin tone
+1F482 1F3FE 200D 2640 FE0F ; fully-qualified # 💂🏾♀️ woman guard: medium-dark skin tone
+1F482 1F3FE 200D 2640 ; minimally-qualified # 💂🏾♀ woman guard: medium-dark skin tone
+1F482 1F3FF 200D 2640 FE0F ; fully-qualified # 💂🏿♀️ woman guard: dark skin tone
+1F482 1F3FF 200D 2640 ; minimally-qualified # 💂🏿♀ woman guard: dark skin tone
+1F477 ; fully-qualified # 👷 construction worker
+1F477 1F3FB ; fully-qualified # 👷🏻 construction worker: light skin tone
+1F477 1F3FC ; fully-qualified # 👷🏼 construction worker: medium-light skin tone
+1F477 1F3FD ; fully-qualified # 👷🏽 construction worker: medium skin tone
+1F477 1F3FE ; fully-qualified # 👷🏾 construction worker: medium-dark skin tone
+1F477 1F3FF ; fully-qualified # 👷🏿 construction worker: dark skin tone
+1F477 200D 2642 FE0F ; fully-qualified # 👷♂️ man construction worker
+1F477 200D 2642 ; minimally-qualified # 👷♂ man construction worker
+1F477 1F3FB 200D 2642 FE0F ; fully-qualified # 👷🏻♂️ man construction worker: light skin tone
+1F477 1F3FB 200D 2642 ; minimally-qualified # 👷🏻♂ man construction worker: light skin tone
+1F477 1F3FC 200D 2642 FE0F ; fully-qualified # 👷🏼♂️ man construction worker: medium-light skin tone
+1F477 1F3FC 200D 2642 ; minimally-qualified # 👷🏼♂ man construction worker: medium-light skin tone
+1F477 1F3FD 200D 2642 FE0F ; fully-qualified # 👷🏽♂️ man construction worker: medium skin tone
+1F477 1F3FD 200D 2642 ; minimally-qualified # 👷🏽♂ man construction worker: medium skin tone
+1F477 1F3FE 200D 2642 FE0F ; fully-qualified # 👷🏾♂️ man construction worker: medium-dark skin tone
+1F477 1F3FE 200D 2642 ; minimally-qualified # 👷🏾♂ man construction worker: medium-dark skin tone
+1F477 1F3FF 200D 2642 FE0F ; fully-qualified # 👷🏿♂️ man construction worker: dark skin tone
+1F477 1F3FF 200D 2642 ; minimally-qualified # 👷🏿♂ man construction worker: dark skin tone
+1F477 200D 2640 FE0F ; fully-qualified # 👷♀️ woman construction worker
+1F477 200D 2640 ; minimally-qualified # 👷♀ woman construction worker
+1F477 1F3FB 200D 2640 FE0F ; fully-qualified # 👷🏻♀️ woman construction worker: light skin tone
+1F477 1F3FB 200D 2640 ; minimally-qualified # 👷🏻♀ woman construction worker: light skin tone
+1F477 1F3FC 200D 2640 FE0F ; fully-qualified # 👷🏼♀️ woman construction worker: medium-light skin tone
+1F477 1F3FC 200D 2640 ; minimally-qualified # 👷🏼♀ woman construction worker: medium-light skin tone
+1F477 1F3FD 200D 2640 FE0F ; fully-qualified # 👷🏽♀️ woman construction worker: medium skin tone
+1F477 1F3FD 200D 2640 ; minimally-qualified # 👷🏽♀ woman construction worker: medium skin tone
+1F477 1F3FE 200D 2640 FE0F ; fully-qualified # 👷🏾♀️ woman construction worker: medium-dark skin tone
+1F477 1F3FE 200D 2640 ; minimally-qualified # 👷🏾♀ woman construction worker: medium-dark skin tone
+1F477 1F3FF 200D 2640 FE0F ; fully-qualified # 👷🏿♀️ woman construction worker: dark skin tone
+1F477 1F3FF 200D 2640 ; minimally-qualified # 👷🏿♀ woman construction worker: dark skin tone
+1F934 ; fully-qualified # 🤴 prince
+1F934 1F3FB ; fully-qualified # 🤴🏻 prince: light skin tone
+1F934 1F3FC ; fully-qualified # 🤴🏼 prince: medium-light skin tone
+1F934 1F3FD ; fully-qualified # 🤴🏽 prince: medium skin tone
+1F934 1F3FE ; fully-qualified # 🤴🏾 prince: medium-dark skin tone
+1F934 1F3FF ; fully-qualified # 🤴🏿 prince: dark skin tone
+1F478 ; fully-qualified # 👸 princess
+1F478 1F3FB ; fully-qualified # 👸🏻 princess: light skin tone
+1F478 1F3FC ; fully-qualified # 👸🏼 princess: medium-light skin tone
+1F478 1F3FD ; fully-qualified # 👸🏽 princess: medium skin tone
+1F478 1F3FE ; fully-qualified # 👸🏾 princess: medium-dark skin tone
+1F478 1F3FF ; fully-qualified # 👸🏿 princess: dark skin tone
+1F473 ; fully-qualified # 👳 person wearing turban
+1F473 1F3FB ; fully-qualified # 👳🏻 person wearing turban: light skin tone
+1F473 1F3FC ; fully-qualified # 👳🏼 person wearing turban: medium-light skin tone
+1F473 1F3FD ; fully-qualified # 👳🏽 person wearing turban: medium skin tone
+1F473 1F3FE ; fully-qualified # 👳🏾 person wearing turban: medium-dark skin tone
+1F473 1F3FF ; fully-qualified # 👳🏿 person wearing turban: dark skin tone
+1F473 200D 2642 FE0F ; fully-qualified # 👳♂️ man wearing turban
+1F473 200D 2642 ; minimally-qualified # 👳♂ man wearing turban
+1F473 1F3FB 200D 2642 FE0F ; fully-qualified # 👳🏻♂️ man wearing turban: light skin tone
+1F473 1F3FB 200D 2642 ; minimally-qualified # 👳🏻♂ man wearing turban: light skin tone
+1F473 1F3FC 200D 2642 FE0F ; fully-qualified # 👳🏼♂️ man wearing turban: medium-light skin tone
+1F473 1F3FC 200D 2642 ; minimally-qualified # 👳🏼♂ man wearing turban: medium-light skin tone
+1F473 1F3FD 200D 2642 FE0F ; fully-qualified # 👳🏽♂️ man wearing turban: medium skin tone
+1F473 1F3FD 200D 2642 ; minimally-qualified # 👳🏽♂ man wearing turban: medium skin tone
+1F473 1F3FE 200D 2642 FE0F ; fully-qualified # 👳🏾♂️ man wearing turban: medium-dark skin tone
+1F473 1F3FE 200D 2642 ; minimally-qualified # 👳🏾♂ man wearing turban: medium-dark skin tone
+1F473 1F3FF 200D 2642 FE0F ; fully-qualified # 👳🏿♂️ man wearing turban: dark skin tone
+1F473 1F3FF 200D 2642 ; minimally-qualified # 👳🏿♂ man wearing turban: dark skin tone
+1F473 200D 2640 FE0F ; fully-qualified # 👳♀️ woman wearing turban
+1F473 200D 2640 ; minimally-qualified # 👳♀ woman wearing turban
+1F473 1F3FB 200D 2640 FE0F ; fully-qualified # 👳🏻♀️ woman wearing turban: light skin tone
+1F473 1F3FB 200D 2640 ; minimally-qualified # 👳🏻♀ woman wearing turban: light skin tone
+1F473 1F3FC 200D 2640 FE0F ; fully-qualified # 👳🏼♀️ woman wearing turban: medium-light skin tone
+1F473 1F3FC 200D 2640 ; minimally-qualified # 👳🏼♀ woman wearing turban: medium-light skin tone
+1F473 1F3FD 200D 2640 FE0F ; fully-qualified # 👳🏽♀️ woman wearing turban: medium skin tone
+1F473 1F3FD 200D 2640 ; minimally-qualified # 👳🏽♀ woman wearing turban: medium skin tone
+1F473 1F3FE 200D 2640 FE0F ; fully-qualified # 👳🏾♀️ woman wearing turban: medium-dark skin tone
+1F473 1F3FE 200D 2640 ; minimally-qualified # 👳🏾♀ woman wearing turban: medium-dark skin tone
+1F473 1F3FF 200D 2640 FE0F ; fully-qualified # 👳🏿♀️ woman wearing turban: dark skin tone
+1F473 1F3FF 200D 2640 ; minimally-qualified # 👳🏿♀ woman wearing turban: dark skin tone
+1F472 ; fully-qualified # 👲 man with Chinese cap
+1F472 1F3FB ; fully-qualified # 👲🏻 man with Chinese cap: light skin tone
+1F472 1F3FC ; fully-qualified # 👲🏼 man with Chinese cap: medium-light skin tone
+1F472 1F3FD ; fully-qualified # 👲🏽 man with Chinese cap: medium skin tone
+1F472 1F3FE ; fully-qualified # 👲🏾 man with Chinese cap: medium-dark skin tone
+1F472 1F3FF ; fully-qualified # 👲🏿 man with Chinese cap: dark skin tone
+1F9D5 ; fully-qualified # 🧕 woman with headscarf
+1F9D5 1F3FB ; fully-qualified # 🧕🏻 woman with headscarf: light skin tone
+1F9D5 1F3FC ; fully-qualified # 🧕🏼 woman with headscarf: medium-light skin tone
+1F9D5 1F3FD ; fully-qualified # 🧕🏽 woman with headscarf: medium skin tone
+1F9D5 1F3FE ; fully-qualified # 🧕🏾 woman with headscarf: medium-dark skin tone
+1F9D5 1F3FF ; fully-qualified # 🧕🏿 woman with headscarf: dark skin tone
+1F935 ; fully-qualified # 🤵 man in tuxedo
+1F935 1F3FB ; fully-qualified # 🤵🏻 man in tuxedo: light skin tone
+1F935 1F3FC ; fully-qualified # 🤵🏼 man in tuxedo: medium-light skin tone
+1F935 1F3FD ; fully-qualified # 🤵🏽 man in tuxedo: medium skin tone
+1F935 1F3FE ; fully-qualified # 🤵🏾 man in tuxedo: medium-dark skin tone
+1F935 1F3FF ; fully-qualified # 🤵🏿 man in tuxedo: dark skin tone
+1F470 ; fully-qualified # 👰 bride with veil
+1F470 1F3FB ; fully-qualified # 👰🏻 bride with veil: light skin tone
+1F470 1F3FC ; fully-qualified # 👰🏼 bride with veil: medium-light skin tone
+1F470 1F3FD ; fully-qualified # 👰🏽 bride with veil: medium skin tone
+1F470 1F3FE ; fully-qualified # 👰🏾 bride with veil: medium-dark skin tone
+1F470 1F3FF ; fully-qualified # 👰🏿 bride with veil: dark skin tone
+1F930 ; fully-qualified # 🤰 pregnant woman
+1F930 1F3FB ; fully-qualified # 🤰🏻 pregnant woman: light skin tone
+1F930 1F3FC ; fully-qualified # 🤰🏼 pregnant woman: medium-light skin tone
+1F930 1F3FD ; fully-qualified # 🤰🏽 pregnant woman: medium skin tone
+1F930 1F3FE ; fully-qualified # 🤰🏾 pregnant woman: medium-dark skin tone
+1F930 1F3FF ; fully-qualified # 🤰🏿 pregnant woman: dark skin tone
+1F931 ; fully-qualified # 🤱 breast-feeding
+1F931 1F3FB ; fully-qualified # 🤱🏻 breast-feeding: light skin tone
+1F931 1F3FC ; fully-qualified # 🤱🏼 breast-feeding: medium-light skin tone
+1F931 1F3FD ; fully-qualified # 🤱🏽 breast-feeding: medium skin tone
+1F931 1F3FE ; fully-qualified # 🤱🏾 breast-feeding: medium-dark skin tone
+1F931 1F3FF ; fully-qualified # 🤱🏿 breast-feeding: dark skin tone
+
+# subgroup: person-fantasy
+1F47C ; fully-qualified # 👼 baby angel
+1F47C 1F3FB ; fully-qualified # 👼🏻 baby angel: light skin tone
+1F47C 1F3FC ; fully-qualified # 👼🏼 baby angel: medium-light skin tone
+1F47C 1F3FD ; fully-qualified # 👼🏽 baby angel: medium skin tone
+1F47C 1F3FE ; fully-qualified # 👼🏾 baby angel: medium-dark skin tone
+1F47C 1F3FF ; fully-qualified # 👼🏿 baby angel: dark skin tone
+1F385 ; fully-qualified # 🎅 Santa Claus
+1F385 1F3FB ; fully-qualified # 🎅🏻 Santa Claus: light skin tone
+1F385 1F3FC ; fully-qualified # 🎅🏼 Santa Claus: medium-light skin tone
+1F385 1F3FD ; fully-qualified # 🎅🏽 Santa Claus: medium skin tone
+1F385 1F3FE ; fully-qualified # 🎅🏾 Santa Claus: medium-dark skin tone
+1F385 1F3FF ; fully-qualified # 🎅🏿 Santa Claus: dark skin tone
+1F936 ; fully-qualified # 🤶 Mrs. Claus
+1F936 1F3FB ; fully-qualified # 🤶🏻 Mrs. Claus: light skin tone
+1F936 1F3FC ; fully-qualified # 🤶🏼 Mrs. Claus: medium-light skin tone
+1F936 1F3FD ; fully-qualified # 🤶🏽 Mrs. Claus: medium skin tone
+1F936 1F3FE ; fully-qualified # 🤶🏾 Mrs. Claus: medium-dark skin tone
+1F936 1F3FF ; fully-qualified # 🤶🏿 Mrs. Claus: dark skin tone
+1F9B8 ; fully-qualified # 🦸 superhero
+1F9B8 1F3FB ; fully-qualified # 🦸🏻 superhero: light skin tone
+1F9B8 1F3FC ; fully-qualified # 🦸🏼 superhero: medium-light skin tone
+1F9B8 1F3FD ; fully-qualified # 🦸🏽 superhero: medium skin tone
+1F9B8 1F3FE ; fully-qualified # 🦸🏾 superhero: medium-dark skin tone
+1F9B8 1F3FF ; fully-qualified # 🦸🏿 superhero: dark skin tone
+1F9B8 200D 2642 FE0F ; fully-qualified # 🦸♂️ man superhero
+1F9B8 200D 2642 ; minimally-qualified # 🦸♂ man superhero
+1F9B8 1F3FB 200D 2642 FE0F ; fully-qualified # 🦸🏻♂️ man superhero: light skin tone
+1F9B8 1F3FB 200D 2642 ; minimally-qualified # 🦸🏻♂ man superhero: light skin tone
+1F9B8 1F3FC 200D 2642 FE0F ; fully-qualified # 🦸🏼♂️ man superhero: medium-light skin tone
+1F9B8 1F3FC 200D 2642 ; minimally-qualified # 🦸🏼♂ man superhero: medium-light skin tone
+1F9B8 1F3FD 200D 2642 FE0F ; fully-qualified # 🦸🏽♂️ man superhero: medium skin tone
+1F9B8 1F3FD 200D 2642 ; minimally-qualified # 🦸🏽♂ man superhero: medium skin tone
+1F9B8 1F3FE 200D 2642 FE0F ; fully-qualified # 🦸🏾♂️ man superhero: medium-dark skin tone
+1F9B8 1F3FE 200D 2642 ; minimally-qualified # 🦸🏾♂ man superhero: medium-dark skin tone
+1F9B8 1F3FF 200D 2642 FE0F ; fully-qualified # 🦸🏿♂️ man superhero: dark skin tone
+1F9B8 1F3FF 200D 2642 ; minimally-qualified # 🦸🏿♂ man superhero: dark skin tone
+1F9B8 200D 2640 FE0F ; fully-qualified # 🦸♀️ woman superhero
+1F9B8 200D 2640 ; minimally-qualified # 🦸♀ woman superhero
+1F9B8 1F3FB 200D 2640 FE0F ; fully-qualified # 🦸🏻♀️ woman superhero: light skin tone
+1F9B8 1F3FB 200D 2640 ; minimally-qualified # 🦸🏻♀ woman superhero: light skin tone
+1F9B8 1F3FC 200D 2640 FE0F ; fully-qualified # 🦸🏼♀️ woman superhero: medium-light skin tone
+1F9B8 1F3FC 200D 2640 ; minimally-qualified # 🦸🏼♀ woman superhero: medium-light skin tone
+1F9B8 1F3FD 200D 2640 FE0F ; fully-qualified # 🦸🏽♀️ woman superhero: medium skin tone
+1F9B8 1F3FD 200D 2640 ; minimally-qualified # 🦸🏽♀ woman superhero: medium skin tone
+1F9B8 1F3FE 200D 2640 FE0F ; fully-qualified # 🦸🏾♀️ woman superhero: medium-dark skin tone
+1F9B8 1F3FE 200D 2640 ; minimally-qualified # 🦸🏾♀ woman superhero: medium-dark skin tone
+1F9B8 1F3FF 200D 2640 FE0F ; fully-qualified # 🦸🏿♀️ woman superhero: dark skin tone
+1F9B8 1F3FF 200D 2640 ; minimally-qualified # 🦸🏿♀ woman superhero: dark skin tone
+1F9B9 ; fully-qualified # 🦹 supervillain
+1F9B9 1F3FB ; fully-qualified # 🦹🏻 supervillain: light skin tone
+1F9B9 1F3FC ; fully-qualified # 🦹🏼 supervillain: medium-light skin tone
+1F9B9 1F3FD ; fully-qualified # 🦹🏽 supervillain: medium skin tone
+1F9B9 1F3FE ; fully-qualified # 🦹🏾 supervillain: medium-dark skin tone
+1F9B9 1F3FF ; fully-qualified # 🦹🏿 supervillain: dark skin tone
+1F9B9 200D 2642 FE0F ; fully-qualified # 🦹♂️ man supervillain
+1F9B9 200D 2642 ; minimally-qualified # 🦹♂ man supervillain
+1F9B9 1F3FB 200D 2642 FE0F ; fully-qualified # 🦹🏻♂️ man supervillain: light skin tone
+1F9B9 1F3FB 200D 2642 ; minimally-qualified # 🦹🏻♂ man supervillain: light skin tone
+1F9B9 1F3FC 200D 2642 FE0F ; fully-qualified # 🦹🏼♂️ man supervillain: medium-light skin tone
+1F9B9 1F3FC 200D 2642 ; minimally-qualified # 🦹🏼♂ man supervillain: medium-light skin tone
+1F9B9 1F3FD 200D 2642 FE0F ; fully-qualified # 🦹🏽♂️ man supervillain: medium skin tone
+1F9B9 1F3FD 200D 2642 ; minimally-qualified # 🦹🏽♂ man supervillain: medium skin tone
+1F9B9 1F3FE 200D 2642 FE0F ; fully-qualified # 🦹🏾♂️ man supervillain: medium-dark skin tone
+1F9B9 1F3FE 200D 2642 ; minimally-qualified # 🦹🏾♂ man supervillain: medium-dark skin tone
+1F9B9 1F3FF 200D 2642 FE0F ; fully-qualified # 🦹🏿♂️ man supervillain: dark skin tone
+1F9B9 1F3FF 200D 2642 ; minimally-qualified # 🦹🏿♂ man supervillain: dark skin tone
+1F9B9 200D 2640 FE0F ; fully-qualified # 🦹♀️ woman supervillain
+1F9B9 200D 2640 ; minimally-qualified # 🦹♀ woman supervillain
+1F9B9 1F3FB 200D 2640 FE0F ; fully-qualified # 🦹🏻♀️ woman supervillain: light skin tone
+1F9B9 1F3FB 200D 2640 ; minimally-qualified # 🦹🏻♀ woman supervillain: light skin tone
+1F9B9 1F3FC 200D 2640 FE0F ; fully-qualified # 🦹🏼♀️ woman supervillain: medium-light skin tone
+1F9B9 1F3FC 200D 2640 ; minimally-qualified # 🦹🏼♀ woman supervillain: medium-light skin tone
+1F9B9 1F3FD 200D 2640 FE0F ; fully-qualified # 🦹🏽♀️ woman supervillain: medium skin tone
+1F9B9 1F3FD 200D 2640 ; minimally-qualified # 🦹🏽♀ woman supervillain: medium skin tone
+1F9B9 1F3FE 200D 2640 FE0F ; fully-qualified # 🦹🏾♀️ woman supervillain: medium-dark skin tone
+1F9B9 1F3FE 200D 2640 ; minimally-qualified # 🦹🏾♀ woman supervillain: medium-dark skin tone
+1F9B9 1F3FF 200D 2640 FE0F ; fully-qualified # 🦹🏿♀️ woman supervillain: dark skin tone
+1F9B9 1F3FF 200D 2640 ; minimally-qualified # 🦹🏿♀ woman supervillain: dark skin tone
+1F9D9 ; fully-qualified # 🧙 mage
+1F9D9 1F3FB ; fully-qualified # 🧙🏻 mage: light skin tone
+1F9D9 1F3FC ; fully-qualified # 🧙🏼 mage: medium-light skin tone
+1F9D9 1F3FD ; fully-qualified # 🧙🏽 mage: medium skin tone
+1F9D9 1F3FE ; fully-qualified # 🧙🏾 mage: medium-dark skin tone
+1F9D9 1F3FF ; fully-qualified # 🧙🏿 mage: dark skin tone
+1F9D9 200D 2642 FE0F ; fully-qualified # 🧙♂️ man mage
+1F9D9 200D 2642 ; minimally-qualified # 🧙♂ man mage
+1F9D9 1F3FB 200D 2642 FE0F ; fully-qualified # 🧙🏻♂️ man mage: light skin tone
+1F9D9 1F3FB 200D 2642 ; minimally-qualified # 🧙🏻♂ man mage: light skin tone
+1F9D9 1F3FC 200D 2642 FE0F ; fully-qualified # 🧙🏼♂️ man mage: medium-light skin tone
+1F9D9 1F3FC 200D 2642 ; minimally-qualified # 🧙🏼♂ man mage: medium-light skin tone
+1F9D9 1F3FD 200D 2642 FE0F ; fully-qualified # 🧙🏽♂️ man mage: medium skin tone
+1F9D9 1F3FD 200D 2642 ; minimally-qualified # 🧙🏽♂ man mage: medium skin tone
+1F9D9 1F3FE 200D 2642 FE0F ; fully-qualified # 🧙🏾♂️ man mage: medium-dark skin tone
+1F9D9 1F3FE 200D 2642 ; minimally-qualified # 🧙🏾♂ man mage: medium-dark skin tone
+1F9D9 1F3FF 200D 2642 FE0F ; fully-qualified # 🧙🏿♂️ man mage: dark skin tone
+1F9D9 1F3FF 200D 2642 ; minimally-qualified # 🧙🏿♂ man mage: dark skin tone
+1F9D9 200D 2640 FE0F ; fully-qualified # 🧙♀️ woman mage
+1F9D9 200D 2640 ; minimally-qualified # 🧙♀ woman mage
+1F9D9 1F3FB 200D 2640 FE0F ; fully-qualified # 🧙🏻♀️ woman mage: light skin tone
+1F9D9 1F3FB 200D 2640 ; minimally-qualified # 🧙🏻♀ woman mage: light skin tone
+1F9D9 1F3FC 200D 2640 FE0F ; fully-qualified # 🧙🏼♀️ woman mage: medium-light skin tone
+1F9D9 1F3FC 200D 2640 ; minimally-qualified # 🧙🏼♀ woman mage: medium-light skin tone
+1F9D9 1F3FD 200D 2640 FE0F ; fully-qualified # 🧙🏽♀️ woman mage: medium skin tone
+1F9D9 1F3FD 200D 2640 ; minimally-qualified # 🧙🏽♀ woman mage: medium skin tone
+1F9D9 1F3FE 200D 2640 FE0F ; fully-qualified # 🧙🏾♀️ woman mage: medium-dark skin tone
+1F9D9 1F3FE 200D 2640 ; minimally-qualified # 🧙🏾♀ woman mage: medium-dark skin tone
+1F9D9 1F3FF 200D 2640 FE0F ; fully-qualified # 🧙🏿♀️ woman mage: dark skin tone
+1F9D9 1F3FF 200D 2640 ; minimally-qualified # 🧙🏿♀ woman mage: dark skin tone
+1F9DA ; fully-qualified # 🧚 fairy
+1F9DA 1F3FB ; fully-qualified # 🧚🏻 fairy: light skin tone
+1F9DA 1F3FC ; fully-qualified # 🧚🏼 fairy: medium-light skin tone
+1F9DA 1F3FD ; fully-qualified # 🧚🏽 fairy: medium skin tone
+1F9DA 1F3FE ; fully-qualified # 🧚🏾 fairy: medium-dark skin tone
+1F9DA 1F3FF ; fully-qualified # 🧚🏿 fairy: dark skin tone
+1F9DA 200D 2642 FE0F ; fully-qualified # 🧚♂️ man fairy
+1F9DA 200D 2642 ; minimally-qualified # 🧚♂ man fairy
+1F9DA 1F3FB 200D 2642 FE0F ; fully-qualified # 🧚🏻♂️ man fairy: light skin tone
+1F9DA 1F3FB 200D 2642 ; minimally-qualified # 🧚🏻♂ man fairy: light skin tone
+1F9DA 1F3FC 200D 2642 FE0F ; fully-qualified # 🧚🏼♂️ man fairy: medium-light skin tone
+1F9DA 1F3FC 200D 2642 ; minimally-qualified # 🧚🏼♂ man fairy: medium-light skin tone
+1F9DA 1F3FD 200D 2642 FE0F ; fully-qualified # 🧚🏽♂️ man fairy: medium skin tone
+1F9DA 1F3FD 200D 2642 ; minimally-qualified # 🧚🏽♂ man fairy: medium skin tone
+1F9DA 1F3FE 200D 2642 FE0F ; fully-qualified # 🧚🏾♂️ man fairy: medium-dark skin tone
+1F9DA 1F3FE 200D 2642 ; minimally-qualified # 🧚🏾♂ man fairy: medium-dark skin tone
+1F9DA 1F3FF 200D 2642 FE0F ; fully-qualified # 🧚🏿♂️ man fairy: dark skin tone
+1F9DA 1F3FF 200D 2642 ; minimally-qualified # 🧚🏿♂ man fairy: dark skin tone
+1F9DA 200D 2640 FE0F ; fully-qualified # 🧚♀️ woman fairy
+1F9DA 200D 2640 ; minimally-qualified # 🧚♀ woman fairy
+1F9DA 1F3FB 200D 2640 FE0F ; fully-qualified # 🧚🏻♀️ woman fairy: light skin tone
+1F9DA 1F3FB 200D 2640 ; minimally-qualified # 🧚🏻♀ woman fairy: light skin tone
+1F9DA 1F3FC 200D 2640 FE0F ; fully-qualified # 🧚🏼♀️ woman fairy: medium-light skin tone
+1F9DA 1F3FC 200D 2640 ; minimally-qualified # 🧚🏼♀ woman fairy: medium-light skin tone
+1F9DA 1F3FD 200D 2640 FE0F ; fully-qualified # 🧚🏽♀️ woman fairy: medium skin tone
+1F9DA 1F3FD 200D 2640 ; minimally-qualified # 🧚🏽♀ woman fairy: medium skin tone
+1F9DA 1F3FE 200D 2640 FE0F ; fully-qualified # 🧚🏾♀️ woman fairy: medium-dark skin tone
+1F9DA 1F3FE 200D 2640 ; minimally-qualified # 🧚🏾♀ woman fairy: medium-dark skin tone
+1F9DA 1F3FF 200D 2640 FE0F ; fully-qualified # 🧚🏿♀️ woman fairy: dark skin tone
+1F9DA 1F3FF 200D 2640 ; minimally-qualified # 🧚🏿♀ woman fairy: dark skin tone
+1F9DB ; fully-qualified # 🧛 vampire
+1F9DB 1F3FB ; fully-qualified # 🧛🏻 vampire: light skin tone
+1F9DB 1F3FC ; fully-qualified # 🧛🏼 vampire: medium-light skin tone
+1F9DB 1F3FD ; fully-qualified # 🧛🏽 vampire: medium skin tone
+1F9DB 1F3FE ; fully-qualified # 🧛🏾 vampire: medium-dark skin tone
+1F9DB 1F3FF ; fully-qualified # 🧛🏿 vampire: dark skin tone
+1F9DB 200D 2642 FE0F ; fully-qualified # 🧛♂️ man vampire
+1F9DB 200D 2642 ; minimally-qualified # 🧛♂ man vampire
+1F9DB 1F3FB 200D 2642 FE0F ; fully-qualified # 🧛🏻♂️ man vampire: light skin tone
+1F9DB 1F3FB 200D 2642 ; minimally-qualified # 🧛🏻♂ man vampire: light skin tone
+1F9DB 1F3FC 200D 2642 FE0F ; fully-qualified # 🧛🏼♂️ man vampire: medium-light skin tone
+1F9DB 1F3FC 200D 2642 ; minimally-qualified # 🧛🏼♂ man vampire: medium-light skin tone
+1F9DB 1F3FD 200D 2642 FE0F ; fully-qualified # 🧛🏽♂️ man vampire: medium skin tone
+1F9DB 1F3FD 200D 2642 ; minimally-qualified # 🧛🏽♂ man vampire: medium skin tone
+1F9DB 1F3FE 200D 2642 FE0F ; fully-qualified # 🧛🏾♂️ man vampire: medium-dark skin tone
+1F9DB 1F3FE 200D 2642 ; minimally-qualified # 🧛🏾♂ man vampire: medium-dark skin tone
+1F9DB 1F3FF 200D 2642 FE0F ; fully-qualified # 🧛🏿♂️ man vampire: dark skin tone
+1F9DB 1F3FF 200D 2642 ; minimally-qualified # 🧛🏿♂ man vampire: dark skin tone
+1F9DB 200D 2640 FE0F ; fully-qualified # 🧛♀️ woman vampire
+1F9DB 200D 2640 ; minimally-qualified # 🧛♀ woman vampire
+1F9DB 1F3FB 200D 2640 FE0F ; fully-qualified # 🧛🏻♀️ woman vampire: light skin tone
+1F9DB 1F3FB 200D 2640 ; minimally-qualified # 🧛🏻♀ woman vampire: light skin tone
+1F9DB 1F3FC 200D 2640 FE0F ; fully-qualified # 🧛🏼♀️ woman vampire: medium-light skin tone
+1F9DB 1F3FC 200D 2640 ; minimally-qualified # 🧛🏼♀ woman vampire: medium-light skin tone
+1F9DB 1F3FD 200D 2640 FE0F ; fully-qualified # 🧛🏽♀️ woman vampire: medium skin tone
+1F9DB 1F3FD 200D 2640 ; minimally-qualified # 🧛🏽♀ woman vampire: medium skin tone
+1F9DB 1F3FE 200D 2640 FE0F ; fully-qualified # 🧛🏾♀️ woman vampire: medium-dark skin tone
+1F9DB 1F3FE 200D 2640 ; minimally-qualified # 🧛🏾♀ woman vampire: medium-dark skin tone
+1F9DB 1F3FF 200D 2640 FE0F ; fully-qualified # 🧛🏿♀️ woman vampire: dark skin tone
+1F9DB 1F3FF 200D 2640 ; minimally-qualified # 🧛🏿♀ woman vampire: dark skin tone
+1F9DC ; fully-qualified # 🧜 merperson
+1F9DC 1F3FB ; fully-qualified # 🧜🏻 merperson: light skin tone
+1F9DC 1F3FC ; fully-qualified # 🧜🏼 merperson: medium-light skin tone
+1F9DC 1F3FD ; fully-qualified # 🧜🏽 merperson: medium skin tone
+1F9DC 1F3FE ; fully-qualified # 🧜🏾 merperson: medium-dark skin tone
+1F9DC 1F3FF ; fully-qualified # 🧜🏿 merperson: dark skin tone
+1F9DC 200D 2642 FE0F ; fully-qualified # 🧜♂️ merman
+1F9DC 200D 2642 ; minimally-qualified # 🧜♂ merman
+1F9DC 1F3FB 200D 2642 FE0F ; fully-qualified # 🧜🏻♂️ merman: light skin tone
+1F9DC 1F3FB 200D 2642 ; minimally-qualified # 🧜🏻♂ merman: light skin tone
+1F9DC 1F3FC 200D 2642 FE0F ; fully-qualified # 🧜🏼♂️ merman: medium-light skin tone
+1F9DC 1F3FC 200D 2642 ; minimally-qualified # 🧜🏼♂ merman: medium-light skin tone
+1F9DC 1F3FD 200D 2642 FE0F ; fully-qualified # 🧜🏽♂️ merman: medium skin tone
+1F9DC 1F3FD 200D 2642 ; minimally-qualified # 🧜🏽♂ merman: medium skin tone
+1F9DC 1F3FE 200D 2642 FE0F ; fully-qualified # 🧜🏾♂️ merman: medium-dark skin tone
+1F9DC 1F3FE 200D 2642 ; minimally-qualified # 🧜🏾♂ merman: medium-dark skin tone
+1F9DC 1F3FF 200D 2642 FE0F ; fully-qualified # 🧜🏿♂️ merman: dark skin tone
+1F9DC 1F3FF 200D 2642 ; minimally-qualified # 🧜🏿♂ merman: dark skin tone
+1F9DC 200D 2640 FE0F ; fully-qualified # 🧜♀️ mermaid
+1F9DC 200D 2640 ; minimally-qualified # 🧜♀ mermaid
+1F9DC 1F3FB 200D 2640 FE0F ; fully-qualified # 🧜🏻♀️ mermaid: light skin tone
+1F9DC 1F3FB 200D 2640 ; minimally-qualified # 🧜🏻♀ mermaid: light skin tone
+1F9DC 1F3FC 200D 2640 FE0F ; fully-qualified # 🧜🏼♀️ mermaid: medium-light skin tone
+1F9DC 1F3FC 200D 2640 ; minimally-qualified # 🧜🏼♀ mermaid: medium-light skin tone
+1F9DC 1F3FD 200D 2640 FE0F ; fully-qualified # 🧜🏽♀️ mermaid: medium skin tone
+1F9DC 1F3FD 200D 2640 ; minimally-qualified # 🧜🏽♀ mermaid: medium skin tone
+1F9DC 1F3FE 200D 2640 FE0F ; fully-qualified # 🧜🏾♀️ mermaid: medium-dark skin tone
+1F9DC 1F3FE 200D 2640 ; minimally-qualified # 🧜🏾♀ mermaid: medium-dark skin tone
+1F9DC 1F3FF 200D 2640 FE0F ; fully-qualified # 🧜🏿♀️ mermaid: dark skin tone
+1F9DC 1F3FF 200D 2640 ; minimally-qualified # 🧜🏿♀ mermaid: dark skin tone
+1F9DD ; fully-qualified # 🧝 elf
+1F9DD 1F3FB ; fully-qualified # 🧝🏻 elf: light skin tone
+1F9DD 1F3FC ; fully-qualified # 🧝🏼 elf: medium-light skin tone
+1F9DD 1F3FD ; fully-qualified # 🧝🏽 elf: medium skin tone
+1F9DD 1F3FE ; fully-qualified # 🧝🏾 elf: medium-dark skin tone
+1F9DD 1F3FF ; fully-qualified # 🧝🏿 elf: dark skin tone
+1F9DD 200D 2642 FE0F ; fully-qualified # 🧝♂️ man elf
+1F9DD 200D 2642 ; minimally-qualified # 🧝♂ man elf
+1F9DD 1F3FB 200D 2642 FE0F ; fully-qualified # 🧝🏻♂️ man elf: light skin tone
+1F9DD 1F3FB 200D 2642 ; minimally-qualified # 🧝🏻♂ man elf: light skin tone
+1F9DD 1F3FC 200D 2642 FE0F ; fully-qualified # 🧝🏼♂️ man elf: medium-light skin tone
+1F9DD 1F3FC 200D 2642 ; minimally-qualified # 🧝🏼♂ man elf: medium-light skin tone
+1F9DD 1F3FD 200D 2642 FE0F ; fully-qualified # 🧝🏽♂️ man elf: medium skin tone
+1F9DD 1F3FD 200D 2642 ; minimally-qualified # 🧝🏽♂ man elf: medium skin tone
+1F9DD 1F3FE 200D 2642 FE0F ; fully-qualified # 🧝🏾♂️ man elf: medium-dark skin tone
+1F9DD 1F3FE 200D 2642 ; minimally-qualified # 🧝🏾♂ man elf: medium-dark skin tone
+1F9DD 1F3FF 200D 2642 FE0F ; fully-qualified # 🧝🏿♂️ man elf: dark skin tone
+1F9DD 1F3FF 200D 2642 ; minimally-qualified # 🧝🏿♂ man elf: dark skin tone
+1F9DD 200D 2640 FE0F ; fully-qualified # 🧝♀️ woman elf
+1F9DD 200D 2640 ; minimally-qualified # 🧝♀ woman elf
+1F9DD 1F3FB 200D 2640 FE0F ; fully-qualified # 🧝🏻♀️ woman elf: light skin tone
+1F9DD 1F3FB 200D 2640 ; minimally-qualified # 🧝🏻♀ woman elf: light skin tone
+1F9DD 1F3FC 200D 2640 FE0F ; fully-qualified # 🧝🏼♀️ woman elf: medium-light skin tone
+1F9DD 1F3FC 200D 2640 ; minimally-qualified # 🧝🏼♀ woman elf: medium-light skin tone
+1F9DD 1F3FD 200D 2640 FE0F ; fully-qualified # 🧝🏽♀️ woman elf: medium skin tone
+1F9DD 1F3FD 200D 2640 ; minimally-qualified # 🧝🏽♀ woman elf: medium skin tone
+1F9DD 1F3FE 200D 2640 FE0F ; fully-qualified # 🧝🏾♀️ woman elf: medium-dark skin tone
+1F9DD 1F3FE 200D 2640 ; minimally-qualified # 🧝🏾♀ woman elf: medium-dark skin tone
+1F9DD 1F3FF 200D 2640 FE0F ; fully-qualified # 🧝🏿♀️ woman elf: dark skin tone
+1F9DD 1F3FF 200D 2640 ; minimally-qualified # 🧝🏿♀ woman elf: dark skin tone
+1F9DE ; fully-qualified # 🧞 genie
+1F9DE 200D 2642 FE0F ; fully-qualified # 🧞♂️ man genie
+1F9DE 200D 2642 ; minimally-qualified # 🧞♂ man genie
+1F9DE 200D 2640 FE0F ; fully-qualified # 🧞♀️ woman genie
+1F9DE 200D 2640 ; minimally-qualified # 🧞♀ woman genie
+1F9DF ; fully-qualified # 🧟 zombie
+1F9DF 200D 2642 FE0F ; fully-qualified # 🧟♂️ man zombie
+1F9DF 200D 2642 ; minimally-qualified # 🧟♂ man zombie
+1F9DF 200D 2640 FE0F ; fully-qualified # 🧟♀️ woman zombie
+1F9DF 200D 2640 ; minimally-qualified # 🧟♀ woman zombie
+
+# subgroup: person-activity
+1F486 ; fully-qualified # 💆 person getting massage
+1F486 1F3FB ; fully-qualified # 💆🏻 person getting massage: light skin tone
+1F486 1F3FC ; fully-qualified # 💆🏼 person getting massage: medium-light skin tone
+1F486 1F3FD ; fully-qualified # 💆🏽 person getting massage: medium skin tone
+1F486 1F3FE ; fully-qualified # 💆🏾 person getting massage: medium-dark skin tone
+1F486 1F3FF ; fully-qualified # 💆🏿 person getting massage: dark skin tone
+1F486 200D 2642 FE0F ; fully-qualified # 💆♂️ man getting massage
+1F486 200D 2642 ; minimally-qualified # 💆♂ man getting massage
+1F486 1F3FB 200D 2642 FE0F ; fully-qualified # 💆🏻♂️ man getting massage: light skin tone
+1F486 1F3FB 200D 2642 ; minimally-qualified # 💆🏻♂ man getting massage: light skin tone
+1F486 1F3FC 200D 2642 FE0F ; fully-qualified # 💆🏼♂️ man getting massage: medium-light skin tone
+1F486 1F3FC 200D 2642 ; minimally-qualified # 💆🏼♂ man getting massage: medium-light skin tone
+1F486 1F3FD 200D 2642 FE0F ; fully-qualified # 💆🏽♂️ man getting massage: medium skin tone
+1F486 1F3FD 200D 2642 ; minimally-qualified # 💆🏽♂ man getting massage: medium skin tone
+1F486 1F3FE 200D 2642 FE0F ; fully-qualified # 💆🏾♂️ man getting massage: medium-dark skin tone
+1F486 1F3FE 200D 2642 ; minimally-qualified # 💆🏾♂ man getting massage: medium-dark skin tone
+1F486 1F3FF 200D 2642 FE0F ; fully-qualified # 💆🏿♂️ man getting massage: dark skin tone
+1F486 1F3FF 200D 2642 ; minimally-qualified # 💆🏿♂ man getting massage: dark skin tone
+1F486 200D 2640 FE0F ; fully-qualified # 💆♀️ woman getting massage
+1F486 200D 2640 ; minimally-qualified # 💆♀ woman getting massage
+1F486 1F3FB 200D 2640 FE0F ; fully-qualified # 💆🏻♀️ woman getting massage: light skin tone
+1F486 1F3FB 200D 2640 ; minimally-qualified # 💆🏻♀ woman getting massage: light skin tone
+1F486 1F3FC 200D 2640 FE0F ; fully-qualified # 💆🏼♀️ woman getting massage: medium-light skin tone
+1F486 1F3FC 200D 2640 ; minimally-qualified # 💆🏼♀ woman getting massage: medium-light skin tone
+1F486 1F3FD 200D 2640 FE0F ; fully-qualified # 💆🏽♀️ woman getting massage: medium skin tone
+1F486 1F3FD 200D 2640 ; minimally-qualified # 💆🏽♀ woman getting massage: medium skin tone
+1F486 1F3FE 200D 2640 FE0F ; fully-qualified # 💆🏾♀️ woman getting massage: medium-dark skin tone
+1F486 1F3FE 200D 2640 ; minimally-qualified # 💆🏾♀ woman getting massage: medium-dark skin tone
+1F486 1F3FF 200D 2640 FE0F ; fully-qualified # 💆🏿♀️ woman getting massage: dark skin tone
+1F486 1F3FF 200D 2640 ; minimally-qualified # 💆🏿♀ woman getting massage: dark skin tone
+1F487 ; fully-qualified # 💇 person getting haircut
+1F487 1F3FB ; fully-qualified # 💇🏻 person getting haircut: light skin tone
+1F487 1F3FC ; fully-qualified # 💇🏼 person getting haircut: medium-light skin tone
+1F487 1F3FD ; fully-qualified # 💇🏽 person getting haircut: medium skin tone
+1F487 1F3FE ; fully-qualified # 💇🏾 person getting haircut: medium-dark skin tone
+1F487 1F3FF ; fully-qualified # 💇🏿 person getting haircut: dark skin tone
+1F487 200D 2642 FE0F ; fully-qualified # 💇♂️ man getting haircut
+1F487 200D 2642 ; minimally-qualified # 💇♂ man getting haircut
+1F487 1F3FB 200D 2642 FE0F ; fully-qualified # 💇🏻♂️ man getting haircut: light skin tone
+1F487 1F3FB 200D 2642 ; minimally-qualified # 💇🏻♂ man getting haircut: light skin tone
+1F487 1F3FC 200D 2642 FE0F ; fully-qualified # 💇🏼♂️ man getting haircut: medium-light skin tone
+1F487 1F3FC 200D 2642 ; minimally-qualified # 💇🏼♂ man getting haircut: medium-light skin tone
+1F487 1F3FD 200D 2642 FE0F ; fully-qualified # 💇🏽♂️ man getting haircut: medium skin tone
+1F487 1F3FD 200D 2642 ; minimally-qualified # 💇🏽♂ man getting haircut: medium skin tone
+1F487 1F3FE 200D 2642 FE0F ; fully-qualified # 💇🏾♂️ man getting haircut: medium-dark skin tone
+1F487 1F3FE 200D 2642 ; minimally-qualified # 💇🏾♂ man getting haircut: medium-dark skin tone
+1F487 1F3FF 200D 2642 FE0F ; fully-qualified # 💇🏿♂️ man getting haircut: dark skin tone
+1F487 1F3FF 200D 2642 ; minimally-qualified # 💇🏿♂ man getting haircut: dark skin tone
+1F487 200D 2640 FE0F ; fully-qualified # 💇♀️ woman getting haircut
+1F487 200D 2640 ; minimally-qualified # 💇♀ woman getting haircut
+1F487 1F3FB 200D 2640 FE0F ; fully-qualified # 💇🏻♀️ woman getting haircut: light skin tone
+1F487 1F3FB 200D 2640 ; minimally-qualified # 💇🏻♀ woman getting haircut: light skin tone
+1F487 1F3FC 200D 2640 FE0F ; fully-qualified # 💇🏼♀️ woman getting haircut: medium-light skin tone
+1F487 1F3FC 200D 2640 ; minimally-qualified # 💇🏼♀ woman getting haircut: medium-light skin tone
+1F487 1F3FD 200D 2640 FE0F ; fully-qualified # 💇🏽♀️ woman getting haircut: medium skin tone
+1F487 1F3FD 200D 2640 ; minimally-qualified # 💇🏽♀ woman getting haircut: medium skin tone
+1F487 1F3FE 200D 2640 FE0F ; fully-qualified # 💇🏾♀️ woman getting haircut: medium-dark skin tone
+1F487 1F3FE 200D 2640 ; minimally-qualified # 💇🏾♀ woman getting haircut: medium-dark skin tone
+1F487 1F3FF 200D 2640 FE0F ; fully-qualified # 💇🏿♀️ woman getting haircut: dark skin tone
+1F487 1F3FF 200D 2640 ; minimally-qualified # 💇🏿♀ woman getting haircut: dark skin tone
+1F6B6 ; fully-qualified # 🚶 person walking
+1F6B6 1F3FB ; fully-qualified # 🚶🏻 person walking: light skin tone
+1F6B6 1F3FC ; fully-qualified # 🚶🏼 person walking: medium-light skin tone
+1F6B6 1F3FD ; fully-qualified # 🚶🏽 person walking: medium skin tone
+1F6B6 1F3FE ; fully-qualified # 🚶🏾 person walking: medium-dark skin tone
+1F6B6 1F3FF ; fully-qualified # 🚶🏿 person walking: dark skin tone
+1F6B6 200D 2642 FE0F ; fully-qualified # 🚶♂️ man walking
+1F6B6 200D 2642 ; minimally-qualified # 🚶♂ man walking
+1F6B6 1F3FB 200D 2642 FE0F ; fully-qualified # 🚶🏻♂️ man walking: light skin tone
+1F6B6 1F3FB 200D 2642 ; minimally-qualified # 🚶🏻♂ man walking: light skin tone
+1F6B6 1F3FC 200D 2642 FE0F ; fully-qualified # 🚶🏼♂️ man walking: medium-light skin tone
+1F6B6 1F3FC 200D 2642 ; minimally-qualified # 🚶🏼♂ man walking: medium-light skin tone
+1F6B6 1F3FD 200D 2642 FE0F ; fully-qualified # 🚶🏽♂️ man walking: medium skin tone
+1F6B6 1F3FD 200D 2642 ; minimally-qualified # 🚶🏽♂ man walking: medium skin tone
+1F6B6 1F3FE 200D 2642 FE0F ; fully-qualified # 🚶🏾♂️ man walking: medium-dark skin tone
+1F6B6 1F3FE 200D 2642 ; minimally-qualified # 🚶🏾♂ man walking: medium-dark skin tone
+1F6B6 1F3FF 200D 2642 FE0F ; fully-qualified # 🚶🏿♂️ man walking: dark skin tone
+1F6B6 1F3FF 200D 2642 ; minimally-qualified # 🚶🏿♂ man walking: dark skin tone
+1F6B6 200D 2640 FE0F ; fully-qualified # 🚶♀️ woman walking
+1F6B6 200D 2640 ; minimally-qualified # 🚶♀ woman walking
+1F6B6 1F3FB 200D 2640 FE0F ; fully-qualified # 🚶🏻♀️ woman walking: light skin tone
+1F6B6 1F3FB 200D 2640 ; minimally-qualified # 🚶🏻♀ woman walking: light skin tone
+1F6B6 1F3FC 200D 2640 FE0F ; fully-qualified # 🚶🏼♀️ woman walking: medium-light skin tone
+1F6B6 1F3FC 200D 2640 ; minimally-qualified # 🚶🏼♀ woman walking: medium-light skin tone
+1F6B6 1F3FD 200D 2640 FE0F ; fully-qualified # 🚶🏽♀️ woman walking: medium skin tone
+1F6B6 1F3FD 200D 2640 ; minimally-qualified # 🚶🏽♀ woman walking: medium skin tone
+1F6B6 1F3FE 200D 2640 FE0F ; fully-qualified # 🚶🏾♀️ woman walking: medium-dark skin tone
+1F6B6 1F3FE 200D 2640 ; minimally-qualified # 🚶🏾♀ woman walking: medium-dark skin tone
+1F6B6 1F3FF 200D 2640 FE0F ; fully-qualified # 🚶🏿♀️ woman walking: dark skin tone
+1F6B6 1F3FF 200D 2640 ; minimally-qualified # 🚶🏿♀ woman walking: dark skin tone
+1F9CD ; fully-qualified # 🧍 person standing
+1F9CD 1F3FB ; fully-qualified # 🧍🏻 person standing: light skin tone
+1F9CD 1F3FC ; fully-qualified # 🧍🏼 person standing: medium-light skin tone
+1F9CD 1F3FD ; fully-qualified # 🧍🏽 person standing: medium skin tone
+1F9CD 1F3FE ; fully-qualified # 🧍🏾 person standing: medium-dark skin tone
+1F9CD 1F3FF ; fully-qualified # 🧍🏿 person standing: dark skin tone
+1F9CD 200D 2642 FE0F ; fully-qualified # 🧍♂️ man standing
+1F9CD 200D 2642 ; minimally-qualified # 🧍♂ man standing
+1F9CD 1F3FB 200D 2642 FE0F ; fully-qualified # 🧍🏻♂️ man standing: light skin tone
+1F9CD 1F3FB 200D 2642 ; minimally-qualified # 🧍🏻♂ man standing: light skin tone
+1F9CD 1F3FC 200D 2642 FE0F ; fully-qualified # 🧍🏼♂️ man standing: medium-light skin tone
+1F9CD 1F3FC 200D 2642 ; minimally-qualified # 🧍🏼♂ man standing: medium-light skin tone
+1F9CD 1F3FD 200D 2642 FE0F ; fully-qualified # 🧍🏽♂️ man standing: medium skin tone
+1F9CD 1F3FD 200D 2642 ; minimally-qualified # 🧍🏽♂ man standing: medium skin tone
+1F9CD 1F3FE 200D 2642 FE0F ; fully-qualified # 🧍🏾♂️ man standing: medium-dark skin tone
+1F9CD 1F3FE 200D 2642 ; minimally-qualified # 🧍🏾♂ man standing: medium-dark skin tone
+1F9CD 1F3FF 200D 2642 FE0F ; fully-qualified # 🧍🏿♂️ man standing: dark skin tone
+1F9CD 1F3FF 200D 2642 ; minimally-qualified # 🧍🏿♂ man standing: dark skin tone
+1F9CD 200D 2640 FE0F ; fully-qualified # 🧍♀️ woman standing
+1F9CD 200D 2640 ; minimally-qualified # 🧍♀ woman standing
+1F9CD 1F3FB 200D 2640 FE0F ; fully-qualified # 🧍🏻♀️ woman standing: light skin tone
+1F9CD 1F3FB 200D 2640 ; minimally-qualified # 🧍🏻♀ woman standing: light skin tone
+1F9CD 1F3FC 200D 2640 FE0F ; fully-qualified # 🧍🏼♀️ woman standing: medium-light skin tone
+1F9CD 1F3FC 200D 2640 ; minimally-qualified # 🧍🏼♀ woman standing: medium-light skin tone
+1F9CD 1F3FD 200D 2640 FE0F ; fully-qualified # 🧍🏽♀️ woman standing: medium skin tone
+1F9CD 1F3FD 200D 2640 ; minimally-qualified # 🧍🏽♀ woman standing: medium skin tone
+1F9CD 1F3FE 200D 2640 FE0F ; fully-qualified # 🧍🏾♀️ woman standing: medium-dark skin tone
+1F9CD 1F3FE 200D 2640 ; minimally-qualified # 🧍🏾♀ woman standing: medium-dark skin tone
+1F9CD 1F3FF 200D 2640 FE0F ; fully-qualified # 🧍🏿♀️ woman standing: dark skin tone
+1F9CD 1F3FF 200D 2640 ; minimally-qualified # 🧍🏿♀ woman standing: dark skin tone
+1F9CE ; fully-qualified # 🧎 person kneeling
+1F9CE 1F3FB ; fully-qualified # 🧎🏻 person kneeling: light skin tone
+1F9CE 1F3FC ; fully-qualified # 🧎🏼 person kneeling: medium-light skin tone
+1F9CE 1F3FD ; fully-qualified # 🧎🏽 person kneeling: medium skin tone
+1F9CE 1F3FE ; fully-qualified # 🧎🏾 person kneeling: medium-dark skin tone
+1F9CE 1F3FF ; fully-qualified # 🧎🏿 person kneeling: dark skin tone
+1F9CE 200D 2642 FE0F ; fully-qualified # 🧎♂️ man kneeling
+1F9CE 200D 2642 ; minimally-qualified # 🧎♂ man kneeling
+1F9CE 1F3FB 200D 2642 FE0F ; fully-qualified # 🧎🏻♂️ man kneeling: light skin tone
+1F9CE 1F3FB 200D 2642 ; minimally-qualified # 🧎🏻♂ man kneeling: light skin tone
+1F9CE 1F3FC 200D 2642 FE0F ; fully-qualified # 🧎🏼♂️ man kneeling: medium-light skin tone
+1F9CE 1F3FC 200D 2642 ; minimally-qualified # 🧎🏼♂ man kneeling: medium-light skin tone
+1F9CE 1F3FD 200D 2642 FE0F ; fully-qualified # 🧎🏽♂️ man kneeling: medium skin tone
+1F9CE 1F3FD 200D 2642 ; minimally-qualified # 🧎🏽♂ man kneeling: medium skin tone
+1F9CE 1F3FE 200D 2642 FE0F ; fully-qualified # 🧎🏾♂️ man kneeling: medium-dark skin tone
+1F9CE 1F3FE 200D 2642 ; minimally-qualified # 🧎🏾♂ man kneeling: medium-dark skin tone
+1F9CE 1F3FF 200D 2642 FE0F ; fully-qualified # 🧎🏿♂️ man kneeling: dark skin tone
+1F9CE 1F3FF 200D 2642 ; minimally-qualified # 🧎🏿♂ man kneeling: dark skin tone
+1F9CE 200D 2640 FE0F ; fully-qualified # 🧎♀️ woman kneeling
+1F9CE 200D 2640 ; minimally-qualified # 🧎♀ woman kneeling
+1F9CE 1F3FB 200D 2640 FE0F ; fully-qualified # 🧎🏻♀️ woman kneeling: light skin tone
+1F9CE 1F3FB 200D 2640 ; minimally-qualified # 🧎🏻♀ woman kneeling: light skin tone
+1F9CE 1F3FC 200D 2640 FE0F ; fully-qualified # 🧎🏼♀️ woman kneeling: medium-light skin tone
+1F9CE 1F3FC 200D 2640 ; minimally-qualified # 🧎🏼♀ woman kneeling: medium-light skin tone
+1F9CE 1F3FD 200D 2640 FE0F ; fully-qualified # 🧎🏽♀️ woman kneeling: medium skin tone
+1F9CE 1F3FD 200D 2640 ; minimally-qualified # 🧎🏽♀ woman kneeling: medium skin tone
+1F9CE 1F3FE 200D 2640 FE0F ; fully-qualified # 🧎🏾♀️ woman kneeling: medium-dark skin tone
+1F9CE 1F3FE 200D 2640 ; minimally-qualified # 🧎🏾♀ woman kneeling: medium-dark skin tone
+1F9CE 1F3FF 200D 2640 FE0F ; fully-qualified # 🧎🏿♀️ woman kneeling: dark skin tone
+1F9CE 1F3FF 200D 2640 ; minimally-qualified # 🧎🏿♀ woman kneeling: dark skin tone
+1F468 200D 1F9AF ; fully-qualified # 👨🦯 man with probing cane
+1F468 1F3FB 200D 1F9AF ; fully-qualified # 👨🏻🦯 man with probing cane: light skin tone
+1F468 1F3FC 200D 1F9AF ; fully-qualified # 👨🏼🦯 man with probing cane: medium-light skin tone
+1F468 1F3FD 200D 1F9AF ; fully-qualified # 👨🏽🦯 man with probing cane: medium skin tone
+1F468 1F3FE 200D 1F9AF ; fully-qualified # 👨🏾🦯 man with probing cane: medium-dark skin tone
+1F468 1F3FF 200D 1F9AF ; fully-qualified # 👨🏿🦯 man with probing cane: dark skin tone
+1F469 200D 1F9AF ; fully-qualified # 👩🦯 woman with probing cane
+1F469 1F3FB 200D 1F9AF ; fully-qualified # 👩🏻🦯 woman with probing cane: light skin tone
+1F469 1F3FC 200D 1F9AF ; fully-qualified # 👩🏼🦯 woman with probing cane: medium-light skin tone
+1F469 1F3FD 200D 1F9AF ; fully-qualified # 👩🏽🦯 woman with probing cane: medium skin tone
+1F469 1F3FE 200D 1F9AF ; fully-qualified # 👩🏾🦯 woman with probing cane: medium-dark skin tone
+1F469 1F3FF 200D 1F9AF ; fully-qualified # 👩🏿🦯 woman with probing cane: dark skin tone
+1F468 200D 1F9BC ; fully-qualified # 👨🦼 man in motorized wheelchair
+1F468 1F3FB 200D 1F9BC ; fully-qualified # 👨🏻🦼 man in motorized wheelchair: light skin tone
+1F468 1F3FC 200D 1F9BC ; fully-qualified # 👨🏼🦼 man in motorized wheelchair: medium-light skin tone
+1F468 1F3FD 200D 1F9BC ; fully-qualified # 👨🏽🦼 man in motorized wheelchair: medium skin tone
+1F468 1F3FE 200D 1F9BC ; fully-qualified # 👨🏾🦼 man in motorized wheelchair: medium-dark skin tone
+1F468 1F3FF 200D 1F9BC ; fully-qualified # 👨🏿🦼 man in motorized wheelchair: dark skin tone
+1F469 200D 1F9BC ; fully-qualified # 👩🦼 woman in motorized wheelchair
+1F469 1F3FB 200D 1F9BC ; fully-qualified # 👩🏻🦼 woman in motorized wheelchair: light skin tone
+1F469 1F3FC 200D 1F9BC ; fully-qualified # 👩🏼🦼 woman in motorized wheelchair: medium-light skin tone
+1F469 1F3FD 200D 1F9BC ; fully-qualified # 👩🏽🦼 woman in motorized wheelchair: medium skin tone
+1F469 1F3FE 200D 1F9BC ; fully-qualified # 👩🏾🦼 woman in motorized wheelchair: medium-dark skin tone
+1F469 1F3FF 200D 1F9BC ; fully-qualified # 👩🏿🦼 woman in motorized wheelchair: dark skin tone
+1F468 200D 1F9BD ; fully-qualified # 👨🦽 man in manual wheelchair
+1F468 1F3FB 200D 1F9BD ; fully-qualified # 👨🏻🦽 man in manual wheelchair: light skin tone
+1F468 1F3FC 200D 1F9BD ; fully-qualified # 👨🏼🦽 man in manual wheelchair: medium-light skin tone
+1F468 1F3FD 200D 1F9BD ; fully-qualified # 👨🏽🦽 man in manual wheelchair: medium skin tone
+1F468 1F3FE 200D 1F9BD ; fully-qualified # 👨🏾🦽 man in manual wheelchair: medium-dark skin tone
+1F468 1F3FF 200D 1F9BD ; fully-qualified # 👨🏿🦽 man in manual wheelchair: dark skin tone
+1F469 200D 1F9BD ; fully-qualified # 👩🦽 woman in manual wheelchair
+1F469 1F3FB 200D 1F9BD ; fully-qualified # 👩🏻🦽 woman in manual wheelchair: light skin tone
+1F469 1F3FC 200D 1F9BD ; fully-qualified # 👩🏼🦽 woman in manual wheelchair: medium-light skin tone
+1F469 1F3FD 200D 1F9BD ; fully-qualified # 👩🏽🦽 woman in manual wheelchair: medium skin tone
+1F469 1F3FE 200D 1F9BD ; fully-qualified # 👩🏾🦽 woman in manual wheelchair: medium-dark skin tone
+1F469 1F3FF 200D 1F9BD ; fully-qualified # 👩🏿🦽 woman in manual wheelchair: dark skin tone
+1F3C3 ; fully-qualified # 🏃 person running
+1F3C3 1F3FB ; fully-qualified # 🏃🏻 person running: light skin tone
+1F3C3 1F3FC ; fully-qualified # 🏃🏼 person running: medium-light skin tone
+1F3C3 1F3FD ; fully-qualified # 🏃🏽 person running: medium skin tone
+1F3C3 1F3FE ; fully-qualified # 🏃🏾 person running: medium-dark skin tone
+1F3C3 1F3FF ; fully-qualified # 🏃🏿 person running: dark skin tone
+1F3C3 200D 2642 FE0F ; fully-qualified # 🏃♂️ man running
+1F3C3 200D 2642 ; minimally-qualified # 🏃♂ man running
+1F3C3 1F3FB 200D 2642 FE0F ; fully-qualified # 🏃🏻♂️ man running: light skin tone
+1F3C3 1F3FB 200D 2642 ; minimally-qualified # 🏃🏻♂ man running: light skin tone
+1F3C3 1F3FC 200D 2642 FE0F ; fully-qualified # 🏃🏼♂️ man running: medium-light skin tone
+1F3C3 1F3FC 200D 2642 ; minimally-qualified # 🏃🏼♂ man running: medium-light skin tone
+1F3C3 1F3FD 200D 2642 FE0F ; fully-qualified # 🏃🏽♂️ man running: medium skin tone
+1F3C3 1F3FD 200D 2642 ; minimally-qualified # 🏃🏽♂ man running: medium skin tone
+1F3C3 1F3FE 200D 2642 FE0F ; fully-qualified # 🏃🏾♂️ man running: medium-dark skin tone
+1F3C3 1F3FE 200D 2642 ; minimally-qualified # 🏃🏾♂ man running: medium-dark skin tone
+1F3C3 1F3FF 200D 2642 FE0F ; fully-qualified # 🏃🏿♂️ man running: dark skin tone
+1F3C3 1F3FF 200D 2642 ; minimally-qualified # 🏃🏿♂ man running: dark skin tone
+1F3C3 200D 2640 FE0F ; fully-qualified # 🏃♀️ woman running
+1F3C3 200D 2640 ; minimally-qualified # 🏃♀ woman running
+1F3C3 1F3FB 200D 2640 FE0F ; fully-qualified # 🏃🏻♀️ woman running: light skin tone
+1F3C3 1F3FB 200D 2640 ; minimally-qualified # 🏃🏻♀ woman running: light skin tone
+1F3C3 1F3FC 200D 2640 FE0F ; fully-qualified # 🏃🏼♀️ woman running: medium-light skin tone
+1F3C3 1F3FC 200D 2640 ; minimally-qualified # 🏃🏼♀ woman running: medium-light skin tone
+1F3C3 1F3FD 200D 2640 FE0F ; fully-qualified # 🏃🏽♀️ woman running: medium skin tone
+1F3C3 1F3FD 200D 2640 ; minimally-qualified # 🏃🏽♀ woman running: medium skin tone
+1F3C3 1F3FE 200D 2640 FE0F ; fully-qualified # 🏃🏾♀️ woman running: medium-dark skin tone
+1F3C3 1F3FE 200D 2640 ; minimally-qualified # 🏃🏾♀ woman running: medium-dark skin tone
+1F3C3 1F3FF 200D 2640 FE0F ; fully-qualified # 🏃🏿♀️ woman running: dark skin tone
+1F3C3 1F3FF 200D 2640 ; minimally-qualified # 🏃🏿♀ woman running: dark skin tone
+1F483 ; fully-qualified # 💃 woman dancing
+1F483 1F3FB ; fully-qualified # 💃🏻 woman dancing: light skin tone
+1F483 1F3FC ; fully-qualified # 💃🏼 woman dancing: medium-light skin tone
+1F483 1F3FD ; fully-qualified # 💃🏽 woman dancing: medium skin tone
+1F483 1F3FE ; fully-qualified # 💃🏾 woman dancing: medium-dark skin tone
+1F483 1F3FF ; fully-qualified # 💃🏿 woman dancing: dark skin tone
+1F57A ; fully-qualified # 🕺 man dancing
+1F57A 1F3FB ; fully-qualified # 🕺🏻 man dancing: light skin tone
+1F57A 1F3FC ; fully-qualified # 🕺🏼 man dancing: medium-light skin tone
+1F57A 1F3FD ; fully-qualified # 🕺🏽 man dancing: medium skin tone
+1F57A 1F3FE ; fully-qualified # 🕺🏾 man dancing: medium-dark skin tone
+1F57A 1F3FF ; fully-qualified # 🕺🏿 man dancing: dark skin tone
+1F574 FE0F ; fully-qualified # 🕴️ man in suit levitating
+1F574 ; unqualified # 🕴 man in suit levitating
+1F574 1F3FB ; fully-qualified # 🕴🏻 man in suit levitating: light skin tone
+1F574 1F3FC ; fully-qualified # 🕴🏼 man in suit levitating: medium-light skin tone
+1F574 1F3FD ; fully-qualified # 🕴🏽 man in suit levitating: medium skin tone
+1F574 1F3FE ; fully-qualified # 🕴🏾 man in suit levitating: medium-dark skin tone
+1F574 1F3FF ; fully-qualified # 🕴🏿 man in suit levitating: dark skin tone
+1F46F ; fully-qualified # 👯 people with bunny ears
+1F46F 200D 2642 FE0F ; fully-qualified # 👯♂️ men with bunny ears
+1F46F 200D 2642 ; minimally-qualified # 👯♂ men with bunny ears
+1F46F 200D 2640 FE0F ; fully-qualified # 👯♀️ women with bunny ears
+1F46F 200D 2640 ; minimally-qualified # 👯♀ women with bunny ears
+1F9D6 ; fully-qualified # 🧖 person in steamy room
+1F9D6 1F3FB ; fully-qualified # 🧖🏻 person in steamy room: light skin tone
+1F9D6 1F3FC ; fully-qualified # 🧖🏼 person in steamy room: medium-light skin tone
+1F9D6 1F3FD ; fully-qualified # 🧖🏽 person in steamy room: medium skin tone
+1F9D6 1F3FE ; fully-qualified # 🧖🏾 person in steamy room: medium-dark skin tone
+1F9D6 1F3FF ; fully-qualified # 🧖🏿 person in steamy room: dark skin tone
+1F9D6 200D 2642 FE0F ; fully-qualified # 🧖♂️ man in steamy room
+1F9D6 200D 2642 ; minimally-qualified # 🧖♂ man in steamy room
+1F9D6 1F3FB 200D 2642 FE0F ; fully-qualified # 🧖🏻♂️ man in steamy room: light skin tone
+1F9D6 1F3FB 200D 2642 ; minimally-qualified # 🧖🏻♂ man in steamy room: light skin tone
+1F9D6 1F3FC 200D 2642 FE0F ; fully-qualified # 🧖🏼♂️ man in steamy room: medium-light skin tone
+1F9D6 1F3FC 200D 2642 ; minimally-qualified # 🧖🏼♂ man in steamy room: medium-light skin tone
+1F9D6 1F3FD 200D 2642 FE0F ; fully-qualified # 🧖🏽♂️ man in steamy room: medium skin tone
+1F9D6 1F3FD 200D 2642 ; minimally-qualified # 🧖🏽♂ man in steamy room: medium skin tone
+1F9D6 1F3FE 200D 2642 FE0F ; fully-qualified # 🧖🏾♂️ man in steamy room: medium-dark skin tone
+1F9D6 1F3FE 200D 2642 ; minimally-qualified # 🧖🏾♂ man in steamy room: medium-dark skin tone
+1F9D6 1F3FF 200D 2642 FE0F ; fully-qualified # 🧖🏿♂️ man in steamy room: dark skin tone
+1F9D6 1F3FF 200D 2642 ; minimally-qualified # 🧖🏿♂ man in steamy room: dark skin tone
+1F9D6 200D 2640 FE0F ; fully-qualified # 🧖♀️ woman in steamy room
+1F9D6 200D 2640 ; minimally-qualified # 🧖♀ woman in steamy room
+1F9D6 1F3FB 200D 2640 FE0F ; fully-qualified # 🧖🏻♀️ woman in steamy room: light skin tone
+1F9D6 1F3FB 200D 2640 ; minimally-qualified # 🧖🏻♀ woman in steamy room: light skin tone
+1F9D6 1F3FC 200D 2640 FE0F ; fully-qualified # 🧖🏼♀️ woman in steamy room: medium-light skin tone
+1F9D6 1F3FC 200D 2640 ; minimally-qualified # 🧖🏼♀ woman in steamy room: medium-light skin tone
+1F9D6 1F3FD 200D 2640 FE0F ; fully-qualified # 🧖🏽♀️ woman in steamy room: medium skin tone
+1F9D6 1F3FD 200D 2640 ; minimally-qualified # 🧖🏽♀ woman in steamy room: medium skin tone
+1F9D6 1F3FE 200D 2640 FE0F ; fully-qualified # 🧖🏾♀️ woman in steamy room: medium-dark skin tone
+1F9D6 1F3FE 200D 2640 ; minimally-qualified # 🧖🏾♀ woman in steamy room: medium-dark skin tone
+1F9D6 1F3FF 200D 2640 FE0F ; fully-qualified # 🧖🏿♀️ woman in steamy room: dark skin tone
+1F9D6 1F3FF 200D 2640 ; minimally-qualified # 🧖🏿♀ woman in steamy room: dark skin tone
+1F9D7 ; fully-qualified # 🧗 person climbing
+1F9D7 1F3FB ; fully-qualified # 🧗🏻 person climbing: light skin tone
+1F9D7 1F3FC ; fully-qualified # 🧗🏼 person climbing: medium-light skin tone
+1F9D7 1F3FD ; fully-qualified # 🧗🏽 person climbing: medium skin tone
+1F9D7 1F3FE ; fully-qualified # 🧗🏾 person climbing: medium-dark skin tone
+1F9D7 1F3FF ; fully-qualified # 🧗🏿 person climbing: dark skin tone
+1F9D7 200D 2642 FE0F ; fully-qualified # 🧗♂️ man climbing
+1F9D7 200D 2642 ; minimally-qualified # 🧗♂ man climbing
+1F9D7 1F3FB 200D 2642 FE0F ; fully-qualified # 🧗🏻♂️ man climbing: light skin tone
+1F9D7 1F3FB 200D 2642 ; minimally-qualified # 🧗🏻♂ man climbing: light skin tone
+1F9D7 1F3FC 200D 2642 FE0F ; fully-qualified # 🧗🏼♂️ man climbing: medium-light skin tone
+1F9D7 1F3FC 200D 2642 ; minimally-qualified # 🧗🏼♂ man climbing: medium-light skin tone
+1F9D7 1F3FD 200D 2642 FE0F ; fully-qualified # 🧗🏽♂️ man climbing: medium skin tone
+1F9D7 1F3FD 200D 2642 ; minimally-qualified # 🧗🏽♂ man climbing: medium skin tone
+1F9D7 1F3FE 200D 2642 FE0F ; fully-qualified # 🧗🏾♂️ man climbing: medium-dark skin tone
+1F9D7 1F3FE 200D 2642 ; minimally-qualified # 🧗🏾♂ man climbing: medium-dark skin tone
+1F9D7 1F3FF 200D 2642 FE0F ; fully-qualified # 🧗🏿♂️ man climbing: dark skin tone
+1F9D7 1F3FF 200D 2642 ; minimally-qualified # 🧗🏿♂ man climbing: dark skin tone
+1F9D7 200D 2640 FE0F ; fully-qualified # 🧗♀️ woman climbing
+1F9D7 200D 2640 ; minimally-qualified # 🧗♀ woman climbing
+1F9D7 1F3FB 200D 2640 FE0F ; fully-qualified # 🧗🏻♀️ woman climbing: light skin tone
+1F9D7 1F3FB 200D 2640 ; minimally-qualified # 🧗🏻♀ woman climbing: light skin tone
+1F9D7 1F3FC 200D 2640 FE0F ; fully-qualified # 🧗🏼♀️ woman climbing: medium-light skin tone
+1F9D7 1F3FC 200D 2640 ; minimally-qualified # 🧗🏼♀ woman climbing: medium-light skin tone
+1F9D7 1F3FD 200D 2640 FE0F ; fully-qualified # 🧗🏽♀️ woman climbing: medium skin tone
+1F9D7 1F3FD 200D 2640 ; minimally-qualified # 🧗🏽♀ woman climbing: medium skin tone
+1F9D7 1F3FE 200D 2640 FE0F ; fully-qualified # 🧗🏾♀️ woman climbing: medium-dark skin tone
+1F9D7 1F3FE 200D 2640 ; minimally-qualified # 🧗🏾♀ woman climbing: medium-dark skin tone
+1F9D7 1F3FF 200D 2640 FE0F ; fully-qualified # 🧗🏿♀️ woman climbing: dark skin tone
+1F9D7 1F3FF 200D 2640 ; minimally-qualified # 🧗🏿♀ woman climbing: dark skin tone
+
+# subgroup: person-sport
+1F93A ; fully-qualified # 🤺 person fencing
+1F3C7 ; fully-qualified # 🏇 horse racing
+1F3C7 1F3FB ; fully-qualified # 🏇🏻 horse racing: light skin tone
+1F3C7 1F3FC ; fully-qualified # 🏇🏼 horse racing: medium-light skin tone
+1F3C7 1F3FD ; fully-qualified # 🏇🏽 horse racing: medium skin tone
+1F3C7 1F3FE ; fully-qualified # 🏇🏾 horse racing: medium-dark skin tone
+1F3C7 1F3FF ; fully-qualified # 🏇🏿 horse racing: dark skin tone
+26F7 FE0F ; fully-qualified # ⛷️ skier
+26F7 ; unqualified # ⛷ skier
+1F3C2 ; fully-qualified # 🏂 snowboarder
+1F3C2 1F3FB ; fully-qualified # 🏂🏻 snowboarder: light skin tone
+1F3C2 1F3FC ; fully-qualified # 🏂🏼 snowboarder: medium-light skin tone
+1F3C2 1F3FD ; fully-qualified # 🏂🏽 snowboarder: medium skin tone
+1F3C2 1F3FE ; fully-qualified # 🏂🏾 snowboarder: medium-dark skin tone
+1F3C2 1F3FF ; fully-qualified # 🏂🏿 snowboarder: dark skin tone
+1F3CC FE0F ; fully-qualified # 🏌️ person golfing
+1F3CC ; unqualified # 🏌 person golfing
+1F3CC 1F3FB ; fully-qualified # 🏌🏻 person golfing: light skin tone
+1F3CC 1F3FC ; fully-qualified # 🏌🏼 person golfing: medium-light skin tone
+1F3CC 1F3FD ; fully-qualified # 🏌🏽 person golfing: medium skin tone
+1F3CC 1F3FE ; fully-qualified # 🏌🏾 person golfing: medium-dark skin tone
+1F3CC 1F3FF ; fully-qualified # 🏌🏿 person golfing: dark skin tone
+1F3CC FE0F 200D 2642 FE0F ; fully-qualified # 🏌️♂️ man golfing
+1F3CC 200D 2642 FE0F ; unqualified # 🏌♂️ man golfing
+1F3CC FE0F 200D 2642 ; unqualified # 🏌️♂ man golfing
+1F3CC 200D 2642 ; unqualified # 🏌♂ man golfing
+1F3CC 1F3FB 200D 2642 FE0F ; fully-qualified # 🏌🏻♂️ man golfing: light skin tone
+1F3CC 1F3FB 200D 2642 ; minimally-qualified # 🏌🏻♂ man golfing: light skin tone
+1F3CC 1F3FC 200D 2642 FE0F ; fully-qualified # 🏌🏼♂️ man golfing: medium-light skin tone
+1F3CC 1F3FC 200D 2642 ; minimally-qualified # 🏌🏼♂ man golfing: medium-light skin tone
+1F3CC 1F3FD 200D 2642 FE0F ; fully-qualified # 🏌🏽♂️ man golfing: medium skin tone
+1F3CC 1F3FD 200D 2642 ; minimally-qualified # 🏌🏽♂ man golfing: medium skin tone
+1F3CC 1F3FE 200D 2642 FE0F ; fully-qualified # 🏌🏾♂️ man golfing: medium-dark skin tone
+1F3CC 1F3FE 200D 2642 ; minimally-qualified # 🏌🏾♂ man golfing: medium-dark skin tone
+1F3CC 1F3FF 200D 2642 FE0F ; fully-qualified # 🏌🏿♂️ man golfing: dark skin tone
+1F3CC 1F3FF 200D 2642 ; minimally-qualified # 🏌🏿♂ man golfing: dark skin tone
+1F3CC FE0F 200D 2640 FE0F ; fully-qualified # 🏌️♀️ woman golfing
+1F3CC 200D 2640 FE0F ; unqualified # 🏌♀️ woman golfing
+1F3CC FE0F 200D 2640 ; unqualified # 🏌️♀ woman golfing
+1F3CC 200D 2640 ; unqualified # 🏌♀ woman golfing
+1F3CC 1F3FB 200D 2640 FE0F ; fully-qualified # 🏌🏻♀️ woman golfing: light skin tone
+1F3CC 1F3FB 200D 2640 ; minimally-qualified # 🏌🏻♀ woman golfing: light skin tone
+1F3CC 1F3FC 200D 2640 FE0F ; fully-qualified # 🏌🏼♀️ woman golfing: medium-light skin tone
+1F3CC 1F3FC 200D 2640 ; minimally-qualified # 🏌🏼♀ woman golfing: medium-light skin tone
+1F3CC 1F3FD 200D 2640 FE0F ; fully-qualified # 🏌🏽♀️ woman golfing: medium skin tone
+1F3CC 1F3FD 200D 2640 ; minimally-qualified # 🏌🏽♀ woman golfing: medium skin tone
+1F3CC 1F3FE 200D 2640 FE0F ; fully-qualified # 🏌🏾♀️ woman golfing: medium-dark skin tone
+1F3CC 1F3FE 200D 2640 ; minimally-qualified # 🏌🏾♀ woman golfing: medium-dark skin tone
+1F3CC 1F3FF 200D 2640 FE0F ; fully-qualified # 🏌🏿♀️ woman golfing: dark skin tone
+1F3CC 1F3FF 200D 2640 ; minimally-qualified # 🏌🏿♀ woman golfing: dark skin tone
+1F3C4 ; fully-qualified # 🏄 person surfing
+1F3C4 1F3FB ; fully-qualified # 🏄🏻 person surfing: light skin tone
+1F3C4 1F3FC ; fully-qualified # 🏄🏼 person surfing: medium-light skin tone
+1F3C4 1F3FD ; fully-qualified # 🏄🏽 person surfing: medium skin tone
+1F3C4 1F3FE ; fully-qualified # 🏄🏾 person surfing: medium-dark skin tone
+1F3C4 1F3FF ; fully-qualified # 🏄🏿 person surfing: dark skin tone
+1F3C4 200D 2642 FE0F ; fully-qualified # 🏄♂️ man surfing
+1F3C4 200D 2642 ; minimally-qualified # 🏄♂ man surfing
+1F3C4 1F3FB 200D 2642 FE0F ; fully-qualified # 🏄🏻♂️ man surfing: light skin tone
+1F3C4 1F3FB 200D 2642 ; minimally-qualified # 🏄🏻♂ man surfing: light skin tone
+1F3C4 1F3FC 200D 2642 FE0F ; fully-qualified # 🏄🏼♂️ man surfing: medium-light skin tone
+1F3C4 1F3FC 200D 2642 ; minimally-qualified # 🏄🏼♂ man surfing: medium-light skin tone
+1F3C4 1F3FD 200D 2642 FE0F ; fully-qualified # 🏄🏽♂️ man surfing: medium skin tone
+1F3C4 1F3FD 200D 2642 ; minimally-qualified # 🏄🏽♂ man surfing: medium skin tone
+1F3C4 1F3FE 200D 2642 FE0F ; fully-qualified # 🏄🏾♂️ man surfing: medium-dark skin tone
+1F3C4 1F3FE 200D 2642 ; minimally-qualified # 🏄🏾♂ man surfing: medium-dark skin tone
+1F3C4 1F3FF 200D 2642 FE0F ; fully-qualified # 🏄🏿♂️ man surfing: dark skin tone
+1F3C4 1F3FF 200D 2642 ; minimally-qualified # 🏄🏿♂ man surfing: dark skin tone
+1F3C4 200D 2640 FE0F ; fully-qualified # 🏄♀️ woman surfing
+1F3C4 200D 2640 ; minimally-qualified # 🏄♀ woman surfing
+1F3C4 1F3FB 200D 2640 FE0F ; fully-qualified # 🏄🏻♀️ woman surfing: light skin tone
+1F3C4 1F3FB 200D 2640 ; minimally-qualified # 🏄🏻♀ woman surfing: light skin tone
+1F3C4 1F3FC 200D 2640 FE0F ; fully-qualified # 🏄🏼♀️ woman surfing: medium-light skin tone
+1F3C4 1F3FC 200D 2640 ; minimally-qualified # 🏄🏼♀ woman surfing: medium-light skin tone
+1F3C4 1F3FD 200D 2640 FE0F ; fully-qualified # 🏄🏽♀️ woman surfing: medium skin tone
+1F3C4 1F3FD 200D 2640 ; minimally-qualified # 🏄🏽♀ woman surfing: medium skin tone
+1F3C4 1F3FE 200D 2640 FE0F ; fully-qualified # 🏄🏾♀️ woman surfing: medium-dark skin tone
+1F3C4 1F3FE 200D 2640 ; minimally-qualified # 🏄🏾♀ woman surfing: medium-dark skin tone
+1F3C4 1F3FF 200D 2640 FE0F ; fully-qualified # 🏄🏿♀️ woman surfing: dark skin tone
+1F3C4 1F3FF 200D 2640 ; minimally-qualified # 🏄🏿♀ woman surfing: dark skin tone
+1F6A3 ; fully-qualified # 🚣 person rowing boat
+1F6A3 1F3FB ; fully-qualified # 🚣🏻 person rowing boat: light skin tone
+1F6A3 1F3FC ; fully-qualified # 🚣🏼 person rowing boat: medium-light skin tone
+1F6A3 1F3FD ; fully-qualified # 🚣🏽 person rowing boat: medium skin tone
+1F6A3 1F3FE ; fully-qualified # 🚣🏾 person rowing boat: medium-dark skin tone
+1F6A3 1F3FF ; fully-qualified # 🚣🏿 person rowing boat: dark skin tone
+1F6A3 200D 2642 FE0F ; fully-qualified # 🚣♂️ man rowing boat
+1F6A3 200D 2642 ; minimally-qualified # 🚣♂ man rowing boat
+1F6A3 1F3FB 200D 2642 FE0F ; fully-qualified # 🚣🏻♂️ man rowing boat: light skin tone
+1F6A3 1F3FB 200D 2642 ; minimally-qualified # 🚣🏻♂ man rowing boat: light skin tone
+1F6A3 1F3FC 200D 2642 FE0F ; fully-qualified # 🚣🏼♂️ man rowing boat: medium-light skin tone
+1F6A3 1F3FC 200D 2642 ; minimally-qualified # 🚣🏼♂ man rowing boat: medium-light skin tone
+1F6A3 1F3FD 200D 2642 FE0F ; fully-qualified # 🚣🏽♂️ man rowing boat: medium skin tone
+1F6A3 1F3FD 200D 2642 ; minimally-qualified # 🚣🏽♂ man rowing boat: medium skin tone
+1F6A3 1F3FE 200D 2642 FE0F ; fully-qualified # 🚣🏾♂️ man rowing boat: medium-dark skin tone
+1F6A3 1F3FE 200D 2642 ; minimally-qualified # 🚣🏾♂ man rowing boat: medium-dark skin tone
+1F6A3 1F3FF 200D 2642 FE0F ; fully-qualified # 🚣🏿♂️ man rowing boat: dark skin tone
+1F6A3 1F3FF 200D 2642 ; minimally-qualified # 🚣🏿♂ man rowing boat: dark skin tone
+1F6A3 200D 2640 FE0F ; fully-qualified # 🚣♀️ woman rowing boat
+1F6A3 200D 2640 ; minimally-qualified # 🚣♀ woman rowing boat
+1F6A3 1F3FB 200D 2640 FE0F ; fully-qualified # 🚣🏻♀️ woman rowing boat: light skin tone
+1F6A3 1F3FB 200D 2640 ; minimally-qualified # 🚣🏻♀ woman rowing boat: light skin tone
+1F6A3 1F3FC 200D 2640 FE0F ; fully-qualified # 🚣🏼♀️ woman rowing boat: medium-light skin tone
+1F6A3 1F3FC 200D 2640 ; minimally-qualified # 🚣🏼♀ woman rowing boat: medium-light skin tone
+1F6A3 1F3FD 200D 2640 FE0F ; fully-qualified # 🚣🏽♀️ woman rowing boat: medium skin tone
+1F6A3 1F3FD 200D 2640 ; minimally-qualified # 🚣🏽♀ woman rowing boat: medium skin tone
+1F6A3 1F3FE 200D 2640 FE0F ; fully-qualified # 🚣🏾♀️ woman rowing boat: medium-dark skin tone
+1F6A3 1F3FE 200D 2640 ; minimally-qualified # 🚣🏾♀ woman rowing boat: medium-dark skin tone
+1F6A3 1F3FF 200D 2640 FE0F ; fully-qualified # 🚣🏿♀️ woman rowing boat: dark skin tone
+1F6A3 1F3FF 200D 2640 ; minimally-qualified # 🚣🏿♀ woman rowing boat: dark skin tone
+1F3CA ; fully-qualified # 🏊 person swimming
+1F3CA 1F3FB ; fully-qualified # 🏊🏻 person swimming: light skin tone
+1F3CA 1F3FC ; fully-qualified # 🏊🏼 person swimming: medium-light skin tone
+1F3CA 1F3FD ; fully-qualified # 🏊🏽 person swimming: medium skin tone
+1F3CA 1F3FE ; fully-qualified # 🏊🏾 person swimming: medium-dark skin tone
+1F3CA 1F3FF ; fully-qualified # 🏊🏿 person swimming: dark skin tone
+1F3CA 200D 2642 FE0F ; fully-qualified # 🏊♂️ man swimming
+1F3CA 200D 2642 ; minimally-qualified # 🏊♂ man swimming
+1F3CA 1F3FB 200D 2642 FE0F ; fully-qualified # 🏊🏻♂️ man swimming: light skin tone
+1F3CA 1F3FB 200D 2642 ; minimally-qualified # 🏊🏻♂ man swimming: light skin tone
+1F3CA 1F3FC 200D 2642 FE0F ; fully-qualified # 🏊🏼♂️ man swimming: medium-light skin tone
+1F3CA 1F3FC 200D 2642 ; minimally-qualified # 🏊🏼♂ man swimming: medium-light skin tone
+1F3CA 1F3FD 200D 2642 FE0F ; fully-qualified # 🏊🏽♂️ man swimming: medium skin tone
+1F3CA 1F3FD 200D 2642 ; minimally-qualified # 🏊🏽♂ man swimming: medium skin tone
+1F3CA 1F3FE 200D 2642 FE0F ; fully-qualified # 🏊🏾♂️ man swimming: medium-dark skin tone
+1F3CA 1F3FE 200D 2642 ; minimally-qualified # 🏊🏾♂ man swimming: medium-dark skin tone
+1F3CA 1F3FF 200D 2642 FE0F ; fully-qualified # 🏊🏿♂️ man swimming: dark skin tone
+1F3CA 1F3FF 200D 2642 ; minimally-qualified # 🏊🏿♂ man swimming: dark skin tone
+1F3CA 200D 2640 FE0F ; fully-qualified # 🏊♀️ woman swimming
+1F3CA 200D 2640 ; minimally-qualified # 🏊♀ woman swimming
+1F3CA 1F3FB 200D 2640 FE0F ; fully-qualified # 🏊🏻♀️ woman swimming: light skin tone
+1F3CA 1F3FB 200D 2640 ; minimally-qualified # 🏊🏻♀ woman swimming: light skin tone
+1F3CA 1F3FC 200D 2640 FE0F ; fully-qualified # 🏊🏼♀️ woman swimming: medium-light skin tone
+1F3CA 1F3FC 200D 2640 ; minimally-qualified # 🏊🏼♀ woman swimming: medium-light skin tone
+1F3CA 1F3FD 200D 2640 FE0F ; fully-qualified # 🏊🏽♀️ woman swimming: medium skin tone
+1F3CA 1F3FD 200D 2640 ; minimally-qualified # 🏊🏽♀ woman swimming: medium skin tone
+1F3CA 1F3FE 200D 2640 FE0F ; fully-qualified # 🏊🏾♀️ woman swimming: medium-dark skin tone
+1F3CA 1F3FE 200D 2640 ; minimally-qualified # 🏊🏾♀ woman swimming: medium-dark skin tone
+1F3CA 1F3FF 200D 2640 FE0F ; fully-qualified # 🏊🏿♀️ woman swimming: dark skin tone
+1F3CA 1F3FF 200D 2640 ; minimally-qualified # 🏊🏿♀ woman swimming: dark skin tone
+26F9 FE0F ; fully-qualified # ⛹️ person bouncing ball
+26F9 ; unqualified # ⛹ person bouncing ball
+26F9 1F3FB ; fully-qualified # ⛹🏻 person bouncing ball: light skin tone
+26F9 1F3FC ; fully-qualified # ⛹🏼 person bouncing ball: medium-light skin tone
+26F9 1F3FD ; fully-qualified # ⛹🏽 person bouncing ball: medium skin tone
+26F9 1F3FE ; fully-qualified # ⛹🏾 person bouncing ball: medium-dark skin tone
+26F9 1F3FF ; fully-qualified # ⛹🏿 person bouncing ball: dark skin tone
+26F9 FE0F 200D 2642 FE0F ; fully-qualified # ⛹️♂️ man bouncing ball
+26F9 200D 2642 FE0F ; unqualified # ⛹♂️ man bouncing ball
+26F9 FE0F 200D 2642 ; unqualified # ⛹️♂ man bouncing ball
+26F9 200D 2642 ; unqualified # ⛹♂ man bouncing ball
+26F9 1F3FB 200D 2642 FE0F ; fully-qualified # ⛹🏻♂️ man bouncing ball: light skin tone
+26F9 1F3FB 200D 2642 ; minimally-qualified # ⛹🏻♂ man bouncing ball: light skin tone
+26F9 1F3FC 200D 2642 FE0F ; fully-qualified # ⛹🏼♂️ man bouncing ball: medium-light skin tone
+26F9 1F3FC 200D 2642 ; minimally-qualified # ⛹🏼♂ man bouncing ball: medium-light skin tone
+26F9 1F3FD 200D 2642 FE0F ; fully-qualified # ⛹🏽♂️ man bouncing ball: medium skin tone
+26F9 1F3FD 200D 2642 ; minimally-qualified # ⛹🏽♂ man bouncing ball: medium skin tone
+26F9 1F3FE 200D 2642 FE0F ; fully-qualified # ⛹🏾♂️ man bouncing ball: medium-dark skin tone
+26F9 1F3FE 200D 2642 ; minimally-qualified # ⛹🏾♂ man bouncing ball: medium-dark skin tone
+26F9 1F3FF 200D 2642 FE0F ; fully-qualified # ⛹🏿♂️ man bouncing ball: dark skin tone
+26F9 1F3FF 200D 2642 ; minimally-qualified # ⛹🏿♂ man bouncing ball: dark skin tone
+26F9 FE0F 200D 2640 FE0F ; fully-qualified # ⛹️♀️ woman bouncing ball
+26F9 200D 2640 FE0F ; unqualified # ⛹♀️ woman bouncing ball
+26F9 FE0F 200D 2640 ; unqualified # ⛹️♀ woman bouncing ball
+26F9 200D 2640 ; unqualified # ⛹♀ woman bouncing ball
+26F9 1F3FB 200D 2640 FE0F ; fully-qualified # ⛹🏻♀️ woman bouncing ball: light skin tone
+26F9 1F3FB 200D 2640 ; minimally-qualified # ⛹🏻♀ woman bouncing ball: light skin tone
+26F9 1F3FC 200D 2640 FE0F ; fully-qualified # ⛹🏼♀️ woman bouncing ball: medium-light skin tone
+26F9 1F3FC 200D 2640 ; minimally-qualified # ⛹🏼♀ woman bouncing ball: medium-light skin tone
+26F9 1F3FD 200D 2640 FE0F ; fully-qualified # ⛹🏽♀️ woman bouncing ball: medium skin tone
+26F9 1F3FD 200D 2640 ; minimally-qualified # ⛹🏽♀ woman bouncing ball: medium skin tone
+26F9 1F3FE 200D 2640 FE0F ; fully-qualified # ⛹🏾♀️ woman bouncing ball: medium-dark skin tone
+26F9 1F3FE 200D 2640 ; minimally-qualified # ⛹🏾♀ woman bouncing ball: medium-dark skin tone
+26F9 1F3FF 200D 2640 FE0F ; fully-qualified # ⛹🏿♀️ woman bouncing ball: dark skin tone
+26F9 1F3FF 200D 2640 ; minimally-qualified # ⛹🏿♀ woman bouncing ball: dark skin tone
+1F3CB FE0F ; fully-qualified # 🏋️ person lifting weights
+1F3CB ; unqualified # 🏋 person lifting weights
+1F3CB 1F3FB ; fully-qualified # 🏋🏻 person lifting weights: light skin tone
+1F3CB 1F3FC ; fully-qualified # 🏋🏼 person lifting weights: medium-light skin tone
+1F3CB 1F3FD ; fully-qualified # 🏋🏽 person lifting weights: medium skin tone
+1F3CB 1F3FE ; fully-qualified # 🏋🏾 person lifting weights: medium-dark skin tone
+1F3CB 1F3FF ; fully-qualified # 🏋🏿 person lifting weights: dark skin tone
+1F3CB FE0F 200D 2642 FE0F ; fully-qualified # 🏋️♂️ man lifting weights
+1F3CB 200D 2642 FE0F ; unqualified # 🏋♂️ man lifting weights
+1F3CB FE0F 200D 2642 ; unqualified # 🏋️♂ man lifting weights
+1F3CB 200D 2642 ; unqualified # 🏋♂ man lifting weights
+1F3CB 1F3FB 200D 2642 FE0F ; fully-qualified # 🏋🏻♂️ man lifting weights: light skin tone
+1F3CB 1F3FB 200D 2642 ; minimally-qualified # 🏋🏻♂ man lifting weights: light skin tone
+1F3CB 1F3FC 200D 2642 FE0F ; fully-qualified # 🏋🏼♂️ man lifting weights: medium-light skin tone
+1F3CB 1F3FC 200D 2642 ; minimally-qualified # 🏋🏼♂ man lifting weights: medium-light skin tone
+1F3CB 1F3FD 200D 2642 FE0F ; fully-qualified # 🏋🏽♂️ man lifting weights: medium skin tone
+1F3CB 1F3FD 200D 2642 ; minimally-qualified # 🏋🏽♂ man lifting weights: medium skin tone
+1F3CB 1F3FE 200D 2642 FE0F ; fully-qualified # 🏋🏾♂️ man lifting weights: medium-dark skin tone
+1F3CB 1F3FE 200D 2642 ; minimally-qualified # 🏋🏾♂ man lifting weights: medium-dark skin tone
+1F3CB 1F3FF 200D 2642 FE0F ; fully-qualified # 🏋🏿♂️ man lifting weights: dark skin tone
+1F3CB 1F3FF 200D 2642 ; minimally-qualified # 🏋🏿♂ man lifting weights: dark skin tone
+1F3CB FE0F 200D 2640 FE0F ; fully-qualified # 🏋️♀️ woman lifting weights
+1F3CB 200D 2640 FE0F ; unqualified # 🏋♀️ woman lifting weights
+1F3CB FE0F 200D 2640 ; unqualified # 🏋️♀ woman lifting weights
+1F3CB 200D 2640 ; unqualified # 🏋♀ woman lifting weights
+1F3CB 1F3FB 200D 2640 FE0F ; fully-qualified # 🏋🏻♀️ woman lifting weights: light skin tone
+1F3CB 1F3FB 200D 2640 ; minimally-qualified # 🏋🏻♀ woman lifting weights: light skin tone
+1F3CB 1F3FC 200D 2640 FE0F ; fully-qualified # 🏋🏼♀️ woman lifting weights: medium-light skin tone
+1F3CB 1F3FC 200D 2640 ; minimally-qualified # 🏋🏼♀ woman lifting weights: medium-light skin tone
+1F3CB 1F3FD 200D 2640 FE0F ; fully-qualified # 🏋🏽♀️ woman lifting weights: medium skin tone
+1F3CB 1F3FD 200D 2640 ; minimally-qualified # 🏋🏽♀ woman lifting weights: medium skin tone
+1F3CB 1F3FE 200D 2640 FE0F ; fully-qualified # 🏋🏾♀️ woman lifting weights: medium-dark skin tone
+1F3CB 1F3FE 200D 2640 ; minimally-qualified # 🏋🏾♀ woman lifting weights: medium-dark skin tone
+1F3CB 1F3FF 200D 2640 FE0F ; fully-qualified # 🏋🏿♀️ woman lifting weights: dark skin tone
+1F3CB 1F3FF 200D 2640 ; minimally-qualified # 🏋🏿♀ woman lifting weights: dark skin tone
+1F6B4 ; fully-qualified # 🚴 person biking
+1F6B4 1F3FB ; fully-qualified # 🚴🏻 person biking: light skin tone
+1F6B4 1F3FC ; fully-qualified # 🚴🏼 person biking: medium-light skin tone
+1F6B4 1F3FD ; fully-qualified # 🚴🏽 person biking: medium skin tone
+1F6B4 1F3FE ; fully-qualified # 🚴🏾 person biking: medium-dark skin tone
+1F6B4 1F3FF ; fully-qualified # 🚴🏿 person biking: dark skin tone
+1F6B4 200D 2642 FE0F ; fully-qualified # 🚴♂️ man biking
+1F6B4 200D 2642 ; minimally-qualified # 🚴♂ man biking
+1F6B4 1F3FB 200D 2642 FE0F ; fully-qualified # 🚴🏻♂️ man biking: light skin tone
+1F6B4 1F3FB 200D 2642 ; minimally-qualified # 🚴🏻♂ man biking: light skin tone
+1F6B4 1F3FC 200D 2642 FE0F ; fully-qualified # 🚴🏼♂️ man biking: medium-light skin tone
+1F6B4 1F3FC 200D 2642 ; minimally-qualified # 🚴🏼♂ man biking: medium-light skin tone
+1F6B4 1F3FD 200D 2642 FE0F ; fully-qualified # 🚴🏽♂️ man biking: medium skin tone
+1F6B4 1F3FD 200D 2642 ; minimally-qualified # 🚴🏽♂ man biking: medium skin tone
+1F6B4 1F3FE 200D 2642 FE0F ; fully-qualified # 🚴🏾♂️ man biking: medium-dark skin tone
+1F6B4 1F3FE 200D 2642 ; minimally-qualified # 🚴🏾♂ man biking: medium-dark skin tone
+1F6B4 1F3FF 200D 2642 FE0F ; fully-qualified # 🚴🏿♂️ man biking: dark skin tone
+1F6B4 1F3FF 200D 2642 ; minimally-qualified # 🚴🏿♂ man biking: dark skin tone
+1F6B4 200D 2640 FE0F ; fully-qualified # 🚴♀️ woman biking
+1F6B4 200D 2640 ; minimally-qualified # 🚴♀ woman biking
+1F6B4 1F3FB 200D 2640 FE0F ; fully-qualified # 🚴🏻♀️ woman biking: light skin tone
+1F6B4 1F3FB 200D 2640 ; minimally-qualified # 🚴🏻♀ woman biking: light skin tone
+1F6B4 1F3FC 200D 2640 FE0F ; fully-qualified # 🚴🏼♀️ woman biking: medium-light skin tone
+1F6B4 1F3FC 200D 2640 ; minimally-qualified # 🚴🏼♀ woman biking: medium-light skin tone
+1F6B4 1F3FD 200D 2640 FE0F ; fully-qualified # 🚴🏽♀️ woman biking: medium skin tone
+1F6B4 1F3FD 200D 2640 ; minimally-qualified # 🚴🏽♀ woman biking: medium skin tone
+1F6B4 1F3FE 200D 2640 FE0F ; fully-qualified # 🚴🏾♀️ woman biking: medium-dark skin tone
+1F6B4 1F3FE 200D 2640 ; minimally-qualified # 🚴🏾♀ woman biking: medium-dark skin tone
+1F6B4 1F3FF 200D 2640 FE0F ; fully-qualified # 🚴🏿♀️ woman biking: dark skin tone
+1F6B4 1F3FF 200D 2640 ; minimally-qualified # 🚴🏿♀ woman biking: dark skin tone
+1F6B5 ; fully-qualified # 🚵 person mountain biking
+1F6B5 1F3FB ; fully-qualified # 🚵🏻 person mountain biking: light skin tone
+1F6B5 1F3FC ; fully-qualified # 🚵🏼 person mountain biking: medium-light skin tone
+1F6B5 1F3FD ; fully-qualified # 🚵🏽 person mountain biking: medium skin tone
+1F6B5 1F3FE ; fully-qualified # 🚵🏾 person mountain biking: medium-dark skin tone
+1F6B5 1F3FF ; fully-qualified # 🚵🏿 person mountain biking: dark skin tone
+1F6B5 200D 2642 FE0F ; fully-qualified # 🚵♂️ man mountain biking
+1F6B5 200D 2642 ; minimally-qualified # 🚵♂ man mountain biking
+1F6B5 1F3FB 200D 2642 FE0F ; fully-qualified # 🚵🏻♂️ man mountain biking: light skin tone
+1F6B5 1F3FB 200D 2642 ; minimally-qualified # 🚵🏻♂ man mountain biking: light skin tone
+1F6B5 1F3FC 200D 2642 FE0F ; fully-qualified # 🚵🏼♂️ man mountain biking: medium-light skin tone
+1F6B5 1F3FC 200D 2642 ; minimally-qualified # 🚵🏼♂ man mountain biking: medium-light skin tone
+1F6B5 1F3FD 200D 2642 FE0F ; fully-qualified # 🚵🏽♂️ man mountain biking: medium skin tone
+1F6B5 1F3FD 200D 2642 ; minimally-qualified # 🚵🏽♂ man mountain biking: medium skin tone
+1F6B5 1F3FE 200D 2642 FE0F ; fully-qualified # 🚵🏾♂️ man mountain biking: medium-dark skin tone
+1F6B5 1F3FE 200D 2642 ; minimally-qualified # 🚵🏾♂ man mountain biking: medium-dark skin tone
+1F6B5 1F3FF 200D 2642 FE0F ; fully-qualified # 🚵🏿♂️ man mountain biking: dark skin tone
+1F6B5 1F3FF 200D 2642 ; minimally-qualified # 🚵🏿♂ man mountain biking: dark skin tone
+1F6B5 200D 2640 FE0F ; fully-qualified # 🚵♀️ woman mountain biking
+1F6B5 200D 2640 ; minimally-qualified # 🚵♀ woman mountain biking
+1F6B5 1F3FB 200D 2640 FE0F ; fully-qualified # 🚵🏻♀️ woman mountain biking: light skin tone
+1F6B5 1F3FB 200D 2640 ; minimally-qualified # 🚵🏻♀ woman mountain biking: light skin tone
+1F6B5 1F3FC 200D 2640 FE0F ; fully-qualified # 🚵🏼♀️ woman mountain biking: medium-light skin tone
+1F6B5 1F3FC 200D 2640 ; minimally-qualified # 🚵🏼♀ woman mountain biking: medium-light skin tone
+1F6B5 1F3FD 200D 2640 FE0F ; fully-qualified # 🚵🏽♀️ woman mountain biking: medium skin tone
+1F6B5 1F3FD 200D 2640 ; minimally-qualified # 🚵🏽♀ woman mountain biking: medium skin tone
+1F6B5 1F3FE 200D 2640 FE0F ; fully-qualified # 🚵🏾♀️ woman mountain biking: medium-dark skin tone
+1F6B5 1F3FE 200D 2640 ; minimally-qualified # 🚵🏾♀ woman mountain biking: medium-dark skin tone
+1F6B5 1F3FF 200D 2640 FE0F ; fully-qualified # 🚵🏿♀️ woman mountain biking: dark skin tone
+1F6B5 1F3FF 200D 2640 ; minimally-qualified # 🚵🏿♀ woman mountain biking: dark skin tone
+1F938 ; fully-qualified # 🤸 person cartwheeling
+1F938 1F3FB ; fully-qualified # 🤸🏻 person cartwheeling: light skin tone
+1F938 1F3FC ; fully-qualified # 🤸🏼 person cartwheeling: medium-light skin tone
+1F938 1F3FD ; fully-qualified # 🤸🏽 person cartwheeling: medium skin tone
+1F938 1F3FE ; fully-qualified # 🤸🏾 person cartwheeling: medium-dark skin tone
+1F938 1F3FF ; fully-qualified # 🤸🏿 person cartwheeling: dark skin tone
+1F938 200D 2642 FE0F ; fully-qualified # 🤸♂️ man cartwheeling
+1F938 200D 2642 ; minimally-qualified # 🤸♂ man cartwheeling
+1F938 1F3FB 200D 2642 FE0F ; fully-qualified # 🤸🏻♂️ man cartwheeling: light skin tone
+1F938 1F3FB 200D 2642 ; minimally-qualified # 🤸🏻♂ man cartwheeling: light skin tone
+1F938 1F3FC 200D 2642 FE0F ; fully-qualified # 🤸🏼♂️ man cartwheeling: medium-light skin tone
+1F938 1F3FC 200D 2642 ; minimally-qualified # 🤸🏼♂ man cartwheeling: medium-light skin tone
+1F938 1F3FD 200D 2642 FE0F ; fully-qualified # 🤸🏽♂️ man cartwheeling: medium skin tone
+1F938 1F3FD 200D 2642 ; minimally-qualified # 🤸🏽♂ man cartwheeling: medium skin tone
+1F938 1F3FE 200D 2642 FE0F ; fully-qualified # 🤸🏾♂️ man cartwheeling: medium-dark skin tone
+1F938 1F3FE 200D 2642 ; minimally-qualified # 🤸🏾♂ man cartwheeling: medium-dark skin tone
+1F938 1F3FF 200D 2642 FE0F ; fully-qualified # 🤸🏿♂️ man cartwheeling: dark skin tone
+1F938 1F3FF 200D 2642 ; minimally-qualified # 🤸🏿♂ man cartwheeling: dark skin tone
+1F938 200D 2640 FE0F ; fully-qualified # 🤸♀️ woman cartwheeling
+1F938 200D 2640 ; minimally-qualified # 🤸♀ woman cartwheeling
+1F938 1F3FB 200D 2640 FE0F ; fully-qualified # 🤸🏻♀️ woman cartwheeling: light skin tone
+1F938 1F3FB 200D 2640 ; minimally-qualified # 🤸🏻♀ woman cartwheeling: light skin tone
+1F938 1F3FC 200D 2640 FE0F ; fully-qualified # 🤸🏼♀️ woman cartwheeling: medium-light skin tone
+1F938 1F3FC 200D 2640 ; minimally-qualified # 🤸🏼♀ woman cartwheeling: medium-light skin tone
+1F938 1F3FD 200D 2640 FE0F ; fully-qualified # 🤸🏽♀️ woman cartwheeling: medium skin tone
+1F938 1F3FD 200D 2640 ; minimally-qualified # 🤸🏽♀ woman cartwheeling: medium skin tone
+1F938 1F3FE 200D 2640 FE0F ; fully-qualified # 🤸🏾♀️ woman cartwheeling: medium-dark skin tone
+1F938 1F3FE 200D 2640 ; minimally-qualified # 🤸🏾♀ woman cartwheeling: medium-dark skin tone
+1F938 1F3FF 200D 2640 FE0F ; fully-qualified # 🤸🏿♀️ woman cartwheeling: dark skin tone
+1F938 1F3FF 200D 2640 ; minimally-qualified # 🤸🏿♀ woman cartwheeling: dark skin tone
+1F93C ; fully-qualified # 🤼 people wrestling
+1F93C 200D 2642 FE0F ; fully-qualified # 🤼♂️ men wrestling
+1F93C 200D 2642 ; minimally-qualified # 🤼♂ men wrestling
+1F93C 200D 2640 FE0F ; fully-qualified # 🤼♀️ women wrestling
+1F93C 200D 2640 ; minimally-qualified # 🤼♀ women wrestling
+1F93D ; fully-qualified # 🤽 person playing water polo
+1F93D 1F3FB ; fully-qualified # 🤽🏻 person playing water polo: light skin tone
+1F93D 1F3FC ; fully-qualified # 🤽🏼 person playing water polo: medium-light skin tone
+1F93D 1F3FD ; fully-qualified # 🤽🏽 person playing water polo: medium skin tone
+1F93D 1F3FE ; fully-qualified # 🤽🏾 person playing water polo: medium-dark skin tone
+1F93D 1F3FF ; fully-qualified # 🤽🏿 person playing water polo: dark skin tone
+1F93D 200D 2642 FE0F ; fully-qualified # 🤽♂️ man playing water polo
+1F93D 200D 2642 ; minimally-qualified # 🤽♂ man playing water polo
+1F93D 1F3FB 200D 2642 FE0F ; fully-qualified # 🤽🏻♂️ man playing water polo: light skin tone
+1F93D 1F3FB 200D 2642 ; minimally-qualified # 🤽🏻♂ man playing water polo: light skin tone
+1F93D 1F3FC 200D 2642 FE0F ; fully-qualified # 🤽🏼♂️ man playing water polo: medium-light skin tone
+1F93D 1F3FC 200D 2642 ; minimally-qualified # 🤽🏼♂ man playing water polo: medium-light skin tone
+1F93D 1F3FD 200D 2642 FE0F ; fully-qualified # 🤽🏽♂️ man playing water polo: medium skin tone
+1F93D 1F3FD 200D 2642 ; minimally-qualified # 🤽🏽♂ man playing water polo: medium skin tone
+1F93D 1F3FE 200D 2642 FE0F ; fully-qualified # 🤽🏾♂️ man playing water polo: medium-dark skin tone
+1F93D 1F3FE 200D 2642 ; minimally-qualified # 🤽🏾♂ man playing water polo: medium-dark skin tone
+1F93D 1F3FF 200D 2642 FE0F ; fully-qualified # 🤽🏿♂️ man playing water polo: dark skin tone
+1F93D 1F3FF 200D 2642 ; minimally-qualified # 🤽🏿♂ man playing water polo: dark skin tone
+1F93D 200D 2640 FE0F ; fully-qualified # 🤽♀️ woman playing water polo
+1F93D 200D 2640 ; minimally-qualified # 🤽♀ woman playing water polo
+1F93D 1F3FB 200D 2640 FE0F ; fully-qualified # 🤽🏻♀️ woman playing water polo: light skin tone
+1F93D 1F3FB 200D 2640 ; minimally-qualified # 🤽🏻♀ woman playing water polo: light skin tone
+1F93D 1F3FC 200D 2640 FE0F ; fully-qualified # 🤽🏼♀️ woman playing water polo: medium-light skin tone
+1F93D 1F3FC 200D 2640 ; minimally-qualified # 🤽🏼♀ woman playing water polo: medium-light skin tone
+1F93D 1F3FD 200D 2640 FE0F ; fully-qualified # 🤽🏽♀️ woman playing water polo: medium skin tone
+1F93D 1F3FD 200D 2640 ; minimally-qualified # 🤽🏽♀ woman playing water polo: medium skin tone
+1F93D 1F3FE 200D 2640 FE0F ; fully-qualified # 🤽🏾♀️ woman playing water polo: medium-dark skin tone
+1F93D 1F3FE 200D 2640 ; minimally-qualified # 🤽🏾♀ woman playing water polo: medium-dark skin tone
+1F93D 1F3FF 200D 2640 FE0F ; fully-qualified # 🤽🏿♀️ woman playing water polo: dark skin tone
+1F93D 1F3FF 200D 2640 ; minimally-qualified # 🤽🏿♀ woman playing water polo: dark skin tone
+1F93E ; fully-qualified # 🤾 person playing handball
+1F93E 1F3FB ; fully-qualified # 🤾🏻 person playing handball: light skin tone
+1F93E 1F3FC ; fully-qualified # 🤾🏼 person playing handball: medium-light skin tone
+1F93E 1F3FD ; fully-qualified # 🤾🏽 person playing handball: medium skin tone
+1F93E 1F3FE ; fully-qualified # 🤾🏾 person playing handball: medium-dark skin tone
+1F93E 1F3FF ; fully-qualified # 🤾🏿 person playing handball: dark skin tone
+1F93E 200D 2642 FE0F ; fully-qualified # 🤾♂️ man playing handball
+1F93E 200D 2642 ; minimally-qualified # 🤾♂ man playing handball
+1F93E 1F3FB 200D 2642 FE0F ; fully-qualified # 🤾🏻♂️ man playing handball: light skin tone
+1F93E 1F3FB 200D 2642 ; minimally-qualified # 🤾🏻♂ man playing handball: light skin tone
+1F93E 1F3FC 200D 2642 FE0F ; fully-qualified # 🤾🏼♂️ man playing handball: medium-light skin tone
+1F93E 1F3FC 200D 2642 ; minimally-qualified # 🤾🏼♂ man playing handball: medium-light skin tone
+1F93E 1F3FD 200D 2642 FE0F ; fully-qualified # 🤾🏽♂️ man playing handball: medium skin tone
+1F93E 1F3FD 200D 2642 ; minimally-qualified # 🤾🏽♂ man playing handball: medium skin tone
+1F93E 1F3FE 200D 2642 FE0F ; fully-qualified # 🤾🏾♂️ man playing handball: medium-dark skin tone
+1F93E 1F3FE 200D 2642 ; minimally-qualified # 🤾🏾♂ man playing handball: medium-dark skin tone
+1F93E 1F3FF 200D 2642 FE0F ; fully-qualified # 🤾🏿♂️ man playing handball: dark skin tone
+1F93E 1F3FF 200D 2642 ; minimally-qualified # 🤾🏿♂ man playing handball: dark skin tone
+1F93E 200D 2640 FE0F ; fully-qualified # 🤾♀️ woman playing handball
+1F93E 200D 2640 ; minimally-qualified # 🤾♀ woman playing handball
+1F93E 1F3FB 200D 2640 FE0F ; fully-qualified # 🤾🏻♀️ woman playing handball: light skin tone
+1F93E 1F3FB 200D 2640 ; minimally-qualified # 🤾🏻♀ woman playing handball: light skin tone
+1F93E 1F3FC 200D 2640 FE0F ; fully-qualified # 🤾🏼♀️ woman playing handball: medium-light skin tone
+1F93E 1F3FC 200D 2640 ; minimally-qualified # 🤾🏼♀ woman playing handball: medium-light skin tone
+1F93E 1F3FD 200D 2640 FE0F ; fully-qualified # 🤾🏽♀️ woman playing handball: medium skin tone
+1F93E 1F3FD 200D 2640 ; minimally-qualified # 🤾🏽♀ woman playing handball: medium skin tone
+1F93E 1F3FE 200D 2640 FE0F ; fully-qualified # 🤾🏾♀️ woman playing handball: medium-dark skin tone
+1F93E 1F3FE 200D 2640 ; minimally-qualified # 🤾🏾♀ woman playing handball: medium-dark skin tone
+1F93E 1F3FF 200D 2640 FE0F ; fully-qualified # 🤾🏿♀️ woman playing handball: dark skin tone
+1F93E 1F3FF 200D 2640 ; minimally-qualified # 🤾🏿♀ woman playing handball: dark skin tone
+1F939 ; fully-qualified # 🤹 person juggling
+1F939 1F3FB ; fully-qualified # 🤹🏻 person juggling: light skin tone
+1F939 1F3FC ; fully-qualified # 🤹🏼 person juggling: medium-light skin tone
+1F939 1F3FD ; fully-qualified # 🤹🏽 person juggling: medium skin tone
+1F939 1F3FE ; fully-qualified # 🤹🏾 person juggling: medium-dark skin tone
+1F939 1F3FF ; fully-qualified # 🤹🏿 person juggling: dark skin tone
+1F939 200D 2642 FE0F ; fully-qualified # 🤹♂️ man juggling
+1F939 200D 2642 ; minimally-qualified # 🤹♂ man juggling
+1F939 1F3FB 200D 2642 FE0F ; fully-qualified # 🤹🏻♂️ man juggling: light skin tone
+1F939 1F3FB 200D 2642 ; minimally-qualified # 🤹🏻♂ man juggling: light skin tone
+1F939 1F3FC 200D 2642 FE0F ; fully-qualified # 🤹🏼♂️ man juggling: medium-light skin tone
+1F939 1F3FC 200D 2642 ; minimally-qualified # 🤹🏼♂ man juggling: medium-light skin tone
+1F939 1F3FD 200D 2642 FE0F ; fully-qualified # 🤹🏽♂️ man juggling: medium skin tone
+1F939 1F3FD 200D 2642 ; minimally-qualified # 🤹🏽♂ man juggling: medium skin tone
+1F939 1F3FE 200D 2642 FE0F ; fully-qualified # 🤹🏾♂️ man juggling: medium-dark skin tone
+1F939 1F3FE 200D 2642 ; minimally-qualified # 🤹🏾♂ man juggling: medium-dark skin tone
+1F939 1F3FF 200D 2642 FE0F ; fully-qualified # 🤹🏿♂️ man juggling: dark skin tone
+1F939 1F3FF 200D 2642 ; minimally-qualified # 🤹🏿♂ man juggling: dark skin tone
+1F939 200D 2640 FE0F ; fully-qualified # 🤹♀️ woman juggling
+1F939 200D 2640 ; minimally-qualified # 🤹♀ woman juggling
+1F939 1F3FB 200D 2640 FE0F ; fully-qualified # 🤹🏻♀️ woman juggling: light skin tone
+1F939 1F3FB 200D 2640 ; minimally-qualified # 🤹🏻♀ woman juggling: light skin tone
+1F939 1F3FC 200D 2640 FE0F ; fully-qualified # 🤹🏼♀️ woman juggling: medium-light skin tone
+1F939 1F3FC 200D 2640 ; minimally-qualified # 🤹🏼♀ woman juggling: medium-light skin tone
+1F939 1F3FD 200D 2640 FE0F ; fully-qualified # 🤹🏽♀️ woman juggling: medium skin tone
+1F939 1F3FD 200D 2640 ; minimally-qualified # 🤹🏽♀ woman juggling: medium skin tone
+1F939 1F3FE 200D 2640 FE0F ; fully-qualified # 🤹🏾♀️ woman juggling: medium-dark skin tone
+1F939 1F3FE 200D 2640 ; minimally-qualified # 🤹🏾♀ woman juggling: medium-dark skin tone
+1F939 1F3FF 200D 2640 FE0F ; fully-qualified # 🤹🏿♀️ woman juggling: dark skin tone
+1F939 1F3FF 200D 2640 ; minimally-qualified # 🤹🏿♀ woman juggling: dark skin tone
+
+# subgroup: person-resting
+1F9D8 ; fully-qualified # 🧘 person in lotus position
+1F9D8 1F3FB ; fully-qualified # 🧘🏻 person in lotus position: light skin tone
+1F9D8 1F3FC ; fully-qualified # 🧘🏼 person in lotus position: medium-light skin tone
+1F9D8 1F3FD ; fully-qualified # 🧘🏽 person in lotus position: medium skin tone
+1F9D8 1F3FE ; fully-qualified # 🧘🏾 person in lotus position: medium-dark skin tone
+1F9D8 1F3FF ; fully-qualified # 🧘🏿 person in lotus position: dark skin tone
+1F9D8 200D 2642 FE0F ; fully-qualified # 🧘♂️ man in lotus position
+1F9D8 200D 2642 ; minimally-qualified # 🧘♂ man in lotus position
+1F9D8 1F3FB 200D 2642 FE0F ; fully-qualified # 🧘🏻♂️ man in lotus position: light skin tone
+1F9D8 1F3FB 200D 2642 ; minimally-qualified # 🧘🏻♂ man in lotus position: light skin tone
+1F9D8 1F3FC 200D 2642 FE0F ; fully-qualified # 🧘🏼♂️ man in lotus position: medium-light skin tone
+1F9D8 1F3FC 200D 2642 ; minimally-qualified # 🧘🏼♂ man in lotus position: medium-light skin tone
+1F9D8 1F3FD 200D 2642 FE0F ; fully-qualified # 🧘🏽♂️ man in lotus position: medium skin tone
+1F9D8 1F3FD 200D 2642 ; minimally-qualified # 🧘🏽♂ man in lotus position: medium skin tone
+1F9D8 1F3FE 200D 2642 FE0F ; fully-qualified # 🧘🏾♂️ man in lotus position: medium-dark skin tone
+1F9D8 1F3FE 200D 2642 ; minimally-qualified # 🧘🏾♂ man in lotus position: medium-dark skin tone
+1F9D8 1F3FF 200D 2642 FE0F ; fully-qualified # 🧘🏿♂️ man in lotus position: dark skin tone
+1F9D8 1F3FF 200D 2642 ; minimally-qualified # 🧘🏿♂ man in lotus position: dark skin tone
+1F9D8 200D 2640 FE0F ; fully-qualified # 🧘♀️ woman in lotus position
+1F9D8 200D 2640 ; minimally-qualified # 🧘♀ woman in lotus position
+1F9D8 1F3FB 200D 2640 FE0F ; fully-qualified # 🧘🏻♀️ woman in lotus position: light skin tone
+1F9D8 1F3FB 200D 2640 ; minimally-qualified # 🧘🏻♀ woman in lotus position: light skin tone
+1F9D8 1F3FC 200D 2640 FE0F ; fully-qualified # 🧘🏼♀️ woman in lotus position: medium-light skin tone
+1F9D8 1F3FC 200D 2640 ; minimally-qualified # 🧘🏼♀ woman in lotus position: medium-light skin tone
+1F9D8 1F3FD 200D 2640 FE0F ; fully-qualified # 🧘🏽♀️ woman in lotus position: medium skin tone
+1F9D8 1F3FD 200D 2640 ; minimally-qualified # 🧘🏽♀ woman in lotus position: medium skin tone
+1F9D8 1F3FE 200D 2640 FE0F ; fully-qualified # 🧘🏾♀️ woman in lotus position: medium-dark skin tone
+1F9D8 1F3FE 200D 2640 ; minimally-qualified # 🧘🏾♀ woman in lotus position: medium-dark skin tone
+1F9D8 1F3FF 200D 2640 FE0F ; fully-qualified # 🧘🏿♀️ woman in lotus position: dark skin tone
+1F9D8 1F3FF 200D 2640 ; minimally-qualified # 🧘🏿♀ woman in lotus position: dark skin tone
+1F6C0 ; fully-qualified # 🛀 person taking bath
+1F6C0 1F3FB ; fully-qualified # 🛀🏻 person taking bath: light skin tone
+1F6C0 1F3FC ; fully-qualified # 🛀🏼 person taking bath: medium-light skin tone
+1F6C0 1F3FD ; fully-qualified # 🛀🏽 person taking bath: medium skin tone
+1F6C0 1F3FE ; fully-qualified # 🛀🏾 person taking bath: medium-dark skin tone
+1F6C0 1F3FF ; fully-qualified # 🛀🏿 person taking bath: dark skin tone
+1F6CC ; fully-qualified # 🛌 person in bed
+1F6CC 1F3FB ; fully-qualified # 🛌🏻 person in bed: light skin tone
+1F6CC 1F3FC ; fully-qualified # 🛌🏼 person in bed: medium-light skin tone
+1F6CC 1F3FD ; fully-qualified # 🛌🏽 person in bed: medium skin tone
+1F6CC 1F3FE ; fully-qualified # 🛌🏾 person in bed: medium-dark skin tone
+1F6CC 1F3FF ; fully-qualified # 🛌🏿 person in bed: dark skin tone
+
+# subgroup: family
+1F9D1 200D 1F91D 200D 1F9D1 ; fully-qualified # 🧑🤝🧑 people holding hands
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏻🤝🧑🏻 people holding hands: light skin tone
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏼🤝🧑🏻 people holding hands: medium-light skin tone, light skin tone
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # 🧑🏼🤝🧑🏼 people holding hands: medium-light skin tone
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏽🤝🧑🏻 people holding hands: medium skin tone, light skin tone
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # 🧑🏽🤝🧑🏼 people holding hands: medium skin tone, medium-light skin tone
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # 🧑🏽🤝🧑🏽 people holding hands: medium skin tone
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏾🤝🧑🏻 people holding hands: medium-dark skin tone, light skin tone
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # 🧑🏾🤝🧑🏼 people holding hands: medium-dark skin tone, medium-light skin tone
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # 🧑🏾🤝🧑🏽 people holding hands: medium-dark skin tone, medium skin tone
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FE ; fully-qualified # 🧑🏾🤝🧑🏾 people holding hands: medium-dark skin tone
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏿🤝🧑🏻 people holding hands: dark skin tone, light skin tone
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # 🧑🏿🤝🧑🏼 people holding hands: dark skin tone, medium-light skin tone
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # 🧑🏿🤝🧑🏽 people holding hands: dark skin tone, medium skin tone
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FE ; fully-qualified # 🧑🏿🤝🧑🏾 people holding hands: dark skin tone, medium-dark skin tone
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FF ; fully-qualified # 🧑🏿🤝🧑🏿 people holding hands: dark skin tone
+1F46D ; fully-qualified # 👭 women holding hands
+1F46D 1F3FB ; fully-qualified # 👭🏻 women holding hands: light skin tone
+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # 👩🏼🤝👩🏻 women holding hands: medium-light skin tone, light skin tone
+1F46D 1F3FC ; fully-qualified # 👭🏼 women holding hands: medium-light skin tone
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # 👩🏽🤝👩🏻 women holding hands: medium skin tone, light skin tone
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # 👩🏽🤝👩🏼 women holding hands: medium skin tone, medium-light skin tone
+1F46D 1F3FD ; fully-qualified # 👭🏽 women holding hands: medium skin tone
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # 👩🏾🤝👩🏻 women holding hands: medium-dark skin tone, light skin tone
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # 👩🏾🤝👩🏼 women holding hands: medium-dark skin tone, medium-light skin tone
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FD ; fully-qualified # 👩🏾🤝👩🏽 women holding hands: medium-dark skin tone, medium skin tone
+1F46D 1F3FE ; fully-qualified # 👭🏾 women holding hands: medium-dark skin tone
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # 👩🏿🤝👩🏻 women holding hands: dark skin tone, light skin tone
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # 👩🏿🤝👩🏼 women holding hands: dark skin tone, medium-light skin tone
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FD ; fully-qualified # 👩🏿🤝👩🏽 women holding hands: dark skin tone, medium skin tone
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FE ; fully-qualified # 👩🏿🤝👩🏾 women holding hands: dark skin tone, medium-dark skin tone
+1F46D 1F3FF ; fully-qualified # 👭🏿 women holding hands: dark skin tone
+1F46B ; fully-qualified # 👫 woman and man holding hands
+1F46B 1F3FB ; fully-qualified # 👫🏻 woman and man holding hands: light skin tone
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👩🏻🤝👨🏼 woman and man holding hands: light skin tone, medium-light skin tone
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👩🏻🤝👨🏽 woman and man holding hands: light skin tone, medium skin tone
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👩🏻🤝👨🏾 woman and man holding hands: light skin tone, medium-dark skin tone
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # 👩🏻🤝👨🏿 woman and man holding hands: light skin tone, dark skin tone
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👩🏼🤝👨🏻 woman and man holding hands: medium-light skin tone, light skin tone
+1F46B 1F3FC ; fully-qualified # 👫🏼 woman and man holding hands: medium-light skin tone
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👩🏼🤝👨🏽 woman and man holding hands: medium-light skin tone, medium skin tone
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👩🏼🤝👨🏾 woman and man holding hands: medium-light skin tone, medium-dark skin tone
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # 👩🏼🤝👨🏿 woman and man holding hands: medium-light skin tone, dark skin tone
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👩🏽🤝👨🏻 woman and man holding hands: medium skin tone, light skin tone
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👩🏽🤝👨🏼 woman and man holding hands: medium skin tone, medium-light skin tone
+1F46B 1F3FD ; fully-qualified # 👫🏽 woman and man holding hands: medium skin tone
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👩🏽🤝👨🏾 woman and man holding hands: medium skin tone, medium-dark skin tone
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # 👩🏽🤝👨🏿 woman and man holding hands: medium skin tone, dark skin tone
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👩🏾🤝👨🏻 woman and man holding hands: medium-dark skin tone, light skin tone
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👩🏾🤝👨🏼 woman and man holding hands: medium-dark skin tone, medium-light skin tone
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👩🏾🤝👨🏽 woman and man holding hands: medium-dark skin tone, medium skin tone
+1F46B 1F3FE ; fully-qualified # 👫🏾 woman and man holding hands: medium-dark skin tone
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # 👩🏾🤝👨🏿 woman and man holding hands: medium-dark skin tone, dark skin tone
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👩🏿🤝👨🏻 woman and man holding hands: dark skin tone, light skin tone
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👩🏿🤝👨🏼 woman and man holding hands: dark skin tone, medium-light skin tone
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👩🏿🤝👨🏽 woman and man holding hands: dark skin tone, medium skin tone
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👩🏿🤝👨🏾 woman and man holding hands: dark skin tone, medium-dark skin tone
+1F46B 1F3FF ; fully-qualified # 👫🏿 woman and man holding hands: dark skin tone
+1F46C ; fully-qualified # 👬 men holding hands
+1F46C 1F3FB ; fully-qualified # 👬🏻 men holding hands: light skin tone
+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👨🏼🤝👨🏻 men holding hands: medium-light skin tone, light skin tone
+1F46C 1F3FC ; fully-qualified # 👬🏼 men holding hands: medium-light skin tone
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👨🏽🤝👨🏻 men holding hands: medium skin tone, light skin tone
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👨🏽🤝👨🏼 men holding hands: medium skin tone, medium-light skin tone
+1F46C 1F3FD ; fully-qualified # 👬🏽 men holding hands: medium skin tone
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👨🏾🤝👨🏻 men holding hands: medium-dark skin tone, light skin tone
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👨🏾🤝👨🏼 men holding hands: medium-dark skin tone, medium-light skin tone
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👨🏾🤝👨🏽 men holding hands: medium-dark skin tone, medium skin tone
+1F46C 1F3FE ; fully-qualified # 👬🏾 men holding hands: medium-dark skin tone
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👨🏿🤝👨🏻 men holding hands: dark skin tone, light skin tone
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👨🏿🤝👨🏼 men holding hands: dark skin tone, medium-light skin tone
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👨🏿🤝👨🏽 men holding hands: dark skin tone, medium skin tone
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👨🏿🤝👨🏾 men holding hands: dark skin tone, medium-dark skin tone
+1F46C 1F3FF ; fully-qualified # 👬🏿 men holding hands: dark skin tone
+1F48F ; fully-qualified # 💏 kiss
+1F469 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # 👩❤️💋👨 kiss: woman, man
+1F469 200D 2764 200D 1F48B 200D 1F468 ; minimally-qualified # 👩❤💋👨 kiss: woman, man
+1F468 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # 👨❤️💋👨 kiss: man, man
+1F468 200D 2764 200D 1F48B 200D 1F468 ; minimally-qualified # 👨❤💋👨 kiss: man, man
+1F469 200D 2764 FE0F 200D 1F48B 200D 1F469 ; fully-qualified # 👩❤️💋👩 kiss: woman, woman
+1F469 200D 2764 200D 1F48B 200D 1F469 ; minimally-qualified # 👩❤💋👩 kiss: woman, woman
+1F491 ; fully-qualified # 💑 couple with heart
+1F469 200D 2764 FE0F 200D 1F468 ; fully-qualified # 👩❤️👨 couple with heart: woman, man
+1F469 200D 2764 200D 1F468 ; minimally-qualified # 👩❤👨 couple with heart: woman, man
+1F468 200D 2764 FE0F 200D 1F468 ; fully-qualified # 👨❤️👨 couple with heart: man, man
+1F468 200D 2764 200D 1F468 ; minimally-qualified # 👨❤👨 couple with heart: man, man
+1F469 200D 2764 FE0F 200D 1F469 ; fully-qualified # 👩❤️👩 couple with heart: woman, woman
+1F469 200D 2764 200D 1F469 ; minimally-qualified # 👩❤👩 couple with heart: woman, woman
+1F46A ; fully-qualified # 👪 family
+1F468 200D 1F469 200D 1F466 ; fully-qualified # 👨👩👦 family: man, woman, boy
+1F468 200D 1F469 200D 1F467 ; fully-qualified # 👨👩👧 family: man, woman, girl
+1F468 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # 👨👩👧👦 family: man, woman, girl, boy
+1F468 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # 👨👩👦👦 family: man, woman, boy, boy
+1F468 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # 👨👩👧👧 family: man, woman, girl, girl
+1F468 200D 1F468 200D 1F466 ; fully-qualified # 👨👨👦 family: man, man, boy
+1F468 200D 1F468 200D 1F467 ; fully-qualified # 👨👨👧 family: man, man, girl
+1F468 200D 1F468 200D 1F467 200D 1F466 ; fully-qualified # 👨👨👧👦 family: man, man, girl, boy
+1F468 200D 1F468 200D 1F466 200D 1F466 ; fully-qualified # 👨👨👦👦 family: man, man, boy, boy
+1F468 200D 1F468 200D 1F467 200D 1F467 ; fully-qualified # 👨👨👧👧 family: man, man, girl, girl
+1F469 200D 1F469 200D 1F466 ; fully-qualified # 👩👩👦 family: woman, woman, boy
+1F469 200D 1F469 200D 1F467 ; fully-qualified # 👩👩👧 family: woman, woman, girl
+1F469 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # 👩👩👧👦 family: woman, woman, girl, boy
+1F469 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # 👩👩👦👦 family: woman, woman, boy, boy
+1F469 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # 👩👩👧👧 family: woman, woman, girl, girl
+1F468 200D 1F466 ; fully-qualified # 👨👦 family: man, boy
+1F468 200D 1F466 200D 1F466 ; fully-qualified # 👨👦👦 family: man, boy, boy
+1F468 200D 1F467 ; fully-qualified # 👨👧 family: man, girl
+1F468 200D 1F467 200D 1F466 ; fully-qualified # 👨👧👦 family: man, girl, boy
+1F468 200D 1F467 200D 1F467 ; fully-qualified # 👨👧👧 family: man, girl, girl
+1F469 200D 1F466 ; fully-qualified # 👩👦 family: woman, boy
+1F469 200D 1F466 200D 1F466 ; fully-qualified # 👩👦👦 family: woman, boy, boy
+1F469 200D 1F467 ; fully-qualified # 👩👧 family: woman, girl
+1F469 200D 1F467 200D 1F466 ; fully-qualified # 👩👧👦 family: woman, girl, boy
+1F469 200D 1F467 200D 1F467 ; fully-qualified # 👩👧👧 family: woman, girl, girl
+
+# subgroup: person-symbol
+1F5E3 FE0F ; fully-qualified # 🗣️ speaking head
+1F5E3 ; unqualified # 🗣 speaking head
+1F464 ; fully-qualified # 👤 bust in silhouette
+1F465 ; fully-qualified # 👥 busts in silhouette
+1F463 ; fully-qualified # 👣 footprints
+
+# People & Body subtotal: 2212
+# People & Body subtotal: 447 w/o modifiers
+
+# group: Component
+
+# subgroup: skin-tone
+1F3FB ; component # 🏻 light skin tone
+1F3FC ; component # 🏼 medium-light skin tone
+1F3FD ; component # 🏽 medium skin tone
+1F3FE ; component # 🏾 medium-dark skin tone
+1F3FF ; component # 🏿 dark skin tone
+
+# subgroup: hair-style
+1F9B0 ; component # 🦰 red hair
+1F9B1 ; component # 🦱 curly hair
+1F9B3 ; component # 🦳 white hair
+1F9B2 ; component # 🦲 bald
+
+# Component subtotal: 9
+# Component subtotal: 4 w/o modifiers
+
+# group: Animals & Nature
+
+# subgroup: animal-mammal
+1F435 ; fully-qualified # 🐵 monkey face
+1F412 ; fully-qualified # 🐒 monkey
+1F98D ; fully-qualified # 🦍 gorilla
+1F9A7 ; fully-qualified # 🦧 orangutan
+1F436 ; fully-qualified # 🐶 dog face
+1F415 ; fully-qualified # 🐕 dog
+1F9AE ; fully-qualified # 🦮 guide dog
+1F415 200D 1F9BA ; fully-qualified # 🐕🦺 service dog
+1F429 ; fully-qualified # 🐩 poodle
+1F43A ; fully-qualified # 🐺 wolf
+1F98A ; fully-qualified # 🦊 fox
+1F99D ; fully-qualified # 🦝 raccoon
+1F431 ; fully-qualified # 🐱 cat face
+1F408 ; fully-qualified # 🐈 cat
+1F981 ; fully-qualified # 🦁 lion
+1F42F ; fully-qualified # 🐯 tiger face
+1F405 ; fully-qualified # 🐅 tiger
+1F406 ; fully-qualified # 🐆 leopard
+1F434 ; fully-qualified # 🐴 horse face
+1F40E ; fully-qualified # 🐎 horse
+1F984 ; fully-qualified # 🦄 unicorn
+1F993 ; fully-qualified # 🦓 zebra
+1F98C ; fully-qualified # 🦌 deer
+1F42E ; fully-qualified # 🐮 cow face
+1F402 ; fully-qualified # 🐂 ox
+1F403 ; fully-qualified # 🐃 water buffalo
+1F404 ; fully-qualified # 🐄 cow
+1F437 ; fully-qualified # 🐷 pig face
+1F416 ; fully-qualified # 🐖 pig
+1F417 ; fully-qualified # 🐗 boar
+1F43D ; fully-qualified # 🐽 pig nose
+1F40F ; fully-qualified # 🐏 ram
+1F411 ; fully-qualified # 🐑 ewe
+1F410 ; fully-qualified # 🐐 goat
+1F42A ; fully-qualified # 🐪 camel
+1F42B ; fully-qualified # 🐫 two-hump camel
+1F999 ; fully-qualified # 🦙 llama
+1F992 ; fully-qualified # 🦒 giraffe
+1F418 ; fully-qualified # 🐘 elephant
+1F98F ; fully-qualified # 🦏 rhinoceros
+1F99B ; fully-qualified # 🦛 hippopotamus
+1F42D ; fully-qualified # 🐭 mouse face
+1F401 ; fully-qualified # 🐁 mouse
+1F400 ; fully-qualified # 🐀 rat
+1F439 ; fully-qualified # 🐹 hamster
+1F430 ; fully-qualified # 🐰 rabbit face
+1F407 ; fully-qualified # 🐇 rabbit
+1F43F FE0F ; fully-qualified # 🐿️ chipmunk
+1F43F ; unqualified # 🐿 chipmunk
+1F994 ; fully-qualified # 🦔 hedgehog
+1F987 ; fully-qualified # 🦇 bat
+1F43B ; fully-qualified # 🐻 bear
+1F428 ; fully-qualified # 🐨 koala
+1F43C ; fully-qualified # 🐼 panda
+1F9A5 ; fully-qualified # 🦥 sloth
+1F9A6 ; fully-qualified # 🦦 otter
+1F9A8 ; fully-qualified # 🦨 skunk
+1F998 ; fully-qualified # 🦘 kangaroo
+1F9A1 ; fully-qualified # 🦡 badger
+1F43E ; fully-qualified # 🐾 paw prints
+
+# subgroup: animal-bird
+1F983 ; fully-qualified # 🦃 turkey
+1F414 ; fully-qualified # 🐔 chicken
+1F413 ; fully-qualified # 🐓 rooster
+1F423 ; fully-qualified # 🐣 hatching chick
+1F424 ; fully-qualified # 🐤 baby chick
+1F425 ; fully-qualified # 🐥 front-facing baby chick
+1F426 ; fully-qualified # 🐦 bird
+1F427 ; fully-qualified # 🐧 penguin
+1F54A FE0F ; fully-qualified # 🕊️ dove
+1F54A ; unqualified # 🕊 dove
+1F985 ; fully-qualified # 🦅 eagle
+1F986 ; fully-qualified # 🦆 duck
+1F9A2 ; fully-qualified # 🦢 swan
+1F989 ; fully-qualified # 🦉 owl
+1F9A9 ; fully-qualified # 🦩 flamingo
+1F99A ; fully-qualified # 🦚 peacock
+1F99C ; fully-qualified # 🦜 parrot
+
+# subgroup: animal-amphibian
+1F438 ; fully-qualified # 🐸 frog
+
+# subgroup: animal-reptile
+1F40A ; fully-qualified # 🐊 crocodile
+1F422 ; fully-qualified # 🐢 turtle
+1F98E ; fully-qualified # 🦎 lizard
+1F40D ; fully-qualified # 🐍 snake
+1F432 ; fully-qualified # 🐲 dragon face
+1F409 ; fully-qualified # 🐉 dragon
+1F995 ; fully-qualified # 🦕 sauropod
+1F996 ; fully-qualified # 🦖 T-Rex
+
+# subgroup: animal-marine
+1F433 ; fully-qualified # 🐳 spouting whale
+1F40B ; fully-qualified # 🐋 whale
+1F42C ; fully-qualified # 🐬 dolphin
+1F41F ; fully-qualified # 🐟 fish
+1F420 ; fully-qualified # 🐠 tropical fish
+1F421 ; fully-qualified # 🐡 blowfish
+1F988 ; fully-qualified # 🦈 shark
+1F419 ; fully-qualified # 🐙 octopus
+1F41A ; fully-qualified # 🐚 spiral shell
+
+# subgroup: animal-bug
+1F40C ; fully-qualified # 🐌 snail
+1F98B ; fully-qualified # 🦋 butterfly
+1F41B ; fully-qualified # 🐛 bug
+1F41C ; fully-qualified # 🐜 ant
+1F41D ; fully-qualified # 🐝 honeybee
+1F41E ; fully-qualified # 🐞 lady beetle
+1F997 ; fully-qualified # 🦗 cricket
+1F577 FE0F ; fully-qualified # 🕷️ spider
+1F577 ; unqualified # 🕷 spider
+1F578 FE0F ; fully-qualified # 🕸️ spider web
+1F578 ; unqualified # 🕸 spider web
+1F982 ; fully-qualified # 🦂 scorpion
+1F99F ; fully-qualified # 🦟 mosquito
+1F9A0 ; fully-qualified # 🦠 microbe
+
+# subgroup: plant-flower
+1F490 ; fully-qualified # 💐 bouquet
+1F338 ; fully-qualified # 🌸 cherry blossom
+1F4AE ; fully-qualified # 💮 white flower
+1F3F5 FE0F ; fully-qualified # 🏵️ rosette
+1F3F5 ; unqualified # 🏵 rosette
+1F339 ; fully-qualified # 🌹 rose
+1F940 ; fully-qualified # 🥀 wilted flower
+1F33A ; fully-qualified # 🌺 hibiscus
+1F33B ; fully-qualified # 🌻 sunflower
+1F33C ; fully-qualified # 🌼 blossom
+1F337 ; fully-qualified # 🌷 tulip
+
+# subgroup: plant-other
+1F331 ; fully-qualified # 🌱 seedling
+1F332 ; fully-qualified # 🌲 evergreen tree
+1F333 ; fully-qualified # 🌳 deciduous tree
+1F334 ; fully-qualified # 🌴 palm tree
+1F335 ; fully-qualified # 🌵 cactus
+1F33E ; fully-qualified # 🌾 sheaf of rice
+1F33F ; fully-qualified # 🌿 herb
+2618 FE0F ; fully-qualified # ☘️ shamrock
+2618 ; unqualified # ☘ shamrock
+1F340 ; fully-qualified # 🍀 four leaf clover
+1F341 ; fully-qualified # 🍁 maple leaf
+1F342 ; fully-qualified # 🍂 fallen leaf
+1F343 ; fully-qualified # 🍃 leaf fluttering in wind
+
+# Animals & Nature subtotal: 133
+# Animals & Nature subtotal: 133 w/o modifiers
+
+# group: Food & Drink
+
+# subgroup: food-fruit
+1F347 ; fully-qualified # 🍇 grapes
+1F348 ; fully-qualified # 🍈 melon
+1F349 ; fully-qualified # 🍉 watermelon
+1F34A ; fully-qualified # 🍊 tangerine
+1F34B ; fully-qualified # 🍋 lemon
+1F34C ; fully-qualified # 🍌 banana
+1F34D ; fully-qualified # 🍍 pineapple
+1F96D ; fully-qualified # 🥭 mango
+1F34E ; fully-qualified # 🍎 red apple
+1F34F ; fully-qualified # 🍏 green apple
+1F350 ; fully-qualified # 🍐 pear
+1F351 ; fully-qualified # 🍑 peach
+1F352 ; fully-qualified # 🍒 cherries
+1F353 ; fully-qualified # 🍓 strawberry
+1F95D ; fully-qualified # 🥝 kiwi fruit
+1F345 ; fully-qualified # 🍅 tomato
+1F965 ; fully-qualified # 🥥 coconut
+
+# subgroup: food-vegetable
+1F951 ; fully-qualified # 🥑 avocado
+1F346 ; fully-qualified # 🍆 eggplant
+1F954 ; fully-qualified # 🥔 potato
+1F955 ; fully-qualified # 🥕 carrot
+1F33D ; fully-qualified # 🌽 ear of corn
+1F336 FE0F ; fully-qualified # 🌶️ hot pepper
+1F336 ; unqualified # 🌶 hot pepper
+1F952 ; fully-qualified # 🥒 cucumber
+1F96C ; fully-qualified # 🥬 leafy green
+1F966 ; fully-qualified # 🥦 broccoli
+1F9C4 ; fully-qualified # 🧄 garlic
+1F9C5 ; fully-qualified # 🧅 onion
+1F344 ; fully-qualified # 🍄 mushroom
+1F95C ; fully-qualified # 🥜 peanuts
+1F330 ; fully-qualified # 🌰 chestnut
+
+# subgroup: food-prepared
+1F35E ; fully-qualified # 🍞 bread
+1F950 ; fully-qualified # 🥐 croissant
+1F956 ; fully-qualified # 🥖 baguette bread
+1F968 ; fully-qualified # 🥨 pretzel
+1F96F ; fully-qualified # 🥯 bagel
+1F95E ; fully-qualified # 🥞 pancakes
+1F9C7 ; fully-qualified # 🧇 waffle
+1F9C0 ; fully-qualified # 🧀 cheese wedge
+1F356 ; fully-qualified # 🍖 meat on bone
+1F357 ; fully-qualified # 🍗 poultry leg
+1F969 ; fully-qualified # 🥩 cut of meat
+1F953 ; fully-qualified # 🥓 bacon
+1F354 ; fully-qualified # 🍔 hamburger
+1F35F ; fully-qualified # 🍟 french fries
+1F355 ; fully-qualified # 🍕 pizza
+1F32D ; fully-qualified # 🌭 hot dog
+1F96A ; fully-qualified # 🥪 sandwich
+1F32E ; fully-qualified # 🌮 taco
+1F32F ; fully-qualified # 🌯 burrito
+1F959 ; fully-qualified # 🥙 stuffed flatbread
+1F9C6 ; fully-qualified # 🧆 falafel
+1F95A ; fully-qualified # 🥚 egg
+1F373 ; fully-qualified # 🍳 cooking
+1F958 ; fully-qualified # 🥘 shallow pan of food
+1F372 ; fully-qualified # 🍲 pot of food
+1F963 ; fully-qualified # 🥣 bowl with spoon
+1F957 ; fully-qualified # 🥗 green salad
+1F37F ; fully-qualified # 🍿 popcorn
+1F9C8 ; fully-qualified # 🧈 butter
+1F9C2 ; fully-qualified # 🧂 salt
+1F96B ; fully-qualified # 🥫 canned food
+
+# subgroup: food-asian
+1F371 ; fully-qualified # 🍱 bento box
+1F358 ; fully-qualified # 🍘 rice cracker
+1F359 ; fully-qualified # 🍙 rice ball
+1F35A ; fully-qualified # 🍚 cooked rice
+1F35B ; fully-qualified # 🍛 curry rice
+1F35C ; fully-qualified # 🍜 steaming bowl
+1F35D ; fully-qualified # 🍝 spaghetti
+1F360 ; fully-qualified # 🍠 roasted sweet potato
+1F362 ; fully-qualified # 🍢 oden
+1F363 ; fully-qualified # 🍣 sushi
+1F364 ; fully-qualified # 🍤 fried shrimp
+1F365 ; fully-qualified # 🍥 fish cake with swirl
+1F96E ; fully-qualified # 🥮 moon cake
+1F361 ; fully-qualified # 🍡 dango
+1F95F ; fully-qualified # 🥟 dumpling
+1F960 ; fully-qualified # 🥠 fortune cookie
+1F961 ; fully-qualified # 🥡 takeout box
+
+# subgroup: food-marine
+1F980 ; fully-qualified # 🦀 crab
+1F99E ; fully-qualified # 🦞 lobster
+1F990 ; fully-qualified # 🦐 shrimp
+1F991 ; fully-qualified # 🦑 squid
+1F9AA ; fully-qualified # 🦪 oyster
+
+# subgroup: food-sweet
+1F366 ; fully-qualified # 🍦 soft ice cream
+1F367 ; fully-qualified # 🍧 shaved ice
+1F368 ; fully-qualified # 🍨 ice cream
+1F369 ; fully-qualified # 🍩 doughnut
+1F36A ; fully-qualified # 🍪 cookie
+1F382 ; fully-qualified # 🎂 birthday cake
+1F370 ; fully-qualified # 🍰 shortcake
+1F9C1 ; fully-qualified # 🧁 cupcake
+1F967 ; fully-qualified # 🥧 pie
+1F36B ; fully-qualified # 🍫 chocolate bar
+1F36C ; fully-qualified # 🍬 candy
+1F36D ; fully-qualified # 🍭 lollipop
+1F36E ; fully-qualified # 🍮 custard
+1F36F ; fully-qualified # 🍯 honey pot
+
+# subgroup: drink
+1F37C ; fully-qualified # 🍼 baby bottle
+1F95B ; fully-qualified # 🥛 glass of milk
+2615 ; fully-qualified # ☕ hot beverage
+1F375 ; fully-qualified # 🍵 teacup without handle
+1F376 ; fully-qualified # 🍶 sake
+1F37E ; fully-qualified # 🍾 bottle with popping cork
+1F377 ; fully-qualified # 🍷 wine glass
+1F378 ; fully-qualified # 🍸 cocktail glass
+1F379 ; fully-qualified # 🍹 tropical drink
+1F37A ; fully-qualified # 🍺 beer mug
+1F37B ; fully-qualified # 🍻 clinking beer mugs
+1F942 ; fully-qualified # 🥂 clinking glasses
+1F943 ; fully-qualified # 🥃 tumbler glass
+1F964 ; fully-qualified # 🥤 cup with straw
+1F9C3 ; fully-qualified # 🧃 beverage box
+1F9C9 ; fully-qualified # 🧉 mate
+1F9CA ; fully-qualified # 🧊 ice cube
+
+# subgroup: dishware
+1F962 ; fully-qualified # 🥢 chopsticks
+1F37D FE0F ; fully-qualified # 🍽️ fork and knife with plate
+1F37D ; unqualified # 🍽 fork and knife with plate
+1F374 ; fully-qualified # 🍴 fork and knife
+1F944 ; fully-qualified # 🥄 spoon
+1F52A ; fully-qualified # 🔪 kitchen knife
+1F3FA ; fully-qualified # 🏺 amphora
+
+# Food & Drink subtotal: 123
+# Food & Drink subtotal: 123 w/o modifiers
+
+# group: Travel & Places
+
+# subgroup: place-map
+1F30D ; fully-qualified # 🌍 globe showing Europe-Africa
+1F30E ; fully-qualified # 🌎 globe showing Americas
+1F30F ; fully-qualified # 🌏 globe showing Asia-Australia
+1F310 ; fully-qualified # 🌐 globe with meridians
+1F5FA FE0F ; fully-qualified # 🗺️ world map
+1F5FA ; unqualified # 🗺 world map
+1F5FE ; fully-qualified # 🗾 map of Japan
+1F9ED ; fully-qualified # 🧭 compass
+
+# subgroup: place-geographic
+1F3D4 FE0F ; fully-qualified # 🏔️ snow-capped mountain
+1F3D4 ; unqualified # 🏔 snow-capped mountain
+26F0 FE0F ; fully-qualified # ⛰️ mountain
+26F0 ; unqualified # ⛰ mountain
+1F30B ; fully-qualified # 🌋 volcano
+1F5FB ; fully-qualified # 🗻 mount fuji
+1F3D5 FE0F ; fully-qualified # 🏕️ camping
+1F3D5 ; unqualified # 🏕 camping
+1F3D6 FE0F ; fully-qualified # 🏖️ beach with umbrella
+1F3D6 ; unqualified # 🏖 beach with umbrella
+1F3DC FE0F ; fully-qualified # 🏜️ desert
+1F3DC ; unqualified # 🏜 desert
+1F3DD FE0F ; fully-qualified # 🏝️ desert island
+1F3DD ; unqualified # 🏝 desert island
+1F3DE FE0F ; fully-qualified # 🏞️ national park
+1F3DE ; unqualified # 🏞 national park
+
+# subgroup: place-building
+1F3DF FE0F ; fully-qualified # 🏟️ stadium
+1F3DF ; unqualified # 🏟 stadium
+1F3DB FE0F ; fully-qualified # 🏛️ classical building
+1F3DB ; unqualified # 🏛 classical building
+1F3D7 FE0F ; fully-qualified # 🏗️ building construction
+1F3D7 ; unqualified # 🏗 building construction
+1F9F1 ; fully-qualified # 🧱 brick
+1F3D8 FE0F ; fully-qualified # 🏘️ houses
+1F3D8 ; unqualified # 🏘 houses
+1F3DA FE0F ; fully-qualified # 🏚️ derelict house
+1F3DA ; unqualified # 🏚 derelict house
+1F3E0 ; fully-qualified # 🏠 house
+1F3E1 ; fully-qualified # 🏡 house with garden
+1F3E2 ; fully-qualified # 🏢 office building
+1F3E3 ; fully-qualified # 🏣 Japanese post office
+1F3E4 ; fully-qualified # 🏤 post office
+1F3E5 ; fully-qualified # 🏥 hospital
+1F3E6 ; fully-qualified # 🏦 bank
+1F3E8 ; fully-qualified # 🏨 hotel
+1F3E9 ; fully-qualified # 🏩 love hotel
+1F3EA ; fully-qualified # 🏪 convenience store
+1F3EB ; fully-qualified # 🏫 school
+1F3EC ; fully-qualified # 🏬 department store
+1F3ED ; fully-qualified # 🏭 factory
+1F3EF ; fully-qualified # 🏯 Japanese castle
+1F3F0 ; fully-qualified # 🏰 castle
+1F492 ; fully-qualified # 💒 wedding
+1F5FC ; fully-qualified # 🗼 Tokyo tower
+1F5FD ; fully-qualified # 🗽 Statue of Liberty
+
+# subgroup: place-religious
+26EA ; fully-qualified # ⛪ church
+1F54C ; fully-qualified # 🕌 mosque
+1F6D5 ; fully-qualified # 🛕 hindu temple
+1F54D ; fully-qualified # 🕍 synagogue
+26E9 FE0F ; fully-qualified # ⛩️ shinto shrine
+26E9 ; unqualified # ⛩ shinto shrine
+1F54B ; fully-qualified # 🕋 kaaba
+
+# subgroup: place-other
+26F2 ; fully-qualified # ⛲ fountain
+26FA ; fully-qualified # ⛺ tent
+1F301 ; fully-qualified # 🌁 foggy
+1F303 ; fully-qualified # 🌃 night with stars
+1F3D9 FE0F ; fully-qualified # 🏙️ cityscape
+1F3D9 ; unqualified # 🏙 cityscape
+1F304 ; fully-qualified # 🌄 sunrise over mountains
+1F305 ; fully-qualified # 🌅 sunrise
+1F306 ; fully-qualified # 🌆 cityscape at dusk
+1F307 ; fully-qualified # 🌇 sunset
+1F309 ; fully-qualified # 🌉 bridge at night
+2668 FE0F ; fully-qualified # ♨️ hot springs
+2668 ; unqualified # ♨ hot springs
+1F3A0 ; fully-qualified # 🎠 carousel horse
+1F3A1 ; fully-qualified # 🎡 ferris wheel
+1F3A2 ; fully-qualified # 🎢 roller coaster
+1F488 ; fully-qualified # 💈 barber pole
+1F3AA ; fully-qualified # 🎪 circus tent
+
+# subgroup: transport-ground
+1F682 ; fully-qualified # 🚂 locomotive
+1F683 ; fully-qualified # 🚃 railway car
+1F684 ; fully-qualified # 🚄 high-speed train
+1F685 ; fully-qualified # 🚅 bullet train
+1F686 ; fully-qualified # 🚆 train
+1F687 ; fully-qualified # 🚇 metro
+1F688 ; fully-qualified # 🚈 light rail
+1F689 ; fully-qualified # 🚉 station
+1F68A ; fully-qualified # 🚊 tram
+1F69D ; fully-qualified # 🚝 monorail
+1F69E ; fully-qualified # 🚞 mountain railway
+1F68B ; fully-qualified # 🚋 tram car
+1F68C ; fully-qualified # 🚌 bus
+1F68D ; fully-qualified # 🚍 oncoming bus
+1F68E ; fully-qualified # 🚎 trolleybus
+1F690 ; fully-qualified # 🚐 minibus
+1F691 ; fully-qualified # 🚑 ambulance
+1F692 ; fully-qualified # 🚒 fire engine
+1F693 ; fully-qualified # 🚓 police car
+1F694 ; fully-qualified # 🚔 oncoming police car
+1F695 ; fully-qualified # 🚕 taxi
+1F696 ; fully-qualified # 🚖 oncoming taxi
+1F697 ; fully-qualified # 🚗 automobile
+1F698 ; fully-qualified # 🚘 oncoming automobile
+1F699 ; fully-qualified # 🚙 sport utility vehicle
+1F69A ; fully-qualified # 🚚 delivery truck
+1F69B ; fully-qualified # 🚛 articulated lorry
+1F69C ; fully-qualified # 🚜 tractor
+1F3CE FE0F ; fully-qualified # 🏎️ racing car
+1F3CE ; unqualified # 🏎 racing car
+1F3CD FE0F ; fully-qualified # 🏍️ motorcycle
+1F3CD ; unqualified # 🏍 motorcycle
+1F6F5 ; fully-qualified # 🛵 motor scooter
+1F9BD ; fully-qualified # 🦽 manual wheelchair
+1F9BC ; fully-qualified # 🦼 motorized wheelchair
+1F6FA ; fully-qualified # 🛺 auto rickshaw
+1F6B2 ; fully-qualified # 🚲 bicycle
+1F6F4 ; fully-qualified # 🛴 kick scooter
+1F6F9 ; fully-qualified # 🛹 skateboard
+1F68F ; fully-qualified # 🚏 bus stop
+1F6E3 FE0F ; fully-qualified # 🛣️ motorway
+1F6E3 ; unqualified # 🛣 motorway
+1F6E4 FE0F ; fully-qualified # 🛤️ railway track
+1F6E4 ; unqualified # 🛤 railway track
+1F6E2 FE0F ; fully-qualified # 🛢️ oil drum
+1F6E2 ; unqualified # 🛢 oil drum
+26FD ; fully-qualified # ⛽ fuel pump
+1F6A8 ; fully-qualified # 🚨 police car light
+1F6A5 ; fully-qualified # 🚥 horizontal traffic light
+1F6A6 ; fully-qualified # 🚦 vertical traffic light
+1F6D1 ; fully-qualified # 🛑 stop sign
+1F6A7 ; fully-qualified # 🚧 construction
+
+# subgroup: transport-water
+2693 ; fully-qualified # ⚓ anchor
+26F5 ; fully-qualified # ⛵ sailboat
+1F6F6 ; fully-qualified # 🛶 canoe
+1F6A4 ; fully-qualified # 🚤 speedboat
+1F6F3 FE0F ; fully-qualified # 🛳️ passenger ship
+1F6F3 ; unqualified # 🛳 passenger ship
+26F4 FE0F ; fully-qualified # ⛴️ ferry
+26F4 ; unqualified # ⛴ ferry
+1F6E5 FE0F ; fully-qualified # 🛥️ motor boat
+1F6E5 ; unqualified # 🛥 motor boat
+1F6A2 ; fully-qualified # 🚢 ship
+
+# subgroup: transport-air
+2708 FE0F ; fully-qualified # ✈️ airplane
+2708 ; unqualified # ✈ airplane
+1F6E9 FE0F ; fully-qualified # 🛩️ small airplane
+1F6E9 ; unqualified # 🛩 small airplane
+1F6EB ; fully-qualified # 🛫 airplane departure
+1F6EC ; fully-qualified # 🛬 airplane arrival
+1FA82 ; fully-qualified # 🪂 parachute
+1F4BA ; fully-qualified # 💺 seat
+1F681 ; fully-qualified # 🚁 helicopter
+1F69F ; fully-qualified # 🚟 suspension railway
+1F6A0 ; fully-qualified # 🚠 mountain cableway
+1F6A1 ; fully-qualified # 🚡 aerial tramway
+1F6F0 FE0F ; fully-qualified # 🛰️ satellite
+1F6F0 ; unqualified # 🛰 satellite
+1F680 ; fully-qualified # 🚀 rocket
+1F6F8 ; fully-qualified # 🛸 flying saucer
+
+# subgroup: hotel
+1F6CE FE0F ; fully-qualified # 🛎️ bellhop bell
+1F6CE ; unqualified # 🛎 bellhop bell
+1F9F3 ; fully-qualified # 🧳 luggage
+
+# subgroup: time
+231B ; fully-qualified # ⌛ hourglass done
+23F3 ; fully-qualified # ⏳ hourglass not done
+231A ; fully-qualified # ⌚ watch
+23F0 ; fully-qualified # ⏰ alarm clock
+23F1 FE0F ; fully-qualified # ⏱️ stopwatch
+23F1 ; unqualified # ⏱ stopwatch
+23F2 FE0F ; fully-qualified # ⏲️ timer clock
+23F2 ; unqualified # ⏲ timer clock
+1F570 FE0F ; fully-qualified # 🕰️ mantelpiece clock
+1F570 ; unqualified # 🕰 mantelpiece clock
+1F55B ; fully-qualified # 🕛 twelve o’clock
+1F567 ; fully-qualified # 🕧 twelve-thirty
+1F550 ; fully-qualified # 🕐 one o’clock
+1F55C ; fully-qualified # 🕜 one-thirty
+1F551 ; fully-qualified # 🕑 two o’clock
+1F55D ; fully-qualified # 🕝 two-thirty
+1F552 ; fully-qualified # 🕒 three o’clock
+1F55E ; fully-qualified # 🕞 three-thirty
+1F553 ; fully-qualified # 🕓 four o’clock
+1F55F ; fully-qualified # 🕟 four-thirty
+1F554 ; fully-qualified # 🕔 five o’clock
+1F560 ; fully-qualified # 🕠 five-thirty
+1F555 ; fully-qualified # 🕕 six o’clock
+1F561 ; fully-qualified # 🕡 six-thirty
+1F556 ; fully-qualified # 🕖 seven o’clock
+1F562 ; fully-qualified # 🕢 seven-thirty
+1F557 ; fully-qualified # 🕗 eight o’clock
+1F563 ; fully-qualified # 🕣 eight-thirty
+1F558 ; fully-qualified # 🕘 nine o’clock
+1F564 ; fully-qualified # 🕤 nine-thirty
+1F559 ; fully-qualified # 🕙 ten o’clock
+1F565 ; fully-qualified # 🕥 ten-thirty
+1F55A ; fully-qualified # 🕚 eleven o’clock
+1F566 ; fully-qualified # 🕦 eleven-thirty
+
+# subgroup: sky & weather
+1F311 ; fully-qualified # 🌑 new moon
+1F312 ; fully-qualified # 🌒 waxing crescent moon
+1F313 ; fully-qualified # 🌓 first quarter moon
+1F314 ; fully-qualified # 🌔 waxing gibbous moon
+1F315 ; fully-qualified # 🌕 full moon
+1F316 ; fully-qualified # 🌖 waning gibbous moon
+1F317 ; fully-qualified # 🌗 last quarter moon
+1F318 ; fully-qualified # 🌘 waning crescent moon
+1F319 ; fully-qualified # 🌙 crescent moon
+1F31A ; fully-qualified # 🌚 new moon face
+1F31B ; fully-qualified # 🌛 first quarter moon face
+1F31C ; fully-qualified # 🌜 last quarter moon face
+1F321 FE0F ; fully-qualified # 🌡️ thermometer
+1F321 ; unqualified # 🌡 thermometer
+2600 FE0F ; fully-qualified # ☀️ sun
+2600 ; unqualified # ☀ sun
+1F31D ; fully-qualified # 🌝 full moon face
+1F31E ; fully-qualified # 🌞 sun with face
+1FA90 ; fully-qualified # 🪐 ringed planet
+2B50 ; fully-qualified # ⭐ star
+1F31F ; fully-qualified # 🌟 glowing star
+1F320 ; fully-qualified # 🌠 shooting star
+1F30C ; fully-qualified # 🌌 milky way
+2601 FE0F ; fully-qualified # ☁️ cloud
+2601 ; unqualified # ☁ cloud
+26C5 ; fully-qualified # ⛅ sun behind cloud
+26C8 FE0F ; fully-qualified # ⛈️ cloud with lightning and rain
+26C8 ; unqualified # ⛈ cloud with lightning and rain
+1F324 FE0F ; fully-qualified # 🌤️ sun behind small cloud
+1F324 ; unqualified # 🌤 sun behind small cloud
+1F325 FE0F ; fully-qualified # 🌥️ sun behind large cloud
+1F325 ; unqualified # 🌥 sun behind large cloud
+1F326 FE0F ; fully-qualified # 🌦️ sun behind rain cloud
+1F326 ; unqualified # 🌦 sun behind rain cloud
+1F327 FE0F ; fully-qualified # 🌧️ cloud with rain
+1F327 ; unqualified # 🌧 cloud with rain
+1F328 FE0F ; fully-qualified # 🌨️ cloud with snow
+1F328 ; unqualified # 🌨 cloud with snow
+1F329 FE0F ; fully-qualified # 🌩️ cloud with lightning
+1F329 ; unqualified # 🌩 cloud with lightning
+1F32A FE0F ; fully-qualified # 🌪️ tornado
+1F32A ; unqualified # 🌪 tornado
+1F32B FE0F ; fully-qualified # 🌫️ fog
+1F32B ; unqualified # 🌫 fog
+1F32C FE0F ; fully-qualified # 🌬️ wind face
+1F32C ; unqualified # 🌬 wind face
+1F300 ; fully-qualified # 🌀 cyclone
+1F308 ; fully-qualified # 🌈 rainbow
+1F302 ; fully-qualified # 🌂 closed umbrella
+2602 FE0F ; fully-qualified # ☂️ umbrella
+2602 ; unqualified # ☂ umbrella
+2614 ; fully-qualified # ☔ umbrella with rain drops
+26F1 FE0F ; fully-qualified # ⛱️ umbrella on ground
+26F1 ; unqualified # ⛱ umbrella on ground
+26A1 ; fully-qualified # ⚡ high voltage
+2744 FE0F ; fully-qualified # ❄️ snowflake
+2744 ; unqualified # ❄ snowflake
+2603 FE0F ; fully-qualified # ☃️ snowman
+2603 ; unqualified # ☃ snowman
+26C4 ; fully-qualified # ⛄ snowman without snow
+2604 FE0F ; fully-qualified # ☄️ comet
+2604 ; unqualified # ☄ comet
+1F525 ; fully-qualified # 🔥 fire
+1F4A7 ; fully-qualified # 💧 droplet
+1F30A ; fully-qualified # 🌊 water wave
+
+# Travel & Places subtotal: 259
+# Travel & Places subtotal: 259 w/o modifiers
+
+# group: Activities
+
+# subgroup: event
+1F383 ; fully-qualified # 🎃 jack-o-lantern
+1F384 ; fully-qualified # 🎄 Christmas tree
+1F386 ; fully-qualified # 🎆 fireworks
+1F387 ; fully-qualified # 🎇 sparkler
+1F9E8 ; fully-qualified # 🧨 firecracker
+2728 ; fully-qualified # ✨ sparkles
+1F388 ; fully-qualified # 🎈 balloon
+1F389 ; fully-qualified # 🎉 party popper
+1F38A ; fully-qualified # 🎊 confetti ball
+1F38B ; fully-qualified # 🎋 tanabata tree
+1F38D ; fully-qualified # 🎍 pine decoration
+1F38E ; fully-qualified # 🎎 Japanese dolls
+1F38F ; fully-qualified # 🎏 carp streamer
+1F390 ; fully-qualified # 🎐 wind chime
+1F391 ; fully-qualified # 🎑 moon viewing ceremony
+1F9E7 ; fully-qualified # 🧧 red envelope
+1F380 ; fully-qualified # 🎀 ribbon
+1F381 ; fully-qualified # 🎁 wrapped gift
+1F397 FE0F ; fully-qualified # 🎗️ reminder ribbon
+1F397 ; unqualified # 🎗 reminder ribbon
+1F39F FE0F ; fully-qualified # 🎟️ admission tickets
+1F39F ; unqualified # 🎟 admission tickets
+1F3AB ; fully-qualified # 🎫 ticket
+
+# subgroup: award-medal
+1F396 FE0F ; fully-qualified # 🎖️ military medal
+1F396 ; unqualified # 🎖 military medal
+1F3C6 ; fully-qualified # 🏆 trophy
+1F3C5 ; fully-qualified # 🏅 sports medal
+1F947 ; fully-qualified # 🥇 1st place medal
+1F948 ; fully-qualified # 🥈 2nd place medal
+1F949 ; fully-qualified # 🥉 3rd place medal
+
+# subgroup: sport
+26BD ; fully-qualified # ⚽ soccer ball
+26BE ; fully-qualified # ⚾ baseball
+1F94E ; fully-qualified # 🥎 softball
+1F3C0 ; fully-qualified # 🏀 basketball
+1F3D0 ; fully-qualified # 🏐 volleyball
+1F3C8 ; fully-qualified # 🏈 american football
+1F3C9 ; fully-qualified # 🏉 rugby football
+1F3BE ; fully-qualified # 🎾 tennis
+1F94F ; fully-qualified # 🥏 flying disc
+1F3B3 ; fully-qualified # 🎳 bowling
+1F3CF ; fully-qualified # 🏏 cricket game
+1F3D1 ; fully-qualified # 🏑 field hockey
+1F3D2 ; fully-qualified # 🏒 ice hockey
+1F94D ; fully-qualified # 🥍 lacrosse
+1F3D3 ; fully-qualified # 🏓 ping pong
+1F3F8 ; fully-qualified # 🏸 badminton
+1F94A ; fully-qualified # 🥊 boxing glove
+1F94B ; fully-qualified # 🥋 martial arts uniform
+1F945 ; fully-qualified # 🥅 goal net
+26F3 ; fully-qualified # ⛳ flag in hole
+26F8 FE0F ; fully-qualified # ⛸️ ice skate
+26F8 ; unqualified # ⛸ ice skate
+1F3A3 ; fully-qualified # 🎣 fishing pole
+1F93F ; fully-qualified # 🤿 diving mask
+1F3BD ; fully-qualified # 🎽 running shirt
+1F3BF ; fully-qualified # 🎿 skis
+1F6F7 ; fully-qualified # 🛷 sled
+1F94C ; fully-qualified # 🥌 curling stone
+
+# subgroup: game
+1F3AF ; fully-qualified # 🎯 direct hit
+1FA80 ; fully-qualified # 🪀 yo-yo
+1FA81 ; fully-qualified # 🪁 kite
+1F3B1 ; fully-qualified # 🎱 pool 8 ball
+1F52E ; fully-qualified # 🔮 crystal ball
+1F9FF ; fully-qualified # 🧿 nazar amulet
+1F3AE ; fully-qualified # 🎮 video game
+1F579 FE0F ; fully-qualified # 🕹️ joystick
+1F579 ; unqualified # 🕹 joystick
+1F3B0 ; fully-qualified # 🎰 slot machine
+1F3B2 ; fully-qualified # 🎲 game die
+1F9E9 ; fully-qualified # 🧩 puzzle piece
+1F9F8 ; fully-qualified # 🧸 teddy bear
+2660 FE0F ; fully-qualified # ♠️ spade suit
+2660 ; unqualified # ♠ spade suit
+2665 FE0F ; fully-qualified # ♥️ heart suit
+2665 ; unqualified # ♥ heart suit
+2666 FE0F ; fully-qualified # ♦️ diamond suit
+2666 ; unqualified # ♦ diamond suit
+2663 FE0F ; fully-qualified # ♣️ club suit
+2663 ; unqualified # ♣ club suit
+265F FE0F ; fully-qualified # ♟️ chess pawn
+265F ; unqualified # ♟ chess pawn
+1F0CF ; fully-qualified # 🃏 joker
+1F004 ; fully-qualified # 🀄 mahjong red dragon
+1F3B4 ; fully-qualified # 🎴 flower playing cards
+
+# subgroup: arts & crafts
+1F3AD ; fully-qualified # 🎭 performing arts
+1F5BC FE0F ; fully-qualified # 🖼️ framed picture
+1F5BC ; unqualified # 🖼 framed picture
+1F3A8 ; fully-qualified # 🎨 artist palette
+1F9F5 ; fully-qualified # 🧵 thread
+1F9F6 ; fully-qualified # 🧶 yarn
+
+# Activities subtotal: 90
+# Activities subtotal: 90 w/o modifiers
+
+# group: Objects
+
+# subgroup: clothing
+1F453 ; fully-qualified # 👓 glasses
+1F576 FE0F ; fully-qualified # 🕶️ sunglasses
+1F576 ; unqualified # 🕶 sunglasses
+1F97D ; fully-qualified # 🥽 goggles
+1F97C ; fully-qualified # 🥼 lab coat
+1F9BA ; fully-qualified # 🦺 safety vest
+1F454 ; fully-qualified # 👔 necktie
+1F455 ; fully-qualified # 👕 t-shirt
+1F456 ; fully-qualified # 👖 jeans
+1F9E3 ; fully-qualified # 🧣 scarf
+1F9E4 ; fully-qualified # 🧤 gloves
+1F9E5 ; fully-qualified # 🧥 coat
+1F9E6 ; fully-qualified # 🧦 socks
+1F457 ; fully-qualified # 👗 dress
+1F458 ; fully-qualified # 👘 kimono
+1F97B ; fully-qualified # 🥻 sari
+1FA71 ; fully-qualified # 🩱 one-piece swimsuit
+1FA72 ; fully-qualified # 🩲 swim brief
+1FA73 ; fully-qualified # 🩳 shorts
+1F459 ; fully-qualified # 👙 bikini
+1F45A ; fully-qualified # 👚 woman’s clothes
+1F45B ; fully-qualified # 👛 purse
+1F45C ; fully-qualified # 👜 handbag
+1F45D ; fully-qualified # 👝 clutch bag
+1F6CD FE0F ; fully-qualified # 🛍️ shopping bags
+1F6CD ; unqualified # 🛍 shopping bags
+1F392 ; fully-qualified # 🎒 backpack
+1F45E ; fully-qualified # 👞 man’s shoe
+1F45F ; fully-qualified # 👟 running shoe
+1F97E ; fully-qualified # 🥾 hiking boot
+1F97F ; fully-qualified # 🥿 flat shoe
+1F460 ; fully-qualified # 👠 high-heeled shoe
+1F461 ; fully-qualified # 👡 woman’s sandal
+1FA70 ; fully-qualified # 🩰 ballet shoes
+1F462 ; fully-qualified # 👢 woman’s boot
+1F451 ; fully-qualified # 👑 crown
+1F452 ; fully-qualified # 👒 woman’s hat
+1F3A9 ; fully-qualified # 🎩 top hat
+1F393 ; fully-qualified # 🎓 graduation cap
+1F9E2 ; fully-qualified # 🧢 billed cap
+26D1 FE0F ; fully-qualified # ⛑️ rescue worker’s helmet
+26D1 ; unqualified # ⛑ rescue worker’s helmet
+1F4FF ; fully-qualified # 📿 prayer beads
+1F484 ; fully-qualified # 💄 lipstick
+1F48D ; fully-qualified # 💍 ring
+1F48E ; fully-qualified # 💎 gem stone
+
+# subgroup: sound
+1F507 ; fully-qualified # 🔇 muted speaker
+1F508 ; fully-qualified # 🔈 speaker low volume
+1F509 ; fully-qualified # 🔉 speaker medium volume
+1F50A ; fully-qualified # 🔊 speaker high volume
+1F4E2 ; fully-qualified # 📢 loudspeaker
+1F4E3 ; fully-qualified # 📣 megaphone
+1F4EF ; fully-qualified # 📯 postal horn
+1F514 ; fully-qualified # 🔔 bell
+1F515 ; fully-qualified # 🔕 bell with slash
+
+# subgroup: music
+1F3BC ; fully-qualified # 🎼 musical score
+1F3B5 ; fully-qualified # 🎵 musical note
+1F3B6 ; fully-qualified # 🎶 musical notes
+1F399 FE0F ; fully-qualified # 🎙️ studio microphone
+1F399 ; unqualified # 🎙 studio microphone
+1F39A FE0F ; fully-qualified # 🎚️ level slider
+1F39A ; unqualified # 🎚 level slider
+1F39B FE0F ; fully-qualified # 🎛️ control knobs
+1F39B ; unqualified # 🎛 control knobs
+1F3A4 ; fully-qualified # 🎤 microphone
+1F3A7 ; fully-qualified # 🎧 headphone
+1F4FB ; fully-qualified # 📻 radio
+
+# subgroup: musical-instrument
+1F3B7 ; fully-qualified # 🎷 saxophone
+1F3B8 ; fully-qualified # 🎸 guitar
+1F3B9 ; fully-qualified # 🎹 musical keyboard
+1F3BA ; fully-qualified # 🎺 trumpet
+1F3BB ; fully-qualified # 🎻 violin
+1FA95 ; fully-qualified # 🪕 banjo
+1F941 ; fully-qualified # 🥁 drum
+
+# subgroup: phone
+1F4F1 ; fully-qualified # 📱 mobile phone
+1F4F2 ; fully-qualified # 📲 mobile phone with arrow
+260E FE0F ; fully-qualified # ☎️ telephone
+260E ; unqualified # ☎ telephone
+1F4DE ; fully-qualified # 📞 telephone receiver
+1F4DF ; fully-qualified # 📟 pager
+1F4E0 ; fully-qualified # 📠 fax machine
+
+# subgroup: computer
+1F50B ; fully-qualified # 🔋 battery
+1F50C ; fully-qualified # 🔌 electric plug
+1F4BB ; fully-qualified # 💻 laptop computer
+1F5A5 FE0F ; fully-qualified # 🖥️ desktop computer
+1F5A5 ; unqualified # 🖥 desktop computer
+1F5A8 FE0F ; fully-qualified # 🖨️ printer
+1F5A8 ; unqualified # 🖨 printer
+2328 FE0F ; fully-qualified # ⌨️ keyboard
+2328 ; unqualified # ⌨ keyboard
+1F5B1 FE0F ; fully-qualified # 🖱️ computer mouse
+1F5B1 ; unqualified # 🖱 computer mouse
+1F5B2 FE0F ; fully-qualified # 🖲️ trackball
+1F5B2 ; unqualified # 🖲 trackball
+1F4BD ; fully-qualified # 💽 computer disk
+1F4BE ; fully-qualified # 💾 floppy disk
+1F4BF ; fully-qualified # 💿 optical disk
+1F4C0 ; fully-qualified # 📀 dvd
+1F9EE ; fully-qualified # 🧮 abacus
+
+# subgroup: light & video
+1F3A5 ; fully-qualified # 🎥 movie camera
+1F39E FE0F ; fully-qualified # 🎞️ film frames
+1F39E ; unqualified # 🎞 film frames
+1F4FD FE0F ; fully-qualified # 📽️ film projector
+1F4FD ; unqualified # 📽 film projector
+1F3AC ; fully-qualified # 🎬 clapper board
+1F4FA ; fully-qualified # 📺 television
+1F4F7 ; fully-qualified # 📷 camera
+1F4F8 ; fully-qualified # 📸 camera with flash
+1F4F9 ; fully-qualified # 📹 video camera
+1F4FC ; fully-qualified # 📼 videocassette
+1F50D ; fully-qualified # 🔍 magnifying glass tilted left
+1F50E ; fully-qualified # 🔎 magnifying glass tilted right
+1F56F FE0F ; fully-qualified # 🕯️ candle
+1F56F ; unqualified # 🕯 candle
+1F4A1 ; fully-qualified # 💡 light bulb
+1F526 ; fully-qualified # 🔦 flashlight
+1F3EE ; fully-qualified # 🏮 red paper lantern
+1FA94 ; fully-qualified # 🪔 diya lamp
+
+# subgroup: book-paper
+1F4D4 ; fully-qualified # 📔 notebook with decorative cover
+1F4D5 ; fully-qualified # 📕 closed book
+1F4D6 ; fully-qualified # 📖 open book
+1F4D7 ; fully-qualified # 📗 green book
+1F4D8 ; fully-qualified # 📘 blue book
+1F4D9 ; fully-qualified # 📙 orange book
+1F4DA ; fully-qualified # 📚 books
+1F4D3 ; fully-qualified # 📓 notebook
+1F4D2 ; fully-qualified # 📒 ledger
+1F4C3 ; fully-qualified # 📃 page with curl
+1F4DC ; fully-qualified # 📜 scroll
+1F4C4 ; fully-qualified # 📄 page facing up
+1F4F0 ; fully-qualified # 📰 newspaper
+1F5DE FE0F ; fully-qualified # 🗞️ rolled-up newspaper
+1F5DE ; unqualified # 🗞 rolled-up newspaper
+1F4D1 ; fully-qualified # 📑 bookmark tabs
+1F516 ; fully-qualified # 🔖 bookmark
+1F3F7 FE0F ; fully-qualified # 🏷️ label
+1F3F7 ; unqualified # 🏷 label
+
+# subgroup: money
+1F4B0 ; fully-qualified # 💰 money bag
+1F4B4 ; fully-qualified # 💴 yen banknote
+1F4B5 ; fully-qualified # 💵 dollar banknote
+1F4B6 ; fully-qualified # 💶 euro banknote
+1F4B7 ; fully-qualified # 💷 pound banknote
+1F4B8 ; fully-qualified # 💸 money with wings
+1F4B3 ; fully-qualified # 💳 credit card
+1F9FE ; fully-qualified # 🧾 receipt
+1F4B9 ; fully-qualified # 💹 chart increasing with yen
+1F4B1 ; fully-qualified # 💱 currency exchange
+1F4B2 ; fully-qualified # 💲 heavy dollar sign
+
+# subgroup: mail
+2709 FE0F ; fully-qualified # ✉️ envelope
+2709 ; unqualified # ✉ envelope
+1F4E7 ; fully-qualified # 📧 e-mail
+1F4E8 ; fully-qualified # 📨 incoming envelope
+1F4E9 ; fully-qualified # 📩 envelope with arrow
+1F4E4 ; fully-qualified # 📤 outbox tray
+1F4E5 ; fully-qualified # 📥 inbox tray
+1F4E6 ; fully-qualified # 📦 package
+1F4EB ; fully-qualified # 📫 closed mailbox with raised flag
+1F4EA ; fully-qualified # 📪 closed mailbox with lowered flag
+1F4EC ; fully-qualified # 📬 open mailbox with raised flag
+1F4ED ; fully-qualified # 📭 open mailbox with lowered flag
+1F4EE ; fully-qualified # 📮 postbox
+1F5F3 FE0F ; fully-qualified # 🗳️ ballot box with ballot
+1F5F3 ; unqualified # 🗳 ballot box with ballot
+
+# subgroup: writing
+270F FE0F ; fully-qualified # ✏️ pencil
+270F ; unqualified # ✏ pencil
+2712 FE0F ; fully-qualified # ✒️ black nib
+2712 ; unqualified # ✒ black nib
+1F58B FE0F ; fully-qualified # 🖋️ fountain pen
+1F58B ; unqualified # 🖋 fountain pen
+1F58A FE0F ; fully-qualified # 🖊️ pen
+1F58A ; unqualified # 🖊 pen
+1F58C FE0F ; fully-qualified # 🖌️ paintbrush
+1F58C ; unqualified # 🖌 paintbrush
+1F58D FE0F ; fully-qualified # 🖍️ crayon
+1F58D ; unqualified # 🖍 crayon
+1F4DD ; fully-qualified # 📝 memo
+
+# subgroup: office
+1F4BC ; fully-qualified # 💼 briefcase
+1F4C1 ; fully-qualified # 📁 file folder
+1F4C2 ; fully-qualified # 📂 open file folder
+1F5C2 FE0F ; fully-qualified # 🗂️ card index dividers
+1F5C2 ; unqualified # 🗂 card index dividers
+1F4C5 ; fully-qualified # 📅 calendar
+1F4C6 ; fully-qualified # 📆 tear-off calendar
+1F5D2 FE0F ; fully-qualified # 🗒️ spiral notepad
+1F5D2 ; unqualified # 🗒 spiral notepad
+1F5D3 FE0F ; fully-qualified # 🗓️ spiral calendar
+1F5D3 ; unqualified # 🗓 spiral calendar
+1F4C7 ; fully-qualified # 📇 card index
+1F4C8 ; fully-qualified # 📈 chart increasing
+1F4C9 ; fully-qualified # 📉 chart decreasing
+1F4CA ; fully-qualified # 📊 bar chart
+1F4CB ; fully-qualified # 📋 clipboard
+1F4CC ; fully-qualified # 📌 pushpin
+1F4CD ; fully-qualified # 📍 round pushpin
+1F4CE ; fully-qualified # 📎 paperclip
+1F587 FE0F ; fully-qualified # 🖇️ linked paperclips
+1F587 ; unqualified # 🖇 linked paperclips
+1F4CF ; fully-qualified # 📏 straight ruler
+1F4D0 ; fully-qualified # 📐 triangular ruler
+2702 FE0F ; fully-qualified # ✂️ scissors
+2702 ; unqualified # ✂ scissors
+1F5C3 FE0F ; fully-qualified # 🗃️ card file box
+1F5C3 ; unqualified # 🗃 card file box
+1F5C4 FE0F ; fully-qualified # 🗄️ file cabinet
+1F5C4 ; unqualified # 🗄 file cabinet
+1F5D1 FE0F ; fully-qualified # 🗑️ wastebasket
+1F5D1 ; unqualified # 🗑 wastebasket
+
+# subgroup: lock
+1F512 ; fully-qualified # 🔒 locked
+1F513 ; fully-qualified # 🔓 unlocked
+1F50F ; fully-qualified # 🔏 locked with pen
+1F510 ; fully-qualified # 🔐 locked with key
+1F511 ; fully-qualified # 🔑 key
+1F5DD FE0F ; fully-qualified # 🗝️ old key
+1F5DD ; unqualified # 🗝 old key
+
+# subgroup: tool
+1F528 ; fully-qualified # 🔨 hammer
+1FA93 ; fully-qualified # 🪓 axe
+26CF FE0F ; fully-qualified # ⛏️ pick
+26CF ; unqualified # ⛏ pick
+2692 FE0F ; fully-qualified # ⚒️ hammer and pick
+2692 ; unqualified # ⚒ hammer and pick
+1F6E0 FE0F ; fully-qualified # 🛠️ hammer and wrench
+1F6E0 ; unqualified # 🛠 hammer and wrench
+1F5E1 FE0F ; fully-qualified # 🗡️ dagger
+1F5E1 ; unqualified # 🗡 dagger
+2694 FE0F ; fully-qualified # ⚔️ crossed swords
+2694 ; unqualified # ⚔ crossed swords
+1F52B ; fully-qualified # 🔫 pistol
+1F3F9 ; fully-qualified # 🏹 bow and arrow
+1F6E1 FE0F ; fully-qualified # 🛡️ shield
+1F6E1 ; unqualified # 🛡 shield
+1F527 ; fully-qualified # 🔧 wrench
+1F529 ; fully-qualified # 🔩 nut and bolt
+2699 FE0F ; fully-qualified # ⚙️ gear
+2699 ; unqualified # ⚙ gear
+1F5DC FE0F ; fully-qualified # 🗜️ clamp
+1F5DC ; unqualified # 🗜 clamp
+2696 FE0F ; fully-qualified # ⚖️ balance scale
+2696 ; unqualified # ⚖ balance scale
+1F9AF ; fully-qualified # 🦯 probing cane
+1F517 ; fully-qualified # 🔗 link
+26D3 FE0F ; fully-qualified # ⛓️ chains
+26D3 ; unqualified # ⛓ chains
+1F9F0 ; fully-qualified # 🧰 toolbox
+1F9F2 ; fully-qualified # 🧲 magnet
+
+# subgroup: science
+2697 FE0F ; fully-qualified # ⚗️ alembic
+2697 ; unqualified # ⚗ alembic
+1F9EA ; fully-qualified # 🧪 test tube
+1F9EB ; fully-qualified # 🧫 petri dish
+1F9EC ; fully-qualified # 🧬 dna
+1F52C ; fully-qualified # 🔬 microscope
+1F52D ; fully-qualified # 🔭 telescope
+1F4E1 ; fully-qualified # 📡 satellite antenna
+
+# subgroup: medical
+1F489 ; fully-qualified # 💉 syringe
+1FA78 ; fully-qualified # 🩸 drop of blood
+1F48A ; fully-qualified # 💊 pill
+1FA79 ; fully-qualified # 🩹 adhesive bandage
+1FA7A ; fully-qualified # 🩺 stethoscope
+
+# subgroup: household
+1F6AA ; fully-qualified # 🚪 door
+1F6CF FE0F ; fully-qualified # 🛏️ bed
+1F6CF ; unqualified # 🛏 bed
+1F6CB FE0F ; fully-qualified # 🛋️ couch and lamp
+1F6CB ; unqualified # 🛋 couch and lamp
+1FA91 ; fully-qualified # 🪑 chair
+1F6BD ; fully-qualified # 🚽 toilet
+1F6BF ; fully-qualified # 🚿 shower
+1F6C1 ; fully-qualified # 🛁 bathtub
+1FA92 ; fully-qualified # 🪒 razor
+1F9F4 ; fully-qualified # 🧴 lotion bottle
+1F9F7 ; fully-qualified # 🧷 safety pin
+1F9F9 ; fully-qualified # 🧹 broom
+1F9FA ; fully-qualified # 🧺 basket
+1F9FB ; fully-qualified # 🧻 roll of paper
+1F9FC ; fully-qualified # 🧼 soap
+1F9FD ; fully-qualified # 🧽 sponge
+1F9EF ; fully-qualified # 🧯 fire extinguisher
+1F6D2 ; fully-qualified # 🛒 shopping cart
+
+# subgroup: other-object
+1F6AC ; fully-qualified # 🚬 cigarette
+26B0 FE0F ; fully-qualified # ⚰️ coffin
+26B0 ; unqualified # ⚰ coffin
+26B1 FE0F ; fully-qualified # ⚱️ funeral urn
+26B1 ; unqualified # ⚱ funeral urn
+1F5FF ; fully-qualified # 🗿 moai
+
+# Objects subtotal: 282
+# Objects subtotal: 282 w/o modifiers
+
+# group: Symbols
+
+# subgroup: transport-sign
+1F3E7 ; fully-qualified # 🏧 ATM sign
+1F6AE ; fully-qualified # 🚮 litter in bin sign
+1F6B0 ; fully-qualified # 🚰 potable water
+267F ; fully-qualified # ♿ wheelchair symbol
+1F6B9 ; fully-qualified # 🚹 men’s room
+1F6BA ; fully-qualified # 🚺 women’s room
+1F6BB ; fully-qualified # 🚻 restroom
+1F6BC ; fully-qualified # 🚼 baby symbol
+1F6BE ; fully-qualified # 🚾 water closet
+1F6C2 ; fully-qualified # 🛂 passport control
+1F6C3 ; fully-qualified # 🛃 customs
+1F6C4 ; fully-qualified # 🛄 baggage claim
+1F6C5 ; fully-qualified # 🛅 left luggage
+
+# subgroup: warning
+26A0 FE0F ; fully-qualified # ⚠️ warning
+26A0 ; unqualified # ⚠ warning
+1F6B8 ; fully-qualified # 🚸 children crossing
+26D4 ; fully-qualified # ⛔ no entry
+1F6AB ; fully-qualified # 🚫 prohibited
+1F6B3 ; fully-qualified # 🚳 no bicycles
+1F6AD ; fully-qualified # 🚭 no smoking
+1F6AF ; fully-qualified # 🚯 no littering
+1F6B1 ; fully-qualified # 🚱 non-potable water
+1F6B7 ; fully-qualified # 🚷 no pedestrians
+1F4F5 ; fully-qualified # 📵 no mobile phones
+1F51E ; fully-qualified # 🔞 no one under eighteen
+2622 FE0F ; fully-qualified # ☢️ radioactive
+2622 ; unqualified # ☢ radioactive
+2623 FE0F ; fully-qualified # ☣️ biohazard
+2623 ; unqualified # ☣ biohazard
+
+# subgroup: arrow
+2B06 FE0F ; fully-qualified # ⬆️ up arrow
+2B06 ; unqualified # ⬆ up arrow
+2197 FE0F ; fully-qualified # ↗️ up-right arrow
+2197 ; unqualified # ↗ up-right arrow
+27A1 FE0F ; fully-qualified # ➡️ right arrow
+27A1 ; unqualified # ➡ right arrow
+2198 FE0F ; fully-qualified # ↘️ down-right arrow
+2198 ; unqualified # ↘ down-right arrow
+2B07 FE0F ; fully-qualified # ⬇️ down arrow
+2B07 ; unqualified # ⬇ down arrow
+2199 FE0F ; fully-qualified # ↙️ down-left arrow
+2199 ; unqualified # ↙ down-left arrow
+2B05 FE0F ; fully-qualified # ⬅️ left arrow
+2B05 ; unqualified # ⬅ left arrow
+2196 FE0F ; fully-qualified # ↖️ up-left arrow
+2196 ; unqualified # ↖ up-left arrow
+2195 FE0F ; fully-qualified # ↕️ up-down arrow
+2195 ; unqualified # ↕ up-down arrow
+2194 FE0F ; fully-qualified # ↔️ left-right arrow
+2194 ; unqualified # ↔ left-right arrow
+21A9 FE0F ; fully-qualified # ↩️ right arrow curving left
+21A9 ; unqualified # ↩ right arrow curving left
+21AA FE0F ; fully-qualified # ↪️ left arrow curving right
+21AA ; unqualified # ↪ left arrow curving right
+2934 FE0F ; fully-qualified # ⤴️ right arrow curving up
+2934 ; unqualified # ⤴ right arrow curving up
+2935 FE0F ; fully-qualified # ⤵️ right arrow curving down
+2935 ; unqualified # ⤵ right arrow curving down
+1F503 ; fully-qualified # 🔃 clockwise vertical arrows
+1F504 ; fully-qualified # 🔄 counterclockwise arrows button
+1F519 ; fully-qualified # 🔙 BACK arrow
+1F51A ; fully-qualified # 🔚 END arrow
+1F51B ; fully-qualified # 🔛 ON! arrow
+1F51C ; fully-qualified # 🔜 SOON arrow
+1F51D ; fully-qualified # 🔝 TOP arrow
+
+# subgroup: religion
+1F6D0 ; fully-qualified # 🛐 place of worship
+269B FE0F ; fully-qualified # ⚛️ atom symbol
+269B ; unqualified # ⚛ atom symbol
+1F549 FE0F ; fully-qualified # 🕉️ om
+1F549 ; unqualified # 🕉 om
+2721 FE0F ; fully-qualified # ✡️ star of David
+2721 ; unqualified # ✡ star of David
+2638 FE0F ; fully-qualified # ☸️ wheel of dharma
+2638 ; unqualified # ☸ wheel of dharma
+262F FE0F ; fully-qualified # ☯️ yin yang
+262F ; unqualified # ☯ yin yang
+271D FE0F ; fully-qualified # ✝️ latin cross
+271D ; unqualified # ✝ latin cross
+2626 FE0F ; fully-qualified # ☦️ orthodox cross
+2626 ; unqualified # ☦ orthodox cross
+262A FE0F ; fully-qualified # ☪️ star and crescent
+262A ; unqualified # ☪ star and crescent
+262E FE0F ; fully-qualified # ☮️ peace symbol
+262E ; unqualified # ☮ peace symbol
+1F54E ; fully-qualified # 🕎 menorah
+1F52F ; fully-qualified # 🔯 dotted six-pointed star
+
+# subgroup: zodiac
+2648 ; fully-qualified # ♈ Aries
+2649 ; fully-qualified # ♉ Taurus
+264A ; fully-qualified # ♊ Gemini
+264B ; fully-qualified # ♋ Cancer
+264C ; fully-qualified # ♌ Leo
+264D ; fully-qualified # ♍ Virgo
+264E ; fully-qualified # ♎ Libra
+264F ; fully-qualified # ♏ Scorpio
+2650 ; fully-qualified # ♐ Sagittarius
+2651 ; fully-qualified # ♑ Capricorn
+2652 ; fully-qualified # ♒ Aquarius
+2653 ; fully-qualified # ♓ Pisces
+26CE ; fully-qualified # ⛎ Ophiuchus
+
+# subgroup: av-symbol
+1F500 ; fully-qualified # 🔀 shuffle tracks button
+1F501 ; fully-qualified # 🔁 repeat button
+1F502 ; fully-qualified # 🔂 repeat single button
+25B6 FE0F ; fully-qualified # ▶️ play button
+25B6 ; unqualified # ▶ play button
+23E9 ; fully-qualified # ⏩ fast-forward button
+23ED FE0F ; fully-qualified # ⏭️ next track button
+23ED ; unqualified # ⏭ next track button
+23EF FE0F ; fully-qualified # ⏯️ play or pause button
+23EF ; unqualified # ⏯ play or pause button
+25C0 FE0F ; fully-qualified # ◀️ reverse button
+25C0 ; unqualified # ◀ reverse button
+23EA ; fully-qualified # ⏪ fast reverse button
+23EE FE0F ; fully-qualified # ⏮️ last track button
+23EE ; unqualified # ⏮ last track button
+1F53C ; fully-qualified # 🔼 upwards button
+23EB ; fully-qualified # ⏫ fast up button
+1F53D ; fully-qualified # 🔽 downwards button
+23EC ; fully-qualified # ⏬ fast down button
+23F8 FE0F ; fully-qualified # ⏸️ pause button
+23F8 ; unqualified # ⏸ pause button
+23F9 FE0F ; fully-qualified # ⏹️ stop button
+23F9 ; unqualified # ⏹ stop button
+23FA FE0F ; fully-qualified # ⏺️ record button
+23FA ; unqualified # ⏺ record button
+23CF FE0F ; fully-qualified # ⏏️ eject button
+23CF ; unqualified # ⏏ eject button
+1F3A6 ; fully-qualified # 🎦 cinema
+1F505 ; fully-qualified # 🔅 dim button
+1F506 ; fully-qualified # 🔆 bright button
+1F4F6 ; fully-qualified # 📶 antenna bars
+1F4F3 ; fully-qualified # 📳 vibration mode
+1F4F4 ; fully-qualified # 📴 mobile phone off
+
+# subgroup: gender
+2640 FE0F ; fully-qualified # ♀️ female sign
+2640 ; unqualified # ♀ female sign
+2642 FE0F ; fully-qualified # ♂️ male sign
+2642 ; unqualified # ♂ male sign
+
+# subgroup: other-symbol
+2695 FE0F ; fully-qualified # ⚕️ medical symbol
+2695 ; unqualified # ⚕ medical symbol
+267E FE0F ; fully-qualified # ♾️ infinity
+267E ; unqualified # ♾ infinity
+267B FE0F ; fully-qualified # ♻️ recycling symbol
+267B ; unqualified # ♻ recycling symbol
+269C FE0F ; fully-qualified # ⚜️ fleur-de-lis
+269C ; unqualified # ⚜ fleur-de-lis
+1F531 ; fully-qualified # 🔱 trident emblem
+1F4DB ; fully-qualified # 📛 name badge
+1F530 ; fully-qualified # 🔰 Japanese symbol for beginner
+2B55 ; fully-qualified # ⭕ hollow red circle
+2705 ; fully-qualified # ✅ check mark button
+2611 FE0F ; fully-qualified # ☑️ check box with check
+2611 ; unqualified # ☑ check box with check
+2714 FE0F ; fully-qualified # ✔️ check mark
+2714 ; unqualified # ✔ check mark
+2716 FE0F ; fully-qualified # ✖️ multiplication sign
+2716 ; unqualified # ✖ multiplication sign
+274C ; fully-qualified # ❌ cross mark
+274E ; fully-qualified # ❎ cross mark button
+2795 ; fully-qualified # ➕ plus sign
+2796 ; fully-qualified # ➖ minus sign
+2797 ; fully-qualified # ➗ division sign
+27B0 ; fully-qualified # ➰ curly loop
+27BF ; fully-qualified # ➿ double curly loop
+303D FE0F ; fully-qualified # 〽️ part alternation mark
+303D ; unqualified # 〽 part alternation mark
+2733 FE0F ; fully-qualified # ✳️ eight-spoked asterisk
+2733 ; unqualified # ✳ eight-spoked asterisk
+2734 FE0F ; fully-qualified # ✴️ eight-pointed star
+2734 ; unqualified # ✴ eight-pointed star
+2747 FE0F ; fully-qualified # ❇️ sparkle
+2747 ; unqualified # ❇ sparkle
+203C FE0F ; fully-qualified # ‼️ double exclamation mark
+203C ; unqualified # ‼ double exclamation mark
+2049 FE0F ; fully-qualified # ⁉️ exclamation question mark
+2049 ; unqualified # ⁉ exclamation question mark
+2753 ; fully-qualified # ❓ question mark
+2754 ; fully-qualified # ❔ white question mark
+2755 ; fully-qualified # ❕ white exclamation mark
+2757 ; fully-qualified # ❗ exclamation mark
+3030 FE0F ; fully-qualified # 〰️ wavy dash
+3030 ; unqualified # 〰 wavy dash
+00A9 FE0F ; fully-qualified # ©️ copyright
+00A9 ; unqualified # © copyright
+00AE FE0F ; fully-qualified # ®️ registered
+00AE ; unqualified # ® registered
+2122 FE0F ; fully-qualified # ™️ trade mark
+2122 ; unqualified # ™ trade mark
+
+# subgroup: keycap
+0023 FE0F 20E3 ; fully-qualified # #️⃣ keycap: #
+0023 20E3 ; unqualified # #⃣ keycap: #
+002A FE0F 20E3 ; fully-qualified # *️⃣ keycap: *
+002A 20E3 ; unqualified # *⃣ keycap: *
+0030 FE0F 20E3 ; fully-qualified # 0️⃣ keycap: 0
+0030 20E3 ; unqualified # 0⃣ keycap: 0
+0031 FE0F 20E3 ; fully-qualified # 1️⃣ keycap: 1
+0031 20E3 ; unqualified # 1⃣ keycap: 1
+0032 FE0F 20E3 ; fully-qualified # 2️⃣ keycap: 2
+0032 20E3 ; unqualified # 2⃣ keycap: 2
+0033 FE0F 20E3 ; fully-qualified # 3️⃣ keycap: 3
+0033 20E3 ; unqualified # 3⃣ keycap: 3
+0034 FE0F 20E3 ; fully-qualified # 4️⃣ keycap: 4
+0034 20E3 ; unqualified # 4⃣ keycap: 4
+0035 FE0F 20E3 ; fully-qualified # 5️⃣ keycap: 5
+0035 20E3 ; unqualified # 5⃣ keycap: 5
+0036 FE0F 20E3 ; fully-qualified # 6️⃣ keycap: 6
+0036 20E3 ; unqualified # 6⃣ keycap: 6
+0037 FE0F 20E3 ; fully-qualified # 7️⃣ keycap: 7
+0037 20E3 ; unqualified # 7⃣ keycap: 7
+0038 FE0F 20E3 ; fully-qualified # 8️⃣ keycap: 8
+0038 20E3 ; unqualified # 8⃣ keycap: 8
+0039 FE0F 20E3 ; fully-qualified # 9️⃣ keycap: 9
+0039 20E3 ; unqualified # 9⃣ keycap: 9
+1F51F ; fully-qualified # 🔟 keycap: 10
+
+# subgroup: alphanum
+1F520 ; fully-qualified # 🔠 input latin uppercase
+1F521 ; fully-qualified # 🔡 input latin lowercase
+1F522 ; fully-qualified # 🔢 input numbers
+1F523 ; fully-qualified # 🔣 input symbols
+1F524 ; fully-qualified # 🔤 input latin letters
+1F170 FE0F ; fully-qualified # 🅰️ A button (blood type)
+1F170 ; unqualified # 🅰 A button (blood type)
+1F18E ; fully-qualified # 🆎 AB button (blood type)
+1F171 FE0F ; fully-qualified # 🅱️ B button (blood type)
+1F171 ; unqualified # 🅱 B button (blood type)
+1F191 ; fully-qualified # 🆑 CL button
+1F192 ; fully-qualified # 🆒 COOL button
+1F193 ; fully-qualified # 🆓 FREE button
+2139 FE0F ; fully-qualified # ℹ️ information
+2139 ; unqualified # ℹ information
+1F194 ; fully-qualified # 🆔 ID button
+24C2 FE0F ; fully-qualified # Ⓜ️ circled M
+24C2 ; unqualified # Ⓜ circled M
+1F195 ; fully-qualified # 🆕 NEW button
+1F196 ; fully-qualified # 🆖 NG button
+1F17E FE0F ; fully-qualified # 🅾️ O button (blood type)
+1F17E ; unqualified # 🅾 O button (blood type)
+1F197 ; fully-qualified # 🆗 OK button
+1F17F FE0F ; fully-qualified # 🅿️ P button
+1F17F ; unqualified # 🅿 P button
+1F198 ; fully-qualified # 🆘 SOS button
+1F199 ; fully-qualified # 🆙 UP! button
+1F19A ; fully-qualified # 🆚 VS button
+1F201 ; fully-qualified # 🈁 Japanese “here” button
+1F202 FE0F ; fully-qualified # 🈂️ Japanese “service charge” button
+1F202 ; unqualified # 🈂 Japanese “service charge” button
+1F237 FE0F ; fully-qualified # 🈷️ Japanese “monthly amount” button
+1F237 ; unqualified # 🈷 Japanese “monthly amount” button
+1F236 ; fully-qualified # 🈶 Japanese “not free of charge” button
+1F22F ; fully-qualified # 🈯 Japanese “reserved” button
+1F250 ; fully-qualified # 🉐 Japanese “bargain” button
+1F239 ; fully-qualified # 🈹 Japanese “discount” button
+1F21A ; fully-qualified # 🈚 Japanese “free of charge” button
+1F232 ; fully-qualified # 🈲 Japanese “prohibited” button
+1F251 ; fully-qualified # 🉑 Japanese “acceptable” button
+1F238 ; fully-qualified # 🈸 Japanese “application” button
+1F234 ; fully-qualified # 🈴 Japanese “passing grade” button
+1F233 ; fully-qualified # 🈳 Japanese “vacancy” button
+3297 FE0F ; fully-qualified # ㊗️ Japanese “congratulations” button
+3297 ; unqualified # ㊗ Japanese “congratulations” button
+3299 FE0F ; fully-qualified # ㊙️ Japanese “secret” button
+3299 ; unqualified # ㊙ Japanese “secret” button
+1F23A ; fully-qualified # 🈺 Japanese “open for business” button
+1F235 ; fully-qualified # 🈵 Japanese “no vacancy” button
+
+# subgroup: geometric
+1F534 ; fully-qualified # 🔴 red circle
+1F7E0 ; fully-qualified # 🟠 orange circle
+1F7E1 ; fully-qualified # 🟡 yellow circle
+1F7E2 ; fully-qualified # 🟢 green circle
+1F535 ; fully-qualified # 🔵 blue circle
+1F7E3 ; fully-qualified # 🟣 purple circle
+1F7E4 ; fully-qualified # 🟤 brown circle
+26AB ; fully-qualified # ⚫ black circle
+26AA ; fully-qualified # ⚪ white circle
+1F7E5 ; fully-qualified # 🟥 red square
+1F7E7 ; fully-qualified # 🟧 orange square
+1F7E8 ; fully-qualified # 🟨 yellow square
+1F7E9 ; fully-qualified # 🟩 green square
+1F7E6 ; fully-qualified # 🟦 blue square
+1F7EA ; fully-qualified # 🟪 purple square
+1F7EB ; fully-qualified # 🟫 brown square
+2B1B ; fully-qualified # ⬛ black large square
+2B1C ; fully-qualified # ⬜ white large square
+25FC FE0F ; fully-qualified # ◼️ black medium square
+25FC ; unqualified # ◼ black medium square
+25FB FE0F ; fully-qualified # ◻️ white medium square
+25FB ; unqualified # ◻ white medium square
+25FE ; fully-qualified # ◾ black medium-small square
+25FD ; fully-qualified # ◽ white medium-small square
+25AA FE0F ; fully-qualified # ▪️ black small square
+25AA ; unqualified # ▪ black small square
+25AB FE0F ; fully-qualified # ▫️ white small square
+25AB ; unqualified # ▫ white small square
+1F536 ; fully-qualified # 🔶 large orange diamond
+1F537 ; fully-qualified # 🔷 large blue diamond
+1F538 ; fully-qualified # 🔸 small orange diamond
+1F539 ; fully-qualified # 🔹 small blue diamond
+1F53A ; fully-qualified # 🔺 red triangle pointed up
+1F53B ; fully-qualified # 🔻 red triangle pointed down
+1F4A0 ; fully-qualified # 💠 diamond with a dot
+1F518 ; fully-qualified # 🔘 radio button
+1F533 ; fully-qualified # 🔳 white square button
+1F532 ; fully-qualified # 🔲 black square button
+
+# Symbols subtotal: 297
+# Symbols subtotal: 297 w/o modifiers
+
+# group: Flags
+
+# subgroup: flag
+1F3C1 ; fully-qualified # 🏁 chequered flag
+1F6A9 ; fully-qualified # 🚩 triangular flag
+1F38C ; fully-qualified # 🎌 crossed flags
+1F3F4 ; fully-qualified # 🏴 black flag
+1F3F3 FE0F ; fully-qualified # 🏳️ white flag
+1F3F3 ; unqualified # 🏳 white flag
+1F3F3 FE0F 200D 1F308 ; fully-qualified # 🏳️🌈 rainbow flag
+1F3F3 200D 1F308 ; unqualified # 🏳🌈 rainbow flag
+1F3F4 200D 2620 FE0F ; fully-qualified # 🏴☠️ pirate flag
+1F3F4 200D 2620 ; minimally-qualified # 🏴☠ pirate flag
+
+# subgroup: country-flag
+1F1E6 1F1E8 ; fully-qualified # 🇦🇨 flag: Ascension Island
+1F1E6 1F1E9 ; fully-qualified # 🇦🇩 flag: Andorra
+1F1E6 1F1EA ; fully-qualified # 🇦🇪 flag: United Arab Emirates
+1F1E6 1F1EB ; fully-qualified # 🇦🇫 flag: Afghanistan
+1F1E6 1F1EC ; fully-qualified # 🇦🇬 flag: Antigua & Barbuda
+1F1E6 1F1EE ; fully-qualified # 🇦🇮 flag: Anguilla
+1F1E6 1F1F1 ; fully-qualified # 🇦🇱 flag: Albania
+1F1E6 1F1F2 ; fully-qualified # 🇦🇲 flag: Armenia
+1F1E6 1F1F4 ; fully-qualified # 🇦🇴 flag: Angola
+1F1E6 1F1F6 ; fully-qualified # 🇦🇶 flag: Antarctica
+1F1E6 1F1F7 ; fully-qualified # 🇦🇷 flag: Argentina
+1F1E6 1F1F8 ; fully-qualified # 🇦🇸 flag: American Samoa
+1F1E6 1F1F9 ; fully-qualified # 🇦🇹 flag: Austria
+1F1E6 1F1FA ; fully-qualified # 🇦🇺 flag: Australia
+1F1E6 1F1FC ; fully-qualified # 🇦🇼 flag: Aruba
+1F1E6 1F1FD ; fully-qualified # 🇦🇽 flag: Åland Islands
+1F1E6 1F1FF ; fully-qualified # 🇦🇿 flag: Azerbaijan
+1F1E7 1F1E6 ; fully-qualified # 🇧🇦 flag: Bosnia & Herzegovina
+1F1E7 1F1E7 ; fully-qualified # 🇧🇧 flag: Barbados
+1F1E7 1F1E9 ; fully-qualified # 🇧🇩 flag: Bangladesh
+1F1E7 1F1EA ; fully-qualified # 🇧🇪 flag: Belgium
+1F1E7 1F1EB ; fully-qualified # 🇧🇫 flag: Burkina Faso
+1F1E7 1F1EC ; fully-qualified # 🇧🇬 flag: Bulgaria
+1F1E7 1F1ED ; fully-qualified # 🇧🇭 flag: Bahrain
+1F1E7 1F1EE ; fully-qualified # 🇧🇮 flag: Burundi
+1F1E7 1F1EF ; fully-qualified # 🇧🇯 flag: Benin
+1F1E7 1F1F1 ; fully-qualified # 🇧🇱 flag: St. Barthélemy
+1F1E7 1F1F2 ; fully-qualified # 🇧🇲 flag: Bermuda
+1F1E7 1F1F3 ; fully-qualified # 🇧🇳 flag: Brunei
+1F1E7 1F1F4 ; fully-qualified # 🇧🇴 flag: Bolivia
+1F1E7 1F1F6 ; fully-qualified # 🇧🇶 flag: Caribbean Netherlands
+1F1E7 1F1F7 ; fully-qualified # 🇧🇷 flag: Brazil
+1F1E7 1F1F8 ; fully-qualified # 🇧🇸 flag: Bahamas
+1F1E7 1F1F9 ; fully-qualified # 🇧🇹 flag: Bhutan
+1F1E7 1F1FB ; fully-qualified # 🇧🇻 flag: Bouvet Island
+1F1E7 1F1FC ; fully-qualified # 🇧🇼 flag: Botswana
+1F1E7 1F1FE ; fully-qualified # 🇧🇾 flag: Belarus
+1F1E7 1F1FF ; fully-qualified # 🇧🇿 flag: Belize
+1F1E8 1F1E6 ; fully-qualified # 🇨🇦 flag: Canada
+1F1E8 1F1E8 ; fully-qualified # 🇨🇨 flag: Cocos (Keeling) Islands
+1F1E8 1F1E9 ; fully-qualified # 🇨🇩 flag: Congo - Kinshasa
+1F1E8 1F1EB ; fully-qualified # 🇨🇫 flag: Central African Republic
+1F1E8 1F1EC ; fully-qualified # 🇨🇬 flag: Congo - Brazzaville
+1F1E8 1F1ED ; fully-qualified # 🇨🇭 flag: Switzerland
+1F1E8 1F1EE ; fully-qualified # 🇨🇮 flag: Côte d’Ivoire
+1F1E8 1F1F0 ; fully-qualified # 🇨🇰 flag: Cook Islands
+1F1E8 1F1F1 ; fully-qualified # 🇨🇱 flag: Chile
+1F1E8 1F1F2 ; fully-qualified # 🇨🇲 flag: Cameroon
+1F1E8 1F1F3 ; fully-qualified # 🇨🇳 flag: China
+1F1E8 1F1F4 ; fully-qualified # 🇨🇴 flag: Colombia
+1F1E8 1F1F5 ; fully-qualified # 🇨🇵 flag: Clipperton Island
+1F1E8 1F1F7 ; fully-qualified # 🇨🇷 flag: Costa Rica
+1F1E8 1F1FA ; fully-qualified # 🇨🇺 flag: Cuba
+1F1E8 1F1FB ; fully-qualified # 🇨🇻 flag: Cape Verde
+1F1E8 1F1FC ; fully-qualified # 🇨🇼 flag: Curaçao
+1F1E8 1F1FD ; fully-qualified # 🇨🇽 flag: Christmas Island
+1F1E8 1F1FE ; fully-qualified # 🇨🇾 flag: Cyprus
+1F1E8 1F1FF ; fully-qualified # 🇨🇿 flag: Czechia
+1F1E9 1F1EA ; fully-qualified # 🇩🇪 flag: Germany
+1F1E9 1F1EC ; fully-qualified # 🇩🇬 flag: Diego Garcia
+1F1E9 1F1EF ; fully-qualified # 🇩🇯 flag: Djibouti
+1F1E9 1F1F0 ; fully-qualified # 🇩🇰 flag: Denmark
+1F1E9 1F1F2 ; fully-qualified # 🇩🇲 flag: Dominica
+1F1E9 1F1F4 ; fully-qualified # 🇩🇴 flag: Dominican Republic
+1F1E9 1F1FF ; fully-qualified # 🇩🇿 flag: Algeria
+1F1EA 1F1E6 ; fully-qualified # 🇪🇦 flag: Ceuta & Melilla
+1F1EA 1F1E8 ; fully-qualified # 🇪🇨 flag: Ecuador
+1F1EA 1F1EA ; fully-qualified # 🇪🇪 flag: Estonia
+1F1EA 1F1EC ; fully-qualified # 🇪🇬 flag: Egypt
+1F1EA 1F1ED ; fully-qualified # 🇪🇭 flag: Western Sahara
+1F1EA 1F1F7 ; fully-qualified # 🇪🇷 flag: Eritrea
+1F1EA 1F1F8 ; fully-qualified # 🇪🇸 flag: Spain
+1F1EA 1F1F9 ; fully-qualified # 🇪🇹 flag: Ethiopia
+1F1EA 1F1FA ; fully-qualified # 🇪🇺 flag: European Union
+1F1EB 1F1EE ; fully-qualified # 🇫🇮 flag: Finland
+1F1EB 1F1EF ; fully-qualified # 🇫🇯 flag: Fiji
+1F1EB 1F1F0 ; fully-qualified # 🇫🇰 flag: Falkland Islands
+1F1EB 1F1F2 ; fully-qualified # 🇫🇲 flag: Micronesia
+1F1EB 1F1F4 ; fully-qualified # 🇫🇴 flag: Faroe Islands
+1F1EB 1F1F7 ; fully-qualified # 🇫🇷 flag: France
+1F1EC 1F1E6 ; fully-qualified # 🇬🇦 flag: Gabon
+1F1EC 1F1E7 ; fully-qualified # 🇬🇧 flag: United Kingdom
+1F1EC 1F1E9 ; fully-qualified # 🇬🇩 flag: Grenada
+1F1EC 1F1EA ; fully-qualified # 🇬🇪 flag: Georgia
+1F1EC 1F1EB ; fully-qualified # 🇬🇫 flag: French Guiana
+1F1EC 1F1EC ; fully-qualified # 🇬🇬 flag: Guernsey
+1F1EC 1F1ED ; fully-qualified # 🇬🇭 flag: Ghana
+1F1EC 1F1EE ; fully-qualified # 🇬🇮 flag: Gibraltar
+1F1EC 1F1F1 ; fully-qualified # 🇬🇱 flag: Greenland
+1F1EC 1F1F2 ; fully-qualified # 🇬🇲 flag: Gambia
+1F1EC 1F1F3 ; fully-qualified # 🇬🇳 flag: Guinea
+1F1EC 1F1F5 ; fully-qualified # 🇬🇵 flag: Guadeloupe
+1F1EC 1F1F6 ; fully-qualified # 🇬🇶 flag: Equatorial Guinea
+1F1EC 1F1F7 ; fully-qualified # 🇬🇷 flag: Greece
+1F1EC 1F1F8 ; fully-qualified # 🇬🇸 flag: South Georgia & South Sandwich Islands
+1F1EC 1F1F9 ; fully-qualified # 🇬🇹 flag: Guatemala
+1F1EC 1F1FA ; fully-qualified # 🇬🇺 flag: Guam
+1F1EC 1F1FC ; fully-qualified # 🇬🇼 flag: Guinea-Bissau
+1F1EC 1F1FE ; fully-qualified # 🇬🇾 flag: Guyana
+1F1ED 1F1F0 ; fully-qualified # 🇭🇰 flag: Hong Kong SAR China
+1F1ED 1F1F2 ; fully-qualified # 🇭🇲 flag: Heard & McDonald Islands
+1F1ED 1F1F3 ; fully-qualified # 🇭🇳 flag: Honduras
+1F1ED 1F1F7 ; fully-qualified # 🇭🇷 flag: Croatia
+1F1ED 1F1F9 ; fully-qualified # 🇭🇹 flag: Haiti
+1F1ED 1F1FA ; fully-qualified # 🇭🇺 flag: Hungary
+1F1EE 1F1E8 ; fully-qualified # 🇮🇨 flag: Canary Islands
+1F1EE 1F1E9 ; fully-qualified # 🇮🇩 flag: Indonesia
+1F1EE 1F1EA ; fully-qualified # 🇮🇪 flag: Ireland
+1F1EE 1F1F1 ; fully-qualified # 🇮🇱 flag: Israel
+1F1EE 1F1F2 ; fully-qualified # 🇮🇲 flag: Isle of Man
+1F1EE 1F1F3 ; fully-qualified # 🇮🇳 flag: India
+1F1EE 1F1F4 ; fully-qualified # 🇮🇴 flag: British Indian Ocean Territory
+1F1EE 1F1F6 ; fully-qualified # 🇮🇶 flag: Iraq
+1F1EE 1F1F7 ; fully-qualified # 🇮🇷 flag: Iran
+1F1EE 1F1F8 ; fully-qualified # 🇮🇸 flag: Iceland
+1F1EE 1F1F9 ; fully-qualified # 🇮🇹 flag: Italy
+1F1EF 1F1EA ; fully-qualified # 🇯🇪 flag: Jersey
+1F1EF 1F1F2 ; fully-qualified # 🇯🇲 flag: Jamaica
+1F1EF 1F1F4 ; fully-qualified # 🇯🇴 flag: Jordan
+1F1EF 1F1F5 ; fully-qualified # 🇯🇵 flag: Japan
+1F1F0 1F1EA ; fully-qualified # 🇰🇪 flag: Kenya
+1F1F0 1F1EC ; fully-qualified # 🇰🇬 flag: Kyrgyzstan
+1F1F0 1F1ED ; fully-qualified # 🇰🇭 flag: Cambodia
+1F1F0 1F1EE ; fully-qualified # 🇰🇮 flag: Kiribati
+1F1F0 1F1F2 ; fully-qualified # 🇰🇲 flag: Comoros
+1F1F0 1F1F3 ; fully-qualified # 🇰🇳 flag: St. Kitts & Nevis
+1F1F0 1F1F5 ; fully-qualified # 🇰🇵 flag: North Korea
+1F1F0 1F1F7 ; fully-qualified # 🇰🇷 flag: South Korea
+1F1F0 1F1FC ; fully-qualified # 🇰🇼 flag: Kuwait
+1F1F0 1F1FE ; fully-qualified # 🇰🇾 flag: Cayman Islands
+1F1F0 1F1FF ; fully-qualified # 🇰🇿 flag: Kazakhstan
+1F1F1 1F1E6 ; fully-qualified # 🇱🇦 flag: Laos
+1F1F1 1F1E7 ; fully-qualified # 🇱🇧 flag: Lebanon
+1F1F1 1F1E8 ; fully-qualified # 🇱🇨 flag: St. Lucia
+1F1F1 1F1EE ; fully-qualified # 🇱🇮 flag: Liechtenstein
+1F1F1 1F1F0 ; fully-qualified # 🇱🇰 flag: Sri Lanka
+1F1F1 1F1F7 ; fully-qualified # 🇱🇷 flag: Liberia
+1F1F1 1F1F8 ; fully-qualified # 🇱🇸 flag: Lesotho
+1F1F1 1F1F9 ; fully-qualified # 🇱🇹 flag: Lithuania
+1F1F1 1F1FA ; fully-qualified # 🇱🇺 flag: Luxembourg
+1F1F1 1F1FB ; fully-qualified # 🇱🇻 flag: Latvia
+1F1F1 1F1FE ; fully-qualified # 🇱🇾 flag: Libya
+1F1F2 1F1E6 ; fully-qualified # 🇲🇦 flag: Morocco
+1F1F2 1F1E8 ; fully-qualified # 🇲🇨 flag: Monaco
+1F1F2 1F1E9 ; fully-qualified # 🇲🇩 flag: Moldova
+1F1F2 1F1EA ; fully-qualified # 🇲🇪 flag: Montenegro
+1F1F2 1F1EB ; fully-qualified # 🇲🇫 flag: St. Martin
+1F1F2 1F1EC ; fully-qualified # 🇲🇬 flag: Madagascar
+1F1F2 1F1ED ; fully-qualified # 🇲🇭 flag: Marshall Islands
+1F1F2 1F1F0 ; fully-qualified # 🇲🇰 flag: Macedonia
+1F1F2 1F1F1 ; fully-qualified # 🇲🇱 flag: Mali
+1F1F2 1F1F2 ; fully-qualified # 🇲🇲 flag: Myanmar (Burma)
+1F1F2 1F1F3 ; fully-qualified # 🇲🇳 flag: Mongolia
+1F1F2 1F1F4 ; fully-qualified # 🇲🇴 flag: Macao SAR China
+1F1F2 1F1F5 ; fully-qualified # 🇲🇵 flag: Northern Mariana Islands
+1F1F2 1F1F6 ; fully-qualified # 🇲🇶 flag: Martinique
+1F1F2 1F1F7 ; fully-qualified # 🇲🇷 flag: Mauritania
+1F1F2 1F1F8 ; fully-qualified # 🇲🇸 flag: Montserrat
+1F1F2 1F1F9 ; fully-qualified # 🇲🇹 flag: Malta
+1F1F2 1F1FA ; fully-qualified # 🇲🇺 flag: Mauritius
+1F1F2 1F1FB ; fully-qualified # 🇲🇻 flag: Maldives
+1F1F2 1F1FC ; fully-qualified # 🇲🇼 flag: Malawi
+1F1F2 1F1FD ; fully-qualified # 🇲🇽 flag: Mexico
+1F1F2 1F1FE ; fully-qualified # 🇲🇾 flag: Malaysia
+1F1F2 1F1FF ; fully-qualified # 🇲🇿 flag: Mozambique
+1F1F3 1F1E6 ; fully-qualified # 🇳🇦 flag: Namibia
+1F1F3 1F1E8 ; fully-qualified # 🇳🇨 flag: New Caledonia
+1F1F3 1F1EA ; fully-qualified # 🇳🇪 flag: Niger
+1F1F3 1F1EB ; fully-qualified # 🇳🇫 flag: Norfolk Island
+1F1F3 1F1EC ; fully-qualified # 🇳🇬 flag: Nigeria
+1F1F3 1F1EE ; fully-qualified # 🇳🇮 flag: Nicaragua
+1F1F3 1F1F1 ; fully-qualified # 🇳🇱 flag: Netherlands
+1F1F3 1F1F4 ; fully-qualified # 🇳🇴 flag: Norway
+1F1F3 1F1F5 ; fully-qualified # 🇳🇵 flag: Nepal
+1F1F3 1F1F7 ; fully-qualified # 🇳🇷 flag: Nauru
+1F1F3 1F1FA ; fully-qualified # 🇳🇺 flag: Niue
+1F1F3 1F1FF ; fully-qualified # 🇳🇿 flag: New Zealand
+1F1F4 1F1F2 ; fully-qualified # 🇴🇲 flag: Oman
+1F1F5 1F1E6 ; fully-qualified # 🇵🇦 flag: Panama
+1F1F5 1F1EA ; fully-qualified # 🇵🇪 flag: Peru
+1F1F5 1F1EB ; fully-qualified # 🇵🇫 flag: French Polynesia
+1F1F5 1F1EC ; fully-qualified # 🇵🇬 flag: Papua New Guinea
+1F1F5 1F1ED ; fully-qualified # 🇵🇭 flag: Philippines
+1F1F5 1F1F0 ; fully-qualified # 🇵🇰 flag: Pakistan
+1F1F5 1F1F1 ; fully-qualified # 🇵🇱 flag: Poland
+1F1F5 1F1F2 ; fully-qualified # 🇵🇲 flag: St. Pierre & Miquelon
+1F1F5 1F1F3 ; fully-qualified # 🇵🇳 flag: Pitcairn Islands
+1F1F5 1F1F7 ; fully-qualified # 🇵🇷 flag: Puerto Rico
+1F1F5 1F1F8 ; fully-qualified # 🇵🇸 flag: Palestinian Territories
+1F1F5 1F1F9 ; fully-qualified # 🇵🇹 flag: Portugal
+1F1F5 1F1FC ; fully-qualified # 🇵🇼 flag: Palau
+1F1F5 1F1FE ; fully-qualified # 🇵🇾 flag: Paraguay
+1F1F6 1F1E6 ; fully-qualified # 🇶🇦 flag: Qatar
+1F1F7 1F1EA ; fully-qualified # 🇷🇪 flag: Réunion
+1F1F7 1F1F4 ; fully-qualified # 🇷🇴 flag: Romania
+1F1F7 1F1F8 ; fully-qualified # 🇷🇸 flag: Serbia
+1F1F7 1F1FA ; fully-qualified # 🇷🇺 flag: Russia
+1F1F7 1F1FC ; fully-qualified # 🇷🇼 flag: Rwanda
+1F1F8 1F1E6 ; fully-qualified # 🇸🇦 flag: Saudi Arabia
+1F1F8 1F1E7 ; fully-qualified # 🇸🇧 flag: Solomon Islands
+1F1F8 1F1E8 ; fully-qualified # 🇸🇨 flag: Seychelles
+1F1F8 1F1E9 ; fully-qualified # 🇸🇩 flag: Sudan
+1F1F8 1F1EA ; fully-qualified # 🇸🇪 flag: Sweden
+1F1F8 1F1EC ; fully-qualified # 🇸🇬 flag: Singapore
+1F1F8 1F1ED ; fully-qualified # 🇸🇭 flag: St. Helena
+1F1F8 1F1EE ; fully-qualified # 🇸🇮 flag: Slovenia
+1F1F8 1F1EF ; fully-qualified # 🇸🇯 flag: Svalbard & Jan Mayen
+1F1F8 1F1F0 ; fully-qualified # 🇸🇰 flag: Slovakia
+1F1F8 1F1F1 ; fully-qualified # 🇸🇱 flag: Sierra Leone
+1F1F8 1F1F2 ; fully-qualified # 🇸🇲 flag: San Marino
+1F1F8 1F1F3 ; fully-qualified # 🇸🇳 flag: Senegal
+1F1F8 1F1F4 ; fully-qualified # 🇸🇴 flag: Somalia
+1F1F8 1F1F7 ; fully-qualified # 🇸🇷 flag: Suriname
+1F1F8 1F1F8 ; fully-qualified # 🇸🇸 flag: South Sudan
+1F1F8 1F1F9 ; fully-qualified # 🇸🇹 flag: São Tomé & Príncipe
+1F1F8 1F1FB ; fully-qualified # 🇸🇻 flag: El Salvador
+1F1F8 1F1FD ; fully-qualified # 🇸🇽 flag: Sint Maarten
+1F1F8 1F1FE ; fully-qualified # 🇸🇾 flag: Syria
+1F1F8 1F1FF ; fully-qualified # 🇸🇿 flag: Eswatini
+1F1F9 1F1E6 ; fully-qualified # 🇹🇦 flag: Tristan da Cunha
+1F1F9 1F1E8 ; fully-qualified # 🇹🇨 flag: Turks & Caicos Islands
+1F1F9 1F1E9 ; fully-qualified # 🇹🇩 flag: Chad
+1F1F9 1F1EB ; fully-qualified # 🇹🇫 flag: French Southern Territories
+1F1F9 1F1EC ; fully-qualified # 🇹🇬 flag: Togo
+1F1F9 1F1ED ; fully-qualified # 🇹🇭 flag: Thailand
+1F1F9 1F1EF ; fully-qualified # 🇹🇯 flag: Tajikistan
+1F1F9 1F1F0 ; fully-qualified # 🇹🇰 flag: Tokelau
+1F1F9 1F1F1 ; fully-qualified # 🇹🇱 flag: Timor-Leste
+1F1F9 1F1F2 ; fully-qualified # 🇹🇲 flag: Turkmenistan
+1F1F9 1F1F3 ; fully-qualified # 🇹🇳 flag: Tunisia
+1F1F9 1F1F4 ; fully-qualified # 🇹🇴 flag: Tonga
+1F1F9 1F1F7 ; fully-qualified # 🇹🇷 flag: Turkey
+1F1F9 1F1F9 ; fully-qualified # 🇹🇹 flag: Trinidad & Tobago
+1F1F9 1F1FB ; fully-qualified # 🇹🇻 flag: Tuvalu
+1F1F9 1F1FC ; fully-qualified # 🇹🇼 flag: Taiwan
+1F1F9 1F1FF ; fully-qualified # 🇹🇿 flag: Tanzania
+1F1FA 1F1E6 ; fully-qualified # 🇺🇦 flag: Ukraine
+1F1FA 1F1EC ; fully-qualified # 🇺🇬 flag: Uganda
+1F1FA 1F1F2 ; fully-qualified # 🇺🇲 flag: U.S. Outlying Islands
+1F1FA 1F1F3 ; fully-qualified # 🇺🇳 flag: United Nations
+1F1FA 1F1F8 ; fully-qualified # 🇺🇸 flag: United States
+1F1FA 1F1FE ; fully-qualified # 🇺🇾 flag: Uruguay
+1F1FA 1F1FF ; fully-qualified # 🇺🇿 flag: Uzbekistan
+1F1FB 1F1E6 ; fully-qualified # 🇻🇦 flag: Vatican City
+1F1FB 1F1E8 ; fully-qualified # 🇻🇨 flag: St. Vincent & Grenadines
+1F1FB 1F1EA ; fully-qualified # 🇻🇪 flag: Venezuela
+1F1FB 1F1EC ; fully-qualified # 🇻🇬 flag: British Virgin Islands
+1F1FB 1F1EE ; fully-qualified # 🇻🇮 flag: U.S. Virgin Islands
+1F1FB 1F1F3 ; fully-qualified # 🇻🇳 flag: Vietnam
+1F1FB 1F1FA ; fully-qualified # 🇻🇺 flag: Vanuatu
+1F1FC 1F1EB ; fully-qualified # 🇼🇫 flag: Wallis & Futuna
+1F1FC 1F1F8 ; fully-qualified # 🇼🇸 flag: Samoa
+1F1FD 1F1F0 ; fully-qualified # 🇽🇰 flag: Kosovo
+1F1FE 1F1EA ; fully-qualified # 🇾🇪 flag: Yemen
+1F1FE 1F1F9 ; fully-qualified # 🇾🇹 flag: Mayotte
+1F1FF 1F1E6 ; fully-qualified # 🇿🇦 flag: South Africa
+1F1FF 1F1F2 ; fully-qualified # 🇿🇲 flag: Zambia
+1F1FF 1F1FC ; fully-qualified # 🇿🇼 flag: Zimbabwe
+
+# subgroup: subdivision-flag
+1F3F4 E0067 E0062 E0065 E006E E0067 E007F ; fully-qualified # 🏴 flag: England
+1F3F4 E0067 E0062 E0073 E0063 E0074 E007F ; fully-qualified # 🏴 flag: Scotland
+1F3F4 E0067 E0062 E0077 E006C E0073 E007F ; fully-qualified # 🏴 flag: Wales
+
+# Flags subtotal: 271
+# Flags subtotal: 271 w/o modifiers
+
+# Status Counts
+# fully-qualified : 3010
+# minimally-qualified : 571
+# unqualified : 246
+# component : 9
+
+#EOF
diff --git a/plugins/emoji/emoji.plugin.zsh b/plugins/emoji/emoji.plugin.zsh
index 7876f1c89..f9e476ebf 100644
--- a/plugins/emoji/emoji.plugin.zsh
+++ b/plugins/emoji/emoji.plugin.zsh
@@ -4,15 +4,17 @@
#
# See the README for documentation.
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
_omz_emoji_plugin_dir="${0:h}"
() {
local LC_ALL=en_US.UTF-8
-typeset -gAH emoji_groups
-typeset -gAH emoji_con
-typeset -gAH emoji2
typeset -gAH emoji_skintone
source "$_omz_emoji_plugin_dir/emoji-char-definitions.zsh"
@@ -20,12 +22,11 @@ unset _omz_emoji_plugin_dir
# These additional emoji are not in the definition file, but are useful in conjunction with it
-# This is a combinin character that can be placed after any other character to surround
+# This is a combining character that can be placed after any other character to surround
# it in a "keycap" symbol.
# The digits 0-9 are already in the emoji table as keycap_digit_, keycap_ten, etc.
# It's unclear whether this should be in the $emoji array, because those characters are all ones
# which can be displayed on their own.
-#emoji[combining_enclosing_keycap]="\U20E3"
emoji[regional_indicator_symbol_letter_d_regional_indicator_symbol_letter_e]=$'\xF0\x9F\x87\xA9\xF0\x9F\x87\xAA'
emoji[regional_indicator_symbol_letter_g_regional_indicator_symbol_letter_b]=$'\xF0\x9F\x87\xAC\xF0\x9F\x87\xA7'
@@ -38,209 +39,12 @@ emoji[regional_indicator_symbol_letter_i_regional_indicator_symbol_letter_t]=$'\
emoji[regional_indicator_symbol_letter_u_regional_indicator_symbol_letter_s]=$'\xF0\x9F\x87\xBA\xF0\x9F\x87\xB8'
emoji[regional_indicator_symbol_letter_r_regional_indicator_symbol_letter_u]=$'\xF0\x9F\x87\xB7\xF0\x9F\x87\xBA'
-# Nonstandard alias names
-emoji[vulcan_salute]=$'\U1F596'
-
-
-# Emoji combining and auxiliary characters
-
-# "Variation Selectors" for controlling text vs emoji style presentation
-# These apply to the immediately preceding character
-emoji2[text_style]=$'\UFE0E'
-emoji2[emoji_style]=$'\UFE0F'
-# Joiner that indicates a single combined-form glyph (ligature) should be used
-emoji2[zero_width_joiner]=$'\U200D'
-# Skin tone modifiers
-emoji2[emoji_modifier_fitzpatrick_type_1_2]=$'\U1F3FB'
-emoji2[emoji_modifier_fitzpatrick_type_3]=$'\U1F3FC'
-emoji2[emoji_modifier_fitzpatrick_type_4]=$'\U1F3FD'
-emoji2[emoji_modifier_fitzpatrick_type_5]=$'\U1F3FE'
-emoji2[emoji_modifier_fitzpatrick_type_6]=$'\U1F3FF'
-# Various other combining characters. (Incomplete list; I selected ones that sound useful)
-emoji2[combining_enclosing_circle]=$'\U20DD'
-emoji2[combining_enclosing_square]=$'\U20DE'
-emoji2[combining_enclosing_diamond]=$'\U20DF'
-emoji2[combining_enclosing_circle_backslash]=$'\U20E0'
-emoji2[combining_enclosing_screen]=$'\U20E2'
-emoji2[combining_enclosing_keycap]=$'\U20E3'
-emoji2[combining_enclosing_upward_pointing_triangle]=$'\U20E4'
-
# Easier access to skin tone modifiers
emoji_skintone[1_2]=$'\U1F3FB'
emoji_skintone[3]=$'\U1F3FC'
emoji_skintone[4]=$'\U1F3FD'
emoji_skintone[5]=$'\U1F3FE'
emoji_skintone[6]=$'\U1F3FF'
-
-# Emoji groups
-# These are stored in a single associative array, $emoji_groups, to avoid cluttering up the global
-# namespace, and to allow adding additional group definitions at run time.
-# The keys are the group names, and the values are whitespace-separated lists of emoji character names.
-
-emoji_groups[fruits]="
- tomato
- aubergine
- grapes
- melon
- watermelon
- tangerine
- banana
- pineapple
- red_apple
- green_apple
- peach
- cherries
- strawberry
- lemon
- pear
-"
-
-emoji_groups[vehicles]="
- airplane
- rocket
- railway_car
- high_speed_train
- high_speed_train_with_bullet_nose
- bus
- ambulance
- fire_engine
- police_car
- taxi
- automobile
- recreational_vehicle
- delivery_truck
- ship
- speedboat
- bicycle
- helicopter
- steam_locomotive
- train
- light_rail
- tram
- oncoming_bus
- trolleybus
- minibus
- oncoming_police_car
- oncoming_taxi
- oncoming_automobile
- articulated_lorry
- tractor
- monorail
- mountain_railway
- suspension_railway
- mountain_cableway
- aerial_tramway
- rowboat
- bicyclist
- mountain_bicyclist
- sailboat
-"
-
-emoji_groups[animals]="
- snail
- snake
- horse
- sheep
- monkey
- chicken
- boar
- elephant
- octopus
- spiral_shell
- bug
- ant
- honeybee
- lady_beetle
- fish
- tropical_fish
- blowfish
- turtle
- hatching_chick
- baby_chick
- front_facing_baby_chick
- bird
- penguin
- koala
- poodle
- bactrian_camel
- dolphin
- mouse_face
- cow_face
- tiger_face
- rabbit_face
- cat_face
- dragon_face
- spouting_whale
- horse_face
- monkey_face
- dog_face
- pig_face
- frog_face
- hamster_face
- wolf_face
- bear_face
- panda_face
- rat
- mouse
- ox
- water_buffalo
- cow
- tiger
- leopard
- rabbit
- cat
- dragon
- crocodile
- whale
- ram
- goat
- rooster
- dog
- pig
- dromedary_camel
-"
-
-emoji_groups[faces]="
- grinning_face_with_smiling_eyes
- face_with_tears_of_joy
- smiling_face_with_open_mouth
- smiling_face_with_open_mouth_and_smiling_eyes
- smiling_face_with_open_mouth_and_cold_sweat
- smiling_face_with_open_mouth_and_tightly_closed_eyes
- winking_face
- smiling_face_with_smiling_eyes
- face_savouring_delicious_food
- relieved_face
- smiling_face_with_heart_shaped_eyes
- smirking_face
- unamused_face
- face_with_cold_sweat
- pensive_face
- confounded_face
- face_throwing_a_kiss
- kissing_face_with_closed_eyes
- face_with_stuck_out_tongue_and_winking_eye
- face_with_stuck_out_tongue_and_tightly_closed_eyes
- disappointed_face
- angry_face
- pouting_face
- crying_face
- persevering_face
- face_with_look_of_triumph
- disappointed_but_relieved_face
- fearful_face
- weary_face
- sleepy_face
- tired_face
- loudly_crying_face
- face_with_open_mouth_and_cold_sweat
- face_screaming_in_fear
- astonished_face
- flushed_face
- dizzy_face
- face_with_medical_mask
-"
-
}
# Prints a random emoji character
@@ -259,7 +63,11 @@ function random_emoji() {
[[ $list_size -eq 0 ]] && return 1
local random_index=$(( ( RANDOM % $list_size ) + 1 ))
local name=${names[$random_index]}
- echo ${emoji[$name]}
+ if [[ "$group" == "flags" ]]; then
+ echo ${emoji_flags[$name]}
+ else
+ echo ${emoji[$name]}
+ fi
}
# Displays a listing of emoji with their names
@@ -276,12 +84,26 @@ function display_emoji() {
fi
# The extra spaces in output here are a hack for readability, since some
# terminals treat these emoji chars as single-width.
+ local counter=1
for i in $names; do
- printf '%s ' "$emoji[$i]"
+ if [[ "$group" == "flags" ]]; then
+ printf '%s ' "$emoji_flags[$i]"
+ else
+ printf '%s ' "$emoji[$i]"
+ fi
+ # New line every 20 emoji, to avoid weirdnesses
+ if (($counter % 20 == 0)); then
+ printf "\n"
+ fi
+ let counter=$counter+1
done
print
for i in $names; do
- echo "${emoji[$i]} = $i"
+ if [[ "$group" == "flags" ]]; then
+ echo "${emoji_flags[$i]} = $i"
+ else
+ echo "${emoji[$i]} = $i"
+ fi
done
}
diff --git a/plugins/emoji/gemoji_db.json b/plugins/emoji/gemoji_db.json
new file mode 100644
index 000000000..9227c26d1
--- /dev/null
+++ b/plugins/emoji/gemoji_db.json
@@ -0,0 +1,21538 @@
+[
+ {
+ "emoji": "😀"
+ , "description": "grinning face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "grinning"
+ ]
+ , "tags": [
+ "smile"
+ , "happy"
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😃"
+ , "description": "grinning face with big eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "smiley"
+ ]
+ , "tags": [
+ "happy"
+ , "joy"
+ , "haha"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😄"
+ , "description": "grinning face with smiling eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "smile"
+ ]
+ , "tags": [
+ "happy"
+ , "joy"
+ , "laugh"
+ , "pleased"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😁"
+ , "description": "beaming face with smiling eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "grin"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😆"
+ , "description": "grinning squinting face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "laughing"
+ , "satisfied"
+ ]
+ , "tags": [
+ "happy"
+ , "haha"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😅"
+ , "description": "grinning face with sweat"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "sweat_smile"
+ ]
+ , "tags": [
+ "hot"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤣"
+ , "description": "rolling on the floor laughing"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "rofl"
+ ]
+ , "tags": [
+ "lol"
+ , "laughing"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "😂"
+ , "description": "face with tears of joy"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "joy"
+ ]
+ , "tags": [
+ "tears"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🙂"
+ , "description": "slightly smiling face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "slightly_smiling_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🙃"
+ , "description": "upside-down face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "upside_down_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "😉"
+ , "description": "winking face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "wink"
+ ]
+ , "tags": [
+ "flirt"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😊"
+ , "description": "smiling face with smiling eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "blush"
+ ]
+ , "tags": [
+ "proud"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😇"
+ , "description": "smiling face with halo"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "innocent"
+ ]
+ , "tags": [
+ "angel"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥰"
+ , "description": "smiling face with hearts"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "smiling_face_with_three_hearts"
+ ]
+ , "tags": [
+ "love"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "😍"
+ , "description": "smiling face with heart-eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "heart_eyes"
+ ]
+ , "tags": [
+ "love"
+ , "crush"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤩"
+ , "description": "star-struck"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "star_struck"
+ ]
+ , "tags": [
+ "eyes"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "😘"
+ , "description": "face blowing a kiss"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "kissing_heart"
+ ]
+ , "tags": [
+ "flirt"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😗"
+ , "description": "kissing face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "kissing"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☺️"
+ , "description": "smiling face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "relaxed"
+ ]
+ , "tags": [
+ "blush"
+ , "pleased"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😚"
+ , "description": "kissing face with closed eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "kissing_closed_eyes"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😙"
+ , "description": "kissing face with smiling eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "kissing_smiling_eyes"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😋"
+ , "description": "face savoring food"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "yum"
+ ]
+ , "tags": [
+ "tongue"
+ , "lick"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😛"
+ , "description": "face with tongue"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "stuck_out_tongue"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😜"
+ , "description": "winking face with tongue"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "stuck_out_tongue_winking_eye"
+ ]
+ , "tags": [
+ "prank"
+ , "silly"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤪"
+ , "description": "zany face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "zany_face"
+ ]
+ , "tags": [
+ "goofy"
+ , "wacky"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "😝"
+ , "description": "squinting face with tongue"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "stuck_out_tongue_closed_eyes"
+ ]
+ , "tags": [
+ "prank"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤑"
+ , "description": "money-mouth face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "money_mouth_face"
+ ]
+ , "tags": [
+ "rich"
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🤗"
+ , "description": "hugging face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "hugs"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🤭"
+ , "description": "face with hand over mouth"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "hand_over_mouth"
+ ]
+ , "tags": [
+ "quiet"
+ , "whoops"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🤫"
+ , "description": "shushing face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "shushing_face"
+ ]
+ , "tags": [
+ "silence"
+ , "quiet"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🤔"
+ , "description": "thinking face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "thinking"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🤐"
+ , "description": "zipper-mouth face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "zipper_mouth_face"
+ ]
+ , "tags": [
+ "silence"
+ , "hush"
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🤨"
+ , "description": "face with raised eyebrow"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "raised_eyebrow"
+ ]
+ , "tags": [
+ "suspicious"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "😐"
+ , "description": "neutral face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "neutral_face"
+ ]
+ , "tags": [
+ "meh"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😑"
+ , "description": "expressionless face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "expressionless"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😶"
+ , "description": "face without mouth"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "no_mouth"
+ ]
+ , "tags": [
+ "mute"
+ , "silence"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😏"
+ , "description": "smirking face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "smirk"
+ ]
+ , "tags": [
+ "smug"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😒"
+ , "description": "unamused face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "unamused"
+ ]
+ , "tags": [
+ "meh"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🙄"
+ , "description": "face with rolling eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "roll_eyes"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "😬"
+ , "description": "grimacing face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "grimacing"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤥"
+ , "description": "lying face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "lying_face"
+ ]
+ , "tags": [
+ "liar"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "😌"
+ , "description": "relieved face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "relieved"
+ ]
+ , "tags": [
+ "whew"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😔"
+ , "description": "pensive face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "pensive"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😪"
+ , "description": "sleepy face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "sleepy"
+ ]
+ , "tags": [
+ "tired"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤤"
+ , "description": "drooling face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "drooling_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "😴"
+ , "description": "sleeping face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "sleeping"
+ ]
+ , "tags": [
+ "zzz"
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😷"
+ , "description": "face with medical mask"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "mask"
+ ]
+ , "tags": [
+ "sick"
+ , "ill"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤒"
+ , "description": "face with thermometer"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "face_with_thermometer"
+ ]
+ , "tags": [
+ "sick"
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🤕"
+ , "description": "face with head-bandage"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "face_with_head_bandage"
+ ]
+ , "tags": [
+ "hurt"
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🤢"
+ , "description": "nauseated face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "nauseated_face"
+ ]
+ , "tags": [
+ "sick"
+ , "barf"
+ , "disgusted"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🤮"
+ , "description": "face vomiting"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "vomiting_face"
+ ]
+ , "tags": [
+ "barf"
+ , "sick"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🤧"
+ , "description": "sneezing face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "sneezing_face"
+ ]
+ , "tags": [
+ "achoo"
+ , "sick"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥵"
+ , "description": "hot face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "hot_face"
+ ]
+ , "tags": [
+ "heat"
+ , "sweating"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥶"
+ , "description": "cold face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "cold_face"
+ ]
+ , "tags": [
+ "freezing"
+ , "ice"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥴"
+ , "description": "woozy face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "woozy_face"
+ ]
+ , "tags": [
+ "groggy"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "😵"
+ , "description": "dizzy face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "dizzy_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤯"
+ , "description": "exploding head"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "exploding_head"
+ ]
+ , "tags": [
+ "mind"
+ , "blown"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🤠"
+ , "description": "cowboy hat face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "cowboy_hat_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥳"
+ , "description": "partying face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "partying_face"
+ ]
+ , "tags": [
+ "celebration"
+ , "birthday"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "😎"
+ , "description": "smiling face with sunglasses"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "sunglasses"
+ ]
+ , "tags": [
+ "cool"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤓"
+ , "description": "nerd face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "nerd_face"
+ ]
+ , "tags": [
+ "geek"
+ , "glasses"
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🧐"
+ , "description": "face with monocle"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "monocle_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "😕"
+ , "description": "confused face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "confused"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😟"
+ , "description": "worried face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "worried"
+ ]
+ , "tags": [
+ "nervous"
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🙁"
+ , "description": "slightly frowning face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "slightly_frowning_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "☹"
+ , "description": "frowning face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "frowning_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "😮"
+ , "description": "face with open mouth"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "open_mouth"
+ ]
+ , "tags": [
+ "surprise"
+ , "impressed"
+ , "wow"
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😯"
+ , "description": "hushed face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "hushed"
+ ]
+ , "tags": [
+ "silence"
+ , "speechless"
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😲"
+ , "description": "astonished face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "astonished"
+ ]
+ , "tags": [
+ "amazed"
+ , "gasp"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😳"
+ , "description": "flushed face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "flushed"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥺"
+ , "description": "pleading face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "pleading_face"
+ ]
+ , "tags": [
+ "puppy"
+ , "eyes"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "😦"
+ , "description": "frowning face with open mouth"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "frowning"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😧"
+ , "description": "anguished face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "anguished"
+ ]
+ , "tags": [
+ "stunned"
+ ]
+ , "unicode_version": "6.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😨"
+ , "description": "fearful face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "fearful"
+ ]
+ , "tags": [
+ "scared"
+ , "shocked"
+ , "oops"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😰"
+ , "description": "anxious face with sweat"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "cold_sweat"
+ ]
+ , "tags": [
+ "nervous"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😥"
+ , "description": "sad but relieved face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "disappointed_relieved"
+ ]
+ , "tags": [
+ "phew"
+ , "sweat"
+ , "nervous"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😢"
+ , "description": "crying face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "cry"
+ ]
+ , "tags": [
+ "sad"
+ , "tear"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😭"
+ , "description": "loudly crying face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "sob"
+ ]
+ , "tags": [
+ "sad"
+ , "cry"
+ , "bawling"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😱"
+ , "description": "face screaming in fear"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "scream"
+ ]
+ , "tags": [
+ "horror"
+ , "shocked"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😖"
+ , "description": "confounded face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "confounded"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😣"
+ , "description": "persevering face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "persevere"
+ ]
+ , "tags": [
+ "struggling"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😞"
+ , "description": "disappointed face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "disappointed"
+ ]
+ , "tags": [
+ "sad"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😓"
+ , "description": "downcast face with sweat"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "sweat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😩"
+ , "description": "weary face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "weary"
+ ]
+ , "tags": [
+ "tired"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😫"
+ , "description": "tired face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "tired_face"
+ ]
+ , "tags": [
+ "upset"
+ , "whine"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥱"
+ , "description": "yawning face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "yawning_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "😤"
+ , "description": "face with steam from nose"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "triumph"
+ ]
+ , "tags": [
+ "smug"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😡"
+ , "description": "pouting face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "rage"
+ , "pout"
+ ]
+ , "tags": [
+ "angry"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😠"
+ , "description": "angry face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "angry"
+ ]
+ , "tags": [
+ "mad"
+ , "annoyed"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤬"
+ , "description": "face with symbols on mouth"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "cursing_face"
+ ]
+ , "tags": [
+ "foul"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "😈"
+ , "description": "smiling face with horns"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "smiling_imp"
+ ]
+ , "tags": [
+ "devil"
+ , "evil"
+ , "horns"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👿"
+ , "description": "angry face with horns"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "imp"
+ ]
+ , "tags": [
+ "angry"
+ , "devil"
+ , "evil"
+ , "horns"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💀"
+ , "description": "skull"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "skull"
+ ]
+ , "tags": [
+ "dead"
+ , "danger"
+ , "poison"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☠"
+ , "description": "skull and crossbones"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "skull_and_crossbones"
+ ]
+ , "tags": [
+ "danger"
+ , "pirate"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "💩"
+ , "description": "pile of poo"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "hankey"
+ , "poop"
+ , "shit"
+ ]
+ , "tags": [
+ "crap"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤡"
+ , "description": "clown face"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "clown_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "👹"
+ , "description": "ogre"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "japanese_ogre"
+ ]
+ , "tags": [
+ "monster"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👺"
+ , "description": "goblin"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "japanese_goblin"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👻"
+ , "description": "ghost"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "ghost"
+ ]
+ , "tags": [
+ "halloween"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👽"
+ , "description": "alien"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "alien"
+ ]
+ , "tags": [
+ "ufo"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👾"
+ , "description": "alien monster"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "space_invader"
+ ]
+ , "tags": [
+ "game"
+ , "retro"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤖"
+ , "description": "robot"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "robot"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "😺"
+ , "description": "grinning cat"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "smiley_cat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😸"
+ , "description": "grinning cat with smiling eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "smile_cat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😹"
+ , "description": "cat with tears of joy"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "joy_cat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😻"
+ , "description": "smiling cat with heart-eyes"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "heart_eyes_cat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😼"
+ , "description": "cat with wry smile"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "smirk_cat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😽"
+ , "description": "kissing cat"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "kissing_cat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🙀"
+ , "description": "weary cat"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "scream_cat"
+ ]
+ , "tags": [
+ "horror"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😿"
+ , "description": "crying cat"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "crying_cat_face"
+ ]
+ , "tags": [
+ "sad"
+ , "tear"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "😾"
+ , "description": "pouting cat"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "pouting_cat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🙈"
+ , "description": "see-no-evil monkey"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "see_no_evil"
+ ]
+ , "tags": [
+ "monkey"
+ , "blind"
+ , "ignore"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🙉"
+ , "description": "hear-no-evil monkey"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "hear_no_evil"
+ ]
+ , "tags": [
+ "monkey"
+ , "deaf"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🙊"
+ , "description": "speak-no-evil monkey"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "speak_no_evil"
+ ]
+ , "tags": [
+ "monkey"
+ , "mute"
+ , "hush"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💋"
+ , "description": "kiss mark"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "kiss"
+ ]
+ , "tags": [
+ "lipstick"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💌"
+ , "description": "love letter"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "love_letter"
+ ]
+ , "tags": [
+ "email"
+ , "envelope"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💘"
+ , "description": "heart with arrow"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "cupid"
+ ]
+ , "tags": [
+ "love"
+ , "heart"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💝"
+ , "description": "heart with ribbon"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "gift_heart"
+ ]
+ , "tags": [
+ "chocolates"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💖"
+ , "description": "sparkling heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "sparkling_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💗"
+ , "description": "growing heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "heartpulse"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💓"
+ , "description": "beating heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "heartbeat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💞"
+ , "description": "revolving hearts"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "revolving_hearts"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💕"
+ , "description": "two hearts"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "two_hearts"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💟"
+ , "description": "heart decoration"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "heart_decoration"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❣️"
+ , "description": "heart exclamation"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "heavy_heart_exclamation"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "💔"
+ , "description": "broken heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "broken_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❤️"
+ , "description": "red heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "heart"
+ ]
+ , "tags": [
+ "love"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧡"
+ , "description": "orange heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "orange_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "💛"
+ , "description": "yellow heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "yellow_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💚"
+ , "description": "green heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "green_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💙"
+ , "description": "blue heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "blue_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💜"
+ , "description": "purple heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "purple_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤎"
+ , "description": "brown heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "brown_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🖤"
+ , "description": "black heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "black_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🤍"
+ , "description": "white heart"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "white_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "💯"
+ , "description": "hundred points"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "100"
+ ]
+ , "tags": [
+ "score"
+ , "perfect"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💢"
+ , "description": "anger symbol"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "anger"
+ ]
+ , "tags": [
+ "angry"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💥"
+ , "description": "collision"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "boom"
+ , "collision"
+ ]
+ , "tags": [
+ "explode"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💫"
+ , "description": "dizzy"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "dizzy"
+ ]
+ , "tags": [
+ "star"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💦"
+ , "description": "sweat droplets"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "sweat_drops"
+ ]
+ , "tags": [
+ "water"
+ , "workout"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💨"
+ , "description": "dashing away"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "dash"
+ ]
+ , "tags": [
+ "wind"
+ , "blow"
+ , "fast"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕳"
+ , "description": "hole"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "hole"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "💣"
+ , "description": "bomb"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "bomb"
+ ]
+ , "tags": [
+ "boom"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💬"
+ , "description": "speech balloon"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "speech_balloon"
+ ]
+ , "tags": [
+ "comment"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👁️🗨️"
+ , "description": "eye in speech bubble"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "eye_speech_bubble"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🗨"
+ , "description": "left speech bubble"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "left_speech_bubble"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🗯"
+ , "description": "right anger bubble"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "right_anger_bubble"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "💭"
+ , "description": "thought balloon"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "thought_balloon"
+ ]
+ , "tags": [
+ "thinking"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💤"
+ , "description": "zzz"
+ , "category": "Smileys & Emotion"
+ , "aliases": [
+ "zzz"
+ ]
+ , "tags": [
+ "sleeping"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👋"
+ , "description": "waving hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "wave"
+ ]
+ , "tags": [
+ "goodbye"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤚"
+ , "description": "raised back of hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "raised_back_of_hand"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🖐"
+ , "description": "hand with fingers splayed"
+ , "category": "People & Body"
+ , "aliases": [
+ "raised_hand_with_fingers_splayed"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "✋"
+ , "description": "raised hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "hand"
+ , "raised_hand"
+ ]
+ , "tags": [
+ "highfive"
+ , "stop"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🖖"
+ , "description": "vulcan salute"
+ , "category": "People & Body"
+ , "aliases": [
+ "vulcan_salute"
+ ]
+ , "tags": [
+ "prosper"
+ , "spock"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "8.3"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👌"
+ , "description": "OK hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "ok_hand"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤏"
+ , "description": "pinching hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "pinching_hand"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "✌️"
+ , "description": "victory hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "v"
+ ]
+ , "tags": [
+ "victory"
+ , "peace"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤞"
+ , "description": "crossed fingers"
+ , "category": "People & Body"
+ , "aliases": [
+ "crossed_fingers"
+ ]
+ , "tags": [
+ "luck"
+ , "hopeful"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤟"
+ , "description": "love-you gesture"
+ , "category": "People & Body"
+ , "aliases": [
+ "love_you_gesture"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤘"
+ , "description": "sign of the horns"
+ , "category": "People & Body"
+ , "aliases": [
+ "metal"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤙"
+ , "description": "call me hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "call_me_hand"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👈"
+ , "description": "backhand index pointing left"
+ , "category": "People & Body"
+ , "aliases": [
+ "point_left"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👉"
+ , "description": "backhand index pointing right"
+ , "category": "People & Body"
+ , "aliases": [
+ "point_right"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👆"
+ , "description": "backhand index pointing up"
+ , "category": "People & Body"
+ , "aliases": [
+ "point_up_2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🖕"
+ , "description": "middle finger"
+ , "category": "People & Body"
+ , "aliases": [
+ "middle_finger"
+ , "fu"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👇"
+ , "description": "backhand index pointing down"
+ , "category": "People & Body"
+ , "aliases": [
+ "point_down"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "☝️"
+ , "description": "index pointing up"
+ , "category": "People & Body"
+ , "aliases": [
+ "point_up"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👍"
+ , "description": "thumbs up"
+ , "category": "People & Body"
+ , "aliases": [
+ "+1"
+ , "thumbsup"
+ ]
+ , "tags": [
+ "approve"
+ , "ok"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👎"
+ , "description": "thumbs down"
+ , "category": "People & Body"
+ , "aliases": [
+ "-1"
+ , "thumbsdown"
+ ]
+ , "tags": [
+ "disapprove"
+ , "bury"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "✊"
+ , "description": "raised fist"
+ , "category": "People & Body"
+ , "aliases": [
+ "fist_raised"
+ , "fist"
+ ]
+ , "tags": [
+ "power"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👊"
+ , "description": "oncoming fist"
+ , "category": "People & Body"
+ , "aliases": [
+ "fist_oncoming"
+ , "facepunch"
+ , "punch"
+ ]
+ , "tags": [
+ "attack"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤛"
+ , "description": "left-facing fist"
+ , "category": "People & Body"
+ , "aliases": [
+ "fist_left"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤜"
+ , "description": "right-facing fist"
+ , "category": "People & Body"
+ , "aliases": [
+ "fist_right"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👏"
+ , "description": "clapping hands"
+ , "category": "People & Body"
+ , "aliases": [
+ "clap"
+ ]
+ , "tags": [
+ "praise"
+ , "applause"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙌"
+ , "description": "raising hands"
+ , "category": "People & Body"
+ , "aliases": [
+ "raised_hands"
+ ]
+ , "tags": [
+ "hooray"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👐"
+ , "description": "open hands"
+ , "category": "People & Body"
+ , "aliases": [
+ "open_hands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤲"
+ , "description": "palms up together"
+ , "category": "People & Body"
+ , "aliases": [
+ "palms_up_together"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤝"
+ , "description": "handshake"
+ , "category": "People & Body"
+ , "aliases": [
+ "handshake"
+ ]
+ , "tags": [
+ "deal"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🙏"
+ , "description": "folded hands"
+ , "category": "People & Body"
+ , "aliases": [
+ "pray"
+ ]
+ , "tags": [
+ "please"
+ , "hope"
+ , "wish"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "✍️"
+ , "description": "writing hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "writing_hand"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💅"
+ , "description": "nail polish"
+ , "category": "People & Body"
+ , "aliases": [
+ "nail_care"
+ ]
+ , "tags": [
+ "beauty"
+ , "manicure"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤳"
+ , "description": "selfie"
+ , "category": "People & Body"
+ , "aliases": [
+ "selfie"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💪"
+ , "description": "flexed biceps"
+ , "category": "People & Body"
+ , "aliases": [
+ "muscle"
+ ]
+ , "tags": [
+ "flex"
+ , "bicep"
+ , "strong"
+ , "workout"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🦾"
+ , "description": "mechanical arm"
+ , "category": "People & Body"
+ , "aliases": [
+ "mechanical_arm"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🦿"
+ , "description": "mechanical leg"
+ , "category": "People & Body"
+ , "aliases": [
+ "mechanical_leg"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🦵"
+ , "description": "leg"
+ , "category": "People & Body"
+ , "aliases": [
+ "leg"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🦶"
+ , "description": "foot"
+ , "category": "People & Body"
+ , "aliases": [
+ "foot"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👂"
+ , "description": "ear"
+ , "category": "People & Body"
+ , "aliases": [
+ "ear"
+ ]
+ , "tags": [
+ "hear"
+ , "sound"
+ , "listen"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🦻"
+ , "description": "ear with hearing aid"
+ , "category": "People & Body"
+ , "aliases": [
+ "ear_with_hearing_aid"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👃"
+ , "description": "nose"
+ , "category": "People & Body"
+ , "aliases": [
+ "nose"
+ ]
+ , "tags": [
+ "smell"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧠"
+ , "description": "brain"
+ , "category": "People & Body"
+ , "aliases": [
+ "brain"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦷"
+ , "description": "tooth"
+ , "category": "People & Body"
+ , "aliases": [
+ "tooth"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦴"
+ , "description": "bone"
+ , "category": "People & Body"
+ , "aliases": [
+ "bone"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "👀"
+ , "description": "eyes"
+ , "category": "People & Body"
+ , "aliases": [
+ "eyes"
+ ]
+ , "tags": [
+ "look"
+ , "see"
+ , "watch"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👁"
+ , "description": "eye"
+ , "category": "People & Body"
+ , "aliases": [
+ "eye"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "👅"
+ , "description": "tongue"
+ , "category": "People & Body"
+ , "aliases": [
+ "tongue"
+ ]
+ , "tags": [
+ "taste"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👄"
+ , "description": "mouth"
+ , "category": "People & Body"
+ , "aliases": [
+ "lips"
+ ]
+ , "tags": [
+ "kiss"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👶"
+ , "description": "baby"
+ , "category": "People & Body"
+ , "aliases": [
+ "baby"
+ ]
+ , "tags": [
+ "child"
+ , "newborn"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧒"
+ , "description": "child"
+ , "category": "People & Body"
+ , "aliases": [
+ "child"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👦"
+ , "description": "boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "boy"
+ ]
+ , "tags": [
+ "child"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👧"
+ , "description": "girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "girl"
+ ]
+ , "tags": [
+ "child"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧑"
+ , "description": "person"
+ , "category": "People & Body"
+ , "aliases": [
+ "adult"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👱"
+ , "description": "person: blond hair"
+ , "category": "People & Body"
+ , "aliases": [
+ "blond_haired_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨"
+ , "description": "man"
+ , "category": "People & Body"
+ , "aliases": [
+ "man"
+ ]
+ , "tags": [
+ "mustache"
+ , "father"
+ , "dad"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧔"
+ , "description": "man: beard"
+ , "category": "People & Body"
+ , "aliases": [
+ "bearded_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👱♂"
+ , "description": "man: blond hair"
+ , "category": "People & Body"
+ , "aliases": [
+ "blond_haired_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🦰"
+ , "description": "man: red hair"
+ , "category": "People & Body"
+ , "aliases": [
+ "red_haired_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🦱"
+ , "description": "man: curly hair"
+ , "category": "People & Body"
+ , "aliases": [
+ "curly_haired_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🦳"
+ , "description": "man: white hair"
+ , "category": "People & Body"
+ , "aliases": [
+ "white_haired_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🦲"
+ , "description": "man: bald"
+ , "category": "People & Body"
+ , "aliases": [
+ "bald_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩"
+ , "description": "woman"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman"
+ ]
+ , "tags": [
+ "girls"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👱♀"
+ , "description": "woman: blond hair"
+ , "category": "People & Body"
+ , "aliases": [
+ "blond_haired_woman"
+ , "blonde_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🦰"
+ , "description": "woman: red hair"
+ , "category": "People & Body"
+ , "aliases": [
+ "red_haired_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🦱"
+ , "description": "woman: curly hair"
+ , "category": "People & Body"
+ , "aliases": [
+ "curly_haired_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🦳"
+ , "description": "woman: white hair"
+ , "category": "People & Body"
+ , "aliases": [
+ "white_haired_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🦲"
+ , "description": "woman: bald"
+ , "category": "People & Body"
+ , "aliases": [
+ "bald_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧓"
+ , "description": "older person"
+ , "category": "People & Body"
+ , "aliases": [
+ "older_adult"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👴"
+ , "description": "old man"
+ , "category": "People & Body"
+ , "aliases": [
+ "older_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👵"
+ , "description": "old woman"
+ , "category": "People & Body"
+ , "aliases": [
+ "older_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙍"
+ , "description": "person frowning"
+ , "category": "People & Body"
+ , "aliases": [
+ "frowning_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙍♂"
+ , "description": "man frowning"
+ , "category": "People & Body"
+ , "aliases": [
+ "frowning_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙍♀"
+ , "description": "woman frowning"
+ , "category": "People & Body"
+ , "aliases": [
+ "frowning_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙎"
+ , "description": "person pouting"
+ , "category": "People & Body"
+ , "aliases": [
+ "pouting_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙎♂"
+ , "description": "man pouting"
+ , "category": "People & Body"
+ , "aliases": [
+ "pouting_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙎♀"
+ , "description": "woman pouting"
+ , "category": "People & Body"
+ , "aliases": [
+ "pouting_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙅"
+ , "description": "person gesturing NO"
+ , "category": "People & Body"
+ , "aliases": [
+ "no_good"
+ ]
+ , "tags": [
+ "stop"
+ , "halt"
+ , "denied"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙅♂"
+ , "description": "man gesturing NO"
+ , "category": "People & Body"
+ , "aliases": [
+ "no_good_man"
+ , "ng_man"
+ ]
+ , "tags": [
+ "stop"
+ , "halt"
+ , "denied"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙅♀"
+ , "description": "woman gesturing NO"
+ , "category": "People & Body"
+ , "aliases": [
+ "no_good_woman"
+ , "ng_woman"
+ ]
+ , "tags": [
+ "stop"
+ , "halt"
+ , "denied"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙆"
+ , "description": "person gesturing OK"
+ , "category": "People & Body"
+ , "aliases": [
+ "ok_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙆♂"
+ , "description": "man gesturing OK"
+ , "category": "People & Body"
+ , "aliases": [
+ "ok_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙆♀"
+ , "description": "woman gesturing OK"
+ , "category": "People & Body"
+ , "aliases": [
+ "ok_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💁"
+ , "description": "person tipping hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "tipping_hand_person"
+ , "information_desk_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💁♂"
+ , "description": "man tipping hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "tipping_hand_man"
+ , "sassy_man"
+ ]
+ , "tags": [
+ "information"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💁♀"
+ , "description": "woman tipping hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "tipping_hand_woman"
+ , "sassy_woman"
+ ]
+ , "tags": [
+ "information"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙋"
+ , "description": "person raising hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "raising_hand"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙋♂"
+ , "description": "man raising hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "raising_hand_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙋♀"
+ , "description": "woman raising hand"
+ , "category": "People & Body"
+ , "aliases": [
+ "raising_hand_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧏"
+ , "description": "deaf person"
+ , "category": "People & Body"
+ , "aliases": [
+ "deaf_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧏♂"
+ , "description": "deaf man"
+ , "category": "People & Body"
+ , "aliases": [
+ "deaf_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧏♀"
+ , "description": "deaf woman"
+ , "category": "People & Body"
+ , "aliases": [
+ "deaf_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙇"
+ , "description": "person bowing"
+ , "category": "People & Body"
+ , "aliases": [
+ "bow"
+ ]
+ , "tags": [
+ "respect"
+ , "thanks"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙇♂"
+ , "description": "man bowing"
+ , "category": "People & Body"
+ , "aliases": [
+ "bowing_man"
+ ]
+ , "tags": [
+ "respect"
+ , "thanks"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🙇♀"
+ , "description": "woman bowing"
+ , "category": "People & Body"
+ , "aliases": [
+ "bowing_woman"
+ ]
+ , "tags": [
+ "respect"
+ , "thanks"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤦"
+ , "description": "person facepalming"
+ , "category": "People & Body"
+ , "aliases": [
+ "facepalm"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤦♂"
+ , "description": "man facepalming"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_facepalming"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤦♀"
+ , "description": "woman facepalming"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_facepalming"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤷"
+ , "description": "person shrugging"
+ , "category": "People & Body"
+ , "aliases": [
+ "shrug"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤷♂"
+ , "description": "man shrugging"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_shrugging"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤷♀"
+ , "description": "woman shrugging"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_shrugging"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨⚕"
+ , "description": "man health worker"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_health_worker"
+ ]
+ , "tags": [
+ "doctor"
+ , "nurse"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩⚕"
+ , "description": "woman health worker"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_health_worker"
+ ]
+ , "tags": [
+ "doctor"
+ , "nurse"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🎓"
+ , "description": "man student"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_student"
+ ]
+ , "tags": [
+ "graduation"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🎓"
+ , "description": "woman student"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_student"
+ ]
+ , "tags": [
+ "graduation"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🏫"
+ , "description": "man teacher"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_teacher"
+ ]
+ , "tags": [
+ "school"
+ , "professor"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🏫"
+ , "description": "woman teacher"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_teacher"
+ ]
+ , "tags": [
+ "school"
+ , "professor"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨⚖"
+ , "description": "man judge"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_judge"
+ ]
+ , "tags": [
+ "justice"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩⚖"
+ , "description": "woman judge"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_judge"
+ ]
+ , "tags": [
+ "justice"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🌾"
+ , "description": "man farmer"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_farmer"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🌾"
+ , "description": "woman farmer"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_farmer"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🍳"
+ , "description": "man cook"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_cook"
+ ]
+ , "tags": [
+ "chef"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🍳"
+ , "description": "woman cook"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_cook"
+ ]
+ , "tags": [
+ "chef"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🔧"
+ , "description": "man mechanic"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_mechanic"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🔧"
+ , "description": "woman mechanic"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_mechanic"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🏭"
+ , "description": "man factory worker"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_factory_worker"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🏭"
+ , "description": "woman factory worker"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_factory_worker"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨💼"
+ , "description": "man office worker"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_office_worker"
+ ]
+ , "tags": [
+ "business"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩💼"
+ , "description": "woman office worker"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_office_worker"
+ ]
+ , "tags": [
+ "business"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🔬"
+ , "description": "man scientist"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_scientist"
+ ]
+ , "tags": [
+ "research"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🔬"
+ , "description": "woman scientist"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_scientist"
+ ]
+ , "tags": [
+ "research"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨💻"
+ , "description": "man technologist"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_technologist"
+ ]
+ , "tags": [
+ "coder"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩💻"
+ , "description": "woman technologist"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_technologist"
+ ]
+ , "tags": [
+ "coder"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🎤"
+ , "description": "man singer"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_singer"
+ ]
+ , "tags": [
+ "rockstar"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🎤"
+ , "description": "woman singer"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_singer"
+ ]
+ , "tags": [
+ "rockstar"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🎨"
+ , "description": "man artist"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_artist"
+ ]
+ , "tags": [
+ "painter"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🎨"
+ , "description": "woman artist"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_artist"
+ ]
+ , "tags": [
+ "painter"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨✈"
+ , "description": "man pilot"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_pilot"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩✈"
+ , "description": "woman pilot"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_pilot"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🚀"
+ , "description": "man astronaut"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_astronaut"
+ ]
+ , "tags": [
+ "space"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🚀"
+ , "description": "woman astronaut"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_astronaut"
+ ]
+ , "tags": [
+ "space"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🚒"
+ , "description": "man firefighter"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_firefighter"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🚒"
+ , "description": "woman firefighter"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_firefighter"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👮"
+ , "description": "police officer"
+ , "category": "People & Body"
+ , "aliases": [
+ "police_officer"
+ , "cop"
+ ]
+ , "tags": [
+ "law"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👮♂"
+ , "description": "man police officer"
+ , "category": "People & Body"
+ , "aliases": [
+ "policeman"
+ ]
+ , "tags": [
+ "law"
+ , "cop"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👮♀"
+ , "description": "woman police officer"
+ , "category": "People & Body"
+ , "aliases": [
+ "policewoman"
+ ]
+ , "tags": [
+ "law"
+ , "cop"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🕵"
+ , "description": "detective"
+ , "category": "People & Body"
+ , "aliases": [
+ "detective"
+ ]
+ , "tags": [
+ "sleuth"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🕵️♂️"
+ , "description": "man detective"
+ , "category": "People & Body"
+ , "aliases": [
+ "male_detective"
+ ]
+ , "tags": [
+ "sleuth"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🕵️♀️"
+ , "description": "woman detective"
+ , "category": "People & Body"
+ , "aliases": [
+ "female_detective"
+ ]
+ , "tags": [
+ "sleuth"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💂"
+ , "description": "guard"
+ , "category": "People & Body"
+ , "aliases": [
+ "guard"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💂♂"
+ , "description": "man guard"
+ , "category": "People & Body"
+ , "aliases": [
+ "guardsman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💂♀"
+ , "description": "woman guard"
+ , "category": "People & Body"
+ , "aliases": [
+ "guardswoman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👷"
+ , "description": "construction worker"
+ , "category": "People & Body"
+ , "aliases": [
+ "construction_worker"
+ ]
+ , "tags": [
+ "helmet"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👷♂"
+ , "description": "man construction worker"
+ , "category": "People & Body"
+ , "aliases": [
+ "construction_worker_man"
+ ]
+ , "tags": [
+ "helmet"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👷♀"
+ , "description": "woman construction worker"
+ , "category": "People & Body"
+ , "aliases": [
+ "construction_worker_woman"
+ ]
+ , "tags": [
+ "helmet"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤴"
+ , "description": "prince"
+ , "category": "People & Body"
+ , "aliases": [
+ "prince"
+ ]
+ , "tags": [
+ "crown"
+ , "royal"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👸"
+ , "description": "princess"
+ , "category": "People & Body"
+ , "aliases": [
+ "princess"
+ ]
+ , "tags": [
+ "crown"
+ , "royal"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👳"
+ , "description": "person wearing turban"
+ , "category": "People & Body"
+ , "aliases": [
+ "person_with_turban"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👳♂"
+ , "description": "man wearing turban"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_with_turban"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👳♀"
+ , "description": "woman wearing turban"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_with_turban"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👲"
+ , "description": "man with Chinese cap"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_with_gua_pi_mao"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧕"
+ , "description": "woman with headscarf"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_with_headscarf"
+ ]
+ , "tags": [
+ "hijab"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤵"
+ , "description": "man in tuxedo"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_in_tuxedo"
+ ]
+ , "tags": [
+ "groom"
+ , "marriage"
+ , "wedding"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👰"
+ , "description": "bride with veil"
+ , "category": "People & Body"
+ , "aliases": [
+ "bride_with_veil"
+ ]
+ , "tags": [
+ "marriage"
+ , "wedding"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤰"
+ , "description": "pregnant woman"
+ , "category": "People & Body"
+ , "aliases": [
+ "pregnant_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤱"
+ , "description": "breast-feeding"
+ , "category": "People & Body"
+ , "aliases": [
+ "breast_feeding"
+ ]
+ , "tags": [
+ "nursing"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👼"
+ , "description": "baby angel"
+ , "category": "People & Body"
+ , "aliases": [
+ "angel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🎅"
+ , "description": "Santa Claus"
+ , "category": "People & Body"
+ , "aliases": [
+ "santa"
+ ]
+ , "tags": [
+ "christmas"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤶"
+ , "description": "Mrs. Claus"
+ , "category": "People & Body"
+ , "aliases": [
+ "mrs_claus"
+ ]
+ , "tags": [
+ "santa"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🦸"
+ , "description": "superhero"
+ , "category": "People & Body"
+ , "aliases": [
+ "superhero"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🦸♂"
+ , "description": "man superhero"
+ , "category": "People & Body"
+ , "aliases": [
+ "superhero_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🦸♀"
+ , "description": "woman superhero"
+ , "category": "People & Body"
+ , "aliases": [
+ "superhero_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🦹"
+ , "description": "supervillain"
+ , "category": "People & Body"
+ , "aliases": [
+ "supervillain"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🦹♂"
+ , "description": "man supervillain"
+ , "category": "People & Body"
+ , "aliases": [
+ "supervillain_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🦹♀"
+ , "description": "woman supervillain"
+ , "category": "People & Body"
+ , "aliases": [
+ "supervillain_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧙"
+ , "description": "mage"
+ , "category": "People & Body"
+ , "aliases": [
+ "mage"
+ ]
+ , "tags": [
+ "wizard"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧙♂"
+ , "description": "man mage"
+ , "category": "People & Body"
+ , "aliases": [
+ "mage_man"
+ ]
+ , "tags": [
+ "wizard"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧙♀"
+ , "description": "woman mage"
+ , "category": "People & Body"
+ , "aliases": [
+ "mage_woman"
+ ]
+ , "tags": [
+ "wizard"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧚"
+ , "description": "fairy"
+ , "category": "People & Body"
+ , "aliases": [
+ "fairy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧚♂"
+ , "description": "man fairy"
+ , "category": "People & Body"
+ , "aliases": [
+ "fairy_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧚♀"
+ , "description": "woman fairy"
+ , "category": "People & Body"
+ , "aliases": [
+ "fairy_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧛"
+ , "description": "vampire"
+ , "category": "People & Body"
+ , "aliases": [
+ "vampire"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧛♂"
+ , "description": "man vampire"
+ , "category": "People & Body"
+ , "aliases": [
+ "vampire_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧛♀"
+ , "description": "woman vampire"
+ , "category": "People & Body"
+ , "aliases": [
+ "vampire_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧜"
+ , "description": "merperson"
+ , "category": "People & Body"
+ , "aliases": [
+ "merperson"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧜♂"
+ , "description": "merman"
+ , "category": "People & Body"
+ , "aliases": [
+ "merman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧜♀"
+ , "description": "mermaid"
+ , "category": "People & Body"
+ , "aliases": [
+ "mermaid"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧝"
+ , "description": "elf"
+ , "category": "People & Body"
+ , "aliases": [
+ "elf"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧝♂"
+ , "description": "man elf"
+ , "category": "People & Body"
+ , "aliases": [
+ "elf_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧝♀"
+ , "description": "woman elf"
+ , "category": "People & Body"
+ , "aliases": [
+ "elf_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧞"
+ , "description": "genie"
+ , "category": "People & Body"
+ , "aliases": [
+ "genie"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧞♂"
+ , "description": "man genie"
+ , "category": "People & Body"
+ , "aliases": [
+ "genie_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧞♀"
+ , "description": "woman genie"
+ , "category": "People & Body"
+ , "aliases": [
+ "genie_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧟"
+ , "description": "zombie"
+ , "category": "People & Body"
+ , "aliases": [
+ "zombie"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧟♂"
+ , "description": "man zombie"
+ , "category": "People & Body"
+ , "aliases": [
+ "zombie_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧟♀"
+ , "description": "woman zombie"
+ , "category": "People & Body"
+ , "aliases": [
+ "zombie_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "💆"
+ , "description": "person getting massage"
+ , "category": "People & Body"
+ , "aliases": [
+ "massage"
+ ]
+ , "tags": [
+ "spa"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💆♂"
+ , "description": "man getting massage"
+ , "category": "People & Body"
+ , "aliases": [
+ "massage_man"
+ ]
+ , "tags": [
+ "spa"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💆♀"
+ , "description": "woman getting massage"
+ , "category": "People & Body"
+ , "aliases": [
+ "massage_woman"
+ ]
+ , "tags": [
+ "spa"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💇"
+ , "description": "person getting haircut"
+ , "category": "People & Body"
+ , "aliases": [
+ "haircut"
+ ]
+ , "tags": [
+ "beauty"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💇♂"
+ , "description": "man getting haircut"
+ , "category": "People & Body"
+ , "aliases": [
+ "haircut_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💇♀"
+ , "description": "woman getting haircut"
+ , "category": "People & Body"
+ , "aliases": [
+ "haircut_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚶"
+ , "description": "person walking"
+ , "category": "People & Body"
+ , "aliases": [
+ "walking"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚶♂"
+ , "description": "man walking"
+ , "category": "People & Body"
+ , "aliases": [
+ "walking_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚶♀"
+ , "description": "woman walking"
+ , "category": "People & Body"
+ , "aliases": [
+ "walking_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧍"
+ , "description": "person standing"
+ , "category": "People & Body"
+ , "aliases": [
+ "standing_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧍♂"
+ , "description": "man standing"
+ , "category": "People & Body"
+ , "aliases": [
+ "standing_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧍♀"
+ , "description": "woman standing"
+ , "category": "People & Body"
+ , "aliases": [
+ "standing_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧎"
+ , "description": "person kneeling"
+ , "category": "People & Body"
+ , "aliases": [
+ "kneeling_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧎♂"
+ , "description": "man kneeling"
+ , "category": "People & Body"
+ , "aliases": [
+ "kneeling_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧎♀"
+ , "description": "woman kneeling"
+ , "category": "People & Body"
+ , "aliases": [
+ "kneeling_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🦯"
+ , "description": "man with probing cane"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_with_probing_cane"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🦯"
+ , "description": "woman with probing cane"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_with_probing_cane"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🦼"
+ , "description": "man in motorized wheelchair"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_in_motorized_wheelchair"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🦼"
+ , "description": "woman in motorized wheelchair"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_in_motorized_wheelchair"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👨🦽"
+ , "description": "man in manual wheelchair"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_in_manual_wheelchair"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👩🦽"
+ , "description": "woman in manual wheelchair"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_in_manual_wheelchair"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏃"
+ , "description": "person running"
+ , "category": "People & Body"
+ , "aliases": [
+ "runner"
+ , "running"
+ ]
+ , "tags": [
+ "exercise"
+ , "workout"
+ , "marathon"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏃♂"
+ , "description": "man running"
+ , "category": "People & Body"
+ , "aliases": [
+ "running_man"
+ ]
+ , "tags": [
+ "exercise"
+ , "workout"
+ , "marathon"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏃♀"
+ , "description": "woman running"
+ , "category": "People & Body"
+ , "aliases": [
+ "running_woman"
+ ]
+ , "tags": [
+ "exercise"
+ , "workout"
+ , "marathon"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💃"
+ , "description": "woman dancing"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_dancing"
+ , "dancer"
+ ]
+ , "tags": [
+ "dress"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🕺"
+ , "description": "man dancing"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_dancing"
+ ]
+ , "tags": [
+ "dancer"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🕴"
+ , "description": "man in suit levitating"
+ , "category": "People & Body"
+ , "aliases": [
+ "business_suit_levitating"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👯"
+ , "description": "people with bunny ears"
+ , "category": "People & Body"
+ , "aliases": [
+ "dancers"
+ ]
+ , "tags": [
+ "bunny"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👯♂"
+ , "description": "men with bunny ears"
+ , "category": "People & Body"
+ , "aliases": [
+ "dancing_men"
+ ]
+ , "tags": [
+ "bunny"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👯♀"
+ , "description": "women with bunny ears"
+ , "category": "People & Body"
+ , "aliases": [
+ "dancing_women"
+ ]
+ , "tags": [
+ "bunny"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧖"
+ , "description": "person in steamy room"
+ , "category": "People & Body"
+ , "aliases": [
+ "sauna_person"
+ ]
+ , "tags": [
+ "steamy"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧖♂"
+ , "description": "man in steamy room"
+ , "category": "People & Body"
+ , "aliases": [
+ "sauna_man"
+ ]
+ , "tags": [
+ "steamy"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧖♀"
+ , "description": "woman in steamy room"
+ , "category": "People & Body"
+ , "aliases": [
+ "sauna_woman"
+ ]
+ , "tags": [
+ "steamy"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧗"
+ , "description": "person climbing"
+ , "category": "People & Body"
+ , "aliases": [
+ "climbing"
+ ]
+ , "tags": [
+ "bouldering"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧗♂"
+ , "description": "man climbing"
+ , "category": "People & Body"
+ , "aliases": [
+ "climbing_man"
+ ]
+ , "tags": [
+ "bouldering"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧗♀"
+ , "description": "woman climbing"
+ , "category": "People & Body"
+ , "aliases": [
+ "climbing_woman"
+ ]
+ , "tags": [
+ "bouldering"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤺"
+ , "description": "person fencing"
+ , "category": "People & Body"
+ , "aliases": [
+ "person_fencing"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🏇"
+ , "description": "horse racing"
+ , "category": "People & Body"
+ , "aliases": [
+ "horse_racing"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "⛷"
+ , "description": "skier"
+ , "category": "People & Body"
+ , "aliases": [
+ "skier"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏂"
+ , "description": "snowboarder"
+ , "category": "People & Body"
+ , "aliases": [
+ "snowboarder"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏌"
+ , "description": "person golfing"
+ , "category": "People & Body"
+ , "aliases": [
+ "golfing"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏌️♂️"
+ , "description": "man golfing"
+ , "category": "People & Body"
+ , "aliases": [
+ "golfing_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏌️♀️"
+ , "description": "woman golfing"
+ , "category": "People & Body"
+ , "aliases": [
+ "golfing_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏄"
+ , "description": "person surfing"
+ , "category": "People & Body"
+ , "aliases": [
+ "surfer"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏄♂"
+ , "description": "man surfing"
+ , "category": "People & Body"
+ , "aliases": [
+ "surfing_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏄♀"
+ , "description": "woman surfing"
+ , "category": "People & Body"
+ , "aliases": [
+ "surfing_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚣"
+ , "description": "person rowing boat"
+ , "category": "People & Body"
+ , "aliases": [
+ "rowboat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚣♂"
+ , "description": "man rowing boat"
+ , "category": "People & Body"
+ , "aliases": [
+ "rowing_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚣♀"
+ , "description": "woman rowing boat"
+ , "category": "People & Body"
+ , "aliases": [
+ "rowing_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏊"
+ , "description": "person swimming"
+ , "category": "People & Body"
+ , "aliases": [
+ "swimmer"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏊♂"
+ , "description": "man swimming"
+ , "category": "People & Body"
+ , "aliases": [
+ "swimming_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏊♀"
+ , "description": "woman swimming"
+ , "category": "People & Body"
+ , "aliases": [
+ "swimming_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "⛹"
+ , "description": "person bouncing ball"
+ , "category": "People & Body"
+ , "aliases": [
+ "bouncing_ball_person"
+ ]
+ , "tags": [
+ "basketball"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "⛹️♂️"
+ , "description": "man bouncing ball"
+ , "category": "People & Body"
+ , "aliases": [
+ "bouncing_ball_man"
+ , "basketball_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "⛹️♀️"
+ , "description": "woman bouncing ball"
+ , "category": "People & Body"
+ , "aliases": [
+ "bouncing_ball_woman"
+ , "basketball_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏋"
+ , "description": "person lifting weights"
+ , "category": "People & Body"
+ , "aliases": [
+ "weight_lifting"
+ ]
+ , "tags": [
+ "gym"
+ , "workout"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏋️♂️"
+ , "description": "man lifting weights"
+ , "category": "People & Body"
+ , "aliases": [
+ "weight_lifting_man"
+ ]
+ , "tags": [
+ "gym"
+ , "workout"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🏋️♀️"
+ , "description": "woman lifting weights"
+ , "category": "People & Body"
+ , "aliases": [
+ "weight_lifting_woman"
+ ]
+ , "tags": [
+ "gym"
+ , "workout"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚴"
+ , "description": "person biking"
+ , "category": "People & Body"
+ , "aliases": [
+ "bicyclist"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚴♂"
+ , "description": "man biking"
+ , "category": "People & Body"
+ , "aliases": [
+ "biking_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚴♀"
+ , "description": "woman biking"
+ , "category": "People & Body"
+ , "aliases": [
+ "biking_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚵"
+ , "description": "person mountain biking"
+ , "category": "People & Body"
+ , "aliases": [
+ "mountain_bicyclist"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚵♂"
+ , "description": "man mountain biking"
+ , "category": "People & Body"
+ , "aliases": [
+ "mountain_biking_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🚵♀"
+ , "description": "woman mountain biking"
+ , "category": "People & Body"
+ , "aliases": [
+ "mountain_biking_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤸"
+ , "description": "person cartwheeling"
+ , "category": "People & Body"
+ , "aliases": [
+ "cartwheeling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤸♂"
+ , "description": "man cartwheeling"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_cartwheeling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤸♀"
+ , "description": "woman cartwheeling"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_cartwheeling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤼"
+ , "description": "people wrestling"
+ , "category": "People & Body"
+ , "aliases": [
+ "wrestling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🤼♂"
+ , "description": "men wrestling"
+ , "category": "People & Body"
+ , "aliases": [
+ "men_wrestling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🤼♀"
+ , "description": "women wrestling"
+ , "category": "People & Body"
+ , "aliases": [
+ "women_wrestling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🤽"
+ , "description": "person playing water polo"
+ , "category": "People & Body"
+ , "aliases": [
+ "water_polo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤽♂"
+ , "description": "man playing water polo"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_playing_water_polo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤽♀"
+ , "description": "woman playing water polo"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_playing_water_polo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤾"
+ , "description": "person playing handball"
+ , "category": "People & Body"
+ , "aliases": [
+ "handball_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤾♂"
+ , "description": "man playing handball"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_playing_handball"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤾♀"
+ , "description": "woman playing handball"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_playing_handball"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤹"
+ , "description": "person juggling"
+ , "category": "People & Body"
+ , "aliases": [
+ "juggling_person"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤹♂"
+ , "description": "man juggling"
+ , "category": "People & Body"
+ , "aliases": [
+ "man_juggling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🤹♀"
+ , "description": "woman juggling"
+ , "category": "People & Body"
+ , "aliases": [
+ "woman_juggling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧘"
+ , "description": "person in lotus position"
+ , "category": "People & Body"
+ , "aliases": [
+ "lotus_position"
+ ]
+ , "tags": [
+ "meditation"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧘♂"
+ , "description": "man in lotus position"
+ , "category": "People & Body"
+ , "aliases": [
+ "lotus_position_man"
+ ]
+ , "tags": [
+ "meditation"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧘♀"
+ , "description": "woman in lotus position"
+ , "category": "People & Body"
+ , "aliases": [
+ "lotus_position_woman"
+ ]
+ , "tags": [
+ "meditation"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🛀"
+ , "description": "person taking bath"
+ , "category": "People & Body"
+ , "aliases": [
+ "bath"
+ ]
+ , "tags": [
+ "shower"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🛌"
+ , "description": "person in bed"
+ , "category": "People & Body"
+ , "aliases": [
+ "sleeping_bed"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "🧑🤝🧑"
+ , "description": "people holding hands"
+ , "category": "People & Body"
+ , "aliases": [
+ "people_holding_hands"
+ ]
+ , "tags": [
+ "couple"
+ , "date"
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👭"
+ , "description": "women holding hands"
+ , "category": "People & Body"
+ , "aliases": [
+ "two_women_holding_hands"
+ ]
+ , "tags": [
+ "couple"
+ , "date"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👫"
+ , "description": "woman and man holding hands"
+ , "category": "People & Body"
+ , "aliases": [
+ "couple"
+ ]
+ , "tags": [
+ "date"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "👬"
+ , "description": "men holding hands"
+ , "category": "People & Body"
+ , "aliases": [
+ "two_men_holding_hands"
+ ]
+ , "tags": [
+ "couple"
+ , "date"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ , "skin_tones": true
+ }
+, {
+ "emoji": "💏"
+ , "description": "kiss"
+ , "category": "People & Body"
+ , "aliases": [
+ "couplekiss"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👩❤️💋👨"
+ , "description": "kiss: woman, man"
+ , "category": "People & Body"
+ , "aliases": [
+ "couplekiss_man_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "👨❤️💋👨"
+ , "description": "kiss: man, man"
+ , "category": "People & Body"
+ , "aliases": [
+ "couplekiss_man_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👩❤️💋👩"
+ , "description": "kiss: woman, woman"
+ , "category": "People & Body"
+ , "aliases": [
+ "couplekiss_woman_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "💑"
+ , "description": "couple with heart"
+ , "category": "People & Body"
+ , "aliases": [
+ "couple_with_heart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👩❤️👨"
+ , "description": "couple with heart: woman, man"
+ , "category": "People & Body"
+ , "aliases": [
+ "couple_with_heart_woman_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "👨❤️👨"
+ , "description": "couple with heart: man, man"
+ , "category": "People & Body"
+ , "aliases": [
+ "couple_with_heart_man_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👩❤️👩"
+ , "description": "couple with heart: woman, woman"
+ , "category": "People & Body"
+ , "aliases": [
+ "couple_with_heart_woman_woman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👪"
+ , "description": "family"
+ , "category": "People & Body"
+ , "aliases": [
+ "family"
+ ]
+ , "tags": [
+ "home"
+ , "parents"
+ , "child"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👨👩👦"
+ , "description": "family: man, woman, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_woman_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "👨👩👧"
+ , "description": "family: man, woman, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_woman_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👨👩👧👦"
+ , "description": "family: man, woman, girl, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_woman_girl_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👨👩👦👦"
+ , "description": "family: man, woman, boy, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_woman_boy_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👨👩👧👧"
+ , "description": "family: man, woman, girl, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_woman_girl_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👨👨👦"
+ , "description": "family: man, man, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_man_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👨👨👧"
+ , "description": "family: man, man, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_man_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👨👨👧👦"
+ , "description": "family: man, man, girl, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_man_girl_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👨👨👦👦"
+ , "description": "family: man, man, boy, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_man_boy_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👨👨👧👧"
+ , "description": "family: man, man, girl, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_man_girl_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👩👩👦"
+ , "description": "family: woman, woman, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_woman_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👩👩👧"
+ , "description": "family: woman, woman, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_woman_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👩👩👧👦"
+ , "description": "family: woman, woman, girl, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_woman_girl_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👩👩👦👦"
+ , "description": "family: woman, woman, boy, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_woman_boy_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👩👩👧👧"
+ , "description": "family: woman, woman, girl, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_woman_girl_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "👨👦"
+ , "description": "family: man, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👨👦👦"
+ , "description": "family: man, boy, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_boy_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👨👧"
+ , "description": "family: man, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👨👧👦"
+ , "description": "family: man, girl, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_girl_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👨👧👧"
+ , "description": "family: man, girl, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_man_girl_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👩👦"
+ , "description": "family: woman, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👩👦👦"
+ , "description": "family: woman, boy, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_boy_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👩👧"
+ , "description": "family: woman, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👩👧👦"
+ , "description": "family: woman, girl, boy"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_girl_boy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "👩👧👧"
+ , "description": "family: woman, girl, girl"
+ , "category": "People & Body"
+ , "aliases": [
+ "family_woman_girl_girl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "🗣"
+ , "description": "speaking head"
+ , "category": "People & Body"
+ , "aliases": [
+ "speaking_head"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "👤"
+ , "description": "bust in silhouette"
+ , "category": "People & Body"
+ , "aliases": [
+ "bust_in_silhouette"
+ ]
+ , "tags": [
+ "user"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👥"
+ , "description": "busts in silhouette"
+ , "category": "People & Body"
+ , "aliases": [
+ "busts_in_silhouette"
+ ]
+ , "tags": [
+ "users"
+ , "group"
+ , "team"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👣"
+ , "description": "footprints"
+ , "category": "People & Body"
+ , "aliases": [
+ "footprints"
+ ]
+ , "tags": [
+ "feet"
+ , "tracks"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐵"
+ , "description": "monkey face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "monkey_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐒"
+ , "description": "monkey"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "monkey"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦍"
+ , "description": "gorilla"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "gorilla"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🦧"
+ , "description": "orangutan"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "orangutan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🐶"
+ , "description": "dog face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "dog"
+ ]
+ , "tags": [
+ "pet"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐕"
+ , "description": "dog"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "dog2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦮"
+ , "description": "guide dog"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "guide_dog"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🐕🦺"
+ , "description": "service dog"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "service_dog"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🐩"
+ , "description": "poodle"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "poodle"
+ ]
+ , "tags": [
+ "dog"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐺"
+ , "description": "wolf"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "wolf"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦊"
+ , "description": "fox"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "fox_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🦝"
+ , "description": "raccoon"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "raccoon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🐱"
+ , "description": "cat face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "cat"
+ ]
+ , "tags": [
+ "pet"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐈"
+ , "description": "cat"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "cat2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦁"
+ , "description": "lion"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "lion"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🐯"
+ , "description": "tiger face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "tiger"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐅"
+ , "description": "tiger"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "tiger2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐆"
+ , "description": "leopard"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "leopard"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐴"
+ , "description": "horse face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "horse"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐎"
+ , "description": "horse"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "racehorse"
+ ]
+ , "tags": [
+ "speed"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦄"
+ , "description": "unicorn"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "unicorn"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🦓"
+ , "description": "zebra"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "zebra"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦌"
+ , "description": "deer"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "deer"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🐮"
+ , "description": "cow face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "cow"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐂"
+ , "description": "ox"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "ox"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐃"
+ , "description": "water buffalo"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "water_buffalo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐄"
+ , "description": "cow"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "cow2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐷"
+ , "description": "pig face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "pig"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐖"
+ , "description": "pig"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "pig2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐗"
+ , "description": "boar"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "boar"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐽"
+ , "description": "pig nose"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "pig_nose"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐏"
+ , "description": "ram"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "ram"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐑"
+ , "description": "ewe"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "sheep"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐐"
+ , "description": "goat"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "goat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐪"
+ , "description": "camel"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "dromedary_camel"
+ ]
+ , "tags": [
+ "desert"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐫"
+ , "description": "two-hump camel"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "camel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦙"
+ , "description": "llama"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "llama"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦒"
+ , "description": "giraffe"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "giraffe"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🐘"
+ , "description": "elephant"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "elephant"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦏"
+ , "description": "rhinoceros"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "rhinoceros"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🦛"
+ , "description": "hippopotamus"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "hippopotamus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🐭"
+ , "description": "mouse face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "mouse"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐁"
+ , "description": "mouse"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "mouse2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐀"
+ , "description": "rat"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "rat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐹"
+ , "description": "hamster"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "hamster"
+ ]
+ , "tags": [
+ "pet"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐰"
+ , "description": "rabbit face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "rabbit"
+ ]
+ , "tags": [
+ "bunny"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐇"
+ , "description": "rabbit"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "rabbit2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐿"
+ , "description": "chipmunk"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "chipmunk"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🦔"
+ , "description": "hedgehog"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "hedgehog"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦇"
+ , "description": "bat"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "bat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🐻"
+ , "description": "bear"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "bear"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐨"
+ , "description": "koala"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "koala"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐼"
+ , "description": "panda"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "panda_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦥"
+ , "description": "sloth"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "sloth"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🦦"
+ , "description": "otter"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "otter"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🦨"
+ , "description": "skunk"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "skunk"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🦘"
+ , "description": "kangaroo"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "kangaroo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦡"
+ , "description": "badger"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "badger"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🐾"
+ , "description": "paw prints"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "feet"
+ , "paw_prints"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦃"
+ , "description": "turkey"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "turkey"
+ ]
+ , "tags": [
+ "thanksgiving"
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🐔"
+ , "description": "chicken"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "chicken"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐓"
+ , "description": "rooster"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "rooster"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐣"
+ , "description": "hatching chick"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "hatching_chick"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐤"
+ , "description": "baby chick"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "baby_chick"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐥"
+ , "description": "front-facing baby chick"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "hatched_chick"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐦"
+ , "description": "bird"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "bird"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐧"
+ , "description": "penguin"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "penguin"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕊"
+ , "description": "dove"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "dove"
+ ]
+ , "tags": [
+ "peace"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🦅"
+ , "description": "eagle"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "eagle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🦆"
+ , "description": "duck"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "duck"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🦢"
+ , "description": "swan"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "swan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦉"
+ , "description": "owl"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "owl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🦩"
+ , "description": "flamingo"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "flamingo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🦚"
+ , "description": "peacock"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "peacock"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦜"
+ , "description": "parrot"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "parrot"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🐸"
+ , "description": "frog"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "frog"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐊"
+ , "description": "crocodile"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "crocodile"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐢"
+ , "description": "turtle"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "turtle"
+ ]
+ , "tags": [
+ "slow"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦎"
+ , "description": "lizard"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "lizard"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🐍"
+ , "description": "snake"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "snake"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐲"
+ , "description": "dragon face"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "dragon_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐉"
+ , "description": "dragon"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "dragon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦕"
+ , "description": "sauropod"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "sauropod"
+ ]
+ , "tags": [
+ "dinosaur"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦖"
+ , "description": "T-Rex"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "t-rex"
+ ]
+ , "tags": [
+ "dinosaur"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🐳"
+ , "description": "spouting whale"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "whale"
+ ]
+ , "tags": [
+ "sea"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐋"
+ , "description": "whale"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "whale2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐬"
+ , "description": "dolphin"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "dolphin"
+ , "flipper"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐟"
+ , "description": "fish"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "fish"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐠"
+ , "description": "tropical fish"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "tropical_fish"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐡"
+ , "description": "blowfish"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "blowfish"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦈"
+ , "description": "shark"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "shark"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🐙"
+ , "description": "octopus"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "octopus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐚"
+ , "description": "spiral shell"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "shell"
+ ]
+ , "tags": [
+ "sea"
+ , "beach"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐌"
+ , "description": "snail"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "snail"
+ ]
+ , "tags": [
+ "slow"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦋"
+ , "description": "butterfly"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "butterfly"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🐛"
+ , "description": "bug"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "bug"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐜"
+ , "description": "ant"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "ant"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐝"
+ , "description": "honeybee"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "bee"
+ , "honeybee"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🐞"
+ , "description": "lady beetle"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "beetle"
+ ]
+ , "tags": [
+ "bug"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🦗"
+ , "description": "cricket"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "cricket"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🕷"
+ , "description": "spider"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "spider"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🕸"
+ , "description": "spider web"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "spider_web"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🦂"
+ , "description": "scorpion"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "scorpion"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🦟"
+ , "description": "mosquito"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "mosquito"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦠"
+ , "description": "microbe"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "microbe"
+ ]
+ , "tags": [
+ "germ"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "💐"
+ , "description": "bouquet"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "bouquet"
+ ]
+ , "tags": [
+ "flowers"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌸"
+ , "description": "cherry blossom"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "cherry_blossom"
+ ]
+ , "tags": [
+ "flower"
+ , "spring"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💮"
+ , "description": "white flower"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "white_flower"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏵"
+ , "description": "rosette"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "rosette"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌹"
+ , "description": "rose"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "rose"
+ ]
+ , "tags": [
+ "flower"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥀"
+ , "description": "wilted flower"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "wilted_flower"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🌺"
+ , "description": "hibiscus"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "hibiscus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌻"
+ , "description": "sunflower"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "sunflower"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌼"
+ , "description": "blossom"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "blossom"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌷"
+ , "description": "tulip"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "tulip"
+ ]
+ , "tags": [
+ "flower"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌱"
+ , "description": "seedling"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "seedling"
+ ]
+ , "tags": [
+ "plant"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌲"
+ , "description": "evergreen tree"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "evergreen_tree"
+ ]
+ , "tags": [
+ "wood"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌳"
+ , "description": "deciduous tree"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "deciduous_tree"
+ ]
+ , "tags": [
+ "wood"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌴"
+ , "description": "palm tree"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "palm_tree"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌵"
+ , "description": "cactus"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "cactus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌾"
+ , "description": "sheaf of rice"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "ear_of_rice"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌿"
+ , "description": "herb"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "herb"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☘"
+ , "description": "shamrock"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "shamrock"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🍀"
+ , "description": "four leaf clover"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "four_leaf_clover"
+ ]
+ , "tags": [
+ "luck"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍁"
+ , "description": "maple leaf"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "maple_leaf"
+ ]
+ , "tags": [
+ "canada"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍂"
+ , "description": "fallen leaf"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "fallen_leaf"
+ ]
+ , "tags": [
+ "autumn"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍃"
+ , "description": "leaf fluttering in wind"
+ , "category": "Animals & Nature"
+ , "aliases": [
+ "leaves"
+ ]
+ , "tags": [
+ "leaf"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍇"
+ , "description": "grapes"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "grapes"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍈"
+ , "description": "melon"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "melon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍉"
+ , "description": "watermelon"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "watermelon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍊"
+ , "description": "tangerine"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "tangerine"
+ , "orange"
+ , "mandarin"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍋"
+ , "description": "lemon"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "lemon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍌"
+ , "description": "banana"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "banana"
+ ]
+ , "tags": [
+ "fruit"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍍"
+ , "description": "pineapple"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "pineapple"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥭"
+ , "description": "mango"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "mango"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🍎"
+ , "description": "red apple"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "apple"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍏"
+ , "description": "green apple"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "green_apple"
+ ]
+ , "tags": [
+ "fruit"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍐"
+ , "description": "pear"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "pear"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍑"
+ , "description": "peach"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "peach"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍒"
+ , "description": "cherries"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "cherries"
+ ]
+ , "tags": [
+ "fruit"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍓"
+ , "description": "strawberry"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "strawberry"
+ ]
+ , "tags": [
+ "fruit"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥝"
+ , "description": "kiwi fruit"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "kiwi_fruit"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🍅"
+ , "description": "tomato"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "tomato"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥥"
+ , "description": "coconut"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "coconut"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥑"
+ , "description": "avocado"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "avocado"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🍆"
+ , "description": "eggplant"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "eggplant"
+ ]
+ , "tags": [
+ "aubergine"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥔"
+ , "description": "potato"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "potato"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥕"
+ , "description": "carrot"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "carrot"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🌽"
+ , "description": "ear of corn"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "corn"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌶"
+ , "description": "hot pepper"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "hot_pepper"
+ ]
+ , "tags": [
+ "spicy"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🥒"
+ , "description": "cucumber"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "cucumber"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥬"
+ , "description": "leafy green"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "leafy_green"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥦"
+ , "description": "broccoli"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "broccoli"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧄"
+ , "description": "garlic"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "garlic"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🧅"
+ , "description": "onion"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "onion"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🍄"
+ , "description": "mushroom"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "mushroom"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥜"
+ , "description": "peanuts"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "peanuts"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🌰"
+ , "description": "chestnut"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "chestnut"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍞"
+ , "description": "bread"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "bread"
+ ]
+ , "tags": [
+ "toast"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥐"
+ , "description": "croissant"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "croissant"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥖"
+ , "description": "baguette bread"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "baguette_bread"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥨"
+ , "description": "pretzel"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "pretzel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥯"
+ , "description": "bagel"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "bagel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥞"
+ , "description": "pancakes"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "pancakes"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🧇"
+ , "description": "waffle"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "waffle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🧀"
+ , "description": "cheese wedge"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "cheese"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🍖"
+ , "description": "meat on bone"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "meat_on_bone"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍗"
+ , "description": "poultry leg"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "poultry_leg"
+ ]
+ , "tags": [
+ "meat"
+ , "chicken"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥩"
+ , "description": "cut of meat"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "cut_of_meat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥓"
+ , "description": "bacon"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "bacon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🍔"
+ , "description": "hamburger"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "hamburger"
+ ]
+ , "tags": [
+ "burger"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍟"
+ , "description": "french fries"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "fries"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍕"
+ , "description": "pizza"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "pizza"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌭"
+ , "description": "hot dog"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "hotdog"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🥪"
+ , "description": "sandwich"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "sandwich"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🌮"
+ , "description": "taco"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "taco"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌯"
+ , "description": "burrito"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "burrito"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🥙"
+ , "description": "stuffed flatbread"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "stuffed_flatbread"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🧆"
+ , "description": "falafel"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "falafel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🥚"
+ , "description": "egg"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "egg"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🍳"
+ , "description": "cooking"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "fried_egg"
+ ]
+ , "tags": [
+ "breakfast"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥘"
+ , "description": "shallow pan of food"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "shallow_pan_of_food"
+ ]
+ , "tags": [
+ "paella"
+ , "curry"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🍲"
+ , "description": "pot of food"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "stew"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥣"
+ , "description": "bowl with spoon"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "bowl_with_spoon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥗"
+ , "description": "green salad"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "green_salad"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🍿"
+ , "description": "popcorn"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "popcorn"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🧈"
+ , "description": "butter"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "butter"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🧂"
+ , "description": "salt"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "salt"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥫"
+ , "description": "canned food"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "canned_food"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🍱"
+ , "description": "bento box"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "bento"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍘"
+ , "description": "rice cracker"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "rice_cracker"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍙"
+ , "description": "rice ball"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "rice_ball"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍚"
+ , "description": "cooked rice"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "rice"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍛"
+ , "description": "curry rice"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "curry"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍜"
+ , "description": "steaming bowl"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "ramen"
+ ]
+ , "tags": [
+ "noodle"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍝"
+ , "description": "spaghetti"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "spaghetti"
+ ]
+ , "tags": [
+ "pasta"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍠"
+ , "description": "roasted sweet potato"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "sweet_potato"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍢"
+ , "description": "oden"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "oden"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍣"
+ , "description": "sushi"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "sushi"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍤"
+ , "description": "fried shrimp"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "fried_shrimp"
+ ]
+ , "tags": [
+ "tempura"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍥"
+ , "description": "fish cake with swirl"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "fish_cake"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥮"
+ , "description": "moon cake"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "moon_cake"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🍡"
+ , "description": "dango"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "dango"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥟"
+ , "description": "dumpling"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "dumpling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥠"
+ , "description": "fortune cookie"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "fortune_cookie"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥡"
+ , "description": "takeout box"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "takeout_box"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦀"
+ , "description": "crab"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "crab"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🦞"
+ , "description": "lobster"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "lobster"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦐"
+ , "description": "shrimp"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "shrimp"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🦑"
+ , "description": "squid"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "squid"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🦪"
+ , "description": "oyster"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "oyster"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🍦"
+ , "description": "soft ice cream"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "icecream"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍧"
+ , "description": "shaved ice"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "shaved_ice"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍨"
+ , "description": "ice cream"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "ice_cream"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍩"
+ , "description": "doughnut"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "doughnut"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍪"
+ , "description": "cookie"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "cookie"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎂"
+ , "description": "birthday cake"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "birthday"
+ ]
+ , "tags": [
+ "party"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍰"
+ , "description": "shortcake"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "cake"
+ ]
+ , "tags": [
+ "dessert"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧁"
+ , "description": "cupcake"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "cupcake"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥧"
+ , "description": "pie"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "pie"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🍫"
+ , "description": "chocolate bar"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "chocolate_bar"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍬"
+ , "description": "candy"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "candy"
+ ]
+ , "tags": [
+ "sweet"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍭"
+ , "description": "lollipop"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "lollipop"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍮"
+ , "description": "custard"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "custard"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍯"
+ , "description": "honey pot"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "honey_pot"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍼"
+ , "description": "baby bottle"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "baby_bottle"
+ ]
+ , "tags": [
+ "milk"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥛"
+ , "description": "glass of milk"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "milk_glass"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "☕"
+ , "description": "hot beverage"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "coffee"
+ ]
+ , "tags": [
+ "cafe"
+ , "espresso"
+ ]
+ , "unicode_version": "4.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍵"
+ , "description": "teacup without handle"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "tea"
+ ]
+ , "tags": [
+ "green"
+ , "breakfast"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍶"
+ , "description": "sake"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "sake"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍾"
+ , "description": "bottle with popping cork"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "champagne"
+ ]
+ , "tags": [
+ "bottle"
+ , "bubbly"
+ , "celebration"
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🍷"
+ , "description": "wine glass"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "wine_glass"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍸"
+ , "description": "cocktail glass"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "cocktail"
+ ]
+ , "tags": [
+ "drink"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍹"
+ , "description": "tropical drink"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "tropical_drink"
+ ]
+ , "tags": [
+ "summer"
+ , "vacation"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍺"
+ , "description": "beer mug"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "beer"
+ ]
+ , "tags": [
+ "drink"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🍻"
+ , "description": "clinking beer mugs"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "beers"
+ ]
+ , "tags": [
+ "drinks"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥂"
+ , "description": "clinking glasses"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "clinking_glasses"
+ ]
+ , "tags": [
+ "cheers"
+ , "toast"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥃"
+ , "description": "tumbler glass"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "tumbler_glass"
+ ]
+ , "tags": [
+ "whisky"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥤"
+ , "description": "cup with straw"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "cup_with_straw"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧃"
+ , "description": "beverage box"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "beverage_box"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🧉"
+ , "description": "mate"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "mate"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🧊"
+ , "description": "ice cube"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "ice_cube"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🥢"
+ , "description": "chopsticks"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "chopsticks"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🍽"
+ , "description": "fork and knife with plate"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "plate_with_cutlery"
+ ]
+ , "tags": [
+ "dining"
+ , "dinner"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🍴"
+ , "description": "fork and knife"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "fork_and_knife"
+ ]
+ , "tags": [
+ "cutlery"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥄"
+ , "description": "spoon"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "spoon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🔪"
+ , "description": "kitchen knife"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "hocho"
+ , "knife"
+ ]
+ , "tags": [
+ "cut"
+ , "chop"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏺"
+ , "description": "amphora"
+ , "category": "Food & Drink"
+ , "aliases": [
+ "amphora"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌍"
+ , "description": "globe showing Europe-Africa"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "earth_africa"
+ ]
+ , "tags": [
+ "globe"
+ , "world"
+ , "international"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌎"
+ , "description": "globe showing Americas"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "earth_americas"
+ ]
+ , "tags": [
+ "globe"
+ , "world"
+ , "international"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌏"
+ , "description": "globe showing Asia-Australia"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "earth_asia"
+ ]
+ , "tags": [
+ "globe"
+ , "world"
+ , "international"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌐"
+ , "description": "globe with meridians"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "globe_with_meridians"
+ ]
+ , "tags": [
+ "world"
+ , "global"
+ , "international"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗺"
+ , "description": "world map"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "world_map"
+ ]
+ , "tags": [
+ "travel"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🗾"
+ , "description": "map of Japan"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "japan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧭"
+ , "description": "compass"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "compass"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🏔"
+ , "description": "snow-capped mountain"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "mountain_snow"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⛰"
+ , "description": "mountain"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "mountain"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌋"
+ , "description": "volcano"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "volcano"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗻"
+ , "description": "mount fuji"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "mount_fuji"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏕"
+ , "description": "camping"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "camping"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏖"
+ , "description": "beach with umbrella"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "beach_umbrella"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏜"
+ , "description": "desert"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "desert"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏝"
+ , "description": "desert island"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "desert_island"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏞"
+ , "description": "national park"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "national_park"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏟"
+ , "description": "stadium"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "stadium"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏛"
+ , "description": "classical building"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "classical_building"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏗"
+ , "description": "building construction"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "building_construction"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🧱"
+ , "description": "brick"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "bricks"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🏘"
+ , "description": "houses"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "houses"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏚"
+ , "description": "derelict house"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "derelict_house"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏠"
+ , "description": "house"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "house"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏡"
+ , "description": "house with garden"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "house_with_garden"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏢"
+ , "description": "office building"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "office"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏣"
+ , "description": "Japanese post office"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "post_office"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏤"
+ , "description": "post office"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "european_post_office"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏥"
+ , "description": "hospital"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "hospital"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏦"
+ , "description": "bank"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "bank"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏨"
+ , "description": "hotel"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "hotel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏩"
+ , "description": "love hotel"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "love_hotel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏪"
+ , "description": "convenience store"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "convenience_store"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏫"
+ , "description": "school"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "school"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏬"
+ , "description": "department store"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "department_store"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏭"
+ , "description": "factory"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "factory"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏯"
+ , "description": "Japanese castle"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "japanese_castle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏰"
+ , "description": "castle"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "european_castle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💒"
+ , "description": "wedding"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "wedding"
+ ]
+ , "tags": [
+ "marriage"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗼"
+ , "description": "Tokyo tower"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "tokyo_tower"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗽"
+ , "description": "Statue of Liberty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "statue_of_liberty"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛪"
+ , "description": "church"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "church"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕌"
+ , "description": "mosque"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "mosque"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛕"
+ , "description": "hindu temple"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "hindu_temple"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🕍"
+ , "description": "synagogue"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "synagogue"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⛩"
+ , "description": "shinto shrine"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "shinto_shrine"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🕋"
+ , "description": "kaaba"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "kaaba"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⛲"
+ , "description": "fountain"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "fountain"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛺"
+ , "description": "tent"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "tent"
+ ]
+ , "tags": [
+ "camping"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌁"
+ , "description": "foggy"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "foggy"
+ ]
+ , "tags": [
+ "karl"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌃"
+ , "description": "night with stars"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "night_with_stars"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏙"
+ , "description": "cityscape"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "cityscape"
+ ]
+ , "tags": [
+ "skyline"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌄"
+ , "description": "sunrise over mountains"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "sunrise_over_mountains"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌅"
+ , "description": "sunrise"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "sunrise"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌆"
+ , "description": "cityscape at dusk"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "city_sunset"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌇"
+ , "description": "sunset"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "city_sunrise"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌉"
+ , "description": "bridge at night"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "bridge_at_night"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♨️"
+ , "description": "hot springs"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "hotsprings"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎠"
+ , "description": "carousel horse"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "carousel_horse"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎡"
+ , "description": "ferris wheel"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "ferris_wheel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎢"
+ , "description": "roller coaster"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "roller_coaster"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💈"
+ , "description": "barber pole"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "barber"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎪"
+ , "description": "circus tent"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "circus_tent"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚂"
+ , "description": "locomotive"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "steam_locomotive"
+ ]
+ , "tags": [
+ "train"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚃"
+ , "description": "railway car"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "railway_car"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚄"
+ , "description": "high-speed train"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "bullettrain_side"
+ ]
+ , "tags": [
+ "train"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚅"
+ , "description": "bullet train"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "bullettrain_front"
+ ]
+ , "tags": [
+ "train"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚆"
+ , "description": "train"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "train2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚇"
+ , "description": "metro"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "metro"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚈"
+ , "description": "light rail"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "light_rail"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚉"
+ , "description": "station"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "station"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚊"
+ , "description": "tram"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "tram"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚝"
+ , "description": "monorail"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "monorail"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚞"
+ , "description": "mountain railway"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "mountain_railway"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚋"
+ , "description": "tram car"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "train"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚌"
+ , "description": "bus"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "bus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚍"
+ , "description": "oncoming bus"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "oncoming_bus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚎"
+ , "description": "trolleybus"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "trolleybus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚐"
+ , "description": "minibus"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "minibus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚑"
+ , "description": "ambulance"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "ambulance"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚒"
+ , "description": "fire engine"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "fire_engine"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚓"
+ , "description": "police car"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "police_car"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚔"
+ , "description": "oncoming police car"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "oncoming_police_car"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚕"
+ , "description": "taxi"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "taxi"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚖"
+ , "description": "oncoming taxi"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "oncoming_taxi"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚗"
+ , "description": "automobile"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "car"
+ , "red_car"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚘"
+ , "description": "oncoming automobile"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "oncoming_automobile"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚙"
+ , "description": "sport utility vehicle"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "blue_car"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚚"
+ , "description": "delivery truck"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "truck"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚛"
+ , "description": "articulated lorry"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "articulated_lorry"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚜"
+ , "description": "tractor"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "tractor"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏎"
+ , "description": "racing car"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "racing_car"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏍"
+ , "description": "motorcycle"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "motorcycle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛵"
+ , "description": "motor scooter"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "motor_scooter"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🦽"
+ , "description": "manual wheelchair"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "manual_wheelchair"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🦼"
+ , "description": "motorized wheelchair"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "motorized_wheelchair"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🛺"
+ , "description": "auto rickshaw"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "auto_rickshaw"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🚲"
+ , "description": "bicycle"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "bike"
+ ]
+ , "tags": [
+ "bicycle"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛴"
+ , "description": "kick scooter"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "kick_scooter"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🛹"
+ , "description": "skateboard"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "skateboard"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🚏"
+ , "description": "bus stop"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "busstop"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛣"
+ , "description": "motorway"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "motorway"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛤"
+ , "description": "railway track"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "railway_track"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛢"
+ , "description": "oil drum"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "oil_drum"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⛽"
+ , "description": "fuel pump"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "fuelpump"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚨"
+ , "description": "police car light"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "rotating_light"
+ ]
+ , "tags": [
+ "911"
+ , "emergency"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚥"
+ , "description": "horizontal traffic light"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "traffic_light"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚦"
+ , "description": "vertical traffic light"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "vertical_traffic_light"
+ ]
+ , "tags": [
+ "semaphore"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛑"
+ , "description": "stop sign"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "stop_sign"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🚧"
+ , "description": "construction"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "construction"
+ ]
+ , "tags": [
+ "wip"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⚓"
+ , "description": "anchor"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "anchor"
+ ]
+ , "tags": [
+ "ship"
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛵"
+ , "description": "sailboat"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "boat"
+ , "sailboat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛶"
+ , "description": "canoe"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "canoe"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🚤"
+ , "description": "speedboat"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "speedboat"
+ ]
+ , "tags": [
+ "ship"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛳"
+ , "description": "passenger ship"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "passenger_ship"
+ ]
+ , "tags": [
+ "cruise"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⛴"
+ , "description": "ferry"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "ferry"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛥"
+ , "description": "motor boat"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "motor_boat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🚢"
+ , "description": "ship"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "ship"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "✈️"
+ , "description": "airplane"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "airplane"
+ ]
+ , "tags": [
+ "flight"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛩"
+ , "description": "small airplane"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "small_airplane"
+ ]
+ , "tags": [
+ "flight"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛫"
+ , "description": "airplane departure"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "flight_departure"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛬"
+ , "description": "airplane arrival"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "flight_arrival"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🪂"
+ , "description": "parachute"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "parachute"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "💺"
+ , "description": "seat"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "seat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚁"
+ , "description": "helicopter"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "helicopter"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚟"
+ , "description": "suspension railway"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "suspension_railway"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚠"
+ , "description": "mountain cableway"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "mountain_cableway"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚡"
+ , "description": "aerial tramway"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "aerial_tramway"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛰"
+ , "description": "satellite"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "artificial_satellite"
+ ]
+ , "tags": [
+ "orbit"
+ , "space"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🚀"
+ , "description": "rocket"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "rocket"
+ ]
+ , "tags": [
+ "ship"
+ , "launch"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛸"
+ , "description": "flying saucer"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "flying_saucer"
+ ]
+ , "tags": [
+ "ufo"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🛎"
+ , "description": "bellhop bell"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "bellhop_bell"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🧳"
+ , "description": "luggage"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "luggage"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "⌛"
+ , "description": "hourglass done"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "hourglass"
+ ]
+ , "tags": [
+ "time"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏳"
+ , "description": "hourglass not done"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "hourglass_flowing_sand"
+ ]
+ , "tags": [
+ "time"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⌚"
+ , "description": "watch"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "watch"
+ ]
+ , "tags": [
+ "time"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏰"
+ , "description": "alarm clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "alarm_clock"
+ ]
+ , "tags": [
+ "morning"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏱"
+ , "description": "stopwatch"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "stopwatch"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⏲"
+ , "description": "timer clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "timer_clock"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🕰"
+ , "description": "mantelpiece clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "mantelpiece_clock"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🕛"
+ , "description": "twelve o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock12"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕧"
+ , "description": "twelve-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock1230"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕐"
+ , "description": "one o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock1"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕜"
+ , "description": "one-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock130"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕑"
+ , "description": "two o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕝"
+ , "description": "two-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock230"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕒"
+ , "description": "three o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock3"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕞"
+ , "description": "three-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock330"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕓"
+ , "description": "four o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock4"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕟"
+ , "description": "four-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock430"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕔"
+ , "description": "five o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock5"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕠"
+ , "description": "five-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock530"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕕"
+ , "description": "six o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock6"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕡"
+ , "description": "six-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock630"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕖"
+ , "description": "seven o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock7"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕢"
+ , "description": "seven-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock730"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕗"
+ , "description": "eight o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock8"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕣"
+ , "description": "eight-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock830"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕘"
+ , "description": "nine o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock9"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕤"
+ , "description": "nine-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock930"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕙"
+ , "description": "ten o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock10"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕥"
+ , "description": "ten-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock1030"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕚"
+ , "description": "eleven o’clock"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock11"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕦"
+ , "description": "eleven-thirty"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "clock1130"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌑"
+ , "description": "new moon"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "new_moon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌒"
+ , "description": "waxing crescent moon"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "waxing_crescent_moon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌓"
+ , "description": "first quarter moon"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "first_quarter_moon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌔"
+ , "description": "waxing gibbous moon"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "moon"
+ , "waxing_gibbous_moon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌕"
+ , "description": "full moon"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "full_moon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌖"
+ , "description": "waning gibbous moon"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "waning_gibbous_moon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌗"
+ , "description": "last quarter moon"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "last_quarter_moon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌘"
+ , "description": "waning crescent moon"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "waning_crescent_moon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌙"
+ , "description": "crescent moon"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "crescent_moon"
+ ]
+ , "tags": [
+ "night"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌚"
+ , "description": "new moon face"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "new_moon_with_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌛"
+ , "description": "first quarter moon face"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "first_quarter_moon_with_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌜"
+ , "description": "last quarter moon face"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "last_quarter_moon_with_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌡"
+ , "description": "thermometer"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "thermometer"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "☀️"
+ , "description": "sun"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "sunny"
+ ]
+ , "tags": [
+ "weather"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌝"
+ , "description": "full moon face"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "full_moon_with_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌞"
+ , "description": "sun with face"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "sun_with_face"
+ ]
+ , "tags": [
+ "summer"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🪐"
+ , "description": "ringed planet"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "ringed_planet"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "⭐"
+ , "description": "star"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "star"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌟"
+ , "description": "glowing star"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "star2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌠"
+ , "description": "shooting star"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "stars"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌌"
+ , "description": "milky way"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "milky_way"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☁️"
+ , "description": "cloud"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "cloud"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛅"
+ , "description": "sun behind cloud"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "partly_sunny"
+ ]
+ , "tags": [
+ "weather"
+ , "cloud"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛈"
+ , "description": "cloud with lightning and rain"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "cloud_with_lightning_and_rain"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌤"
+ , "description": "sun behind small cloud"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "sun_behind_small_cloud"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌥"
+ , "description": "sun behind large cloud"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "sun_behind_large_cloud"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌦"
+ , "description": "sun behind rain cloud"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "sun_behind_rain_cloud"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌧"
+ , "description": "cloud with rain"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "cloud_with_rain"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌨"
+ , "description": "cloud with snow"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "cloud_with_snow"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌩"
+ , "description": "cloud with lightning"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "cloud_with_lightning"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌪"
+ , "description": "tornado"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "tornado"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌫"
+ , "description": "fog"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "fog"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌬"
+ , "description": "wind face"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "wind_face"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🌀"
+ , "description": "cyclone"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "cyclone"
+ ]
+ , "tags": [
+ "swirl"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌈"
+ , "description": "rainbow"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "rainbow"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌂"
+ , "description": "closed umbrella"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "closed_umbrella"
+ ]
+ , "tags": [
+ "weather"
+ , "rain"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☂️"
+ , "description": "umbrella"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "open_umbrella"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "☔"
+ , "description": "umbrella with rain drops"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "umbrella"
+ ]
+ , "tags": [
+ "rain"
+ , "weather"
+ ]
+ , "unicode_version": "4.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛱"
+ , "description": "umbrella on ground"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "parasol_on_ground"
+ ]
+ , "tags": [
+ "beach_umbrella"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⚡"
+ , "description": "high voltage"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "zap"
+ ]
+ , "tags": [
+ "lightning"
+ , "thunder"
+ ]
+ , "unicode_version": "4.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❄️"
+ , "description": "snowflake"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "snowflake"
+ ]
+ , "tags": [
+ "winter"
+ , "cold"
+ , "weather"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☃️"
+ , "description": "snowman"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "snowman_with_snow"
+ ]
+ , "tags": [
+ "winter"
+ , "christmas"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⛄"
+ , "description": "snowman without snow"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "snowman"
+ ]
+ , "tags": [
+ "winter"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☄"
+ , "description": "comet"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "comet"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🔥"
+ , "description": "fire"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "fire"
+ ]
+ , "tags": [
+ "burn"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💧"
+ , "description": "droplet"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "droplet"
+ ]
+ , "tags": [
+ "water"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🌊"
+ , "description": "water wave"
+ , "category": "Travel & Places"
+ , "aliases": [
+ "ocean"
+ ]
+ , "tags": [
+ "sea"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎃"
+ , "description": "jack-o-lantern"
+ , "category": "Activities"
+ , "aliases": [
+ "jack_o_lantern"
+ ]
+ , "tags": [
+ "halloween"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎄"
+ , "description": "Christmas tree"
+ , "category": "Activities"
+ , "aliases": [
+ "christmas_tree"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎆"
+ , "description": "fireworks"
+ , "category": "Activities"
+ , "aliases": [
+ "fireworks"
+ ]
+ , "tags": [
+ "festival"
+ , "celebration"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎇"
+ , "description": "sparkler"
+ , "category": "Activities"
+ , "aliases": [
+ "sparkler"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧨"
+ , "description": "firecracker"
+ , "category": "Activities"
+ , "aliases": [
+ "firecracker"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "✨"
+ , "description": "sparkles"
+ , "category": "Activities"
+ , "aliases": [
+ "sparkles"
+ ]
+ , "tags": [
+ "shiny"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎈"
+ , "description": "balloon"
+ , "category": "Activities"
+ , "aliases": [
+ "balloon"
+ ]
+ , "tags": [
+ "party"
+ , "birthday"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎉"
+ , "description": "party popper"
+ , "category": "Activities"
+ , "aliases": [
+ "tada"
+ ]
+ , "tags": [
+ "hooray"
+ , "party"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎊"
+ , "description": "confetti ball"
+ , "category": "Activities"
+ , "aliases": [
+ "confetti_ball"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎋"
+ , "description": "tanabata tree"
+ , "category": "Activities"
+ , "aliases": [
+ "tanabata_tree"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎍"
+ , "description": "pine decoration"
+ , "category": "Activities"
+ , "aliases": [
+ "bamboo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎎"
+ , "description": "Japanese dolls"
+ , "category": "Activities"
+ , "aliases": [
+ "dolls"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎏"
+ , "description": "carp streamer"
+ , "category": "Activities"
+ , "aliases": [
+ "flags"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎐"
+ , "description": "wind chime"
+ , "category": "Activities"
+ , "aliases": [
+ "wind_chime"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎑"
+ , "description": "moon viewing ceremony"
+ , "category": "Activities"
+ , "aliases": [
+ "rice_scene"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧧"
+ , "description": "red envelope"
+ , "category": "Activities"
+ , "aliases": [
+ "red_envelope"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🎀"
+ , "description": "ribbon"
+ , "category": "Activities"
+ , "aliases": [
+ "ribbon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎁"
+ , "description": "wrapped gift"
+ , "category": "Activities"
+ , "aliases": [
+ "gift"
+ ]
+ , "tags": [
+ "present"
+ , "birthday"
+ , "christmas"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎗"
+ , "description": "reminder ribbon"
+ , "category": "Activities"
+ , "aliases": [
+ "reminder_ribbon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎟"
+ , "description": "admission tickets"
+ , "category": "Activities"
+ , "aliases": [
+ "tickets"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎫"
+ , "description": "ticket"
+ , "category": "Activities"
+ , "aliases": [
+ "ticket"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎖"
+ , "description": "military medal"
+ , "category": "Activities"
+ , "aliases": [
+ "medal_military"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏆"
+ , "description": "trophy"
+ , "category": "Activities"
+ , "aliases": [
+ "trophy"
+ ]
+ , "tags": [
+ "award"
+ , "contest"
+ , "winner"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏅"
+ , "description": "sports medal"
+ , "category": "Activities"
+ , "aliases": [
+ "medal_sports"
+ ]
+ , "tags": [
+ "gold"
+ , "winner"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🥇"
+ , "description": "1st place medal"
+ , "category": "Activities"
+ , "aliases": [
+ "1st_place_medal"
+ ]
+ , "tags": [
+ "gold"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥈"
+ , "description": "2nd place medal"
+ , "category": "Activities"
+ , "aliases": [
+ "2nd_place_medal"
+ ]
+ , "tags": [
+ "silver"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥉"
+ , "description": "3rd place medal"
+ , "category": "Activities"
+ , "aliases": [
+ "3rd_place_medal"
+ ]
+ , "tags": [
+ "bronze"
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "⚽"
+ , "description": "soccer ball"
+ , "category": "Activities"
+ , "aliases": [
+ "soccer"
+ ]
+ , "tags": [
+ "sports"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⚾"
+ , "description": "baseball"
+ , "category": "Activities"
+ , "aliases": [
+ "baseball"
+ ]
+ , "tags": [
+ "sports"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥎"
+ , "description": "softball"
+ , "category": "Activities"
+ , "aliases": [
+ "softball"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🏀"
+ , "description": "basketball"
+ , "category": "Activities"
+ , "aliases": [
+ "basketball"
+ ]
+ , "tags": [
+ "sports"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏐"
+ , "description": "volleyball"
+ , "category": "Activities"
+ , "aliases": [
+ "volleyball"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏈"
+ , "description": "american football"
+ , "category": "Activities"
+ , "aliases": [
+ "football"
+ ]
+ , "tags": [
+ "sports"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏉"
+ , "description": "rugby football"
+ , "category": "Activities"
+ , "aliases": [
+ "rugby_football"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎾"
+ , "description": "tennis"
+ , "category": "Activities"
+ , "aliases": [
+ "tennis"
+ ]
+ , "tags": [
+ "sports"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥏"
+ , "description": "flying disc"
+ , "category": "Activities"
+ , "aliases": [
+ "flying_disc"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🎳"
+ , "description": "bowling"
+ , "category": "Activities"
+ , "aliases": [
+ "bowling"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏏"
+ , "description": "cricket game"
+ , "category": "Activities"
+ , "aliases": [
+ "cricket_game"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏑"
+ , "description": "field hockey"
+ , "category": "Activities"
+ , "aliases": [
+ "field_hockey"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏒"
+ , "description": "ice hockey"
+ , "category": "Activities"
+ , "aliases": [
+ "ice_hockey"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🥍"
+ , "description": "lacrosse"
+ , "category": "Activities"
+ , "aliases": [
+ "lacrosse"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🏓"
+ , "description": "ping pong"
+ , "category": "Activities"
+ , "aliases": [
+ "ping_pong"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏸"
+ , "description": "badminton"
+ , "category": "Activities"
+ , "aliases": [
+ "badminton"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🥊"
+ , "description": "boxing glove"
+ , "category": "Activities"
+ , "aliases": [
+ "boxing_glove"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥋"
+ , "description": "martial arts uniform"
+ , "category": "Activities"
+ , "aliases": [
+ "martial_arts_uniform"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🥅"
+ , "description": "goal net"
+ , "category": "Activities"
+ , "aliases": [
+ "goal_net"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "⛳"
+ , "description": "flag in hole"
+ , "category": "Activities"
+ , "aliases": [
+ "golf"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛸"
+ , "description": "ice skate"
+ , "category": "Activities"
+ , "aliases": [
+ "ice_skate"
+ ]
+ , "tags": [
+ "skating"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎣"
+ , "description": "fishing pole"
+ , "category": "Activities"
+ , "aliases": [
+ "fishing_pole_and_fish"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🤿"
+ , "description": "diving mask"
+ , "category": "Activities"
+ , "aliases": [
+ "diving_mask"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🎽"
+ , "description": "running shirt"
+ , "category": "Activities"
+ , "aliases": [
+ "running_shirt_with_sash"
+ ]
+ , "tags": [
+ "marathon"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎿"
+ , "description": "skis"
+ , "category": "Activities"
+ , "aliases": [
+ "ski"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛷"
+ , "description": "sled"
+ , "category": "Activities"
+ , "aliases": [
+ "sled"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥌"
+ , "description": "curling stone"
+ , "category": "Activities"
+ , "aliases": [
+ "curling_stone"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🎯"
+ , "description": "direct hit"
+ , "category": "Activities"
+ , "aliases": [
+ "dart"
+ ]
+ , "tags": [
+ "target"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🪀"
+ , "description": "yo-yo"
+ , "category": "Activities"
+ , "aliases": [
+ "yo_yo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🪁"
+ , "description": "kite"
+ , "category": "Activities"
+ , "aliases": [
+ "kite"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🎱"
+ , "description": "pool 8 ball"
+ , "category": "Activities"
+ , "aliases": [
+ "8ball"
+ ]
+ , "tags": [
+ "pool"
+ , "billiards"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔮"
+ , "description": "crystal ball"
+ , "category": "Activities"
+ , "aliases": [
+ "crystal_ball"
+ ]
+ , "tags": [
+ "fortune"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧿"
+ , "description": "nazar amulet"
+ , "category": "Activities"
+ , "aliases": [
+ "nazar_amulet"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🎮"
+ , "description": "video game"
+ , "category": "Activities"
+ , "aliases": [
+ "video_game"
+ ]
+ , "tags": [
+ "play"
+ , "controller"
+ , "console"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕹"
+ , "description": "joystick"
+ , "category": "Activities"
+ , "aliases": [
+ "joystick"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎰"
+ , "description": "slot machine"
+ , "category": "Activities"
+ , "aliases": [
+ "slot_machine"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎲"
+ , "description": "game die"
+ , "category": "Activities"
+ , "aliases": [
+ "game_die"
+ ]
+ , "tags": [
+ "dice"
+ , "gambling"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧩"
+ , "description": "puzzle piece"
+ , "category": "Activities"
+ , "aliases": [
+ "jigsaw"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧸"
+ , "description": "teddy bear"
+ , "category": "Activities"
+ , "aliases": [
+ "teddy_bear"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "♠️"
+ , "description": "spade suit"
+ , "category": "Activities"
+ , "aliases": [
+ "spades"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♥️"
+ , "description": "heart suit"
+ , "category": "Activities"
+ , "aliases": [
+ "hearts"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♦️"
+ , "description": "diamond suit"
+ , "category": "Activities"
+ , "aliases": [
+ "diamonds"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♣️"
+ , "description": "club suit"
+ , "category": "Activities"
+ , "aliases": [
+ "clubs"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♟"
+ , "description": "chess pawn"
+ , "category": "Activities"
+ , "aliases": [
+ "chess_pawn"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🃏"
+ , "description": "joker"
+ , "category": "Activities"
+ , "aliases": [
+ "black_joker"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🀄"
+ , "description": "mahjong red dragon"
+ , "category": "Activities"
+ , "aliases": [
+ "mahjong"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎴"
+ , "description": "flower playing cards"
+ , "category": "Activities"
+ , "aliases": [
+ "flower_playing_cards"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎭"
+ , "description": "performing arts"
+ , "category": "Activities"
+ , "aliases": [
+ "performing_arts"
+ ]
+ , "tags": [
+ "theater"
+ , "drama"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🖼"
+ , "description": "framed picture"
+ , "category": "Activities"
+ , "aliases": [
+ "framed_picture"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎨"
+ , "description": "artist palette"
+ , "category": "Activities"
+ , "aliases": [
+ "art"
+ ]
+ , "tags": [
+ "design"
+ , "paint"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧵"
+ , "description": "thread"
+ , "category": "Activities"
+ , "aliases": [
+ "thread"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧶"
+ , "description": "yarn"
+ , "category": "Activities"
+ , "aliases": [
+ "yarn"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "👓"
+ , "description": "glasses"
+ , "category": "Objects"
+ , "aliases": [
+ "eyeglasses"
+ ]
+ , "tags": [
+ "glasses"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕶"
+ , "description": "sunglasses"
+ , "category": "Objects"
+ , "aliases": [
+ "dark_sunglasses"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🥽"
+ , "description": "goggles"
+ , "category": "Objects"
+ , "aliases": [
+ "goggles"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥼"
+ , "description": "lab coat"
+ , "category": "Objects"
+ , "aliases": [
+ "lab_coat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🦺"
+ , "description": "safety vest"
+ , "category": "Objects"
+ , "aliases": [
+ "safety_vest"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "👔"
+ , "description": "necktie"
+ , "category": "Objects"
+ , "aliases": [
+ "necktie"
+ ]
+ , "tags": [
+ "shirt"
+ , "formal"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👕"
+ , "description": "t-shirt"
+ , "category": "Objects"
+ , "aliases": [
+ "shirt"
+ , "tshirt"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👖"
+ , "description": "jeans"
+ , "category": "Objects"
+ , "aliases": [
+ "jeans"
+ ]
+ , "tags": [
+ "pants"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧣"
+ , "description": "scarf"
+ , "category": "Objects"
+ , "aliases": [
+ "scarf"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧤"
+ , "description": "gloves"
+ , "category": "Objects"
+ , "aliases": [
+ "gloves"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧥"
+ , "description": "coat"
+ , "category": "Objects"
+ , "aliases": [
+ "coat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧦"
+ , "description": "socks"
+ , "category": "Objects"
+ , "aliases": [
+ "socks"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "👗"
+ , "description": "dress"
+ , "category": "Objects"
+ , "aliases": [
+ "dress"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👘"
+ , "description": "kimono"
+ , "category": "Objects"
+ , "aliases": [
+ "kimono"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥻"
+ , "description": "sari"
+ , "category": "Objects"
+ , "aliases": [
+ "sari"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🩱"
+ , "description": "one-piece swimsuit"
+ , "category": "Objects"
+ , "aliases": [
+ "one_piece_swimsuit"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🩲"
+ , "description": "swim brief"
+ , "category": "Objects"
+ , "aliases": [
+ "swim_brief"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🩳"
+ , "description": "shorts"
+ , "category": "Objects"
+ , "aliases": [
+ "shorts"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "👙"
+ , "description": "bikini"
+ , "category": "Objects"
+ , "aliases": [
+ "bikini"
+ ]
+ , "tags": [
+ "beach"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👚"
+ , "description": "woman’s clothes"
+ , "category": "Objects"
+ , "aliases": [
+ "womans_clothes"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👛"
+ , "description": "purse"
+ , "category": "Objects"
+ , "aliases": [
+ "purse"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👜"
+ , "description": "handbag"
+ , "category": "Objects"
+ , "aliases": [
+ "handbag"
+ ]
+ , "tags": [
+ "bag"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👝"
+ , "description": "clutch bag"
+ , "category": "Objects"
+ , "aliases": [
+ "pouch"
+ ]
+ , "tags": [
+ "bag"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛍"
+ , "description": "shopping bags"
+ , "category": "Objects"
+ , "aliases": [
+ "shopping"
+ ]
+ , "tags": [
+ "bags"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎒"
+ , "description": "backpack"
+ , "category": "Objects"
+ , "aliases": [
+ "school_satchel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👞"
+ , "description": "man’s shoe"
+ , "category": "Objects"
+ , "aliases": [
+ "mans_shoe"
+ , "shoe"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👟"
+ , "description": "running shoe"
+ , "category": "Objects"
+ , "aliases": [
+ "athletic_shoe"
+ ]
+ , "tags": [
+ "sneaker"
+ , "sport"
+ , "running"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🥾"
+ , "description": "hiking boot"
+ , "category": "Objects"
+ , "aliases": [
+ "hiking_boot"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🥿"
+ , "description": "flat shoe"
+ , "category": "Objects"
+ , "aliases": [
+ "flat_shoe"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "👠"
+ , "description": "high-heeled shoe"
+ , "category": "Objects"
+ , "aliases": [
+ "high_heel"
+ ]
+ , "tags": [
+ "shoe"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👡"
+ , "description": "woman’s sandal"
+ , "category": "Objects"
+ , "aliases": [
+ "sandal"
+ ]
+ , "tags": [
+ "shoe"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🩰"
+ , "description": "ballet shoes"
+ , "category": "Objects"
+ , "aliases": [
+ "ballet_shoes"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "👢"
+ , "description": "woman’s boot"
+ , "category": "Objects"
+ , "aliases": [
+ "boot"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👑"
+ , "description": "crown"
+ , "category": "Objects"
+ , "aliases": [
+ "crown"
+ ]
+ , "tags": [
+ "king"
+ , "queen"
+ , "royal"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "👒"
+ , "description": "woman’s hat"
+ , "category": "Objects"
+ , "aliases": [
+ "womans_hat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎩"
+ , "description": "top hat"
+ , "category": "Objects"
+ , "aliases": [
+ "tophat"
+ ]
+ , "tags": [
+ "hat"
+ , "classy"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎓"
+ , "description": "graduation cap"
+ , "category": "Objects"
+ , "aliases": [
+ "mortar_board"
+ ]
+ , "tags": [
+ "education"
+ , "college"
+ , "university"
+ , "graduation"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧢"
+ , "description": "billed cap"
+ , "category": "Objects"
+ , "aliases": [
+ "billed_cap"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "⛑"
+ , "description": "rescue worker’s helmet"
+ , "category": "Objects"
+ , "aliases": [
+ "rescue_worker_helmet"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "📿"
+ , "description": "prayer beads"
+ , "category": "Objects"
+ , "aliases": [
+ "prayer_beads"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "💄"
+ , "description": "lipstick"
+ , "category": "Objects"
+ , "aliases": [
+ "lipstick"
+ ]
+ , "tags": [
+ "makeup"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💍"
+ , "description": "ring"
+ , "category": "Objects"
+ , "aliases": [
+ "ring"
+ ]
+ , "tags": [
+ "wedding"
+ , "marriage"
+ , "engaged"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💎"
+ , "description": "gem stone"
+ , "category": "Objects"
+ , "aliases": [
+ "gem"
+ ]
+ , "tags": [
+ "diamond"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔇"
+ , "description": "muted speaker"
+ , "category": "Objects"
+ , "aliases": [
+ "mute"
+ ]
+ , "tags": [
+ "sound"
+ , "volume"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔈"
+ , "description": "speaker low volume"
+ , "category": "Objects"
+ , "aliases": [
+ "speaker"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔉"
+ , "description": "speaker medium volume"
+ , "category": "Objects"
+ , "aliases": [
+ "sound"
+ ]
+ , "tags": [
+ "volume"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔊"
+ , "description": "speaker high volume"
+ , "category": "Objects"
+ , "aliases": [
+ "loud_sound"
+ ]
+ , "tags": [
+ "volume"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📢"
+ , "description": "loudspeaker"
+ , "category": "Objects"
+ , "aliases": [
+ "loudspeaker"
+ ]
+ , "tags": [
+ "announcement"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📣"
+ , "description": "megaphone"
+ , "category": "Objects"
+ , "aliases": [
+ "mega"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📯"
+ , "description": "postal horn"
+ , "category": "Objects"
+ , "aliases": [
+ "postal_horn"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔔"
+ , "description": "bell"
+ , "category": "Objects"
+ , "aliases": [
+ "bell"
+ ]
+ , "tags": [
+ "sound"
+ , "notification"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔕"
+ , "description": "bell with slash"
+ , "category": "Objects"
+ , "aliases": [
+ "no_bell"
+ ]
+ , "tags": [
+ "volume"
+ , "off"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎼"
+ , "description": "musical score"
+ , "category": "Objects"
+ , "aliases": [
+ "musical_score"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎵"
+ , "description": "musical note"
+ , "category": "Objects"
+ , "aliases": [
+ "musical_note"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎶"
+ , "description": "musical notes"
+ , "category": "Objects"
+ , "aliases": [
+ "notes"
+ ]
+ , "tags": [
+ "music"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎙"
+ , "description": "studio microphone"
+ , "category": "Objects"
+ , "aliases": [
+ "studio_microphone"
+ ]
+ , "tags": [
+ "podcast"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎚"
+ , "description": "level slider"
+ , "category": "Objects"
+ , "aliases": [
+ "level_slider"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎛"
+ , "description": "control knobs"
+ , "category": "Objects"
+ , "aliases": [
+ "control_knobs"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎤"
+ , "description": "microphone"
+ , "category": "Objects"
+ , "aliases": [
+ "microphone"
+ ]
+ , "tags": [
+ "sing"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎧"
+ , "description": "headphone"
+ , "category": "Objects"
+ , "aliases": [
+ "headphones"
+ ]
+ , "tags": [
+ "music"
+ , "earphones"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📻"
+ , "description": "radio"
+ , "category": "Objects"
+ , "aliases": [
+ "radio"
+ ]
+ , "tags": [
+ "podcast"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎷"
+ , "description": "saxophone"
+ , "category": "Objects"
+ , "aliases": [
+ "saxophone"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎸"
+ , "description": "guitar"
+ , "category": "Objects"
+ , "aliases": [
+ "guitar"
+ ]
+ , "tags": [
+ "rock"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎹"
+ , "description": "musical keyboard"
+ , "category": "Objects"
+ , "aliases": [
+ "musical_keyboard"
+ ]
+ , "tags": [
+ "piano"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎺"
+ , "description": "trumpet"
+ , "category": "Objects"
+ , "aliases": [
+ "trumpet"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎻"
+ , "description": "violin"
+ , "category": "Objects"
+ , "aliases": [
+ "violin"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🪕"
+ , "description": "banjo"
+ , "category": "Objects"
+ , "aliases": [
+ "banjo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🥁"
+ , "description": "drum"
+ , "category": "Objects"
+ , "aliases": [
+ "drum"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "📱"
+ , "description": "mobile phone"
+ , "category": "Objects"
+ , "aliases": [
+ "iphone"
+ ]
+ , "tags": [
+ "smartphone"
+ , "mobile"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📲"
+ , "description": "mobile phone with arrow"
+ , "category": "Objects"
+ , "aliases": [
+ "calling"
+ ]
+ , "tags": [
+ "call"
+ , "incoming"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☎️"
+ , "description": "telephone"
+ , "category": "Objects"
+ , "aliases": [
+ "phone"
+ , "telephone"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📞"
+ , "description": "telephone receiver"
+ , "category": "Objects"
+ , "aliases": [
+ "telephone_receiver"
+ ]
+ , "tags": [
+ "phone"
+ , "call"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📟"
+ , "description": "pager"
+ , "category": "Objects"
+ , "aliases": [
+ "pager"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📠"
+ , "description": "fax machine"
+ , "category": "Objects"
+ , "aliases": [
+ "fax"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔋"
+ , "description": "battery"
+ , "category": "Objects"
+ , "aliases": [
+ "battery"
+ ]
+ , "tags": [
+ "power"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔌"
+ , "description": "electric plug"
+ , "category": "Objects"
+ , "aliases": [
+ "electric_plug"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💻"
+ , "description": "laptop computer"
+ , "category": "Objects"
+ , "aliases": [
+ "computer"
+ ]
+ , "tags": [
+ "desktop"
+ , "screen"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🖥"
+ , "description": "desktop computer"
+ , "category": "Objects"
+ , "aliases": [
+ "desktop_computer"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🖨"
+ , "description": "printer"
+ , "category": "Objects"
+ , "aliases": [
+ "printer"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⌨"
+ , "description": "keyboard"
+ , "category": "Objects"
+ , "aliases": [
+ "keyboard"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🖱"
+ , "description": "computer mouse"
+ , "category": "Objects"
+ , "aliases": [
+ "computer_mouse"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🖲"
+ , "description": "trackball"
+ , "category": "Objects"
+ , "aliases": [
+ "trackball"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "💽"
+ , "description": "computer disk"
+ , "category": "Objects"
+ , "aliases": [
+ "minidisc"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💾"
+ , "description": "floppy disk"
+ , "category": "Objects"
+ , "aliases": [
+ "floppy_disk"
+ ]
+ , "tags": [
+ "save"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💿"
+ , "description": "optical disk"
+ , "category": "Objects"
+ , "aliases": [
+ "cd"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📀"
+ , "description": "dvd"
+ , "category": "Objects"
+ , "aliases": [
+ "dvd"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧮"
+ , "description": "abacus"
+ , "category": "Objects"
+ , "aliases": [
+ "abacus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🎥"
+ , "description": "movie camera"
+ , "category": "Objects"
+ , "aliases": [
+ "movie_camera"
+ ]
+ , "tags": [
+ "film"
+ , "video"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎞"
+ , "description": "film frames"
+ , "category": "Objects"
+ , "aliases": [
+ "film_strip"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "📽"
+ , "description": "film projector"
+ , "category": "Objects"
+ , "aliases": [
+ "film_projector"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🎬"
+ , "description": "clapper board"
+ , "category": "Objects"
+ , "aliases": [
+ "clapper"
+ ]
+ , "tags": [
+ "film"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📺"
+ , "description": "television"
+ , "category": "Objects"
+ , "aliases": [
+ "tv"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📷"
+ , "description": "camera"
+ , "category": "Objects"
+ , "aliases": [
+ "camera"
+ ]
+ , "tags": [
+ "photo"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📸"
+ , "description": "camera with flash"
+ , "category": "Objects"
+ , "aliases": [
+ "camera_flash"
+ ]
+ , "tags": [
+ "photo"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "📹"
+ , "description": "video camera"
+ , "category": "Objects"
+ , "aliases": [
+ "video_camera"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📼"
+ , "description": "videocassette"
+ , "category": "Objects"
+ , "aliases": [
+ "vhs"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔍"
+ , "description": "magnifying glass tilted left"
+ , "category": "Objects"
+ , "aliases": [
+ "mag"
+ ]
+ , "tags": [
+ "search"
+ , "zoom"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔎"
+ , "description": "magnifying glass tilted right"
+ , "category": "Objects"
+ , "aliases": [
+ "mag_right"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🕯"
+ , "description": "candle"
+ , "category": "Objects"
+ , "aliases": [
+ "candle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "💡"
+ , "description": "light bulb"
+ , "category": "Objects"
+ , "aliases": [
+ "bulb"
+ ]
+ , "tags": [
+ "idea"
+ , "light"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔦"
+ , "description": "flashlight"
+ , "category": "Objects"
+ , "aliases": [
+ "flashlight"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏮"
+ , "description": "red paper lantern"
+ , "category": "Objects"
+ , "aliases": [
+ "izakaya_lantern"
+ , "lantern"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🪔"
+ , "description": "diya lamp"
+ , "category": "Objects"
+ , "aliases": [
+ "diya_lamp"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "📔"
+ , "description": "notebook with decorative cover"
+ , "category": "Objects"
+ , "aliases": [
+ "notebook_with_decorative_cover"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📕"
+ , "description": "closed book"
+ , "category": "Objects"
+ , "aliases": [
+ "closed_book"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📖"
+ , "description": "open book"
+ , "category": "Objects"
+ , "aliases": [
+ "book"
+ , "open_book"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📗"
+ , "description": "green book"
+ , "category": "Objects"
+ , "aliases": [
+ "green_book"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📘"
+ , "description": "blue book"
+ , "category": "Objects"
+ , "aliases": [
+ "blue_book"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📙"
+ , "description": "orange book"
+ , "category": "Objects"
+ , "aliases": [
+ "orange_book"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📚"
+ , "description": "books"
+ , "category": "Objects"
+ , "aliases": [
+ "books"
+ ]
+ , "tags": [
+ "library"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📓"
+ , "description": "notebook"
+ , "category": "Objects"
+ , "aliases": [
+ "notebook"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📒"
+ , "description": "ledger"
+ , "category": "Objects"
+ , "aliases": [
+ "ledger"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📃"
+ , "description": "page with curl"
+ , "category": "Objects"
+ , "aliases": [
+ "page_with_curl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📜"
+ , "description": "scroll"
+ , "category": "Objects"
+ , "aliases": [
+ "scroll"
+ ]
+ , "tags": [
+ "document"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📄"
+ , "description": "page facing up"
+ , "category": "Objects"
+ , "aliases": [
+ "page_facing_up"
+ ]
+ , "tags": [
+ "document"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📰"
+ , "description": "newspaper"
+ , "category": "Objects"
+ , "aliases": [
+ "newspaper"
+ ]
+ , "tags": [
+ "press"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗞"
+ , "description": "rolled-up newspaper"
+ , "category": "Objects"
+ , "aliases": [
+ "newspaper_roll"
+ ]
+ , "tags": [
+ "press"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "📑"
+ , "description": "bookmark tabs"
+ , "category": "Objects"
+ , "aliases": [
+ "bookmark_tabs"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔖"
+ , "description": "bookmark"
+ , "category": "Objects"
+ , "aliases": [
+ "bookmark"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏷"
+ , "description": "label"
+ , "category": "Objects"
+ , "aliases": [
+ "label"
+ ]
+ , "tags": [
+ "tag"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "💰"
+ , "description": "money bag"
+ , "category": "Objects"
+ , "aliases": [
+ "moneybag"
+ ]
+ , "tags": [
+ "dollar"
+ , "cream"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💴"
+ , "description": "yen banknote"
+ , "category": "Objects"
+ , "aliases": [
+ "yen"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💵"
+ , "description": "dollar banknote"
+ , "category": "Objects"
+ , "aliases": [
+ "dollar"
+ ]
+ , "tags": [
+ "money"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💶"
+ , "description": "euro banknote"
+ , "category": "Objects"
+ , "aliases": [
+ "euro"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💷"
+ , "description": "pound banknote"
+ , "category": "Objects"
+ , "aliases": [
+ "pound"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💸"
+ , "description": "money with wings"
+ , "category": "Objects"
+ , "aliases": [
+ "money_with_wings"
+ ]
+ , "tags": [
+ "dollar"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💳"
+ , "description": "credit card"
+ , "category": "Objects"
+ , "aliases": [
+ "credit_card"
+ ]
+ , "tags": [
+ "subscription"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🧾"
+ , "description": "receipt"
+ , "category": "Objects"
+ , "aliases": [
+ "receipt"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "💹"
+ , "description": "chart increasing with yen"
+ , "category": "Objects"
+ , "aliases": [
+ "chart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💱"
+ , "description": "currency exchange"
+ , "category": "Objects"
+ , "aliases": [
+ "currency_exchange"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💲"
+ , "description": "heavy dollar sign"
+ , "category": "Objects"
+ , "aliases": [
+ "heavy_dollar_sign"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "✉️"
+ , "description": "envelope"
+ , "category": "Objects"
+ , "aliases": [
+ "email"
+ , "envelope"
+ ]
+ , "tags": [
+ "letter"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📧"
+ , "description": "e-mail"
+ , "category": "Objects"
+ , "aliases": [
+ "e-mail"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📨"
+ , "description": "incoming envelope"
+ , "category": "Objects"
+ , "aliases": [
+ "incoming_envelope"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📩"
+ , "description": "envelope with arrow"
+ , "category": "Objects"
+ , "aliases": [
+ "envelope_with_arrow"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📤"
+ , "description": "outbox tray"
+ , "category": "Objects"
+ , "aliases": [
+ "outbox_tray"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📥"
+ , "description": "inbox tray"
+ , "category": "Objects"
+ , "aliases": [
+ "inbox_tray"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📦"
+ , "description": "package"
+ , "category": "Objects"
+ , "aliases": [
+ "package"
+ ]
+ , "tags": [
+ "shipping"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📫"
+ , "description": "closed mailbox with raised flag"
+ , "category": "Objects"
+ , "aliases": [
+ "mailbox"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📪"
+ , "description": "closed mailbox with lowered flag"
+ , "category": "Objects"
+ , "aliases": [
+ "mailbox_closed"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📬"
+ , "description": "open mailbox with raised flag"
+ , "category": "Objects"
+ , "aliases": [
+ "mailbox_with_mail"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📭"
+ , "description": "open mailbox with lowered flag"
+ , "category": "Objects"
+ , "aliases": [
+ "mailbox_with_no_mail"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📮"
+ , "description": "postbox"
+ , "category": "Objects"
+ , "aliases": [
+ "postbox"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗳"
+ , "description": "ballot box with ballot"
+ , "category": "Objects"
+ , "aliases": [
+ "ballot_box"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "✏️"
+ , "description": "pencil"
+ , "category": "Objects"
+ , "aliases": [
+ "pencil2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "✒️"
+ , "description": "black nib"
+ , "category": "Objects"
+ , "aliases": [
+ "black_nib"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🖋"
+ , "description": "fountain pen"
+ , "category": "Objects"
+ , "aliases": [
+ "fountain_pen"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🖊"
+ , "description": "pen"
+ , "category": "Objects"
+ , "aliases": [
+ "pen"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🖌"
+ , "description": "paintbrush"
+ , "category": "Objects"
+ , "aliases": [
+ "paintbrush"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🖍"
+ , "description": "crayon"
+ , "category": "Objects"
+ , "aliases": [
+ "crayon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "📝"
+ , "description": "memo"
+ , "category": "Objects"
+ , "aliases": [
+ "memo"
+ , "pencil"
+ ]
+ , "tags": [
+ "document"
+ , "note"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💼"
+ , "description": "briefcase"
+ , "category": "Objects"
+ , "aliases": [
+ "briefcase"
+ ]
+ , "tags": [
+ "business"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📁"
+ , "description": "file folder"
+ , "category": "Objects"
+ , "aliases": [
+ "file_folder"
+ ]
+ , "tags": [
+ "directory"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📂"
+ , "description": "open file folder"
+ , "category": "Objects"
+ , "aliases": [
+ "open_file_folder"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗂"
+ , "description": "card index dividers"
+ , "category": "Objects"
+ , "aliases": [
+ "card_index_dividers"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "📅"
+ , "description": "calendar"
+ , "category": "Objects"
+ , "aliases": [
+ "date"
+ ]
+ , "tags": [
+ "calendar"
+ , "schedule"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📆"
+ , "description": "tear-off calendar"
+ , "category": "Objects"
+ , "aliases": [
+ "calendar"
+ ]
+ , "tags": [
+ "schedule"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗒"
+ , "description": "spiral notepad"
+ , "category": "Objects"
+ , "aliases": [
+ "spiral_notepad"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🗓"
+ , "description": "spiral calendar"
+ , "category": "Objects"
+ , "aliases": [
+ "spiral_calendar"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "📇"
+ , "description": "card index"
+ , "category": "Objects"
+ , "aliases": [
+ "card_index"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📈"
+ , "description": "chart increasing"
+ , "category": "Objects"
+ , "aliases": [
+ "chart_with_upwards_trend"
+ ]
+ , "tags": [
+ "graph"
+ , "metrics"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📉"
+ , "description": "chart decreasing"
+ , "category": "Objects"
+ , "aliases": [
+ "chart_with_downwards_trend"
+ ]
+ , "tags": [
+ "graph"
+ , "metrics"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📊"
+ , "description": "bar chart"
+ , "category": "Objects"
+ , "aliases": [
+ "bar_chart"
+ ]
+ , "tags": [
+ "stats"
+ , "metrics"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📋"
+ , "description": "clipboard"
+ , "category": "Objects"
+ , "aliases": [
+ "clipboard"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📌"
+ , "description": "pushpin"
+ , "category": "Objects"
+ , "aliases": [
+ "pushpin"
+ ]
+ , "tags": [
+ "location"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📍"
+ , "description": "round pushpin"
+ , "category": "Objects"
+ , "aliases": [
+ "round_pushpin"
+ ]
+ , "tags": [
+ "location"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📎"
+ , "description": "paperclip"
+ , "category": "Objects"
+ , "aliases": [
+ "paperclip"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🖇"
+ , "description": "linked paperclips"
+ , "category": "Objects"
+ , "aliases": [
+ "paperclips"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "📏"
+ , "description": "straight ruler"
+ , "category": "Objects"
+ , "aliases": [
+ "straight_ruler"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📐"
+ , "description": "triangular ruler"
+ , "category": "Objects"
+ , "aliases": [
+ "triangular_ruler"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "✂️"
+ , "description": "scissors"
+ , "category": "Objects"
+ , "aliases": [
+ "scissors"
+ ]
+ , "tags": [
+ "cut"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗃"
+ , "description": "card file box"
+ , "category": "Objects"
+ , "aliases": [
+ "card_file_box"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🗄"
+ , "description": "file cabinet"
+ , "category": "Objects"
+ , "aliases": [
+ "file_cabinet"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🗑"
+ , "description": "wastebasket"
+ , "category": "Objects"
+ , "aliases": [
+ "wastebasket"
+ ]
+ , "tags": [
+ "trash"
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🔒"
+ , "description": "locked"
+ , "category": "Objects"
+ , "aliases": [
+ "lock"
+ ]
+ , "tags": [
+ "security"
+ , "private"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔓"
+ , "description": "unlocked"
+ , "category": "Objects"
+ , "aliases": [
+ "unlock"
+ ]
+ , "tags": [
+ "security"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔏"
+ , "description": "locked with pen"
+ , "category": "Objects"
+ , "aliases": [
+ "lock_with_ink_pen"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔐"
+ , "description": "locked with key"
+ , "category": "Objects"
+ , "aliases": [
+ "closed_lock_with_key"
+ ]
+ , "tags": [
+ "security"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔑"
+ , "description": "key"
+ , "category": "Objects"
+ , "aliases": [
+ "key"
+ ]
+ , "tags": [
+ "lock"
+ , "password"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🗝"
+ , "description": "old key"
+ , "category": "Objects"
+ , "aliases": [
+ "old_key"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🔨"
+ , "description": "hammer"
+ , "category": "Objects"
+ , "aliases": [
+ "hammer"
+ ]
+ , "tags": [
+ "tool"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🪓"
+ , "description": "axe"
+ , "category": "Objects"
+ , "aliases": [
+ "axe"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "⛏"
+ , "description": "pick"
+ , "category": "Objects"
+ , "aliases": [
+ "pick"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⚒"
+ , "description": "hammer and pick"
+ , "category": "Objects"
+ , "aliases": [
+ "hammer_and_pick"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛠"
+ , "description": "hammer and wrench"
+ , "category": "Objects"
+ , "aliases": [
+ "hammer_and_wrench"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🗡"
+ , "description": "dagger"
+ , "category": "Objects"
+ , "aliases": [
+ "dagger"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⚔"
+ , "description": "crossed swords"
+ , "category": "Objects"
+ , "aliases": [
+ "crossed_swords"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🔫"
+ , "description": "pistol"
+ , "category": "Objects"
+ , "aliases": [
+ "gun"
+ ]
+ , "tags": [
+ "shoot"
+ , "weapon"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏹"
+ , "description": "bow and arrow"
+ , "category": "Objects"
+ , "aliases": [
+ "bow_and_arrow"
+ ]
+ , "tags": [
+ "archery"
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛡"
+ , "description": "shield"
+ , "category": "Objects"
+ , "aliases": [
+ "shield"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🔧"
+ , "description": "wrench"
+ , "category": "Objects"
+ , "aliases": [
+ "wrench"
+ ]
+ , "tags": [
+ "tool"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔩"
+ , "description": "nut and bolt"
+ , "category": "Objects"
+ , "aliases": [
+ "nut_and_bolt"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⚙"
+ , "description": "gear"
+ , "category": "Objects"
+ , "aliases": [
+ "gear"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🗜"
+ , "description": "clamp"
+ , "category": "Objects"
+ , "aliases": [
+ "clamp"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⚖"
+ , "description": "balance scale"
+ , "category": "Objects"
+ , "aliases": [
+ "balance_scale"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🦯"
+ , "description": "probing cane"
+ , "category": "Objects"
+ , "aliases": [
+ "probing_cane"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🔗"
+ , "description": "link"
+ , "category": "Objects"
+ , "aliases": [
+ "link"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛓"
+ , "description": "chains"
+ , "category": "Objects"
+ , "aliases": [
+ "chains"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🧰"
+ , "description": "toolbox"
+ , "category": "Objects"
+ , "aliases": [
+ "toolbox"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧲"
+ , "description": "magnet"
+ , "category": "Objects"
+ , "aliases": [
+ "magnet"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "⚗"
+ , "description": "alembic"
+ , "category": "Objects"
+ , "aliases": [
+ "alembic"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🧪"
+ , "description": "test tube"
+ , "category": "Objects"
+ , "aliases": [
+ "test_tube"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧫"
+ , "description": "petri dish"
+ , "category": "Objects"
+ , "aliases": [
+ "petri_dish"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧬"
+ , "description": "dna"
+ , "category": "Objects"
+ , "aliases": [
+ "dna"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🔬"
+ , "description": "microscope"
+ , "category": "Objects"
+ , "aliases": [
+ "microscope"
+ ]
+ , "tags": [
+ "science"
+ , "laboratory"
+ , "investigate"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔭"
+ , "description": "telescope"
+ , "category": "Objects"
+ , "aliases": [
+ "telescope"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📡"
+ , "description": "satellite antenna"
+ , "category": "Objects"
+ , "aliases": [
+ "satellite"
+ ]
+ , "tags": [
+ "signal"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💉"
+ , "description": "syringe"
+ , "category": "Objects"
+ , "aliases": [
+ "syringe"
+ ]
+ , "tags": [
+ "health"
+ , "hospital"
+ , "needle"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🩸"
+ , "description": "drop of blood"
+ , "category": "Objects"
+ , "aliases": [
+ "drop_of_blood"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "💊"
+ , "description": "pill"
+ , "category": "Objects"
+ , "aliases": [
+ "pill"
+ ]
+ , "tags": [
+ "health"
+ , "medicine"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🩹"
+ , "description": "adhesive bandage"
+ , "category": "Objects"
+ , "aliases": [
+ "adhesive_bandage"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🩺"
+ , "description": "stethoscope"
+ , "category": "Objects"
+ , "aliases": [
+ "stethoscope"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🚪"
+ , "description": "door"
+ , "category": "Objects"
+ , "aliases": [
+ "door"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛏"
+ , "description": "bed"
+ , "category": "Objects"
+ , "aliases": [
+ "bed"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🛋"
+ , "description": "couch and lamp"
+ , "category": "Objects"
+ , "aliases": [
+ "couch_and_lamp"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🪑"
+ , "description": "chair"
+ , "category": "Objects"
+ , "aliases": [
+ "chair"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🚽"
+ , "description": "toilet"
+ , "category": "Objects"
+ , "aliases": [
+ "toilet"
+ ]
+ , "tags": [
+ "wc"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚿"
+ , "description": "shower"
+ , "category": "Objects"
+ , "aliases": [
+ "shower"
+ ]
+ , "tags": [
+ "bath"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛁"
+ , "description": "bathtub"
+ , "category": "Objects"
+ , "aliases": [
+ "bathtub"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🪒"
+ , "description": "razor"
+ , "category": "Objects"
+ , "aliases": [
+ "razor"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🧴"
+ , "description": "lotion bottle"
+ , "category": "Objects"
+ , "aliases": [
+ "lotion_bottle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧷"
+ , "description": "safety pin"
+ , "category": "Objects"
+ , "aliases": [
+ "safety_pin"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧹"
+ , "description": "broom"
+ , "category": "Objects"
+ , "aliases": [
+ "broom"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧺"
+ , "description": "basket"
+ , "category": "Objects"
+ , "aliases": [
+ "basket"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧻"
+ , "description": "roll of paper"
+ , "category": "Objects"
+ , "aliases": [
+ "roll_of_paper"
+ ]
+ , "tags": [
+ "toilet"
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧼"
+ , "description": "soap"
+ , "category": "Objects"
+ , "aliases": [
+ "soap"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧽"
+ , "description": "sponge"
+ , "category": "Objects"
+ , "aliases": [
+ "sponge"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🧯"
+ , "description": "fire extinguisher"
+ , "category": "Objects"
+ , "aliases": [
+ "fire_extinguisher"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🛒"
+ , "description": "shopping cart"
+ , "category": "Objects"
+ , "aliases": [
+ "shopping_cart"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "9.0"
+ , "ios_version": "10.2"
+ }
+, {
+ "emoji": "🚬"
+ , "description": "cigarette"
+ , "category": "Objects"
+ , "aliases": [
+ "smoking"
+ ]
+ , "tags": [
+ "cigarette"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⚰"
+ , "description": "coffin"
+ , "category": "Objects"
+ , "aliases": [
+ "coffin"
+ ]
+ , "tags": [
+ "funeral"
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⚱"
+ , "description": "funeral urn"
+ , "category": "Objects"
+ , "aliases": [
+ "funeral_urn"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🗿"
+ , "description": "moai"
+ , "category": "Objects"
+ , "aliases": [
+ "moyai"
+ ]
+ , "tags": [
+ "stone"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏧"
+ , "description": "ATM sign"
+ , "category": "Symbols"
+ , "aliases": [
+ "atm"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚮"
+ , "description": "litter in bin sign"
+ , "category": "Symbols"
+ , "aliases": [
+ "put_litter_in_its_place"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚰"
+ , "description": "potable water"
+ , "category": "Symbols"
+ , "aliases": [
+ "potable_water"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♿"
+ , "description": "wheelchair symbol"
+ , "category": "Symbols"
+ , "aliases": [
+ "wheelchair"
+ ]
+ , "tags": [
+ "accessibility"
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚹"
+ , "description": "men’s room"
+ , "category": "Symbols"
+ , "aliases": [
+ "mens"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚺"
+ , "description": "women’s room"
+ , "category": "Symbols"
+ , "aliases": [
+ "womens"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚻"
+ , "description": "restroom"
+ , "category": "Symbols"
+ , "aliases": [
+ "restroom"
+ ]
+ , "tags": [
+ "toilet"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚼"
+ , "description": "baby symbol"
+ , "category": "Symbols"
+ , "aliases": [
+ "baby_symbol"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚾"
+ , "description": "water closet"
+ , "category": "Symbols"
+ , "aliases": [
+ "wc"
+ ]
+ , "tags": [
+ "toilet"
+ , "restroom"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛂"
+ , "description": "passport control"
+ , "category": "Symbols"
+ , "aliases": [
+ "passport_control"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛃"
+ , "description": "customs"
+ , "category": "Symbols"
+ , "aliases": [
+ "customs"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛄"
+ , "description": "baggage claim"
+ , "category": "Symbols"
+ , "aliases": [
+ "baggage_claim"
+ ]
+ , "tags": [
+ "airport"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛅"
+ , "description": "left luggage"
+ , "category": "Symbols"
+ , "aliases": [
+ "left_luggage"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⚠️"
+ , "description": "warning"
+ , "category": "Symbols"
+ , "aliases": [
+ "warning"
+ ]
+ , "tags": [
+ "wip"
+ ]
+ , "unicode_version": "4.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚸"
+ , "description": "children crossing"
+ , "category": "Symbols"
+ , "aliases": [
+ "children_crossing"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛔"
+ , "description": "no entry"
+ , "category": "Symbols"
+ , "aliases": [
+ "no_entry"
+ ]
+ , "tags": [
+ "limit"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚫"
+ , "description": "prohibited"
+ , "category": "Symbols"
+ , "aliases": [
+ "no_entry_sign"
+ ]
+ , "tags": [
+ "block"
+ , "forbidden"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚳"
+ , "description": "no bicycles"
+ , "category": "Symbols"
+ , "aliases": [
+ "no_bicycles"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚭"
+ , "description": "no smoking"
+ , "category": "Symbols"
+ , "aliases": [
+ "no_smoking"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚯"
+ , "description": "no littering"
+ , "category": "Symbols"
+ , "aliases": [
+ "do_not_litter"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚱"
+ , "description": "non-potable water"
+ , "category": "Symbols"
+ , "aliases": [
+ "non-potable_water"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚷"
+ , "description": "no pedestrians"
+ , "category": "Symbols"
+ , "aliases": [
+ "no_pedestrians"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📵"
+ , "description": "no mobile phones"
+ , "category": "Symbols"
+ , "aliases": [
+ "no_mobile_phones"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔞"
+ , "description": "no one under eighteen"
+ , "category": "Symbols"
+ , "aliases": [
+ "underage"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☢"
+ , "description": "radioactive"
+ , "category": "Symbols"
+ , "aliases": [
+ "radioactive"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "☣"
+ , "description": "biohazard"
+ , "category": "Symbols"
+ , "aliases": [
+ "biohazard"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⬆️"
+ , "description": "up arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_up"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "↗️"
+ , "description": "up-right arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_upper_right"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "➡️"
+ , "description": "right arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_right"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "↘️"
+ , "description": "down-right arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_lower_right"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⬇️"
+ , "description": "down arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_down"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "↙️"
+ , "description": "down-left arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_lower_left"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⬅️"
+ , "description": "left arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_left"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "↖️"
+ , "description": "up-left arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_upper_left"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "↕️"
+ , "description": "up-down arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_up_down"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "↔️"
+ , "description": "left-right arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "left_right_arrow"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "↩️"
+ , "description": "right arrow curving left"
+ , "category": "Symbols"
+ , "aliases": [
+ "leftwards_arrow_with_hook"
+ ]
+ , "tags": [
+ "return"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "↪️"
+ , "description": "left arrow curving right"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_right_hook"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⤴️"
+ , "description": "right arrow curving up"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_heading_up"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⤵️"
+ , "description": "right arrow curving down"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_heading_down"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔃"
+ , "description": "clockwise vertical arrows"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrows_clockwise"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔄"
+ , "description": "counterclockwise arrows button"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrows_counterclockwise"
+ ]
+ , "tags": [
+ "sync"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔙"
+ , "description": "BACK arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "back"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔚"
+ , "description": "END arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "end"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔛"
+ , "description": "ON! arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "on"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔜"
+ , "description": "SOON arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "soon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔝"
+ , "description": "TOP arrow"
+ , "category": "Symbols"
+ , "aliases": [
+ "top"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🛐"
+ , "description": "place of worship"
+ , "category": "Symbols"
+ , "aliases": [
+ "place_of_worship"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⚛"
+ , "description": "atom symbol"
+ , "category": "Symbols"
+ , "aliases": [
+ "atom_symbol"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🕉"
+ , "description": "om"
+ , "category": "Symbols"
+ , "aliases": [
+ "om"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "✡️"
+ , "description": "star of David"
+ , "category": "Symbols"
+ , "aliases": [
+ "star_of_david"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "☸"
+ , "description": "wheel of dharma"
+ , "category": "Symbols"
+ , "aliases": [
+ "wheel_of_dharma"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "☯️"
+ , "description": "yin yang"
+ , "category": "Symbols"
+ , "aliases": [
+ "yin_yang"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "✝️"
+ , "description": "latin cross"
+ , "category": "Symbols"
+ , "aliases": [
+ "latin_cross"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "☦"
+ , "description": "orthodox cross"
+ , "category": "Symbols"
+ , "aliases": [
+ "orthodox_cross"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "☪"
+ , "description": "star and crescent"
+ , "category": "Symbols"
+ , "aliases": [
+ "star_and_crescent"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "☮"
+ , "description": "peace symbol"
+ , "category": "Symbols"
+ , "aliases": [
+ "peace_symbol"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🕎"
+ , "description": "menorah"
+ , "category": "Symbols"
+ , "aliases": [
+ "menorah"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🔯"
+ , "description": "dotted six-pointed star"
+ , "category": "Symbols"
+ , "aliases": [
+ "six_pointed_star"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♈"
+ , "description": "Aries"
+ , "category": "Symbols"
+ , "aliases": [
+ "aries"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♉"
+ , "description": "Taurus"
+ , "category": "Symbols"
+ , "aliases": [
+ "taurus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♊"
+ , "description": "Gemini"
+ , "category": "Symbols"
+ , "aliases": [
+ "gemini"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♋"
+ , "description": "Cancer"
+ , "category": "Symbols"
+ , "aliases": [
+ "cancer"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♌"
+ , "description": "Leo"
+ , "category": "Symbols"
+ , "aliases": [
+ "leo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♍"
+ , "description": "Virgo"
+ , "category": "Symbols"
+ , "aliases": [
+ "virgo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♎"
+ , "description": "Libra"
+ , "category": "Symbols"
+ , "aliases": [
+ "libra"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♏"
+ , "description": "Scorpio"
+ , "category": "Symbols"
+ , "aliases": [
+ "scorpius"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♐"
+ , "description": "Sagittarius"
+ , "category": "Symbols"
+ , "aliases": [
+ "sagittarius"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♑"
+ , "description": "Capricorn"
+ , "category": "Symbols"
+ , "aliases": [
+ "capricorn"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♒"
+ , "description": "Aquarius"
+ , "category": "Symbols"
+ , "aliases": [
+ "aquarius"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♓"
+ , "description": "Pisces"
+ , "category": "Symbols"
+ , "aliases": [
+ "pisces"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⛎"
+ , "description": "Ophiuchus"
+ , "category": "Symbols"
+ , "aliases": [
+ "ophiuchus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔀"
+ , "description": "shuffle tracks button"
+ , "category": "Symbols"
+ , "aliases": [
+ "twisted_rightwards_arrows"
+ ]
+ , "tags": [
+ "shuffle"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔁"
+ , "description": "repeat button"
+ , "category": "Symbols"
+ , "aliases": [
+ "repeat"
+ ]
+ , "tags": [
+ "loop"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔂"
+ , "description": "repeat single button"
+ , "category": "Symbols"
+ , "aliases": [
+ "repeat_one"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "▶️"
+ , "description": "play button"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_forward"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏩"
+ , "description": "fast-forward button"
+ , "category": "Symbols"
+ , "aliases": [
+ "fast_forward"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏭"
+ , "description": "next track button"
+ , "category": "Symbols"
+ , "aliases": [
+ "next_track_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⏯"
+ , "description": "play or pause button"
+ , "category": "Symbols"
+ , "aliases": [
+ "play_or_pause_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "◀️"
+ , "description": "reverse button"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_backward"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏪"
+ , "description": "fast reverse button"
+ , "category": "Symbols"
+ , "aliases": [
+ "rewind"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏮"
+ , "description": "last track button"
+ , "category": "Symbols"
+ , "aliases": [
+ "previous_track_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🔼"
+ , "description": "upwards button"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_up_small"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏫"
+ , "description": "fast up button"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_double_up"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔽"
+ , "description": "downwards button"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_down_small"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏬"
+ , "description": "fast down button"
+ , "category": "Symbols"
+ , "aliases": [
+ "arrow_double_down"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⏸"
+ , "description": "pause button"
+ , "category": "Symbols"
+ , "aliases": [
+ "pause_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⏹"
+ , "description": "stop button"
+ , "category": "Symbols"
+ , "aliases": [
+ "stop_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⏺"
+ , "description": "record button"
+ , "category": "Symbols"
+ , "aliases": [
+ "record_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "⏏️"
+ , "description": "eject button"
+ , "category": "Symbols"
+ , "aliases": [
+ "eject_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🎦"
+ , "description": "cinema"
+ , "category": "Symbols"
+ , "aliases": [
+ "cinema"
+ ]
+ , "tags": [
+ "film"
+ , "movie"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔅"
+ , "description": "dim button"
+ , "category": "Symbols"
+ , "aliases": [
+ "low_brightness"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔆"
+ , "description": "bright button"
+ , "category": "Symbols"
+ , "aliases": [
+ "high_brightness"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📶"
+ , "description": "antenna bars"
+ , "category": "Symbols"
+ , "aliases": [
+ "signal_strength"
+ ]
+ , "tags": [
+ "wifi"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📳"
+ , "description": "vibration mode"
+ , "category": "Symbols"
+ , "aliases": [
+ "vibration_mode"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📴"
+ , "description": "mobile phone off"
+ , "category": "Symbols"
+ , "aliases": [
+ "mobile_phone_off"
+ ]
+ , "tags": [
+ "mute"
+ , "off"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "♀️"
+ , "description": "female sign"
+ , "category": "Symbols"
+ , "aliases": [
+ "female_sign"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "♂️"
+ , "description": "male sign"
+ , "category": "Symbols"
+ , "aliases": [
+ "male_sign"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "⚕"
+ , "description": "medical symbol"
+ , "category": "Symbols"
+ , "aliases": [
+ "medical_symbol"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "♾"
+ , "description": "infinity"
+ , "category": "Symbols"
+ , "aliases": [
+ "infinity"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "♻️"
+ , "description": "recycling symbol"
+ , "category": "Symbols"
+ , "aliases": [
+ "recycle"
+ ]
+ , "tags": [
+ "environment"
+ , "green"
+ ]
+ , "unicode_version": "3.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⚜"
+ , "description": "fleur-de-lis"
+ , "category": "Symbols"
+ , "aliases": [
+ "fleur_de_lis"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🔱"
+ , "description": "trident emblem"
+ , "category": "Symbols"
+ , "aliases": [
+ "trident"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "📛"
+ , "description": "name badge"
+ , "category": "Symbols"
+ , "aliases": [
+ "name_badge"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔰"
+ , "description": "Japanese symbol for beginner"
+ , "category": "Symbols"
+ , "aliases": [
+ "beginner"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⭕"
+ , "description": "hollow red circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "o"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "✅"
+ , "description": "check mark button"
+ , "category": "Symbols"
+ , "aliases": [
+ "white_check_mark"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "☑️"
+ , "description": "check box with check"
+ , "category": "Symbols"
+ , "aliases": [
+ "ballot_box_with_check"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "✔️"
+ , "description": "check mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "heavy_check_mark"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "✖️"
+ , "description": "multiplication sign"
+ , "category": "Symbols"
+ , "aliases": [
+ "heavy_multiplication_x"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❌"
+ , "description": "cross mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "x"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❎"
+ , "description": "cross mark button"
+ , "category": "Symbols"
+ , "aliases": [
+ "negative_squared_cross_mark"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "➕"
+ , "description": "plus sign"
+ , "category": "Symbols"
+ , "aliases": [
+ "heavy_plus_sign"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "➖"
+ , "description": "minus sign"
+ , "category": "Symbols"
+ , "aliases": [
+ "heavy_minus_sign"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "➗"
+ , "description": "division sign"
+ , "category": "Symbols"
+ , "aliases": [
+ "heavy_division_sign"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "➰"
+ , "description": "curly loop"
+ , "category": "Symbols"
+ , "aliases": [
+ "curly_loop"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "➿"
+ , "description": "double curly loop"
+ , "category": "Symbols"
+ , "aliases": [
+ "loop"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "〽️"
+ , "description": "part alternation mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "part_alternation_mark"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "3.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "✳️"
+ , "description": "eight-spoked asterisk"
+ , "category": "Symbols"
+ , "aliases": [
+ "eight_spoked_asterisk"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "✴️"
+ , "description": "eight-pointed star"
+ , "category": "Symbols"
+ , "aliases": [
+ "eight_pointed_black_star"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❇️"
+ , "description": "sparkle"
+ , "category": "Symbols"
+ , "aliases": [
+ "sparkle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "‼️"
+ , "description": "double exclamation mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "bangbang"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⁉️"
+ , "description": "exclamation question mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "interrobang"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "3.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❓"
+ , "description": "question mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "question"
+ ]
+ , "tags": [
+ "confused"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❔"
+ , "description": "white question mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "grey_question"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❕"
+ , "description": "white exclamation mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "grey_exclamation"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "❗"
+ , "description": "exclamation mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "exclamation"
+ , "heavy_exclamation_mark"
+ ]
+ , "tags": [
+ "bang"
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "〰️"
+ , "description": "wavy dash"
+ , "category": "Symbols"
+ , "aliases": [
+ "wavy_dash"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "©️"
+ , "description": "copyright"
+ , "category": "Symbols"
+ , "aliases": [
+ "copyright"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "®️"
+ , "description": "registered"
+ , "category": "Symbols"
+ , "aliases": [
+ "registered"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "™️"
+ , "description": "trade mark"
+ , "category": "Symbols"
+ , "aliases": [
+ "tm"
+ ]
+ , "tags": [
+ "trademark"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "#️⃣"
+ , "description": "keycap: #"
+ , "category": "Symbols"
+ , "aliases": [
+ "hash"
+ ]
+ , "tags": [
+ "number"
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "*️⃣"
+ , "description": "keycap: *"
+ , "category": "Symbols"
+ , "aliases": [
+ "asterisk"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "0️⃣"
+ , "description": "keycap: 0"
+ , "category": "Symbols"
+ , "aliases": [
+ "zero"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "1️⃣"
+ , "description": "keycap: 1"
+ , "category": "Symbols"
+ , "aliases": [
+ "one"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "2️⃣"
+ , "description": "keycap: 2"
+ , "category": "Symbols"
+ , "aliases": [
+ "two"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "3️⃣"
+ , "description": "keycap: 3"
+ , "category": "Symbols"
+ , "aliases": [
+ "three"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "4️⃣"
+ , "description": "keycap: 4"
+ , "category": "Symbols"
+ , "aliases": [
+ "four"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "5️⃣"
+ , "description": "keycap: 5"
+ , "category": "Symbols"
+ , "aliases": [
+ "five"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "6️⃣"
+ , "description": "keycap: 6"
+ , "category": "Symbols"
+ , "aliases": [
+ "six"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "7️⃣"
+ , "description": "keycap: 7"
+ , "category": "Symbols"
+ , "aliases": [
+ "seven"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "8️⃣"
+ , "description": "keycap: 8"
+ , "category": "Symbols"
+ , "aliases": [
+ "eight"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "9️⃣"
+ , "description": "keycap: 9"
+ , "category": "Symbols"
+ , "aliases": [
+ "nine"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔟"
+ , "description": "keycap: 10"
+ , "category": "Symbols"
+ , "aliases": [
+ "keycap_ten"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔠"
+ , "description": "input latin uppercase"
+ , "category": "Symbols"
+ , "aliases": [
+ "capital_abcd"
+ ]
+ , "tags": [
+ "letters"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔡"
+ , "description": "input latin lowercase"
+ , "category": "Symbols"
+ , "aliases": [
+ "abcd"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔢"
+ , "description": "input numbers"
+ , "category": "Symbols"
+ , "aliases": [
+ "1234"
+ ]
+ , "tags": [
+ "numbers"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔣"
+ , "description": "input symbols"
+ , "category": "Symbols"
+ , "aliases": [
+ "symbols"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔤"
+ , "description": "input latin letters"
+ , "category": "Symbols"
+ , "aliases": [
+ "abc"
+ ]
+ , "tags": [
+ "alphabet"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🅰️"
+ , "description": "A button (blood type)"
+ , "category": "Symbols"
+ , "aliases": [
+ "a"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆎"
+ , "description": "AB button (blood type)"
+ , "category": "Symbols"
+ , "aliases": [
+ "ab"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🅱️"
+ , "description": "B button (blood type)"
+ , "category": "Symbols"
+ , "aliases": [
+ "b"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆑"
+ , "description": "CL button"
+ , "category": "Symbols"
+ , "aliases": [
+ "cl"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆒"
+ , "description": "COOL button"
+ , "category": "Symbols"
+ , "aliases": [
+ "cool"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆓"
+ , "description": "FREE button"
+ , "category": "Symbols"
+ , "aliases": [
+ "free"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "ℹ️"
+ , "description": "information"
+ , "category": "Symbols"
+ , "aliases": [
+ "information_source"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "3.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆔"
+ , "description": "ID button"
+ , "category": "Symbols"
+ , "aliases": [
+ "id"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "Ⓜ️"
+ , "description": "circled M"
+ , "category": "Symbols"
+ , "aliases": [
+ "m"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆕"
+ , "description": "NEW button"
+ , "category": "Symbols"
+ , "aliases": [
+ "new"
+ ]
+ , "tags": [
+ "fresh"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆖"
+ , "description": "NG button"
+ , "category": "Symbols"
+ , "aliases": [
+ "ng"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🅾️"
+ , "description": "O button (blood type)"
+ , "category": "Symbols"
+ , "aliases": [
+ "o2"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆗"
+ , "description": "OK button"
+ , "category": "Symbols"
+ , "aliases": [
+ "ok"
+ ]
+ , "tags": [
+ "yes"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🅿️"
+ , "description": "P button"
+ , "category": "Symbols"
+ , "aliases": [
+ "parking"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆘"
+ , "description": "SOS button"
+ , "category": "Symbols"
+ , "aliases": [
+ "sos"
+ ]
+ , "tags": [
+ "help"
+ , "emergency"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆙"
+ , "description": "UP! button"
+ , "category": "Symbols"
+ , "aliases": [
+ "up"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🆚"
+ , "description": "VS button"
+ , "category": "Symbols"
+ , "aliases": [
+ "vs"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈁"
+ , "description": "Japanese “here” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "koko"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈂️"
+ , "description": "Japanese “service charge” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "sa"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈷️"
+ , "description": "Japanese “monthly amount” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u6708"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈶"
+ , "description": "Japanese “not free of charge” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u6709"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈯"
+ , "description": "Japanese “reserved” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u6307"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🉐"
+ , "description": "Japanese “bargain” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "ideograph_advantage"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈹"
+ , "description": "Japanese “discount” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u5272"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈚"
+ , "description": "Japanese “free of charge” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u7121"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈲"
+ , "description": "Japanese “prohibited” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u7981"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🉑"
+ , "description": "Japanese “acceptable” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "accept"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈸"
+ , "description": "Japanese “application” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u7533"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈴"
+ , "description": "Japanese “passing grade” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u5408"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈳"
+ , "description": "Japanese “vacancy” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u7a7a"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "㊗️"
+ , "description": "Japanese “congratulations” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "congratulations"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "㊙️"
+ , "description": "Japanese “secret” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "secret"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈺"
+ , "description": "Japanese “open for business” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u55b6"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🈵"
+ , "description": "Japanese “no vacancy” button"
+ , "category": "Symbols"
+ , "aliases": [
+ "u6e80"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔴"
+ , "description": "red circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "red_circle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🟠"
+ , "description": "orange circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "orange_circle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🟡"
+ , "description": "yellow circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "yellow_circle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🟢"
+ , "description": "green circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "green_circle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🔵"
+ , "description": "blue circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "large_blue_circle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🟣"
+ , "description": "purple circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "purple_circle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🟤"
+ , "description": "brown circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "brown_circle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "⚫"
+ , "description": "black circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "black_circle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⚪"
+ , "description": "white circle"
+ , "category": "Symbols"
+ , "aliases": [
+ "white_circle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "4.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🟥"
+ , "description": "red square"
+ , "category": "Symbols"
+ , "aliases": [
+ "red_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🟧"
+ , "description": "orange square"
+ , "category": "Symbols"
+ , "aliases": [
+ "orange_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🟨"
+ , "description": "yellow square"
+ , "category": "Symbols"
+ , "aliases": [
+ "yellow_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🟩"
+ , "description": "green square"
+ , "category": "Symbols"
+ , "aliases": [
+ "green_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🟦"
+ , "description": "blue square"
+ , "category": "Symbols"
+ , "aliases": [
+ "blue_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🟪"
+ , "description": "purple square"
+ , "category": "Symbols"
+ , "aliases": [
+ "purple_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "🟫"
+ , "description": "brown square"
+ , "category": "Symbols"
+ , "aliases": [
+ "brown_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "12.0"
+ , "ios_version": "13.0"
+ }
+, {
+ "emoji": "⬛"
+ , "description": "black large square"
+ , "category": "Symbols"
+ , "aliases": [
+ "black_large_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "⬜"
+ , "description": "white large square"
+ , "category": "Symbols"
+ , "aliases": [
+ "white_large_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "5.1"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "◼️"
+ , "description": "black medium square"
+ , "category": "Symbols"
+ , "aliases": [
+ "black_medium_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "3.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "◻️"
+ , "description": "white medium square"
+ , "category": "Symbols"
+ , "aliases": [
+ "white_medium_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "3.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "◾"
+ , "description": "black medium-small square"
+ , "category": "Symbols"
+ , "aliases": [
+ "black_medium_small_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "3.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "◽"
+ , "description": "white medium-small square"
+ , "category": "Symbols"
+ , "aliases": [
+ "white_medium_small_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "3.2"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "▪️"
+ , "description": "black small square"
+ , "category": "Symbols"
+ , "aliases": [
+ "black_small_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "▫️"
+ , "description": "white small square"
+ , "category": "Symbols"
+ , "aliases": [
+ "white_small_square"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": ""
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔶"
+ , "description": "large orange diamond"
+ , "category": "Symbols"
+ , "aliases": [
+ "large_orange_diamond"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔷"
+ , "description": "large blue diamond"
+ , "category": "Symbols"
+ , "aliases": [
+ "large_blue_diamond"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔸"
+ , "description": "small orange diamond"
+ , "category": "Symbols"
+ , "aliases": [
+ "small_orange_diamond"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔹"
+ , "description": "small blue diamond"
+ , "category": "Symbols"
+ , "aliases": [
+ "small_blue_diamond"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔺"
+ , "description": "red triangle pointed up"
+ , "category": "Symbols"
+ , "aliases": [
+ "small_red_triangle"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔻"
+ , "description": "red triangle pointed down"
+ , "category": "Symbols"
+ , "aliases": [
+ "small_red_triangle_down"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "💠"
+ , "description": "diamond with a dot"
+ , "category": "Symbols"
+ , "aliases": [
+ "diamond_shape_with_a_dot_inside"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔘"
+ , "description": "radio button"
+ , "category": "Symbols"
+ , "aliases": [
+ "radio_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔳"
+ , "description": "white square button"
+ , "category": "Symbols"
+ , "aliases": [
+ "white_square_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🔲"
+ , "description": "black square button"
+ , "category": "Symbols"
+ , "aliases": [
+ "black_square_button"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏁"
+ , "description": "chequered flag"
+ , "category": "Flags"
+ , "aliases": [
+ "checkered_flag"
+ ]
+ , "tags": [
+ "milestone"
+ , "finish"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🚩"
+ , "description": "triangular flag"
+ , "category": "Flags"
+ , "aliases": [
+ "triangular_flag_on_post"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🎌"
+ , "description": "crossed flags"
+ , "category": "Flags"
+ , "aliases": [
+ "crossed_flags"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🏴"
+ , "description": "black flag"
+ , "category": "Flags"
+ , "aliases": [
+ "black_flag"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏳"
+ , "description": "white flag"
+ , "category": "Flags"
+ , "aliases": [
+ "white_flag"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "7.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🏳️🌈"
+ , "description": "rainbow flag"
+ , "category": "Flags"
+ , "aliases": [
+ "rainbow_flag"
+ ]
+ , "tags": [
+ "pride"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "10.0"
+ }
+, {
+ "emoji": "🏴☠"
+ , "description": "pirate flag"
+ , "category": "Flags"
+ , "aliases": [
+ "pirate_flag"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇦🇨"
+ , "description": "flag: Ascension Island"
+ , "category": "Flags"
+ , "aliases": [
+ "ascension_island"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇦🇩"
+ , "description": "flag: Andorra"
+ , "category": "Flags"
+ , "aliases": [
+ "andorra"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇪"
+ , "description": "flag: United Arab Emirates"
+ , "category": "Flags"
+ , "aliases": [
+ "united_arab_emirates"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇫"
+ , "description": "flag: Afghanistan"
+ , "category": "Flags"
+ , "aliases": [
+ "afghanistan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇬"
+ , "description": "flag: Antigua & Barbuda"
+ , "category": "Flags"
+ , "aliases": [
+ "antigua_barbuda"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇮"
+ , "description": "flag: Anguilla"
+ , "category": "Flags"
+ , "aliases": [
+ "anguilla"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇱"
+ , "description": "flag: Albania"
+ , "category": "Flags"
+ , "aliases": [
+ "albania"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇲"
+ , "description": "flag: Armenia"
+ , "category": "Flags"
+ , "aliases": [
+ "armenia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇴"
+ , "description": "flag: Angola"
+ , "category": "Flags"
+ , "aliases": [
+ "angola"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇶"
+ , "description": "flag: Antarctica"
+ , "category": "Flags"
+ , "aliases": [
+ "antarctica"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇦🇷"
+ , "description": "flag: Argentina"
+ , "category": "Flags"
+ , "aliases": [
+ "argentina"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇸"
+ , "description": "flag: American Samoa"
+ , "category": "Flags"
+ , "aliases": [
+ "american_samoa"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇹"
+ , "description": "flag: Austria"
+ , "category": "Flags"
+ , "aliases": [
+ "austria"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇺"
+ , "description": "flag: Australia"
+ , "category": "Flags"
+ , "aliases": [
+ "australia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇼"
+ , "description": "flag: Aruba"
+ , "category": "Flags"
+ , "aliases": [
+ "aruba"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇦🇽"
+ , "description": "flag: Åland Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "aland_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇦🇿"
+ , "description": "flag: Azerbaijan"
+ , "category": "Flags"
+ , "aliases": [
+ "azerbaijan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇦"
+ , "description": "flag: Bosnia & Herzegovina"
+ , "category": "Flags"
+ , "aliases": [
+ "bosnia_herzegovina"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇧"
+ , "description": "flag: Barbados"
+ , "category": "Flags"
+ , "aliases": [
+ "barbados"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇩"
+ , "description": "flag: Bangladesh"
+ , "category": "Flags"
+ , "aliases": [
+ "bangladesh"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇪"
+ , "description": "flag: Belgium"
+ , "category": "Flags"
+ , "aliases": [
+ "belgium"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇫"
+ , "description": "flag: Burkina Faso"
+ , "category": "Flags"
+ , "aliases": [
+ "burkina_faso"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇬"
+ , "description": "flag: Bulgaria"
+ , "category": "Flags"
+ , "aliases": [
+ "bulgaria"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇭"
+ , "description": "flag: Bahrain"
+ , "category": "Flags"
+ , "aliases": [
+ "bahrain"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇮"
+ , "description": "flag: Burundi"
+ , "category": "Flags"
+ , "aliases": [
+ "burundi"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇯"
+ , "description": "flag: Benin"
+ , "category": "Flags"
+ , "aliases": [
+ "benin"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇱"
+ , "description": "flag: St. Barthélemy"
+ , "category": "Flags"
+ , "aliases": [
+ "st_barthelemy"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇧🇲"
+ , "description": "flag: Bermuda"
+ , "category": "Flags"
+ , "aliases": [
+ "bermuda"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇳"
+ , "description": "flag: Brunei"
+ , "category": "Flags"
+ , "aliases": [
+ "brunei"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇴"
+ , "description": "flag: Bolivia"
+ , "category": "Flags"
+ , "aliases": [
+ "bolivia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇶"
+ , "description": "flag: Caribbean Netherlands"
+ , "category": "Flags"
+ , "aliases": [
+ "caribbean_netherlands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇧🇷"
+ , "description": "flag: Brazil"
+ , "category": "Flags"
+ , "aliases": [
+ "brazil"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇸"
+ , "description": "flag: Bahamas"
+ , "category": "Flags"
+ , "aliases": [
+ "bahamas"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇹"
+ , "description": "flag: Bhutan"
+ , "category": "Flags"
+ , "aliases": [
+ "bhutan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇻"
+ , "description": "flag: Bouvet Island"
+ , "category": "Flags"
+ , "aliases": [
+ "bouvet_island"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇧🇼"
+ , "description": "flag: Botswana"
+ , "category": "Flags"
+ , "aliases": [
+ "botswana"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇾"
+ , "description": "flag: Belarus"
+ , "category": "Flags"
+ , "aliases": [
+ "belarus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇧🇿"
+ , "description": "flag: Belize"
+ , "category": "Flags"
+ , "aliases": [
+ "belize"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇦"
+ , "description": "flag: Canada"
+ , "category": "Flags"
+ , "aliases": [
+ "canada"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇨"
+ , "description": "flag: Cocos (Keeling) Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "cocos_islands"
+ ]
+ , "tags": [
+ "keeling"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇨🇩"
+ , "description": "flag: Congo - Kinshasa"
+ , "category": "Flags"
+ , "aliases": [
+ "congo_kinshasa"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇫"
+ , "description": "flag: Central African Republic"
+ , "category": "Flags"
+ , "aliases": [
+ "central_african_republic"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇬"
+ , "description": "flag: Congo - Brazzaville"
+ , "category": "Flags"
+ , "aliases": [
+ "congo_brazzaville"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇭"
+ , "description": "flag: Switzerland"
+ , "category": "Flags"
+ , "aliases": [
+ "switzerland"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇮"
+ , "description": "flag: Côte d’Ivoire"
+ , "category": "Flags"
+ , "aliases": [
+ "cote_divoire"
+ ]
+ , "tags": [
+ "ivory"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇰"
+ , "description": "flag: Cook Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "cook_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇱"
+ , "description": "flag: Chile"
+ , "category": "Flags"
+ , "aliases": [
+ "chile"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇲"
+ , "description": "flag: Cameroon"
+ , "category": "Flags"
+ , "aliases": [
+ "cameroon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇳"
+ , "description": "flag: China"
+ , "category": "Flags"
+ , "aliases": [
+ "cn"
+ ]
+ , "tags": [
+ "china"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇨🇴"
+ , "description": "flag: Colombia"
+ , "category": "Flags"
+ , "aliases": [
+ "colombia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇵"
+ , "description": "flag: Clipperton Island"
+ , "category": "Flags"
+ , "aliases": [
+ "clipperton_island"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇨🇷"
+ , "description": "flag: Costa Rica"
+ , "category": "Flags"
+ , "aliases": [
+ "costa_rica"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇺"
+ , "description": "flag: Cuba"
+ , "category": "Flags"
+ , "aliases": [
+ "cuba"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇻"
+ , "description": "flag: Cape Verde"
+ , "category": "Flags"
+ , "aliases": [
+ "cape_verde"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇼"
+ , "description": "flag: Curaçao"
+ , "category": "Flags"
+ , "aliases": [
+ "curacao"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇽"
+ , "description": "flag: Christmas Island"
+ , "category": "Flags"
+ , "aliases": [
+ "christmas_island"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇨🇾"
+ , "description": "flag: Cyprus"
+ , "category": "Flags"
+ , "aliases": [
+ "cyprus"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇨🇿"
+ , "description": "flag: Czechia"
+ , "category": "Flags"
+ , "aliases": [
+ "czech_republic"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇩🇪"
+ , "description": "flag: Germany"
+ , "category": "Flags"
+ , "aliases": [
+ "de"
+ ]
+ , "tags": [
+ "flag"
+ , "germany"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇩🇬"
+ , "description": "flag: Diego Garcia"
+ , "category": "Flags"
+ , "aliases": [
+ "diego_garcia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇩🇯"
+ , "description": "flag: Djibouti"
+ , "category": "Flags"
+ , "aliases": [
+ "djibouti"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇩🇰"
+ , "description": "flag: Denmark"
+ , "category": "Flags"
+ , "aliases": [
+ "denmark"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇩🇲"
+ , "description": "flag: Dominica"
+ , "category": "Flags"
+ , "aliases": [
+ "dominica"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇩🇴"
+ , "description": "flag: Dominican Republic"
+ , "category": "Flags"
+ , "aliases": [
+ "dominican_republic"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇩🇿"
+ , "description": "flag: Algeria"
+ , "category": "Flags"
+ , "aliases": [
+ "algeria"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇪🇦"
+ , "description": "flag: Ceuta & Melilla"
+ , "category": "Flags"
+ , "aliases": [
+ "ceuta_melilla"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇪🇨"
+ , "description": "flag: Ecuador"
+ , "category": "Flags"
+ , "aliases": [
+ "ecuador"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇪🇪"
+ , "description": "flag: Estonia"
+ , "category": "Flags"
+ , "aliases": [
+ "estonia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇪🇬"
+ , "description": "flag: Egypt"
+ , "category": "Flags"
+ , "aliases": [
+ "egypt"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇪🇭"
+ , "description": "flag: Western Sahara"
+ , "category": "Flags"
+ , "aliases": [
+ "western_sahara"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇪🇷"
+ , "description": "flag: Eritrea"
+ , "category": "Flags"
+ , "aliases": [
+ "eritrea"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇪🇸"
+ , "description": "flag: Spain"
+ , "category": "Flags"
+ , "aliases": [
+ "es"
+ ]
+ , "tags": [
+ "spain"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇪🇹"
+ , "description": "flag: Ethiopia"
+ , "category": "Flags"
+ , "aliases": [
+ "ethiopia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇪🇺"
+ , "description": "flag: European Union"
+ , "category": "Flags"
+ , "aliases": [
+ "eu"
+ , "european_union"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇫🇮"
+ , "description": "flag: Finland"
+ , "category": "Flags"
+ , "aliases": [
+ "finland"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇫🇯"
+ , "description": "flag: Fiji"
+ , "category": "Flags"
+ , "aliases": [
+ "fiji"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇫🇰"
+ , "description": "flag: Falkland Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "falkland_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇫🇲"
+ , "description": "flag: Micronesia"
+ , "category": "Flags"
+ , "aliases": [
+ "micronesia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇫🇴"
+ , "description": "flag: Faroe Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "faroe_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇫🇷"
+ , "description": "flag: France"
+ , "category": "Flags"
+ , "aliases": [
+ "fr"
+ ]
+ , "tags": [
+ "france"
+ , "french"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇬🇦"
+ , "description": "flag: Gabon"
+ , "category": "Flags"
+ , "aliases": [
+ "gabon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇧"
+ , "description": "flag: United Kingdom"
+ , "category": "Flags"
+ , "aliases": [
+ "gb"
+ , "uk"
+ ]
+ , "tags": [
+ "flag"
+ , "british"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇬🇩"
+ , "description": "flag: Grenada"
+ , "category": "Flags"
+ , "aliases": [
+ "grenada"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇪"
+ , "description": "flag: Georgia"
+ , "category": "Flags"
+ , "aliases": [
+ "georgia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇫"
+ , "description": "flag: French Guiana"
+ , "category": "Flags"
+ , "aliases": [
+ "french_guiana"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇬"
+ , "description": "flag: Guernsey"
+ , "category": "Flags"
+ , "aliases": [
+ "guernsey"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇬🇭"
+ , "description": "flag: Ghana"
+ , "category": "Flags"
+ , "aliases": [
+ "ghana"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇮"
+ , "description": "flag: Gibraltar"
+ , "category": "Flags"
+ , "aliases": [
+ "gibraltar"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇱"
+ , "description": "flag: Greenland"
+ , "category": "Flags"
+ , "aliases": [
+ "greenland"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇬🇲"
+ , "description": "flag: Gambia"
+ , "category": "Flags"
+ , "aliases": [
+ "gambia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇳"
+ , "description": "flag: Guinea"
+ , "category": "Flags"
+ , "aliases": [
+ "guinea"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇵"
+ , "description": "flag: Guadeloupe"
+ , "category": "Flags"
+ , "aliases": [
+ "guadeloupe"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇬🇶"
+ , "description": "flag: Equatorial Guinea"
+ , "category": "Flags"
+ , "aliases": [
+ "equatorial_guinea"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇷"
+ , "description": "flag: Greece"
+ , "category": "Flags"
+ , "aliases": [
+ "greece"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇸"
+ , "description": "flag: South Georgia & South Sandwich Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "south_georgia_south_sandwich_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇬🇹"
+ , "description": "flag: Guatemala"
+ , "category": "Flags"
+ , "aliases": [
+ "guatemala"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇺"
+ , "description": "flag: Guam"
+ , "category": "Flags"
+ , "aliases": [
+ "guam"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇼"
+ , "description": "flag: Guinea-Bissau"
+ , "category": "Flags"
+ , "aliases": [
+ "guinea_bissau"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇬🇾"
+ , "description": "flag: Guyana"
+ , "category": "Flags"
+ , "aliases": [
+ "guyana"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇭🇰"
+ , "description": "flag: Hong Kong SAR China"
+ , "category": "Flags"
+ , "aliases": [
+ "hong_kong"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇭🇲"
+ , "description": "flag: Heard & McDonald Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "heard_mcdonald_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇭🇳"
+ , "description": "flag: Honduras"
+ , "category": "Flags"
+ , "aliases": [
+ "honduras"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇭🇷"
+ , "description": "flag: Croatia"
+ , "category": "Flags"
+ , "aliases": [
+ "croatia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇭🇹"
+ , "description": "flag: Haiti"
+ , "category": "Flags"
+ , "aliases": [
+ "haiti"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇭🇺"
+ , "description": "flag: Hungary"
+ , "category": "Flags"
+ , "aliases": [
+ "hungary"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇮🇨"
+ , "description": "flag: Canary Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "canary_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇮🇩"
+ , "description": "flag: Indonesia"
+ , "category": "Flags"
+ , "aliases": [
+ "indonesia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇮🇪"
+ , "description": "flag: Ireland"
+ , "category": "Flags"
+ , "aliases": [
+ "ireland"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇮🇱"
+ , "description": "flag: Israel"
+ , "category": "Flags"
+ , "aliases": [
+ "israel"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇮🇲"
+ , "description": "flag: Isle of Man"
+ , "category": "Flags"
+ , "aliases": [
+ "isle_of_man"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇮🇳"
+ , "description": "flag: India"
+ , "category": "Flags"
+ , "aliases": [
+ "india"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇮🇴"
+ , "description": "flag: British Indian Ocean Territory"
+ , "category": "Flags"
+ , "aliases": [
+ "british_indian_ocean_territory"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇮🇶"
+ , "description": "flag: Iraq"
+ , "category": "Flags"
+ , "aliases": [
+ "iraq"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇮🇷"
+ , "description": "flag: Iran"
+ , "category": "Flags"
+ , "aliases": [
+ "iran"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇮🇸"
+ , "description": "flag: Iceland"
+ , "category": "Flags"
+ , "aliases": [
+ "iceland"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇮🇹"
+ , "description": "flag: Italy"
+ , "category": "Flags"
+ , "aliases": [
+ "it"
+ ]
+ , "tags": [
+ "italy"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇯🇪"
+ , "description": "flag: Jersey"
+ , "category": "Flags"
+ , "aliases": [
+ "jersey"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇯🇲"
+ , "description": "flag: Jamaica"
+ , "category": "Flags"
+ , "aliases": [
+ "jamaica"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇯🇴"
+ , "description": "flag: Jordan"
+ , "category": "Flags"
+ , "aliases": [
+ "jordan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇯🇵"
+ , "description": "flag: Japan"
+ , "category": "Flags"
+ , "aliases": [
+ "jp"
+ ]
+ , "tags": [
+ "japan"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇰🇪"
+ , "description": "flag: Kenya"
+ , "category": "Flags"
+ , "aliases": [
+ "kenya"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇰🇬"
+ , "description": "flag: Kyrgyzstan"
+ , "category": "Flags"
+ , "aliases": [
+ "kyrgyzstan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇰🇭"
+ , "description": "flag: Cambodia"
+ , "category": "Flags"
+ , "aliases": [
+ "cambodia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇰🇮"
+ , "description": "flag: Kiribati"
+ , "category": "Flags"
+ , "aliases": [
+ "kiribati"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇰🇲"
+ , "description": "flag: Comoros"
+ , "category": "Flags"
+ , "aliases": [
+ "comoros"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇰🇳"
+ , "description": "flag: St. Kitts & Nevis"
+ , "category": "Flags"
+ , "aliases": [
+ "st_kitts_nevis"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇰🇵"
+ , "description": "flag: North Korea"
+ , "category": "Flags"
+ , "aliases": [
+ "north_korea"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇰🇷"
+ , "description": "flag: South Korea"
+ , "category": "Flags"
+ , "aliases": [
+ "kr"
+ ]
+ , "tags": [
+ "korea"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇰🇼"
+ , "description": "flag: Kuwait"
+ , "category": "Flags"
+ , "aliases": [
+ "kuwait"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇰🇾"
+ , "description": "flag: Cayman Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "cayman_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇰🇿"
+ , "description": "flag: Kazakhstan"
+ , "category": "Flags"
+ , "aliases": [
+ "kazakhstan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇦"
+ , "description": "flag: Laos"
+ , "category": "Flags"
+ , "aliases": [
+ "laos"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇧"
+ , "description": "flag: Lebanon"
+ , "category": "Flags"
+ , "aliases": [
+ "lebanon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇨"
+ , "description": "flag: St. Lucia"
+ , "category": "Flags"
+ , "aliases": [
+ "st_lucia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇮"
+ , "description": "flag: Liechtenstein"
+ , "category": "Flags"
+ , "aliases": [
+ "liechtenstein"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇰"
+ , "description": "flag: Sri Lanka"
+ , "category": "Flags"
+ , "aliases": [
+ "sri_lanka"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇷"
+ , "description": "flag: Liberia"
+ , "category": "Flags"
+ , "aliases": [
+ "liberia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇸"
+ , "description": "flag: Lesotho"
+ , "category": "Flags"
+ , "aliases": [
+ "lesotho"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇹"
+ , "description": "flag: Lithuania"
+ , "category": "Flags"
+ , "aliases": [
+ "lithuania"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇺"
+ , "description": "flag: Luxembourg"
+ , "category": "Flags"
+ , "aliases": [
+ "luxembourg"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇻"
+ , "description": "flag: Latvia"
+ , "category": "Flags"
+ , "aliases": [
+ "latvia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇱🇾"
+ , "description": "flag: Libya"
+ , "category": "Flags"
+ , "aliases": [
+ "libya"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇦"
+ , "description": "flag: Morocco"
+ , "category": "Flags"
+ , "aliases": [
+ "morocco"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇨"
+ , "description": "flag: Monaco"
+ , "category": "Flags"
+ , "aliases": [
+ "monaco"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇲🇩"
+ , "description": "flag: Moldova"
+ , "category": "Flags"
+ , "aliases": [
+ "moldova"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇪"
+ , "description": "flag: Montenegro"
+ , "category": "Flags"
+ , "aliases": [
+ "montenegro"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇫"
+ , "description": "flag: St. Martin"
+ , "category": "Flags"
+ , "aliases": [
+ "st_martin"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇲🇬"
+ , "description": "flag: Madagascar"
+ , "category": "Flags"
+ , "aliases": [
+ "madagascar"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇭"
+ , "description": "flag: Marshall Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "marshall_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇲🇰"
+ , "description": "flag: Macedonia"
+ , "category": "Flags"
+ , "aliases": [
+ "macedonia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇱"
+ , "description": "flag: Mali"
+ , "category": "Flags"
+ , "aliases": [
+ "mali"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇲"
+ , "description": "flag: Myanmar (Burma)"
+ , "category": "Flags"
+ , "aliases": [
+ "myanmar"
+ ]
+ , "tags": [
+ "burma"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇳"
+ , "description": "flag: Mongolia"
+ , "category": "Flags"
+ , "aliases": [
+ "mongolia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇴"
+ , "description": "flag: Macao SAR China"
+ , "category": "Flags"
+ , "aliases": [
+ "macau"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇵"
+ , "description": "flag: Northern Mariana Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "northern_mariana_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇶"
+ , "description": "flag: Martinique"
+ , "category": "Flags"
+ , "aliases": [
+ "martinique"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇲🇷"
+ , "description": "flag: Mauritania"
+ , "category": "Flags"
+ , "aliases": [
+ "mauritania"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇸"
+ , "description": "flag: Montserrat"
+ , "category": "Flags"
+ , "aliases": [
+ "montserrat"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇹"
+ , "description": "flag: Malta"
+ , "category": "Flags"
+ , "aliases": [
+ "malta"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇺"
+ , "description": "flag: Mauritius"
+ , "category": "Flags"
+ , "aliases": [
+ "mauritius"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇲🇻"
+ , "description": "flag: Maldives"
+ , "category": "Flags"
+ , "aliases": [
+ "maldives"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇼"
+ , "description": "flag: Malawi"
+ , "category": "Flags"
+ , "aliases": [
+ "malawi"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇽"
+ , "description": "flag: Mexico"
+ , "category": "Flags"
+ , "aliases": [
+ "mexico"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇾"
+ , "description": "flag: Malaysia"
+ , "category": "Flags"
+ , "aliases": [
+ "malaysia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇲🇿"
+ , "description": "flag: Mozambique"
+ , "category": "Flags"
+ , "aliases": [
+ "mozambique"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇦"
+ , "description": "flag: Namibia"
+ , "category": "Flags"
+ , "aliases": [
+ "namibia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇨"
+ , "description": "flag: New Caledonia"
+ , "category": "Flags"
+ , "aliases": [
+ "new_caledonia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇪"
+ , "description": "flag: Niger"
+ , "category": "Flags"
+ , "aliases": [
+ "niger"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇫"
+ , "description": "flag: Norfolk Island"
+ , "category": "Flags"
+ , "aliases": [
+ "norfolk_island"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇳🇬"
+ , "description": "flag: Nigeria"
+ , "category": "Flags"
+ , "aliases": [
+ "nigeria"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇮"
+ , "description": "flag: Nicaragua"
+ , "category": "Flags"
+ , "aliases": [
+ "nicaragua"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇱"
+ , "description": "flag: Netherlands"
+ , "category": "Flags"
+ , "aliases": [
+ "netherlands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇴"
+ , "description": "flag: Norway"
+ , "category": "Flags"
+ , "aliases": [
+ "norway"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇵"
+ , "description": "flag: Nepal"
+ , "category": "Flags"
+ , "aliases": [
+ "nepal"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇷"
+ , "description": "flag: Nauru"
+ , "category": "Flags"
+ , "aliases": [
+ "nauru"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇳🇺"
+ , "description": "flag: Niue"
+ , "category": "Flags"
+ , "aliases": [
+ "niue"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇳🇿"
+ , "description": "flag: New Zealand"
+ , "category": "Flags"
+ , "aliases": [
+ "new_zealand"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇴🇲"
+ , "description": "flag: Oman"
+ , "category": "Flags"
+ , "aliases": [
+ "oman"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇦"
+ , "description": "flag: Panama"
+ , "category": "Flags"
+ , "aliases": [
+ "panama"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇪"
+ , "description": "flag: Peru"
+ , "category": "Flags"
+ , "aliases": [
+ "peru"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇫"
+ , "description": "flag: French Polynesia"
+ , "category": "Flags"
+ , "aliases": [
+ "french_polynesia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇵🇬"
+ , "description": "flag: Papua New Guinea"
+ , "category": "Flags"
+ , "aliases": [
+ "papua_new_guinea"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇭"
+ , "description": "flag: Philippines"
+ , "category": "Flags"
+ , "aliases": [
+ "philippines"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇰"
+ , "description": "flag: Pakistan"
+ , "category": "Flags"
+ , "aliases": [
+ "pakistan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇱"
+ , "description": "flag: Poland"
+ , "category": "Flags"
+ , "aliases": [
+ "poland"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇲"
+ , "description": "flag: St. Pierre & Miquelon"
+ , "category": "Flags"
+ , "aliases": [
+ "st_pierre_miquelon"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇵🇳"
+ , "description": "flag: Pitcairn Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "pitcairn_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇵🇷"
+ , "description": "flag: Puerto Rico"
+ , "category": "Flags"
+ , "aliases": [
+ "puerto_rico"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇸"
+ , "description": "flag: Palestinian Territories"
+ , "category": "Flags"
+ , "aliases": [
+ "palestinian_territories"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇹"
+ , "description": "flag: Portugal"
+ , "category": "Flags"
+ , "aliases": [
+ "portugal"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇼"
+ , "description": "flag: Palau"
+ , "category": "Flags"
+ , "aliases": [
+ "palau"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇵🇾"
+ , "description": "flag: Paraguay"
+ , "category": "Flags"
+ , "aliases": [
+ "paraguay"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇶🇦"
+ , "description": "flag: Qatar"
+ , "category": "Flags"
+ , "aliases": [
+ "qatar"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇷🇪"
+ , "description": "flag: Réunion"
+ , "category": "Flags"
+ , "aliases": [
+ "reunion"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇷🇴"
+ , "description": "flag: Romania"
+ , "category": "Flags"
+ , "aliases": [
+ "romania"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇷🇸"
+ , "description": "flag: Serbia"
+ , "category": "Flags"
+ , "aliases": [
+ "serbia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇷🇺"
+ , "description": "flag: Russia"
+ , "category": "Flags"
+ , "aliases": [
+ "ru"
+ ]
+ , "tags": [
+ "russia"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇷🇼"
+ , "description": "flag: Rwanda"
+ , "category": "Flags"
+ , "aliases": [
+ "rwanda"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇦"
+ , "description": "flag: Saudi Arabia"
+ , "category": "Flags"
+ , "aliases": [
+ "saudi_arabia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇧"
+ , "description": "flag: Solomon Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "solomon_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇨"
+ , "description": "flag: Seychelles"
+ , "category": "Flags"
+ , "aliases": [
+ "seychelles"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇩"
+ , "description": "flag: Sudan"
+ , "category": "Flags"
+ , "aliases": [
+ "sudan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇪"
+ , "description": "flag: Sweden"
+ , "category": "Flags"
+ , "aliases": [
+ "sweden"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇬"
+ , "description": "flag: Singapore"
+ , "category": "Flags"
+ , "aliases": [
+ "singapore"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇭"
+ , "description": "flag: St. Helena"
+ , "category": "Flags"
+ , "aliases": [
+ "st_helena"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇸🇮"
+ , "description": "flag: Slovenia"
+ , "category": "Flags"
+ , "aliases": [
+ "slovenia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇯"
+ , "description": "flag: Svalbard & Jan Mayen"
+ , "category": "Flags"
+ , "aliases": [
+ "svalbard_jan_mayen"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇸🇰"
+ , "description": "flag: Slovakia"
+ , "category": "Flags"
+ , "aliases": [
+ "slovakia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇱"
+ , "description": "flag: Sierra Leone"
+ , "category": "Flags"
+ , "aliases": [
+ "sierra_leone"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇲"
+ , "description": "flag: San Marino"
+ , "category": "Flags"
+ , "aliases": [
+ "san_marino"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇳"
+ , "description": "flag: Senegal"
+ , "category": "Flags"
+ , "aliases": [
+ "senegal"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇴"
+ , "description": "flag: Somalia"
+ , "category": "Flags"
+ , "aliases": [
+ "somalia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇷"
+ , "description": "flag: Suriname"
+ , "category": "Flags"
+ , "aliases": [
+ "suriname"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇸"
+ , "description": "flag: South Sudan"
+ , "category": "Flags"
+ , "aliases": [
+ "south_sudan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇹"
+ , "description": "flag: São Tomé & Príncipe"
+ , "category": "Flags"
+ , "aliases": [
+ "sao_tome_principe"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇻"
+ , "description": "flag: El Salvador"
+ , "category": "Flags"
+ , "aliases": [
+ "el_salvador"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇽"
+ , "description": "flag: Sint Maarten"
+ , "category": "Flags"
+ , "aliases": [
+ "sint_maarten"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇾"
+ , "description": "flag: Syria"
+ , "category": "Flags"
+ , "aliases": [
+ "syria"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇸🇿"
+ , "description": "flag: Eswatini"
+ , "category": "Flags"
+ , "aliases": [
+ "swaziland"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇦"
+ , "description": "flag: Tristan da Cunha"
+ , "category": "Flags"
+ , "aliases": [
+ "tristan_da_cunha"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇹🇨"
+ , "description": "flag: Turks & Caicos Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "turks_caicos_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇩"
+ , "description": "flag: Chad"
+ , "category": "Flags"
+ , "aliases": [
+ "chad"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇹🇫"
+ , "description": "flag: French Southern Territories"
+ , "category": "Flags"
+ , "aliases": [
+ "french_southern_territories"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇬"
+ , "description": "flag: Togo"
+ , "category": "Flags"
+ , "aliases": [
+ "togo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇭"
+ , "description": "flag: Thailand"
+ , "category": "Flags"
+ , "aliases": [
+ "thailand"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇯"
+ , "description": "flag: Tajikistan"
+ , "category": "Flags"
+ , "aliases": [
+ "tajikistan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇰"
+ , "description": "flag: Tokelau"
+ , "category": "Flags"
+ , "aliases": [
+ "tokelau"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇹🇱"
+ , "description": "flag: Timor-Leste"
+ , "category": "Flags"
+ , "aliases": [
+ "timor_leste"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇲"
+ , "description": "flag: Turkmenistan"
+ , "category": "Flags"
+ , "aliases": [
+ "turkmenistan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇳"
+ , "description": "flag: Tunisia"
+ , "category": "Flags"
+ , "aliases": [
+ "tunisia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇴"
+ , "description": "flag: Tonga"
+ , "category": "Flags"
+ , "aliases": [
+ "tonga"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇷"
+ , "description": "flag: Turkey"
+ , "category": "Flags"
+ , "aliases": [
+ "tr"
+ ]
+ , "tags": [
+ "turkey"
+ ]
+ , "unicode_version": "8.0"
+ , "ios_version": "9.1"
+ }
+, {
+ "emoji": "🇹🇹"
+ , "description": "flag: Trinidad & Tobago"
+ , "category": "Flags"
+ , "aliases": [
+ "trinidad_tobago"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇻"
+ , "description": "flag: Tuvalu"
+ , "category": "Flags"
+ , "aliases": [
+ "tuvalu"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇹🇼"
+ , "description": "flag: Taiwan"
+ , "category": "Flags"
+ , "aliases": [
+ "taiwan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇹🇿"
+ , "description": "flag: Tanzania"
+ , "category": "Flags"
+ , "aliases": [
+ "tanzania"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇺🇦"
+ , "description": "flag: Ukraine"
+ , "category": "Flags"
+ , "aliases": [
+ "ukraine"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇺🇬"
+ , "description": "flag: Uganda"
+ , "category": "Flags"
+ , "aliases": [
+ "uganda"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇺🇲"
+ , "description": "flag: U.S. Outlying Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "us_outlying_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇺🇳"
+ , "description": "flag: United Nations"
+ , "category": "Flags"
+ , "aliases": [
+ "united_nations"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🇺🇸"
+ , "description": "flag: United States"
+ , "category": "Flags"
+ , "aliases": [
+ "us"
+ ]
+ , "tags": [
+ "flag"
+ , "united"
+ , "america"
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "6.0"
+ }
+, {
+ "emoji": "🇺🇾"
+ , "description": "flag: Uruguay"
+ , "category": "Flags"
+ , "aliases": [
+ "uruguay"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇺🇿"
+ , "description": "flag: Uzbekistan"
+ , "category": "Flags"
+ , "aliases": [
+ "uzbekistan"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇻🇦"
+ , "description": "flag: Vatican City"
+ , "category": "Flags"
+ , "aliases": [
+ "vatican_city"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇻🇨"
+ , "description": "flag: St. Vincent & Grenadines"
+ , "category": "Flags"
+ , "aliases": [
+ "st_vincent_grenadines"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇻🇪"
+ , "description": "flag: Venezuela"
+ , "category": "Flags"
+ , "aliases": [
+ "venezuela"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇻🇬"
+ , "description": "flag: British Virgin Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "british_virgin_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇻🇮"
+ , "description": "flag: U.S. Virgin Islands"
+ , "category": "Flags"
+ , "aliases": [
+ "us_virgin_islands"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇻🇳"
+ , "description": "flag: Vietnam"
+ , "category": "Flags"
+ , "aliases": [
+ "vietnam"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇻🇺"
+ , "description": "flag: Vanuatu"
+ , "category": "Flags"
+ , "aliases": [
+ "vanuatu"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇼🇫"
+ , "description": "flag: Wallis & Futuna"
+ , "category": "Flags"
+ , "aliases": [
+ "wallis_futuna"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇼🇸"
+ , "description": "flag: Samoa"
+ , "category": "Flags"
+ , "aliases": [
+ "samoa"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇽🇰"
+ , "description": "flag: Kosovo"
+ , "category": "Flags"
+ , "aliases": [
+ "kosovo"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇾🇪"
+ , "description": "flag: Yemen"
+ , "category": "Flags"
+ , "aliases": [
+ "yemen"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇾🇹"
+ , "description": "flag: Mayotte"
+ , "category": "Flags"
+ , "aliases": [
+ "mayotte"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "9.0"
+ }
+, {
+ "emoji": "🇿🇦"
+ , "description": "flag: South Africa"
+ , "category": "Flags"
+ , "aliases": [
+ "south_africa"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇿🇲"
+ , "description": "flag: Zambia"
+ , "category": "Flags"
+ , "aliases": [
+ "zambia"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🇿🇼"
+ , "description": "flag: Zimbabwe"
+ , "category": "Flags"
+ , "aliases": [
+ "zimbabwe"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "6.0"
+ , "ios_version": "8.3"
+ }
+, {
+ "emoji": "🏴"
+ , "description": "flag: England"
+ , "category": "Flags"
+ , "aliases": [
+ "england"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🏴"
+ , "description": "flag: Scotland"
+ , "category": "Flags"
+ , "aliases": [
+ "scotland"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+, {
+ "emoji": "🏴"
+ , "description": "flag: Wales"
+ , "category": "Flags"
+ , "aliases": [
+ "wales"
+ ]
+ , "tags": [
+ ]
+ , "unicode_version": "11.0"
+ , "ios_version": "12.1"
+ }
+]
diff --git a/plugins/emoji/update_emoji.pl b/plugins/emoji/update_emoji.pl
deleted file mode 100644
index 8034052b7..000000000
--- a/plugins/emoji/update_emoji.pl
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/usr/bin/perl -w
-#
-# update_emoji.pl
-#
-# This script generates the emoji.plugin.zsh emoji definitions from the Unicode
-# character data for the emoji characters.
-#
-# The data file can be found at https://unicode.org/Public/emoji/latest/emoji-data.txt
-# as referenced in Unicode TR51 (https://www.unicode.org/reports/tr51/index.html).
-#
-# This is known to work with the data file from version 1.0. It may not work with later
-# versions if the format changes. In particular, this reads line comments to get the
-# emoji character name and unicode version.
-#
-# Country names have punctuation and other non-letter characters removed from their name,
-# to avoid possible complications with having to escape the strings when using them as
-# array subscripts. The definition file seems to use some combining characters like accents
-# that get stripped during this process.
-
-use strict;
-use warnings;
-use 5.010;
-use autodie;
-
-use Path::Class;
-use File::Copy;
-
-# Parse definitions out of the data file and convert
-sub process_emoji_data_file {
- my ( $infile, $outfilename ) = @_;
- my $file = file($infile);
- my $outfile = file($outfilename);
- my $outfilebase = $outfile->basename();
- my $tempfilename = "$outfilename.tmp";
- my $tempfile = file($tempfilename);
- my $outfh = $tempfile->openw();
- $outfh->print("
-# $outfilebase - Emoji character definitions for oh-my-zsh emoji plugin
-#
-# This file is auto-generated by update_emoji.pl. Do not edit it manually.
-#
-# This contains the definition for:
-# \$emoji - which maps character names to Unicode characters
-# \$emoji_flags - maps country names to Unicode flag characters using region indicators
-
-# Main emoji
-typeset -gAH emoji
-# National flags
-typeset -gAH emoji_flags
-# Combining modifiers
-typeset -gAH emoji_mod
-
-");
-
- my $fh = $file->openr();
- my $line_num = 0;
- while ( my $line = $fh->getline() ) {
- $line_num++;
- $_ = $line;
- # Skip all-comment lines (from the header) and blank lines
- # (But don't strip comments on normal lines; we need to parse those for
- # the emoji names.)
- next if /^\s*#/ or /^\s*$/;
-
- if (/^(\S.*?\S)\s*;\s*(\w+)\s*;\s*(\w+)\s*;\s*(\w+)\s*;\s*(\w.*?)\s*#\s*V(\S+)\s\(.*?\)\s*(\w.*\S)\s*$/) {
- my ($code, $style, $level, $modifier_status, $sources, $version, $keycap_name)
- = ($1, $2, $3, $4, $5, $6, $7);
- #print "code=$code style=$style level=$level modifier_status=$modifier_status sources=$sources version=$version name=$keycap_name\n";
- my @code_points = split /\s+/, $code;
- my @sources = split /\s+/, $sources;
-
- my $flag_country = "";
- if ( $keycap_name =~ /^flag for (\S.*?)\s*$/) {
- $flag_country = $1;
- }
-
- my $zsh_code = join '', map { "\\U$_" } @code_points;
- # Convert keycap names to valid associative array names that do not require any
- # quoting. Works fine for most stuff, but is clumsy for flags.
- my $omz_name = lc($keycap_name);
- $omz_name =~ s/[^A-Za-z0-9]/_/g;
- my $zsh_flag_country = $flag_country;
- $zsh_flag_country =~ s/[^\p{Letter}]/_/g;
- if ($flag_country) {
- $outfh->print("emoji_flags[$zsh_flag_country]=\$'$zsh_code'\n");
- } else {
- $outfh->print("emoji[$omz_name]=\$'$zsh_code'\n");
- }
- # Modifiers are included in both the main set and their separate map,
- # because they have a standalone representation as a color swatch.
- if ( $modifier_status eq "modifier" ) {
- $outfh->print("emoji_mod[$omz_name]=\$'$zsh_code'\n");
- }
- } else {
- die "Failed parsing line $line_num: '$_'";
- }
- }
- $fh->close();
- $outfh->print("\n");
- $outfh->close();
-
- move($tempfilename, $outfilename)
- or die "Failed moving temp file to $outfilename: $!";
-}
-
-my $datafile = "emoji-data.txt";
-my $zsh_def_file = "emoji-char-definitions.zsh";
-process_emoji_data_file($datafile, $zsh_def_file);
-
-print "Updated definition file $zsh_def_file\n";
-
-
-
diff --git a/plugins/emoji/update_emoji.py b/plugins/emoji/update_emoji.py
new file mode 100644
index 000000000..eb945b9ef
--- /dev/null
+++ b/plugins/emoji/update_emoji.py
@@ -0,0 +1,213 @@
+"""
+Update Emoji.py
+Refeshes OMZ emoji database based on the latest Unicode spec
+"""
+import re
+import json
+
+spec = open("emoji-data.txt", "r")
+
+# Regexes
+# regex_emoji will return, respectively:
+# the code points, its type (status), the actual emoji, and its official name
+regex_emoji = r"^([\w ].*?\S)\s*;\s*([\w-]+)\s*#\s*(.*?)\s(\S.*).*$"
+# regex_group returns the group of subgroup that a line opens
+regex_group = r"^#\s*(group|subgroup):\s*(.*)$"
+
+headers = """
+# emoji-char-definitions.zsh - Emoji definitions for oh-my-zsh emoji plugin
+#
+# This file is auto-generated by update_emoji.py. Do not edit it manually.
+#
+# This contains the definition for:
+# $emoji - which maps character names to Unicode characters
+# $emoji_flags - maps country names to Unicode flag characters using region
+# indicators
+# $emoji_mod - maps modifier components to Unicode characters
+# $emoji_groups - a single associative array to avoid cluttering up the
+# global namespace, and to allow adding additional group
+# definitions at run time. The keys are the group names, and
+# the values are whitespace-separated lists of emoji
+# character names.
+
+# Main emoji
+typeset -gAH emoji
+# National flags
+typeset -gAH emoji_flags
+# Combining modifiers
+typeset -gAH emoji_mod
+# Emoji groups
+typeset -gAH emoji_groups
+"""
+
+#######
+# Adding country codes
+#######
+# This is the only part of this script that relies on an external library
+# (country_converter), and is hence commented out by default.
+# You can uncomment it to have country codes added as aliases for flag
+# emojis. (By default, when you install this extension, country codes are
+# included as aliases, but not if you re-run this script without uncommenting.)
+# Warning: country_converter is very verbose, and will print warnings all over
+# your terminal.
+
+# import country_converter as coco # pylint: disable=wrong-import-position
+# cc = coco.CountryConverter()
+
+# def country_iso(_all_names, _omz_name):
+# """ Using the external library country_converter,
+# this funciton can detect the ISO2 and ISO3 codes
+# of the country. It takes as argument the array
+# with all the names of the emoji, and returns that array."""
+# omz_no_underscore = re.sub(r'_', r' ', _omz_name)
+# iso2 = cc.convert(names=[omz_no_underscore], to='ISO2')
+# if iso2 != 'not found':
+# _all_names.append(iso2)
+# iso3 = cc.convert(names=[omz_no_underscore], to='ISO3')
+# _all_names.append(iso3)
+# return _all_names
+
+
+#######
+# Helper functions
+#######
+
+def code_to_omz(_code_points):
+ """ Returns a ZSH-compatible Unicode string from the code point(s) """
+ return r'\U' + r'\U'.join(_code_points.split(' '))
+
+def name_to_omz(_name, _group, _subgroup, _status):
+ """ Returns a reasonable snake_case name for the emoji. """
+ def snake_case(_string):
+ """ Does the regex work of snake_case """
+ remove_dots = re.sub(r'\.\(\)', r'', _string)
+ replace_ands = re.sub(r'\&', r'and', remove_dots)
+ remove_whitespace = re.sub(r'[^\#\*\w]', r'_', replace_ands)
+ return re.sub(r'__', r'_', remove_whitespace)
+
+ shortname = ""
+ split_at_colon = lambda s: s.split(": ")
+ # Special treatment by group and subgroup
+ # If the emoji is a flag, we strip "flag" from its name
+ if _group == "Flags" and len(split_at_colon(_name)) > 1:
+ shortname = snake_case(split_at_colon(_name)[1])
+ else:
+ shortname = snake_case(_name)
+ # Special treatment by status
+ # Enables us to have every emoji combination,
+ # even the one that are not officially sanctionned
+ # and are implemeted by, say, only one vendor
+ if _status == "unqualified":
+ shortname += "_unqualified"
+ elif _status == "minimally-qualified":
+ shortname += "_minimally"
+ return shortname
+
+def increment_name(_shortname):
+ """ Increment the short name by 1. If you get, say,
+ 'woman_detective_unqualified', it returns
+ 'woman_detective_unqualified_1', and then
+ 'woman_detective_unqualified_2', etc. """
+ last_char = _shortname[-1]
+ if last_char.isdigit():
+ num = int(last_char)
+ return _shortname[:-1] + str(num + 1)
+ return _shortname + "_1"
+
+########
+# Going through every line
+########
+
+group, subgroup, short_name_buffer = "", "", ""
+emoji_database = []
+for line in spec:
+ # First, test if this line opens a group or subgroup
+ group_match = re.findall(regex_group, line)
+ if group_match != []:
+ gr_or_sub, name = group_match[0]
+ if gr_or_sub == "group":
+ group = name
+ elif gr_or_sub == "subgroup":
+ subgroup = name
+ continue # Moving on...
+ # Second, test if this line references one emoji
+ emoji_match = re.findall(regex_emoji, line)
+ if emoji_match != []:
+ code_points, status, emoji, name = emoji_match[0]
+ omz_codes = code_to_omz(code_points)
+ omz_name = name_to_omz(name, group, subgroup, status)
+ # If this emoji has the same shortname as the preceding one
+ if omz_name in short_name_buffer:
+ omz_name = increment_name(short_name_buffer)
+ short_name_buffer = omz_name
+ emoji_database.append(
+ [omz_codes, status, emoji, omz_name, group, subgroup])
+spec.close()
+
+########
+# Write to emoji-char-definitions.zsh
+########
+
+# Aliases for emojis are retrieved through the DB of Gemoji
+# Retrieved on Aug 9 2019 from the following URL:
+# https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json
+
+gemoji_db = open("gemoji_db.json")
+j = json.load(gemoji_db)
+aliases_map = {entry['emoji']: entry['aliases'] for entry in j}
+all_omz_names = [emoji_data[3] for emoji_data in emoji_database]
+
+# Let's begin writing to this file
+output = open("emoji-char-definitions.zsh", "w")
+output.write(headers)
+
+emoji_groups = {"fruits": "\n", "vehicles": "\n", "hands": "\n",
+ "people": "\n", "animals": "\n", "faces": "\n",
+ "flags": "\n"}
+
+# First, write every emoji down
+for _omz_codes, _status, _emoji, _omz_name, _group, _subgroup in emoji_database:
+
+ # One emoji can be mapped to multiple names (aliases or country codes)
+ names_for_this_emoji = [_omz_name]
+
+ # Variable that indicates in which map the emoji will be located
+ emoji_map = "emoji"
+ if _status == "component":
+ emoji_map = "emoji_mod"
+ if _group == "Flags":
+ emoji_map = "emoji_flags"
+ # Adding country codes (Optional, see above)
+ # names_for_this_emoji = country_iso(names_for_this_emoji, _omz_name)
+
+ # Check if there is an alias available in the Gemoji DB
+ if _emoji in aliases_map.keys():
+ for alias in aliases_map[_emoji]:
+ if alias not in all_omz_names:
+ names_for_this_emoji.append(alias)
+
+ # And now we write to the definitions file
+ for one_name in names_for_this_emoji:
+ output.write(f"{emoji_map}[{one_name}]=$'{_omz_codes}'\n")
+
+ # Storing the emoji in defined subgroups for the next step
+ if _status == "fully-qualified":
+ if _subgroup == "food-fruit":
+ emoji_groups["fruits"] += f" {_omz_name}\n"
+ elif "transport-" in _subgroup:
+ emoji_groups["vehicles"] += f" {_omz_name}\n"
+ elif "hand-" in _subgroup:
+ emoji_groups["hands"] += f" {_omz_name}\n"
+ elif "person-" in _subgroup or _subgroup == "family":
+ emoji_groups["people"] += f" {_omz_name}\n"
+ elif "animal-" in _subgroup:
+ emoji_groups["animals"] += f" {_omz_name}\n"
+ elif "face-" in _subgroup:
+ emoji_groups["faces"] += f" {_omz_name}\n"
+ elif _group == "Flags":
+ emoji_groups["flags"] += f" {_omz_name}\n"
+
+# Second, write the subgroups to the end of the file
+for name, string in emoji_groups.items():
+ output.write(f'\nemoji_groups[{name}]="{string}"\n')
+output.close()
diff --git a/plugins/emotty/emotty.plugin.zsh b/plugins/emotty/emotty.plugin.zsh
index 4511275d6..661169a8b 100644
--- a/plugins/emotty/emotty.plugin.zsh
+++ b/plugins/emotty/emotty.plugin.zsh
@@ -10,6 +10,11 @@
# % export emotty_set=nature
# ------------------------------------------------------------------------------
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
typeset -gAH _emotty_sets
local _emotty_plugin_dir="${0:h}"
source "$_emotty_plugin_dir/emotty_stellar_set.zsh"
diff --git a/plugins/fastfile/README.md b/plugins/fastfile/README.md
index 37f5b2f53..32f619ffd 100644
--- a/plugins/fastfile/README.md
+++ b/plugins/fastfile/README.md
@@ -4,6 +4,7 @@ This plugin adds a way to reference certain files or folders used frequently usi
a global alias or shortcut.
To use it, add `fastfile` to the plugins array in your zshrc file:
+
```zsh
plugins=(... fastfile)
```
@@ -13,36 +14,38 @@ plugins=(... fastfile)
Example: you access folder `/code/project/backend/database` very frequently.
First, generate a shortcut with the name `pjdb`:
+
```zsh
$ fastfile pjdb /code/project/backend/database
```
Next time you want to access it, use `§pjdb`. For example:
+
```zsh
$ cd §pjdb
$ subl §pjdb
```
+
where § is the fastfile prefix (see [below](#options) for how to change).
**Note:** shortcuts with spaces in the name are assigned a global alias
where the spaces have been substituted with underscores (`_`). For example:
a shortcut named `"hello world"` corresponds with `§hello_world`.
-
## Functions
-- `fastfile `: generate a shortcut.
+- `fastfile [path/to/file/or/folder]`: generate a shortcut.
+ If the second argument is not provided, the current directory is used.
- `fastfile_print `: prints a shortcut, with the format
` -> `.
- `fastfile_ls`: lists all shortcuts.
-- `fastfile_rm `: remove a shortcut.
+- `fastfile_rm `: remove a shortcut.
- `fastfile_sync`: generates the global aliases for the shortcuts.
-
### Internal functions
- `fastfile_resolv `: resolves the location of the shortcut
@@ -51,7 +54,6 @@ a shortcut named `"hello world"` corresponds with `§hello_world`.
- `fastfile_get `: get the real path of the shortcut.
-
## Aliases
| Alias | Function |
@@ -62,7 +64,6 @@ a shortcut named `"hello world"` corresponds with `§hello_world`.
| ffls | `fastfile_ls` |
| ffsync | `fastfile_sync` |
-
## Options
These are options you can set to change certain parts of the plugin. To change
diff --git a/plugins/fastfile/fastfile.plugin.zsh b/plugins/fastfile/fastfile.plugin.zsh
index ccbbce3b2..896fed5f7 100644
--- a/plugins/fastfile/fastfile.plugin.zsh
+++ b/plugins/fastfile/fastfile.plugin.zsh
@@ -18,7 +18,7 @@ default fastfile_var_prefix "§"
# 1. name - The name of the shortcut (default: name of the file)
# 2. file - The file or directory to make the shortcut for
# STDOUT:
-# => fastfle_print
+# => fastfile_print
#
function fastfile() {
test "$2" || 2="."
@@ -44,7 +44,7 @@ function fastfile() {
# The path to the shortcut file
#
function fastfile_resolv() {
- echo "${fastfile_dir}${1}"
+ echo "${fastfile_dir}/${1}"
}
#
@@ -75,14 +75,14 @@ function fastfile_print() {
# List all shortcuts
#
# STDOUT:
-# (=> fastfle_print) for each shortcut
+# (=> fastfile_print) for each shortcut
#
function fastfile_ls() {
- for f in "${fastfile_dir}"/*(NF); do
- file=`basename "$f"` # To enable simpler handeling of spaces in file names
- varkey=`echo "$file" | tr " " "_"`
+ for f in "${fastfile_dir}"/*(N); do
+ file=$(basename "$f") # To enable simpler handling of spaces in file names
+ varkey=$(echo "$file" | tr " " "_")
- # Special format for colums
+ # Special format for columns
echo "${fastfile_var_prefix}${varkey}|->|$(fastfile_get "$file")"
done | column -t -s "|"
}
@@ -93,20 +93,21 @@ function fastfile_ls() {
# Arguments:
# 1. name - The name of the shortcut (default: name of the file)
# STDOUT:
-# => fastfle_print
+# => fastfile_print
#
function fastfile_rm() {
fastfile_print "$1"
rm "$(fastfile_resolv "$1")"
+ unalias "${fastfile_var_prefix}${1}"
}
#
# Generate the aliases for the shortcuts
#
function fastfile_sync() {
- for f in "${fastfile_dir}"/*(NF); do
- file=`basename "$f"` # To enable simpler handeling of spaces in file names
- varkey=`echo "$file" | tr " " "_"`
+ for f in "${fastfile_dir}"/*(N); do
+ file=$(basename "$f") # To enable simpler handling of spaces in file names
+ varkey=$(echo "$file" | tr " " "_")
alias -g "${fastfile_var_prefix}${varkey}"="'$(fastfile_get "$file")'"
done
diff --git a/plugins/fd/README.md b/plugins/fd/README.md
index aabd624b8..cf9f7815d 100644
--- a/plugins/fd/README.md
+++ b/plugins/fd/README.md
@@ -8,6 +8,6 @@ To use it, add `fd` to the plugins array in your zshrc file:
plugins=(... fd)
```
-Completion is taken from the fd release [`7.3.0`](https://github.com/sharkdp/fd/releases/tag/v7.3.0).
+Completion is taken from the fd release [`8.2.1`](https://github.com/sharkdp/fd/releases/tag/v8.2.1).
-Updated on Febrary 13th, 2019.
+Updated on April 1st, 2021.
diff --git a/plugins/fd/_fd b/plugins/fd/_fd
index 7a4c38753..f5d9e01d2 100644
--- a/plugins/fd/_fd
+++ b/plugins/fd/_fd
@@ -1,83 +1,268 @@
#compdef fd fdfind
+##
+# zsh completion function for fd
+#
+# Based on ripgrep completion function.
+# Originally based on code from the zsh-users project — see copyright notice
+# below.
+
autoload -U is-at-least
_fd() {
- typeset -A opt_args
- typeset -a _arguments_options
- local ret=1
+ local curcontext="$curcontext" no='!' ret=1
+ local -a context line state state_descr _arguments_options fd_types fd_args
+ local -A opt_args
- if is-at-least 5.2; then
- _arguments_options=(-s -S -C)
- else
- _arguments_options=(-s -C)
- fi
+ if is-at-least 5.2; then
+ _arguments_options=( -s -S )
+ else
+ _arguments_options=( -s )
+ fi
- local context curcontext="$curcontext" state line
- _arguments "${_arguments_options[@]}" \
-'-d+[Set maximum search depth (default: none)]' \
-'--max-depth=[Set maximum search depth (default: none)]' \
-'--maxdepth=[See --max-depth]' \
-'*-t+[Filter by type: file (f), directory (d), symlink (l),
-executable (x), empty (e)]: :(f file d directory l symlink x executable e empty)' \
-'*--type=[Filter by type: file (f), directory (d), symlink (l),
-executable (x), empty (e)]: :(f file d directory l symlink x executable e empty)' \
-'*-e+[Filter by file extension]' \
-'*--extension=[Filter by file extension]' \
-'-x+[Execute a command for each search result]' \
-'--exec=[Execute a command for each search result]' \
-'(-x --exec)-X+[Execute a command with all search results at once]' \
-'(-x --exec)--exec-batch=[Execute a command with all search results at once]' \
-'*-E+[Exclude entries that match the given glob pattern]' \
-'*--exclude=[Exclude entries that match the given glob pattern]' \
-'*--ignore-file=[Add a custom ignore-file in .gitignore format]' \
-'-c+[When to use colors: never, *auto*, always]: :(never auto always)' \
-'--color=[When to use colors: never, *auto*, always]: :(never auto always)' \
-'-j+[Set number of threads to use for searching & executing]' \
-'--threads=[Set number of threads to use for searching & executing]' \
-'*-S+[Limit results based on the size of files.]' \
-'*--size=[Limit results based on the size of files.]' \
-'--max-buffer-time=[the time (in ms) to buffer, before streaming to the console]' \
-'--changed-within=[Filter by file modification time (newer than)]' \
-'--changed-before=[Filter by file modification time (older than)]' \
-'*--search-path=[(hidden)]' \
-'-H[Search hidden files and directories]' \
-'--hidden[Search hidden files and directories]' \
-'-I[Do not respect .(git|fd)ignore files]' \
-'--no-ignore[Do not respect .(git|fd)ignore files]' \
-'--no-ignore-vcs[Do not respect .gitignore files]' \
-'*-u[Alias for no-ignore and/or hidden]' \
-'-s[Case-sensitive search (default: smart case)]' \
-'--case-sensitive[Case-sensitive search (default: smart case)]' \
-'-i[Case-insensitive search (default: smart case)]' \
-'--ignore-case[Case-insensitive search (default: smart case)]' \
-'-F[Treat the pattern as a literal string]' \
-'--fixed-strings[Treat the pattern as a literal string]' \
-'-a[Show absolute instead of relative paths]' \
-'--absolute-path[Show absolute instead of relative paths]' \
-'-L[Follow symbolic links]' \
-'--follow[Follow symbolic links]' \
-'-p[Search full path (default: file-/dirname only)]' \
-'--full-path[Search full path (default: file-/dirname only)]' \
-'-0[Separate results by the null character]' \
-'--print0[Separate results by the null character]' \
-'--show-errors[Enable display of filesystem errors]' \
-'-h[Prints help information]' \
-'--help[Prints help information]' \
-'-V[Prints version information]' \
-'--version[Prints version information]' \
-'::pattern -- the search pattern, a regular expression (optional):_files' \
-'::path -- the root directory for the filesystem search (optional):_files' \
-&& ret=0
+ fd_types=(
+ {f,file}'\:"regular files"'
+ {d,directory}'\:"directories"'
+ {l,symlink}'\:"symbolic links"'
+ {e,empty}'\:"empty files or directories"'
+ {x,executable}'\:"executable (files)"'
+ {s,socket}'\:"sockets"'
+ {p,pipe}'\:"named pipes (FIFOs)"'
+ )
-}
+ # Do not complete rare options unless either the current prefix
+ # matches one of those options or the user has the `complete-all`
+ # style set. Note that this prefix check has to be updated manually to account
+ # for all of the potential negation options listed below!
+ if
+ # (--[bpsu]* => match all options marked with '$no')
+ [[ $PREFIX$SUFFIX == --[bopsu]* ]] ||
+ zstyle -t ":complete:$curcontext:*" complete-all
+ then
+ no=
+ fi
-(( $+functions[_fd_commands] )) ||
-_fd_commands() {
- local commands; commands=(
+ # We make heavy use of argument groups here to prevent the option specs from
+ # growing unwieldy. These aren't supported in zsh <5.4, though, so we'll strip
+ # them out below if necessary. This makes the exclusions inaccurate on those
+ # older versions, but oh well — it's not that big a deal
+ fd_args=(
+ + '(hidden)' # hidden files
+ {-H,--hidden}'[search hidden files/directories]'
- )
- _describe -t commands 'fd commands' commands "$@"
+ + '(no-ignore-full)' # all ignore files
+ '(no-ignore-partial)'{-I,--no-ignore}"[don't respect .(git|fd)ignore and global ignore files]"
+ $no'(no-ignore-partial)*'{-u,--unrestricted}'[alias for --no-ignore, when repeated also alias for --hidden]'
+
+ + no-ignore-partial # some ignore files
+ "(no-ignore-full --no-ignore-vcs)--no-ignore-vcs[don't respect .gitignore files]"
+ "!(no-ignore-full --no-global-ignore-file)--no-global-ignore-file[don't respect the global ignore file]"
+
+ + '(case)' # case-sensitivity
+ {-s,--case-sensitive}'[perform a case-sensitive search]'
+ {-i,--ignore-case}'[perform a case-insensitive search]'
+
+ + '(regex-pattern)' # regex-based search pattern
+ '(no-regex-pattern)--regex[perform a regex-based search (default)]'
+
+ + '(no-regex-pattern)' # non-regex-based search pattern
+ {-g,--glob}'[perform a glob-based search]'
+ {-F,--fixed-strings}'[treat pattern as literal string instead of a regex]'
+
+ + '(match-full)' # match against full path
+ {-p,--full-path}'[match the pattern against the full path instead of the basename]'
+
+ + '(follow)' # follow symlinks
+ {-L,--follow}'[follow symbolic links to directories]'
+
+ + '(abs-path)' # show absolute paths
+ '(long-listing)'{-a,--absolute-path}'[show absolute paths instead of relative paths]'
+
+ + '(null-sep)' # use null separator for output
+ '(long-listing)'{-0,--print0}'[separate search results by the null character]'
+
+ + '(long-listing)' # long-listing output
+ '(abs-path null-sep max-results exec-cmds)'{-l,--list-details}'[use a long listing format with file metadata]'
+
+ + '(max-results)' # max number of results
+ '(long-listing exec-cmds)--max-results=[limit number of search results to given count and quit]:count'
+ '(long-listing exec-cmds)-1[limit to a single search result and quit]'
+
+ + '(fs-errors)' # file-system errors
+ $no'--show-errors[enable the display of filesystem errors]'
+
+ + '(fs-traversal)' # file-system traversal
+ $no"--one-file-system[don't descend into directories on other file systems]"
+ '!--mount'
+ '!--xdev'
+
+ + dir-depth # directory depth
+ '(--exact-depth -d --max-depth)'{-d+,--max-depth=}'[set max directory depth to descend when searching]:depth'
+ '!(--exact-depth -d --max-depth)--maxdepth:depth'
+ '(--exact-depth --min-depth)--min-depth=[set directory depth to descend before start searching]:depth'
+ '(--exact-depth -d --max-depth --maxdepth --min-depth)--exact-depth=[only search at the exact given directory depth]:depth'
+
+ + prune # pruning
+ "--prune[don't traverse into matching directories]"
+
+ + filter-misc # filter search
+ '*'{-t+,--type=}"[filter search by type]:type:(($fd_types))"
+ '*'{-e+,--extension=}'[filter search by file extension]:extension'
+ '*'{-E+,--exclude=}'[exclude files/directories that match the given glob pattern]:glob pattern'
+ '*'{-S+,--size=}'[limit search by file size]:size limit:->size'
+ '(-o --owner)'{-o+,--owner=}'[filter by owning user and/or group]:owner and/or group:->owner'
+
+ + ignore-file # extra ignore files
+ '*--ignore-file=[add a custom, low-precedence ignore-file with .gitignore format]: :_files'
+
+ + '(filter-mtime-newer)' # filter by files modified after than
+ '--changed-within=[limit search to files/directories modified within the given date/duration]:date or duration'
+ '!--change-newer-than=:date/duration'
+ '!--newer=:date/duration'
+
+ + '(filter-mtime-older)' # filter by files modified before than
+ '--changed-before=[limit search to files/directories modified before the given date/duration]:date or duration'
+ '!--change-older-than=:date/duration'
+ '!--older=:date/duration'
+
+ + '(color)' # colorize output
+ {-c+,--color=}'[declare when to colorize search results]:when to colorize:((
+ auto\:"show colors if the output goes to an interactive console (default)"
+ never\:"do not use colorized output"
+ always\:"always use colorized output"
+ ))'
+
+ + '(threads)'
+ {-j+,--threads=}'[set the number of threads for searching and executing]:number of threads'
+
+ + '(exec-cmds)' # execute command
+ '(long-listing max-results)'{-x+,--exec=}'[execute command for each search result]:command: _command_names -e:*\;::program arguments: _normal'
+ '(long-listing max-results)'{-X+,--exec-batch=}'[execute command for all search results at once]:command: _command_names -e:*\;::program arguments: _normal'
+
+ + other
+ '!(--max-buffer-time)--max-buffer-time=[set amount of time to buffer before showing output]:time (ms)'
+
+ + '(about)' # about flags
+ '(: * -)'{-h,--help}'[display help message]'
+ '(: * -)'{-v,--version}'[display version information]'
+
+ + path-sep # set path separator for output
+ $no'(--path-separator)--path-separator=[set the path separator to use when printing file paths]:path separator'
+
+ + search-path
+ $no'(--base-directory)--base-directory=[change the current working directory to the given path]:directory:_files -/'
+ $no'(*)*--search-path=[set search path (instead of positional arguments)]:directory:_files -/'
+
+ + args # positional arguments
+ '1: :_guard "^-*" pattern'
+ '(--search-path)*:directory:_files -/'
+ )
+
+ # Strip out argument groups where unsupported (see above)
+ is-at-least 5.4 ||
+ fd_args=( ${(@)args:#(#i)(+|[a-z0-9][a-z0-9_-]#|\([a-z0-9][a-z0-9_-]#\))} )
+
+ _arguments $_arguments_options : $fd_args && ret=0
+
+ case ${state} in
+ owner)
+ compset -P '(\\|)\!'
+ if compset -P '*:'; then
+ _groups && ret=0
+ else
+ if
+ compset -S ':*' ||
+ # Do not add the colon suffix when completing "!user
+ # (with a starting double-quote) otherwise pressing tab again
+ # after the inserted colon "!user: will complete history modifiers
+ [[ $IPREFIX == (\\|\!)* && ($QIPREFIX == \"* && -z $QISUFFIX) ]]
+ then
+ _users && ret=0
+ else
+ local q
+ # Since quotes are needed when using the negation prefix !,
+ # automatically remove the colon suffix also when closing the quote
+ if [[ $QIPREFIX == [\'\"]* ]]; then
+ q=${QIPREFIX:0:1}
+ fi
+ _users -r ": \t\n\-$q" -S : && ret=0
+ fi
+ fi
+ ;;
+
+ size)
+ if compset -P '[-+][0-9]##'; then
+ local -a suff=(
+ 'B:bytes'
+ 'K:kilobytes (10^3 = 1000 bytes)'
+ 'M:megabytes (10^6 = 1000^2 bytes)'
+ 'G:gigabytes (10^9 = 1000^3 bytes)'
+ 'T:terabytes (10^12 = 1000^4 bytes)'
+ 'Ki:kibibytes ( 2^10 = 1024 bytes)'
+ 'Mi:mebibytes ( 2^20 = 1024^2 bytes)'
+ 'Gi:gigibytes ( 2^30 = 1024^3 bytes)'
+ 'Ti:tebibytes ( 2^40 = 1024^4 bytes)'
+ )
+ _describe -t units 'size limit units' suff -V 'units'
+ elif compset -P '[-+]'; then
+ _message -e 'size limit number (full format: <+->)'
+ else
+ _values 'size limit prefix (full format: )' \
+ '\+[file size must be greater or equal to]'\
+ '-[file size must be less than or equal to]' && ret=0
+ fi
+ ;;
+ esac
+
+ return ret
}
_fd "$@"
+
+# ------------------------------------------------------------------------------
+# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users
+# 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.
+# * Neither the name of the zsh-users nor the
+# names of its contributors may be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# 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 ZSH-USERS 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.
+# ------------------------------------------------------------------------------
+# Description
+# -----------
+#
+# Completion script for fd
+#
+# ------------------------------------------------------------------------------
+# Authors
+# -------
+#
+# * smancill (https://github.com/smancill)
+#
+# ------------------------------------------------------------------------------
+
+# Local Variables:
+# mode: shell-script
+# coding: utf-8-unix
+# indent-tabs-mode: nil
+# sh-indentation: 2
+# sh-basic-offset: 2
+# End:
+# vim: ft=zsh sw=2 ts=2 et
diff --git a/plugins/fig/README.md b/plugins/fig/README.md
new file mode 100644
index 000000000..3861958d6
--- /dev/null
+++ b/plugins/fig/README.md
@@ -0,0 +1,9 @@
+# Fig plugin
+
+This plugin sets up completion for [Fig](https://fig.io/).
+
+To use it, add `fig` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... fig)
+```
diff --git a/plugins/fig/fig.plugin.zsh b/plugins/fig/fig.plugin.zsh
new file mode 100644
index 000000000..cddb6c7c0
--- /dev/null
+++ b/plugins/fig/fig.plugin.zsh
@@ -0,0 +1,13 @@
+if ! (( $+commands[fig] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `fig`. Otherwise, compinit will have already done that
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_fig" ]]; then
+ autoload -Uz _fig
+ typeset -g -A _comps
+ _comps[fig]=_fig
+fi
+
+fig completion zsh >| "$ZSH_CACHE_DIR/completions/_fig" &|
diff --git a/plugins/flutter/README.md b/plugins/flutter/README.md
index be419144f..e5a4fd2ea 100644
--- a/plugins/flutter/README.md
+++ b/plugins/flutter/README.md
@@ -2,20 +2,27 @@
The Flutter plugin provides completion and useful aliases
-To use it, add flutter to the plugins array of your zshrc file:
+To use it, add `flutter` to the plugins array of your zshrc file:
-```
+```zsh
plugins=(... flutter)
```
## Aliases
-| Alias | Command | Description |
-| :--------- | :--------------------- | :------------------------------------------------------------------------- |
-| `fl` | `flutter` | Shorthand for flutter command |
-| `flr` | `flutter run` | Runs flutter app |
-| `fldoc` | `flutter doctor` | Runs flutter doctor |
-| `flb` | `flutter build` | Build flutter application |
-| `flattach` | `flutter attach` | Attaches flutter to a running flutter application with enabled observatory |
-| `flget` | `flutter packages get` | Installs dependencies |
-| `flc` | `flutter clean` | Cleans flutter porject |
+| Alias | Command | Description |
+| :--------- | :---------------------- | :------------------------------------------------------------------------- |
+| `fl` | `flutter` | Shorthand for flutter command |
+| `flattach` | `flutter attach` | Attaches flutter to a running flutter application with enabled observatory |
+| `flb` | `flutter build` | Build flutter application |
+| `flchnl` | `flutter channel` | Switches flutter channel (requires input of desired channel) |
+| `flc` | `flutter clean` | Cleans flutter project |
+| `fldvcs` | `flutter devices` | List connected devices (if any) |
+| `fldoc` | `flutter doctor` | Runs flutter doctor |
+| `flpub` | `flutter pub` | Shorthand for flutter pub command |
+| `flget` | `flutter pub get` | Installs dependencies |
+| `flr` | `flutter run` | Runs flutter app |
+| `flrd` | `flutter run --debug` | Runs flutter app in debug mode (default mode) |
+| `flrp` | `flutter run --profile` | Runs flutter app in profile mode |
+| `flrr` | `flutter run --release` | Runs flutter app in release mode |
+| `flupgrd` | `flutter upgrade` | Upgrades flutter version depending on the current channel |
diff --git a/plugins/flutter/flutter.plugin.zsh b/plugins/flutter/flutter.plugin.zsh
index 01c4c9f5f..80b74f64a 100644
--- a/plugins/flutter/flutter.plugin.zsh
+++ b/plugins/flutter/flutter.plugin.zsh
@@ -1,7 +1,14 @@
alias fl="flutter"
-alias flr="flutter run"
-alias fldoc="flutter doctor"
-alias flb="flutter build"
alias flattach="flutter attach"
-alias flget="flutter packages get"
+alias flb="flutter build"
+alias flchnl="flutter channel"
alias flc="flutter clean"
+alias fldvcs="flutter devices"
+alias fldoc="flutter doctor"
+alias flpub="flutter pub"
+alias flget="flutter pub get"
+alias flr="flutter run"
+alias flrd="flutter run --debug"
+alias flrp="flutter run --profile"
+alias flrr="flutter run --release"
+alias flupgrd="flutter upgrade"
diff --git a/plugins/fnm/fnm.plugin.zsh b/plugins/fnm/fnm.plugin.zsh
index c161b27cd..044e16a04 100644
--- a/plugins/fnm/fnm.plugin.zsh
+++ b/plugins/fnm/fnm.plugin.zsh
@@ -1,23 +1,26 @@
-if (( $+commands[fnm] )); then
- # remove old generated completion file
- command rm -f "${0:A:h}/_fnm"
-
- ver="$(fnm --version)"
- ver_file="$ZSH_CACHE_DIR/fnm_version"
- comp_file="$ZSH_CACHE_DIR/completions/_fnm"
-
- mkdir -p "${comp_file:h}"
- (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
-
- if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
- fnm completions --shell=zsh >| "$comp_file"
- echo "$ver" >| "$ver_file"
- fi
-
- declare -A _comps
- autoload -Uz _fnm
- _comps[fnm]=_fnm
-
- unset ver ver_file comp_file
+if (( ! $+commands[fnm] )); then
+ return
fi
+# TODO: 2021-12-28: remove this block
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+# remove old generated files
+command rm -f "${0:A:h}/_fnm" "$ZSH_CACHE_DIR/fnm_version"
+
+# TODO: 2021-12-28: remove this bit of code as it exists in oh-my-zsh.sh
+# Add completions folder in $ZSH_CACHE_DIR
+command mkdir -p "$ZSH_CACHE_DIR/completions"
+(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `fnm`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_fnm" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _fnm
+ _comps[fnm]=_fnm
+fi
+
+fnm completions --shell=zsh >| "$ZSH_CACHE_DIR/completions/_fnm" &|
diff --git a/plugins/fossil/_fossil b/plugins/fossil/_fossil
new file mode 100644
index 000000000..d2d48bdec
--- /dev/null
+++ b/plugins/fossil/_fossil
@@ -0,0 +1,32 @@
+#compdef fossil
+
+function _fossil_get_command_list () {
+ fossil help -a | grep -v "Usage|Common|This is"
+}
+
+function _fossil () {
+ local context state state_descr line
+ typeset -A opt_args
+
+ _arguments \
+ '1: :->command'\
+ '2: :->subcommand'
+
+ case $state in
+ command)
+ local _OUTPUT=$(fossil branch 2>&1 | grep "use --repo")
+ if [[ -z "$_OUTPUT" ]]; then
+ compadd "$(_fossil_get_command_list)"
+ else
+ compadd clone init import help version
+ fi ;;
+ subcommand)
+ case "$words[2]" in
+ help) compadd "$(_fossil_get_command_list)" ;;
+ add) compadd "$(fossil extra)" ;;
+ *) compcall -D ;;
+ esac ;;
+ esac
+}
+
+_fossil "$@"
diff --git a/plugins/fossil/fossil.plugin.zsh b/plugins/fossil/fossil.plugin.zsh
index 25a8d121d..a2123f415 100644
--- a/plugins/fossil/fossil.plugin.zsh
+++ b/plugins/fossil/fossil.plugin.zsh
@@ -12,55 +12,26 @@ ZSH_THEME_FOSSIL_PROMPT_DIRTY=" %{$fg_bold[red]%}✖"
# Text to display if the branch is clean
ZSH_THEME_FOSSIL_PROMPT_CLEAN=" %{$fg_bold[green]%}✔"
-function fossil_prompt_info () {
- local _OUTPUT=`fossil branch 2>&1`
- local _STATUS=`echo $_OUTPUT | grep "use --repo"`
- if [ "$_STATUS" = "" ]; then
- local _EDITED=`fossil changes`
- local _EDITED_SYM="$ZSH_THEME_FOSSIL_PROMPT_CLEAN"
- local _BRANCH=`echo $_OUTPUT | grep "* " | sed 's/* //g'`
+function fossil_prompt_info() {
+ local info=$(fossil branch 2>&1)
- if [ "$_EDITED" != "" ]; then
- _EDITED_SYM="$ZSH_THEME_FOSSIL_PROMPT_DIRTY"
- fi
+ # if we're not in a fossil repo, don't show anything
+ ! command grep -q "use --repo" <<< "$info" || return
- echo "$ZSH_THEME_FOSSIL_PROMPT_PREFIX" \
- "$_BRANCH" \
- "$ZSH_THEME_FOSSIL_PROMPT_SUFFIX" \
- "$_EDITED_SYM"\
- "%{$reset_color%}"
+ local branch=$(echo $info | grep "* " | sed 's/* //g')
+ local changes=$(fossil changes)
+ local dirty="$ZSH_THEME_FOSSIL_PROMPT_CLEAN"
+
+ if [[ -n "$changes" ]]; then
+ dirty="$ZSH_THEME_FOSSIL_PROMPT_DIRTY"
fi
-}
-function _fossil_get_command_list () {
- fossil help -a | grep -v "Usage|Common|This is"
-}
-
-function _fossil () {
- local context state state_descr line
- typeset -A opt_args
-
- _arguments \
- '1: :->command'\
- '2: :->subcommand'
-
- case $state in
- command)
- local _OUTPUT=`fossil branch 2>&1 | grep "use --repo"`
- if [ "$_OUTPUT" = "" ]; then
- compadd `_fossil_get_command_list`
- else
- compadd clone init import help version
- fi
- ;;
- subcommand)
- if [ "$words[2]" = "help" ]; then
- compadd `_fossil_get_command_list`
- else
- compcall -D
- fi
- ;;
- esac
+ printf '%s %s %s %s %s' \
+ "$ZSH_THEME_FOSSIL_PROMPT_PREFIX" \
+ "${branch:gs/%/%%}" \
+ "$ZSH_THEME_FOSSIL_PROMPT_SUFFIX" \
+ "$dirty" \
+ "%{$reset_color%}"
}
function _fossil_prompt () {
@@ -82,8 +53,5 @@ function _fossil_prompt () {
fi
}
-compdef _fossil fossil
-
autoload -U add-zsh-hook
-
add-zsh-hook precmd _fossil_prompt
diff --git a/plugins/frontend-search/frontend-search.plugin.zsh b/plugins/frontend-search/frontend-search.plugin.zsh
index 437e477b9..7f8d5c90c 100644
--- a/plugins/frontend-search/frontend-search.plugin.zsh
+++ b/plugins/frontend-search/frontend-search.plugin.zsh
@@ -39,7 +39,7 @@ function frontend() {
emulate -L zsh
# define search context URLS
- typeset -A urls
+ local -A urls
urls=(
angular 'https://angular.io/?search='
angularjs $(_frontend_fallback 'angularjs.org')
@@ -73,25 +73,23 @@ function frontend() {
)
# show help for command list
- if [[ $# -lt 2 ]]
- then
- print -P "Usage: frontend %Ucontext%u %Uterm%u [...%Umore%u] (or just: %Ucontext%u %Uterm%u [...%Umore%u])"
- print -P ""
- print -P "%Uterm%u and what follows is what will be searched for in the %Ucontext%u website,"
- print -P "and %Ucontext%u is one of the following:"
- print -P ""
- print -P " angular, angularjs, bem, bootsnipp, caniuse, codepen, compassdoc, cssflow, packagephobia"
- print -P " dartlang, emberjs, fontello, flowtype, github, html5please, jestjs, jquery, lodash,"
- print -P " mdn, npmjs, nodejs, qunit, reactjs, smacss, stackoverflow, unheap, vuejs, bundlephobia"
- print -P ""
- print -P "For example: frontend npmjs mocha (or just: npmjs mocha)."
- print -P ""
- return 1
+ if [[ $# -lt 2 ]]; then
+ print -P "Usage: frontend %Ucontext%u %Uterm%u [...%Umore%u] (or just: %Ucontext%u %Uterm%u [...%Umore%u])"
+ print -P ""
+ print -P "%Uterm%u and what follows is what will be searched for in the %Ucontext%u website,"
+ print -P "and %Ucontext%u is one of the following:"
+ print -P ""
+ print -P " angular, angularjs, bem, bootsnipp, caniuse, codepen, compassdoc, cssflow, packagephobia"
+ print -P " dartlang, emberjs, fontello, flowtype, github, html5please, jestjs, jquery, lodash,"
+ print -P " mdn, npmjs, nodejs, qunit, reactjs, smacss, stackoverflow, unheap, vuejs, bundlephobia"
+ print -P ""
+ print -P "For example: frontend npmjs mocha (or just: npmjs mocha)."
+ print -P ""
+ return 1
fi
# check whether the search context is supported
- if [[ -z "$urls[$1]" ]]
- then
+ if [[ -z "$urls[$1]" ]]; then
echo "Search context \"$1\" currently not supported."
echo ""
echo "Valid contexts are:"
diff --git a/plugins/fzf/README.md b/plugins/fzf/README.md
index 791a3eb6f..15d4d31f3 100644
--- a/plugins/fzf/README.md
+++ b/plugins/fzf/README.md
@@ -26,7 +26,7 @@ export FZF_BASE=/path/to/fzf/install/dir
Set default command to use when input is tty:
```zsh
-export FZF_DEFAULT_COMMAND=''
+export FZF_DEFAULT_COMMAND=''
```
If not set, the plugin will try to set it to these, in the order in which they're found:
diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh
index aabd62cb1..102605958 100644
--- a/plugins/fzf/fzf.plugin.zsh
+++ b/plugins/fzf/fzf.plugin.zsh
@@ -1,176 +1,201 @@
-function setup_using_base_dir() {
- local fzf_base fzf_shell fzfdirs dir
+function fzf_setup_using_base_dir() {
+ local fzf_base fzf_shell fzfdirs dir
- test -d "${FZF_BASE}" && fzf_base="${FZF_BASE}"
+ test -d "${FZF_BASE}" && fzf_base="${FZF_BASE}"
+
+ if [[ -z "${fzf_base}" ]]; then
+ fzfdirs=(
+ "${HOME}/.fzf"
+ "${HOME}/.nix-profile/share/fzf"
+ "${XDG_DATA_HOME:-$HOME/.local/share}/fzf"
+ "/usr/local/opt/fzf"
+ "/usr/share/fzf"
+ "/usr/local/share/examples/fzf"
+ )
+ for dir in ${fzfdirs}; do
+ if [[ -d "${dir}" ]]; then
+ fzf_base="${dir}"
+ break
+ fi
+ done
if [[ -z "${fzf_base}" ]]; then
- fzfdirs=(
- "${HOME}/.fzf"
- "${HOME}/.nix-profile/share/fzf"
- "${XDG_DATA_HOME:-$HOME/.local/share}/fzf"
- "/usr/local/opt/fzf"
- "/usr/share/fzf"
- "/usr/local/share/examples/fzf"
- )
- for dir in ${fzfdirs}; do
- if [[ -d "${dir}" ]]; then
- fzf_base="${dir}"
- break
- fi
- done
-
- if [[ -z "${fzf_base}" ]]; then
- if (( ${+commands[fzf-share]} )) && dir="$(fzf-share)" && [[ -d "${dir}" ]]; then
- fzf_base="${dir}"
- elif (( ${+commands[brew]} )) && dir="$(brew --prefix fzf 2>/dev/null)"; then
- if [[ -d "${dir}" ]]; then
- fzf_base="${dir}"
- fi
- fi
+ if (( ${+commands[fzf-share]} )) && dir="$(fzf-share)" && [[ -d "${dir}" ]]; then
+ fzf_base="${dir}"
+ elif (( ${+commands[brew]} )) && dir="$(brew --prefix fzf 2>/dev/null)"; then
+ if [[ -d "${dir}" ]]; then
+ fzf_base="${dir}"
fi
+ fi
fi
+ fi
- if [[ ! -d "${fzf_base}" ]]; then
- return 1
- fi
+ if [[ ! -d "${fzf_base}" ]]; then
+ return 1
+ fi
- # Fix fzf shell directory for Arch Linux, NixOS or Void Linux packages
- if [[ ! -d "${fzf_base}/shell" ]]; then
- fzf_shell="${fzf_base}"
- else
- fzf_shell="${fzf_base}/shell"
- fi
+ # Fix fzf shell directory for Arch Linux, NixOS or Void Linux packages
+ if [[ ! -d "${fzf_base}/shell" ]]; then
+ fzf_shell="${fzf_base}"
+ else
+ fzf_shell="${fzf_base}/shell"
+ fi
- # Setup fzf binary path
- if (( ! ${+commands[fzf]} )) && [[ "$PATH" != *$fzf_base/bin* ]]; then
- export PATH="$PATH:$fzf_base/bin"
- fi
+ # Setup fzf binary path
+ if (( ! ${+commands[fzf]} )) && [[ "$PATH" != *$fzf_base/bin* ]]; then
+ export PATH="$PATH:$fzf_base/bin"
+ fi
- # Auto-completion
- if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then
- source "${fzf_shell}/completion.zsh" 2> /dev/null
- fi
+ # Auto-completion
+ if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then
+ source "${fzf_shell}/completion.zsh" 2> /dev/null
+ fi
- # Key bindings
- if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then
- source "${fzf_shell}/key-bindings.zsh"
- fi
+ # Key bindings
+ if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then
+ source "${fzf_shell}/key-bindings.zsh"
+ fi
}
-function setup_using_debian_package() {
- if (( ! $+commands[dpkg] )) || ! dpkg -s fzf &>/dev/null; then
- # Either not a debian based distro, or no fzf installed
- return 1
- fi
+function fzf_setup_using_debian() {
+ if (( ! $+commands[dpkg] )) || ! dpkg -s fzf &>/dev/null; then
+ # Either not a debian based distro, or no fzf installed
+ return 1
+ fi
- # NOTE: There is no need to configure PATH for debian package, all binaries
- # are installed to /usr/bin by default
+ # NOTE: There is no need to configure PATH for debian package, all binaries
+ # are installed to /usr/bin by default
- local completions key_bindings
+ local completions key_bindings
- case $PREFIX in
- *com.termux*)
- # Support Termux package
- completions="${PREFIX}/share/fzf/completion.zsh"
- key_bindings="${PREFIX}/share/fzf/key-bindings.zsh"
- ;;
- *)
- # Determine completion file path: first bullseye/sid, then buster/stretch
- completions="/usr/share/doc/fzf/examples/completion.zsh"
- [[ -f "$completions" ]] || completions="/usr/share/zsh/vendor-completions/_fzf"
- key_bindings="/usr/share/doc/fzf/examples/key-bindings.zsh"
- ;;
- esac
+ case $PREFIX in
+ *com.termux*)
+ # Support Termux package
+ completions="${PREFIX}/share/fzf/completion.zsh"
+ key_bindings="${PREFIX}/share/fzf/key-bindings.zsh"
+ ;;
+ *)
+ # Determine completion file path: first bullseye/sid, then buster/stretch
+ completions="/usr/share/doc/fzf/examples/completion.zsh"
+ [[ -f "$completions" ]] || completions="/usr/share/zsh/vendor-completions/_fzf"
+ key_bindings="/usr/share/doc/fzf/examples/key-bindings.zsh"
+ ;;
+ esac
- # Auto-completion
- if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then
- source $completions 2> /dev/null
- fi
+ # Auto-completion
+ if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then
+ source $completions 2> /dev/null
+ fi
- # Key bindings
- if [[ ! "$DISABLE_FZF_KEY_BINDINGS" == "true" ]]; then
- source $key_bindings
- fi
+ # Key bindings
+ if [[ ! "$DISABLE_FZF_KEY_BINDINGS" == "true" ]]; then
+ source $key_bindings
+ fi
- return 0
+ return 0
}
-function setup_using_opensuse_package() {
- # OpenSUSE installs fzf in /usr/bin/fzf
- # If the command is not found, the package isn't installed
- (( $+commands[fzf] )) || return 1
+function fzf_setup_using_opensuse() {
+ # OpenSUSE installs fzf in /usr/bin/fzf
+ # If the command is not found, the package isn't installed
+ (( $+commands[fzf] )) || return 1
- # The fzf-zsh-completion package installs the auto-completion in
- local completions="/usr/share/zsh/site-functions/_fzf"
- # The fzf-zsh-completion package installs the key-bindings file in
- local key_bindings="/etc/zsh_completion.d/fzf-key-bindings"
+ # The fzf-zsh-completion package installs the auto-completion in
+ local completions="/usr/share/zsh/site-functions/_fzf"
+ # The fzf-zsh-completion package installs the key-bindings file in
+ local key_bindings="/etc/zsh_completion.d/fzf-key-bindings"
- # If these are not found: (1) maybe we're not on OpenSUSE, or
- # (2) maybe the fzf-zsh-completion package isn't installed.
- if [[ ! -f "$completions" || ! -f "$key_bindings" ]]; then
- return 1
- fi
+ # If these are not found: (1) maybe we're not on OpenSUSE, or
+ # (2) maybe the fzf-zsh-completion package isn't installed.
+ if [[ ! -f "$completions" || ! -f "$key_bindings" ]]; then
+ return 1
+ fi
- # Auto-completion
- if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then
- source "$completions" 2>/dev/null
- fi
+ # Auto-completion
+ if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then
+ source "$completions" 2>/dev/null
+ fi
- # Key bindings
- if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then
- source "$key_bindings" 2>/dev/null
- fi
+ # Key bindings
+ if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then
+ source "$key_bindings" 2>/dev/null
+ fi
- return 0
+ return 0
}
-function setup_using_openbsd_package() {
- # openBSD installs fzf in /usr/local/bin/fzf
- if [[ "$OSTYPE" != openbsd* ]] || (( ! $+commands[fzf] )); then
- return 1
- fi
+function fzf_setup_using_openbsd() {
+ # openBSD installs fzf in /usr/local/bin/fzf
+ if [[ "$OSTYPE" != openbsd* ]] || (( ! $+commands[fzf] )); then
+ return 1
+ fi
- # The fzf package installs the auto-completion in
- local completions="/usr/local/share/zsh/site-functions/_fzf_completion"
- # The fzf package installs the key-bindings file in
- local key_bindings="/usr/local/share/zsh/site-functions/_fzf_key_bindings"
+ # The fzf package installs the auto-completion in
+ local completions="/usr/local/share/zsh/site-functions/_fzf_completion"
+ # The fzf package installs the key-bindings file in
+ local key_bindings="/usr/local/share/zsh/site-functions/_fzf_key_bindings"
- # Auto-completion
- if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then
- source "$completions" 2>/dev/null
- fi
+ # Auto-completion
+ if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then
+ source "$completions" 2>/dev/null
+ fi
- # Key bindings
- if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then
- source "$key_bindings" 2>/dev/null
- fi
+ # Key bindings
+ if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then
+ source "$key_bindings" 2>/dev/null
+ fi
- return 0
+ return 0
}
-function indicate_error() {
- cat >&2 </dev/null
+ fi
+
+ # Key bindings
+ if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then
+ source "$key_bindings" 2>/dev/null
+ fi
+
+ return 0
}
# Indicate to user that fzf installation not found if nothing worked
-setup_using_openbsd_package \
- || setup_using_debian_package \
- || setup_using_opensuse_package \
- || setup_using_base_dir \
- || indicate_error
+function fzf_setup_error() {
+ cat >&2 <<'EOF'
+[oh-my-zsh] fzf plugin: Cannot find fzf installation directory.
+Please add `export FZF_BASE=/path/to/fzf/install/dir` to your .zshrc
+EOF
+}
-unset -f setup_using_opensuse_package setup_using_debian_package setup_using_base_dir indicate_error
+fzf_setup_using_openbsd \
+ || fzf_setup_using_debian \
+ || fzf_setup_using_opensuse \
+ || fzf_setup_using_cygwin \
+ || fzf_setup_using_base_dir \
+ || fzf_setup_error
+
+unset -f -m 'fzf_setup_*'
if [[ -z "$FZF_DEFAULT_COMMAND" ]]; then
- if (( $+commands[rg] )); then
- export FZF_DEFAULT_COMMAND='rg --files --hidden --glob "!.git/*"'
- elif (( $+commands[fd] )); then
- export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
- elif (( $+commands[ag] )); then
- export FZF_DEFAULT_COMMAND='ag -l --hidden -g "" --ignore .git'
- fi
+ if (( $+commands[rg] )); then
+ export FZF_DEFAULT_COMMAND='rg --files --hidden --glob "!.git/*"'
+ elif (( $+commands[fd] )); then
+ export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
+ elif (( $+commands[ag] )); then
+ export FZF_DEFAULT_COMMAND='ag -l --hidden -g "" --ignore .git'
+ fi
fi
diff --git a/plugins/gh/gh.plugin.zsh b/plugins/gh/gh.plugin.zsh
index 3e4cdee5e..9263220ca 100644
--- a/plugins/gh/gh.plugin.zsh
+++ b/plugins/gh/gh.plugin.zsh
@@ -1,24 +1,27 @@
# Autocompletion for the GitHub CLI (gh).
-if (( $+commands[gh] )); then
- # remove old generated completion file
- command rm -f "${0:A:h}/_gh"
-
- ver="$(gh --version)"
- ver_file="$ZSH_CACHE_DIR/gh_version"
- comp_file="$ZSH_CACHE_DIR/completions/_gh"
-
- mkdir -p "${comp_file:h}"
- (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
-
- if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
- gh completion --shell zsh >| "$comp_file"
- echo "$ver" >| "$ver_file"
- fi
-
- declare -A _comps
- autoload -Uz _gh
- _comps[gh]=_gh
-
- unset ver ver_file comp_file
+if (( ! $+commands[gh] )); then
+ return
fi
+# TODO: 2021-12-28: remove this block
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+# Remove old generated files
+command rm -f "${0:A:h}/_gh" "$ZSH_CACHE_DIR/gh_version"
+
+# TODO: 2021-12-28: remove this bit of code as it exists in oh-my-zsh.sh
+# Add completions folder in $ZSH_CACHE_DIR
+command mkdir -p "$ZSH_CACHE_DIR/completions"
+(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `gh`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_gh" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _gh
+ _comps[gh]=_gh
+fi
+
+gh completion --shell zsh >| "$ZSH_CACHE_DIR/completions/_gh" &|
diff --git a/plugins/git-flow/README.md b/plugins/git-flow/README.md
index 9c25dec83..fc8ccf0a0 100644
--- a/plugins/git-flow/README.md
+++ b/plugins/git-flow/README.md
@@ -10,22 +10,31 @@ plugins=(... git-flow)
## Aliases
-| Alias | Command | Description |
-|---------|----------------------------|----------------------------------------|
-| `gfl` | `git flow` | Git-Flow command |
-| `gfli` | `git flow init` | Initialize git-flow repository |
-| `gcd` | `git checkout develop` | Check out develop branch |
-| `gch` | `git checkout hotfix` | Check out hotfix branch |
-| `gcr` | `git checkout release` | Check out release branch |
-| `gflf` | `git flow feature` | List existing feature branches |
-| `gflh` | `git flow hotfix` | List existing hotfix branches |
-| `gflr` | `git flow release` | List existing release branches |
-| `gflfs` | `git flow feature start` | Start a new feature: `gflfs ` |
-| `gflhs` | `git flow hotfix start` | Start a new hotfix: `gflhs ` |
-| `gflrs` | `git flow release start` | Start a new release: `gflrs ` |
-| `gflff` | `git flow feature finish` | Finish feature: `gflff ` |
-| `gflfp` | `git flow feature publish` | Publish feature: `gflfp ` |
-| `gflhf` | `git flow hotfix finish` | Finish hotfix: `gflhf ` |
-| `gflrf` | `git flow release finish` | Finish release: `gflrf ` |
+| Alias | Command | Description |
+| --------- | ----------------------------------------- | ---------------------------------------------- |
+| `gcd` | `git checkout develop` | Check out develop branch |
+| `gch` | `git checkout hotfix` | Check out hotfix branch |
+| `gcr` | `git checkout release` | Check out release branch |
+| `gfl` | `git flow` | Git-Flow command |
+| `gflf` | `git flow feature` | List existing feature branches |
+| `gflff` | `git flow feature finish` | Finish feature: `gflff ` |
+| `gflffc` | `gflff ${$(git_current_branch)#feature/}` | Finish current feature |
+| `gflfp` | `git flow feature publish` | Publish feature: `gflfp ` |
+| `gflfpc` | `gflfp ${$(git_current_branch)#feature/}` | Publish current feature |
+| `gflfpll` | `git flow feature pull` | Pull remote feature: `gflfpll ` |
+| `gflfs` | `git flow feature start` | Start a new feature: `gflfs ` |
+| `gflh` | `git flow hotfix` | List existing hotfix branches |
+| `gflhf` | `git flow hotfix finish` | Finish hotfix: `gflhf ` |
+| `gflhfc` | `gflhf ${$(git_current_branch)#hotfix/}` | Finish current hotfix |
+| `gflhp` | `git flow hotfix publish` | Publish hostfix: `gflhp ` |
+| `gflhpc` | `gflhp ${$(git_current_branch)#hotfix/}` | Finish current hotfix |
+| `gflhs` | `git flow hotfix start` | Start a new hotfix: `gflhs ` |
+| `gfli` | `git flow init` | Initialize git-flow repository |
+| `gflr` | `git flow release` | List existing release branches |
+| `gflrf` | `git flow release finish` | Finish release: `gflrf ` |
+| `gflrfc` | `gflrf ${$(git_current_branch)#release/}` | Finish current release |
+| `gflrp` | `git flow release publish` | Publish release: `gflrp ` |
+| `gflrpc` | `gflrp ${$(git_current_branch)#release/}` | Publish current release |
+| `gflrs` | `git flow release start` | Start a new release: `gflrs ` |
[More information about `git-flow` commands](https://github.com/nvie/gitflow/wiki/Command-Line-Arguments).
diff --git a/plugins/git-flow/_git-flow b/plugins/git-flow/_git-flow
new file mode 100644
index 000000000..eab712707
--- /dev/null
+++ b/plugins/git-flow/_git-flow
@@ -0,0 +1,327 @@
+#compdef git-flow
+
+_git-flow () {
+ local curcontext="$curcontext" state line
+ typeset -A opt_args
+
+ _arguments -C \
+ ':command:->command' \
+ '*::options:->options'
+
+ case $state in
+ (command)
+
+ local -a subcommands
+ subcommands=(
+ 'init:Initialize a new git repo with support for the branching model.'
+ 'feature:Manage your feature branches.'
+ 'release:Manage your release branches.'
+ 'hotfix:Manage your hotfix branches.'
+ 'support:Manage your support branches.'
+ 'version:Shows version information.'
+ )
+ _describe -t commands 'git flow' subcommands
+ ;;
+
+ (options)
+ case $line[1] in
+
+ (init)
+ _arguments \
+ -f'[Force setting of gitflow branches, even if already configured]'
+ ;;
+
+ (version)
+ ;;
+
+ (hotfix)
+ __git-flow-hotfix
+ ;;
+
+ (release)
+ __git-flow-release
+ ;;
+
+ (feature)
+ __git-flow-feature
+ ;;
+ esac
+ ;;
+ esac
+}
+
+__git-flow-release () {
+ local curcontext="$curcontext" state line
+ typeset -A opt_args
+
+ _arguments -C \
+ ':command:->command' \
+ '*::options:->options'
+
+ case $state in
+ (command)
+
+ local -a subcommands
+ subcommands=(
+ 'start:Start a new release branch.'
+ 'finish:Finish a release branch.'
+ 'list:List all your release branches. (Alias to `git flow release`)'
+ 'publish: public'
+ 'track: track'
+ )
+ _describe -t commands 'git flow release' subcommands
+ _arguments \
+ -v'[Verbose (more) output]'
+ ;;
+
+ (options)
+ case $line[1] in
+
+ (start)
+ _arguments \
+ -F'[Fetch from origin before performing finish]'\
+ ':version:__git_flow_version_list'
+ ;;
+
+ (finish)
+ _arguments \
+ -F'[Fetch from origin before performing finish]' \
+ -s'[Sign the release tag cryptographically]'\
+ -u'[Use the given GPG-key for the digital signature (implies -s)]'\
+ -m'[Use the given tag message]'\
+ -p'[Push to $ORIGIN after performing finish]'\
+ -k'[Keep branch after performing finish]'\
+ -n"[Don't tag this release]"\
+ ':version:__git_flow_version_list'
+ ;;
+
+ (publish)
+ _arguments \
+ ':version:__git_flow_version_list'\
+ ;;
+
+ (track)
+ _arguments \
+ ':version:__git_flow_version_list'\
+ ;;
+
+ *)
+ _arguments \
+ -v'[Verbose (more) output]'
+ ;;
+ esac
+ ;;
+ esac
+}
+
+__git-flow-hotfix () {
+ local curcontext="$curcontext" state line
+ typeset -A opt_args
+
+ _arguments -C \
+ ':command:->command' \
+ '*::options:->options'
+
+ case $state in
+ (command)
+
+ local -a subcommands
+ subcommands=(
+ 'start:Start a new hotfix branch.'
+ 'finish:Finish a hotfix branch.'
+ 'list:List all your hotfix branches. (Alias to `git flow hotfix`)'
+ )
+ _describe -t commands 'git flow hotfix' subcommands
+ _arguments \
+ -v'[Verbose (more) output]'
+ ;;
+
+ (options)
+ case $line[1] in
+
+ (start)
+ _arguments \
+ -F'[Fetch from origin before performing finish]'\
+ ':hotfix:__git_flow_version_list'\
+ ':branch-name:__git_branch_names'
+ ;;
+
+ (finish)
+ _arguments \
+ -F'[Fetch from origin before performing finish]' \
+ -s'[Sign the release tag cryptographically]'\
+ -u'[Use the given GPG-key for the digital signature (implies -s)]'\
+ -m'[Use the given tag message]'\
+ -p'[Push to $ORIGIN after performing finish]'\
+ -k'[Keep branch after performing finish]'\
+ -n"[Don't tag this release]"\
+ ':hotfix:__git_flow_hotfix_list'
+ ;;
+
+ *)
+ _arguments \
+ -v'[Verbose (more) output]'
+ ;;
+ esac
+ ;;
+ esac
+}
+
+__git-flow-feature () {
+ local curcontext="$curcontext" state line
+ typeset -A opt_args
+
+ _arguments -C \
+ ':command:->command' \
+ '*::options:->options'
+
+ case $state in
+ (command)
+
+ local -a subcommands
+ subcommands=(
+ 'start:Start a new feature branch.'
+ 'finish:Finish a feature branch.'
+ 'list:List all your feature branches. (Alias to `git flow feature`)'
+ 'publish: publish'
+ 'track: track'
+ 'diff: diff'
+ 'rebase: rebase'
+ 'checkout: checkout'
+ 'pull: pull'
+ )
+ _describe -t commands 'git flow feature' subcommands
+ _arguments \
+ -v'[Verbose (more) output]'
+ ;;
+
+ (options)
+ case $line[1] in
+
+ (start)
+ _arguments \
+ -F'[Fetch from origin before performing finish]'\
+ ':feature:__git_flow_feature_list'\
+ ':branch-name:__git_branch_names'
+ ;;
+
+ (finish)
+ _arguments \
+ -F'[Fetch from origin before performing finish]' \
+ -r'[Rebase instead of merge]'\
+ -k'[Keep branch after performing finish]'\
+ ':feature:__git_flow_feature_list'
+ ;;
+
+ (publish)
+ _arguments \
+ ':feature:__git_flow_feature_list'\
+ ;;
+
+ (track)
+ _arguments \
+ ':feature:__git_flow_feature_list'\
+ ;;
+
+ (diff)
+ _arguments \
+ ':branch:__git_flow_feature_list'\
+ ;;
+
+ (rebase)
+ _arguments \
+ -i'[Do an interactive rebase]' \
+ ':branch:__git_flow_feature_list'
+ ;;
+
+ (checkout)
+ _arguments \
+ ':branch:__git_flow_feature_list'\
+ ;;
+
+ (pull)
+ _arguments \
+ ':remote:__git_remotes'\
+ ':branch:__git_flow_feature_list'
+ ;;
+
+ *)
+ _arguments \
+ -v'[Verbose (more) output]'
+ ;;
+ esac
+ ;;
+ esac
+}
+
+__git_flow_version_list () {
+ local expl
+ declare -a versions
+
+ versions=(${${(f)"$(_call_program versions git flow release list 2> /dev/null | tr -d ' |*')"}})
+ __git_command_successful || return
+
+ _wanted versions expl 'version' compadd $versions
+}
+
+__git_flow_feature_list () {
+ local expl
+ declare -a features
+
+ features=(${${(f)"$(_call_program features git flow feature list 2> /dev/null | tr -d ' |*')"}})
+ __git_command_successful || return
+
+ _wanted features expl 'feature' compadd $features
+}
+
+__git_remotes () {
+ local expl gitdir remotes
+
+ gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
+ __git_command_successful || return
+
+ remotes=(${${(f)"$(_call_program remotes git config --get-regexp '"^remote\..*\.url$"')"}//#(#b)remote.(*).url */$match[1]})
+ __git_command_successful || return
+
+ # TODO: Should combine the two instead of either or.
+ if (( $#remotes > 0 )); then
+ _wanted remotes expl remote compadd $* - $remotes
+ else
+ _wanted remotes expl remote _files $* - -W "($gitdir/remotes)" -g "$gitdir/remotes/*"
+ fi
+}
+
+__git_flow_hotfix_list () {
+ local expl
+ declare -a hotfixes
+
+ hotfixes=(${${(f)"$(_call_program hotfixes git flow hotfix list 2> /dev/null | tr -d ' |*')"}})
+ __git_command_successful || return
+
+ _wanted hotfixes expl 'hotfix' compadd $hotfixes
+}
+
+__git_branch_names () {
+ local expl
+ declare -a branch_names
+
+ branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
+ __git_command_successful || return
+
+ _wanted branch-names expl branch-name compadd $* - $branch_names
+}
+
+__git_command_successful () {
+ if (( ${#pipestatus:#0} > 0 )); then
+ _message 'not a git repository'
+ return 1
+ fi
+ return 0
+}
+
+zstyle ':completion:*:*:git:*' user-commands flow:'description for foo'
+
+# Detect if script is sourced or called via autoload
+[[ "$ZSH_EVAL_CONTEXT" != *:file ]] || return
+
+_git-flow "$@"
diff --git a/plugins/git-flow/git-flow.plugin.zsh b/plugins/git-flow/git-flow.plugin.zsh
index 8f0714b16..f842de998 100644
--- a/plugins/git-flow/git-flow.plugin.zsh
+++ b/plugins/git-flow/git-flow.plugin.zsh
@@ -1,369 +1,32 @@
-#!zsh
-#
-# Installation
-# ------------
-#
-# To achieve git-flow completion nirvana:
-#
-# 0. Update your zsh's git-completion module to the newest version.
-# From here. https://raw.githubusercontent.com/zsh-users/zsh/master/Completion/Unix/Command/_git
-#
-# 1. Install this file. Either:
-#
-# a. Place it in your .zshrc:
-#
-# b. Or, copy it somewhere (e.g. ~/.git-flow-completion.zsh) and put the following line in
-# your .zshrc:
-#
-# source ~/.git-flow-completion.zsh
-#
-# c. Or, use this file as an oh-my-zsh plugin.
-#
-
-#Alias
-alias gfl='git flow'
-alias gfli='git flow init'
+# Aliases
alias gcd='git checkout $(git config gitflow.branch.develop)'
alias gch='git checkout $(git config gitflow.prefix.hotfix)'
alias gcr='git checkout $(git config gitflow.prefix.release)'
+alias gfl='git flow'
alias gflf='git flow feature'
-alias gflh='git flow hotfix'
-alias gflr='git flow release'
-alias gflfs='git flow feature start'
-alias gflhs='git flow hotfix start'
-alias gflrs='git flow release start'
alias gflff='git flow feature finish'
+alias gflffc='git flow feature finish ${$(git_current_branch)#feature/}'
alias gflfp='git flow feature publish'
-alias gflhf='git flow hotfix finish'
-alias gflrf='git flow release finish'
-alias gflhp='git flow hotfix publish'
-alias gflrp='git flow release publish'
+alias gflfpc='git flow feature publish ${$(git_current_branch)#feature/}'
alias gflfpll='git flow feature pull'
+alias gflfs='git flow feature start'
+alias gflh='git flow hotfix'
+alias gflhf='git flow hotfix finish'
+alias gflhfc='git flow hotfix finish ${$(git_current_branch)#hotfix/}'
+alias gflhp='git flow hotfix publish'
+alias gflhpc='git flow hotfix publish ${$(git_current_branch)#hotfix/}'
+alias gflhs='git flow hotfix start'
+alias gfli='git flow init'
+alias gflr='git flow release'
+alias gflrf='git flow release finish'
+alias gflrfc='git flow release finish ${$(git_current_branch)#release/}'
+alias gflrp='git flow release publish'
+alias gflrpc='git flow release publish ${$(git_current_branch)#release/}'
+alias gflrs='git flow release start'
-_git-flow ()
-{
- local curcontext="$curcontext" state line
- typeset -A opt_args
-
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
-
- case $state in
- (command)
-
- local -a subcommands
- subcommands=(
- 'init:Initialize a new git repo with support for the branching model.'
- 'feature:Manage your feature branches.'
- 'release:Manage your release branches.'
- 'hotfix:Manage your hotfix branches.'
- 'support:Manage your support branches.'
- 'version:Shows version information.'
- )
- _describe -t commands 'git flow' subcommands
- ;;
-
- (options)
- case $line[1] in
-
- (init)
- _arguments \
- -f'[Force setting of gitflow branches, even if already configured]'
- ;;
-
- (version)
- ;;
-
- (hotfix)
- __git-flow-hotfix
- ;;
-
- (release)
- __git-flow-release
- ;;
-
- (feature)
- __git-flow-feature
- ;;
- esac
- ;;
- esac
-}
-
-__git-flow-release ()
-{
- local curcontext="$curcontext" state line
- typeset -A opt_args
-
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
-
- case $state in
- (command)
-
- local -a subcommands
- subcommands=(
- 'start:Start a new release branch.'
- 'finish:Finish a release branch.'
- 'list:List all your release branches. (Alias to `git flow release`)'
- 'publish: public'
- 'track: track'
- )
- _describe -t commands 'git flow release' subcommands
- _arguments \
- -v'[Verbose (more) output]'
- ;;
-
- (options)
- case $line[1] in
-
- (start)
- _arguments \
- -F'[Fetch from origin before performing finish]'\
- ':version:__git_flow_version_list'
- ;;
-
- (finish)
- _arguments \
- -F'[Fetch from origin before performing finish]' \
- -s'[Sign the release tag cryptographically]'\
- -u'[Use the given GPG-key for the digital signature (implies -s)]'\
- -m'[Use the given tag message]'\
- -p'[Push to $ORIGIN after performing finish]'\
- -k'[Keep branch after performing finish]'\
- -n"[Don't tag this release]"\
- ':version:__git_flow_version_list'
- ;;
-
- (publish)
- _arguments \
- ':version:__git_flow_version_list'\
- ;;
-
- (track)
- _arguments \
- ':version:__git_flow_version_list'\
- ;;
-
- *)
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- esac
- ;;
- esac
-}
-
-__git-flow-hotfix ()
-{
- local curcontext="$curcontext" state line
- typeset -A opt_args
-
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
-
- case $state in
- (command)
-
- local -a subcommands
- subcommands=(
- 'start:Start a new hotfix branch.'
- 'finish:Finish a hotfix branch.'
- 'list:List all your hotfix branches. (Alias to `git flow hotfix`)'
- )
- _describe -t commands 'git flow hotfix' subcommands
- _arguments \
- -v'[Verbose (more) output]'
- ;;
-
- (options)
- case $line[1] in
-
- (start)
- _arguments \
- -F'[Fetch from origin before performing finish]'\
- ':hotfix:__git_flow_version_list'\
- ':branch-name:__git_branch_names'
- ;;
-
- (finish)
- _arguments \
- -F'[Fetch from origin before performing finish]' \
- -s'[Sign the release tag cryptographically]'\
- -u'[Use the given GPG-key for the digital signature (implies -s)]'\
- -m'[Use the given tag message]'\
- -p'[Push to $ORIGIN after performing finish]'\
- -k'[Keep branch after performing finish]'\
- -n"[Don't tag this release]"\
- ':hotfix:__git_flow_hotfix_list'
- ;;
-
- *)
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- esac
- ;;
- esac
-}
-
-__git-flow-feature ()
-{
- local curcontext="$curcontext" state line
- typeset -A opt_args
-
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
-
- case $state in
- (command)
-
- local -a subcommands
- subcommands=(
- 'start:Start a new feature branch.'
- 'finish:Finish a feature branch.'
- 'list:List all your feature branches. (Alias to `git flow feature`)'
- 'publish: publish'
- 'track: track'
- 'diff: diff'
- 'rebase: rebase'
- 'checkout: checkout'
- 'pull: pull'
- )
- _describe -t commands 'git flow feature' subcommands
- _arguments \
- -v'[Verbose (more) output]'
- ;;
-
- (options)
- case $line[1] in
-
- (start)
- _arguments \
- -F'[Fetch from origin before performing finish]'\
- ':feature:__git_flow_feature_list'\
- ':branch-name:__git_branch_names'
- ;;
-
- (finish)
- _arguments \
- -F'[Fetch from origin before performing finish]' \
- -r'[Rebase instead of merge]'\
- -k'[Keep branch after performing finish]'\
- ':feature:__git_flow_feature_list'
- ;;
-
- (publish)
- _arguments \
- ':feature:__git_flow_feature_list'\
- ;;
-
- (track)
- _arguments \
- ':feature:__git_flow_feature_list'\
- ;;
-
- (diff)
- _arguments \
- ':branch:__git_flow_feature_list'\
- ;;
-
- (rebase)
- _arguments \
- -i'[Do an interactive rebase]' \
- ':branch:__git_flow_feature_list'
- ;;
-
- (checkout)
- _arguments \
- ':branch:__git_flow_feature_list'\
- ;;
-
- (pull)
- _arguments \
- ':remote:__git_remotes'\
- ':branch:__git_flow_feature_list'
- ;;
-
- *)
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- esac
- ;;
- esac
-}
-
-__git_flow_version_list ()
-{
- local expl
- declare -a versions
-
- versions=(${${(f)"$(_call_program versions git flow release list 2> /dev/null | tr -d ' |*')"}})
- __git_command_successful || return
-
- _wanted versions expl 'version' compadd $versions
-}
-
-__git_flow_feature_list ()
-{
- local expl
- declare -a features
-
- features=(${${(f)"$(_call_program features git flow feature list 2> /dev/null | tr -d ' |*')"}})
- __git_command_successful || return
-
- _wanted features expl 'feature' compadd $features
-}
-
-__git_remotes () {
- local expl gitdir remotes
-
- gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
- __git_command_successful || return
-
- remotes=(${${(f)"$(_call_program remotes git config --get-regexp '"^remote\..*\.url$"')"}//#(#b)remote.(*).url */$match[1]})
- __git_command_successful || return
-
- # TODO: Should combine the two instead of either or.
- if (( $#remotes > 0 )); then
- _wanted remotes expl remote compadd $* - $remotes
- else
- _wanted remotes expl remote _files $* - -W "($gitdir/remotes)" -g "$gitdir/remotes/*"
- fi
-}
-
-__git_flow_hotfix_list ()
-{
- local expl
- declare -a hotfixes
-
- hotfixes=(${${(f)"$(_call_program hotfixes git flow hotfix list 2> /dev/null | tr -d ' |*')"}})
- __git_command_successful || return
-
- _wanted hotfixes expl 'hotfix' compadd $hotfixes
-}
-
-__git_branch_names () {
- local expl
- declare -a branch_names
-
- branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
- __git_command_successful || return
-
- _wanted branch-names expl branch-name compadd $* - $branch_names
-}
-
-__git_command_successful () {
- if (( ${#pipestatus:#0} > 0 )); then
- _message 'not a git repository'
- return 1
- fi
- return 0
-}
-
-zstyle ':completion:*:*:git:*' user-commands flow:'description for foo'
+# Source completion script
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+source "${0:A:h}/_git-flow"
diff --git a/plugins/git-prompt/README.md b/plugins/git-prompt/README.md
index c6610fa94..83d365c84 100644
--- a/plugins/git-prompt/README.md
+++ b/plugins/git-prompt/README.md
@@ -11,7 +11,8 @@ plugins=(... git-prompt)
See the [original repository](https://github.com/olivierverdier/zsh-git-prompt).
-## Prerequisites
+## Requirements
+
This plugin uses `python`, so your host needs to have it installed
## Examples
@@ -30,7 +31,7 @@ The prompt may look like the following:
By default, the general appearance of the prompt is:
-```
+```text
(|)
```
@@ -58,9 +59,8 @@ The symbols are as follows:
## Customisation
- Set the variable `ZSH_THEME_GIT_PROMPT_CACHE` to any value in order to enable caching.
-- You may also change a number of variables (whose name start with `ZSH_THEME_GIT_PROMPT_`)
+- You may also change a number of variables (whose name start with `ZSH_THEME_GIT_PROMPT_`)
to change the appearance of the prompt. Take a look at the bottom of the [plugin file](git-prompt.plugin.zsh)`
to see what variables are available.
-
**Enjoy!**
diff --git a/plugins/git-prompt/git-prompt.plugin.zsh b/plugins/git-prompt/git-prompt.plugin.zsh
index a4c952471..c86c1f59b 100644
--- a/plugins/git-prompt/git-prompt.plugin.zsh
+++ b/plugins/git-prompt/git-prompt.plugin.zsh
@@ -1,3 +1,8 @@
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
__GIT_PROMPT_DIR="${0:A:h}"
## Hook function definitions
diff --git a/plugins/git-prompt/gitstatus.py b/plugins/git-prompt/gitstatus.py
index 786274a71..4dea8000f 100644
--- a/plugins/git-prompt/gitstatus.py
+++ b/plugins/git-prompt/gitstatus.py
@@ -81,7 +81,7 @@ for st in status:
staged.append(st)
stashed = get_stash()
-if not changed and not staged and not conflicts and not untracked and not stashed:
+if not changed and not staged and not conflicts and not untracked:
clean = 1
else:
clean = 0
diff --git a/plugins/git/README.md b/plugins/git/README.md
index 113080874..b9af3488f 100644
--- a/plugins/git/README.md
+++ b/plugins/git/README.md
@@ -130,6 +130,7 @@ plugins=(... git)
| grbd | git rebase $(git_develop_branch) |
| grbi | git rebase -i |
| grbm | git rebase $(git_main_branch) |
+| grbom | git rebase origin/$(git_main_branch) |
| grbo | git rebase --onto |
| grbs | git rebase --skip |
| grev | git revert |
diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh
index 5a3c98287..8f7e623ec 100644
--- a/plugins/git/git.plugin.zsh
+++ b/plugins/git/git.plugin.zsh
@@ -24,9 +24,7 @@ compdef _git _git_log_prettily=git-log
# Warn if the current branch is a WIP
function work_in_progress() {
- if $(git log -n 1 2>/dev/null | grep -q -c "\-\-wip\-\-"); then
- echo "WIP!!"
- fi
+ command git -c log.showSignature=false log -n 1 2>/dev/null | grep -q -- "--wip--" && echo "WIP!!"
}
# Check if main exists and use instead of master
@@ -251,6 +249,7 @@ alias grbc='git rebase --continue'
alias grbd='git rebase $(git_develop_branch)'
alias grbi='git rebase -i'
alias grbm='git rebase $(git_main_branch)'
+alias grbom='git rebase origin/$(git_main_branch)'
alias grbo='git rebase --onto'
alias grbs='git rebase --skip'
alias grev='git revert'
diff --git a/plugins/gitfast/git-completion.bash b/plugins/gitfast/git-completion.bash
index 4497a294f..f7b09b2c1 100644
--- a/plugins/gitfast/git-completion.bash
+++ b/plugins/gitfast/git-completion.bash
@@ -3383,7 +3383,7 @@ _git_worktree ()
# Here we are not completing an --option, it's either the
# path or a ref.
case "$prev" in
- -b|-B) # Complete refs for branch to be created/reseted.
+ -b|-B) # Complete refs for branch to be created/reset.
__git_complete_refs
;;
-*) # The previous word is an -o|--option without an
diff --git a/plugins/gitfast/gitfast.plugin.zsh b/plugins/gitfast/gitfast.plugin.zsh
index 7b6b67e92..a6db0c6bd 100644
--- a/plugins/gitfast/gitfast.plugin.zsh
+++ b/plugins/gitfast/gitfast.plugin.zsh
@@ -1,3 +1,8 @@
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
source "${0:A:h}/git-prompt.sh"
function git_prompt_info() {
diff --git a/plugins/gnu-utils/gnu-utils.plugin.zsh b/plugins/gnu-utils/gnu-utils.plugin.zsh
index 539e7fe4d..6ede9e3a7 100644
--- a/plugins/gnu-utils/gnu-utils.plugin.zsh
+++ b/plugins/gnu-utils/gnu-utils.plugin.zsh
@@ -11,11 +11,8 @@ if [[ ! -x "${commands[gwhoami]}" ]]; then
fi
__gnu_utils() {
- emulate -L zsh
- local gcmds
+ local -a gcmds
local gcmd
- local cmd
- local prefix
# coreutils
gcmds=('g[' 'gbase64' 'gbasename' 'gcat' 'gchcon' 'gchgrp' 'gchmod'
@@ -43,41 +40,21 @@ __gnu_utils() {
(( ${+commands[$gcmd]} )) || continue
# This method allows for builtin commands to be primary but it's
- # lost if hash -r or rehash -f is executed. Thus, those two
- # functions have to be wrapped.
+ # lost if hash -r or rehash is executed, or if $PATH is updated.
+ # Thus, a preexec hook is needed, which will only run if whoami
+ # is not already rehashed.
#
hash ${gcmd[2,-1]}=${commands[$gcmd]}
-
- # This method generates wrapper functions.
- # It will override shell builtins.
- #
- # eval "function $gcmd[2,-1]() { \"${prefix}/${gcmd//"["/"\\["}\" \"\$@\"; }"
-
- # This method is inflexible since the aliases are at risk of being
- # overridden resulting in the BSD coreutils being called.
- #
- # alias "$gcmd[2,-1]"="${prefix}/${gcmd//"["/"\\["}"
done
return 0
}
-__gnu_utils
-function hash() {
- if [[ "$*" =~ "-(r|f)" ]]; then
- builtin hash "$@"
- __gnu_utils
- else
- builtin hash "$@"
- fi
-}
-
-function rehash() {
- if [[ "$*" =~ "-f" ]]; then
- builtin rehash "$@"
- __gnu_utils
- else
- builtin rehash "$@"
- fi
+__gnu_utils_preexec() {
+ # Run __gnu_utils when the whoami command is not already rehashed.
+ # This acts as a sign that we need to rehash all GNU utils.
+ [[ "${commands[whoami]}" = "${commands[gwhoami]}" ]] || __gnu_utils
}
+autoload -Uz add-zsh-hook
+add-zsh-hook preexec __gnu_utils_preexec
diff --git a/plugins/golang/README.md b/plugins/golang/README.md
index af2c4dff9..979c89010 100644
--- a/plugins/golang/README.md
+++ b/plugins/golang/README.md
@@ -11,22 +11,27 @@ plugins=(... golang)
## Aliases
-| Alias | Command | Description |
-| ------- | ----------------------- | ------------------------------------------------------------- |
-| gob | `go build` | Build your code |
-| goc | `go clean` | Removes object files from package source directories |
-| god | `go doc` | Prints documentation comments |
-| gof | `go fmt` | Gofmt formats (aligns and indents) Go programs. |
-| gofa | `go fmt ./...` | Run go fmt for all packages in current directory, recursively |
-| gog | `go get` | Downloads packages and then installs them to $GOPATH |
-| gog | `go get ./...` | Installs all dependencies in current directory, recursively |
-| goi | `go install` | Compiles and installs packages to $GOPATH |
-| gol | `go list` | Lists Go packages |
-| gom | `go mod` | Access to operations on modules |
-| gop | `cd $GOPATH` | Takes you to $GOPATH |
-| gopb | `cd $GOPATH/bin` | Takes you to $GOPATH/bin |
-| gops | `cd $GOPATH/src` | Takes you to $GOPATH/src |
-| gor | `go run` | Compiles and runs your code |
-| got | `go test` | Runs tests |
-| gota | `go test ./...` | Runs tests in all subdirectories |
-| gov | `go vet` | Vet examines Go source code and reports suspicious constructs |
+| Alias | Command | Description |
+| ------ | ----------------- | ------------------------------------------------------------- |
+| gob | `go build` | Build your code |
+| goc | `go clean` | Removes object files from package source directories |
+| god | `go doc` | Prints documentation comments |
+| gof | `go fmt` | Gofmt formats (aligns and indents) Go programs. |
+| gofa | `go fmt ./...` | Run go fmt for all packages in current directory, recursively |
+| gofx | `go fix` | Update packages to use a new API |
+| gog | `go get` | Downloads packages and then installs them to $GOPATH |
+| gog | `go get ./...` | Installs all dependencies in current directory, recursively |
+| goi | `go install` | Compiles and installs packages to $GOPATH |
+| gol | `go list` | Lists Go packages |
+| gom | `go mod` | Access to operations on modules |
+| gopa | `cd $GOPATH` | Takes you to `$GOPATH` |
+| gopb | `cd $GOPATH/bin` | Takes you to `$GOPATH/bin` |
+| gops | `cd $GOPATH/src` | Takes you to `$GOPATH/src` |
+| gor | `go run` | Compiles and runs your code |
+| got | `go test` | Runs tests |
+| gota | `go test ./...` | Runs tests in all subdirectories |
+| goto | `go tool` | Prints all the available tools |
+| gotoc | `go tool compile` | Generates object file |
+| gotod | `go tool dist` | Utility to bootstrap, build and test go runtime |
+| gotofx | `go tool fix` | Fixes an application to use newer features |
+| gov | `go vet` | Vet examines Go source code and reports suspicious constructs |
diff --git a/plugins/golang/_golang b/plugins/golang/_golang
new file mode 100644
index 000000000..01b976b12
--- /dev/null
+++ b/plugins/golang/_golang
@@ -0,0 +1,249 @@
+#compdef go
+
+__go_packages() {
+ local gopaths
+ declare -a gopaths
+ gopaths=("${(s/:/)$(go env GOPATH)}")
+ gopaths+=("$(go env GOROOT)")
+ for p in $gopaths; do
+ _path_files -W "$p/src" -/
+ done
+}
+
+__go_identifiers() {
+ local tmpl_path="${functions_source[$0]:h}/templates"
+ compadd $(godoc -templates "$tmpl_path" ${words[-2]} 2> /dev/null)
+}
+
+_go() {
+ typeset -a commands build_flags
+ commands+=(
+ 'build[compile packages and dependencies]'
+ 'clean[remove object files]'
+ 'doc[run godoc on package sources]'
+ 'env[print Go environment information]'
+ 'fix[run go tool fix on packages]'
+ 'fmt[run gofmt on package sources]'
+ 'generate[generate Go files by processing source]'
+ 'get[download and install packages and dependencies]'
+ 'help[display help]'
+ 'install[compile and install packages and dependencies]'
+ 'list[list packages]'
+ 'mod[modules maintenance]'
+ 'run[compile and run Go program]'
+ 'test[test packages]'
+ 'tool[run specified go tool]'
+ 'version[print Go version]'
+ 'vet[run go tool vet on packages]'
+ )
+ if (( CURRENT == 2 )); then
+ # explain go commands
+ _values 'go tool commands' ${commands[@]}
+ return
+ fi
+ build_flags=(
+ '-a[force reinstallation of packages that are already up to date]'
+ '-n[print the commands but do not run them]'
+ '-p[number of parallel builds]:number'
+ '-race[enable data race detection]'
+ '-x[print the commands]'
+ '-work[print temporary directory name and keep it]'
+ '-ccflags[flags for 5c/6c/8c]:flags'
+ '-gcflags[flags for 5g/6g/8g]:flags'
+ '-ldflags[flags for 5l/6l/8l]:flags'
+ '-gccgoflags[flags for gccgo]:flags'
+ '-compiler[name of compiler to use]:name'
+ '-installsuffix[suffix to add to package directory]:suffix'
+ '-tags[list of build tags to consider satisfied]:tags'
+ )
+
+ case ${words[2]} in
+ doc)
+ _arguments -s -w \
+ "-c[symbol matching honors case (paths not affected)]" \
+ "-cmd[show symbols with package docs even if package is a command]" \
+ "-u[show unexported symbols as well as exported]" \
+ "2:importpaths:__go_packages" \
+ ":next identifiers:__go_identifiers"
+ ;;
+ clean)
+ _arguments -s -w \
+ "-i[remove the corresponding installed archive or binary (what 'go install' would create)]" \
+ "-n[print the remove commands it would execute, but not run them]" \
+ "-r[apply recursively to all the dependencies of the packages named by the import paths]" \
+ "-x[print remove commands as it executes them]" \
+ "*:importpaths:__go_packages"
+ ;;
+ fix|fmt|vet)
+ _alternative ':importpaths:__go_packages' ':files:_path_files -g "*.go"'
+ ;;
+ install)
+ _arguments -s -w : ${build_flags[@]} \
+ "-v[show package names]" \
+ '*:importpaths:__go_packages'
+ ;;
+ get)
+ _arguments -s -w : \
+ ${build_flags[@]}
+ ;;
+ build)
+ _arguments -s -w : \
+ ${build_flags[@]} \
+ "-v[show package names]" \
+ "-o[output file]:file:_files" \
+ "*:args:{ _alternative ':importpaths:__go_packages' ':files:_path_files -g \"*.go\"' }"
+ ;;
+ test)
+ _arguments -s -w : \
+ ${build_flags[@]} \
+ "-c[do not run, compile the test binary]" \
+ "-i[do not run, install dependencies]" \
+ "-v[print test output]" \
+ "-x[print the commands]" \
+ "-short[use short mode]" \
+ "-parallel[number of parallel tests]:number" \
+ "-cpu[values of GOMAXPROCS to use]:number list" \
+ "-run[run tests and examples matching regexp]:regexp" \
+ "-bench[run benchmarks matching regexp]:regexp" \
+ "-benchmem[print memory allocation stats]" \
+ "-benchtime[run each benchmark until taking this long]:duration" \
+ "-blockprofile[write goroutine blocking profile to file]:file" \
+ "-blockprofilerate[set sampling rate of goroutine blocking profile]:number" \
+ "-timeout[kill test after that duration]:duration" \
+ "-cpuprofile[write CPU profile to file]:file:_files" \
+ "-memprofile[write heap profile to file]:file:_files" \
+ "-memprofilerate[set heap profiling rate]:number" \
+ "*:args:{ _alternative ':importpaths:__go_packages' ':files:_path_files -g \"*.go\"' }"
+ ;;
+ list)
+ _arguments -s -w : \
+ "-f[alternative format for the list]:format" \
+ "-json[print data in json format]" \
+ "-compiled[set CompiledGoFiles to the Go source files presented to the compiler]" \
+ "-deps[iterate over not just the named packages but also all their dependencies]" \
+ "-e[change the handling of erroneous packages]" \
+ "-export[set the Export field to the name of a file containing up-to-date export information for the given package]" \
+ "-find[identify the named packages but not resolve their dependencies]" \
+ "-test[report not only the named packages but also their test binaries]" \
+ "-m[list modules instead of packages]" \
+ "-u[adds information about available upgrades]" \
+ "-versions[set the Module's Versions field to a list of all known versions of that module]:number" \
+ "*:importpaths:__go_packages"
+ ;;
+ mod)
+ local -a mod_commands
+ mod_commands+=(
+ 'download[download modules to local cache]'
+ 'edit[edit go.mod from tools or scripts]'
+ 'graph[print module requirement graph]'
+ 'init[initialize new module in current directory]'
+ 'tidy[add missing and remove unused modules]'
+ 'vendor[make vendored copy of dependencies]'
+ 'verify[verify dependencies have expected content]'
+ 'why[explain why packages or modules are needed]'
+ )
+
+ if (( CURRENT == 3 )); then
+ _values 'go mod commands' ${mod_commands[@]} "help[display help]"
+ return
+ fi
+
+ case ${words[3]} in
+ help)
+ _values 'go mod commands' ${mod_commands[@]}
+ ;;
+ download)
+ _arguments -s -w : \
+ "-json[print a sequence of JSON objects standard output]" \
+ "*:flags"
+ ;;
+ edit)
+ _arguments -s -w : \
+ "-fmt[reformat the go.mod file]" \
+ "-module[change the module's path]" \
+ "-replace[=old{@v}=new{@v} add a replacement of the given module path and version pair]:name" \
+ "-dropreplace[=old{@v}=new{@v} drop a replacement of the given module path and version pair]:name" \
+ "-go[={version} set the expected Go language version]:number" \
+ "-print[print the final go.mod in its text format]" \
+ "-json[print the final go.mod file in JSON format]" \
+ "*:flags"
+ ;;
+ graph)
+ ;;
+ init)
+ ;;
+ tidy)
+ _arguments -s -w : \
+ "-v[print information about removed modules]" \
+ "*:flags"
+ ;;
+ vendor)
+ _arguments -s -w : \
+ "-v[print the names of vendored]" \
+ "*:flags"
+ ;;
+ verify)
+ ;;
+ why)
+ _arguments -s -w : \
+ "-m[treats the arguments as a list of modules and finds a path to any package in each of the modules]" \
+ "-vendor[exclude tests of dependencies]" \
+ "*:importpaths:__go_packages"
+ ;;
+ esac
+ ;;
+ help)
+ _values "${commands[@]}" \
+ 'environment[show Go environment variables available]' \
+ 'gopath[GOPATH environment variable]' \
+ 'packages[description of package lists]' \
+ 'remote[remote import path syntax]' \
+ 'testflag[description of testing flags]' \
+ 'testfunc[description of testing functions]'
+ ;;
+ run)
+ _arguments -s -w : \
+ ${build_flags[@]} \
+ '*:file:_files -g "*.go"'
+ ;;
+ tool)
+ if (( CURRENT == 3 )); then
+ _values "go tool" $(go tool)
+ return
+ fi
+ case ${words[3]} in
+ [568]g)
+ _arguments -s -w : \
+ '-I[search for packages in DIR]:includes:_path_files -/' \
+ '-L[show full path in file:line prints]' \
+ '-S[print the assembly language]' \
+ '-V[print the compiler version]' \
+ '-e[no limit on number of errors printed]' \
+ '-h[panic on an error]' \
+ '-l[disable inlining]' \
+ '-m[print optimization decisions]' \
+ '-o[file specify output file]:file' \
+ '-p[assumed import path for this code]:importpath' \
+ '-u[disable package unsafe]' \
+ "*:file:_files -g '*.go'"
+ ;;
+ [568]l)
+ local O=${words[3]%l}
+ _arguments -s -w : \
+ '-o[file specify output file]:file' \
+ '-L[search for packages in DIR]:includes:_path_files -/' \
+ "*:file:_files -g '*.[ao$O]'"
+ ;;
+ dist)
+ _values "dist tool" banner bootstrap clean env install version
+ ;;
+ *)
+ # use files by default
+ _files
+ ;;
+ esac
+ ;;
+ esac
+}
+
+_go "$@"
diff --git a/plugins/golang/golang.plugin.zsh b/plugins/golang/golang.plugin.zsh
index fce663fd6..4dafecd86 100644
--- a/plugins/golang/golang.plugin.zsh
+++ b/plugins/golang/golang.plugin.zsh
@@ -1,276 +1,34 @@
-# install in /etc/zsh/zshrc or your personal .zshrc
+## completion
+compctl -g "*.go" gofmt # standard go tools
+compctl -g "*.go" gccgo # gccgo
# gc
-prefixes=(5 6 8)
-for p in $prefixes; do
- compctl -g "*.${p}" ${p}l
- compctl -g "*.go" ${p}g
+for p in 5 6 8; do
+ compctl -g "*.${p}" ${p}l
+ compctl -g "*.go" ${p}g
done
+unset p
-# standard go tools
-compctl -g "*.go" gofmt
-
-# gccgo
-compctl -g "*.go" gccgo
-
-# go tool
-__go_tool_complete() {
- typeset -a commands build_flags
- commands+=(
- 'build[compile packages and dependencies]'
- 'clean[remove object files]'
- 'doc[run godoc on package sources]'
- 'env[print Go environment information]'
- 'fix[run go tool fix on packages]'
- 'fmt[run gofmt on package sources]'
- 'generate[generate Go files by processing source]'
- 'get[download and install packages and dependencies]'
- 'help[display help]'
- 'install[compile and install packages and dependencies]'
- 'list[list packages]'
- 'mod[modules maintenance]'
- 'run[compile and run Go program]'
- 'test[test packages]'
- 'tool[run specified go tool]'
- 'version[print Go version]'
- 'vet[run go tool vet on packages]'
- )
- if (( CURRENT == 2 )); then
- # explain go commands
- _values 'go tool commands' ${commands[@]}
- return
- fi
- build_flags=(
- '-a[force reinstallation of packages that are already up to date]'
- '-n[print the commands but do not run them]'
- '-p[number of parallel builds]:number'
- '-race[enable data race detection]'
- '-x[print the commands]'
- '-work[print temporary directory name and keep it]'
- '-ccflags[flags for 5c/6c/8c]:flags'
- '-gcflags[flags for 5g/6g/8g]:flags'
- '-ldflags[flags for 5l/6l/8l]:flags'
- '-gccgoflags[flags for gccgo]:flags'
- '-compiler[name of compiler to use]:name'
- '-installsuffix[suffix to add to package directory]:suffix'
- '-tags[list of build tags to consider satisfied]:tags'
- )
- __go_packages() {
- local gopaths
- declare -a gopaths
- gopaths=("${(s/:/)$(go env GOPATH)}")
- gopaths+=("$(go env GOROOT)")
- for p in $gopaths; do
- _path_files -W "$p/src" -/
- done
- }
- __go_identifiers() {
- compadd $(godoc -templates $ZSH/plugins/golang/templates ${words[-2]} 2> /dev/null)
- }
- case ${words[2]} in
- doc)
- _arguments -s -w \
- "-c[symbol matching honors case (paths not affected)]" \
- "-cmd[show symbols with package docs even if package is a command]" \
- "-u[show unexported symbols as well as exported]" \
- "2:importpaths:__go_packages" \
- ":next identifiers:__go_identifiers"
- ;;
- clean)
- _arguments -s -w \
- "-i[remove the corresponding installed archive or binary (what 'go install' would create)]" \
- "-n[print the remove commands it would execute, but not run them]" \
- "-r[apply recursively to all the dependencies of the packages named by the import paths]" \
- "-x[print remove commands as it executes them]" \
- "*:importpaths:__go_packages"
- ;;
- fix|fmt|vet)
- _alternative ':importpaths:__go_packages' ':files:_path_files -g "*.go"'
- ;;
- install)
- _arguments -s -w : ${build_flags[@]} \
- "-v[show package names]" \
- '*:importpaths:__go_packages'
- ;;
- get)
- _arguments -s -w : \
- ${build_flags[@]}
- ;;
- build)
- _arguments -s -w : \
- ${build_flags[@]} \
- "-v[show package names]" \
- "-o[output file]:file:_files" \
- "*:args:{ _alternative ':importpaths:__go_packages' ':files:_path_files -g \"*.go\"' }"
- ;;
- test)
- _arguments -s -w : \
- ${build_flags[@]} \
- "-c[do not run, compile the test binary]" \
- "-i[do not run, install dependencies]" \
- "-v[print test output]" \
- "-x[print the commands]" \
- "-short[use short mode]" \
- "-parallel[number of parallel tests]:number" \
- "-cpu[values of GOMAXPROCS to use]:number list" \
- "-run[run tests and examples matching regexp]:regexp" \
- "-bench[run benchmarks matching regexp]:regexp" \
- "-benchmem[print memory allocation stats]" \
- "-benchtime[run each benchmark until taking this long]:duration" \
- "-blockprofile[write goroutine blocking profile to file]:file" \
- "-blockprofilerate[set sampling rate of goroutine blocking profile]:number" \
- "-timeout[kill test after that duration]:duration" \
- "-cpuprofile[write CPU profile to file]:file:_files" \
- "-memprofile[write heap profile to file]:file:_files" \
- "-memprofilerate[set heap profiling rate]:number" \
- "*:args:{ _alternative ':importpaths:__go_packages' ':files:_path_files -g \"*.go\"' }"
- ;;
- list)
- _arguments -s -w : \
- "-f[alternative format for the list]:format" \
- "-json[print data in json format]" \
- "-compiled[set CompiledGoFiles to the Go source files presented to the compiler]" \
- "-deps[iterate over not just the named packages but also all their dependencies]" \
- "-e[change the handling of erroneous packages]" \
- "-export[set the Export field to the name of a file containing up-to-date export information for the given package]" \
- "-find[identify the named packages but not resolve their dependencies]" \
- "-test[report not only the named packages but also their test binaries]" \
- "-m[list modules instead of packages]" \
- "-u[adds information about available upgrades]" \
- "-versions[set the Module's Versions field to a list of all known versions of that module]:number" \
- "*:importpaths:__go_packages"
- ;;
- mod)
- typeset -a mod_commands
- mod_commands+=(
- 'download[download modules to local cache]'
- 'edit[edit go.mod from tools or scripts]'
- 'graph[print module requirement graph]'
- 'init[initialize new module in current directory]'
- 'tidy[add missing and remove unused modules]'
- 'vendor[make vendored copy of dependencies]'
- 'verify[verify dependencies have expected content]'
- 'why[explain why packages or modules are needed]'
- )
- if (( CURRENT == 3 )); then
- _values 'go mod commands' ${mod_commands[@]} "help[display help]"
- return
- fi
- case ${words[3]} in
- help)
- _values 'go mod commands' ${mod_commands[@]}
- ;;
- download)
- _arguments -s -w : \
- "-json[print a sequence of JSON objects standard output]" \
- "*:flags"
- ;;
- edit)
- _arguments -s -w : \
- "-fmt[reformat the go.mod file]" \
- "-module[change the module's path]" \
- "-replace[=old{@v}=new{@v} add a replacement of the given module path and version pair]:name" \
- "-dropreplace[=old{@v}=new{@v} drop a replacement of the given module path and version pair]:name" \
- "-go[={version} set the expected Go language version]:number" \
- "-print[print the final go.mod in its text format]" \
- "-json[print the final go.mod file in JSON format]" \
- "*:flags"
- ;;
- graph)
- ;;
- init)
- ;;
- tidy)
- _arguments -s -w : \
- "-v[print information about removed modules]" \
- "*:flags"
- ;;
- vendor)
- _arguments -s -w : \
- "-v[print the names of vendored]" \
- "*:flags"
- ;;
- verify)
- ;;
- why)
- _arguments -s -w : \
- "-m[treats the arguments as a list of modules and finds a path to any package in each of the modules]" \
- "-vendor[exclude tests of dependencies]" \
- "*:importpaths:__go_packages"
- ;;
- esac
- ;;
- help)
- _values "${commands[@]}" \
- 'environment[show Go environment variables available]' \
- 'gopath[GOPATH environment variable]' \
- 'packages[description of package lists]' \
- 'remote[remote import path syntax]' \
- 'testflag[description of testing flags]' \
- 'testfunc[description of testing functions]'
- ;;
- run)
- _arguments -s -w : \
- ${build_flags[@]} \
- '*:file:_files -g "*.go"'
- ;;
- tool)
- if (( CURRENT == 3 )); then
- _values "go tool" $(go tool)
- return
- fi
- case ${words[3]} in
- [568]g)
- _arguments -s -w : \
- '-I[search for packages in DIR]:includes:_path_files -/' \
- '-L[show full path in file:line prints]' \
- '-S[print the assembly language]' \
- '-V[print the compiler version]' \
- '-e[no limit on number of errors printed]' \
- '-h[panic on an error]' \
- '-l[disable inlining]' \
- '-m[print optimization decisions]' \
- '-o[file specify output file]:file' \
- '-p[assumed import path for this code]:importpath' \
- '-u[disable package unsafe]' \
- "*:file:_files -g '*.go'"
- ;;
- [568]l)
- local O=${words[3]%l}
- _arguments -s -w : \
- '-o[file specify output file]:file' \
- '-L[search for packages in DIR]:includes:_path_files -/' \
- "*:file:_files -g '*.[ao$O]'"
- ;;
- dist)
- _values "dist tool" banner bootstrap clean env install version
- ;;
- *)
- # use files by default
- _files
- ;;
- esac
- ;;
- esac
-}
-
-compdef __go_tool_complete go
-
-# aliases: go<~>
+## aliases
alias gob='go build'
alias goc='go clean'
alias god='go doc'
alias gof='go fmt'
alias gofa='go fmt ./...'
+alias gofx='go fix'
alias gog='go get'
alias goga='go get ./...'
alias goi='go install'
alias gol='go list'
alias gom='go mod'
-alias gop='cd $GOPATH'
+alias gopa='cd $GOPATH'
alias gopb='cd $GOPATH/bin'
alias gops='cd $GOPATH/src'
alias gor='go run'
alias got='go test'
alias gota='go test ./...'
+alias goto='go tool'
+alias gotoc='go tool compile'
+alias gotod='go tool dist'
+alias gotofx='go tool fix'
alias gov='go vet'
diff --git a/plugins/grails/grails.plugin.zsh b/plugins/grails/grails.plugin.zsh
index 11777738c..ddc257428 100644
--- a/plugins/grails/grails.plugin.zsh
+++ b/plugins/grails/grails.plugin.zsh
@@ -1,5 +1,5 @@
_enumerateGrailsScripts() {
- # Default directoryies
+ # Default directories
directories=($GRAILS_HOME/scripts ~/.grails/scripts ./scripts)
# Check all of the plugins directories, if they exist
diff --git a/plugins/grunt/grunt.plugin.zsh b/plugins/grunt/grunt.plugin.zsh
index 3f9695177..a89469a59 100644
--- a/plugins/grunt/grunt.plugin.zsh
+++ b/plugins/grunt/grunt.plugin.zsh
@@ -82,7 +82,7 @@ function __grunt() {
update_msg=' (cache updated)'
fi
- # Make optioins completion.
+ # Make options completion.
if [[ ${#__grunt_opts} -gt 0 ]]; then
opts+=("${__grunt_opts[@]}")
fi
@@ -161,7 +161,7 @@ function __grunt_update_cache() {
fi
if [[ $is_updating -ne 0 ]]; then
- # Update caceh.
+ # Update cache.
__grunt_version=$version
__grunt_gruntfile=$gruntfile
is_updating=1
diff --git a/plugins/helm/helm.plugin.zsh b/plugins/helm/helm.plugin.zsh
index 78499c15d..cadfa551a 100644
--- a/plugins/helm/helm.plugin.zsh
+++ b/plugins/helm/helm.plugin.zsh
@@ -1,7 +1,22 @@
-# Autocompletion for helm.
-#
-# Copy from kubectl : https://github.com/pstadler
-
-if [ $commands[helm] ]; then
- source <(helm completion zsh)
+if (( ! $+commands[helm] )); then
+ return
+fi
+
+# TODO: 2021-12-28: delete this block
+# Remove old generated file
+command rm -f "${ZSH_CACHE_DIR}/helm_completion"
+
+# TODO: 2021-12-28: remove this bit of code as it exists in oh-my-zsh.sh
+# Add completions folder in $ZSH_CACHE_DIR
+command mkdir -p "$ZSH_CACHE_DIR/completions"
+(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
+
+# If the completion file does not exist, generate it and then source it
+# Otherwise, source it and regenerate in the background
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_helm" ]]; then
+ helm completion zsh >| "$ZSH_CACHE_DIR/completions/_helm"
+ source "$ZSH_CACHE_DIR/completions/_helm"
+else
+ source "$ZSH_CACHE_DIR/completions/_helm"
+ helm completion zsh >| "$ZSH_CACHE_DIR/completions/_helm" &|
fi
diff --git a/plugins/heroku/heroku.plugin.zsh b/plugins/heroku/heroku.plugin.zsh
index 9a99b4211..d22c1bb2f 100644
--- a/plugins/heroku/heroku.plugin.zsh
+++ b/plugins/heroku/heroku.plugin.zsh
@@ -1,9 +1,9 @@
-HEROKU_AC_CACHE_DIR="$HOME/.cache"
-if [ "$(uname -s)" = "Darwin" ]; then
- HEROKU_AC_CACHE_DIR="$HOME/Library/Caches"
+if [[ "$OSTYPE" = darwin* ]]; then
+ cache_dir="${HOME}/Library/Caches"
+else
+ cache_dir="${XDG_CACHE_HOME:-"${HOME}/.cache"}"
fi
-if [ ! -z "$XDG_CACHE_HOME" ]; then
- HEROKU_AC_CACHE_DIR="$XDG_CACHE_DIR"
-fi
-HEROKU_AC_ZSH_SETUP_PATH=$HEROKU_AC_CACHE_DIR/heroku/autocomplete/zsh_setup
-[ -f $HEROKU_AC_ZSH_SETUP_PATH ] && source $HEROKU_AC_ZSH_SETUP_PATH
+
+setup_path="${cache_dir}/heroku/autocomplete/zsh_setup"
+[[ -f "$setup_path" ]] && source $setup_path
+unset cache_dir setup_path
diff --git a/plugins/history-substring-search/history-substring-search.plugin.zsh b/plugins/history-substring-search/history-substring-search.plugin.zsh
index d2c749bc3..63f0bdd42 100644
--- a/plugins/history-substring-search/history-substring-search.plugin.zsh
+++ b/plugins/history-substring-search/history-substring-search.plugin.zsh
@@ -1,4 +1,8 @@
-0=${(%):-%N}
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
source ${0:A:h}/history-substring-search.zsh
diff --git a/plugins/history-substring-search/history-substring-search.zsh b/plugins/history-substring-search/history-substring-search.zsh
index a791cc4da..c326778d4 100644
--- a/plugins/history-substring-search/history-substring-search.zsh
+++ b/plugins/history-substring-search/history-substring-search.zsh
@@ -243,8 +243,8 @@ _history-substring-search-begin() {
fi
#
- # Escape and join query parts with wildcard character '*' as seperator
- # `(j:CHAR:)` join array to string with CHAR as seperator
+ # Escape and join query parts with wildcard character '*' as separator
+ # `(j:CHAR:)` join array to string with CHAR as separator
#
local search_pattern="*${(j:*:)_history_substring_search_query_parts[@]//(#m)[\][()|\\*?#<>~^]/\\$MATCH}*"
diff --git a/plugins/hitchhiker/hitchhiker.plugin.zsh b/plugins/hitchhiker/hitchhiker.plugin.zsh
index aeafaf01e..0b1a30119 100644
--- a/plugins/hitchhiker/hitchhiker.plugin.zsh
+++ b/plugins/hitchhiker/hitchhiker.plugin.zsh
@@ -1,3 +1,8 @@
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
HITCHHIKER_DIR="${0:h}/fortunes"
# Aliases
diff --git a/plugins/ipfs/_ipfs b/plugins/ipfs/_ipfs
index 9ee8bd79c..8771bc4ba 100644
--- a/plugins/ipfs/_ipfs
+++ b/plugins/ipfs/_ipfs
@@ -93,7 +93,8 @@ _ipfs_subcommand(){
(pin)
_arguments \
'(-t --type)'{-t,--type}'[The type of pinned keys to list. Can be "direct", "indirect", "recursive", or "all". Default: all.]' \
- '(-q --quiet)'{-q,--quiet}'[Write just hashes of objects.]'
+ '(-q --quiet)'{-q,--quiet}'[Write just hashes of objects.]' \
+ '(-s --stream)'{-s,--stream}'[Enable streaming of pins as they are discovered.]'
;;
(p2p)
_arguments '(-v --headers)'{-v,--headers}'[Print table headers (Protocol, Listen, Target).]'
@@ -116,7 +117,14 @@ _ipfs_subcommand(){
;;
esac
;;
- (get|query|findpeer)
+ (query|findpeer)
+ case $MAIN_SUBCOMMAND in
+ (dht)
+ _arguments '(-v --verbose)'{-v,--verbose}'[Print extra information.]'
+ ;;
+ esac
+ ;;
+ (get)
case $MAIN_SUBCOMMAND in
(dht)
_arguments '(-v --verbose)'{-v,--verbose}'[Print extra information.]'
@@ -158,22 +166,33 @@ _ipfs_subcommand(){
;;
esac
;;
- (cmds|diff)
+ (cmds)
case $MAIN_SUBCOMMAND in
- (diag|object)
+ (diag)
+ _arguments '(-v --verbose)'{-v,--verbose}'[Print extra information.]'
+ ;;
+ esac
+ ;;
+ (diff)
+ case $MAIN_SUBCOMMAND in
+ (object)
_arguments '(-v --verbose)'{-v,--verbose}'[Print extra information.]'
;;
esac
;;
(stat)
case $MAIN_SUBCOMMAND in
+ (dag)
+ _arguments \
+ '(-p --progress)'{-p,--progress}'[Return progressive data while reading through the DAG. Default: true.]'
+ ;;
(object)
_arguments '--human[Print sizes in human readable format (e.g., 1K 234M 2G).]'
;;
(repo)
_arguments \
- '--size-only[Only report RepoSize and StorageMax.]' \
- '--human[Print sizes in human readable format (e.g., 1K 234M 2G).]'
+ '(-s --size-only)'{-s,--size-only}'[Only report RepoSize and StorageMax.]' \
+ '(-H --human)'{-H,--human}'[Print sizes in human readable format (e.g., 1K 234M 2G).]'
;;
esac
;;
@@ -186,7 +205,8 @@ _ipfs_subcommand(){
'--allow-offline[When offline, save the IPNS record to the the local datastore without broadcasting to the network instead of simply failing.]' \
'--ttl[Time duration this record should be cached for. Uses the same syntax as the lifetime option. (caution: experimental).]' \
'(-k --key)'{-k,--key}"[Name of the key to be used or a valid PeerID, as listed by 'ipfs key list -l'. Default: self.]" \
- '(-Q --quieter)'{-Q,--quieter}'[Write only final hash.]'
+ '(-Q --quieter)'{-Q,--quieter}'[Write only final hash.]' \
+ '--ipns-base[Encoding used for keys: Can either be a multibase encoded CID or a base58btc encoded multihash. Takes {b58mh|base36|k|base32|b...}. Default: base36.]'
;;
esac
;;
@@ -254,7 +274,7 @@ _ipfs_subcommand(){
'(-p --peer)'{-p,--peer}'[Specify a peer to print bandwidth for.]' \
'(-t --proto)'{-t,--proto}'[Specify a protocol to print bandwidth for.]' \
'--poll[Print bandwidth at an interval.]' \
- '(-i --interval)'{-i,--interval}'[Time interval to wait between updating output, if 'poll' is true.]'
+ '(-i --interval)'{-i,--interval}"[Time interval to wait between updating output, if 'poll' is true.]"
;;
esac
;;
@@ -289,6 +309,7 @@ _ipfs_subcommand(){
_arguments \
'-f[Printf style format string. Default: %s.]' \
'-v[CID version to convert to.]' \
+ '--codec[CID codec to convert to.]' \
'-b[Multibase to display CID in.]'
;;
esac
@@ -367,6 +388,45 @@ _ipfs_subcommand(){
;;
esac
;;
+ (export)
+ case $MAIN_SUBCOMMAND in
+ (dag)
+ _arguments \
+ '(-p --progress)'{-p,--progress}'[Display progress on CLI. Defaults to true when STDERR is a TTY.]'
+ ;;
+ (key)
+ _arguments \
+ '(-o --output)'{-o,--output}'[The path where the output should be stored.]'
+ ;;
+ esac
+ ;;
+ (import)
+ case $MAIN_SUBCOMMAND in
+ (dag)
+ _arguments \
+ '--silent[No output.]' \
+ '--pin-roots[Pin optional roots listed in the .car headers after importing. Default: true.]'
+ ;;
+ (key)
+ _arguments \
+ '--ipns-base[Encoding used for keys: Can either be a multibase encoded CID or a base58btc encoded multihash. Takes {b58mh|base36|k|base32|b...}. Default: base36.]'
+ ;;
+ esac
+ ;;
+ (remote)
+ case $MAIN_SUBCOMMAND in
+ (pin)
+ local -a _pin_remote_arguments
+ _pin_remote_arguments=(
+ 'add:Pin object to remote pinning service.'
+ 'ls:List objects pinned to remote pinning service.'
+ 'rm:Remove pins from remote pinning service.'
+ 'service:Configure remote pinning services.'
+ )
+ _ipfs_subcommand _pin_remote_arguments
+ ;;
+ esac
+ ;;
esac
;;
esac
@@ -402,6 +462,8 @@ case $MAIN_SUBCOMMAND in
'(--dereference-args)--dereference-args[Symlinks supplied in arguments are dereferenced.]' \
'(--stdin-name)--stdin-name[Assign a name if the file source is stdin.]' \
'(-H --hidden)'{-H,--hidden}'[Include files that are hidden. Only takes effect on recursive add.]' \
+ '(--ignore)--ignore[A rule (.gitignore-stype) defining which file(s) should be ignored (variadic, experimental).]' \
+ '(--ignore-rules-path)--ignore-rules-path[A path to a file with .gitignore-style ignore rules (experimental).]' \
'(-q --quiet)'{-q,--quiet}'[Write minimal output.]' \
'(-Q --quieter)'{-Q,--quieter}'[Write only final hash.]' \
'(--silent)--silent[Write no output.]' \
@@ -483,6 +545,7 @@ case $MAIN_SUBCOMMAND in
(daemon)
_arguments \
'--init[Initialize ipfs with default settings if not already initialized.]' \
+ '--init-config[Path to existing configuration file to be loaded during --init.]' \
'--init-profile[Configuration profiles to apply for --init. See ipfs init --help for more.]' \
'--routing[Overrides the routing option. Default: default.]' \
'--mount[Mounts IPFS to the filesystem.]' \
@@ -501,9 +564,12 @@ case $MAIN_SUBCOMMAND in
(dag)
local -a _dag_arguments
_dag_arguments=(
+ 'export:Streams the selected DAG as a .car stream on stdout.'
'get:Get a dag node from ipfs.'
+ 'import:Import the contents of .car files'
'put:Add a dag node to ipfs.'
'resolve:Resolve ipld block.'
+ 'stat:Gets stats for a DAG'
)
_ipfs_subcommand _dag_arguments
;;
@@ -564,21 +630,27 @@ case $MAIN_SUBCOMMAND in
'(-l --compression-level)'{-l,--compression-level}'[The level of compression (1-9).]'
;;
(id)
- _arguments '(-f --format)'{-f,--format}'[Optional output format.]'
+ _arguments \
+ '(-f --format)'{-f,--format}'[Optional output format.]' \
+ '--peerid-base[Encoding used for peer IDs: Can either be a multibase encoded CID or a base58btc encoded multihash. Takes {b58mh|base36|k|base32|b...}. Default: b58mh.]'
;;
(init)
_arguments \
- '(-b --bits)'{-b,--bits}'[Number of bits to use in the generated RSA private key. Default: 2048.]' \
+ '(-a --algorithm)'{-a, --algorithm}'[Cryptographic algorithm to use for key generation. Default: ed25519.]' \
+ '(-b --bits)'{-b,--bits}'[Number of bits to use in the generated RSA private key.]' \
'(-e --empty-repo)'{-e,--empty-repo}"[Don't add and pin help files to the local storage.]" \
'(-p --profile)'{-p,--profile}"[Apply profile settings to config. Multiple profiles can be separated by ','.]"
;;
(key)
local -a _key_arguments
_key_arguments=(
+ 'export:Export a keypair'
'gen:Create a new keypair'
+ 'import:Import a key and prints imported key id'
'list:List all local keypairs'
'rename:Rename a keypair'
'rm:Remove a keypair'
+ 'rotate:Rotates the ipfs identity.'
)
_ipfs_subcommand _key_arguments
;;
@@ -596,7 +668,7 @@ case $MAIN_SUBCOMMAND in
'(-v --headers)'{-v,--headers}'[Print table headers (Hash, Size, Name).]' \
'--resolve-type[Resolve linked objects to find out their types. Default: true.]' \
'--size[Resolve linked objects to find out their file size. Default: true.]' \
- '(-s --stream)'{-s,--stream}'[Enable exprimental streaming of directory entries as they are traversed.]' \
+ '(-s --stream)'{-s,--stream}'[Enable experimental streaming of directory entries as they are traversed.]' \
;;
(mount)
_arguments \
@@ -642,6 +714,7 @@ case $MAIN_SUBCOMMAND in
_pin_arguments=(
'add:Pin objects to local storage.'
'ls:List objects pinned to local storage.'
+ 'remote:Pin (and unpin) objects to remote pinning service.'
'rm:Remove pinned objects from local storage.'
'update:Update a recursive pin'
'verify:Verify that recursive pins are complete.'
@@ -684,6 +757,7 @@ case $MAIN_SUBCOMMAND in
_stats_arguments=(
'bitswap:Show some diagnostic information on the bitswap agent.'
'bw:Print ipfs bandwidth information.'
+ "dht:Returns statistics about the node's DHT(s)"
'repo:Get stats for the currently used repo.'
)
_ipfs_subcommand _stats_arguments
diff --git a/plugins/istioctl/README.md b/plugins/istioctl/README.md
new file mode 100644
index 000000000..afd4d293c
--- /dev/null
+++ b/plugins/istioctl/README.md
@@ -0,0 +1,9 @@
+# Istioctl - Istio Command-line Tool
+
+The [istioctl](https://istio.io/latest/docs/ops/diagnostic-tools/istioctl/) tool is a configuration command line utility that allows service operators to debug and diagnose their Istio service mesh deployments.
+
+To use it, add `istioctl` to the plugins array of your zshrc file:
+
+```sh
+plugins=(... istioctl)
+```
diff --git a/plugins/istioctl/istioctl.plugin.zsh b/plugins/istioctl/istioctl.plugin.zsh
new file mode 100644
index 000000000..13ead1b2b
--- /dev/null
+++ b/plugins/istioctl/istioctl.plugin.zsh
@@ -0,0 +1,4 @@
+if [ $commands[istioctl] ]; then
+ source <(istioctl completion zsh)
+ compdef _istioctl istioctl
+fi
diff --git a/plugins/iterm2/iterm2.plugin.zsh b/plugins/iterm2/iterm2.plugin.zsh
index e4ac72ee3..9d8e40bf6 100644
--- a/plugins/iterm2/iterm2.plugin.zsh
+++ b/plugins/iterm2/iterm2.plugin.zsh
@@ -8,7 +8,7 @@
if [[ "$OSTYPE" == darwin* ]] && [[ -n "$ITERM_SESSION_ID" ]] ; then
###
- # Executes an arbitrary iTerm2 command via an escape code sequce.
+ # Executes an arbitrary iTerm2 command via an escape code sequence.
# See https://iterm2.com/documentation-escape-codes.html for all supported commands.
# Example: $ _iterm2_command "1337;StealFocus"
function _iterm2_command() {
diff --git a/plugins/jenv/README.md b/plugins/jenv/README.md
index c043c626e..148794197 100644
--- a/plugins/jenv/README.md
+++ b/plugins/jenv/README.md
@@ -1,6 +1,6 @@
# jenv plugin
-[jenv](https://www.jenv.be/) is a Java version manager similiar to [rbenv](https://github.com/rbenv/rbenv)
+[jenv](https://www.jenv.be/) is a Java version manager similar to [rbenv](https://github.com/rbenv/rbenv)
and [pyenv](https://github.com/yyuu/pyenv).
This plugin initializes jenv and provides the `jenv_prompt_info` function to add Java
diff --git a/plugins/jenv/jenv.plugin.zsh b/plugins/jenv/jenv.plugin.zsh
index 946ce18a5..240102604 100644
--- a/plugins/jenv/jenv.plugin.zsh
+++ b/plugins/jenv/jenv.plugin.zsh
@@ -18,13 +18,19 @@ if [[ $FOUND_JENV -eq 1 ]]; then
(( $+commands[jenv] )) || export PATH="${jenvdir}/bin:$PATH"
eval "$(jenv init - zsh)"
- function jenv_prompt_info() { jenv version-name 2>/dev/null }
+ function jenv_prompt_info() {
+ local version="$(jenv version-name 2>/dev/null)"
+ echo "${version:gs/%/%%}"
+ }
if [[ -d "${jenvdir}/versions" ]]; then
export JENV_ROOT=$jenvdir
fi
else
- function jenv_prompt_info() { echo "system: $(java -version 2>&1 | cut -f 2 -d ' ')" }
+ function jenv_prompt_info() {
+ local version="$(java -version 2>&1 | cut -d' ' -f2)"
+ echo "system: ${version:gs/%/%%}"
+ }
fi
unset jenvdir jenvdirs FOUND_JENV
diff --git a/plugins/jfrog/jfrog.plugin.zsh b/plugins/jfrog/jfrog.plugin.zsh
index 064ffa2db..1441bc107 100644
--- a/plugins/jfrog/jfrog.plugin.zsh
+++ b/plugins/jfrog/jfrog.plugin.zsh
@@ -7,4 +7,5 @@ _jfrog() {
fi
}
-compdef _jfrog jfrog
\ No newline at end of file
+compdef _jfrog jfrog
+compdef _jfrog jf
diff --git a/plugins/kubectl/kubectl.plugin.zsh b/plugins/kubectl/kubectl.plugin.zsh
index 3630facaa..6edb59751 100644
--- a/plugins/kubectl/kubectl.plugin.zsh
+++ b/plugins/kubectl/kubectl.plugin.zsh
@@ -1,13 +1,22 @@
if (( $+commands[kubectl] )); then
- __KUBECTL_COMPLETION_FILE="${ZSH_CACHE_DIR}/kubectl_completion"
+ # TODO: 2022-01-05: remove this block
+ # remove old generated files
+ command rm -f "$ZSH_CACHE_DIR/kubectl_completion"
- if [[ ! -f $__KUBECTL_COMPLETION_FILE || ! -s $__KUBECTL_COMPLETION_FILE ]]; then
- kubectl completion zsh >! $__KUBECTL_COMPLETION_FILE
- fi
+ # TODO: 2022-01-05: remove this bit of code as it exists in oh-my-zsh.sh
+ # Add completions folder in $ZSH_CACHE_DIR
+ command mkdir -p "$ZSH_CACHE_DIR/completions"
+ (( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
- [[ -f $__KUBECTL_COMPLETION_FILE ]] && source $__KUBECTL_COMPLETION_FILE
-
- unset __KUBECTL_COMPLETION_FILE
+ # If the completion file does not exist, generate it and then source it
+ # Otherwise, source it and regenerate in the background
+ if [[ ! -f "$ZSH_CACHE_DIR/completions/_kubectl" ]]; then
+ kubectl completion zsh >| "$ZSH_CACHE_DIR/completions/_kubectl"
+ source "$ZSH_CACHE_DIR/completions/_kubectl"
+ else
+ source "$ZSH_CACHE_DIR/completions/_kubectl"
+ kubectl completion zsh >| "$ZSH_CACHE_DIR/completions/_kubectl" &|
+ fi
fi
# This command is used a LOT both below and in daily life
@@ -97,8 +106,9 @@ alias kdd='kubectl describe deployment'
alias kdeld='kubectl delete deployment'
alias ksd='kubectl scale deployment'
alias krsd='kubectl rollout status deployment'
-kres(){
- kubectl set env $@ REFRESHED_AT=$(date +%Y%m%d%H%M%S)
+
+function kres(){
+ kubectl set env $@ REFRESHED_AT=$(date +%Y%m%d%H%M%S)
}
# Rollout management.
@@ -170,9 +180,9 @@ alias kdelcj='kubectl delete cronjob'
# Only run if the user actually has kubectl installed
if (( ${+_comps[kubectl]} )); then
- kj() { kubectl "$@" -o json | jq; }
- kjx() { kubectl "$@" -o json | fx; }
- ky() { kubectl "$@" -o yaml | yh; }
+ function kj() { kubectl "$@" -o json | jq; }
+ function kjx() { kubectl "$@" -o json | fx; }
+ function ky() { kubectl "$@" -o yaml | yh; }
compdef kj=kubectl
compdef kjx=kubectl
diff --git a/plugins/kubectx/kubectx.plugin.zsh b/plugins/kubectx/kubectx.plugin.zsh
index abbdc254b..1419f102f 100644
--- a/plugins/kubectx/kubectx.plugin.zsh
+++ b/plugins/kubectx/kubectx.plugin.zsh
@@ -1,9 +1,11 @@
-typeset -A kubectx_mapping
+typeset -g -A kubectx_mapping
function kubectx_prompt_info() {
- if [ $commands[kubectl] ]; then
- local current_ctx=`kubectl config current-context`
- # use value in associative array if it exists, otherwise fall back to the context name
- echo "${kubectx_mapping[$current_ctx]:-$current_ctx}"
- fi
+ (( $+commands[kubectl] )) || return
+
+ local current_ctx=$(kubectl config current-context)
+
+ # use value in associative array if it exists
+ # otherwise fall back to the context name
+ echo "${kubectx_mapping[$current_ctx]:-${current_ctx:gs/%/%%}}"
}
diff --git a/plugins/lpass/README.md b/plugins/lpass/README.md
new file mode 100644
index 000000000..d3923ea67
--- /dev/null
+++ b/plugins/lpass/README.md
@@ -0,0 +1,13 @@
+# lpass (LastPass CLI)
+
+This plugin adds completion for LastPass CLI [`lpass`](https://github.com/lastpass/lastpass-cli).
+
+To use it, add `lpass` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... lpass)
+```
+
+Completion is taken from the `lpass` release [`1.3.3`](https://github.com/lastpass/lastpass-cli/releases/tag/v1.3.3).
+
+Updated on October 9th, 2020.
diff --git a/plugins/lpass/_lpass b/plugins/lpass/_lpass
new file mode 100644
index 000000000..e6193a22d
--- /dev/null
+++ b/plugins/lpass/_lpass
@@ -0,0 +1,169 @@
+#compdef lpass
+
+_lpass() {
+ local cmd has_color has_sync has_interactive
+ if (( CURRENT > 2)); then
+ cmd=${words[2]}
+ # Set the context for the subcommand.
+ curcontext="${curcontext%:*:*}:lpass-$cmd"
+ # Narrow the range of words we are looking at to exclude `lpass'
+ (( CURRENT-- ))
+ shift words
+ # Run the completion for the subcommand
+ case "${cmd}" in
+ login)
+ _arguments : \
+ '--trust[Cause subsequent logins to not require multifactor authentication.]' \
+ '--plaintext-key[Save plaintext decryption key to the hard disk]' \
+ '--force[Do not ask on saving plaintext key]'
+ has_color=1
+ ;;
+
+ logout)
+ _arguments : '--force[Force confirmation]'
+ has_color=1
+ ;;
+ show)
+ _arguments : \
+ '(-c --clip)'{-c,--clip}'[Copy output to clipboard]' \
+ '(-x --expand-multi)'{-x,---expand-multi}'[Show the requested information from all of the matching sites]' \
+ '(--all --username --password --url --notes --field= --id --name --attach=)'{--all,--username,--password,--url,--notes,--field=,--id,--name,--attach=}'[Output the specific field]' \
+ '(--basic-regexp,--fixed-string)'{-G,--basic-regexp}'[Find a site by substring or regular expression]' \
+ '--format=[Format output with printf-style placeholders]'
+ _lpass_complete_uniqenames
+ has_color=1
+ has_sync=1
+ ;;
+
+ ls)
+ _arguments : \
+ '(-l --long)'{-l,--long}'[Also list the last modification time and username]' \
+ '-u[List username]' \
+ '-m[List modification time]' \
+ '--format=[Format output with printf-style placeholders]'
+ _lpass_complete_groups
+ has_color=1
+ has_sync=1
+ ;;
+ mv)
+ _lpass_complete_uniqenames
+ _lpass_complete_groups
+ has_color=1
+ ;;
+ duplicate|rm)
+ _lpass_complete_uniqenames
+ has_color=1
+ has_sync=1
+ ;;
+ add)
+ _arguments : '(--username --password --url --notes --field=)'{--username,--password,--url,--notes,--field=}'[Add field]'
+ _lpass_complete_uniqenames
+ has_color=1
+ has_sync=1
+ has_interactive=1
+ ;;
+ edit)
+ _arguments : '(--name --username --password --url --notes --field=)'{--name,--username,--password,--url,--notes,--field=}'[Update field]'
+ _lpass_complete_uniqenames
+ has_color=1
+ has_sync=1
+ has_interactive=1
+ ;;
+ generate)
+ _arguments : \
+ '(-c --clip)'{-c,--clip}'[Copy output to clipboard]' \
+ '--username=[USERNAME]' \
+ '--url=[URL]' \
+ '--no-symbols[Do not use symbols]'
+ has_sync=1
+ ;;
+ status)
+ _arguments : '(-q --quiet)'{-q,--quiet}'[Supress output to stdout]'
+ has_color=1
+ ;;
+ sync)
+ _arguments : '(-b --background)'{-b,--background}'[Run sync in background]'
+ has_color=1
+ ;;
+ export)
+ _arguments : '--fields=[Field list]'
+ has_color=1
+ has_sync=1
+ ;;
+ import)
+ if ((CURRENT < 3)); then
+ _files
+ fi
+ ;;
+ esac
+
+ if [ -n "$has_sync" ] || [ -n "$has_color" ] || [ -n "$has_interactive" ]; then
+ local -a generic_options
+ if [ "$has_sync" -eq 1 ]; then
+ generic_options+=('--sync=[Synchronize local cache with server: auto | now | no]')
+ fi
+ if [ "$has_color" -eq 1 ]; then
+ generic_options+=('--color=[Color: auto | never | always]')
+ fi
+ if [ "$has_interactive" -eq 1 ]; then
+ generic_options+=("--non-interactive[Use stardard input instead of $EDITOR]")
+ fi
+ _arguments $generic_options
+ fi
+ else
+ local -a subcommands
+ subcommands=(
+ "login:Authenticate with the LastPass server and initialize a local cache"
+ "logout:Remove the local cache and stored encryption keys"
+ "passwd:Change your LastPass password"
+ "show:Display a password or selected field"
+ "ls:List names in groups in a tree structure"
+ "mv:Move the specified entry to a new group"
+ "add:Add a new entry"
+ "edit:Edit the selected field"
+ "generate:Create a randomly generated password"
+ "duplicate:Create a duplicate entry of the one specified"
+ "rm:Remove the specified entry"
+ "status:Show current login status"
+ "sync:Synchronize local cache with server"
+ "export:Dump all account information including passwords as unencrypted csv to stdout"
+ "import:Upload accounts from an unencrypted CSV file to the server"
+ "share:Manipulate shared folders (only enterprise or premium user)"
+ )
+ _describe -t commands 'lpass' subcommands
+ _arguments : \
+ '(-h --help)'{-h,--help}'[show help]' \
+ '(-v --version)'{-v,--version}'[show version]'
+
+ fi
+}
+
+_lpass_complete_uniqenames(){
+ local -a entries
+ while read i; do
+ if [ -n "$i" ]; then
+ entries+=("$i")
+ fi
+ done < <(lpass ls --sync auto --format "%an" --color=never)
+ compadd -a entries
+}
+
+
+_lpass_complete_groups() {
+ local -a entries
+ while read i; do
+ if [ -n "$i" ]; then
+ entries+=("$i")
+ fi
+ done < <(lpass ls --sync auto --format "%aN" --color=never | grep -E "\/$")
+ compadd -a entries
+}
+
+_lpass
+# Local Variables:
+# mode: Shell-Script
+# sh-indentation: 2
+# indent-tabs-mode: nil
+# sh-basic-offset: 2
+# End:
+# vim: ft=zsh sw=2 ts=2 et
diff --git a/plugins/macos/macos.plugin.zsh b/plugins/macos/macos.plugin.zsh
index 6a91be336..b540eecb5 100644
--- a/plugins/macos/macos.plugin.zsh
+++ b/plugins/macos/macos.plugin.zsh
@@ -1,3 +1,8 @@
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
# Open the current directory in a Finder window
alias ofd='open_command $PWD'
diff --git a/plugins/macos/spotify b/plugins/macos/spotify
index 663215a74..491a60686 100644
--- a/plugins/macos/spotify
+++ b/plugins/macos/spotify
@@ -191,7 +191,7 @@ while [ $# -gt 0 ]; do
-d "grant_type=client_credentials" \
)
if ! [[ "${SPOTIFY_TOKEN_RESPONSE_DATA}" =~ "access_token" ]]; then
- cecho "Autorization failed, please check ${USER_CONFG_FILE}"
+ cecho "Authorization failed, please check ${USER_CONFG_FILE}"
cecho "${SPOTIFY_TOKEN_RESPONSE_DATA}"
showAPIHelp
return 1
diff --git a/plugins/macports/README.md b/plugins/macports/README.md
index ded823f3f..09bd42df2 100644
--- a/plugins/macports/README.md
+++ b/plugins/macports/README.md
@@ -15,7 +15,33 @@ plugins=(... macports)
|-------|------------------------------------|--------------------------------------------------------------|
| pc | `sudo port clean --all installed` | Clean up intermediate installation files for installed ports |
| pi | `sudo port install` | Install package given as argument |
+| pli | `port livecheck installed` | Check for updates for installed ports |
+| plm | `port-livecheck-maintainer` | Check for updates of ports mainained by the specified users |
| psu | `sudo port selfupdate` | Update ports tree with MacPorts repository |
| puni | `sudo port uninstall inactive` | Uninstall inactive ports |
| puo | `sudo port upgrade outdated` | Upgrade ports with newer versions available |
| pup | `psu && puo` | Update ports tree, then upgrade ports to newest versions |
+
+## Commands
+
+### port-livecheck-maintainer
+
+```text
+Usage:
+ port-livecheck-maintainer
+ port-livecheck-maintainer (maintainer)+
+ port-livecheck-maintainer -h|--help
+
+Check
+
+Options:
+ maintainer maintainer id
+ -h print this help message and exit
+```
+
+Checks whether updates are available for ports whose maintainer is the current
+user, or any of a specified list of maintainer expressions. The current user
+maintainer id is retrieved as follows:
+
+* The value of the `MACPORTS_MAINTAINER` variable, if set and not null.
+* The value of the `USER` variable.
diff --git a/plugins/macports/macports.plugin.zsh b/plugins/macports/macports.plugin.zsh
index d1fde30d4..d438057f9 100644
--- a/plugins/macports/macports.plugin.zsh
+++ b/plugins/macports/macports.plugin.zsh
@@ -1,6 +1,44 @@
alias pc="sudo port clean --all installed"
alias pi="sudo port install"
+alias pli="port livecheck installed"
+alias plm="port-livecheck-maintainer"
alias psu="sudo port selfupdate"
alias puni="sudo port uninstall inactive"
alias puo="sudo port upgrade outdated"
-alias pup="psu && puo"
+alias pup="sudo port selfupdate && sudo port upgrade outdated"
+
+port-livecheck-maintainer() {
+ (( ${+commands[port]} == 0 )) || {
+ print -- "port: not found" >&2
+ return 1
+ }
+
+ local -a help_flag
+ zparseopts -D -E h=help_flag -help=help_flag
+
+ (( ${#help_flag} )) && {
+ cat << EOF >&2
+Usage:
+ port-livecheck-maintainer
+ port-livecheck-maintainer (maintainer)+
+ port-livecheck-maintainer -h|--help
+
+Check
+
+Options:
+ maintainer maintainer id
+ -h print this help message and exit
+EOF
+ return 1
+ }
+
+ if (( $# == 0 )); then
+ local default=${MACPORTS_MAINTAINER:-${USER}}
+ port livecheck maintainer:${default}
+ return $?
+ fi
+
+ for i in $@; do
+ port livecheck maintainer:${i}
+ done
+}
diff --git a/plugins/mercurial/README.md b/plugins/mercurial/README.md
index 756964896..19d4a17b1 100644
--- a/plugins/mercurial/README.md
+++ b/plugins/mercurial/README.md
@@ -11,27 +11,29 @@ plugins=(... mercurial)
## Aliases
-| Alias | Command |
-|--------|-------------------------------------------------------------------------------------------------------------|
-| `hga` | `hg add` |
-| `hgc` | `hg commit` |
-| `hgca` | `hg commit --amend` |
-| `hgb` | `hg branch` |
-| `hgba` | `hg branches` |
-| `hgbk` | `hg bookmarks` |
-| `hgco` | `hg checkout` |
-| `hgd` | `hg diff` |
-| `hged` | `hg diffmerge` |
-| `hgp` | `hg push` |
-| `hgs` | `hg status` |
-| `hgsl` | `hg log --limit 20 --template "{node|short} | {date|isodatesec} | {author|user}: {desc|strip|firstline}\n"` |
-| `hgun` | `hg resolve --list` |
-| `hgi` | `hg incoming` |
-| `hgl` | `hg pull -u` |
-| `hglr` | `hg pull --rebase` |
-| `hgo` | `hg outgoing` |
-| `hglg` | `hg log --stat -v` |
-| `hglgp`| `hg log --stat -p -v` |
+| Alias | Command |
+| ------- | ------------------------------------------- |
+| `hga` | `hg add` |
+| `hgc` | `hg commit` |
+| `hgca` | `hg commit --amend` |
+| `hgci` | `hg commit --interactive` |
+| `hgb` | `hg branch` |
+| `hgba` | `hg branches` |
+| `hgbk` | `hg bookmarks` |
+| `hgco` | `hg checkout` |
+| `hgd` | `hg diff` |
+| `hged` | `hg diffmerge` |
+| `hgp` | `hg push` |
+| `hgs` | `hg status` |
+| `hgsl` | `hg log --limit 20 --template ""` |
+| `hgun` | `hg resolve --list` |
+| `hgi` | `hg incoming` |
+| `hgl` | `hg pull -u` |
+| `hglr` | `hg pull --rebase` |
+| `hgo` | `hg outgoing` |
+| `hglg` | `hg log --stat -v` |
+| `hglgp` | `hg log --stat -p -v` |
+
## Prompt usage
- Switch to a theme which uses `hg_prompt_info`
@@ -61,7 +63,7 @@ ZSH_THEME_HG_PROMPT_CLEAN="%{$fg[magenta]%})"
This is the same as git plugin does. **Note**: additional changes to `.zshrc`, or using a theme designed
to use `hg_prompt_info`, are required in order for this to work.
-## Mantainers
+## Maintainers
- [ptrv](https://github.com/ptrv): original creator
- [oshybystyi](https://github.com/oshybystyi)
diff --git a/plugins/mercurial/mercurial.plugin.zsh b/plugins/mercurial/mercurial.plugin.zsh
index e098664c0..9b85d02f6 100644
--- a/plugins/mercurial/mercurial.plugin.zsh
+++ b/plugins/mercurial/mercurial.plugin.zsh
@@ -2,6 +2,7 @@
alias hga='hg add'
alias hgc='hg commit'
alias hgca='hg commit --amend'
+alias hgci='hg commit --interactive'
alias hgb='hg branch'
alias hgba='hg branches'
alias hgbk='hg bookmarks'
@@ -10,7 +11,7 @@ alias hgd='hg diff'
alias hged='hg diffmerge'
alias hgp='hg push'
alias hgs='hg status'
-alias hgsl='hg log --limit 20 --template "{node|short} | {date|isodatesec} | {author|user}: {desc|strip|firstline}\n"'
+alias hgsl='hg log --limit 20 --template "{node|short} | {date|isodatesec} | {author|person}: {desc|strip|firstline}\n" '
alias hgun='hg resolve --list'
# pull and update
alias hgi='hg incoming'
@@ -20,45 +21,6 @@ alias hgo='hg outgoing'
alias hglg='hg log --stat -v'
alias hglgp='hg log --stat -p -v'
-function in_hg() {
- if $(hg branch > /dev/null 2>&1); then
- echo 1
- fi
-}
-
-function hg_get_branch_name() {
- branch=`hg branch 2>/dev/null`
- if [ $? -eq 0 ]; then
- echo $branch
- fi
- unset branch
-}
-
-function hg_prompt_info {
- _DISPLAY=`hg branch 2>/dev/null`
- if [ $? -eq 0 ]; then
- echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_HG_PROMPT_PREFIX\
-$ZSH_THEME_REPO_NAME_COLOR$_DISPLAY$ZSH_PROMPT_BASE_COLOR$ZSH_PROMPT_BASE_COLOR$(hg_dirty)$ZSH_THEME_HG_PROMPT_SUFFIX$ZSH_PROMPT_BASE_COLOR"
- fi
- unset _DISPLAY
-}
-
-function hg_dirty_choose {
- hg status -mar 2> /dev/null | command grep -Eq '^\s*[ACDIM!?L]'
- if [ $? -eq 0 ]; then
- if [ $pipestatus[-1] -eq 0 ]; then
- # Grep exits with 0 when "One or more lines were selected", return "dirty".
- echo $1
- return
- fi
- fi
- echo $2
-}
-
-function hg_dirty {
- hg_dirty_choose $ZSH_THEME_HG_PROMPT_DIRTY $ZSH_THEME_HG_PROMPT_CLEAN
-}
-
function hgic() {
hg incoming "$@" | grep "changeset" | wc -l
}
@@ -67,8 +29,90 @@ function hgoc() {
hg outgoing "$@" | grep "changeset" | wc -l
}
-function hg_get_bookmark_name() {
- if [ $(in_hg) ]; then
- echo $(hg id -B)
- fi
+# functions
+function hg_root() {
+ local dir="$PWD"
+ while [[ "$dir" != "/" ]]; do
+ if [[ -d "$dir/.hg" ]]; then
+ echo "$dir"
+ return 0
+ fi
+ dir="${dir:h}"
+ done
+ return 1
+}
+
+function in_hg() {
+ hg_root >/dev/null
+}
+
+function hg_get_branch_name() {
+ local dir
+ if ! dir=$(hg_root); then
+ return
+ fi
+
+ if [[ ! -f "$dir/.hg/branch" ]]; then
+ echo default
+ return
+ fi
+
+ echo "$(<"$dir/.hg/branch")"
+}
+
+function hg_get_bookmark_name() {
+ local dir
+ if ! dir=$(hg_root); then
+ return
+ fi
+
+ if [[ ! -f "$dir/.hg/bookmarks.current" ]]; then
+ return
+ fi
+
+ echo "$(<"$dir/.hg/bookmarks.current")"
+}
+
+function hg_prompt_info {
+ local dir branch dirty
+ if ! dir=$(hg_root); then
+ return
+ fi
+
+ if [[ ! -f "$dir/.hg/branch" ]]; then
+ branch=default
+ else
+ branch="$(<"$dir/.hg/branch")"
+ fi
+
+ dirty="$(hg_dirty)"
+
+ echo "${ZSH_THEME_HG_PROMPT_PREFIX}${branch:gs/%/%%}${dirty}${ZSH_THEME_HG_PROMPT_SUFFIX}"
+}
+
+function hg_dirty {
+ # Do nothing if clean / dirty settings aren't defined
+ if [[ -z "$ZSH_THEME_HG_PROMPT_DIRTY" && -z "$ZSH_THEME_HG_PROMPT_CLEAN" ]]; then
+ return
+ fi
+
+ # Check if there are modifications
+ local hg_status
+ if [[ "$DISABLE_UNTRACKED_FILES_DIRTY" = true ]]; then
+ if ! hg_status="$(hg status -q 2>/dev/null)"; then
+ return
+ fi
+ else
+ if ! hg_status="$(hg status 2>/dev/null)"; then
+ return
+ fi
+ fi
+
+ # grep exits with 0 when dirty
+ if command grep -Eq '^\s*[ACDIMR!?L].*$' <<< "$hg_status"; then
+ echo $ZSH_THEME_HG_PROMPT_DIRTY
+ return
+ fi
+
+ echo $ZSH_THEME_HG_PROMPT_CLEAN
}
diff --git a/plugins/mvn/mvn.plugin.zsh b/plugins/mvn/mvn.plugin.zsh
index e32729aa6..1b9141f21 100644
--- a/plugins/mvn/mvn.plugin.zsh
+++ b/plugins/mvn/mvn.plugin.zsh
@@ -117,7 +117,7 @@ function listMavenCompletions {
done
# List modules
- modules=($(find **/pom.xml -type f | grep -v '/target/classes/META-INF/' | grep '/pom.xml' |sed 's|\(.*\)/pom\.xml|\1|'))
+ modules=($(print -l **/pom.xml(-.N:h) | grep -v '/target/classes/META-INF/'))
reply=(
# common lifecycle
diff --git a/plugins/ng/_ng b/plugins/ng/_ng
new file mode 100644
index 000000000..9c96cf7e3
--- /dev/null
+++ b/plugins/ng/_ng
@@ -0,0 +1,56 @@
+#compdef ng
+
+setopt localoptions extendedglob
+
+if (( CURRENT == 2 )); then
+ local -a cmds alias
+ # Sample output (ng help):
+ # Available Commands:
+ # add Adds support for an external library to your project.
+ for line in ${(@f)"$(ng help 2>/dev/null | sed -n '/^ /p')"}; do
+ if [[ "$line" =~ '^ ([^ ]+) \(([^)]+)\) (.*)$' ]]; then
+ alias=(${match[1]} ${(s:, :)match[2]})
+ cmds+=(${^alias}:"${match[3]//:/}")
+ elif [[ "$line" =~ '^ ([^ ]+) (.*)$' ]]; then
+ cmds+=("${match[1]}:${match[2]//:/}")
+ fi
+ done
+ _describe commands cmds && return 0
+elif (( CURRENT == 3 )); then
+ local -a flags args
+ local section description
+ # Sample output (ng build --help):
+ # --configuration (-c)
+ # One or more named builder configurations as a comma-separated list as specified in the "configurations" section of angular.json.
+ # The builder uses the named configurations to run the given target.
+ # For more information, see https://angular.io/guide/workspace-config#alternate-build-configurations.
+ # Prefix --flags with literal \0, and split on that to get each flag section
+ for section in ${(s:\0:)"$(ng ${words[2]} --help 2>/dev/null | sed -e '1,/^options/ d;s/^ --/\\0--/')"}; do
+ # Split by newline and discard extra description lines (lines > 2)
+ for args description in ${${(@f)section}[1,2]}; do
+ args=(${(s: :)${${args%% #}## #}//[(),]/})
+ description=${${description%% #}## #}
+ flags+=(${^args}":$description")
+ done
+ done
+ _describe flags flags
+
+ case "$words[2]" in
+ b|build|l|lint|t|test)
+ # Sample output (ng config projects):
+ # {
+ # "angular-project-1": {
+ # ...
+ # },
+ # "angular-project-2": {
+ # ...
+ # }
+ # }
+ # In abscence of a proper JSON parser, just grab the lines with
+ # a 2-space indentation and only the stuff inside quotes
+ local -a projects
+ projects=(${(@f)"$(ng config projects 2>/dev/null | sed -n 's/^ "\([^"]\+\)".*$/\1/p')"})
+ _describe projects projects
+ ;;
+ esac
+fi
diff --git a/plugins/ng/ng.plugin.zsh b/plugins/ng/ng.plugin.zsh
deleted file mode 100644
index 44102e2a6..000000000
--- a/plugins/ng/ng.plugin.zsh
+++ /dev/null
@@ -1,78 +0,0 @@
-ng_opts='addon asset-sizes b build completion d destroy doc e2e g generate get github-pages:deploy gh-pages:deploy h help i init install lint make-this-awesome new s serve server set t test update v version -h --help'
-
-_ng_completion () {
- local words cword opts
- read -Ac words
- read -cn cword
- let cword-=1
-
- case $words[cword] in
- addon )
- opts='-b --blueprint -d -dir --directory --dry-run -sb --skip-bower -sg --skip-git -sn --skip-npm -v --verbose'
- ;;
-
- asset-sizes )
- opts='-o --output-path'
- ;;
-
- b | build )
- opts='--environment --output-path --suppress-sizes --target --watch --watcher -dev -e -prod'
- ;;
-
- d | destroy )
- opts='--dry-run --verbose --pod --classic --dummy --in-repo --in-repo-addon -d -v -p -c -dum -id -ir'
- ;;
-
- g | generate )
- opts='class component directive enum module pipe route service --generate -d --dry-run --verbose -v --pod -p --classic -c --dummy -dum -id --in-repo --in-repo-addon -ir'
- ;;
-
- gh-pages:deploy | github-pages:deploy )
- opts='--environment --gh-token --gh-username --skip-build --user-page --message'
- ;;
-
- h | help | -h | --help)
- opts='--json --verbose -v'
- ;;
-
- init )
- opts='--blueprint --dry-run --link-cli --mobile --name --prefix --skip-bower --skip-npm --source-dir --style --verbose -b -d -lc -n -p -sb -sd -sn -v'
- ;;
-
- new )
- opts='--blueprint --directory --dry-run --link-cli --mobile --prefix --skip-bower --skip-git --skip-npm --source-dir --style --verbose -b -d -dir -lc -p -sb -sd -sg -sn -v'
- ;;
-
- s | serve | server )
- opts='--environment --host --insecure-proxy --inspr --live-reload --live-reload-base-url --live-reload-host --live-reload-live-css --live-reload-port --output-path --port --proxy --ssl --ssl-cert --ssl-key --target --watcher -H -dev -e -lr -lrbu -lrh -lrp -op -out -p -pr -prod -pxy -t -w'
- ;;
-
- set )
- opts='--global -g'
- ;;
-
- t | test )
- opts='--browsers --colors --config-file --environment --filter --host --launch --log-level --module --path --port --query --reporter --server --silent --test-page --test-port --watch -H -c -cf -e -f -m -r -s -tp -w'
- ;;
-
- update )
- opts='--all --dryRun --force --from --migrate-only --next --registry --to -d'
- ;;
-
- v | version )
- opts='--verbose'
- ;;
-
- ng )
- opts=$ng_opts
- ;;
-
- * )
- opts=''
- ;;
- esac
-
- reply=(${=opts})
-}
-
-compctl -K _ng_completion ng
diff --git a/plugins/npm/README.md b/plugins/npm/README.md
index 47d153619..8eafc6d61 100644
--- a/plugins/npm/README.md
+++ b/plugins/npm/README.md
@@ -10,7 +10,7 @@ plugins=(... npm)
## Aliases
-| Alias | Command | Descripton |
+| Alias | Command | Description |
|:------ |:-----------------------------|:----------------------------------------------------------------|
| `npmg` | `npm i -g` | Install dependencies globally |
| `npmS` | `npm i -S` | Install and save to dependencies in your package.json |
@@ -29,3 +29,20 @@ plugins=(... npm)
| `npmI` | `npm init` | Run npm init |
| `npmi` | `npm info` | Run npm info |
| `npmSe` | `npm search` | Run npm search |
+
+## `npm install` / `npm uninstall` toggle
+
+The plugin adds a function that toggles between `npm install` and `npm uninstall` in
+the current command or the last command, for up to 2 previous commands. **The default
+key binding is pressing F2 twice**.
+
+You can change this key binding by adding the following line to your zshrc file:
+
+```zsh
+bindkey -M emacs '' npm_toggle_install_uninstall
+bindkey -M vicmd '' npm_toggle_install_uninstall
+bindkey -M viins '' npm_toggle_install_uninstall
+```
+
+where `` is a key sequence obtained by running `cat` and pressing the keyboard
+sequence you want.
diff --git a/plugins/npm/npm.plugin.zsh b/plugins/npm/npm.plugin.zsh
index f7d6d3939..6c768d614 100644
--- a/plugins/npm/npm.plugin.zsh
+++ b/plugins/npm/npm.plugin.zsh
@@ -69,3 +69,43 @@ alias npmi="npm info"
# Run npm search
alias npmSe="npm search"
+
+npm_toggle_install_uninstall() {
+ # Look up to the previous 2 history commands
+ local line
+ for line in "$BUFFER" \
+ "${history[$((HISTCMD-1))]}" \
+ "${history[$((HISTCMD-2))]}"
+ do
+ case "$line" in
+ "npm uninstall"*)
+ BUFFER="${line/npm uninstall/npm install}"
+ (( CURSOR = CURSOR + 2 )) # uninstall -> install: 2 chars removed
+ ;;
+ "npm install"*)
+ BUFFER="${line/npm install/npm uninstall}"
+ (( CURSOR = CURSOR + 2 )) # install -> uninstall: 2 chars added
+ ;;
+ "npm un "*)
+ BUFFER="${line/npm un/npm install}"
+ (( CURSOR = CURSOR + 5 )) # un -> install: 5 chars added
+ ;;
+ "npm i "*)
+ BUFFER="${line/npm i/npm uninstall}"
+ (( CURSOR = CURSOR + 8 )) # i -> uninstall: 8 chars added
+ ;;
+ *) continue ;;
+ esac
+ return 0
+ done
+
+ BUFFER="npm install"
+ CURSOR=${#BUFFER}
+}
+
+zle -N npm_toggle_install_uninstall
+
+# Defined shortcut keys: [F2] [F2]
+bindkey -M emacs '^[OQ^[OQ' npm_toggle_install_uninstall
+bindkey -M vicmd '^[OQ^[OQ' npm_toggle_install_uninstall
+bindkey -M viins '^[OQ^[OQ' npm_toggle_install_uninstall
diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md
index 0c2bbf9f0..a8bc34ae7 100644
--- a/plugins/nvm/README.md
+++ b/plugins/nvm/README.md
@@ -17,7 +17,9 @@ where you installed nvm.
These settings should go in your zshrc file, before Oh My Zsh is sourced:
- **`NVM_HOMEBREW`**: if you installed nvm via Homebrew, in a directory other than `/usr/local/opt/nvm`, you
- can set `NVM_HOMEBREW` to be the directory where you installed it.
+ can set `NVM_HOMEBREW` to be the directory where you installed it. For example, on Apple Silicon-based Macs,
+ [Homebrew is installed in `/opt/homebrew`](https://docs.brew.sh/Installation). To get the directory where
+ nvm has been installed, regardless of chip architecture, use `NVM_HOMEBREW=$(brew --prefix nvm)`.
- **`NVM_LAZY`**: if you want the plugin to defer the load of nvm to speed-up the start of your zsh session,
set `NVM_LAZY` to `1`. This will use the `--no-use` parameter when loading nvm, and will create a function
diff --git a/plugins/oc/README.md b/plugins/oc/README.md
index deae9b2d0..b7903eafe 100644
--- a/plugins/oc/README.md
+++ b/plugins/oc/README.md
@@ -1,6 +1,6 @@
# OC - OpenShift CLI
-This plugin provides autocompletion for [OC](https://docs.openshift.com/container-platform/3.7/cli_reference/index.html) commands, building, managing and updating operations.
+This plugin provides autocompletion for [OC](https://docs.openshift.com/container-platform/latest/cli_reference/openshift_cli/getting-started-cli.html) commands, building, managing and updating operations.
To use it, add `oc` to the plugins array of your zshrc file:
diff --git a/plugins/operator-sdk/README.md b/plugins/operator-sdk/README.md
new file mode 100644
index 000000000..3336e36ef
--- /dev/null
+++ b/plugins/operator-sdk/README.md
@@ -0,0 +1,11 @@
+# Operator SDK
+
+[Operator SDK](https://sdk.operatorframework.io/) is a component of the Operator Framework, an open source toolkit to manage Kubernetes native applications, called Operators, in an effective, automated, and scalable way.
+
+To use it, add `operator-sdk` to the plugins array of your zshrc file:
+
+```sh
+plugins=(... operator-sdk)
+```
+
+
diff --git a/plugins/operator-sdk/operator-sdk.plugin.zsh b/plugins/operator-sdk/operator-sdk.plugin.zsh
new file mode 100644
index 000000000..baeb01a80
--- /dev/null
+++ b/plugins/operator-sdk/operator-sdk.plugin.zsh
@@ -0,0 +1,4 @@
+if [ $commands[operator-sdk] ]; then
+ source <(operator-sdk completion zsh)
+ compdef _operator-sdk operator-sdk
+fi
diff --git a/plugins/pass/_pass b/plugins/pass/_pass
index 75f3feb4f..d911e122f 100644
--- a/plugins/pass/_pass
+++ b/plugins/pass/_pass
@@ -6,18 +6,9 @@
# Brian Mattern
# Jason A. Donenfeld .
# All Rights Reserved.
-# This file is licensed under the GPLv2+.
-# Please visit https://git.zx2c4.com/password-store/tree/COPYING for more information.
+# This file is licensed under the GPLv2+. Please see COPYING for more information.
-# If you use multiple repositories, you can configure completion like this:
-#
-# compdef _pass workpass
-# zstyle ':completion::complete:workpass::' prefix "$HOME/work/pass"
-# workpass() {
-# PASSWORD_STORE_DIR=$HOME/work/pass pass $@
-# }
-
# If you use multiple repositories, you can configure completion like this:
#
# compdef _pass workpass
@@ -133,7 +124,7 @@ _pass_complete_entries_helper () {
local IFS=$'\n'
local prefix
zstyle -s ":completion:${curcontext}:" prefix prefix || prefix="${PASSWORD_STORE_DIR:-$HOME/.password-store}"
- _values -C 'passwords' ${$(find -L "$prefix" \( -name .git -o -name .gpg-id \) -prune -o $@ -print 2>/dev/null | sed -e "s#${prefix}/\{0,1\}##" -e 's#\.gpg##' -e 's#\\#\\\\#' | sort):-""}
+ _values -C 'passwords' ${$(find -L "$prefix" \( -name .git -o -name .gpg-id \) -prune -o $@ -print 2>/dev/null | sed -e "s#${prefix}/\{0,1\}##" -e 's#\.gpg##' -e 's#\\#\\\\#g' -e 's#:#\\:#g' | sort):-""}
}
_pass_complete_entries_with_subdirs () {
diff --git a/plugins/pep8/_pep8 b/plugins/pep8/_pep8
index ce19951dc..27b7fc544 100644
--- a/plugins/pep8/_pep8
+++ b/plugins/pep8/_pep8
@@ -29,6 +29,6 @@ _arguments -s -S \
"--max-line-length[set maximum allowed line length (default: 79)]::n:_files" \
"--format[set the error format \[default|pylint|\]]::format:_files" \
"--diff[report only lines changed according to the unified diff received on STDIN]" \
- "--benchmark[measure processing speed are read from the \[pep8\] section of the tox.ini fg file located in any parent folder of the path(s) llowed options are: exclude, filename, select, ngth, count, format, quiet, show-pep8, show-source, .]" \
+ "--benchmark[measure processing speed are read from the \[pep8\] section of the tox.ini fg file located in any parent folder of the path(s) allowed options are: exclude, filename, select, ngth, count, format, quiet, show-pep8, show-source, .]" \
"--config[user config file location (default: /home/gsemet/.config/pep8)]::path:_files" \
"*::args:_files"
diff --git a/plugins/pip/_pip b/plugins/pip/_pip
index a5adead4a..e03be6afe 100644
--- a/plugins/pip/_pip
+++ b/plugins/pip/_pip
@@ -13,7 +13,7 @@ _pip_all() {
}
_pip_installed() {
- installed_pkgs=(`pip freeze | cut -d '=' -f 1`)
+ installed_pkgs=($($service freeze | cut -d '=' -f 1))
}
local -a _1st_arguments
diff --git a/plugins/pip/pip.plugin.zsh b/plugins/pip/pip.plugin.zsh
index 629147bae..7eb2d2a35 100644
--- a/plugins/pip/pip.plugin.zsh
+++ b/plugins/pip/pip.plugin.zsh
@@ -82,16 +82,30 @@ zsh-pip-test-clean-packages() {
fi
}
-alias pip="noglob pip" # allows square brackets for pip command invocation
+if (( $+commands[pip3] && !$+commands[pip] )); then
+ alias pip="noglob pip3"
+else
+ alias pip="noglob pip"
+fi
# Create requirements file
alias pipreq="pip freeze > requirements.txt"
-# Update all installed packages
-alias pipupall="pipreq && sed -i 's/==/>=/g' requirements.txt && pip install -r requirements.txt --upgrade && rm -rf requirements.txt"
-
# Install packages from requirements file
alias pipir="pip install -r requirements.txt"
+# Update all installed packages
+function pipupall {
+ # non-GNU xargs does not support nor need `--no-run-if-empty`
+ local xargs="xargs --no-run-if-empty"
+ xargs --version 2>/dev/null | grep -q GNU || xargs="xargs"
+ pip list --outdated --format freeze | cut -d= -f1 | ${=xargs} pip install --upgrade
+}
+
# Uninstalled all installed packages
-alias pipunall="pipreq && pip uninstall -r requirements.txt -y && rm -rf requirements.txt"
+function pipunall {
+ # non-GNU xargs does not support nor need `--no-run-if-empty`
+ local xargs="xargs --no-run-if-empty"
+ xargs --version 2>/dev/null | grep -q GNU || xargs="xargs"
+ pip list --format freeze | cut -d= -f1 | ${=xargs} pip uninstall
+}
diff --git a/plugins/pj/pj.plugin.zsh b/plugins/pj/pj.plugin.zsh
index e36d49204..431576f4b 100644
--- a/plugins/pj/pj.plugin.zsh
+++ b/plugins/pj/pj.plugin.zsh
@@ -1,37 +1,34 @@
alias pjo="pj open"
-pj () {
- emulate -L zsh
+function pj() {
+ local cmd="cd"
+ local project="$1"
- cmd="cd"
- project=$1
+ if [[ "open" == "$project" ]]; then
+ shift
+ project=$*
+ cmd=${=EDITOR}
+ else
+ project=$*
+ fi
- if [[ "open" == "$project" ]]; then
- shift
- project=$*
- cmd=${=EDITOR}
- else
- project=$*
+ for basedir ($PROJECT_PATHS); do
+ if [[ -d "$basedir/$project" ]]; then
+ $cmd "$basedir/$project"
+ return
fi
+ done
- for basedir ($PROJECT_PATHS); do
- if [[ -d "$basedir/$project" ]]; then
- $cmd "$basedir/$project"
- return
- fi
- done
-
- echo "No such project '${project}'."
+ echo "No such project '${project}'."
}
_pj () {
- emulate -L zsh
+ local -a projects
+ for basedir ($PROJECT_PATHS); do
+ projects+=(${basedir}/*(/N))
+ done
- typeset -a projects
- for basedir ($PROJECT_PATHS); do
- projects+=(${basedir}/*(/N))
- done
-
- compadd ${projects:t}
+ compadd ${projects:t}
}
+
compdef _pj pj
diff --git a/plugins/please/README.md b/plugins/please/README.md
index 89bfbf105..0a33f897b 100644
--- a/plugins/please/README.md
+++ b/plugins/please/README.md
@@ -1,7 +1,7 @@
# please plugin
[Please](https://please.build) is a cross-language build system with an emphasis on
-high performance, extensibility and reproduceability. It supports a number of popular
+high performance, extensibility and reproducibility. It supports a number of popular
languages and can automate nearly any aspect of your build process.
This plugin adds autocomplete and major aliases for `plz`, the command line tool for
diff --git a/plugins/pm2/_pm2 b/plugins/pm2/_pm2
index 6f1e89df5..86412aef1 100644
--- a/plugins/pm2/_pm2
+++ b/plugins/pm2/_pm2
@@ -124,7 +124,7 @@ logs_options=(
'--out[only shows standard output]'
'--lines[output the last N lines, instead of the last 15 by default]'
'--timestamp[add timestamps (default format YYYY-MM-DD-HH:mm:ss)]'
- '--nostream[print logs without lauching the log stream]'
+ '--nostream[print logs without launching the log stream]'
'(-h --help)'{-h,--help}'[output usage information]'
$id_all_comp
)
@@ -139,7 +139,7 @@ case "$words[1]" in
stop|restart|delete|reload|reset)
_arguments $id_all_comp && return 0
;;
- env|inspect|monitor|unmonitor|discribe)
+ env|inspect|monitor|unmonitor|describe)
_arguments $id_comp && return 0
;;
deploy|startOrRestart|startOrReload)
diff --git a/plugins/poetry/README.md b/plugins/poetry/README.md
new file mode 100644
index 000000000..51780cbed
--- /dev/null
+++ b/plugins/poetry/README.md
@@ -0,0 +1,9 @@
+# Poetry Plugin
+
+This plugin automatically installs [Poetry](https://python-poetry.org/)'s completions for you, and keeps them up to date as your Poetry version changes.
+
+To use it, add `poetry` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... poetry)
+```
diff --git a/plugins/poetry/poetry.plugin.zsh b/plugins/poetry/poetry.plugin.zsh
new file mode 100644
index 000000000..cebcb46c4
--- /dev/null
+++ b/plugins/poetry/poetry.plugin.zsh
@@ -0,0 +1,14 @@
+# Return immediately if poetry is not found
+if (( ! $+commands[poetry] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `poetry`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_poetry" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _poetry
+ _comps[poetry]=_poetry
+fi
+
+poetry completions zsh >| "$ZSH_CACHE_DIR/completions/_poetry" &|
diff --git a/plugins/postgres/postgres.plugin.zsh b/plugins/postgres/postgres.plugin.zsh
index c2dbef244..b6d365d8a 100644
--- a/plugins/postgres/postgres.plugin.zsh
+++ b/plugins/postgres/postgres.plugin.zsh
@@ -1,8 +1,13 @@
# Aliases to control Postgres
# Paths noted below are for Postgres installed via Homebrew on OSX
+if (( ! $+commands[brew] )); then
+ return
+fi
-alias startpost='pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start'
-alias stoppost='pg_ctl -D /usr/local/var/postgres stop -s -m fast'
-alias restartpost='stoppost && sleep 1 && startpost'
-alias reloadpost='pg_ctl reload -D /usr/local/var/postgres -s'
-alias statuspost='pg_ctl status -D /usr/local/var/postgres -s'
\ No newline at end of file
+local PG_BREW_DIR=$(brew --prefix)/var/postgres
+
+alias startpost="pg_ctl -D $PG_BREW_DIR -l $PG_BREW_DIR/server.log start"
+alias stoppost="pg_ctl -D $PG_BREW_DIR stop -s -m fast"
+alias restartpost="stoppost && sleep 1 && startpost"
+alias reloadpost="pg_ctl reload -D $PG_BREW_DIR -s"
+alias statuspost="pg_ctl status -D $PG_BREW_DIR -s"
diff --git a/plugins/powify/_powify b/plugins/powify/_powify
index 9507f400e..57042aa63 100644
--- a/plugins/powify/_powify
+++ b/plugins/powify/_powify
@@ -15,7 +15,7 @@ _1st_arguments=(
'restart:restarts the pow app linked to the current directory'
'always_restart:reload the pow app after each request'
'always_restart_off:do not reload the pow app after each request'
- 'rename:rename the current pow app to [NAME] or renmae [OLD] to [NEW]'
+ 'rename:rename the current pow app to [NAME] or rename [OLD] to [NEW]'
'environment:run the this pow app in a different environment (aliased `env`)'
'browse:opens and navigates the default browser to this app'
'logs:tail the application logs'
diff --git a/plugins/pyenv/pyenv.plugin.zsh b/plugins/pyenv/pyenv.plugin.zsh
index 39897ed16..ebb1a708a 100644
--- a/plugins/pyenv/pyenv.plugin.zsh
+++ b/plugins/pyenv/pyenv.plugin.zsh
@@ -83,12 +83,14 @@ if [[ $FOUND_PYENV -eq 1 ]]; then
fi
function pyenv_prompt_info() {
- echo "$(pyenv version-name)"
+ local version="$(pyenv version-name)"
+ echo "${version:gs/%/%%}"
}
else
# Fall back to system python
function pyenv_prompt_info() {
- echo "system: $(python -V 2>&1 | cut -f 2 -d ' ')"
+ local version="$(python -V 2>&1 | cut -d' ' -f2)"
+ echo "system: ${version:gs/%/%%}"
}
fi
diff --git a/plugins/python/README.md b/plugins/python/README.md
index b95ffe679..c1f0adef8 100644
--- a/plugins/python/README.md
+++ b/plugins/python/README.md
@@ -1,19 +1,29 @@
-# python plugin
+# Python plugin
-The plugin adds several aliases for useful [python](https://www.python.org/) commands.
+The plugin adds several aliases for useful [Python](https://www.python.org/) commands.
-To use it, add `python` to the plugins array of your zshrc file:
-```
+To use it, add `python` to the plugins array in your zshrc file:
+
+```zsh
plugins=(... python)
```
## Aliases
-| Command | Description |
-|------------------|---------------------------------------------------------------------------------|
-| `py` | Runs `python` |
-| `ipython` | Runs the appropriate `ipython` version according to the activated virtualenv |
-| `pyfind` | Finds .py files recursively in the current directory |
-| `pyclean [dirs]` | Deletes byte-code and cache files from a list of directories or the current one |
-| `pygrep ` | Looks for `text` in .py files |
-| `pyuserpaths` | Add --user site-packages to PYTHONPATH, for all installed python versions. |
+| Command | Description |
+| ---------------- | -------------------------------------------------------------------------------------- |
+| `py` | Runs `python` |
+| `ipython` | Runs the appropriate `ipython` version according to the activated virtualenv |
+| `pyfind` | Finds .py files recursively in the current directory |
+| `pyclean [dirs]` | Deletes byte-code and cache files from a list of directories or the current one |
+| `pygrep ` | Looks for `text` in `*.py` files in the current directory, recursively |
+| `pyuserpaths` | Add user site-packages folders to `PYTHONPATH`, for Python 2 and 3 |
+| `pyserver` | Starts an HTTP server on the current directory (use `--directory` for a different one) |
+
+## Virtual environments
+
+The plugin provides two utilities to manage Python venvs:
+
+- `mkv [name]`: make a new virtual environment called `name` (default: `venv`) in current directory.
+
+- `vrun [name]`: activate virtual environment called `name` (default: `venv`) in current directory.
diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh
index 276eb6f91..7a73ab92a 100644
--- a/plugins/python/python.plugin.zsh
+++ b/plugins/python/python.plugin.zsh
@@ -7,40 +7,37 @@ alias pyfind='find . -name "*.py"'
# Remove python compiled byte-code and mypy/pytest cache in either the current
# directory or in a list of specified directories (including sub directories).
function pyclean() {
- ZSH_PYCLEAN_PLACES=${*:-'.'}
- find ${ZSH_PYCLEAN_PLACES} -type f -name "*.py[co]" -delete
- find ${ZSH_PYCLEAN_PLACES} -type d -name "__pycache__" -delete
- find ${ZSH_PYCLEAN_PLACES} -depth -type d -name ".mypy_cache" -exec rm -r "{}" +
- find ${ZSH_PYCLEAN_PLACES} -depth -type d -name ".pytest_cache" -exec rm -r "{}" +
+ find "${@:-.}" -type f -name "*.py[co]" -delete
+ find "${@:-.}" -type d -name "__pycache__" -delete
+ find "${@:-.}" -depth -type d -name ".mypy_cache" -exec rm -r "{}" +
+ find "${@:-.}" -depth -type d -name ".pytest_cache" -exec rm -r "{}" +
}
# Add the user installed site-packages paths to PYTHONPATH, only if the
# directory exists. Also preserve the current PYTHONPATH value.
# Feel free to autorun this when .zshrc loads.
function pyuserpaths() {
- local targets=("python2" "python3") # bins
-
- # Get existing interpreters.
- local interps=()
- for target in $targets; do
- [ `command -v $target` ] && interps+=($target)
- done
+ setopt localoptions extendedglob
- # Check for a non-standard install directory.
- local user_base="${HOME}/.local"
- [ $PYTHONUSERBASE ] && user_base=$PYTHONUSERBASE
+ # Check for a non-standard install directory.
+ local user_base="${PYTHONUSERBASE:-"${HOME}/.local"}"
- # Add version specific paths, if:
- # it exists in the filesystem;
- # it isn't in PYTHONPATH already.
- for interp in $interps; do
- # Get minor release version.
- local ver=`$interp -V 2>&1`
- ver=`echo ${ver:7} | cut -d '.' -f 1,2` # The patch version is variable length, truncate it.
-
- local site_pkgs="${user_base}/lib/python${ver}/site-packages"
- [[ -d $site_pkgs && ! $PYTHONPATH =~ $site_pkgs ]] && export PYTHONPATH=${site_pkgs}:$PYTHONPATH
- done
+ local python version site_pkgs
+ for python in python2 python3; do
+ # Check if command exists
+ (( ${+commands[$python]} )) || continue
+
+ # Get minor release version.
+ # The patch version is variable length, truncate it.
+ version=${(M)${"$($python -V 2>&1)":7}#[^.]##.[^.]##}
+
+ # Add version specific path, if:
+ # - it exists in the filesystem
+ # - it isn't in $PYTHONPATH already.
+ site_pkgs="${user_base}/lib/python${version}/site-packages"
+ [[ -d "$site_pkgs" && ! "$PYTHONPATH" =~ (^|:)"$site_pkgs"(:|$) ]] || continue
+ export PYTHONPATH="${site_pkgs}${PYTHONPATH+":${PYTHONPATH}"}"
+ done
}
# Grep among .py files
@@ -48,3 +45,39 @@ alias pygrep='grep -nr --include="*.py"'
# Run proper IPython regarding current virtualenv (if any)
alias ipython="python -c 'import IPython; IPython.terminal.ipapp.launch_new_instance()'"
+
+# Share local directory as a HTTP server
+alias pyserver="python -m http.server"
+
+
+## venv utilities
+
+# Activate a the python virtual environment specified.
+# If none specified, use 'venv'.
+function vrun() {
+ local name="${1:-venv}"
+ local venvpath="${name:P}"
+
+ if [[ ! -d "$venvpath" ]]; then
+ echo >&2 "Error: no such venv in current directory: $name"
+ return 1
+ fi
+
+ if [[ ! -f "${venvpath}/bin/activate" ]]; then
+ echo >&2 "Error: '${name}' is not a proper virtual environment"
+ return 1
+ fi
+
+ . "${venvpath}/bin/activate" || return $?
+ echo "Activated virtual environment ${name}"
+}
+
+# Create a new virtual environment, with default name 'venv'.
+function mkv() {
+ local name="${1:-venv}"
+ local venvpath="${name:P}"
+
+ python3 -m venv "${name}" || return
+ echo >&2 "Created venv in '${venvpath}'"
+ vrun "${name}"
+}
diff --git a/plugins/rake/README.md b/plugins/rake/README.md
index e888c0785..72f2a8525 100644
--- a/plugins/rake/README.md
+++ b/plugins/rake/README.md
@@ -13,25 +13,29 @@ plugins=(... rake)
The plugin aliases the rake command so you can pass arguments when invoking rake tasks
without having to escape the brackets, i.e., you can run
-```
+
+```sh
rake namespace:task['argument']
```
+
instead of having to do
-```
+
+```sh
rake namespace:task\['argument'\]
```
-| Alias | Command | Description |
-|--------|--------------------------------|-----------------------------------------------|
-| rake | `noglob rake` | Allows unescaped square brackets |
-| brake | `noglob bundle exec rake` | Same as above but call rake using bundler |
-| srake | `noglob sudo rake` | Same as rake but using sudo |
-| sbrake | `noglob sudo bundle exec rake` | Same as above but using both sudo and bundler |
+| Alias | Command | Description |
+| ---------- | ------------------------------ | --------------------------------------------- |
+| `rake` | `noglob rake` | Allows unescaped square brackets |
+| `bin/rake` | `noglob bin/rake` | Same as above but using rake binstub |
+| `brake` | `noglob bundle exec rake` | Same as above but call rake using bundler |
+| `srake` | `noglob sudo rake` | Same as rake but using sudo |
+| `sbrake` | `noglob sudo bundle exec rake` | Same as above but using both sudo and bundler |
## Jim Weirich
The plugin also aliases `rake` to [`jimweirich`](https://github.com/jimweirich), author of Rake
and big time contributor to the Ruby open source community. He passed away in 2014:
-> Thank you Jim for everything you contributed to the Ruby and open source community
+> Thank you Jim for everything you contributed to the Ruby and open source community
> over the years. We will miss you dearly. — [**@robbyrussell**](https://github.com/ohmyzsh/ohmyzsh/commit/598a9c6f990756386517d66b6bcf77e53791e905)
diff --git a/plugins/rake/rake.plugin.zsh b/plugins/rake/rake.plugin.zsh
index 121150017..0c507e628 100644
--- a/plugins/rake/rake.plugin.zsh
+++ b/plugins/rake/rake.plugin.zsh
@@ -1,10 +1,9 @@
-# Thank you Jim for everything you contributed to the Ruby and open source community
+# Thank you Jim for everything you contributed to the Ruby and open source community
# over the years. We will miss you dearly.
-alias jimweirich="rake"
-
-alias rake="noglob rake" # allows square brackts for rake task invocation
-alias brake='noglob bundle exec rake' # execute the bundled rake gem
-alias srake='noglob sudo rake' # noglob must come before sudo
-alias sbrake='noglob sudo bundle exec rake' # altogether now ...
-
+alias jimweirich='rake'
+alias rake='noglob rake' # allows square brackts for rake task invocation
+alias 'bin/rake'='noglob bin/rake' # support use of binstub
+alias brake='noglob bundle exec rake' # execute the bundled rake gem
+alias srake='noglob sudo rake' # noglob must come before sudo
+alias sbrake='noglob sudo bundle exec rake' # altogether now ...
diff --git a/plugins/rbenv/rbenv.plugin.zsh b/plugins/rbenv/rbenv.plugin.zsh
index 0f2d366e2..d758aebae 100644
--- a/plugins/rbenv/rbenv.plugin.zsh
+++ b/plugins/rbenv/rbenv.plugin.zsh
@@ -4,65 +4,65 @@
FOUND_RBENV=$+commands[rbenv]
if [[ $FOUND_RBENV -ne 1 ]]; then
- rbenvdirs=("$HOME/.rbenv" "/usr/local/rbenv" "/opt/rbenv" "/usr/local/opt/rbenv")
- for dir in $rbenvdirs; do
- if [[ -d $dir/bin ]]; then
- export PATH="$dir/bin:$PATH"
- FOUND_RBENV=1
- break
- fi
- done
+ rbenvdirs=("$HOME/.rbenv" "/usr/local/rbenv" "/opt/rbenv" "/usr/local/opt/rbenv")
+ for dir in $rbenvdirs; do
+ if [[ -d $dir/bin ]]; then
+ export PATH="$dir/bin:$PATH"
+ FOUND_RBENV=1
+ break
+ fi
+ done
fi
if [[ $FOUND_RBENV -ne 1 ]]; then
- if (( $+commands[brew] )) && dir=$(brew --prefix rbenv 2>/dev/null); then
- if [[ -d $dir/bin ]]; then
- export PATH="$dir/bin:$PATH"
- FOUND_RBENV=1
- fi
+ if (( $+commands[brew] )) && dir=$(brew --prefix rbenv 2>/dev/null); then
+ if [[ -d $dir/bin ]]; then
+ export PATH="$dir/bin:$PATH"
+ FOUND_RBENV=1
fi
+ fi
fi
if [[ $FOUND_RBENV -eq 1 ]]; then
- eval "$(rbenv init --no-rehash - zsh)"
+ eval "$(rbenv init --no-rehash - zsh)"
- alias rubies="rbenv versions"
- alias gemsets="rbenv gemset list"
+ alias rubies="rbenv versions"
+ alias gemsets="rbenv gemset list"
- function current_ruby() {
- echo "$(rbenv version-name)"
- }
+ function current_ruby() {
+ echo "$(rbenv version-name)"
+ }
- function current_gemset() {
- echo "$(rbenv gemset active 2>/dev/null)" | tr ' ' '+'
- }
+ function current_gemset() {
+ echo "$(rbenv gemset active 2>/dev/null)" | tr ' ' '+'
+ }
- function gems() {
- local rbenv_path=$(rbenv prefix)
- gem list $@ | sed -E \
- -e "s/\([0-9a-z, \.]+( .+)?\)/$fg[blue]&$reset_color/g" \
- -e "s|$(echo $rbenv_path)|$fg[magenta]\$rbenv_path$reset_color|g" \
- -e "s/$current_ruby@global/$fg[yellow]&$reset_color/g" \
- -e "s/$current_ruby$current_gemset$/$fg[green]&$reset_color/g"
- }
+ function gems() {
+ local rbenv_path=$(rbenv prefix)
+ gem list $@ | sed -E \
+ -e "s/\([0-9a-z, \.]+( .+)?\)/$fg[blue]&$reset_color/g" \
+ -e "s|$(echo $rbenv_path)|$fg[magenta]\$rbenv_path$reset_color|g" \
+ -e "s/$current_ruby@global/$fg[yellow]&$reset_color/g" \
+ -e "s/$current_ruby$current_gemset$/$fg[green]&$reset_color/g"
+ }
- function rbenv_prompt_info() {
- local ruby=$(current_ruby) gemset=$(current_gemset)
- echo -n "${ZSH_THEME_RUBY_PROMPT_PREFIX}"
- [[ -n "$gemset" ]] && echo -n "${ruby}@${gemset}" || echo -n "${ruby}"
- echo "${ZSH_THEME_RUBY_PROMPT_SUFFIX}"
- }
+ function rbenv_prompt_info() {
+ local ruby=${$(current_ruby):gs/%/%%} gemset=${$(current_gemset):gs/%/%%}
+ echo -n "${ZSH_THEME_RUBY_PROMPT_PREFIX}"
+ [[ -n "$gemset" ]] && echo -n "${ruby}@${gemset}" || echo -n "${ruby}"
+ echo "${ZSH_THEME_RUBY_PROMPT_SUFFIX}"
+ }
else
- alias rubies="ruby -v"
- function gemsets() { echo "not supported" }
- function current_ruby() { echo "not supported" }
- function current_gemset() { echo "not supported" }
- function gems() { echo "not supported" }
- function rbenv_prompt_info() {
- echo -n "${ZSH_THEME_RUBY_PROMPT_PREFIX}"
- echo -n "system: $(ruby -v | cut -f-2 -d ' ')"
- echo "${ZSH_THEME_RUBY_PROMPT_SUFFIX}"
- }
+ alias rubies="ruby -v"
+ function gemsets() { echo "not supported" }
+ function current_ruby() { echo "not supported" }
+ function current_gemset() { echo "not supported" }
+ function gems() { echo "not supported" }
+ function rbenv_prompt_info() {
+ echo -n "${ZSH_THEME_RUBY_PROMPT_PREFIX}"
+ echo -n "system: $(ruby -v | cut -f-2 -d ' ' | sed 's/%/%%/g')"
+ echo "${ZSH_THEME_RUBY_PROMPT_SUFFIX}"
+ }
fi
unset FOUND_RBENV rbenvdirs dir
diff --git a/plugins/rbfu/README.md b/plugins/rbfu/README.md
index f1f9fa2f7..fbcab64de 100644
--- a/plugins/rbfu/README.md
+++ b/plugins/rbfu/README.md
@@ -4,6 +4,7 @@ This plugin starts [rbfu](https://github.com/hmans/rbfu), a minimal Ruby version
manager, and adds some useful functions.
To use it, add `rbfu` to the plugins array in your zshrc file:
+
```zsh
plugins=(... rbfu)
```
diff --git a/plugins/rbfu/rbfu.plugin.zsh b/plugins/rbfu/rbfu.plugin.zsh
index 008485205..27dc3eec6 100644
--- a/plugins/rbfu/rbfu.plugin.zsh
+++ b/plugins/rbfu/rbfu.plugin.zsh
@@ -5,38 +5,45 @@
# rvm_prompt_info function to return the $RBFU_RUBY_VERSION
# version.
-command -v rbfu &>/dev/null
+command -v rbfu &>/dev/null || return
-if [[ $? -eq 0 ]]; then
- eval "$(rbfu --init --auto)"
+eval "$(rbfu --init --auto)"
- # Internal: Print ruby version details, if it's currently
- # active etc.
- function _rbfu_rubies_print() {
- local rb rb_out
- rb=$(basename $1)
- rb_out="$rb"
- [[ -h $1 ]] && rb_out="$rb_out${fg[green]}@${reset_color}"
- [[ "x$rb" == "x$2" ]] && rb_out="${fg[red]}$rb_out ${fg[red]}*${reset_color}"
- echo $rb_out
- }
+# Internal: Print ruby version details, if it's currently active, etc.
+function _rbfu_rubies_print() {
+ # 1: path to ruby file
+ # 2: active ruby
+ local rb rb_out
+ rb="${$1:t}"
+ rb_out="$rb"
- # Public: Provide a list with all available rubies, this basically depends
- # on `ls -1` and .rfbu/rubies. Highlights the currently active ruby version
- # and aliases.
- function rbfu-rubies() {
- local rbfu_dir active_rb
- rbfu_dir=$RBFU_RUBIES
- active_rb=$RBFU_RUBY_VERSION
- [[ -z "$rbfu_dir" ]] && rbfu_dir="${HOME}/.rbfu/rubies"
- [[ -z "$active_rb" ]] && active_rb="system"
- _rbfu_rubies_print "${rbfu_dir}/system" $active_rb
- for rb in $(ls -1 $rbfu_dir); do
- _rbfu_rubies_print "${rbfu_dir}/${rb}" $active_rb
- done
- }
+ # If the ruby is a symlink, add @ to the name.
+ if [[ -h "$1" ]]; then
+ rb_out="${rb_out}${fg[green]}@${reset_color}"
+ fi
- # Public: Create rvm_prompt_info command for themes compatibility, unless
- # it has already been defined.
- [ ! -x rvm_prompt_info ] && function rvm_prompt_info() { echo "${RBFU_RUBY_VERSION:=system}" }
-fi
+ # If the ruby is active, add * to the name and show it in red.
+ if [[ "$rb" = "$2" ]]; then
+ rb_out="${fg[red]}${rb_out} ${fg[red]}*${reset_color}"
+ fi
+
+ echo $rb_out
+}
+
+# Public: Provide a list with all available rubies, this basically depends
+# on ~/.rfbu/rubies. Highlights the currently active ruby version and aliases.
+function rbfu-rubies() {
+ local rbfu_dir active_rb
+ rbfu_dir="${RBFU_RUBIES:-${HOME}/.rbfu/rubies}"
+ active_rb="${RBFU_RUBY_VERSION:-system}"
+
+ _rbfu_rubies_print "${rbfu_dir}/system" "$active_rb"
+ for rb in ${rbfu_dir}/*(N); do
+ _rbfu_rubies_print "$rb" "$active_rb"
+ done
+}
+
+# Public: Create rvm_prompt_info command for themes compatibility, unless
+# it has already been defined.
+(( ${+functions[rvm_prompt_info]} )) || \
+function rvm_prompt_info() { echo "${${RBFU_RUBY_VERSION:=system}:gs/%/%%}" }
diff --git a/plugins/rbw/README.md b/plugins/rbw/README.md
new file mode 100644
index 000000000..87d073d24
--- /dev/null
+++ b/plugins/rbw/README.md
@@ -0,0 +1,12 @@
+# Bitwarden (unofficial) CLI plugin
+
+This plugin adds completion for [rbw](https://github.com/doy/rbw), an unofficial
+CLI for [Bitwarden](https://bitwarden.com).
+
+To use it, add `rbw` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... rbw)
+```
+
+This plugin does not add any aliases.
diff --git a/plugins/rbw/rbw.plugin.zsh b/plugins/rbw/rbw.plugin.zsh
new file mode 100644
index 000000000..56683ad06
--- /dev/null
+++ b/plugins/rbw/rbw.plugin.zsh
@@ -0,0 +1,19 @@
+if (( ! $+commands[rbw] )); then
+ return
+fi
+
+# TODO: 2021-12-28: remove this bit of code as it exists in oh-my-zsh.sh
+# Add completions folder in $ZSH_CACHE_DIR
+command mkdir -p "$ZSH_CACHE_DIR/completions"
+(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
+
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `rbw`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_rbw" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _rbw
+ _comps[rbw]=_rbw
+fi
+
+rbw gen-completions zsh >| "$ZSH_CACHE_DIR/completions/_rbw" &|
diff --git a/plugins/rebar/_rebar b/plugins/rebar/_rebar
index 7ac5a510c..ea0d8a674 100644
--- a/plugins/rebar/_rebar
+++ b/plugins/rebar/_rebar
@@ -32,7 +32,7 @@ _rebar () {
'create[Create skel based on template and vars]' \
'create-app[Create simple app skel]' \
'create-node[Create simple node skel]' \
- 'list-template[List avaiavle templates]' \
+ 'list-template[List available templates]' \
'doc[Generate Erlang program documentation]' \
'check-deps[Display to be fetched dependencies]' \
'get-deps[Fetch dependencies]' \
diff --git a/plugins/redis-cli/_redis-cli b/plugins/redis-cli/_redis-cli
index 1569f2916..f93624565 100644
--- a/plugins/redis-cli/_redis-cli
+++ b/plugins/redis-cli/_redis-cli
@@ -8,7 +8,7 @@ _1st_arguments=(
'append:append a value to a key'
'auth:authenticate to the server'
'bgrewriteeaof:asynchronously rewrite the append-only file'
- 'bgsave:asynchornously save the dataset to disk'
+ 'bgsave:asynchronously save the dataset to disk'
'blpop:remove and get the first element in a list, or block until one is available'
'brpop:remove and get the last element in a list, or block until one is available'
'brpoplpush:pop a value from a list, push it to another list and return it; or block until one is available'
@@ -17,9 +17,9 @@ _1st_arguments=(
# 'config resetstat: reset the stats returned by INFO'
'dbsize:return the number of keys in the selected database'
# 'debug object:get debugging information about a key'
- # 'debug setgfault:make the server crash'
+ # 'debug segfault:make the server crash'
'decr:decrement the integer value of a key by one'
- 'decrby:decrement the integet value of a key by the given number'
+ 'decrby:decrement the integer value of a key by the given number'
'del:delete a key'
'discard:discard all commands issued after MULTI'
'echo:echo the given string'
@@ -63,7 +63,7 @@ _1st_arguments=(
'mget:get the values of all the given keys'
'monitor:listen for all requests received by the server in real time'
'move:move a key to another database'
- 'mset:set multiple keys to muliple values'
+ 'mset:set multiple keys to multiple values'
'msetnx:set multiple keys tom ultiple values, only if none of the keys exist'
'multi:mark the start of a transaction block'
'object:inspect the internals of Redis objects'
@@ -122,7 +122,7 @@ _1st_arguments=(
'zrem:remove a member from a sorted set'
'zremrangebyrank:remove all members in a sorted set within the given indexes'
'zremrangebyscore:remove all members in a sorted set within the given scores'
- 'zrevrange:return a range of membrs in a sorted set, by index, with scores ordered from high to low'
+ 'zrevrange:return a range of members in a sorted set, by index, with scores ordered from high to low'
'zrevrangebyscore:return a range of members in a sorted set, by score, with scores ordered from high to low'
'zrevrank:determine the index of a member in a sorted set, with scores ordered from high to low'
'zscore:get the score associated with the given member in a sorted set'
diff --git a/plugins/repo/_repo b/plugins/repo/_repo
index db0ecd14d..2b1f165f1 100644
--- a/plugins/repo/_repo
+++ b/plugins/repo/_repo
@@ -114,7 +114,9 @@ _repo()
(start)
_arguments : \
"(-h --help)"{-h,--help}"[Show help]" \
- "(--all)--all=[begin branch in all projects]"\
+ "(--all)--all[begin branch in all projects]"\
+ "(-r --rev --revision)"{-r,--rev,--revision=}"[point branch at this revision instead of upstream]":branch_or_rev:__repo__repo_branch_or_rev\
+ "(--head)--head[abbreviation for --rev HEAD]"\
':branch name:__repo_new__repo_branch_name' \
':projects:__repo_projects_or_all' \
&& ret=0
@@ -143,6 +145,13 @@ _repo()
"(-h --help)"{-h,--help}"[Show help]" \
&& ret=0
;;
+ (stage)
+ _arguments : \
+ "(-h --help)"{-h,--help}"[Show help]" \
+ "(-i --interactive)"{-i,--interactive}"[use interactive staging]" \
+ ':projects:__repo_projects' \
+ && ret=0
+ ;;
(status)
_arguments : \
"(-h --help)"{-h,--help}"[Show help]" \
diff --git a/plugins/ripgrep/README.md b/plugins/ripgrep/README.md
index 937f73c81..a26f45823 100644
--- a/plugins/ripgrep/README.md
+++ b/plugins/ripgrep/README.md
@@ -8,6 +8,6 @@ To use it, add `ripgrep` to the plugins array in your zshrc file:
plugins=(... ripgrep)
```
-Completion is taken from the ripgrep release [`11.0.2`](https://github.com/BurntSushi/ripgrep/releases/tag/11.0.2).
+Completion is taken from the ripgrep release [`12.1.1`](https://github.com/BurntSushi/ripgrep/releases/tag/12.1.1).
-Updated on August 16th, 2019.
+Updated on April 1st, 2021.
diff --git a/plugins/ripgrep/_ripgrep b/plugins/ripgrep/_ripgrep
index d7dcfd64a..828a6e601 100644
--- a/plugins/ripgrep/_ripgrep
+++ b/plugins/ripgrep/_ripgrep
@@ -3,7 +3,7 @@
##
# zsh completion function for ripgrep
#
-# Run ci/test_complete.sh after building to ensure that the options supported by
+# Run ci/test-complete after building to ensure that the options supported by
# this function stay in synch with the `rg` binary.
#
# For convenience, a completion reference guide is included at the bottom of
@@ -72,11 +72,19 @@ _rg() {
+ '(count)' # Counting options
{-c,--count}'[only show count of matching lines for each file]'
'--count-matches[only show count of individual matches for each file]'
+ '--include-zero[include files with zero matches in summary]'
+ '(encoding)' # Encoding options
{-E+,--encoding=}'[specify text encoding of files to search]: :_rg_encodings'
$no'--no-encoding[use default text encoding]'
+ + '(engine)' # Engine choice options
+ '--engine=[select which regex engine to use]:when:((
+ default\:"use default engine"
+ pcre2\:"identical to --pcre2"
+ auto\:"identical to --auto-hybrid-regex"
+ ))'
+
+ file # File-input options
'(1)*'{-f+,--file=}'[specify file containing patterns to search for]: :_files'
@@ -128,6 +136,10 @@ _rg() {
'--ignore-file-case-insensitive[process ignore files case insensitively]'
$no'--no-ignore-file-case-insensitive[process ignore files case sensitively]'
+ + '(ignore-exclude)' # Local exclude (ignore)-file options
+ "--no-ignore-exclude[don't respect local exclude (ignore) files]"
+ $no'--ignore-exclude[respect local exclude (ignore) files]'
+
+ '(ignore-global)' # Global ignore-file options
"--no-ignore-global[don't respect global ignore files]"
$no'--ignore-global[respect global ignore files]'
@@ -140,10 +152,18 @@ _rg() {
"--no-ignore-vcs[don't respect version control ignore files]"
$no'--ignore-vcs[respect version control ignore files]'
- + '(ignore-dot)' # .ignore-file options
+ + '(require-git)' # git specific settings
+ "--no-require-git[don't require git repository to respect gitignore rules]"
+ $no'--require-git[require git repository to respect gitignore rules]'
+
+ + '(ignore-dot)' # .ignore options
"--no-ignore-dot[don't respect .ignore files]"
$no'--ignore-dot[respect .ignore files]'
+ + '(ignore-files)' # custom global ignore file options
+ "--no-ignore-files[don't respect --ignore-file flags]"
+ $no'--ignore-files[respect --ignore-file files]'
+
+ '(json)' # JSON options
'--json[output results in JSON Lines format]'
$no"--no-json[don't output results in JSON Lines format]"
@@ -263,6 +283,10 @@ _rg() {
{-w,--word-regexp}'[only show matches surrounded by word boundaries]'
{-x,--line-regexp}'[only show matches surrounded by line boundaries]'
+ + '(unicode)' # Unicode options
+ $no'--unicode[enable Unicode mode]'
+ '--no-unicode[disable Unicode mode]'
+
+ '(zip)' # Compression options
'(--pre)'{-z,--search-zip}'[search in compressed files]'
$no"--no-search-zip[don't search in compressed files]"
@@ -277,7 +301,9 @@ _rg() {
))'
'*--colors=[specify color and style settings]: :->colorspec'
'--context-separator=[specify string used to separate non-continuous context lines in output]:separator'
+ $no"--no-context-separator[don't print context separators]"
'--debug[show debug messages]'
+ '--trace[show more verbose debug messages]'
'--dfa-size-limit=[specify upper size limit of generated DFA]:DFA size (bytes)'
"(1 stats)--files[show each file that would be searched (but don't search)]"
'*--ignore-file=[specify additional ignore file]:ignore file:_files'
@@ -297,7 +323,7 @@ _rg() {
'(--type-list)*: :_files'
)
- # This is used with test_complete.sh to verify that there are no options
+ # This is used with test-complete to verify that there are no options
# listed in the help output that aren't also defined here
[[ $_RG_COMPLETE_LIST_ARGS == (1|t*|y*) ]] && {
print -rl - $args
diff --git a/plugins/ruby/README.md b/plugins/ruby/README.md
index 59594ade7..59d839c5c 100644
--- a/plugins/ruby/README.md
+++ b/plugins/ruby/README.md
@@ -10,22 +10,24 @@ plugins=(... ruby)
## Aliases
-| Alias | Command | Description |
-|--------|----------------------------------------|------------------------------------------------------|
-| rb | `ruby` | The Ruby command |
-| sgem | `sudo gem` | Run sudo gem on the system ruby, not the active ruby |
-| rfind | `find . -name "*.rb" \| xargs grep -n` | Find ruby file |
-| gein | `gem install` | Install a gem into the local repository |
-| geun | `gem uninstall` | Uninstall gems from the local repository |
-| geli | `gem list` | Display gems installed locally |
-| gei | `gem info` | Show information for the given gem |
-| geiall | `gem info --all` | Display all gem versions |
-| geca | `gem cert --add` | Add a trusted certificate |
-| gecr | `gem cert --remove` | Remove a trusted certificate |
-| gecb | `gem cert --build` | Build private key and self-signed certificate |
-| geclup | `gem cleanup -n` | Do not uninstall gem |
-| gegi | `gem generate_index` | Generate index file for gem server |
-| geh | `gem help` | Provide additional help |
-| gel | `gem lock` | Generate a lockdown list of gems |
-| geo | `gem open` | Open gem source in default editor |
-| geoe | `gem open -e` | Open gem sources in preferred editor |
+| Alias | Command | Description |
+| ------- | -------------------------------------- | ---------------------------------------------------- |
+| rb | `ruby` | The Ruby command |
+| sgem | `sudo gem` | Run sudo gem on the system ruby, not the active ruby |
+| rfind | `find . -name "*.rb" \| xargs grep -n` | Find ruby file |
+| rrun | `ruby -e` | Execute some code: E.g: `rrun "puts 'Hello world!'"` |
+| rserver | `ruby -e httpd . -p 8080` | Start HTTP Webrick serving local directory/files |
+| gein | `gem install` | Install a gem into the local repository |
+| geun | `gem uninstall` | Uninstall gems from the local repository |
+| geli | `gem list` | Display gems installed locally |
+| gei | `gem info` | Show information for the given gem |
+| geiall | `gem info --all` | Display all gem versions |
+| geca | `gem cert --add` | Add a trusted certificate |
+| gecr | `gem cert --remove` | Remove a trusted certificate |
+| gecb | `gem cert --build` | Build private key and self-signed certificate |
+| geclup | `gem cleanup -n` | Do not uninstall gem |
+| gegi | `gem generate_index` | Generate index file for gem server |
+| geh | `gem help` | Provide additional help |
+| gel | `gem lock` | Generate a lockdown list of gems |
+| geo | `gem open` | Open gem source in default editor |
+| geoe | `gem open -e` | Open gem sources in preferred editor |
diff --git a/plugins/ruby/ruby.plugin.zsh b/plugins/ruby/ruby.plugin.zsh
index 890fcb179..408512110 100644
--- a/plugins/ruby/ruby.plugin.zsh
+++ b/plugins/ruby/ruby.plugin.zsh
@@ -22,3 +22,5 @@ alias geh="gem help"
alias gel="gem lock"
alias geo="gem open"
alias geoe="gem open -e"
+alias rrun="ruby -e"
+alias rserver="ruby -e httpd . -p 8080" # requires webrick
diff --git a/plugins/rust/README.md b/plugins/rust/README.md
index 83d7d91ba..e05364474 100644
--- a/plugins/rust/README.md
+++ b/plugins/rust/README.md
@@ -1,6 +1,6 @@
# rust
-This plugin adds completion for [`rustc`](https://doc.rust-lang.org/rustc/index.html), the compiler for the Rust programming language.
+This plugin adds completion for [`rustc`](https://doc.rust-lang.org/rustc/index.html), the compiler for the Rust programming language, as well as for `rustup` and `cargo` if you have the Rust toolchain installed.
To use it, add `rust` to the plugins array in your zshrc file:
diff --git a/plugins/rust/_rust b/plugins/rust/_rustc
similarity index 100%
rename from plugins/rust/_rust
rename to plugins/rust/_rustc
diff --git a/plugins/rust/rust.plugin.zsh b/plugins/rust/rust.plugin.zsh
new file mode 100644
index 000000000..db6ca9e74
--- /dev/null
+++ b/plugins/rust/rust.plugin.zsh
@@ -0,0 +1,31 @@
+if ! (( $+commands[rustup] && $+commands[cargo] )); then
+ return
+fi
+
+# Add completions folder in $ZSH_CACHE_DIR
+# TODO: 2021-12-28: remove this bit of code as it exists in oh-my-zsh.sh
+command mkdir -p "$ZSH_CACHE_DIR/completions"
+(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `cargo`. Otherwise, compinit will have already done that
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_cargo" ]]; then
+ autoload -Uz _cargo
+ typeset -g -A _comps
+ _comps[cargo]=_cargo
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `rustup`. Otherwise, compinit will have already done that
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_rustup" ]]; then
+ autoload -Uz _rustup
+ typeset -g -A _comps
+ _comps[rustup]=_rustup
+fi
+
+# Generate completion files in the background
+rustup completions zsh >| "$ZSH_CACHE_DIR/completions/_rustup" &|
+cat >| "$ZSH_CACHE_DIR/completions/_cargo" <<'EOF'
+#compdef cargo
+source "$(rustc +${${(z)$(rustup default)}[1]} --print sysroot)"/share/zsh/site-functions/_cargo
+EOF
diff --git a/plugins/rustup/README.md b/plugins/rustup/README.md
index ba037f8f6..c620e72a8 100644
--- a/plugins/rustup/README.md
+++ b/plugins/rustup/README.md
@@ -1,9 +1,3 @@
# rustup
-This plugin adds completion for [`rustup`](https://rustup.rs/), the toolchain installer for the Rust programming language.
-
-To use it, add `rustup` to the plugins array in your zshrc file:
-
-```zsh
-plugins=(... rustup)
-```
+**Deprecated: use the [`rust`](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/rust) plugin instead.**
diff --git a/plugins/rustup/rustup.plugin.zsh b/plugins/rustup/rustup.plugin.zsh
index c6efc1b13..3d59c1c54 100644
--- a/plugins/rustup/rustup.plugin.zsh
+++ b/plugins/rustup/rustup.plugin.zsh
@@ -1,22 +1,15 @@
-if (( $+commands[rustup] )); then
- # remove old generated completion file
- command rm -f "${0:A:h}/_rustup"
+print ${(%):-'%F{yellow}The `rustup` plugin is deprecated and has been moved to the `rust` plugin.'}
+print ${(%):-'Please update your .zshrc to use the `%Brust%b` plugin instead.%f'}
- ver="$(rustup --version 2>/dev/null)"
- ver_file="$ZSH_CACHE_DIR/rustup_version"
- comp_file="$ZSH_CACHE_DIR/completions/_rustup"
+# TODO: 2021-12-28: remove this block
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+# Remove old generated completion file
+command rm -f "${0:A:h}/_rustup" "$ZSH_CACHE_DIR/rustup_version"
- mkdir -p "${comp_file:h}"
- (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
-
- if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
- rustup completions zsh >| "$comp_file"
- echo "$ver" >| "$ver_file"
- fi
-
- declare -A _comps
- autoload -Uz _rustup
- _comps[rustup]=_rustup
-
- unset ver ver_file comp_file
-fi
+(( ${fpath[(Ie)$ZSH/plugins/rust]} )) || {
+ fpath=("$ZSH/plugins/rust" $fpath)
+ source "$ZSH/plugins/rust/rust.plugin.zsh"
+}
diff --git a/plugins/rvm/README.md b/plugins/rvm/README.md
index 1ed8d46a2..258c89420 100644
--- a/plugins/rvm/README.md
+++ b/plugins/rvm/README.md
@@ -10,11 +10,26 @@ plugins=(... rvm)
## Aliases
-| Alias | Command |
-|----------------|----------------------|
-| `rb18` | `rvm use ruby-1.8.7` |
-| `rb19` | `rvm use ruby-1.9.3` |
-| `rb20` | `rvm use ruby-2.0.0` |
-| `rb21` | `rvm use ruby-2.1.2` |
-| `rvm-update` | `rvm get head` |
-| `gems` | `gem list` |
+| Alias | Command |
+| ------------ | -------------------- |
+| `rb18` | `rvm use ruby-1.8.7` |
+| `rb19` | `rvm use ruby-1.9.3` |
+| `rb20` | `rvm use ruby-2.0.0` |
+| `rb21` | `rvm use ruby-2.1` |
+| `rb22` | `rvm use ruby-2.2` |
+| `rb23` | `rvm use ruby-2.3` |
+| `rb24` | `rvm use ruby-2.4` |
+| `rb25` | `rvm use ruby-2.5` |
+| `rb26` | `rvm use ruby-2.6` |
+| `rb27` | `rvm use ruby-2.7` |
+| `rb30` | `rvm use ruby-3.0` |
+| `rvm-update` | `rvm get head` |
+| `gems` | `gem list` |
+| `rvms` | `rvm gemset` |
+
+## Deprecated versions
+
+At the time of writing this (2021-12-28), Ruby versions until 2.5 are [EOL][1],
+and will be removed in the future.
+
+[1]: https://endoflife.date/ruby
diff --git a/plugins/rvm/rvm.plugin.zsh b/plugins/rvm/rvm.plugin.zsh
index 53e809aaf..864389ba8 100644
--- a/plugins/rvm/rvm.plugin.zsh
+++ b/plugins/rvm/rvm.plugin.zsh
@@ -1,74 +1,54 @@
-fpath=($rvm_path/scripts/zsh/Completion $fpath)
+# Completion
+fpath+=("${rvm_path}/scripts/zsh/Completion")
+typeset -g -A _comps
+autoload -Uz _rvm
+_comps[rvm]=_rvm
+
+# Aliases
alias rubies='rvm list rubies'
-alias gemsets='rvm gemset list'
+alias rvms='rvm gemset'
+alias gemsets='rvms list'
-local ruby18='ruby-1.8.7'
-local ruby19='ruby-1.9.3'
-local ruby20='ruby-2.0.0'
-local ruby21='ruby-2.1.2'
-function rb18 {
- if [ -z "$1" ]; then
- rvm use "$ruby18"
- else
- rvm use "$ruby18@$1"
- fi
-}
+# rb{version} utilities
+# From `rvm list known`
+typeset -A rubies
+rubies=(
+ 18 'ruby-1.8.7'
+ 19 'ruby-1.9.3'
+ 20 'ruby-2.0.0'
+ 21 'ruby-2.1'
+ 22 'ruby-2.2'
+ 23 'ruby-2.3'
+ 24 'ruby-2.4'
+ 25 'ruby-2.5'
+ 26 'ruby-2.6'
+ 27 'ruby-2.7'
+ 30 'ruby-3.0'
+)
-_rb18() {compadd `ls -1 $rvm_path/gems | grep "^$ruby18@" | sed -e "s/^$ruby18@//" | awk '{print $1}'`}
-compdef _rb18 rb18
+for v in ${(k)rubies}; do
+ version="${rubies[$v]}"
+ functions[rb${v}]="rvm use ${version}\${1+"@\$1"}"
+ functions[_rb${v}]="compadd \$(ls -1 \"\${rvm_path}/gems\" | grep '^${version}@' | sed -e 's/^${version}@//' | awk '{print $1}')"
+ compdef _rb$v rb$v
+done
+unset rubies v version
-function rb19 {
- if [ -z "$1" ]; then
- rvm use "$ruby19"
- else
- rvm use "$ruby19@$1"
- fi
-}
-
-_rb19() {compadd `ls -1 $rvm_path/gems | grep "^$ruby19@" | sed -e "s/^$ruby19@//" | awk '{print $1}'`}
-compdef _rb19 rb19
-
-function rb20 {
- if [ -z "$1" ]; then
- rvm use "$ruby20"
- else
- rvm use "$ruby20@$1"
- fi
-}
-
-_rb20() {compadd `ls -1 $rvm_path/gems | grep "^$ruby20@" | sed -e "s/^$ruby20@//" | awk '{print $1}'`}
-compdef _rb20 rb20
-
-function rb21 {
- if [ -z "$1" ]; then
- rvm use "$ruby21"
- else
- rvm use "$ruby21@$1"
- fi
-}
-
-_rb21() {compadd `ls -1 $rvm_path/gems | grep "^$ruby21@" | sed -e "s/^$ruby21@//" | awk '{print $1}'`}
-compdef _rb21 rb21
function rvm-update {
- rvm get head
+ rvm get head
}
# TODO: Make this usable w/o rvm.
function gems {
- local current_ruby=`rvm-prompt i v p`
- local current_gemset=`rvm-prompt g`
+ local current_ruby=`rvm-prompt i v p`
+ local current_gemset=`rvm-prompt g`
- gem list $@ | sed -E \
- -e "s/\([0-9, \.]+( .+)?\)/$fg[blue]&$reset_color/g" \
- -e "s|$(echo $rvm_path)|$fg[magenta]\$rvm_path$reset_color|g" \
- -e "s/$current_ruby@global/$fg[yellow]&$reset_color/g" \
- -e "s/$current_ruby$current_gemset$/$fg[green]&$reset_color/g"
+ gem list $@ | sed -E \
+ -e "s/\([0-9, \.]+( .+)?\)/$fg[blue]&$reset_color/g" \
+ -e "s|$(echo $rvm_path)|$fg[magenta]\$rvm_path$reset_color|g" \
+ -e "s/$current_ruby@global/$fg[yellow]&$reset_color/g" \
+ -e "s/$current_ruby$current_gemset$/$fg[green]&$reset_color/g"
}
-
-function _rvm_completion {
- source $rvm_path"/scripts/zsh/Completion/_rvm"
-}
-compdef _rvm_completion rvm
diff --git a/plugins/salt/_salt b/plugins/salt/_salt
index 78d8611d2..a1c55f350 100644
--- a/plugins/salt/_salt
+++ b/plugins/salt/_salt
@@ -145,7 +145,7 @@ _master_options=(
'(-v --verbose)'{-v,--verbose}'[Turn on command verbosity, display jid and active job queries]'
'--hide-timeout[Hide minions that timeout]'
'(-b --batch --batch-size)'{-b,--batch,--batch-size}'[Execute the salt job in batch mode, pass number or percentage to batch.]:Batch Size:'
- '(-a --auth --eauth --extrenal-auth)'{-a,--auth,--eauth,--external-auth}'[Specify an external authentication system to use.]:eauth:'
+ '(-a --auth --eauth --external-auth)'{-a,--auth,--eauth,--external-auth}'[Specify an external authentication system to use.]:eauth:'
'(-T --make-token)'{-T,--make-token}'[Generate and save an authentication token for re-use.]'
'--return[Set an alternative return method.]:Returners:_path_files -W "$salt_dir/returners" -g "[^_]*.py(\:r)"'
'(-d --doc --documentation)'{-d,--doc,--documentation}'[Return the documentation for the specified module]'
diff --git a/plugins/scala/_scala b/plugins/scala/_scala
index f7511a647..ba7ac3874 100644
--- a/plugins/scala/_scala
+++ b/plugins/scala/_scala
@@ -190,7 +190,7 @@ Y_opts=(
"-Yshow-symkinds[Print abbreviated symbol kinds next to symbol names]"
"-Yshow-trees[Print detailed ASTs (requires -Xprint\:phase)]"
"-Yshow-trees-compact[Print detailed ASTs in compact form (requires -Xprint\:)]"
- "-Yshow-trees-stringified[Print stringifications along with detailed ASTs (requires -Xprint\:)]"
+ "-Yshow-trees-stringified[Print stringification along with detailed ASTs (requires -Xprint\:)]"
"-Ystatistics[Print compiler statistics]"
"-Ystruct-dispatch\:-[Structural method dispatch policy (default\: poly-cache)]:policy name:(no-cache mono-cache poly-cache invoke-dynamic)"
diff --git a/plugins/sfdx/_sfdx b/plugins/sfdx/_sfdx
index 42ee55970..3a441f257 100644
--- a/plugins/sfdx/_sfdx
+++ b/plugins/sfdx/_sfdx
@@ -900,7 +900,7 @@ case "$words[1]" in
force:data:tree:export)
_command_args=(
'(-q|--query)'{-q,--query}'[soql query, or filepath of file containing a soql query, to retrieve records]' \
- '(-p|--plan)'{-p,--plan}'[generate mulitple sobject tree files and a plan definition file for aggregated import]' \
+ '(-p|--plan)'{-p,--plan}'[generate multiple sobject tree files and a plan definition file for aggregated import]' \
'(-x|--prefix)'{-x,--prefix}'[prefix of generated files]' \
'(-d|--outputdir)'{-d,--outputdir}'[directory to store files]:file:_files' \
'(-u|--targetusername)'{-u,--targetusername}'[username or alias for the target org; overrides default target org]' \
diff --git a/plugins/shell-proxy/README.md b/plugins/shell-proxy/README.md
index 6f2cd13e0..b19888c56 100644
--- a/plugins/shell-proxy/README.md
+++ b/plugins/shell-proxy/README.md
@@ -1,42 +1,56 @@
-# Shell Proxy oh-my-zsh plugin
+# shell-proxy plugin
-This a pure user-space program, shell-proxy setter, written Python3 and Bash.
+This a pure user-space program, shell-proxy setter, written in Python3 and Zsh.
-100% only no side-effects, only effect **environment variables** and **aliases**
+To use it, add `shell-proxy` to the plugins array in your zshrc file:
-## Key feature
+```zsh
+plugins=(... shell-proxy)
+```
-- Support Ubuntu, Archlinux, etc (Linux)
-- Support macOS
-- Support git via based-`$GIT_SSH`
-- Support ssh, sftp, scp, slogin and ssh-copy-id via based-`alias`
-- Built-in Auto-complete
+## Key features
+
+- Supports macOS and Linux (Ubuntu, Archlinux, etc.)
+- Supports git via setting `$GIT_SSH`
+- Supports ssh, sftp, scp, slogin and ssh-copy-id via setting aliases
+- Built-in autocomplete
## Usage
-Method 1:
+### Method 1
-`$DEFAULT_PROXY` is the proxy URL you will set
+Set `SHELLPROXY_URL` environment variable to the URL of the proxy server:
-Method 2:
+```sh
+SHELLPROXY_URL="http://127.0.0.1:8123"
+proxy enable
+```
-Write a program to `$HOME/.config/proxy` in the file.
+### Method 2
-Example program:
+Write a program file in `$HOME/.config/proxy` so that the proxy URL is defined dynamically.
+Note that the program file must be executable.
-```bash
+Example:
+
+```sh
#!/bin/bash
-# The file path: $HOME/.config/proxy
-if [[ "$OSTYPE" == "darwin"* ]]; then
+
+if [[ "$(uname)" = Darwin ]]; then
echo "http://127.0.0.1:6152" # Surge Mac
else
echo "http://127.0.0.1:8123" # polipo
fi
```
-Method 3:
+### Method 3
-The working path of **Method 2** can be changed via `$CONFIG_PROXY`
+Use [method 2](#method-2) but define the location of the program file by setting the
+`SHELLPROXY_CONFIG` environment variable:
+
+```sh
+SHELLPROXY_CONFIG="$HOME/.dotfiles/proxy-config"
+```
## Reference
@@ -45,8 +59,4 @@ The working path of **Method 2** can be changed via `$CONFIG_PROXY`
## Maintainer
--
-
-## The oh-my-zsh plugin (shell-proxy)
-
-Public Domain
+- [@septs](https://github.com/septs)
diff --git a/plugins/shell-proxy/proxy.py b/plugins/shell-proxy/proxy.py
index 97f4cf873..14f2944cc 100755
--- a/plugins/shell-proxy/proxy.py
+++ b/plugins/shell-proxy/proxy.py
@@ -5,16 +5,22 @@ from subprocess import check_output, list2cmdline
cwd = os.path.dirname(__file__)
ssh_agent = os.path.join(cwd, "ssh-agent.py")
-user_proxy = os.environ.get("CONFIG_PROXY", os.path.expandvars("$HOME/.config/proxy"))
+proxy_env = "SHELLPROXY_URL"
+proxy_config = os.environ.get("SHELLPROXY_CONFIG") or os.path.expandvars("$HOME/.config/proxy")
+usage="""shell-proxy: no proxy configuration found.
+
+Set `{env}` or create a config file at `{config}`
+See the plugin README for more information.""".format(env=proxy_env, config=proxy_config)
def get_http_proxy():
- default_proxy = os.environ.get("DEFAULT_PROXY")
+ default_proxy = os.environ.get(proxy_env)
if default_proxy:
return default_proxy
- if os.path.isfile(user_proxy):
- return check_output(user_proxy).decode("utf-8").strip()
- raise Exception("Not found, Proxy configuration")
+ if os.path.isfile(proxy_config):
+ return check_output(proxy_config).decode("utf-8").strip()
+ print(usage, file=sys.stderr)
+ sys.exit(1)
def make_proxies(url: str):
@@ -53,8 +59,7 @@ class CommandSet:
cmdline("echo", _)
def usage(self):
- cmdline("echo", "usage: proxy {enable,disable,status}")
- self.status()
+ print("usage: proxy {enable,disable,status}", file=sys.stderr)
def cmdline(*items):
@@ -65,7 +70,7 @@ def main():
command = CommandSet()
if len(sys.argv) == 1:
command.usage()
- sys.exit(-1)
+ sys.exit(1)
getattr(command, sys.argv[1], command.usage)()
diff --git a/plugins/shell-proxy/shell-proxy.plugin.zsh b/plugins/shell-proxy/shell-proxy.plugin.zsh
index 315ade665..9d45b5269 100644
--- a/plugins/shell-proxy/shell-proxy.plugin.zsh
+++ b/plugins/shell-proxy/shell-proxy.plugin.zsh
@@ -1,16 +1,37 @@
#!/usr/bin/bash
-# shellcheck disable=SC1090
-
-__PROXY__="${0:A:h}/proxy.py"
+# shellcheck disable=SC1090,SC2154
proxy() {
- source <(env "DEFAULT_PROXY=$DEFAULT_PROXY" "$__PROXY__" "$1")
+ # deprecate $DEFAULT_PROXY, use SHELLPROXY_URL instead
+ if [[ -n "$DEFAULT_PROXY" && -z "$SHELLPROXY_URL" ]]; then
+ echo >&2 "proxy: DEFAULT_PROXY is deprecated, use SHELLPROXY_URL instead"
+ SHELLPROXY_URL="$DEFAULT_PROXY"
+ unset DEFAULT_PROXY
+ fi
+
+ # deprecate CONFIG_PROXY, use SHELLPROXY_CONFIG instead
+ if [[ -n "$CONFIG_PROXY" && -z "$SHELLPROXY_CONFIG" ]]; then
+ echo >&2 "proxy: CONFIG_PROXY is deprecated, use SHELLPROXY_CONFIG instead"
+ SHELLPROXY_CONFIG="$CONFIG_PROXY"
+ unset CONFIG_PROXY
+ fi
+
+ # the proxy.py script is in the same directory as this function
+ local proxy="${functions_source[$0]:A:h}/proxy.py"
+
+ # capture the output of the proxy script and bail out if it fails
+ local output
+ output="$(SHELLPROXY_URL="$SHELLPROXY_URL" SHELLPROXY_CONFIG="$SHELLPROXY_CONFIG" "$proxy" "$1")" ||
+ return $?
+
+ # evaluate the output generated by the proxy script
+ source <(echo "$output")
}
_proxy() {
- local -r commands=('enable' 'disable' 'status')
- compset -P '*,'
- compadd -S '' "${commands[@]}"
+ local -r commands=('enable' 'disable' 'status')
+ compset -P '*,'
+ compadd -S '' "${commands[@]}"
}
-compdef '_proxy' 'proxy'
+compdef _proxy proxy
diff --git a/plugins/shell-proxy/ssh-proxy.py b/plugins/shell-proxy/ssh-proxy.py
index 5efd5fd21..6773a77bc 100755
--- a/plugins/shell-proxy/ssh-proxy.py
+++ b/plugins/shell-proxy/ssh-proxy.py
@@ -2,15 +2,30 @@
import os
import subprocess
import sys
-import urllib.parse
+from urllib.parse import urlparse
proxy = next(os.environ[_] for _ in ("HTTP_PROXY", "HTTPS_PROXY") if _ in os.environ)
+
+parsed = urlparse(proxy)
+
+proxy_protocols = {
+ "http": "connect",
+ "https": "connect",
+ "socks": "5",
+ "socks5": "5",
+ "socks4": "4",
+ "socks4a": "4",
+}
+
+if parsed.scheme not in proxy_protocols:
+ raise TypeError('unsupported proxy protocol: "{}"'.format(parsed.scheme))
+
argv = [
"nc",
"-X",
- "connect",
+ proxy_protocols[parsed.scheme], # Supported protocols are 4 (SOCKS v4), 5 (SOCKS v5) and connect (HTTP proxy). Default SOCKS v5 is used.
"-x",
- urllib.parse.urlparse(proxy).netloc, # proxy-host:proxy-port
+ parsed.netloc, # proxy-host:proxy-port
sys.argv[1], # host
sys.argv[2], # port
]
diff --git a/plugins/sprunge/README.md b/plugins/sprunge/README.md
index 28ed1834a..fb70d42eb 100644
--- a/plugins/sprunge/README.md
+++ b/plugins/sprunge/README.md
@@ -28,5 +28,5 @@ http://sprunge.us/XxjnKz
- Sprunge accepts piped data, stdin redirection, text strings as input or filenames.
Only one of these can be used at a time.
- Argument precedence goes as follows: stdin > piped input > text strings.
-- If a filename is mispelled or doesn't have the necessary path description, it will NOT
+- If a filename is misspelled or doesn't have the necessary path description, it will NOT
generate an error, but instead treat it as a text string.
diff --git a/plugins/sudo/README.md b/plugins/sudo/README.md
index 4f3973ef8..27cd20c18 100644
--- a/plugins/sudo/README.md
+++ b/plugins/sudo/README.md
@@ -1,6 +1,6 @@
# sudo
-Easily prefix your current or previous commands with `sudo` by pressing esc twice
+Easily prefix your current or previous commands with `sudo` by pressing esc twice.
To use it, add `sudo` to the plugins array in your zshrc file:
@@ -24,6 +24,20 @@ By pressing the esc key twice, you will have the same command with `s
$ sudo apt-get install build-essential
```
+The same happens for editing files with your default editor (defined in `$SUDO_EDITOR`, `$VISUAL` or `$EDITOR`, in that order):
+
+If the editor defined were `vim`:
+
+```console
+$ vim /etc/hosts
+```
+
+By pressing the esc key twice, you will have the same command with `sudo -e` instead of the editor, that would open that editor with root privileges:
+
+```console
+$ sudo -e /etc/hosts
+```
+
### Previous executed commands
Say you want to delete a system file and denied:
@@ -43,3 +57,19 @@ $ sudo rm some-system-file.txt
Password:
$
```
+
+The same happens for file editing, as told before.
+
+## Key binding
+
+By default, the `sudo` plugin uses EscEsc as the trigger.
+If you want to change it, you can use the `bindkey` command to bind it to a different key:
+
+```sh
+bindkey -M emacs '' sudo-command-line
+bindkey -M vicmd '' sudo-command-line
+bindkey -M viins '' sudo-command-line
+```
+
+where `` is the sequence you want to use. You can find the keyboard sequence
+by running `cat` and pressing the keyboard combination you want to use.
diff --git a/plugins/sudo/sudo.plugin.zsh b/plugins/sudo/sudo.plugin.zsh
index e02f88a87..2a0b3bfc4 100644
--- a/plugins/sudo/sudo.plugin.zsh
+++ b/plugins/sudo/sudo.plugin.zsh
@@ -2,7 +2,7 @@
# Description
# -----------
#
-# sudo or sudoedit will be inserted before the command
+# sudo or sudo -e (replacement for sudoedit) will be inserted before the command
#
# ------------------------------------------------------------------------------
# Authors
@@ -11,14 +11,19 @@
# * Dongweiming
# * Subhaditya Nath
# * Marc Cornellà
+# * Carlo Sala
#
# ------------------------------------------------------------------------------
__sudo-replace-buffer() {
local old=$1 new=$2 space=${2:+ }
- if [[ ${#LBUFFER} -le ${#old} ]]; then
- RBUFFER="${space}${BUFFER#$old }"
- LBUFFER="${new}"
+
+ # if the cursor is positioned in the $old part of the text, make
+ # the substitution and leave the cursor after the $new text
+ if [[ $CURSOR -le ${#old} ]]; then
+ BUFFER="${new}${space}${BUFFER#$old }"
+ CURSOR=${#new}
+ # otherwise just replace $old with $new in the text before the cursor
else
LBUFFER="${new}${space}${LBUFFER#$old }"
fi
@@ -35,14 +40,21 @@ sudo-command-line() {
LBUFFER="${LBUFFER:1}"
fi
- # If $EDITOR is not set, just toggle the sudo prefix on and off
- if [[ -z "$EDITOR" ]]; then
- case "$BUFFER" in
- sudoedit\ *) __sudo-replace-buffer "sudoedit" "" ;;
- sudo\ *) __sudo-replace-buffer "sudo" "" ;;
- *) LBUFFER="sudo $LBUFFER" ;;
- esac
- else
+ {
+ # If $SUDO_EDITOR or $VISUAL are defined, then use that as $EDITOR
+ # Else use the default $EDITOR
+ local EDITOR=${SUDO_EDITOR:-${VISUAL:-$EDITOR}}
+
+ # If $EDITOR is not set, just toggle the sudo prefix on and off
+ if [[ -z "$EDITOR" ]]; then
+ case "$BUFFER" in
+ sudo\ -e\ *) __sudo-replace-buffer "sudo -e" "" ;;
+ sudo\ *) __sudo-replace-buffer "sudo" "" ;;
+ *) LBUFFER="sudo $LBUFFER" ;;
+ esac
+ return
+ fi
+
# Check if the typed command is really an alias to $EDITOR
# Get the first part of the typed command
@@ -67,24 +79,25 @@ sudo-command-line() {
if [[ "$realcmd" = (\$EDITOR|$editorcmd|${editorcmd:c}) \
|| "${realcmd:c}" = ($editorcmd|${editorcmd:c}) ]] \
|| builtin which -a "$realcmd" | command grep -Fx -q "$editorcmd"; then
- editorcmd="$cmd" # replace $editorcmd with the typed command so it matches below
+ __sudo-replace-buffer "$cmd" "sudo -e"
+ return
fi
# Check for editor commands in the typed command and replace accordingly
case "$BUFFER" in
- $editorcmd\ *) __sudo-replace-buffer "$editorcmd" "sudoedit" ;;
- \$EDITOR\ *) __sudo-replace-buffer '$EDITOR' "sudoedit" ;;
- sudoedit\ *) __sudo-replace-buffer "sudoedit" "$EDITOR" ;;
+ $editorcmd\ *) __sudo-replace-buffer "$editorcmd" "sudo -e" ;;
+ \$EDITOR\ *) __sudo-replace-buffer '$EDITOR' "sudo -e" ;;
+ sudo\ -e\ *) __sudo-replace-buffer "sudo -e" "$EDITOR" ;;
sudo\ *) __sudo-replace-buffer "sudo" "" ;;
*) LBUFFER="sudo $LBUFFER" ;;
esac
- fi
+ } always {
+ # Preserve beginning space
+ LBUFFER="${WHITESPACE}${LBUFFER}"
- # Preserve beginning space
- LBUFFER="${WHITESPACE}${LBUFFER}"
-
- # Redisplay edit buffer (compatibility with zsh-syntax-highlighting)
- zle redisplay
+ # Redisplay edit buffer (compatibility with zsh-syntax-highlighting)
+ zle redisplay
+ }
}
zle -N sudo-command-line
diff --git a/plugins/supervisor/_supervisorctl b/plugins/supervisor/_supervisorctl
index 9f576c0c0..87cffab86 100644
--- a/plugins/supervisor/_supervisorctl
+++ b/plugins/supervisor/_supervisorctl
@@ -109,27 +109,27 @@ _supervisorctl_maintail() {
_supervisorctl_start() {
# TODO: add 'all'
_arguments -s \
- '*::supvervisor process:_get_supervisor_procs'
+ '*::supervisor process:_get_supervisor_procs'
}
(( $+functions[_supervisorctl_restart] )) ||
_supervisorctl_restart() {
# TODO: add 'all'
_arguments -s \
- '*::supvervisor process:_get_supervisor_procs'
+ '*::supervisor process:_get_supervisor_procs'
}
(( $+functions[_supervisorctl_status] )) ||
_supervisorctl_status() {
_arguments \
- '*::supvervisor process:_get_supervisor_procs'
+ '*::supervisor process:_get_supervisor_procs'
}
(( $+functions[_supervisorctl_stop] )) ||
_supervisorctl_stop() {
# TODO: add 'all'
_arguments -s \
- '*::supvervisor process:_get_supervisor_procs'
+ '*::supervisor process:_get_supervisor_procs'
}
(( $+functions[_supervisorctl_tail] )) ||
@@ -137,7 +137,7 @@ _supervisorctl_tail() {
# TODO: add 'stderr'
_arguments -s \
'-f[Continuous tail of named process stdout Ctrl-C to exit.]' \
- '*::supvervisor process:_get_supervisor_procs'
+ '*::supervisor process:_get_supervisor_procs'
}
_supervisorctl "$@"
diff --git a/plugins/supervisor/supervisor.plugin.zsh b/plugins/supervisor/supervisor.plugin.zsh
index f11f0ed3f..ad5430275 100644
--- a/plugins/supervisor/supervisor.plugin.zsh
+++ b/plugins/supervisor/supervisor.plugin.zsh
@@ -1,4 +1,4 @@
-# DECLARION: This plugin was created by hhatto. What I did is just making a portal from https://bitbucket.org/hhatto/zshcompfunc4supervisor.
+# DECLARATION: This plugin was created by hhatto. What I did is just making a portal from https://bitbucket.org/hhatto/zshcompfunc4supervisor.
alias sup='sudo supervisorctl'
alias supad='sudo supervisorctl add'
diff --git a/plugins/suse/README.md b/plugins/suse/README.md
index 06c6d9ef5..f37ec1695 100644
--- a/plugins/suse/README.md
+++ b/plugins/suse/README.md
@@ -62,7 +62,7 @@ plugins=(... suse)
NOTE: `--no-refresh` is passed to zypper for speeding up the calls and avoid errors due to lack
of root privileges. If you need to refresh the repositories, call `sudo zypper ref` (`zref` alias)
-before runing these aliases.
+before running these aliases.
Related: [#9798](https://github.com/ohmyzsh/ohmyzsh/pull/9798).
diff --git a/plugins/svn-fast-info/svn-fast-info.plugin.zsh b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
index f40a59685..46dd5cb0c 100644
--- a/plugins/svn-fast-info/svn-fast-info.plugin.zsh
+++ b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
@@ -1,6 +1,6 @@
function svn_prompt_info() {
local info
- info=$(svn info 2>&1) || return 1 # capture stdout and stderr
+ info=$(LANG= svn info 2>&1) || return 1 # capture stdout and stderr
local repo_need_upgrade=$(svn_repo_need_upgrade $info)
if [[ -n $repo_need_upgrade ]]; then
@@ -20,7 +20,7 @@ function svn_prompt_info() {
"$ZSH_PROMPT_BASE_COLOR" \
\
"$ZSH_THEME_BRANCH_NAME_COLOR" \
- "$(svn_current_branch_name $info)" \
+ "${$(svn_current_branch_name $info):gs/%/%%}" \
"$ZSH_PROMPT_BASE_COLOR" \
\
"$(svn_current_revision $info)" \
@@ -31,42 +31,44 @@ function svn_prompt_info() {
}
function svn_repo_need_upgrade() {
- grep -q "E155036" <<< "${1:-$(svn info 2> /dev/null)}" && \
+ command grep -q "E155036" <<< "${1:-$(LANG= svn info 2>/dev/null)}" && \
echo "E155036: upgrade repo with svn upgrade"
}
function svn_current_branch_name() {
- grep '^URL:' <<< "${1:-$(svn info 2> /dev/null)}" | egrep -o '(tags|branches)/[^/]+|trunk'
+ omz_urldecode "$(
+ command grep '^URL:' <<< "${1:-$(svn info 2>/dev/null)}" | command grep -Eo '(tags|branches)/[^/]+|trunk'
+ )"
}
function svn_repo_root_name() {
- grep '^Repository\ Root:' <<< "${1:-$(svn info 2> /dev/null)}" | sed 's#.*/##'
+ command grep '^Repository\ Root:' <<< "${1:-$(LANG= svn info 2>/dev/null)}" | sed 's#.*/##'
}
function svn_current_revision() {
- echo "${1:-$(svn info 2> /dev/null)}" | sed -n 's/Revision: //p'
+ echo "${1:-$(LANG= svn info 2>/dev/null)}" | sed -n 's/Revision: //p'
}
function svn_status_info() {
local svn_status_string="$ZSH_THEME_SVN_PROMPT_CLEAN"
- local svn_status="$(svn status 2> /dev/null)";
- if command grep -E '^\s*A' &> /dev/null <<< $svn_status; then
- svn_status_string="$svn_status_string${ZSH_THEME_SVN_PROMPT_ADDITIONS:-+}"
+ local svn_status="$(svn status 2>/dev/null)";
+ if command grep -E '^\s*A' &>/dev/null <<< "$svn_status"; then
+ svn_status_string+="${ZSH_THEME_SVN_PROMPT_ADDITIONS:-+}"
fi
- if command grep -E '^\s*D' &> /dev/null <<< $svn_status; then
- svn_status_string="$svn_status_string${ZSH_THEME_SVN_PROMPT_DELETIONS:-✖}"
+ if command grep -E '^\s*D' &>/dev/null <<< "$svn_status"; then
+ svn_status_string+="${ZSH_THEME_SVN_PROMPT_DELETIONS:-✖}"
fi
- if command grep -E '^\s*M' &> /dev/null <<< $svn_status; then
- svn_status_string="$svn_status_string${ZSH_THEME_SVN_PROMPT_MODIFICATIONS:-✎}"
+ if command grep -E '^\s*M' &>/dev/null <<< "$svn_status"; then
+ svn_status_string+="${ZSH_THEME_SVN_PROMPT_MODIFICATIONS:-✎}"
fi
- if command grep -E '^\s*[R~]' &> /dev/null <<< $svn_status; then
- svn_status_string="$svn_status_string${ZSH_THEME_SVN_PROMPT_REPLACEMENTS:-∿}"
+ if command grep -E '^\s*[R~]' &>/dev/null <<< "$svn_status"; then
+ svn_status_string+="${ZSH_THEME_SVN_PROMPT_REPLACEMENTS:-∿}"
fi
- if command grep -E '^\s*\?' &> /dev/null <<< $svn_status; then
- svn_status_string="$svn_status_string${ZSH_THEME_SVN_PROMPT_UNTRACKED:-?}"
+ if command grep -E '^\s*\?' &>/dev/null <<< "$svn_status"; then
+ svn_status_string+="${ZSH_THEME_SVN_PROMPT_UNTRACKED:-?}"
fi
- if command grep -E '^\s*[CI!L]' &> /dev/null <<< $svn_status; then
- svn_status_string="$svn_status_string${ZSH_THEME_SVN_PROMPT_DIRTY:-!}"
+ if command grep -E '^\s*[CI!L]' &>/dev/null <<< "$svn_status"; then
+ svn_status_string+="${ZSH_THEME_SVN_PROMPT_DIRTY:-!}"
fi
echo $svn_status_string
}
diff --git a/plugins/svn/svn.plugin.zsh b/plugins/svn/svn.plugin.zsh
index fbc9ee538..22b07b4ec 100644
--- a/plugins/svn/svn.plugin.zsh
+++ b/plugins/svn/svn.plugin.zsh
@@ -1,72 +1,76 @@
svn_prompt_info() {
- local _DISPLAY
- if in_svn; then
- if [[ "$SVN_SHOW_BRANCH" = true ]]; then
- unset SVN_SHOW_BRANCH
- _DISPLAY=$(svn_get_branch_name)
- else
- _DISPLAY=$(svn_get_repo_name)
- _DISPLAY=$(omz_urldecode "${_DISPLAY}")
- fi
- echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX\
-$ZSH_THEME_REPO_NAME_COLOR$_DISPLAY$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX$ZSH_PROMPT_BASE_COLOR$(svn_dirty)$(svn_dirty_pwd)$ZSH_PROMPT_BASE_COLOR"
+ local info display
+ info="$(LANG= svn info 2>/dev/null)" || return 1
+
+ if [[ "$SVN_SHOW_BRANCH" = true ]]; then
+ display="$(svn_get_branch_name "$info")"
+ else
+ display="$(svn_get_repo_name "$info")"
fi
+
+ printf '%s%s%s%s%s%s%s%s%s%s' \
+ "$ZSH_PROMPT_BASE_COLOR" \
+ "$ZSH_THEME_SVN_PROMPT_PREFIX" \
+ "$ZSH_THEME_REPO_NAME_COLOR" \
+ "${display:gs/%/%%}" \
+ "$ZSH_PROMPT_BASE_COLOR" \
+ "$ZSH_THEME_SVN_PROMPT_SUFFIX" \
+ "$ZSH_PROMPT_BASE_COLOR" \
+ "$(svn_dirty $info)" \
+ "$(svn_dirty_pwd)" \
+ "$ZSH_PROMPT_BASE_COLOR"
}
-
in_svn() {
- svn info >/dev/null 2>&1
+ svn info &>/dev/null
}
svn_get_repo_name() {
- if in_svn; then
- LANG=C svn info | sed -n 's/^Repository\ Root:\ .*\///p' | read SVN_ROOT
- LANG=C svn info | sed -n "s/^URL:\ .*$SVN_ROOT\///p"
- fi
+ local info name
+ info="${1:-$(LANG= svn info 2>/dev/null)}"
+ name="$(sed -n 's/^Repository\ Root:\ .*\///p' <<< "$info")"
+ omz_urldecode "$name"
}
svn_get_branch_name() {
- local _DISPLAY=$(
- LANG=C svn info 2> /dev/null | \
- awk -F/ \
- '/^URL:/ { \
- for (i=0; i<=NF; i++) { \
- if ($i == "branches" || $i == "tags" ) { \
- print $(i+1); \
- break;\
- }; \
- if ($i == "trunk") { print $i; break; } \
- } \
- }'
+ local info branch
+ info="${1:-$(LANG= svn info 2>/dev/null)}"
+ branch=$(
+ awk -F/ '/^URL:/ {
+ for (i=0; i<=NF; i++) {
+ if ($i == "branches" || $i == "tags" ) {
+ print $(i+1)
+ break
+ };
+ if ($i == "trunk") {
+ print $i
+ break
+ }
+ }
+ }' <<< "$info"
)
+ branch="$(omz_urldecode "$branch")"
- if [[ -z "$_DISPLAY" ]]; then
- svn_get_repo_name
- else
- echo $_DISPLAY
- fi
+ echo "${branch:-$(svn_get_repo_name "$info")}"
}
svn_get_rev_nr() {
- if in_svn; then
- LANG=C svn info 2> /dev/null | sed -n 's/Revision:\ //p'
- fi
+ sed -n 's/Revision:\ //p' <<<"${1:-$(LANG= svn info 2>/dev/null)}"
}
svn_dirty() {
- svn_dirty_choose $ZSH_THEME_SVN_PROMPT_DIRTY $ZSH_THEME_SVN_PROMPT_CLEAN
+ svn_dirty_choose "${1:-$(LANG= svn info 2>/dev/null)}" $ZSH_THEME_SVN_PROMPT_DIRTY $ZSH_THEME_SVN_PROMPT_CLEAN
}
svn_dirty_choose() {
- if in_svn; then
- local root=$(LANG=C svn info 2> /dev/null | sed -n 's/^Working Copy Root Path: //p')
- if svn status $root 2> /dev/null | command grep -Eq '^\s*[ACDIM!?L]'; then
- # Grep exits with 0 when "One or more lines were selected", return "dirty".
- echo $1
- else
- # Otherwise, no lines were found, or an error occurred. Return clean.
- echo $2
- fi
+ local root
+ root=$(sed -n 's/^Working Copy Root Path: //p' <<< "${1:-$(LANG= svn info 2>/dev/null)}")
+ if LANG= svn status "$root" 2>/dev/null | command grep -Eq '^\s*[ACDIM!?L]'; then
+ # Grep exits with 0 when "One or more lines were selected", return "dirty".
+ echo $2
+ else
+ # Otherwise, no lines were found, or an error occurred. Return clean.
+ echo $3
fi
}
@@ -75,13 +79,11 @@ svn_dirty_pwd () {
}
svn_dirty_choose_pwd () {
- if in_svn; then
- if svn status "$PWD" 2> /dev/null | command grep -Eq '^\s*[ACDIM!?L]'; then
- # Grep exits with 0 when "One or more lines were selected", return "dirty".
- echo $1
- else
- # Otherwise, no lines were found, or an error occurred. Return clean.
- echo $2
- fi
+ if LANG= svn status "$PWD" 2>/dev/null | command grep -Eq '^\s*[ACDIM!?L]'; then
+ # Grep exits with 0 when "One or more lines were selected", return "dirty".
+ echo $1
+ else
+ # Otherwise, no lines were found, or an error occurred. Return clean.
+ echo $2
fi
}
diff --git a/plugins/symfony2/README.md b/plugins/symfony2/README.md
index 2946d0937..76233472f 100644
--- a/plugins/symfony2/README.md
+++ b/plugins/symfony2/README.md
@@ -17,7 +17,7 @@ plugins=(... symfony2)
| `sfsr` | sf server:run | Run the dev server |
| `sfcw` | sf cache:warmup | Use the Bundles warmer |
| `sfroute` | sf debug:router | Show the different routes |
-| `sfcontainer` | sf debug:contaner | List the different services |
+| `sfcontainer` | sf debug:container | List the different services |
| `sfgb` | sf generate:bundle | Generate a bundle |
| `sfgc` | sf generate:controller | Generate a controller |
| `sfgcom` | sf generate:command | Generate a command |
diff --git a/plugins/symfony2/symfony2.plugin.zsh b/plugins/symfony2/symfony2.plugin.zsh
index 1498e8d02..e23809df4 100644
--- a/plugins/symfony2/symfony2.plugin.zsh
+++ b/plugins/symfony2/symfony2.plugin.zsh
@@ -5,7 +5,7 @@ _symfony_console () {
}
_symfony2_get_command_list () {
- `_symfony_console` --no-ansi | sed "1,/Available commands/d" | awk '/^ ?[^ ]+ / { print $1 }'
+ `_symfony_console` --no-ansi --no-debug | sed "1,/Available commands/d" | awk '/^ ?[^ ]+ / { print $1 }'
}
_symfony2 () {
diff --git a/plugins/systemadmin/systemadmin.plugin.zsh b/plugins/systemadmin/systemadmin.plugin.zsh
index 2f9d1ef35..9a2129060 100644
--- a/plugins/systemadmin/systemadmin.plugin.zsh
+++ b/plugins/systemadmin/systemadmin.plugin.zsh
@@ -27,7 +27,7 @@ alias mkdir='mkdir -pv'
# get top process eating memory
alias psmem='ps -e -orss=,args= | sort -b -k1 -nr'
alias psmem10='ps -e -orss=,args= | sort -b -k1 -nr | head -n 10'
-# get top process eating cpu if not work try excute : export LC_ALL='C'
+# get top process eating cpu if not work try execute : export LC_ALL='C'
alias pscpu='ps -e -o pcpu,cpu,nice,state,cputime,args|sort -k1,1n -nr'
alias pscpu10='ps -e -o pcpu,cpu,nice,state,cputime,args|sort -k1,1n -nr | head -n 10'
# top10 of the history
@@ -105,7 +105,7 @@ visitpage20() {
# top100 of Page lists the most time-consuming (more than 60 seconds) as well as the corresponding page number of occurrences
consume100() {
awk '($NF > 60 && $7~/\.php/){print $7}' "$(retlog)" |sort -n|uniq -c|sort -nr|head -n 100
- # if django website or other webiste make by no suffix language
+ # if django website or other website make by no suffix language
# awk '{print $7}' "$(retlog)" |sort -n|uniq -c|sort -nr|head -n 100
}
diff --git a/plugins/systemd/README.md b/plugins/systemd/README.md
index 3fa1d2118..ffa0567a8 100644
--- a/plugins/systemd/README.md
+++ b/plugins/systemd/README.md
@@ -3,7 +3,8 @@
The systemd plugin provides many useful aliases for systemd.
To use it, add systemd to the plugins array of your zshrc file:
-```
+
+```zsh
plugins=(... systemd)
```
@@ -22,7 +23,7 @@ plugins=(... systemd)
| `sc-show-environment` | `systemctl show-environment` | Dump the systemd manager environment block |
| `sc-cat` | `systemctl cat` | Show backing files of one or more units |
| `sc-list-timers` | `systemctl list-timers` | List timer units currently in memory |
-| **Aliases with sudo** |
+| **Aliases with sudo** |||
| `sc-start` | `sudo systemctl start` | Start Unit(s) |
| `sc-stop` | `sudo systemctl stop` | Stop Unit(s) |
| `sc-reload` | `sudo systemctl reload` | Reload Unit(s) |
@@ -59,9 +60,11 @@ to your prompt, drop `$(systemd_prompt_info [unit]...)` into your prompt (more t
may be specified).
The plugin will add the following to your prompt for each `$unit`.
-```
+
+```text
:
```
+
You can control these parts with the following variables:
- ``: Set `$ZSH_THEME_SYSTEMD_PROMPT_PREFIX`.
@@ -79,7 +82,7 @@ You can control these parts with the following variables:
For example, if your prompt contains `PROMPT='$(systemd_prompt_info dhcpd httpd)'` and you set the following variables:
-```
+```sh
ZSH_THEME_SYSTEMD_PROMPT_PREFIX="["
ZSH_THEME_SYSTEMD_PROMPT_SUFFIX="]"
ZSH_THEME_SYSTEMD_PROMPT_ACTIVE="+"
@@ -89,6 +92,6 @@ ZSH_THEME_SYSTEMD_PROMPT_CAPS=1
If `dhcpd` is running, and `httpd` is not, then your prompt will look like this:
-```
+```text
[DHCPD: +][HTTPD: X]
```
diff --git a/plugins/systemd/systemd.plugin.zsh b/plugins/systemd/systemd.plugin.zsh
index c6fd52990..7afd2be58 100644
--- a/plugins/systemd/systemd.plugin.zsh
+++ b/plugins/systemd/systemd.plugin.zsh
@@ -1,3 +1,4 @@
+# systemctl aliases
user_commands=(
cat
get-default
@@ -14,7 +15,8 @@ user_commands=(
list-units
show
show-environment
- status)
+ status
+)
sudo_commands=(
add-requires
@@ -28,8 +30,6 @@ sudo_commands=(
emergency
enable
halt
- hibernate
- hybrid-sleep
import-environment
isolate
kexec
@@ -38,10 +38,8 @@ sudo_commands=(
list-machines
load
mask
- poweroff
preset
preset-all
- reboot
reenable
reload
reload-or-restart
@@ -54,18 +52,39 @@ sudo_commands=(
set-property
start
stop
- suspend
switch-root
try-reload-or-restart
try-restart
unmask
- unset-environment)
+ unset-environment
+)
-for c in $user_commands; do; alias sc-$c="systemctl $c"; done
-for c in $sudo_commands; do; alias sc-$c="sudo systemctl $c"; done
-for c in $user_commands; do; alias scu-$c="systemctl --user $c"; done
-for c in $sudo_commands; do; alias scu-$c="systemctl --user $c"; done
+power_commands=(
+ hibernate
+ hybrid-sleep
+ poweroff
+ reboot
+ suspend
+)
+for c in $user_commands; do
+ alias "sc-$c"="systemctl $c"
+ alias "scu-$c"="systemctl --user $c"
+done
+
+for c in $sudo_commands; do
+ alias "sc-$c"="sudo systemctl $c"
+ alias "scu-$c"="systemctl --user $c"
+done
+
+for c in $power_commands; do
+ alias "sc-$c"="systemctl $c"
+done
+
+unset c user_commands sudo_commands power_commands
+
+
+# --now commands
alias sc-enable-now="sc-enable --now"
alias sc-disable-now="sc-disable --now"
alias sc-mask-now="sc-mask --now"
@@ -74,17 +93,24 @@ alias scu-enable-now="scu-enable --now"
alias scu-disable-now="scu-disable --now"
alias scu-mask-now="scu-mask --now"
+
function systemd_prompt_info {
local unit
- for unit in $@; do
+ for unit in "$@"; do
echo -n "$ZSH_THEME_SYSTEMD_PROMPT_PREFIX"
- [[ -n "$ZSH_THEME_SYSTEMD_PROMPT_CAPS" ]] && echo -n "${(U)unit}:" || echo -n "$unit:"
- if systemctl is-active $unit &>/dev/null; then
- echo -n "$ZSH_THEME_SYSTEMD_PROMPT_ACTIVE"
+
+ if [[ -n "$ZSH_THEME_SYSTEMD_PROMPT_CAPS" ]]; then
+ echo -n "${(U)unit:gs/%/%%}:"
else
- echo -n "$ZSH_THEME_SYSTEMD_PROMPT_NOTACTIVE"
+ echo -n "${unit:gs/%/%%}:"
fi
+
+ if systemctl is-active "$unit" &>/dev/null; then
+ echo -n "$ZSH_THEME_SYSTEMD_PROMPT_ACTIVE"
+ else
+ echo -n "$ZSH_THEME_SYSTEMD_PROMPT_NOTACTIVE"
+ fi
+
echo -n "$ZSH_THEME_SYSTEMD_PROMPT_SUFFIX"
done
}
-
diff --git a/plugins/terminitor/_terminitor b/plugins/terminitor/_terminitor
index 1ce87c3ad..3615350e2 100644
--- a/plugins/terminitor/_terminitor
+++ b/plugins/terminitor/_terminitor
@@ -11,7 +11,7 @@ local -a _1st_arguments
_1st_arguments=(
'create:create a Termfile in directory'
'delete:delete terminitor script'
- 'edit:open termitor script'
+ 'edit:open terminitor script'
'fetch:clone the designated repo and run setup'
'help:Describe available tasks or one specific task'
'init:create initial root terminitor folder'
diff --git a/plugins/terraform/README.md b/plugins/terraform/README.md
index 9e9f0cdfb..474346dc0 100644
--- a/plugins/terraform/README.md
+++ b/plugins/terraform/README.md
@@ -1,14 +1,7 @@
-## Terraform oh-my-zsh plugin
+# Terraform plugin
Plugin for Terraform, a tool from Hashicorp for managing infrastructure safely and efficiently.
-
-Current as of Terraform v0.13
-
-### Requirements
-
- * [Terraform](https://terraform.io/)
-
-### Usage
+It adds completion for `terraform`, as well as aliases and a prompt function.
To use it, add `terraform` to the plugins array of your `~/.zshrc` file:
@@ -16,14 +9,34 @@ To use it, add `terraform` to the plugins array of your `~/.zshrc` file:
plugins=(... terraform)
```
- * Type `terraform` into your prompt and hit `TAB` to see available completion options
- * Type `tf` into your prompt as a short alias to `terraform`
+## Requirements
-### Expanding ZSH prompt with current Terraform workspace name
+* [Terraform](https://terraform.io/)
-If you want to get current Terraform workspace name in your ZSH prompt open
-your .zsh-theme file and in a chosen place insert:
+## Aliases
-```shell
-PROMPT=$'%{$fg[white]%}$(tf_prompt_info)%{$reset_color%} '
+| Alias | Command |
+| ----- | -------------------- |
+| `tf` | `terraform` |
+| `tfa` | `terraform apply` |
+| `tfd` | `terraform destroy` |
+| `tff` | `terraform fmt` |
+| `tfi` | `terraform init` |
+| `tfp` | `terraform plan` |
+| `tfv` | `terraform validate` |
+
+## Prompt function
+
+You can add the current Terraform workspace in your prompt by adding `$(tf_prompt_info)`
+to your `PROMPT` or `RPROMPT` variable.
+
+```sh
+RPROMPT='$(tf_prompt_info)'
+```
+
+You can also specify the PREFIX and SUFFIX for the workspace with the following variables:
+
+```sh
+ZSH_THEME_TF_PROMPT_PREFIX="%{$fg[white]%}"
+ZSH_THEME_TF_PROMPT_SUFFIX="%{$reset_color%}"
```
diff --git a/plugins/terraform/terraform.plugin.zsh b/plugins/terraform/terraform.plugin.zsh
index 997241c9a..f224b79f0 100644
--- a/plugins/terraform/terraform.plugin.zsh
+++ b/plugins/terraform/terraform.plugin.zsh
@@ -1,11 +1,17 @@
function tf_prompt_info() {
- # dont show 'default' workspace in home dir
- [[ "$PWD" == ~ ]] && return
- # check if in terraform dir
- if [[ -d .terraform && -r .terraform/environment ]]; then
- workspace=$(cat .terraform/environment) || return
- echo "[${workspace}]"
- fi
+ # dont show 'default' workspace in home dir
+ [[ "$PWD" != ~ ]] || return
+ # check if in terraform dir and file exists
+ [[ -d .terraform && -r .terraform/environment ]] || return
+
+ local workspace="$(< .terraform/environment)"
+ echo "${ZSH_THEME_TF_PROMPT_PREFIX-[}${workspace:gs/%/%%}${ZSH_THEME_TF_PROMPT_SUFFIX-]}"
}
alias tf='terraform'
+alias tfa='terraform apply'
+alias tfd='terraform destroy'
+alias tff='terraform fmt'
+alias tfi='terraform init'
+alias tfp='terraform plan'
+alias tfv='terraform validate'
diff --git a/plugins/tmux/README.md b/plugins/tmux/README.md
index 551814a39..bc192a40c 100644
--- a/plugins/tmux/README.md
+++ b/plugins/tmux/README.md
@@ -15,20 +15,21 @@ The plugin also supports the following:
## Aliases
-| Alias | Command | Description |
-| ------ | -----------------------|---------------------------------------------------------- |
-| `ta` | tmux attach -t | Attach new tmux session to already running named session |
-| `tad` | tmux attach -d -t | Detach named tmux session |
-| `ts` | tmux new-session -s | Create a new named tmux session |
-| `tl` | tmux list-sessions | Displays a list of running tmux sessions |
-| `tksv` | tmux kill-server | Terminate all running tmux sessions |
-| `tkss` | tmux kill-session -t | Terminate named running tmux session |
-| `tmux` | `_zsh_tmux_plugin_run` | Start a new tmux session |
+| Alias | Command | Description |
+| ---------- | ---------------------- | -------------------------------------------------------- |
+| `ta` | tmux attach -t | Attach new tmux session to already running named session |
+| `tad` | tmux attach -d -t | Detach named tmux session |
+| `ts` | tmux new-session -s | Create a new named tmux session |
+| `tl` | tmux list-sessions | Displays a list of running tmux sessions |
+| `tksv` | tmux kill-server | Terminate all running tmux sessions |
+| `tkss` | tmux kill-session -t | Terminate named running tmux session |
+| `tmux` | `_zsh_tmux_plugin_run` | Start a new tmux session |
+| `tmuxconf` | `$EDITOR ~/.tmux.conf` | Open .tmux.conf file with an editor |
## Configuration Variables
| Variable | Description |
-|-------------------------------------|-------------------------------------------------------------------------------|
+| ----------------------------------- | ----------------------------------------------------------------------------- |
| `ZSH_TMUX_AUTOSTART` | Automatically starts tmux (default: `false`) |
| `ZSH_TMUX_AUTOSTART_ONCE` | Autostart only if tmux hasn't been started previously (default: `true`) |
| `ZSH_TMUX_AUTOCONNECT` | Automatically connect to a previous session if it exits (default: `true`) |
diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh
index 0ea3aa02a..9d333257e 100644
--- a/plugins/tmux/tmux.plugin.zsh
+++ b/plugins/tmux/tmux.plugin.zsh
@@ -11,6 +11,7 @@ alias ts='tmux new-session -s'
alias tl='tmux list-sessions'
alias tksv='tmux kill-server'
alias tkss='tmux kill-session -t'
+alias tmuxconf='$EDITOR ~/.tmux.conf'
# CONFIGURATION VARIABLES
# Automatically start tmux
@@ -46,6 +47,11 @@ else
export ZSH_TMUX_TERM=$ZSH_TMUX_FIXTERM_WITHOUT_256COLOR
fi
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
# Set the correct local config file to use.
if [[ "$ZSH_TMUX_ITERM2" == "false" && -e "$ZSH_TMUX_CONFIG" ]]; then
export ZSH_TMUX_CONFIG
diff --git a/plugins/transfer/README.md b/plugins/transfer/README.md
index 5fa064445..825c9a283 100644
--- a/plugins/transfer/README.md
+++ b/plugins/transfer/README.md
@@ -2,23 +2,40 @@
[`transfer.sh`](https://transfer.sh) is an easy to use file sharing service from the command line
-## Usage
+To use it, add `transfer` to the plugins array in your zshrc file:
-Add `transfer` to your plugins array in your zshrc file:
```zsh
plugins=(... transfer)
```
-Then you can:
+## Usage
-- transfer a file:
+- Transfer a file: `transfer file.txt`.
-```zsh
-transfer file.txt
-```
+- Transfer a whole directory (it will be automatically compressed): `transfer dir`.
-- transfer a whole directory (it will be automatically compressed):
+### Encryption / Decryption
-```zsh
-transfer directory/
-```
+- Encrypt and upload a file with symmetric cipher and create ASCII armored output:
+
+ ```zsh
+ transfer file -ca
+ ```
+
+- Encrypt and upload directory with symmetric cipher and gpg output:
+
+ ```zsh
+ transfer directory -ca
+ ```
+
+- Decrypt file:
+
+ ```zsh
+ gpg -d file -ca
+ ```
+
+- Decrypt directory:
+
+ ```zsh
+ gpg -d your_archive.tgz.gpg | tar xz
+ ```
diff --git a/plugins/transfer/transfer.plugin.zsh b/plugins/transfer/transfer.plugin.zsh
index db744b0cd..b34e115ce 100644
--- a/plugins/transfer/transfer.plugin.zsh
+++ b/plugins/transfer/transfer.plugin.zsh
@@ -1,69 +1,97 @@
-# transfer.sh Easy file sharing from the command line
-# transfer Plugin
-# Usage Example :
-# > transfer file.txt
-# > transfer directory/
-
-
-
# Author:
# Remco Verhoef
# https://gist.github.com/nl5887/a511f172d3fb3cd0e42d
# Modified to use tar command instead of zip
#
-curl --version 2>&1 > /dev/null
-if [ $? -ne 0 ]; then
- echo "Could not find curl."
+transfer() {
+ # check arguments
+ if [[ $# -eq 0 ]]; then
+ cat <> $tmpfile
+ else
+ curl --progress-bar --upload-file - "https://transfer.sh/$item" >> $tmpfile
+ fi
+ else
+ basename=$(basename "$item" | sed -e 's/[^a-zA-Z0-9._-]/-/g')
+
+ if [[ ! -e $item ]]; then
+ echo "File $item doesn't exist."
+ return 1
+ fi
+
+ if [[ -d $item ]]; then
+ # tar directory and transfer
+ tarfile=$(mktemp -t transferXXX.tar.gz)
+ cd $(dirname $item) || {
+ echo "Error: Could not change to directory $(dirname $item)"
return 1
+ }
+
+ tar -czf $tarfile $(basename $item)
+ if (( crypt )); then
+ gpg -cao - "$tarfile" | curl --progress-bar -T "-" "https://transfer.sh/$basename.tar.gz.gpg" >> $tmpfile
+ else
+ curl --progress-bar --upload-file "$tarfile" "https://transfer.sh/$basename.tar.gz" >> $tmpfile
+ fi
+ rm -f $tarfile
+ else
+ # transfer file
+ if (( crypt )); then
+ gpg -cao - "$item" | curl --progress-bar -T "-" "https://transfer.sh/$basename.gpg" >> $tmpfile
+ else
+ curl --progress-bar --upload-file "$item" "https://transfer.sh/$basename" >> $tmpfile
+ fi
fi
+ fi
- # get temporarily filename, output is written to this file show progress can be showed
- tmpfile=$( mktemp -t transferXXX )
-
- # upload stdin or file
- file=$1
+ # cat output link
+ cat $tmpfile
+ # add newline
+ echo
- if tty -s;
- then
- basefile=$(basename "$file" | sed -e 's/[^a-zA-Z0-9._-]/-/g')
-
- if [ ! -e $file ];
- then
- echo "File $file doesn't exists."
- return 1
- fi
-
- if [ -d $file ];
- then
- echo $file
- # tar directory and transfer
- tarfile=$( mktemp -t transferXXX.tar.gz )
- cd $(dirname $file) && tar -czf $tarfile $(basename $file)
- curl --progress-bar --upload-file "$tarfile" "https://transfer.sh/$basefile.tar.gz" >> $tmpfile
- rm -f $tarfile
- else
- # transfer file
- curl --progress-bar --upload-file "$file" "https://transfer.sh/$basefile" >> $tmpfile
- fi
- else
- # transfer pipe
- curl --progress-bar --upload-file "-" "https://transfer.sh/$file" >> $tmpfile
- fi
-
- # cat output link
- cat $tmpfile
- # add newline
- echo
-
- # cleanup
- rm -f $tmpfile
+ # cleanup
+ rm -f $tmpfile
}
diff --git a/plugins/ubuntu/README.md b/plugins/ubuntu/README.md
index f72182f5c..20f5c65ee 100644
--- a/plugins/ubuntu/README.md
+++ b/plugins/ubuntu/README.md
@@ -16,10 +16,11 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other
|---------|--------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
| age | `sudo $APT` | Run apt-get with sudo |
| acs | `apt-cache search` | Search the apt-cache with the specified criteria |
+| acsp | `apt-cache showpkg` | Shows information about the listed packages |
| acp | `apt-cache policy` | Display the package source priorities |
| afs | `apt-file search --regexp` | Perform a regular expression apt-file search |
| afu | `sudo apt-file update` | Generates or updates the apt-file package database |
-| aga | `sudo $APT autoclean` | Clears out the local reposityory of retrieved package files that can no longer be downloaded |
+| aga | `sudo $APT autoclean` | Clears out the local repository of retrieved package files that can no longer be downloaded |
| agb | `sudo $APT build-dep ` | Installs/Removes packages to satisfy the dependencies of a specified build pkg |
| agc | `sudo $APT clean` | Clears out the local repository of retrieved package files leaving everything from the lock files |
| agd | `sudo $APT dselect-upgrade` | Follows dselect choices for package installation |
diff --git a/plugins/ubuntu/ubuntu.plugin.zsh b/plugins/ubuntu/ubuntu.plugin.zsh
index 989ffd1ff..7b765a406 100644
--- a/plugins/ubuntu/ubuntu.plugin.zsh
+++ b/plugins/ubuntu/ubuntu.plugin.zsh
@@ -53,7 +53,7 @@ alias mydeb='time dpkg-buildpackage -rfakeroot -us -uc'
# Usage: aar ppa:xxxxxx/xxxxxx [packagename]
# If packagename is not given as 2nd argument the function will ask for it and guess the default by taking
# the part after the / from the ppa name which is sometimes the right name for the package you want to install
-aar() {
+function aar() {
if [ -n "$2" ]; then
PACKAGE=$2
else
@@ -76,7 +76,7 @@ aar() {
# apt-history rollback
# apt-history list
# Based On: https://linuxcommando.blogspot.com/2008/08/how-to-show-apt-log-history.html
-apt-history () {
+function apt-history() {
case "$1" in
install)
zgrep --no-filename 'install ' $(ls -rt /var/log/dpkg*)
@@ -105,7 +105,7 @@ apt-history () {
}
# Kernel-package building shortcut
-kerndeb () {
+function kerndeb() {
# temporarily unset MAKEFLAGS ( '-j3' will fail )
MAKEFLAGS=$( print - $MAKEFLAGS | perl -pe 's/-j\s*[\d]+//g' )
print '$MAKEFLAGS set to '"'$MAKEFLAGS'"
diff --git a/plugins/vault/_vault b/plugins/vault/_vault
index c5338dffa..f6bd3517e 100644
--- a/plugins/vault/_vault
+++ b/plugins/vault/_vault
@@ -53,7 +53,7 @@ mount_tune_args=(
typeset -a mount_args
mount_args=(
$mount_tune_args
- '(-path)-path=-[Mount point for the logical backend. This defauls to the type of the mount.]:path:'
+ '(-path)-path=-[Mount point for the logical backend. This defaults to the type of the mount.]:path:'
'(-description)-description=-[Human-friendly description of the purpose for the mount. This shows up in the mounts command.]:description:'
)
@@ -189,7 +189,7 @@ _vault_mounts() {
}
_vault_mount() {
- # to find out how many types of backens are there
+ # to find out how many types of backends are there
_arguments : \
${general_args[@]} \
${mount_args[@]} \
diff --git a/plugins/vi-mode/README.md b/plugins/vi-mode/README.md
index 46bb6d070..476666bf6 100644
--- a/plugins/vi-mode/README.md
+++ b/plugins/vi-mode/README.md
@@ -30,18 +30,23 @@ plugins=(... vi-mode)
```
- `MODE_INDICATOR`: controls the string displayed when the shell is in normal mode.
- See [Mode indicator](#mode-indicator) for details.
+ See [Mode indicators](#mode-indicators) for details.
-## Mode indicator
+- `INSERT_MODE_INDICATOR`: controls the string displayed when the shell is in insert mode.
+ See [Mode indicators](#mode-indicators) for details.
+
+## Mode indicators
*Normal mode* is indicated with a red `<<<` mark at the right prompt, when it
-hasn't been defined by theme.
+hasn't been defined by theme, *Insert mode* is not displayed by default.
-You can change this indicator by setting the `MODE_INDICATOR` variable. This setting
-supports Prompt Expansion sequences. For example:
+You can change these indicators by setting the `MODE_INDICATOR` (*Normal mode*) and
+`INSERT_MODE_INDICATORS` (*Insert mode*) variables.
+This settings support Prompt Expansion sequences. For example:
```zsh
-MODE_INDICATOR="%F{yellow}+%f"
+MODE_INDICATOR="%F{white}+%f"
+INSERT_MODE_INDICATOR="%F{yellow}+%f"
```
You can also use the `vi_mode_prompt_info` function in your prompt, which will display
diff --git a/plugins/vi-mode/vi-mode.plugin.zsh b/plugins/vi-mode/vi-mode.plugin.zsh
index dd4afdd8b..b40b29961 100644
--- a/plugins/vi-mode/vi-mode.plugin.zsh
+++ b/plugins/vi-mode/vi-mode.plugin.zsh
@@ -123,7 +123,7 @@ wrap_clipboard_widgets copy vi-yank vi-yank-eol vi-backward-kill-word vi-change-
wrap_clipboard_widgets paste vi-put-{before,after}
unfunction wrap_clipboard_widgets
-# if mode indicator wasn't setup by theme, define default
+# if mode indicator wasn't setup by theme, define default, we'll leave INSERT_MODE_INDICATOR empty by default
if [[ -z "$MODE_INDICATOR" ]]; then
MODE_INDICATOR='%B%F{red}<%b<<%f'
fi
@@ -136,7 +136,7 @@ function vi_mode_prompt_info() {
# set RPS1/RPROMPT to something else in their custom config.
: "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:=true}"
- echo "${${VI_KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/}"
+ echo "${${VI_KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/$INSERT_MODE_INDICATOR}"
}
# define right prompt, if it wasn't defined by a theme
diff --git a/plugins/virtualenv/virtualenv.plugin.zsh b/plugins/virtualenv/virtualenv.plugin.zsh
index 3041475ed..56707bb98 100644
--- a/plugins/virtualenv/virtualenv.plugin.zsh
+++ b/plugins/virtualenv/virtualenv.plugin.zsh
@@ -1,6 +1,6 @@
function virtualenv_prompt_info(){
[[ -n ${VIRTUAL_ENV} ]] || return
- echo "${ZSH_THEME_VIRTUALENV_PREFIX=[}${VIRTUAL_ENV:t}${ZSH_THEME_VIRTUALENV_SUFFIX=]}"
+ echo "${ZSH_THEME_VIRTUALENV_PREFIX=[}${VIRTUAL_ENV:t:gs/%/%%}${ZSH_THEME_VIRTUALENV_SUFFIX=]}"
}
# disables prompt mangling in virtual_env/bin/activate
diff --git a/plugins/volta/README.md b/plugins/volta/README.md
new file mode 100644
index 000000000..d5972d56c
--- /dev/null
+++ b/plugins/volta/README.md
@@ -0,0 +1,11 @@
+# Volta
+
+This plugin provides completion for [Volta](https://volta.sh/).
+
+To use it add volta to the plugins array in your zshrc file.
+
+```bash
+plugins=(... volta)
+```
+
+This plugin installs no aliases.
diff --git a/plugins/volta/volta.plugin.zsh b/plugins/volta/volta.plugin.zsh
new file mode 100644
index 000000000..79319394c
--- /dev/null
+++ b/plugins/volta/volta.plugin.zsh
@@ -0,0 +1,19 @@
+# COMPLETION FUNCTION
+if (( ! $+commands[volta] )); then
+ return
+fi
+
+# TODO: 2021-12-28: remove this bit of code as it exists in oh-my-zsh.sh
+# Add completions folder in $ZSH_CACHE_DIR
+command mkdir -p "$ZSH_CACHE_DIR/completions"
+(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `deno`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_volta" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _volta
+ _comps[volta]=_volta
+fi
+
+volta completions zsh >| "$ZSH_CACHE_DIR/completions/_volta" &|
diff --git a/plugins/wd/wd.plugin.zsh b/plugins/wd/wd.plugin.zsh
index 87d1d0858..ca2ca7c65 100644
--- a/plugins/wd/wd.plugin.zsh
+++ b/plugins/wd/wd.plugin.zsh
@@ -7,4 +7,9 @@
#
# @github.com/mfaerevaag/wd
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
eval "wd() { source '${0:A:h}/wd.sh' }"
diff --git a/plugins/xcode/README.md b/plugins/xcode/README.md
index 664a063a3..27d6a228b 100644
--- a/plugins/xcode/README.md
+++ b/plugins/xcode/README.md
@@ -26,7 +26,7 @@ plugins=(... xcode)
### `xc`
-Opens the current directory in Xcode as an Xcode project or a Swift package. This will open one of the `.xcworkspace`, `.xcodeproj` and `Package.swift` files that it can find in the current working directory. You can also specify a directory to look in for the Xcode files.
+Opens the current directory in Xcode as an Xcode project or a Swift package. This will open one of the `.xcworkspace`, `.xcodeproj`, `.swiftpm` and `Package.swift` files that it can find in the current working directory. You can also specify a directory to look in for the Xcode files.
Returns 1 if it didn't find any relevant files.
### `xx`
diff --git a/plugins/xcode/xcode.plugin.zsh b/plugins/xcode/xcode.plugin.zsh
index 41b9e37e4..3bd12cdec 100644
--- a/plugins/xcode/xcode.plugin.zsh
+++ b/plugins/xcode/xcode.plugin.zsh
@@ -7,7 +7,7 @@ alias xcsel='sudo xcode-select --switch'
# source: https://gist.github.com/subdigital/5420709
function xc {
local xcode_files
- xcode_files=(${1:-.}/{*.{xcworkspace,xcodeproj},Package.swift}(N))
+ xcode_files=(${1:-.}/{*.{xcworkspace,xcodeproj,swiftpm},Package.swift}(N))
if [[ ${#xcode_files} -eq 0 ]]; then
echo "No Xcode files found in ${1:-the current directory}." >&2
diff --git a/plugins/yarn/_yarn b/plugins/yarn/_yarn
index 70ed55929..1237ba672 100644
--- a/plugins/yarn/_yarn
+++ b/plugins/yarn/_yarn
@@ -85,36 +85,67 @@ _global_commands=(
'upgrade-interactive:Interactively upgrade packages'
)
+_yarn_find_package_json() {
+ local dir=$(cd "$1" && pwd)
+
+ while true
+ do
+ if [[ -e "${dir}/package.json" ]]; then
+ echo "${dir}/package.json"
+ return
+ fi
+
+ if [[ $dir == '/' ]]; then
+ break
+ fi
+
+ dir=$(dirname $dir)
+ done
+}
+
_yarn_commands_scripts() {
- local -a scripts
+ local -a scripts binaries
+ local packageJson
+
if [[ -n $opt_args[--cwd] ]]; then
- scripts=($(cd $opt_args[--cwd] && yarn run --json 2>/dev/null | sed -E '/Commands available|possibleCommands/!d;s/.*Commands available from binary scripts: ([^"]+)".*/\1/;s/.*"items":\[([^]]+).*/\1/;s/[" ]//g' | tr , '\n' | sed -e 's/:/\\:/g'))
+ packageJson=$(_yarn_find_package_json $opt_args[--cwd])
+ binaries=($(cd $opt_args[--cwd] && echo node_modules/.bin/*(x:t)))
else
- scripts=($(yarn run --json 2>/dev/null | sed -E '/Commands available|possibleCommands/!d;s/.*Commands available from binary scripts: ([^"]+)".*/\1/;s/.*"items":\[([^]]+).*/\1/;s/[" ]//g' | tr , '\n' | sed -e 's/:/\\:/g'))
+ packageJson=$(_yarn_find_package_json $pwd)
+ binaries=($(echo node_modules/.bin/*(x:t)))
fi
- _describe 'command or script' _commands -- _global_commands -- scripts
+ if [[ -n $packageJson ]]; then
+ scripts=($(cat "$packageJson" | perl -0777 -MJSON::PP -n -E '$r=decode_json($_); do{($k=$_)=~s/:/\\:/g;say $k}for sort keys %{$r->{scripts}}'))
+ fi
+
+ _describe 'command or script' _commands -- _global_commands -- scripts -- binaries
}
_yarn_scripts() {
- local -a commands binaries scripts
- local -a scriptNames scriptCommands
- local i runJSON
+ local -a binaries scripts
+ local -a commands
+ local packageJson
if [[ -n $_yarn_run_cwd ]]; then
- runJSON=$(cd $_yarn_run_cwd && yarn run --json 2>/dev/null)
+ packageJson=$(_yarn_find_package_json $_yarn_run_cwd)
+ if [[ -d "${_yarn_run_cwd}/node_modules" ]]; then
+ binaries=($(cd $_yarn_run_cwd && echo node_modules/.bin/*(x:t)))
+ else
+ binaries=($(cd $_yarn_run_cwd && yarn bin | perl -wln -e 'm{^[^:]+: (\S+)$} and print $1'))
+ fi
else
- runJSON=$(yarn run --json 2>/dev/null)
+ packageJson=$(_yarn_find_package_json $pwd)
+ if [[ -d node_modules ]]; then
+ binaries=($(echo node_modules/.bin/*(x:t)))
+ else
+ binaries=($(yarn bin | perl -wln -e 'm{^[^:]+: (\S+)$} and print $1'))
+ fi
fi
- # Some sed utilities (e.g. Mac OS / BSD) don't interpret `\n` in a replacement
- # pattern as a newline. See https://superuser.com/q/307165
- binaries=($(sed -E '/Commands available/!d;s/.*Commands available from binary scripts: ([^"]+)".*/\1/;s/.*"items":\[([^]]+).*/\1/;s/[" ]//g;s/:/\\:/g;s/,/\'$'\n/g' <<< "$runJSON"))
- scriptNames=($(sed -E '/possibleCommands/!d;s/.*"items":\[([^]]+).*/\1/;s/[" ]//g;s/:/\\:/g;s/,/\'$'\n/g' <<< "$runJSON"))
- scriptCommands=("${(@f)$(sed -E '/possibleCommands/!d;s/.*"hints":\{(.+")\}.*/\1/;s/"[^"]+"://g;s/:/\\:/g;s/","/\'$'\n/g;s/(^"|"$)//g' <<< "$runJSON")}")
- for (( i=1; i <= $#scriptNames; i++ )); do
- scripts+=("${scriptNames[$i]}:${scriptCommands[$i]}")
- done
+ if [[ -n $packageJson ]]; then
+ scripts=("${(@f)$(cat ${packageJson} | perl -0777 -MJSON::PP -n -E '%r=%{decode_json($_)->{scripts}}; do{$k=$_;($e=$k)=~s/:/\\:/g; printf "$e:$r{$k}\n"} for sort keys %r')}")
+ fi
commands=('env' $scripts $binaries)
_describe 'command' commands
@@ -137,7 +168,13 @@ _yarn_add_files() {
}
_yarn_workspaces() {
- local -a workspaces=(${(@f)$(yarn workspaces info |sed -n -e 's/^ "\([^"]*\)": {/\1/p')})
+ local version=$(yarn --version |sed -n 's|\([0-9]*\).*|\1|p')
+ local -a workspaces
+ if [[ $version == "1" ]]; then
+ workspaces=(${(@f)$(yarn workspaces info |sed -n -e 's/^ "\([^"]*\)": {/\1/p')})
+ else
+ workspaces=(${(@f)$(yarn workspaces list --json | sed -n 's|.*"name":"\([^"]*\)"}|\1|p')})
+ fi
_describe 'workspace' workspaces
}
@@ -157,7 +194,7 @@ _yarn() {
'(--emoji)--no-emoji[disable emoji in output]' \
'(--disable-pnp)'{--enable-pnp,--pnp}"[enable the Plug'n'Play installation]" \
'--flat[only allow one version of a package]' \
- '--focus[Focus on a single workspace by installing remote copies of its sibiling workspaces]' \
+ '--focus[Focus on a single workspace by installing remote copies of its sibling workspaces]' \
'--force[install and build packages even if they were built before, overwrite lockfile]' \
"--frozen-lockfile[don't generate a lockfile and fail if an update is needed]" \
'--global-folder=[modules folder]:folder:_files -/' \
diff --git a/plugins/yarn/yarn.plugin.zsh b/plugins/yarn/yarn.plugin.zsh
index a4f595c61..9ba24420a 100644
--- a/plugins/yarn/yarn.plugin.zsh
+++ b/plugins/yarn/yarn.plugin.zsh
@@ -1,5 +1,8 @@
-# Add yarn bin directory to $PATH if it exists and not in $PATH already
-bindir=$(yarn global bin 2>/dev/null) \
+# Skip yarn call if default global bin dir exists
+[[ -d "$HOME/.yarn/bin" ]] && bindir="$HOME/.yarn/bin" || bindir="$(yarn global bin 2>/dev/null)"
+
+# Add yarn bin directory to $PATH if it exists and not already in $PATH
+[[ $? -eq 0 ]] \
&& [[ -d "$bindir" ]] \
&& (( ! ${path[(Ie)$bindir]} )) \
&& path+=("$bindir")
diff --git a/plugins/yum/yum.plugin.zsh b/plugins/yum/yum.plugin.zsh
index 69abfc4ce..d36571133 100644
--- a/plugins/yum/yum.plugin.zsh
+++ b/plugins/yum/yum.plugin.zsh
@@ -7,7 +7,7 @@ alias ygl="yum grouplist" # list package groups
alias yli="yum list installed" # print all installed packages
alias ymc="yum makecache" # rebuilds the yum package list
-alias yu="sudo yum update" # upgrate packages
+alias yu="sudo yum update" # upgrade packages
alias yi="sudo yum install" # install package
alias ygi="sudo yum groupinstall" # install package group
alias yr="sudo yum remove" # remove package
diff --git a/plugins/z/z.plugin.zsh b/plugins/z/z.plugin.zsh
index 96abee890..7d3eacac0 100644
--- a/plugins/z/z.plugin.zsh
+++ b/plugins/z/z.plugin.zsh
@@ -1 +1,6 @@
+# Handle $0 according to the standard:
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
source "${0:h}/z.sh"
diff --git a/plugins/zbell/README.md b/plugins/zbell/README.md
index 1c1c13546..eb87699c4 100644
--- a/plugins/zbell/README.md
+++ b/plugins/zbell/README.md
@@ -24,6 +24,9 @@ These settings need to be set in your zshrc file, before Oh My Zsh is sourced.
zbell_ignore=($EDITOR $PAGER)
```
+- `zbell_use_notify_send`: If set to `true`, `notify-send` tool is used -- if
+ available -- to display a popup on the screen. Default: `true` (enabled).
+
## Author
Adapted from an original version by [Jean-Philippe Ouellet](https://github.com/jpouellet).
diff --git a/plugins/zbell/zbell.plugin.zsh b/plugins/zbell/zbell.plugin.zsh
index 6d0416502..8e374029b 100644
--- a/plugins/zbell/zbell.plugin.zsh
+++ b/plugins/zbell/zbell.plugin.zsh
@@ -29,18 +29,31 @@ autoload -Uz regexp-replace || return
# initialize zbell_ignore if not set
(( ${+zbell_ignore} )) || zbell_ignore=($EDITOR $PAGER)
+# initialize zbell_use_notify_send if not set
+(( ${+zbell_use_notify_send} )) || zbell_use_notify_send=true
+
# initialize it because otherwise we compare a date and an empty string
# the first time we see the prompt. it's fine to have lastcmd empty on the
# initial run because it evaluates to an empty string, and splitting an
# empty string just results in an empty array.
zbell_timestamp=$EPOCHSECONDS
+# UI notification function
+# $1: command
+# $2: duration in seconds
+zbell_ui_notify() {
+ [[ $zbell_use_notify_send != "true" ]] && return
+
+ if type notify-send > /dev/null; then
+ notify-send -i terminal "Command completed in ${2}s:" $1
+ fi
+}
+
# default notification function
# $1: command
# $2: duration in seconds
zbell_notify() {
- type notify-send > /dev/null && \
- notify-send -i terminal "Command completed in ${2}s:" $1
+ zbell_ui_notify "${@}"
print -n "\a"
}
diff --git a/plugins/zsh-navigation-tools/.config/znt/README.txt b/plugins/zsh-navigation-tools/.config/znt/README.txt
deleted file mode 100644
index c3d6c821a..000000000
--- a/plugins/zsh-navigation-tools/.config/znt/README.txt
+++ /dev/null
@@ -1 +0,0 @@
-These are skeletons, configuration is read from ~/.config/znt/*
diff --git a/plugins/zsh-navigation-tools/README.md b/plugins/zsh-navigation-tools/README.md
index 7d2ce99f4..bdbfac976 100644
--- a/plugins/zsh-navigation-tools/README.md
+++ b/plugins/zsh-navigation-tools/README.md
@@ -1,15 +1,28 @@
[![License (GPL version 3)](https://img.shields.io/badge/license-GNU%20GPL%20version%203-blue.svg?style=flat-square)](./LICENSE)
[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](./LICENSE)
![ZSH 5.0.0](https://img.shields.io/badge/zsh-v5.0.0-orange.svg?style=flat-square)
+[![Gitter][gitter-image]][gitter-link]
-![znt logo](http://imageshack.com/a/img905/2629/WK9qjN.png)
-
-[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=D6XDCHDSBDSDG)
+![znt logo](https://imageshack.com/a/img905/2629/WK9qjN.png)
# Zsh Navigation Tools
-Also check out [![ZCA](http://imageshack.com/a/img911/8084/qSpO8a.png) Zsh Command Architect](https://github.com/psprint/zsh-cmd-architect)
-and [Zconvey](https://github.com/psprint/zconvey)
+Set of tools like `n-history` – multi-word history searcher, `n-cd` – directory
+bookmark manager, `n-kill` – `htop` like kill utility, and more. Based on
+`n-list`, a tool generating selectable curses-based list of elements that has
+access to current `Zsh` session, i.e. has broad capabilities to work together
+with it. Feature highlights include incremental multi-word searching, approximate
+matching, ANSI coloring, themes, unique mode, horizontal scroll, grepping, advanced
+history management and various integrations with `Zsh`.
+
+To use it, add `zsh-navigation-tools` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... zsh-navigation-tools)
+```
+
+Also check out [![ZCA](https://imageshack.com/a/img911/8084/qSpO8a.png) Zsh Command Architect](https://github.com/zdharma-continuum/zsh-cmd-architect)
+and [Zconvey](https://github.com/zdharma-continuum/zconvey)
@@ -19,189 +32,10 @@ Videos:
Screenshots:
-![n-history](http://imageshack.com/a/img921/5046/bqr0mk.png)
+![n-history](https://imageshack.com/a/img921/5046/bqr0mk.png)
-![n-history](http://imageshack.com/a/img633/9905/WzfSdl.gif)
+![n-history](https://imageshack.com/a/img633/9905/WzfSdl.gif)
-Set of tools like `n-history` – multi-word history searcher, `n-cd` – directory
-bookmark manager, `n-kill` – `htop` like kill utility, and more. Based on
-`n-list`, a tool generating selectable curses-based list of elements that has
-access to current `Zsh` session, i.e. has broad capabilities to work together
-with it. Feature highlights include incremental multi-word searching, approximate
-matching, ANSI coloring, themes, unique mode, horizontal scroll, grepping, advanced
-history management and various integrations with `Zsh`.
-
-## News
-* 06-10-2016
- - **Tmux-integration** – `Ctrl-B H` in Tmux to open `n-history` in new window.
- Then select history entry, it will be copied to the original Tmux window.
- Use this to execute local commands on remote hosts:
-
- ![tmux integration](http://imageshack.com/a/img922/4760/oyX7eN.gif)
-
- All that is needed is this line added to `~/.tmux.conf`:
-
- ```
- bind h run-shell -b "$ZNT_REPO_DIR/doc/znt-tmux.zsh"
- ```
-
- or – if Homebrew or other package manager is used:
-
- ```
- bind h run-shell -b "$ZNT_REPO_DIR/znt-tmux.zsh"
- ```
-
-* 16-05-2016
- - `n-kill` has completion. It proposes **words** from what's in `ps -A`. Giving `n-kill`
- arguments means grepping – it will start only with matching `ps` entries.
-
-* 15-05-2016
- - Fixed problem where zsh-syntax-highlighting could render `n-history` slow (for
- long history entries).
-
-* 14-05-2016
- - Configuration can be set from `zshrc` (starting from `v2.1.12`). Documentation is [below](#configuration). Example:
-
- ```zsh
- znt_list_instant_select=1
- znt_list_border=0
- znt_list_bold=1
- znt_list_colorpair="green/black"
- znt_functions_keywords=( "zplg" "zgen" "match" )
- znt_cd_active_text="underline"
- znt_env_nlist_coloring_color=$'\x1b[00;33m'
- znt_cd_hotlist=( "~/.config/znt" "/usr/share/zsh/site-functions" "/usr/share/zsh"
- "/usr/local/share/zsh/site-functions" "/usr/local/share/zsh"
- "/usr/local/bin" )
- ```
-
-* 10-05-2016
- - Search query rotation – use `Ctrl-A` to rotate entered words right.
- Words `1 2 3` become `3 1 2`.
-
-* 09-05-2016
- - New feature: n-help tool, available also from n-history via `H` key. It
- displays help screen with various information on `ZNT`.
-
- ![n-help](http://imageshack.com/a/img922/7595/MvtJdI.gif)
-
-* 08-05-2016
- - Approximate matching – pressing `f` or `Ctrl-F` will enter "`FIX`" mode,
- in which `1` or `2` errors are allowed in what's searched. This utilizes
- original Zsh approximate matching features and is intended to be used
- after entering search query, when a typo is discovered.
-
- ![fix mode](http://imageshack.com/a/img921/5756/64lFnv.gif)
-
-* 06-05-2016
- - Private history can be edited. Use `e` key or `Ctrl-E` for that when in
- n-history. Your `$EDITOR` will start. This is a way to have handy set of
- bookmarks prepared in private history's file.
- - Border can be disabled. Use following snippet in `~/.config/znt/n-list.conf`
- or any other tool-targetted config file:
-
- ```zsh
- # Should draw the border?
- local border=0
- ```
-
-* 30-04-2016
- - New feature: color themes. Use `Ctrl-T` and `Ctrl-G` to browse predefined
- themes. They are listed in [~/.config/znt/n-list.conf](https://github.com/psprint/zsh-navigation-tools/blob/master/.config/znt/n-list.conf).
- Use the file to permanently set a color scheme. Also, I sent a patch to Zsh developers
- and starting from Zsh > 5.2 (not yet released) supported will be 256 colors.
- The file [~/.config/znt/n-list.conf](https://github.com/psprint/zsh-navigation-tools/blob/master/.config/znt/n-list.conf)
- already has set of 256-color themes prepared :)
-
- ![themes](http://imageshack.com/a/img924/4310/EbRh30.gif)
-
-* 29-04-2016
- - New feature: private history – n-history tracks selected history entries,
- exposes them via new view (activated with `F1`). It is shared across all
- sessions
-
-* 28-04-2016
- - New features:
- 1. New n-history view (activated with `F1`): Most Frequent History Words
- 2. Predefined search keywords – use F2 to quickly search for chosen
- keywords (video: [https://youtu.be/DN9QqssAYB8](https://youtu.be/DN9QqssAYB8))
- 3. Configuration option for doing instant selection in search mode
-
-## Installation
-
-```
-sh -c "$(curl -fsSL https://raw.githubusercontent.com/psprint/zsh-navigation-tools/master/doc/install.sh)"
-```
-
-To update run the command again.
-
-`ZNT` will be installed at `~/.config/znt/zsh-navigation-tools`, config files will be copied to `~/.config/znt`. `.zshrc`
-will be updated with only `8` lines of code, which will be added at the bottom.
-
-After installing and reloading shell give `ZNT` a quick try with `Ctrl-R` – this keyboard shortcut will open `n-history`.
-
-## Installation With [Zplugin](https://github.com/psprint/zplugin)
-Add `zplugin load psprint/zsh-navigation-tools` to `.zshrc`. The config files will be in `~/.config/znt`.
-
-## Installation With Zgen
-
-Add `zgen load psprint/zsh-navigation-tools` to `.zshrc` and issue a `zgen reset` (this assumes that there is a proper `zgen save` construct in `.zshrc`).
-The config files will be available in `~/.config/znt`.
-
-## Installation With Antigen
-Add `antigen bundle psprint/zsh-navigation-tools` to `.zshrc`. There also
-should be `antigen apply`. The config files will be in `~/.config/znt`.
-
-## Single File Manual Installation
-
-Running script `doc/generate_single_file` will create single-file version of `ZNT`.
-It can be sourced from `.zshrc`. Don't forget about configuration files as described
-above.
-
-## Manual Installation
-
-After extracting `ZNT` to `{some-directory}` add following two lines
-to `~/.zshrc`:
-
-```zsh
-fpath+=( {some-directory} )
-source "{some-directory}/zsh-navigation-tools.plugin.zsh"
-```
-
-As you can see, no plugin manager is needed to use the `*.plugin.zsh`
-file. The above two lines of code are all that almost **all** plugin
-managers do. In fact, what's actually needed is only:
-
-```zsh
-source "{some-directory}/zsh-navigation-tools.plugin.zsh"
-```
-
-because `ZNT` detects if it is used by **any** plugin manager and can
-handle `$fpath` update by itself.
-
-## Truly Manual Installation
-Copy (or link) all `n-*` and `znt-*` files to **/usr/share/zsh/site-functions/**
-(or **/usr/local/share/zsh/site-functions/**, check with `echo $fpath[1]`) and then add:
-
- autoload n-list n-cd n-env n-kill n-panelize n-options n-aliases n-functions n-history n-help
-
-to `~/.zshrc`.
-
-Create aliases to avoid typing of the minus sign "-":
-
-```zsh
-alias naliases=n-aliases ncd=n-cd nenv=n-env nfunctions=n-functions nhistory=n-history
-alias nkill=n-kill noptions=n-options npanelize=n-panelize nhelp=n-help
-```
-
-Don't forget to copy [configuration files](https://github.com/psprint/zsh-navigation-tools/tree/master/.config/znt). They should go to `~/.config/znt`. Moreover, `n-cd` works together with option `AUTO_PUSHD` and you should have:
-
-```zsh
-setopt AUTO_PUSHD
-```
-
-in `.zshrc` (also recommend `PUSHD_IGNORE_DUPS`). Without the option `n-cd`
-will just work as incremental searcher of directory bookmarks.
## History Widget
@@ -397,15 +231,7 @@ The same with doing any non-typical Zsh Navigation Tools installation.
## More
-- be aware of [this](https://github.com/psprint/zsh-navigation-tools/blob/f49f910d239ae5bc6e1a5bb34930307b4f4e3ffe/zsh-navigation-tools.plugin.zsh#L35-L49)
-
-## IRC Channel
-
-Channel `#zplugin@freenode` is a support place for all author's projects. Connect to:
-[chat.freenode.net:6697](ircs://chat.freenode.net:6697/%23zplugin) (SSL) or [chat.freenode.net:6667](irc://chat.freenode.net:6667/%23zplugin)
- and join #zplugin.
-
-Following is a quick access via Webchat [![IRC](https://kiwiirc.com/buttons/chat.freenode.net/zplugin.png)](https://kiwiirc.com/client/chat.freenode.net:+6697/#zplugin)
+- be aware of [this](https://github.com/zdharma-continuum/zsh-navigation-tools/blob/f49f910d239ae5bc6e1a5bb34930307b4f4e3ffe/zsh-navigation-tools.plugin.zsh#L35-L49)
# Fixing tmux, screen and linux vt
@@ -429,3 +255,5 @@ It will not display underline properly, but will instead highlight by a color,
which is quite nice. The same will not work for FreeBSD's vt, `ZNT` will detect
if that vt is used and will revert to highlighting elements via `reverse` mode.
+[gitter-image]: https://badges.gitter.im/zdharma-continuum/community.svg
+[gitter-link]: https://gitter.im/zdharma-continuum/community
diff --git a/plugins/zsh-navigation-tools/doc/generate_single_file b/plugins/zsh-navigation-tools/doc/generate_single_file
new file mode 100755
index 000000000..d3d393834
--- /dev/null
+++ b/plugins/zsh-navigation-tools/doc/generate_single_file
@@ -0,0 +1,35 @@
+#!/bin/zsh
+
+local PLUGIN_FILE="doc/zshnavigationtools.plugin.zsh"
+
+[ -d doc ] || cd ..
+
+rm -vf "$PLUGIN_FILE"
+echo "# The preamble comments apply when using ZNT as autoload functions" >>"$PLUGIN_FILE"
+echo "# https://github.com/psprint/zsh-navigation-tools" >>"$PLUGIN_FILE"
+echo "# License is GPLv3 and MIT" >>"$PLUGIN_FILE"
+echo -n "# " >>"$PLUGIN_FILE"
+git show-ref master | head -1 >>"$PLUGIN_FILE"
+echo >>"$PLUGIN_FILE"
+
+for i in n-*(on); do
+ echo "$i() {" >>"$PLUGIN_FILE"
+ cat "$i" >>"$PLUGIN_FILE"
+ echo "}" >>"$PLUGIN_FILE"
+ echo "alias n${i#n-}=$i" >>"$PLUGIN_FILE"
+ echo >>"$PLUGIN_FILE"
+done
+
+# Append znt-* files
+for i in znt-*(on); do
+ echo "$i() {" >>"$PLUGIN_FILE"
+ cat "$i" >>"$PLUGIN_FILE"
+ echo "}" >>"$PLUGIN_FILE"
+ echo >>"$PLUGIN_FILE"
+done
+
+# Append ^R bind
+echo "zle -N znt-history-widget" >>"$PLUGIN_FILE"
+echo "bindkey '^R' znt-history-widget" >>"$PLUGIN_FILE"
+echo "setopt AUTO_PUSHD HIST_IGNORE_DUPS PUSHD_IGNORE_DUPS" >>"$PLUGIN_FILE"
+
diff --git a/plugins/zsh-navigation-tools/doc/img/n-history2.png b/plugins/zsh-navigation-tools/doc/img/n-history2.png
new file mode 100644
index 000000000..fa23de00d
Binary files /dev/null and b/plugins/zsh-navigation-tools/doc/img/n-history2.png differ
diff --git a/plugins/zsh-navigation-tools/doc/install.sh b/plugins/zsh-navigation-tools/doc/install.sh
new file mode 100755
index 000000000..2b71aa3b4
--- /dev/null
+++ b/plugins/zsh-navigation-tools/doc/install.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+if ! type git 2>/dev/null 1>&2; then
+ echo "Please install GIT first"
+ echo "Exiting"
+ exit 1
+fi
+
+#
+# Clone or pull
+#
+
+if ! test -d "$HOME/.config"; then
+ mkdir "$HOME/.config"
+fi
+
+if ! test -d "$HOME/.config/znt"; then
+ mkdir "$HOME/.config/znt"
+fi
+
+echo ">>> Downloading zsh-navigation-tools to ~/.config/znt"
+if test -d ~/.config/znt/zsh-navigation-tools; then
+ cd ~/.config/znt/zsh-navigation-tools
+ git pull origin master
+else
+ cd ~/.config/znt
+ git clone https://github.com/psprint/zsh-navigation-tools.git zsh-navigation-tools
+fi
+echo ">>> Done"
+
+#
+# Copy configs
+#
+
+echo ">>> Copying config files"
+
+cd ~/.config/znt
+
+set n-aliases.conf n-env.conf n-history.conf n-list.conf n-panelize.conf n-cd.conf n-functions.conf n-kill.conf n-options.conf
+
+for i; do
+ if ! test -f "$i"; then
+ cp -v zsh-navigation-tools/.config/znt/$i .
+ fi
+done
+
+echo ">>> Done"
+
+#
+# Modify .zshrc
+#
+
+echo ">>> Updating .zshrc"
+if ! grep zsh-navigation-tools ~/.zshrc >/dev/null 2>&1; then
+ echo >> ~/.zshrc
+ echo "### ZNT's installer added snippet ###" >> ~/.zshrc
+ echo "fpath=( \"\$fpath[@]\" \"\$HOME/.config/znt/zsh-navigation-tools\" )" >> ~/.zshrc
+ echo "autoload n-aliases n-cd n-env n-functions n-history n-kill n-list n-list-draw n-list-input n-options n-panelize n-help" >> ~/.zshrc
+ echo "autoload znt-usetty-wrapper znt-history-widget znt-cd-widget znt-kill-widget" >> ~/.zshrc
+ echo "alias naliases=n-aliases ncd=n-cd nenv=n-env nfunctions=n-functions nhistory=n-history" >> ~/.zshrc
+ echo "alias nkill=n-kill noptions=n-options npanelize=n-panelize nhelp=n-help" >> ~/.zshrc
+ echo "zle -N znt-history-widget" >> ~/.zshrc
+ echo "bindkey '^R' znt-history-widget" >> ~/.zshrc
+ echo "setopt AUTO_PUSHD HIST_IGNORE_DUPS PUSHD_IGNORE_DUPS" >> ~/.zshrc
+ echo "zstyle ':completion::complete:n-kill::bits' matcher 'r:|=** l:|=*'" >> ~/.zshrc
+ echo "### END ###" >> ~/.zshrc
+ echo ">>> Done"
+else
+ echo ">>> .zshrc already updated, not making changes"
+fi
diff --git a/plugins/zsh-navigation-tools/doc/n-preview b/plugins/zsh-navigation-tools/doc/n-preview
new file mode 100644
index 000000000..2d8eea3fb
--- /dev/null
+++ b/plugins/zsh-navigation-tools/doc/n-preview
@@ -0,0 +1,224 @@
+# Copy this file into /usr/share/zsh/site-functions/
+# and add 'autoload n-preview` to .zshrc
+#
+# This is partially a test if n-list-draw and n-list-input can be
+# used multiple times to create multiple lists. It might become
+# more usable if someone adds more features like previewing of
+# archive contents.
+
+emulate -L zsh
+
+zmodload zsh/curses
+
+setopt typesetsilent extendedglob
+trap "return" TERM INT QUIT
+trap "_vpreview_exit" EXIT
+
+local IFS="
+"
+
+[ -f ~/.config/znt/n-list.conf ] && . ~/.config/znt/n-list.conf
+
+[[ "$colorpair" = "" ]] && colorpair="white/black"
+local background="${colorpair#*/}"
+
+# Drawing and input
+autoload n-list-draw n-list-input
+
+# Cleanup before any exit
+_vpreview_exit() {
+ zcurses 2>/dev/null delwin files
+ zcurses 2>/dev/null delwin body
+ zcurses 2>/dev/null delwin status
+ zcurses 2>/dev/null refresh
+ zcurses end
+}
+
+# Outputs a message in the bottom of the screen
+_vpreview_status_msg() {
+ zcurses move status 1 2
+ zcurses clear status eol
+ zcurses string status "$1"
+}
+
+# Prefer tput, then module terminfo
+_nlist_cursor_visibility() {
+ if type tput 2>/dev/null 1>&2; then
+ [ "$1" = "1" ] && tput cvvis
+ [ "$1" = "0" ] && tput civis
+ elif [ "$has_termcap" = "1" ]; then
+ [ "$1" = "1" ] && [ -n $terminfo[cvvis] ] && echo -n $terminfo[cvvis]
+ [ "$1" = "0" ] && [ -n $terminfo[civis] ] && echo -n $terminfo[civis]
+ fi
+}
+
+#
+# Main code
+#
+
+integer term_height="$LINES"
+integer term_width="$COLUMNS"
+if [[ "$term_height" -lt 1 || "$term_width" -lt 1 ]]; then
+ local stty_out=$( stty size )
+ term_height="${stty_out% *}"
+ term_width="${stty_out#* }"
+fi
+
+integer status_height=3
+integer status_width=term_width
+integer status_page_height=1
+integer status_page_width=term_width-2
+
+integer files_height=term_height-status_height
+integer files_width=term_width/5
+integer files_page_height=files_height-2
+integer files_page_width=files_width-2
+
+integer body_height=term_height-status_height
+integer body_width=term_width-files_width
+integer body_page_height=body_height-2
+integer body_page_width=body_width
+
+integer _from_what_idx_list_is_shown_1=1
+integer current_1=1
+
+integer _from_what_idx_list_is_shown_2=1
+integer current_2=1
+integer hscroll_2=0
+
+integer active_window=0
+
+local ansi_mode="ansi"
+[ -f ~/.config/znt/n-preview.conf ] && . ~/.config/znt/n-preview.conf
+typeset -a hcmd
+#if type pygmentize 2>/dev/null 1>&2; then
+# hcmd=( pygmentize -g )
+if type highlight 2>/dev/null 1>&2; then
+ hcmd=( highlight -q --force -O ansi )
+elif type source-highlight 2>/dev/null 1>&2; then
+ # Warning: source-highlight can have problems
+ hcmd=( source-highlight --failsafe -fesc -o STDOUT -i )
+else
+ ansi_mode="noansi"
+fi
+
+zcurses init
+zcurses addwin status "$status_height" "$status_width" $(( term_height - status_height )) 0
+zcurses addwin files "$files_height" "$files_width" 0 0
+zcurses addwin body "$body_height" "$body_width" 0 "$files_width"
+zcurses bg status white/black
+zcurses bg files white/black
+zcurses bg body white/black
+
+#
+# Listening for input
+#
+
+local key keypad
+
+# Clear input buffer
+zcurses timeout status 0
+zcurses input status key keypad
+zcurses timeout status -1
+key=""
+keypad=""
+
+typeset -a filenames
+integer last_element_1
+
+typeset -a body
+integer last_element_2
+
+filenames=( *(N) )
+filenames=( "${(@M)filenames:#(#i)*$1*}" )
+
+local NLIST_GREP_STRING="$1"
+
+integer last_element_1="$#filenames"
+integer last_element_2=0
+
+local selection action final_key
+
+while (( 1 )); do
+ # Output the lists
+ integer end_idx=$(( _from_what_idx_list_is_shown_1 + files_page_height - 1 ))
+ [ "$end_idx" -gt "$last_element_1" ] && end_idx=last_element_1
+
+ n-list-draw "$(( (current_1 -1) % files_page_height + 1 ))" \
+ "$files_page_height" "$files_page_width" 1 2 0 files \
+ "${(@)filenames[_from_what_idx_list_is_shown_1, end_idx]}"
+
+ if [ "$#body" -ge 1 ]; then
+ end_idx=$(( _from_what_idx_list_is_shown_2 + body_page_height - 1 ))
+ [ "$end_idx" -gt "$last_element_2" ] && end_idx=last_element_2
+
+ n-list-draw "$(( (current_2 -1) % body_page_height + 1 ))" \
+ "$body_page_height" "$body_page_width" 1 0 "$hscroll_2" body \
+ "${(@)body[_from_what_idx_list_is_shown_2, end_idx]}"
+ fi
+
+ [[ "$active_window" -eq 0 ]] && zcurses border files
+ zcurses border status
+ zcurses refresh files body status
+
+ # Wait for input
+ zcurses input status key keypad
+
+ # Get the special (i.e. "keypad") key or regular key
+ if [ -n "$key" ]; then
+ final_key="$key"
+ elif [ -n "$keypad" ]; then
+ final_key="$keypad"
+ else
+ _vpreview_status_msg "Inproper input detected"
+ zcurses refresh status
+ fi
+
+ if [ "$active_window" -eq 0 ]; then
+ zcurses clear files
+ n-list-input "$current_1" "$_from_what_idx_list_is_shown_1" "$files_page_height" \
+ "$files_page_width" "$last_element_1" 0 "$final_key"
+
+ selection="$reply[1]"
+ action="$reply[2]"
+ current_1="$reply[3]"
+ _from_what_idx_list_is_shown_1="$reply[4]"
+
+ if [ "$action" = "SELECT" ]; then
+ # Load new file and refresh the displaying window
+ local filename="$filenames[$selection]"
+ if [ "$ansi_mode" = "ansi" ]; then
+ body=( "${(@f)"$( "$hcmd[@]" "$filename" )"}" )
+ else
+ body=( "${(@f)"$(<$filename)"}" )
+ fi
+ last_element_2="$#body"
+ current_2=1
+ _from_what_idx_list_is_shown_2=1
+ zcurses clear body
+ fi
+ elif [ "$active_window" -eq 1 ]; then
+ zcurses clear body
+ n-list-input "$current_2" "$_from_what_idx_list_is_shown_2" "$body_page_height" \
+ "$body_page_width" "$last_element_2" "$hscroll_2" "$final_key"
+
+ selection="$reply[1]"
+ action="$reply[2]"
+ current_2="$reply[3]"
+ _from_what_idx_list_is_shown_2="$reply[4]"
+ hscroll_2="$reply[5]"
+
+ fi
+
+ if [ "$action" = "LEAVE" ]; then
+ active_window=1-active_window
+ elif [ "$action" = "QUIT" ]; then
+ break
+ elif [ "$action" = "REDRAW" ]; then
+ zcurses clear files redraw
+ zcurses clear body redraw
+ zcurses clear status redraw
+ fi
+done
+
+# vim: set filetype=zsh:
diff --git a/plugins/zsh-navigation-tools/znt-tmux.zsh b/plugins/zsh-navigation-tools/doc/znt-tmux.zsh
similarity index 97%
rename from plugins/zsh-navigation-tools/znt-tmux.zsh
rename to plugins/zsh-navigation-tools/doc/znt-tmux.zsh
index 6a96e97a1..309c11a0b 100755
--- a/plugins/zsh-navigation-tools/znt-tmux.zsh
+++ b/plugins/zsh-navigation-tools/doc/znt-tmux.zsh
@@ -12,7 +12,7 @@
# To use, put this line to your ~/.tmux.conf. The tool is invoked with:
# Ctrl+b h
#
-# bind h run-shell -b "$ZNT_REPO_DIR/znt-tmux.zsh"
+# bind h run-shell -b "$ZNT_REPO_DIR/doc/znt-tmux.zsh"
#
# get and save the current active tmux pane id
diff --git a/plugins/zsh-navigation-tools/zsh-navigation-tools.plugin.zsh b/plugins/zsh-navigation-tools/zsh-navigation-tools.plugin.zsh
index f015620f5..54c819810 100644
--- a/plugins/zsh-navigation-tools/zsh-navigation-tools.plugin.zsh
+++ b/plugins/zsh-navigation-tools/zsh-navigation-tools.plugin.zsh
@@ -8,9 +8,10 @@
#
# According to the standard:
-# http://zdharma.org/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
+
export ZNT_REPO_DIR="${0:h}"
export ZNT_CONFIG_DIR="$HOME/.config/znt"
diff --git a/themes/Soliah.zsh-theme b/themes/Soliah.zsh-theme
index 070c54981..c3dd6af89 100644
--- a/themes/Soliah.zsh-theme
+++ b/themes/Soliah.zsh-theme
@@ -45,9 +45,7 @@ function rvm_gemset() {
function git_time_since_commit() {
if git rev-parse --git-dir > /dev/null 2>&1; then
# Only proceed if there is actually a commit.
- if [[ $(git log 2>&1 > /dev/null | grep -c "^fatal: bad default revision") == 0 ]]; then
- # Get the last commit.
- last_commit=`git log --pretty=format:'%at' -1 2> /dev/null`
+ if last_commit=`git -c log.showSignature=false log --pretty=format:'%at' -1 2> /dev/null`; then
now=`date +%s`
seconds_since_last_commit=$((now-last_commit))
diff --git a/themes/adben.zsh-theme b/themes/adben.zsh-theme
index ebdec7c82..c2fdbed23 100644
--- a/themes/adben.zsh-theme
+++ b/themes/adben.zsh-theme
@@ -32,42 +32,44 @@
########## COLOR ###########
for COLOR in CYAN WHITE YELLOW MAGENTA BLACK BLUE RED DEFAULT GREEN GREY; do
- eval PR_$COLOR='%{$fg[${(L)COLOR}]%}'
- eval PR_BRIGHT_$COLOR='%{$fg_bold[${(L)COLOR}]%}'
+ typeset -g PR_$COLOR="%b%{$fg[${(L)COLOR}]%}"
+ typeset -g PR_BRIGHT_$COLOR="%B%{$fg[${(L)COLOR}]%}"
done
-
PR_RESET="%{$reset_color%}"
-RED_START="${PR_RESET}${PR_GREY}<${PR_RESET}${PR_RED}<${PR_BRIGHT_RED}<${PR_RESET} "
-RED_END="${PR_RESET}${PR_BRIGHT_RED}>${PR_RESET}${PR_RED}>${PR_GREY}>${PR_RESET} "
-GREEN_END="${PR_RESET}${PR_BRIGHT_GREEN}>${PR_RESET}${PR_GREEN}>${PR_GREY}>${PR_RESET} "
-GREEN_BASE_START="${PR_RESET}${PR_GREY}>${PR_RESET}${PR_GREEN}>${PR_BRIGHT_GREEN}>${PR_RESET}"
-GREEN_START_P1="${PR_RESET}${GREEN_BASE_START}${PR_RESET} "
-DIVISION="${PR_RESET}${PR_RED} < ${PR_RESET}"
-VCS_DIRTY_COLOR="${PR_RESET}${PR_YELLOW}"
-VCS_CLEAN_COLOR="${PR_RESET}${PR_GREEN}"
-VCS_SUFIX_COLOR="${PR_RESET}${PR_RED}› ${PR_RESET}"
+
+RED_START="${PR_GREY}<${PR_RED}<${PR_BRIGHT_RED}<${PR_RESET} "
+RED_END="${PR_BRIGHT_RED}>${PR_RED}>${PR_GREY}>${PR_RESET} "
+GREEN_START="${PR_GREY}>${PR_GREEN}>${PR_BRIGHT_GREEN}>${PR_RESET}"
+GREEN_END="${PR_BRIGHT_GREEN}>${PR_GREEN}>${PR_GREY}>${PR_RESET} "
+
+########## VCS ###########
+VCS_DIRTY_COLOR="${PR_YELLOW}"
+VCS_CLEAN_COLOR="${PR_GREEN}"
+VCS_SUFFIX_COLOR="${PR_RED}› ${PR_RESET}"
########## SVN ###########
-ZSH_THEME_SVN_PROMPT_PREFIX="${PR_RESET}${PR_RED}‹svn:"
-ZSH_THEME_SVN_PROMPT_SUFFIX=""
-ZSH_THEME_SVN_PROMPT_DIRTY="${VCS_DIRTY_COLOR} ✘${VCS_SUFIX_COLOR}"
-ZSH_THEME_SVN_PROMPT_CLEAN="${VCS_CLEAN_COLOR} ✔${VCS_SUFIX_COLOR}"
+ZSH_THEME_SVN_PROMPT_PREFIX="${PR_RED}‹svn:"
+ZSH_THEME_SVN_PROMPT_SUFFIX="${VCS_SUFFIX_COLOR}"
+ZSH_THEME_SVN_PROMPT_DIRTY="${VCS_DIRTY_COLOR} ✘"
+ZSH_THEME_SVN_PROMPT_CLEAN="${VCS_CLEAN_COLOR} ✔"
########## GIT ###########
-ZSH_THEME_GIT_PROMPT_PREFIX="${PR_RESET}${PR_RED}‹git:"
-ZSH_THEME_GIT_PROMPT_SUFFIX=""
-ZSH_THEME_GIT_PROMPT_DIRTY="${VCS_DIRTY_COLOR} ✘${VCS_SUFIX_COLOR}"
-ZSH_THEME_GIT_PROMPT_CLEAN="${VCS_CLEAN_COLOR} ✔${VCS_SUFIX_COLOR}"
-ZSH_THEME_GIT_PROMPT_ADDED="${PR_RESET}${PR_YELLOW} ✚${PR_RESET}"
-ZSH_THEME_GIT_PROMPT_MODIFIED="${PR_RESET}${PR_YELLOW} ✹${PR_RESET}"
-ZSH_THEME_GIT_PROMPT_DELETED="${PR_RESET}${PR_YELLOW} ✖${PR_RESET}"
-ZSH_THEME_GIT_PROMPT_RENAMED="${PR_RESET}${PR_YELLOW} ➜${PR_RESET}"
-ZSH_THEME_GIT_PROMPT_UNMERGED="${PR_RESET}${PR_YELLOW} ═${PR_RESET}"
-ZSH_THEME_GIT_PROMPT_UNTRACKED="${PR_RESET}${PR_YELLOW} ✭${PR_RESET}"
+ZSH_THEME_GIT_PROMPT_PREFIX="${PR_RED}‹git:"
+ZSH_THEME_GIT_PROMPT_SUFFIX="${VCS_SUFFIX_COLOR}"
+ZSH_THEME_GIT_PROMPT_DIRTY="${VCS_DIRTY_COLOR} ✘"
+ZSH_THEME_GIT_PROMPT_CLEAN="${VCS_CLEAN_COLOR} ✔"
+ZSH_THEME_GIT_PROMPT_ADDED="${PR_YELLOW} ✚"
+ZSH_THEME_GIT_PROMPT_MODIFIED="${PR_YELLOW} ✹"
+ZSH_THEME_GIT_PROMPT_DELETED="${PR_YELLOW} ✖"
+ZSH_THEME_GIT_PROMPT_RENAMED="${PR_YELLOW} ➜"
+ZSH_THEME_GIT_PROMPT_UNMERGED="${PR_YELLOW} ═"
+ZSH_THEME_GIT_PROMPT_UNTRACKED="${PR_YELLOW} ✭"
# Get a fortune quote
ps1_fortune() {
- (( ${+commands[fortune]} )) && fortune
+ if (( ${+commands[fortune]} )); then
+ fortune
+ fi
}
# Obtain a command tip
@@ -77,33 +79,27 @@ ps1_command_tip() {
command wget -qO- https://www.commandlinefu.com/commands/random/plaintext
elif (( ${+commands[curl]} )); then
command curl -fsL https://www.commandlinefu.com/commands/random/plaintext
- fi
- } | sed 1d | sed '/^$/d'
+ fi
+ } | sed '1d;/^$/d'
}
-function precmd_adben {
- prompt_header() {
- if [[ "$ENABLE_COMMAND_TIP" = true ]]; then
- ps1_command_tip
- else
- ps1_fortune
- fi
- }
+# Show prompt header (fortune / command tip)
+prompt_header() {
+ local header=$(
+ case "${ENABLE_COMMAND_TIP:-}" in
+ true) ps1_command_tip ;;
+ *) ps1_fortune ;;
+ esac
+ )
- PROMPT_HEAD="${RED_START}${PR_YELLOW}$(prompt_header)${PR_RESET}"
-
- # set a simple variable to show when in screen
- if [[ -n "${WINDOW}" ]]; then
- SCREEN=""
- fi
+ # Make sure to quote % so that they're not expanded by the prompt
+ echo -n "${header:gs/%/%%}"
}
# Context: user@directory or just directory
prompt_context() {
if [[ "$USERNAME" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then
- echo -n "${PR_RESET}${PR_RED}$USERNAME@%m${PR_RESET}${PR_BRIGHT_YELLOW}%~%<<${PR_RESET}"
- else
- echo -n "${PR_RESET}${PR_BRIGHT_YELLOW}%~%<<${PR_RESET}"
+ echo -n "${PR_RESET}${PR_RED}%n@%m"
fi
}
@@ -111,16 +107,12 @@ prompt_context() {
# Required for the prompt
setopt prompt_subst
-autoload zsh/terminfo
-# Prompt
-PROMPT='${PROMPT_HEAD}
-${RED_START}$(prompt_context)
-${GREEN_START_P1}'
-RPROMPT='${PR_RESET}$(git_prompt_info)$(svn_prompt_info)${PR_YELLOW}%D{%R.%S %a %b %d %Y} ${GREEN_END}${PR_RESET}'
+# Prompt: header, context (user@host), directory
+PROMPT="${RED_START}${PR_YELLOW}\$(prompt_header)${PR_RESET}
+${RED_START}\$(prompt_context)${PR_BRIGHT_YELLOW}%~${PR_RESET}
+${GREEN_START} "
+# Right prompt: vcs status + time
+RPROMPT="\$(git_prompt_info)\$(svn_prompt_info)${PR_YELLOW}%D{%R.%S %a %b %d %Y} ${GREEN_END}"
# Matching continuation prompt
-PROMPT2='${GREEN_BASE_START}${PR_RESET} %_ ${GREEN_BASE_START}${PR_RESET} '
-
-# Prompt head
-autoload -Uz add-zsh-hook
-add-zsh-hook precmd precmd_adben
+PROMPT2="${GREEN_START} %_ ${GREEN_START} "
diff --git a/themes/af-magic.zsh-theme b/themes/af-magic.zsh-theme
index 1d2af3458..2ef9b02d7 100644
--- a/themes/af-magic.zsh-theme
+++ b/themes/af-magic.zsh-theme
@@ -1,47 +1,46 @@
# af-magic.zsh-theme
-# Repo: https://github.com/andyfleming/oh-my-zsh
-# Direct Link: https://github.com/andyfleming/oh-my-zsh/blob/master/themes/af-magic.zsh-theme
+#
+# Author: Andy Fleming
+# URL: http://andyfleming.com/
-
-# settings
-typeset +H return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})"
-typeset +H my_gray="$FG[237]"
-typeset +H my_orange="$FG[214]"
-
-# separator dashes size
+# dashed separator size
function afmagic_dashes {
- local PYTHON_ENV="$VIRTUAL_ENV"
- [[ -z "$PYTHON_ENV" ]] && PYTHON_ENV="$CONDA_DEFAULT_ENV"
+ # check either virtualenv or condaenv variables
+ local python_env="${VIRTUAL_ENV:-$CONDA_DEFAULT_ENV}"
- if [[ -n "$PYTHON_ENV" && "$PS1" = \(* ]]; then
- echo $(( COLUMNS - ${#PYTHON_ENV} - 3 ))
- else
- echo $COLUMNS
- fi
+ # if there is a python virtual environment and it is displayed in
+ # the prompt, account for it when returning the number of dashes
+ if [[ -n "$python_env" && "$PS1" = \(* ]]; then
+ echo $(( COLUMNS - ${#python_env} - 3 ))
+ else
+ echo $COLUMNS
+ fi
}
-# primary prompt
-PS1='$FG[237]${(l.$(afmagic_dashes)..-.)}%{$reset_color%}
-$FG[032]%~$(git_prompt_info)$(hg_prompt_info) $FG[105]%(!.#.»)%{$reset_color%} '
-PS2='%{$fg[red]%}\ %{$reset_color%}'
-RPS1='${return_code}'
+# primary prompt: dashed separator, directory and vcs info
+PS1="${FG[237]}\${(l.\$(afmagic_dashes)..-.)}%{$reset_color%}
+${FG[032]}%~\$(git_prompt_info)\$(hg_prompt_info) ${FG[105]}%(!.#.»)%{$reset_color%} "
+PS2="%{$fg[red]%}\ %{$reset_color%}"
-# right prompt
-(( $+functions[virtualenv_prompt_info] )) && RPS1+='$(virtualenv_prompt_info)'
-RPS1+=' $my_gray%n@%m%{$reset_color%}%'
+# right prompt: return code, virtualenv and context (user@host)
+RPS1="%(?..%{$fg[red]%}%? ↵%{$reset_color%})"
+if (( $+functions[virtualenv_prompt_info] )); then
+ RPS1+='$(virtualenv_prompt_info)'
+fi
+RPS1+=" ${FG[237]}%n@%m%{$reset_color%}"
# git settings
-ZSH_THEME_GIT_PROMPT_PREFIX="$FG[075]($FG[078]"
+ZSH_THEME_GIT_PROMPT_PREFIX=" ${FG[075]}(${FG[078]}"
ZSH_THEME_GIT_PROMPT_CLEAN=""
-ZSH_THEME_GIT_PROMPT_DIRTY="$my_orange*%{$reset_color%}"
-ZSH_THEME_GIT_PROMPT_SUFFIX="$FG[075])%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIRTY="${FG[214]}*%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_SUFFIX="${FG[075]})%{$reset_color%}"
# hg settings
-ZSH_THEME_HG_PROMPT_PREFIX="$FG[075]($FG[078]"
+ZSH_THEME_HG_PROMPT_PREFIX=" ${FG[075]}(${FG[078]}"
ZSH_THEME_HG_PROMPT_CLEAN=""
-ZSH_THEME_HG_PROMPT_DIRTY="$my_orange*%{$reset_color%}"
-ZSH_THEME_HG_PROMPT_SUFFIX="$FG[075])%{$reset_color%}"
+ZSH_THEME_HG_PROMPT_DIRTY="${FG[214]}*%{$reset_color%}"
+ZSH_THEME_HG_PROMPT_SUFFIX="${FG[075]})%{$reset_color%}"
# virtualenv settings
-ZSH_THEME_VIRTUALENV_PREFIX=" $FG[075]["
+ZSH_THEME_VIRTUALENV_PREFIX=" ${FG[075]}["
ZSH_THEME_VIRTUALENV_SUFFIX="]%{$reset_color%}"
diff --git a/themes/afowler.zsh-theme b/themes/afowler.zsh-theme
index 3a4753fc1..f6d3ef82a 100644
--- a/themes/afowler.zsh-theme
+++ b/themes/afowler.zsh-theme
@@ -1,10 +1,10 @@
-if [ $UID -eq 0 ]; then CARETCOLOR="red"; else CARETCOLOR="blue"; fi
-
-local return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})"
-
-PROMPT='%m %{${fg_bold[blue]}%}:: %{$reset_color%}%{${fg[green]}%}%3~ $(git_prompt_info)%{${fg_bold[$CARETCOLOR]}%}»%{${reset_color}%} '
-
-RPS1="${return_code}"
+PROMPT='%m %B%F{blue}:: %b%F{green}%3~ $(hg_prompt_info)$(git_prompt_info)%B%(!.%F{red}.%F{blue})»%f%b '
+RPS1='%(?..%F{red}%? ↵%f)'
ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[yellow]%}‹"
ZSH_THEME_GIT_PROMPT_SUFFIX="› %{$reset_color%}"
+
+ZSH_THEME_HG_PROMPT_PREFIX="%{$fg[magenta]%}hg:‹%{$fg[yellow]%}"
+ZSH_THEME_HG_PROMPT_SUFFIX="%{$fg[magenta]%}› %{$reset_color%}"
+ZSH_THEME_HG_PROMPT_DIRTY=" %{$fg[red]%}✗"
+ZSH_THEME_HG_PROMPT_CLEAN=""
diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme
index fe7ddbac6..5f4efe813 100644
--- a/themes/agnoster.zsh-theme
+++ b/themes/agnoster.zsh-theme
@@ -135,7 +135,7 @@ prompt_git() {
zstyle ':vcs_info:*' formats ' %u%c'
zstyle ':vcs_info:*' actionformats ' %u%c'
vcs_info
- echo -n "${ref/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode}"
+ echo -n "${${ref:gs/%/%%}/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode}"
fi
}
@@ -153,7 +153,7 @@ prompt_bzr() {
if bzr_status=$(bzr status 2>&1); then
status_mod=$(echo -n "$bzr_status" | head -n1 | grep "modified" | wc -m)
status_all=$(echo -n "$bzr_status" | head -n1 | wc -m)
- revision=$(bzr log -r-1 --log-format line | cut -d: -f1)
+ revision=${$(bzr log -r-1 --log-format line | cut -d: -f1):gs/%/%%}
if [[ $status_mod -gt 0 ]] ; then
prompt_segment yellow black "bzr@$revision ✚"
else
@@ -183,7 +183,7 @@ prompt_hg() {
# if working copy is clean
prompt_segment green $CURRENT_FG
fi
- echo -n $(hg prompt "☿ {rev}@{branch}") $st
+ echo -n ${$(hg prompt "☿ {rev}@{branch}"):gs/%/%%} $st
else
st=""
rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g')
@@ -197,7 +197,7 @@ prompt_hg() {
else
prompt_segment green $CURRENT_FG
fi
- echo -n "☿ $rev@$branch" $st
+ echo -n "☿ ${rev:gs/%/%%}@${branch:gs/%/%%}" $st
fi
fi
}
@@ -209,9 +209,8 @@ prompt_dir() {
# Virtualenv: current working virtualenv
prompt_virtualenv() {
- local virtualenv_path="$VIRTUAL_ENV"
- if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then
- prompt_segment blue black "(`basename $virtualenv_path`)"
+ if [[ -n "$VIRTUAL_ENV" && -n "$VIRTUAL_ENV_DISABLE_PROMPT" ]]; then
+ prompt_segment blue black "(${VIRTUAL_ENV:t:gs/%/%%})"
fi
}
@@ -237,8 +236,8 @@ prompt_status() {
prompt_aws() {
[[ -z "$AWS_PROFILE" || "$SHOW_AWS_PROMPT" = false ]] && return
case "$AWS_PROFILE" in
- *-prod|*production*) prompt_segment red yellow "AWS: $AWS_PROFILE" ;;
- *) prompt_segment green black "AWS: $AWS_PROFILE" ;;
+ *-prod|*production*) prompt_segment red yellow "AWS: ${AWS_PROFILE:gs/%/%%}" ;;
+ *) prompt_segment green black "AWS: ${AWS_PROFILE:gs/%/%%}" ;;
esac
}
diff --git a/themes/aussiegeek.zsh-theme b/themes/aussiegeek.zsh-theme
index c2c7f65b9..2ded5c157 100644
--- a/themes/aussiegeek.zsh-theme
+++ b/themes/aussiegeek.zsh-theme
@@ -1,5 +1,5 @@
-PROMPT='$fg_bold[blue][ $fg[red]%t $fg_bold[blue]] $fg_bold[blue] [ $fg[red]%n@%m:%~$(git_prompt_info)$fg[yellow]$(rvm_prompt_info)$fg_bold[blue] ]$reset_color
+PROMPT='$fg_bold[blue][ $fg[red]%t $fg_bold[blue]] $fg_bold[blue] [ $fg[red]%n@%m:%~$(git_prompt_info)$fg[yellow]$(ruby_prompt_info)$fg_bold[blue] ]$reset_color
$ '
# git theming
ZSH_THEME_GIT_PROMPT_PREFIX="$fg_bold[green]("
diff --git a/themes/avit.zsh-theme b/themes/avit.zsh-theme
index 1e20d8f9f..f90ba331b 100644
--- a/themes/avit.zsh-theme
+++ b/themes/avit.zsh-theme
@@ -31,7 +31,7 @@ function _git_time_since_commit() {
local last_commit now seconds_since_last_commit
local minutes hours days years commit_age
# Only proceed if there is actually a commit.
- if last_commit=$(git log --pretty=format:'%at' -1 2> /dev/null); then
+ if last_commit=$(command git -c log.showSignature=false log --format='%at' -1 2>/dev/null); then
now=$(date +%s)
seconds_since_last_commit=$((now-last_commit))
diff --git a/themes/bira.zsh-theme b/themes/bira.zsh-theme
index cdae68d6c..42a70a018 100644
--- a/themes/bira.zsh-theme
+++ b/themes/bira.zsh-theme
@@ -1,32 +1,32 @@
-# ZSH Theme - Preview: https://gyazo.com/8becc8a7ed5ab54a0262a470555c3eed.png
local return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})"
+local user_host="%B%(!.%{$fg[red]%}.%{$fg[green]%})%n@%m%{$reset_color%} "
+local user_symbol='%(!.#.$)'
+local current_dir="%B%{$fg[blue]%}%~ %{$reset_color%}"
-if [[ $UID -eq 0 ]]; then
- local user_host='%{$terminfo[bold]$fg[red]%}%n@%m %{$reset_color%}'
- local user_symbol='#'
-else
- local user_host='%{$terminfo[bold]$fg[green]%}%n@%m %{$reset_color%}'
- local user_symbol='$'
-fi
-
-local current_dir='%{$terminfo[bold]$fg[blue]%}%~ %{$reset_color%}'
-local git_branch='$(git_prompt_info)'
+local vcs_branch='$(git_prompt_info)$(hg_prompt_info)'
local rvm_ruby='$(ruby_prompt_info)'
local venv_prompt='$(virtualenv_prompt_info)'
ZSH_THEME_RVM_PROMPT_OPTIONS="i v g"
-PROMPT="╭─${user_host}${current_dir}${rvm_ruby}${git_branch}${venv_prompt}
+PROMPT="╭─${user_host}${current_dir}${rvm_ruby}${vcs_branch}${venv_prompt}
╰─%B${user_symbol}%b "
RPROMPT="%B${return_code}%b"
ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[yellow]%}‹"
ZSH_THEME_GIT_PROMPT_SUFFIX="› %{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}●%{$fg[yellow]%}"
+ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[yellow]%}"
+
+ZSH_THEME_HG_PROMPT_PREFIX="$ZSH_THEME_GIT_PROMPT_PREFIX"
+ZSH_THEME_HG_PROMPT_SUFFIX="$ZSH_THEME_GIT_PROMPT_SUFFIX"
+ZSH_THEME_HG_PROMPT_DIRTY="$ZSH_THEME_GIT_PROMPT_DIRTY"
+ZSH_THEME_HG_PROMPT_CLEAN="$ZSH_THEME_GIT_PROMPT_CLEAN"
ZSH_THEME_RUBY_PROMPT_PREFIX="%{$fg[red]%}‹"
ZSH_THEME_RUBY_PROMPT_SUFFIX="› %{$reset_color%}"
ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX="%{$fg[green]%}‹"
ZSH_THEME_VIRTUAL_ENV_PROMPT_SUFFIX="› %{$reset_color%}"
-ZSH_THEME_VIRTUALENV_PREFIX=$ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX
-ZSH_THEME_VIRTUALENV_SUFFIX=$ZSH_THEME_VIRTUAL_ENV_PROMPT_SUFFIX
+ZSH_THEME_VIRTUALENV_PREFIX="$ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX"
+ZSH_THEME_VIRTUALENV_SUFFIX="$ZSH_THEME_VIRTUAL_ENV_PROMPT_SUFFIX"
diff --git a/themes/bureau.zsh-theme b/themes/bureau.zsh-theme
index 3b3bdc80f..50058e213 100644
--- a/themes/bureau.zsh-theme
+++ b/themes/bureau.zsh-theme
@@ -17,64 +17,68 @@ ZSH_THEME_GIT_PROMPT_UNSTAGED="%{$fg_bold[yellow]%}●%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg_bold[red]%}●%{$reset_color%}"
bureau_git_branch () {
+ local ref
ref=$(command git symbolic-ref HEAD 2> /dev/null) || \
ref=$(command git rev-parse --short HEAD 2> /dev/null) || return
echo "${ref#refs/heads/}"
}
bureau_git_status() {
- _STATUS=""
+ local result gitstatus
# check status of files
- _INDEX=$(command git status --porcelain 2> /dev/null)
- if [[ -n "$_INDEX" ]]; then
- if $(echo "$_INDEX" | command grep -q '^[AMRD]. '); then
- _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_STAGED"
+ gitstatus=$(command git status --porcelain -b 2> /dev/null)
+ if [[ -n "$gitstatus" ]]; then
+ if $(echo "$gitstatus" | command grep -q '^[AMRD]. '); then
+ result+="$ZSH_THEME_GIT_PROMPT_STAGED"
fi
- if $(echo "$_INDEX" | command grep -q '^.[MTD] '); then
- _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNSTAGED"
+ if $(echo "$gitstatus" | command grep -q '^.[MTD] '); then
+ result+="$ZSH_THEME_GIT_PROMPT_UNSTAGED"
fi
- if $(echo "$_INDEX" | command grep -q -E '^\?\? '); then
- _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNTRACKED"
+ if $(echo "$gitstatus" | command grep -q -E '^\?\? '); then
+ result+="$ZSH_THEME_GIT_PROMPT_UNTRACKED"
fi
- if $(echo "$_INDEX" | command grep -q '^UU '); then
- _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNMERGED"
+ if $(echo "$gitstatus" | command grep -q '^UU '); then
+ result+="$ZSH_THEME_GIT_PROMPT_UNMERGED"
fi
else
- _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_CLEAN"
+ result+="$ZSH_THEME_GIT_PROMPT_CLEAN"
fi
# check status of local repository
- _INDEX=$(command git status --porcelain -b 2> /dev/null)
- if $(echo "$_INDEX" | command grep -q '^## .*ahead'); then
- _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_AHEAD"
+ if $(echo "$gitstatus" | command grep -q '^## .*ahead'); then
+ result+="$ZSH_THEME_GIT_PROMPT_AHEAD"
fi
- if $(echo "$_INDEX" | command grep -q '^## .*behind'); then
- _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_BEHIND"
+ if $(echo "$gitstatus" | command grep -q '^## .*behind'); then
+ result+="$ZSH_THEME_GIT_PROMPT_BEHIND"
fi
- if $(echo "$_INDEX" | command grep -q '^## .*diverged'); then
- _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_DIVERGED"
+ if $(echo "$gitstatus" | command grep -q '^## .*diverged'); then
+ result+="$ZSH_THEME_GIT_PROMPT_DIVERGED"
fi
if $(command git rev-parse --verify refs/stash &> /dev/null); then
- _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_STASHED"
+ result+="$ZSH_THEME_GIT_PROMPT_STASHED"
fi
- echo $_STATUS
+ echo $result
}
-bureau_git_prompt () {
- local _branch=$(bureau_git_branch)
- local _status=$(bureau_git_status)
- local _result=""
- if [[ "${_branch}x" != "x" ]]; then
- _result="$ZSH_THEME_GIT_PROMPT_PREFIX$_branch"
- if [[ "${_status}x" != "x" ]]; then
- _result="$_result $_status"
- fi
- _result="$_result$ZSH_THEME_GIT_PROMPT_SUFFIX"
+bureau_git_prompt() {
+ local gitbranch=$(bureau_git_branch)
+ local gitstatus=$(bureau_git_status)
+ local info
+
+ if [[ -z "$gitbranch" ]]; then
+ return
fi
- echo $_result
+
+ info="${gitbranch:gs/%/%%}"
+
+ if [[ -n "$gitstatus" ]]; then
+ info+=" $gitstatus"
+ fi
+
+ echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${info}${ZSH_THEME_GIT_PROMPT_SUFFIX}"
}
diff --git a/themes/candy-kingdom.zsh-theme b/themes/candy-kingdom.zsh-theme
index ad03cc320..31e63df15 100644
--- a/themes/candy-kingdom.zsh-theme
+++ b/themes/candy-kingdom.zsh-theme
@@ -11,7 +11,9 @@ patches: /dev/null 2>&1; then
# Only proceed if there is actually a commit.
- if git log -n 1 > /dev/null 2>&1; then
- # Get the last commit.
- last_commit=`git log --pretty=format:'%at' -1 2> /dev/null`
+ if last_commit=`git -c log.showSignature=false log --pretty=format:'%at' -1 2> /dev/null`; then
now=`date +%s`
seconds_since_last_commit=$((now-last_commit))
diff --git a/themes/essembeh.zsh-theme b/themes/essembeh.zsh-theme
index f34f36f8a..43d4093b1 100644
--- a/themes/essembeh.zsh-theme
+++ b/themes/essembeh.zsh-theme
@@ -39,7 +39,7 @@ elif [[ -r /etc/debian_chroot ]]; then
# prefix prompt in case of chroot
ZSH_ESSEMBEH_PREFIX="%{$fg[yellow]%}[chroot:$(cat /etc/debian_chroot)]%{$reset_color%} "
elif [[ -r /.dockerenv ]]; then
- # also prefix prompt inside a docker contrainer
+ # also prefix prompt inside a docker container
ZSH_ESSEMBEH_PREFIX="%{$fg[yellow]%}[docker]%{$reset_color%} "
fi
if [[ $UID = 0 ]]; then
diff --git a/themes/fino-time.zsh-theme b/themes/fino-time.zsh-theme
index 57c47db02..c7e2d965e 100644
--- a/themes/fino-time.zsh-theme
+++ b/themes/fino-time.zsh-theme
@@ -21,10 +21,11 @@ function prompt_char {
}
function box_name {
- [ -f ~/.box-name ] && cat ~/.box-name || echo ${SHORT_HOST:-$HOST}
+ local box="${SHORT_HOST:-$HOST}"
+ [[ -f ~/.box-name ]] && box="$(< ~/.box-name)"
+ echo "${box:gs/%/%%}"
}
-
PROMPT="╭─%{$FG[040]%}%n%{$reset_color%} %{$FG[239]%}at%{$reset_color%} %{$FG[033]%}$(box_name)%{$reset_color%} %{$FG[239]%}in%{$reset_color%} %{$terminfo[bold]$FG[226]%}%~%{$reset_color%}\$(git_prompt_info)\$(ruby_prompt_info) %D - %*
╰─\$(virtualenv_info)\$(prompt_char) "
diff --git a/themes/fino.zsh-theme b/themes/fino.zsh-theme
index 2523c1776..9365a3c42 100644
--- a/themes/fino.zsh-theme
+++ b/themes/fino.zsh-theme
@@ -21,7 +21,9 @@ function prompt_char {
}
function box_name {
- [ -f ~/.box-name ] && cat ~/.box-name || echo ${SHORT_HOST:-$HOST}
+ local box="${SHORT_HOST:-$HOST}"
+ [[ -f ~/.box-name ]] && box="$(< ~/.box-name)"
+ echo "${box:gs/%/%%}"
}
local ruby_env='$(ruby_prompt_info)'
diff --git a/themes/jonathan.zsh-theme b/themes/jonathan.zsh-theme
index 2f0e77431..e8c490884 100644
--- a/themes/jonathan.zsh-theme
+++ b/themes/jonathan.zsh-theme
@@ -1,153 +1,124 @@
-functions rbenv_prompt_info >& /dev/null || rbenv_prompt_info(){}
-
function theme_precmd {
- local TERMWIDTH
- (( TERMWIDTH = ${COLUMNS} - 1 ))
+ local TERMWIDTH=$(( COLUMNS - ${ZLE_RPROMPT_INDENT:-1} ))
+ PR_FILLBAR=""
+ PR_PWDLEN=""
- ###
- # Truncate the path if it's too long.
-
- PR_FILLBAR=""
- PR_PWDLEN=""
-
- local promptsize=${#${(%):---(%n@%m:%l)---()--}}
- local rubyprompt=`rvm_prompt_info || rbenv_prompt_info`
- local rubypromptsize=${#${rubyprompt}}
- local pwdsize=${#${(%):-%~}}
-
- if [[ "$promptsize + $rubypromptsize + $pwdsize" -gt $TERMWIDTH ]]; then
- ((PR_PWDLEN=$TERMWIDTH - $promptsize))
- else
- PR_FILLBAR="\${(l.(($TERMWIDTH - ($promptsize + $rubypromptsize + $pwdsize)))..${PR_HBAR}.)}"
- fi
+ local promptsize=${#${(%):---(%n@%m:%l)---()--}}
+ local rubypromptsize=${#${(%)$(ruby_prompt_info)}}
+ local pwdsize=${#${(%):-%~}}
+ # Truncate the path if it's too long.
+ if (( promptsize + rubypromptsize + pwdsize > TERMWIDTH )); then
+ (( PR_PWDLEN = TERMWIDTH - promptsize ))
+ elif [[ "${langinfo[CODESET]}" = UTF-8 ]]; then
+ PR_FILLBAR="\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize) ))::${PR_HBAR}:)}"
+ else
+ PR_FILLBAR="${PR_SHIFT_IN}\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize) ))::${altchar[q]:--}:)}${PR_SHIFT_OUT}"
+ fi
}
-
-setopt extended_glob
-theme_preexec () {
- if [[ "$TERM" == "screen" ]]; then
- local CMD=${1[(wr)^(*=*|sudo|-*)]}
- echo -n "\ek$CMD\e\\"
- fi
+function theme_preexec {
+ setopt local_options extended_glob
+ if [[ "$TERM" = "screen" ]]; then
+ local CMD=${1[(wr)^(*=*|sudo|-*)]}
+ echo -n "\ek$CMD\e\\"
+ fi
}
-
-setprompt () {
- ###
- # Need this so the prompt will work.
-
- setopt prompt_subst
-
-
- ###
- # See if we can use colors.
-
- autoload zsh/terminfo
- for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE GREY; do
- eval PR_$color='%{$terminfo[bold]$fg[${(L)color}]%}'
- eval PR_LIGHT_$color='%{$fg[${(L)color}]%}'
- (( count = $count + 1 ))
- done
- PR_NO_COLOUR="%{$terminfo[sgr0]%}"
-
- ###
- # Modify Git prompt
- ZSH_THEME_GIT_PROMPT_PREFIX=" on %{$fg[green]%}"
- ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
- ZSH_THEME_GIT_PROMPT_DIRTY=""
- ZSH_THEME_GIT_PROMPT_CLEAN=""
-
- ZSH_THEME_GIT_PROMPT_ADDED="%{$fg[green]%} ✚"
- ZSH_THEME_GIT_PROMPT_MODIFIED="%{$fg[blue]%} ✹"
- ZSH_THEME_GIT_PROMPT_DELETED="%{$fg[red]%} ✖"
- ZSH_THEME_GIT_PROMPT_RENAMED="%{$fg[magenta]%} ➜"
- ZSH_THEME_GIT_PROMPT_UNMERGED="%{$fg[yellow]%} ═"
- ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[cyan]%} ✭"
-
- ###
- # See if we can use extended characters to look nicer.
- # UTF-8 Fixed
-
- if [[ $(locale charmap) == "UTF-8" ]]; then
- PR_SET_CHARSET=""
- PR_SHIFT_IN=""
- PR_SHIFT_OUT=""
- PR_HBAR="─"
- PR_ULCORNER="┌"
- PR_LLCORNER="└"
- PR_LRCORNER="┘"
- PR_URCORNER="┐"
- else
- typeset -A altchar
- set -A altchar ${(s..)terminfo[acsc]}
- # Some stuff to help us draw nice lines
- PR_SET_CHARSET="%{$terminfo[enacs]%}"
- PR_SHIFT_IN="%{$terminfo[smacs]%}"
- PR_SHIFT_OUT="%{$terminfo[rmacs]%}"
- PR_HBAR='$PR_SHIFT_IN${altchar[q]:--}$PR_SHIFT_OUT'
- PR_ULCORNER='$PR_SHIFT_IN${altchar[l]:--}$PR_SHIFT_OUT'
- PR_LLCORNER='$PR_SHIFT_IN${altchar[m]:--}$PR_SHIFT_OUT'
- PR_LRCORNER='$PR_SHIFT_IN${altchar[j]:--}$PR_SHIFT_OUT'
- PR_URCORNER='$PR_SHIFT_IN${altchar[k]:--}$PR_SHIFT_OUT'
- fi
-
-
- ###
- # Decide if we need to set titlebar text.
-
- case $TERM in
- xterm*)
- PR_TITLEBAR=$'%{\e]0;%(!.-=*[ROOT]*=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\a%}'
- ;;
- screen)
- PR_TITLEBAR=$'%{\e_screen \005 (\005t) | %(!.-=[ROOT]=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\e\\%}'
- ;;
- *)
- PR_TITLEBAR=''
- ;;
- esac
-
-
- ###
- # Decide whether to set a screen title
- if [[ "$TERM" == "screen" ]]; then
- PR_STITLE=$'%{\ekzsh\e\\%}'
- else
- PR_STITLE=''
- fi
-
-
- ###
- # Finally, the prompt.
-
- PROMPT='$PR_SET_CHARSET$PR_STITLE${(e)PR_TITLEBAR}\
-$PR_CYAN$PR_ULCORNER$PR_HBAR$PR_GREY(\
-$PR_GREEN%$PR_PWDLEN<...<%~%<<\
-$PR_GREY)`rvm_prompt_info || rbenv_prompt_info`$PR_CYAN$PR_HBAR$PR_HBAR${(e)PR_FILLBAR}$PR_HBAR$PR_GREY(\
-$PR_CYAN%(!.%SROOT%s.%n)$PR_GREY@$PR_GREEN%m:%l\
-$PR_GREY)$PR_CYAN$PR_HBAR$PR_URCORNER\
-
-$PR_CYAN$PR_LLCORNER$PR_BLUE$PR_HBAR(\
-$PR_YELLOW%D{%H:%M:%S}\
-$PR_LIGHT_BLUE%{$reset_color%}`git_prompt_info``git_prompt_status`$PR_BLUE)$PR_CYAN$PR_HBAR\
-$PR_HBAR\
->$PR_NO_COLOUR '
-
- # display exitcode on the right when >0
- return_code="%(?..%{$fg[red]%}%? ↵ %{$reset_color%})"
- RPROMPT=' $return_code$PR_CYAN$PR_HBAR$PR_BLUE$PR_HBAR\
-($PR_YELLOW%D{%a,%b%d}$PR_BLUE)$PR_HBAR$PR_CYAN$PR_LRCORNER$PR_NO_COLOUR'
-
- PS2='$PR_CYAN$PR_HBAR\
-$PR_BLUE$PR_HBAR(\
-$PR_LIGHT_GREEN%_$PR_BLUE)$PR_HBAR\
-$PR_CYAN$PR_HBAR$PR_NO_COLOUR '
-}
-
-setprompt
-
autoload -U add-zsh-hook
add-zsh-hook precmd theme_precmd
add-zsh-hook preexec theme_preexec
+
+
+# Set the prompt
+
+# Need this so the prompt will work.
+setopt prompt_subst
+
+# See if we can use colors.
+autoload zsh/terminfo
+for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE GREY; do
+ typeset -g PR_$color="%{$terminfo[bold]$fg[${(L)color}]%}"
+ typeset -g PR_LIGHT_$color="%{$fg[${(L)color}]%}"
+done
+PR_NO_COLOUR="%{$terminfo[sgr0]%}"
+
+# Modify Git prompt
+ZSH_THEME_GIT_PROMPT_PREFIX=" on %{$fg[green]%}"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIRTY=""
+ZSH_THEME_GIT_PROMPT_CLEAN=""
+
+ZSH_THEME_GIT_PROMPT_ADDED="%{$fg[green]%} %{%G✚%}"
+ZSH_THEME_GIT_PROMPT_MODIFIED="%{$fg[blue]%} %{%G✹%}"
+ZSH_THEME_GIT_PROMPT_DELETED="%{$fg[red]%} %{%G✖%}"
+ZSH_THEME_GIT_PROMPT_RENAMED="%{$fg[magenta]%} %{%G➜%}"
+ZSH_THEME_GIT_PROMPT_UNMERGED="%{$fg[yellow]%} %{%G═%}"
+ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[cyan]%} %{%G✭%}"
+
+# Use extended characters to look nicer if supported.
+if [[ "${langinfo[CODESET]}" = UTF-8 ]]; then
+ PR_SET_CHARSET=""
+ PR_HBAR="─"
+ PR_ULCORNER="┌"
+ PR_LLCORNER="└"
+ PR_LRCORNER="┘"
+ PR_URCORNER="┐"
+else
+ typeset -g -A altchar
+ set -A altchar ${(s..)terminfo[acsc]}
+ # Some stuff to help us draw nice lines
+ PR_SET_CHARSET="%{$terminfo[enacs]%}"
+ PR_SHIFT_IN="%{$terminfo[smacs]%}"
+ PR_SHIFT_OUT="%{$terminfo[rmacs]%}"
+ PR_HBAR="${PR_SHIFT_IN}${altchar[q]:--}${PR_SHIFT_OUT}"
+ PR_ULCORNER="${PR_SHIFT_IN}${altchar[l]:--}${PR_SHIFT_OUT}"
+ PR_LLCORNER="${PR_SHIFT_IN}${altchar[m]:--}${PR_SHIFT_OUT}"
+ PR_LRCORNER="${PR_SHIFT_IN}${altchar[j]:--}${PR_SHIFT_OUT}"
+ PR_URCORNER="${PR_SHIFT_IN}${altchar[k]:--}${PR_SHIFT_OUT}"
+fi
+
+# Decide if we need to set titlebar text.
+case $TERM in
+ xterm*)
+ PR_TITLEBAR=$'%{\e]0;%(!.-=*[ROOT]*=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\a%}'
+ ;;
+ screen)
+ PR_TITLEBAR=$'%{\e_screen \005 (\005t) | %(!.-=[ROOT]=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\e\\%}'
+ ;;
+ *)
+ PR_TITLEBAR=""
+ ;;
+esac
+
+# Decide whether to set a screen title
+if [[ "$TERM" = "screen" ]]; then
+ PR_STITLE=$'%{\ekzsh\e\\%}'
+else
+ PR_STITLE=""
+fi
+
+# Finally, the prompt.
+PROMPT='${PR_SET_CHARSET}${PR_STITLE}${(e)PR_TITLEBAR}\
+${PR_CYAN}${PR_ULCORNER}${PR_HBAR}${PR_GREY}(\
+${PR_GREEN}%${PR_PWDLEN}<...<%~%<<\
+${PR_GREY})$(ruby_prompt_info)${PR_CYAN}${PR_HBAR}${PR_HBAR}${(e)PR_FILLBAR}${PR_HBAR}${PR_GREY}(\
+${PR_CYAN}%(!.%SROOT%s.%n)${PR_GREY}@${PR_GREEN}%m:%l\
+${PR_GREY})${PR_CYAN}${PR_HBAR}${PR_URCORNER}\
+
+${PR_CYAN}${PR_LLCORNER}${PR_BLUE}${PR_HBAR}(\
+${PR_YELLOW}%D{%H:%M:%S}\
+${PR_LIGHT_BLUE}%{$reset_color%}$(git_prompt_info)$(git_prompt_status)${PR_BLUE})${PR_CYAN}${PR_HBAR}\
+${PR_HBAR}\
+>${PR_NO_COLOUR} '
+
+# display exitcode on the right when > 0
+return_code="%(?..%{$fg[red]%}%? ↵ %{$reset_color%})"
+RPROMPT=' $return_code${PR_CYAN}${PR_HBAR}${PR_BLUE}${PR_HBAR}\
+(${PR_YELLOW}%D{%a,%b%d}${PR_BLUE})${PR_HBAR}${PR_CYAN}${PR_LRCORNER}${PR_NO_COLOUR}'
+
+PS2='${PR_CYAN}${PR_HBAR}\
+${PR_BLUE}${PR_HBAR}(\
+${PR_LIGHT_GREEN}%_${PR_BLUE})${PR_HBAR}\
+${PR_CYAN}${PR_HBAR}${PR_NO_COLOUR} '
diff --git a/themes/josh.zsh-theme b/themes/josh.zsh-theme
index c8f0f4dd7..ea051c58e 100644
--- a/themes/josh.zsh-theme
+++ b/themes/josh.zsh-theme
@@ -10,7 +10,7 @@ function josh_prompt {
prompt=" "
branch=$(git_current_branch)
- ruby_version=$(rvm_prompt_info || rbenv_prompt_info)
+ ruby_version=$(ruby_prompt_info)
path_size=${#PWD}
branch_size=${#branch}
ruby_size=${#ruby_version}
@@ -31,7 +31,7 @@ function josh_prompt {
prompt=" $prompt"
done
- prompt="%{%F{green}%}$PWD$prompt%{%F{red}%}$(rvm_prompt_info || rbenv_prompt_info)%{$reset_color%} $(git_current_branch)"
+ prompt="%{%F{green}%}$PWD$prompt%{%F{red}%}$(ruby_prompt_info)%{$reset_color%} $(git_current_branch)"
echo $prompt
}
diff --git a/themes/minimal.zsh-theme b/themes/minimal.zsh-theme
index e05df9c9b..588ab6982 100644
--- a/themes/minimal.zsh-theme
+++ b/themes/minimal.zsh-theme
@@ -2,23 +2,25 @@ ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[white]%}["
ZSH_THEME_GIT_PROMPT_SUFFIX=""
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}●%{$fg[white]%}]%{$reset_color%} "
ZSH_THEME_GIT_PROMPT_CLEAN="]%{$reset_color%} "
-ZSH_THEME_SVN_PROMPT_PREFIX=$ZSH_THEME_GIT_PROMPT_PREFIX
-ZSH_THEME_SVN_PROMPT_SUFFIX=$ZSH_THEME_GIT_PROMPT_SUFFIX
-ZSH_THEME_SVN_PROMPT_DIRTY=$ZSH_THEME_GIT_PROMPT_DIRTY
-ZSH_THEME_SVN_PROMPT_CLEAN=$ZSH_THEME_GIT_PROMPT_CLEAN
-ZSH_THEME_HG_PROMPT_PREFIX=$ZSH_THEME_GIT_PROMPT_PREFIX
-ZSH_THEME_HG_PROMPT_SUFFIX=$ZSH_THEME_GIT_PROMPT_SUFFIX
-ZSH_THEME_HG_PROMPT_DIRTY=$ZSH_THEME_GIT_PROMPT_DIRTY
-ZSH_THEME_HG_PROMPT_CLEAN=$ZSH_THEME_GIT_PROMPT_CLEAN
+
+ZSH_THEME_SVN_PROMPT_PREFIX="$ZSH_THEME_GIT_PROMPT_PREFIX"
+ZSH_THEME_SVN_PROMPT_SUFFIX="$ZSH_THEME_GIT_PROMPT_SUFFIX"
+ZSH_THEME_SVN_PROMPT_DIRTY="$ZSH_THEME_GIT_PROMPT_DIRTY"
+ZSH_THEME_SVN_PROMPT_CLEAN="$ZSH_THEME_GIT_PROMPT_CLEAN"
+
+ZSH_THEME_HG_PROMPT_PREFIX="$ZSH_THEME_GIT_PROMPT_PREFIX"
+ZSH_THEME_HG_PROMPT_SUFFIX="$ZSH_THEME_GIT_PROMPT_SUFFIX"
+ZSH_THEME_HG_PROMPT_DIRTY="$ZSH_THEME_GIT_PROMPT_DIRTY"
+ZSH_THEME_HG_PROMPT_CLEAN="$ZSH_THEME_GIT_PROMPT_CLEAN"
vcs_status() {
- if [[ $(whence in_svn) != "" ]] && in_svn; then
- svn_prompt_info
- elif [[ $(whence in_hg) != "" ]] && in_hg; then
- hg_prompt_info
- else
- git_prompt_info
- fi
+ if (( ${+functions[in_svn]} )) && in_svn; then
+ svn_prompt_info
+ elif (( ${+functions[in_hg]} )) && in_hg; then
+ hg_prompt_info
+ else
+ git_prompt_info
+ fi
}
PROMPT='%2~ $(vcs_status)»%b '
diff --git a/themes/murilasso.zsh-theme b/themes/murilasso.zsh-theme
index bc2b9b224..d46874c54 100644
--- a/themes/murilasso.zsh-theme
+++ b/themes/murilasso.zsh-theme
@@ -1,7 +1,7 @@
local return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})"
local user_host='%{$terminfo[bold]$fg[green]%}%n@%m%{$reset_color%}'
local current_dir='%{$terminfo[bold]$fg[blue]%}%~%{$reset_color%}'
-local rvm_ruby='%{$fg[red]%}$(rvm_prompt_info || rbenv_prompt_info)%{$reset_color%}'
+local rvm_ruby='%{$fg[red]%}$(ruby_prompt_info)%{$reset_color%}'
local git_branch='%{$fg[blue]%}$(git_prompt_info)%{$reset_color%}'
PROMPT="${user_host}:${current_dir} ${rvm_ruby}
diff --git a/themes/nicoulaj.zsh-theme b/themes/nicoulaj.zsh-theme
index 333aa5e70..685cd1ade 100644
--- a/themes/nicoulaj.zsh-theme
+++ b/themes/nicoulaj.zsh-theme
@@ -6,7 +6,7 @@
# * Only shows the path on the left prompt by default.
# * Crops the path to a defined length and only shows the path relative to
# the current VCS repository root.
-# * Wears a different color wether the last command succeeded/failed.
+# * Wears a different color whether the last command succeeded/failed.
# * Shows user@hostname if connected through SSH.
# * Shows if logged in as root or not.
# ------------------------------------------------------------------------------
diff --git a/themes/random.zsh-theme b/themes/random.zsh-theme
index f0b8e5c18..28af84e23 100644
--- a/themes/random.zsh-theme
+++ b/themes/random.zsh-theme
@@ -42,6 +42,6 @@ else
return 1
fi
-if [[ -z "$ZSH_THEME_RANDOM_QUIET" ]]; then
+if [[ "$ZSH_THEME_RANDOM_QUIET" != true ]]; then
echo "[oh-my-zsh] Random theme '${RANDOM_THEME}' loaded"
fi
diff --git a/themes/simonoff.zsh-theme b/themes/simonoff.zsh-theme
index ef91c5ee3..287781d9e 100644
--- a/themes/simonoff.zsh-theme
+++ b/themes/simonoff.zsh-theme
@@ -1,130 +1,95 @@
-# Prompt
-#
-# Below are the color init strings for the basic file types. A color init
-# string consists of one or more of the following numeric codes:
-# Attribute codes:
-# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
-# Text color codes:
-# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
-# Background color codes:
-# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
-function precmd {
+function theme_precmd {
+ PR_FILLBAR=""
+ PR_PWDLEN=""
- local TERMWIDTH
- (( TERMWIDTH = ${COLUMNS} - 1 ))
+ local promptsize=${#${(%):--(%n@%M:)--(%l)-}}
+ local pwdsize=${#${(%):-%~}}
+ local gitbranchsize="${#${(%)$(git_prompt_info)}:-}"
+ local rvmpromptsize="${#${(%)$(ruby_prompt_info):-}}"
-
- ###
- # Truncate the path if it's too long.
-
- PR_FILLBAR=""
- PR_PWDLEN=""
-
- local promptsize=${#${(%):---(%n@%M:%l)---()}}
- local pwdsize=${#${(%):-%~}}
- local gitbranch="$(git_prompt_info)"
- local rvmprompt="$(ruby_prompt_info)"
- local gitbranchsize=${#${gitbranch:-''}}
- local rvmpromptsize=${#${rvmprompt:-''}}
-
- if [[ "$promptsize + $pwdsize + $rvmpromptsize + $gitbranchsize" -gt $TERMWIDTH ]]; then
- ((PR_PWDLEN=$TERMWIDTH - $promptsize))
- else
- PR_FILLBAR="\${(l.(($TERMWIDTH - ($promptsize + $pwdsize + $rvmpromptsize + $gitbranchsize)))..${PR_SPACE}.)}"
- fi
+ # Truncate the path if it's too long.
+ if (( promptsize + pwdsize + rvmpromptsize + gitbranchsize > COLUMNS )); then
+ (( PR_PWDLEN = COLUMNS - promptsize ))
+ else
+ PR_FILLBAR="\${(l.$(( COLUMNS - (promptsize + pwdsize + rvmpromptsize + gitbranchsize) ))..${PR_SPACE}.)}"
+ fi
}
+function theme_preexec {
+ setopt local_options extended_glob
+ if [[ "$TERM" == "screen" ]]; then
+ local CMD=${1[(wr)^(*=*|sudo|-*)]}
+ echo -n "\ek$CMD\e\\"
+ fi
-setopt extended_glob
+ if [[ "$TERM" == "xterm" ]]; then
+ print -Pn "\e]0;$1\a"
+ fi
-preexec () {
- if [[ "$TERM" == "screen" ]]; then
- local CMD=${1[(wr)^(*=*|sudo|-*)]}
- echo -n "\ek$CMD\e\\"
- fi
-
- if [[ "$TERM" == "xterm" ]]; then
- print -Pn "\e]0;$1\a"
- fi
-
- if [[ "$TERM" == "rxvt" ]]; then
- print -Pn "\e]0;$1\a"
- fi
+ if [[ "$TERM" == "rxvt" ]]; then
+ print -Pn "\e]0;$1\a"
+ fi
}
-setprompt () {
-###
+autoload -U add-zsh-hook
+add-zsh-hook precmd theme_precmd
+add-zsh-hook preexec theme_preexec
+
+
+# Set the prompt
+
# Need this so the prompt will work.
+setopt prompt_subst
- setopt prompt_subst
-
-
-###
# See if we can use colors.
+autoload zsh/terminfo
+for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE GREY; do
+ typeset -g PR_$color="%{$terminfo[bold]$fg[${(L)color}]%}"
+ typeset -g PR_LIGHT_$color="%{$fg[${(L)color}]%}"
+done
+PR_NO_COLOUR="%{$terminfo[sgr0]%}"
- autoload zsh/terminfo
- for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
- eval PR_$color='%{$terminfo[bold]$fg[${(L)color}]%}'
- eval PR_LIGHT_$color='%{$fg[${(L)color}]%}'
- (( count = $count + 1 ))
- done
- PR_NO_COLOUR="%{$terminfo[sgr0]%}"
+# Use extended characters to look nicer
+PR_HBAR="-"
+PR_ULCORNER="-"
+PR_LLCORNER="-"
+PR_LRCORNER="-"
+PR_URCORNER="-"
+# Modify Git prompt
+ZSH_THEME_GIT_PROMPT_PREFIX=" ["
+ZSH_THEME_GIT_PROMPT_SUFFIX="]"
-###
-# See if we can use extended characters to look nicer.
+# Modify RVM prompt
+ZSH_THEME_RUBY_PROMPT_PREFIX=" ["
+ZSH_THEME_RUBY_PROMPT_SUFFIX="]"
- typeset -A altchar
-# set -A altchar "${(s..)terminfo[acsc]}"
- PR_SET_CHARSET="%{$terminfo[enacs]%}"
- PR_HBAR=${altchar[q]:--}
- PR_ULCORNER=${altchar[l]:--}
- PR_LLCORNER=${altchar[m]:--}
- PR_LRCORNER=${altchar[j]:--}
- PR_URCORNER=${altchar[k]:--}
-
- ###
- # Modify Git prompt
- ZSH_THEME_GIT_PROMPT_PREFIX=" ["
- ZSH_THEME_GIT_PROMPT_SUFFIX="]"
- ###
- # Modify RVM prompt
- ZSH_THEME_RUBY_PROMPT_PREFIX=" ["
- ZSH_THEME_RUBY_PROMPT_SUFFIX="]"
-
-
-###
# Decide if we need to set titlebar text.
+case $TERM in
+ xterm*|*rxvt*)
+ PR_TITLEBAR=$'%{\e]0;%(!.-=*[ROOT]*=- | .)%n@%M:%~ $(git_prompt_info) $(ruby_prompt_info) | ${COLUMNS}x${LINES} | %y\a%}'
+ ;;
+ screen)
+ PR_TITLEBAR=$'%{\e_screen \005 (\005t) | %(!.-=[ROOT]=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\e\\%}'
+ ;;
+ *)
+ PR_TITLEBAR=""
+ ;;
+esac
- case $TERM in
- xterm*|*rxvt*)
- PR_TITLEBAR=$'%{\e]0;%(!.-=*[ROOT]*=- | .)%n@%M:%~ $(git_prompt_info) $(rvm_prompt_info) | ${COLUMNS}x${LINES} | %y\a%}'
- ;;
- screen)
- PR_TITLEBAR=$'%{\e_screen \005 (\005t) | %(!.-=[ROOT]=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\e\\%}'
- ;;
- *)
- PR_TITLEBAR=''
- ;;
- esac
-
-
-###
# Decide whether to set a screen title
- if [[ "$TERM" == "screen" ]]; then
- PR_STITLE=$'%{\ekzsh\e\\%}'
- else
- PR_STITLE=''
- fi
+if [[ "$TERM" == "screen" ]]; then
+ PR_STITLE=$'%{\ekzsh\e\\%}'
+else
+ PR_STITLE=""
+fi
-###
# Finally, the prompt.
-#
- PROMPT='$PR_SET_CHARSET$PR_STITLE${(e)PR_TITLEBAR}\
+PROMPT='$PR_SET_CHARSET$PR_STITLE${(e)PR_TITLEBAR}\
$PR_RED$PR_HBAR<\
-$PR_BLUE%(!.$PR_RED%SROOT%s.%n)$PR_GREEN@$PR_BLUE%M:$PR_GREEN%$PR_PWDLEN<...<%~$PR_CYAN$(git_prompt_info)$(rvm_prompt_info)\
-$PR_RED>$PR_HBAR$PR_SPACE${(e)PR_FILLBAR}\
+$PR_BLUE%(!.$PR_RED%SROOT%s.%n)$PR_GREEN@$PR_BLUE%M:$PR_GREEN%$PR_PWDLEN<...<%~$PR_CYAN$(git_prompt_info)$(ruby_prompt_info)\
+$PR_RED>$PR_HBAR${(e)PR_FILLBAR}\
$PR_RED$PR_HBAR<\
$PR_GREEN%l$PR_RED>$PR_HBAR\
@@ -132,7 +97,3 @@ $PR_RED$PR_HBAR<\
%(?..$PR_LIGHT_RED%?$PR_BLUE:)\
$PR_LIGHT_BLUE%(!.$PR_RED.$PR_WHITE)%#$PR_RED>$PR_HBAR\
$PR_NO_COLOUR '
-
-}
-
-setprompt
diff --git a/themes/simple.zsh-theme b/themes/simple.zsh-theme
index 8d0070ba7..bcdecc1a5 100644
--- a/themes/simple.zsh-theme
+++ b/themes/simple.zsh-theme
@@ -1,6 +1,6 @@
-PROMPT='%(!.%{$fg[red]%}.%{$fg[green]%})%~%{$fg_bold[blue]%}$(git_prompt_info)%{$reset_color%} '
+PROMPT='%(!.%{$fg[red]%}.%{$fg[green]%})%~$(git_prompt_info)%{$reset_color%} '
-ZSH_THEME_GIT_PROMPT_PREFIX="("
-ZSH_THEME_GIT_PROMPT_SUFFIX=")"
-ZSH_THEME_GIT_PROMPT_DIRTY=" ✗"
-ZSH_THEME_GIT_PROMPT_CLEAN=" ✔"
+ZSH_THEME_GIT_PROMPT_PREFIX=" %{$fg_bold[blue]%}("
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$fg_bold[blue]%})"
+ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg[red]%}✗"
+ZSH_THEME_GIT_PROMPT_CLEAN=" %{$fg[green]%}✔"
diff --git a/themes/smt.zsh-theme b/themes/smt.zsh-theme
index 7f54472c6..52e6d9a21 100644
--- a/themes/smt.zsh-theme
+++ b/themes/smt.zsh-theme
@@ -40,7 +40,7 @@ function git_time_since_commit() {
local last_commit seconds_since_last_commit
# Only proceed if there is actually a commit
- if ! last_commit=$(command git log --pretty=format:'%at' -1 2>/dev/null); then
+ if ! last_commit=$(command git -c log.showSignature=false log --pretty=format:'%at' -1 2>/dev/null); then
echo "[$ZSH_THEME_GIT_TIME_SINCE_COMMIT_NEUTRAL~%{$reset_color%}]"
return
fi
diff --git a/themes/trapd00r.zsh-theme b/themes/trapd00r.zsh-theme
index 4e3238393..849daf30b 100644
--- a/themes/trapd00r.zsh-theme
+++ b/themes/trapd00r.zsh-theme
@@ -38,6 +38,8 @@ local c13=$'\e[38;5;196m\e[1m'
zsh_path() {
+ setopt localoptions nopromptsubst
+
local colors
colors=$(echoti colors)
diff --git a/themes/wedisagree.zsh-theme b/themes/wedisagree.zsh-theme
index 07006ecd9..e9e9d6ef8 100644
--- a/themes/wedisagree.zsh-theme
+++ b/themes/wedisagree.zsh-theme
@@ -69,9 +69,7 @@ function rvm_gemset() {
function git_time_since_commit() {
if git rev-parse --git-dir > /dev/null 2>&1; then
# Only proceed if there is actually a commit.
- if [[ $(git log 2>&1 > /dev/null | grep -c "^fatal: bad default revision") == 0 ]]; then
- # Get the last commit.
- last_commit=`git log --pretty=format:'%at' -1 2> /dev/null`
+ if last_commit=`git -c log.showSignature=false log --pretty=format:'%at' -1 2> /dev/null`; then
now=`date +%s`
seconds_since_last_commit=$((now-last_commit))
diff --git a/themes/ys.zsh-theme b/themes/ys.zsh-theme
index 251b48827..5ef500e14 100644
--- a/themes/ys.zsh-theme
+++ b/themes/ys.zsh-theme
@@ -5,10 +5,8 @@
#
# Mar 2013 Yad Smood
-typeset +H my_gray="$FG[247]"
-
# VCS
-YS_VCS_PROMPT_PREFIX1=" %{$my_gray%}on%{$reset_color%} "
+YS_VCS_PROMPT_PREFIX1=" %{$reset_color%}on%{$fg[blue]%} "
YS_VCS_PROMPT_PREFIX2=":%{$fg[cyan]%}"
YS_VCS_PROMPT_SUFFIX="%{$reset_color%}"
YS_VCS_PROMPT_DIRTY=" %{$fg[red]%}x"
@@ -21,6 +19,13 @@ ZSH_THEME_GIT_PROMPT_SUFFIX="$YS_VCS_PROMPT_SUFFIX"
ZSH_THEME_GIT_PROMPT_DIRTY="$YS_VCS_PROMPT_DIRTY"
ZSH_THEME_GIT_PROMPT_CLEAN="$YS_VCS_PROMPT_CLEAN"
+# SVN info
+local svn_info='$(svn_prompt_info)'
+ZSH_THEME_SVN_PROMPT_PREFIX="${YS_VCS_PROMPT_PREFIX1}svn${YS_VCS_PROMPT_PREFIX2}"
+ZSH_THEME_SVN_PROMPT_SUFFIX="$YS_VCS_PROMPT_SUFFIX"
+ZSH_THEME_SVN_PROMPT_DIRTY="$YS_VCS_PROMPT_DIRTY"
+ZSH_THEME_SVN_PROMPT_CLEAN="$YS_VCS_PROMPT_CLEAN"
+
# HG info
local hg_info='$(ys_hg_prompt_info)'
ys_hg_prompt_info() {
@@ -62,13 +67,14 @@ local exit_code="%(?,,C:%{$fg[red]%}%?%{$reset_color%})"
PROMPT="
%{$terminfo[bold]$fg[blue]%}#%{$reset_color%} \
%(#,%{$bg[yellow]%}%{$fg[black]%}%n%{$reset_color%},%{$fg[cyan]%}%n) \
-%{$my_gray%}@ \
+%{$reset_color%}@ \
%{$fg[green]%}%m \
-%{$my_gray%}in \
+%{$reset_color%}in \
%{$terminfo[bold]$fg[yellow]%}%~%{$reset_color%}\
${hg_info}\
${git_info}\
+${svn_info}\
${venv_info}\
\
-%{$my_gray%}[%*] $exit_code
+[%*] $exit_code
%{$terminfo[bold]$fg[red]%}$ %{$reset_color%}"
diff --git a/tools/changelog.sh b/tools/changelog.sh
index 664f34608..49532a4a4 100755
--- a/tools/changelog.sh
+++ b/tools/changelog.sh
@@ -395,12 +395,12 @@ function main {
# Get the first version name:
# 1) try tag-like version, or
- # 2) try name-rev, or
- # 3) try branch name, or
+ # 2) try branch name, or
+ # 3) try name-rev, or
# 4) try short hash
version=$(command git describe --tags $until 2>/dev/null) \
- || version=$(command git name-rev --no-undefined --name-only --exclude="remotes/*" $until 2>/dev/null) \
|| version=$(command git symbolic-ref --quiet --short $until 2>/dev/null) \
+ || version=$(command git name-rev --no-undefined --name-only --exclude="remotes/*" $until 2>/dev/null) \
|| version=$(command git rev-parse --short $until 2>/dev/null)
# Get commit list from $until commit until $since commit, or until root commit if $since is unset
@@ -414,7 +414,7 @@ function main {
# --first-parent: commits from merged branches are omitted
local SEP="0mZmAgIcSeP"
local -a raw_commits
- raw_commits=(${(0)"$(command git log -z \
+ raw_commits=(${(0)"$(command git -c log.showSignature=false log -z \
--format="%h${SEP}%D${SEP}%s${SEP}%b" --abbrev=7 \
--no-merges --first-parent $range)"})
diff --git a/tools/check_for_upgrade.sh b/tools/check_for_upgrade.sh
index a6fdf4659..3f6d35c3e 100644
--- a/tools/check_for_upgrade.sh
+++ b/tools/check_for_upgrade.sh
@@ -10,11 +10,13 @@ fi
# - auto: the update is performed automatically when it's time
# - reminder: a reminder is shown to the user when it's time to update
# - disabled: automatic update is turned off
-zstyle -s ':omz:update' mode update_mode || update_mode=prompt
+zstyle -s ':omz:update' mode update_mode || {
+ update_mode=prompt
-# Support old-style settings
-[[ "$DISABLE_UPDATE_PROMPT" != true ]] || update_mode=auto
-[[ "$DISABLE_AUTO_UPDATE" != true ]] || update_mode=disabled
+ # If the mode zstyle setting is not set, support old-style settings
+ [[ "$DISABLE_UPDATE_PROMPT" != true ]] || update_mode=auto
+ [[ "$DISABLE_AUTO_UPDATE" != true ]] || update_mode=disabled
+}
# Cancel update if:
# - the automatic update is disabled.
@@ -34,11 +36,11 @@ function current_epoch() {
function is_update_available() {
local branch
- branch=${"$(cd "$ZSH"; git config --local oh-my-zsh.branch)":-master}
+ branch=${"$(cd -q "$ZSH"; git config --local oh-my-zsh.branch)":-master}
local remote remote_url remote_repo
- remote=${"$(cd "$ZSH"; git config --local oh-my-zsh.remote)":-origin}
- remote_url=$(cd "$ZSH"; git config remote.$remote.url)
+ remote=${"$(cd -q "$ZSH"; git config --local oh-my-zsh.remote)":-origin}
+ remote_url=$(cd -q "$ZSH"; git config remote.$remote.url)
local repo
case "$remote_url" in
@@ -56,7 +58,7 @@ function is_update_available() {
# Get local HEAD. If this fails assume there are updates
local local_head
- local_head=$(cd "$ZSH"; git rev-parse $branch 2>/dev/null) || return 0
+ local_head=$(cd -q "$ZSH"; git rev-parse $branch 2>/dev/null) || return 0
# Get remote HEAD. If no suitable command is found assume there are updates
# On any other error, skip the update (connection may be down)
@@ -133,6 +135,12 @@ function update_ohmyzsh() {
return
fi
+ # Test if Oh My Zsh directory is a git repository
+ if ! (cd -q "$ZSH" && LANG= git rev-parse &>/dev/null); then
+ echo >&2 "[oh-my-zsh] Can't update: not a git repository."
+ return
+ fi
+
# Check if there are updates available before proceeding
if ! is_update_available; then
return
@@ -154,7 +162,8 @@ function update_ohmyzsh() {
[[ "$option" != $'\n' ]] && echo
case "$option" in
[yY$'\n']) update_ohmyzsh ;;
- [nN]) update_last_updated_file ;;
+ [nN]) update_last_updated_file ;&
+ *) echo "[oh-my-zsh] You can update manually by running \`omz update\`" ;;
esac
fi
}
diff --git a/tools/install.sh b/tools/install.sh
index 47166059d..34dca8413 100755
--- a/tools/install.sh
+++ b/tools/install.sh
@@ -51,11 +51,38 @@ CHSH=${CHSH:-yes}
RUNZSH=${RUNZSH:-yes}
KEEP_ZSHRC=${KEEP_ZSHRC:-no}
+# Sane defaults
+USER=${USER:-$(whoami)}
+
command_exists() {
command -v "$@" >/dev/null 2>&1
}
+user_can_sudo() {
+ # Check if sudo is installed
+ command_exists sudo || return 1
+ # The following command has 3 parts:
+ #
+ # 1. Run `sudo` with `-v`. Does the following:
+ # • with privilege: asks for a password immediately.
+ # • without privilege: exits with error code 1 and prints the message:
+ # Sorry, user may not run sudo on
+ #
+ # 2. Pass `-n` to `sudo` to tell it to not ask for a password. If the
+ # password is not required, the command will finish with exit code 0.
+ # If one is required, sudo will exit with error code 1 and print the
+ # message:
+ # sudo: a password is required
+ #
+ # 3. Check for the words "may not run sudo" in the output to really tell
+ # whether the user has privileges or not. For that we have to make sure
+ # to run `sudo` in the default locale (with `LANG=`) so that the message
+ # stays consistent regardless of the user's locale.
+ #
+ ! LANG= sudo -n -v 2>&1 | grep -q "may not run sudo"
+}
+
# The [ -t 1 ] check only works when the function is not called from
# a subshell (like in `$(...)` or `(...)`, so this hack redefines the
# function at the top level to always return false when stdout is not
@@ -127,6 +154,24 @@ supports_hyperlinks() {
return 1
}
+# Adapted from code and information by Anton Kochkov (@XVilka)
+# Source: https://gist.github.com/XVilka/8346728
+supports_truecolor() {
+ case "$COLORTERM" in
+ truecolor|24bit) return 0 ;;
+ esac
+
+ case "$TERM" in
+ iterm |\
+ tmux-truecolor |\
+ linux-truecolor |\
+ xterm-truecolor |\
+ screen-truecolor) return 0 ;;
+ esac
+
+ return 1
+}
+
fmt_link() {
# $1: text, $2: url, $3: fallback mode
if supports_hyperlinks; then
@@ -150,13 +195,34 @@ fmt_code() {
}
fmt_error() {
- printf '%sError: %s%s\n' "$BOLD$RED" "$*" "$RESET" >&2
+ printf '%sError: %s%s\n' "${FMT_BOLD}${FMT_RED}" "$*" "$FMT_RESET" >&2
}
setup_color() {
# Only use colors if connected to a terminal
- if is_tty; then
- RAINBOW="
+ if ! is_tty; then
+ FMT_RAINBOW=""
+ FMT_RED=""
+ FMT_GREEN=""
+ FMT_YELLOW=""
+ FMT_BLUE=""
+ FMT_BOLD=""
+ FMT_RESET=""
+ return
+ fi
+
+ if supports_truecolor; then
+ FMT_RAINBOW="
+ $(printf '\033[38;2;255;0;0m')
+ $(printf '\033[38;2;255;97;0m')
+ $(printf '\033[38;2;247;255;0m')
+ $(printf '\033[38;2;0;255;30m')
+ $(printf '\033[38;2;77;0;255m')
+ $(printf '\033[38;2;168;0;255m')
+ $(printf '\033[38;2;245;0;172m')
+ "
+ else
+ FMT_RAINBOW="
$(printf '\033[38;5;196m')
$(printf '\033[38;5;202m')
$(printf '\033[38;5;226m')
@@ -165,21 +231,14 @@ setup_color() {
$(printf '\033[38;5;093m')
$(printf '\033[38;5;163m')
"
- RED=$(printf '\033[31m')
- GREEN=$(printf '\033[32m')
- YELLOW=$(printf '\033[33m')
- BLUE=$(printf '\033[34m')
- BOLD=$(printf '\033[1m')
- RESET=$(printf '\033[m')
- else
- RAINBOW=""
- RED=""
- GREEN=""
- YELLOW=""
- BLUE=""
- BOLD=""
- RESET=""
fi
+
+ FMT_RED=$(printf '\033[31m')
+ FMT_GREEN=$(printf '\033[32m')
+ FMT_YELLOW=$(printf '\033[33m')
+ FMT_BLUE=$(printf '\033[34m')
+ FMT_BOLD=$(printf '\033[1m')
+ FMT_RESET=$(printf '\033[0m')
}
setup_ohmyzsh() {
@@ -190,7 +249,7 @@ setup_ohmyzsh() {
# precedence over umasks except for filesystems mounted with option "noacl".
umask g-w,o-w
- echo "${BLUE}Cloning Oh My Zsh...${RESET}"
+ echo "${FMT_BLUE}Cloning Oh My Zsh...${FMT_RESET}"
command_exists git || {
fmt_error "git is not installed"
@@ -222,14 +281,14 @@ setup_zshrc() {
# Keep most recent old .zshrc at .zshrc.pre-oh-my-zsh, and older ones
# with datestamp of installation that moved them aside, so we never actually
# destroy a user's original zshrc
- echo "${BLUE}Looking for an existing zsh config...${RESET}"
+ echo "${FMT_BLUE}Looking for an existing zsh config...${FMT_RESET}"
# Must use this exact name so uninstall.sh can find it
OLD_ZSHRC=~/.zshrc.pre-oh-my-zsh
if [ -f ~/.zshrc ] || [ -h ~/.zshrc ]; then
# Skip this if the user doesn't want to replace an existing .zshrc
if [ "$KEEP_ZSHRC" = yes ]; then
- echo "${YELLOW}Found ~/.zshrc.${RESET} ${GREEN}Keeping...${RESET}"
+ echo "${FMT_YELLOW}Found ~/.zshrc.${FMT_RESET} ${FMT_GREEN}Keeping...${FMT_RESET}"
return
fi
if [ -e "$OLD_ZSHRC" ]; then
@@ -241,18 +300,18 @@ setup_zshrc() {
fi
mv "$OLD_ZSHRC" "${OLD_OLD_ZSHRC}"
- echo "${YELLOW}Found old ~/.zshrc.pre-oh-my-zsh." \
- "${GREEN}Backing up to ${OLD_OLD_ZSHRC}${RESET}"
+ echo "${FMT_YELLOW}Found old ~/.zshrc.pre-oh-my-zsh." \
+ "${FMT_GREEN}Backing up to ${OLD_OLD_ZSHRC}${FMT_RESET}"
fi
- echo "${YELLOW}Found ~/.zshrc.${RESET} ${GREEN}Backing up to ${OLD_ZSHRC}${RESET}"
+ echo "${FMT_YELLOW}Found ~/.zshrc.${FMT_RESET} ${FMT_GREEN}Backing up to ${OLD_ZSHRC}${FMT_RESET}"
mv ~/.zshrc "$OLD_ZSHRC"
fi
- echo "${GREEN}Using the Oh My Zsh template file and adding it to ~/.zshrc.${RESET}"
+ echo "${FMT_GREEN}Using the Oh My Zsh template file and adding it to ~/.zshrc.${FMT_RESET}"
- sed "/^export ZSH=/ c\\
-export ZSH=\"$ZSH\"
-" "$ZSH/templates/zshrc.zsh-template" > ~/.zshrc-omztemp
+ # Replace $HOME path with '$HOME' in $ZSH variable in .zshrc file
+ omz=$(echo "$ZSH" | sed "s|^$HOME/|\$HOME/|")
+ sed "s|^export ZSH=.*$|export ZSH=\"${omz}\"|" "$ZSH/templates/zshrc.zsh-template" > ~/.zshrc-omztemp
mv -f ~/.zshrc-omztemp ~/.zshrc
echo
@@ -273,19 +332,19 @@ setup_shell() {
if ! command_exists chsh; then
cat < ~/.shell.pre-oh-my-zsh
else
- grep "^$USERNAME:" /etc/passwd | awk -F: '{print $7}' > ~/.shell.pre-oh-my-zsh
+ grep "^$USER:" /etc/passwd | awk -F: '{print $7}' > ~/.shell.pre-oh-my-zsh
fi
- # Actually change the default shell to zsh
- if ! chsh -s "$zsh"; then
+ echo "Changing your shell to $zsh..."
+
+ # Check if user has sudo privileges to run `chsh` with or without `sudo`
+ #
+ # This allows the call to succeed without password on systems where the
+ # user does not have a password but does have sudo privileges, like in
+ # Google Cloud Shell.
+ #
+ # On systems that don't have a user with passwordless sudo, the user will
+ # be prompted for the password either way, so this shouldn't cause any issues.
+ #
+ if user_can_sudo; then
+ sudo -k chsh -s "$zsh" "$USER" # -k forces the password prompt
+ else
+ chsh -s "$zsh" "$USER" # run chsh normally
+ fi
+
+ # Check if the shell change was successful
+ if [ $? -ne 0 ]; then
fmt_error "chsh command unsuccessful. Change your default shell manually."
else
export SHELL="$zsh"
- echo "${GREEN}Shell successfully changed to '$zsh'.${RESET}"
+ echo "${FMT_GREEN}Shell successfully changed to '$zsh'.${FMT_RESET}"
fi
echo
}
-# shellcheck disable=SC2183 # printf string has more %s than arguments ($RAINBOW expands to multiple arguments)
+# shellcheck disable=SC2183 # printf string has more %s than arguments ($FMT_RAINBOW expands to multiple arguments)
print_success() {
- printf '%s %s__ %s %s %s %s %s__ %s\n' $RAINBOW $RESET
- printf '%s ____ %s/ /_ %s ____ ___ %s__ __ %s ____ %s_____%s/ /_ %s\n' $RAINBOW $RESET
- printf '%s / __ \\%s/ __ \\ %s / __ `__ \\%s/ / / / %s /_ / %s/ ___/%s __ \\ %s\n' $RAINBOW $RESET
- printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s / /_%s(__ )%s / / / %s\n' $RAINBOW $RESET
- printf '%s\\____/%s_/ /_/ %s /_/ /_/ /_/%s\\__, / %s /___/%s____/%s_/ /_/ %s\n' $RAINBOW $RESET
- printf '%s %s %s %s /____/ %s %s %s %s....is now installed!%s\n' $RAINBOW $GREEN $RESET
+ printf '%s %s__ %s %s %s %s %s__ %s\n' $FMT_RAINBOW $FMT_RESET
+ printf '%s ____ %s/ /_ %s ____ ___ %s__ __ %s ____ %s_____%s/ /_ %s\n' $FMT_RAINBOW $FMT_RESET
+ printf '%s / __ \\%s/ __ \\ %s / __ `__ \\%s/ / / / %s /_ / %s/ ___/%s __ \\ %s\n' $FMT_RAINBOW $FMT_RESET
+ printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s / /_%s(__ )%s / / / %s\n' $FMT_RAINBOW $FMT_RESET
+ printf '%s\\____/%s_/ /_/ %s /_/ /_/ /_/%s\\__, / %s /___/%s____/%s_/ /_/ %s\n' $FMT_RAINBOW $FMT_RESET
+ printf '%s %s %s %s /____/ %s %s %s %s....is now installed!%s\n' $FMT_RAINBOW $FMT_GREEN $FMT_RESET
printf '\n'
printf '\n'
- printf "%s %s %s\n" "Before you scream ${BOLD}${YELLOW}Oh My Zsh!${RESET} look over the" \
+ printf "%s %s %s\n" "Before you scream ${FMT_BOLD}${FMT_YELLOW}Oh My Zsh!${FMT_RESET} look over the" \
"$(fmt_code "$(fmt_link ".zshrc" "file://$HOME/.zshrc" --text)")" \
"file to select plugins, themes, and options."
printf '\n'
printf '%s\n' "• Follow us on Twitter: $(fmt_link @ohmyzsh https://twitter.com/ohmyzsh)"
printf '%s\n' "• Join our Discord community: $(fmt_link "Discord server" https://discord.gg/ohmyzsh)"
printf '%s\n' "• Get stickers, t-shirts, coffee mugs and more: $(fmt_link "Planet Argon Shop" https://shop.planetargon.com/collections/oh-my-zsh)"
- printf '%s\n' $RESET
+ printf '%s\n' $FMT_RESET
}
main() {
@@ -377,12 +453,12 @@ main() {
setup_color
if ! command_exists zsh; then
- echo "${YELLOW}Zsh is not installed.${RESET} Please install zsh first."
+ echo "${FMT_YELLOW}Zsh is not installed.${FMT_RESET} Please install zsh first."
exit 1
fi
if [ -d "$ZSH" ]; then
- echo "${YELLOW}The \$ZSH folder already exists ($ZSH).${RESET}"
+ echo "${FMT_YELLOW}The \$ZSH folder already exists ($ZSH).${FMT_RESET}"
if [ "$custom_zsh" = yes ]; then
cat <