From 47fee387821113956e10fffa79ea22062de8c817 Mon Sep 17 00:00:00 2001 From: albert-github Date: Mon, 1 Oct 2018 18:58:03 +0200 Subject: issue_6517: Emoji support Added issue support for the different output types. - Sources of the emoji - based on the Unicode definition v11.0: - https://unicode.org/emoji/charts/full-emoji-list.html - http://www.unicode.org/emoji/charts/full-emoji-modifiers.html - github definition list: - https://api.github.com/emojis - Input of emoji: :: with the restriction that direct after the opening colon and direct before the closing colon no space is allowed - doctokinizer.l, adding detection of emoji and new command `\:` - doktokinizer.h, adding "word" type TK_EMOJI - docparser.* handling of new "word" type TK_EMOJI (analogous to HTML Entities), handling of new command `\:` - cmdmapper,cpp, cmdmapper.h, adding new command `\:` - htmlentity.cpp, adding new definition required for new command `\:` - Emoji - emoji.cpp, emoji.h, class for handling emoji analogous to HTML Entities, including small directions on how to update the code when a new emoji is defined. Not everything is converted to lowercase for comparison and accents are removed. - doxygen.cpp possibility to create list of supported emoji - handling emoji for output types (analogous to HTML Entities), see documentation for different output types - docparser.h, *docvisitor.* - rtfdocvisitor.* converting output to UTF-16 (based on http://scruss.com/blog/2017/03/12/in-the-unlikely-event-you-need-to-represent-emoji-in-rtf-using-perl/) - latexdocvisitor.*, handling arguments for emoji in output (see also latexgen.cpp for meaning of the arguments of doxygenemoji). - latexgen.cpp, adding new latex command for doxygen (doxygenemoji) and prevent too many open file (code before documentclass) - config.xml, definition of `LATEX_EMOJI_DIRECTORY` with path to images required for LaTeX output - Documentation: - emojisup.doc, user description - commands.doc, description of new command `\:` - index.doc, reference to emoji chapter - xmlcmds.doc, adjust reference to next chapter as a new chapter is added - Doxyfile*, adding emoji chapter Build system - CMakeLists.txt adding new files --- doc/CMakeLists.txt | 1 + doc/Doxyfile | 2 +- doc/commands.doc | 9 + doc/doxygen_manual.tex | 1 + doc/emojisup.doc | 166 +++ doc/index.doc | 2 + doc/xmlcmds.doc | 2 +- src/CMakeLists.txt | 1 + src/cmdmapper.cpp | 1 + src/cmdmapper.h | 3 +- src/config.xml | 10 + src/docbookvisitor.cpp | 16 + src/docbookvisitor.h | 1 + src/docparser.cpp | 123 +- src/docparser.h | 20 +- src/doctokenizer.h | 1 + src/doctokenizer.l | 20 + src/docvisitor.h | 2 + src/doxygen.cpp | 33 + src/emoji.cpp | 3187 ++++++++++++++++++++++++++++++++++++++++++++++++ src/emoji.h | 50 + src/htmldocvisitor.cpp | 15 + src/htmldocvisitor.h | 1 + src/htmlentity.cpp | 3 +- src/latexdocvisitor.h | 1 + src/latexgen.cpp | 16 + src/mandocvisitor.cpp | 17 + src/mandocvisitor.h | 1 + src/perlmodgen.cpp | 7 + src/printdocvisitor.h | 14 + src/rtfdocvisitor.cpp | 43 + src/rtfdocvisitor.h | 1 + src/textdocvisitor.cpp | 13 + src/textdocvisitor.h | 1 + src/xmldocvisitor.cpp | 15 + 35 files changed, 3791 insertions(+), 8 deletions(-) create mode 100644 doc/emojisup.doc create mode 100644 src/emoji.cpp create mode 100644 src/emoji.h diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index b95afd8..463d3d7 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -80,6 +80,7 @@ set(DOC_FILES starting.doc trouble.doc xmlcmds.doc + emojisup.doc language.tpl maintainers.txt translator.py diff --git a/doc/Doxyfile b/doc/Doxyfile index ceb6385..bdd1098 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -38,7 +38,7 @@ INPUT = index.doc install.doc starting.doc docblocks.doc markdown.do autolink.doc output.doc searching.doc extsearch.doc customize.doc custcmd.doc \ external.doc faq.doc trouble.doc features.doc \ doxygen_usage.doc doxywizard_usage.doc \ - config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \ + config.doc commands.doc htmlcmds.doc xmlcmds.doc emojisup.doc language.doc \ perlmod.doc perlmod_tree.doc arch.doc changelog.doc FILE_PATTERNS = *.cpp *.h *.doc EXAMPLE_PATH = ../examples diff --git a/doc/commands.doc b/doc/commands.doc index 840c3b7..4930524 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -214,6 +214,7 @@ documentation: \refitem cmdperc \\\% \refitem cmdquot \\\" \refitem cmdchardot \\\. +\refitem cmdcolon \: \refitem cmddcolon \:: \refitem cmdpipe \\| \refitem cmdndash \\\-- @@ -3362,6 +3363,14 @@ class Receiver the start of a line.
+\section cmdcolon \: + + \addindex \\: + This command writes a single colon (\c \:) to the output. This + character sequence has to be escaped in some cases, because it is used + to define `emoji` see also \ref emojisup "Emoji support". + +
\section cmddcolon \\:: \addindex \\:: diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex index 95e1ed6..e749560 100644 --- a/doc/doxygen_manual.tex +++ b/doc/doxygen_manual.tex @@ -121,6 +121,7 @@ Written by Dimitri van Heesch\\[2ex] \chapter{Special Commands}\label{commands}\hypertarget{commands}{}\input{commands} \chapter{HTML commands}\label{htmlcmds}\hypertarget{htmlcmds}{}\input{htmlcmds} \chapter{XML commands}\label{xmlcmds}\hypertarget{xmlcmds}{}\input{xmlcmds} +\chapter{Emoji support}\label{emojisup}\hypertarget{emojisup}{}\input{emojisup} \part{Developers Manual} \chapter{Doxygen's internals}\label{arch}\hypertarget{arch}{}\input{arch} \chapter{Perl Module Output format}\label{perlmod}\hypertarget{perlmod}{}\input{perlmod} diff --git a/doc/emojisup.doc b/doc/emojisup.doc new file mode 100644 index 0000000..75a90fb --- /dev/null +++ b/doc/emojisup.doc @@ -0,0 +1,166 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2018 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ +/*! \page emojisup Emoji support + +The [Unicode consortium](http://www.unicode.org/) has defined a set of +[emoji](https://en.wikipedia.org/wiki/Emoji) with the corresponding unicode +sequences and a so called "CLDR short name". The current version a v11.0 and can be found at +[Full Emoji List, v11.0](https://unicode.org/emoji/charts/full-emoji-list.html) furthermore there is the list with +[Full Emoji Modifier Sequences, v11.0](http://www.unicode.org/emoji/charts/full-emoji-modifiers.html). + +A common way to denote an emoji is by means of `::`, +doxygen supports the emoji as mentioned in the above mentioned unicode emoji lists in this way +by means of the "CLDR short name" with the exception that in case a colon (`:`) is in the +"CLDR short name" this colon has to be removed. +Furthermore doxygen supports the list of emoji as used by github (based on the list +https://api.github.com/emojis). In this list also a reference is given to the unicode codes (just the +first and last) and these unicodes are mapped onto the official unicode sequences. +In case the "CLDR short name" and the "github name" are the same the reference from the +"CLDR short name" has precedence. + +Implementation + +For the different doxygen output types there is an output defined: +- Unicode code sequence, the actual representation is depending on the possibilities of the fonts loaded: + - HTML + - XML + - DocBook + - RTF, converted to UTF-16 representation. +- Image + - \LaTeX, in case the image can be found (see \ref emojiimage "Emoji image retrieval") otherwise the plain emoji text (i.e. `::`) is displayed +- plain emoji text (i.e. `::`) + - man + - perl + +\anchor emojiimage Emoji image retrieval + +In the lists +[Full Emoji List, v11.0](https://unicode.org/emoji/charts/full-emoji-list.html) and +[Full Emoji Modifier Sequences, v11.0](http://www.unicode.org/emoji/charts/full-emoji-modifiers.html). +define images for the different vendors. These images can be retrieved by means of the following procedure (based on the code from Henning Pohl, https://github.com/henningpohl/latex-emoji): +\code{.py} +from bs4 import BeautifulSoup +import base64 +import os +import requests + +# http://www.unicode.org/emoji/charts/index.html +# http://www.unicode.org/emoji/charts/full-emoji-list.html +PAGE_URL = 'http://www.unicode.org/emoji/charts/full-emoji-list.html' +PAGE_URL_SKIN = 'http://www.unicode.org/emoji/charts/full-emoji-modifiers.html' +PAGE = 'full-emoji-list.html' +PAGE_SKIN = 'full-emoji-modifiers.html' + + +def get_header_names(header): + cols = header.find_all('th') + cols = [c.get_text() for c in cols] + cols = [c.replace('*','') for c in cols] + cols = [c.lower() for c in cols] + return cols + +def extract_image(column): + if 'miss' in column['class']: + return None + + if 'miss7' in column['class']: + return None + + data = column.img['src'] + data_start = data.find("base64,") + if data_start == -1: + return None + + data = base64.b64decode(data[data_start + len("base64,"):]) + return data + +def save_image(folder, imgSrc, filename): + if os.path.exists(folder) is False: + os.mkdir(folder) + + filename = os.path.join(folder, filename) + if os.path.exists(filename): + return + + img = extract_image(imgSrc) + if img is not None: + with open(filename, 'wb') as out: + out.write(img) + +def scrape(page_url, page): + # Possibilities to obtain the basic data: + # - use request.get directly + soup = BeautifulSoup(requests.get(page_url).text, "html5lib") + # - download file (e.g. with wget http://www.unicode.org/emoji/charts/full-emoji-list.html) + # with open(page) as fp: + # soup = BeautifulSoup(fp,"html5lib") + + table = soup('table')[0] + + # for version 11.0 + # first row: smileys + # second row: face smileys + # third row: row with vendors, i.e. the one we want + header = table.find_all('tr')[2] + keys = get_header_names(header) + + for row in header.find_next_siblings('tr'): + fields = {k:c for k, c in zip(keys, row.find_all('td')) } + if 'code' not in fields: + continue + + codes = fields['code'].text.replace('U+', '').split(' ') + filename = "-".join(codes) + ".png" + + save_image('ios', fields['appl'], filename) + save_image('android', fields['goog'], filename) + save_image('twitter', fields['twtr'], filename) + save_image('windows', fields['wind'], filename) + save_image('one', fields['one'], filename) + save_image('facebook', fields['fb'], filename) + save_image('samsung', fields['sams'], filename) + #save_image('gmail', fields['gmail'], filename) + #save_image('softbank', fields['sb'], filename) + #save_image('docomo', fields['dcm'], filename) + #save_image('kddi', fields['kddi'], filename) + #save_image('bw', fields['chart'], filename) + +if __name__ == '__main__': + scrape(PAGE_URL, PAGE) + scrape(PAGE_URL_SKIN, PAGE_SKIN) +\endcode +This results in a number of directories with the supported images. By means of the doxygen configuration parameter +\ref cfg_latex_emoji_directory "LATEX_EMOJI_DIRECTORY" the requested directory can be selected. + +It is also possible to use images from other sources or mix images from different sources, the only requirement is that the filename represents the unicode of the emoji. e.g. if we have the emoji \:grinning face with big eyes\: (also known as \:smiley\:) the coresponding unicode is `U+1F603` and the name of the file is `1F603.png`.
+For a more complex emoji like \:keycap 1\: (also known as \:one\:) the coresponding unicode sequence is `U+0031U+FE0FU+20E3` and the name of the file is `0031-FE0F-20E3.png`. + + +Note that when you want to use a colon (`:`) in your text it might be necessary to escape the colon (see \ref cmdcolon "\\:") as it might conflict with a, possible, emoji sequence. + + +For a overview of the supported emoji one can issue the comand:
+`doxygen.exe -f emoji ` + + +\htmlonly +Go to the next section or return to the + index. +\endhtmlonly + +*/ + diff --git a/doc/index.doc b/doc/index.doc index b8f6e8e..9afe624 100644 --- a/doc/index.doc +++ b/doc/index.doc @@ -102,6 +102,8 @@ The second part forms a reference manual: can be used within the documentation.
  • Section \ref xmlcmds shows an overview of the C# style XML commands that can be used within the documentation. +
  • Section \ref emojisup shows an introduction how emoji can be used within + the documentation. The third part provides information for developers: diff --git a/doc/xmlcmds.doc b/doc/xmlcmds.doc index 848858d..b59095b 100644 --- a/doc/xmlcmds.doc +++ b/doc/xmlcmds.doc @@ -104,7 +104,7 @@ class Engine \htmlonly -Go to the next section or return to the +Go to the next section or return to the index. \endhtmlonly diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b57d360..4dc31fa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -183,6 +183,7 @@ add_library(_doxygen STATIC dot.cpp doxygen.cpp eclipsehelp.cpp + emoji.cpp entry.cpp filedef.cpp filename.cpp diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 71da3f3..acbbe44 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -120,6 +120,7 @@ CommandMap cmdMap[] = { ".", CMD_PUNT }, { "+", CMD_PLUS }, { "-", CMD_MINUS }, + { ":", CMD_COLON }, { "::", CMD_DCOLON }, { "\"", CMD_QUOTE }, { "_internalref", CMD_INTERNALREF }, diff --git a/src/cmdmapper.h b/src/cmdmapper.h index d06de63..c1747ee 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -136,7 +136,8 @@ enum CommandType CMD_MINUS = 106, CMD_INCLUDEDOC = 107, CMD_SNIPPETDOC = 108, - CMD_SNIPWITHLINES= 109 + CMD_SNIPWITHLINES= 109, + CMD_COLON = 110 }; enum HtmlTagType diff --git a/src/config.xml b/src/config.xml index 08795dc..43144fc 100644 --- a/src/config.xml +++ b/src/config.xml @@ -2769,6 +2769,16 @@ or ]]> +
  • as the end of a style command @@ -1307,6 +1312,10 @@ static void defaultHandleTitleAndSize(const int cmd, DocNode *parent, QListname)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -1369,7 +1378,7 @@ static bool defaultHandleToken(DocNode *parent,int tok, QList &children handleWord) { DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno)); - if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL || + if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_EMOJI|| tok==TK_URL || tok==TK_COMMAND || tok==TK_HTMLTAG ) { @@ -1404,6 +1413,9 @@ reparsetoken: case CMD_HASH: children.append(new DocSymbol(parent,DocSymbol::Sym_Hash)); break; + case CMD_COLON: + children.append(new DocSymbol(parent,DocSymbol::Sym_Colon)); + break; case CMD_DCOLON: children.append(new DocSymbol(parent,DocSymbol::Sym_DoubleColon)); break; @@ -1692,6 +1704,19 @@ reparsetoken: } } break; + case TK_EMOJI: + { + int s = DocEmoji::decodeEmoji(tokenName); + if (s!=0) + { + children.append(new DocEmoji(parent,s)); + } + else + { + return FALSE; + } + } + break; case TK_WHITESPACE: case TK_NEWPARA: handlepara: @@ -1769,6 +1794,12 @@ DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName) return HtmlEntityMapper::instance()->name2sym(symName); } +int DocEmoji::decodeEmoji(const QCString &symName) +{ + DBG(("decodeSymbol(%s)\n",qPrint(symName))); + return EmojiEntityMapper::instance()->name2sym(symName); +} + //--------------------------------------------------------------------------- static int internalValidatingParseDoc(DocNode *parent,QList &children, @@ -2340,6 +2371,10 @@ void DocSecRefItem::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -2482,6 +2517,10 @@ void DocInternalRef::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -2638,6 +2677,10 @@ void DocRef::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: break; default: @@ -2772,6 +2815,10 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink) warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: if (g_token->name!="see" || !isXmlLink) { @@ -2963,6 +3010,10 @@ void DocVhdlFlow::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -3099,6 +3150,10 @@ int DocHtmlHeader::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -3142,6 +3197,10 @@ int DocHRef::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: { @@ -3292,6 +3351,19 @@ int DocIndexEntry::parse() } } break; + case TK_EMOJI: + { + int s = DocEmoji::decodeEmoji(g_token->name); + if (s != 0) + { + m_entry+=g_token->name; + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected emoji found as argument of \\addindex"); + } + } + break; case TK_COMMAND: switch (Mappers::cmdMapper->map(g_token->name)) { @@ -3302,6 +3374,7 @@ int DocIndexEntry::parse() case CMD_AMP: m_entry+='&'; break; case CMD_DOLLAR: m_entry+='$'; break; case CMD_HASH: m_entry+='#'; break; + case CMD_COLON: m_entry+=":"; break; case CMD_DCOLON: m_entry+="::"; break; case CMD_PERCENT: m_entry+='%'; break; case CMD_NDASH: m_entry+="--"; break; @@ -3388,6 +3461,10 @@ int DocHtmlCaption::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: { int tagId=Mappers::htmlTagMapper->map(g_token->name); @@ -3997,6 +4074,10 @@ int DocHtmlDescTitle::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: { int tagId=Mappers::htmlTagMapper->map(g_token->name); @@ -4550,6 +4631,10 @@ void DocTitle::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -5467,6 +5552,9 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_PIPE: m_children.append(new DocSymbol(this,DocSymbol::Sym_Pipe)); break; + case CMD_COLON: + m_children.append(new DocSymbol(this,DocSymbol::Sym_Colon)); + break; case CMD_DCOLON: m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon)); break; @@ -6524,7 +6612,7 @@ int DocPara::parse() { reparsetoken: DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno)); - if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL || + if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_EMOJI || tok==TK_URL || tok==TK_COMMAND || tok==TK_HTMLTAG ) { @@ -6780,6 +6868,20 @@ reparsetoken: } break; } + case TK_EMOJI: + { + int s = DocEmoji::decodeEmoji(g_token->name); + if (s!=0) + { + m_children.append(new DocEmoji(this,s)); + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + } + break; + } case TK_NEWPARA: retval=TK_NEWPARA; goto endparagraph; @@ -6994,6 +7096,20 @@ void DocText::parse() } } break; + case TK_EMOJI: + { + int s = DocSymbol::decodeSymbol(g_token->name); + if (s!=0) + { + m_children.append(new DocEmoji(this,s)); + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + } + } + break; case TK_COMMAND: switch (Mappers::cmdMapper->map(g_token->name)) { @@ -7018,6 +7134,9 @@ void DocText::parse() case CMD_HASH: m_children.append(new DocSymbol(this,DocSymbol::Sym_Hash)); break; + case CMD_COLON: + m_children.append(new DocSymbol(this,DocSymbol::Sym_Colon)); + break; case CMD_DCOLON: m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon)); break; diff --git a/src/docparser.h b/src/docparser.h index 68f9fc1..8aca82d 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -140,7 +140,8 @@ class DocNode Kind_HtmlBlockQuote = 49, Kind_VhdlFlow = 50, Kind_ParBlock = 51, - Kind_DiaFile = 52 + Kind_DiaFile = 52, + Kind_Emoji = 53 }; /*! Creates a new node */ DocNode() : m_parent(0), m_insidePre(FALSE) {} @@ -454,7 +455,7 @@ class DocSymbol : public DocNode /* doxygen commands mapped */ Sym_BSlash, Sym_At, Sym_Less, Sym_Greater, Sym_Amp, Sym_Dollar, Sym_Hash, Sym_DoubleColon, Sym_Percent, Sym_Pipe, - Sym_Quot, Sym_Minus, Sym_Plus, Sym_Dot + Sym_Quot, Sym_Minus, Sym_Plus, Sym_Dot, Sym_Colon }; enum PerlType { Perl_unknown = 0, Perl_string, Perl_char, Perl_symbol, Perl_umlaut, Perl_acute, Perl_grave, Perl_circ, Perl_slash, Perl_tilde, @@ -475,6 +476,21 @@ class DocSymbol : public DocNode SymType m_symbol; }; +/** Node representing a n emoji */ +class DocEmoji : public DocNode +{ + public: + DocEmoji(DocNode *parent,int s) : + m_symbol(s) { m_parent = parent; } + int emoji() const { return m_symbol; } + Kind kind() const { return Kind_Emoji; } + void accept(DocVisitor *v) { v->visit(this); } + static int decodeEmoji(const QCString &symName); + + private: + int m_symbol; +}; + /** Node representing some amount of white space */ class DocWhiteSpace : public DocNode { diff --git a/src/doctokenizer.h b/src/doctokenizer.h index b3b9fa5..50307ae 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -40,6 +40,7 @@ enum Tokens TK_NEWPARA = 9, TK_RCSTAG = 10, TK_URL = 11, + TK_EMOJI = 12, RetVal_OK = 0x10000, RetVal_SimpleSec = 0x10001, diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 3118cfd..7f6c98f 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -122,6 +122,7 @@ const char *tokToString(int token) case TK_NEWPARA: return "TK_NEWPARA"; case TK_RCSTAG: return "TK_RCSTAG"; case TK_URL: return "TK_URL"; + case TK_EMOJI: return "TK_EMOJI"; } return "ERROR"; } @@ -332,6 +333,7 @@ CMD ("\\"|"@") WS [ \t\r\n] NONWS [^ \t\r\n] BLANK [ \t\r] +EMOJI (":"[a-z_A-Z0-9\x80-\xFF"'+()&\*\.!,#-]":"|":"[a-z_A-Z0-9\x80-\xFF"'+()&\*\.!,#-][a-z_A-Z0-9\x80-\xFF "'+()&\*\.!,#-]*[a-z_A-Z0-9\x80-\xFF"'+()&\*\.!,#-]":") ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* PHPTYPE [\\:a-z_A-Z0-9\x80-\xFF\-]+ @@ -358,6 +360,7 @@ SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}|"--"|"---") SPCMD2 {CMD}[\\@<>&$#%~".+|-] SPCMD3 {CMD}form#[0-9]+ SPCMD4 {CMD}"::" +SPCMD5 {CMD}":" INOUT "inout"|"in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in") PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]" VARARGS "..." @@ -583,6 +586,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} } {SPCMD1} | {SPCMD2} | +{SPCMD5} | {SPCMD4} { /* special command */ g_token->name = yytext+1; g_token->name = g_token->name.stripWhiteSpace(); @@ -674,6 +678,10 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->name = yytext; return TK_SYMBOL; } +{EMOJI} { /* emoji symbol */ + g_token->name = yytext; + return TK_EMOJI; + } /********* patterns for linkable words ******************/ @@ -920,6 +928,10 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->name = yytext; return TK_SYMBOL; } +{EMOJI} { /* emoji */ + g_token->name = yytext; + return TK_EMOJI; + } {HTMLTAG} { } {SPCMD1} | @@ -956,6 +968,10 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->name = yytext; return TK_SYMBOL; } +{EMOJI} { /* emoji */ + g_token->name = yytext; + return TK_EMOJI; + } {SPCMD1} | {SPCMD2} { /* special command */ g_token->name = yytext+1; @@ -1087,6 +1103,10 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->name = yytext; return TK_SYMBOL; } +{EMOJI} { /* emoji */ + g_token->name = yytext; + return TK_EMOJI; + } {SPCMD1} | {SPCMD2} { /* special command */ g_token->name = yytext+1; diff --git a/src/docvisitor.h b/src/docvisitor.h index 18fb743..d2318c9 100644 --- a/src/docvisitor.h +++ b/src/docvisitor.h @@ -37,6 +37,7 @@ class DocAutoListItem; class DocPara; class DocRoot; class DocSymbol; +class DocEmoji; class DocURL; class DocStyleChange; class DocSimpleSect; @@ -101,6 +102,7 @@ class DocVisitor virtual void visit(DocWord *) = 0; virtual void visit(DocWhiteSpace *) = 0; virtual void visit(DocSymbol *) = 0; + virtual void visit(DocEmoji *) = 0; virtual void visit(DocURL *) = 0; virtual void visit(DocStyleChange *) = 0; virtual void visit(DocVerbatim *) = 0; diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 9d8a914..cd2cc8d 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -103,6 +103,7 @@ #include "settings.h" #include "context.h" #include "fileparser.h" +#include "emoji.h" // provided by the generated file resources.cpp extern void initResources(); @@ -10029,6 +10030,9 @@ static void usage(const char *name) msg(" RTF: %s -e rtf extensionsFile\n\n",name); msg("7) Use doxygen to compare the used configuration file with the template configuration file\n"); msg(" %s -x [configFile]\n\n",name); + msg("8) Use doxygen to show a list of build in emoji.\n"); + msg(" %s -f emoji outputFileName\n\n",name); + msg(" If - is used for outputFileName doxygen will write to standard output.\n\n"); msg("If -s is specified the comments of the configuration items in the config file will be omitted.\n"); msg("If configName is omitted `Doxyfile' will be used as a default.\n\n"); msg("-v print version string\n"); @@ -10229,6 +10233,7 @@ void readConfiguration(int argc, char **argv) const char *layoutName=0; const char *debugLabel; const char *formatName; + const char *listName; bool genConfig=FALSE; bool shortList=FALSE; bool diffList=FALSE; @@ -10306,6 +10311,34 @@ void readConfiguration(int argc, char **argv) cleanUpDoxygen(); exit(1); break; + case 'f': + listName=getArg(argc,argv,optind); + if (!listName) + { + err("option \"-f\" is missing list specifier.\n"); + cleanUpDoxygen(); + exit(1); + } + if (qstricmp(listName,"emoji")==0) + { + if (optind+1>=argc) + { + err("option \"-f emoji\" is missing an output file name\n"); + cleanUpDoxygen(); + exit(1); + } + QFile f; + if (openOutputFile(argv[optind+1],f)) + { + EmojiEntityMapper::instance()->writeEmojiFile(f); + } + cleanUpDoxygen(); + exit(0); + } + err("option \"-f\" has invalid list specifier.\n"); + cleanUpDoxygen(); + exit(1); + break; case 'w': formatName=getArg(argc,argv,optind); if (!formatName) diff --git a/src/emoji.cpp b/src/emoji.cpp new file mode 100644 index 0000000..f27ae38 --- /dev/null +++ b/src/emoji.cpp @@ -0,0 +1,3187 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2015 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#include "emoji.h" +#include "message.h" +#include "ftextstream.h" +#include "util.h" + +/* to generate the content of this table see the documentation at the end of this file */ +static struct emojiEntityInfo +{ + const char *githubName; + const char *unicodeName; + const char *code; +} g_emojiEntities[] = +{ + {":+1:", ":thumbs up:", "👍"}, + {":-1:", ":thumbs down:", "👎"}, + {":100:", ":hundred points:", "💯"}, + {":1234:", ":input numbers:", "🔢"}, + {":1st_place_medal:", ":1st place medal:", "🥇"}, + {":2nd_place_medal:", ":2nd place medal:", "🥈"}, + {":3rd_place_medal:", ":3rd place medal:", "🥉"}, + {":8ball:", ":pool 8 ball:", "🎱"}, + {":a:", ":a button (blood type):", "🅰"}, + {":ab:", ":ab button (blood type):", "🆎"}, + {":abc:", ":input latin letters:", "🔤"}, + {":abcd:", ":input latin lowercase:", "🔡"}, + {":accept:", ":japanese \"acceptable\" button:", "🉑"}, + {":aerial_tramway:", ":aerial tramway:", "🚡"}, + {":afghanistan:", ":flag afghanistan:", "🇦🇫"}, + {":airplane:", ":airplane:", "✈"}, + {":aland_islands:", ":flag Ă…land islands:", "🇦🇽"}, + {":alarm_clock:", ":alarm clock:", "⏰"}, + {":albania:", ":flag albania:", "🇦🇱"}, + {":alembic:", ":alembic:", "⚗"}, + {":algeria:", ":flag algeria:", "🇩🇿"}, + {":alien:", ":alien:", "👽"}, + {":ambulance:", ":ambulance:", "🚑"}, + {":american_samoa:", ":flag american samoa:", "🇦🇸"}, + {":amphora:", ":amphora:", "🏺"}, + {":anchor:", ":anchor:", "⚓"}, + {":andorra:", ":flag andorra:", "🇦🇩"}, + {":angel:", ":baby angel:", "👼"}, + {":anger:", ":anger symbol:", "💢"}, + {":angola:", ":flag angola:", "🇦🇴"}, + {":angry:", ":angry face:", "😠"}, + {":anguilla:", ":flag anguilla:", "🇦🇮"}, + {":anguished:", ":anguished face:", "😧"}, + {":ant:", ":ant:", "🐜"}, + {":antarctica:", ":flag antarctica:", "🇦🇶"}, + {":antigua_barbuda:", ":flag antigua & barbuda:", "🇦🇬"}, + {":apple:", ":red apple:", "🍎"}, + {":aquarius:", ":aquarius:", "♒"}, + {":argentina:", ":flag argentina:", "🇦🇷"}, + {":aries:", ":aries:", "♈"}, + {":armenia:", ":flag armenia:", "🇦🇲"}, + {":arrow_backward:", ":reverse button:", "◀"}, + {":arrow_double_down:", ":fast down button:", "⏬"}, + {":arrow_double_up:", ":fast up button:", "⏫"}, + {":arrow_down:", ":down arrow:", "⬇"}, + {":arrow_down_small:", ":downwards button:", "🔽"}, + {":arrow_forward:", ":play button:", "▶"}, + {":arrow_heading_down:", ":right arrow curving down:", "⤵"}, + {":arrow_heading_up:", ":right arrow curving up:", "⤴"}, + {":arrow_left:", ":left arrow:", "⬅"}, + {":arrow_lower_left:", ":down-left arrow:", "↙"}, + {":arrow_lower_right:", ":down-right arrow:", "↘"}, + {":arrow_right:", ":right arrow:", "➡"}, + {":arrow_right_hook:", ":left arrow curving right:", "↪"}, + {":arrow_up:", ":up arrow:", "⬆"}, + {":arrow_up_down:", ":up-down arrow:", "↕"}, + {":arrow_up_small:", ":upwards button:", "🔼"}, + {":arrow_upper_left:", ":up-left arrow:", "↖"}, + {":arrow_upper_right:", ":up-right arrow:", "↗"}, + {":arrows_clockwise:", ":clockwise vertical arrows:", "🔃"}, + {":arrows_counterclockwise:", ":counterclockwise arrows button:", "🔄"}, + {":art:", ":artist palette:", "🎨"}, + {":articulated_lorry:", ":articulated lorry:", "🚛"}, + {":artificial_satellite:", ":satellite:", "🛰"}, + {":aruba:", ":flag aruba:", "🇦🇼"}, + {":asterisk:", ":keycap *:", "*️⃣"}, + {":astonished:", ":astonished face:", "😲"}, + {":athletic_shoe:", ":running shoe:", "👟"}, + {":atm:", ":atm sign:", "🏧"}, + {":atom_symbol:", ":atom symbol:", "⚛"}, + {":australia:", ":flag australia:", "🇦🇺"}, + {":austria:", ":flag austria:", "🇦🇹"}, + {":avocado:", ":avocado:", "🥑"}, + {":azerbaijan:", ":flag azerbaijan:", "🇦🇿"}, + {":b:", ":b button (blood type):", "🅱"}, + {":baby:", ":baby:", "👶"}, + {":baby_bottle:", ":baby bottle:", "🍼"}, + {":baby_chick:", ":baby chick:", "🐤"}, + {":baby_symbol:", ":baby symbol:", "🚼"}, + {":back:", ":back arrow:", "🔙"}, + {":bacon:", ":bacon:", "🥓"}, + {":badminton:", ":badminton:", "🏸"}, + {":baggage_claim:", ":baggage claim:", "🛄"}, + {":baguette_bread:", ":baguette bread:", "🥖"}, + {":bahamas:", ":flag bahamas:", "🇧🇸"}, + {":bahrain:", ":flag bahrain:", "🇧🇭"}, + {":balance_scale:", ":balance scale:", "⚖"}, + {":balloon:", ":balloon:", "🎈"}, + {":ballot_box:", ":ballot box with ballot:", "🗳"}, + {":ballot_box_with_check:", ":ballot box with check:", "☑"}, + {":bamboo:", ":pine decoration:", "🎍"}, + {":banana:", ":banana:", "🍌"}, + {":bangbang:", ":double exclamation mark:", "‼"}, + {":bangladesh:", ":flag bangladesh:", "🇧🇩"}, + {":bank:", ":bank:", "🏦"}, + {":bar_chart:", ":bar chart:", "📊"}, + {":barbados:", ":flag barbados:", "🇧🇧"}, + {":barber:", ":barber pole:", "💈"}, + {":baseball:", ":baseball:", "⚾"}, + {":basketball:", ":basketball:", "🏀"}, + {":basketball_man:", ":person bouncing ball:", "⛹"}, + {":basketball_woman:", ":woman bouncing ball:", "⛹️‍♀️"}, + {":bat:", ":bat:", "🦇"}, + {":bath:", ":person taking bath:", "🛀"}, + {":bathtub:", ":bathtub:", "🛁"}, + {":battery:", ":battery:", "🔋"}, + {":beach_umbrella:", ":beach with umbrella:", "🏖"}, + {":bear:", ":bear face:", "🐻"}, + {":bed:", ":bed:", "🛏"}, + {":bee:", ":honeybee:", "🐝"}, + {":beer:", ":beer mug:", "🍺"}, + {":beers:", ":clinking beer mugs:", "🍻"}, + {":beetle:", ":lady beetle:", "🐞"}, + {":beginner:", ":japanese symbol for beginner:", "🔰"}, + {":belarus:", ":flag belarus:", "🇧🇾"}, + {":belgium:", ":flag belgium:", "🇧🇪"}, + {":belize:", ":flag belize:", "🇧🇿"}, + {":bell:", ":bell:", "🔔"}, + {":bellhop_bell:", ":bellhop bell:", "🛎"}, + {":benin:", ":flag benin:", "🇧🇯"}, + {":bento:", ":bento box:", "🍱"}, + {":bermuda:", ":flag bermuda:", "🇧🇲"}, + {":bhutan:", ":flag bhutan:", "🇧🇹"}, + {":bicyclist:", ":person biking:", "🚴"}, + {":bike:", ":bicycle:", "🚲"}, + {":biking_man:", ":person biking:", "🚴"}, + {":biking_woman:", ":woman biking:", "🚴‍♀️"}, + {":bikini:", ":bikini:", "👙"}, + {":biohazard:", ":biohazard:", "☣"}, + {":bird:", ":bird:", "🐦"}, + {":birthday:", ":birthday cake:", "🎂"}, + {":black_circle:", ":black circle:", "⚫"}, + {":black_flag:", ":black flag:", "🏴"}, + {":black_heart:", ":black heart:", "🖤"}, + {":black_joker:", ":joker:", "🃏"}, + {":black_large_square:", ":black large square:", "⬛"}, + {":black_medium_small_square:", ":black medium-small square:", "◾"}, + {":black_medium_square:", ":black medium square:", "◼"}, + {":black_nib:", ":black nib:", "✒"}, + {":black_small_square:", ":black small square:", "▪"}, + {":black_square_button:", ":black square button:", "🔲"}, + {":blonde_man:", ":person blond hair:", "👱"}, + {":blonde_woman:", ":woman blond hair:", "👱‍♀️"}, + {":blossom:", ":blossom:", "🌼"}, + {":blowfish:", ":blowfish:", "🐡"}, + {":blue_book:", ":blue book:", "📘"}, + {":blue_car:", ":sport utility vehicle:", "🚙"}, + {":blue_heart:", ":blue heart:", "💙"}, + {":blush:", ":smiling face with smiling eyes:", "😊"}, + {":boar:", ":boar:", "🐗"}, + {":boat:", ":sailboat:", "⛵"}, + {":bolivia:", ":flag bolivia:", "🇧🇴"}, + {":bomb:", ":bomb:", "💣"}, + {":book:", ":open book:", "📖"}, + {":bookmark:", ":bookmark:", "🔖"}, + {":bookmark_tabs:", ":bookmark tabs:", "📑"}, + {":books:", ":books:", "📚"}, + {":boom:", ":collision:", "💥"}, + {":boot:", ":woman's boot:", "👢"}, + {":bosnia_herzegovina:", ":flag bosnia & herzegovina:", "🇧🇦"}, + {":botswana:", ":flag botswana:", "🇧🇼"}, + {":bouquet:", ":bouquet:", "💐"}, + {":bow:", ":person bowing:", "🙇"}, + {":bow_and_arrow:", ":bow and arrow:", "🏹"}, + {":bowing_man:", ":person bowing:", "🙇"}, + {":bowing_woman:", ":woman bowing:", "🙇‍♀️"}, + {":bowling:", ":bowling:", "🎳"}, + {":boxing_glove:", ":boxing glove:", "🥊"}, + {":boy:", ":boy:", "👦"}, + {":brazil:", ":flag brazil:", "🇧🇷"}, + {":bread:", ":bread:", "🍞"}, + {":bride_with_veil:", ":bride with veil:", "👰"}, + {":bridge_at_night:", ":bridge at night:", "🌉"}, + {":briefcase:", ":briefcase:", "💼"}, + {":british_indian_ocean_territory:", ":flag british indian ocean territory:", "🇮🇴"}, + {":british_virgin_islands:", ":flag british virgin islands:", "🇻🇬"}, + {":broken_heart:", ":broken heart:", "💔"}, + {":brunei:", ":flag brunei:", "🇧🇳"}, + {":bug:", ":bug:", "🐛"}, + {":building_construction:", ":building construction:", "🏗"}, + {":bulb:", ":light bulb:", "💡"}, + {":bulgaria:", ":flag bulgaria:", "🇧🇬"}, + {":bullettrain_front:", ":bullet train:", "🚅"}, + {":bullettrain_side:", ":high-speed train:", "🚄"}, + {":burkina_faso:", ":flag burkina faso:", "🇧🇫"}, + {":burrito:", ":burrito:", "🌯"}, + {":burundi:", ":flag burundi:", "🇧🇮"}, + {":bus:", ":bus:", "🚌"}, + {":business_suit_levitating:", ":man in suit levitating:", "🕴"}, + {":busstop:", ":bus stop:", "🚏"}, + {":bust_in_silhouette:", ":bust in silhouette:", "👤"}, + {":busts_in_silhouette:", ":busts in silhouette:", "👥"}, + {":butterfly:", ":butterfly:", "🦋"}, + {":cactus:", ":cactus:", "🌵"}, + {":cake:", ":shortcake:", "🍰"}, + {":calendar:", ":tear-off calendar:", "📆"}, + {":call_me_hand:", ":call me hand:", "🤙"}, + {":calling:", ":mobile phone with arrow:", "📲"}, + {":cambodia:", ":flag cambodia:", "🇰🇭"}, + {":camel:", ":two-hump camel:", "🐫"}, + {":camera:", ":camera:", "📷"}, + {":camera_flash:", ":camera with flash:", "📸"}, + {":cameroon:", ":flag cameroon:", "🇨🇲"}, + {":camping:", ":camping:", "🏕"}, + {":canada:", ":flag canada:", "🇨🇦"}, + {":canary_islands:", ":flag canary islands:", "🇮🇨"}, + {":cancer:", ":cancer:", "♋"}, + {":candle:", ":candle:", "🕯"}, + {":candy:", ":candy:", "🍬"}, + {":canoe:", ":canoe:", "🛶"}, + {":cape_verde:", ":flag cape verde:", "🇨🇻"}, + {":capital_abcd:", ":input latin uppercase:", "🔠"}, + {":capricorn:", ":capricorn:", "♑"}, + {":car:", ":automobile:", "🚗"}, + {":card_file_box:", ":card file box:", "🗃"}, + {":card_index:", ":card index:", "📇"}, + {":card_index_dividers:", ":card index dividers:", "🗂"}, + {":caribbean_netherlands:", ":flag caribbean netherlands:", "🇧🇶"}, + {":carousel_horse:", ":carousel horse:", "🎠"}, + {":carrot:", ":carrot:", "🥕"}, + {":cat:", ":cat face:", "🐱"}, + {":cat2:", ":cat:", "🐈"}, + {":cayman_islands:", ":flag cayman islands:", "🇰🇾"}, + {":cd:", ":optical disk:", "💿"}, + {":central_african_republic:", ":flag central african republic:", "🇨🇫"}, + {":chad:", ":flag chad:", "🇹🇩"}, + {":chains:", ":chains:", "⛓"}, + {":champagne:", ":bottle with popping cork:", "🍾"}, + {":chart:", ":chart increasing with yen:", "💹"}, + {":chart_with_downwards_trend:", ":chart decreasing:", "📉"}, + {":chart_with_upwards_trend:", ":chart increasing:", "📈"}, + {":checkered_flag:", ":chequered flag:", "🏁"}, + {":cheese:", ":cheese wedge:", "🧀"}, + {":cherries:", ":cherries:", "🍒"}, + {":cherry_blossom:", ":cherry blossom:", "🌸"}, + {":chestnut:", ":chestnut:", "🌰"}, + {":chicken:", ":chicken:", "🐔"}, + {":children_crossing:", ":children crossing:", "🚸"}, + {":chile:", ":flag chile:", "🇨🇱"}, + {":chipmunk:", ":chipmunk:", "🐿"}, + {":chocolate_bar:", ":chocolate bar:", "🍫"}, + {":christmas_island:", ":flag christmas island:", "🇨🇽"}, + {":christmas_tree:", ":christmas tree:", "🎄"}, + {":church:", ":church:", "⛪"}, + {":cinema:", ":cinema:", "🎦"}, + {":circus_tent:", ":circus tent:", "🎪"}, + {":city_sunrise:", ":sunset:", "🌇"}, + {":city_sunset:", ":cityscape at dusk:", "🌆"}, + {":cityscape:", ":cityscape:", "🏙"}, + {":cl:", ":cl button:", "🆑"}, + {":clamp:", ":clamp:", "🗜"}, + {":clap:", ":clapping hands:", "👏"}, + {":clapper:", ":clapper board:", "🎬"}, + {":classical_building:", ":classical building:", "🏛"}, + {":clinking_glasses:", ":clinking glasses:", "🥂"}, + {":clipboard:", ":clipboard:", "📋"}, + {":clock1:", ":one o'clock:", "🕐"}, + {":clock10:", ":ten o'clock:", "🕙"}, + {":clock1030:", ":ten-thirty:", "🕥"}, + {":clock11:", ":eleven o'clock:", "🕚"}, + {":clock1130:", ":eleven-thirty:", "🕦"}, + {":clock12:", ":twelve o'clock:", "🕛"}, + {":clock1230:", ":twelve-thirty:", "🕧"}, + {":clock130:", ":one-thirty:", "🕜"}, + {":clock2:", ":two o'clock:", "🕑"}, + {":clock230:", ":two-thirty:", "🕝"}, + {":clock3:", ":three o'clock:", "🕒"}, + {":clock330:", ":three-thirty:", "🕞"}, + {":clock4:", ":four o'clock:", "🕓"}, + {":clock430:", ":four-thirty:", "🕟"}, + {":clock5:", ":five o'clock:", "🕔"}, + {":clock530:", ":five-thirty:", "🕠"}, + {":clock6:", ":six o'clock:", "🕕"}, + {":clock630:", ":six-thirty:", "🕡"}, + {":clock7:", ":seven o'clock:", "🕖"}, + {":clock730:", ":seven-thirty:", "🕢"}, + {":clock8:", ":eight o'clock:", "🕗"}, + {":clock830:", ":eight-thirty:", "🕣"}, + {":clock9:", ":nine o'clock:", "🕘"}, + {":clock930:", ":nine-thirty:", "🕤"}, + {":closed_book:", ":closed book:", "📕"}, + {":closed_lock_with_key:", ":locked with key:", "🔐"}, + {":closed_umbrella:", ":closed umbrella:", "🌂"}, + {":cloud:", ":cloud:", "☁"}, + {":cloud_with_lightning:", ":cloud with lightning:", "🌩"}, + {":cloud_with_lightning_and_rain:", ":cloud with lightning and rain:", "⛈"}, + {":cloud_with_rain:", ":cloud with rain:", "🌧"}, + {":cloud_with_snow:", ":cloud with snow:", "🌨"}, + {":clown_face:", ":clown face:", "🤡"}, + {":clubs:", ":club suit:", "♣"}, + {":cn:", ":flag china:", "🇨🇳"}, + {":cocktail:", ":cocktail glass:", "🍸"}, + {":cocos_islands:", ":flag cocos (keeling) islands:", "🇨🇨"}, + {":coffee:", ":hot beverage:", "☕"}, + {":coffin:", ":coffin:", "⚰"}, + {":cold_sweat:", ":anxious face with sweat:", "😰"}, + {":collision:", ":collision:", "💥"}, + {":colombia:", ":flag colombia:", "🇨🇴"}, + {":comet:", ":comet:", "☄"}, + {":comoros:", ":flag comoros:", "🇰🇲"}, + {":computer:", ":laptop computer:", "💻"}, + {":computer_mouse:", ":computer mouse:", "🖱"}, + {":confetti_ball:", ":confetti ball:", "🎊"}, + {":confounded:", ":confounded face:", "😖"}, + {":confused:", ":confused face:", "😕"}, + {":congo_brazzaville:", ":flag congo - brazzaville:", "🇨🇬"}, + {":congo_kinshasa:", ":flag congo - kinshasa:", "🇨🇩"}, + {":congratulations:", ":japanese \"congratulations\" button:", "㊗"}, + {":construction:", ":construction:", "🚧"}, + {":construction_worker:", ":construction worker:", "👷"}, + {":construction_worker_man:", ":construction worker:", "👷"}, + {":construction_worker_woman:", ":woman construction worker:", "👷‍♀️"}, + {":control_knobs:", ":control knobs:", "🎛"}, + {":convenience_store:", ":convenience store:", "🏪"}, + {":cook_islands:", ":flag cook islands:", "🇨🇰"}, + {":cookie:", ":cookie:", "🍪"}, + {":cool:", ":cool button:", "🆒"}, + {":cop:", ":police officer:", "👮"}, + {":copyright:", ":copyright:", "©"}, + {":corn:", ":ear of corn:", "🌽"}, + {":costa_rica:", ":flag costa rica:", "🇨🇷"}, + {":cote_divoire:", ":flag cĂ´te d'ivoire:", "🇨🇮"}, + {":couch_and_lamp:", ":couch and lamp:", "🛋"}, + {":couple:", ":man and woman holding hands:", "👫"}, + {":couple_with_heart:", ":couple with heart:", "💑"}, + {":couple_with_heart_man_man:", ":kiss man, man:", "👨‍❤️‍💋‍👨"}, + {":couple_with_heart_woman_man:", ":couple with heart:", "💑"}, + {":couple_with_heart_woman_woman:", ":kiss woman, woman:", "👩‍❤️‍💋‍👩"}, + {":couplekiss_man_man:", ":kiss man, man:", "👨‍❤️‍💋‍👨"}, + {":couplekiss_man_woman:", ":kiss:", "💏"}, + {":couplekiss_woman_woman:", ":kiss woman, woman:", "👩‍❤️‍💋‍👩"}, + {":cow:", ":cow face:", "🐮"}, + {":cow2:", ":cow:", "🐄"}, + {":cowboy_hat_face:", ":cowboy hat face:", "🤠"}, + {":crab:", ":crab:", "🦀"}, + {":crayon:", ":crayon:", "🖍"}, + {":credit_card:", ":credit card:", "💳"}, + {":crescent_moon:", ":crescent moon:", "🌙"}, + {":cricket:", ":cricket game:", "🏏"}, + {":croatia:", ":flag croatia:", "🇭🇷"}, + {":crocodile:", ":crocodile:", "🐊"}, + {":croissant:", ":croissant:", "🥐"}, + {":crossed_fingers:", ":crossed fingers:", "🤞"}, + {":crossed_flags:", ":crossed flags:", "🎌"}, + {":crossed_swords:", ":crossed swords:", "⚔"}, + {":crown:", ":crown:", "👑"}, + {":cry:", ":crying face:", "😢"}, + {":crying_cat_face:", ":crying cat face:", "😿"}, + {":crystal_ball:", ":crystal ball:", "🔮"}, + {":cuba:", ":flag cuba:", "🇨🇺"}, + {":cucumber:", ":cucumber:", "🥒"}, + {":cupid:", ":heart with arrow:", "💘"}, + {":curacao:", ":flag curaçao:", "🇨🇼"}, + {":curly_loop:", ":curly loop:", "➰"}, + {":currency_exchange:", ":currency exchange:", "💱"}, + {":curry:", ":curry rice:", "🍛"}, + {":custard:", ":custard:", "🍮"}, + {":customs:", ":customs:", "🛃"}, + {":cyclone:", ":cyclone:", "🌀"}, + {":cyprus:", ":flag cyprus:", "🇨🇾"}, + {":czech_republic:", ":flag czechia:", "🇨🇿"}, + {":dagger:", ":dagger:", "🗡"}, + {":dancer:", ":woman dancing:", "💃"}, + {":dancers:", ":people with bunny ears:", "👯"}, + {":dancing_men:", ":men with bunny ears:", "👯‍♂️"}, + {":dancing_women:", ":people with bunny ears:", "👯"}, + {":dango:", ":dango:", "🍡"}, + {":dark_sunglasses:", ":sunglasses:", "🕶"}, + {":dart:", ":direct hit:", "🎯"}, + {":dash:", ":dashing away:", "💨"}, + {":date:", ":calendar:", "📅"}, + {":de:", ":flag germany:", "🇩🇪"}, + {":deciduous_tree:", ":deciduous tree:", "🌳"}, + {":deer:", ":deer:", "🦌"}, + {":denmark:", ":flag denmark:", "🇩🇰"}, + {":department_store:", ":department store:", "🏬"}, + {":derelict_house:", ":derelict house:", "🏚"}, + {":desert:", ":desert:", "🏜"}, + {":desert_island:", ":desert island:", "🏝"}, + {":desktop_computer:", ":desktop computer:", "🖥"}, + {":detective:", ":detective:", "🕵"}, + {":diamond_shape_with_a_dot_inside:", ":diamond with a dot:", "💠"}, + {":diamonds:", ":diamond suit:", "♦"}, + {":disappointed:", ":disappointed face:", "😞"}, + {":disappointed_relieved:", ":sad but relieved face:", "😥"}, + {":dizzy:", ":dizzy:", "💫"}, + {":dizzy_face:", ":dizzy face:", "😵"}, + {":djibouti:", ":flag djibouti:", "🇩🇯"}, + {":do_not_litter:", ":no littering:", "🚯"}, + {":dog:", ":dog face:", "🐶"}, + {":dog2:", ":dog:", "🐕"}, + {":dollar:", ":dollar banknote:", "💵"}, + {":dolls:", ":japanese dolls:", "🎎"}, + {":dolphin:", ":dolphin:", "🐬"}, + {":dominica:", ":flag dominica:", "🇩🇲"}, + {":dominican_republic:", ":flag dominican republic:", "🇩🇴"}, + {":door:", ":door:", "🚪"}, + {":doughnut:", ":doughnut:", "🍩"}, + {":dove:", ":dove:", "🕊"}, + {":dragon:", ":dragon:", "🐉"}, + {":dragon_face:", ":dragon face:", "🐲"}, + {":dress:", ":dress:", "👗"}, + {":dromedary_camel:", ":camel:", "🐪"}, + {":drooling_face:", ":drooling face:", "🤤"}, + {":droplet:", ":droplet:", "💧"}, + {":drum:", ":drum:", "🥁"}, + {":duck:", ":duck:", "🦆"}, + {":dvd:", ":dvd:", "📀"}, + {":e-mail:", ":e-mail:", "📧"}, + {":eagle:", ":eagle:", "🦅"}, + {":ear:", ":ear:", "👂"}, + {":ear_of_rice:", ":sheaf of rice:", "🌾"}, + {":earth_africa:", ":globe showing europe-africa:", "🌍"}, + {":earth_americas:", ":globe showing americas:", "🌎"}, + {":earth_asia:", ":globe showing asia-australia:", "🌏"}, + {":ecuador:", ":flag ecuador:", "🇪🇨"}, + {":egg:", ":egg:", "🥚"}, + {":eggplant:", ":eggplant:", "🍆"}, + {":egypt:", ":flag egypt:", "🇪🇬"}, + {":eight:", ":keycap 8:", "8️⃣"}, + {":eight_pointed_black_star:", ":eight-pointed star:", "✴"}, + {":eight_spoked_asterisk:", ":eight-spoked asterisk:", "✳"}, + {":el_salvador:", ":flag el salvador:", "🇸🇻"}, + {":electric_plug:", ":electric plug:", "🔌"}, + {":elephant:", ":elephant:", "🐘"}, + {":email:", ":envelope:", "✉"}, + {":end:", ":end arrow:", "🔚"}, + {":envelope:", ":envelope:", "✉"}, + {":envelope_with_arrow:", ":envelope with arrow:", "📩"}, + {":equatorial_guinea:", ":flag equatorial guinea:", "🇬🇶"}, + {":eritrea:", ":flag eritrea:", "🇪🇷"}, + {":es:", ":flag spain:", "🇪🇸"}, + {":estonia:", ":flag estonia:", "🇪🇪"}, + {":ethiopia:", ":flag ethiopia:", "🇪🇹"}, + {":eu:", ":flag european union:", "🇪🇺"}, + {":euro:", ":euro banknote:", "💶"}, + {":european_castle:", ":castle:", "🏰"}, + {":european_post_office:", ":post office:", "🏤"}, + {":european_union:", ":flag european union:", "🇪🇺"}, + {":evergreen_tree:", ":evergreen tree:", "🌲"}, + {":exclamation:", ":exclamation mark:", "❗"}, + {":expressionless:", ":expressionless face:", "😑"}, + {":eye:", ":eye in speech bubble:", "👁️‍🗨️"}, + {":eye_speech_bubble:", ":eye in speech bubble:", "👁️‍🗨️"}, + {":eyeglasses:", ":glasses:", "👓"}, + {":eyes:", ":eyes:", "👀"}, + {":face_with_head_bandage:", ":face with head-bandage:", "🤕"}, + {":face_with_thermometer:", ":face with thermometer:", "🤒"}, + {":facepunch:", ":oncoming fist:", "👊"}, + {":factory:", ":factory:", "🏭"}, + {":falkland_islands:", ":flag falkland islands:", "🇫🇰"}, + {":fallen_leaf:", ":fallen leaf:", "🍂"}, + {":family:", ":family:", "👪"}, + {":family_man_boy:", ":family man, woman, boy:", "👨‍👩‍👦"}, + {":family_man_boy_boy:", ":family man, woman, boy, boy:", "👨‍👩‍👦‍👦"}, + {":family_man_girl:", ":family man, woman, girl:", "👨‍👩‍👧"}, + {":family_man_girl_boy:", ":family man, woman, girl, boy:", "👨‍👩‍👧‍👦"}, + {":family_man_girl_girl:", ":family man, woman, girl, girl:", "👨‍👩‍👧‍👧"}, + {":family_man_man_boy:", ":family man, man, boy:", "👨‍👨‍👦"}, + {":family_man_man_boy_boy:", ":family man, man, boy, boy:", "👨‍👨‍👦‍👦"}, + {":family_man_man_girl:", ":family man, man, girl:", "👨‍👨‍👧"}, + {":family_man_man_girl_boy:", ":family man, man, girl, boy:", "👨‍👨‍👧‍👦"}, + {":family_man_man_girl_girl:", ":family man, man, girl, girl:", "👨‍👨‍👧‍👧"}, + {":family_man_woman_boy:", ":family:", "👪"}, + {":family_man_woman_boy_boy:", ":family man, woman, boy, boy:", "👨‍👩‍👦‍👦"}, + {":family_man_woman_girl:", ":family man, woman, girl:", "👨‍👩‍👧"}, + {":family_man_woman_girl_boy:", ":family man, woman, girl, boy:", "👨‍👩‍👧‍👦"}, + {":family_man_woman_girl_girl:", ":family man, woman, girl, girl:", "👨‍👩‍👧‍👧"}, + {":family_woman_boy:", ":family woman, woman, boy:", "👩‍👩‍👦"}, + {":family_woman_boy_boy:", ":family woman, woman, boy, boy:", "👩‍👩‍👦‍👦"}, + {":family_woman_girl:", ":family woman, woman, girl:", "👩‍👩‍👧"}, + {":family_woman_girl_boy:", ":family woman, woman, girl, boy:", "👩‍👩‍👧‍👦"}, + {":family_woman_girl_girl:", ":family woman, woman, girl, girl:", "👩‍👩‍👧‍👧"}, + {":family_woman_woman_boy:", ":family woman, woman, boy:", "👩‍👩‍👦"}, + {":family_woman_woman_boy_boy:", ":family woman, woman, boy, boy:", "👩‍👩‍👦‍👦"}, + {":family_woman_woman_girl:", ":family woman, woman, girl:", "👩‍👩‍👧"}, + {":family_woman_woman_girl_boy:", ":family woman, woman, girl, boy:", "👩‍👩‍👧‍👦"}, + {":family_woman_woman_girl_girl:", ":family woman, woman, girl, girl:", "👩‍👩‍👧‍👧"}, + {":faroe_islands:", ":flag faroe islands:", "🇫🇴"}, + {":fast_forward:", ":fast-forward button:", "⏩"}, + {":fax:", ":fax machine:", "📠"}, + {":fearful:", ":fearful face:", "😨"}, + {":feet:", ":paw prints:", "🐾"}, + {":female_detective:", ":woman detective:", "🕵️‍♀️"}, + {":ferris_wheel:", ":ferris wheel:", "🎡"}, + {":ferry:", ":ferry:", "⛴"}, + {":field_hockey:", ":field hockey:", "🏑"}, + {":fiji:", ":flag fiji:", "🇫🇯"}, + {":file_cabinet:", ":file cabinet:", "🗄"}, + {":file_folder:", ":file folder:", "📁"}, + {":film_projector:", ":film projector:", "📽"}, + {":film_strip:", ":film frames:", "🎞"}, + {":finland:", ":flag finland:", "🇫🇮"}, + {":fire:", ":fire:", "🔥"}, + {":fire_engine:", ":fire engine:", "🚒"}, + {":fireworks:", ":fireworks:", "🎆"}, + {":first_quarter_moon:", ":first quarter moon:", "🌓"}, + {":first_quarter_moon_with_face:", ":first quarter moon face:", "🌛"}, + {":fish:", ":fish:", "🐟"}, + {":fish_cake:", ":fish cake with swirl:", "🍥"}, + {":fishing_pole_and_fish:", ":fishing pole:", "🎣"}, + {":fist:", ":raised fist:", "✊"}, + {":fist_left:", ":left-facing fist:", "🤛"}, + {":fist_oncoming:", ":oncoming fist:", "👊"}, + {":fist_raised:", ":raised fist:", "✊"}, + {":fist_right:", ":right-facing fist:", "🤜"}, + {":five:", ":keycap 5:", "5️⃣"}, + {":flags:", ":carp streamer:", "🎏"}, + {":flashlight:", ":flashlight:", "🔦"}, + {":fleur_de_lis:", ":fleur-de-lis:", "⚜"}, + {":flight_arrival:", ":airplane arrival:", "🛬"}, + {":flight_departure:", ":airplane departure:", "🛫"}, + {":flipper:", ":dolphin:", "🐬"}, + {":floppy_disk:", ":floppy disk:", "💾"}, + {":flower_playing_cards:", ":flower playing cards:", "🎴"}, + {":flushed:", ":flushed face:", "😳"}, + {":fog:", ":fog:", "🌫"}, + {":foggy:", ":foggy:", "🌁"}, + {":football:", ":american football:", "🏈"}, + {":footprints:", ":footprints:", "👣"}, + {":fork_and_knife:", ":fork and knife:", "🍴"}, + {":fountain:", ":fountain:", "⛲"}, + {":fountain_pen:", ":fountain pen:", "🖋"}, + {":four:", ":keycap 4:", "4️⃣"}, + {":four_leaf_clover:", ":four leaf clover:", "🍀"}, + {":fox_face:", ":fox face:", "🦊"}, + {":fr:", ":flag france:", "🇫🇷"}, + {":framed_picture:", ":framed picture:", "🖼"}, + {":free:", ":free button:", "🆓"}, + {":french_guiana:", ":flag french guiana:", "🇬🇫"}, + {":french_polynesia:", ":flag french polynesia:", "🇵🇫"}, + {":french_southern_territories:", ":flag french southern territories:", "🇹🇫"}, + {":fried_egg:", ":cooking:", "🍳"}, + {":fried_shrimp:", ":fried shrimp:", "🍤"}, + {":fries:", ":french fries:", "🍟"}, + {":frog:", ":frog face:", "🐸"}, + {":frowning:", ":frowning face with open mouth:", "😦"}, + {":frowning_face:", ":frowning face:", "☹"}, + {":frowning_man:", ":man frowning:", "🙍‍♂️"}, + {":frowning_woman:", ":person frowning:", "🙍"}, + {":fu:", ":middle finger:", "🖕"}, + {":fuelpump:", ":fuel pump:", "⛽"}, + {":full_moon:", ":full moon:", "🌕"}, + {":full_moon_with_face:", ":full moon face:", "🌝"}, + {":funeral_urn:", ":funeral urn:", "⚱"}, + {":gabon:", ":flag gabon:", "🇬🇦"}, + {":gambia:", ":flag gambia:", "🇬🇲"}, + {":game_die:", ":game die:", "🎲"}, + {":gb:", ":flag united kingdom:", "🇬🇧"}, + {":gear:", ":gear:", "⚙"}, + {":gem:", ":gem stone:", "💎"}, + {":gemini:", ":gemini:", "♊"}, + {":georgia:", ":flag georgia:", "🇬🇪"}, + {":ghana:", ":flag ghana:", "🇬🇭"}, + {":ghost:", ":ghost:", "👻"}, + {":gibraltar:", ":flag gibraltar:", "🇬🇮"}, + {":gift:", ":wrapped gift:", "🎁"}, + {":gift_heart:", ":heart with ribbon:", "💝"}, + {":girl:", ":girl:", "👧"}, + {":globe_with_meridians:", ":globe with meridians:", "🌐"}, + {":goal_net:", ":goal net:", "🥅"}, + {":goat:", ":goat:", "🐐"}, + {":golf:", ":flag in hole:", "⛳"}, + {":golfing_man:", ":person golfing:", "🏌"}, + {":golfing_woman:", ":woman golfing:", "🏌️‍♀️"}, + {":gorilla:", ":gorilla:", "🦍"}, + {":grapes:", ":grapes:", "🍇"}, + {":greece:", ":flag greece:", "🇬🇷"}, + {":green_apple:", ":green apple:", "🍏"}, + {":green_book:", ":green book:", "📗"}, + {":green_heart:", ":green heart:", "💚"}, + {":green_salad:", ":green salad:", "🥗"}, + {":greenland:", ":flag greenland:", "🇬🇱"}, + {":grenada:", ":flag grenada:", "🇬🇩"}, + {":grey_exclamation:", ":white exclamation mark:", "❕"}, + {":grey_question:", ":white question mark:", "❔"}, + {":grimacing:", ":grimacing face:", "😬"}, + {":grin:", ":beaming face with smiling eyes:", "😁"}, + {":grinning:", ":grinning face:", "😀"}, + {":guadeloupe:", ":flag guadeloupe:", "🇬🇵"}, + {":guam:", ":flag guam:", "🇬🇺"}, + {":guardsman:", ":guard:", "💂"}, + {":guardswoman:", ":woman guard:", "💂‍♀️"}, + {":guatemala:", ":flag guatemala:", "🇬🇹"}, + {":guernsey:", ":flag guernsey:", "🇬🇬"}, + {":guinea:", ":flag guinea:", "🇬🇳"}, + {":guinea_bissau:", ":flag guinea-bissau:", "🇬🇼"}, + {":guitar:", ":guitar:", "🎸"}, + {":gun:", ":pistol:", "🔫"}, + {":guyana:", ":flag guyana:", "🇬🇾"}, + {":haircut:", ":person getting haircut:", "💇"}, + {":haircut_man:", ":man getting haircut:", "💇‍♂️"}, + {":haircut_woman:", ":person getting haircut:", "💇"}, + {":haiti:", ":flag haiti:", "🇭🇹"}, + {":hamburger:", ":hamburger:", "🍔"}, + {":hammer:", ":hammer:", "🔨"}, + {":hammer_and_pick:", ":hammer and pick:", "⚒"}, + {":hammer_and_wrench:", ":hammer and wrench:", "🛠"}, + {":hamster:", ":hamster face:", "🐹"}, + {":hand:", ":raised hand:", "✋"}, + {":handbag:", ":handbag:", "👜"}, + {":handshake:", ":handshake:", "🤝"}, + {":hankey:", ":pile of poo:", "💩"}, + {":hash:", ":keycap #:", "#️⃣"}, + {":hatched_chick:", ":front-facing baby chick:", "🐥"}, + {":hatching_chick:", ":hatching chick:", "🐣"}, + {":headphones:", ":headphone:", "🎧"}, + {":hear_no_evil:", ":hear-no-evil monkey:", "🙉"}, + {":heart:", ":red heart:", "❤"}, + {":heart_decoration:", ":heart decoration:", "💟"}, + {":heart_eyes:", ":smiling face with heart-eyes:", "😍"}, + {":heart_eyes_cat:", ":smiling cat face with heart-eyes:", "😻"}, + {":heartbeat:", ":beating heart:", "💓"}, + {":heartpulse:", ":growing heart:", "💗"}, + {":hearts:", ":heart suit:", "♥"}, + {":heavy_check_mark:", ":heavy check mark:", "✔"}, + {":heavy_division_sign:", ":heavy division sign:", "➗"}, + {":heavy_dollar_sign:", ":heavy dollar sign:", "💲"}, + {":heavy_exclamation_mark:", ":exclamation mark:", "❗"}, + {":heavy_heart_exclamation:", ":heavy heart exclamation:", "❣"}, + {":heavy_minus_sign:", ":heavy minus sign:", "➖"}, + {":heavy_multiplication_x:", ":heavy multiplication x:", "✖"}, + {":heavy_plus_sign:", ":heavy plus sign:", "➕"}, + {":helicopter:", ":helicopter:", "🚁"}, + {":herb:", ":herb:", "🌿"}, + {":hibiscus:", ":hibiscus:", "🌺"}, + {":high_brightness:", ":bright button:", "🔆"}, + {":high_heel:", ":high-heeled shoe:", "👠"}, + {":hocho:", ":kitchen knife:", "🔪"}, + {":hole:", ":hole:", "🕳"}, + {":honduras:", ":flag honduras:", "🇭🇳"}, + {":honey_pot:", ":honey pot:", "🍯"}, + {":honeybee:", ":honeybee:", "🐝"}, + {":hong_kong:", ":flag hong kong sar china:", "🇭🇰"}, + {":horse:", ":horse face:", "🐴"}, + {":horse_racing:", ":horse racing:", "🏇"}, + {":hospital:", ":hospital:", "🏥"}, + {":hot_pepper:", ":hot pepper:", "🌶"}, + {":hotdog:", ":hot dog:", "🌭"}, + {":hotel:", ":hotel:", "🏨"}, + {":hotsprings:", ":hot springs:", "♨"}, + {":hourglass:", ":hourglass done:", "⌛"}, + {":hourglass_flowing_sand:", ":hourglass not done:", "⏳"}, + {":house:", ":house:", "🏠"}, + {":house_with_garden:", ":house with garden:", "🏡"}, + {":houses:", ":houses:", "🏘"}, + {":hugs:", ":hugging face:", "🤗"}, + {":hungary:", ":flag hungary:", "🇭🇺"}, + {":hushed:", ":hushed face:", "😯"}, + {":ice_cream:", ":ice cream:", "🍨"}, + {":ice_hockey:", ":ice hockey:", "🏒"}, + {":ice_skate:", ":ice skate:", "⛸"}, + {":icecream:", ":soft ice cream:", "🍦"}, + {":iceland:", ":flag iceland:", "🇮🇸"}, + {":id:", ":id button:", "🆔"}, + {":ideograph_advantage:", ":japanese \"bargain\" button:", "🉐"}, + {":imp:", ":angry face with horns:", "👿"}, + {":inbox_tray:", ":inbox tray:", "📥"}, + {":incoming_envelope:", ":incoming envelope:", "📨"}, + {":india:", ":flag india:", "🇮🇳"}, + {":indonesia:", ":flag indonesia:", "🇮🇩"}, + {":information_desk_person:", ":person tipping hand:", "💁"}, + {":information_source:", ":information:", "ℹ"}, + {":innocent:", ":smiling face with halo:", "😇"}, + {":interrobang:", ":exclamation question mark:", "⁉"}, + {":iphone:", ":mobile phone:", "📱"}, + {":iran:", ":flag iran:", "🇮🇷"}, + {":iraq:", ":flag iraq:", "🇮🇶"}, + {":ireland:", ":flag ireland:", "🇮🇪"}, + {":isle_of_man:", ":flag isle of man:", "🇮🇲"}, + {":israel:", ":flag israel:", "🇮🇱"}, + {":it:", ":flag italy:", "🇮🇹"}, + {":izakaya_lantern:", ":red paper lantern:", "🏮"}, + {":jack_o_lantern:", ":jack-o-lantern:", "🎃"}, + {":jamaica:", ":flag jamaica:", "🇯🇲"}, + {":japan:", ":map of japan:", "🗾"}, + {":japanese_castle:", ":japanese castle:", "🏯"}, + {":japanese_goblin:", ":goblin:", "👺"}, + {":japanese_ogre:", ":ogre:", "👹"}, + {":jeans:", ":jeans:", "👖"}, + {":jersey:", ":flag jersey:", "🇯🇪"}, + {":jordan:", ":flag jordan:", "🇯🇴"}, + {":joy:", ":face with tears of joy:", "😂"}, + {":joy_cat:", ":cat face with tears of joy:", "😹"}, + {":joystick:", ":joystick:", "🕹"}, + {":jp:", ":flag japan:", "🇯🇵"}, + {":kaaba:", ":kaaba:", "🕋"}, + {":kazakhstan:", ":flag kazakhstan:", "🇰🇿"}, + {":kenya:", ":flag kenya:", "🇰🇪"}, + {":key:", ":key:", "🔑"}, + {":keyboard:", ":keyboard:", "⌨"}, + {":keycap_ten:", ":keycap 10:", "🔟"}, + {":kick_scooter:", ":kick scooter:", "🛴"}, + {":kimono:", ":kimono:", "👘"}, + {":kiribati:", ":flag kiribati:", "🇰🇮"}, + {":kiss:", ":kiss mark:", "💋"}, + {":kissing:", ":kissing face:", "😗"}, + {":kissing_cat:", ":kissing cat face:", "😽"}, + {":kissing_closed_eyes:", ":kissing face with closed eyes:", "😚"}, + {":kissing_heart:", ":face blowing a kiss:", "😘"}, + {":kissing_smiling_eyes:", ":kissing face with smiling eyes:", "😙"}, + {":kiwi_fruit:", ":kiwi fruit:", "🥝"}, + {":knife:", ":kitchen knife:", "🔪"}, + {":koala:", ":koala:", "🐨"}, + {":koko:", ":japanese \"here\" button:", "🈁"}, + {":kosovo:", ":flag kosovo:", "🇽🇰"}, + {":kr:", ":flag south korea:", "🇰🇷"}, + {":kuwait:", ":flag kuwait:", "🇰🇼"}, + {":kyrgyzstan:", ":flag kyrgyzstan:", "🇰🇬"}, + {":label:", ":label:", "🏷"}, + {":lantern:", ":red paper lantern:", "🏮"}, + {":laos:", ":flag laos:", "🇱🇦"}, + {":large_blue_circle:", ":blue circle:", "🔵"}, + {":large_blue_diamond:", ":large blue diamond:", "🔷"}, + {":large_orange_diamond:", ":large orange diamond:", "🔶"}, + {":last_quarter_moon:", ":last quarter moon:", "🌗"}, + {":last_quarter_moon_with_face:", ":last quarter moon face:", "🌜"}, + {":latin_cross:", ":latin cross:", "✝"}, + {":latvia:", ":flag latvia:", "🇱🇻"}, + {":laughing:", ":grinning squinting face:", "😆"}, + {":leaves:", ":leaf fluttering in wind:", "🍃"}, + {":lebanon:", ":flag lebanon:", "🇱🇧"}, + {":ledger:", ":ledger:", "📒"}, + {":left_luggage:", ":left luggage:", "🛅"}, + {":left_right_arrow:", ":left-right arrow:", "↔"}, + {":leftwards_arrow_with_hook:", ":right arrow curving left:", "↩"}, + {":lemon:", ":lemon:", "🍋"}, + {":leo:", ":leo:", "♌"}, + {":leopard:", ":leopard:", "🐆"}, + {":lesotho:", ":flag lesotho:", "🇱🇸"}, + {":level_slider:", ":level slider:", "🎚"}, + {":liberia:", ":flag liberia:", "🇱🇷"}, + {":libra:", ":libra:", "♎"}, + {":libya:", ":flag libya:", "🇱🇾"}, + {":liechtenstein:", ":flag liechtenstein:", "🇱🇮"}, + {":light_rail:", ":light rail:", "🚈"}, + {":link:", ":link:", "🔗"}, + {":lion:", ":lion face:", "🦁"}, + {":lips:", ":mouth:", "👄"}, + {":lipstick:", ":lipstick:", "💄"}, + {":lithuania:", ":flag lithuania:", "🇱🇹"}, + {":lizard:", ":lizard:", "🦎"}, + {":lock:", ":locked:", "🔒"}, + {":lock_with_ink_pen:", ":locked with pen:", "🔏"}, + {":lollipop:", ":lollipop:", "🍭"}, + {":loop:", ":double curly loop:", "➿"}, + {":loud_sound:", ":speaker high volume:", "🔊"}, + {":loudspeaker:", ":loudspeaker:", "📢"}, + {":love_hotel:", ":love hotel:", "🏩"}, + {":love_letter:", ":love letter:", "💌"}, + {":low_brightness:", ":dim button:", "🔅"}, + {":luxembourg:", ":flag luxembourg:", "🇱🇺"}, + {":lying_face:", ":lying face:", "🤥"}, + {":m:", ":circled m:", "Ⓜ"}, + {":macau:", ":flag macau sar china:", "🇲🇴"}, + {":macedonia:", ":flag macedonia:", "🇲🇰"}, + {":madagascar:", ":flag madagascar:", "🇲🇬"}, + {":mag:", ":magnifying glass tilted left:", "🔍"}, + {":mag_right:", ":magnifying glass tilted right:", "🔎"}, + {":mahjong:", ":mahjong red dragon:", "🀄"}, + {":mailbox:", ":closed mailbox with raised flag:", "📫"}, + {":mailbox_closed:", ":closed mailbox with lowered flag:", "📪"}, + {":mailbox_with_mail:", ":open mailbox with raised flag:", "📬"}, + {":mailbox_with_no_mail:", ":open mailbox with lowered flag:", "📭"}, + {":malawi:", ":flag malawi:", "🇲🇼"}, + {":malaysia:", ":flag malaysia:", "🇲🇾"}, + {":maldives:", ":flag maldives:", "🇲🇻"}, + {":male_detective:", ":detective:", "🕵"}, + {":mali:", ":flag mali:", "🇲🇱"}, + {":malta:", ":flag malta:", "🇲🇹"}, + {":man:", ":man:", "👨"}, + {":man_artist:", ":man artist:", "👨‍🎨"}, + {":man_astronaut:", ":man astronaut:", "👨‍🚀"}, + {":man_cartwheeling:", ":man cartwheeling:", "🤸‍♂️"}, + {":man_cook:", ":man cook:", "👨‍🍳"}, + {":man_dancing:", ":man dancing:", "🕺"}, + {":man_facepalming:", ":man facepalming:", "🤦‍♂️"}, + {":man_factory_worker:", ":man factory worker:", "👨‍🏭"}, + {":man_farmer:", ":man farmer:", "👨‍🌾"}, + {":man_firefighter:", ":man firefighter:", "👨‍🚒"}, + {":man_health_worker:", ":man health worker:", "👨‍⚕️"}, + {":man_in_tuxedo:", ":man in tuxedo:", "🤵"}, + {":man_judge:", ":man judge:", "👨‍⚖️"}, + {":man_juggling:", ":man juggling:", "🤹‍♂️"}, + {":man_mechanic:", ":man mechanic:", "👨‍🔧"}, + {":man_office_worker:", ":man office worker:", "👨‍💼"}, + {":man_pilot:", ":man pilot:", "👨‍✈️"}, + {":man_playing_handball:", ":man playing handball:", "🤾‍♂️"}, + {":man_playing_water_polo:", ":man playing water polo:", "🤽‍♂️"}, + {":man_scientist:", ":man scientist:", "👨‍🔬"}, + {":man_shrugging:", ":man shrugging:", "🤷‍♂️"}, + {":man_singer:", ":man singer:", "👨‍🎤"}, + {":man_student:", ":man student:", "👨‍🎓"}, + {":man_teacher:", ":man teacher:", "👨‍🏫"}, + {":man_technologist:", ":man technologist:", "👨‍💻"}, + {":man_with_gua_pi_mao:", ":man with chinese cap:", "👲"}, + {":man_with_turban:", ":person wearing turban:", "👳"}, + {":mandarin:", ":tangerine:", "🍊"}, + {":mans_shoe:", ":man's shoe:", "👞"}, + {":mantelpiece_clock:", ":mantelpiece clock:", "🕰"}, + {":maple_leaf:", ":maple leaf:", "🍁"}, + {":marshall_islands:", ":flag marshall islands:", "🇲🇭"}, + {":martial_arts_uniform:", ":martial arts uniform:", "🥋"}, + {":martinique:", ":flag martinique:", "🇲🇶"}, + {":mask:", ":face with medical mask:", "😷"}, + {":massage:", ":person getting massage:", "💆"}, + {":massage_man:", ":man getting massage:", "💆‍♂️"}, + {":massage_woman:", ":person getting massage:", "💆"}, + {":mauritania:", ":flag mauritania:", "🇲🇷"}, + {":mauritius:", ":flag mauritius:", "🇲🇺"}, + {":mayotte:", ":flag mayotte:", "🇾🇹"}, + {":meat_on_bone:", ":meat on bone:", "🍖"}, + {":medal_military:", ":military medal:", "🎖"}, + {":medal_sports:", ":sports medal:", "🏅"}, + {":mega:", ":megaphone:", "📣"}, + {":melon:", ":melon:", "🍈"}, + {":memo:", ":memo:", "📝"}, + {":men_wrestling:", ":men wrestling:", "🤼‍♂️"}, + {":menorah:", ":menorah:", "🕎"}, + {":mens:", ":men's room:", "🚹"}, + {":metal:", ":sign of the horns:", "🤘"}, + {":metro:", ":metro:", "🚇"}, + {":mexico:", ":flag mexico:", "🇲🇽"}, + {":micronesia:", ":flag micronesia:", "🇫🇲"}, + {":microphone:", ":microphone:", "🎤"}, + {":microscope:", ":microscope:", "🔬"}, + {":middle_finger:", ":middle finger:", "🖕"}, + {":milk_glass:", ":glass of milk:", "🥛"}, + {":milky_way:", ":milky way:", "🌌"}, + {":minibus:", ":minibus:", "🚐"}, + {":minidisc:", ":computer disk:", "💽"}, + {":mobile_phone_off:", ":mobile phone off:", "📴"}, + {":moldova:", ":flag moldova:", "🇲🇩"}, + {":monaco:", ":flag monaco:", "🇲🇨"}, + {":money_mouth_face:", ":money-mouth face:", "🤑"}, + {":money_with_wings:", ":money with wings:", "💸"}, + {":moneybag:", ":money bag:", "💰"}, + {":mongolia:", ":flag mongolia:", "🇲🇳"}, + {":monkey:", ":monkey:", "🐒"}, + {":monkey_face:", ":monkey face:", "🐵"}, + {":monorail:", ":monorail:", "🚝"}, + {":montenegro:", ":flag montenegro:", "🇲🇪"}, + {":montserrat:", ":flag montserrat:", "🇲🇸"}, + {":moon:", ":waxing gibbous moon:", "🌔"}, + {":morocco:", ":flag morocco:", "🇲🇦"}, + {":mortar_board:", ":graduation cap:", "🎓"}, + {":mosque:", ":mosque:", "🕌"}, + {":motor_boat:", ":motor boat:", "🛥"}, + {":motor_scooter:", ":motor scooter:", "🛵"}, + {":motorcycle:", ":motorcycle:", "🏍"}, + {":motorway:", ":motorway:", "🛣"}, + {":mount_fuji:", ":mount fuji:", "🗻"}, + {":mountain:", ":mountain:", "⛰"}, + {":mountain_bicyclist:", ":person mountain biking:", "🚵"}, + {":mountain_biking_man:", ":person mountain biking:", "🚵"}, + {":mountain_biking_woman:", ":woman mountain biking:", "🚵‍♀️"}, + {":mountain_cableway:", ":mountain cableway:", "🚠"}, + {":mountain_railway:", ":mountain railway:", "🚞"}, + {":mountain_snow:", ":snow-capped mountain:", "🏔"}, + {":mouse:", ":mouse face:", "🐭"}, + {":mouse2:", ":mouse:", "🐁"}, + {":movie_camera:", ":movie camera:", "🎥"}, + {":moyai:", ":moai:", "🗿"}, + {":mozambique:", ":flag mozambique:", "🇲🇿"}, + {":mrs_claus:", ":mrs. claus:", "🤶"}, + {":muscle:", ":flexed biceps:", "💪"}, + {":mushroom:", ":mushroom:", "🍄"}, + {":musical_keyboard:", ":musical keyboard:", "🎹"}, + {":musical_note:", ":musical note:", "🎵"}, + {":musical_score:", ":musical score:", "🎼"}, + {":mute:", ":muted speaker:", "🔇"}, + {":myanmar:", ":flag myanmar (burma):", "🇲🇲"}, + {":nail_care:", ":nail polish:", "💅"}, + {":name_badge:", ":name badge:", "📛"}, + {":namibia:", ":flag namibia:", "🇳🇦"}, + {":national_park:", ":national park:", "🏞"}, + {":nauru:", ":flag nauru:", "🇳🇷"}, + {":nauseated_face:", ":nauseated face:", "🤢"}, + {":necktie:", ":necktie:", "👔"}, + {":negative_squared_cross_mark:", ":cross mark button:", "❎"}, + {":nepal:", ":flag nepal:", "🇳🇵"}, + {":nerd_face:", ":nerd face:", "🤓"}, + {":netherlands:", ":flag netherlands:", "🇳🇱"}, + {":neutral_face:", ":neutral face:", "😐"}, + {":new:", ":new button:", "🆕"}, + {":new_caledonia:", ":flag new caledonia:", "🇳🇨"}, + {":new_moon:", ":new moon:", "🌑"}, + {":new_moon_with_face:", ":new moon face:", "🌚"}, + {":new_zealand:", ":flag new zealand:", "🇳🇿"}, + {":newspaper:", ":newspaper:", "📰"}, + {":newspaper_roll:", ":rolled-up newspaper:", "🗞"}, + {":next_track_button:", ":next track button:", "⏭"}, + {":ng:", ":ng button:", "🆖"}, + {":ng_man:", ":man gesturing no:", "🙅‍♂️"}, + {":ng_woman:", ":person gesturing no:", "🙅"}, + {":nicaragua:", ":flag nicaragua:", "🇳🇮"}, + {":niger:", ":flag niger:", "🇳🇪"}, + {":nigeria:", ":flag nigeria:", "🇳🇬"}, + {":night_with_stars:", ":night with stars:", "🌃"}, + {":nine:", ":keycap 9:", "9️⃣"}, + {":niue:", ":flag niue:", "🇳🇺"}, + {":no_bell:", ":bell with slash:", "🔕"}, + {":no_bicycles:", ":no bicycles:", "🚳"}, + {":no_entry:", ":no entry:", "⛔"}, + {":no_entry_sign:", ":prohibited:", "🚫"}, + {":no_good:", ":person gesturing no:", "🙅"}, + {":no_good_man:", ":man gesturing no:", "🙅‍♂️"}, + {":no_good_woman:", ":person gesturing no:", "🙅"}, + {":no_mobile_phones:", ":no mobile phones:", "📵"}, + {":no_mouth:", ":face without mouth:", "😶"}, + {":no_pedestrians:", ":no pedestrians:", "🚷"}, + {":no_smoking:", ":no smoking:", "🚭"}, + {":non-potable_water:", ":non-potable water:", "🚱"}, + {":norfolk_island:", ":flag norfolk island:", "🇳🇫"}, + {":north_korea:", ":flag north korea:", "🇰🇵"}, + {":northern_mariana_islands:", ":flag northern mariana islands:", "🇲🇵"}, + {":norway:", ":flag norway:", "🇳🇴"}, + {":nose:", ":nose:", "👃"}, + {":notebook:", ":notebook:", "📓"}, + {":notebook_with_decorative_cover:", ":notebook with decorative cover:", "📔"}, + {":notes:", ":musical notes:", "🎶"}, + {":nut_and_bolt:", ":nut and bolt:", "🔩"}, + {":o:", ":heavy large circle:", "⭕"}, + {":o2:", ":o button (blood type):", "🅾"}, + {":ocean:", ":water wave:", "🌊"}, + {":octopus:", ":octopus:", "🐙"}, + {":oden:", ":oden:", "🍢"}, + {":office:", ":office building:", "🏢"}, + {":oil_drum:", ":oil drum:", "🛢"}, + {":ok:", ":ok button:", "🆗"}, + {":ok_hand:", ":ok hand:", "👌"}, + {":ok_man:", ":man gesturing ok:", "🙆‍♂️"}, + {":ok_woman:", ":person gesturing ok:", "🙆"}, + {":old_key:", ":old key:", "🗝"}, + {":older_man:", ":old man:", "👴"}, + {":older_woman:", ":old woman:", "👵"}, + {":om:", ":om:", "🕉"}, + {":oman:", ":flag oman:", "🇴🇲"}, + {":on:", ":on! arrow:", "🔛"}, + {":oncoming_automobile:", ":oncoming automobile:", "🚘"}, + {":oncoming_bus:", ":oncoming bus:", "🚍"}, + {":oncoming_police_car:", ":oncoming police car:", "🚔"}, + {":oncoming_taxi:", ":oncoming taxi:", "🚖"}, + {":one:", ":keycap 1:", "1️⃣"}, + {":open_book:", ":open book:", "📖"}, + {":open_file_folder:", ":open file folder:", "📂"}, + {":open_hands:", ":open hands:", "👐"}, + {":open_mouth:", ":face with open mouth:", "😮"}, + {":open_umbrella:", ":umbrella:", "☂"}, + {":ophiuchus:", ":ophiuchus:", "⛎"}, + {":orange:", ":tangerine:", "🍊"}, + {":orange_book:", ":orange book:", "📙"}, + {":orthodox_cross:", ":orthodox cross:", "☦"}, + {":outbox_tray:", ":outbox tray:", "📤"}, + {":owl:", ":owl:", "🦉"}, + {":ox:", ":ox:", "🐂"}, + {":package:", ":package:", "📦"}, + {":page_facing_up:", ":page facing up:", "📄"}, + {":page_with_curl:", ":page with curl:", "📃"}, + {":pager:", ":pager:", "📟"}, + {":paintbrush:", ":paintbrush:", "🖌"}, + {":pakistan:", ":flag pakistan:", "🇵🇰"}, + {":palau:", ":flag palau:", "🇵🇼"}, + {":palestinian_territories:", ":flag palestinian territories:", "🇵🇸"}, + {":palm_tree:", ":palm tree:", "🌴"}, + {":panama:", ":flag panama:", "🇵🇦"}, + {":pancakes:", ":pancakes:", "🥞"}, + {":panda_face:", ":panda face:", "🐼"}, + {":paperclip:", ":paperclip:", "📎"}, + {":paperclips:", ":linked paperclips:", "🖇"}, + {":papua_new_guinea:", ":flag papua new guinea:", "🇵🇬"}, + {":paraguay:", ":flag paraguay:", "🇵🇾"}, + {":parasol_on_ground:", ":umbrella on ground:", "⛱"}, + {":parking:", ":p button:", "🅿"}, + {":part_alternation_mark:", ":part alternation mark:", "〽"}, + {":partly_sunny:", ":sun behind cloud:", "⛅"}, + {":passenger_ship:", ":passenger ship:", "🛳"}, + {":passport_control:", ":passport control:", "🛂"}, + {":pause_button:", ":pause button:", "⏸"}, + {":paw_prints:", ":paw prints:", "🐾"}, + {":peace_symbol:", ":peace symbol:", "☮"}, + {":peach:", ":peach:", "🍑"}, + {":peanuts:", ":peanuts:", "🥜"}, + {":pear:", ":pear:", "🍐"}, + {":pen:", ":pen:", "🖊"}, + {":pencil:", ":memo:", "📝"}, + {":pencil2:", ":pencil:", "✏"}, + {":penguin:", ":penguin:", "🐧"}, + {":pensive:", ":pensive face:", "😔"}, + {":performing_arts:", ":performing arts:", "🎭"}, + {":persevere:", ":persevering face:", "😣"}, + {":person_fencing:", ":person fencing:", "🤺"}, + {":person_frowning:", ":person frowning:", "🙍"}, + {":person_with_blond_hair:", ":person blond hair:", "👱"}, + {":person_with_pouting_face:", ":person pouting:", "🙎"}, + {":peru:", ":flag peru:", "🇵🇪"}, + {":philippines:", ":flag philippines:", "🇵🇭"}, + {":phone:", ":telephone:", "☎"}, + {":pick:", ":pick:", "⛏"}, + {":pig:", ":pig face:", "🐷"}, + {":pig2:", ":pig:", "🐖"}, + {":pig_nose:", ":pig nose:", "🐽"}, + {":pill:", ":pill:", "💊"}, + {":pineapple:", ":pineapple:", "🍍"}, + {":ping_pong:", ":ping pong:", "🏓"}, + {":pisces:", ":pisces:", "♓"}, + {":pitcairn_islands:", ":flag pitcairn islands:", "🇵🇳"}, + {":pizza:", ":pizza:", "🍕"}, + {":place_of_worship:", ":place of worship:", "🛐"}, + {":plate_with_cutlery:", ":fork and knife with plate:", "🍽"}, + {":play_or_pause_button:", ":play or pause button:", "⏯"}, + {":point_down:", ":backhand index pointing down:", "👇"}, + {":point_left:", ":backhand index pointing left:", "👈"}, + {":point_right:", ":backhand index pointing right:", "👉"}, + {":point_up:", ":index pointing up:", "☝"}, + {":point_up_2:", ":backhand index pointing up:", "👆"}, + {":poland:", ":flag poland:", "🇵🇱"}, + {":police_car:", ":police car:", "🚓"}, + {":policeman:", ":police officer:", "👮"}, + {":policewoman:", ":woman police officer:", "👮‍♀️"}, + {":poodle:", ":poodle:", "🐩"}, + {":poop:", ":pile of poo:", "💩"}, + {":popcorn:", ":popcorn:", "🍿"}, + {":portugal:", ":flag portugal:", "🇵🇹"}, + {":post_office:", ":japanese post office:", "🏣"}, + {":postal_horn:", ":postal horn:", "📯"}, + {":postbox:", ":postbox:", "📮"}, + {":potable_water:", ":potable water:", "🚰"}, + {":potato:", ":potato:", "🥔"}, + {":pouch:", ":clutch bag:", "👝"}, + {":poultry_leg:", ":poultry leg:", "🍗"}, + {":pound:", ":pound banknote:", "💷"}, + {":pout:", ":pouting face:", "😡"}, + {":pouting_cat:", ":pouting cat face:", "😾"}, + {":pouting_man:", ":man pouting:", "🙎‍♂️"}, + {":pouting_woman:", ":person pouting:", "🙎"}, + {":pray:", ":folded hands:", "🙏"}, + {":prayer_beads:", ":prayer beads:", "📿"}, + {":pregnant_woman:", ":pregnant woman:", "🤰"}, + {":previous_track_button:", ":last track button:", "⏮"}, + {":prince:", ":prince:", "🤴"}, + {":princess:", ":princess:", "👸"}, + {":printer:", ":printer:", "🖨"}, + {":puerto_rico:", ":flag puerto rico:", "🇵🇷"}, + {":punch:", ":oncoming fist:", "👊"}, + {":purple_heart:", ":purple heart:", "💜"}, + {":purse:", ":purse:", "👛"}, + {":pushpin:", ":pushpin:", "📌"}, + {":put_litter_in_its_place:", ":litter in bin sign:", "🚮"}, + {":qatar:", ":flag qatar:", "🇶🇦"}, + {":question:", ":question mark:", "❓"}, + {":rabbit:", ":rabbit face:", "🐰"}, + {":rabbit2:", ":rabbit:", "🐇"}, + {":racehorse:", ":horse:", "🐎"}, + {":racing_car:", ":racing car:", "🏎"}, + {":radio:", ":radio:", "📻"}, + {":radio_button:", ":radio button:", "🔘"}, + {":radioactive:", ":radioactive:", "☢"}, + {":rage:", ":pouting face:", "😡"}, + {":railway_car:", ":railway car:", "🚃"}, + {":railway_track:", ":railway track:", "🛤"}, + {":rainbow:", ":rainbow:", "🌈"}, + {":rainbow_flag:", ":rainbow flag:", "🏳️‍🌈"}, + {":raised_back_of_hand:", ":raised back of hand:", "🤚"}, + {":raised_hand:", ":raised hand:", "✋"}, + {":raised_hand_with_fingers_splayed:", ":hand with fingers splayed:", "🖐"}, + {":raised_hands:", ":raising hands:", "🙌"}, + {":raising_hand:", ":person raising hand:", "🙋"}, + {":raising_hand_man:", ":man raising hand:", "🙋‍♂️"}, + {":raising_hand_woman:", ":person raising hand:", "🙋"}, + {":ram:", ":ram:", "🐏"}, + {":ramen:", ":steaming bowl:", "🍜"}, + {":rat:", ":rat:", "🐀"}, + {":record_button:", ":record button:", "⏺"}, + {":recycle:", ":recycling symbol:", "♻"}, + {":red_car:", ":automobile:", "🚗"}, + {":red_circle:", ":red circle:", "🔴"}, + {":registered:", ":registered:", "®"}, + {":relaxed:", ":smiling face:", "☺"}, + {":relieved:", ":relieved face:", "😌"}, + {":reminder_ribbon:", ":reminder ribbon:", "🎗"}, + {":repeat:", ":repeat button:", "🔁"}, + {":repeat_one:", ":repeat single button:", "🔂"}, + {":rescue_worker_helmet:", ":rescue worker's helmet:", "⛑"}, + {":restroom:", ":restroom:", "🚻"}, + {":reunion:", ":flag rĂ©union:", "🇷🇪"}, + {":revolving_hearts:", ":revolving hearts:", "💞"}, + {":rewind:", ":fast reverse button:", "⏪"}, + {":rhinoceros:", ":rhinoceros:", "🦏"}, + {":ribbon:", ":ribbon:", "🎀"}, + {":rice:", ":cooked rice:", "🍚"}, + {":rice_ball:", ":rice ball:", "🍙"}, + {":rice_cracker:", ":rice cracker:", "🍘"}, + {":rice_scene:", ":moon viewing ceremony:", "🎑"}, + {":right_anger_bubble:", ":right anger bubble:", "🗯"}, + {":ring:", ":ring:", "💍"}, + {":robot:", ":robot face:", "🤖"}, + {":rocket:", ":rocket:", "🚀"}, + {":rofl:", ":rolling on the floor laughing:", "🤣"}, + {":roll_eyes:", ":face with rolling eyes:", "🙄"}, + {":roller_coaster:", ":roller coaster:", "🎢"}, + {":romania:", ":flag romania:", "🇷🇴"}, + {":rooster:", ":rooster:", "🐓"}, + {":rose:", ":rose:", "🌹"}, + {":rosette:", ":rosette:", "🏵"}, + {":rotating_light:", ":police car light:", "🚨"}, + {":round_pushpin:", ":round pushpin:", "📍"}, + {":rowboat:", ":person rowing boat:", "🚣"}, + {":rowing_man:", ":person rowing boat:", "🚣"}, + {":rowing_woman:", ":woman rowing boat:", "🚣‍♀️"}, + {":ru:", ":flag russia:", "🇷🇺"}, + {":rugby_football:", ":rugby football:", "🏉"}, + {":runner:", ":person running:", "🏃"}, + {":running:", ":person running:", "🏃"}, + {":running_man:", ":person running:", "🏃"}, + {":running_shirt_with_sash:", ":running shirt:", "🎽"}, + {":running_woman:", ":woman running:", "🏃‍♀️"}, + {":rwanda:", ":flag rwanda:", "🇷🇼"}, + {":sa:", ":japanese \"service charge\" button:", "🈂"}, + {":sagittarius:", ":sagittarius:", "♐"}, + {":sailboat:", ":sailboat:", "⛵"}, + {":sake:", ":sake:", "🍶"}, + {":samoa:", ":flag samoa:", "🇼🇸"}, + {":san_marino:", ":flag san marino:", "🇸🇲"}, + {":sandal:", ":woman's sandal:", "👡"}, + {":santa:", ":santa claus:", "🎅"}, + {":sao_tome_principe:", ":flag sĂ£o tomĂ© & prĂ­ncipe:", "🇸🇹"}, + {":satellite:", ":satellite antenna:", "📡"}, + {":satisfied:", ":grinning squinting face:", "😆"}, + {":saudi_arabia:", ":flag saudi arabia:", "🇸🇦"}, + {":saxophone:", ":saxophone:", "🎷"}, + {":school:", ":school:", "🏫"}, + {":school_satchel:", ":backpack:", "🎒"}, + {":scissors:", ":scissors:", "✂"}, + {":scorpion:", ":scorpion:", "🦂"}, + {":scorpius:", ":scorpio:", "♏"}, + {":scream:", ":face screaming in fear:", "😱"}, + {":scream_cat:", ":weary cat face:", "🙀"}, + {":scroll:", ":scroll:", "📜"}, + {":seat:", ":seat:", "💺"}, + {":secret:", ":japanese \"secret\" button:", "㊙"}, + {":see_no_evil:", ":see-no-evil monkey:", "🙈"}, + {":seedling:", ":seedling:", "🌱"}, + {":selfie:", ":selfie:", "🤳"}, + {":senegal:", ":flag senegal:", "🇸🇳"}, + {":serbia:", ":flag serbia:", "🇷🇸"}, + {":seven:", ":keycap 7:", "7️⃣"}, + {":seychelles:", ":flag seychelles:", "🇸🇨"}, + {":shallow_pan_of_food:", ":shallow pan of food:", "🥘"}, + {":shamrock:", ":shamrock:", "☘"}, + {":shark:", ":shark:", "🦈"}, + {":shaved_ice:", ":shaved ice:", "🍧"}, + {":sheep:", ":ewe:", "🐑"}, + {":shell:", ":spiral shell:", "🐚"}, + {":shield:", ":shield:", "🛡"}, + {":shinto_shrine:", ":shinto shrine:", "⛩"}, + {":ship:", ":ship:", "🚢"}, + {":shirt:", ":t-shirt:", "👕"}, + {":shit:", ":pile of poo:", "💩"}, + {":shoe:", ":man's shoe:", "👞"}, + {":shopping:", ":shopping bags:", "🛍"}, + {":shopping_cart:", ":shopping cart:", "🛒"}, + {":shower:", ":shower:", "🚿"}, + {":shrimp:", ":shrimp:", "🦐"}, + {":sierra_leone:", ":flag sierra leone:", "🇸🇱"}, + {":signal_strength:", ":antenna bars:", "📶"}, + {":singapore:", ":flag singapore:", "🇸🇬"}, + {":sint_maarten:", ":flag sint maarten:", "🇸🇽"}, + {":six:", ":keycap 6:", "6️⃣"}, + {":six_pointed_star:", ":dotted six-pointed star:", "🔯"}, + {":ski:", ":skis:", "🎿"}, + {":skier:", ":skier:", "⛷"}, + {":skull:", ":skull:", "💀"}, + {":skull_and_crossbones:", ":skull and crossbones:", "☠"}, + {":sleeping:", ":sleeping face:", "😴"}, + {":sleeping_bed:", ":person in bed:", "🛌"}, + {":sleepy:", ":sleepy face:", "😪"}, + {":slightly_frowning_face:", ":slightly frowning face:", "🙁"}, + {":slightly_smiling_face:", ":slightly smiling face:", "🙂"}, + {":slot_machine:", ":slot machine:", "🎰"}, + {":slovakia:", ":flag slovakia:", "🇸🇰"}, + {":slovenia:", ":flag slovenia:", "🇸🇮"}, + {":small_airplane:", ":small airplane:", "🛩"}, + {":small_blue_diamond:", ":small blue diamond:", "🔹"}, + {":small_orange_diamond:", ":small orange diamond:", "🔸"}, + {":small_red_triangle:", ":red triangle pointed up:", "🔺"}, + {":small_red_triangle_down:", ":red triangle pointed down:", "🔻"}, + {":smile:", ":grinning face with smiling eyes:", "😄"}, + {":smile_cat:", ":grinning cat face with smiling eyes:", "😸"}, + {":smiley:", ":grinning face with big eyes:", "😃"}, + {":smiley_cat:", ":grinning cat face:", "😺"}, + {":smiling_imp:", ":smiling face with horns:", "😈"}, + {":smirk:", ":smirking face:", "😏"}, + {":smirk_cat:", ":cat face with wry smile:", "😼"}, + {":smoking:", ":cigarette:", "🚬"}, + {":snail:", ":snail:", "🐌"}, + {":snake:", ":snake:", "🐍"}, + {":sneezing_face:", ":sneezing face:", "🤧"}, + {":snowboarder:", ":snowboarder:", "🏂"}, + {":snowflake:", ":snowflake:", "❄"}, + {":snowman:", ":snowman without snow:", "⛄"}, + {":snowman_with_snow:", ":snowman:", "☃"}, + {":sob:", ":loudly crying face:", "😭"}, + {":soccer:", ":soccer ball:", "⚽"}, + {":solomon_islands:", ":flag solomon islands:", "🇸🇧"}, + {":somalia:", ":flag somalia:", "🇸🇴"}, + {":soon:", ":soon arrow:", "🔜"}, + {":sos:", ":sos button:", "🆘"}, + {":sound:", ":speaker medium volume:", "🔉"}, + {":south_africa:", ":flag south africa:", "🇿🇦"}, + {":south_georgia_south_sandwich_islands:", ":flag south georgia & south sandwich islands:", "🇬🇸"}, + {":south_sudan:", ":flag south sudan:", "🇸🇸"}, + {":space_invader:", ":alien monster:", "👾"}, + {":spades:", ":spade suit:", "♠"}, + {":spaghetti:", ":spaghetti:", "🍝"}, + {":sparkle:", ":sparkle:", "❇"}, + {":sparkler:", ":sparkler:", "🎇"}, + {":sparkles:", ":sparkles:", "✨"}, + {":sparkling_heart:", ":sparkling heart:", "💖"}, + {":speak_no_evil:", ":speak-no-evil monkey:", "🙊"}, + {":speaker:", ":speaker low volume:", "🔈"}, + {":speaking_head:", ":speaking head:", "🗣"}, + {":speech_balloon:", ":speech balloon:", "💬"}, + {":speedboat:", ":speedboat:", "🚤"}, + {":spider:", ":spider:", "🕷"}, + {":spider_web:", ":spider web:", "🕸"}, + {":spiral_calendar:", ":spiral calendar:", "🗓"}, + {":spiral_notepad:", ":spiral notepad:", "🗒"}, + {":spoon:", ":spoon:", "🥄"}, + {":squid:", ":squid:", "🦑"}, + {":sri_lanka:", ":flag sri lanka:", "🇱🇰"}, + {":st_barthelemy:", ":flag st. barthĂ©lemy:", "🇧🇱"}, + {":st_helena:", ":flag st. helena:", "🇸🇭"}, + {":st_kitts_nevis:", ":flag st. kitts & nevis:", "🇰🇳"}, + {":st_lucia:", ":flag st. lucia:", "🇱🇨"}, + {":st_pierre_miquelon:", ":flag st. pierre & miquelon:", "🇵🇲"}, + {":st_vincent_grenadines:", ":flag st. vincent & grenadines:", "🇻🇨"}, + {":stadium:", ":stadium:", "🏟"}, + {":star:", ":star:", "⭐"}, + {":star2:", ":glowing star:", "🌟"}, + {":star_and_crescent:", ":star and crescent:", "☪"}, + {":star_of_david:", ":star of david:", "✡"}, + {":stars:", ":shooting star:", "🌠"}, + {":station:", ":station:", "🚉"}, + {":statue_of_liberty:", ":statue of liberty:", "🗽"}, + {":steam_locomotive:", ":locomotive:", "🚂"}, + {":stew:", ":pot of food:", "🍲"}, + {":stop_button:", ":stop button:", "⏹"}, + {":stop_sign:", ":stop sign:", "🛑"}, + {":stopwatch:", ":stopwatch:", "⏱"}, + {":straight_ruler:", ":straight ruler:", "📏"}, + {":strawberry:", ":strawberry:", "🍓"}, + {":stuck_out_tongue:", ":face with tongue:", "😛"}, + {":stuck_out_tongue_closed_eyes:", ":squinting face with tongue:", "😝"}, + {":stuck_out_tongue_winking_eye:", ":winking face with tongue:", "😜"}, + {":studio_microphone:", ":studio microphone:", "🎙"}, + {":stuffed_flatbread:", ":stuffed flatbread:", "🥙"}, + {":sudan:", ":flag sudan:", "🇸🇩"}, + {":sun_behind_large_cloud:", ":sun behind large cloud:", "🌥"}, + {":sun_behind_rain_cloud:", ":sun behind rain cloud:", "🌦"}, + {":sun_behind_small_cloud:", ":sun behind small cloud:", "🌤"}, + {":sun_with_face:", ":sun with face:", "🌞"}, + {":sunflower:", ":sunflower:", "🌻"}, + {":sunglasses:", ":smiling face with sunglasses:", "😎"}, + {":sunny:", ":sun:", "☀"}, + {":sunrise:", ":sunrise:", "🌅"}, + {":sunrise_over_mountains:", ":sunrise over mountains:", "🌄"}, + {":surfer:", ":person surfing:", "🏄"}, + {":surfing_man:", ":person surfing:", "🏄"}, + {":surfing_woman:", ":woman surfing:", "🏄‍♀️"}, + {":suriname:", ":flag suriname:", "🇸🇷"}, + {":sushi:", ":sushi:", "🍣"}, + {":suspension_railway:", ":suspension railway:", "🚟"}, + {":swaziland:", ":flag swaziland:", "🇸🇿"}, + {":sweat:", ":downcast face with sweat:", "😓"}, + {":sweat_drops:", ":sweat droplets:", "💦"}, + {":sweat_smile:", ":grinning face with sweat:", "😅"}, + {":sweden:", ":flag sweden:", "🇸🇪"}, + {":sweet_potato:", ":roasted sweet potato:", "🍠"}, + {":swimmer:", ":person swimming:", "🏊"}, + {":swimming_man:", ":person swimming:", "🏊"}, + {":swimming_woman:", ":woman swimming:", "🏊‍♀️"}, + {":switzerland:", ":flag switzerland:", "🇨🇭"}, + {":symbols:", ":input symbols:", "🔣"}, + {":synagogue:", ":synagogue:", "🕍"}, + {":syria:", ":flag syria:", "🇸🇾"}, + {":syringe:", ":syringe:", "💉"}, + {":taco:", ":taco:", "🌮"}, + {":tada:", ":party popper:", "🎉"}, + {":taiwan:", ":flag taiwan:", "🇹🇼"}, + {":tajikistan:", ":flag tajikistan:", "🇹🇯"}, + {":tanabata_tree:", ":tanabata tree:", "🎋"}, + {":tangerine:", ":tangerine:", "🍊"}, + {":tanzania:", ":flag tanzania:", "🇹🇿"}, + {":taurus:", ":taurus:", "♉"}, + {":taxi:", ":taxi:", "🚕"}, + {":tea:", ":teacup without handle:", "🍵"}, + {":telephone:", ":telephone:", "☎"}, + {":telephone_receiver:", ":telephone receiver:", "📞"}, + {":telescope:", ":telescope:", "🔭"}, + {":tennis:", ":tennis:", "🎾"}, + {":tent:", ":tent:", "⛺"}, + {":thailand:", ":flag thailand:", "🇹🇭"}, + {":thermometer:", ":thermometer:", "🌡"}, + {":thinking:", ":thinking face:", "🤔"}, + {":thought_balloon:", ":thought balloon:", "💭"}, + {":three:", ":keycap 3:", "3️⃣"}, + {":thumbsdown:", ":thumbs down:", "👎"}, + {":thumbsup:", ":thumbs up:", "👍"}, + {":ticket:", ":ticket:", "🎫"}, + {":tickets:", ":admission tickets:", "🎟"}, + {":tiger:", ":tiger face:", "🐯"}, + {":tiger2:", ":tiger:", "🐅"}, + {":timer_clock:", ":timer clock:", "⏲"}, + {":timor_leste:", ":flag timor-leste:", "🇹🇱"}, + {":tipping_hand_man:", ":man tipping hand:", "💁‍♂️"}, + {":tipping_hand_woman:", ":person tipping hand:", "💁"}, + {":tired_face:", ":tired face:", "😫"}, + {":tm:", ":trade mark:", "™"}, + {":togo:", ":flag togo:", "🇹🇬"}, + {":toilet:", ":toilet:", "🚽"}, + {":tokelau:", ":flag tokelau:", "🇹🇰"}, + {":tokyo_tower:", ":tokyo tower:", "🗼"}, + {":tomato:", ":tomato:", "🍅"}, + {":tonga:", ":flag tonga:", "🇹🇴"}, + {":tongue:", ":tongue:", "👅"}, + {":top:", ":top arrow:", "🔝"}, + {":tophat:", ":top hat:", "🎩"}, + {":tornado:", ":tornado:", "🌪"}, + {":tr:", ":flag turkey:", "🇹🇷"}, + {":trackball:", ":trackball:", "🖲"}, + {":tractor:", ":tractor:", "🚜"}, + {":traffic_light:", ":horizontal traffic light:", "🚥"}, + {":train:", ":tram car:", "🚋"}, + {":train2:", ":train:", "🚆"}, + {":tram:", ":tram:", "🚊"}, + {":triangular_flag_on_post:", ":triangular flag:", "🚩"}, + {":triangular_ruler:", ":triangular ruler:", "📐"}, + {":trident:", ":trident emblem:", "🔱"}, + {":trinidad_tobago:", ":flag trinidad & tobago:", "🇹🇹"}, + {":triumph:", ":face with steam from nose:", "😤"}, + {":trolleybus:", ":trolleybus:", "🚎"}, + {":trophy:", ":trophy:", "🏆"}, + {":tropical_drink:", ":tropical drink:", "🍹"}, + {":tropical_fish:", ":tropical fish:", "🐠"}, + {":truck:", ":delivery truck:", "🚚"}, + {":trumpet:", ":trumpet:", "🎺"}, + {":tshirt:", ":t-shirt:", "👕"}, + {":tulip:", ":tulip:", "🌷"}, + {":tumbler_glass:", ":tumbler glass:", "🥃"}, + {":tunisia:", ":flag tunisia:", "🇹🇳"}, + {":turkey:", ":turkey:", "🦃"}, + {":turkmenistan:", ":flag turkmenistan:", "🇹🇲"}, + {":turks_caicos_islands:", ":flag turks & caicos islands:", "🇹🇨"}, + {":turtle:", ":turtle:", "🐢"}, + {":tuvalu:", ":flag tuvalu:", "🇹🇻"}, + {":tv:", ":television:", "📺"}, + {":twisted_rightwards_arrows:", ":shuffle tracks button:", "🔀"}, + {":two:", ":keycap 2:", "2️⃣"}, + {":two_hearts:", ":two hearts:", "💕"}, + {":two_men_holding_hands:", ":two men holding hands:", "👬"}, + {":two_women_holding_hands:", ":two women holding hands:", "👭"}, + {":u5272:", ":japanese \"discount\" button:", "🈹"}, + {":u5408:", ":japanese \"passing grade\" button:", "🈴"}, + {":u55b6:", ":japanese \"open for business\" button:", "🈺"}, + {":u6307:", ":japanese \"reserved\" button:", "🈯"}, + {":u6708:", ":japanese \"monthly amount\" button:", "🈷"}, + {":u6709:", ":japanese \"not free of charge\" button:", "🈶"}, + {":u6e80:", ":japanese \"no vacancy\" button:", "🈵"}, + {":u7121:", ":japanese \"free of charge\" button:", "🈚"}, + {":u7533:", ":japanese \"application\" button:", "🈸"}, + {":u7981:", ":japanese \"prohibited\" button:", "🈲"}, + {":u7a7a:", ":japanese \"vacancy\" button:", "🈳"}, + {":uganda:", ":flag uganda:", "🇺🇬"}, + {":uk:", ":flag united kingdom:", "🇬🇧"}, + {":ukraine:", ":flag ukraine:", "🇺🇦"}, + {":umbrella:", ":umbrella with rain drops:", "☔"}, + {":unamused:", ":unamused face:", "😒"}, + {":underage:", ":no one under eighteen:", "🔞"}, + {":unicorn:", ":unicorn face:", "🦄"}, + {":united_arab_emirates:", ":flag united arab emirates:", "🇦🇪"}, + {":unlock:", ":unlocked:", "🔓"}, + {":up:", ":up! button:", "🆙"}, + {":upside_down_face:", ":upside-down face:", "🙃"}, + {":uruguay:", ":flag uruguay:", "🇺🇾"}, + {":us:", ":flag united states:", "🇺🇸"}, + {":us_virgin_islands:", ":flag u.s. virgin islands:", "🇻🇮"}, + {":uzbekistan:", ":flag uzbekistan:", "🇺🇿"}, + {":v:", ":victory hand:", "✌"}, + {":vanuatu:", ":flag vanuatu:", "🇻🇺"}, + {":vatican_city:", ":flag vatican city:", "🇻🇦"}, + {":venezuela:", ":flag venezuela:", "🇻🇪"}, + {":vertical_traffic_light:", ":vertical traffic light:", "🚦"}, + {":vhs:", ":videocassette:", "📼"}, + {":vibration_mode:", ":vibration mode:", "📳"}, + {":video_camera:", ":video camera:", "📹"}, + {":video_game:", ":video game:", "🎮"}, + {":vietnam:", ":flag vietnam:", "🇻🇳"}, + {":violin:", ":violin:", "🎻"}, + {":virgo:", ":virgo:", "♍"}, + {":volcano:", ":volcano:", "🌋"}, + {":volleyball:", ":volleyball:", "🏐"}, + {":vs:", ":vs button:", "🆚"}, + {":vulcan_salute:", ":vulcan salute:", "🖖"}, + {":walking:", ":person walking:", "🚶"}, + {":walking_man:", ":person walking:", "🚶"}, + {":walking_woman:", ":woman walking:", "🚶‍♀️"}, + {":wallis_futuna:", ":flag wallis & futuna:", "🇼🇫"}, + {":waning_crescent_moon:", ":waning crescent moon:", "🌘"}, + {":waning_gibbous_moon:", ":waning gibbous moon:", "🌖"}, + {":warning:", ":warning:", "⚠"}, + {":wastebasket:", ":wastebasket:", "🗑"}, + {":watch:", ":watch:", "⌚"}, + {":water_buffalo:", ":water buffalo:", "🐃"}, + {":watermelon:", ":watermelon:", "🍉"}, + {":wave:", ":waving hand:", "👋"}, + {":wavy_dash:", ":wavy dash:", "〰"}, + {":waxing_crescent_moon:", ":waxing crescent moon:", "🌒"}, + {":waxing_gibbous_moon:", ":waxing gibbous moon:", "🌔"}, + {":wc:", ":water closet:", "🚾"}, + {":weary:", ":weary face:", "😩"}, + {":wedding:", ":wedding:", "💒"}, + {":weight_lifting_man:", ":person lifting weights:", "🏋"}, + {":weight_lifting_woman:", ":woman lifting weights:", "🏋️‍♀️"}, + {":western_sahara:", ":flag western sahara:", "🇪🇭"}, + {":whale:", ":spouting whale:", "🐳"}, + {":whale2:", ":whale:", "🐋"}, + {":wheel_of_dharma:", ":wheel of dharma:", "☸"}, + {":wheelchair:", ":wheelchair symbol:", "♿"}, + {":white_check_mark:", ":white heavy check mark:", "✅"}, + {":white_circle:", ":white circle:", "⚪"}, + {":white_flag:", ":white flag:", "🏳"}, + {":white_flower:", ":white flower:", "💮"}, + {":white_large_square:", ":white large square:", "⬜"}, + {":white_medium_small_square:", ":white medium-small square:", "◽"}, + {":white_medium_square:", ":white medium square:", "◻"}, + {":white_small_square:", ":white small square:", "▫"}, + {":white_square_button:", ":white square button:", "🔳"}, + {":wilted_flower:", ":wilted flower:", "🥀"}, + {":wind_chime:", ":wind chime:", "🎐"}, + {":wind_face:", ":wind face:", "🌬"}, + {":wine_glass:", ":wine glass:", "🍷"}, + {":wink:", ":winking face:", "😉"}, + {":wolf:", ":wolf face:", "🐺"}, + {":woman:", ":woman:", "👩"}, + {":woman_artist:", ":woman artist:", "👩‍🎨"}, + {":woman_astronaut:", ":woman astronaut:", "👩‍🚀"}, + {":woman_cartwheeling:", ":woman cartwheeling:", "🤸‍♀️"}, + {":woman_cook:", ":woman cook:", "👩‍🍳"}, + {":woman_facepalming:", ":woman facepalming:", "🤦‍♀️"}, + {":woman_factory_worker:", ":woman factory worker:", "👩‍🏭"}, + {":woman_farmer:", ":woman farmer:", "👩‍🌾"}, + {":woman_firefighter:", ":woman firefighter:", "👩‍🚒"}, + {":woman_health_worker:", ":woman health worker:", "👩‍⚕️"}, + {":woman_judge:", ":woman judge:", "👩‍⚖️"}, + {":woman_juggling:", ":woman juggling:", "🤹‍♀️"}, + {":woman_mechanic:", ":woman mechanic:", "👩‍🔧"}, + {":woman_office_worker:", ":woman office worker:", "👩‍💼"}, + {":woman_pilot:", ":woman pilot:", "👩‍✈️"}, + {":woman_playing_handball:", ":woman playing handball:", "🤾‍♀️"}, + {":woman_playing_water_polo:", ":woman playing water polo:", "🤽‍♀️"}, + {":woman_scientist:", ":woman scientist:", "👩‍🔬"}, + {":woman_shrugging:", ":woman shrugging:", "🤷‍♀️"}, + {":woman_singer:", ":woman singer:", "👩‍🎤"}, + {":woman_student:", ":woman student:", "👩‍🎓"}, + {":woman_teacher:", ":woman teacher:", "👩‍🏫"}, + {":woman_technologist:", ":woman technologist:", "👩‍💻"}, + {":woman_with_turban:", ":woman wearing turban:", "👳‍♀️"}, + {":womans_clothes:", ":woman's clothes:", "👚"}, + {":womans_hat:", ":woman's hat:", "👒"}, + {":women_wrestling:", ":women wrestling:", "🤼‍♀️"}, + {":womens:", ":women's room:", "🚺"}, + {":world_map:", ":world map:", "🗺"}, + {":worried:", ":worried face:", "😟"}, + {":wrench:", ":wrench:", "🔧"}, + {":writing_hand:", ":writing hand:", "✍"}, + {":x:", ":cross mark:", "❌"}, + {":yellow_heart:", ":yellow heart:", "💛"}, + {":yemen:", ":flag yemen:", "🇾🇪"}, + {":yen:", ":yen banknote:", "💴"}, + {":yin_yang:", ":yin yang:", "☯"}, + {":yum:", ":face savoring food:", "😋"}, + {":zambia:", ":flag zambia:", "🇿🇲"}, + {":zap:", ":high voltage:", "⚡"}, + {":zero:", ":keycap 0:", "0️⃣"}, + {":zimbabwe:", ":flag zimbabwe:", "🇿🇼"}, + {":zipper_mouth_face:", ":zipper-mouth face:", "🤐"}, + {":zzz:", ":zzz:", "💤"}, + {"", ":smiling face with 3 hearts:", "🥰"}, + {"", ":star-struck:", "🤩"}, + {"", ":zany face:", "🤪"}, + {"", ":face with hand over mouth:", "🤭"}, + {"", ":shushing face:", "🤫"}, + {"", ":face with raised eyebrow:", "🤨"}, + {"", ":face vomiting:", "🤮"}, + {"", ":hot face:", "🥵"}, + {"", ":cold face:", "🥶"}, + {"", ":woozy face:", "🥴"}, + {"", ":exploding head:", "🤯"}, + {"", ":partying face:", "🥳"}, + {"", ":face with monocle:", "🧐"}, + {"", ":pleading face:", "🥺"}, + {"", ":face with symbols on mouth:", "🤬"}, + {"", ":orange heart:", "🧡"}, + {"", ":left speech bubble:", "🗨"}, + {"", ":love-you gesture:", "🤟"}, + {"", ":palms up together:", "🤲"}, + {"", ":leg:", "🦵"}, + {"", ":foot:", "🦶"}, + {"", ":brain:", "🧠"}, + {"", ":tooth:", "🦷"}, + {"", ":bone:", "🦴"}, + {"", ":eye:", "👁"}, + {"", ":child:", "🧒"}, + {"", ":person:", "🧑"}, + {"", ":man blond hair:", "👱‍♂️"}, + {"", ":man red hair:", "👨‍🦰"}, + {"", ":man curly hair:", "👨‍🦱"}, + {"", ":man white hair:", "👨‍🦳"}, + {"", ":man bald:", "👨‍🦲"}, + {"", ":man beard:", "🧔"}, + {"", ":woman red hair:", "👩‍🦰"}, + {"", ":woman curly hair:", "👩‍🦱"}, + {"", ":woman white hair:", "👩‍🦳"}, + {"", ":woman bald:", "👩‍🦲"}, + {"", ":older person:", "🧓"}, + {"", ":woman frowning:", "🙍‍♀️"}, + {"", ":woman pouting:", "🙎‍♀️"}, + {"", ":woman gesturing no:", "🙅‍♀️"}, + {"", ":woman gesturing ok:", "🙆‍♀️"}, + {"", ":woman tipping hand:", "💁‍♀️"}, + {"", ":woman raising hand:", "🙋‍♀️"}, + {"", ":man bowing:", "🙇‍♂️"}, + {"", ":person facepalming:", "🤦"}, + {"", ":person shrugging:", "🤷"}, + {"", ":man police officer:", "👮‍♂️"}, + {"", ":man detective:", "🕵️‍♂️"}, + {"", ":man guard:", "💂‍♂️"}, + {"", ":man construction worker:", "👷‍♂️"}, + {"", ":man wearing turban:", "👳‍♂️"}, + {"", ":woman with headscarf:", "🧕"}, + {"", ":breast-feeding:", "🤱"}, + {"", ":superhero:", "🦸"}, + {"", ":man superhero:", "🦸‍♂️"}, + {"", ":woman superhero:", "🦸‍♀️"}, + {"", ":supervillain:", "🦹"}, + {"", ":man supervillain:", "🦹‍♂️"}, + {"", ":woman supervillain:", "🦹‍♀️"}, + {"", ":mage:", "🧙"}, + {"", ":man mage:", "🧙‍♂️"}, + {"", ":woman mage:", "🧙‍♀️"}, + {"", ":fairy:", "🧚"}, + {"", ":man fairy:", "🧚‍♂️"}, + {"", ":woman fairy:", "🧚‍♀️"}, + {"", ":vampire:", "🧛"}, + {"", ":man vampire:", "🧛‍♂️"}, + {"", ":woman vampire:", "🧛‍♀️"}, + {"", ":merperson:", "🧜"}, + {"", ":merman:", "🧜‍♂️"}, + {"", ":mermaid:", "🧜‍♀️"}, + {"", ":elf:", "🧝"}, + {"", ":man elf:", "🧝‍♂️"}, + {"", ":woman elf:", "🧝‍♀️"}, + {"", ":genie:", "🧞"}, + {"", ":man genie:", "🧞‍♂️"}, + {"", ":woman genie:", "🧞‍♀️"}, + {"", ":zombie:", "🧟"}, + {"", ":man zombie:", "🧟‍♂️"}, + {"", ":woman zombie:", "🧟‍♀️"}, + {"", ":woman getting massage:", "💆‍♀️"}, + {"", ":woman getting haircut:", "💇‍♀️"}, + {"", ":man walking:", "🚶‍♂️"}, + {"", ":man running:", "🏃‍♂️"}, + {"", ":women with bunny ears:", "👯‍♀️"}, + {"", ":person in steamy room:", "🧖"}, + {"", ":man in steamy room:", "🧖‍♂️"}, + {"", ":woman in steamy room:", "🧖‍♀️"}, + {"", ":person climbing:", "🧗"}, + {"", ":man climbing:", "🧗‍♂️"}, + {"", ":woman climbing:", "🧗‍♀️"}, + {"", ":man golfing:", "🏌️‍♂️"}, + {"", ":man surfing:", "🏄‍♂️"}, + {"", ":man rowing boat:", "🚣‍♂️"}, + {"", ":man swimming:", "🏊‍♂️"}, + {"", ":man bouncing ball:", "⛹️‍♂️"}, + {"", ":man lifting weights:", "🏋️‍♂️"}, + {"", ":man biking:", "🚴‍♂️"}, + {"", ":man mountain biking:", "🚵‍♂️"}, + {"", ":person cartwheeling:", "🤸"}, + {"", ":people wrestling:", "🤼"}, + {"", ":person playing water polo:", "🤽"}, + {"", ":person playing handball:", "🤾"}, + {"", ":person juggling:", "🤹"}, + {"", ":person in lotus position:", "🧘"}, + {"", ":man in lotus position:", "🧘‍♂️"}, + {"", ":woman in lotus position:", "🧘‍♀️"}, + {"", ":kiss woman, man:", "👩‍❤️‍💋‍👨"}, + {"", ":couple with heart woman, man:", "👩‍❤️‍👨"}, + {"", ":couple with heart man, man:", "👨‍❤️‍👨"}, + {"", ":couple with heart woman, woman:", "👩‍❤️‍👩"}, + {"", ":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:", "👩‍👧‍👧"}, + {"", ":red hair:", "🦰"}, + {"", ":curly hair:", "🦱"}, + {"", ":white hair:", "🦳"}, + {"", ":bald:", "🦲"}, + {"", ":female sign:", "♀"}, + {"", ":male sign:", "♂"}, + {"", ":raccoon:", "🦝"}, + {"", ":zebra:", "🦓"}, + {"", ":llama:", "🦙"}, + {"", ":giraffe:", "🦒"}, + {"", ":hippopotamus:", "🦛"}, + {"", ":hedgehog:", "🦔"}, + {"", ":kangaroo:", "🦘"}, + {"", ":badger:", "🦡"}, + {"", ":swan:", "🦢"}, + {"", ":peacock:", "🦚"}, + {"", ":parrot:", "🦜"}, + {"", ":sauropod:", "🦕"}, + {"", ":t-rex:", "🦖"}, + {"", ":cricket:", "🦗"}, + {"", ":mosquito:", "🦟"}, + {"", ":microbe:", "🦠"}, + {"", ":mango:", "🥭"}, + {"", ":coconut:", "🥥"}, + {"", ":leafy green:", "🥬"}, + {"", ":broccoli:", "🥦"}, + {"", ":pretzel:", "🥨"}, + {"", ":bagel:", "🥯"}, + {"", ":cut of meat:", "🥩"}, + {"", ":sandwich:", "🥪"}, + {"", ":bowl with spoon:", "🥣"}, + {"", ":salt:", "🧂"}, + {"", ":canned food:", "🥫"}, + {"", ":moon cake:", "🥮"}, + {"", ":dumpling:", "🥟"}, + {"", ":fortune cookie:", "🥠"}, + {"", ":takeout box:", "🥡"}, + {"", ":lobster:", "🦞"}, + {"", ":cupcake:", "🧁"}, + {"", ":pie:", "🥧"}, + {"", ":cup with straw:", "🥤"}, + {"", ":chopsticks:", "🥢"}, + {"", ":compass:", "🧭"}, + {"", ":brick:", "🧱"}, + {"", ":skateboard:", "🛹"}, + {"", ":flying saucer:", "🛸"}, + {"", ":luggage:", "🧳"}, + {"", ":firecracker:", "🧨"}, + {"", ":red envelope:", "🧧"}, + {"", ":softball:", "🥎"}, + {"", ":flying disc:", "🥏"}, + {"", ":lacrosse:", "🥍"}, + {"", ":sled:", "🛷"}, + {"", ":curling stone:", "🥌"}, + {"", ":nazar amulet:", "🧿"}, + {"", ":jigsaw:", "🧩"}, + {"", ":teddy bear:", "🧸"}, + {"", ":chess pawn:", "♟"}, + {"", ":thread:", "🧵"}, + {"", ":yarn:", "🧶"}, + {"", ":goggles:", "🥽"}, + {"", ":lab coat:", "🥼"}, + {"", ":scarf:", "🧣"}, + {"", ":gloves:", "🧤"}, + {"", ":coat:", "🧥"}, + {"", ":socks:", "🧦"}, + {"", ":hiking boot:", "🥾"}, + {"", ":flat shoe:", "🥿"}, + {"", ":billed cap:", "🧢"}, + {"", ":abacus:", "🧮"}, + {"", ":receipt:", "🧾"}, + {"", ":toolbox:", "🧰"}, + {"", ":magnet:", "🧲"}, + {"", ":test tube:", "🧪"}, + {"", ":petri dish:", "🧫"}, + {"", ":dna:", "🧬"}, + {"", ":lotion bottle:", "🧴"}, + {"", ":safety pin:", "🧷"}, + {"", ":broom:", "🧹"}, + {"", ":basket:", "🧺"}, + {"", ":roll of paper:", "🧻"}, + {"", ":soap:", "🧼"}, + {"", ":sponge:", "🧽"}, + {"", ":fire extinguisher:", "🧯"}, + {"", ":eject button:", "⏏"}, + {"", ":medical symbol:", "⚕"}, + {"", ":infinity:", "♾"}, + {"", ":pirate flag:", "🏴‍☠️"}, + {"", ":flag ascension island:", "🇦🇨"}, + {"", ":flag bouvet island:", "🇧🇻"}, + {"", ":flag clipperton island:", "🇨🇵"}, + {"", ":flag diego garcia:", "🇩🇬"}, + {"", ":flag ceuta & melilla:", "🇪🇦"}, + {"", ":flag heard & mcdonald islands:", "🇭🇲"}, + {"", ":flag st. martin:", "🇲🇫"}, + {"", ":flag svalbard & jan mayen:", "🇸🇯"}, + {"", ":flag tristan da cunha:", "🇹🇦"}, + {"", ":flag u.s. outlying islands:", "🇺🇲"}, + {"", ":flag united nations:", "🇺🇳"}, + {"", ":flag england:", "🏴󠁧󠁢󠁥󠁮󠁧󠁿"}, + {"", ":flag scotland:", "🏴󠁧󠁢󠁳󠁣󠁴󠁿"}, + {"", ":flag wales:", "🏴󠁧󠁢󠁷󠁬󠁳󠁿"}, + {"", ":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 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 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 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 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 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:", "👌🏿"}, + {"", ":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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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:", "🤜🏿"}, + {"", ":clapping hands light skin tone:", "👏🏻"}, + {"", ":clapping hands medium-light skin tone:", "👏🏼"}, + {"", ":clapping hands medium skin tone:", "👏🏽"}, + {"", ":clapping hands medium-dark skin tone:", "👏🏾"}, + {"", ":clapping hands dark skin tone:", "👏🏿"}, + {"", ":raising hands light skin tone:", "🙌🏻"}, + {"", ":raising hands medium-light skin tone:", "🙌🏼"}, + {"", ":raising hands medium skin tone:", "🙌🏽"}, + {"", ":raising hands medium-dark skin tone:", "🙌🏾"}, + {"", ":raising hands dark skin tone:", "🙌🏿"}, + {"", ":open hands light skin tone:", "👐🏻"}, + {"", ":open hands medium-light skin tone:", "👐🏼"}, + {"", ":open hands medium skin tone:", "👐🏽"}, + {"", ":open hands medium-dark skin tone:", "👐🏾"}, + {"", ":open hands dark skin tone:", "👐🏿"}, + {"", ":palms up together light skin tone:", "🤲🏻"}, + {"", ":palms up together medium-light skin tone:", "🤲🏼"}, + {"", ":palms up together medium skin tone:", "🤲🏽"}, + {"", ":palms up together medium-dark skin tone:", "🤲🏾"}, + {"", ":palms up together dark skin tone:", "🤲🏿"}, + {"", ":folded hands light skin tone:", "🙏🏻"}, + {"", ":folded hands medium-light skin tone:", "🙏🏼"}, + {"", ":folded hands medium skin tone:", "🙏🏽"}, + {"", ":folded hands medium-dark skin tone:", "🙏🏾"}, + {"", ":folded hands dark skin tone:", "🙏🏿"}, + {"", ":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 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 light skin tone:", "🤳🏻"}, + {"", ":selfie medium-light skin tone:", "🤳🏼"}, + {"", ":selfie medium skin tone:", "🤳🏽"}, + {"", ":selfie medium-dark skin tone:", "🤳🏾"}, + {"", ":selfie dark skin tone:", "🤳🏿"}, + {"", ":flexed biceps light skin tone:", "💪🏻"}, + {"", ":flexed biceps medium-light skin tone:", "💪🏼"}, + {"", ":flexed biceps medium skin tone:", "💪🏽"}, + {"", ":flexed biceps medium-dark skin tone:", "💪🏾"}, + {"", ":flexed biceps dark skin tone:", "💪🏿"}, + {"", ":leg light skin tone:", "🦵🏻"}, + {"", ":leg medium-light skin tone:", "🦵🏼"}, + {"", ":leg medium skin tone:", "🦵🏽"}, + {"", ":leg medium-dark skin tone:", "🦵🏾"}, + {"", ":leg dark skin tone:", "🦵🏿"}, + {"", ":foot light skin tone:", "🦶🏻"}, + {"", ":foot medium-light skin tone:", "🦶🏼"}, + {"", ":foot medium skin tone:", "🦶🏽"}, + {"", ":foot medium-dark skin tone:", "🦶🏾"}, + {"", ":foot dark skin tone:", "🦶🏿"}, + {"", ":ear light skin tone:", "👂🏻"}, + {"", ":ear medium-light skin tone:", "👂🏼"}, + {"", ":ear medium skin tone:", "👂🏽"}, + {"", ":ear medium-dark skin tone:", "👂🏾"}, + {"", ":ear dark skin tone:", "👂🏿"}, + {"", ":nose light skin tone:", "👃🏻"}, + {"", ":nose medium-light skin tone:", "👃🏼"}, + {"", ":nose medium skin tone:", "👃🏽"}, + {"", ":nose medium-dark skin tone:", "👃🏾"}, + {"", ":nose dark skin tone:", "👃🏿"}, + {"", ":baby light skin tone:", "👶🏻"}, + {"", ":baby medium-light skin tone:", "👶🏼"}, + {"", ":baby medium skin tone:", "👶🏽"}, + {"", ":baby medium-dark skin tone:", "👶🏾"}, + {"", ":baby dark skin tone:", "👶🏿"}, + {"", ":child light skin tone:", "🧒🏻"}, + {"", ":child medium-light skin tone:", "🧒🏼"}, + {"", ":child medium skin tone:", "🧒🏽"}, + {"", ":child medium-dark skin tone:", "🧒🏾"}, + {"", ":child dark skin tone:", "🧒🏿"}, + {"", ":boy light skin tone:", "👦🏻"}, + {"", ":boy medium-light skin tone:", "👦🏼"}, + {"", ":boy medium skin tone:", "👦🏽"}, + {"", ":boy medium-dark skin tone:", "👦🏾"}, + {"", ":boy dark skin tone:", "👦🏿"}, + {"", ":girl light skin tone:", "👧🏻"}, + {"", ":girl medium-light skin tone:", "👧🏼"}, + {"", ":girl medium skin tone:", "👧🏽"}, + {"", ":girl medium-dark skin tone:", "👧🏾"}, + {"", ":girl dark skin tone:", "👧🏿"}, + {"", ":person light skin tone:", "🧑🏻"}, + {"", ":person medium-light skin tone:", "🧑🏼"}, + {"", ":person medium skin tone:", "🧑🏽"}, + {"", ":person medium-dark skin tone:", "🧑🏾"}, + {"", ":person dark skin tone:", "🧑🏿"}, + {"", ":person light skin tone, blond hair:", "👱🏻"}, + {"", ":person medium-light skin tone, blond hair:", "👱🏼"}, + {"", ":person medium skin tone, blond hair:", "👱🏽"}, + {"", ":person medium-dark skin tone, blond hair:", "👱🏾"}, + {"", ":person dark skin tone, blond hair:", "👱🏿"}, + {"", ":man light skin tone:", "👨🏻"}, + {"", ":man medium-light skin tone:", "👨🏼"}, + {"", ":man medium skin tone:", "👨🏽"}, + {"", ":man medium-dark skin tone:", "👨🏾"}, + {"", ":man dark skin tone:", "👨🏿"}, + {"", ":man light skin tone, blond hair:", "👱🏻‍♂️"}, + {"", ":man medium-light skin tone, blond hair:", "👱🏼‍♂️"}, + {"", ":man medium skin tone, blond hair:", "👱🏽‍♂️"}, + {"", ":man medium-dark skin tone, blond hair:", "👱🏾‍♂️"}, + {"", ":man dark skin tone, blond hair:", "👱🏿‍♂️"}, + {"", ":man light skin tone, red hair:", "👨🏻‍🦰"}, + {"", ":man medium-light skin tone, red hair:", "👨🏼‍🦰"}, + {"", ":man medium skin tone, red hair:", "👨🏽‍🦰"}, + {"", ":man medium-dark skin tone, red hair:", "👨🏾‍🦰"}, + {"", ":man dark skin tone, red hair:", "👨🏿‍🦰"}, + {"", ":man light skin tone, curly hair:", "👨🏻‍🦱"}, + {"", ":man medium-light skin tone, curly hair:", "👨🏼‍🦱"}, + {"", ":man medium skin tone, curly hair:", "👨🏽‍🦱"}, + {"", ":man medium-dark skin tone, curly hair:", "👨🏾‍🦱"}, + {"", ":man dark skin tone, curly hair:", "👨🏿‍🦱"}, + {"", ":man light skin tone, white hair:", "👨🏻‍🦳"}, + {"", ":man medium-light skin tone, white hair:", "👨🏼‍🦳"}, + {"", ":man medium skin tone, white hair:", "👨🏽‍🦳"}, + {"", ":man medium-dark skin tone, white hair:", "👨🏾‍🦳"}, + {"", ":man dark skin tone, white hair:", "👨🏿‍🦳"}, + {"", ":man light skin tone, bald:", "👨🏻‍🦲"}, + {"", ":man medium-light skin tone, bald:", "👨🏼‍🦲"}, + {"", ":man medium skin tone, bald:", "👨🏽‍🦲"}, + {"", ":man medium-dark skin tone, bald:", "👨🏾‍🦲"}, + {"", ":man dark skin tone, bald:", "👨🏿‍🦲"}, + {"", ":man light skin tone, beard:", "🧔🏻"}, + {"", ":man medium-light skin tone, beard:", "🧔🏼"}, + {"", ":man medium skin tone, beard:", "🧔🏽"}, + {"", ":man medium-dark skin tone, beard:", "🧔🏾"}, + {"", ":man dark skin tone, beard:", "🧔🏿"}, + {"", ":woman light skin tone:", "👩🏻"}, + {"", ":woman medium-light skin tone:", "👩🏼"}, + {"", ":woman medium skin tone:", "👩🏽"}, + {"", ":woman medium-dark skin tone:", "👩🏾"}, + {"", ":woman dark skin tone:", "👩🏿"}, + {"", ":woman light skin tone, blond hair:", "👱🏻‍♀️"}, + {"", ":woman medium-light skin tone, blond hair:", "👱🏼‍♀️"}, + {"", ":woman medium skin tone, blond hair:", "👱🏽‍♀️"}, + {"", ":woman medium-dark skin tone, blond hair:", "👱🏾‍♀️"}, + {"", ":woman dark skin tone, blond hair:", "👱🏿‍♀️"}, + {"", ":woman light skin tone, red hair:", "👩🏻‍🦰"}, + {"", ":woman medium-light skin tone, red hair:", "👩🏼‍🦰"}, + {"", ":woman medium skin tone, red hair:", "👩🏽‍🦰"}, + {"", ":woman medium-dark skin tone, red hair:", "👩🏾‍🦰"}, + {"", ":woman dark skin tone, red hair:", "👩🏿‍🦰"}, + {"", ":woman light skin tone, curly hair:", "👩🏻‍🦱"}, + {"", ":woman medium-light skin tone, curly hair:", "👩🏼‍🦱"}, + {"", ":woman medium skin tone, curly hair:", "👩🏽‍🦱"}, + {"", ":woman medium-dark skin tone, curly hair:", "👩🏾‍🦱"}, + {"", ":woman dark skin tone, curly hair:", "👩🏿‍🦱"}, + {"", ":woman light skin tone, white hair:", "👩🏻‍🦳"}, + {"", ":woman medium-light skin tone, white hair:", "👩🏼‍🦳"}, + {"", ":woman medium skin tone, white hair:", "👩🏽‍🦳"}, + {"", ":woman medium-dark skin tone, white hair:", "👩🏾‍🦳"}, + {"", ":woman dark skin tone, white hair:", "👩🏿‍🦳"}, + {"", ":woman light skin tone, bald:", "👩🏻‍🦲"}, + {"", ":woman medium-light skin tone, bald:", "👩🏼‍🦲"}, + {"", ":woman medium skin tone, bald:", "👩🏽‍🦲"}, + {"", ":woman medium-dark skin tone, bald:", "👩🏾‍🦲"}, + {"", ":woman dark skin tone, bald:", "👩🏿‍🦲"}, + {"", ":older person light skin tone:", "🧓🏻"}, + {"", ":older person medium-light skin tone:", "🧓🏼"}, + {"", ":older person medium skin tone:", "🧓🏽"}, + {"", ":older person medium-dark skin tone:", "🧓🏾"}, + {"", ":older person dark skin tone:", "🧓🏿"}, + {"", ":old man light skin tone:", "👴🏻"}, + {"", ":old man medium-light skin tone:", "👴🏼"}, + {"", ":old man medium skin tone:", "👴🏽"}, + {"", ":old man medium-dark skin tone:", "👴🏾"}, + {"", ":old man dark skin tone:", "👴🏿"}, + {"", ":old woman light skin tone:", "👵🏻"}, + {"", ":old woman medium-light skin tone:", "👵🏼"}, + {"", ":old woman medium skin tone:", "👵🏽"}, + {"", ":old woman medium-dark skin tone:", "👵🏾"}, + {"", ":old woman dark skin tone:", "👵🏿"}, + {"", ":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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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:", "🙋🏿‍♀️"}, + {"", ":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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 light skin tone:", "🕵🏻"}, + {"", ":detective medium-light skin tone:", "🕵🏼"}, + {"", ":detective medium skin tone:", "🕵🏽"}, + {"", ":detective medium-dark skin tone:", "🕵🏾"}, + {"", ":detective dark skin tone:", "🕵🏿"}, + {"", ":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 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 light skin tone:", "💂🏻"}, + {"", ":guard medium-light skin tone:", "💂🏼"}, + {"", ":guard medium skin tone:", "💂🏽"}, + {"", ":guard medium-dark skin tone:", "💂🏾"}, + {"", ":guard dark skin tone:", "💂🏿"}, + {"", ":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 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 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 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 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 light skin tone:", "🤴🏻"}, + {"", ":prince medium-light skin tone:", "🤴🏼"}, + {"", ":prince medium skin tone:", "🤴🏽"}, + {"", ":prince medium-dark skin tone:", "🤴🏾"}, + {"", ":prince dark skin tone:", "🤴🏿"}, + {"", ":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 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 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 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 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 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 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 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 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 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 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 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 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 light skin tone:", "🦸🏻"}, + {"", ":superhero medium-light skin tone:", "🦸🏼"}, + {"", ":superhero medium skin tone:", "🦸🏽"}, + {"", ":superhero medium-dark skin tone:", "🦸🏾"}, + {"", ":superhero dark skin tone:", "🦸🏿"}, + {"", ":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 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 light skin tone:", "🦹🏻"}, + {"", ":supervillain medium-light skin tone:", "🦹🏼"}, + {"", ":supervillain medium skin tone:", "🦹🏽"}, + {"", ":supervillain medium-dark skin tone:", "🦹🏾"}, + {"", ":supervillain dark skin tone:", "🦹🏿"}, + {"", ":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 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 light skin tone:", "🧙🏻"}, + {"", ":mage medium-light skin tone:", "🧙🏼"}, + {"", ":mage medium skin tone:", "🧙🏽"}, + {"", ":mage medium-dark skin tone:", "🧙🏾"}, + {"", ":mage dark skin tone:", "🧙🏿"}, + {"", ":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 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 light skin tone:", "🧚🏻"}, + {"", ":fairy medium-light skin tone:", "🧚🏼"}, + {"", ":fairy medium skin tone:", "🧚🏽"}, + {"", ":fairy medium-dark skin tone:", "🧚🏾"}, + {"", ":fairy dark skin tone:", "🧚🏿"}, + {"", ":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 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 light skin tone:", "🧛🏻"}, + {"", ":vampire medium-light skin tone:", "🧛🏼"}, + {"", ":vampire medium skin tone:", "🧛🏽"}, + {"", ":vampire medium-dark skin tone:", "🧛🏾"}, + {"", ":vampire dark skin tone:", "🧛🏿"}, + {"", ":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 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 light skin tone:", "🧜🏻"}, + {"", ":merperson medium-light skin tone:", "🧜🏼"}, + {"", ":merperson medium skin tone:", "🧜🏽"}, + {"", ":merperson medium-dark skin tone:", "🧜🏾"}, + {"", ":merperson dark skin tone:", "🧜🏿"}, + {"", ":merman light skin tone:", "🧜🏻‍♂️"}, + {"", ":merman medium-light skin tone:", "🧜🏼‍♂️"}, + {"", ":merman medium skin tone:", "🧜🏽‍♂️"}, + {"", ":merman medium-dark skin tone:", "🧜🏾‍♂️"}, + {"", ":merman dark skin tone:", "🧜🏿‍♂️"}, + {"", ":mermaid light skin tone:", "🧜🏻‍♀️"}, + {"", ":mermaid medium-light skin tone:", "🧜🏼‍♀️"}, + {"", ":mermaid medium skin tone:", "🧜🏽‍♀️"}, + {"", ":mermaid medium-dark skin tone:", "🧜🏾‍♀️"}, + {"", ":mermaid dark skin tone:", "🧜🏿‍♀️"}, + {"", ":elf light skin tone:", "🧝🏻"}, + {"", ":elf medium-light skin tone:", "🧝🏼"}, + {"", ":elf medium skin tone:", "🧝🏽"}, + {"", ":elf medium-dark skin tone:", "🧝🏾"}, + {"", ":elf dark skin tone:", "🧝🏿"}, + {"", ":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 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:", "🧝🏿‍♀️"}, + {"", ":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 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 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 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 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 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 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 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 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 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 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 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 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:", "💃🏿"}, + {"", ":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 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:", "🕴🏿"}, + {"", ":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 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 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 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 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 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:", "🧗🏿‍♀️"}, + {"", ":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:", "🏇🏿"}, + {"", ":snowboarder light skin tone:", "🏂🏻"}, + {"", ":snowboarder medium-light skin tone:", "🏂🏼"}, + {"", ":snowboarder medium skin tone:", "🏂🏽"}, + {"", ":snowboarder medium-dark skin tone:", "🏂🏾"}, + {"", ":snowboarder dark skin tone:", "🏂🏿"}, + {"", ":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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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:", "🤸🏿‍♀️"}, + {"", ":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 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 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 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 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 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 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 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 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 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 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 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 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 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:", "🛌🏿"}, + {"", ":light skin tone:", "🏻"}, + {"", ":medium-light skin tone:", "🏼"}, + {"", ":medium skin tone:", "🏽"}, + {"", ":medium-dark skin tone:", "🏾"}, + {"", ":dark skin tone:", "🏿"}, +} +; + +static const int g_numEmojiEntities = (int)(sizeof(g_emojiEntities)/ sizeof(*g_emojiEntities)); + +EmojiEntityMapper *EmojiEntityMapper::s_instance = 0; + +EmojiEntityMapper::EmojiEntityMapper() +{ + m_name2symGh = new QDict(1009); + m_name2symUni = new QDict(1009); + m_name2symStripUni = new QDict(10); + m_name2symGh->setAutoDelete(TRUE); + m_name2symUni->setAutoDelete(TRUE); + m_name2symStripUni->setAutoDelete(TRUE); + // 2 loops to be able to give precedence to the unicodeName (CLDR) + for (int i = 0; i < g_numEmojiEntities; i++) + { + if (strlen(g_emojiEntities[i].githubName)) m_name2symGh->insert(g_emojiEntities[i].githubName, new int(i+1)); + } + for (int i = 0; i < g_numEmojiEntities; i++) + { + m_name2symUni->insert(g_emojiEntities[i].unicodeName, new int(-(i+1))); + QCString strippedUnicodeName = g_emojiEntities[i].unicodeName; + // A ring -> a ring + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\x85","\xc3\xa5"); + if (strippedUnicodeName != g_emojiEntities[i].unicodeName) + { + m_name2symStripUni->insert(strippedUnicodeName, new int(-(i+1))); + } + // a ring -> a + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xa5","a"); + // c cedille -> c + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xa7","c"); + // o circumflex -> o + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xb4","o"); + // e acute -> e + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xa9","e"); + // a tilde -> a + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xa3","a"); + // i acute -> i + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xad","i"); + if (strippedUnicodeName != g_emojiEntities[i].unicodeName) + { + m_name2symStripUni->insert(strippedUnicodeName, new int(-(i+1))); + } + } +} + +EmojiEntityMapper::~EmojiEntityMapper() +{ + delete m_name2symGh; + delete m_name2symUni; + delete m_name2symStripUni; +} + +/** Returns the one and only instance of the Emoji entity mapper */ +EmojiEntityMapper *EmojiEntityMapper::instance() +{ + if (s_instance==0) + { + s_instance = new EmojiEntityMapper; + } + return s_instance; +} + +/** Deletes the one and only instance of the Emoji entity mapper */ +void EmojiEntityMapper::deleteInstance() +{ + delete s_instance; + s_instance=0; +} + + +/*! @brief Access routine to the UTF8 code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @param useInPrintf If TRUE the result will be escaped such that it can be + * used in a printf string pattern + * @return the UTF8 code of the Emoji entity, + * in case the UTF code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::utf8(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} + +/*! @brief Access routine to the html code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @param useInPrintf If TRUE the result will be escaped such that it can be + * used in a printf string pattern + * @return the html representation of the Emoji entity, + * in case the html code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::html(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} + +/*! @brief Access routine to the XML code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the XML code of the Emoji entity, + * in case the XML code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::xml(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} +/*! @brief Access routine to the docbook code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the docbook code of the Emoji entity, + * in case the docbook code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::docbook(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} + +/*! @brief Access routine to the LaTeX code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the LaTeX code of the Emoji entity, + * in case the LaTeX code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::latex(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} + +/*! @brief Access routine to the man code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the man of the Emoji entity, + * in case the man code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::man(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} + +/*! @brief Access routine to the RTF code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the RTF of the Emoji entity, + * in case the RTF code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::rtf(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} + +/*! @brief Access routine to the perl struct with the perl code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the pointer to perl struct with the perl code of the Emoji entity, + * in case the perl code does not exists the NULL pointer is entered in the + * \c symb field and in the `DocSymbol::Perl_unknown` in the \c type field. + */ +const char *EmojiEntityMapper::perl(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} + +/*! + * @brief Give code of the requested Emoji entity name + * @param symName Emoji entity name + * @return the code for the requested Emoji entity name, + * in case the requested Emoji item does not exist `0` is returned. + */ +int EmojiEntityMapper::name2sym(const QCString &symName) const +{ + QCString locSymName = symName.lower(); + int *pSymb = m_name2symUni->find(locSymName); + if (!pSymb) pSymb = m_name2symStripUni->find(locSymName); + if (!pSymb) pSymb = m_name2symGh->find(locSymName); + return pSymb ? (*pSymb) : 0; +} +void EmojiEntityMapper::writeEmojiFile(QFile &file) +{ + FTextStream t(&file); + + for (int i = 0; i < g_numEmojiEntities; i++) + { + t << g_emojiEntities[i].unicodeName << endl; + } + for (int i = 0; i < g_numEmojiEntities; i++) + { + if (strlen(g_emojiEntities[i].githubName)) t << g_emojiEntities[i].githubName << endl; + } +} +/*! @brief Access routine to the code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the code of the Emoji entity, + */ +const char *EmojiEntityMapper::code(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} + +/*! @brief Access routine to the text of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the text of the Emoji entity, + */ +const char *EmojiEntityMapper::text(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} +/// \file +/// to generate the content of the table with the emoji definitions and code the following procedure has been used: +/// +///
    +/// wget https://api.github.com/emojis
    +/// wget https://www.unicode.org/emoji/charts/full-emoji-list.html
    +/// wget http://www.unicode.org/emoji/charts/full-emoji-modifiers.html
    +///
    +/// grep -v "[{}]" emojis | sed -e "s/https:.*\///" | sed -e "s%.png.*%%" | sed -e "s/  //" | sed -e "s/://" | tr ' ' '\n' | tr '\042' ' ' | sed -e "s/ //g" > emojis.res
    +/// 
    +/// grep -A 14 "[0-9]" full-emoji-list.html | grep -v "class='andr" | grep -v "class='[r]*chars'" | sed -e "s/<[^>]*>//g" | sed -e "s/://" | tr [A-Z] [a-z] | sed -e "s/^[^a-z][^a-z][^a-z] //" | grep -v "\-\-" | sed -e "s/&/\&/"  | sed -e "s/ u+/;\&#x/g" | sed -e "s/^u+\(.*\)/\&#x\1;/" > full.res
    +/// grep -A 14 "[0-9]" full-emoji-modifiers.html | grep -v "class='andr" | grep -v "class='[r]*chars'" | sed -e "s/<[^>]*>//g" | sed -e "s/://" | tr [A-Z] [a-z] | sed -e "s/^[^a-z][^a-z][^a-z] //" | grep -v "\-\-" | sed -e "s/&/\&/"  | sed -e "s/ u+/;\&#x/g" | sed -e "s/^u+\(.*\)/\&#x\1;/" >> full.res
    +/// 
    +/// 
    +/// python transform.py full.res emojis.res  > transform.res
    +/// 
    +/// where the contents of `transform.py` is: +/// \code{.py} +///import sys +/// +///# read first file (unicode names) +///# read second files (github names) +/// +///uniFile = open(sys.argv[1]) +///emoFile = open(sys.argv[2]) +/// +///uniLines = uniFile.readlines() +///emoLines = emoFile.readlines() +/// +///uniFile.close() +///emoFile.close() +/// +///uniMaxLen = 0 +///emoMaxLen = 0 +/// +///for i in range(0, len(uniLines), 2): +/// if (len(uniLines[i]) > uniMaxLen): +/// uniMaxLen = len(uniLines[i]) +/// +///for i in range(0, len(emoLines), 2): +/// if (len(emoLines[i]) > emoMaxLen): +/// emoMaxLen = len(emoLines[i]) +/// +///uniProcessed = [False]*(len(uniLines) / 2) +/// +///# replace "strange" single and double quotes. +///for i in range(0, len(uniLines), 2): +/// uniLines[i+1] = uniLines[i+1].replace("\342\200\234",'\\"').replace("\342\200\235",'\\"') +/// uniLines[i+1] = uniLines[i+1].replace("\342\200\231","'").replace("\342\200\231","'") +/// +///for i in range(0, len(emoLines), 2): +/// emoCode = emoLines[i+1].split('-') +/// found = False +/// emoCode = [e.replace('\n', '') for e in emoCode] +/// for u in range(0, len(uniLines), 2): +/// cnt = 0 +/// beg = 0 +/// for j in emoCode: +/// pos = uniLines[u].find(j, beg) +/// if pos != -1: +/// # in case of 'u+': 2, '&#x': 3 +/// if (beg == 0 and j == emoCode[0] and pos != 3): +/// break +/// cnt += 1 +/// beg = pos + 1 +/// if (cnt == len(emoCode)): +/// uniProcessed[u/2] = True +/// found = True +/// print ' {":'+emoLines[i].replace('\n','')+':",'+(emoMaxLen-len(emoLines[i].replace('\n',''))+1)*' '+'":'+uniLines[u+1].replace('\n','')+':",'+(uniMaxLen-len(uniLines[u+1].replace('\n',''))+1)*' '+'"'+uniLines[u].replace('\n','')+'"},' +/// break +/// if not found: +/// # github name but no unicode version +/// # print ' ONLY_GITHUB_NAME "'+emoLines[i].replace('\n','')+'" "'+emoLines[i+1].replace('\n','')+'"' +/// pass +/// +///for u in range(0, len(uniProcessed)): +/// if not uniProcessed[u]: +/// print ' {"",'+(emoMaxLen+1)*' '+'":'+uniLines[u*2+1].replace('\n','')+':",'+(uniMaxLen-len(uniLines[u*2+1].replace('\n',''))+1)*' '+'"'+uniLines[u*2].replace('\n','')+'"},' +/// +/// \endcode diff --git a/src/emoji.h b/src/emoji.h new file mode 100644 index 0000000..daa63e8 --- /dev/null +++ b/src/emoji.h @@ -0,0 +1,50 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2015 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ +#ifndef EMOJIENTITY_H +#define EMOJIENTITY_H + +#include +#include + +class FTextStream; + +/** @brief Singleton helper class to map emoji entities to other formats */ +class EmojiEntityMapper +{ + public: + static EmojiEntityMapper *instance(); + static void deleteInstance(); + int name2sym(const QCString &symName) const; + const char *utf8(int symb) const; + const char *html(int symb) const; + const char *xml(int symb) const; + const char *docbook(int symb) const; + const char *latex(int symb) const; + const char *man(int symb) const; + const char *rtf(int symb) const; + const char *perl(int symb) const; + const char *code(int symb) const; + const char *text(int symb) const; + void writeEmojiFile(QFile &file); + private: + EmojiEntityMapper(); + ~EmojiEntityMapper(); + static EmojiEntityMapper *s_instance; + QDict *m_name2symGh; + QDict *m_name2symUni; + QDict *m_name2symStripUni; +}; + +#endif diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 6e0c62d..0af5b16 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -34,6 +34,7 @@ #include "filedef.h" #include "memberdef.h" #include "htmlentity.h" +#include "emoji.h" #include "plantuml.h" static const int NUM_HTML_LIST_TYPES = 4; @@ -234,6 +235,20 @@ void HtmlDocVisitor::visit(DocSymbol *s) } } +void HtmlDocVisitor::visit(DocEmoji *s) +{ + if (m_hide) return; + const char *res = EmojiEntityMapper::instance()->html(s->emoji()); + if (res) + { + m_t << res; + } + else + { + err("HTML: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } +} + void HtmlDocVisitor::writeObfuscatedMailAddress(const QCString &url) { m_t << ":' form of the emoji, already \"LaTeX\"-escaped\n" + "% 2) unicode of the emoji inlorm like: 'U+1F603' or 'U+0031U+FE0FU+20E3' depending on the emoji\n" + "% 3) file name in form like: '1F603' or '0031-FE0F-20E3' depending on the emoji\n" + "% in case image exist use this otherwise use the '::' form\n"; + t << "\\newcommand{\\doxygenemoji}[3]{%\n" + " \\IfFileExists{" << emojiDir << "/#3.png}{\\raisebox{-0.1em}{\\includegraphics[height=0.9em]{" << emojiDir << "/#3.png}}}{#1}%\n" + "}\n"; + // Define page & text layout QCString paperName=Config_getEnum(PAPER_TYPE); // "a4wide" package is obsolete (see bug 563698) diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index e09cc8e..8a9e6c1 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -30,6 +30,7 @@ #include "parserintf.h" #include "filedef.h" #include "htmlentity.h" +#include "emoji.h" ManDocVisitor::ManDocVisitor(FTextStream &t,CodeOutputInterface &ci, const char *langExt) @@ -89,6 +90,22 @@ void ManDocVisitor::visit(DocSymbol *s) m_firstCol=FALSE; } +void ManDocVisitor::visit(DocEmoji *s) +{ + if (m_hide) return; + const char *res = EmojiEntityMapper::instance()->man(s->emoji()); + if (res) + { + m_t << res; + } + else + { + // no error or warning to be supplied + // err("man: non supported HTML-entity found: &%s;\n",get_symbol_item(s->emoji())); + } + m_firstCol=FALSE; +} + void ManDocVisitor::visit(DocURL *u) { if (m_hide) return; diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h index d248c87..8efc223 100644 --- a/src/mandocvisitor.h +++ b/src/mandocvisitor.h @@ -40,6 +40,7 @@ class ManDocVisitor : public DocVisitor void visit(DocLinkedWord *); void visit(DocWhiteSpace *); void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *); void visit(DocLineBreak *); void visit(DocHorRuler *); diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 5b4b6ea..27c2fa8 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -43,6 +43,7 @@ #include "section.h" #include "util.h" #include "htmlentity.h" +#include "emoji.h" #define PERLOUTPUT_MAX_INDENTATION 40 @@ -299,6 +300,7 @@ public: void visit(DocLinkedWord *); void visit(DocWhiteSpace *); void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *); void visit(DocLineBreak *); void visit(DocHorRuler *); @@ -609,6 +611,11 @@ void PerlModDocVisitor::visit(DocSymbol *sy) err("perl: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(sy->symbol(),TRUE)); } } +void PerlModDocVisitor::visit(DocEmoji *sy) +{ + enterText(); + m_output.add(EmojiEntityMapper::instance()->perl(sy->emoji())); +} void PerlModDocVisitor::visit(DocURL *u) { diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index 8d9a2b9..44dd884 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -22,6 +22,7 @@ #include #include "docvisitor.h" #include "htmlentity.h" +#include "emoji.h" #include "message.h" /*! Concrete visitor implementation for pretty printing */ @@ -68,6 +69,19 @@ class PrintDocVisitor : public DocVisitor printf("print: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE)); } } + void visit(DocEmoji *s) + { + indent_leaf(); + const char *res = EmojiEntityMapper::instance()->utf8(s->emoji()); + if (res) + { + printf("%s",res); + } + else + { + printf("print: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } + } void visit(DocURL *u) { indent_leaf(); diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 7fbfdc8..941b937 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -34,6 +34,7 @@ #include "filedef.h" #include "config.h" #include "htmlentity.h" +#include "emoji.h" #include "plantuml.h" //#define DBG_RTF(x) m_t << x @@ -136,6 +137,48 @@ void RTFDocVisitor::visit(DocSymbol *s) m_lastIsPara=FALSE; } +void RTFDocVisitor::visit(DocEmoji *s) +{ + if (m_hide) return; + DBG_RTF("{\\comment RTFDocVisitor::visit(DocEmoji)}\n"); + const char *res = EmojiEntityMapper::instance()->rtf(s->emoji()); + if (res) + { + const char *p = res; + int val = 0; + int val1 = 0; + while (*p) + { + switch(*p) + { + case '&': case '#': case 'x': + break; + case ';': + val1 = val; + val = 0xd800 + ( ( val1 - 0x10000 ) & 0xffc00 ) / 0x400 - 0x10000; + m_t << "\\u" << val << "?"; + val = 0xdC00 + ( ( val1 - 0x10000 ) & 0x3ff ) - 0x10000 ; + m_t << "\\u" << val << "?"; + val = 0; + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + val = val * 16 + *p - '0'; + break; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + val = val * 16 + *p - 'a' + 10; + break; + } + p++; + } + } + else + { + err("RTF: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } + m_lastIsPara=FALSE; +} + void RTFDocVisitor::visit(DocURL *u) { if (m_hide) return; diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h index 1e927e7..ac78a85 100644 --- a/src/rtfdocvisitor.h +++ b/src/rtfdocvisitor.h @@ -40,6 +40,7 @@ class RTFDocVisitor : public DocVisitor void visit(DocLinkedWord *); void visit(DocWhiteSpace *); void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *); void visit(DocLineBreak *); void visit(DocHorRuler *); diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp index c899232..691e426 100644 --- a/src/textdocvisitor.cpp +++ b/src/textdocvisitor.cpp @@ -21,6 +21,7 @@ #include "message.h" #include "util.h" #include "htmlentity.h" +#include "emoji.h" //------------------------------------------------------------------------- @@ -37,6 +38,18 @@ void TextDocVisitor::visit(DocSymbol *s) } } +void TextDocVisitor::visit(DocEmoji *s) +{ + const char *res = EmojiEntityMapper::instance()->html(s->emoji()); + if (res) + { + filter(res); + } + else + { + err("text: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } +} void TextDocVisitor::filter(const char *str) { diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h index 1bbc357..bbc70e8 100644 --- a/src/textdocvisitor.h +++ b/src/textdocvisitor.h @@ -40,6 +40,7 @@ class TextDocVisitor : public DocVisitor void visit(DocLinkedWord *w) { filter(w->word()); } void visit(DocWhiteSpace *) { m_t << " "; } void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *u) { filter(u->url()); } void visit(DocLineBreak *) { m_t << " "; } void visit(DocHorRuler *) {} diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 525dbf5..cd72c7d 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -31,6 +31,7 @@ #include "filename.h" #include "config.h" #include "htmlentity.h" +#include "emoji.h" static void visitCaption(XmlDocVisitor *parent, QList children) { @@ -133,6 +134,20 @@ void XmlDocVisitor::visit(DocSymbol *s) } } +void XmlDocVisitor::visit(DocEmoji *s) +{ + if (m_hide) return; + const char *res = EmojiEntityMapper::instance()->xml(s->emoji()); + if (res) + { + m_t << res; + } + else + { + err("XML: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } +} + void XmlDocVisitor::visit(DocURL *u) { if (m_hide) return; -- cgit v0.12