add emoji string parser (#4) * add string parser * add fmt wrappers * add map generator * rename string file to parser * fix consecutive colon issue * add tests for parser * add missing test cases * add test for fmt * update README * add string parser to usage readme * format usage example * add another example * fix example * update todo
Enes Çakır enes@cakir.web.tr
Sun, 08 Mar 2020 15:15:41 +0300
14 files changed,
3399 insertions(+),
34 deletions(-)
M
README.md
→
README.md
@@ -39,6 +39,8 @@ fmt.Printf("Emojis with multiple skin tones.\n both medium: %v light and dark: %v\n",
emoji.PeopleHoldingHands.Tone(emoji.Medium), emoji.PeopleHoldingHands.Tone(emoji.Light, emoji.Dark), ) + fmt.Println(emoji.Parse("Emoji aliases are :sunglasses:")) + emoji.Println("Use fmt wrappers :+1: with emoji support :tada:") } /* OUTPUT@@ -49,11 +51,21 @@ Different skin tones.
default: 👍 light: 👌🏻 dark: 🤙🏿 Emojis with multiple skin tones. both medium: 🧑🏽🤝🧑🏽 light and dark: 🧑🏻🤝🧑🏿 - + Emoji aliases are 😎 + Use fmt wrappers 👍 with emoji support 🎉 */ ``` -This package contains Full Emoji List v13.0 based on [https://unicode.org/Public/emoji/13.0/emoji-test.txt](https://unicode.org/Public/emoji/13.0/emoji-test.txt). +This package contains emojis constants based on [Full Emoji List v13.0](https://unicode.org/Public/emoji/13.0/emoji-test.txt). +```go +emoji.CallMeHand // 🤙 +emoji.CallMeHand.Tone(emoji.Dark) // 🤙🏿 +``` +Also, it has additional emoji aliases from [github/gemoji](https://github.com/github/gemoji). +```go +emoji.Parse(":+1:") // 👍 +emoji.Parse(":100:") // 💯 +``` Also, you can generate country flag emoji with [ISO 3166 Alpha2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) codes: ```go@@ -70,12 +82,16 @@ go test
``` ## Todo :pushpin: -* Add emoji string parser +* Add `flag-[CODE]` support to emoji string parser +* Add examples to `godoc` ## Contributing :man_technologist: -I am accepting PRs that add characters to the package. +I am accepting PRs that add aliases to the package. +You have to add it to `customEmojis` list at `internal/generator/main`. -Please use [this list](http://unicode.org/emoji/charts/full-emoji-list.html) to look up the unicode value and the name of the character. +If you think an emoji constant is not correct, open an issue. +Please use [this list](http://unicode.org/emoji/charts/full-emoji-list.html) +to look up the correct unicode value and the name of the character. ## Credits :star: - [Enes Çakır](https://github.com/enescakir)
M
constants.go
→
constants.go
@@ -3,7 +3,7 @@
// Code generated by github.com/enescakir/emoji/internal/generator DO NOT EDIT. // Source: https://unicode.org/Public/emoji/13.0/emoji-test.txt -// Create at: 2020-03-06T11:00:28+03:00 +// Create at: 2020-03-08T02:15:40+03:00 var (
M
emoji.go
→
emoji.go
@@ -119,7 +119,7 @@
return Emoji(flag), nil } -// countryCodeLetter shifts given letter byte as unicodeFlagBaseIndex and changes encoding +// countryCodeLetter shifts given letter byte as unicodeFlagBaseIndex and changes encoding. func countryCodeLetter(l byte) string { shifted := unicodeFlagBaseIndex + int(l)
M
emoji_test.go
→
emoji_test.go
@@ -106,6 +106,28 @@ }
} } +func TestNewEmojiTone(t *testing.T) { + tt := []struct { + input []string + expected EmojiWithTone + }{ + {input: nil, expected: EmojiWithTone{}}, + {input: []string{}, expected: EmojiWithTone{}}, + {input: []string{"\U0001f64b@"}, expected: PersonRaisingHand}, + { + input: []string{"\U0001f46b@", "\U0001f469@\u200d\U0001f91d\u200d\U0001f468@"}, + expected: WomanAndManHoldingHands, + }, + } + + for i, tc := range tt { + got := newEmojiWithTone(tc.input...) + if got != tc.expected { + t.Fatalf("test case %v fail: got: %v, expected: %v", i+1, got, tc.expected) + } + } +} + func BenchmarkEmoji(b *testing.B) { for n := 0; n < b.N; n++ { _ = WavingHand.String()
A
fmt.go
@@ -0,0 +1,56 @@
+package emoji + +import ( + "fmt" + "io" +) + +// Sprint wraps fmt.Sprint with emoji support +func Sprint(a ...interface{}) string { + return Parse(fmt.Sprint(a...)) +} + +// Sprintf wraps fmt.Sprintf with emoji support +func Sprintf(format string, a ...interface{}) string { + return Parse(fmt.Sprintf(format, a...)) +} + +// Sprintln wraps fmt.Sprintln with emoji support +func Sprintln(a ...interface{}) string { + return Parse(fmt.Sprintln(a...)) +} + +// Print wraps fmt.Print with emoji support +func Print(a ...interface{}) (n int, err error) { + return fmt.Print(Sprint(a...)) +} + +// Println wraps fmt.Println with emoji support +func Println(a ...interface{}) (n int, err error) { + return fmt.Println(Sprint(a...)) +} + +// Printf wraps fmt.Printf with emoji support +func Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Print(Sprintf(format, a...)) +} + +// Fprint wraps fmt.Fprint with emoji support +func Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, Sprint(a...)) +} + +// Fprintf wraps fmt.Fprintf with emoji support +func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, Sprintf(format, a...)) +} + +// Fprintln wraps fmt.Fprintln with emoji support +func Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, Sprint(a...)) +} + +// Errorf wraps fmt.Errorf with emoji support +func Errorf(format string, a ...interface{}) error { + return fmt.Errorf(Sprintf(format, a...)) +}
A
fmt_test.go
@@ -0,0 +1,146 @@
+package emoji + +import ( + "bytes" + "fmt" + "testing" +) + +func TestSprint(t *testing.T) { + var ( + input = "I am :man_technologist: from :flag_for_turkey:. Tests are :thumbs_up:" + expected = fmt.Sprintf("I am %v from %v. Tests are %v", ManTechnologist, FlagForTurkey, ThumbsUp) + ) + + got := Sprint(input) + if got != expected { + t.Fatalf("test case fail: got: %v, expected: %v", got, expected) + } +} + +func TestSprintf(t *testing.T) { + var ( + input = "I am :man_technologist:. Tests are :thumbs_up:. %v is formatted." + args = "this string" + expected = fmt.Sprintf("I am %v. Tests are %v. %v is formatted.", ManTechnologist, ThumbsUp, args) + ) + + got := Sprintf(input, args) + if got != expected { + t.Fatalf("test case fail: got: %v, expected: %v", got, expected) + } +} + +func TestSprintln(t *testing.T) { + var ( + input = "I am :man_technologist: from :flag_for_turkey:. Tests are :thumbs_up:" + expected = fmt.Sprintf("I am %v from %v. Tests are %v\n", ManTechnologist, FlagForTurkey, ThumbsUp) + ) + + got := Sprintln(input) + if got != expected { + t.Fatalf("test case fail: got: %v, expected: %v", got, expected) + } +} + +func TestPrint(t *testing.T) { + var ( + input = "I am :man_technologist: from :flag_for_turkey:. Tests are :thumbs_up:" + ) + + n, err := Print(input) + if err != nil || n == 0 { + t.Fatalf("test case fail n: %v: %v", n, err) + } +} + +func TestPrintf(t *testing.T) { + var ( + input = "I am :man_technologist:. Tests are :thumbs_up:. %v is formatted." + args = "this string" + ) + + n, err := Printf(input, args) + if err != nil || n == 0 { + t.Fatalf("test case fail n: %v: %v", n, err) + } +} + +func TestPrintln(t *testing.T) { + var ( + input = "I am :man_technologist: from :flag_for_turkey:. Tests are :thumbs_up:" + ) + + n, err := Println(input) + if err != nil || n == 0 { + t.Fatalf("test case fail n: %v: %v", n, err) + } +} + +func TestFprint(t *testing.T) { + var ( + input = "I am :man_technologist: from :flag_for_turkey:. Tests are :thumbs_up:" + expected = fmt.Sprintf("I am %v from %v. Tests are %v", ManTechnologist, FlagForTurkey, ThumbsUp) + ) + + var w bytes.Buffer + _, err := Fprint(&w, input) + if err != nil { + t.Fatalf("test case fail: %v", err) + } + + got := w.String() + if got != expected { + t.Fatalf("test case fail: got: %v, expected: %v", got, expected) + } +} + +func TestFprintf(t *testing.T) { + var ( + input = "I am :man_technologist:. Tests are :thumbs_up:. %v is formatted." + args = "this string" + expected = fmt.Sprintf("I am %v. Tests are %v. %v is formatted.", ManTechnologist, ThumbsUp, args) + ) + + var w bytes.Buffer + _, err := Fprintf(&w, input, args) + if err != nil { + t.Fatalf("test case fail: %v", err) + } + + got := w.String() + if got != expected { + t.Fatalf("test case fail: got: %v, expected: %v", got, expected) + } +} + +func TestFprintln(t *testing.T) { + var ( + input = "I am :man_technologist: from :flag_for_turkey:. Tests are :thumbs_up:" + expected = fmt.Sprintf("I am %v from %v. Tests are %v\n", ManTechnologist, FlagForTurkey, ThumbsUp) + ) + + var w bytes.Buffer + _, err := Fprintln(&w, input) + if err != nil { + t.Fatalf("test case fail: %v", err) + } + + got := w.String() + if got != expected { + t.Fatalf("test case fail: got: %v, expected: %v", got, expected) + } +} + +func TestErrorf(t *testing.T) { + var ( + input = "I am :man_technologist:. Tests are :thumbs_up:. %v is formatted." + args = "this string" + expected = fmt.Sprintf("I am %v. Tests are %v. %v is formatted.", ManTechnologist, ThumbsUp, args) + ) + + got := Errorf(input, args).Error() + if got != expected { + t.Fatalf("test case fail: got: %v, expected: %v", got, expected) + } +}
M
internal/generator/constants.go.tmpl
→
internal/generator/constants.go.tmpl
@@ -6,5 +6,5 @@ // Source: {{ .Link }}
// Create at: {{ .Date }} var ( - {{ .Constants }} + {{ .Data }} )
M
internal/generator/emoji.go
→
internal/generator/emoji.go
@@ -82,8 +82,8 @@ Code: code,
Tones: []string{}, } e.extractAttr() - e.generateConstant() - e.generateUnicode() + e.Constant = generateConstant(e.Constant) + e.Code = generateUnicode(e.Code) return &e }@@ -113,24 +113,25 @@ }
e.Constant = c } -func (e *emoji) generateConstant() { - c := e.Constant +func generateConstant(c string) string { c = strutil.Clean(c) c = strings.Title(strings.ToLower(c)) c = strutil.RemoveSpaces(c) - e.Constant = c + + return c } -func (e *emoji) generateUnicode() { +func generateUnicode(code string) string { unicodes := []string{} - for _, v := range strings.Split(e.Code, " ") { + for _, v := range strings.Split(code, " ") { u, err := strconv.ParseInt(v, 16, 32) if err != nil { panic(fmt.Errorf("unknown unicode: %v", v)) } unicodes = append(unicodes, string(u)) } - e.Code = strings.Join(unicodes, "") + + return strings.Join(unicodes, "") } func defaultTone(basic, toned string) string {
M
internal/generator/main.go
→
internal/generator/main.go
@@ -3,30 +3,46 @@
import ( "bufio" "bytes" + "encoding/json" "fmt" "go/format" "io" "io/ioutil" "net/http" "os" + "sort" "strings" "text/template" "time" + "unicode" ) const ( - emojiListUrl = "https://unicode.org/Public/emoji/13.0/emoji-test.txt" + emojiListUrl = "https://unicode.org/Public/emoji/13.0/emoji-test.txt" + gemojiURL = "https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json" + constantsFile = "constants.go" + aliasesFile = "map.go" ) +// unicode and gemoji databases don't have alias like that +var customEmojis = map[string]string{ + ":robot_face:": "\U0001f916", // slack +} + func main() { emojis, err := fetch() if err != nil { panic(err) } - constants := generate(emojis) + constants := generateConstants(emojis) + aliases := generateAliases(emojis) - if err = save(constants); err != nil { + if err = save(constantsFile, constants); err != nil { + panic(err) + } + + if err = save(aliasesFile, aliases); err != nil { panic(err) } }@@ -63,7 +79,111 @@
return &emojis, nil } -func generate(emojis *groups) string { +func generateAliases(emojis *groups) string { + var aliases []string + var emojiMap = make(map[string]string) + + for _, grp := range emojis.Groups { + for _, subgrp := range grp.Subgroups { + for _, c := range subgrp.Constants { + emoji := subgrp.Emojis[c][0] + alias := ":" + snakeCase(emoji.Constant) + ":" + aliases = append(aliases, alias) + emojiMap[alias] = emoji.Code + } + } + } + + // add gemoji aliases + { + gemojis, err := fetchGemoji() + if err != nil { + panic(err) + } + + for alias, code := range gemojis { + _, ok := emojiMap[alias] + if !ok { + aliases = append(aliases, alias) + } + emojiMap[alias] = code + } + } + + // add custom emoji aliases + { + for alias, code := range customEmojis { + _, ok := emojiMap[alias] + if !ok { + aliases = append(aliases, alias) + } + emojiMap[alias] = code + } + } + + var res string + sort.Strings(aliases) + for _, alias := range aliases { + res += fmt.Sprintf("%q: %+q,\n", alias, emojiMap[alias]) + } + + return res +} + +func snakeCase(str string) string { + var output strings.Builder + for i, r := range str { + switch { + case unicode.IsUpper(r): + if i != 0 { + output.WriteRune('_') + } + output.WriteRune(unicode.ToLower(r)) + case unicode.IsDigit(r): + if i != 0 && !unicode.IsDigit(rune(str[i-1])) { + output.WriteRune('_') + } + output.WriteRune(r) + default: + output.WriteRune(r) + } + } + + return output.String() +} + +type gemoji struct { + Emoji string `json:"emoji"` + Aliases []string `json:"aliases"` +} + +func fetchGemoji() (map[string]string, error) { + b, err := fetchData(gemojiURL) + if err != nil { + return nil, err + } + + var gemojis []gemoji + r := make(map[string]string) + + if err = json.Unmarshal(b, &gemojis); err != nil { + return nil, err + } + + for _, gemoji := range gemojis { + for _, alias := range gemoji.Aliases { + if len(alias) == 0 || len(gemoji.Emoji) == 0 { + continue + } + + r[":"+alias+":"] = gemoji.Emoji + } + } + + return r, nil +} + +func generateConstants(emojis *groups) string { var res string for _, grp := range emojis.Groups { res += fmt.Sprintf("\n// GROUP: %v\n", grp.Name)@@ -88,43 +208,47 @@ oneTonedCode := replaceTones(emojis[1].Code)
defaultTone := defaultTone(basic.Code, oneTonedCode) if defaultTone != "" { - return fmt.Sprintf("%s EmojiWithTone = newEmojiWithTone(%+q).withDefaultTone(%+q) // %s\n", basic.Constant, oneTonedCode, defaultTone, basic.Name) + return fmt.Sprintf("%s EmojiWithTone = newEmojiWithTone(%+q).withDefaultTone(%+q) // %s\n", + basic.Constant, oneTonedCode, defaultTone, basic.Name) } - return fmt.Sprintf("%s EmojiWithTone = newEmojiWithTone(%+q) // %s\n", basic.Constant, oneTonedCode, basic.Name) + return fmt.Sprintf("%s EmojiWithTone = newEmojiWithTone(%+q) // %s\n", + basic.Constant, oneTonedCode, basic.Name) case 26: oneTonedCode := replaceTones(emojis[1].Code) twoTonedCode := replaceTones(emojis[2].Code) - return fmt.Sprintf("%s EmojiWithTone = newEmojiWithTone(%+q, %+q) // %s\n", basic.Constant, oneTonedCode, twoTonedCode, basic.Name) + return fmt.Sprintf("%s EmojiWithTone = newEmojiWithTone(%+q, %+q) // %s\n", + basic.Constant, oneTonedCode, twoTonedCode, basic.Name) default: panic(fmt.Errorf("not expected emoji count for a constant: %v", len(emojis))) } } -func save(constants string) error { - tmpl, err := template.ParseFiles("internal/generator/constants.go.tmpl") +func save(filename, data string) error { + tmpl, err := template.ParseFiles(fmt.Sprintf("internal/generator/%v.tmpl", filename)) if err != nil { return err } - data := struct { - Link string - Date string - Constants string + d := struct { + Link string + Date string + Data string }{ - Link: emojiListUrl, - Date: time.Now().Format(time.RFC3339), - Constants: constants, + Link: emojiListUrl, + Date: time.Now().Format(time.RFC3339), + Data: data, } + var w bytes.Buffer - if err = tmpl.Execute(&w, data); err != nil { + if err = tmpl.Execute(&w, d); err != nil { return err } content, err := format.Source(w.Bytes()) - file, err := os.Create("constants.go") + file, err := os.Create(filename) if err != nil { return fmt.Errorf("could not create file: %v", err) }
A
internal/generator/map.go.tmpl
@@ -0,0 +1,10 @@
+package emoji + +// Code generated by github.com/enescakir/emoji/internal/generator DO NOT EDIT. + +// Source: {{ .Link }} +// Create at: {{ .Date }} + +var emojiMap = map[string]string{ + {{ .Data }} +}
A
map.go
@@ -0,0 +1,2715 @@
+package emoji + +// Code generated by github.com/enescakir/emoji/internal/generator DO NOT EDIT. + +// Source: https://unicode.org/Public/emoji/13.0/emoji-test.txt +// Create at: 2020-03-08T02:15:40+03:00 + +var emojiMap = map[string]string{ + ":+1:": "\U0001f44d", + ":-1:": "\U0001f44e", + ":100:": "\U0001f4af", + ":1234:": "\U0001f522", + ":1st_place_medal:": "\U0001f947", + ":2nd_place_medal:": "\U0001f948", + ":3rd_place_medal:": "\U0001f949", + ":8ball:": "\U0001f3b1", + ":a:": "\U0001f170\ufe0f", + ":a_button_blood_type:": "\U0001f170\ufe0f", + ":ab:": "\U0001f18e", + ":ab_button_blood_type:": "\U0001f18e", + ":abacus:": "\U0001f9ee", + ":abc:": "\U0001f524", + ":abcd:": "\U0001f521", + ":accept:": "\U0001f251", + ":accordion:": "\U0001fa97", + ":adhesive_bandage:": "\U0001fa79", + ":admission_tickets:": "\U0001f39f\ufe0f", + ":adult:": "\U0001f9d1", + ":aerial_tramway:": "\U0001f6a1", + ":afghanistan:": "\U0001f1e6\U0001f1eb", + ":airplane:": "\u2708\ufe0f", + ":airplane_arrival:": "\U0001f6ec", + ":airplane_departure:": "\U0001f6eb", + ":aland_islands:": "\U0001f1e6\U0001f1fd", + ":alarm_clock:": "\u23f0", + ":albania:": "\U0001f1e6\U0001f1f1", + ":alembic:": "\u2697\ufe0f", + ":algeria:": "\U0001f1e9\U0001f1ff", + ":alien:": "\U0001f47d", + ":alien_monster:": "\U0001f47e", + ":ambulance:": "\U0001f691", + ":american_football:": "\U0001f3c8", + ":american_samoa:": "\U0001f1e6\U0001f1f8", + ":amphora:": "\U0001f3fa", + ":anatomical_heart:": "\U0001fac0", + ":anchor:": "\u2693", + ":andorra:": "\U0001f1e6\U0001f1e9", + ":angel:": "\U0001f47c", + ":anger:": "\U0001f4a2", + ":anger_symbol:": "\U0001f4a2", + ":angola:": "\U0001f1e6\U0001f1f4", + ":angry:": "\U0001f620", + ":angry_face:": "\U0001f620", + ":angry_face_with_horns:": "\U0001f47f", + ":anguilla:": "\U0001f1e6\U0001f1ee", + ":anguished:": "\U0001f627", + ":anguished_face:": "\U0001f627", + ":ant:": "\U0001f41c", + ":antarctica:": "\U0001f1e6\U0001f1f6", + ":antenna_bars:": "\U0001f4f6", + ":antigua_barbuda:": "\U0001f1e6\U0001f1ec", + ":anxious_face_with_sweat:": "\U0001f630", + ":apple:": "\U0001f34e", + ":aquarius:": "\u2652", + ":argentina:": "\U0001f1e6\U0001f1f7", + ":aries:": "\u2648", + ":armenia:": "\U0001f1e6\U0001f1f2", + ":arrow_backward:": "\u25c0\ufe0f", + ":arrow_double_down:": "\u23ec", + ":arrow_double_up:": "\u23eb", + ":arrow_down:": "\u2b07\ufe0f", + ":arrow_down_small:": "\U0001f53d", + ":arrow_forward:": "\u25b6\ufe0f", + ":arrow_heading_down:": "\u2935\ufe0f", + ":arrow_heading_up:": "\u2934\ufe0f", + ":arrow_left:": "\u2b05\ufe0f", + ":arrow_lower_left:": "\u2199\ufe0f", + ":arrow_lower_right:": "\u2198\ufe0f", + ":arrow_right:": "\u27a1\ufe0f", + ":arrow_right_hook:": "\u21aa\ufe0f", + ":arrow_up:": "\u2b06\ufe0f", + ":arrow_up_down:": "\u2195\ufe0f", + ":arrow_up_small:": "\U0001f53c", + ":arrow_upper_left:": "\u2196\ufe0f", + ":arrow_upper_right:": "\u2197\ufe0f", + ":arrows_clockwise:": "\U0001f503", + ":arrows_counterclockwise:": "\U0001f504", + ":art:": "\U0001f3a8", + ":articulated_lorry:": "\U0001f69b", + ":artificial_satellite:": "\U0001f6f0\ufe0f", + ":artist:": "\U0001f9d1\u200d\U0001f3a8", + ":artist_palette:": "\U0001f3a8", + ":aruba:": "\U0001f1e6\U0001f1fc", + ":ascension_island:": "\U0001f1e6\U0001f1e8", + ":asterisk:": "*\ufe0f\u20e3", + ":astonished:": "\U0001f632", + ":astonished_face:": "\U0001f632", + ":astronaut:": "\U0001f9d1\u200d\U0001f680", + ":athletic_shoe:": "\U0001f45f", + ":atm:": "\U0001f3e7", + ":atm_sign:": "\U0001f3e7", + ":atom_symbol:": "\u269b\ufe0f", + ":australia:": "\U0001f1e6\U0001f1fa", + ":austria:": "\U0001f1e6\U0001f1f9", + ":auto_rickshaw:": "\U0001f6fa", + ":automobile:": "\U0001f697", + ":avocado:": "\U0001f951", + ":axe:": "\U0001fa93", + ":azerbaijan:": "\U0001f1e6\U0001f1ff", + ":b:": "\U0001f171\ufe0f", + ":b_button_blood_type:": "\U0001f171\ufe0f", + ":baby:": "\U0001f476", + ":baby_angel:": "\U0001f47c", + ":baby_bottle:": "\U0001f37c", + ":baby_chick:": "\U0001f424", + ":baby_symbol:": "\U0001f6bc", + ":back:": "\U0001f519", + ":back_arrow:": "\U0001f519", + ":backhand_index_pointing_down:": "\U0001f447", + ":backhand_index_pointing_left:": "\U0001f448", + ":backhand_index_pointing_right:": "\U0001f449", + ":backhand_index_pointing_up:": "\U0001f446", + ":backpack:": "\U0001f392", + ":bacon:": "\U0001f953", + ":badger:": "\U0001f9a1", + ":badminton:": "\U0001f3f8", + ":bagel:": "\U0001f96f", + ":baggage_claim:": "\U0001f6c4", + ":baguette_bread:": "\U0001f956", + ":bahamas:": "\U0001f1e7\U0001f1f8", + ":bahrain:": "\U0001f1e7\U0001f1ed", + ":balance_scale:": "\u2696\ufe0f", + ":bald:": "\U0001f9b2", + ":bald_man:": "\U0001f468\u200d\U0001f9b2", + ":bald_woman:": "\U0001f469\u200d\U0001f9b2", + ":ballet_shoes:": "\U0001fa70", + ":balloon:": "\U0001f388", + ":ballot_box:": "\U0001f5f3\ufe0f", + ":ballot_box_with_ballot:": "\U0001f5f3\ufe0f", + ":ballot_box_with_check:": "\u2611\ufe0f", + ":bamboo:": "\U0001f38d", + ":banana:": "\U0001f34c", + ":bangbang:": "\u203c\ufe0f", + ":bangladesh:": "\U0001f1e7\U0001f1e9", + ":banjo:": "\U0001fa95", + ":bank:": "\U0001f3e6", + ":bar_chart:": "\U0001f4ca", + ":barbados:": "\U0001f1e7\U0001f1e7", + ":barber:": "\U0001f488", + ":barber_pole:": "\U0001f488", + ":baseball:": "\u26be", + ":basket:": "\U0001f9fa", + ":basketball:": "\U0001f3c0", + ":basketball_man:": "\u26f9\ufe0f\u200d\u2642\ufe0f", + ":basketball_woman:": "\u26f9\ufe0f\u200d\u2640\ufe0f", + ":bat:": "\U0001f987", + ":bath:": "\U0001f6c0", + ":bathtub:": "\U0001f6c1", + ":battery:": "\U0001f50b", + ":beach_umbrella:": "\U0001f3d6\ufe0f", + ":beach_with_umbrella:": "\U0001f3d6\ufe0f", + ":beaming_face_with_smiling_eyes:": "\U0001f601", + ":bear:": "\U0001f43b", + ":bearded_person:": "\U0001f9d4", + ":beating_heart:": "\U0001f493", + ":beaver:": "\U0001f9ab", + ":bed:": "\U0001f6cf\ufe0f", + ":bee:": "\U0001f41d", + ":beer:": "\U0001f37a", + ":beer_mug:": "\U0001f37a", + ":beers:": "\U0001f37b", + ":beetle:": "\U0001fab2", + ":beginner:": "\U0001f530", + ":belarus:": "\U0001f1e7\U0001f1fe", + ":belgium:": "\U0001f1e7\U0001f1ea", + ":belize:": "\U0001f1e7\U0001f1ff", + ":bell:": "\U0001f514", + ":bell_pepper:": "\U0001fad1", + ":bell_with_slash:": "\U0001f515", + ":bellhop_bell:": "\U0001f6ce\ufe0f", + ":benin:": "\U0001f1e7\U0001f1ef", + ":bento:": "\U0001f371", + ":bento_box:": "\U0001f371", + ":bermuda:": "\U0001f1e7\U0001f1f2", + ":beverage_box:": "\U0001f9c3", + ":bhutan:": "\U0001f1e7\U0001f1f9", + ":bicycle:": "\U0001f6b2", + ":bicyclist:": "\U0001f6b4", + ":bike:": "\U0001f6b2", + ":biking_man:": "\U0001f6b4\u200d\u2642\ufe0f", + ":biking_woman:": "\U0001f6b4\u200d\u2640\ufe0f", + ":bikini:": "\U0001f459", + ":billed_cap:": "\U0001f9e2", + ":biohazard:": "\u2623\ufe0f", + ":bird:": "\U0001f426", + ":birthday:": "\U0001f382", + ":birthday_cake:": "\U0001f382", + ":bison:": "\U0001f9ac", + ":black_cat:": "\U0001f408\u200d\u2b1b", + ":black_circle:": "\u26ab", + ":black_flag:": "\U0001f3f4", + ":black_heart:": "\U0001f5a4", + ":black_joker:": "\U0001f0cf", + ":black_large_square:": "\u2b1b", + ":black_medium_small_square:": "\u25fe", + ":black_medium_square:": "\u25fc\ufe0f", + ":black_nib:": "\u2712\ufe0f", + ":black_small_square:": "\u25aa\ufe0f", + ":black_square_button:": "\U0001f532", + ":blond_haired_man:": "\U0001f471\u200d\u2642\ufe0f", + ":blond_haired_person:": "\U0001f471", + ":blond_haired_woman:": "\U0001f471\u200d\u2640\ufe0f", + ":blonde_woman:": "\U0001f471\u200d\u2640\ufe0f", + ":blossom:": "\U0001f33c", + ":blowfish:": "\U0001f421", + ":blue_book:": "\U0001f4d8", + ":blue_car:": "\U0001f699", + ":blue_circle:": "\U0001f535", + ":blue_heart:": "\U0001f499", + ":blue_square:": "\U0001f7e6", + ":blueberries:": "\U0001fad0", + ":blush:": "\U0001f60a", + ":boar:": "\U0001f417", + ":boat:": "\u26f5", + ":bolivia:": "\U0001f1e7\U0001f1f4", + ":bomb:": "\U0001f4a3", + ":bone:": "\U0001f9b4", + ":book:": "\U0001f4d6", + ":bookmark:": "\U0001f516", + ":bookmark_tabs:": "\U0001f4d1", + ":books:": "\U0001f4da", + ":boom:": "\U0001f4a5", + ":boomerang:": "\U0001fa83", + ":boot:": "\U0001f462", + ":bosnia_herzegovina:": "\U0001f1e7\U0001f1e6", + ":botswana:": "\U0001f1e7\U0001f1fc", + ":bottle_with_popping_cork:": "\U0001f37e", + ":bouncing_ball_man:": "\u26f9\ufe0f\u200d\u2642\ufe0f", + ":bouncing_ball_person:": "\u26f9\ufe0f", + ":bouncing_ball_woman:": "\u26f9\ufe0f\u200d\u2640\ufe0f", + ":bouquet:": "\U0001f490", + ":bouvet_island:": "\U0001f1e7\U0001f1fb", + ":bow:": "\U0001f647", + ":bow_and_arrow:": "\U0001f3f9", + ":bowing_man:": "\U0001f647\u200d\u2642\ufe0f", + ":bowing_woman:": "\U0001f647\u200d\u2640\ufe0f", + ":bowl_with_spoon:": "\U0001f963", + ":bowling:": "\U0001f3b3", + ":boxing_glove:": "\U0001f94a", + ":boy:": "\U0001f466", + ":brain:": "\U0001f9e0", + ":brazil:": "\U0001f1e7\U0001f1f7", + ":bread:": "\U0001f35e", + ":breast_feeding:": "\U0001f931", + ":brick:": "\U0001f9f1", + ":bricks:": "\U0001f9f1", + ":bride_with_veil:": "\U0001f470\u200d\u2640\ufe0f", + ":bridge_at_night:": "\U0001f309", + ":briefcase:": "\U0001f4bc", + ":briefs:": "\U0001fa72", + ":bright_button:": "\U0001f506", + ":british_indian_ocean_territory:": "\U0001f1ee\U0001f1f4", + ":british_virgin_islands:": "\U0001f1fb\U0001f1ec", + ":broccoli:": "\U0001f966", + ":broken_heart:": "\U0001f494", + ":broom:": "\U0001f9f9", + ":brown_circle:": "\U0001f7e4", + ":brown_heart:": "\U0001f90e", + ":brown_square:": "\U0001f7eb", + ":brunei:": "\U0001f1e7\U0001f1f3", + ":bubble_tea:": "\U0001f9cb", + ":bucket:": "\U0001faa3", + ":bug:": "\U0001f41b", + ":building_construction:": "\U0001f3d7\ufe0f", + ":bulb:": "\U0001f4a1", + ":bulgaria:": "\U0001f1e7\U0001f1ec", + ":bullet_train:": "\U0001f685", + ":bullettrain_front:": "\U0001f685", + ":bullettrain_side:": "\U0001f684", + ":burkina_faso:": "\U0001f1e7\U0001f1eb", + ":burrito:": "\U0001f32f", + ":burundi:": "\U0001f1e7\U0001f1ee", + ":bus:": "\U0001f68c", + ":bus_stop:": "\U0001f68f", + ":business_suit_levitating:": "\U0001f574\ufe0f", + ":busstop:": "\U0001f68f", + ":bust_in_silhouette:": "\U0001f464", + ":busts_in_silhouette:": "\U0001f465", + ":butter:": "\U0001f9c8", + ":butterfly:": "\U0001f98b", + ":cactus:": "\U0001f335", + ":cake:": "\U0001f370", + ":calendar:": "\U0001f4c6", + ":call_me_hand:": "\U0001f919", + ":calling:": "\U0001f4f2", + ":cambodia:": "\U0001f1f0\U0001f1ed", + ":camel:": "\U0001f42b", + ":camera:": "\U0001f4f7", + ":camera_flash:": "\U0001f4f8", + ":camera_with_flash:": "\U0001f4f8", + ":cameroon:": "\U0001f1e8\U0001f1f2", + ":camping:": "\U0001f3d5\ufe0f", + ":canada:": "\U0001f1e8\U0001f1e6", + ":canary_islands:": "\U0001f1ee\U0001f1e8", + ":cancer:": "\u264b", + ":candle:": "\U0001f56f\ufe0f", + ":candy:": "\U0001f36c", + ":canned_food:": "\U0001f96b", + ":canoe:": "\U0001f6f6", + ":cape_verde:": "\U0001f1e8\U0001f1fb", + ":capital_abcd:": "\U0001f520", + ":capricorn:": "\u2651", + ":car:": "\U0001f697", + ":card_file_box:": "\U0001f5c3\ufe0f", + ":card_index:": "\U0001f4c7", + ":card_index_dividers:": "\U0001f5c2\ufe0f", + ":caribbean_netherlands:": "\U0001f1e7\U0001f1f6", + ":carousel_horse:": "\U0001f3a0", + ":carp_streamer:": "\U0001f38f", + ":carpentry_saw:": "\U0001fa9a", + ":carrot:": "\U0001f955", + ":cartwheeling:": "\U0001f938", + ":castle:": "\U0001f3f0", + ":cat2:": "\U0001f408", + ":cat:": "\U0001f431", + ":cat_face:": "\U0001f431", + ":cat_with_tears_of_joy:": "\U0001f639", + ":cat_with_wry_smile:": "\U0001f63c", + ":cayman_islands:": "\U0001f1f0\U0001f1fe", + ":cd:": "\U0001f4bf", + ":central_african_republic:": "\U0001f1e8\U0001f1eb", + ":ceuta_melilla:": "\U0001f1ea\U0001f1e6", + ":chad:": "\U0001f1f9\U0001f1e9", + ":chains:": "\u26d3\ufe0f", + ":chair:": "\U0001fa91", + ":champagne:": "\U0001f37e", + ":chart:": "\U0001f4b9", + ":chart_decreasing:": "\U0001f4c9", + ":chart_increasing:": "\U0001f4c8", + ":chart_increasing_with_yen:": "\U0001f4b9", + ":chart_with_downwards_trend:": "\U0001f4c9", + ":chart_with_upwards_trend:": "\U0001f4c8", + ":check_box_with_check:": "\u2611\ufe0f", + ":check_mark:": "\u2714\ufe0f", + ":check_mark_button:": "\u2705", + ":checkered_flag:": "\U0001f3c1", + ":cheese:": "\U0001f9c0", + ":cheese_wedge:": "\U0001f9c0", + ":chequered_flag:": "\U0001f3c1", + ":cherries:": "\U0001f352", + ":cherry_blossom:": "\U0001f338", + ":chess_pawn:": "\u265f\ufe0f", + ":chestnut:": "\U0001f330", + ":chicken:": "\U0001f414", + ":child:": "\U0001f9d2", + ":children_crossing:": "\U0001f6b8", + ":chile:": "\U0001f1e8\U0001f1f1", + ":chipmunk:": "\U0001f43f\ufe0f", + ":chocolate_bar:": "\U0001f36b", + ":chopsticks:": "\U0001f962", + ":christmas_island:": "\U0001f1e8\U0001f1fd", + ":christmas_tree:": "\U0001f384", + ":church:": "\u26ea", + ":cigarette:": "\U0001f6ac", + ":cinema:": "\U0001f3a6", + ":circled_m:": "\u24c2\ufe0f", + ":circus_tent:": "\U0001f3aa", + ":city_sunrise:": "\U0001f307", + ":city_sunset:": "\U0001f306", + ":cityscape:": "\U0001f3d9\ufe0f", + ":cityscape_at_dusk:": "\U0001f306", + ":cl:": "\U0001f191", + ":cl_button:": "\U0001f191", + ":clamp:": "\U0001f5dc\ufe0f", + ":clap:": "\U0001f44f", + ":clapper:": "\U0001f3ac", + ":clapper_board:": "\U0001f3ac", + ":clapping_hands:": "\U0001f44f", + ":classical_building:": "\U0001f3db\ufe0f", + ":climbing:": "\U0001f9d7", + ":climbing_man:": "\U0001f9d7\u200d\u2642\ufe0f", + ":climbing_woman:": "\U0001f9d7\u200d\u2640\ufe0f", + ":clinking_beer_mugs:": "\U0001f37b", + ":clinking_glasses:": "\U0001f942", + ":clipboard:": "\U0001f4cb", + ":clipperton_island:": "\U0001f1e8\U0001f1f5", + ":clock1030:": "\U0001f565", + ":clock10:": "\U0001f559", + ":clock1130:": "\U0001f566", + ":clock11:": "\U0001f55a", + ":clock1230:": "\U0001f567", + ":clock12:": "\U0001f55b", + ":clock130:": "\U0001f55c", + ":clock1:": "\U0001f550", + ":clock230:": "\U0001f55d", + ":clock2:": "\U0001f551", + ":clock330:": "\U0001f55e", + ":clock3:": "\U0001f552", + ":clock430:": "\U0001f55f", + ":clock4:": "\U0001f553", + ":clock530:": "\U0001f560", + ":clock5:": "\U0001f554", + ":clock630:": "\U0001f561", + ":clock6:": "\U0001f555", + ":clock730:": "\U0001f562", + ":clock7:": "\U0001f556", + ":clock830:": "\U0001f563", + ":clock8:": "\U0001f557", + ":clock930:": "\U0001f564", + ":clock9:": "\U0001f558", + ":clockwise_vertical_arrows:": "\U0001f503", + ":closed_book:": "\U0001f4d5", + ":closed_lock_with_key:": "\U0001f510", + ":closed_mailbox_with_lowered_flag:": "\U0001f4ea", + ":closed_mailbox_with_raised_flag:": "\U0001f4eb", + ":closed_umbrella:": "\U0001f302", + ":cloud:": "\u2601\ufe0f", + ":cloud_with_lightning:": "\U0001f329\ufe0f", + ":cloud_with_lightning_and_rain:": "\u26c8\ufe0f", + ":cloud_with_rain:": "\U0001f327\ufe0f", + ":cloud_with_snow:": "\U0001f328\ufe0f", + ":clown_face:": "\U0001f921", + ":club_suit:": "\u2663\ufe0f", + ":clubs:": "\u2663\ufe0f", + ":clutch_bag:": "\U0001f45d", + ":cn:": "\U0001f1e8\U0001f1f3", + ":coat:": "\U0001f9e5", + ":cockroach:": "\U0001fab3", + ":cocktail:": "\U0001f378", + ":cocktail_glass:": "\U0001f378", + ":coconut:": "\U0001f965", + ":cocos_islands:": "\U0001f1e8\U0001f1e8", + ":coffee:": "\u2615", + ":coffin:": "\u26b0\ufe0f", + ":coin:": "\U0001fa99", + ":cold_face:": "\U0001f976", + ":cold_sweat:": "\U0001f630", + ":collision:": "\U0001f4a5", + ":colombia:": "\U0001f1e8\U0001f1f4", + ":comet:": "\u2604\ufe0f", + ":comoros:": "\U0001f1f0\U0001f1f2", + ":compass:": "\U0001f9ed", + ":computer:": "\U0001f4bb", + ":computer_disk:": "\U0001f4bd", + ":computer_mouse:": "\U0001f5b1\ufe0f", + ":confetti_ball:": "\U0001f38a", + ":confounded:": "\U0001f616", + ":confounded_face:": "\U0001f616", + ":confused:": "\U0001f615", + ":confused_face:": "\U0001f615", + ":congo_brazzaville:": "\U0001f1e8\U0001f1ec", + ":congo_kinshasa:": "\U0001f1e8\U0001f1e9", + ":congratulations:": "\u3297\ufe0f", + ":construction:": "\U0001f6a7", + ":construction_worker:": "\U0001f477", + ":construction_worker_man:": "\U0001f477\u200d\u2642\ufe0f", + ":construction_worker_woman:": "\U0001f477\u200d\u2640\ufe0f", + ":control_knobs:": "\U0001f39b\ufe0f", + ":convenience_store:": "\U0001f3ea", + ":cook:": "\U0001f9d1\u200d\U0001f373", + ":cook_islands:": "\U0001f1e8\U0001f1f0", + ":cooked_rice:": "\U0001f35a", + ":cookie:": "\U0001f36a", + ":cooking:": "\U0001f373", + ":cool:": "\U0001f192", + ":cool_button:": "\U0001f192", + ":cop:": "\U0001f46e", + ":copyright:": "\u00a9\ufe0f", + ":corn:": "\U0001f33d", + ":costa_rica:": "\U0001f1e8\U0001f1f7", + ":cote_divoire:": "\U0001f1e8\U0001f1ee", + ":couch_and_lamp:": "\U0001f6cb\ufe0f", + ":counterclockwise_arrows_button:": "\U0001f504", + ":couple:": "\U0001f46b", + ":couple_with_heart:": "\U0001f491", + ":couple_with_heart_man_man:": "\U0001f468\u200d\u2764\ufe0f\u200d\U0001f468", + ":couple_with_heart_woman_man:": "\U0001f469\u200d\u2764\ufe0f\u200d\U0001f468", + ":couple_with_heart_woman_woman:": "\U0001f469\u200d\u2764\ufe0f\u200d\U0001f469", + ":couplekiss:": "\U0001f48f", + ":couplekiss_man_man:": "\U0001f468\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", + ":couplekiss_man_woman:": "\U0001f469\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", + ":couplekiss_woman_woman:": "\U0001f469\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", + ":cow2:": "\U0001f404", + ":cow:": "\U0001f42e", + ":cow_face:": "\U0001f42e", + ":cowboy_hat_face:": "\U0001f920", + ":crab:": "\U0001f980", + ":crayon:": "\U0001f58d\ufe0f", + ":credit_card:": "\U0001f4b3", + ":crescent_moon:": "\U0001f319", + ":cricket:": "\U0001f997", + ":cricket_game:": "\U0001f3cf", + ":croatia:": "\U0001f1ed\U0001f1f7", + ":crocodile:": "\U0001f40a", + ":croissant:": "\U0001f950", + ":cross_mark:": "\u274c", + ":cross_mark_button:": "\u274e", + ":crossed_fingers:": "\U0001f91e", + ":crossed_flags:": "\U0001f38c", + ":crossed_swords:": "\u2694\ufe0f", + ":crown:": "\U0001f451", + ":cry:": "\U0001f622", + ":crying_cat:": "\U0001f63f", + ":crying_cat_face:": "\U0001f63f", + ":crying_face:": "\U0001f622", + ":crystal_ball:": "\U0001f52e", + ":cuba:": "\U0001f1e8\U0001f1fa", + ":cucumber:": "\U0001f952", + ":cup_with_straw:": "\U0001f964", + ":cupcake:": "\U0001f9c1", + ":cupid:": "\U0001f498", + ":curacao:": "\U0001f1e8\U0001f1fc", + ":curling_stone:": "\U0001f94c", + ":curly_hair:": "\U0001f9b1", + ":curly_haired_man:": "\U0001f468\u200d\U0001f9b1", + ":curly_haired_woman:": "\U0001f469\u200d\U0001f9b1", + ":curly_loop:": "\u27b0", + ":currency_exchange:": "\U0001f4b1", + ":curry:": "\U0001f35b", + ":curry_rice:": "\U0001f35b", + ":cursing_face:": "\U0001f92c", + ":custard:": "\U0001f36e", + ":customs:": "\U0001f6c3", + ":cut_of_meat:": "\U0001f969", + ":cyclone:": "\U0001f300", + ":cyprus:": "\U0001f1e8\U0001f1fe", + ":czech_republic:": "\U0001f1e8\U0001f1ff", + ":dagger:": "\U0001f5e1\ufe0f", + ":dancer:": "\U0001f483", + ":dancers:": "\U0001f46f", + ":dancing_men:": "\U0001f46f\u200d\u2642\ufe0f", + ":dancing_women:": "\U0001f46f\u200d\u2640\ufe0f", + ":dango:": "\U0001f361", + ":dark_skin_tone:": "\U0001f3ff", + ":dark_sunglasses:": "\U0001f576\ufe0f", + ":dart:": "\U0001f3af", + ":dash:": "\U0001f4a8", + ":dashing_away:": "\U0001f4a8", + ":date:": "\U0001f4c5", + ":de:": "\U0001f1e9\U0001f1ea", + ":deaf_man:": "\U0001f9cf\u200d\u2642\ufe0f", + ":deaf_person:": "\U0001f9cf", + ":deaf_woman:": "\U0001f9cf\u200d\u2640\ufe0f", + ":deciduous_tree:": "\U0001f333", + ":deer:": "\U0001f98c", + ":delivery_truck:": "\U0001f69a", + ":denmark:": "\U0001f1e9\U0001f1f0", + ":department_store:": "\U0001f3ec", + ":derelict_house:": "\U0001f3da\ufe0f", + ":desert:": "\U0001f3dc\ufe0f", + ":desert_island:": "\U0001f3dd\ufe0f", + ":desktop_computer:": "\U0001f5a5\ufe0f", + ":detective:": "\U0001f575\ufe0f", + ":diamond_shape_with_a_dot_inside:": "\U0001f4a0", + ":diamond_suit:": "\u2666\ufe0f", + ":diamond_with_a_dot:": "\U0001f4a0", + ":diamonds:": "\u2666\ufe0f", + ":diego_garcia:": "\U0001f1e9\U0001f1ec", + ":dim_button:": "\U0001f505", + ":direct_hit:": "\U0001f3af", + ":disappointed:": "\U0001f61e", + ":disappointed_face:": "\U0001f61e", + ":disappointed_relieved:": "\U0001f625", + ":disguised_face:": "\U0001f978", + ":divide:": "\u2797", + ":diving_mask:": "\U0001f93f", + ":diya_lamp:": "\U0001fa94", + ":dizzy:": "\U0001f4ab", + ":dizzy_face:": "\U0001f635", + ":djibouti:": "\U0001f1e9\U0001f1ef", + ":dna:": "\U0001f9ec", + ":do_not_litter:": "\U0001f6af", + ":dodo:": "\U0001f9a4", + ":dog2:": "\U0001f415", + ":dog:": "\U0001f436", + ":dog_face:": "\U0001f436", + ":dollar:": "\U0001f4b5", + ":dollar_banknote:": "\U0001f4b5", + ":dolls:": "\U0001f38e", + ":dolphin:": "\U0001f42c", + ":dominica:": "\U0001f1e9\U0001f1f2", + ":dominican_republic:": "\U0001f1e9\U0001f1f4", + ":door:": "\U0001f6aa", + ":dotted_six_pointed_star:": "\U0001f52f", + ":double_curly_loop:": "\u27bf", + ":double_exclamation_mark:": "\u203c\ufe0f", + ":doughnut:": "\U0001f369", + ":dove:": "\U0001f54a\ufe0f", + ":down_arrow:": "\u2b07\ufe0f", + ":down_left_arrow:": "\u2199\ufe0f", + ":down_right_arrow:": "\u2198\ufe0f", + ":downcast_face_with_sweat:": "\U0001f613", + ":downwards_button:": "\U0001f53d", + ":dragon:": "\U0001f409", + ":dragon_face:": "\U0001f432", + ":dress:": "\U0001f457", + ":dromedary_camel:": "\U0001f42a", + ":drooling_face:": "\U0001f924", + ":drop_of_blood:": "\U0001fa78", + ":droplet:": "\U0001f4a7", + ":drum:": "\U0001f941", + ":duck:": "\U0001f986", + ":dumpling:": "\U0001f95f", + ":dvd:": "\U0001f4c0", + ":e-mail:": "\U0001f4e7", + ":e_mail:": "\U0001f4e7", + ":eagle:": "\U0001f985", + ":ear:": "\U0001f442", + ":ear_of_corn:": "\U0001f33d", + ":ear_of_rice:": "\U0001f33e", + ":ear_with_hearing_aid:": "\U0001f9bb", + ":earth_africa:": "\U0001f30d", + ":earth_americas:": "\U0001f30e", + ":earth_asia:": "\U0001f30f", + ":ecuador:": "\U0001f1ea\U0001f1e8", + ":egg:": "\U0001f95a", + ":eggplant:": "\U0001f346", + ":egypt:": "\U0001f1ea\U0001f1ec", + ":eight:": "8\ufe0f\u20e3", + ":eight_o_clock:": "\U0001f557", + ":eight_pointed_black_star:": "\u2734\ufe0f", + ":eight_pointed_star:": "\u2734\ufe0f", + ":eight_spoked_asterisk:": "\u2733\ufe0f", + ":eight_thirty:": "\U0001f563", + ":eject_button:": "\u23cf\ufe0f", + ":el_salvador:": "\U0001f1f8\U0001f1fb", + ":electric_plug:": "\U0001f50c", + ":elephant:": "\U0001f418", + ":elevator:": "\U0001f6d7", + ":eleven_o_clock:": "\U0001f55a", + ":eleven_thirty:": "\U0001f566", + ":elf:": "\U0001f9dd", + ":elf_man:": "\U0001f9dd\u200d\u2642\ufe0f", + ":elf_woman:": "\U0001f9dd\u200d\u2640\ufe0f", + ":email:": "\u2709\ufe0f", + ":end:": "\U0001f51a", + ":end_arrow:": "\U0001f51a", + ":england:": "\U0001f3f4\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", + ":envelope:": "\u2709\ufe0f", + ":envelope_with_arrow:": "\U0001f4e9", + ":equatorial_guinea:": "\U0001f1ec\U0001f1f6", + ":eritrea:": "\U0001f1ea\U0001f1f7", + ":es:": "\U0001f1ea\U0001f1f8", + ":estonia:": "\U0001f1ea\U0001f1ea", + ":ethiopia:": "\U0001f1ea\U0001f1f9", + ":eu:": "\U0001f1ea\U0001f1fa", + ":euro:": "\U0001f4b6", + ":euro_banknote:": "\U0001f4b6", + ":european_castle:": "\U0001f3f0", + ":european_post_office:": "\U0001f3e4", + ":european_union:": "\U0001f1ea\U0001f1fa", + ":evergreen_tree:": "\U0001f332", + ":ewe:": "\U0001f411", + ":exclamation:": "\u2757", + ":exclamation_mark:": "\u2757", + ":exclamation_question_mark:": "\u2049\ufe0f", + ":exploding_head:": "\U0001f92f", + ":expressionless:": "\U0001f611", + ":expressionless_face:": "\U0001f611", + ":eye:": "\U0001f441\ufe0f", + ":eye_in_speech_bubble:": "\U0001f441\ufe0f\u200d\U0001f5e8\ufe0f", + ":eye_speech_bubble:": "\U0001f441\ufe0f\u200d\U0001f5e8\ufe0f", + ":eyeglasses:": "\U0001f453", + ":eyes:": "\U0001f440", + ":face_blowing_a_kiss:": "\U0001f618", + ":face_savoring_food:": "\U0001f60b", + ":face_screaming_in_fear:": "\U0001f631", + ":face_vomiting:": "\U0001f92e", + ":face_with_hand_over_mouth:": "\U0001f92d", + ":face_with_head_bandage:": "\U0001f915", + ":face_with_medical_mask:": "\U0001f637", + ":face_with_monocle:": "\U0001f9d0", + ":face_with_open_mouth:": "\U0001f62e", + ":face_with_raised_eyebrow:": "\U0001f928", + ":face_with_rolling_eyes:": "\U0001f644", + ":face_with_steam_from_nose:": "\U0001f624", + ":face_with_symbols_on_mouth:": "\U0001f92c", + ":face_with_tears_of_joy:": "\U0001f602", + ":face_with_thermometer:": "\U0001f912", + ":face_with_tongue:": "\U0001f61b", + ":face_without_mouth:": "\U0001f636", + ":facepalm:": "\U0001f926", + ":facepunch:": "\U0001f44a", + ":factory:": "\U0001f3ed", + ":factory_worker:": "\U0001f9d1\u200d\U0001f3ed", + ":fairy:": "\U0001f9da", + ":fairy_man:": "\U0001f9da\u200d\u2642\ufe0f", + ":fairy_woman:": "\U0001f9da\u200d\u2640\ufe0f", + ":falafel:": "\U0001f9c6", + ":falkland_islands:": "\U0001f1eb\U0001f1f0", + ":fallen_leaf:": "\U0001f342", + ":family:": "\U0001f46a", + ":family_man_boy:": "\U0001f468\u200d\U0001f466", + ":family_man_boy_boy:": "\U0001f468\u200d\U0001f466\u200d\U0001f466", + ":family_man_girl:": "\U0001f468\u200d\U0001f467", + ":family_man_girl_boy:": "\U0001f468\u200d\U0001f467\u200d\U0001f466", + ":family_man_girl_girl:": "\U0001f468\u200d\U0001f467\u200d\U0001f467", + ":family_man_man_boy:": "\U0001f468\u200d\U0001f468\u200d\U0001f466", + ":family_man_man_boy_boy:": "\U0001f468\u200d\U0001f468\u200d\U0001f466\u200d\U0001f466", + ":family_man_man_girl:": "\U0001f468\u200d\U0001f468\u200d\U0001f467", + ":family_man_man_girl_boy:": "\U0001f468\u200d\U0001f468\u200d\U0001f467\u200d\U0001f466", + ":family_man_man_girl_girl:": "\U0001f468\u200d\U0001f468\u200d\U0001f467\u200d\U0001f467", + ":family_man_woman_boy:": "\U0001f468\u200d\U0001f469\u200d\U0001f466", + ":family_man_woman_boy_boy:": "\U0001f468\u200d\U0001f469\u200d\U0001f466\u200d\U0001f466", + ":family_man_woman_girl:": "\U0001f468\u200d\U0001f469\u200d\U0001f467", + ":family_man_woman_girl_boy:": "\U0001f468\u200d\U0001f469\u200d\U0001f467\u200d\U0001f466", + ":family_man_woman_girl_girl:": "\U0001f468\u200d\U0001f469\u200d\U0001f467\u200d\U0001f467", + ":family_woman_boy:": "\U0001f469\u200d\U0001f466", + ":family_woman_boy_boy:": "\U0001f469\u200d\U0001f466\u200d\U0001f466", + ":family_woman_girl:": "\U0001f469\u200d\U0001f467", + ":family_woman_girl_boy:": "\U0001f469\u200d\U0001f467\u200d\U0001f466", + ":family_woman_girl_girl:": "\U0001f469\u200d\U0001f467\u200d\U0001f467", + ":family_woman_woman_boy:": "\U0001f469\u200d\U0001f469\u200d\U0001f466", + ":family_woman_woman_boy_boy:": "\U0001f469\u200d\U0001f469\u200d\U0001f466\u200d\U0001f466", + ":family_woman_woman_girl:": "\U0001f469\u200d\U0001f469\u200d\U0001f467", + ":family_woman_woman_girl_boy:": "\U0001f469\u200d\U0001f469\u200d\U0001f467\u200d\U0001f466", + ":family_woman_woman_girl_girl:": "\U0001f469\u200d\U0001f469\u200d\U0001f467\u200d\U0001f467", + ":farmer:": "\U0001f9d1\u200d\U0001f33e", + ":faroe_islands:": "\U0001f1eb\U0001f1f4", + ":fast_down_button:": "\u23ec", + ":fast_forward:": "\u23e9", + ":fast_forward_button:": "\u23e9", + ":fast_reverse_button:": "\u23ea", + ":fast_up_button:": "\u23eb", + ":fax:": "\U0001f4e0", + ":fax_machine:": "\U0001f4e0", + ":fearful:": "\U0001f628", + ":fearful_face:": "\U0001f628", + ":feather:": "\U0001fab6", + ":feet:": "\U0001f43e", + ":female_detective:": "\U0001f575\ufe0f\u200d\u2640\ufe0f", + ":female_sign:": "\u2640\ufe0f", + ":ferris_wheel:": "\U0001f3a1", + ":ferry:": "\u26f4\ufe0f", + ":field_hockey:": "\U0001f3d1", + ":fiji:": "\U0001f1eb\U0001f1ef", + ":file_cabinet:": "\U0001f5c4\ufe0f", + ":file_folder:": "\U0001f4c1", + ":film_frames:": "\U0001f39e\ufe0f", + ":film_projector:": "\U0001f4fd\ufe0f", + ":film_strip:": "\U0001f39e\ufe0f", + ":finland:": "\U0001f1eb\U0001f1ee", + ":fire:": "\U0001f525", + ":fire_engine:": "\U0001f692", + ":fire_extinguisher:": "\U0001f9ef", + ":firecracker:": "\U0001f9e8", + ":firefighter:": "\U0001f9d1\u200d\U0001f692", + ":fireworks:": "\U0001f386", + ":first_place_medal:": "\U0001f947", + ":first_quarter_moon:": "\U0001f313", + ":first_quarter_moon_face:": "\U0001f31b", + ":first_quarter_moon_with_face:": "\U0001f31b", + ":fish:": "\U0001f41f", + ":fish_cake:": "\U0001f365", + ":fish_cake_with_swirl:": "\U0001f365", + ":fishing_pole:": "\U0001f3a3", + ":fishing_pole_and_fish:": "\U0001f3a3", + ":fist:": "\u270a", + ":fist_left:": "\U0001f91b", + ":fist_oncoming:": "\U0001f44a", + ":fist_raised:": "\u270a", + ":fist_right:": "\U0001f91c", + ":five:": "5\ufe0f\u20e3", + ":five_o_clock:": "\U0001f554", + ":five_thirty:": "\U0001f560", + ":flag_for_afghanistan:": "\U0001f1e6\U0001f1eb", + ":flag_for_aland_islands:": "\U0001f1e6\U0001f1fd", + ":flag_for_albania:": "\U0001f1e6\U0001f1f1", + ":flag_for_algeria:": "\U0001f1e9\U0001f1ff", + ":flag_for_american_samoa:": "\U0001f1e6\U0001f1f8", + ":flag_for_andorra:": "\U0001f1e6\U0001f1e9", + ":flag_for_angola:": "\U0001f1e6\U0001f1f4", + ":flag_for_anguilla:": "\U0001f1e6\U0001f1ee", + ":flag_for_antarctica:": "\U0001f1e6\U0001f1f6", + ":flag_for_antigua_and_barbuda:": "\U0001f1e6\U0001f1ec", + ":flag_for_argentina:": "\U0001f1e6\U0001f1f7", + ":flag_for_armenia:": "\U0001f1e6\U0001f1f2", + ":flag_for_aruba:": "\U0001f1e6\U0001f1fc", + ":flag_for_ascension_island:": "\U0001f1e6\U0001f1e8", + ":flag_for_australia:": "\U0001f1e6\U0001f1fa", + ":flag_for_austria:": "\U0001f1e6\U0001f1f9", + ":flag_for_azerbaijan:": "\U0001f1e6\U0001f1ff", + ":flag_for_bahamas:": "\U0001f1e7\U0001f1f8", + ":flag_for_bahrain:": "\U0001f1e7\U0001f1ed", + ":flag_for_bangladesh:": "\U0001f1e7\U0001f1e9", + ":flag_for_barbados:": "\U0001f1e7\U0001f1e7", + ":flag_for_belarus:": "\U0001f1e7\U0001f1fe", + ":flag_for_belgium:": "\U0001f1e7\U0001f1ea", + ":flag_for_belize:": "\U0001f1e7\U0001f1ff", + ":flag_for_benin:": "\U0001f1e7\U0001f1ef", + ":flag_for_bermuda:": "\U0001f1e7\U0001f1f2", + ":flag_for_bhutan:": "\U0001f1e7\U0001f1f9", + ":flag_for_bolivia:": "\U0001f1e7\U0001f1f4", + ":flag_for_bosnia_and_herzegovina:": "\U0001f1e7\U0001f1e6", + ":flag_for_botswana:": "\U0001f1e7\U0001f1fc", + ":flag_for_bouvet_island:": "\U0001f1e7\U0001f1fb", + ":flag_for_brazil:": "\U0001f1e7\U0001f1f7", + ":flag_for_british_indian_ocean_territory:": "\U0001f1ee\U0001f1f4", + ":flag_for_british_virgin_islands:": "\U0001f1fb\U0001f1ec", + ":flag_for_brunei:": "\U0001f1e7\U0001f1f3", + ":flag_for_bulgaria:": "\U0001f1e7\U0001f1ec", + ":flag_for_burkina_faso:": "\U0001f1e7\U0001f1eb", + ":flag_for_burundi:": "\U0001f1e7\U0001f1ee", + ":flag_for_cambodia:": "\U0001f1f0\U0001f1ed", + ":flag_for_cameroon:": "\U0001f1e8\U0001f1f2", + ":flag_for_canada:": "\U0001f1e8\U0001f1e6", + ":flag_for_canary_islands:": "\U0001f1ee\U0001f1e8", + ":flag_for_cape_verde:": "\U0001f1e8\U0001f1fb", + ":flag_for_caribbean_netherlands:": "\U0001f1e7\U0001f1f6", + ":flag_for_cayman_islands:": "\U0001f1f0\U0001f1fe", + ":flag_for_central_african_republic:": "\U0001f1e8\U0001f1eb", + ":flag_for_ceuta_and_melilla:": "\U0001f1ea\U0001f1e6", + ":flag_for_chad:": "\U0001f1f9\U0001f1e9", + ":flag_for_chile:": "\U0001f1e8\U0001f1f1", + ":flag_for_china:": "\U0001f1e8\U0001f1f3", + ":flag_for_christmas_island:": "\U0001f1e8\U0001f1fd", + ":flag_for_clipperton_island:": "\U0001f1e8\U0001f1f5", + ":flag_for_cocos_keeling_islands:": "\U0001f1e8\U0001f1e8", + ":flag_for_colombia:": "\U0001f1e8\U0001f1f4", + ":flag_for_comoros:": "\U0001f1f0\U0001f1f2", + ":flag_for_congo_brazzaville:": "\U0001f1e8\U0001f1ec", + ":flag_for_congo_kinshasa:": "\U0001f1e8\U0001f1e9", + ":flag_for_cook_islands:": "\U0001f1e8\U0001f1f0", + ":flag_for_costa_rica:": "\U0001f1e8\U0001f1f7", + ":flag_for_cote_d_ivoire:": "\U0001f1e8\U0001f1ee", + ":flag_for_croatia:": "\U0001f1ed\U0001f1f7", + ":flag_for_cuba:": "\U0001f1e8\U0001f1fa", + ":flag_for_curacao:": "\U0001f1e8\U0001f1fc", + ":flag_for_cyprus:": "\U0001f1e8\U0001f1fe", + ":flag_for_czechia:": "\U0001f1e8\U0001f1ff", + ":flag_for_denmark:": "\U0001f1e9\U0001f1f0", + ":flag_for_diego_garcia:": "\U0001f1e9\U0001f1ec", + ":flag_for_djibouti:": "\U0001f1e9\U0001f1ef", + ":flag_for_dominica:": "\U0001f1e9\U0001f1f2", + ":flag_for_dominican_republic:": "\U0001f1e9\U0001f1f4", + ":flag_for_ecuador:": "\U0001f1ea\U0001f1e8", + ":flag_for_egypt:": "\U0001f1ea\U0001f1ec", + ":flag_for_el_salvador:": "\U0001f1f8\U0001f1fb", + ":flag_for_england:": "\U0001f3f4\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", + ":flag_for_equatorial_guinea:": "\U0001f1ec\U0001f1f6", + ":flag_for_eritrea:": "\U0001f1ea\U0001f1f7", + ":flag_for_estonia:": "\U0001f1ea\U0001f1ea", + ":flag_for_eswatini:": "\U0001f1f8\U0001f1ff", + ":flag_for_ethiopia:": "\U0001f1ea\U0001f1f9", + ":flag_for_european_union:": "\U0001f1ea\U0001f1fa", + ":flag_for_falkland_islands:": "\U0001f1eb\U0001f1f0", + ":flag_for_faroe_islands:": "\U0001f1eb\U0001f1f4", + ":flag_for_fiji:": "\U0001f1eb\U0001f1ef", + ":flag_for_finland:": "\U0001f1eb\U0001f1ee", + ":flag_for_france:": "\U0001f1eb\U0001f1f7", + ":flag_for_french_guiana:": "\U0001f1ec\U0001f1eb", + ":flag_for_french_polynesia:": "\U0001f1f5\U0001f1eb", + ":flag_for_french_southern_territories:": "\U0001f1f9\U0001f1eb", + ":flag_for_gabon:": "\U0001f1ec\U0001f1e6", + ":flag_for_gambia:": "\U0001f1ec\U0001f1f2", + ":flag_for_georgia:": "\U0001f1ec\U0001f1ea", + ":flag_for_germany:": "\U0001f1e9\U0001f1ea", + ":flag_for_ghana:": "\U0001f1ec\U0001f1ed", + ":flag_for_gibraltar:": "\U0001f1ec\U0001f1ee", + ":flag_for_greece:": "\U0001f1ec\U0001f1f7", + ":flag_for_greenland:": "\U0001f1ec\U0001f1f1", + ":flag_for_grenada:": "\U0001f1ec\U0001f1e9", + ":flag_for_guadeloupe:": "\U0001f1ec\U0001f1f5", + ":flag_for_guam:": "\U0001f1ec\U0001f1fa", + ":flag_for_guatemala:": "\U0001f1ec\U0001f1f9", + ":flag_for_guernsey:": "\U0001f1ec\U0001f1ec", + ":flag_for_guinea:": "\U0001f1ec\U0001f1f3", + ":flag_for_guinea_bissau:": "\U0001f1ec\U0001f1fc", + ":flag_for_guyana:": "\U0001f1ec\U0001f1fe", + ":flag_for_haiti:": "\U0001f1ed\U0001f1f9", + ":flag_for_heard_and_mcdonald_islands:": "\U0001f1ed\U0001f1f2", + ":flag_for_honduras:": "\U0001f1ed\U0001f1f3", + ":flag_for_hong_kong_sar_china:": "\U0001f1ed\U0001f1f0", + ":flag_for_hungary:": "\U0001f1ed\U0001f1fa", + ":flag_for_iceland:": "\U0001f1ee\U0001f1f8", + ":flag_for_india:": "\U0001f1ee\U0001f1f3", + ":flag_for_indonesia:": "\U0001f1ee\U0001f1e9", + ":flag_for_iran:": "\U0001f1ee\U0001f1f7", + ":flag_for_iraq:": "\U0001f1ee\U0001f1f6", + ":flag_for_ireland:": "\U0001f1ee\U0001f1ea", + ":flag_for_isle_of_man:": "\U0001f1ee\U0001f1f2", + ":flag_for_israel:": "\U0001f1ee\U0001f1f1", + ":flag_for_italy:": "\U0001f1ee\U0001f1f9", + ":flag_for_jamaica:": "\U0001f1ef\U0001f1f2", + ":flag_for_japan:": "\U0001f1ef\U0001f1f5", + ":flag_for_jersey:": "\U0001f1ef\U0001f1ea", + ":flag_for_jordan:": "\U0001f1ef\U0001f1f4", + ":flag_for_kazakhstan:": "\U0001f1f0\U0001f1ff", + ":flag_for_kenya:": "\U0001f1f0\U0001f1ea", + ":flag_for_kiribati:": "\U0001f1f0\U0001f1ee", + ":flag_for_kosovo:": "\U0001f1fd\U0001f1f0", + ":flag_for_kuwait:": "\U0001f1f0\U0001f1fc", + ":flag_for_kyrgyzstan:": "\U0001f1f0\U0001f1ec", + ":flag_for_laos:": "\U0001f1f1\U0001f1e6", + ":flag_for_latvia:": "\U0001f1f1\U0001f1fb", + ":flag_for_lebanon:": "\U0001f1f1\U0001f1e7", + ":flag_for_lesotho:": "\U0001f1f1\U0001f1f8", + ":flag_for_liberia:": "\U0001f1f1\U0001f1f7", + ":flag_for_libya:": "\U0001f1f1\U0001f1fe", + ":flag_for_liechtenstein:": "\U0001f1f1\U0001f1ee", + ":flag_for_lithuania:": "\U0001f1f1\U0001f1f9", + ":flag_for_luxembourg:": "\U0001f1f1\U0001f1fa", + ":flag_for_macao_sar_china:": "\U0001f1f2\U0001f1f4", + ":flag_for_madagascar:": "\U0001f1f2\U0001f1ec", + ":flag_for_malawi:": "\U0001f1f2\U0001f1fc", + ":flag_for_malaysia:": "\U0001f1f2\U0001f1fe", + ":flag_for_maldives:": "\U0001f1f2\U0001f1fb", + ":flag_for_mali:": "\U0001f1f2\U0001f1f1", + ":flag_for_malta:": "\U0001f1f2\U0001f1f9", + ":flag_for_marshall_islands:": "\U0001f1f2\U0001f1ed", + ":flag_for_martinique:": "\U0001f1f2\U0001f1f6", + ":flag_for_mauritania:": "\U0001f1f2\U0001f1f7", + ":flag_for_mauritius:": "\U0001f1f2\U0001f1fa", + ":flag_for_mayotte:": "\U0001f1fe\U0001f1f9", + ":flag_for_mexico:": "\U0001f1f2\U0001f1fd", + ":flag_for_micronesia:": "\U0001f1eb\U0001f1f2", + ":flag_for_moldova:": "\U0001f1f2\U0001f1e9", + ":flag_for_monaco:": "\U0001f1f2\U0001f1e8", + ":flag_for_mongolia:": "\U0001f1f2\U0001f1f3", + ":flag_for_montenegro:": "\U0001f1f2\U0001f1ea", + ":flag_for_montserrat:": "\U0001f1f2\U0001f1f8", + ":flag_for_morocco:": "\U0001f1f2\U0001f1e6", + ":flag_for_mozambique:": "\U0001f1f2\U0001f1ff", + ":flag_for_myanmar_burma:": "\U0001f1f2\U0001f1f2", + ":flag_for_namibia:": "\U0001f1f3\U0001f1e6", + ":flag_for_nauru:": "\U0001f1f3\U0001f1f7", + ":flag_for_nepal:": "\U0001f1f3\U0001f1f5", + ":flag_for_netherlands:": "\U0001f1f3\U0001f1f1", + ":flag_for_new_caledonia:": "\U0001f1f3\U0001f1e8", + ":flag_for_new_zealand:": "\U0001f1f3\U0001f1ff", + ":flag_for_nicaragua:": "\U0001f1f3\U0001f1ee", + ":flag_for_niger:": "\U0001f1f3\U0001f1ea", + ":flag_for_nigeria:": "\U0001f1f3\U0001f1ec", + ":flag_for_niue:": "\U0001f1f3\U0001f1fa", + ":flag_for_norfolk_island:": "\U0001f1f3\U0001f1eb", + ":flag_for_north_korea:": "\U0001f1f0\U0001f1f5", + ":flag_for_north_macedonia:": "\U0001f1f2\U0001f1f0", + ":flag_for_northern_mariana_islands:": "\U0001f1f2\U0001f1f5", + ":flag_for_norway:": "\U0001f1f3\U0001f1f4", + ":flag_for_oman:": "\U0001f1f4\U0001f1f2", + ":flag_for_pakistan:": "\U0001f1f5\U0001f1f0", + ":flag_for_palau:": "\U0001f1f5\U0001f1fc", + ":flag_for_palestinian_territories:": "\U0001f1f5\U0001f1f8", + ":flag_for_panama:": "\U0001f1f5\U0001f1e6", + ":flag_for_papua_new_guinea:": "\U0001f1f5\U0001f1ec", + ":flag_for_paraguay:": "\U0001f1f5\U0001f1fe", + ":flag_for_peru:": "\U0001f1f5\U0001f1ea", + ":flag_for_philippines:": "\U0001f1f5\U0001f1ed", + ":flag_for_pitcairn_islands:": "\U0001f1f5\U0001f1f3", + ":flag_for_poland:": "\U0001f1f5\U0001f1f1", + ":flag_for_portugal:": "\U0001f1f5\U0001f1f9", + ":flag_for_puerto_rico:": "\U0001f1f5\U0001f1f7", + ":flag_for_qatar:": "\U0001f1f6\U0001f1e6", + ":flag_for_reunion:": "\U0001f1f7\U0001f1ea", + ":flag_for_romania:": "\U0001f1f7\U0001f1f4", + ":flag_for_russia:": "\U0001f1f7\U0001f1fa", + ":flag_for_rwanda:": "\U0001f1f7\U0001f1fc", + ":flag_for_samoa:": "\U0001f1fc\U0001f1f8", + ":flag_for_san_marino:": "\U0001f1f8\U0001f1f2", + ":flag_for_sao_tome_and_principe:": "\U0001f1f8\U0001f1f9", + ":flag_for_saudi_arabia:": "\U0001f1f8\U0001f1e6", + ":flag_for_scotland:": "\U0001f3f4\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", + ":flag_for_senegal:": "\U0001f1f8\U0001f1f3", + ":flag_for_serbia:": "\U0001f1f7\U0001f1f8", + ":flag_for_seychelles:": "\U0001f1f8\U0001f1e8", + ":flag_for_sierra_leone:": "\U0001f1f8\U0001f1f1", + ":flag_for_singapore:": "\U0001f1f8\U0001f1ec", + ":flag_for_sint_maarten:": "\U0001f1f8\U0001f1fd", + ":flag_for_slovakia:": "\U0001f1f8\U0001f1f0", + ":flag_for_slovenia:": "\U0001f1f8\U0001f1ee", + ":flag_for_solomon_islands:": "\U0001f1f8\U0001f1e7", + ":flag_for_somalia:": "\U0001f1f8\U0001f1f4", + ":flag_for_south_africa:": "\U0001f1ff\U0001f1e6", + ":flag_for_south_georgia_and_south_sandwich_islands:": "\U0001f1ec\U0001f1f8", + ":flag_for_south_korea:": "\U0001f1f0\U0001f1f7", + ":flag_for_south_sudan:": "\U0001f1f8\U0001f1f8", + ":flag_for_spain:": "\U0001f1ea\U0001f1f8", + ":flag_for_sri_lanka:": "\U0001f1f1\U0001f1f0", + ":flag_for_st_barthelemy:": "\U0001f1e7\U0001f1f1", + ":flag_for_st_helena:": "\U0001f1f8\U0001f1ed", + ":flag_for_st_kitts_and_nevis:": "\U0001f1f0\U0001f1f3", + ":flag_for_st_lucia:": "\U0001f1f1\U0001f1e8", + ":flag_for_st_martin:": "\U0001f1f2\U0001f1eb", + ":flag_for_st_pierre_and_miquelon:": "\U0001f1f5\U0001f1f2", + ":flag_for_st_vincent_and_grenadines:": "\U0001f1fb\U0001f1e8", + ":flag_for_sudan:": "\U0001f1f8\U0001f1e9", + ":flag_for_suriname:": "\U0001f1f8\U0001f1f7", + ":flag_for_svalbard_and_jan_mayen:": "\U0001f1f8\U0001f1ef", + ":flag_for_sweden:": "\U0001f1f8\U0001f1ea", + ":flag_for_switzerland:": "\U0001f1e8\U0001f1ed", + ":flag_for_syria:": "\U0001f1f8\U0001f1fe", + ":flag_for_taiwan:": "\U0001f1f9\U0001f1fc", + ":flag_for_tajikistan:": "\U0001f1f9\U0001f1ef", + ":flag_for_tanzania:": "\U0001f1f9\U0001f1ff", + ":flag_for_thailand:": "\U0001f1f9\U0001f1ed", + ":flag_for_timor_leste:": "\U0001f1f9\U0001f1f1", + ":flag_for_togo:": "\U0001f1f9\U0001f1ec", + ":flag_for_tokelau:": "\U0001f1f9\U0001f1f0", + ":flag_for_tonga:": "\U0001f1f9\U0001f1f4", + ":flag_for_trinidad_and_tobago:": "\U0001f1f9\U0001f1f9", + ":flag_for_tristan_da_cunha:": "\U0001f1f9\U0001f1e6", + ":flag_for_tunisia:": "\U0001f1f9\U0001f1f3", + ":flag_for_turkey:": "\U0001f1f9\U0001f1f7", + ":flag_for_turkmenistan:": "\U0001f1f9\U0001f1f2", + ":flag_for_turks_and_caicos_islands:": "\U0001f1f9\U0001f1e8", + ":flag_for_tuvalu:": "\U0001f1f9\U0001f1fb", + ":flag_for_uganda:": "\U0001f1fa\U0001f1ec", + ":flag_for_ukraine:": "\U0001f1fa\U0001f1e6", + ":flag_for_united_arab_emirates:": "\U0001f1e6\U0001f1ea", + ":flag_for_united_kingdom:": "\U0001f1ec\U0001f1e7", + ":flag_for_united_nations:": "\U0001f1fa\U0001f1f3", + ":flag_for_united_states:": "\U0001f1fa\U0001f1f8", + ":flag_for_uruguay:": "\U0001f1fa\U0001f1fe", + ":flag_for_us_outlying_islands:": "\U0001f1fa\U0001f1f2", + ":flag_for_us_virgin_islands:": "\U0001f1fb\U0001f1ee", + ":flag_for_uzbekistan:": "\U0001f1fa\U0001f1ff", + ":flag_for_vanuatu:": "\U0001f1fb\U0001f1fa", + ":flag_for_vatican_city:": "\U0001f1fb\U0001f1e6", + ":flag_for_venezuela:": "\U0001f1fb\U0001f1ea", + ":flag_for_vietnam:": "\U0001f1fb\U0001f1f3", + ":flag_for_wales:": "\U0001f3f4\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", + ":flag_for_wallis_and_futuna:": "\U0001f1fc\U0001f1eb", + ":flag_for_western_sahara:": "\U0001f1ea\U0001f1ed", + ":flag_for_yemen:": "\U0001f1fe\U0001f1ea", + ":flag_for_zambia:": "\U0001f1ff\U0001f1f2", + ":flag_for_zimbabwe:": "\U0001f1ff\U0001f1fc", + ":flag_in_hole:": "\u26f3", + ":flags:": "\U0001f38f", + ":flamingo:": "\U0001f9a9", + ":flashlight:": "\U0001f526", + ":flat_shoe:": "\U0001f97f", + ":flatbread:": "\U0001fad3", + ":fleur_de_lis:": "\u269c\ufe0f", + ":flexed_biceps:": "\U0001f4aa", + ":flight_arrival:": "\U0001f6ec", + ":flight_departure:": "\U0001f6eb", + ":flipper:": "\U0001f42c", + ":floppy_disk:": "\U0001f4be", + ":flower_playing_cards:": "\U0001f3b4", + ":flushed:": "\U0001f633", + ":flushed_face:": "\U0001f633", + ":fly:": "\U0001fab0", + ":flying_disc:": "\U0001f94f", + ":flying_saucer:": "\U0001f6f8", + ":fog:": "\U0001f32b\ufe0f", + ":foggy:": "\U0001f301", + ":folded_hands:": "\U0001f64f", + ":fondue:": "\U0001fad5", + ":foot:": "\U0001f9b6", + ":football:": "\U0001f3c8", + ":footprints:": "\U0001f463", + ":fork_and_knife:": "\U0001f374", + ":fork_and_knife_with_plate:": "\U0001f37d\ufe0f", + ":fortune_cookie:": "\U0001f960", + ":fountain:": "\u26f2", + ":fountain_pen:": "\U0001f58b\ufe0f", + ":four:": "4\ufe0f\u20e3", + ":four_leaf_clover:": "\U0001f340", + ":four_o_clock:": "\U0001f553", + ":four_thirty:": "\U0001f55f", + ":fox:": "\U0001f98a", + ":fox_face:": "\U0001f98a", + ":fr:": "\U0001f1eb\U0001f1f7", + ":framed_picture:": "\U0001f5bc\ufe0f", + ":free:": "\U0001f193", + ":free_button:": "\U0001f193", + ":french_fries:": "\U0001f35f", + ":french_guiana:": "\U0001f1ec\U0001f1eb", + ":french_polynesia:": "\U0001f1f5\U0001f1eb", + ":french_southern_territories:": "\U0001f1f9\U0001f1eb", + ":fried_egg:": "\U0001f373", + ":fried_shrimp:": "\U0001f364", + ":fries:": "\U0001f35f", + ":frog:": "\U0001f438", + ":front_facing_baby_chick:": "\U0001f425", + ":frowning:": "\U0001f626", + ":frowning_face:": "\u2639\ufe0f", + ":frowning_face_with_open_mouth:": "\U0001f626", + ":frowning_man:": "\U0001f64d\u200d\u2642\ufe0f", + ":frowning_person:": "\U0001f64d", + ":frowning_woman:": "\U0001f64d\u200d\u2640\ufe0f", + ":fu:": "\U0001f595", + ":fuel_pump:": "\u26fd", + ":fuelpump:": "\u26fd", + ":full_moon:": "\U0001f315", + ":full_moon_face:": "\U0001f31d", + ":full_moon_with_face:": "\U0001f31d", + ":funeral_urn:": "\u26b1\ufe0f", + ":gabon:": "\U0001f1ec\U0001f1e6", + ":gambia:": "\U0001f1ec\U0001f1f2", + ":game_die:": "\U0001f3b2", + ":garlic:": "\U0001f9c4", + ":gb:": "\U0001f1ec\U0001f1e7", + ":gear:": "\u2699\ufe0f", + ":gem:": "\U0001f48e", + ":gem_stone:": "\U0001f48e", + ":gemini:": "\u264a", + ":genie:": "\U0001f9de", + ":genie_man:": "\U0001f9de\u200d\u2642\ufe0f", + ":genie_woman:": "\U0001f9de\u200d\u2640\ufe0f", + ":georgia:": "\U0001f1ec\U0001f1ea", + ":ghana:": "\U0001f1ec\U0001f1ed", + ":ghost:": "\U0001f47b", + ":gibraltar:": "\U0001f1ec\U0001f1ee", + ":gift:": "\U0001f381", + ":gift_heart:": "\U0001f49d", + ":giraffe:": "\U0001f992", + ":girl:": "\U0001f467", + ":glass_of_milk:": "\U0001f95b", + ":glasses:": "\U0001f453", + ":globe_showing_americas:": "\U0001f30e", + ":globe_showing_asia_australia:": "\U0001f30f", + ":globe_showing_europe_africa:": "\U0001f30d", + ":globe_with_meridians:": "\U0001f310", + ":gloves:": "\U0001f9e4", + ":glowing_star:": "\U0001f31f", + ":goal_net:": "\U0001f945", + ":goat:": "\U0001f410", + ":goblin:": "\U0001f47a", + ":goggles:": "\U0001f97d", + ":golf:": "\u26f3", + ":golfing:": "\U0001f3cc\ufe0f", + ":golfing_man:": "\U0001f3cc\ufe0f\u200d\u2642\ufe0f", + ":golfing_woman:": "\U0001f3cc\ufe0f\u200d\u2640\ufe0f", + ":gorilla:": "\U0001f98d", + ":graduation_cap:": "\U0001f393", + ":grapes:": "\U0001f347", + ":greece:": "\U0001f1ec\U0001f1f7", + ":green_apple:": "\U0001f34f", + ":green_book:": "\U0001f4d7", + ":green_circle:": "\U0001f7e2", + ":green_heart:": "\U0001f49a", + ":green_salad:": "\U0001f957", + ":green_square:": "\U0001f7e9", + ":greenland:": "\U0001f1ec\U0001f1f1", + ":grenada:": "\U0001f1ec\U0001f1e9", + ":grey_exclamation:": "\u2755", + ":grey_question:": "\u2754", + ":grimacing:": "\U0001f62c", + ":grimacing_face:": "\U0001f62c", + ":grin:": "\U0001f601", + ":grinning:": "\U0001f600", + ":grinning_cat:": "\U0001f63a", + ":grinning_cat_with_smiling_eyes:": "\U0001f638", + ":grinning_face:": "\U0001f600", + ":grinning_face_with_big_eyes:": "\U0001f603", + ":grinning_face_with_smiling_eyes:": "\U0001f604", + ":grinning_face_with_sweat:": "\U0001f605", + ":grinning_squinting_face:": "\U0001f606", + ":growing_heart:": "\U0001f497", + ":guadeloupe:": "\U0001f1ec\U0001f1f5", + ":guam:": "\U0001f1ec\U0001f1fa", + ":guard:": "\U0001f482", + ":guardsman:": "\U0001f482\u200d\u2642\ufe0f", + ":guardswoman:": "\U0001f482\u200d\u2640\ufe0f", + ":guatemala:": "\U0001f1ec\U0001f1f9", + ":guernsey:": "\U0001f1ec\U0001f1ec", + ":guide_dog:": "\U0001f9ae", + ":guinea:": "\U0001f1ec\U0001f1f3", + ":guinea_bissau:": "\U0001f1ec\U0001f1fc", + ":guitar:": "\U0001f3b8", + ":gun:": "\U0001f52b", + ":guyana:": "\U0001f1ec\U0001f1fe", + ":haircut:": "\U0001f487", + ":haircut_man:": "\U0001f487\u200d\u2642\ufe0f", + ":haircut_woman:": "\U0001f487\u200d\u2640\ufe0f", + ":haiti:": "\U0001f1ed\U0001f1f9", + ":hamburger:": "\U0001f354", + ":hammer:": "\U0001f528", + ":hammer_and_pick:": "\u2692\ufe0f", + ":hammer_and_wrench:": "\U0001f6e0\ufe0f", + ":hamster:": "\U0001f439", + ":hand:": "\u270b", + ":hand_over_mouth:": "\U0001f92d", + ":hand_with_fingers_splayed:": "\U0001f590\ufe0f", + ":handbag:": "\U0001f45c", + ":handball_person:": "\U0001f93e", + ":handshake:": "\U0001f91d", + ":hankey:": "\U0001f4a9", + ":hash:": "#\ufe0f\u20e3", + ":hatched_chick:": "\U0001f425", + ":hatching_chick:": "\U0001f423", + ":headphone:": "\U0001f3a7", + ":headphones:": "\U0001f3a7", + ":headstone:": "\U0001faa6", + ":health_worker:": "\U0001f9d1\u200d\u2695\ufe0f", + ":hear_no_evil:": "\U0001f649", + ":hear_no_evil_monkey:": "\U0001f649", + ":heard_mcdonald_islands:": "\U0001f1ed\U0001f1f2", + ":heart:": "\u2764\ufe0f", + ":heart_decoration:": "\U0001f49f", + ":heart_exclamation:": "\u2763\ufe0f", + ":heart_eyes:": "\U0001f60d", + ":heart_eyes_cat:": "\U0001f63b", + ":heart_suit:": "\u2665\ufe0f", + ":heart_with_arrow:": "\U0001f498", + ":heart_with_ribbon:": "\U0001f49d", + ":heartbeat:": "\U0001f493", + ":heartpulse:": "\U0001f497", + ":hearts:": "\u2665\ufe0f", + ":heavy_check_mark:": "\u2714\ufe0f", + ":heavy_division_sign:": "\u2797", + ":heavy_dollar_sign:": "\U0001f4b2", + ":heavy_exclamation_mark:": "\u2757", + ":heavy_heart_exclamation:": "\u2763\ufe0f", + ":heavy_minus_sign:": "\u2796", + ":heavy_multiplication_x:": "\u2716\ufe0f", + ":heavy_plus_sign:": "\u2795", + ":hedgehog:": "\U0001f994", + ":helicopter:": "\U0001f681", + ":herb:": "\U0001f33f", + ":hibiscus:": "\U0001f33a", + ":high_brightness:": "\U0001f506", + ":high_heel:": "\U0001f460", + ":high_heeled_shoe:": "\U0001f460", + ":high_speed_train:": "\U0001f684", + ":high_voltage:": "\u26a1", + ":hiking_boot:": "\U0001f97e", + ":hindu_temple:": "\U0001f6d5", + ":hippopotamus:": "\U0001f99b", + ":hocho:": "\U0001f52a", + ":hole:": "\U0001f573\ufe0f", + ":hollow_red_circle:": "\u2b55", + ":honduras:": "\U0001f1ed\U0001f1f3", + ":honey_pot:": "\U0001f36f", + ":honeybee:": "\U0001f41d", + ":hong_kong:": "\U0001f1ed\U0001f1f0", + ":hook:": "\U0001fa9d", + ":horizontal_traffic_light:": "\U0001f6a5", + ":horse:": "\U0001f434", + ":horse_face:": "\U0001f434", + ":horse_racing:": "\U0001f3c7", + ":hospital:": "\U0001f3e5", + ":hot_beverage:": "\u2615", + ":hot_dog:": "\U0001f32d", + ":hot_face:": "\U0001f975", + ":hot_pepper:": "\U0001f336\ufe0f", + ":hot_springs:": "\u2668\ufe0f", + ":hotdog:": "\U0001f32d", + ":hotel:": "\U0001f3e8", + ":hotsprings:": "\u2668\ufe0f", + ":hourglass:": "\u231b", + ":hourglass_done:": "\u231b", + ":hourglass_flowing_sand:": "\u23f3", + ":hourglass_not_done:": "\u23f3", + ":house:": "\U0001f3e0", + ":house_with_garden:": "\U0001f3e1", + ":houses:": "\U0001f3d8\ufe0f", + ":hugging_face:": "\U0001f917", + ":hugs:": "\U0001f917", + ":hundred_points:": "\U0001f4af", + ":hungary:": "\U0001f1ed\U0001f1fa", + ":hushed:": "\U0001f62f", + ":hushed_face:": "\U0001f62f", + ":hut:": "\U0001f6d6", + ":ice:": "\U0001f9ca", + ":ice_cream:": "\U0001f368", + ":ice_cube:": "\U0001f9ca", + ":ice_hockey:": "\U0001f3d2", + ":ice_skate:": "\u26f8\ufe0f", + ":icecream:": "\U0001f366", + ":iceland:": "\U0001f1ee\U0001f1f8", + ":id:": "\U0001f194", + ":id_button:": "\U0001f194", + ":ideograph_advantage:": "\U0001f250", + ":imp:": "\U0001f47f", + ":inbox_tray:": "\U0001f4e5", + ":incoming_envelope:": "\U0001f4e8", + ":index_pointing_up:": "\u261d\ufe0f", + ":india:": "\U0001f1ee\U0001f1f3", + ":indonesia:": "\U0001f1ee\U0001f1e9", + ":infinity:": "\u267e\ufe0f", + ":information:": "\u2139\ufe0f", + ":information_desk_person:": "\U0001f481", + ":information_source:": "\u2139\ufe0f", + ":innocent:": "\U0001f607", + ":input_latin_letters:": "\U0001f524", + ":input_latin_lowercase:": "\U0001f521", + ":input_latin_uppercase:": "\U0001f520", + ":input_numbers:": "\U0001f522", + ":input_symbols:": "\U0001f523", + ":interrobang:": "\u2049\ufe0f", + ":iphone:": "\U0001f4f1", + ":iran:": "\U0001f1ee\U0001f1f7", + ":iraq:": "\U0001f1ee\U0001f1f6", + ":ireland:": "\U0001f1ee\U0001f1ea", + ":isle_of_man:": "\U0001f1ee\U0001f1f2", + ":israel:": "\U0001f1ee\U0001f1f1", + ":it:": "\U0001f1ee\U0001f1f9", + ":izakaya_lantern:": "\U0001f3ee", + ":jack_o_lantern:": "\U0001f383", + ":jamaica:": "\U0001f1ef\U0001f1f2", + ":japan:": "\U0001f5fe", + ":japanese_acceptable_button:": "\U0001f251", + ":japanese_application_button:": "\U0001f238", + ":japanese_bargain_button:": "\U0001f250", + ":japanese_castle:": "\U0001f3ef", + ":japanese_congratulations_button:": "\u3297\ufe0f", + ":japanese_discount_button:": "\U0001f239", + ":japanese_dolls:": "\U0001f38e", + ":japanese_free_of_charge_button:": "\U0001f21a", + ":japanese_goblin:": "\U0001f47a", + ":japanese_here_button:": "\U0001f201", + ":japanese_monthly_amount_button:": "\U0001f237\ufe0f", + ":japanese_no_vacancy_button:": "\U0001f235", + ":japanese_not_free_of_charge_button:": "\U0001f236", + ":japanese_ogre:": "\U0001f479", + ":japanese_open_for_business_button:": "\U0001f23a", + ":japanese_passing_grade_button:": "\U0001f234", + ":japanese_post_office:": "\U0001f3e3", + ":japanese_prohibited_button:": "\U0001f232", + ":japanese_reserved_button:": "\U0001f22f", + ":japanese_secret_button:": "\u3299\ufe0f", + ":japanese_service_charge_button:": "\U0001f202\ufe0f", + ":japanese_symbol_for_beginner:": "\U0001f530", + ":japanese_vacancy_button:": "\U0001f233", + ":jeans:": "\U0001f456", + ":jersey:": "\U0001f1ef\U0001f1ea", + ":jigsaw:": "\U0001f9e9", + ":joker:": "\U0001f0cf", + ":jordan:": "\U0001f1ef\U0001f1f4", + ":joy:": "\U0001f602", + ":joy_cat:": "\U0001f639", + ":joystick:": "\U0001f579\ufe0f", + ":jp:": "\U0001f1ef\U0001f1f5", + ":judge:": "\U0001f9d1\u200d\u2696\ufe0f", + ":juggling_person:": "\U0001f939", + ":kaaba:": "\U0001f54b", + ":kangaroo:": "\U0001f998", + ":kazakhstan:": "\U0001f1f0\U0001f1ff", + ":kenya:": "\U0001f1f0\U0001f1ea", + ":key:": "\U0001f511", + ":keyboard:": "\u2328\ufe0f", + ":keycap_0:": "0\ufe0f\u20e3", + ":keycap_10:": "\U0001f51f", + ":keycap_1:": "1\ufe0f\u20e3", + ":keycap_2:": "2\ufe0f\u20e3", + ":keycap_3:": "3\ufe0f\u20e3", + ":keycap_4:": "4\ufe0f\u20e3", + ":keycap_5:": "5\ufe0f\u20e3", + ":keycap_6:": "6\ufe0f\u20e3", + ":keycap_7:": "7\ufe0f\u20e3", + ":keycap_8:": "8\ufe0f\u20e3", + ":keycap_9:": "9\ufe0f\u20e3", + ":keycap_asterisk:": "*\ufe0f\u20e3", + ":keycap_hash:": "#\ufe0f\u20e3", + ":keycap_ten:": "\U0001f51f", + ":kick_scooter:": "\U0001f6f4", + ":kimono:": "\U0001f458", + ":kiribati:": "\U0001f1f0\U0001f1ee", + ":kiss:": "\U0001f48b", + ":kiss_man_man:": "\U0001f468\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", + ":kiss_mark:": "\U0001f48b", + ":kiss_woman_man:": "\U0001f469\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", + ":kiss_woman_woman:": "\U0001f469\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", + ":kissing:": "\U0001f617", + ":kissing_cat:": "\U0001f63d", + ":kissing_closed_eyes:": "\U0001f61a", + ":kissing_face:": "\U0001f617", + ":kissing_face_with_closed_eyes:": "\U0001f61a", + ":kissing_face_with_smiling_eyes:": "\U0001f619", + ":kissing_heart:": "\U0001f618", + ":kissing_smiling_eyes:": "\U0001f619", + ":kitchen_knife:": "\U0001f52a", + ":kite:": "\U0001fa81", + ":kiwi_fruit:": "\U0001f95d", + ":kneeling_man:": "\U0001f9ce\u200d\u2642\ufe0f", + ":kneeling_person:": "\U0001f9ce", + ":kneeling_woman:": "\U0001f9ce\u200d\u2640\ufe0f", + ":knife:": "\U0001f52a", + ":knot:": "\U0001faa2", + ":koala:": "\U0001f428", + ":koko:": "\U0001f201", + ":kosovo:": "\U0001f1fd\U0001f1f0", + ":kr:": "\U0001f1f0\U0001f1f7", + ":kuwait:": "\U0001f1f0\U0001f1fc", + ":kyrgyzstan:": "\U0001f1f0\U0001f1ec", + ":lab_coat:": "\U0001f97c", + ":label:": "\U0001f3f7\ufe0f", + ":lacrosse:": "\U0001f94d", + ":ladder:": "\U0001fa9c", + ":lady_beetle:": "\U0001f41e", + ":lantern:": "\U0001f3ee", + ":laos:": "\U0001f1f1\U0001f1e6", + ":laptop:": "\U0001f4bb", + ":large_blue_circle:": "\U0001f535", + ":large_blue_diamond:": "\U0001f537", + ":large_orange_diamond:": "\U0001f536", + ":last_quarter_moon:": "\U0001f317", + ":last_quarter_moon_face:": "\U0001f31c", + ":last_quarter_moon_with_face:": "\U0001f31c", + ":last_track_button:": "\u23ee\ufe0f", + ":latin_cross:": "\u271d\ufe0f", + ":latvia:": "\U0001f1f1\U0001f1fb", + ":laughing:": "\U0001f606", + ":leaf_fluttering_in_wind:": "\U0001f343", + ":leafy_green:": "\U0001f96c", + ":leaves:": "\U0001f343", + ":lebanon:": "\U0001f1f1\U0001f1e7", + ":ledger:": "\U0001f4d2", + ":left_arrow:": "\u2b05\ufe0f", + ":left_arrow_curving_right:": "\u21aa\ufe0f", + ":left_facing_fist:": "\U0001f91b", + ":left_luggage:": "\U0001f6c5", + ":left_right_arrow:": "\u2194\ufe0f", + ":left_speech_bubble:": "\U0001f5e8\ufe0f", + ":leftwards_arrow_with_hook:": "\u21a9\ufe0f", + ":leg:": "\U0001f9b5", + ":lemon:": "\U0001f34b", + ":leo:": "\u264c", + ":leopard:": "\U0001f406", + ":lesotho:": "\U0001f1f1\U0001f1f8", + ":level_slider:": "\U0001f39a\ufe0f", + ":liberia:": "\U0001f1f1\U0001f1f7", + ":libra:": "\u264e", + ":libya:": "\U0001f1f1\U0001f1fe", + ":liechtenstein:": "\U0001f1f1\U0001f1ee", + ":light_bulb:": "\U0001f4a1", + ":light_rail:": "\U0001f688", + ":light_skin_tone:": "\U0001f3fb", + ":link:": "\U0001f517", + ":linked_paperclips:": "\U0001f587\ufe0f", + ":lion:": "\U0001f981", + ":lips:": "\U0001f444", + ":lipstick:": "\U0001f484", + ":lithuania:": "\U0001f1f1\U0001f1f9", + ":litter_in_bin_sign:": "\U0001f6ae", + ":lizard:": "\U0001f98e", + ":llama:": "\U0001f999", + ":lobster:": "\U0001f99e", + ":lock:": "\U0001f512", + ":lock_with_ink_pen:": "\U0001f50f", + ":locked:": "\U0001f512", + ":locked_with_key:": "\U0001f510", + ":locked_with_pen:": "\U0001f50f", + ":locomotive:": "\U0001f682", + ":lollipop:": "\U0001f36d", + ":long_drum:": "\U0001fa98", + ":loop:": "\u27bf", + ":lotion_bottle:": "\U0001f9f4", + ":lotus_position:": "\U0001f9d8", + ":lotus_position_man:": "\U0001f9d8\u200d\u2642\ufe0f", + ":lotus_position_woman:": "\U0001f9d8\u200d\u2640\ufe0f", + ":loud_sound:": "\U0001f50a", + ":loudly_crying_face:": "\U0001f62d", + ":loudspeaker:": "\U0001f4e2", + ":love_hotel:": "\U0001f3e9", + ":love_letter:": "\U0001f48c", + ":love_you_gesture:": "\U0001f91f", + ":low_brightness:": "\U0001f505", + ":luggage:": "\U0001f9f3", + ":lungs:": "\U0001fac1", + ":luxembourg:": "\U0001f1f1\U0001f1fa", + ":lying_face:": "\U0001f925", + ":m:": "\u24c2\ufe0f", + ":macau:": "\U0001f1f2\U0001f1f4", + ":macedonia:": "\U0001f1f2\U0001f1f0", + ":madagascar:": "\U0001f1f2\U0001f1ec", + ":mag:": "\U0001f50d", + ":mag_right:": "\U0001f50e", + ":mage:": "\U0001f9d9", + ":mage_man:": "\U0001f9d9\u200d\u2642\ufe0f", + ":mage_woman:": "\U0001f9d9\u200d\u2640\ufe0f", + ":magic_wand:": "\U0001fa84", + ":magnet:": "\U0001f9f2", + ":magnifying_glass_tilted_left:": "\U0001f50d", + ":magnifying_glass_tilted_right:": "\U0001f50e", + ":mahjong:": "\U0001f004", + ":mahjong_red_dragon:": "\U0001f004", + ":mailbox:": "\U0001f4eb", + ":mailbox_closed:": "\U0001f4ea", + ":mailbox_with_mail:": "\U0001f4ec", + ":mailbox_with_no_mail:": "\U0001f4ed", + ":malawi:": "\U0001f1f2\U0001f1fc", + ":malaysia:": "\U0001f1f2\U0001f1fe", + ":maldives:": "\U0001f1f2\U0001f1fb", + ":male_detective:": "\U0001f575\ufe0f\u200d\u2642\ufe0f", + ":male_sign:": "\u2642\ufe0f", + ":mali:": "\U0001f1f2\U0001f1f1", + ":malta:": "\U0001f1f2\U0001f1f9", + ":mammoth:": "\U0001f9a3", + ":man:": "\U0001f468", + ":man_artist:": "\U0001f468\u200d\U0001f3a8", + ":man_astronaut:": "\U0001f468\u200d\U0001f680", + ":man_bald:": "\U0001f468\u200d\U0001f9b2", + ":man_biking:": "\U0001f6b4\u200d\u2642\ufe0f", + ":man_bouncing_ball:": "\u26f9\ufe0f\u200d\u2642\ufe0f", + ":man_bowing:": "\U0001f647\u200d\u2642\ufe0f", + ":man_cartwheeling:": "\U0001f938\u200d\u2642\ufe0f", + ":man_climbing:": "\U0001f9d7\u200d\u2642\ufe0f", + ":man_construction_worker:": "\U0001f477\u200d\u2642\ufe0f", + ":man_cook:": "\U0001f468\u200d\U0001f373", + ":man_dancing:": "\U0001f57a", + ":man_detective:": "\U0001f575\ufe0f\u200d\u2642\ufe0f", + ":man_elf:": "\U0001f9dd\u200d\u2642\ufe0f", + ":man_facepalming:": "\U0001f926\u200d\u2642\ufe0f", + ":man_factory_worker:": "\U0001f468\u200d\U0001f3ed", + ":man_fairy:": "\U0001f9da\u200d\u2642\ufe0f", + ":man_farmer:": "\U0001f468\u200d\U0001f33e", + ":man_feeding_baby:": "\U0001f468\u200d\U0001f37c", + ":man_firefighter:": "\U0001f468\u200d\U0001f692", + ":man_frowning:": "\U0001f64d\u200d\u2642\ufe0f", + ":man_genie:": "\U0001f9de\u200d\u2642\ufe0f", + ":man_gesturing_no:": "\U0001f645\u200d\u2642\ufe0f", + ":man_gesturing_ok:": "\U0001f646\u200d\u2642\ufe0f", + ":man_getting_haircut:": "\U0001f487\u200d\u2642\ufe0f", + ":man_getting_massage:": "\U0001f486\u200d\u2642\ufe0f", + ":man_golfing:": "\U0001f3cc\ufe0f\u200d\u2642\ufe0f", + ":man_guard:": "\U0001f482\u200d\u2642\ufe0f", + ":man_health_worker:": "\U0001f468\u200d\u2695\ufe0f", + ":man_in_lotus_position:": "\U0001f9d8\u200d\u2642\ufe0f", + ":man_in_manual_wheelchair:": "\U0001f468\u200d\U0001f9bd", + ":man_in_motorized_wheelchair:": "\U0001f468\u200d\U0001f9bc", + ":man_in_steamy_room:": "\U0001f9d6\u200d\u2642\ufe0f", + ":man_in_tuxedo:": "\U0001f935\u200d\u2642\ufe0f", + ":man_judge:": "\U0001f468\u200d\u2696\ufe0f", + ":man_juggling:": "\U0001f939\u200d\u2642\ufe0f", + ":man_kneeling:": "\U0001f9ce\u200d\u2642\ufe0f", + ":man_lifting_weights:": "\U0001f3cb\ufe0f\u200d\u2642\ufe0f", + ":man_mage:": "\U0001f9d9\u200d\u2642\ufe0f", + ":man_mechanic:": "\U0001f468\u200d\U0001f527", + ":man_mountain_biking:": "\U0001f6b5\u200d\u2642\ufe0f", + ":man_office_worker:": "\U0001f468\u200d\U0001f4bc", + ":man_pilot:": "\U0001f468\u200d\u2708\ufe0f", + ":man_playing_handball:": "\U0001f93e\u200d\u2642\ufe0f", + ":man_playing_water_polo:": "\U0001f93d\u200d\u2642\ufe0f", + ":man_police_officer:": "\U0001f46e\u200d\u2642\ufe0f", + ":man_pouting:": "\U0001f64e\u200d\u2642\ufe0f", + ":man_raising_hand:": "\U0001f64b\u200d\u2642\ufe0f", + ":man_rowing_boat:": "\U0001f6a3\u200d\u2642\ufe0f", + ":man_running:": "\U0001f3c3\u200d\u2642\ufe0f", + ":man_s_shoe:": "\U0001f45e", + ":man_scientist:": "\U0001f468\u200d\U0001f52c", + ":man_shrugging:": "\U0001f937\u200d\u2642\ufe0f", + ":man_singer:": "\U0001f468\u200d\U0001f3a4", + ":man_standing:": "\U0001f9cd\u200d\u2642\ufe0f", + ":man_student:": "\U0001f468\u200d\U0001f393", + ":man_superhero:": "\U0001f9b8\u200d\u2642\ufe0f", + ":man_supervillain:": "\U0001f9b9\u200d\u2642\ufe0f", + ":man_surfing:": "\U0001f3c4\u200d\u2642\ufe0f", + ":man_swimming:": "\U0001f3ca\u200d\u2642\ufe0f", + ":man_teacher:": "\U0001f468\u200d\U0001f3eb", + ":man_technologist:": "\U0001f468\u200d\U0001f4bb", + ":man_tipping_hand:": "\U0001f481\u200d\u2642\ufe0f", + ":man_vampire:": "\U0001f9db\u200d\u2642\ufe0f", + ":man_walking:": "\U0001f6b6\u200d\u2642\ufe0f", + ":man_wearing_turban:": "\U0001f473\u200d\u2642\ufe0f", + ":man_with_beard:": "\U0001f9d4", + ":man_with_blond_hair:": "\U0001f471\u200d\u2642\ufe0f", + ":man_with_curly_hair:": "\U0001f468\u200d\U0001f9b1", + ":man_with_gua_pi_mao:": "\U0001f472", + ":man_with_probing_cane:": "\U0001f468\u200d\U0001f9af", + ":man_with_red_hair:": "\U0001f468\u200d\U0001f9b0", + ":man_with_turban:": "\U0001f473\u200d\u2642\ufe0f", + ":man_with_veil:": "\U0001f470\u200d\u2642\ufe0f", + ":man_with_white_cane:": "\U0001f468\u200d\U0001f9af", + ":man_with_white_hair:": "\U0001f468\u200d\U0001f9b3", + ":man_zombie:": "\U0001f9df\u200d\u2642\ufe0f", + ":mandarin:": "\U0001f34a", + ":mango:": "\U0001f96d", + ":mans_shoe:": "\U0001f45e", + ":mantelpiece_clock:": "\U0001f570\ufe0f", + ":manual_wheelchair:": "\U0001f9bd", + ":map_of_japan:": "\U0001f5fe", + ":maple_leaf:": "\U0001f341", + ":marshall_islands:": "\U0001f1f2\U0001f1ed", + ":martial_arts_uniform:": "\U0001f94b", + ":martinique:": "\U0001f1f2\U0001f1f6", + ":mask:": "\U0001f637", + ":massage:": "\U0001f486", + ":massage_man:": "\U0001f486\u200d\u2642\ufe0f", + ":massage_woman:": "\U0001f486\u200d\u2640\ufe0f", + ":mate:": "\U0001f9c9", + ":mauritania:": "\U0001f1f2\U0001f1f7", + ":mauritius:": "\U0001f1f2\U0001f1fa", + ":mayotte:": "\U0001f1fe\U0001f1f9", + ":meat_on_bone:": "\U0001f356", + ":mechanic:": "\U0001f9d1\u200d\U0001f527", + ":mechanical_arm:": "\U0001f9be", + ":mechanical_leg:": "\U0001f9bf", + ":medal_military:": "\U0001f396\ufe0f", + ":medal_sports:": "\U0001f3c5", + ":medical_symbol:": "\u2695\ufe0f", + ":medium_dark_skin_tone:": "\U0001f3fe", + ":medium_light_skin_tone:": "\U0001f3fc", + ":medium_skin_tone:": "\U0001f3fd", + ":mega:": "\U0001f4e3", + ":megaphone:": "\U0001f4e3", + ":melon:": "\U0001f348", + ":memo:": "\U0001f4dd", + ":men_holding_hands:": "\U0001f46c", + ":men_s_room:": "\U0001f6b9", + ":men_with_bunny_ears:": "\U0001f46f\u200d\u2642\ufe0f", + ":men_wrestling:": "\U0001f93c\u200d\u2642\ufe0f", + ":menorah:": "\U0001f54e", + ":mens:": "\U0001f6b9", + ":mermaid:": "\U0001f9dc\u200d\u2640\ufe0f", + ":merman:": "\U0001f9dc\u200d\u2642\ufe0f", + ":merperson:": "\U0001f9dc", + ":metal:": "\U0001f918", + ":metro:": "\U0001f687", + ":mexico:": "\U0001f1f2\U0001f1fd", + ":microbe:": "\U0001f9a0", + ":micronesia:": "\U0001f1eb\U0001f1f2", + ":microphone:": "\U0001f3a4", + ":microscope:": "\U0001f52c", + ":middle_finger:": "\U0001f595", + ":military_helmet:": "\U0001fa96", + ":military_medal:": "\U0001f396\ufe0f", + ":milk_glass:": "\U0001f95b", + ":milky_way:": "\U0001f30c", + ":minibus:": "\U0001f690", + ":minidisc:": "\U0001f4bd", + ":minus:": "\u2796", + ":mirror:": "\U0001fa9e", + ":moai:": "\U0001f5ff", + ":mobile_phone:": "\U0001f4f1", + ":mobile_phone_off:": "\U0001f4f4", + ":mobile_phone_with_arrow:": "\U0001f4f2", + ":moldova:": "\U0001f1f2\U0001f1e9", + ":monaco:": "\U0001f1f2\U0001f1e8", + ":money_bag:": "\U0001f4b0", + ":money_mouth_face:": "\U0001f911", + ":money_with_wings:": "\U0001f4b8", + ":moneybag:": "\U0001f4b0", + ":mongolia:": "\U0001f1f2\U0001f1f3", + ":monkey:": "\U0001f412", + ":monkey_face:": "\U0001f435", + ":monocle_face:": "\U0001f9d0", + ":monorail:": "\U0001f69d", + ":montenegro:": "\U0001f1f2\U0001f1ea", + ":montserrat:": "\U0001f1f2\U0001f1f8", + ":moon:": "\U0001f314", + ":moon_cake:": "\U0001f96e", + ":moon_viewing_ceremony:": "\U0001f391", + ":morocco:": "\U0001f1f2\U0001f1e6", + ":mortar_board:": "\U0001f393", + ":mosque:": "\U0001f54c", + ":mosquito:": "\U0001f99f", + ":motor_boat:": "\U0001f6e5\ufe0f", + ":motor_scooter:": "\U0001f6f5", + ":motorcycle:": "\U0001f3cd\ufe0f", + ":motorized_wheelchair:": "\U0001f9bc", + ":motorway:": "\U0001f6e3\ufe0f", + ":mount_fuji:": "\U0001f5fb", + ":mountain:": "\u26f0\ufe0f", + ":mountain_bicyclist:": "\U0001f6b5", + ":mountain_biking_man:": "\U0001f6b5\u200d\u2642\ufe0f", + ":mountain_biking_woman:": "\U0001f6b5\u200d\u2640\ufe0f", + ":mountain_cableway:": "\U0001f6a0", + ":mountain_railway:": "\U0001f69e", + ":mountain_snow:": "\U0001f3d4\ufe0f", + ":mouse2:": "\U0001f401", + ":mouse:": "\U0001f42d", + ":mouse_face:": "\U0001f42d", + ":mouse_trap:": "\U0001faa4", + ":mouth:": "\U0001f444", + ":movie_camera:": "\U0001f3a5", + ":moyai:": "\U0001f5ff", + ":mozambique:": "\U0001f1f2\U0001f1ff", + ":mrs_claus:": "\U0001f936", + ":multiply:": "\u2716\ufe0f", + ":muscle:": "\U0001f4aa", + ":mushroom:": "\U0001f344", + ":musical_keyboard:": "\U0001f3b9", + ":musical_note:": "\U0001f3b5", + ":musical_notes:": "\U0001f3b6", + ":musical_score:": "\U0001f3bc", + ":mute:": "\U0001f507", + ":muted_speaker:": "\U0001f507", + ":mx_claus:": "\U0001f9d1\u200d\U0001f384", + ":myanmar:": "\U0001f1f2\U0001f1f2", + ":nail_care:": "\U0001f485", + ":nail_polish:": "\U0001f485", + ":name_badge:": "\U0001f4db", + ":namibia:": "\U0001f1f3\U0001f1e6", + ":national_park:": "\U0001f3de\ufe0f", + ":nauru:": "\U0001f1f3\U0001f1f7", + ":nauseated_face:": "\U0001f922", + ":nazar_amulet:": "\U0001f9ff", + ":necktie:": "\U0001f454", + ":negative_squared_cross_mark:": "\u274e", + ":nepal:": "\U0001f1f3\U0001f1f5", + ":nerd_face:": "\U0001f913", + ":nesting_dolls:": "\U0001fa86", + ":netherlands:": "\U0001f1f3\U0001f1f1", + ":neutral_face:": "\U0001f610", + ":new:": "\U0001f195", + ":new_button:": "\U0001f195", + ":new_caledonia:": "\U0001f1f3\U0001f1e8", + ":new_moon:": "\U0001f311", + ":new_moon_face:": "\U0001f31a", + ":new_moon_with_face:": "\U0001f31a", + ":new_zealand:": "\U0001f1f3\U0001f1ff", + ":newspaper:": "\U0001f4f0", + ":newspaper_roll:": "\U0001f5de\ufe0f", + ":next_track_button:": "\u23ed\ufe0f", + ":ng:": "\U0001f196", + ":ng_button:": "\U0001f196", + ":ng_man:": "\U0001f645\u200d\u2642\ufe0f", + ":ng_woman:": "\U0001f645\u200d\u2640\ufe0f", + ":nicaragua:": "\U0001f1f3\U0001f1ee", + ":niger:": "\U0001f1f3\U0001f1ea", + ":nigeria:": "\U0001f1f3\U0001f1ec", + ":night_with_stars:": "\U0001f303", + ":nine:": "9\ufe0f\u20e3", + ":nine_o_clock:": "\U0001f558", + ":nine_thirty:": "\U0001f564", + ":ninja:": "\U0001f977", + ":niue:": "\U0001f1f3\U0001f1fa", + ":no_bell:": "\U0001f515", + ":no_bicycles:": "\U0001f6b3", + ":no_entry:": "\u26d4", + ":no_entry_sign:": "\U0001f6ab", + ":no_good:": "\U0001f645", + ":no_good_man:": "\U0001f645\u200d\u2642\ufe0f", + ":no_good_woman:": "\U0001f645\u200d\u2640\ufe0f", + ":no_littering:": "\U0001f6af", + ":no_mobile_phones:": "\U0001f4f5", + ":no_mouth:": "\U0001f636", + ":no_one_under_eighteen:": "\U0001f51e", + ":no_pedestrians:": "\U0001f6b7", + ":no_smoking:": "\U0001f6ad", + ":non-potable_water:": "\U0001f6b1", + ":non_potable_water:": "\U0001f6b1", + ":norfolk_island:": "\U0001f1f3\U0001f1eb", + ":north_korea:": "\U0001f1f0\U0001f1f5", + ":northern_mariana_islands:": "\U0001f1f2\U0001f1f5", + ":norway:": "\U0001f1f3\U0001f1f4", + ":nose:": "\U0001f443", + ":notebook:": "\U0001f4d3", + ":notebook_with_decorative_cover:": "\U0001f4d4", + ":notes:": "\U0001f3b6", + ":nut_and_bolt:": "\U0001f529", + ":o2:": "\U0001f17e\ufe0f", + ":o:": "\u2b55", + ":o_button_blood_type:": "\U0001f17e\ufe0f", + ":ocean:": "\U0001f30a", + ":octopus:": "\U0001f419", + ":oden:": "\U0001f362", + ":office:": "\U0001f3e2", + ":office_building:": "\U0001f3e2", + ":office_worker:": "\U0001f9d1\u200d\U0001f4bc", + ":ogre:": "\U0001f479", + ":oil_drum:": "\U0001f6e2\ufe0f", + ":ok:": "\U0001f197", + ":ok_button:": "\U0001f197", + ":ok_hand:": "\U0001f44c", + ":ok_man:": "\U0001f646\u200d\u2642\ufe0f", + ":ok_person:": "\U0001f646", + ":ok_woman:": "\U0001f646\u200d\u2640\ufe0f", + ":old_key:": "\U0001f5dd\ufe0f", + ":old_man:": "\U0001f474", + ":old_woman:": "\U0001f475", + ":older_adult:": "\U0001f9d3", + ":older_man:": "\U0001f474", + ":older_person:": "\U0001f9d3", + ":older_woman:": "\U0001f475", + ":olive:": "\U0001fad2", + ":om:": "\U0001f549\ufe0f", + ":oman:": "\U0001f1f4\U0001f1f2", + ":on:": "\U0001f51b", + ":on_arrow:": "\U0001f51b", + ":oncoming_automobile:": "\U0001f698", + ":oncoming_bus:": "\U0001f68d", + ":oncoming_fist:": "\U0001f44a", + ":oncoming_police_car:": "\U0001f694", + ":oncoming_taxi:": "\U0001f696", + ":one:": "1\ufe0f\u20e3", + ":one_o_clock:": "\U0001f550", + ":one_piece_swimsuit:": "\U0001fa71", + ":one_thirty:": "\U0001f55c", + ":onion:": "\U0001f9c5", + ":open_book:": "\U0001f4d6", + ":open_file_folder:": "\U0001f4c2", + ":open_hands:": "\U0001f450", + ":open_mailbox_with_lowered_flag:": "\U0001f4ed", + ":open_mailbox_with_raised_flag:": "\U0001f4ec", + ":open_mouth:": "\U0001f62e", + ":open_umbrella:": "\u2602\ufe0f", + ":ophiuchus:": "\u26ce", + ":optical_disk:": "\U0001f4bf", + ":orange:": "\U0001f34a", + ":orange_book:": "\U0001f4d9", + ":orange_circle:": "\U0001f7e0", + ":orange_heart:": "\U0001f9e1", + ":orange_square:": "\U0001f7e7", + ":orangutan:": "\U0001f9a7", + ":orthodox_cross:": "\u2626\ufe0f", + ":otter:": "\U0001f9a6", + ":outbox_tray:": "\U0001f4e4", + ":owl:": "\U0001f989", + ":ox:": "\U0001f402", + ":oyster:": "\U0001f9aa", + ":p_button:": "\U0001f17f\ufe0f", + ":package:": "\U0001f4e6", + ":page_facing_up:": "\U0001f4c4", + ":page_with_curl:": "\U0001f4c3", + ":pager:": "\U0001f4df", + ":paintbrush:": "\U0001f58c\ufe0f", + ":pakistan:": "\U0001f1f5\U0001f1f0", + ":palau:": "\U0001f1f5\U0001f1fc", + ":palestinian_territories:": "\U0001f1f5\U0001f1f8", + ":palm_tree:": "\U0001f334", + ":palms_up_together:": "\U0001f932", + ":panama:": "\U0001f1f5\U0001f1e6", + ":pancakes:": "\U0001f95e", + ":panda:": "\U0001f43c", + ":panda_face:": "\U0001f43c", + ":paperclip:": "\U0001f4ce", + ":paperclips:": "\U0001f587\ufe0f", + ":papua_new_guinea:": "\U0001f1f5\U0001f1ec", + ":parachute:": "\U0001fa82", + ":paraguay:": "\U0001f1f5\U0001f1fe", + ":parasol_on_ground:": "\u26f1\ufe0f", + ":parking:": "\U0001f17f\ufe0f", + ":parrot:": "\U0001f99c", + ":part_alternation_mark:": "\u303d\ufe0f", + ":partly_sunny:": "\u26c5", + ":party_popper:": "\U0001f389", + ":partying_face:": "\U0001f973", + ":passenger_ship:": "\U0001f6f3\ufe0f", + ":passport_control:": "\U0001f6c2", + ":pause_button:": "\u23f8\ufe0f", + ":paw_prints:": "\U0001f43e", + ":peace_symbol:": "\u262e\ufe0f", + ":peach:": "\U0001f351", + ":peacock:": "\U0001f99a", + ":peanuts:": "\U0001f95c", + ":pear:": "\U0001f350", + ":pen:": "\U0001f58a\ufe0f", + ":pencil2:": "\u270f\ufe0f", + ":pencil:": "\U0001f4dd", + ":penguin:": "\U0001f427", + ":pensive:": "\U0001f614", + ":pensive_face:": "\U0001f614", + ":people_holding_hands:": "\U0001f9d1\u200d\U0001f91d\u200d\U0001f9d1", + ":people_hugging:": "\U0001fac2", + ":people_with_bunny_ears:": "\U0001f46f", + ":people_wrestling:": "\U0001f93c", + ":performing_arts:": "\U0001f3ad", + ":persevere:": "\U0001f623", + ":persevering_face:": "\U0001f623", + ":person:": "\U0001f9d1", + ":person_bald:": "\U0001f9d1\u200d\U0001f9b2", + ":person_biking:": "\U0001f6b4", + ":person_bouncing_ball:": "\u26f9\ufe0f", + ":person_bowing:": "\U0001f647", + ":person_cartwheeling:": "\U0001f938", + ":person_climbing:": "\U0001f9d7", + ":person_curly_hair:": "\U0001f9d1\u200d\U0001f9b1", + ":person_facepalming:": "\U0001f926", + ":person_feeding_baby:": "\U0001f9d1\u200d\U0001f37c", + ":person_fencing:": "\U0001f93a", + ":person_frowning:": "\U0001f64d", + ":person_gesturing_no:": "\U0001f645", + ":person_gesturing_ok:": "\U0001f646", + ":person_getting_haircut:": "\U0001f487", + ":person_getting_massage:": "\U0001f486", + ":person_golfing:": "\U0001f3cc\ufe0f", + ":person_in_bed:": "\U0001f6cc", + ":person_in_lotus_position:": "\U0001f9d8", + ":person_in_manual_wheelchair:": "\U0001f9d1\u200d\U0001f9bd", + ":person_in_motorized_wheelchair:": "\U0001f9d1\u200d\U0001f9bc", + ":person_in_steamy_room:": "\U0001f9d6", + ":person_in_suit_levitating:": "\U0001f574\ufe0f", + ":person_in_tuxedo:": "\U0001f935", + ":person_juggling:": "\U0001f939", + ":person_kneeling:": "\U0001f9ce", + ":person_lifting_weights:": "\U0001f3cb\ufe0f", + ":person_mountain_biking:": "\U0001f6b5", + ":person_playing_handball:": "\U0001f93e", + ":person_playing_water_polo:": "\U0001f93d", + ":person_pouting:": "\U0001f64e", + ":person_raising_hand:": "\U0001f64b", + ":person_red_hair:": "\U0001f9d1\u200d\U0001f9b0", + ":person_rowing_boat:": "\U0001f6a3", + ":person_running:": "\U0001f3c3", + ":person_shrugging:": "\U0001f937", + ":person_standing:": "\U0001f9cd", + ":person_surfing:": "\U0001f3c4", + ":person_swimming:": "\U0001f3ca", + ":person_taking_bath:": "\U0001f6c0", + ":person_tipping_hand:": "\U0001f481", + ":person_walking:": "\U0001f6b6", + ":person_wearing_turban:": "\U0001f473", + ":person_white_hair:": "\U0001f9d1\u200d\U0001f9b3", + ":person_with_blond_hair:": "\U0001f471", + ":person_with_curly_hair:": "\U0001f9d1\u200d\U0001f9b1", + ":person_with_probing_cane:": "\U0001f9d1\u200d\U0001f9af", + ":person_with_red_hair:": "\U0001f9d1\u200d\U0001f9b0", + ":person_with_skullcap:": "\U0001f472", + ":person_with_turban:": "\U0001f473", + ":person_with_veil:": "\U0001f470", + ":person_with_white_cane:": "\U0001f9d1\u200d\U0001f9af", + ":person_with_white_hair:": "\U0001f9d1\u200d\U0001f9b3", + ":peru:": "\U0001f1f5\U0001f1ea", + ":petri_dish:": "\U0001f9eb", + ":philippines:": "\U0001f1f5\U0001f1ed", + ":phone:": "\u260e\ufe0f", + ":pi_ata:": "\U0001fa85", + ":pick:": "\u26cf\ufe0f", + ":pickup_truck:": "\U0001f6fb", + ":pie:": "\U0001f967", + ":pig2:": "\U0001f416", + ":pig:": "\U0001f437", + ":pig_face:": "\U0001f437", + ":pig_nose:": "\U0001f43d", + ":pile_of_poo:": "\U0001f4a9", + ":pill:": "\U0001f48a", + ":pilot:": "\U0001f9d1\u200d\u2708\ufe0f", + ":pinata:": "\U0001fa85", + ":pinched_fingers:": "\U0001f90c", + ":pinching_hand:": "\U0001f90f", + ":pine_decoration:": "\U0001f38d", + ":pineapple:": "\U0001f34d", + ":ping_pong:": "\U0001f3d3", + ":pirate_flag:": "\U0001f3f4\u200d\u2620\ufe0f", + ":pisces:": "\u2653", + ":pistol:": "\U0001f52b", + ":pitcairn_islands:": "\U0001f1f5\U0001f1f3", + ":pizza:": "\U0001f355", + ":placard:": "\U0001faa7", + ":place_of_worship:": "\U0001f6d0", + ":plate_with_cutlery:": "\U0001f37d\ufe0f", + ":play_button:": "\u25b6\ufe0f", + ":play_or_pause_button:": "\u23ef\ufe0f", + ":pleading_face:": "\U0001f97a", + ":plunger:": "\U0001faa0", + ":plus:": "\u2795", + ":point_down:": "\U0001f447", + ":point_left:": "\U0001f448", + ":point_right:": "\U0001f449", + ":point_up:": "\u261d\ufe0f", + ":point_up_2:": "\U0001f446", + ":poland:": "\U0001f1f5\U0001f1f1", + ":polar_bear:": "\U0001f43b\u200d\u2744\ufe0f", + ":police_car:": "\U0001f693", + ":police_car_light:": "\U0001f6a8", + ":police_officer:": "\U0001f46e", + ":policeman:": "\U0001f46e\u200d\u2642\ufe0f", + ":policewoman:": "\U0001f46e\u200d\u2640\ufe0f", + ":poodle:": "\U0001f429", + ":pool_8_ball:": "\U0001f3b1", + ":poop:": "\U0001f4a9", + ":popcorn:": "\U0001f37f", + ":portugal:": "\U0001f1f5\U0001f1f9", + ":post_office:": "\U0001f3e3", + ":postal_horn:": "\U0001f4ef", + ":postbox:": "\U0001f4ee", + ":pot_of_food:": "\U0001f372", + ":potable_water:": "\U0001f6b0", + ":potato:": "\U0001f954", + ":potted_plant:": "\U0001fab4", + ":pouch:": "\U0001f45d", + ":poultry_leg:": "\U0001f357", + ":pound:": "\U0001f4b7", + ":pound_banknote:": "\U0001f4b7", + ":pout:": "\U0001f621", + ":pouting_cat:": "\U0001f63e", + ":pouting_face:": "\U0001f64e", + ":pouting_man:": "\U0001f64e\u200d\u2642\ufe0f", + ":pouting_woman:": "\U0001f64e\u200d\u2640\ufe0f", + ":pray:": "\U0001f64f", + ":prayer_beads:": "\U0001f4ff", + ":pregnant_woman:": "\U0001f930", + ":pretzel:": "\U0001f968", + ":previous_track_button:": "\u23ee\ufe0f", + ":prince:": "\U0001f934", + ":princess:": "\U0001f478", + ":printer:": "\U0001f5a8\ufe0f", + ":probing_cane:": "\U0001f9af", + ":prohibited:": "\U0001f6ab", + ":puerto_rico:": "\U0001f1f5\U0001f1f7", + ":punch:": "\U0001f44a", + ":purple_circle:": "\U0001f7e3", + ":purple_heart:": "\U0001f49c", + ":purple_square:": "\U0001f7ea", + ":purse:": "\U0001f45b", + ":pushpin:": "\U0001f4cc", + ":put_litter_in_its_place:": "\U0001f6ae", + ":puzzle_piece:": "\U0001f9e9", + ":qatar:": "\U0001f1f6\U0001f1e6", + ":question:": "\u2753", + ":question_mark:": "\u2753", + ":rabbit2:": "\U0001f407", + ":rabbit:": "\U0001f430", + ":rabbit_face:": "\U0001f430", + ":raccoon:": "\U0001f99d", + ":racehorse:": "\U0001f40e", + ":racing_car:": "\U0001f3ce\ufe0f", + ":radio:": "\U0001f4fb", + ":radio_button:": "\U0001f518", + ":radioactive:": "\u2622\ufe0f", + ":rage:": "\U0001f621", + ":railway_car:": "\U0001f683", + ":railway_track:": "\U0001f6e4\ufe0f", + ":rainbow:": "\U0001f308", + ":rainbow_flag:": "\U0001f3f3\ufe0f\u200d\U0001f308", + ":raised_back_of_hand:": "\U0001f91a", + ":raised_eyebrow:": "\U0001f928", + ":raised_fist:": "\u270a", + ":raised_hand:": "\u270b", + ":raised_hand_with_fingers_splayed:": "\U0001f590\ufe0f", + ":raised_hands:": "\U0001f64c", + ":raising_hand:": "\U0001f64b", + ":raising_hand_man:": "\U0001f64b\u200d\u2642\ufe0f", + ":raising_hand_woman:": "\U0001f64b\u200d\u2640\ufe0f", + ":raising_hands:": "\U0001f64c", + ":ram:": "\U0001f40f", + ":ramen:": "\U0001f35c", + ":rat:": "\U0001f400", + ":razor:": "\U0001fa92", + ":receipt:": "\U0001f9fe", + ":record_button:": "\u23fa\ufe0f", + ":recycle:": "\u267b\ufe0f", + ":recycling_symbol:": "\u267b\ufe0f", + ":red_apple:": "\U0001f34e", + ":red_car:": "\U0001f697", + ":red_circle:": "\U0001f534", + ":red_envelope:": "\U0001f9e7", + ":red_hair:": "\U0001f9b0", + ":red_haired_man:": "\U0001f468\u200d\U0001f9b0", + ":red_haired_woman:": "\U0001f469\u200d\U0001f9b0", + ":red_heart:": "\u2764\ufe0f", + ":red_paper_lantern:": "\U0001f3ee", + ":red_square:": "\U0001f7e5", + ":red_triangle_pointed_down:": "\U0001f53b", + ":red_triangle_pointed_up:": "\U0001f53a", + ":registered:": "\u00ae\ufe0f", + ":relaxed:": "\u263a\ufe0f", + ":relieved:": "\U0001f60c", + ":relieved_face:": "\U0001f60c", + ":reminder_ribbon:": "\U0001f397\ufe0f", + ":repeat:": "\U0001f501", + ":repeat_button:": "\U0001f501", + ":repeat_one:": "\U0001f502", + ":repeat_single_button:": "\U0001f502", + ":rescue_worker_helmet:": "\u26d1\ufe0f", + ":rescue_worker_s_helmet:": "\u26d1\ufe0f", + ":restroom:": "\U0001f6bb", + ":reunion:": "\U0001f1f7\U0001f1ea", + ":reverse_button:": "\u25c0\ufe0f", + ":revolving_hearts:": "\U0001f49e", + ":rewind:": "\u23ea", + ":rhinoceros:": "\U0001f98f", + ":ribbon:": "\U0001f380", + ":rice:": "\U0001f35a", + ":rice_ball:": "\U0001f359", + ":rice_cracker:": "\U0001f358", + ":rice_scene:": "\U0001f391", + ":right_anger_bubble:": "\U0001f5ef\ufe0f", + ":right_arrow:": "\u27a1\ufe0f", + ":right_arrow_curving_down:": "\u2935\ufe0f", + ":right_arrow_curving_left:": "\u21a9\ufe0f", + ":right_arrow_curving_up:": "\u2934\ufe0f", + ":right_facing_fist:": "\U0001f91c", + ":ring:": "\U0001f48d", + ":ringed_planet:": "\U0001fa90", + ":roasted_sweet_potato:": "\U0001f360", + ":robot:": "\U0001f916", + ":robot_face:": "\U0001f916", + ":rock:": "\U0001faa8", + ":rocket:": "\U0001f680", + ":rofl:": "\U0001f923", + ":roll_eyes:": "\U0001f644", + ":roll_of_paper:": "\U0001f9fb", + ":rolled_up_newspaper:": "\U0001f5de\ufe0f", + ":roller_coaster:": "\U0001f3a2", + ":roller_skate:": "\U0001f6fc", + ":rolling_on_the_floor_laughing:": "\U0001f923", + ":romania:": "\U0001f1f7\U0001f1f4", + ":rooster:": "\U0001f413", + ":rose:": "\U0001f339", + ":rosette:": "\U0001f3f5\ufe0f", + ":rotating_light:": "\U0001f6a8", + ":round_pushpin:": "\U0001f4cd", + ":rowboat:": "\U0001f6a3", + ":rowing_man:": "\U0001f6a3\u200d\u2642\ufe0f", + ":rowing_woman:": "\U0001f6a3\u200d\u2640\ufe0f", + ":ru:": "\U0001f1f7\U0001f1fa", + ":rugby_football:": "\U0001f3c9", + ":runner:": "\U0001f3c3", + ":running:": "\U0001f3c3", + ":running_man:": "\U0001f3c3\u200d\u2642\ufe0f", + ":running_shirt:": "\U0001f3bd", + ":running_shirt_with_sash:": "\U0001f3bd", + ":running_shoe:": "\U0001f45f", + ":running_woman:": "\U0001f3c3\u200d\u2640\ufe0f", + ":rwanda:": "\U0001f1f7\U0001f1fc", + ":sa:": "\U0001f202\ufe0f", + ":sad_but_relieved_face:": "\U0001f625", + ":safety_pin:": "\U0001f9f7", + ":safety_vest:": "\U0001f9ba", + ":sagittarius:": "\u2650", + ":sailboat:": "\u26f5", + ":sake:": "\U0001f376", + ":salt:": "\U0001f9c2", + ":samoa:": "\U0001f1fc\U0001f1f8", + ":san_marino:": "\U0001f1f8\U0001f1f2", + ":sandal:": "\U0001f461", + ":sandwich:": "\U0001f96a", + ":santa:": "\U0001f385", + ":santa_claus:": "\U0001f385", + ":sao_tome_principe:": "\U0001f1f8\U0001f1f9", + ":sari:": "\U0001f97b", + ":sassy_man:": "\U0001f481\u200d\u2642\ufe0f", + ":sassy_woman:": "\U0001f481\u200d\u2640\ufe0f", + ":satellite:": "\U0001f4e1", + ":satellite_antenna:": "\U0001f4e1", + ":satisfied:": "\U0001f606", + ":saudi_arabia:": "\U0001f1f8\U0001f1e6", + ":sauna_man:": "\U0001f9d6\u200d\u2642\ufe0f", + ":sauna_person:": "\U0001f9d6", + ":sauna_woman:": "\U0001f9d6\u200d\u2640\ufe0f", + ":sauropod:": "\U0001f995", + ":saxophone:": "\U0001f3b7", + ":scarf:": "\U0001f9e3", + ":school:": "\U0001f3eb", + ":school_satchel:": "\U0001f392", + ":scientist:": "\U0001f9d1\u200d\U0001f52c", + ":scissors:": "\u2702\ufe0f", + ":scorpio:": "\u264f", + ":scorpion:": "\U0001f982", + ":scorpius:": "\u264f", + ":scotland:": "\U0001f3f4\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", + ":scream:": "\U0001f631", + ":scream_cat:": "\U0001f640", + ":screwdriver:": "\U0001fa9b", + ":scroll:": "\U0001f4dc", + ":seal:": "\U0001f9ad", + ":seat:": "\U0001f4ba", + ":second_place_medal:": "\U0001f948", + ":secret:": "\u3299\ufe0f", + ":see_no_evil:": "\U0001f648", + ":see_no_evil_monkey:": "\U0001f648", + ":seedling:": "\U0001f331", + ":selfie:": "\U0001f933", + ":senegal:": "\U0001f1f8\U0001f1f3", + ":serbia:": "\U0001f1f7\U0001f1f8", + ":service_dog:": "\U0001f415\u200d\U0001f9ba", + ":seven:": "7\ufe0f\u20e3", + ":seven_o_clock:": "\U0001f556", + ":seven_thirty:": "\U0001f562", + ":sewing_needle:": "\U0001faa1", + ":seychelles:": "\U0001f1f8\U0001f1e8", + ":shallow_pan_of_food:": "\U0001f958", + ":shamrock:": "\u2618\ufe0f", + ":shark:": "\U0001f988", + ":shaved_ice:": "\U0001f367", + ":sheaf_of_rice:": "\U0001f33e", + ":sheep:": "\U0001f411", + ":shell:": "\U0001f41a", + ":shield:": "\U0001f6e1\ufe0f", + ":shinto_shrine:": "\u26e9\ufe0f", + ":ship:": "\U0001f6a2", + ":shirt:": "\U0001f455", + ":shit:": "\U0001f4a9", + ":shoe:": "\U0001f45e", + ":shooting_star:": "\U0001f320", + ":shopping:": "\U0001f6cd\ufe0f", + ":shopping_bags:": "\U0001f6cd\ufe0f", + ":shopping_cart:": "\U0001f6d2", + ":shortcake:": "\U0001f370", + ":shorts:": "\U0001fa73", + ":shower:": "\U0001f6bf", + ":shrimp:": "\U0001f990", + ":shrug:": "\U0001f937", + ":shuffle_tracks_button:": "\U0001f500", + ":shushing_face:": "\U0001f92b", + ":sierra_leone:": "\U0001f1f8\U0001f1f1", + ":sign_of_the_horns:": "\U0001f918", + ":signal_strength:": "\U0001f4f6", + ":singapore:": "\U0001f1f8\U0001f1ec", + ":singer:": "\U0001f9d1\u200d\U0001f3a4", + ":sint_maarten:": "\U0001f1f8\U0001f1fd", + ":six:": "6\ufe0f\u20e3", + ":six_o_clock:": "\U0001f555", + ":six_pointed_star:": "\U0001f52f", + ":six_thirty:": "\U0001f561", + ":skateboard:": "\U0001f6f9", + ":ski:": "\U0001f3bf", + ":skier:": "\u26f7\ufe0f", + ":skis:": "\U0001f3bf", + ":skull:": "\U0001f480", + ":skull_and_crossbones:": "\u2620\ufe0f", + ":skunk:": "\U0001f9a8", + ":sled:": "\U0001f6f7", + ":sleeping:": "\U0001f634", + ":sleeping_bed:": "\U0001f6cc", + ":sleeping_face:": "\U0001f634", + ":sleepy:": "\U0001f62a", + ":sleepy_face:": "\U0001f62a", + ":slightly_frowning_face:": "\U0001f641", + ":slightly_smiling_face:": "\U0001f642", + ":slot_machine:": "\U0001f3b0", + ":sloth:": "\U0001f9a5", + ":slovakia:": "\U0001f1f8\U0001f1f0", + ":slovenia:": "\U0001f1f8\U0001f1ee", + ":small_airplane:": "\U0001f6e9\ufe0f", + ":small_blue_diamond:": "\U0001f539", + ":small_orange_diamond:": "\U0001f538", + ":small_red_triangle:": "\U0001f53a", + ":small_red_triangle_down:": "\U0001f53b", + ":smile:": "\U0001f604", + ":smile_cat:": "\U0001f638", + ":smiley:": "\U0001f603", + ":smiley_cat:": "\U0001f63a", + ":smiling_cat_with_heart_eyes:": "\U0001f63b", + ":smiling_face:": "\u263a\ufe0f", + ":smiling_face_with_halo:": "\U0001f607", + ":smiling_face_with_heart_eyes:": "\U0001f60d", + ":smiling_face_with_hearts:": "\U0001f970", + ":smiling_face_with_horns:": "\U0001f608", + ":smiling_face_with_smiling_eyes:": "\U0001f60a", + ":smiling_face_with_sunglasses:": "\U0001f60e", + ":smiling_face_with_tear:": "\U0001f972", + ":smiling_face_with_three_hearts:": "\U0001f970", + ":smiling_imp:": "\U0001f608", + ":smirk:": "\U0001f60f", + ":smirk_cat:": "\U0001f63c", + ":smirking_face:": "\U0001f60f", + ":smoking:": "\U0001f6ac", + ":snail:": "\U0001f40c", + ":snake:": "\U0001f40d", + ":sneezing_face:": "\U0001f927", + ":snow_capped_mountain:": "\U0001f3d4\ufe0f", + ":snowboarder:": "\U0001f3c2", + ":snowflake:": "\u2744\ufe0f", + ":snowman:": "\u26c4", + ":snowman_with_snow:": "\u2603\ufe0f", + ":snowman_without_snow:": "\u26c4", + ":soap:": "\U0001f9fc", + ":sob:": "\U0001f62d", + ":soccer:": "\u26bd", + ":soccer_ball:": "\u26bd", + ":socks:": "\U0001f9e6", + ":soft_ice_cream:": "\U0001f366", + ":softball:": "\U0001f94e", + ":solomon_islands:": "\U0001f1f8\U0001f1e7", + ":somalia:": "\U0001f1f8\U0001f1f4", + ":soon:": "\U0001f51c", + ":soon_arrow:": "\U0001f51c", + ":sos:": "\U0001f198", + ":sos_button:": "\U0001f198", + ":sound:": "\U0001f509", + ":south_africa:": "\U0001f1ff\U0001f1e6", + ":south_georgia_south_sandwich_islands:": "\U0001f1ec\U0001f1f8", + ":south_sudan:": "\U0001f1f8\U0001f1f8", + ":space_invader:": "\U0001f47e", + ":spade_suit:": "\u2660\ufe0f", + ":spades:": "\u2660\ufe0f", + ":spaghetti:": "\U0001f35d", + ":sparkle:": "\u2747\ufe0f", + ":sparkler:": "\U0001f387", + ":sparkles:": "\u2728", + ":sparkling_heart:": "\U0001f496", + ":speak_no_evil:": "\U0001f64a", + ":speak_no_evil_monkey:": "\U0001f64a", + ":speaker:": "\U0001f508", + ":speaker_high_volume:": "\U0001f50a", + ":speaker_low_volume:": "\U0001f508", + ":speaker_medium_volume:": "\U0001f509", + ":speaking_head:": "\U0001f5e3\ufe0f", + ":speech_balloon:": "\U0001f4ac", + ":speedboat:": "\U0001f6a4", + ":spider:": "\U0001f577\ufe0f", + ":spider_web:": "\U0001f578\ufe0f", + ":spiral_calendar:": "\U0001f5d3\ufe0f", + ":spiral_notepad:": "\U0001f5d2\ufe0f", + ":spiral_shell:": "\U0001f41a", + ":sponge:": "\U0001f9fd", + ":spoon:": "\U0001f944", + ":sport_utility_vehicle:": "\U0001f699", + ":sports_medal:": "\U0001f3c5", + ":spouting_whale:": "\U0001f433", + ":squid:": "\U0001f991", + ":squinting_face_with_tongue:": "\U0001f61d", + ":sri_lanka:": "\U0001f1f1\U0001f1f0", + ":st_barthelemy:": "\U0001f1e7\U0001f1f1", + ":st_helena:": "\U0001f1f8\U0001f1ed", + ":st_kitts_nevis:": "\U0001f1f0\U0001f1f3", + ":st_lucia:": "\U0001f1f1\U0001f1e8", + ":st_martin:": "\U0001f1f2\U0001f1eb", + ":st_pierre_miquelon:": "\U0001f1f5\U0001f1f2", + ":st_vincent_grenadines:": "\U0001f1fb\U0001f1e8", + ":stadium:": "\U0001f3df\ufe0f", + ":standing_man:": "\U0001f9cd\u200d\u2642\ufe0f", + ":standing_person:": "\U0001f9cd", + ":standing_woman:": "\U0001f9cd\u200d\u2640\ufe0f", + ":star2:": "\U0001f31f", + ":star:": "\u2b50", + ":star_and_crescent:": "\u262a\ufe0f", + ":star_of_david:": "\u2721\ufe0f", + ":star_struck:": "\U0001f929", + ":stars:": "\U0001f320", + ":station:": "\U0001f689", + ":statue_of_liberty:": "\U0001f5fd", + ":steam_locomotive:": "\U0001f682", + ":steaming_bowl:": "\U0001f35c", + ":stethoscope:": "\U0001fa7a", + ":stew:": "\U0001f372", + ":stop_button:": "\u23f9\ufe0f", + ":stop_sign:": "\U0001f6d1", + ":stopwatch:": "\u23f1\ufe0f", + ":straight_ruler:": "\U0001f4cf", + ":strawberry:": "\U0001f353", + ":stuck_out_tongue:": "\U0001f61b", + ":stuck_out_tongue_closed_eyes:": "\U0001f61d", + ":stuck_out_tongue_winking_eye:": "\U0001f61c", + ":student:": "\U0001f9d1\u200d\U0001f393", + ":studio_microphone:": "\U0001f399\ufe0f", + ":stuffed_flatbread:": "\U0001f959", + ":sudan:": "\U0001f1f8\U0001f1e9", + ":sun:": "\u2600\ufe0f", + ":sun_behind_cloud:": "\u26c5", + ":sun_behind_large_cloud:": "\U0001f325\ufe0f", + ":sun_behind_rain_cloud:": "\U0001f326\ufe0f", + ":sun_behind_small_cloud:": "\U0001f324\ufe0f", + ":sun_with_face:": "\U0001f31e", + ":sunflower:": "\U0001f33b", + ":sunglasses:": "\U0001f60e", + ":sunny:": "\u2600\ufe0f", + ":sunrise:": "\U0001f305", + ":sunrise_over_mountains:": "\U0001f304", + ":sunset:": "\U0001f307", + ":superhero:": "\U0001f9b8", + ":superhero_man:": "\U0001f9b8\u200d\u2642\ufe0f", + ":superhero_woman:": "\U0001f9b8\u200d\u2640\ufe0f", + ":supervillain:": "\U0001f9b9", + ":supervillain_man:": "\U0001f9b9\u200d\u2642\ufe0f", + ":supervillain_woman:": "\U0001f9b9\u200d\u2640\ufe0f", + ":surfer:": "\U0001f3c4", + ":surfing_man:": "\U0001f3c4\u200d\u2642\ufe0f", + ":surfing_woman:": "\U0001f3c4\u200d\u2640\ufe0f", + ":suriname:": "\U0001f1f8\U0001f1f7", + ":sushi:": "\U0001f363", + ":suspension_railway:": "\U0001f69f", + ":svalbard_jan_mayen:": "\U0001f1f8\U0001f1ef", + ":swan:": "\U0001f9a2", + ":swaziland:": "\U0001f1f8\U0001f1ff", + ":sweat:": "\U0001f613", + ":sweat_droplets:": "\U0001f4a6", + ":sweat_drops:": "\U0001f4a6", + ":sweat_smile:": "\U0001f605", + ":sweden:": "\U0001f1f8\U0001f1ea", + ":sweet_potato:": "\U0001f360", + ":swim_brief:": "\U0001fa72", + ":swimmer:": "\U0001f3ca", + ":swimming_man:": "\U0001f3ca\u200d\u2642\ufe0f", + ":swimming_woman:": "\U0001f3ca\u200d\u2640\ufe0f", + ":switzerland:": "\U0001f1e8\U0001f1ed", + ":symbols:": "\U0001f523", + ":synagogue:": "\U0001f54d", + ":syria:": "\U0001f1f8\U0001f1fe", + ":syringe:": "\U0001f489", + ":t-rex:": "\U0001f996", + ":t_rex:": "\U0001f996", + ":t_shirt:": "\U0001f455", + ":taco:": "\U0001f32e", + ":tada:": "\U0001f389", + ":taiwan:": "\U0001f1f9\U0001f1fc", + ":tajikistan:": "\U0001f1f9\U0001f1ef", + ":takeout_box:": "\U0001f961", + ":tamale:": "\U0001fad4", + ":tanabata_tree:": "\U0001f38b", + ":tangerine:": "\U0001f34a", + ":tanzania:": "\U0001f1f9\U0001f1ff", + ":taurus:": "\u2649", + ":taxi:": "\U0001f695", + ":tea:": "\U0001f375", + ":teacher:": "\U0001f9d1\u200d\U0001f3eb", + ":teacup_without_handle:": "\U0001f375", + ":teapot:": "\U0001fad6", + ":tear_off_calendar:": "\U0001f4c6", + ":technologist:": "\U0001f9d1\u200d\U0001f4bb", + ":teddy_bear:": "\U0001f9f8", + ":telephone:": "\u260e\ufe0f", + ":telephone_receiver:": "\U0001f4de", + ":telescope:": "\U0001f52d", + ":television:": "\U0001f4fa", + ":ten_o_clock:": "\U0001f559", + ":ten_thirty:": "\U0001f565", + ":tennis:": "\U0001f3be", + ":tent:": "\u26fa", + ":test_tube:": "\U0001f9ea", + ":thailand:": "\U0001f1f9\U0001f1ed", + ":thermometer:": "\U0001f321\ufe0f", + ":thinking:": "\U0001f914", + ":thinking_face:": "\U0001f914", + ":third_place_medal:": "\U0001f949", + ":thong_sandal:": "\U0001fa74", + ":thought_balloon:": "\U0001f4ad", + ":thread:": "\U0001f9f5", + ":three:": "3\ufe0f\u20e3", + ":three_o_clock:": "\U0001f552", + ":three_thirty:": "\U0001f55e", + ":thumbs_down:": "\U0001f44e", + ":thumbs_up:": "\U0001f44d", + ":thumbsdown:": "\U0001f44e", + ":thumbsup:": "\U0001f44d", + ":ticket:": "\U0001f3ab", + ":tickets:": "\U0001f39f\ufe0f", + ":tiger2:": "\U0001f405", + ":tiger:": "\U0001f42f", + ":tiger_face:": "\U0001f42f", + ":timer_clock:": "\u23f2\ufe0f", + ":timor_leste:": "\U0001f1f9\U0001f1f1", + ":tipping_hand_man:": "\U0001f481\u200d\u2642\ufe0f", + ":tipping_hand_person:": "\U0001f481", + ":tipping_hand_woman:": "\U0001f481\u200d\u2640\ufe0f", + ":tired_face:": "\U0001f62b", + ":tm:": "\u2122\ufe0f", + ":togo:": "\U0001f1f9\U0001f1ec", + ":toilet:": "\U0001f6bd", + ":tokelau:": "\U0001f1f9\U0001f1f0", + ":tokyo_tower:": "\U0001f5fc", + ":tomato:": "\U0001f345", + ":tonga:": "\U0001f1f9\U0001f1f4", + ":tongue:": "\U0001f445", + ":toolbox:": "\U0001f9f0", + ":tooth:": "\U0001f9b7", + ":toothbrush:": "\U0001faa5", + ":top:": "\U0001f51d", + ":top_arrow:": "\U0001f51d", + ":top_hat:": "\U0001f3a9", + ":tophat:": "\U0001f3a9", + ":tornado:": "\U0001f32a\ufe0f", + ":tr:": "\U0001f1f9\U0001f1f7", + ":trackball:": "\U0001f5b2\ufe0f", + ":tractor:": "\U0001f69c", + ":trade_mark:": "\u2122\ufe0f", + ":traffic_light:": "\U0001f6a5", + ":train2:": "\U0001f686", + ":train:": "\U0001f68b", + ":tram:": "\U0001f68a", + ":tram_car:": "\U0001f68b", + ":transgender_flag:": "\U0001f3f3\ufe0f\u200d\u26a7\ufe0f", + ":transgender_symbol:": "\u26a7\ufe0f", + ":triangular_flag:": "\U0001f6a9", + ":triangular_flag_on_post:": "\U0001f6a9", + ":triangular_ruler:": "\U0001f4d0", + ":trident:": "\U0001f531", + ":trident_emblem:": "\U0001f531", + ":trinidad_tobago:": "\U0001f1f9\U0001f1f9", + ":tristan_da_cunha:": "\U0001f1f9\U0001f1e6", + ":triumph:": "\U0001f624", + ":trolleybus:": "\U0001f68e", + ":trophy:": "\U0001f3c6", + ":tropical_drink:": "\U0001f379", + ":tropical_fish:": "\U0001f420", + ":truck:": "\U0001f69a", + ":trumpet:": "\U0001f3ba", + ":tshirt:": "\U0001f455", + ":tulip:": "\U0001f337", + ":tumbler_glass:": "\U0001f943", + ":tunisia:": "\U0001f1f9\U0001f1f3", + ":turkey:": "\U0001f983", + ":turkmenistan:": "\U0001f1f9\U0001f1f2", + ":turks_caicos_islands:": "\U0001f1f9\U0001f1e8", + ":turtle:": "\U0001f422", + ":tuvalu:": "\U0001f1f9\U0001f1fb", + ":tv:": "\U0001f4fa", + ":twelve_o_clock:": "\U0001f55b", + ":twelve_thirty:": "\U0001f567", + ":twisted_rightwards_arrows:": "\U0001f500", + ":two:": "2\ufe0f\u20e3", + ":two_hearts:": "\U0001f495", + ":two_hump_camel:": "\U0001f42b", + ":two_men_holding_hands:": "\U0001f46c", + ":two_o_clock:": "\U0001f551", + ":two_thirty:": "\U0001f55d", + ":two_women_holding_hands:": "\U0001f46d", + ":u5272:": "\U0001f239", + ":u5408:": "\U0001f234", + ":u55b6:": "\U0001f23a", + ":u6307:": "\U0001f22f", + ":u6708:": "\U0001f237\ufe0f", + ":u6709:": "\U0001f236", + ":u6e80:": "\U0001f235", + ":u7121:": "\U0001f21a", + ":u7533:": "\U0001f238", + ":u7981:": "\U0001f232", + ":u7a7a:": "\U0001f233", + ":uganda:": "\U0001f1fa\U0001f1ec", + ":uk:": "\U0001f1ec\U0001f1e7", + ":ukraine:": "\U0001f1fa\U0001f1e6", + ":umbrella:": "\u2614", + ":umbrella_on_ground:": "\u26f1\ufe0f", + ":umbrella_with_rain_drops:": "\u2614", + ":unamused:": "\U0001f612", + ":unamused_face:": "\U0001f612", + ":underage:": "\U0001f51e", + ":unicorn:": "\U0001f984", + ":united_arab_emirates:": "\U0001f1e6\U0001f1ea", + ":united_nations:": "\U0001f1fa\U0001f1f3", + ":unlock:": "\U0001f513", + ":unlocked:": "\U0001f513", + ":up:": "\U0001f199", + ":up_arrow:": "\u2b06\ufe0f", + ":up_button:": "\U0001f199", + ":up_down_arrow:": "\u2195\ufe0f", + ":up_left_arrow:": "\u2196\ufe0f", + ":up_right_arrow:": "\u2197\ufe0f", + ":upside_down_face:": "\U0001f643", + ":upwards_button:": "\U0001f53c", + ":uruguay:": "\U0001f1fa\U0001f1fe", + ":us:": "\U0001f1fa\U0001f1f8", + ":us_outlying_islands:": "\U0001f1fa\U0001f1f2", + ":us_virgin_islands:": "\U0001f1fb\U0001f1ee", + ":uzbekistan:": "\U0001f1fa\U0001f1ff", + ":v:": "\u270c\ufe0f", + ":vampire:": "\U0001f9db", + ":vampire_man:": "\U0001f9db\u200d\u2642\ufe0f", + ":vampire_woman:": "\U0001f9db\u200d\u2640\ufe0f", + ":vanuatu:": "\U0001f1fb\U0001f1fa", + ":vatican_city:": "\U0001f1fb\U0001f1e6", + ":venezuela:": "\U0001f1fb\U0001f1ea", + ":vertical_traffic_light:": "\U0001f6a6", + ":vhs:": "\U0001f4fc", + ":vibration_mode:": "\U0001f4f3", + ":victory_hand:": "\u270c\ufe0f", + ":video_camera:": "\U0001f4f9", + ":video_game:": "\U0001f3ae", + ":videocassette:": "\U0001f4fc", + ":vietnam:": "\U0001f1fb\U0001f1f3", + ":violin:": "\U0001f3bb", + ":virgo:": "\u264d", + ":volcano:": "\U0001f30b", + ":volleyball:": "\U0001f3d0", + ":vomiting_face:": "\U0001f92e", + ":vs:": "\U0001f19a", + ":vs_button:": "\U0001f19a", + ":vulcan_salute:": "\U0001f596", + ":waffle:": "\U0001f9c7", + ":wales:": "\U0001f3f4\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", + ":walking:": "\U0001f6b6", + ":walking_man:": "\U0001f6b6\u200d\u2642\ufe0f", + ":walking_woman:": "\U0001f6b6\u200d\u2640\ufe0f", + ":wallis_futuna:": "\U0001f1fc\U0001f1eb", + ":waning_crescent_moon:": "\U0001f318", + ":waning_gibbous_moon:": "\U0001f316", + ":warning:": "\u26a0\ufe0f", + ":wastebasket:": "\U0001f5d1\ufe0f", + ":watch:": "\u231a", + ":water_buffalo:": "\U0001f403", + ":water_closet:": "\U0001f6be", + ":water_polo:": "\U0001f93d", + ":water_wave:": "\U0001f30a", + ":watermelon:": "\U0001f349", + ":wave:": "\U0001f44b", + ":waving_hand:": "\U0001f44b", + ":wavy_dash:": "\u3030\ufe0f", + ":waxing_crescent_moon:": "\U0001f312", + ":waxing_gibbous_moon:": "\U0001f314", + ":wc:": "\U0001f6be", + ":weary:": "\U0001f629", + ":weary_cat:": "\U0001f640", + ":weary_face:": "\U0001f629", + ":wedding:": "\U0001f492", + ":weight_lifting:": "\U0001f3cb\ufe0f", + ":weight_lifting_man:": "\U0001f3cb\ufe0f\u200d\u2642\ufe0f", + ":weight_lifting_woman:": "\U0001f3cb\ufe0f\u200d\u2640\ufe0f", + ":western_sahara:": "\U0001f1ea\U0001f1ed", + ":whale2:": "\U0001f40b", + ":whale:": "\U0001f433", + ":wheel_of_dharma:": "\u2638\ufe0f", + ":wheelchair:": "\u267f", + ":wheelchair_symbol:": "\u267f", + ":white_cane:": "\U0001f9af", + ":white_check_mark:": "\u2705", + ":white_circle:": "\u26aa", + ":white_exclamation_mark:": "\u2755", + ":white_flag:": "\U0001f3f3\ufe0f", + ":white_flower:": "\U0001f4ae", + ":white_hair:": "\U0001f9b3", + ":white_haired_man:": "\U0001f468\u200d\U0001f9b3", + ":white_haired_woman:": "\U0001f469\u200d\U0001f9b3", + ":white_heart:": "\U0001f90d", + ":white_large_square:": "\u2b1c", + ":white_medium_small_square:": "\u25fd", + ":white_medium_square:": "\u25fb\ufe0f", + ":white_question_mark:": "\u2754", + ":white_small_square:": "\u25ab\ufe0f", + ":white_square_button:": "\U0001f533", + ":wilted_flower:": "\U0001f940", + ":wind_chime:": "\U0001f390", + ":wind_face:": "\U0001f32c\ufe0f", + ":window:": "\U0001fa9f", + ":wine_glass:": "\U0001f377", + ":wink:": "\U0001f609", + ":winking_face:": "\U0001f609", + ":winking_face_with_tongue:": "\U0001f61c", + ":wolf:": "\U0001f43a", + ":woman:": "\U0001f469", + ":woman_and_man_holding_hands:": "\U0001f46b", + ":woman_artist:": "\U0001f469\u200d\U0001f3a8", + ":woman_astronaut:": "\U0001f469\u200d\U0001f680", + ":woman_bald:": "\U0001f469\u200d\U0001f9b2", + ":woman_biking:": "\U0001f6b4\u200d\u2640\ufe0f", + ":woman_bouncing_ball:": "\u26f9\ufe0f\u200d\u2640\ufe0f", + ":woman_bowing:": "\U0001f647\u200d\u2640\ufe0f", + ":woman_cartwheeling:": "\U0001f938\u200d\u2640\ufe0f", + ":woman_climbing:": "\U0001f9d7\u200d\u2640\ufe0f", + ":woman_construction_worker:": "\U0001f477\u200d\u2640\ufe0f", + ":woman_cook:": "\U0001f469\u200d\U0001f373", + ":woman_dancing:": "\U0001f483", + ":woman_detective:": "\U0001f575\ufe0f\u200d\u2640\ufe0f", + ":woman_elf:": "\U0001f9dd\u200d\u2640\ufe0f", + ":woman_facepalming:": "\U0001f926\u200d\u2640\ufe0f", + ":woman_factory_worker:": "\U0001f469\u200d\U0001f3ed", + ":woman_fairy:": "\U0001f9da\u200d\u2640\ufe0f", + ":woman_farmer:": "\U0001f469\u200d\U0001f33e", + ":woman_feeding_baby:": "\U0001f469\u200d\U0001f37c", + ":woman_firefighter:": "\U0001f469\u200d\U0001f692", + ":woman_frowning:": "\U0001f64d\u200d\u2640\ufe0f", + ":woman_genie:": "\U0001f9de\u200d\u2640\ufe0f", + ":woman_gesturing_no:": "\U0001f645\u200d\u2640\ufe0f", + ":woman_gesturing_ok:": "\U0001f646\u200d\u2640\ufe0f", + ":woman_getting_haircut:": "\U0001f487\u200d\u2640\ufe0f", + ":woman_getting_massage:": "\U0001f486\u200d\u2640\ufe0f", + ":woman_golfing:": "\U0001f3cc\ufe0f\u200d\u2640\ufe0f", + ":woman_guard:": "\U0001f482\u200d\u2640\ufe0f", + ":woman_health_worker:": "\U0001f469\u200d\u2695\ufe0f", + ":woman_in_lotus_position:": "\U0001f9d8\u200d\u2640\ufe0f", + ":woman_in_manual_wheelchair:": "\U0001f469\u200d\U0001f9bd", + ":woman_in_motorized_wheelchair:": "\U0001f469\u200d\U0001f9bc", + ":woman_in_steamy_room:": "\U0001f9d6\u200d\u2640\ufe0f", + ":woman_in_tuxedo:": "\U0001f935\u200d\u2640\ufe0f", + ":woman_judge:": "\U0001f469\u200d\u2696\ufe0f", + ":woman_juggling:": "\U0001f939\u200d\u2640\ufe0f", + ":woman_kneeling:": "\U0001f9ce\u200d\u2640\ufe0f", + ":woman_lifting_weights:": "\U0001f3cb\ufe0f\u200d\u2640\ufe0f", + ":woman_mage:": "\U0001f9d9\u200d\u2640\ufe0f", + ":woman_mechanic:": "\U0001f469\u200d\U0001f527", + ":woman_mountain_biking:": "\U0001f6b5\u200d\u2640\ufe0f", + ":woman_office_worker:": "\U0001f469\u200d\U0001f4bc", + ":woman_pilot:": "\U0001f469\u200d\u2708\ufe0f", + ":woman_playing_handball:": "\U0001f93e\u200d\u2640\ufe0f", + ":woman_playing_water_polo:": "\U0001f93d\u200d\u2640\ufe0f", + ":woman_police_officer:": "\U0001f46e\u200d\u2640\ufe0f", + ":woman_pouting:": "\U0001f64e\u200d\u2640\ufe0f", + ":woman_raising_hand:": "\U0001f64b\u200d\u2640\ufe0f", + ":woman_rowing_boat:": "\U0001f6a3\u200d\u2640\ufe0f", + ":woman_running:": "\U0001f3c3\u200d\u2640\ufe0f", + ":woman_s_boot:": "\U0001f462", + ":woman_s_clothes:": "\U0001f45a", + ":woman_s_hat:": "\U0001f452", + ":woman_s_sandal:": "\U0001f461", + ":woman_scientist:": "\U0001f469\u200d\U0001f52c", + ":woman_shrugging:": "\U0001f937\u200d\u2640\ufe0f", + ":woman_singer:": "\U0001f469\u200d\U0001f3a4", + ":woman_standing:": "\U0001f9cd\u200d\u2640\ufe0f", + ":woman_student:": "\U0001f469\u200d\U0001f393", + ":woman_superhero:": "\U0001f9b8\u200d\u2640\ufe0f", + ":woman_supervillain:": "\U0001f9b9\u200d\u2640\ufe0f", + ":woman_surfing:": "\U0001f3c4\u200d\u2640\ufe0f", + ":woman_swimming:": "\U0001f3ca\u200d\u2640\ufe0f", + ":woman_teacher:": "\U0001f469\u200d\U0001f3eb", + ":woman_technologist:": "\U0001f469\u200d\U0001f4bb", + ":woman_tipping_hand:": "\U0001f481\u200d\u2640\ufe0f", + ":woman_vampire:": "\U0001f9db\u200d\u2640\ufe0f", + ":woman_walking:": "\U0001f6b6\u200d\u2640\ufe0f", + ":woman_wearing_turban:": "\U0001f473\u200d\u2640\ufe0f", + ":woman_with_blond_hair:": "\U0001f471\u200d\u2640\ufe0f", + ":woman_with_curly_hair:": "\U0001f469\u200d\U0001f9b1", + ":woman_with_headscarf:": "\U0001f9d5", + ":woman_with_probing_cane:": "\U0001f469\u200d\U0001f9af", + ":woman_with_red_hair:": "\U0001f469\u200d\U0001f9b0", + ":woman_with_turban:": "\U0001f473\u200d\u2640\ufe0f", + ":woman_with_veil:": "\U0001f470\u200d\u2640\ufe0f", + ":woman_with_white_cane:": "\U0001f469\u200d\U0001f9af", + ":woman_with_white_hair:": "\U0001f469\u200d\U0001f9b3", + ":woman_zombie:": "\U0001f9df\u200d\u2640\ufe0f", + ":womans_clothes:": "\U0001f45a", + ":womans_hat:": "\U0001f452", + ":women_holding_hands:": "\U0001f46d", + ":women_s_room:": "\U0001f6ba", + ":women_with_bunny_ears:": "\U0001f46f\u200d\u2640\ufe0f", + ":women_wrestling:": "\U0001f93c\u200d\u2640\ufe0f", + ":womens:": "\U0001f6ba", + ":wood:": "\U0001fab5", + ":woozy_face:": "\U0001f974", + ":world_map:": "\U0001f5fa\ufe0f", + ":worm:": "\U0001fab1", + ":worried:": "\U0001f61f", + ":worried_face:": "\U0001f61f", + ":wrapped_gift:": "\U0001f381", + ":wrench:": "\U0001f527", + ":wrestling:": "\U0001f93c", + ":writing_hand:": "\u270d\ufe0f", + ":x:": "\u274c", + ":yarn:": "\U0001f9f6", + ":yawning_face:": "\U0001f971", + ":yellow_circle:": "\U0001f7e1", + ":yellow_heart:": "\U0001f49b", + ":yellow_square:": "\U0001f7e8", + ":yemen:": "\U0001f1fe\U0001f1ea", + ":yen:": "\U0001f4b4", + ":yen_banknote:": "\U0001f4b4", + ":yin_yang:": "\u262f\ufe0f", + ":yo_yo:": "\U0001fa80", + ":yum:": "\U0001f60b", + ":zambia:": "\U0001f1ff\U0001f1f2", + ":zany_face:": "\U0001f92a", + ":zap:": "\u26a1", + ":zebra:": "\U0001f993", + ":zero:": "0\ufe0f\u20e3", + ":zimbabwe:": "\U0001f1ff\U0001f1fc", + ":zipper_mouth_face:": "\U0001f910", + ":zombie:": "\U0001f9df", + ":zombie_man:": "\U0001f9df\u200d\u2642\ufe0f", + ":zombie_woman:": "\U0001f9df\u200d\u2640\ufe0f", + ":zzz:": "\U0001f4a4", +}
A
map_test.go
@@ -0,0 +1,14 @@
+package emoji + +import ( + "testing" +) + +func TestEmojiMap(t *testing.T) { + for name, code := range emojiMap { + got := Parse(name) + if got != code { + t.Fatalf("test case %q fail: got: %v, expected: %v", name, got, code) + } + } +}
A
parser.go
@@ -0,0 +1,105 @@
+package emoji + +import ( + "fmt" + "strings" + "unicode" +) + +// Parse replaces emoji aliases (:pizza:) with unicode representation. +func Parse(input string) string { + var matched strings.Builder + var output strings.Builder + + for _, r := range input { + // when it's not `:`, it might be inner or outer of the emoji alias + if r != ':' { + // if matched is empty, it's the outer of the emoji alias + if matched.Len() == 0 { + output.WriteRune(r) + continue + } + + matched.WriteRune(r) + + // if it's space, the alias's not valid. + // reset matched for breaking the emoji alias + if unicode.IsSpace(r) { + output.WriteString(matched.String()) + matched.Reset() + } + continue + } + + // r is `:` now + // if matched is empty, it's the beginning of the emoji alias + if matched.Len() == 0 { + matched.WriteRune(r) + continue + } + + // it's the end of the emoji alias + alias := matched.String() + ":" + + code, ok := emojiMap[alias] + if ok { + output.WriteString(code) + matched.Reset() + } else { + // TODO: check for country codes: `flag-[a-z]{2}` + output.WriteString(matched.String()) + // it might be the beginning of the another emoji alias + matched.Reset() + matched.WriteRune(r) + } + } + + // if matched not empty, add it to output + if matched.Len() != 0 { + output.WriteString(matched.String()) + matched.Reset() + } + + return output.String() +} + +// Map returns the emojis map. +// Key is the alias of the emoji. +// Value is the code of the emoji. +func Map() map[string]string { + return emojiMap +} + +// AppendAlias adds new emoji pair to the emojis map. +func AppendAlias(alias, code string) error { + if c, ok := emojiMap[alias]; ok { + return fmt.Errorf("emoji already exist: %q => %+q", alias, c) + } + + for _, r := range alias { + if unicode.IsSpace(r) { + return fmt.Errorf("emoji alias is not valid: %q", alias) + } + } + + emojiMap[alias] = code + + return nil +} + +// Exist checks existence of the emoji by alias. +func Exist(alias string) bool { + _, ok := emojiMap[alias] + + return ok +} + +// Find returns the emoji code by alias. +func Find(alias string) (string, bool) { + code, ok := emojiMap[alias] + if !ok { + return "", false + } + + return code, true +}
A
parser_test.go
@@ -0,0 +1,156 @@
+package emoji + +import ( + "fmt" + "testing" +) + +func TestParse(t *testing.T) { + tt := []struct { + input string + expected string + }{ + { + input: "I am :man_technologist: from :flag_for_turkey:. Tests are :thumbs_up:", + expected: fmt.Sprintf("I am %v from %v. Tests are %v", ManTechnologist, FlagForTurkey, ThumbsUp), + }, + { + input: "consecutive emojis :pizza::sushi::sweat:", + expected: fmt.Sprintf("consecutive emojis %v%v%v", Pizza, Sushi, DowncastFaceWithSweat), + }, + { + input: ":accordion::anguished_face: \n woman :woman_golfing:", + expected: fmt.Sprintf("%v%v \n woman %v", Accordion, AnguishedFace, WomanGolfing), + }, + { + input: "shared colon :angry_face_with_horns:anger_symbol:", + expected: fmt.Sprintf("shared colon %vanger_symbol:", AngryFaceWithHorns), + }, + { + input: ":not_exist_emoji: not exist emoji", + expected: ":not_exist_emoji: not exist emoji", + }, + { + input: ":dragon::", + expected: fmt.Sprintf("%v:", Dragon), + }, + { + input: "::+1:", + expected: fmt.Sprintf(":%v", ThumbsUp), + }, + { + input: "::anchor::", + expected: fmt.Sprintf(":%v:", Anchor), + }, + { + input: ":anguished:::", + expected: fmt.Sprintf("%v::", AnguishedFace), + }, + { + input: "too many colon::::closed_book:::: too many colon:", + expected: fmt.Sprintf("too many colon:::%v::: too many colon:", ClosedBook), + }, + { + input: "emoji with space :angry face_with_horns:anger_symbol:", + expected: fmt.Sprintf("emoji with space :angry face_with_horns%v", AngerSymbol), + }, + { + input: "dummytext", + expected: "dummytext", + }, + } + + for i, tc := range tt { + got := Parse(tc.input) + if got != tc.expected { + t.Fatalf("test case %v fail: got: %v, expected: %v", i+1, got, tc.expected) + } + } +} + +func TestMap(t *testing.T) { + expected := len(emojiMap) + got := len(Map()) + + if got != expected { + t.Fatalf("test case fail: got: %v, expected: %v", got, expected) + } +} + +func TestAppendAlias(t *testing.T) { + tt := []struct { + alias string + code string + err bool + }{ + {alias: ":my_car:", code: "\U0001f3ce\ufe0f", err: false}, + {alias: ":berserker:", code: "\U0001f621", err: false}, + {alias: ":potato:", code: "\U0001f423", err: true}, + {alias: ":not_valid alias:", code: "\U0001f423", err: true}, + } + + for i, tc := range tt { + err := AppendAlias(tc.alias, tc.code) + if (err != nil) != tc.err { + t.Fatalf("test case %v fail: got: %v, expected: %v", i+1, err, tc.err) + } + + if exist := Exist(tc.alias); !exist && !tc.err { + t.Fatalf("test case %v fail: got: %v, expected: %v", i+1, !exist, exist) + } + } +} + +func TestExist(t *testing.T) { + tt := []struct { + input string + expected bool + }{ + {input: ":man_technologist:", expected: true}, + {input: ":registered:", expected: true}, + {input: ":robot_face:", expected: true}, + {input: ":wave:", expected: true}, + {input: ":sheaf_of_rice:", expected: true}, + {input: ":random_emoji:", expected: false}, + {input: ":test_emoji:", expected: false}, + } + + for i, tc := range tt { + got := Exist(tc.input) + if got != tc.expected { + t.Fatalf("test case %v fail: got: %v, expected: %v", i+1, got, tc.expected) + } + } +} + +func TestFind(t *testing.T) { + tt := []struct { + input string + expected string + exist bool + }{ + {input: ":man_technologist:", expected: ManTechnologist.String(), exist: true}, + {input: ":robot_face:", expected: Robot.String(), exist: true}, + {input: ":wave:", expected: WavingHand.String(), exist: true}, + {input: ":sheaf_of_rice:", expected: SheafOfRice.String(), exist: true}, + {input: ":random_emoji:", expected: "", exist: false}, + {input: ":test_emoji:", expected: "", exist: false}, + } + + for i, tc := range tt { + got, exist := Find(tc.input) + if got != tc.expected { + t.Fatalf("test case %v fail: got: %v, expected: %v", i+1, got, tc.expected) + } + + if exist != tc.exist { + t.Fatalf("test case %v fail: got: %v, expected: %v", i+1, exist, tc.exist) + } + } +} + +func BenchmarkParse(b *testing.B) { + for n := 0; n < b.N; n++ { + _ = Parse("I am :man_technologist: from :flag_for_turkey:. Tests are :thumbs_up:") + } +}