From 6cc066b4d6c8f15c962ba642b47ae3149f3ff0bd Mon Sep 17 00:00:00 2001 From: Eragon Date: Tue, 16 May 2023 23:11:17 +0200 Subject: [PATCH] editor: Self-host the emoji-picker custom element. --- .../scripts/emoji-picker-element/data.json | 1 + .../scripts/emoji-picker-element/database.js | 972 ++++++ .../scripts/emoji-picker-element/i18n/ar.js | 34 + .../scripts/emoji-picker-element/i18n/de.js | 34 + .../scripts/emoji-picker-element/i18n/en.js | 34 + .../scripts/emoji-picker-element/i18n/es.js | 34 + .../scripts/emoji-picker-element/i18n/fr.js | 34 + .../scripts/emoji-picker-element/i18n/hi.js | 34 + .../scripts/emoji-picker-element/i18n/id.js | 34 + .../scripts/emoji-picker-element/i18n/it.js | 34 + .../emoji-picker-element/i18n/ms_MY.js | 34 + .../scripts/emoji-picker-element/i18n/nl.js | 34 + .../scripts/emoji-picker-element/i18n/pl.js | 34 + .../emoji-picker-element/i18n/pt_BR.js | 34 + .../emoji-picker-element/i18n/pt_PT.js | 34 + .../emoji-picker-element/i18n/ru_RU.js | 34 + .../scripts/emoji-picker-element/i18n/tr.js | 34 + .../emoji-picker-element/i18n/zh_CN.js | 27 + .../scripts/emoji-picker-element/index.js | 3 + .../scripts/emoji-picker-element/picker.js | 2704 +++++++++++++++++ .../scripts/emoji-picker-element/svelte.js | 2294 ++++++++++++++ app/templates/base/scripts.html | 2 +- app/templates/widgets/editor.html | 2 +- 23 files changed, 6513 insertions(+), 2 deletions(-) create mode 100644 app/static/scripts/emoji-picker-element/data.json create mode 100644 app/static/scripts/emoji-picker-element/database.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/ar.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/de.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/en.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/es.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/fr.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/hi.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/id.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/it.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/ms_MY.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/nl.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/pl.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/pt_BR.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/pt_PT.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/ru_RU.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/tr.js create mode 100644 app/static/scripts/emoji-picker-element/i18n/zh_CN.js create mode 100644 app/static/scripts/emoji-picker-element/index.js create mode 100644 app/static/scripts/emoji-picker-element/picker.js create mode 100644 app/static/scripts/emoji-picker-element/svelte.js diff --git a/app/static/scripts/emoji-picker-element/data.json b/app/static/scripts/emoji-picker-element/data.json new file mode 100644 index 0000000..1dab199 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/data.json @@ -0,0 +1 @@ +[{"shortcodes":["grinning","grinning_face"],"annotation":"grinning face","tags":["face","grin"],"emoji":"๐Ÿ˜€","order":1,"group":0,"version":1},{"shortcodes":["grinning_face_with_big_eyes","smiley"],"annotation":"grinning face with big eyes","tags":["face","mouth","open","smile"],"emoji":"๐Ÿ˜ƒ","order":2,"group":0,"version":0.6},{"shortcodes":["grinning_face_with_closed_eyes","smile"],"annotation":"grinning face with smiling eyes","tags":["eye","face","mouth","open","smile"],"emoji":"๐Ÿ˜„","order":3,"group":0,"version":0.6,"emoticon":":D"},{"shortcodes":["beaming_face","grin"],"annotation":"beaming face with smiling eyes","tags":["eye","face","grin","smile"],"emoji":"๐Ÿ˜","order":4,"group":0,"version":0.6},{"shortcodes":["laughing","lol","satisfied","squinting_face"],"annotation":"grinning squinting face","tags":["face","laugh","mouth","satisfied","smile"],"emoji":"๐Ÿ˜†","order":5,"group":0,"version":0.6,"emoticon":"XD"},{"shortcodes":["grinning_face_with_sweat","sweat_smile"],"annotation":"grinning face with sweat","tags":["cold","face","open","smile","sweat"],"emoji":"๐Ÿ˜…","order":6,"group":0,"version":0.6},{"shortcodes":["rofl"],"annotation":"rolling on the floor laughing","tags":["face","floor","laugh","rofl","rolling","rotfl"],"emoji":"๐Ÿคฃ","order":7,"group":0,"version":3,"emoticon":":'D"},{"shortcodes":["joy","lmao","tears_of_joy"],"annotation":"face with tears of joy","tags":["face","joy","laugh","tear"],"emoji":"๐Ÿ˜‚","order":8,"group":0,"version":0.6,"emoticon":":')"},{"shortcodes":["slightly_smiling_face"],"annotation":"slightly smiling face","tags":["face","smile"],"emoji":"๐Ÿ™‚","order":9,"group":0,"version":1,"emoticon":":)"},{"shortcodes":["upside_down_face"],"annotation":"upside-down face","tags":["face","upside-down"],"emoji":"๐Ÿ™ƒ","order":10,"group":0,"version":1},{"shortcodes":["melt","melting_face"],"annotation":"melting face","tags":["disappear","dissolve","liquid","melt"],"emoji":"๐Ÿซ ","order":11,"group":0,"version":14},{"shortcodes":["wink","winking_face"],"annotation":"winking face","tags":["face","wink"],"emoji":"๐Ÿ˜‰","order":12,"group":0,"version":0.6,"emoticon":";)"},{"shortcodes":["blush","smiling_face_with_closed_eyes"],"annotation":"smiling face with smiling eyes","tags":["blush","eye","face","smile"],"emoji":"๐Ÿ˜Š","order":13,"group":0,"version":0.6,"emoticon":":>"},{"shortcodes":["halo","innocent"],"annotation":"smiling face with halo","tags":["angel","face","fantasy","halo","innocent"],"emoji":"๐Ÿ˜‡","order":14,"group":0,"version":1,"emoticon":"O:)"},{"shortcodes":["smiling_face_with_3_hearts"],"annotation":"smiling face with hearts","tags":["adore","crush","hearts","in love"],"emoji":"๐Ÿฅฐ","order":15,"group":0,"version":11},{"shortcodes":["heart_eyes","smiling_face_with_heart_eyes"],"annotation":"smiling face with heart-eyes","tags":["eye","face","love","smile"],"emoji":"๐Ÿ˜","order":16,"group":0,"version":0.6},{"shortcodes":["star_struck"],"annotation":"star-struck","tags":["eyes","face","grinning","star"],"emoji":"๐Ÿคฉ","order":17,"group":0,"version":5},{"shortcodes":["blowing_a_kiss","kissing_heart"],"annotation":"face blowing a kiss","tags":["face","kiss"],"emoji":"๐Ÿ˜˜","order":18,"group":0,"version":0.6,"emoticon":":X"},{"shortcodes":["kissing","kissing_face"],"annotation":"kissing face","tags":["face","kiss"],"emoji":"๐Ÿ˜—","order":19,"group":0,"version":1},{"shortcodes":["relaxed","smiling_face"],"annotation":"smiling face","tags":["face","outlined","relaxed","smile"],"emoji":"โ˜บ๏ธ","order":21,"group":0,"version":0.6},{"shortcodes":["kissing_closed_eyes","kissing_face_with_closed_eyes"],"annotation":"kissing face with closed eyes","tags":["closed","eye","face","kiss"],"emoji":"๐Ÿ˜š","order":22,"group":0,"version":0.6,"emoticon":":*"},{"shortcodes":["kissing_face_with_smiling_eyes","kissing_smiling_eyes"],"annotation":"kissing face with smiling eyes","tags":["eye","face","kiss","smile"],"emoji":"๐Ÿ˜™","order":23,"group":0,"version":1},{"shortcodes":["smiling_face_with_tear"],"annotation":"smiling face with tear","tags":["grateful","proud","relieved","smiling","tear","touched"],"emoji":"๐Ÿฅฒ","order":24,"group":0,"version":13},{"shortcodes":["savoring_food","yum"],"annotation":"face savoring food","tags":["delicious","face","savouring","smile","yum"],"emoji":"๐Ÿ˜‹","order":25,"group":0,"version":0.6},{"shortcodes":["face_with_tongue","stuck_out_tongue"],"annotation":"face with tongue","tags":["face","tongue"],"emoji":"๐Ÿ˜›","order":26,"group":0,"version":1,"emoticon":":P"},{"shortcodes":["stuck_out_tongue_winking_eye"],"annotation":"winking face with tongue","tags":["eye","face","joke","tongue","wink"],"emoji":"๐Ÿ˜œ","order":27,"group":0,"version":0.6,"emoticon":";P"},{"shortcodes":["zany","zany_face"],"annotation":"zany face","tags":["eye","goofy","large","small"],"emoji":"๐Ÿคช","order":28,"group":0,"version":5},{"shortcodes":["stuck_out_tongue_closed_eyes"],"annotation":"squinting face with tongue","tags":["eye","face","horrible","taste","tongue"],"emoji":"๐Ÿ˜","order":29,"group":0,"version":0.6,"emoticon":"XP"},{"shortcodes":["money_mouth_face"],"annotation":"money-mouth face","tags":["face","money","mouth"],"emoji":"๐Ÿค‘","order":30,"group":0,"version":1},{"shortcodes":["hug","hugging","hugging_face"],"annotation":"smiling face with open hands","tags":["face","hug","hugging","open hands","smiling face"],"emoji":"๐Ÿค—","order":31,"group":0,"version":1},{"shortcodes":["face_with_hand_over_mouth","hand_over_mouth"],"annotation":"face with hand over mouth","tags":["whoops"],"emoji":"๐Ÿคญ","order":32,"group":0,"version":5},{"shortcodes":["face_with_open_eyes_hand_over_mouth","gasp"],"annotation":"face with open eyes and hand over mouth","tags":["amazement","awe","disbelief","embarrass","scared","surprise"],"emoji":"๐Ÿซข","order":33,"group":0,"version":14},{"shortcodes":["face_with_peeking_eye","peek"],"annotation":"face with peeking eye","tags":["captivated","peep","stare"],"emoji":"๐Ÿซฃ","order":34,"group":0,"version":14},{"shortcodes":["shush","shushing_face"],"annotation":"shushing face","tags":["quiet","shush"],"emoji":"๐Ÿคซ","order":35,"group":0,"version":5},{"shortcodes":["thinking","thinking_face","wtf"],"annotation":"thinking face","tags":["face","thinking"],"emoji":"๐Ÿค”","order":36,"group":0,"version":1,"emoticon":":L"},{"shortcodes":["salute","saluting_face"],"annotation":"saluting face","tags":["ok","salute","sunny","troops","yes"],"emoji":"๐Ÿซก","order":37,"group":0,"version":14},{"shortcodes":["zipper_mouth","zipper_mouth_face"],"annotation":"zipper-mouth face","tags":["face","mouth","zipper"],"emoji":"๐Ÿค","order":38,"group":0,"version":1,"emoticon":":Z"},{"shortcodes":["face_with_raised_eyebrow","raised_eyebrow"],"annotation":"face with raised eyebrow","tags":["distrust","skeptic"],"emoji":"๐Ÿคจ","order":39,"group":0,"version":5},{"shortcodes":["neutral","neutral_face"],"annotation":"neutral face","tags":["deadpan","face","meh","neutral"],"emoji":"๐Ÿ˜๏ธ","order":40,"group":0,"version":0.7,"emoticon":":|"},{"shortcodes":["expressionless","expressionless_face"],"annotation":"expressionless face","tags":["expressionless","face","inexpressive","meh","unexpressive"],"emoji":"๐Ÿ˜‘","order":41,"group":0,"version":1},{"shortcodes":["no_mouth"],"annotation":"face without mouth","tags":["face","mouth","quiet","silent"],"emoji":"๐Ÿ˜ถ","order":42,"group":0,"version":1,"emoticon":":#"},{"shortcodes":["dotted_line_face"],"annotation":"dotted line face","tags":["depressed","disappear","hide","introvert","invisible"],"emoji":"๐Ÿซฅ","order":43,"group":0,"version":14},{"shortcodes":["in_clouds"],"annotation":"face in clouds","tags":["absentminded","face in the fog","head in clouds"],"emoji":"๐Ÿ˜ถโ€๐ŸŒซ๏ธ","order":44,"group":0,"version":13.1},{"shortcodes":["smirk","smirking","smirking_face"],"annotation":"smirking face","tags":["face","smirk"],"emoji":"๐Ÿ˜","order":46,"group":0,"version":0.6,"emoticon":":j"},{"shortcodes":["unamused","unamused_face"],"annotation":"unamused face","tags":["face","unamused","unhappy"],"emoji":"๐Ÿ˜’","order":47,"group":0,"version":0.6,"emoticon":":?"},{"shortcodes":["rolling_eyes"],"annotation":"face with rolling eyes","tags":["eyeroll","eyes","face","rolling"],"emoji":"๐Ÿ™„","order":48,"group":0,"version":1},{"shortcodes":["grimacing","grimacing_face"],"annotation":"grimacing face","tags":["face","grimace"],"emoji":"๐Ÿ˜ฌ","order":49,"group":0,"version":1,"emoticon":"8D"},{"shortcodes":["exhale","exhaling"],"annotation":"face exhaling","tags":["exhale","gasp","groan","relief","whisper","whistle"],"emoji":"๐Ÿ˜ฎโ€๐Ÿ’จ","order":50,"group":0,"version":13.1},{"shortcodes":["lying","lying_face"],"annotation":"lying face","tags":["face","lie","pinocchio"],"emoji":"๐Ÿคฅ","order":51,"group":0,"version":3},{"shortcodes":["relieved","relieved_face"],"annotation":"relieved face","tags":["face","relieved"],"emoji":"๐Ÿ˜Œ","order":52,"group":0,"version":0.6},{"shortcodes":["pensive","pensive_face"],"annotation":"pensive face","tags":["dejected","face","pensive"],"emoji":"๐Ÿ˜”","order":53,"group":0,"version":0.6},{"shortcodes":["sleepy","sleepy_face"],"annotation":"sleepy face","tags":["face","good night","sleep"],"emoji":"๐Ÿ˜ช","order":54,"group":0,"version":0.6},{"shortcodes":["drooling","drooling_face"],"annotation":"drooling face","tags":["drooling","face"],"emoji":"๐Ÿคค","order":55,"group":0,"version":3},{"shortcodes":["sleeping","sleeping_face"],"annotation":"sleeping face","tags":["face","good night","sleep","zzz"],"emoji":"๐Ÿ˜ด","order":56,"group":0,"version":1},{"shortcodes":["mask","medical_mask"],"annotation":"face with medical mask","tags":["cold","doctor","face","mask","sick"],"emoji":"๐Ÿ˜ท","order":57,"group":0,"version":0.6},{"shortcodes":["face_with_thermometer"],"annotation":"face with thermometer","tags":["face","ill","sick","thermometer"],"emoji":"๐Ÿค’","order":58,"group":0,"version":1},{"shortcodes":["face_with_head_bandage"],"annotation":"face with head-bandage","tags":["bandage","face","hurt","injury"],"emoji":"๐Ÿค•","order":59,"group":0,"version":1},{"shortcodes":["nauseated","nauseated_face"],"annotation":"nauseated face","tags":["face","nauseated","vomit"],"emoji":"๐Ÿคข","order":60,"group":0,"version":3,"emoticon":"%("},{"shortcodes":["face_vomiting","vomiting"],"annotation":"face vomiting","tags":["puke","sick","vomit"],"emoji":"๐Ÿคฎ","order":61,"group":0,"version":5},{"shortcodes":["sneezing","sneezing_face"],"annotation":"sneezing face","tags":["face","gesundheit","sneeze"],"emoji":"๐Ÿคง","order":62,"group":0,"version":3},{"shortcodes":["hot","hot_face"],"annotation":"hot face","tags":["feverish","heat stroke","hot","red-faced","sweating"],"emoji":"๐Ÿฅต","order":63,"group":0,"version":11},{"shortcodes":["cold","cold_face"],"annotation":"cold face","tags":["blue-faced","cold","freezing","frostbite","icicles"],"emoji":"๐Ÿฅถ","order":64,"group":0,"version":11},{"shortcodes":["woozy","woozy_face"],"annotation":"woozy face","tags":["dizzy","intoxicated","tipsy","uneven eyes","wavy mouth"],"emoji":"๐Ÿฅด","order":65,"group":0,"version":11,"emoticon":":&"},{"shortcodes":["dizzy_face","knocked_out"],"annotation":"face with crossed-out eyes","tags":["crossed-out eyes","dead","face","knocked out"],"emoji":"๐Ÿ˜ต","order":66,"group":0,"version":0.6,"emoticon":"XO"},{"shortcodes":["dizzy_eyes"],"annotation":"face with spiral eyes","tags":["dizzy","hypnotized","spiral","trouble","whoa"],"emoji":"๐Ÿ˜ตโ€๐Ÿ’ซ","order":67,"group":0,"version":13.1},{"shortcodes":["exploding_head"],"annotation":"exploding head","tags":["mind blown","shocked"],"emoji":"๐Ÿคฏ","order":68,"group":0,"version":5},{"shortcodes":["cowboy","cowboy_face"],"annotation":"cowboy hat face","tags":["cowboy","cowgirl","face","hat"],"emoji":"๐Ÿค ","order":69,"group":0,"version":3},{"shortcodes":["hooray","partying","partying_face"],"annotation":"partying face","tags":["celebration","hat","horn","party"],"emoji":"๐Ÿฅณ","order":70,"group":0,"version":11},{"shortcodes":["disguised","disguised_face"],"annotation":"disguised face","tags":["disguise","face","glasses","incognito","nose"],"emoji":"๐Ÿฅธ","order":71,"group":0,"version":13},{"shortcodes":["smiling_face_with_sunglasses","sunglasses_cool","too_cool"],"annotation":"smiling face with sunglasses","tags":["bright","cool","face","sun","sunglasses"],"emoji":"๐Ÿ˜Ž","order":72,"group":0,"version":1,"emoticon":"8)"},{"shortcodes":["nerd","nerd_face"],"annotation":"nerd face","tags":["face","geek","nerd"],"emoji":"๐Ÿค“","order":73,"group":0,"version":1,"emoticon":":B"},{"shortcodes":["face_with_monocle"],"annotation":"face with monocle","tags":["face","monocle","stuffy"],"emoji":"๐Ÿง","order":74,"group":0,"version":5},{"shortcodes":["confused","confused_face"],"annotation":"confused face","tags":["confused","face","meh"],"emoji":"๐Ÿ˜•","order":75,"group":0,"version":1,"emoticon":":/"},{"shortcodes":["face_with_diagonal_mouth"],"annotation":"face with diagonal mouth","tags":["disappointed","meh","skeptical","unsure"],"emoji":"๐Ÿซค","order":76,"group":0,"version":14},{"shortcodes":["worried","worried_face"],"annotation":"worried face","tags":["face","worried"],"emoji":"๐Ÿ˜Ÿ","order":77,"group":0,"version":1},{"shortcodes":["slightly_frowning_face"],"annotation":"slightly frowning face","tags":["face","frown"],"emoji":"๐Ÿ™","order":78,"group":0,"version":1},{"shortcodes":["white_frowning_face"],"annotation":"frowning face","tags":["face","frown"],"emoji":"โ˜น๏ธ","order":80,"group":0,"version":0.7,"emoticon":":("},{"shortcodes":["face_with_open_mouth","open_mouth"],"annotation":"face with open mouth","tags":["face","mouth","open","sympathy"],"emoji":"๐Ÿ˜ฎ","order":81,"group":0,"version":1},{"shortcodes":["hushed","hushed_face"],"annotation":"hushed face","tags":["face","hushed","stunned","surprised"],"emoji":"๐Ÿ˜ฏ","order":82,"group":0,"version":1},{"shortcodes":["astonished","astonished_face"],"annotation":"astonished face","tags":["astonished","face","shocked","totally"],"emoji":"๐Ÿ˜ฒ","order":83,"group":0,"version":0.6,"emoticon":":O"},{"shortcodes":["flushed","flushed_face"],"annotation":"flushed face","tags":["dazed","face","flushed"],"emoji":"๐Ÿ˜ณ","order":84,"group":0,"version":0.6,"emoticon":":$"},{"shortcodes":["pleading","pleading_face"],"annotation":"pleading face","tags":["begging","mercy","puppy eyes"],"emoji":"๐Ÿฅบ","order":85,"group":0,"version":11},{"shortcodes":["face_holding_back_tears","watery_eyes"],"annotation":"face holding back tears","tags":["angry","cry","proud","resist","sad"],"emoji":"๐Ÿฅน","order":86,"group":0,"version":14},{"shortcodes":["frowning","frowning_face"],"annotation":"frowning face with open mouth","tags":["face","frown","mouth","open"],"emoji":"๐Ÿ˜ฆ","order":87,"group":0,"version":1},{"shortcodes":["anguished","anguished_face"],"annotation":"anguished face","tags":["anguished","face"],"emoji":"๐Ÿ˜ง","order":88,"group":0,"version":1,"emoticon":":S"},{"shortcodes":["fearful","fearful_face"],"annotation":"fearful face","tags":["face","fear","fearful","scared"],"emoji":"๐Ÿ˜จ","order":89,"group":0,"version":0.6},{"shortcodes":["anxious","anxious_face","cold_sweat"],"annotation":"anxious face with sweat","tags":["blue","cold","face","rushed","sweat"],"emoji":"๐Ÿ˜ฐ","order":90,"group":0,"version":0.6},{"shortcodes":["disappointed_relieved","sad_relieved_face"],"annotation":"sad but relieved face","tags":["disappointed","face","relieved","whew"],"emoji":"๐Ÿ˜ฅ","order":91,"group":0,"version":0.6},{"shortcodes":["cry","crying_face"],"annotation":"crying face","tags":["cry","face","sad","tear"],"emoji":"๐Ÿ˜ข","order":92,"group":0,"version":0.6,"emoticon":":'("},{"shortcodes":["loudly_crying_face","sob"],"annotation":"loudly crying face","tags":["cry","face","sad","sob","tear"],"emoji":"๐Ÿ˜ญ","order":93,"group":0,"version":0.6,"emoticon":":'o"},{"shortcodes":["scream","screaming_in_fear"],"annotation":"face screaming in fear","tags":["face","fear","munch","scared","scream"],"emoji":"๐Ÿ˜ฑ","order":94,"group":0,"version":0.6,"emoticon":"Dx"},{"shortcodes":["confounded","confounded_face"],"annotation":"confounded face","tags":["confounded","face"],"emoji":"๐Ÿ˜–","order":95,"group":0,"version":0.6,"emoticon":"X("},{"shortcodes":["persevere","persevering_face"],"annotation":"persevering face","tags":["face","persevere"],"emoji":"๐Ÿ˜ฃ","order":96,"group":0,"version":0.6},{"shortcodes":["disappointed","disappointed_face"],"annotation":"disappointed face","tags":["disappointed","face"],"emoji":"๐Ÿ˜ž","order":97,"group":0,"version":0.6},{"shortcodes":["downcast_face","sweat"],"annotation":"downcast face with sweat","tags":["cold","face","sweat"],"emoji":"๐Ÿ˜“","order":98,"group":0,"version":0.6,"emoticon":":<"},{"shortcodes":["weary","weary_face"],"annotation":"weary face","tags":["face","tired","weary"],"emoji":"๐Ÿ˜ฉ","order":99,"group":0,"version":0.6,"emoticon":"D:"},{"shortcodes":["tired","tired_face"],"annotation":"tired face","tags":["face","tired"],"emoji":"๐Ÿ˜ซ","order":100,"group":0,"version":0.6,"emoticon":":C"},{"shortcodes":["yawn","yawning","yawning_face"],"annotation":"yawning face","tags":["bored","tired","yawn"],"emoji":"๐Ÿฅฑ","order":101,"group":0,"version":12},{"shortcodes":["nose_steam","triumph"],"annotation":"face with steam from nose","tags":["face","triumph","won"],"emoji":"๐Ÿ˜ค","order":102,"group":0,"version":0.6},{"shortcodes":["pout","pouting_face","rage"],"annotation":"enraged face","tags":["angry","enraged","face","mad","pouting","rage","red"],"emoji":"๐Ÿ˜ก","order":103,"group":0,"version":0.6,"emoticon":">:/"},{"shortcodes":["angry","angry_face"],"annotation":"angry face","tags":["anger","angry","face","mad"],"emoji":"๐Ÿ˜ ","order":104,"group":0,"version":0.6},{"shortcodes":["censored","face_with_symbols_on_mouth"],"annotation":"face with symbols on mouth","tags":["swearing"],"emoji":"๐Ÿคฌ","order":105,"group":0,"version":5,"emoticon":":@"},{"shortcodes":["smiling_imp"],"annotation":"smiling face with horns","tags":["face","fairy tale","fantasy","horns","smile"],"emoji":"๐Ÿ˜ˆ","order":106,"group":0,"version":1,"emoticon":">:)"},{"shortcodes":["angry_imp","imp"],"annotation":"angry face with horns","tags":["demon","devil","face","fantasy","imp"],"emoji":"๐Ÿ‘ฟ","order":107,"group":0,"version":0.6,"emoticon":">:("},{"shortcodes":["skull"],"annotation":"skull","tags":["death","face","fairy tale","monster"],"emoji":"๐Ÿ’€","order":108,"group":0,"version":0.6},{"shortcodes":["skull_and_crossbones"],"annotation":"skull and crossbones","tags":["crossbones","death","face","monster","skull"],"emoji":"โ˜ ๏ธ","order":110,"group":0,"version":1},{"shortcodes":["poop","shit"],"annotation":"pile of poo","tags":["dung","face","monster","poo","poop"],"emoji":"๐Ÿ’ฉ","order":111,"group":0,"version":0.6},{"shortcodes":["clown","clown_face"],"annotation":"clown face","tags":["clown","face"],"emoji":"๐Ÿคก","order":112,"group":0,"version":3},{"shortcodes":["japanese_ogre","ogre"],"annotation":"ogre","tags":["creature","face","fairy tale","fantasy","monster"],"emoji":"๐Ÿ‘น","order":113,"group":0,"version":0.6,"emoticon":">0)"},{"shortcodes":["goblin","japanese_goblin"],"annotation":"goblin","tags":["creature","face","fairy tale","fantasy","monster"],"emoji":"๐Ÿ‘บ","order":114,"group":0,"version":0.6},{"shortcodes":["ghost"],"annotation":"ghost","tags":["creature","face","fairy tale","fantasy","monster"],"emoji":"๐Ÿ‘ป","order":115,"group":0,"version":0.6},{"shortcodes":["alien"],"annotation":"alien","tags":["creature","extraterrestrial","face","fantasy","ufo"],"emoji":"๐Ÿ‘ฝ๏ธ","order":116,"group":0,"version":0.6},{"shortcodes":["alien_monster","space_invader"],"annotation":"alien monster","tags":["alien","creature","extraterrestrial","face","monster","ufo"],"emoji":"๐Ÿ‘พ","order":117,"group":0,"version":0.6},{"shortcodes":["robot","robot_face"],"annotation":"robot","tags":["face","monster"],"emoji":"๐Ÿค–","order":118,"group":0,"version":1},{"shortcodes":["grinning_cat","smiley_cat"],"annotation":"grinning cat","tags":["cat","face","grinning","mouth","open","smile"],"emoji":"๐Ÿ˜บ","order":119,"group":0,"version":0.6},{"shortcodes":["grinning_cat_with_closed_eyes","smile_cat"],"annotation":"grinning cat with smiling eyes","tags":["cat","eye","face","grin","smile"],"emoji":"๐Ÿ˜ธ","order":120,"group":0,"version":0.6},{"shortcodes":["joy_cat","tears_of_joy_cat"],"annotation":"cat with tears of joy","tags":["cat","face","joy","tear"],"emoji":"๐Ÿ˜น","order":121,"group":0,"version":0.6},{"shortcodes":["heart_eyes_cat","smiling_cat_with_heart_eyes"],"annotation":"smiling cat with heart-eyes","tags":["cat","eye","face","heart","love","smile"],"emoji":"๐Ÿ˜ป","order":122,"group":0,"version":0.6},{"shortcodes":["smirk_cat","wry_smile_cat"],"annotation":"cat with wry smile","tags":["cat","face","ironic","smile","wry"],"emoji":"๐Ÿ˜ผ","order":123,"group":0,"version":0.6},{"shortcodes":["kissing_cat"],"annotation":"kissing cat","tags":["cat","eye","face","kiss"],"emoji":"๐Ÿ˜ฝ","order":124,"group":0,"version":0.6,"emoticon":":3"},{"shortcodes":["scream_cat","weary_cat"],"annotation":"weary cat","tags":["cat","face","oh","surprised","weary"],"emoji":"๐Ÿ™€","order":125,"group":0,"version":0.6},{"shortcodes":["crying_cat"],"annotation":"crying cat","tags":["cat","cry","face","sad","tear"],"emoji":"๐Ÿ˜ฟ","order":126,"group":0,"version":0.6},{"shortcodes":["pouting_cat"],"annotation":"pouting cat","tags":["cat","face","pouting"],"emoji":"๐Ÿ˜พ","order":127,"group":0,"version":0.6},{"shortcodes":["see_no_evil"],"annotation":"see-no-evil monkey","tags":["evil","face","forbidden","monkey","see"],"emoji":"๐Ÿ™ˆ","order":128,"group":0,"version":0.6},{"shortcodes":["hear_no_evil"],"annotation":"hear-no-evil monkey","tags":["evil","face","forbidden","hear","monkey"],"emoji":"๐Ÿ™‰","order":129,"group":0,"version":0.6},{"shortcodes":["speak_no_evil"],"annotation":"speak-no-evil monkey","tags":["evil","face","forbidden","monkey","speak"],"emoji":"๐Ÿ™Š","order":130,"group":0,"version":0.6},{"shortcodes":["kiss"],"annotation":"kiss mark","tags":["kiss","lips"],"emoji":"๐Ÿ’‹","order":131,"group":0,"version":0.6},{"shortcodes":["love_letter"],"annotation":"love letter","tags":["heart","letter","love","mail"],"emoji":"๐Ÿ’Œ","order":132,"group":0,"version":0.6},{"shortcodes":["cupid","heart_with_arrow"],"annotation":"heart with arrow","tags":["arrow","cupid"],"emoji":"๐Ÿ’˜","order":133,"group":0,"version":0.6},{"shortcodes":["gift_heart","heart_with_ribbon"],"annotation":"heart with ribbon","tags":["ribbon","valentine"],"emoji":"๐Ÿ’","order":134,"group":0,"version":0.6},{"shortcodes":["sparkling_heart"],"annotation":"sparkling heart","tags":["excited","sparkle"],"emoji":"๐Ÿ’–","order":135,"group":0,"version":0.6},{"shortcodes":["growing_heart","heartpulse"],"annotation":"growing heart","tags":["excited","growing","nervous","pulse"],"emoji":"๐Ÿ’—","order":136,"group":0,"version":0.6},{"shortcodes":["beating_heart","heartbeat"],"annotation":"beating heart","tags":["beating","heartbeat","pulsating"],"emoji":"๐Ÿ’“","order":137,"group":0,"version":0.6},{"shortcodes":["revolving_hearts"],"annotation":"revolving hearts","tags":["revolving"],"emoji":"๐Ÿ’ž","order":138,"group":0,"version":0.6},{"shortcodes":["two_hearts"],"annotation":"two hearts","tags":["love"],"emoji":"๐Ÿ’•","order":139,"group":0,"version":0.6},{"shortcodes":["heart_decoration"],"annotation":"heart decoration","tags":["heart"],"emoji":"๐Ÿ’Ÿ","order":140,"group":0,"version":0.6},{"shortcodes":["heart_exclamation"],"annotation":"heart exclamation","tags":["exclamation","mark","punctuation"],"emoji":"โฃ๏ธ","order":142,"group":0,"version":1},{"shortcodes":["broken_heart"],"annotation":"broken heart","tags":["break","broken"],"emoji":"๐Ÿ’”","order":143,"group":0,"version":0.6,"emoticon":"","skins":[{"emoji":"๐Ÿง™๐Ÿปโ€โ™‚๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง™๐Ÿผโ€โ™‚๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง™๐Ÿฝโ€โ™‚๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง™๐Ÿพโ€โ™‚๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง™๐Ÿฟโ€โ™‚๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_mage"],"annotation":"woman mage","tags":["sorceress","witch"],"emoji":"๐Ÿง™โ€โ™€๏ธ","order":1726,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง™๐Ÿปโ€โ™€๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง™๐Ÿผโ€โ™€๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง™๐Ÿฝโ€โ™€๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง™๐Ÿพโ€โ™€๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง™๐Ÿฟโ€โ™€๏ธ","version":5,"tone":5}]},{"shortcodes":["fairy"],"annotation":"fairy","tags":["oberon","puck","titania"],"emoji":"๐Ÿงš","order":1738,"group":1,"version":5,"skins":[{"emoji":"๐Ÿงš๐Ÿป","version":5,"tone":1},{"emoji":"๐Ÿงš๐Ÿผ","version":5,"tone":2},{"emoji":"๐Ÿงš๐Ÿฝ","version":5,"tone":3},{"emoji":"๐Ÿงš๐Ÿพ","version":5,"tone":4},{"emoji":"๐Ÿงš๐Ÿฟ","version":5,"tone":5}]},{"shortcodes":["man_fairy"],"annotation":"man fairy","tags":["oberon","puck"],"emoji":"๐Ÿงšโ€โ™‚๏ธ","order":1744,"group":1,"version":5,"skins":[{"emoji":"๐Ÿงš๐Ÿปโ€โ™‚๏ธ","version":5,"tone":1},{"emoji":"๐Ÿงš๐Ÿผโ€โ™‚๏ธ","version":5,"tone":2},{"emoji":"๐Ÿงš๐Ÿฝโ€โ™‚๏ธ","version":5,"tone":3},{"emoji":"๐Ÿงš๐Ÿพโ€โ™‚๏ธ","version":5,"tone":4},{"emoji":"๐Ÿงš๐Ÿฟโ€โ™‚๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_fairy"],"annotation":"woman fairy","tags":["titania"],"emoji":"๐Ÿงšโ€โ™€๏ธ","order":1756,"group":1,"version":5,"skins":[{"emoji":"๐Ÿงš๐Ÿปโ€โ™€๏ธ","version":5,"tone":1},{"emoji":"๐Ÿงš๐Ÿผโ€โ™€๏ธ","version":5,"tone":2},{"emoji":"๐Ÿงš๐Ÿฝโ€โ™€๏ธ","version":5,"tone":3},{"emoji":"๐Ÿงš๐Ÿพโ€โ™€๏ธ","version":5,"tone":4},{"emoji":"๐Ÿงš๐Ÿฟโ€โ™€๏ธ","version":5,"tone":5}]},{"shortcodes":["vampire"],"annotation":"vampire","tags":["dracula","undead"],"emoji":"๐Ÿง›","order":1768,"group":1,"version":5,"emoticon":":E","skins":[{"emoji":"๐Ÿง›๐Ÿป","version":5,"tone":1},{"emoji":"๐Ÿง›๐Ÿผ","version":5,"tone":2},{"emoji":"๐Ÿง›๐Ÿฝ","version":5,"tone":3},{"emoji":"๐Ÿง›๐Ÿพ","version":5,"tone":4},{"emoji":"๐Ÿง›๐Ÿฟ","version":5,"tone":5}]},{"shortcodes":["man_vampire"],"annotation":"man vampire","tags":["dracula","undead"],"emoji":"๐Ÿง›โ€โ™‚๏ธ","order":1774,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง›๐Ÿปโ€โ™‚๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง›๐Ÿผโ€โ™‚๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง›๐Ÿฝโ€โ™‚๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง›๐Ÿพโ€โ™‚๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง›๐Ÿฟโ€โ™‚๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_vampire"],"annotation":"woman vampire","tags":["undead"],"emoji":"๐Ÿง›โ€โ™€๏ธ","order":1786,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง›๐Ÿปโ€โ™€๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง›๐Ÿผโ€โ™€๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง›๐Ÿฝโ€โ™€๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง›๐Ÿพโ€โ™€๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง›๐Ÿฟโ€โ™€๏ธ","version":5,"tone":5}]},{"shortcodes":["merperson"],"annotation":"merperson","tags":["mermaid","merman","merwoman"],"emoji":"๐Ÿงœ","order":1798,"group":1,"version":5,"skins":[{"emoji":"๐Ÿงœ๐Ÿป","version":5,"tone":1},{"emoji":"๐Ÿงœ๐Ÿผ","version":5,"tone":2},{"emoji":"๐Ÿงœ๐Ÿฝ","version":5,"tone":3},{"emoji":"๐Ÿงœ๐Ÿพ","version":5,"tone":4},{"emoji":"๐Ÿงœ๐Ÿฟ","version":5,"tone":5}]},{"shortcodes":["merman"],"annotation":"merman","tags":["triton"],"emoji":"๐Ÿงœโ€โ™‚๏ธ","order":1804,"group":1,"version":5,"skins":[{"emoji":"๐Ÿงœ๐Ÿปโ€โ™‚๏ธ","version":5,"tone":1},{"emoji":"๐Ÿงœ๐Ÿผโ€โ™‚๏ธ","version":5,"tone":2},{"emoji":"๐Ÿงœ๐Ÿฝโ€โ™‚๏ธ","version":5,"tone":3},{"emoji":"๐Ÿงœ๐Ÿพโ€โ™‚๏ธ","version":5,"tone":4},{"emoji":"๐Ÿงœ๐Ÿฟโ€โ™‚๏ธ","version":5,"tone":5}]},{"shortcodes":["mermaid"],"annotation":"mermaid","tags":["merwoman"],"emoji":"๐Ÿงœโ€โ™€๏ธ","order":1816,"group":1,"version":5,"skins":[{"emoji":"๐Ÿงœ๐Ÿปโ€โ™€๏ธ","version":5,"tone":1},{"emoji":"๐Ÿงœ๐Ÿผโ€โ™€๏ธ","version":5,"tone":2},{"emoji":"๐Ÿงœ๐Ÿฝโ€โ™€๏ธ","version":5,"tone":3},{"emoji":"๐Ÿงœ๐Ÿพโ€โ™€๏ธ","version":5,"tone":4},{"emoji":"๐Ÿงœ๐Ÿฟโ€โ™€๏ธ","version":5,"tone":5}]},{"shortcodes":["elf"],"annotation":"elf","tags":["magical"],"emoji":"๐Ÿง","order":1828,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง๐Ÿป","version":5,"tone":1},{"emoji":"๐Ÿง๐Ÿผ","version":5,"tone":2},{"emoji":"๐Ÿง๐Ÿฝ","version":5,"tone":3},{"emoji":"๐Ÿง๐Ÿพ","version":5,"tone":4},{"emoji":"๐Ÿง๐Ÿฟ","version":5,"tone":5}]},{"shortcodes":["man_elf"],"annotation":"man elf","tags":["magical"],"emoji":"๐Ÿงโ€โ™‚๏ธ","order":1834,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง๐Ÿปโ€โ™‚๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง๐Ÿผโ€โ™‚๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง๐Ÿฝโ€โ™‚๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง๐Ÿพโ€โ™‚๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง๐Ÿฟโ€โ™‚๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_elf"],"annotation":"woman elf","tags":["magical"],"emoji":"๐Ÿงโ€โ™€๏ธ","order":1846,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง๐Ÿปโ€โ™€๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง๐Ÿผโ€โ™€๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง๐Ÿฝโ€โ™€๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง๐Ÿพโ€โ™€๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง๐Ÿฟโ€โ™€๏ธ","version":5,"tone":5}]},{"shortcodes":["genie"],"annotation":"genie","tags":["djinn"],"emoji":"๐Ÿงž","order":1858,"group":1,"version":5},{"shortcodes":["man_genie"],"annotation":"man genie","tags":["djinn"],"emoji":"๐Ÿงžโ€โ™‚๏ธ","order":1859,"group":1,"version":5},{"shortcodes":["woman_genie"],"annotation":"woman genie","tags":["djinn"],"emoji":"๐Ÿงžโ€โ™€๏ธ","order":1861,"group":1,"version":5},{"shortcodes":["zombie"],"annotation":"zombie","tags":["undead","walking dead"],"emoji":"๐ŸงŸ","order":1863,"group":1,"version":5,"emoticon":"8#"},{"shortcodes":["man_zombie"],"annotation":"man zombie","tags":["undead","walking dead"],"emoji":"๐ŸงŸโ€โ™‚๏ธ","order":1864,"group":1,"version":5},{"shortcodes":["woman_zombie"],"annotation":"woman zombie","tags":["undead","walking dead"],"emoji":"๐ŸงŸโ€โ™€๏ธ","order":1866,"group":1,"version":5},{"shortcodes":["troll"],"annotation":"troll","tags":["fairy tale","fantasy","monster"],"emoji":"๐ŸงŒ","order":1868,"group":1,"version":14},{"shortcodes":["massage","person_getting_massage"],"annotation":"person getting massage","tags":["face","massage","salon"],"emoji":"๐Ÿ’†","order":1869,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿ’†๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿ’†๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿ’†๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿ’†๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿ’†๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_getting_massage"],"annotation":"man getting massage","tags":["face","man","massage"],"emoji":"๐Ÿ’†โ€โ™‚๏ธ","order":1875,"group":1,"version":4,"skins":[{"emoji":"๐Ÿ’†๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿ’†๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿ’†๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿ’†๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿ’†๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_getting_massage"],"annotation":"woman getting massage","tags":["face","massage","woman"],"emoji":"๐Ÿ’†โ€โ™€๏ธ","order":1887,"group":1,"version":4,"skins":[{"emoji":"๐Ÿ’†๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿ’†๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿ’†๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿ’†๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿ’†๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["haircut","person_getting_haircut"],"annotation":"person getting haircut","tags":["barber","beauty","haircut","parlor"],"emoji":"๐Ÿ’‡","order":1899,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿ’‡๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿ’‡๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿ’‡๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿ’‡๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿ’‡๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_getting_haircut"],"annotation":"man getting haircut","tags":["haircut","man"],"emoji":"๐Ÿ’‡โ€โ™‚๏ธ","order":1905,"group":1,"version":4,"skins":[{"emoji":"๐Ÿ’‡๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿ’‡๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿ’‡๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿ’‡๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿ’‡๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_getting_haircut"],"annotation":"woman getting haircut","tags":["haircut","woman"],"emoji":"๐Ÿ’‡โ€โ™€๏ธ","order":1917,"group":1,"version":4,"skins":[{"emoji":"๐Ÿ’‡๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿ’‡๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿ’‡๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿ’‡๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿ’‡๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["person_walking","walking"],"annotation":"person walking","tags":["hike","walk","walking"],"emoji":"๐Ÿšถ","order":1929,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿšถ๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿšถ๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿšถ๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿšถ๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿšถ๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_walking"],"annotation":"man walking","tags":["hike","man","walk"],"emoji":"๐Ÿšถโ€โ™‚๏ธ","order":1935,"group":1,"version":4,"skins":[{"emoji":"๐Ÿšถ๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿšถ๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿšถ๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿšถ๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿšถ๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_walking"],"annotation":"woman walking","tags":["hike","walk","woman"],"emoji":"๐Ÿšถโ€โ™€๏ธ","order":1947,"group":1,"version":4,"skins":[{"emoji":"๐Ÿšถ๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿšถ๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿšถ๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿšถ๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿšถ๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["person_standing","standing"],"annotation":"person standing","tags":["stand","standing"],"emoji":"๐Ÿง","order":1959,"group":1,"version":12,"skins":[{"emoji":"๐Ÿง๐Ÿป","version":12,"tone":1},{"emoji":"๐Ÿง๐Ÿผ","version":12,"tone":2},{"emoji":"๐Ÿง๐Ÿฝ","version":12,"tone":3},{"emoji":"๐Ÿง๐Ÿพ","version":12,"tone":4},{"emoji":"๐Ÿง๐Ÿฟ","version":12,"tone":5}]},{"shortcodes":["man_standing"],"annotation":"man standing","tags":["man","standing"],"emoji":"๐Ÿงโ€โ™‚๏ธ","order":1965,"group":1,"version":12,"skins":[{"emoji":"๐Ÿง๐Ÿปโ€โ™‚๏ธ","version":12,"tone":1},{"emoji":"๐Ÿง๐Ÿผโ€โ™‚๏ธ","version":12,"tone":2},{"emoji":"๐Ÿง๐Ÿฝโ€โ™‚๏ธ","version":12,"tone":3},{"emoji":"๐Ÿง๐Ÿพโ€โ™‚๏ธ","version":12,"tone":4},{"emoji":"๐Ÿง๐Ÿฟโ€โ™‚๏ธ","version":12,"tone":5}]},{"shortcodes":["woman_standing"],"annotation":"woman standing","tags":["standing","woman"],"emoji":"๐Ÿงโ€โ™€๏ธ","order":1977,"group":1,"version":12,"skins":[{"emoji":"๐Ÿง๐Ÿปโ€โ™€๏ธ","version":12,"tone":1},{"emoji":"๐Ÿง๐Ÿผโ€โ™€๏ธ","version":12,"tone":2},{"emoji":"๐Ÿง๐Ÿฝโ€โ™€๏ธ","version":12,"tone":3},{"emoji":"๐Ÿง๐Ÿพโ€โ™€๏ธ","version":12,"tone":4},{"emoji":"๐Ÿง๐Ÿฟโ€โ™€๏ธ","version":12,"tone":5}]},{"shortcodes":["kneeling","person_kneeling"],"annotation":"person kneeling","tags":["kneel","kneeling"],"emoji":"๐ŸงŽ","order":1989,"group":1,"version":12,"skins":[{"emoji":"๐ŸงŽ๐Ÿป","version":12,"tone":1},{"emoji":"๐ŸงŽ๐Ÿผ","version":12,"tone":2},{"emoji":"๐ŸงŽ๐Ÿฝ","version":12,"tone":3},{"emoji":"๐ŸงŽ๐Ÿพ","version":12,"tone":4},{"emoji":"๐ŸงŽ๐Ÿฟ","version":12,"tone":5}]},{"shortcodes":["man_kneeling"],"annotation":"man kneeling","tags":["kneeling","man"],"emoji":"๐ŸงŽโ€โ™‚๏ธ","order":1995,"group":1,"version":12,"skins":[{"emoji":"๐ŸงŽ๐Ÿปโ€โ™‚๏ธ","version":12,"tone":1},{"emoji":"๐ŸงŽ๐Ÿผโ€โ™‚๏ธ","version":12,"tone":2},{"emoji":"๐ŸงŽ๐Ÿฝโ€โ™‚๏ธ","version":12,"tone":3},{"emoji":"๐ŸงŽ๐Ÿพโ€โ™‚๏ธ","version":12,"tone":4},{"emoji":"๐ŸงŽ๐Ÿฟโ€โ™‚๏ธ","version":12,"tone":5}]},{"shortcodes":["woman_kneeling"],"annotation":"woman kneeling","tags":["kneeling","woman"],"emoji":"๐ŸงŽโ€โ™€๏ธ","order":2007,"group":1,"version":12,"skins":[{"emoji":"๐ŸงŽ๐Ÿปโ€โ™€๏ธ","version":12,"tone":1},{"emoji":"๐ŸงŽ๐Ÿผโ€โ™€๏ธ","version":12,"tone":2},{"emoji":"๐ŸงŽ๐Ÿฝโ€โ™€๏ธ","version":12,"tone":3},{"emoji":"๐ŸงŽ๐Ÿพโ€โ™€๏ธ","version":12,"tone":4},{"emoji":"๐ŸงŽ๐Ÿฟโ€โ™€๏ธ","version":12,"tone":5}]},{"shortcodes":["person_with_probing_cane","person_with_white_cane"],"annotation":"person with white cane","tags":["accessibility","blind"],"emoji":"๐Ÿง‘โ€๐Ÿฆฏ","order":2019,"group":1,"version":12.1,"skins":[{"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿฆฏ","version":12.1,"tone":1},{"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿฆฏ","version":12.1,"tone":2},{"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿฆฏ","version":12.1,"tone":3},{"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿฆฏ","version":12.1,"tone":4},{"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿฆฏ","version":12.1,"tone":5}]},{"shortcodes":["man_with_probing_cane","man_with_white_cane"],"annotation":"man with white cane","tags":["accessibility","blind","man"],"emoji":"๐Ÿ‘จโ€๐Ÿฆฏ","order":2025,"group":1,"version":12,"skins":[{"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฏ","version":12,"tone":1},{"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฏ","version":12,"tone":2},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฏ","version":12,"tone":3},{"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฏ","version":12,"tone":4},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฏ","version":12,"tone":5}]},{"shortcodes":["woman_with_probing_cane","woman_with_white_cane"],"annotation":"woman with white cane","tags":["accessibility","blind","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿฆฏ","order":2031,"group":1,"version":12,"skins":[{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฏ","version":12,"tone":1},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฏ","version":12,"tone":2},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฏ","version":12,"tone":3},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฏ","version":12,"tone":4},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฏ","version":12,"tone":5}]},{"shortcodes":["person_in_motorized_wheelchair"],"annotation":"person in motorized wheelchair","tags":["accessibility","wheelchair"],"emoji":"๐Ÿง‘โ€๐Ÿฆผ","order":2037,"group":1,"version":12.1,"skins":[{"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿฆผ","version":12.1,"tone":1},{"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿฆผ","version":12.1,"tone":2},{"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿฆผ","version":12.1,"tone":3},{"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿฆผ","version":12.1,"tone":4},{"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿฆผ","version":12.1,"tone":5}]},{"shortcodes":["man_in_motorized_wheelchair"],"annotation":"man in motorized wheelchair","tags":["accessibility","man","wheelchair"],"emoji":"๐Ÿ‘จโ€๐Ÿฆผ","order":2043,"group":1,"version":12,"skins":[{"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿฆผ","version":12,"tone":1},{"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿฆผ","version":12,"tone":2},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆผ","version":12,"tone":3},{"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿฆผ","version":12,"tone":4},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆผ","version":12,"tone":5}]},{"shortcodes":["woman_in_motorized_wheelchair"],"annotation":"woman in motorized wheelchair","tags":["accessibility","wheelchair","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿฆผ","order":2049,"group":1,"version":12,"skins":[{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆผ","version":12,"tone":1},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆผ","version":12,"tone":2},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆผ","version":12,"tone":3},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆผ","version":12,"tone":4},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆผ","version":12,"tone":5}]},{"shortcodes":["person_in_manual_wheelchair"],"annotation":"person in manual wheelchair","tags":["accessibility","wheelchair"],"emoji":"๐Ÿง‘โ€๐Ÿฆฝ","order":2055,"group":1,"version":12.1,"skins":[{"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿฆฝ","version":12.1,"tone":1},{"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿฆฝ","version":12.1,"tone":2},{"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿฆฝ","version":12.1,"tone":3},{"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿฆฝ","version":12.1,"tone":4},{"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿฆฝ","version":12.1,"tone":5}]},{"shortcodes":["man_in_manual_wheelchair"],"annotation":"man in manual wheelchair","tags":["accessibility","man","wheelchair"],"emoji":"๐Ÿ‘จโ€๐Ÿฆฝ","order":2061,"group":1,"version":12,"skins":[{"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฝ","version":12,"tone":1},{"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฝ","version":12,"tone":2},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฝ","version":12,"tone":3},{"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฝ","version":12,"tone":4},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฝ","version":12,"tone":5}]},{"shortcodes":["woman_in_manual_wheelchair"],"annotation":"woman in manual wheelchair","tags":["accessibility","wheelchair","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿฆฝ","order":2067,"group":1,"version":12,"skins":[{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฝ","version":12,"tone":1},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฝ","version":12,"tone":2},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฝ","version":12,"tone":3},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฝ","version":12,"tone":4},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฝ","version":12,"tone":5}]},{"shortcodes":["person_running","running"],"annotation":"person running","tags":["marathon","running"],"emoji":"๐Ÿƒ","order":2073,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿƒ๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿƒ๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿƒ๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿƒ๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿƒ๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_running"],"annotation":"man running","tags":["man","marathon","racing","running"],"emoji":"๐Ÿƒโ€โ™‚๏ธ","order":2079,"group":1,"version":4,"skins":[{"emoji":"๐Ÿƒ๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿƒ๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿƒ๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿƒ๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿƒ๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_running"],"annotation":"woman running","tags":["marathon","racing","running","woman"],"emoji":"๐Ÿƒโ€โ™€๏ธ","order":2091,"group":1,"version":4,"skins":[{"emoji":"๐Ÿƒ๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿƒ๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿƒ๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿƒ๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿƒ๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["dancer","woman_dancing"],"annotation":"woman dancing","tags":["dance","dancing","woman"],"emoji":"๐Ÿ’ƒ","order":2103,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿ’ƒ๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿ’ƒ๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿ’ƒ๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿ’ƒ๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿ’ƒ๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_dancing"],"annotation":"man dancing","tags":["dance","dancing","man"],"emoji":"๐Ÿ•บ","order":2109,"group":1,"version":3,"skins":[{"emoji":"๐Ÿ•บ๐Ÿป","version":3,"tone":1},{"emoji":"๐Ÿ•บ๐Ÿผ","version":3,"tone":2},{"emoji":"๐Ÿ•บ๐Ÿฝ","version":3,"tone":3},{"emoji":"๐Ÿ•บ๐Ÿพ","version":3,"tone":4},{"emoji":"๐Ÿ•บ๐Ÿฟ","version":3,"tone":5}]},{"shortcodes":["levitate","levitating","person_in_suit_levitating"],"annotation":"person in suit levitating","tags":["business","person","suit"],"emoji":"๐Ÿ•ด๏ธ","order":2116,"group":1,"version":0.7,"skins":[{"emoji":"๐Ÿ•ด๐Ÿป","version":4,"tone":1},{"emoji":"๐Ÿ•ด๐Ÿผ","version":4,"tone":2},{"emoji":"๐Ÿ•ด๐Ÿฝ","version":4,"tone":3},{"emoji":"๐Ÿ•ด๐Ÿพ","version":4,"tone":4},{"emoji":"๐Ÿ•ด๐Ÿฟ","version":4,"tone":5}]},{"shortcodes":["dancers","people_with_bunny_ears_partying"],"annotation":"people with bunny ears","tags":["bunny ear","dancer","partying"],"emoji":"๐Ÿ‘ฏ","order":2122,"group":1,"version":0.6},{"shortcodes":["men_with_bunny_ears_partying"],"annotation":"men with bunny ears","tags":["bunny ear","dancer","men","partying"],"emoji":"๐Ÿ‘ฏโ€โ™‚๏ธ","order":2123,"group":1,"version":4},{"shortcodes":["women_with_bunny_ears_partying"],"annotation":"women with bunny ears","tags":["bunny ear","dancer","partying","women"],"emoji":"๐Ÿ‘ฏโ€โ™€๏ธ","order":2125,"group":1,"version":4},{"shortcodes":["person_in_steamy_room"],"annotation":"person in steamy room","tags":["sauna","steam room"],"emoji":"๐Ÿง–","order":2127,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง–๐Ÿป","version":5,"tone":1},{"emoji":"๐Ÿง–๐Ÿผ","version":5,"tone":2},{"emoji":"๐Ÿง–๐Ÿฝ","version":5,"tone":3},{"emoji":"๐Ÿง–๐Ÿพ","version":5,"tone":4},{"emoji":"๐Ÿง–๐Ÿฟ","version":5,"tone":5}]},{"shortcodes":["man_in_steamy_room"],"annotation":"man in steamy room","tags":["sauna","steam room"],"emoji":"๐Ÿง–โ€โ™‚๏ธ","order":2133,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง–๐Ÿปโ€โ™‚๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง–๐Ÿผโ€โ™‚๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง–๐Ÿฝโ€โ™‚๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง–๐Ÿพโ€โ™‚๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง–๐Ÿฟโ€โ™‚๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_in_steamy_room"],"annotation":"woman in steamy room","tags":["sauna","steam room"],"emoji":"๐Ÿง–โ€โ™€๏ธ","order":2145,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง–๐Ÿปโ€โ™€๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง–๐Ÿผโ€โ™€๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง–๐Ÿฝโ€โ™€๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง–๐Ÿพโ€โ™€๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง–๐Ÿฟโ€โ™€๏ธ","version":5,"tone":5}]},{"shortcodes":["climbing","person_climbing"],"annotation":"person climbing","tags":["climber"],"emoji":"๐Ÿง—","order":2157,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง—๐Ÿป","version":5,"tone":1},{"emoji":"๐Ÿง—๐Ÿผ","version":5,"tone":2},{"emoji":"๐Ÿง—๐Ÿฝ","version":5,"tone":3},{"emoji":"๐Ÿง—๐Ÿพ","version":5,"tone":4},{"emoji":"๐Ÿง—๐Ÿฟ","version":5,"tone":5}]},{"shortcodes":["man_climbing"],"annotation":"man climbing","tags":["climber"],"emoji":"๐Ÿง—โ€โ™‚๏ธ","order":2163,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง—๐Ÿปโ€โ™‚๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง—๐Ÿผโ€โ™‚๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง—๐Ÿฝโ€โ™‚๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง—๐Ÿพโ€โ™‚๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง—๐Ÿฟโ€โ™‚๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_climbing"],"annotation":"woman climbing","tags":["climber"],"emoji":"๐Ÿง—โ€โ™€๏ธ","order":2175,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง—๐Ÿปโ€โ™€๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง—๐Ÿผโ€โ™€๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง—๐Ÿฝโ€โ™€๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง—๐Ÿพโ€โ™€๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง—๐Ÿฟโ€โ™€๏ธ","version":5,"tone":5}]},{"shortcodes":["fencer","fencing","person_fencing"],"annotation":"person fencing","tags":["fencer","fencing","sword"],"emoji":"๐Ÿคบ","order":2187,"group":1,"version":3},{"shortcodes":["horse_racing"],"annotation":"horse racing","tags":["horse","jockey","racehorse","racing"],"emoji":"๐Ÿ‡","order":2188,"group":1,"version":1,"skins":[{"emoji":"๐Ÿ‡๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿ‡๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿ‡๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿ‡๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿ‡๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["person_skiing","skier","skiing"],"annotation":"skier","tags":["ski","snow"],"emoji":"โ›ท๏ธ","order":2195,"group":1,"version":0.7},{"shortcodes":["person_snowboarding","snowboarder","snowboarding"],"annotation":"snowboarder","tags":["ski","snow","snowboard"],"emoji":"๐Ÿ‚๏ธ","order":2196,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿ‚๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿ‚๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿ‚๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿ‚๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿ‚๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["golfer","golfing","person_golfing"],"annotation":"person golfing","tags":["ball","golf"],"emoji":"๐ŸŒ๏ธ","order":2203,"group":1,"version":0.7,"skins":[{"emoji":"๐ŸŒ๐Ÿป","version":4,"tone":1},{"emoji":"๐ŸŒ๐Ÿผ","version":4,"tone":2},{"emoji":"๐ŸŒ๐Ÿฝ","version":4,"tone":3},{"emoji":"๐ŸŒ๐Ÿพ","version":4,"tone":4},{"emoji":"๐ŸŒ๐Ÿฟ","version":4,"tone":5}]},{"shortcodes":["man_golfing"],"annotation":"man golfing","tags":["golf","man"],"emoji":"๐ŸŒ๏ธโ€โ™‚๏ธ","order":2209,"group":1,"version":4,"skins":[{"emoji":"๐ŸŒ๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐ŸŒ๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐ŸŒ๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐ŸŒ๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐ŸŒ๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_golfing"],"annotation":"woman golfing","tags":["golf","woman"],"emoji":"๐ŸŒ๏ธโ€โ™€๏ธ","order":2223,"group":1,"version":4,"skins":[{"emoji":"๐ŸŒ๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐ŸŒ๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐ŸŒ๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐ŸŒ๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐ŸŒ๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["person_surfing","surfer","surfing"],"annotation":"person surfing","tags":["surfing"],"emoji":"๐Ÿ„๏ธ","order":2237,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿ„๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿ„๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿ„๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿ„๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿ„๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_surfing"],"annotation":"man surfing","tags":["man","surfing"],"emoji":"๐Ÿ„โ€โ™‚๏ธ","order":2243,"group":1,"version":4,"skins":[{"emoji":"๐Ÿ„๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿ„๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿ„๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿ„๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿ„๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_surfing"],"annotation":"woman surfing","tags":["surfing","woman"],"emoji":"๐Ÿ„โ€โ™€๏ธ","order":2255,"group":1,"version":4,"skins":[{"emoji":"๐Ÿ„๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿ„๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿ„๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿ„๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿ„๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["person_rowing_boat","rowboat"],"annotation":"person rowing boat","tags":["boat","rowboat"],"emoji":"๐Ÿšฃ","order":2267,"group":1,"version":1,"skins":[{"emoji":"๐Ÿšฃ๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿšฃ๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿšฃ๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿšฃ๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿšฃ๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_rowing_boat"],"annotation":"man rowing boat","tags":["boat","man","rowboat"],"emoji":"๐Ÿšฃโ€โ™‚๏ธ","order":2273,"group":1,"version":4,"skins":[{"emoji":"๐Ÿšฃ๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿšฃ๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿšฃ๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿšฃ๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿšฃ๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_rowing_boat"],"annotation":"woman rowing boat","tags":["boat","rowboat","woman"],"emoji":"๐Ÿšฃโ€โ™€๏ธ","order":2285,"group":1,"version":4,"skins":[{"emoji":"๐Ÿšฃ๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿšฃ๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿšฃ๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿšฃ๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿšฃ๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["person_swimming","swimmer","swimming"],"annotation":"person swimming","tags":["swim"],"emoji":"๐ŸŠ๏ธ","order":2297,"group":1,"version":0.6,"skins":[{"emoji":"๐ŸŠ๐Ÿป","version":1,"tone":1},{"emoji":"๐ŸŠ๐Ÿผ","version":1,"tone":2},{"emoji":"๐ŸŠ๐Ÿฝ","version":1,"tone":3},{"emoji":"๐ŸŠ๐Ÿพ","version":1,"tone":4},{"emoji":"๐ŸŠ๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_swimming"],"annotation":"man swimming","tags":["man","swim"],"emoji":"๐ŸŠโ€โ™‚๏ธ","order":2303,"group":1,"version":4,"skins":[{"emoji":"๐ŸŠ๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐ŸŠ๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐ŸŠ๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐ŸŠ๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐ŸŠ๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_swimming"],"annotation":"woman swimming","tags":["swim","woman"],"emoji":"๐ŸŠโ€โ™€๏ธ","order":2315,"group":1,"version":4,"skins":[{"emoji":"๐ŸŠ๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐ŸŠ๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐ŸŠ๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐ŸŠ๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐ŸŠ๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["person_bouncing_ball"],"annotation":"person bouncing ball","tags":["ball"],"emoji":"โ›น๏ธ","order":2328,"group":1,"version":0.7,"skins":[{"emoji":"โ›น๐Ÿป","version":2,"tone":1},{"emoji":"โ›น๐Ÿผ","version":2,"tone":2},{"emoji":"โ›น๐Ÿฝ","version":2,"tone":3},{"emoji":"โ›น๐Ÿพ","version":2,"tone":4},{"emoji":"โ›น๐Ÿฟ","version":2,"tone":5}]},{"shortcodes":["man_bouncing_ball"],"annotation":"man bouncing ball","tags":["ball","man"],"emoji":"โ›น๏ธโ€โ™‚๏ธ","order":2334,"group":1,"version":4,"skins":[{"emoji":"โ›น๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"โ›น๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"โ›น๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"โ›น๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"โ›น๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_bouncing_ball"],"annotation":"woman bouncing ball","tags":["ball","woman"],"emoji":"โ›น๏ธโ€โ™€๏ธ","order":2348,"group":1,"version":4,"skins":[{"emoji":"โ›น๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"โ›น๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"โ›น๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"โ›น๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"โ›น๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["person_lifting_weights","weight_lifter","weight_lifting"],"annotation":"person lifting weights","tags":["lifter","weight"],"emoji":"๐Ÿ‹๏ธ","order":2363,"group":1,"version":0.7,"skins":[{"emoji":"๐Ÿ‹๐Ÿป","version":2,"tone":1},{"emoji":"๐Ÿ‹๐Ÿผ","version":2,"tone":2},{"emoji":"๐Ÿ‹๐Ÿฝ","version":2,"tone":3},{"emoji":"๐Ÿ‹๐Ÿพ","version":2,"tone":4},{"emoji":"๐Ÿ‹๐Ÿฟ","version":2,"tone":5}]},{"shortcodes":["man_lifting_weights"],"annotation":"man lifting weights","tags":["man","weight lifter"],"emoji":"๐Ÿ‹๏ธโ€โ™‚๏ธ","order":2369,"group":1,"version":4,"skins":[{"emoji":"๐Ÿ‹๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿ‹๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿ‹๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿ‹๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿ‹๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_lifting_weights"],"annotation":"woman lifting weights","tags":["weight lifter","woman"],"emoji":"๐Ÿ‹๏ธโ€โ™€๏ธ","order":2383,"group":1,"version":4,"skins":[{"emoji":"๐Ÿ‹๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿ‹๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿ‹๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿ‹๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿ‹๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["bicyclist","biking","person_biking"],"annotation":"person biking","tags":["bicycle","biking","cyclist"],"emoji":"๐Ÿšด","order":2397,"group":1,"version":1,"skins":[{"emoji":"๐Ÿšด๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿšด๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿšด๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿšด๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿšด๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_biking"],"annotation":"man biking","tags":["bicycle","biking","cyclist","man"],"emoji":"๐Ÿšดโ€โ™‚๏ธ","order":2403,"group":1,"version":4,"skins":[{"emoji":"๐Ÿšด๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿšด๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿšด๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿšด๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿšด๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_biking"],"annotation":"woman biking","tags":["bicycle","biking","cyclist","woman"],"emoji":"๐Ÿšดโ€โ™€๏ธ","order":2415,"group":1,"version":4,"skins":[{"emoji":"๐Ÿšด๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿšด๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿšด๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿšด๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿšด๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["mountain_bicyclist","mountain_biking","person_mountain_biking"],"annotation":"person mountain biking","tags":["bicycle","bicyclist","bike","cyclist","mountain"],"emoji":"๐Ÿšต","order":2427,"group":1,"version":1,"skins":[{"emoji":"๐Ÿšต๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿšต๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿšต๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿšต๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿšต๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["man_mountain_biking"],"annotation":"man mountain biking","tags":["bicycle","bike","cyclist","man","mountain"],"emoji":"๐Ÿšตโ€โ™‚๏ธ","order":2433,"group":1,"version":4,"skins":[{"emoji":"๐Ÿšต๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿšต๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿšต๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿšต๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿšต๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_mountain_biking"],"annotation":"woman mountain biking","tags":["bicycle","bike","biking","cyclist","mountain","woman"],"emoji":"๐Ÿšตโ€โ™€๏ธ","order":2445,"group":1,"version":4,"skins":[{"emoji":"๐Ÿšต๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿšต๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿšต๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿšต๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿšต๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["cartwheeling","person_cartwheel"],"annotation":"person cartwheeling","tags":["cartwheel","gymnastics"],"emoji":"๐Ÿคธ","order":2457,"group":1,"version":3,"skins":[{"emoji":"๐Ÿคธ๐Ÿป","version":3,"tone":1},{"emoji":"๐Ÿคธ๐Ÿผ","version":3,"tone":2},{"emoji":"๐Ÿคธ๐Ÿฝ","version":3,"tone":3},{"emoji":"๐Ÿคธ๐Ÿพ","version":3,"tone":4},{"emoji":"๐Ÿคธ๐Ÿฟ","version":3,"tone":5}]},{"shortcodes":["man_cartwheeling"],"annotation":"man cartwheeling","tags":["cartwheel","gymnastics","man"],"emoji":"๐Ÿคธโ€โ™‚๏ธ","order":2463,"group":1,"version":4,"skins":[{"emoji":"๐Ÿคธ๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿคธ๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿคธ๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿคธ๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿคธ๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_cartwheeling"],"annotation":"woman cartwheeling","tags":["cartwheel","gymnastics","woman"],"emoji":"๐Ÿคธโ€โ™€๏ธ","order":2475,"group":1,"version":4,"skins":[{"emoji":"๐Ÿคธ๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿคธ๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿคธ๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿคธ๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿคธ๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["people_wrestling","wrestlers","wrestling"],"annotation":"people wrestling","tags":["wrestle","wrestler"],"emoji":"๐Ÿคผ","order":2487,"group":1,"version":3},{"shortcodes":["men_wrestling"],"annotation":"men wrestling","tags":["men","wrestle"],"emoji":"๐Ÿคผโ€โ™‚๏ธ","order":2488,"group":1,"version":4},{"shortcodes":["women_wrestling"],"annotation":"women wrestling","tags":["women","wrestle"],"emoji":"๐Ÿคผโ€โ™€๏ธ","order":2490,"group":1,"version":4},{"shortcodes":["person_playing_water_polo","water_polo"],"annotation":"person playing water polo","tags":["polo","water"],"emoji":"๐Ÿคฝ","order":2492,"group":1,"version":3,"skins":[{"emoji":"๐Ÿคฝ๐Ÿป","version":3,"tone":1},{"emoji":"๐Ÿคฝ๐Ÿผ","version":3,"tone":2},{"emoji":"๐Ÿคฝ๐Ÿฝ","version":3,"tone":3},{"emoji":"๐Ÿคฝ๐Ÿพ","version":3,"tone":4},{"emoji":"๐Ÿคฝ๐Ÿฟ","version":3,"tone":5}]},{"shortcodes":["man_playing_water_polo"],"annotation":"man playing water polo","tags":["man","water polo"],"emoji":"๐Ÿคฝโ€โ™‚๏ธ","order":2498,"group":1,"version":4,"skins":[{"emoji":"๐Ÿคฝ๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿคฝ๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿคฝ๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿคฝ๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿคฝ๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_playing_water_polo"],"annotation":"woman playing water polo","tags":["water polo","woman"],"emoji":"๐Ÿคฝโ€โ™€๏ธ","order":2510,"group":1,"version":4,"skins":[{"emoji":"๐Ÿคฝ๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿคฝ๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿคฝ๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿคฝ๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿคฝ๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["handball","person_playing_handball"],"annotation":"person playing handball","tags":["ball","handball"],"emoji":"๐Ÿคพ","order":2522,"group":1,"version":3,"skins":[{"emoji":"๐Ÿคพ๐Ÿป","version":3,"tone":1},{"emoji":"๐Ÿคพ๐Ÿผ","version":3,"tone":2},{"emoji":"๐Ÿคพ๐Ÿฝ","version":3,"tone":3},{"emoji":"๐Ÿคพ๐Ÿพ","version":3,"tone":4},{"emoji":"๐Ÿคพ๐Ÿฟ","version":3,"tone":5}]},{"shortcodes":["man_playing_handball"],"annotation":"man playing handball","tags":["handball","man"],"emoji":"๐Ÿคพโ€โ™‚๏ธ","order":2528,"group":1,"version":4,"skins":[{"emoji":"๐Ÿคพ๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿคพ๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿคพ๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿคพ๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿคพ๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_playing_handball"],"annotation":"woman playing handball","tags":["handball","woman"],"emoji":"๐Ÿคพโ€โ™€๏ธ","order":2540,"group":1,"version":4,"skins":[{"emoji":"๐Ÿคพ๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿคพ๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿคพ๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿคพ๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿคพ๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["juggler","juggling","person_juggling"],"annotation":"person juggling","tags":["balance","juggle","multitask","skill"],"emoji":"๐Ÿคน","order":2552,"group":1,"version":3,"skins":[{"emoji":"๐Ÿคน๐Ÿป","version":3,"tone":1},{"emoji":"๐Ÿคน๐Ÿผ","version":3,"tone":2},{"emoji":"๐Ÿคน๐Ÿฝ","version":3,"tone":3},{"emoji":"๐Ÿคน๐Ÿพ","version":3,"tone":4},{"emoji":"๐Ÿคน๐Ÿฟ","version":3,"tone":5}]},{"shortcodes":["man_juggling"],"annotation":"man juggling","tags":["juggling","man","multitask"],"emoji":"๐Ÿคนโ€โ™‚๏ธ","order":2558,"group":1,"version":4,"skins":[{"emoji":"๐Ÿคน๐Ÿปโ€โ™‚๏ธ","version":4,"tone":1},{"emoji":"๐Ÿคน๐Ÿผโ€โ™‚๏ธ","version":4,"tone":2},{"emoji":"๐Ÿคน๐Ÿฝโ€โ™‚๏ธ","version":4,"tone":3},{"emoji":"๐Ÿคน๐Ÿพโ€โ™‚๏ธ","version":4,"tone":4},{"emoji":"๐Ÿคน๐Ÿฟโ€โ™‚๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_juggling"],"annotation":"woman juggling","tags":["juggling","multitask","woman"],"emoji":"๐Ÿคนโ€โ™€๏ธ","order":2570,"group":1,"version":4,"skins":[{"emoji":"๐Ÿคน๐Ÿปโ€โ™€๏ธ","version":4,"tone":1},{"emoji":"๐Ÿคน๐Ÿผโ€โ™€๏ธ","version":4,"tone":2},{"emoji":"๐Ÿคน๐Ÿฝโ€โ™€๏ธ","version":4,"tone":3},{"emoji":"๐Ÿคน๐Ÿพโ€โ™€๏ธ","version":4,"tone":4},{"emoji":"๐Ÿคน๐Ÿฟโ€โ™€๏ธ","version":4,"tone":5}]},{"shortcodes":["person_in_lotus_position"],"annotation":"person in lotus position","tags":["meditation","yoga"],"emoji":"๐Ÿง˜","order":2582,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง˜๐Ÿป","version":5,"tone":1},{"emoji":"๐Ÿง˜๐Ÿผ","version":5,"tone":2},{"emoji":"๐Ÿง˜๐Ÿฝ","version":5,"tone":3},{"emoji":"๐Ÿง˜๐Ÿพ","version":5,"tone":4},{"emoji":"๐Ÿง˜๐Ÿฟ","version":5,"tone":5}]},{"shortcodes":["man_in_lotus_position"],"annotation":"man in lotus position","tags":["meditation","yoga"],"emoji":"๐Ÿง˜โ€โ™‚๏ธ","order":2588,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง˜๐Ÿปโ€โ™‚๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง˜๐Ÿผโ€โ™‚๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง˜๐Ÿฝโ€โ™‚๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง˜๐Ÿพโ€โ™‚๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง˜๐Ÿฟโ€โ™‚๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_in_lotus_position"],"annotation":"woman in lotus position","tags":["meditation","yoga"],"emoji":"๐Ÿง˜โ€โ™€๏ธ","order":2600,"group":1,"version":5,"skins":[{"emoji":"๐Ÿง˜๐Ÿปโ€โ™€๏ธ","version":5,"tone":1},{"emoji":"๐Ÿง˜๐Ÿผโ€โ™€๏ธ","version":5,"tone":2},{"emoji":"๐Ÿง˜๐Ÿฝโ€โ™€๏ธ","version":5,"tone":3},{"emoji":"๐Ÿง˜๐Ÿพโ€โ™€๏ธ","version":5,"tone":4},{"emoji":"๐Ÿง˜๐Ÿฟโ€โ™€๏ธ","version":5,"tone":5}]},{"shortcodes":["bath","person_taking_bath"],"annotation":"person taking bath","tags":["bath","bathtub"],"emoji":"๐Ÿ›€","order":2612,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿ›€๐Ÿป","version":1,"tone":1},{"emoji":"๐Ÿ›€๐Ÿผ","version":1,"tone":2},{"emoji":"๐Ÿ›€๐Ÿฝ","version":1,"tone":3},{"emoji":"๐Ÿ›€๐Ÿพ","version":1,"tone":4},{"emoji":"๐Ÿ›€๐Ÿฟ","version":1,"tone":5}]},{"shortcodes":["person_in_bed","sleeping_accommodation"],"annotation":"person in bed","tags":["good night","hotel","sleep"],"emoji":"๐Ÿ›Œ","order":2618,"group":1,"version":1,"skins":[{"emoji":"๐Ÿ›Œ๐Ÿป","version":4,"tone":1},{"emoji":"๐Ÿ›Œ๐Ÿผ","version":4,"tone":2},{"emoji":"๐Ÿ›Œ๐Ÿฝ","version":4,"tone":3},{"emoji":"๐Ÿ›Œ๐Ÿพ","version":4,"tone":4},{"emoji":"๐Ÿ›Œ๐Ÿฟ","version":4,"tone":5}]},{"shortcodes":["people_holding_hands"],"annotation":"people holding hands","tags":["couple","hand","hold","holding hands","person"],"emoji":"๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘","order":2624,"group":1,"version":12,"skins":[{"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12,"tone":1},{"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12.1,"tone":[1,2]},{"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12.1,"tone":[1,3]},{"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12.1,"tone":[1,4]},{"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12.1,"tone":[1,5]},{"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12,"tone":[2,1]},{"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12,"tone":2},{"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12.1,"tone":[2,3]},{"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12.1,"tone":[2,4]},{"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12.1,"tone":[2,5]},{"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12,"tone":[3,1]},{"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12,"tone":[3,2]},{"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12,"tone":3},{"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12.1,"tone":[3,4]},{"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12.1,"tone":[3,5]},{"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12,"tone":[4,1]},{"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12,"tone":[4,2]},{"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12,"tone":[4,3]},{"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12,"tone":4},{"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12.1,"tone":[4,5]},{"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12,"tone":[5,1]},{"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12,"tone":[5,2]},{"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12,"tone":[5,3]},{"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12,"tone":[5,4]},{"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12,"tone":5}]},{"shortcodes":["two_women_holding_hands"],"annotation":"women holding hands","tags":["couple","hand","holding hands","women"],"emoji":"๐Ÿ‘ญ","order":2650,"group":1,"version":1,"skins":[{"emoji":"๐Ÿ‘ญ๐Ÿป","version":12,"tone":1},{"emoji":"๐Ÿ‘ญ๐Ÿผ","version":12,"tone":2},{"emoji":"๐Ÿ‘ญ๐Ÿฝ","version":12,"tone":3},{"emoji":"๐Ÿ‘ญ๐Ÿพ","version":12,"tone":4},{"emoji":"๐Ÿ‘ญ๐Ÿฟ","version":12,"tone":5},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ","version":12.1,"tone":[1,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ","version":12.1,"tone":[1,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ","version":12.1,"tone":[1,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ","version":12.1,"tone":[1,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป","version":12,"tone":[2,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ","version":12.1,"tone":[2,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ","version":12.1,"tone":[2,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ","version":12.1,"tone":[2,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป","version":12,"tone":[3,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ","version":12,"tone":[3,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ","version":12.1,"tone":[3,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ","version":12.1,"tone":[3,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป","version":12,"tone":[4,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ","version":12,"tone":[4,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ","version":12,"tone":[4,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ","version":12.1,"tone":[4,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป","version":12,"tone":[5,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ","version":12,"tone":[5,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ","version":12,"tone":[5,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ","version":12,"tone":[5,4]}]},{"shortcodes":["couple"],"annotation":"woman and man holding hands","tags":["couple","hand","hold","holding hands","man","woman"],"emoji":"๐Ÿ‘ซ","order":2676,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿ‘ซ๐Ÿป","version":12,"tone":1},{"emoji":"๐Ÿ‘ซ๐Ÿผ","version":12,"tone":2},{"emoji":"๐Ÿ‘ซ๐Ÿฝ","version":12,"tone":3},{"emoji":"๐Ÿ‘ซ๐Ÿพ","version":12,"tone":4},{"emoji":"๐Ÿ‘ซ๐Ÿฟ","version":12,"tone":5},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12,"tone":[1,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12,"tone":[1,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12,"tone":[1,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12,"tone":[1,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12,"tone":[2,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12,"tone":[2,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12,"tone":[2,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12,"tone":[2,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12,"tone":[3,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12,"tone":[3,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12,"tone":[3,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12,"tone":[3,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12,"tone":[4,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12,"tone":[4,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12,"tone":[4,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12,"tone":[4,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12,"tone":[5,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12,"tone":[5,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12,"tone":[5,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12,"tone":[5,4]}]},{"shortcodes":["two_men_holding_hands"],"annotation":"men holding hands","tags":["couple","gemini","holding hands","man","men","twins","zodiac"],"emoji":"๐Ÿ‘ฌ","order":2702,"group":1,"version":1,"skins":[{"emoji":"๐Ÿ‘ฌ๐Ÿป","version":12,"tone":1},{"emoji":"๐Ÿ‘ฌ๐Ÿผ","version":12,"tone":2},{"emoji":"๐Ÿ‘ฌ๐Ÿฝ","version":12,"tone":3},{"emoji":"๐Ÿ‘ฌ๐Ÿพ","version":12,"tone":4},{"emoji":"๐Ÿ‘ฌ๐Ÿฟ","version":12,"tone":5},{"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12.1,"tone":[1,2]},{"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12.1,"tone":[1,3]},{"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12.1,"tone":[1,4]},{"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12.1,"tone":[1,5]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12,"tone":[2,1]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12.1,"tone":[2,3]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12.1,"tone":[2,4]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12.1,"tone":[2,5]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12,"tone":[3,1]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12,"tone":[3,2]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12.1,"tone":[3,4]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12.1,"tone":[3,5]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12,"tone":[4,1]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12,"tone":[4,2]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12,"tone":[4,3]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12.1,"tone":[4,5]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12,"tone":[5,1]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12,"tone":[5,2]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12,"tone":[5,3]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12,"tone":[5,4]}]},{"shortcodes":["couple_kiss","couplekiss"],"annotation":"kiss","tags":["couple"],"emoji":"๐Ÿ’","order":2728,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿ’๐Ÿป","version":13.1,"tone":1},{"emoji":"๐Ÿ’๐Ÿผ","version":13.1,"tone":2},{"emoji":"๐Ÿ’๐Ÿฝ","version":13.1,"tone":3},{"emoji":"๐Ÿ’๐Ÿพ","version":13.1,"tone":4},{"emoji":"๐Ÿ’๐Ÿฟ","version":13.1,"tone":5},{"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ","version":13.1,"tone":[1,2]},{"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ","version":13.1,"tone":[1,3]},{"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ","version":13.1,"tone":[1,4]},{"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ","version":13.1,"tone":[1,5]},{"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป","version":13.1,"tone":[2,1]},{"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ","version":13.1,"tone":[2,3]},{"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ","version":13.1,"tone":[2,4]},{"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ","version":13.1,"tone":[2,5]},{"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป","version":13.1,"tone":[3,1]},{"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ","version":13.1,"tone":[3,2]},{"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ","version":13.1,"tone":[3,4]},{"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ","version":13.1,"tone":[3,5]},{"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป","version":13.1,"tone":[4,1]},{"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ","version":13.1,"tone":[4,2]},{"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ","version":13.1,"tone":[4,3]},{"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ","version":13.1,"tone":[4,5]},{"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป","version":13.1,"tone":[5,1]},{"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ","version":13.1,"tone":[5,2]},{"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ","version":13.1,"tone":[5,3]},{"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ","version":13.1,"tone":[5,4]}]},{"shortcodes":["kiss_mw","kiss_wm"],"annotation":"kiss: woman, man","tags":["couple","kiss","man","woman"],"emoji":"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ","order":2774,"group":1,"version":2,"skins":[{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":1},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[1,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[1,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[1,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[1,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[2,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":2},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[2,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[2,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[2,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[3,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[3,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":3},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[3,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[3,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[4,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[4,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[4,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":4},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[4,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[5,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[5,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[5,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[5,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":5}]},{"shortcodes":["kiss_mm"],"annotation":"kiss: man, man","tags":["couple","kiss","man"],"emoji":"๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ","order":2826,"group":1,"version":2,"skins":[{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":1},{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[1,2]},{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[1,3]},{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[1,4]},{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[1,5]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[2,1]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":2},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[2,3]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[2,4]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[2,5]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[3,1]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[3,2]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":3},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[3,4]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[3,5]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[4,1]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[4,2]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[4,3]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":4},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[4,5]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[5,1]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[5,2]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[5,3]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[5,4]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":5}]},{"shortcodes":["kiss_ww"],"annotation":"kiss: woman, woman","tags":["couple","kiss","woman"],"emoji":"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ","order":2878,"group":1,"version":2,"skins":[{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":1},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":[1,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":[1,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":[1,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":[1,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":[2,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":2},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":[2,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":[2,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":[2,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":[3,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":[3,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":3},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":[3,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":[3,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":[4,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":[4,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":[4,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":4},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":[4,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":[5,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":[5,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":[5,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":[5,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":5}]},{"shortcodes":["couple_with_heart"],"annotation":"couple with heart","tags":["couple","love"],"emoji":"๐Ÿ’‘","order":2930,"group":1,"version":0.6,"skins":[{"emoji":"๐Ÿ’‘๐Ÿป","version":13.1,"tone":1},{"emoji":"๐Ÿ’‘๐Ÿผ","version":13.1,"tone":2},{"emoji":"๐Ÿ’‘๐Ÿฝ","version":13.1,"tone":3},{"emoji":"๐Ÿ’‘๐Ÿพ","version":13.1,"tone":4},{"emoji":"๐Ÿ’‘๐Ÿฟ","version":13.1,"tone":5},{"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿง‘๐Ÿผ","version":13.1,"tone":[1,2]},{"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿง‘๐Ÿฝ","version":13.1,"tone":[1,3]},{"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿง‘๐Ÿพ","version":13.1,"tone":[1,4]},{"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿง‘๐Ÿฟ","version":13.1,"tone":[1,5]},{"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿง‘๐Ÿป","version":13.1,"tone":[2,1]},{"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿง‘๐Ÿฝ","version":13.1,"tone":[2,3]},{"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿง‘๐Ÿพ","version":13.1,"tone":[2,4]},{"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿง‘๐Ÿฟ","version":13.1,"tone":[2,5]},{"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป","version":13.1,"tone":[3,1]},{"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿผ","version":13.1,"tone":[3,2]},{"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿพ","version":13.1,"tone":[3,4]},{"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿฟ","version":13.1,"tone":[3,5]},{"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿง‘๐Ÿป","version":13.1,"tone":[4,1]},{"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿง‘๐Ÿผ","version":13.1,"tone":[4,2]},{"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿง‘๐Ÿฝ","version":13.1,"tone":[4,3]},{"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿง‘๐Ÿฟ","version":13.1,"tone":[4,5]},{"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿง‘๐Ÿป","version":13.1,"tone":[5,1]},{"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿง‘๐Ÿผ","version":13.1,"tone":[5,2]},{"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿง‘๐Ÿฝ","version":13.1,"tone":[5,3]},{"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿง‘๐Ÿพ","version":13.1,"tone":[5,4]}]},{"shortcodes":["couple_with_heart_mw","couple_with_heart_wm"],"annotation":"couple with heart: woman, man","tags":["couple","couple with heart","love","man","woman"],"emoji":"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘จ","order":2976,"group":1,"version":2,"skins":[{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":1},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[1,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[1,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[1,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[1,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[2,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":2},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[2,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[2,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[2,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[3,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[3,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":3},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[3,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[3,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[4,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[4,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[4,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":4},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[4,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[5,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[5,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[5,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[5,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":5}]},{"shortcodes":["couple_with_heart_mm"],"annotation":"couple with heart: man, man","tags":["couple","couple with heart","love","man"],"emoji":"๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ","order":3028,"group":1,"version":2,"skins":[{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":1},{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[1,2]},{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[1,3]},{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[1,4]},{"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[1,5]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[2,1]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":2},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[2,3]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[2,4]},{"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[2,5]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[3,1]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[3,2]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":3},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[3,4]},{"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[3,5]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[4,1]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[4,2]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[4,3]},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":4},{"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":[4,5]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1,"tone":[5,1]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1,"tone":[5,2]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1,"tone":[5,3]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1,"tone":[5,4]},{"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1,"tone":5}]},{"shortcodes":["couple_with_heart_ww"],"annotation":"couple with heart: woman, woman","tags":["couple","couple with heart","love","woman"],"emoji":"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ","order":3080,"group":1,"version":2,"skins":[{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":1},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":[1,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":[1,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":[1,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":[1,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":[2,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":2},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":[2,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":[2,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":[2,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":[3,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":[3,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":3},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":[3,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":[3,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":[4,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":[4,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":[4,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":4},{"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":[4,5]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1,"tone":[5,1]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1,"tone":[5,2]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1,"tone":[5,3]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1,"tone":[5,4]},{"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1,"tone":5}]},{"shortcodes":["family"],"annotation":"family","tags":["family"],"emoji":"๐Ÿ‘ช๏ธ","order":3132,"group":1,"version":0.6},{"shortcodes":["family_mwb"],"annotation":"family: man, woman, boy","tags":["boy","family","man","woman"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ","order":3133,"group":1,"version":2},{"shortcodes":["family_mwg"],"annotation":"family: man, woman, girl","tags":["family","girl","man","woman"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง","order":3134,"group":1,"version":2},{"shortcodes":["family_mwgb"],"annotation":"family: man, woman, girl, boy","tags":["boy","family","girl","man","woman"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","order":3135,"group":1,"version":2},{"shortcodes":["family_mwbb"],"annotation":"family: man, woman, boy, boy","tags":["boy","family","man","woman"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","order":3136,"group":1,"version":2},{"shortcodes":["family_mwgg"],"annotation":"family: man, woman, girl, girl","tags":["family","girl","man","woman"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง","order":3137,"group":1,"version":2},{"shortcodes":["family_mmb"],"annotation":"family: man, man, boy","tags":["boy","family","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ","order":3138,"group":1,"version":2},{"shortcodes":["family_mmg"],"annotation":"family: man, man, girl","tags":["family","girl","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง","order":3139,"group":1,"version":2},{"shortcodes":["family_mmgb"],"annotation":"family: man, man, girl, boy","tags":["boy","family","girl","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","order":3140,"group":1,"version":2},{"shortcodes":["family_mmbb"],"annotation":"family: man, man, boy, boy","tags":["boy","family","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","order":3141,"group":1,"version":2},{"shortcodes":["family_mmgg"],"annotation":"family: man, man, girl, girl","tags":["family","girl","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง","order":3142,"group":1,"version":2},{"shortcodes":["family_wwb"],"annotation":"family: woman, woman, boy","tags":["boy","family","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ","order":3143,"group":1,"version":2},{"shortcodes":["family_wwg"],"annotation":"family: woman, woman, girl","tags":["family","girl","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง","order":3144,"group":1,"version":2},{"shortcodes":["family_wwgb"],"annotation":"family: woman, woman, girl, boy","tags":["boy","family","girl","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","order":3145,"group":1,"version":2},{"shortcodes":["family_wwbb"],"annotation":"family: woman, woman, boy, boy","tags":["boy","family","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","order":3146,"group":1,"version":2},{"shortcodes":["family_wwgg"],"annotation":"family: woman, woman, girl, girl","tags":["family","girl","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง","order":3147,"group":1,"version":2},{"shortcodes":["family_mb"],"annotation":"family: man, boy","tags":["boy","family","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฆ","order":3148,"group":1,"version":4},{"shortcodes":["family_mbb"],"annotation":"family: man, boy, boy","tags":["boy","family","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","order":3149,"group":1,"version":4},{"shortcodes":["family_mg"],"annotation":"family: man, girl","tags":["family","girl","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘ง","order":3150,"group":1,"version":4},{"shortcodes":["family_mgb"],"annotation":"family: man, girl, boy","tags":["boy","family","girl","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","order":3151,"group":1,"version":4},{"shortcodes":["family_mgg"],"annotation":"family: man, girl, girl","tags":["family","girl","man"],"emoji":"๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง","order":3152,"group":1,"version":4},{"shortcodes":["family_wb"],"annotation":"family: woman, boy","tags":["boy","family","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฆ","order":3153,"group":1,"version":4},{"shortcodes":["family_wbb"],"annotation":"family: woman, boy, boy","tags":["boy","family","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","order":3154,"group":1,"version":4},{"shortcodes":["family_wg"],"annotation":"family: woman, girl","tags":["family","girl","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ง","order":3155,"group":1,"version":4},{"shortcodes":["family_wgb"],"annotation":"family: woman, girl, boy","tags":["boy","family","girl","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","order":3156,"group":1,"version":4},{"shortcodes":["family_wgg"],"annotation":"family: woman, girl, girl","tags":["family","girl","woman"],"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง","order":3157,"group":1,"version":4},{"shortcodes":["speaking_head"],"annotation":"speaking head","tags":["face","head","silhouette","speak","speaking"],"emoji":"๐Ÿ—ฃ๏ธ","order":3159,"group":1,"version":0.7},{"shortcodes":["bust_in_silhouette"],"annotation":"bust in silhouette","tags":["bust","silhouette"],"emoji":"๐Ÿ‘ค","order":3160,"group":1,"version":0.6},{"shortcodes":["busts_in_silhouette"],"annotation":"busts in silhouette","tags":["bust","silhouette"],"emoji":"๐Ÿ‘ฅ","order":3161,"group":1,"version":1},{"shortcodes":["people_hugging"],"annotation":"people hugging","tags":["goodbye","hello","hug","thanks"],"emoji":"๐Ÿซ‚","order":3162,"group":1,"version":13},{"shortcodes":["footprints"],"annotation":"footprints","tags":["clothing","footprint","print"],"emoji":"๐Ÿ‘ฃ","order":3163,"group":1,"version":0.6},{"shortcodes":["tone1","tone_light"],"annotation":"light skin tone","tags":["skin tone","type 1โ€“2"],"emoji":"๐Ÿป","order":3164,"group":2,"version":1},{"shortcodes":["tone2","tone_medium_light"],"annotation":"medium-light skin tone","tags":["skin tone","type 3"],"emoji":"๐Ÿผ","order":3165,"group":2,"version":1},{"shortcodes":["tone3","tone_medium"],"annotation":"medium skin tone","tags":["skin tone","type 4"],"emoji":"๐Ÿฝ","order":3166,"group":2,"version":1},{"shortcodes":["tone4","tone_medium_dark"],"annotation":"medium-dark skin tone","tags":["skin tone","type 5"],"emoji":"๐Ÿพ","order":3167,"group":2,"version":1},{"shortcodes":["tone5","tone_dark"],"annotation":"dark skin tone","tags":["skin tone","type 6"],"emoji":"๐Ÿฟ","order":3168,"group":2,"version":1},{"shortcodes":["red_hair"],"annotation":"red hair","tags":["ginger","redhead"],"emoji":"๐Ÿฆฐ","order":3169,"group":2,"version":11},{"shortcodes":["curly_hair"],"annotation":"curly hair","tags":["afro","curly","ringlets"],"emoji":"๐Ÿฆฑ","order":3170,"group":2,"version":11},{"shortcodes":["white_hair"],"annotation":"white hair","tags":["gray","hair","old","white"],"emoji":"๐Ÿฆณ","order":3171,"group":2,"version":11},{"shortcodes":["no_hair"],"annotation":"bald","tags":["chemotherapy","hairless","no hair","shaven"],"emoji":"๐Ÿฆฒ","order":3172,"group":2,"version":11},{"shortcodes":["monkey_face"],"annotation":"monkey face","tags":["face","monkey"],"emoji":"๐Ÿต","order":3173,"group":3,"version":0.6},{"shortcodes":["monkey"],"annotation":"monkey","tags":["monkey"],"emoji":"๐Ÿ’","order":3174,"group":3,"version":0.6},{"shortcodes":["gorilla"],"annotation":"gorilla","tags":["gorilla"],"emoji":"๐Ÿฆ","order":3175,"group":3,"version":3},{"shortcodes":["orangutan"],"annotation":"orangutan","tags":["ape"],"emoji":"๐Ÿฆง","order":3176,"group":3,"version":12},{"shortcodes":["dog_face"],"annotation":"dog face","tags":["dog","face","pet"],"emoji":"๐Ÿถ","order":3177,"group":3,"version":0.6},{"shortcodes":["dog"],"annotation":"dog","tags":["pet"],"emoji":"๐Ÿ•๏ธ","order":3178,"group":3,"version":0.7},{"shortcodes":["guide_dog"],"annotation":"guide dog","tags":["accessibility","blind","guide"],"emoji":"๐Ÿฆฎ","order":3179,"group":3,"version":12},{"shortcodes":["service_dog"],"annotation":"service dog","tags":["accessibility","assistance","dog","service"],"emoji":"๐Ÿ•โ€๐Ÿฆบ","order":3180,"group":3,"version":12},{"shortcodes":["poodle"],"annotation":"poodle","tags":["dog"],"emoji":"๐Ÿฉ","order":3181,"group":3,"version":0.6},{"shortcodes":["wolf","wolf_face"],"annotation":"wolf","tags":["face"],"emoji":"๐Ÿบ","order":3182,"group":3,"version":0.6},{"shortcodes":["fox","fox_face"],"annotation":"fox","tags":["face"],"emoji":"๐ŸฆŠ","order":3183,"group":3,"version":3},{"shortcodes":["raccoon"],"annotation":"raccoon","tags":["curious","sly"],"emoji":"๐Ÿฆ","order":3184,"group":3,"version":11},{"shortcodes":["cat_face"],"annotation":"cat face","tags":["cat","face","pet"],"emoji":"๐Ÿฑ","order":3185,"group":3,"version":0.6},{"shortcodes":["cat"],"annotation":"cat","tags":["pet"],"emoji":"๐Ÿˆ๏ธ","order":3186,"group":3,"version":0.7},{"shortcodes":["black_cat"],"annotation":"black cat","tags":["black","cat","unlucky"],"emoji":"๐Ÿˆโ€โฌ›","order":3187,"group":3,"version":13},{"shortcodes":["lion","lion_face"],"annotation":"lion","tags":["face","leo","zodiac"],"emoji":"๐Ÿฆ","order":3188,"group":3,"version":1},{"shortcodes":["tiger_face"],"annotation":"tiger face","tags":["face","tiger"],"emoji":"๐Ÿฏ","order":3189,"group":3,"version":0.6},{"shortcodes":["tiger"],"annotation":"tiger","tags":["tiger"],"emoji":"๐Ÿ…","order":3190,"group":3,"version":1},{"shortcodes":["leopard"],"annotation":"leopard","tags":["leopard"],"emoji":"๐Ÿ†","order":3191,"group":3,"version":1},{"shortcodes":["horse_face"],"annotation":"horse face","tags":["face","horse"],"emoji":"๐Ÿด","order":3192,"group":3,"version":0.6},{"shortcodes":["horse","racehorse"],"annotation":"horse","tags":["equestrian","racehorse","racing"],"emoji":"๐ŸŽ","order":3193,"group":3,"version":0.6},{"shortcodes":["unicorn","unicorn_face"],"annotation":"unicorn","tags":["face"],"emoji":"๐Ÿฆ„","order":3194,"group":3,"version":1},{"shortcodes":["zebra"],"annotation":"zebra","tags":["stripe"],"emoji":"๐Ÿฆ“","order":3195,"group":3,"version":5},{"shortcodes":["deer"],"annotation":"deer","tags":["deer"],"emoji":"๐ŸฆŒ","order":3196,"group":3,"version":3},{"shortcodes":["bison"],"annotation":"bison","tags":["buffalo","herd","wisent"],"emoji":"๐Ÿฆฌ","order":3197,"group":3,"version":13},{"shortcodes":["cow_face"],"annotation":"cow face","tags":["cow","face"],"emoji":"๐Ÿฎ","order":3198,"group":3,"version":0.6},{"shortcodes":["ox"],"annotation":"ox","tags":["bull","taurus","zodiac"],"emoji":"๐Ÿ‚","order":3199,"group":3,"version":1},{"shortcodes":["water_buffalo"],"annotation":"water buffalo","tags":["buffalo","water"],"emoji":"๐Ÿƒ","order":3200,"group":3,"version":1},{"shortcodes":["cow"],"annotation":"cow","tags":["cow"],"emoji":"๐Ÿ„","order":3201,"group":3,"version":1},{"shortcodes":["pig_face"],"annotation":"pig face","tags":["face","pig"],"emoji":"๐Ÿท","order":3202,"group":3,"version":0.6},{"shortcodes":["pig"],"annotation":"pig","tags":["sow"],"emoji":"๐Ÿ–","order":3203,"group":3,"version":1},{"shortcodes":["boar"],"annotation":"boar","tags":["pig"],"emoji":"๐Ÿ—","order":3204,"group":3,"version":0.6},{"shortcodes":["pig_nose"],"annotation":"pig nose","tags":["face","nose","pig"],"emoji":"๐Ÿฝ","order":3205,"group":3,"version":0.6},{"shortcodes":["ram"],"annotation":"ram","tags":["aries","male","sheep","zodiac"],"emoji":"๐Ÿ","order":3206,"group":3,"version":1},{"shortcodes":["ewe","sheep"],"annotation":"ewe","tags":["female","sheep"],"emoji":"๐Ÿ‘","order":3207,"group":3,"version":0.6},{"shortcodes":["goat"],"annotation":"goat","tags":["capricorn","zodiac"],"emoji":"๐Ÿ","order":3208,"group":3,"version":1},{"shortcodes":["dromedary_camel"],"annotation":"camel","tags":["dromedary","hump"],"emoji":"๐Ÿช","order":3209,"group":3,"version":1},{"shortcodes":["camel"],"annotation":"two-hump camel","tags":["bactrian","camel","hump"],"emoji":"๐Ÿซ","order":3210,"group":3,"version":0.6},{"shortcodes":["llama"],"annotation":"llama","tags":["alpaca","guanaco","vicuรฑa","wool"],"emoji":"๐Ÿฆ™","order":3211,"group":3,"version":11},{"shortcodes":["giraffe"],"annotation":"giraffe","tags":["spots"],"emoji":"๐Ÿฆ’","order":3212,"group":3,"version":5},{"shortcodes":["elephant"],"annotation":"elephant","tags":["elephant"],"emoji":"๐Ÿ˜","order":3213,"group":3,"version":0.6},{"shortcodes":["mammoth"],"annotation":"mammoth","tags":["extinction","large","tusk","woolly"],"emoji":"๐Ÿฆฃ","order":3214,"group":3,"version":13},{"shortcodes":["rhino","rhinoceros"],"annotation":"rhinoceros","tags":["rhinoceros"],"emoji":"๐Ÿฆ","order":3215,"group":3,"version":3},{"shortcodes":["hippo"],"annotation":"hippopotamus","tags":["hippo"],"emoji":"๐Ÿฆ›","order":3216,"group":3,"version":11},{"shortcodes":["mouse_face"],"annotation":"mouse face","tags":["face","mouse"],"emoji":"๐Ÿญ","order":3217,"group":3,"version":0.6},{"shortcodes":["mouse"],"annotation":"mouse","tags":["mouse"],"emoji":"๐Ÿ","order":3218,"group":3,"version":1},{"shortcodes":["rat"],"annotation":"rat","tags":["rat"],"emoji":"๐Ÿ€","order":3219,"group":3,"version":1},{"shortcodes":["hamster","hamster_face"],"annotation":"hamster","tags":["face","pet"],"emoji":"๐Ÿน","order":3220,"group":3,"version":0.6},{"shortcodes":["rabbit_face"],"annotation":"rabbit face","tags":["bunny","face","pet","rabbit"],"emoji":"๐Ÿฐ","order":3221,"group":3,"version":0.6},{"shortcodes":["rabbit"],"annotation":"rabbit","tags":["bunny","pet"],"emoji":"๐Ÿ‡","order":3222,"group":3,"version":1},{"shortcodes":["chipmunk"],"annotation":"chipmunk","tags":["squirrel"],"emoji":"๐Ÿฟ๏ธ","order":3224,"group":3,"version":0.7},{"shortcodes":["beaver"],"annotation":"beaver","tags":["dam"],"emoji":"๐Ÿฆซ","order":3225,"group":3,"version":13},{"shortcodes":["hedgehog"],"annotation":"hedgehog","tags":["spiny"],"emoji":"๐Ÿฆ”","order":3226,"group":3,"version":5},{"shortcodes":["bat"],"annotation":"bat","tags":["vampire"],"emoji":"๐Ÿฆ‡","order":3227,"group":3,"version":3},{"shortcodes":["bear","bear_face"],"annotation":"bear","tags":["face"],"emoji":"๐Ÿป","order":3228,"group":3,"version":0.6},{"shortcodes":["polar_bear","polar_bear_face"],"annotation":"polar bear","tags":["arctic","bear","white"],"emoji":"๐Ÿปโ€โ„๏ธ","order":3229,"group":3,"version":13},{"shortcodes":["koala","koala_face"],"annotation":"koala","tags":["face","marsupial"],"emoji":"๐Ÿจ","order":3231,"group":3,"version":0.6},{"shortcodes":["panda","panda_face"],"annotation":"panda","tags":["face"],"emoji":"๐Ÿผ","order":3232,"group":3,"version":0.6},{"shortcodes":["sloth"],"annotation":"sloth","tags":["lazy","slow"],"emoji":"๐Ÿฆฅ","order":3233,"group":3,"version":12},{"shortcodes":["otter"],"annotation":"otter","tags":["fishing","playful"],"emoji":"๐Ÿฆฆ","order":3234,"group":3,"version":12},{"shortcodes":["skunk"],"annotation":"skunk","tags":["stink"],"emoji":"๐Ÿฆจ","order":3235,"group":3,"version":12},{"shortcodes":["kangaroo"],"annotation":"kangaroo","tags":["australia","joey","jump","marsupial"],"emoji":"๐Ÿฆ˜","order":3236,"group":3,"version":11},{"shortcodes":["badger"],"annotation":"badger","tags":["honey badger","pester"],"emoji":"๐Ÿฆก","order":3237,"group":3,"version":11},{"shortcodes":["paw_prints"],"annotation":"paw prints","tags":["feet","paw","print"],"emoji":"๐Ÿพ","order":3238,"group":3,"version":0.6},{"shortcodes":["turkey"],"annotation":"turkey","tags":["bird"],"emoji":"๐Ÿฆƒ","order":3239,"group":3,"version":1},{"shortcodes":["chicken","chicken_face"],"annotation":"chicken","tags":["bird"],"emoji":"๐Ÿ”","order":3240,"group":3,"version":0.6},{"shortcodes":["rooster"],"annotation":"rooster","tags":["bird"],"emoji":"๐Ÿ“","order":3241,"group":3,"version":1},{"shortcodes":["hatching_chick"],"annotation":"hatching chick","tags":["baby","bird","chick","hatching"],"emoji":"๐Ÿฃ","order":3242,"group":3,"version":0.6},{"shortcodes":["baby_chick"],"annotation":"baby chick","tags":["baby","bird","chick"],"emoji":"๐Ÿค","order":3243,"group":3,"version":0.6},{"shortcodes":["hatched_chick"],"annotation":"front-facing baby chick","tags":["baby","bird","chick"],"emoji":"๐Ÿฅ","order":3244,"group":3,"version":0.6},{"shortcodes":["bird","bird_face"],"annotation":"bird","tags":["bird"],"emoji":"๐Ÿฆ๏ธ","order":3245,"group":3,"version":0.6},{"shortcodes":["penguin","penguin_face"],"annotation":"penguin","tags":["bird"],"emoji":"๐Ÿง","order":3246,"group":3,"version":0.6},{"shortcodes":["dove"],"annotation":"dove","tags":["bird","fly","peace"],"emoji":"๐Ÿ•Š๏ธ","order":3248,"group":3,"version":0.7},{"shortcodes":["eagle"],"annotation":"eagle","tags":["bird"],"emoji":"๐Ÿฆ…","order":3249,"group":3,"version":3},{"shortcodes":["duck"],"annotation":"duck","tags":["bird"],"emoji":"๐Ÿฆ†","order":3250,"group":3,"version":3},{"shortcodes":["swan"],"annotation":"swan","tags":["bird","cygnet","ugly duckling"],"emoji":"๐Ÿฆข","order":3251,"group":3,"version":11},{"shortcodes":["owl"],"annotation":"owl","tags":["bird","wise"],"emoji":"๐Ÿฆ‰","order":3252,"group":3,"version":3},{"shortcodes":["dodo"],"annotation":"dodo","tags":["extinction","large","mauritius"],"emoji":"๐Ÿฆค","order":3253,"group":3,"version":13},{"shortcodes":["feather"],"annotation":"feather","tags":["bird","flight","light","plumage"],"emoji":"๐Ÿชถ","order":3254,"group":3,"version":13},{"shortcodes":["flamingo"],"annotation":"flamingo","tags":["flamboyant","tropical"],"emoji":"๐Ÿฆฉ","order":3255,"group":3,"version":12},{"shortcodes":["peacock"],"annotation":"peacock","tags":["bird","ostentatious","peahen","proud"],"emoji":"๐Ÿฆš","order":3256,"group":3,"version":11},{"shortcodes":["parrot"],"annotation":"parrot","tags":["bird","pirate","talk"],"emoji":"๐Ÿฆœ","order":3257,"group":3,"version":11},{"shortcodes":["frog","frog_face"],"annotation":"frog","tags":["face"],"emoji":"๐Ÿธ","order":3258,"group":3,"version":0.6},{"shortcodes":["crocodile"],"annotation":"crocodile","tags":["crocodile"],"emoji":"๐ŸŠ","order":3259,"group":3,"version":1},{"shortcodes":["turtle"],"annotation":"turtle","tags":["terrapin","tortoise"],"emoji":"๐Ÿข","order":3260,"group":3,"version":0.6},{"shortcodes":["lizard"],"annotation":"lizard","tags":["reptile"],"emoji":"๐ŸฆŽ","order":3261,"group":3,"version":3},{"shortcodes":["snake"],"annotation":"snake","tags":["bearer","ophiuchus","serpent","zodiac"],"emoji":"๐Ÿ","order":3262,"group":3,"version":0.6},{"shortcodes":["dragon_face"],"annotation":"dragon face","tags":["dragon","face","fairy tale"],"emoji":"๐Ÿฒ","order":3263,"group":3,"version":0.6},{"shortcodes":["dragon"],"annotation":"dragon","tags":["fairy tale"],"emoji":"๐Ÿ‰","order":3264,"group":3,"version":1},{"shortcodes":["sauropod"],"annotation":"sauropod","tags":["brachiosaurus","brontosaurus","diplodocus"],"emoji":"๐Ÿฆ•","order":3265,"group":3,"version":5},{"shortcodes":["t-rex","trex"],"annotation":"T-Rex","tags":["t-rex","tyrannosaurus rex"],"emoji":"๐Ÿฆ–","order":3266,"group":3,"version":5},{"shortcodes":["spouting_whale"],"annotation":"spouting whale","tags":["face","spouting","whale"],"emoji":"๐Ÿณ","order":3267,"group":3,"version":0.6},{"shortcodes":["whale"],"annotation":"whale","tags":["whale"],"emoji":"๐Ÿ‹","order":3268,"group":3,"version":1},{"shortcodes":["dolphin"],"annotation":"dolphin","tags":["flipper"],"emoji":"๐Ÿฌ","order":3269,"group":3,"version":0.6},{"shortcodes":["seal"],"annotation":"seal","tags":["sea lion"],"emoji":"๐Ÿฆญ","order":3270,"group":3,"version":13},{"shortcodes":["fish"],"annotation":"fish","tags":["pisces","zodiac"],"emoji":"๐ŸŸ๏ธ","order":3271,"group":3,"version":0.6},{"shortcodes":["tropical_fish"],"annotation":"tropical fish","tags":["fish","tropical"],"emoji":"๐Ÿ ","order":3272,"group":3,"version":0.6},{"shortcodes":["blowfish"],"annotation":"blowfish","tags":["fish"],"emoji":"๐Ÿก","order":3273,"group":3,"version":0.6},{"shortcodes":["shark"],"annotation":"shark","tags":["fish"],"emoji":"๐Ÿฆˆ","order":3274,"group":3,"version":3},{"shortcodes":["octopus"],"annotation":"octopus","tags":["octopus"],"emoji":"๐Ÿ™","order":3275,"group":3,"version":0.6},{"shortcodes":["shell"],"annotation":"spiral shell","tags":["shell","spiral"],"emoji":"๐Ÿš","order":3276,"group":3,"version":0.6},{"shortcodes":["coral"],"annotation":"coral","tags":["ocean","reef"],"emoji":"๐Ÿชธ","order":3277,"group":3,"version":14},{"shortcodes":["snail"],"annotation":"snail","tags":["snail"],"emoji":"๐ŸŒ","order":3278,"group":3,"version":0.6},{"shortcodes":["butterfly"],"annotation":"butterfly","tags":["insect","pretty"],"emoji":"๐Ÿฆ‹","order":3279,"group":3,"version":3},{"shortcodes":["bug"],"annotation":"bug","tags":["insect"],"emoji":"๐Ÿ›","order":3280,"group":3,"version":0.6},{"shortcodes":["ant"],"annotation":"ant","tags":["insect"],"emoji":"๐Ÿœ","order":3281,"group":3,"version":0.6},{"shortcodes":["bee"],"annotation":"honeybee","tags":["bee","insect"],"emoji":"๐Ÿ","order":3282,"group":3,"version":0.6},{"shortcodes":["beetle"],"annotation":"beetle","tags":["bug","insect"],"emoji":"๐Ÿชฒ","order":3283,"group":3,"version":13},{"shortcodes":["lady_beetle"],"annotation":"lady beetle","tags":["beetle","insect","ladybird","ladybug"],"emoji":"๐Ÿž","order":3284,"group":3,"version":0.6},{"shortcodes":["cricket"],"annotation":"cricket","tags":["grasshopper"],"emoji":"๐Ÿฆ—","order":3285,"group":3,"version":5},{"shortcodes":["cockroach"],"annotation":"cockroach","tags":["insect","pest","roach"],"emoji":"๐Ÿชณ","order":3286,"group":3,"version":13},{"shortcodes":["spider"],"annotation":"spider","tags":["insect"],"emoji":"๐Ÿ•ท๏ธ","order":3288,"group":3,"version":0.7},{"shortcodes":["spider_web"],"annotation":"spider web","tags":["spider","web"],"emoji":"๐Ÿ•ธ๏ธ","order":3290,"group":3,"version":0.7},{"shortcodes":["scorpion"],"annotation":"scorpion","tags":["scorpio","zodiac"],"emoji":"๐Ÿฆ‚","order":3291,"group":3,"version":1},{"shortcodes":["mosquito"],"annotation":"mosquito","tags":["disease","fever","malaria","pest","virus"],"emoji":"๐ŸฆŸ","order":3292,"group":3,"version":11},{"shortcodes":["fly"],"annotation":"fly","tags":["disease","maggot","pest","rotting"],"emoji":"๐Ÿชฐ","order":3293,"group":3,"version":13},{"shortcodes":["worm"],"annotation":"worm","tags":["annelid","earthworm","parasite"],"emoji":"๐Ÿชฑ","order":3294,"group":3,"version":13},{"shortcodes":["microbe"],"annotation":"microbe","tags":["amoeba","bacteria","virus"],"emoji":"๐Ÿฆ ","order":3295,"group":3,"version":11},{"shortcodes":["bouquet"],"annotation":"bouquet","tags":["flower"],"emoji":"๐Ÿ’","order":3296,"group":3,"version":0.6},{"shortcodes":["cherry_blossom"],"annotation":"cherry blossom","tags":["blossom","cherry","flower"],"emoji":"๐ŸŒธ","order":3297,"group":3,"version":0.6},{"shortcodes":["white_flower"],"annotation":"white flower","tags":["flower"],"emoji":"๐Ÿ’ฎ","order":3298,"group":3,"version":0.6},{"shortcodes":["lotus"],"annotation":"lotus","tags":["buddhism","flower","hinduism","india","purity","vietnam"],"emoji":"๐Ÿชท","order":3299,"group":3,"version":14},{"shortcodes":["rosette"],"annotation":"rosette","tags":["plant"],"emoji":"๐Ÿต๏ธ","order":3301,"group":3,"version":0.7},{"shortcodes":["rose"],"annotation":"rose","tags":["flower"],"emoji":"๐ŸŒน","order":3302,"group":3,"version":0.6},{"shortcodes":["wilted_flower"],"annotation":"wilted flower","tags":["flower","wilted"],"emoji":"๐Ÿฅ€","order":3303,"group":3,"version":3},{"shortcodes":["hibiscus"],"annotation":"hibiscus","tags":["flower"],"emoji":"๐ŸŒบ","order":3304,"group":3,"version":0.6},{"shortcodes":["sunflower"],"annotation":"sunflower","tags":["flower","sun"],"emoji":"๐ŸŒป","order":3305,"group":3,"version":0.6},{"shortcodes":["blossom"],"annotation":"blossom","tags":["flower"],"emoji":"๐ŸŒผ","order":3306,"group":3,"version":0.6},{"shortcodes":["tulip"],"annotation":"tulip","tags":["flower"],"emoji":"๐ŸŒท","order":3307,"group":3,"version":0.6},{"shortcodes":["seedling"],"annotation":"seedling","tags":["young"],"emoji":"๐ŸŒฑ","order":3308,"group":3,"version":0.6},{"shortcodes":["potted_plant"],"annotation":"potted plant","tags":["boring","grow","house","nurturing","plant","useless"],"emoji":"๐Ÿชด","order":3309,"group":3,"version":13},{"shortcodes":["evergreen_tree"],"annotation":"evergreen tree","tags":["tree"],"emoji":"๐ŸŒฒ","order":3310,"group":3,"version":1},{"shortcodes":["deciduous_tree"],"annotation":"deciduous tree","tags":["deciduous","shedding","tree"],"emoji":"๐ŸŒณ","order":3311,"group":3,"version":1},{"shortcodes":["palm_tree"],"annotation":"palm tree","tags":["palm","tree"],"emoji":"๐ŸŒด","order":3312,"group":3,"version":0.6},{"shortcodes":["cactus"],"annotation":"cactus","tags":["plant"],"emoji":"๐ŸŒต","order":3313,"group":3,"version":0.6},{"shortcodes":["ear_of_rice","sheaf_of_rice"],"annotation":"sheaf of rice","tags":["ear","grain","rice"],"emoji":"๐ŸŒพ","order":3314,"group":3,"version":0.6},{"shortcodes":["herb"],"annotation":"herb","tags":["leaf"],"emoji":"๐ŸŒฟ","order":3315,"group":3,"version":0.6},{"shortcodes":["shamrock"],"annotation":"shamrock","tags":["plant"],"emoji":"โ˜˜๏ธ","order":3317,"group":3,"version":1},{"shortcodes":["four_leaf_clover"],"annotation":"four leaf clover","tags":["4","clover","four","four-leaf clover","leaf"],"emoji":"๐Ÿ€","order":3318,"group":3,"version":0.6},{"shortcodes":["maple_leaf"],"annotation":"maple leaf","tags":["falling","leaf","maple"],"emoji":"๐Ÿ","order":3319,"group":3,"version":0.6},{"shortcodes":["fallen_leaf"],"annotation":"fallen leaf","tags":["falling","leaf"],"emoji":"๐Ÿ‚","order":3320,"group":3,"version":0.6},{"shortcodes":["leaves"],"annotation":"leaf fluttering in wind","tags":["blow","flutter","leaf","wind"],"emoji":"๐Ÿƒ","order":3321,"group":3,"version":0.6},{"shortcodes":["empty_nest","nest"],"annotation":"empty nest","tags":["nesting"],"emoji":"๐Ÿชน","order":3322,"group":3,"version":14},{"shortcodes":["nest_with_eggs"],"annotation":"nest with eggs","tags":["nesting"],"emoji":"๐Ÿชบ","order":3323,"group":3,"version":14},{"shortcodes":["grapes"],"annotation":"grapes","tags":["fruit","grape"],"emoji":"๐Ÿ‡","order":3324,"group":4,"version":0.6},{"shortcodes":["melon"],"annotation":"melon","tags":["fruit"],"emoji":"๐Ÿˆ","order":3325,"group":4,"version":0.6},{"shortcodes":["watermelon"],"annotation":"watermelon","tags":["fruit"],"emoji":"๐Ÿ‰","order":3326,"group":4,"version":0.6},{"shortcodes":["orange","tangerine"],"annotation":"tangerine","tags":["fruit","orange"],"emoji":"๐ŸŠ","order":3327,"group":4,"version":0.6},{"shortcodes":["lemon"],"annotation":"lemon","tags":["citrus","fruit"],"emoji":"๐Ÿ‹","order":3328,"group":4,"version":1},{"shortcodes":["banana"],"annotation":"banana","tags":["fruit"],"emoji":"๐ŸŒ","order":3329,"group":4,"version":0.6},{"shortcodes":["pineapple"],"annotation":"pineapple","tags":["fruit"],"emoji":"๐Ÿ","order":3330,"group":4,"version":0.6},{"shortcodes":["mango"],"annotation":"mango","tags":["fruit","tropical"],"emoji":"๐Ÿฅญ","order":3331,"group":4,"version":11},{"shortcodes":["apple","red_apple"],"annotation":"red apple","tags":["apple","fruit","red"],"emoji":"๐ŸŽ","order":3332,"group":4,"version":0.6},{"shortcodes":["green_apple"],"annotation":"green apple","tags":["apple","fruit","green"],"emoji":"๐Ÿ","order":3333,"group":4,"version":0.6},{"shortcodes":["pear"],"annotation":"pear","tags":["fruit"],"emoji":"๐Ÿ","order":3334,"group":4,"version":1},{"shortcodes":["peach"],"annotation":"peach","tags":["fruit"],"emoji":"๐Ÿ‘","order":3335,"group":4,"version":0.6},{"shortcodes":["cherries"],"annotation":"cherries","tags":["berries","cherry","fruit","red"],"emoji":"๐Ÿ’","order":3336,"group":4,"version":0.6},{"shortcodes":["strawberry"],"annotation":"strawberry","tags":["berry","fruit"],"emoji":"๐Ÿ“","order":3337,"group":4,"version":0.6},{"shortcodes":["blueberries"],"annotation":"blueberries","tags":["berry","bilberry","blue","blueberry"],"emoji":"๐Ÿซ","order":3338,"group":4,"version":13},{"shortcodes":["kiwi"],"annotation":"kiwi fruit","tags":["food","fruit","kiwi"],"emoji":"๐Ÿฅ","order":3339,"group":4,"version":3},{"shortcodes":["tomato"],"annotation":"tomato","tags":["fruit","vegetable"],"emoji":"๐Ÿ…","order":3340,"group":4,"version":0.6},{"shortcodes":["olive"],"annotation":"olive","tags":["food"],"emoji":"๐Ÿซ’","order":3341,"group":4,"version":13},{"shortcodes":["coconut"],"annotation":"coconut","tags":["palm","piรฑa colada"],"emoji":"๐Ÿฅฅ","order":3342,"group":4,"version":5},{"shortcodes":["avocado"],"annotation":"avocado","tags":["food","fruit"],"emoji":"๐Ÿฅ‘","order":3343,"group":4,"version":3},{"shortcodes":["eggplant"],"annotation":"eggplant","tags":["aubergine","vegetable"],"emoji":"๐Ÿ†","order":3344,"group":4,"version":0.6},{"shortcodes":["potato"],"annotation":"potato","tags":["food","vegetable"],"emoji":"๐Ÿฅ”","order":3345,"group":4,"version":3},{"shortcodes":["carrot"],"annotation":"carrot","tags":["food","vegetable"],"emoji":"๐Ÿฅ•","order":3346,"group":4,"version":3},{"shortcodes":["corn","ear_of_corn"],"annotation":"ear of corn","tags":["corn","ear","maize","maze"],"emoji":"๐ŸŒฝ","order":3347,"group":4,"version":0.6},{"shortcodes":["hot_pepper"],"annotation":"hot pepper","tags":["hot","pepper"],"emoji":"๐ŸŒถ๏ธ","order":3349,"group":4,"version":0.7},{"shortcodes":["bell_pepper"],"annotation":"bell pepper","tags":["capsicum","pepper","vegetable"],"emoji":"๐Ÿซ‘","order":3350,"group":4,"version":13},{"shortcodes":["cucumber"],"annotation":"cucumber","tags":["food","pickle","vegetable"],"emoji":"๐Ÿฅ’","order":3351,"group":4,"version":3},{"shortcodes":["leafy_green"],"annotation":"leafy green","tags":["bok choy","cabbage","kale","lettuce"],"emoji":"๐Ÿฅฌ","order":3352,"group":4,"version":11},{"shortcodes":["broccoli"],"annotation":"broccoli","tags":["wild cabbage"],"emoji":"๐Ÿฅฆ","order":3353,"group":4,"version":5},{"shortcodes":["garlic"],"annotation":"garlic","tags":["flavoring"],"emoji":"๐Ÿง„","order":3354,"group":4,"version":12},{"shortcodes":["onion"],"annotation":"onion","tags":["flavoring"],"emoji":"๐Ÿง…","order":3355,"group":4,"version":12},{"shortcodes":["mushroom"],"annotation":"mushroom","tags":["toadstool"],"emoji":"๐Ÿ„","order":3356,"group":4,"version":0.6},{"shortcodes":["peanuts"],"annotation":"peanuts","tags":["food","nut","peanut","vegetable"],"emoji":"๐Ÿฅœ","order":3357,"group":4,"version":3},{"shortcodes":["beans"],"annotation":"beans","tags":["food","kidney","legume"],"emoji":"๐Ÿซ˜","order":3358,"group":4,"version":14},{"shortcodes":["chestnut"],"annotation":"chestnut","tags":["plant"],"emoji":"๐ŸŒฐ","order":3359,"group":4,"version":0.6},{"shortcodes":["bread"],"annotation":"bread","tags":["loaf"],"emoji":"๐Ÿž","order":3360,"group":4,"version":0.6},{"shortcodes":["croissant"],"annotation":"croissant","tags":["bread","breakfast","food","french","roll"],"emoji":"๐Ÿฅ","order":3361,"group":4,"version":3},{"shortcodes":["baguette_bread"],"annotation":"baguette bread","tags":["baguette","bread","food","french"],"emoji":"๐Ÿฅ–","order":3362,"group":4,"version":3},{"shortcodes":["flatbread"],"annotation":"flatbread","tags":["arepa","lavash","naan","pita"],"emoji":"๐Ÿซ“","order":3363,"group":4,"version":13},{"shortcodes":["pretzel"],"annotation":"pretzel","tags":["twisted"],"emoji":"๐Ÿฅจ","order":3364,"group":4,"version":5},{"shortcodes":["bagel"],"annotation":"bagel","tags":["bakery","breakfast","schmear"],"emoji":"๐Ÿฅฏ","order":3365,"group":4,"version":11},{"shortcodes":["pancakes"],"annotation":"pancakes","tags":["breakfast","crรชpe","food","hotcake","pancake"],"emoji":"๐Ÿฅž","order":3366,"group":4,"version":3},{"shortcodes":["waffle"],"annotation":"waffle","tags":["breakfast","indecisive","iron"],"emoji":"๐Ÿง‡","order":3367,"group":4,"version":12},{"shortcodes":["cheese"],"annotation":"cheese wedge","tags":["cheese"],"emoji":"๐Ÿง€","order":3368,"group":4,"version":1},{"shortcodes":["meat_on_bone"],"annotation":"meat on bone","tags":["bone","meat"],"emoji":"๐Ÿ–","order":3369,"group":4,"version":0.6},{"shortcodes":["poultry_leg"],"annotation":"poultry leg","tags":["bone","chicken","drumstick","leg","poultry"],"emoji":"๐Ÿ—","order":3370,"group":4,"version":0.6},{"shortcodes":["cut_of_meat"],"annotation":"cut of meat","tags":["chop","lambchop","porkchop","steak"],"emoji":"๐Ÿฅฉ","order":3371,"group":4,"version":5},{"shortcodes":["bacon"],"annotation":"bacon","tags":["breakfast","food","meat"],"emoji":"๐Ÿฅ“","order":3372,"group":4,"version":3},{"shortcodes":["hamburger"],"annotation":"hamburger","tags":["burger"],"emoji":"๐Ÿ”","order":3373,"group":4,"version":0.6},{"shortcodes":["french_fries","fries"],"annotation":"french fries","tags":["french","fries"],"emoji":"๐ŸŸ","order":3374,"group":4,"version":0.6},{"shortcodes":["pizza"],"annotation":"pizza","tags":["cheese","slice"],"emoji":"๐Ÿ•","order":3375,"group":4,"version":0.6},{"shortcodes":["hotdog"],"annotation":"hot dog","tags":["frankfurter","hotdog","sausage"],"emoji":"๐ŸŒญ","order":3376,"group":4,"version":1},{"shortcodes":["sandwich"],"annotation":"sandwich","tags":["bread"],"emoji":"๐Ÿฅช","order":3377,"group":4,"version":5},{"shortcodes":["taco"],"annotation":"taco","tags":["mexican"],"emoji":"๐ŸŒฎ","order":3378,"group":4,"version":1},{"shortcodes":["burrito"],"annotation":"burrito","tags":["mexican","wrap"],"emoji":"๐ŸŒฏ","order":3379,"group":4,"version":1},{"shortcodes":["tamale"],"annotation":"tamale","tags":["mexican","wrapped"],"emoji":"๐Ÿซ”","order":3380,"group":4,"version":13},{"shortcodes":["stuffed_flatbread"],"annotation":"stuffed flatbread","tags":["falafel","flatbread","food","gyro","kebab","stuffed"],"emoji":"๐Ÿฅ™","order":3381,"group":4,"version":3},{"shortcodes":["falafel"],"annotation":"falafel","tags":["chickpea","meatball"],"emoji":"๐Ÿง†","order":3382,"group":4,"version":12},{"shortcodes":["egg"],"annotation":"egg","tags":["breakfast","food"],"emoji":"๐Ÿฅš","order":3383,"group":4,"version":3},{"shortcodes":["cooking","fried_egg"],"annotation":"cooking","tags":["breakfast","egg","frying","pan"],"emoji":"๐Ÿณ","order":3384,"group":4,"version":0.6},{"shortcodes":["shallow_pan_of_food"],"annotation":"shallow pan of food","tags":["casserole","food","paella","pan","shallow"],"emoji":"๐Ÿฅ˜","order":3385,"group":4,"version":3},{"shortcodes":["pot_of_food","stew"],"annotation":"pot of food","tags":["pot","stew"],"emoji":"๐Ÿฒ","order":3386,"group":4,"version":0.6},{"shortcodes":["fondue"],"annotation":"fondue","tags":["cheese","chocolate","melted","pot","swiss"],"emoji":"๐Ÿซ•","order":3387,"group":4,"version":13},{"shortcodes":["bowl_with_spoon"],"annotation":"bowl with spoon","tags":["breakfast","cereal","congee"],"emoji":"๐Ÿฅฃ","order":3388,"group":4,"version":5},{"shortcodes":["green_salad","salad"],"annotation":"green salad","tags":["food","green","salad"],"emoji":"๐Ÿฅ—","order":3389,"group":4,"version":3},{"shortcodes":["popcorn"],"annotation":"popcorn","tags":["popcorn"],"emoji":"๐Ÿฟ","order":3390,"group":4,"version":1},{"shortcodes":["butter"],"annotation":"butter","tags":["dairy"],"emoji":"๐Ÿงˆ","order":3391,"group":4,"version":12},{"shortcodes":["salt"],"annotation":"salt","tags":["condiment","shaker"],"emoji":"๐Ÿง‚","order":3392,"group":4,"version":11},{"shortcodes":["canned_food"],"annotation":"canned food","tags":["can"],"emoji":"๐Ÿฅซ","order":3393,"group":4,"version":5},{"shortcodes":["bento","bento_box"],"annotation":"bento box","tags":["bento","box"],"emoji":"๐Ÿฑ","order":3394,"group":4,"version":0.6},{"shortcodes":["rice_cracker"],"annotation":"rice cracker","tags":["cracker","rice"],"emoji":"๐Ÿ˜","order":3395,"group":4,"version":0.6},{"shortcodes":["rice_ball"],"annotation":"rice ball","tags":["ball","japanese","rice"],"emoji":"๐Ÿ™","order":3396,"group":4,"version":0.6},{"shortcodes":["cooked_rice","rice"],"annotation":"cooked rice","tags":["cooked","rice"],"emoji":"๐Ÿš","order":3397,"group":4,"version":0.6},{"shortcodes":["curry","curry_rice"],"annotation":"curry rice","tags":["curry","rice"],"emoji":"๐Ÿ›","order":3398,"group":4,"version":0.6},{"shortcodes":["ramen","steaming_bowl"],"annotation":"steaming bowl","tags":["bowl","noodle","ramen","steaming"],"emoji":"๐Ÿœ","order":3399,"group":4,"version":0.6},{"shortcodes":["spaghetti"],"annotation":"spaghetti","tags":["pasta"],"emoji":"๐Ÿ","order":3400,"group":4,"version":0.6},{"shortcodes":["sweet_potato"],"annotation":"roasted sweet potato","tags":["potato","roasted","sweet"],"emoji":"๐Ÿ ","order":3401,"group":4,"version":0.6},{"shortcodes":["oden"],"annotation":"oden","tags":["kebab","seafood","skewer","stick"],"emoji":"๐Ÿข","order":3402,"group":4,"version":0.6},{"shortcodes":["sushi"],"annotation":"sushi","tags":["sushi"],"emoji":"๐Ÿฃ","order":3403,"group":4,"version":0.6},{"shortcodes":["fried_shrimp"],"annotation":"fried shrimp","tags":["fried","prawn","shrimp","tempura"],"emoji":"๐Ÿค","order":3404,"group":4,"version":0.6},{"shortcodes":["fish_cake"],"annotation":"fish cake with swirl","tags":["cake","fish","pastry","swirl"],"emoji":"๐Ÿฅ","order":3405,"group":4,"version":0.6},{"shortcodes":["moon_cake"],"annotation":"moon cake","tags":["autumn","festival","yuรจbวng"],"emoji":"๐Ÿฅฎ","order":3406,"group":4,"version":11},{"shortcodes":["dango"],"annotation":"dango","tags":["dessert","japanese","skewer","stick","sweet"],"emoji":"๐Ÿก","order":3407,"group":4,"version":0.6},{"shortcodes":["dumpling"],"annotation":"dumpling","tags":["empanada","gyลza","jiaozi","pierogi","potsticker"],"emoji":"๐ŸฅŸ","order":3408,"group":4,"version":5},{"shortcodes":["fortune_cookie"],"annotation":"fortune cookie","tags":["prophecy"],"emoji":"๐Ÿฅ ","order":3409,"group":4,"version":5},{"shortcodes":["takeout_box"],"annotation":"takeout box","tags":["oyster pail"],"emoji":"๐Ÿฅก","order":3410,"group":4,"version":5},{"shortcodes":["crab"],"annotation":"crab","tags":["cancer","zodiac"],"emoji":"๐Ÿฆ€","order":3411,"group":4,"version":1},{"shortcodes":["lobster"],"annotation":"lobster","tags":["bisque","claws","seafood"],"emoji":"๐Ÿฆž","order":3412,"group":4,"version":11},{"shortcodes":["shrimp"],"annotation":"shrimp","tags":["food","shellfish","small"],"emoji":"๐Ÿฆ","order":3413,"group":4,"version":3},{"shortcodes":["squid"],"annotation":"squid","tags":["food","molusc"],"emoji":"๐Ÿฆ‘","order":3414,"group":4,"version":3},{"shortcodes":["oyster"],"annotation":"oyster","tags":["diving","pearl"],"emoji":"๐Ÿฆช","order":3415,"group":4,"version":12},{"shortcodes":["icecream","soft_serve"],"annotation":"soft ice cream","tags":["cream","dessert","ice","icecream","soft","sweet"],"emoji":"๐Ÿฆ","order":3416,"group":4,"version":0.6},{"shortcodes":["shaved_ice"],"annotation":"shaved ice","tags":["dessert","ice","shaved","sweet"],"emoji":"๐Ÿง","order":3417,"group":4,"version":0.6},{"shortcodes":["ice_cream"],"annotation":"ice cream","tags":["cream","dessert","ice","sweet"],"emoji":"๐Ÿจ","order":3418,"group":4,"version":0.6},{"shortcodes":["doughnut"],"annotation":"doughnut","tags":["breakfast","dessert","donut","sweet"],"emoji":"๐Ÿฉ","order":3419,"group":4,"version":0.6},{"shortcodes":["cookie"],"annotation":"cookie","tags":["dessert","sweet"],"emoji":"๐Ÿช","order":3420,"group":4,"version":0.6},{"shortcodes":["birthday","birthday_cake"],"annotation":"birthday cake","tags":["birthday","cake","celebration","dessert","pastry","sweet"],"emoji":"๐ŸŽ‚","order":3421,"group":4,"version":0.6},{"shortcodes":["cake","shortcake"],"annotation":"shortcake","tags":["cake","dessert","pastry","slice","sweet"],"emoji":"๐Ÿฐ","order":3422,"group":4,"version":0.6},{"shortcodes":["cupcake"],"annotation":"cupcake","tags":["bakery","sweet"],"emoji":"๐Ÿง","order":3423,"group":4,"version":11},{"shortcodes":["pie"],"annotation":"pie","tags":["filling","pastry"],"emoji":"๐Ÿฅง","order":3424,"group":4,"version":5},{"shortcodes":["chocolate_bar"],"annotation":"chocolate bar","tags":["bar","chocolate","dessert","sweet"],"emoji":"๐Ÿซ","order":3425,"group":4,"version":0.6},{"shortcodes":["candy"],"annotation":"candy","tags":["dessert","sweet"],"emoji":"๐Ÿฌ","order":3426,"group":4,"version":0.6},{"shortcodes":["lollipop"],"annotation":"lollipop","tags":["candy","dessert","sweet"],"emoji":"๐Ÿญ","order":3427,"group":4,"version":0.6},{"shortcodes":["custard"],"annotation":"custard","tags":["dessert","pudding","sweet"],"emoji":"๐Ÿฎ","order":3428,"group":4,"version":0.6},{"shortcodes":["honey_pot"],"annotation":"honey pot","tags":["honey","honeypot","pot","sweet"],"emoji":"๐Ÿฏ","order":3429,"group":4,"version":0.6},{"shortcodes":["baby_bottle"],"annotation":"baby bottle","tags":["baby","bottle","drink","milk"],"emoji":"๐Ÿผ","order":3430,"group":4,"version":1},{"shortcodes":["glass_of_milk","milk"],"annotation":"glass of milk","tags":["drink","glass","milk"],"emoji":"๐Ÿฅ›","order":3431,"group":4,"version":3},{"shortcodes":["coffee"],"annotation":"hot beverage","tags":["beverage","coffee","drink","hot","steaming","tea"],"emoji":"โ˜•๏ธ","order":3432,"group":4,"version":0.6},{"shortcodes":["teapot"],"annotation":"teapot","tags":["drink","pot","tea"],"emoji":"๐Ÿซ–","order":3433,"group":4,"version":13},{"shortcodes":["tea"],"annotation":"teacup without handle","tags":["beverage","cup","drink","tea","teacup"],"emoji":"๐Ÿต","order":3434,"group":4,"version":0.6},{"shortcodes":["sake"],"annotation":"sake","tags":["bar","beverage","bottle","cup","drink"],"emoji":"๐Ÿถ","order":3435,"group":4,"version":0.6},{"shortcodes":["champagne"],"annotation":"bottle with popping cork","tags":["bar","bottle","cork","drink","popping"],"emoji":"๐Ÿพ","order":3436,"group":4,"version":1},{"shortcodes":["wine_glass"],"annotation":"wine glass","tags":["bar","beverage","drink","glass","wine"],"emoji":"๐Ÿท","order":3437,"group":4,"version":0.6},{"shortcodes":["cocktail"],"annotation":"cocktail glass","tags":["bar","cocktail","drink","glass"],"emoji":"๐Ÿธ๏ธ","order":3438,"group":4,"version":0.6},{"shortcodes":["tropical_drink"],"annotation":"tropical drink","tags":["bar","drink","tropical"],"emoji":"๐Ÿน","order":3439,"group":4,"version":0.6},{"shortcodes":["beer"],"annotation":"beer mug","tags":["bar","beer","drink","mug"],"emoji":"๐Ÿบ","order":3440,"group":4,"version":0.6},{"shortcodes":["beers"],"annotation":"clinking beer mugs","tags":["bar","beer","clink","drink","mug"],"emoji":"๐Ÿป","order":3441,"group":4,"version":0.6},{"shortcodes":["clinking_glasses"],"annotation":"clinking glasses","tags":["celebrate","clink","drink","glass"],"emoji":"๐Ÿฅ‚","order":3442,"group":4,"version":3},{"shortcodes":["tumbler_glass","whisky"],"annotation":"tumbler glass","tags":["glass","liquor","shot","tumbler","whisky"],"emoji":"๐Ÿฅƒ","order":3443,"group":4,"version":3},{"shortcodes":["pour","pouring_liquid"],"annotation":"pouring liquid","tags":["drink","empty","glass","spill"],"emoji":"๐Ÿซ—","order":3444,"group":4,"version":14},{"shortcodes":["cup_with_straw"],"annotation":"cup with straw","tags":["juice","soda"],"emoji":"๐Ÿฅค","order":3445,"group":4,"version":5},{"shortcodes":["boba_drink","bubble_tea"],"annotation":"bubble tea","tags":["bubble","milk","pearl","tea"],"emoji":"๐Ÿง‹","order":3446,"group":4,"version":13},{"shortcodes":["beverage_box","juice_box"],"annotation":"beverage box","tags":["beverage","box","juice","straw","sweet"],"emoji":"๐Ÿงƒ","order":3447,"group":4,"version":12},{"shortcodes":["mate"],"annotation":"mate","tags":["drink"],"emoji":"๐Ÿง‰","order":3448,"group":4,"version":12},{"shortcodes":["ice","ice_cube"],"annotation":"ice","tags":["cold","ice cube","iceberg"],"emoji":"๐ŸงŠ","order":3449,"group":4,"version":12},{"shortcodes":["chopsticks"],"annotation":"chopsticks","tags":["hashi"],"emoji":"๐Ÿฅข","order":3450,"group":4,"version":5},{"shortcodes":["fork_knife_plate"],"annotation":"fork and knife with plate","tags":["cooking","fork","knife","plate"],"emoji":"๐Ÿฝ๏ธ","order":3452,"group":4,"version":0.7},{"shortcodes":["fork_and_knife"],"annotation":"fork and knife","tags":["cooking","cutlery","fork","knife"],"emoji":"๐Ÿด","order":3453,"group":4,"version":0.6},{"shortcodes":["spoon"],"annotation":"spoon","tags":["tableware"],"emoji":"๐Ÿฅ„","order":3454,"group":4,"version":3},{"shortcodes":["knife"],"annotation":"kitchen knife","tags":["cooking","hocho","knife","tool","weapon"],"emoji":"๐Ÿ”ช","order":3455,"group":4,"version":0.6},{"shortcodes":["jar"],"annotation":"jar","tags":["condiment","container","empty","sauce","store"],"emoji":"๐Ÿซ™","order":3456,"group":4,"version":14},{"shortcodes":["amphora"],"annotation":"amphora","tags":["aquarius","cooking","drink","jug","zodiac"],"emoji":"๐Ÿบ","order":3457,"group":4,"version":1},{"shortcodes":["earth_africa","earth_europe"],"annotation":"globe showing Europe-Africa","tags":["africa","earth","europe","globe","globe showing europe-africa","world"],"emoji":"๐ŸŒ๏ธ","order":3458,"group":5,"version":0.7},{"shortcodes":["earth_americas"],"annotation":"globe showing Americas","tags":["americas","earth","globe","globe showing americas","world"],"emoji":"๐ŸŒŽ๏ธ","order":3459,"group":5,"version":0.7},{"shortcodes":["earth_asia"],"annotation":"globe showing Asia-Australia","tags":["asia","australia","earth","globe","globe showing asia-australia","world"],"emoji":"๐ŸŒ๏ธ","order":3460,"group":5,"version":0.6},{"shortcodes":["globe_with_meridians"],"annotation":"globe with meridians","tags":["earth","globe","meridians","world"],"emoji":"๐ŸŒ","order":3461,"group":5,"version":1},{"shortcodes":["world_map"],"annotation":"world map","tags":["map","world"],"emoji":"๐Ÿ—บ๏ธ","order":3463,"group":5,"version":0.7},{"shortcodes":["japan_map"],"annotation":"map of Japan","tags":["japan","map","map of japan"],"emoji":"๐Ÿ—พ","order":3464,"group":5,"version":0.6},{"shortcodes":["compass"],"annotation":"compass","tags":["magnetic","navigation","orienteering"],"emoji":"๐Ÿงญ","order":3465,"group":5,"version":11},{"shortcodes":["mountain_snow"],"annotation":"snow-capped mountain","tags":["cold","mountain","snow"],"emoji":"๐Ÿ”๏ธ","order":3467,"group":5,"version":0.7},{"shortcodes":["mountain"],"annotation":"mountain","tags":["mountain"],"emoji":"โ›ฐ๏ธ","order":3469,"group":5,"version":0.7},{"shortcodes":["volcano"],"annotation":"volcano","tags":["eruption","mountain"],"emoji":"๐ŸŒ‹","order":3470,"group":5,"version":0.6},{"shortcodes":["mount_fuji"],"annotation":"mount fuji","tags":["fuji","mountain"],"emoji":"๐Ÿ—ป","order":3471,"group":5,"version":0.6},{"shortcodes":["camping"],"annotation":"camping","tags":["camping"],"emoji":"๐Ÿ•๏ธ","order":3473,"group":5,"version":0.7},{"shortcodes":["beach","beach_with_umbrella"],"annotation":"beach with umbrella","tags":["beach","umbrella"],"emoji":"๐Ÿ–๏ธ","order":3475,"group":5,"version":0.7},{"shortcodes":["desert"],"annotation":"desert","tags":["desert"],"emoji":"๐Ÿœ๏ธ","order":3477,"group":5,"version":0.7},{"shortcodes":["desert_island","island"],"annotation":"desert island","tags":["desert","island"],"emoji":"๐Ÿ๏ธ","order":3479,"group":5,"version":0.7},{"shortcodes":["national_park"],"annotation":"national park","tags":["park"],"emoji":"๐Ÿž๏ธ","order":3481,"group":5,"version":0.7},{"shortcodes":["stadium"],"annotation":"stadium","tags":["stadium"],"emoji":"๐ŸŸ๏ธ","order":3483,"group":5,"version":0.7},{"shortcodes":["classical_building"],"annotation":"classical building","tags":["classical"],"emoji":"๐Ÿ›๏ธ","order":3485,"group":5,"version":0.7},{"shortcodes":["building_construction","construction_site"],"annotation":"building construction","tags":["construction"],"emoji":"๐Ÿ—๏ธ","order":3487,"group":5,"version":0.7},{"shortcodes":["bricks"],"annotation":"brick","tags":["bricks","clay","mortar","wall"],"emoji":"๐Ÿงฑ","order":3488,"group":5,"version":11},{"shortcodes":["rock"],"annotation":"rock","tags":["boulder","heavy","solid","stone"],"emoji":"๐Ÿชจ","order":3489,"group":5,"version":13},{"shortcodes":["wood"],"annotation":"wood","tags":["log","lumber","timber"],"emoji":"๐Ÿชต","order":3490,"group":5,"version":13},{"shortcodes":["hut"],"annotation":"hut","tags":["house","roundhouse","yurt"],"emoji":"๐Ÿ›–","order":3491,"group":5,"version":13},{"shortcodes":["homes","houses"],"annotation":"houses","tags":["houses"],"emoji":"๐Ÿ˜๏ธ","order":3493,"group":5,"version":0.7},{"shortcodes":["derelict_house","house_abandoned"],"annotation":"derelict house","tags":["derelict","house"],"emoji":"๐Ÿš๏ธ","order":3495,"group":5,"version":0.7},{"shortcodes":["house"],"annotation":"house","tags":["home"],"emoji":"๐Ÿ ๏ธ","order":3496,"group":5,"version":0.6},{"shortcodes":["house_with_garden"],"annotation":"house with garden","tags":["garden","home","house"],"emoji":"๐Ÿก","order":3497,"group":5,"version":0.6},{"shortcodes":["office"],"annotation":"office building","tags":["building"],"emoji":"๐Ÿข","order":3498,"group":5,"version":0.6},{"shortcodes":["post_office"],"annotation":"Japanese post office","tags":["japanese","japanese post office","post"],"emoji":"๐Ÿฃ","order":3499,"group":5,"version":0.6},{"shortcodes":["european_post_office"],"annotation":"post office","tags":["european","post"],"emoji":"๐Ÿค","order":3500,"group":5,"version":1},{"shortcodes":["hospital"],"annotation":"hospital","tags":["doctor","medicine"],"emoji":"๐Ÿฅ","order":3501,"group":5,"version":0.6},{"shortcodes":["bank"],"annotation":"bank","tags":["building"],"emoji":"๐Ÿฆ","order":3502,"group":5,"version":0.6},{"shortcodes":["hotel"],"annotation":"hotel","tags":["building"],"emoji":"๐Ÿจ","order":3503,"group":5,"version":0.6},{"shortcodes":["love_hotel"],"annotation":"love hotel","tags":["hotel","love"],"emoji":"๐Ÿฉ","order":3504,"group":5,"version":0.6},{"shortcodes":["convenience_store"],"annotation":"convenience store","tags":["convenience","store"],"emoji":"๐Ÿช","order":3505,"group":5,"version":0.6},{"shortcodes":["school"],"annotation":"school","tags":["building"],"emoji":"๐Ÿซ","order":3506,"group":5,"version":0.6},{"shortcodes":["department_store"],"annotation":"department store","tags":["department","store"],"emoji":"๐Ÿฌ","order":3507,"group":5,"version":0.6},{"shortcodes":["factory"],"annotation":"factory","tags":["building"],"emoji":"๐Ÿญ๏ธ","order":3508,"group":5,"version":0.6},{"shortcodes":["japanese_castle"],"annotation":"Japanese castle","tags":["castle","japanese"],"emoji":"๐Ÿฏ","order":3509,"group":5,"version":0.6},{"shortcodes":["castle","european_castle"],"annotation":"castle","tags":["european"],"emoji":"๐Ÿฐ","order":3510,"group":5,"version":0.6},{"shortcodes":["wedding"],"annotation":"wedding","tags":["chapel","romance"],"emoji":"๐Ÿ’’","order":3511,"group":5,"version":0.6},{"shortcodes":["tokyo_tower"],"annotation":"Tokyo tower","tags":["tokyo","tower"],"emoji":"๐Ÿ—ผ","order":3512,"group":5,"version":0.6},{"shortcodes":["statue_of_liberty"],"annotation":"Statue of Liberty","tags":["liberty","statue","statue of liberty"],"emoji":"๐Ÿ—ฝ","order":3513,"group":5,"version":0.6},{"shortcodes":["church"],"annotation":"church","tags":["christian","cross","religion"],"emoji":"โ›ช๏ธ","order":3514,"group":5,"version":0.6},{"shortcodes":["mosque"],"annotation":"mosque","tags":["islam","muslim","religion"],"emoji":"๐Ÿ•Œ","order":3515,"group":5,"version":1},{"shortcodes":["hindu_temple"],"annotation":"hindu temple","tags":["hindu","temple"],"emoji":"๐Ÿ›•","order":3516,"group":5,"version":12},{"shortcodes":["synagogue"],"annotation":"synagogue","tags":["jew","jewish","religion","temple"],"emoji":"๐Ÿ•","order":3517,"group":5,"version":1},{"shortcodes":["shinto_shrine"],"annotation":"shinto shrine","tags":["religion","shinto","shrine"],"emoji":"โ›ฉ๏ธ","order":3519,"group":5,"version":0.7},{"shortcodes":["kaaba"],"annotation":"kaaba","tags":["islam","muslim","religion"],"emoji":"๐Ÿ•‹","order":3520,"group":5,"version":1},{"shortcodes":["fountain"],"annotation":"fountain","tags":["fountain"],"emoji":"โ›ฒ๏ธ","order":3521,"group":5,"version":0.6},{"shortcodes":["tent"],"annotation":"tent","tags":["camping"],"emoji":"โ›บ๏ธ","order":3522,"group":5,"version":0.6},{"shortcodes":["foggy"],"annotation":"foggy","tags":["fog"],"emoji":"๐ŸŒ","order":3523,"group":5,"version":0.6},{"shortcodes":["night_with_stars"],"annotation":"night with stars","tags":["night","star"],"emoji":"๐ŸŒƒ","order":3524,"group":5,"version":0.6},{"shortcodes":["cityscape"],"annotation":"cityscape","tags":["city"],"emoji":"๐Ÿ™๏ธ","order":3526,"group":5,"version":0.7},{"shortcodes":["sunrise_over_mountains"],"annotation":"sunrise over mountains","tags":["morning","mountain","sun","sunrise"],"emoji":"๐ŸŒ„","order":3527,"group":5,"version":0.6},{"shortcodes":["sunrise"],"annotation":"sunrise","tags":["morning","sun"],"emoji":"๐ŸŒ…","order":3528,"group":5,"version":0.6},{"shortcodes":["city_dusk"],"annotation":"cityscape at dusk","tags":["city","dusk","evening","landscape","sunset"],"emoji":"๐ŸŒ†","order":3529,"group":5,"version":0.6},{"shortcodes":["city_sunrise","city_sunset"],"annotation":"sunset","tags":["dusk","sun"],"emoji":"๐ŸŒ‡","order":3530,"group":5,"version":0.6},{"shortcodes":["bridge_at_night"],"annotation":"bridge at night","tags":["bridge","night"],"emoji":"๐ŸŒ‰","order":3531,"group":5,"version":0.6},{"shortcodes":["hotsprings"],"annotation":"hot springs","tags":["hot","hotsprings","springs","steaming"],"emoji":"โ™จ๏ธ","order":3533,"group":5,"version":0.6},{"shortcodes":["carousel_horse"],"annotation":"carousel horse","tags":["carousel","horse"],"emoji":"๐ŸŽ ","order":3534,"group":5,"version":0.6},{"shortcodes":["playground_slide","slide"],"annotation":"playground slide","tags":["amusement park","play"],"emoji":"๐Ÿ›","order":3535,"group":5,"version":14},{"shortcodes":["ferris_wheel"],"annotation":"ferris wheel","tags":["amusement park","ferris","wheel"],"emoji":"๐ŸŽก","order":3536,"group":5,"version":0.6},{"shortcodes":["roller_coaster"],"annotation":"roller coaster","tags":["amusement park","coaster","roller"],"emoji":"๐ŸŽข","order":3537,"group":5,"version":0.6},{"shortcodes":["barber","barber_pole"],"annotation":"barber pole","tags":["barber","haircut","pole"],"emoji":"๐Ÿ’ˆ","order":3538,"group":5,"version":0.6},{"shortcodes":["circus_tent"],"annotation":"circus tent","tags":["circus","tent"],"emoji":"๐ŸŽช","order":3539,"group":5,"version":0.6},{"shortcodes":["steam_locomotive"],"annotation":"locomotive","tags":["engine","railway","steam","train"],"emoji":"๐Ÿš‚","order":3540,"group":5,"version":1},{"shortcodes":["railway_car"],"annotation":"railway car","tags":["car","electric","railway","train","tram","trolleybus"],"emoji":"๐Ÿšƒ","order":3541,"group":5,"version":0.6},{"shortcodes":["bullettrain_side"],"annotation":"high-speed train","tags":["railway","shinkansen","speed","train"],"emoji":"๐Ÿš„","order":3542,"group":5,"version":0.6},{"shortcodes":["bullettrain_front"],"annotation":"bullet train","tags":["bullet","railway","shinkansen","speed","train"],"emoji":"๐Ÿš…","order":3543,"group":5,"version":0.6},{"shortcodes":["train"],"annotation":"train","tags":["railway"],"emoji":"๐Ÿš†","order":3544,"group":5,"version":1},{"shortcodes":["metro"],"annotation":"metro","tags":["subway"],"emoji":"๐Ÿš‡๏ธ","order":3545,"group":5,"version":0.6},{"shortcodes":["light_rail"],"annotation":"light rail","tags":["railway"],"emoji":"๐Ÿšˆ","order":3546,"group":5,"version":1},{"shortcodes":["station"],"annotation":"station","tags":["railway","train"],"emoji":"๐Ÿš‰","order":3547,"group":5,"version":0.6},{"shortcodes":["tram"],"annotation":"tram","tags":["trolleybus"],"emoji":"๐ŸšŠ","order":3548,"group":5,"version":1},{"shortcodes":["monorail"],"annotation":"monorail","tags":["vehicle"],"emoji":"๐Ÿš","order":3549,"group":5,"version":1},{"shortcodes":["mountain_railway"],"annotation":"mountain railway","tags":["car","mountain","railway"],"emoji":"๐Ÿšž","order":3550,"group":5,"version":1},{"shortcodes":["tram_car"],"annotation":"tram car","tags":["car","tram","trolleybus"],"emoji":"๐Ÿš‹","order":3551,"group":5,"version":1},{"shortcodes":["bus"],"annotation":"bus","tags":["vehicle"],"emoji":"๐ŸšŒ","order":3552,"group":5,"version":0.6},{"shortcodes":["oncoming_bus"],"annotation":"oncoming bus","tags":["bus","oncoming"],"emoji":"๐Ÿš๏ธ","order":3553,"group":5,"version":0.7},{"shortcodes":["trolleybus"],"annotation":"trolleybus","tags":["bus","tram","trolley"],"emoji":"๐ŸšŽ","order":3554,"group":5,"version":1},{"shortcodes":["minibus"],"annotation":"minibus","tags":["bus"],"emoji":"๐Ÿš","order":3555,"group":5,"version":1},{"shortcodes":["ambulance"],"annotation":"ambulance","tags":["vehicle"],"emoji":"๐Ÿš‘๏ธ","order":3556,"group":5,"version":0.6},{"shortcodes":["fire_engine"],"annotation":"fire engine","tags":["engine","fire","truck"],"emoji":"๐Ÿš’","order":3557,"group":5,"version":0.6},{"shortcodes":["police_car"],"annotation":"police car","tags":["car","patrol","police"],"emoji":"๐Ÿš“","order":3558,"group":5,"version":0.6},{"shortcodes":["oncoming_police_car"],"annotation":"oncoming police car","tags":["car","oncoming","police"],"emoji":"๐Ÿš”๏ธ","order":3559,"group":5,"version":0.7},{"shortcodes":["taxi"],"annotation":"taxi","tags":["vehicle"],"emoji":"๐Ÿš•","order":3560,"group":5,"version":0.6},{"shortcodes":["oncoming_taxi"],"annotation":"oncoming taxi","tags":["oncoming","taxi"],"emoji":"๐Ÿš–","order":3561,"group":5,"version":1},{"shortcodes":["car","red_car"],"annotation":"automobile","tags":["car"],"emoji":"๐Ÿš—","order":3562,"group":5,"version":0.6},{"shortcodes":["oncoming_automobile"],"annotation":"oncoming automobile","tags":["automobile","car","oncoming"],"emoji":"๐Ÿš˜๏ธ","order":3563,"group":5,"version":0.7},{"shortcodes":["blue_car","suv"],"annotation":"sport utility vehicle","tags":["recreational","sport utility"],"emoji":"๐Ÿš™","order":3564,"group":5,"version":0.6},{"shortcodes":["pickup_truck"],"annotation":"pickup truck","tags":["pick-up","pickup","truck"],"emoji":"๐Ÿ›ป","order":3565,"group":5,"version":13},{"shortcodes":["delivery_truck","truck"],"annotation":"delivery truck","tags":["delivery","truck"],"emoji":"๐Ÿšš","order":3566,"group":5,"version":0.6},{"shortcodes":["articulated_lorry"],"annotation":"articulated lorry","tags":["lorry","semi","truck"],"emoji":"๐Ÿš›","order":3567,"group":5,"version":1},{"shortcodes":["tractor"],"annotation":"tractor","tags":["vehicle"],"emoji":"๐Ÿšœ","order":3568,"group":5,"version":1},{"shortcodes":["racing_car"],"annotation":"racing car","tags":["car","racing"],"emoji":"๐ŸŽ๏ธ","order":3570,"group":5,"version":0.7},{"shortcodes":["motorcycle"],"annotation":"motorcycle","tags":["racing"],"emoji":"๐Ÿ๏ธ","order":3572,"group":5,"version":0.7},{"shortcodes":["motor_scooter"],"annotation":"motor scooter","tags":["motor","scooter"],"emoji":"๐Ÿ›ต","order":3573,"group":5,"version":3},{"shortcodes":["manual_wheelchair"],"annotation":"manual wheelchair","tags":["accessibility"],"emoji":"๐Ÿฆฝ","order":3574,"group":5,"version":12},{"shortcodes":["motorized_wheelchair"],"annotation":"motorized wheelchair","tags":["accessibility"],"emoji":"๐Ÿฆผ","order":3575,"group":5,"version":12},{"shortcodes":["auto_rickshaw"],"annotation":"auto rickshaw","tags":["tuk tuk"],"emoji":"๐Ÿ›บ","order":3576,"group":5,"version":12},{"shortcodes":["bicycle","bike"],"annotation":"bicycle","tags":["bike"],"emoji":"๐Ÿšฒ๏ธ","order":3577,"group":5,"version":0.6},{"shortcodes":["scooter"],"annotation":"kick scooter","tags":["kick","scooter"],"emoji":"๐Ÿ›ด","order":3578,"group":5,"version":3},{"shortcodes":["skateboard"],"annotation":"skateboard","tags":["board"],"emoji":"๐Ÿ›น","order":3579,"group":5,"version":11},{"shortcodes":["roller_skate"],"annotation":"roller skate","tags":["roller","skate"],"emoji":"๐Ÿ›ผ","order":3580,"group":5,"version":13},{"shortcodes":["busstop"],"annotation":"bus stop","tags":["bus","stop"],"emoji":"๐Ÿš","order":3581,"group":5,"version":0.6},{"shortcodes":["motorway"],"annotation":"motorway","tags":["highway","road"],"emoji":"๐Ÿ›ฃ๏ธ","order":3583,"group":5,"version":0.7},{"shortcodes":["railway_track"],"annotation":"railway track","tags":["railway","train"],"emoji":"๐Ÿ›ค๏ธ","order":3585,"group":5,"version":0.7},{"shortcodes":["oil_drum"],"annotation":"oil drum","tags":["drum","oil"],"emoji":"๐Ÿ›ข๏ธ","order":3587,"group":5,"version":0.7},{"shortcodes":["fuelpump"],"annotation":"fuel pump","tags":["diesel","fuel","fuelpump","gas","pump","station"],"emoji":"โ›ฝ๏ธ","order":3588,"group":5,"version":0.6},{"shortcodes":["wheel"],"annotation":"wheel","tags":["circle","tire","turn"],"emoji":"๐Ÿ›ž","order":3589,"group":5,"version":14},{"shortcodes":["rotating_light"],"annotation":"police car light","tags":["beacon","car","light","police","revolving"],"emoji":"๐Ÿšจ","order":3590,"group":5,"version":0.6},{"shortcodes":["traffic_light"],"annotation":"horizontal traffic light","tags":["light","signal","traffic"],"emoji":"๐Ÿšฅ","order":3591,"group":5,"version":0.6},{"shortcodes":["vertical_traffic_light"],"annotation":"vertical traffic light","tags":["light","signal","traffic"],"emoji":"๐Ÿšฆ","order":3592,"group":5,"version":1},{"shortcodes":["octagonal_sign","stop_sign"],"annotation":"stop sign","tags":["octagonal","sign","stop"],"emoji":"๐Ÿ›‘","order":3593,"group":5,"version":3},{"shortcodes":["construction"],"annotation":"construction","tags":["barrier"],"emoji":"๐Ÿšง","order":3594,"group":5,"version":0.6},{"shortcodes":["anchor"],"annotation":"anchor","tags":["ship","tool"],"emoji":"โš“๏ธ","order":3595,"group":5,"version":0.6},{"shortcodes":["lifebuoy","ring_buoy"],"annotation":"ring buoy","tags":["float","life preserver","life saver","rescue","safety"],"emoji":"๐Ÿ›Ÿ","order":3596,"group":5,"version":14},{"shortcodes":["sailboat"],"annotation":"sailboat","tags":["boat","resort","sea","yacht"],"emoji":"โ›ต๏ธ","order":3597,"group":5,"version":0.6},{"shortcodes":["canoe"],"annotation":"canoe","tags":["boat"],"emoji":"๐Ÿ›ถ","order":3598,"group":5,"version":3},{"shortcodes":["speedboat"],"annotation":"speedboat","tags":["boat"],"emoji":"๐Ÿšค","order":3599,"group":5,"version":0.6},{"shortcodes":["cruise_ship","passenger_ship"],"annotation":"passenger ship","tags":["passenger","ship"],"emoji":"๐Ÿ›ณ๏ธ","order":3601,"group":5,"version":0.7},{"shortcodes":["ferry"],"annotation":"ferry","tags":["boat","passenger"],"emoji":"โ›ด๏ธ","order":3603,"group":5,"version":0.7},{"shortcodes":["motorboat"],"annotation":"motor boat","tags":["boat","motorboat"],"emoji":"๐Ÿ›ฅ๏ธ","order":3605,"group":5,"version":0.7},{"shortcodes":["ship"],"annotation":"ship","tags":["boat","passenger"],"emoji":"๐Ÿšข","order":3606,"group":5,"version":0.6},{"shortcodes":["airplane"],"annotation":"airplane","tags":["aeroplane"],"emoji":"โœˆ๏ธ","order":3608,"group":5,"version":0.6},{"shortcodes":["small_airplane"],"annotation":"small airplane","tags":["aeroplane","airplane"],"emoji":"๐Ÿ›ฉ๏ธ","order":3610,"group":5,"version":0.7},{"shortcodes":["airplane_departure"],"annotation":"airplane departure","tags":["aeroplane","airplane","check-in","departure","departures"],"emoji":"๐Ÿ›ซ","order":3611,"group":5,"version":1},{"shortcodes":["airplane_arriving"],"annotation":"airplane arrival","tags":["aeroplane","airplane","arrivals","arriving","landing"],"emoji":"๐Ÿ›ฌ","order":3612,"group":5,"version":1},{"shortcodes":["parachute"],"annotation":"parachute","tags":["hang-glide","parasail","skydive"],"emoji":"๐Ÿช‚","order":3613,"group":5,"version":12},{"shortcodes":["seat"],"annotation":"seat","tags":["chair"],"emoji":"๐Ÿ’บ","order":3614,"group":5,"version":0.6},{"shortcodes":["helicopter"],"annotation":"helicopter","tags":["vehicle"],"emoji":"๐Ÿš","order":3615,"group":5,"version":1},{"shortcodes":["suspension_railway"],"annotation":"suspension railway","tags":["railway","suspension"],"emoji":"๐ŸšŸ","order":3616,"group":5,"version":1},{"shortcodes":["mountain_cableway"],"annotation":"mountain cableway","tags":["cable","gondola","mountain"],"emoji":"๐Ÿš ","order":3617,"group":5,"version":1},{"shortcodes":["aerial_tramway"],"annotation":"aerial tramway","tags":["aerial","cable","car","gondola","tramway"],"emoji":"๐Ÿšก","order":3618,"group":5,"version":1},{"shortcodes":["satellite"],"annotation":"satellite","tags":["space"],"emoji":"๐Ÿ›ฐ๏ธ","order":3620,"group":5,"version":0.7},{"shortcodes":["rocket"],"annotation":"rocket","tags":["space"],"emoji":"๐Ÿš€","order":3621,"group":5,"version":0.6},{"shortcodes":["flying_saucer"],"annotation":"flying saucer","tags":["ufo"],"emoji":"๐Ÿ›ธ","order":3622,"group":5,"version":5},{"shortcodes":["bellhop"],"annotation":"bellhop bell","tags":["bell","bellhop","hotel"],"emoji":"๐Ÿ›Ž๏ธ","order":3624,"group":5,"version":0.7},{"shortcodes":["luggage"],"annotation":"luggage","tags":["packing","travel"],"emoji":"๐Ÿงณ","order":3625,"group":5,"version":11},{"shortcodes":["hourglass"],"annotation":"hourglass done","tags":["sand","timer"],"emoji":"โŒ›๏ธ","order":3626,"group":5,"version":0.6},{"shortcodes":["hourglass_flowing_sand"],"annotation":"hourglass not done","tags":["hourglass","sand","timer"],"emoji":"โณ๏ธ","order":3627,"group":5,"version":0.6},{"shortcodes":["watch"],"annotation":"watch","tags":["clock"],"emoji":"โŒš๏ธ","order":3628,"group":5,"version":0.6},{"shortcodes":["alarm_clock"],"annotation":"alarm clock","tags":["alarm","clock"],"emoji":"โฐ","order":3629,"group":5,"version":0.6},{"shortcodes":["stopwatch"],"annotation":"stopwatch","tags":["clock"],"emoji":"โฑ๏ธ","order":3631,"group":5,"version":1},{"shortcodes":["timer_clock"],"annotation":"timer clock","tags":["clock","timer"],"emoji":"โฒ๏ธ","order":3633,"group":5,"version":1},{"shortcodes":["clock"],"annotation":"mantelpiece clock","tags":["clock"],"emoji":"๐Ÿ•ฐ๏ธ","order":3635,"group":5,"version":0.7},{"shortcodes":["clock12"],"annotation":"twelve oโ€™clock","tags":["00","12","12:00","clock","oโ€™clock","twelve"],"emoji":"๐Ÿ•›๏ธ","order":3636,"group":5,"version":0.6},{"shortcodes":["clock1230"],"annotation":"twelve-thirty","tags":["12","12:30","clock","thirty","twelve"],"emoji":"๐Ÿ•ง๏ธ","order":3637,"group":5,"version":0.7},{"shortcodes":["clock1"],"annotation":"one oโ€™clock","tags":["00","1","1:00","clock","one","oโ€™clock"],"emoji":"๐Ÿ•๏ธ","order":3638,"group":5,"version":0.6},{"shortcodes":["clock130"],"annotation":"one-thirty","tags":["1","1:30","clock","one","thirty"],"emoji":"๐Ÿ•œ๏ธ","order":3639,"group":5,"version":0.7},{"shortcodes":["clock2"],"annotation":"two oโ€™clock","tags":["00","2","2:00","clock","oโ€™clock","two"],"emoji":"๐Ÿ•‘๏ธ","order":3640,"group":5,"version":0.6},{"shortcodes":["clock230"],"annotation":"two-thirty","tags":["2","2:30","clock","thirty","two"],"emoji":"๐Ÿ•๏ธ","order":3641,"group":5,"version":0.7},{"shortcodes":["clock3"],"annotation":"three oโ€™clock","tags":["00","3","3:00","clock","oโ€™clock","three"],"emoji":"๐Ÿ•’๏ธ","order":3642,"group":5,"version":0.6},{"shortcodes":["clock330"],"annotation":"three-thirty","tags":["3","3:30","clock","thirty","three"],"emoji":"๐Ÿ•ž๏ธ","order":3643,"group":5,"version":0.7},{"shortcodes":["clock4"],"annotation":"four oโ€™clock","tags":["00","4","4:00","clock","four","oโ€™clock"],"emoji":"๐Ÿ•“๏ธ","order":3644,"group":5,"version":0.6},{"shortcodes":["clock430"],"annotation":"four-thirty","tags":["4","4:30","clock","four","thirty"],"emoji":"๐Ÿ•Ÿ๏ธ","order":3645,"group":5,"version":0.7},{"shortcodes":["clock5"],"annotation":"five oโ€™clock","tags":["00","5","5:00","clock","five","oโ€™clock"],"emoji":"๐Ÿ•”๏ธ","order":3646,"group":5,"version":0.6},{"shortcodes":["clock530"],"annotation":"five-thirty","tags":["5","5:30","clock","five","thirty"],"emoji":"๐Ÿ• ๏ธ","order":3647,"group":5,"version":0.7},{"shortcodes":["clock6"],"annotation":"six oโ€™clock","tags":["00","6","6:00","clock","oโ€™clock","six"],"emoji":"๐Ÿ••๏ธ","order":3648,"group":5,"version":0.6},{"shortcodes":["clock630"],"annotation":"six-thirty","tags":["6","6:30","clock","six","thirty"],"emoji":"๐Ÿ•ก๏ธ","order":3649,"group":5,"version":0.7},{"shortcodes":["clock7"],"annotation":"seven oโ€™clock","tags":["00","7","7:00","clock","oโ€™clock","seven"],"emoji":"๐Ÿ•–๏ธ","order":3650,"group":5,"version":0.6},{"shortcodes":["clock730"],"annotation":"seven-thirty","tags":["7","7:30","clock","seven","thirty"],"emoji":"๐Ÿ•ข๏ธ","order":3651,"group":5,"version":0.7},{"shortcodes":["clock8"],"annotation":"eight oโ€™clock","tags":["00","8","8:00","clock","eight","oโ€™clock"],"emoji":"๐Ÿ•—๏ธ","order":3652,"group":5,"version":0.6},{"shortcodes":["clock830"],"annotation":"eight-thirty","tags":["8","8:30","clock","eight","thirty"],"emoji":"๐Ÿ•ฃ๏ธ","order":3653,"group":5,"version":0.7},{"shortcodes":["clock9"],"annotation":"nine oโ€™clock","tags":["00","9","9:00","clock","nine","oโ€™clock"],"emoji":"๐Ÿ•˜๏ธ","order":3654,"group":5,"version":0.6},{"shortcodes":["clock930"],"annotation":"nine-thirty","tags":["9","9:30","clock","nine","thirty"],"emoji":"๐Ÿ•ค๏ธ","order":3655,"group":5,"version":0.7},{"shortcodes":["clock10"],"annotation":"ten oโ€™clock","tags":["00","10","10:00","clock","oโ€™clock","ten"],"emoji":"๐Ÿ•™๏ธ","order":3656,"group":5,"version":0.6},{"shortcodes":["clock1030"],"annotation":"ten-thirty","tags":["10","10:30","clock","ten","thirty"],"emoji":"๐Ÿ•ฅ๏ธ","order":3657,"group":5,"version":0.7},{"shortcodes":["clock11"],"annotation":"eleven oโ€™clock","tags":["00","11","11:00","clock","eleven","oโ€™clock"],"emoji":"๐Ÿ•š๏ธ","order":3658,"group":5,"version":0.6},{"shortcodes":["clock1130"],"annotation":"eleven-thirty","tags":["11","11:30","clock","eleven","thirty"],"emoji":"๐Ÿ•ฆ๏ธ","order":3659,"group":5,"version":0.7},{"shortcodes":["new_moon"],"annotation":"new moon","tags":["dark","moon"],"emoji":"๐ŸŒ‘","order":3660,"group":5,"version":0.6},{"shortcodes":["waxing_crescent_moon"],"annotation":"waxing crescent moon","tags":["crescent","moon","waxing"],"emoji":"๐ŸŒ’","order":3661,"group":5,"version":1},{"shortcodes":["first_quarter_moon"],"annotation":"first quarter moon","tags":["moon","quarter"],"emoji":"๐ŸŒ“","order":3662,"group":5,"version":0.6},{"shortcodes":["waxing_gibbous_moon"],"annotation":"waxing gibbous moon","tags":["gibbous","moon","waxing"],"emoji":"๐ŸŒ”","order":3663,"group":5,"version":0.6},{"shortcodes":["full_moon"],"annotation":"full moon","tags":["full","moon"],"emoji":"๐ŸŒ•๏ธ","order":3664,"group":5,"version":0.6},{"shortcodes":["waning_gibbous_moon"],"annotation":"waning gibbous moon","tags":["gibbous","moon","waning"],"emoji":"๐ŸŒ–","order":3665,"group":5,"version":1},{"shortcodes":["last_quarter_moon"],"annotation":"last quarter moon","tags":["moon","quarter"],"emoji":"๐ŸŒ—","order":3666,"group":5,"version":1},{"shortcodes":["waning_crescent_moon"],"annotation":"waning crescent moon","tags":["crescent","moon","waning"],"emoji":"๐ŸŒ˜","order":3667,"group":5,"version":1},{"shortcodes":["crescent_moon"],"annotation":"crescent moon","tags":["crescent","moon"],"emoji":"๐ŸŒ™","order":3668,"group":5,"version":0.6},{"shortcodes":["new_moon_with_face"],"annotation":"new moon face","tags":["face","moon"],"emoji":"๐ŸŒš","order":3669,"group":5,"version":1},{"shortcodes":["first_quarter_moon_with_face"],"annotation":"first quarter moon face","tags":["face","moon","quarter"],"emoji":"๐ŸŒ›","order":3670,"group":5,"version":0.6},{"shortcodes":["last_quarter_moon_with_face"],"annotation":"last quarter moon face","tags":["face","moon","quarter"],"emoji":"๐ŸŒœ๏ธ","order":3671,"group":5,"version":0.7},{"shortcodes":["thermometer"],"annotation":"thermometer","tags":["weather"],"emoji":"๐ŸŒก๏ธ","order":3673,"group":5,"version":0.7},{"shortcodes":["sun"],"annotation":"sun","tags":["bright","rays","sunny"],"emoji":"โ˜€๏ธ","order":3675,"group":5,"version":0.6},{"shortcodes":["full_moon_with_face"],"annotation":"full moon face","tags":["bright","face","full","moon"],"emoji":"๐ŸŒ","order":3676,"group":5,"version":1},{"shortcodes":["sun_with_face"],"annotation":"sun with face","tags":["bright","face","sun"],"emoji":"๐ŸŒž","order":3677,"group":5,"version":1},{"shortcodes":["ringed_planet","saturn"],"annotation":"ringed planet","tags":["saturn","saturnine"],"emoji":"๐Ÿช","order":3678,"group":5,"version":12},{"shortcodes":["star"],"annotation":"star","tags":["star"],"emoji":"โญ๏ธ","order":3679,"group":5,"version":0.6},{"shortcodes":["glowing_star","star2"],"annotation":"glowing star","tags":["glittery","glow","shining","sparkle","star"],"emoji":"๐ŸŒŸ","order":3680,"group":5,"version":0.6},{"shortcodes":["shooting_star","stars"],"annotation":"shooting star","tags":["falling","shooting","star"],"emoji":"๐ŸŒ ","order":3681,"group":5,"version":0.6},{"shortcodes":["milky_way"],"annotation":"milky way","tags":["space"],"emoji":"๐ŸŒŒ","order":3682,"group":5,"version":0.6},{"shortcodes":["cloud"],"annotation":"cloud","tags":["weather"],"emoji":"โ˜๏ธ","order":3684,"group":5,"version":0.6},{"shortcodes":["partly_sunny","sun_behind_cloud"],"annotation":"sun behind cloud","tags":["cloud","sun"],"emoji":"โ›…๏ธ","order":3685,"group":5,"version":0.6},{"shortcodes":["stormy","thunder_cloud_and_rain"],"annotation":"cloud with lightning and rain","tags":["cloud","rain","thunder"],"emoji":"โ›ˆ๏ธ","order":3687,"group":5,"version":0.7},{"shortcodes":["sun_behind_small_cloud","sunny"],"annotation":"sun behind small cloud","tags":["cloud","sun"],"emoji":"๐ŸŒค๏ธ","order":3689,"group":5,"version":0.7},{"shortcodes":["cloudy","sun_behind_large_cloud"],"annotation":"sun behind large cloud","tags":["cloud","sun"],"emoji":"๐ŸŒฅ๏ธ","order":3691,"group":5,"version":0.7},{"shortcodes":["sun_and_rain","sun_behind_rain_cloud"],"annotation":"sun behind rain cloud","tags":["cloud","rain","sun"],"emoji":"๐ŸŒฆ๏ธ","order":3693,"group":5,"version":0.7},{"shortcodes":["cloud_with_rain","rainy"],"annotation":"cloud with rain","tags":["cloud","rain"],"emoji":"๐ŸŒง๏ธ","order":3695,"group":5,"version":0.7},{"shortcodes":["cloud_with_snow","snowy"],"annotation":"cloud with snow","tags":["cloud","cold","snow"],"emoji":"๐ŸŒจ๏ธ","order":3697,"group":5,"version":0.7},{"shortcodes":["cloud_with_lightning","lightning"],"annotation":"cloud with lightning","tags":["cloud","lightning"],"emoji":"๐ŸŒฉ๏ธ","order":3699,"group":5,"version":0.7},{"shortcodes":["tornado"],"annotation":"tornado","tags":["cloud","whirlwind"],"emoji":"๐ŸŒช๏ธ","order":3701,"group":5,"version":0.7},{"shortcodes":["fog"],"annotation":"fog","tags":["cloud"],"emoji":"๐ŸŒซ๏ธ","order":3703,"group":5,"version":0.7},{"shortcodes":["wind_blowing_face"],"annotation":"wind face","tags":["blow","cloud","face","wind"],"emoji":"๐ŸŒฌ๏ธ","order":3705,"group":5,"version":0.7},{"shortcodes":["cyclone"],"annotation":"cyclone","tags":["dizzy","hurricane","twister","typhoon"],"emoji":"๐ŸŒ€","order":3706,"group":5,"version":0.6},{"shortcodes":["rainbow"],"annotation":"rainbow","tags":["rain"],"emoji":"๐ŸŒˆ","order":3707,"group":5,"version":0.6},{"shortcodes":["closed_umbrella"],"annotation":"closed umbrella","tags":["clothing","rain","umbrella"],"emoji":"๐ŸŒ‚","order":3708,"group":5,"version":0.6},{"shortcodes":["umbrella"],"annotation":"umbrella","tags":["clothing","rain"],"emoji":"โ˜‚๏ธ","order":3710,"group":5,"version":0.7},{"shortcodes":["umbrella_with_rain"],"annotation":"umbrella with rain drops","tags":["clothing","drop","rain","umbrella"],"emoji":"โ˜”๏ธ","order":3711,"group":5,"version":0.6},{"shortcodes":["beach_umbrella","umbrella_on_ground"],"annotation":"umbrella on ground","tags":["rain","sun","umbrella"],"emoji":"โ›ฑ๏ธ","order":3713,"group":5,"version":0.7},{"shortcodes":["high_voltage","zap"],"annotation":"high voltage","tags":["danger","electric","lightning","voltage","zap"],"emoji":"โšก๏ธ","order":3714,"group":5,"version":0.6},{"shortcodes":["snowflake"],"annotation":"snowflake","tags":["cold","snow"],"emoji":"โ„๏ธ","order":3716,"group":5,"version":0.6},{"shortcodes":["snowman2"],"annotation":"snowman","tags":["cold","snow"],"emoji":"โ˜ƒ๏ธ","order":3718,"group":5,"version":0.7},{"shortcodes":["snowman"],"annotation":"snowman without snow","tags":["cold","snow","snowman"],"emoji":"โ›„๏ธ","order":3719,"group":5,"version":0.6},{"shortcodes":["comet"],"annotation":"comet","tags":["space"],"emoji":"โ˜„๏ธ","order":3721,"group":5,"version":1},{"shortcodes":["fire"],"annotation":"fire","tags":["flame","tool"],"emoji":"๐Ÿ”ฅ","order":3722,"group":5,"version":0.6},{"shortcodes":["droplet"],"annotation":"droplet","tags":["cold","comic","drop","sweat"],"emoji":"๐Ÿ’ง","order":3723,"group":5,"version":0.6},{"shortcodes":["ocean","water_wave"],"annotation":"water wave","tags":["ocean","water","wave"],"emoji":"๐ŸŒŠ","order":3724,"group":5,"version":0.6},{"shortcodes":["jack_o_lantern"],"annotation":"jack-o-lantern","tags":["celebration","halloween","jack","lantern"],"emoji":"๐ŸŽƒ","order":3725,"group":6,"version":0.6},{"shortcodes":["christmas_tree"],"annotation":"Christmas tree","tags":["celebration","christmas","tree"],"emoji":"๐ŸŽ„","order":3726,"group":6,"version":0.6},{"shortcodes":["fireworks"],"annotation":"fireworks","tags":["celebration"],"emoji":"๐ŸŽ†","order":3727,"group":6,"version":0.6},{"shortcodes":["sparkler"],"annotation":"sparkler","tags":["celebration","fireworks","sparkle"],"emoji":"๐ŸŽ‡","order":3728,"group":6,"version":0.6},{"shortcodes":["firecracker"],"annotation":"firecracker","tags":["dynamite","explosive","fireworks"],"emoji":"๐Ÿงจ","order":3729,"group":6,"version":11},{"shortcodes":["sparkles"],"annotation":"sparkles","tags":["*","sparkle","star"],"emoji":"โœจ","order":3730,"group":6,"version":0.6},{"shortcodes":["balloon"],"annotation":"balloon","tags":["celebration"],"emoji":"๐ŸŽˆ","order":3731,"group":6,"version":0.6},{"shortcodes":["party","party_popper","tada"],"annotation":"party popper","tags":["celebration","party","popper","tada"],"emoji":"๐ŸŽ‰","order":3732,"group":6,"version":0.6},{"shortcodes":["confetti_ball"],"annotation":"confetti ball","tags":["ball","celebration","confetti"],"emoji":"๐ŸŽŠ","order":3733,"group":6,"version":0.6},{"shortcodes":["tanabata_tree"],"annotation":"tanabata tree","tags":["banner","celebration","japanese","tree"],"emoji":"๐ŸŽ‹","order":3734,"group":6,"version":0.6},{"shortcodes":["bamboo"],"annotation":"pine decoration","tags":["bamboo","celebration","japanese","pine"],"emoji":"๐ŸŽ","order":3735,"group":6,"version":0.6},{"shortcodes":["dolls"],"annotation":"Japanese dolls","tags":["celebration","doll","festival","japanese","japanese dolls"],"emoji":"๐ŸŽŽ","order":3736,"group":6,"version":0.6},{"shortcodes":["carp_streamer","flags"],"annotation":"carp streamer","tags":["carp","celebration","streamer"],"emoji":"๐ŸŽ","order":3737,"group":6,"version":0.6},{"shortcodes":["wind_chime"],"annotation":"wind chime","tags":["bell","celebration","chime","wind"],"emoji":"๐ŸŽ","order":3738,"group":6,"version":0.6},{"shortcodes":["moon_ceremony","rice_scene"],"annotation":"moon viewing ceremony","tags":["celebration","ceremony","moon"],"emoji":"๐ŸŽ‘","order":3739,"group":6,"version":0.6},{"shortcodes":["red_envelope"],"annotation":"red envelope","tags":["gift","good luck","hรณngbฤo","lai see","money"],"emoji":"๐Ÿงง","order":3740,"group":6,"version":11},{"shortcodes":["ribbon"],"annotation":"ribbon","tags":["celebration"],"emoji":"๐ŸŽ€","order":3741,"group":6,"version":0.6},{"shortcodes":["gift"],"annotation":"wrapped gift","tags":["box","celebration","gift","present","wrapped"],"emoji":"๐ŸŽ","order":3742,"group":6,"version":0.6},{"shortcodes":["reminder_ribbon"],"annotation":"reminder ribbon","tags":["celebration","reminder","ribbon"],"emoji":"๐ŸŽ—๏ธ","order":3744,"group":6,"version":0.7},{"shortcodes":["admission_tickets","tickets"],"annotation":"admission tickets","tags":["admission","ticket"],"emoji":"๐ŸŽŸ๏ธ","order":3746,"group":6,"version":0.7},{"shortcodes":["ticket"],"annotation":"ticket","tags":["admission"],"emoji":"๐ŸŽซ","order":3747,"group":6,"version":0.6},{"shortcodes":["military_medal"],"annotation":"military medal","tags":["celebration","medal","military"],"emoji":"๐ŸŽ–๏ธ","order":3749,"group":6,"version":0.7},{"shortcodes":["trophy"],"annotation":"trophy","tags":["prize"],"emoji":"๐Ÿ†๏ธ","order":3750,"group":6,"version":0.6},{"shortcodes":["sports_medal"],"annotation":"sports medal","tags":["medal"],"emoji":"๐Ÿ…","order":3751,"group":6,"version":1},{"shortcodes":["1st","first_place_medal"],"annotation":"1st place medal","tags":["first","gold","medal"],"emoji":"๐Ÿฅ‡","order":3752,"group":6,"version":3},{"shortcodes":["2nd","second_place_medal"],"annotation":"2nd place medal","tags":["medal","second","silver"],"emoji":"๐Ÿฅˆ","order":3753,"group":6,"version":3},{"shortcodes":["3rd","third_place_medal"],"annotation":"3rd place medal","tags":["bronze","medal","third"],"emoji":"๐Ÿฅ‰","order":3754,"group":6,"version":3},{"shortcodes":["soccer"],"annotation":"soccer ball","tags":["ball","football","soccer"],"emoji":"โšฝ๏ธ","order":3755,"group":6,"version":0.6},{"shortcodes":["baseball"],"annotation":"baseball","tags":["ball"],"emoji":"โšพ๏ธ","order":3756,"group":6,"version":0.6},{"shortcodes":["softball"],"annotation":"softball","tags":["ball","glove","underarm"],"emoji":"๐ŸฅŽ","order":3757,"group":6,"version":11},{"shortcodes":["basketball"],"annotation":"basketball","tags":["ball","hoop"],"emoji":"๐Ÿ€","order":3758,"group":6,"version":0.6},{"shortcodes":["volleyball"],"annotation":"volleyball","tags":["ball","game"],"emoji":"๐Ÿ","order":3759,"group":6,"version":1},{"shortcodes":["football"],"annotation":"american football","tags":["american","ball","football"],"emoji":"๐Ÿˆ","order":3760,"group":6,"version":0.6},{"shortcodes":["rugby_football"],"annotation":"rugby football","tags":["ball","football","rugby"],"emoji":"๐Ÿ‰","order":3761,"group":6,"version":1},{"shortcodes":["tennis"],"annotation":"tennis","tags":["ball","racquet"],"emoji":"๐ŸŽพ","order":3762,"group":6,"version":0.6},{"shortcodes":["flying_disc"],"annotation":"flying disc","tags":["ultimate"],"emoji":"๐Ÿฅ","order":3763,"group":6,"version":11},{"shortcodes":["bowling"],"annotation":"bowling","tags":["ball","game"],"emoji":"๐ŸŽณ","order":3764,"group":6,"version":0.6},{"shortcodes":["cricket_game"],"annotation":"cricket game","tags":["ball","bat","game"],"emoji":"๐Ÿ","order":3765,"group":6,"version":1},{"shortcodes":["field_hockey"],"annotation":"field hockey","tags":["ball","field","game","hockey","stick"],"emoji":"๐Ÿ‘","order":3766,"group":6,"version":1},{"shortcodes":["hockey"],"annotation":"ice hockey","tags":["game","hockey","ice","puck","stick"],"emoji":"๐Ÿ’","order":3767,"group":6,"version":1},{"shortcodes":["lacrosse"],"annotation":"lacrosse","tags":["ball","goal","stick"],"emoji":"๐Ÿฅ","order":3768,"group":6,"version":11},{"shortcodes":["ping_pong"],"annotation":"ping pong","tags":["ball","bat","game","paddle","table tennis"],"emoji":"๐Ÿ“","order":3769,"group":6,"version":1},{"shortcodes":["badminton"],"annotation":"badminton","tags":["birdie","game","racquet","shuttlecock"],"emoji":"๐Ÿธ","order":3770,"group":6,"version":1},{"shortcodes":["boxing_glove"],"annotation":"boxing glove","tags":["boxing","glove"],"emoji":"๐ŸฅŠ","order":3771,"group":6,"version":3},{"shortcodes":["martial_arts_uniform"],"annotation":"martial arts uniform","tags":["judo","karate","martial arts","taekwondo","uniform"],"emoji":"๐Ÿฅ‹","order":3772,"group":6,"version":3},{"shortcodes":["goal_net"],"annotation":"goal net","tags":["goal","net"],"emoji":"๐Ÿฅ…","order":3773,"group":6,"version":3},{"shortcodes":["golf"],"annotation":"flag in hole","tags":["golf","hole"],"emoji":"โ›ณ๏ธ","order":3774,"group":6,"version":0.6},{"shortcodes":["ice_skate"],"annotation":"ice skate","tags":["ice","skate"],"emoji":"โ›ธ๏ธ","order":3776,"group":6,"version":0.7},{"shortcodes":["fishing_pole","fishing_pole_and_fish"],"annotation":"fishing pole","tags":["fish","pole"],"emoji":"๐ŸŽฃ","order":3777,"group":6,"version":0.6},{"shortcodes":["diving_mask"],"annotation":"diving mask","tags":["diving","scuba","snorkeling"],"emoji":"๐Ÿคฟ","order":3778,"group":6,"version":12},{"shortcodes":["running_shirt","running_shirt_with_sash"],"annotation":"running shirt","tags":["athletics","running","sash","shirt"],"emoji":"๐ŸŽฝ","order":3779,"group":6,"version":0.6},{"shortcodes":["ski"],"annotation":"skis","tags":["ski","snow"],"emoji":"๐ŸŽฟ","order":3780,"group":6,"version":0.6},{"shortcodes":["sled"],"annotation":"sled","tags":["sledge","sleigh"],"emoji":"๐Ÿ›ท","order":3781,"group":6,"version":5},{"shortcodes":["curling_stone"],"annotation":"curling stone","tags":["game","rock"],"emoji":"๐ŸฅŒ","order":3782,"group":6,"version":5},{"shortcodes":["bullseye","dart","direct_hit"],"annotation":"bullseye","tags":["dart","direct hit","game","hit","target"],"emoji":"๐ŸŽฏ","order":3783,"group":6,"version":0.6},{"shortcodes":["yo_yo"],"annotation":"yo-yo","tags":["fluctuate","toy"],"emoji":"๐Ÿช€","order":3784,"group":6,"version":12},{"shortcodes":["kite"],"annotation":"kite","tags":["fly","soar"],"emoji":"๐Ÿช","order":3785,"group":6,"version":12},{"shortcodes":["8ball","billiards"],"annotation":"pool 8 ball","tags":["8","ball","billiard","eight","game"],"emoji":"๐ŸŽฑ","order":3786,"group":6,"version":0.6},{"shortcodes":["crystal_ball"],"annotation":"crystal ball","tags":["ball","crystal","fairy tale","fantasy","fortune","tool"],"emoji":"๐Ÿ”ฎ","order":3787,"group":6,"version":0.6},{"shortcodes":["magic_wand"],"annotation":"magic wand","tags":["magic","witch","wizard"],"emoji":"๐Ÿช„","order":3788,"group":6,"version":13},{"shortcodes":["nazar_amulet"],"annotation":"nazar amulet","tags":["bead","charm","evil-eye","nazar","talisman"],"emoji":"๐Ÿงฟ","order":3789,"group":6,"version":11},{"shortcodes":["hamsa"],"annotation":"hamsa","tags":["amulet","fatima","hand","mary","miriam","protection"],"emoji":"๐Ÿชฌ","order":3790,"group":6,"version":14},{"shortcodes":["controller","video_game"],"annotation":"video game","tags":["controller","game"],"emoji":"๐ŸŽฎ๏ธ","order":3791,"group":6,"version":0.6},{"shortcodes":["joystick"],"annotation":"joystick","tags":["game","video game"],"emoji":"๐Ÿ•น๏ธ","order":3793,"group":6,"version":0.7},{"shortcodes":["slot_machine"],"annotation":"slot machine","tags":["game","slot"],"emoji":"๐ŸŽฐ","order":3794,"group":6,"version":0.6},{"shortcodes":["game_die"],"annotation":"game die","tags":["dice","die","game"],"emoji":"๐ŸŽฒ","order":3795,"group":6,"version":0.6},{"shortcodes":["jigsaw","puzzle_piece"],"annotation":"puzzle piece","tags":["clue","interlocking","jigsaw","piece","puzzle"],"emoji":"๐Ÿงฉ","order":3796,"group":6,"version":11},{"shortcodes":["teddy_bear"],"annotation":"teddy bear","tags":["plaything","plush","stuffed","toy"],"emoji":"๐Ÿงธ","order":3797,"group":6,"version":11},{"shortcodes":["pinata"],"annotation":"piรฑata","tags":["celebration","party"],"emoji":"๐Ÿช…","order":3798,"group":6,"version":13},{"shortcodes":["disco","disco_ball","mirror_ball"],"annotation":"mirror ball","tags":["dance","disco","glitter","party"],"emoji":"๐Ÿชฉ","order":3799,"group":6,"version":14},{"shortcodes":["nesting_dolls"],"annotation":"nesting dolls","tags":["doll","nesting","russia"],"emoji":"๐Ÿช†","order":3800,"group":6,"version":13},{"shortcodes":["spades"],"annotation":"spade suit","tags":["card","game"],"emoji":"โ™ ๏ธ","order":3802,"group":6,"version":0.6},{"shortcodes":["hearts"],"annotation":"heart suit","tags":["card","game"],"emoji":"โ™ฅ๏ธ","order":3804,"group":6,"version":0.6},{"shortcodes":["diamonds"],"annotation":"diamond suit","tags":["card","game"],"emoji":"โ™ฆ๏ธ","order":3806,"group":6,"version":0.6},{"shortcodes":["clubs"],"annotation":"club suit","tags":["card","game"],"emoji":"โ™ฃ๏ธ","order":3808,"group":6,"version":0.6},{"shortcodes":["chess_pawn"],"annotation":"chess pawn","tags":["chess","dupe","expendable"],"emoji":"โ™Ÿ๏ธ","order":3810,"group":6,"version":11},{"shortcodes":["black_joker"],"annotation":"joker","tags":["card","game","wildcard"],"emoji":"๐Ÿƒ","order":3811,"group":6,"version":0.6},{"shortcodes":["mahjong"],"annotation":"mahjong red dragon","tags":["game","mahjong","red"],"emoji":"๐Ÿ€„๏ธ","order":3812,"group":6,"version":0.6},{"shortcodes":["flower_playing_cards"],"annotation":"flower playing cards","tags":["card","flower","game","japanese","playing"],"emoji":"๐ŸŽด","order":3813,"group":6,"version":0.6},{"shortcodes":["performing_arts"],"annotation":"performing arts","tags":["art","mask","performing","theater","theatre"],"emoji":"๐ŸŽญ๏ธ","order":3814,"group":6,"version":0.6},{"shortcodes":["frame_with_picture","framed_picture"],"annotation":"framed picture","tags":["art","frame","museum","painting","picture"],"emoji":"๐Ÿ–ผ๏ธ","order":3816,"group":6,"version":0.7},{"shortcodes":["art","palette"],"annotation":"artist palette","tags":["art","museum","painting","palette"],"emoji":"๐ŸŽจ","order":3817,"group":6,"version":0.6},{"shortcodes":["thread"],"annotation":"thread","tags":["needle","sewing","spool","string"],"emoji":"๐Ÿงต","order":3818,"group":6,"version":11},{"shortcodes":["sewing_needle"],"annotation":"sewing needle","tags":["embroidery","needle","sewing","stitches","sutures","tailoring"],"emoji":"๐Ÿชก","order":3819,"group":6,"version":13},{"shortcodes":["yarn"],"annotation":"yarn","tags":["ball","crochet","knit"],"emoji":"๐Ÿงถ","order":3820,"group":6,"version":11},{"shortcodes":["knot"],"annotation":"knot","tags":["rope","tangled","tie","twine","twist"],"emoji":"๐Ÿชข","order":3821,"group":6,"version":13},{"shortcodes":["eyeglasses","glasses"],"annotation":"glasses","tags":["clothing","eye","eyeglasses","eyewear"],"emoji":"๐Ÿ‘“๏ธ","order":3822,"group":7,"version":0.6},{"shortcodes":["sunglasses"],"annotation":"sunglasses","tags":["dark","eye","eyewear","glasses"],"emoji":"๐Ÿ•ถ๏ธ","order":3824,"group":7,"version":0.7},{"shortcodes":["goggles"],"annotation":"goggles","tags":["eye protection","swimming","welding"],"emoji":"๐Ÿฅฝ","order":3825,"group":7,"version":11},{"shortcodes":["lab_coat"],"annotation":"lab coat","tags":["doctor","experiment","scientist"],"emoji":"๐Ÿฅผ","order":3826,"group":7,"version":11},{"shortcodes":["safety_vest"],"annotation":"safety vest","tags":["emergency","safety","vest"],"emoji":"๐Ÿฆบ","order":3827,"group":7,"version":12},{"shortcodes":["necktie"],"annotation":"necktie","tags":["clothing","tie"],"emoji":"๐Ÿ‘”","order":3828,"group":7,"version":0.6},{"shortcodes":["shirt"],"annotation":"t-shirt","tags":["clothing","shirt","tshirt"],"emoji":"๐Ÿ‘•","order":3829,"group":7,"version":0.6},{"shortcodes":["jeans"],"annotation":"jeans","tags":["clothing","pants","trousers"],"emoji":"๐Ÿ‘–","order":3830,"group":7,"version":0.6},{"shortcodes":["scarf"],"annotation":"scarf","tags":["neck"],"emoji":"๐Ÿงฃ","order":3831,"group":7,"version":5},{"shortcodes":["gloves"],"annotation":"gloves","tags":["hand"],"emoji":"๐Ÿงค","order":3832,"group":7,"version":5},{"shortcodes":["coat"],"annotation":"coat","tags":["jacket"],"emoji":"๐Ÿงฅ","order":3833,"group":7,"version":5},{"shortcodes":["socks"],"annotation":"socks","tags":["stocking"],"emoji":"๐Ÿงฆ","order":3834,"group":7,"version":5},{"shortcodes":["dress"],"annotation":"dress","tags":["clothing"],"emoji":"๐Ÿ‘—","order":3835,"group":7,"version":0.6},{"shortcodes":["kimono"],"annotation":"kimono","tags":["clothing"],"emoji":"๐Ÿ‘˜","order":3836,"group":7,"version":0.6},{"shortcodes":["sari"],"annotation":"sari","tags":["clothing","dress"],"emoji":"๐Ÿฅป","order":3837,"group":7,"version":12},{"shortcodes":["one_piece_swimsuit"],"annotation":"one-piece swimsuit","tags":["bathing suit"],"emoji":"๐Ÿฉฑ","order":3838,"group":7,"version":12},{"shortcodes":["briefs"],"annotation":"briefs","tags":["bathing suit","one-piece","swimsuit","underwear"],"emoji":"๐Ÿฉฒ","order":3839,"group":7,"version":12},{"shortcodes":["shorts"],"annotation":"shorts","tags":["bathing suit","pants","underwear"],"emoji":"๐Ÿฉณ","order":3840,"group":7,"version":12},{"shortcodes":["bikini"],"annotation":"bikini","tags":["clothing","swim"],"emoji":"๐Ÿ‘™","order":3841,"group":7,"version":0.6},{"shortcodes":["womans_clothes"],"annotation":"womanโ€™s clothes","tags":["clothing","woman"],"emoji":"๐Ÿ‘š","order":3842,"group":7,"version":0.6},{"shortcodes":["purse"],"annotation":"purse","tags":["clothing","coin"],"emoji":"๐Ÿ‘›","order":3843,"group":7,"version":0.6},{"shortcodes":["handbag"],"annotation":"handbag","tags":["bag","clothing","purse"],"emoji":"๐Ÿ‘œ","order":3844,"group":7,"version":0.6},{"shortcodes":["clutch_bag","pouch"],"annotation":"clutch bag","tags":["bag","clothing","pouch"],"emoji":"๐Ÿ‘","order":3845,"group":7,"version":0.6},{"shortcodes":["shopping_bags"],"annotation":"shopping bags","tags":["bag","hotel","shopping"],"emoji":"๐Ÿ›๏ธ","order":3847,"group":7,"version":0.7},{"shortcodes":["backpack","school_satchel"],"annotation":"backpack","tags":["bag","rucksack","satchel","school"],"emoji":"๐ŸŽ’","order":3848,"group":7,"version":0.6},{"shortcodes":["thong_sandal"],"annotation":"thong sandal","tags":["beach sandals","sandals","thong sandals","thongs","zลri"],"emoji":"๐Ÿฉด","order":3849,"group":7,"version":13},{"shortcodes":["mans_shoe"],"annotation":"manโ€™s shoe","tags":["clothing","man","shoe"],"emoji":"๐Ÿ‘ž","order":3850,"group":7,"version":0.6},{"shortcodes":["athletic_shoe","sneaker"],"annotation":"running shoe","tags":["athletic","clothing","shoe","sneaker"],"emoji":"๐Ÿ‘Ÿ","order":3851,"group":7,"version":0.6},{"shortcodes":["hiking_boot"],"annotation":"hiking boot","tags":["backpacking","boot","camping","hiking"],"emoji":"๐Ÿฅพ","order":3852,"group":7,"version":11},{"shortcodes":["flat_shoe","womans_flat_shoe"],"annotation":"flat shoe","tags":["ballet flat","slip-on","slipper"],"emoji":"๐Ÿฅฟ","order":3853,"group":7,"version":11},{"shortcodes":["high_heel"],"annotation":"high-heeled shoe","tags":["clothing","heel","shoe","woman"],"emoji":"๐Ÿ‘ ","order":3854,"group":7,"version":0.6},{"shortcodes":["sandal"],"annotation":"womanโ€™s sandal","tags":["clothing","sandal","shoe","woman"],"emoji":"๐Ÿ‘ก","order":3855,"group":7,"version":0.6},{"shortcodes":["ballet_shoes"],"annotation":"ballet shoes","tags":["ballet","dance"],"emoji":"๐Ÿฉฐ","order":3856,"group":7,"version":12},{"shortcodes":["boot"],"annotation":"womanโ€™s boot","tags":["boot","clothing","shoe","woman"],"emoji":"๐Ÿ‘ข","order":3857,"group":7,"version":0.6},{"shortcodes":["crown"],"annotation":"crown","tags":["clothing","king","queen"],"emoji":"๐Ÿ‘‘","order":3858,"group":7,"version":0.6},{"shortcodes":["womans_hat"],"annotation":"womanโ€™s hat","tags":["clothing","hat","woman"],"emoji":"๐Ÿ‘’","order":3859,"group":7,"version":0.6},{"shortcodes":["top_hat","tophat"],"annotation":"top hat","tags":["clothing","hat","top","tophat"],"emoji":"๐ŸŽฉ","order":3860,"group":7,"version":0.6},{"shortcodes":["graduation_cap","mortar_board"],"annotation":"graduation cap","tags":["cap","celebration","clothing","graduation","hat"],"emoji":"๐ŸŽ“๏ธ","order":3861,"group":7,"version":0.6},{"shortcodes":["billed_cap"],"annotation":"billed cap","tags":["baseball cap"],"emoji":"๐Ÿงข","order":3862,"group":7,"version":5},{"shortcodes":["military_helmet"],"annotation":"military helmet","tags":["army","helmet","military","soldier","warrior"],"emoji":"๐Ÿช–","order":3863,"group":7,"version":13},{"shortcodes":["helmet_with_cross","rescue_worker_helmet"],"annotation":"rescue workerโ€™s helmet","tags":["aid","cross","face","hat","helmet"],"emoji":"โ›‘๏ธ","order":3865,"group":7,"version":0.7},{"shortcodes":["prayer_beads"],"annotation":"prayer beads","tags":["beads","clothing","necklace","prayer","religion"],"emoji":"๐Ÿ“ฟ","order":3866,"group":7,"version":1},{"shortcodes":["lipstick"],"annotation":"lipstick","tags":["cosmetics","makeup"],"emoji":"๐Ÿ’„","order":3867,"group":7,"version":0.6},{"shortcodes":["ring"],"annotation":"ring","tags":["diamond"],"emoji":"๐Ÿ’","order":3868,"group":7,"version":0.6},{"shortcodes":["gem"],"annotation":"gem stone","tags":["diamond","gem","jewel"],"emoji":"๐Ÿ’Ž","order":3869,"group":7,"version":0.6},{"shortcodes":["mute","no_sound"],"annotation":"muted speaker","tags":["mute","quiet","silent","speaker"],"emoji":"๐Ÿ”‡","order":3870,"group":7,"version":1},{"shortcodes":["low_volume","quiet_sound","speaker"],"annotation":"speaker low volume","tags":["soft"],"emoji":"๐Ÿ”ˆ๏ธ","order":3871,"group":7,"version":0.7},{"shortcodes":["medium_volumne","sound"],"annotation":"speaker medium volume","tags":["medium"],"emoji":"๐Ÿ”‰","order":3872,"group":7,"version":1},{"shortcodes":["high_volume","loud_sound"],"annotation":"speaker high volume","tags":["loud"],"emoji":"๐Ÿ”Š","order":3873,"group":7,"version":0.6},{"shortcodes":["loudspeaker"],"annotation":"loudspeaker","tags":["loud","public address"],"emoji":"๐Ÿ“ข","order":3874,"group":7,"version":0.6},{"shortcodes":["mega","megaphone"],"annotation":"megaphone","tags":["cheering"],"emoji":"๐Ÿ“ฃ","order":3875,"group":7,"version":0.6},{"shortcodes":["postal_horn"],"annotation":"postal horn","tags":["horn","post","postal"],"emoji":"๐Ÿ“ฏ","order":3876,"group":7,"version":1},{"shortcodes":["bell"],"annotation":"bell","tags":["bell"],"emoji":"๐Ÿ””","order":3877,"group":7,"version":0.6},{"shortcodes":["no_bell"],"annotation":"bell with slash","tags":["bell","forbidden","mute","quiet","silent"],"emoji":"๐Ÿ”•","order":3878,"group":7,"version":1},{"shortcodes":["musical_score"],"annotation":"musical score","tags":["music","score"],"emoji":"๐ŸŽผ","order":3879,"group":7,"version":0.6},{"shortcodes":["musical_note"],"annotation":"musical note","tags":["music","note"],"emoji":"๐ŸŽต","order":3880,"group":7,"version":0.6},{"shortcodes":["musical_notes","notes"],"annotation":"musical notes","tags":["music","note","notes"],"emoji":"๐ŸŽถ","order":3881,"group":7,"version":0.6},{"shortcodes":["studio_microphone"],"annotation":"studio microphone","tags":["mic","microphone","music","studio"],"emoji":"๐ŸŽ™๏ธ","order":3883,"group":7,"version":0.7},{"shortcodes":["level_slider"],"annotation":"level slider","tags":["level","music","slider"],"emoji":"๐ŸŽš๏ธ","order":3885,"group":7,"version":0.7},{"shortcodes":["control_knobs"],"annotation":"control knobs","tags":["control","knobs","music"],"emoji":"๐ŸŽ›๏ธ","order":3887,"group":7,"version":0.7},{"shortcodes":["microphone"],"annotation":"microphone","tags":["karaoke","mic"],"emoji":"๐ŸŽค","order":3888,"group":7,"version":0.6},{"shortcodes":["headphones"],"annotation":"headphone","tags":["earbud"],"emoji":"๐ŸŽง๏ธ","order":3889,"group":7,"version":0.6},{"shortcodes":["radio"],"annotation":"radio","tags":["video"],"emoji":"๐Ÿ“ป๏ธ","order":3890,"group":7,"version":0.6},{"shortcodes":["saxophone"],"annotation":"saxophone","tags":["instrument","music","sax"],"emoji":"๐ŸŽท","order":3891,"group":7,"version":0.6},{"shortcodes":["accordion"],"annotation":"accordion","tags":["concertina","squeeze box"],"emoji":"๐Ÿช—","order":3892,"group":7,"version":13},{"shortcodes":["guitar"],"annotation":"guitar","tags":["instrument","music"],"emoji":"๐ŸŽธ","order":3893,"group":7,"version":0.6},{"shortcodes":["musical_keyboard"],"annotation":"musical keyboard","tags":["instrument","keyboard","music","piano"],"emoji":"๐ŸŽน","order":3894,"group":7,"version":0.6},{"shortcodes":["trumpet"],"annotation":"trumpet","tags":["instrument","music"],"emoji":"๐ŸŽบ","order":3895,"group":7,"version":0.6},{"shortcodes":["violin"],"annotation":"violin","tags":["instrument","music"],"emoji":"๐ŸŽป","order":3896,"group":7,"version":0.6},{"shortcodes":["banjo"],"annotation":"banjo","tags":["music","stringed"],"emoji":"๐Ÿช•","order":3897,"group":7,"version":12},{"shortcodes":["drum"],"annotation":"drum","tags":["drumsticks","music"],"emoji":"๐Ÿฅ","order":3898,"group":7,"version":3},{"shortcodes":["long_drum"],"annotation":"long drum","tags":["beat","conga","drum","rhythm"],"emoji":"๐Ÿช˜","order":3899,"group":7,"version":13},{"shortcodes":["android","iphone","mobile_phone"],"annotation":"mobile phone","tags":["cell","mobile","phone","telephone"],"emoji":"๐Ÿ“ฑ","order":3900,"group":7,"version":0.6},{"shortcodes":["calling","mobile_phone_arrow"],"annotation":"mobile phone with arrow","tags":["arrow","cell","mobile","phone","receive"],"emoji":"๐Ÿ“ฒ","order":3901,"group":7,"version":0.6},{"shortcodes":["telephone"],"annotation":"telephone","tags":["phone"],"emoji":"โ˜Ž๏ธ","order":3903,"group":7,"version":0.6},{"shortcodes":["telephone_receiver"],"annotation":"telephone receiver","tags":["phone","receiver","telephone"],"emoji":"๐Ÿ“ž","order":3904,"group":7,"version":0.6},{"shortcodes":["pager"],"annotation":"pager","tags":["pager"],"emoji":"๐Ÿ“Ÿ๏ธ","order":3905,"group":7,"version":0.6},{"shortcodes":["fax","fax_machine"],"annotation":"fax machine","tags":["fax"],"emoji":"๐Ÿ“ ","order":3906,"group":7,"version":0.6},{"shortcodes":["battery"],"annotation":"battery","tags":["battery"],"emoji":"๐Ÿ”‹","order":3907,"group":7,"version":0.6},{"shortcodes":["low_battery"],"annotation":"low battery","tags":["electronic","low energy"],"emoji":"๐Ÿชซ","order":3908,"group":7,"version":14},{"shortcodes":["electric_plug"],"annotation":"electric plug","tags":["electric","electricity","plug"],"emoji":"๐Ÿ”Œ","order":3909,"group":7,"version":0.6},{"shortcodes":["laptop"],"annotation":"laptop","tags":["computer","pc","personal"],"emoji":"๐Ÿ’ป๏ธ","order":3910,"group":7,"version":0.6},{"shortcodes":["computer","desktop_computer"],"annotation":"desktop computer","tags":["computer","desktop"],"emoji":"๐Ÿ–ฅ๏ธ","order":3912,"group":7,"version":0.7},{"shortcodes":["printer"],"annotation":"printer","tags":["computer"],"emoji":"๐Ÿ–จ๏ธ","order":3914,"group":7,"version":0.7},{"shortcodes":["keyboard"],"annotation":"keyboard","tags":["computer"],"emoji":"โŒจ๏ธ","order":3916,"group":7,"version":1},{"shortcodes":["computer_mouse"],"annotation":"computer mouse","tags":["computer"],"emoji":"๐Ÿ–ฑ๏ธ","order":3918,"group":7,"version":0.7},{"shortcodes":["trackball"],"annotation":"trackball","tags":["computer"],"emoji":"๐Ÿ–ฒ๏ธ","order":3920,"group":7,"version":0.7},{"shortcodes":["computer_disk","minidisc"],"annotation":"computer disk","tags":["computer","disk","minidisk","optical"],"emoji":"๐Ÿ’ฝ","order":3921,"group":7,"version":0.6},{"shortcodes":["floppy_disk"],"annotation":"floppy disk","tags":["computer","disk","floppy"],"emoji":"๐Ÿ’พ","order":3922,"group":7,"version":0.6},{"shortcodes":["cd","optical_disk"],"annotation":"optical disk","tags":["cd","computer","disk","optical"],"emoji":"๐Ÿ’ฟ๏ธ","order":3923,"group":7,"version":0.6},{"shortcodes":["dvd"],"annotation":"dvd","tags":["blu-ray","computer","disk","optical"],"emoji":"๐Ÿ“€","order":3924,"group":7,"version":0.6},{"shortcodes":["abacus"],"annotation":"abacus","tags":["calculation"],"emoji":"๐Ÿงฎ","order":3925,"group":7,"version":11},{"shortcodes":["movie_camera"],"annotation":"movie camera","tags":["camera","cinema","movie"],"emoji":"๐ŸŽฅ","order":3926,"group":7,"version":0.6},{"shortcodes":["film_frames"],"annotation":"film frames","tags":["cinema","film","frames","movie"],"emoji":"๐ŸŽž๏ธ","order":3928,"group":7,"version":0.7},{"shortcodes":["film_projector"],"annotation":"film projector","tags":["cinema","film","movie","projector","video"],"emoji":"๐Ÿ“ฝ๏ธ","order":3930,"group":7,"version":0.7},{"shortcodes":["clapper"],"annotation":"clapper board","tags":["clapper","movie"],"emoji":"๐ŸŽฌ๏ธ","order":3931,"group":7,"version":0.6},{"shortcodes":["tv"],"annotation":"television","tags":["tv","video"],"emoji":"๐Ÿ“บ๏ธ","order":3932,"group":7,"version":0.6},{"shortcodes":["camera"],"annotation":"camera","tags":["video"],"emoji":"๐Ÿ“ท๏ธ","order":3933,"group":7,"version":0.6},{"shortcodes":["camera_with_flash"],"annotation":"camera with flash","tags":["camera","flash","video"],"emoji":"๐Ÿ“ธ","order":3934,"group":7,"version":1},{"shortcodes":["video_camera"],"annotation":"video camera","tags":["camera","video"],"emoji":"๐Ÿ“น๏ธ","order":3935,"group":7,"version":0.6},{"shortcodes":["vhs","videocassette"],"annotation":"videocassette","tags":["tape","vhs","video"],"emoji":"๐Ÿ“ผ","order":3936,"group":7,"version":0.6},{"shortcodes":["mag"],"annotation":"magnifying glass tilted left","tags":["glass","magnifying","search","tool"],"emoji":"๐Ÿ”๏ธ","order":3937,"group":7,"version":0.6},{"shortcodes":["mag_right"],"annotation":"magnifying glass tilted right","tags":["glass","magnifying","search","tool"],"emoji":"๐Ÿ”Ž","order":3938,"group":7,"version":0.6},{"shortcodes":["candle"],"annotation":"candle","tags":["light"],"emoji":"๐Ÿ•ฏ๏ธ","order":3940,"group":7,"version":0.7},{"shortcodes":["bulb","light_bulb"],"annotation":"light bulb","tags":["bulb","comic","electric","idea","light"],"emoji":"๐Ÿ’ก","order":3941,"group":7,"version":0.6},{"shortcodes":["flashlight"],"annotation":"flashlight","tags":["electric","light","tool","torch"],"emoji":"๐Ÿ”ฆ","order":3942,"group":7,"version":0.6},{"shortcodes":["izakaya_lantern","red_paper_lantern"],"annotation":"red paper lantern","tags":["bar","lantern","light","red"],"emoji":"๐Ÿฎ","order":3943,"group":7,"version":0.6},{"shortcodes":["diya_lamp"],"annotation":"diya lamp","tags":["diya","lamp","oil"],"emoji":"๐Ÿช”","order":3944,"group":7,"version":12},{"shortcodes":["notebook_with_decorative_cover"],"annotation":"notebook with decorative cover","tags":["book","cover","decorated","notebook"],"emoji":"๐Ÿ“”","order":3945,"group":7,"version":0.6},{"shortcodes":["closed_book"],"annotation":"closed book","tags":["book","closed"],"emoji":"๐Ÿ“•","order":3946,"group":7,"version":0.6},{"shortcodes":["book","open_book"],"annotation":"open book","tags":["book","open"],"emoji":"๐Ÿ“–","order":3947,"group":7,"version":0.6},{"shortcodes":["green_book"],"annotation":"green book","tags":["book","green"],"emoji":"๐Ÿ“—","order":3948,"group":7,"version":0.6},{"shortcodes":["blue_book"],"annotation":"blue book","tags":["blue","book"],"emoji":"๐Ÿ“˜","order":3949,"group":7,"version":0.6},{"shortcodes":["orange_book"],"annotation":"orange book","tags":["book","orange"],"emoji":"๐Ÿ“™","order":3950,"group":7,"version":0.6},{"shortcodes":["books"],"annotation":"books","tags":["book"],"emoji":"๐Ÿ“š๏ธ","order":3951,"group":7,"version":0.6},{"shortcodes":["notebook"],"annotation":"notebook","tags":["notebook"],"emoji":"๐Ÿ““","order":3952,"group":7,"version":0.6},{"shortcodes":["ledger"],"annotation":"ledger","tags":["notebook"],"emoji":"๐Ÿ“’","order":3953,"group":7,"version":0.6},{"shortcodes":["page_with_curl"],"annotation":"page with curl","tags":["curl","document","page"],"emoji":"๐Ÿ“ƒ","order":3954,"group":7,"version":0.6},{"shortcodes":["scroll"],"annotation":"scroll","tags":["paper"],"emoji":"๐Ÿ“œ","order":3955,"group":7,"version":0.6},{"shortcodes":["page_facing_up"],"annotation":"page facing up","tags":["document","page"],"emoji":"๐Ÿ“„","order":3956,"group":7,"version":0.6},{"shortcodes":["newspaper"],"annotation":"newspaper","tags":["news","paper"],"emoji":"๐Ÿ“ฐ","order":3957,"group":7,"version":0.6},{"shortcodes":["rolled_up_newspaper"],"annotation":"rolled-up newspaper","tags":["news","newspaper","paper","rolled"],"emoji":"๐Ÿ—ž๏ธ","order":3959,"group":7,"version":0.7},{"shortcodes":["bookmark_tabs"],"annotation":"bookmark tabs","tags":["bookmark","mark","marker","tabs"],"emoji":"๐Ÿ“‘","order":3960,"group":7,"version":0.6},{"shortcodes":["bookmark"],"annotation":"bookmark","tags":["mark"],"emoji":"๐Ÿ”–","order":3961,"group":7,"version":0.6},{"shortcodes":["label"],"annotation":"label","tags":["label"],"emoji":"๐Ÿท๏ธ","order":3963,"group":7,"version":0.7},{"shortcodes":["moneybag"],"annotation":"money bag","tags":["bag","dollar","money","moneybag"],"emoji":"๐Ÿ’ฐ๏ธ","order":3964,"group":7,"version":0.6},{"shortcodes":["coin"],"annotation":"coin","tags":["gold","metal","money","silver","treasure"],"emoji":"๐Ÿช™","order":3965,"group":7,"version":13},{"shortcodes":["yen"],"annotation":"yen banknote","tags":["banknote","bill","currency","money","note","yen"],"emoji":"๐Ÿ’ด","order":3966,"group":7,"version":0.6},{"shortcodes":["dollar"],"annotation":"dollar banknote","tags":["banknote","bill","currency","dollar","money","note"],"emoji":"๐Ÿ’ต","order":3967,"group":7,"version":0.6},{"shortcodes":["euro"],"annotation":"euro banknote","tags":["banknote","bill","currency","euro","money","note"],"emoji":"๐Ÿ’ถ","order":3968,"group":7,"version":1},{"shortcodes":["pound"],"annotation":"pound banknote","tags":["banknote","bill","currency","money","note","pound"],"emoji":"๐Ÿ’ท","order":3969,"group":7,"version":1},{"shortcodes":["money_with_wings"],"annotation":"money with wings","tags":["banknote","bill","fly","money","wings"],"emoji":"๐Ÿ’ธ","order":3970,"group":7,"version":0.6},{"shortcodes":["credit_card"],"annotation":"credit card","tags":["card","credit","money"],"emoji":"๐Ÿ’ณ๏ธ","order":3971,"group":7,"version":0.6},{"shortcodes":["receipt"],"annotation":"receipt","tags":["accounting","bookkeeping","evidence","proof"],"emoji":"๐Ÿงพ","order":3972,"group":7,"version":11},{"shortcodes":["chart"],"annotation":"chart increasing with yen","tags":["chart","graph","growth","money","yen"],"emoji":"๐Ÿ’น","order":3973,"group":7,"version":0.6},{"shortcodes":["envelope"],"annotation":"envelope","tags":["email","letter"],"emoji":"โœ‰๏ธ","order":3975,"group":7,"version":0.6},{"shortcodes":["e-mail","email"],"annotation":"e-mail","tags":["email","letter","mail"],"emoji":"๐Ÿ“ง","order":3976,"group":7,"version":0.6},{"shortcodes":["incoming_envelope"],"annotation":"incoming envelope","tags":["e-mail","email","envelope","incoming","letter","receive"],"emoji":"๐Ÿ“จ","order":3977,"group":7,"version":0.6},{"shortcodes":["envelope_with_arrow"],"annotation":"envelope with arrow","tags":["arrow","e-mail","email","envelope","outgoing"],"emoji":"๐Ÿ“ฉ","order":3978,"group":7,"version":0.6},{"shortcodes":["outbox_tray"],"annotation":"outbox tray","tags":["box","letter","mail","outbox","sent","tray"],"emoji":"๐Ÿ“ค๏ธ","order":3979,"group":7,"version":0.6},{"shortcodes":["inbox_tray"],"annotation":"inbox tray","tags":["box","inbox","letter","mail","receive","tray"],"emoji":"๐Ÿ“ฅ๏ธ","order":3980,"group":7,"version":0.6},{"shortcodes":["package"],"annotation":"package","tags":["box","parcel"],"emoji":"๐Ÿ“ฆ๏ธ","order":3981,"group":7,"version":0.6},{"shortcodes":["mailbox"],"annotation":"closed mailbox with raised flag","tags":["closed","mail","mailbox","postbox"],"emoji":"๐Ÿ“ซ๏ธ","order":3982,"group":7,"version":0.6},{"shortcodes":["mailbox_closed"],"annotation":"closed mailbox with lowered flag","tags":["closed","lowered","mail","mailbox","postbox"],"emoji":"๐Ÿ“ช๏ธ","order":3983,"group":7,"version":0.6},{"shortcodes":["mailbox_with_mail"],"annotation":"open mailbox with raised flag","tags":["mail","mailbox","open","postbox"],"emoji":"๐Ÿ“ฌ๏ธ","order":3984,"group":7,"version":0.7},{"shortcodes":["mailbox_with_no_mail"],"annotation":"open mailbox with lowered flag","tags":["lowered","mail","mailbox","open","postbox"],"emoji":"๐Ÿ“ญ๏ธ","order":3985,"group":7,"version":0.7},{"shortcodes":["postbox"],"annotation":"postbox","tags":["mail","mailbox"],"emoji":"๐Ÿ“ฎ","order":3986,"group":7,"version":0.6},{"shortcodes":["ballot_box"],"annotation":"ballot box with ballot","tags":["ballot","box"],"emoji":"๐Ÿ—ณ๏ธ","order":3988,"group":7,"version":0.7},{"shortcodes":["pencil"],"annotation":"pencil","tags":["pencil"],"emoji":"โœ๏ธ","order":3990,"group":7,"version":0.6},{"shortcodes":["black_nib"],"annotation":"black nib","tags":["nib","pen"],"emoji":"โœ’๏ธ","order":3992,"group":7,"version":0.6},{"shortcodes":["fountain_pen"],"annotation":"fountain pen","tags":["fountain","pen"],"emoji":"๐Ÿ–‹๏ธ","order":3994,"group":7,"version":0.7},{"shortcodes":["pen"],"annotation":"pen","tags":["ballpoint"],"emoji":"๐Ÿ–Š๏ธ","order":3996,"group":7,"version":0.7},{"shortcodes":["paintbrush"],"annotation":"paintbrush","tags":["painting"],"emoji":"๐Ÿ–Œ๏ธ","order":3998,"group":7,"version":0.7},{"shortcodes":["crayon"],"annotation":"crayon","tags":["crayon"],"emoji":"๐Ÿ–๏ธ","order":4000,"group":7,"version":0.7},{"shortcodes":["memo"],"annotation":"memo","tags":["pencil"],"emoji":"๐Ÿ“","order":4001,"group":7,"version":0.6},{"shortcodes":["briefcase"],"annotation":"briefcase","tags":["briefcase"],"emoji":"๐Ÿ’ผ","order":4002,"group":7,"version":0.6},{"shortcodes":["file_folder"],"annotation":"file folder","tags":["file","folder"],"emoji":"๐Ÿ“","order":4003,"group":7,"version":0.6},{"shortcodes":["open_file_folder"],"annotation":"open file folder","tags":["file","folder","open"],"emoji":"๐Ÿ“‚","order":4004,"group":7,"version":0.6},{"shortcodes":["card_index_dividers"],"annotation":"card index dividers","tags":["card","dividers","index"],"emoji":"๐Ÿ—‚๏ธ","order":4006,"group":7,"version":0.7},{"shortcodes":["date"],"annotation":"calendar","tags":["date"],"emoji":"๐Ÿ“…","order":4007,"group":7,"version":0.6},{"shortcodes":["calendar"],"annotation":"tear-off calendar","tags":["calendar"],"emoji":"๐Ÿ“†","order":4008,"group":7,"version":0.6},{"shortcodes":["notepad_spiral"],"annotation":"spiral notepad","tags":["note","pad","spiral"],"emoji":"๐Ÿ—’๏ธ","order":4010,"group":7,"version":0.7},{"shortcodes":["calendar_spiral"],"annotation":"spiral calendar","tags":["calendar","pad","spiral"],"emoji":"๐Ÿ—“๏ธ","order":4012,"group":7,"version":0.7},{"shortcodes":["card_index"],"annotation":"card index","tags":["card","index","rolodex"],"emoji":"๐Ÿ“‡","order":4013,"group":7,"version":0.6},{"shortcodes":["chart_increasing","chart_with_upwards_trend"],"annotation":"chart increasing","tags":["chart","graph","growth","trend","upward"],"emoji":"๐Ÿ“ˆ","order":4014,"group":7,"version":0.6},{"shortcodes":["chart_decreasing","chart_with_downwards_trend"],"annotation":"chart decreasing","tags":["chart","down","graph","trend"],"emoji":"๐Ÿ“‰","order":4015,"group":7,"version":0.6},{"shortcodes":["bar_chart"],"annotation":"bar chart","tags":["bar","chart","graph"],"emoji":"๐Ÿ“Š","order":4016,"group":7,"version":0.6},{"shortcodes":["clipboard"],"annotation":"clipboard","tags":["clipboard"],"emoji":"๐Ÿ“‹๏ธ","order":4017,"group":7,"version":0.6},{"shortcodes":["pushpin"],"annotation":"pushpin","tags":["pin"],"emoji":"๐Ÿ“Œ","order":4018,"group":7,"version":0.6},{"shortcodes":["round_pushpin"],"annotation":"round pushpin","tags":["pin","pushpin"],"emoji":"๐Ÿ“","order":4019,"group":7,"version":0.6},{"shortcodes":["paperclip"],"annotation":"paperclip","tags":["paperclip"],"emoji":"๐Ÿ“Ž","order":4020,"group":7,"version":0.6},{"shortcodes":["paperclips"],"annotation":"linked paperclips","tags":["link","paperclip"],"emoji":"๐Ÿ–‡๏ธ","order":4022,"group":7,"version":0.7},{"shortcodes":["straight_ruler"],"annotation":"straight ruler","tags":["ruler","straight edge"],"emoji":"๐Ÿ“","order":4023,"group":7,"version":0.6},{"shortcodes":["triangular_ruler"],"annotation":"triangular ruler","tags":["ruler","set","triangle"],"emoji":"๐Ÿ“","order":4024,"group":7,"version":0.6},{"shortcodes":["scissors"],"annotation":"scissors","tags":["cutting","tool"],"emoji":"โœ‚๏ธ","order":4026,"group":7,"version":0.6},{"shortcodes":["card_file_box"],"annotation":"card file box","tags":["box","card","file"],"emoji":"๐Ÿ—ƒ๏ธ","order":4028,"group":7,"version":0.7},{"shortcodes":["file_cabinet"],"annotation":"file cabinet","tags":["cabinet","file","filing"],"emoji":"๐Ÿ—„๏ธ","order":4030,"group":7,"version":0.7},{"shortcodes":["trashcan","wastebasket"],"annotation":"wastebasket","tags":["wastebasket"],"emoji":"๐Ÿ—‘๏ธ","order":4032,"group":7,"version":0.7},{"shortcodes":["lock","locked"],"annotation":"locked","tags":["closed"],"emoji":"๐Ÿ”’๏ธ","order":4033,"group":7,"version":0.6},{"shortcodes":["unlock","unlocked"],"annotation":"unlocked","tags":["lock","open","unlock"],"emoji":"๐Ÿ”“๏ธ","order":4034,"group":7,"version":0.6},{"shortcodes":["lock_with_ink_pen","locked_with_pen"],"annotation":"locked with pen","tags":["ink","lock","nib","pen","privacy"],"emoji":"๐Ÿ”","order":4035,"group":7,"version":0.6},{"shortcodes":["closed_lock_with_key","locked_with_key"],"annotation":"locked with key","tags":["closed","key","lock","secure"],"emoji":"๐Ÿ”","order":4036,"group":7,"version":0.6},{"shortcodes":["key"],"annotation":"key","tags":["lock","password"],"emoji":"๐Ÿ”‘","order":4037,"group":7,"version":0.6},{"shortcodes":["old_key"],"annotation":"old key","tags":["clue","key","lock","old"],"emoji":"๐Ÿ—๏ธ","order":4039,"group":7,"version":0.7},{"shortcodes":["hammer"],"annotation":"hammer","tags":["tool"],"emoji":"๐Ÿ”จ","order":4040,"group":7,"version":0.6},{"shortcodes":["axe"],"annotation":"axe","tags":["chop","hatchet","split","wood"],"emoji":"๐Ÿช“","order":4041,"group":7,"version":12},{"shortcodes":["pick"],"annotation":"pick","tags":["mining","tool"],"emoji":"โ›๏ธ","order":4043,"group":7,"version":0.7},{"shortcodes":["hammer_and_pick"],"annotation":"hammer and pick","tags":["hammer","pick","tool"],"emoji":"โš’๏ธ","order":4045,"group":7,"version":1},{"shortcodes":["hammer_and_wrench"],"annotation":"hammer and wrench","tags":["hammer","spanner","tool","wrench"],"emoji":"๐Ÿ› ๏ธ","order":4047,"group":7,"version":0.7},{"shortcodes":["dagger"],"annotation":"dagger","tags":["knife","weapon"],"emoji":"๐Ÿ—ก๏ธ","order":4049,"group":7,"version":0.7},{"shortcodes":["crossed_swords"],"annotation":"crossed swords","tags":["crossed","swords","weapon"],"emoji":"โš”๏ธ","order":4051,"group":7,"version":1},{"shortcodes":["gun","pistol"],"annotation":"water pistol","tags":["gun","handgun","pistol","revolver","tool","water","weapon"],"emoji":"๐Ÿ”ซ","order":4052,"group":7,"version":0.6},{"shortcodes":["boomerang"],"annotation":"boomerang","tags":["australia","rebound","repercussion"],"emoji":"๐Ÿชƒ","order":4053,"group":7,"version":13},{"shortcodes":["bow_and_arrow"],"annotation":"bow and arrow","tags":["archer","arrow","bow","sagittarius","zodiac"],"emoji":"๐Ÿน","order":4054,"group":7,"version":1},{"shortcodes":["shield"],"annotation":"shield","tags":["weapon"],"emoji":"๐Ÿ›ก๏ธ","order":4056,"group":7,"version":0.7},{"shortcodes":["carpentry_saw"],"annotation":"carpentry saw","tags":["carpenter","lumber","saw","tool"],"emoji":"๐Ÿชš","order":4057,"group":7,"version":13},{"shortcodes":["wrench"],"annotation":"wrench","tags":["spanner","tool"],"emoji":"๐Ÿ”ง","order":4058,"group":7,"version":0.6},{"shortcodes":["screwdriver"],"annotation":"screwdriver","tags":["screw","tool"],"emoji":"๐Ÿช›","order":4059,"group":7,"version":13},{"shortcodes":["nut_and_bolt"],"annotation":"nut and bolt","tags":["bolt","nut","tool"],"emoji":"๐Ÿ”ฉ","order":4060,"group":7,"version":0.6},{"shortcodes":["gear"],"annotation":"gear","tags":["cog","cogwheel","tool"],"emoji":"โš™๏ธ","order":4062,"group":7,"version":1},{"shortcodes":["clamp","compression"],"annotation":"clamp","tags":["compress","tool","vice"],"emoji":"๐Ÿ—œ๏ธ","order":4064,"group":7,"version":0.7},{"shortcodes":["scales"],"annotation":"balance scale","tags":["balance","justice","libra","scale","zodiac"],"emoji":"โš–๏ธ","order":4066,"group":7,"version":1},{"shortcodes":["probing_cane","white_cane"],"annotation":"white cane","tags":["accessibility","blind"],"emoji":"๐Ÿฆฏ","order":4067,"group":7,"version":12},{"shortcodes":["link"],"annotation":"link","tags":["link"],"emoji":"๐Ÿ”—","order":4068,"group":7,"version":0.6},{"shortcodes":["chains"],"annotation":"chains","tags":["chain"],"emoji":"โ›“๏ธ","order":4070,"group":7,"version":0.7},{"shortcodes":["hook"],"annotation":"hook","tags":["catch","crook","curve","ensnare","selling point"],"emoji":"๐Ÿช","order":4071,"group":7,"version":13},{"shortcodes":["toolbox"],"annotation":"toolbox","tags":["chest","mechanic","tool"],"emoji":"๐Ÿงฐ","order":4072,"group":7,"version":11},{"shortcodes":["magnet"],"annotation":"magnet","tags":["attraction","horseshoe","magnetic"],"emoji":"๐Ÿงฒ","order":4073,"group":7,"version":11},{"shortcodes":["ladder"],"annotation":"ladder","tags":["climb","rung","step"],"emoji":"๐Ÿชœ","order":4074,"group":7,"version":13},{"shortcodes":["alembic"],"annotation":"alembic","tags":["chemistry","tool"],"emoji":"โš—๏ธ","order":4076,"group":7,"version":1},{"shortcodes":["test_tube"],"annotation":"test tube","tags":["chemist","chemistry","experiment","lab","science"],"emoji":"๐Ÿงช","order":4077,"group":7,"version":11},{"shortcodes":["petri_dish"],"annotation":"petri dish","tags":["bacteria","biologist","biology","culture","lab"],"emoji":"๐Ÿงซ","order":4078,"group":7,"version":11},{"shortcodes":["dna","double_helix"],"annotation":"dna","tags":["biologist","evolution","gene","genetics","life"],"emoji":"๐Ÿงฌ","order":4079,"group":7,"version":11},{"shortcodes":["microscope"],"annotation":"microscope","tags":["science","tool"],"emoji":"๐Ÿ”ฌ","order":4080,"group":7,"version":1},{"shortcodes":["telescope"],"annotation":"telescope","tags":["science","tool"],"emoji":"๐Ÿ”ญ","order":4081,"group":7,"version":1},{"shortcodes":["satellite_antenna"],"annotation":"satellite antenna","tags":["antenna","dish","satellite"],"emoji":"๐Ÿ“ก","order":4082,"group":7,"version":0.6},{"shortcodes":["syringe"],"annotation":"syringe","tags":["medicine","needle","shot","sick"],"emoji":"๐Ÿ’‰","order":4083,"group":7,"version":0.6},{"shortcodes":["drop_of_blood"],"annotation":"drop of blood","tags":["bleed","blood donation","injury","medicine","menstruation"],"emoji":"๐Ÿฉธ","order":4084,"group":7,"version":12},{"shortcodes":["pill"],"annotation":"pill","tags":["doctor","medicine","sick"],"emoji":"๐Ÿ’Š","order":4085,"group":7,"version":0.6},{"shortcodes":["adhesive_bandage","bandaid"],"annotation":"adhesive bandage","tags":["bandage"],"emoji":"๐Ÿฉน","order":4086,"group":7,"version":12},{"shortcodes":["crutch"],"annotation":"crutch","tags":["cane","disability","hurt","mobility aid","stick"],"emoji":"๐Ÿฉผ","order":4087,"group":7,"version":14},{"shortcodes":["stethoscope"],"annotation":"stethoscope","tags":["doctor","heart","medicine"],"emoji":"๐Ÿฉบ","order":4088,"group":7,"version":12},{"shortcodes":["x-ray","xray"],"annotation":"x-ray","tags":["bones","doctor","medical","skeleton"],"emoji":"๐Ÿฉป","order":4089,"group":7,"version":14},{"shortcodes":["door"],"annotation":"door","tags":["door"],"emoji":"๐Ÿšช","order":4090,"group":7,"version":0.6},{"shortcodes":["elevator"],"annotation":"elevator","tags":["accessibility","hoist","lift"],"emoji":"๐Ÿ›—","order":4091,"group":7,"version":13},{"shortcodes":["mirror"],"annotation":"mirror","tags":["reflection","reflector","speculum"],"emoji":"๐Ÿชž","order":4092,"group":7,"version":13},{"shortcodes":["window"],"annotation":"window","tags":["frame","fresh air","opening","transparent","view"],"emoji":"๐ŸชŸ","order":4093,"group":7,"version":13},{"shortcodes":["bed"],"annotation":"bed","tags":["hotel","sleep"],"emoji":"๐Ÿ›๏ธ","order":4095,"group":7,"version":0.7},{"shortcodes":["couch_and_lamp"],"annotation":"couch and lamp","tags":["couch","hotel","lamp"],"emoji":"๐Ÿ›‹๏ธ","order":4097,"group":7,"version":0.7},{"shortcodes":["chair"],"annotation":"chair","tags":["seat","sit"],"emoji":"๐Ÿช‘","order":4098,"group":7,"version":12},{"shortcodes":["toilet"],"annotation":"toilet","tags":["toilet"],"emoji":"๐Ÿšฝ","order":4099,"group":7,"version":0.6},{"shortcodes":["plunger"],"annotation":"plunger","tags":["force cup","plumber","suction","toilet"],"emoji":"๐Ÿช ","order":4100,"group":7,"version":13},{"shortcodes":["shower"],"annotation":"shower","tags":["water"],"emoji":"๐Ÿšฟ","order":4101,"group":7,"version":1},{"shortcodes":["bathtub"],"annotation":"bathtub","tags":["bath"],"emoji":"๐Ÿ›","order":4102,"group":7,"version":1},{"shortcodes":["mouse_trap"],"annotation":"mouse trap","tags":["bait","mousetrap","snare","trap"],"emoji":"๐Ÿชค","order":4103,"group":7,"version":13},{"shortcodes":["razor"],"annotation":"razor","tags":["sharp","shave"],"emoji":"๐Ÿช’","order":4104,"group":7,"version":12},{"shortcodes":["lotion_bottle"],"annotation":"lotion bottle","tags":["lotion","moisturizer","shampoo","sunscreen"],"emoji":"๐Ÿงด","order":4105,"group":7,"version":11},{"shortcodes":["safety_pin"],"annotation":"safety pin","tags":["diaper","punk rock"],"emoji":"๐Ÿงท","order":4106,"group":7,"version":11},{"shortcodes":["broom"],"annotation":"broom","tags":["cleaning","sweeping","witch"],"emoji":"๐Ÿงน","order":4107,"group":7,"version":11},{"shortcodes":["basket"],"annotation":"basket","tags":["farming","laundry","picnic"],"emoji":"๐Ÿงบ","order":4108,"group":7,"version":11},{"shortcodes":["roll_of_paper","toilet_paper"],"annotation":"roll of paper","tags":["paper towels","toilet paper"],"emoji":"๐Ÿงป","order":4109,"group":7,"version":11},{"shortcodes":["bucket"],"annotation":"bucket","tags":["cask","pail","vat"],"emoji":"๐Ÿชฃ","order":4110,"group":7,"version":13},{"shortcodes":["soap"],"annotation":"soap","tags":["bar","bathing","cleaning","lather","soapdish"],"emoji":"๐Ÿงผ","order":4111,"group":7,"version":11},{"shortcodes":["bubbles"],"annotation":"bubbles","tags":["burp","clean","soap","underwater"],"emoji":"๐Ÿซง","order":4112,"group":7,"version":14},{"shortcodes":["toothbrush"],"annotation":"toothbrush","tags":["bathroom","brush","clean","dental","hygiene","teeth"],"emoji":"๐Ÿชฅ","order":4113,"group":7,"version":13},{"shortcodes":["sponge"],"annotation":"sponge","tags":["absorbing","cleaning","porous"],"emoji":"๐Ÿงฝ","order":4114,"group":7,"version":11},{"shortcodes":["fire_extinguisher"],"annotation":"fire extinguisher","tags":["extinguish","fire","quench"],"emoji":"๐Ÿงฏ","order":4115,"group":7,"version":11},{"shortcodes":["shopping_cart"],"annotation":"shopping cart","tags":["cart","shopping","trolley"],"emoji":"๐Ÿ›’","order":4116,"group":7,"version":3},{"shortcodes":["cigarette","smoking"],"annotation":"cigarette","tags":["smoking"],"emoji":"๐Ÿšฌ","order":4117,"group":7,"version":0.6},{"shortcodes":["coffin"],"annotation":"coffin","tags":["death"],"emoji":"โšฐ๏ธ","order":4119,"group":7,"version":1},{"shortcodes":["headstone"],"annotation":"headstone","tags":["cemetery","grave","graveyard","tombstone"],"emoji":"๐Ÿชฆ","order":4120,"group":7,"version":13},{"shortcodes":["funeral_urn"],"annotation":"funeral urn","tags":["ashes","death","funeral","urn"],"emoji":"โšฑ๏ธ","order":4122,"group":7,"version":1},{"shortcodes":["moai","moyai"],"annotation":"moai","tags":["face","moyai","statue"],"emoji":"๐Ÿ—ฟ","order":4123,"group":7,"version":0.6},{"shortcodes":["placard"],"annotation":"placard","tags":["demonstration","picket","protest","sign"],"emoji":"๐Ÿชง","order":4124,"group":7,"version":13},{"shortcodes":["id_card"],"annotation":"identification card","tags":["credentials","id","license","security"],"emoji":"๐Ÿชช","order":4125,"group":7,"version":14},{"shortcodes":["atm"],"annotation":"ATM sign","tags":["atm","atm sign","automated","bank","teller"],"emoji":"๐Ÿง","order":4126,"group":8,"version":0.6},{"shortcodes":["litter_bin","put_litter_in_its_place"],"annotation":"litter in bin sign","tags":["litter","litter bin"],"emoji":"๐Ÿšฎ","order":4127,"group":8,"version":1},{"shortcodes":["potable_water"],"annotation":"potable water","tags":["drinking","potable","water"],"emoji":"๐Ÿšฐ","order":4128,"group":8,"version":1},{"shortcodes":["handicapped","wheelchair"],"annotation":"wheelchair symbol","tags":["access"],"emoji":"โ™ฟ๏ธ","order":4129,"group":8,"version":0.6},{"shortcodes":["mens"],"annotation":"menโ€™s room","tags":["bathroom","lavatory","man","restroom","toilet","wc"],"emoji":"๐Ÿšน๏ธ","order":4130,"group":8,"version":0.6},{"shortcodes":["womens"],"annotation":"womenโ€™s room","tags":["bathroom","lavatory","restroom","toilet","wc","woman"],"emoji":"๐Ÿšบ๏ธ","order":4131,"group":8,"version":0.6},{"shortcodes":["bathroom","restroom"],"annotation":"restroom","tags":["bathroom","lavatory","toilet","wc"],"emoji":"๐Ÿšป","order":4132,"group":8,"version":0.6},{"shortcodes":["baby_symbol"],"annotation":"baby symbol","tags":["baby","changing"],"emoji":"๐Ÿšผ๏ธ","order":4133,"group":8,"version":0.6},{"shortcodes":["water_closet","wc"],"annotation":"water closet","tags":["bathroom","closet","lavatory","restroom","toilet","water","wc"],"emoji":"๐Ÿšพ","order":4134,"group":8,"version":0.6},{"shortcodes":["passport_control"],"annotation":"passport control","tags":["control","passport"],"emoji":"๐Ÿ›‚","order":4135,"group":8,"version":1},{"shortcodes":["customs"],"annotation":"customs","tags":["customs"],"emoji":"๐Ÿ›ƒ","order":4136,"group":8,"version":1},{"shortcodes":["baggage_claim"],"annotation":"baggage claim","tags":["baggage","claim"],"emoji":"๐Ÿ›„","order":4137,"group":8,"version":1},{"shortcodes":["left_luggage"],"annotation":"left luggage","tags":["baggage","locker","luggage"],"emoji":"๐Ÿ›…","order":4138,"group":8,"version":1},{"shortcodes":["warning"],"annotation":"warning","tags":["warning"],"emoji":"โš ๏ธ","order":4140,"group":8,"version":0.6},{"shortcodes":["children_crossing"],"annotation":"children crossing","tags":["child","crossing","pedestrian","traffic"],"emoji":"๐Ÿšธ","order":4141,"group":8,"version":1},{"shortcodes":["no_entry"],"annotation":"no entry","tags":["entry","forbidden","no","not","prohibited","traffic"],"emoji":"โ›”๏ธ","order":4142,"group":8,"version":0.6},{"shortcodes":["no_entry_sign"],"annotation":"prohibited","tags":["entry","forbidden","no","not"],"emoji":"๐Ÿšซ","order":4143,"group":8,"version":0.6},{"shortcodes":["no_bicycles"],"annotation":"no bicycles","tags":["bicycle","bike","forbidden","no","prohibited"],"emoji":"๐Ÿšณ","order":4144,"group":8,"version":1},{"shortcodes":["no_smoking"],"annotation":"no smoking","tags":["forbidden","no","not","prohibited","smoking"],"emoji":"๐Ÿšญ๏ธ","order":4145,"group":8,"version":0.6},{"shortcodes":["do_not_litter","no_littering"],"annotation":"no littering","tags":["forbidden","litter","no","not","prohibited"],"emoji":"๐Ÿšฏ","order":4146,"group":8,"version":1},{"shortcodes":["non-potable_water"],"annotation":"non-potable water","tags":["non-drinking","non-potable","water"],"emoji":"๐Ÿšฑ","order":4147,"group":8,"version":1},{"shortcodes":["no_pedestrians"],"annotation":"no pedestrians","tags":["forbidden","no","not","pedestrian","prohibited"],"emoji":"๐Ÿšท","order":4148,"group":8,"version":1},{"shortcodes":["no_mobile_phones"],"annotation":"no mobile phones","tags":["cell","forbidden","mobile","no","phone"],"emoji":"๐Ÿ“ต","order":4149,"group":8,"version":1},{"shortcodes":["no_one_under_18","underage"],"annotation":"no one under eighteen","tags":["18","age restriction","eighteen","prohibited","underage"],"emoji":"๐Ÿ”ž","order":4150,"group":8,"version":0.6},{"shortcodes":["radioactive"],"annotation":"radioactive","tags":["sign"],"emoji":"โ˜ข๏ธ","order":4152,"group":8,"version":1},{"shortcodes":["biohazard"],"annotation":"biohazard","tags":["sign"],"emoji":"โ˜ฃ๏ธ","order":4154,"group":8,"version":1},{"shortcodes":["arrow_up"],"annotation":"up arrow","tags":["arrow","cardinal","direction","north"],"emoji":"โฌ†๏ธ","order":4156,"group":8,"version":0.6},{"shortcodes":["arrow_upper_right"],"annotation":"up-right arrow","tags":["arrow","direction","intercardinal","northeast"],"emoji":"โ†—๏ธ","order":4158,"group":8,"version":0.6},{"shortcodes":["arrow_right"],"annotation":"right arrow","tags":["arrow","cardinal","direction","east"],"emoji":"โžก๏ธ","order":4160,"group":8,"version":0.6},{"shortcodes":["arrow_lower_right"],"annotation":"down-right arrow","tags":["arrow","direction","intercardinal","southeast"],"emoji":"โ†˜๏ธ","order":4162,"group":8,"version":0.6},{"shortcodes":["arrow_down"],"annotation":"down arrow","tags":["arrow","cardinal","direction","down","south"],"emoji":"โฌ‡๏ธ","order":4164,"group":8,"version":0.6},{"shortcodes":["arrow_lower_left"],"annotation":"down-left arrow","tags":["arrow","direction","intercardinal","southwest"],"emoji":"โ†™๏ธ","order":4166,"group":8,"version":0.6},{"shortcodes":["arrow_left"],"annotation":"left arrow","tags":["arrow","cardinal","direction","west"],"emoji":"โฌ…๏ธ","order":4168,"group":8,"version":0.6},{"shortcodes":["arrow_upper_left"],"annotation":"up-left arrow","tags":["arrow","direction","intercardinal","northwest"],"emoji":"โ†–๏ธ","order":4170,"group":8,"version":0.6},{"shortcodes":["arrow_up_down"],"annotation":"up-down arrow","tags":["arrow"],"emoji":"โ†•๏ธ","order":4172,"group":8,"version":0.6},{"shortcodes":["left_right_arrow"],"annotation":"left-right arrow","tags":["arrow"],"emoji":"โ†”๏ธ","order":4174,"group":8,"version":0.6},{"shortcodes":["arrow_left_hook","leftwards_arrow_with_hook"],"annotation":"right arrow curving left","tags":["arrow"],"emoji":"โ†ฉ๏ธ","order":4176,"group":8,"version":0.6},{"shortcodes":["arrow_right_hook","rightwards_arrow_with_hook"],"annotation":"left arrow curving right","tags":["arrow"],"emoji":"โ†ช๏ธ","order":4178,"group":8,"version":0.6},{"shortcodes":["arrow_heading_up"],"annotation":"right arrow curving up","tags":["arrow"],"emoji":"โคด๏ธ","order":4180,"group":8,"version":0.6},{"shortcodes":["arrow_heading_down"],"annotation":"right arrow curving down","tags":["arrow","down"],"emoji":"โคต๏ธ","order":4182,"group":8,"version":0.6},{"shortcodes":["arrows_clockwise","clockwise"],"annotation":"clockwise vertical arrows","tags":["arrow","clockwise","reload"],"emoji":"๐Ÿ”ƒ","order":4183,"group":8,"version":0.6},{"shortcodes":["arrows_counterclockwise","counterclockwise"],"annotation":"counterclockwise arrows button","tags":["anticlockwise","arrow","counterclockwise","withershins"],"emoji":"๐Ÿ”„","order":4184,"group":8,"version":1},{"shortcodes":["back"],"annotation":"BACK arrow","tags":["arrow","back"],"emoji":"๐Ÿ”™","order":4185,"group":8,"version":0.6},{"shortcodes":["end"],"annotation":"END arrow","tags":["arrow","end"],"emoji":"๐Ÿ”š","order":4186,"group":8,"version":0.6},{"shortcodes":["on"],"annotation":"ON! arrow","tags":["arrow","mark","on","on!"],"emoji":"๐Ÿ”›","order":4187,"group":8,"version":0.6},{"shortcodes":["soon"],"annotation":"SOON arrow","tags":["arrow","soon"],"emoji":"๐Ÿ”œ","order":4188,"group":8,"version":0.6},{"shortcodes":["top"],"annotation":"TOP arrow","tags":["arrow","top","up"],"emoji":"๐Ÿ”","order":4189,"group":8,"version":0.6},{"shortcodes":["place_of_worship"],"annotation":"place of worship","tags":["religion","worship"],"emoji":"๐Ÿ›","order":4190,"group":8,"version":1},{"shortcodes":["atom","atom_symbol"],"annotation":"atom symbol","tags":["atheist","atom"],"emoji":"โš›๏ธ","order":4192,"group":8,"version":1},{"shortcodes":["om"],"annotation":"om","tags":["hindu","religion"],"emoji":"๐Ÿ•‰๏ธ","order":4194,"group":8,"version":0.7},{"shortcodes":["star_of_david"],"annotation":"star of David","tags":["david","jew","jewish","religion","star","star of david"],"emoji":"โœก๏ธ","order":4196,"group":8,"version":0.7},{"shortcodes":["wheel_of_dharma"],"annotation":"wheel of dharma","tags":["buddhist","dharma","religion","wheel"],"emoji":"โ˜ธ๏ธ","order":4198,"group":8,"version":0.7},{"shortcodes":["yin_yang"],"annotation":"yin yang","tags":["religion","tao","taoist","yang","yin"],"emoji":"โ˜ฏ๏ธ","order":4200,"group":8,"version":0.7},{"shortcodes":["latin_cross"],"annotation":"latin cross","tags":["christian","cross","religion"],"emoji":"โœ๏ธ","order":4202,"group":8,"version":0.7},{"shortcodes":["orthodox_cross"],"annotation":"orthodox cross","tags":["christian","cross","religion"],"emoji":"โ˜ฆ๏ธ","order":4204,"group":8,"version":1},{"shortcodes":["star_and_crescent"],"annotation":"star and crescent","tags":["islam","muslim","religion"],"emoji":"โ˜ช๏ธ","order":4206,"group":8,"version":0.7},{"shortcodes":["peace","peace_symbol"],"annotation":"peace symbol","tags":["peace"],"emoji":"โ˜ฎ๏ธ","order":4208,"group":8,"version":1},{"shortcodes":["menorah"],"annotation":"menorah","tags":["candelabrum","candlestick","religion"],"emoji":"๐Ÿ•Ž","order":4209,"group":8,"version":1},{"shortcodes":["six_pointed_star"],"annotation":"dotted six-pointed star","tags":["fortune","star"],"emoji":"๐Ÿ”ฏ","order":4210,"group":8,"version":0.6},{"shortcodes":["aries"],"annotation":"Aries","tags":["aries","ram","zodiac"],"emoji":"โ™ˆ๏ธ","order":4211,"group":8,"version":0.6},{"shortcodes":["taurus"],"annotation":"Taurus","tags":["bull","ox","taurus","zodiac"],"emoji":"โ™‰๏ธ","order":4212,"group":8,"version":0.6},{"shortcodes":["gemini"],"annotation":"Gemini","tags":["gemini","twins","zodiac"],"emoji":"โ™Š๏ธ","order":4213,"group":8,"version":0.6},{"shortcodes":["cancer"],"annotation":"Cancer","tags":["cancer","crab","zodiac"],"emoji":"โ™‹๏ธ","order":4214,"group":8,"version":0.6},{"shortcodes":["leo"],"annotation":"Leo","tags":["leo","lion","zodiac"],"emoji":"โ™Œ๏ธ","order":4215,"group":8,"version":0.6},{"shortcodes":["virgo"],"annotation":"Virgo","tags":["virgo","zodiac"],"emoji":"โ™๏ธ","order":4216,"group":8,"version":0.6},{"shortcodes":["libra"],"annotation":"Libra","tags":["balance","justice","libra","scales","zodiac"],"emoji":"โ™Ž๏ธ","order":4217,"group":8,"version":0.6},{"shortcodes":["scorpius"],"annotation":"Scorpio","tags":["scorpio","scorpion","scorpius","zodiac"],"emoji":"โ™๏ธ","order":4218,"group":8,"version":0.6},{"shortcodes":["sagittarius"],"annotation":"Sagittarius","tags":["archer","sagittarius","zodiac"],"emoji":"โ™๏ธ","order":4219,"group":8,"version":0.6},{"shortcodes":["capricorn"],"annotation":"Capricorn","tags":["capricorn","goat","zodiac"],"emoji":"โ™‘๏ธ","order":4220,"group":8,"version":0.6},{"shortcodes":["aquarius"],"annotation":"Aquarius","tags":["aquarius","bearer","water","zodiac"],"emoji":"โ™’๏ธ","order":4221,"group":8,"version":0.6},{"shortcodes":["pisces"],"annotation":"Pisces","tags":["fish","pisces","zodiac"],"emoji":"โ™“๏ธ","order":4222,"group":8,"version":0.6},{"shortcodes":["ophiuchus"],"annotation":"Ophiuchus","tags":["bearer","ophiuchus","serpent","snake","zodiac"],"emoji":"โ›Ž","order":4223,"group":8,"version":0.6},{"shortcodes":["shuffle","twisted_rightwards_arrows"],"annotation":"shuffle tracks button","tags":["arrow","crossed"],"emoji":"๐Ÿ”€","order":4224,"group":8,"version":1},{"shortcodes":["repeat"],"annotation":"repeat button","tags":["arrow","clockwise","repeat"],"emoji":"๐Ÿ”","order":4225,"group":8,"version":1},{"shortcodes":["repeat_one"],"annotation":"repeat single button","tags":["arrow","clockwise","once"],"emoji":"๐Ÿ”‚","order":4226,"group":8,"version":1},{"shortcodes":["arrow_forward","play"],"annotation":"play button","tags":["arrow","play","right","triangle"],"emoji":"โ–ถ๏ธ","order":4228,"group":8,"version":0.6},{"shortcodes":["fast_forward"],"annotation":"fast-forward button","tags":["arrow","double","fast","forward"],"emoji":"โฉ๏ธ","order":4229,"group":8,"version":0.6},{"shortcodes":["next_track"],"annotation":"next track button","tags":["arrow","next scene","next track","triangle"],"emoji":"โญ๏ธ","order":4231,"group":8,"version":0.7},{"shortcodes":["play_pause"],"annotation":"play or pause button","tags":["arrow","pause","play","right","triangle"],"emoji":"โฏ๏ธ","order":4233,"group":8,"version":1},{"shortcodes":["arrow_backward","reverse"],"annotation":"reverse button","tags":["arrow","left","reverse","triangle"],"emoji":"โ—€๏ธ","order":4235,"group":8,"version":0.6},{"shortcodes":["fast_reverse","rewind"],"annotation":"fast reverse button","tags":["arrow","double","rewind"],"emoji":"โช๏ธ","order":4236,"group":8,"version":0.6},{"shortcodes":["previous_track"],"annotation":"last track button","tags":["arrow","previous scene","previous track","triangle"],"emoji":"โฎ๏ธ","order":4238,"group":8,"version":0.7},{"shortcodes":["arrow_up_small","up"],"annotation":"upwards button","tags":["arrow","button","red"],"emoji":"๐Ÿ”ผ","order":4239,"group":8,"version":0.6},{"shortcodes":["arrow_double_up","fast_up"],"annotation":"fast up button","tags":["arrow","double"],"emoji":"โซ","order":4240,"group":8,"version":0.6},{"shortcodes":["arrow_down_small","down"],"annotation":"downwards button","tags":["arrow","button","down","red"],"emoji":"๐Ÿ”ฝ","order":4241,"group":8,"version":0.6},{"shortcodes":["arrow_double_down","fast_down"],"annotation":"fast down button","tags":["arrow","double","down"],"emoji":"โฌ","order":4242,"group":8,"version":0.6},{"shortcodes":["pause"],"annotation":"pause button","tags":["bar","double","pause","vertical"],"emoji":"โธ๏ธ","order":4244,"group":8,"version":0.7},{"shortcodes":["stop"],"annotation":"stop button","tags":["square","stop"],"emoji":"โน๏ธ","order":4246,"group":8,"version":0.7},{"shortcodes":["record"],"annotation":"record button","tags":["circle","record"],"emoji":"โบ๏ธ","order":4248,"group":8,"version":0.7},{"shortcodes":["eject"],"annotation":"eject button","tags":["eject"],"emoji":"โ๏ธ","order":4250,"group":8,"version":1},{"shortcodes":["cinema"],"annotation":"cinema","tags":["camera","film","movie"],"emoji":"๐ŸŽฆ","order":4251,"group":8,"version":0.6},{"shortcodes":["dim_button","low_brightness"],"annotation":"dim button","tags":["brightness","dim","low"],"emoji":"๐Ÿ”…","order":4252,"group":8,"version":1},{"shortcodes":["bright_button","high_brightness"],"annotation":"bright button","tags":["bright","brightness"],"emoji":"๐Ÿ”†","order":4253,"group":8,"version":1},{"shortcodes":["antenna_bars","signal_strength"],"annotation":"antenna bars","tags":["antenna","bar","cell","mobile","phone"],"emoji":"๐Ÿ“ถ","order":4254,"group":8,"version":0.6},{"shortcodes":["vibration_mode"],"annotation":"vibration mode","tags":["cell","mobile","mode","phone","telephone","vibration"],"emoji":"๐Ÿ“ณ","order":4255,"group":8,"version":0.6},{"shortcodes":["mobile_phone_off"],"annotation":"mobile phone off","tags":["cell","mobile","off","phone","telephone"],"emoji":"๐Ÿ“ด","order":4256,"group":8,"version":0.6},{"shortcodes":["female","female_sign"],"annotation":"female sign","tags":["woman"],"emoji":"โ™€๏ธ","order":4258,"group":8,"version":4},{"shortcodes":["male","male_sign"],"annotation":"male sign","tags":["man"],"emoji":"โ™‚๏ธ","order":4260,"group":8,"version":4},{"shortcodes":["transgender_symbol"],"annotation":"transgender symbol","tags":["transgender"],"emoji":"โšง๏ธ","order":4262,"group":8,"version":13},{"shortcodes":["multiplication","multiply"],"annotation":"multiply","tags":["cancel","multiplication","sign","x","ร—"],"emoji":"โœ–๏ธ","order":4264,"group":8,"version":0.6},{"shortcodes":["plus"],"annotation":"plus","tags":["+","math","sign"],"emoji":"โž•","order":4265,"group":8,"version":0.6},{"shortcodes":["minus"],"annotation":"minus","tags":["-","math","sign","โˆ’"],"emoji":"โž–","order":4266,"group":8,"version":0.6},{"shortcodes":["divide","division"],"annotation":"divide","tags":["division","math","sign","รท"],"emoji":"โž—","order":4267,"group":8,"version":0.6},{"shortcodes":["heavy_equals_sign"],"annotation":"heavy equals sign","tags":["equality","math"],"emoji":"๐ŸŸฐ","order":4268,"group":8,"version":14},{"shortcodes":["infinity"],"annotation":"infinity","tags":["forever","unbounded","universal"],"emoji":"โ™พ๏ธ","order":4270,"group":8,"version":11},{"shortcodes":["bangbang","double_exclamation"],"annotation":"double exclamation mark","tags":["!","!!","bangbang","exclamation","mark"],"emoji":"โ€ผ๏ธ","order":4272,"group":8,"version":0.6},{"shortcodes":["exclamation_question","interrobang"],"annotation":"exclamation question mark","tags":["!","!?","?","exclamation","interrobang","mark","punctuation","question"],"emoji":"โ‰๏ธ","order":4274,"group":8,"version":0.6},{"shortcodes":["question"],"annotation":"red question mark","tags":["?","mark","punctuation","question"],"emoji":"โ“๏ธ","order":4275,"group":8,"version":0.6},{"shortcodes":["white_question"],"annotation":"white question mark","tags":["?","mark","outlined","punctuation","question"],"emoji":"โ”","order":4276,"group":8,"version":0.6},{"shortcodes":["white_exclamation"],"annotation":"white exclamation mark","tags":["!","exclamation","mark","outlined","punctuation"],"emoji":"โ•","order":4277,"group":8,"version":0.6},{"shortcodes":["exclamation"],"annotation":"red exclamation mark","tags":["!","exclamation","mark","punctuation"],"emoji":"โ—๏ธ","order":4278,"group":8,"version":0.6},{"shortcodes":["wavy_dash"],"annotation":"wavy dash","tags":["dash","punctuation","wavy"],"emoji":"ใ€ฐ๏ธ","order":4280,"group":8,"version":0.6},{"shortcodes":["currency_exchange"],"annotation":"currency exchange","tags":["bank","currency","exchange","money"],"emoji":"๐Ÿ’ฑ","order":4281,"group":8,"version":0.6},{"shortcodes":["heavy_dollar_sign"],"annotation":"heavy dollar sign","tags":["currency","dollar","money"],"emoji":"๐Ÿ’ฒ","order":4282,"group":8,"version":0.6},{"shortcodes":["medical","medical_symbol"],"annotation":"medical symbol","tags":["aesculapius","medicine","staff"],"emoji":"โš•๏ธ","order":4284,"group":8,"version":4},{"shortcodes":["recycle","recycling_symbol"],"annotation":"recycling symbol","tags":["recycle"],"emoji":"โ™ป๏ธ","order":4286,"group":8,"version":0.6},{"shortcodes":["fleur-de-lis"],"annotation":"fleur-de-lis","tags":["fleur-de-lis"],"emoji":"โšœ๏ธ","order":4288,"group":8,"version":1},{"shortcodes":["trident"],"annotation":"trident emblem","tags":["anchor","emblem","ship","tool","trident"],"emoji":"๐Ÿ”ฑ","order":4289,"group":8,"version":0.6},{"shortcodes":["name_badge"],"annotation":"name badge","tags":["badge","name"],"emoji":"๐Ÿ“›","order":4290,"group":8,"version":0.6},{"shortcodes":["beginner"],"annotation":"Japanese symbol for beginner","tags":["beginner","chevron","japanese","japanese symbol for beginner","leaf"],"emoji":"๐Ÿ”ฐ","order":4291,"group":8,"version":0.6},{"shortcodes":["hollow_red_circle","red_o"],"annotation":"hollow red circle","tags":["circle","large","o","red"],"emoji":"โญ•๏ธ","order":4292,"group":8,"version":0.6},{"shortcodes":["check_mark_button","white_check_mark"],"annotation":"check mark button","tags":["button","check","mark","โœ“"],"emoji":"โœ…","order":4293,"group":8,"version":0.6},{"shortcodes":["ballot_box_with_check"],"annotation":"check box with check","tags":["box","check","โœ“"],"emoji":"โ˜‘๏ธ","order":4295,"group":8,"version":0.6},{"shortcodes":["check_mark","heavy_check_mark"],"annotation":"check mark","tags":["check","mark","โœ“"],"emoji":"โœ”๏ธ","order":4297,"group":8,"version":0.6},{"shortcodes":["cross_mark","x"],"annotation":"cross mark","tags":["cancel","cross","mark","multiplication","multiply","x","ร—"],"emoji":"โŒ","order":4298,"group":8,"version":0.6},{"shortcodes":["cross_mark_button","negative_squared_cross_mark"],"annotation":"cross mark button","tags":["mark","square","x","ร—"],"emoji":"โŽ","order":4299,"group":8,"version":0.6},{"shortcodes":["curly_loop"],"annotation":"curly loop","tags":["curl","loop"],"emoji":"โžฐ","order":4300,"group":8,"version":0.6},{"shortcodes":["double_curly_loop","loop"],"annotation":"double curly loop","tags":["curl","double","loop"],"emoji":"โžฟ","order":4301,"group":8,"version":1},{"shortcodes":["part_alternation_mark"],"annotation":"part alternation mark","tags":["mark","part"],"emoji":"ใ€ฝ๏ธ","order":4303,"group":8,"version":0.6},{"shortcodes":["eight_spoked_asterisk"],"annotation":"eight-spoked asterisk","tags":["*","asterisk"],"emoji":"โœณ๏ธ","order":4305,"group":8,"version":0.6},{"shortcodes":["eight_pointed_black_star"],"annotation":"eight-pointed star","tags":["*","star"],"emoji":"โœด๏ธ","order":4307,"group":8,"version":0.6},{"shortcodes":["sparkle"],"annotation":"sparkle","tags":["*"],"emoji":"โ‡๏ธ","order":4309,"group":8,"version":0.6},{"shortcodes":["copyright"],"annotation":"copyright","tags":["c"],"emoji":"ยฉ๏ธ","order":4311,"group":8,"version":0.6},{"shortcodes":["registered"],"annotation":"registered","tags":["r"],"emoji":"ยฎ๏ธ","order":4313,"group":8,"version":0.6},{"shortcodes":["tm","trade_mark"],"annotation":"trade mark","tags":["mark","tm","trademark"],"emoji":"โ„ข๏ธ","order":4315,"group":8,"version":0.6},{"shortcodes":["hash","number_sign"],"annotation":"keycap: #","tags":["keycap"],"emoji":"#๏ธโƒฃ","order":4316,"group":8,"version":0.6},{"shortcodes":["asterisk"],"annotation":"keycap: *","tags":["keycap"],"emoji":"*๏ธโƒฃ","order":4318,"group":8,"version":2},{"shortcodes":["zero"],"annotation":"keycap: 0","tags":["keycap"],"emoji":"0๏ธโƒฃ","order":4320,"group":8,"version":0.6},{"shortcodes":["one"],"annotation":"keycap: 1","tags":["keycap"],"emoji":"1๏ธโƒฃ","order":4322,"group":8,"version":0.6},{"shortcodes":["two"],"annotation":"keycap: 2","tags":["keycap"],"emoji":"2๏ธโƒฃ","order":4324,"group":8,"version":0.6},{"shortcodes":["three"],"annotation":"keycap: 3","tags":["keycap"],"emoji":"3๏ธโƒฃ","order":4326,"group":8,"version":0.6},{"shortcodes":["four"],"annotation":"keycap: 4","tags":["keycap"],"emoji":"4๏ธโƒฃ","order":4328,"group":8,"version":0.6},{"shortcodes":["five"],"annotation":"keycap: 5","tags":["keycap"],"emoji":"5๏ธโƒฃ","order":4330,"group":8,"version":0.6},{"shortcodes":["six"],"annotation":"keycap: 6","tags":["keycap"],"emoji":"6๏ธโƒฃ","order":4332,"group":8,"version":0.6},{"shortcodes":["seven"],"annotation":"keycap: 7","tags":["keycap"],"emoji":"7๏ธโƒฃ","order":4334,"group":8,"version":0.6},{"shortcodes":["eight"],"annotation":"keycap: 8","tags":["keycap"],"emoji":"8๏ธโƒฃ","order":4336,"group":8,"version":0.6},{"shortcodes":["nine"],"annotation":"keycap: 9","tags":["keycap"],"emoji":"9๏ธโƒฃ","order":4338,"group":8,"version":0.6},{"shortcodes":["ten"],"annotation":"keycap: 10","tags":["keycap"],"emoji":"๐Ÿ”Ÿ","order":4340,"group":8,"version":0.6},{"shortcodes":["capital_abcd"],"annotation":"input latin uppercase","tags":["abcd","input","latin","letters","uppercase"],"emoji":"๐Ÿ” ","order":4341,"group":8,"version":0.6},{"shortcodes":["abcd"],"annotation":"input latin lowercase","tags":["abcd","input","latin","letters","lowercase"],"emoji":"๐Ÿ”ก","order":4342,"group":8,"version":0.6},{"shortcodes":["1234"],"annotation":"input numbers","tags":["1234","input","numbers"],"emoji":"๐Ÿ”ข","order":4343,"group":8,"version":0.6},{"shortcodes":["symbols"],"annotation":"input symbols","tags":["input","ใ€’โ™ช&%"],"emoji":"๐Ÿ”ฃ","order":4344,"group":8,"version":0.6},{"shortcodes":["abc"],"annotation":"input latin letters","tags":["abc","alphabet","input","latin","letters"],"emoji":"๐Ÿ”ค","order":4345,"group":8,"version":0.6},{"shortcodes":["a","a_blood"],"annotation":"A button (blood type)","tags":["a","a button (blood type)","blood type"],"emoji":"๐Ÿ…ฐ๏ธ","order":4347,"group":8,"version":0.6},{"shortcodes":["ab","ab_blood"],"annotation":"AB button (blood type)","tags":["ab","ab button (blood type)","blood type"],"emoji":"๐Ÿ†Ž","order":4348,"group":8,"version":0.6},{"shortcodes":["b","b_blood"],"annotation":"B button (blood type)","tags":["b","b button (blood type)","blood type"],"emoji":"๐Ÿ…ฑ๏ธ","order":4350,"group":8,"version":0.6},{"shortcodes":["cl"],"annotation":"CL button","tags":["cl","cl button"],"emoji":"๐Ÿ†‘","order":4351,"group":8,"version":0.6},{"shortcodes":["cool"],"annotation":"COOL button","tags":["cool","cool button"],"emoji":"๐Ÿ†’","order":4352,"group":8,"version":0.6},{"shortcodes":["free"],"annotation":"FREE button","tags":["free","free button"],"emoji":"๐Ÿ†“","order":4353,"group":8,"version":0.6},{"shortcodes":["info","information_source"],"annotation":"information","tags":["i"],"emoji":"โ„น๏ธ","order":4355,"group":8,"version":0.6},{"shortcodes":["id"],"annotation":"ID button","tags":["id","id button","identity"],"emoji":"๐Ÿ†”","order":4356,"group":8,"version":0.6},{"shortcodes":["m"],"annotation":"circled M","tags":["circle","circled m","m"],"emoji":"โ“‚๏ธ","order":4358,"group":8,"version":0.6},{"shortcodes":["new"],"annotation":"NEW button","tags":["new","new button"],"emoji":"๐Ÿ†•","order":4359,"group":8,"version":0.6},{"shortcodes":["ng"],"annotation":"NG button","tags":["ng","ng button"],"emoji":"๐Ÿ†–","order":4360,"group":8,"version":0.6},{"shortcodes":["o","o_blood"],"annotation":"O button (blood type)","tags":["blood type","o","o button (blood type)"],"emoji":"๐Ÿ…พ๏ธ","order":4362,"group":8,"version":0.6},{"shortcodes":["ok"],"annotation":"OK button","tags":["ok","ok button"],"emoji":"๐Ÿ†—","order":4363,"group":8,"version":0.6},{"shortcodes":["parking"],"annotation":"P button","tags":["p","p button","parking"],"emoji":"๐Ÿ…ฟ๏ธ","order":4365,"group":8,"version":0.6},{"shortcodes":["sos"],"annotation":"SOS button","tags":["help","sos","sos button"],"emoji":"๐Ÿ†˜","order":4366,"group":8,"version":0.6},{"shortcodes":["up2"],"annotation":"UP! button","tags":["mark","up","up!","up! button"],"emoji":"๐Ÿ†™","order":4367,"group":8,"version":0.6},{"shortcodes":["vs"],"annotation":"VS button","tags":["versus","vs","vs button"],"emoji":"๐Ÿ†š","order":4368,"group":8,"version":0.6},{"shortcodes":["ja_here","koko"],"annotation":"Japanese โ€œhereโ€ button","tags":["japanese","japanese โ€œhereโ€ button","katakana","โ€œhereโ€","ใ‚ณใ‚ณ"],"emoji":"๐Ÿˆ","order":4369,"group":8,"version":0.6},{"shortcodes":["ja_service_charge"],"annotation":"Japanese โ€œservice chargeโ€ button","tags":["japanese","japanese โ€œservice chargeโ€ button","katakana","โ€œservice chargeโ€","ใ‚ต"],"emoji":"๐Ÿˆ‚๏ธ","order":4371,"group":8,"version":0.6},{"shortcodes":["ja_monthly_amount"],"annotation":"Japanese โ€œmonthly amountโ€ button","tags":["ideograph","japanese","japanese โ€œmonthly amountโ€ button","โ€œmonthly amountโ€","ๆœˆ"],"emoji":"๐Ÿˆท๏ธ","order":4373,"group":8,"version":0.6},{"shortcodes":["ja_not_free_of_carge"],"annotation":"Japanese โ€œnot free of chargeโ€ button","tags":["ideograph","japanese","japanese โ€œnot free of chargeโ€ button","โ€œnot free of chargeโ€","ๆœ‰"],"emoji":"๐Ÿˆถ","order":4374,"group":8,"version":0.6},{"shortcodes":["ja_reserved"],"annotation":"Japanese โ€œreservedโ€ button","tags":["ideograph","japanese","japanese โ€œreservedโ€ button","โ€œreservedโ€","ๆŒ‡"],"emoji":"๐Ÿˆฏ๏ธ","order":4375,"group":8,"version":0.6},{"shortcodes":["ideograph_advantage","ja_bargain"],"annotation":"Japanese โ€œbargainโ€ button","tags":["ideograph","japanese","japanese โ€œbargainโ€ button","โ€œbargainโ€","ๅพ—"],"emoji":"๐Ÿ‰","order":4376,"group":8,"version":0.6},{"shortcodes":["ja_discount"],"annotation":"Japanese โ€œdiscountโ€ button","tags":["ideograph","japanese","japanese โ€œdiscountโ€ button","โ€œdiscountโ€","ๅ‰ฒ"],"emoji":"๐Ÿˆน","order":4377,"group":8,"version":0.6},{"shortcodes":["ja_free_of_charge"],"annotation":"Japanese โ€œfree of chargeโ€ button","tags":["ideograph","japanese","japanese โ€œfree of chargeโ€ button","โ€œfree of chargeโ€","็„ก"],"emoji":"๐Ÿˆš๏ธ","order":4378,"group":8,"version":0.6},{"shortcodes":["ja_prohibited"],"annotation":"Japanese โ€œprohibitedโ€ button","tags":["ideograph","japanese","japanese โ€œprohibitedโ€ button","โ€œprohibitedโ€","็ฆ"],"emoji":"๐Ÿˆฒ","order":4379,"group":8,"version":0.6},{"shortcodes":["accept","ja_acceptable"],"annotation":"Japanese โ€œacceptableโ€ button","tags":["ideograph","japanese","japanese โ€œacceptableโ€ button","โ€œacceptableโ€","ๅฏ"],"emoji":"๐Ÿ‰‘","order":4380,"group":8,"version":0.6},{"shortcodes":["ja_application"],"annotation":"Japanese โ€œapplicationโ€ button","tags":["ideograph","japanese","japanese โ€œapplicationโ€ button","โ€œapplicationโ€","็”ณ"],"emoji":"๐Ÿˆธ","order":4381,"group":8,"version":0.6},{"shortcodes":["ja_passing_grade"],"annotation":"Japanese โ€œpassing gradeโ€ button","tags":["ideograph","japanese","japanese โ€œpassing gradeโ€ button","โ€œpassing gradeโ€","ๅˆ"],"emoji":"๐Ÿˆด","order":4382,"group":8,"version":0.6},{"shortcodes":["ja_vacancy"],"annotation":"Japanese โ€œvacancyโ€ button","tags":["ideograph","japanese","japanese โ€œvacancyโ€ button","โ€œvacancyโ€","็ฉบ"],"emoji":"๐Ÿˆณ","order":4383,"group":8,"version":0.6},{"shortcodes":["congratulations","ja_congratulations"],"annotation":"Japanese โ€œcongratulationsโ€ button","tags":["ideograph","japanese","japanese โ€œcongratulationsโ€ button","โ€œcongratulationsโ€","็ฅ"],"emoji":"ใŠ—๏ธ","order":4385,"group":8,"version":0.6},{"shortcodes":["ja_secret","secret"],"annotation":"Japanese โ€œsecretโ€ button","tags":["ideograph","japanese","japanese โ€œsecretโ€ button","โ€œsecretโ€","็ง˜"],"emoji":"ใŠ™๏ธ","order":4387,"group":8,"version":0.6},{"shortcodes":["ja_open_for_business"],"annotation":"Japanese โ€œopen for businessโ€ button","tags":["ideograph","japanese","japanese โ€œopen for businessโ€ button","โ€œopen for businessโ€","ๅ–ถ"],"emoji":"๐Ÿˆบ","order":4388,"group":8,"version":0.6},{"shortcodes":["ja_no_vacancy"],"annotation":"Japanese โ€œno vacancyโ€ button","tags":["ideograph","japanese","japanese โ€œno vacancyโ€ button","โ€œno vacancyโ€","ๆบ€"],"emoji":"๐Ÿˆต","order":4389,"group":8,"version":0.6},{"shortcodes":["red_circle"],"annotation":"red circle","tags":["circle","geometric","red"],"emoji":"๐Ÿ”ด","order":4390,"group":8,"version":0.6},{"shortcodes":["orange_circle"],"annotation":"orange circle","tags":["circle","orange"],"emoji":"๐ŸŸ ","order":4391,"group":8,"version":12},{"shortcodes":["yellow_circle"],"annotation":"yellow circle","tags":["circle","yellow"],"emoji":"๐ŸŸก","order":4392,"group":8,"version":12},{"shortcodes":["green_circle"],"annotation":"green circle","tags":["circle","green"],"emoji":"๐ŸŸข","order":4393,"group":8,"version":12},{"shortcodes":["blue_circle"],"annotation":"blue circle","tags":["blue","circle","geometric"],"emoji":"๐Ÿ”ต","order":4394,"group":8,"version":0.6},{"shortcodes":["purple_circle"],"annotation":"purple circle","tags":["circle","purple"],"emoji":"๐ŸŸฃ","order":4395,"group":8,"version":12},{"shortcodes":["brown_circle"],"annotation":"brown circle","tags":["brown","circle"],"emoji":"๐ŸŸค","order":4396,"group":8,"version":12},{"shortcodes":["black_circle"],"annotation":"black circle","tags":["circle","geometric"],"emoji":"โšซ๏ธ","order":4397,"group":8,"version":0.6},{"shortcodes":["white_circle"],"annotation":"white circle","tags":["circle","geometric"],"emoji":"โšช๏ธ","order":4398,"group":8,"version":0.6},{"shortcodes":["red_square"],"annotation":"red square","tags":["red","square"],"emoji":"๐ŸŸฅ","order":4399,"group":8,"version":12},{"shortcodes":["orange_square"],"annotation":"orange square","tags":["orange","square"],"emoji":"๐ŸŸง","order":4400,"group":8,"version":12},{"shortcodes":["yellow_square"],"annotation":"yellow square","tags":["square","yellow"],"emoji":"๐ŸŸจ","order":4401,"group":8,"version":12},{"shortcodes":["green_square"],"annotation":"green square","tags":["green","square"],"emoji":"๐ŸŸฉ","order":4402,"group":8,"version":12},{"shortcodes":["blue_square"],"annotation":"blue square","tags":["blue","square"],"emoji":"๐ŸŸฆ","order":4403,"group":8,"version":12},{"shortcodes":["purple_square"],"annotation":"purple square","tags":["purple","square"],"emoji":"๐ŸŸช","order":4404,"group":8,"version":12},{"shortcodes":["brown_square"],"annotation":"brown square","tags":["brown","square"],"emoji":"๐ŸŸซ","order":4405,"group":8,"version":12},{"shortcodes":["black_large_square"],"annotation":"black large square","tags":["geometric","square"],"emoji":"โฌ›๏ธ","order":4406,"group":8,"version":0.6},{"shortcodes":["white_large_square"],"annotation":"white large square","tags":["geometric","square"],"emoji":"โฌœ๏ธ","order":4407,"group":8,"version":0.6},{"shortcodes":["black_medium_square"],"annotation":"black medium square","tags":["geometric","square"],"emoji":"โ—ผ๏ธ","order":4409,"group":8,"version":0.6},{"shortcodes":["white_medium_square"],"annotation":"white medium square","tags":["geometric","square"],"emoji":"โ—ป๏ธ","order":4411,"group":8,"version":0.6},{"shortcodes":["black_medium_small_square"],"annotation":"black medium-small square","tags":["geometric","square"],"emoji":"โ—พ๏ธ","order":4412,"group":8,"version":0.6},{"shortcodes":["white_medium_small_square"],"annotation":"white medium-small square","tags":["geometric","square"],"emoji":"โ—ฝ๏ธ","order":4413,"group":8,"version":0.6},{"shortcodes":["black_small_square"],"annotation":"black small square","tags":["geometric","square"],"emoji":"โ–ช๏ธ","order":4415,"group":8,"version":0.6},{"shortcodes":["white_small_square"],"annotation":"white small square","tags":["geometric","square"],"emoji":"โ–ซ๏ธ","order":4417,"group":8,"version":0.6},{"shortcodes":["large_orange_diamond"],"annotation":"large orange diamond","tags":["diamond","geometric","orange"],"emoji":"๐Ÿ”ถ","order":4418,"group":8,"version":0.6},{"shortcodes":["large_blue_diamond"],"annotation":"large blue diamond","tags":["blue","diamond","geometric"],"emoji":"๐Ÿ”ท","order":4419,"group":8,"version":0.6},{"shortcodes":["small_orange_diamond"],"annotation":"small orange diamond","tags":["diamond","geometric","orange"],"emoji":"๐Ÿ”ธ","order":4420,"group":8,"version":0.6},{"shortcodes":["small_blue_diamond"],"annotation":"small blue diamond","tags":["blue","diamond","geometric"],"emoji":"๐Ÿ”น","order":4421,"group":8,"version":0.6},{"shortcodes":["small_red_triangle"],"annotation":"red triangle pointed up","tags":["geometric","red"],"emoji":"๐Ÿ”บ","order":4422,"group":8,"version":0.6},{"shortcodes":["small_red_triangle_down"],"annotation":"red triangle pointed down","tags":["down","geometric","red"],"emoji":"๐Ÿ”ป","order":4423,"group":8,"version":0.6},{"shortcodes":["diamond_shape_with_a_dot_inside","diamond_with_a_dot"],"annotation":"diamond with a dot","tags":["comic","diamond","geometric","inside"],"emoji":"๐Ÿ’ ","order":4424,"group":8,"version":0.6},{"shortcodes":["radio_button"],"annotation":"radio button","tags":["button","geometric","radio"],"emoji":"๐Ÿ”˜","order":4425,"group":8,"version":0.6},{"shortcodes":["white_square_button"],"annotation":"white square button","tags":["button","geometric","outlined","square"],"emoji":"๐Ÿ”ณ","order":4426,"group":8,"version":0.6},{"shortcodes":["black_square_button"],"annotation":"black square button","tags":["button","geometric","square"],"emoji":"๐Ÿ”ฒ","order":4427,"group":8,"version":0.6},{"shortcodes":["checkered_flag"],"annotation":"chequered flag","tags":["checkered","chequered","racing"],"emoji":"๐Ÿ","order":4428,"group":9,"version":0.6},{"shortcodes":["triangular_flag","triangular_flag_on_post"],"annotation":"triangular flag","tags":["post"],"emoji":"๐Ÿšฉ","order":4429,"group":9,"version":0.6},{"shortcodes":["crossed_flags"],"annotation":"crossed flags","tags":["celebration","cross","crossed","japanese"],"emoji":"๐ŸŽŒ","order":4430,"group":9,"version":0.6},{"shortcodes":["black_flag"],"annotation":"black flag","tags":["waving"],"emoji":"๐Ÿด","order":4431,"group":9,"version":1},{"shortcodes":["white_flag"],"annotation":"white flag","tags":["waving"],"emoji":"๐Ÿณ๏ธ","order":4433,"group":9,"version":0.7},{"shortcodes":["rainbow_flag"],"annotation":"rainbow flag","tags":["pride","rainbow"],"emoji":"๐Ÿณ๏ธโ€๐ŸŒˆ","order":4434,"group":9,"version":4},{"shortcodes":["transgender_flag"],"annotation":"transgender flag","tags":["flag","light blue","pink","transgender","white"],"emoji":"๐Ÿณ๏ธโ€โšง๏ธ","order":4436,"group":9,"version":13},{"shortcodes":["jolly_roger","pirate_flag"],"annotation":"pirate flag","tags":["jolly roger","pirate","plunder","treasure"],"emoji":"๐Ÿดโ€โ˜ ๏ธ","order":4440,"group":9,"version":11},{"shortcodes":["ascension_island","flag_ac"],"annotation":"flag: Ascension Island","tags":["AC","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡จ","order":4442,"group":9,"version":2},{"shortcodes":["andorra","flag_ad"],"annotation":"flag: Andorra","tags":["AD","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฉ","order":4443,"group":9,"version":2},{"shortcodes":["flag_ae","united_arab_emirates"],"annotation":"flag: United Arab Emirates","tags":["AE","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ช","order":4444,"group":9,"version":2},{"shortcodes":["afghanistan","flag_af"],"annotation":"flag: Afghanistan","tags":["AF","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ซ","order":4445,"group":9,"version":2},{"shortcodes":["antigua_barbuda","flag_ag"],"annotation":"flag: Antigua & Barbuda","tags":["AG","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฌ","order":4446,"group":9,"version":2},{"shortcodes":["anguilla","flag_ai"],"annotation":"flag: Anguilla","tags":["AI","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฎ","order":4447,"group":9,"version":2},{"shortcodes":["albania","flag_al"],"annotation":"flag: Albania","tags":["AL","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฑ","order":4448,"group":9,"version":2},{"shortcodes":["armenia","flag_am"],"annotation":"flag: Armenia","tags":["AM","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฒ","order":4449,"group":9,"version":2},{"shortcodes":["angola","flag_ao"],"annotation":"flag: Angola","tags":["AO","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ด","order":4450,"group":9,"version":2},{"shortcodes":["antarctica","flag_aq"],"annotation":"flag: Antarctica","tags":["AQ","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ถ","order":4451,"group":9,"version":2},{"shortcodes":["argentina","flag_ar"],"annotation":"flag: Argentina","tags":["AR","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ท","order":4452,"group":9,"version":2},{"shortcodes":["american_samoa","flag_as"],"annotation":"flag: American Samoa","tags":["AS","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ธ","order":4453,"group":9,"version":2},{"shortcodes":["austria","flag_at"],"annotation":"flag: Austria","tags":["AT","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡น","order":4454,"group":9,"version":2},{"shortcodes":["australia","flag_au"],"annotation":"flag: Australia","tags":["AU","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡บ","order":4455,"group":9,"version":2},{"shortcodes":["aruba","flag_aw"],"annotation":"flag: Aruba","tags":["AW","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ผ","order":4456,"group":9,"version":2},{"shortcodes":["aland_islands","flag_ax"],"annotation":"flag: ร…land Islands","tags":["AX","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฝ","order":4457,"group":9,"version":2},{"shortcodes":["azerbaijan","flag_az"],"annotation":"flag: Azerbaijan","tags":["AZ","flag"],"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฟ","order":4458,"group":9,"version":2},{"shortcodes":["bosnia_herzegovina","flag_ba"],"annotation":"flag: Bosnia & Herzegovina","tags":["BA","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ฆ","order":4459,"group":9,"version":2},{"shortcodes":["barbados","flag_bb"],"annotation":"flag: Barbados","tags":["BB","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ง","order":4460,"group":9,"version":2},{"shortcodes":["bangladesh","flag_bd"],"annotation":"flag: Bangladesh","tags":["BD","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ฉ","order":4461,"group":9,"version":2},{"shortcodes":["belgium","flag_be"],"annotation":"flag: Belgium","tags":["BE","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ช","order":4462,"group":9,"version":2},{"shortcodes":["burkina_faso","flag_bf"],"annotation":"flag: Burkina Faso","tags":["BF","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ซ","order":4463,"group":9,"version":2},{"shortcodes":["bulgaria","flag_bg"],"annotation":"flag: Bulgaria","tags":["BG","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ฌ","order":4464,"group":9,"version":2},{"shortcodes":["bahrain","flag_bh"],"annotation":"flag: Bahrain","tags":["BH","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ญ","order":4465,"group":9,"version":2},{"shortcodes":["burundi","flag_bi"],"annotation":"flag: Burundi","tags":["BI","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ฎ","order":4466,"group":9,"version":2},{"shortcodes":["benin","flag_bj"],"annotation":"flag: Benin","tags":["BJ","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ฏ","order":4467,"group":9,"version":2},{"shortcodes":["flag_bl","st_barthelemy"],"annotation":"flag: St. Barthรฉlemy","tags":["BL","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ฑ","order":4468,"group":9,"version":2},{"shortcodes":["bermuda","flag_bm"],"annotation":"flag: Bermuda","tags":["BM","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ฒ","order":4469,"group":9,"version":2},{"shortcodes":["brunei","flag_bn"],"annotation":"flag: Brunei","tags":["BN","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ณ","order":4470,"group":9,"version":2},{"shortcodes":["bolivia","flag_bo"],"annotation":"flag: Bolivia","tags":["BO","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ด","order":4471,"group":9,"version":2},{"shortcodes":["caribbean_netherlands","flag_bq"],"annotation":"flag: Caribbean Netherlands","tags":["BQ","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ถ","order":4472,"group":9,"version":2},{"shortcodes":["brazil","flag_br"],"annotation":"flag: Brazil","tags":["BR","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ท","order":4473,"group":9,"version":2},{"shortcodes":["bahamas","flag_bs"],"annotation":"flag: Bahamas","tags":["BS","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ธ","order":4474,"group":9,"version":2},{"shortcodes":["bhutan","flag_bt"],"annotation":"flag: Bhutan","tags":["BT","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡น","order":4475,"group":9,"version":2},{"shortcodes":["bouvet_island","flag_bv"],"annotation":"flag: Bouvet Island","tags":["BV","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ป","order":4476,"group":9,"version":2},{"shortcodes":["botswana","flag_bw"],"annotation":"flag: Botswana","tags":["BW","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ผ","order":4477,"group":9,"version":2},{"shortcodes":["belarus","flag_by"],"annotation":"flag: Belarus","tags":["BY","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡พ","order":4478,"group":9,"version":2},{"shortcodes":["belize","flag_bz"],"annotation":"flag: Belize","tags":["BZ","flag"],"emoji":"๐Ÿ‡ง๐Ÿ‡ฟ","order":4479,"group":9,"version":2},{"shortcodes":["canada","flag_ca"],"annotation":"flag: Canada","tags":["CA","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ฆ","order":4480,"group":9,"version":2},{"shortcodes":["cocos_islands","flag_cc"],"annotation":"flag: Cocos (Keeling) Islands","tags":["CC","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡จ","order":4481,"group":9,"version":2},{"shortcodes":["congo_kinshasa","flag_cd"],"annotation":"flag: Congo - Kinshasa","tags":["CD","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ฉ","order":4482,"group":9,"version":2},{"shortcodes":["central_african_republic","flag_cf"],"annotation":"flag: Central African Republic","tags":["CF","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ซ","order":4483,"group":9,"version":2},{"shortcodes":["congo_brazzaville","flag_cg"],"annotation":"flag: Congo - Brazzaville","tags":["CG","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ฌ","order":4484,"group":9,"version":2},{"shortcodes":["flag_ch","switzerland"],"annotation":"flag: Switzerland","tags":["CH","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ญ","order":4485,"group":9,"version":2},{"shortcodes":["cote_divoire","flag_ci"],"annotation":"flag: Cรดte dโ€™Ivoire","tags":["CI","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ฎ","order":4486,"group":9,"version":2},{"shortcodes":["cook_islands","flag_ck"],"annotation":"flag: Cook Islands","tags":["CK","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ฐ","order":4487,"group":9,"version":2},{"shortcodes":["chile","flag_cl"],"annotation":"flag: Chile","tags":["CL","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ฑ","order":4488,"group":9,"version":2},{"shortcodes":["cameroon","flag_cm"],"annotation":"flag: Cameroon","tags":["CM","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ฒ","order":4489,"group":9,"version":2},{"shortcodes":["china","flag_cn"],"annotation":"flag: China","tags":["CN","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ณ","order":4490,"group":9,"version":0.6},{"shortcodes":["colombia","flag_co"],"annotation":"flag: Colombia","tags":["CO","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ด","order":4491,"group":9,"version":2},{"shortcodes":["clipperton_island","flag_cp"],"annotation":"flag: Clipperton Island","tags":["CP","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ต","order":4492,"group":9,"version":2},{"shortcodes":["costa_rica","flag_cr"],"annotation":"flag: Costa Rica","tags":["CR","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ท","order":4493,"group":9,"version":2},{"shortcodes":["cuba","flag_cu"],"annotation":"flag: Cuba","tags":["CU","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡บ","order":4494,"group":9,"version":2},{"shortcodes":["cape_verde","flag_cv"],"annotation":"flag: Cape Verde","tags":["CV","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ป","order":4495,"group":9,"version":2},{"shortcodes":["curacao","flag_cw"],"annotation":"flag: Curaรงao","tags":["CW","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ผ","order":4496,"group":9,"version":2},{"shortcodes":["christmas_island","flag_cx"],"annotation":"flag: Christmas Island","tags":["CX","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ฝ","order":4497,"group":9,"version":2},{"shortcodes":["cyprus","flag_cy"],"annotation":"flag: Cyprus","tags":["CY","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡พ","order":4498,"group":9,"version":2},{"shortcodes":["czech_republic","czechia","flag_cz"],"annotation":"flag: Czechia","tags":["CZ","flag"],"emoji":"๐Ÿ‡จ๐Ÿ‡ฟ","order":4499,"group":9,"version":2},{"shortcodes":["flag_de","germany"],"annotation":"flag: Germany","tags":["DE","flag"],"emoji":"๐Ÿ‡ฉ๐Ÿ‡ช","order":4500,"group":9,"version":0.6},{"shortcodes":["diego_garcia","flag_dg"],"annotation":"flag: Diego Garcia","tags":["DG","flag"],"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฌ","order":4501,"group":9,"version":2},{"shortcodes":["djibouti","flag_dj"],"annotation":"flag: Djibouti","tags":["DJ","flag"],"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฏ","order":4502,"group":9,"version":2},{"shortcodes":["denmark","flag_dk"],"annotation":"flag: Denmark","tags":["DK","flag"],"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฐ","order":4503,"group":9,"version":2},{"shortcodes":["dominica","flag_dm"],"annotation":"flag: Dominica","tags":["DM","flag"],"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฒ","order":4504,"group":9,"version":2},{"shortcodes":["dominican_republic","flag_do"],"annotation":"flag: Dominican Republic","tags":["DO","flag"],"emoji":"๐Ÿ‡ฉ๐Ÿ‡ด","order":4505,"group":9,"version":2},{"shortcodes":["algeria","flag_dz"],"annotation":"flag: Algeria","tags":["DZ","flag"],"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฟ","order":4506,"group":9,"version":2},{"shortcodes":["ceuta_melilla","flag_ea"],"annotation":"flag: Ceuta & Melilla","tags":["EA","flag"],"emoji":"๐Ÿ‡ช๐Ÿ‡ฆ","order":4507,"group":9,"version":2},{"shortcodes":["ecuador","flag_ec"],"annotation":"flag: Ecuador","tags":["EC","flag"],"emoji":"๐Ÿ‡ช๐Ÿ‡จ","order":4508,"group":9,"version":2},{"shortcodes":["estonia","flag_ee"],"annotation":"flag: Estonia","tags":["EE","flag"],"emoji":"๐Ÿ‡ช๐Ÿ‡ช","order":4509,"group":9,"version":2},{"shortcodes":["egypt","flag_eg"],"annotation":"flag: Egypt","tags":["EG","flag"],"emoji":"๐Ÿ‡ช๐Ÿ‡ฌ","order":4510,"group":9,"version":2},{"shortcodes":["flag_eh","western_sahara"],"annotation":"flag: Western Sahara","tags":["EH","flag"],"emoji":"๐Ÿ‡ช๐Ÿ‡ญ","order":4511,"group":9,"version":2},{"shortcodes":["eritrea","flag_er"],"annotation":"flag: Eritrea","tags":["ER","flag"],"emoji":"๐Ÿ‡ช๐Ÿ‡ท","order":4512,"group":9,"version":2},{"shortcodes":["flag_es","spain"],"annotation":"flag: Spain","tags":["ES","flag"],"emoji":"๐Ÿ‡ช๐Ÿ‡ธ","order":4513,"group":9,"version":0.6},{"shortcodes":["ethiopia","flag_et"],"annotation":"flag: Ethiopia","tags":["ET","flag"],"emoji":"๐Ÿ‡ช๐Ÿ‡น","order":4514,"group":9,"version":2},{"shortcodes":["european_union","flag_eu"],"annotation":"flag: European Union","tags":["EU","flag"],"emoji":"๐Ÿ‡ช๐Ÿ‡บ","order":4515,"group":9,"version":2},{"shortcodes":["finland","flag_fi"],"annotation":"flag: Finland","tags":["FI","flag"],"emoji":"๐Ÿ‡ซ๐Ÿ‡ฎ","order":4516,"group":9,"version":2},{"shortcodes":["fiji","flag_fj"],"annotation":"flag: Fiji","tags":["FJ","flag"],"emoji":"๐Ÿ‡ซ๐Ÿ‡ฏ","order":4517,"group":9,"version":2},{"shortcodes":["falkland_islands","flag_fk"],"annotation":"flag: Falkland Islands","tags":["FK","flag"],"emoji":"๐Ÿ‡ซ๐Ÿ‡ฐ","order":4518,"group":9,"version":2},{"shortcodes":["flag_fm","micronesia"],"annotation":"flag: Micronesia","tags":["FM","flag"],"emoji":"๐Ÿ‡ซ๐Ÿ‡ฒ","order":4519,"group":9,"version":2},{"shortcodes":["faroe_islands","flag_fo"],"annotation":"flag: Faroe Islands","tags":["FO","flag"],"emoji":"๐Ÿ‡ซ๐Ÿ‡ด","order":4520,"group":9,"version":2},{"shortcodes":["flag_fr","france"],"annotation":"flag: France","tags":["FR","flag"],"emoji":"๐Ÿ‡ซ๐Ÿ‡ท","order":4521,"group":9,"version":0.6},{"shortcodes":["flag_ga","gabon"],"annotation":"flag: Gabon","tags":["GA","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฆ","order":4522,"group":9,"version":2},{"shortcodes":["flag_gb","uk","united_kingdom"],"annotation":"flag: United Kingdom","tags":["GB","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ง","order":4523,"group":9,"version":0.6},{"shortcodes":["flag_gd","grenada"],"annotation":"flag: Grenada","tags":["GD","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฉ","order":4524,"group":9,"version":2},{"shortcodes":["flag_ge","georgia"],"annotation":"flag: Georgia","tags":["GE","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ช","order":4525,"group":9,"version":2},{"shortcodes":["flag_gf","french_guiana"],"annotation":"flag: French Guiana","tags":["GF","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ซ","order":4526,"group":9,"version":2},{"shortcodes":["flag_gg","guernsey"],"annotation":"flag: Guernsey","tags":["GG","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฌ","order":4527,"group":9,"version":2},{"shortcodes":["flag_gh","ghana"],"annotation":"flag: Ghana","tags":["GH","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ญ","order":4528,"group":9,"version":2},{"shortcodes":["flag_gi","gibraltar"],"annotation":"flag: Gibraltar","tags":["GI","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฎ","order":4529,"group":9,"version":2},{"shortcodes":["flag_gl","greenland"],"annotation":"flag: Greenland","tags":["GL","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฑ","order":4530,"group":9,"version":2},{"shortcodes":["flag_gm","gambia"],"annotation":"flag: Gambia","tags":["GM","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฒ","order":4531,"group":9,"version":2},{"shortcodes":["flag_gn","guinea"],"annotation":"flag: Guinea","tags":["GN","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ณ","order":4532,"group":9,"version":2},{"shortcodes":["flag_gp","guadeloupe"],"annotation":"flag: Guadeloupe","tags":["GP","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ต","order":4533,"group":9,"version":2},{"shortcodes":["equatorial_guinea","flag_gq"],"annotation":"flag: Equatorial Guinea","tags":["GQ","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ถ","order":4534,"group":9,"version":2},{"shortcodes":["flag_gr","greece"],"annotation":"flag: Greece","tags":["GR","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ท","order":4535,"group":9,"version":2},{"shortcodes":["flag_gs","south_georgia_south_sandwich_islands"],"annotation":"flag: South Georgia & South Sandwich Islands","tags":["GS","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ธ","order":4536,"group":9,"version":2},{"shortcodes":["flag_gt","guatemala"],"annotation":"flag: Guatemala","tags":["GT","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡น","order":4537,"group":9,"version":2},{"shortcodes":["flag_gu","guam"],"annotation":"flag: Guam","tags":["GU","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡บ","order":4538,"group":9,"version":2},{"shortcodes":["flag_gw","guinea_bissau"],"annotation":"flag: Guinea-Bissau","tags":["GW","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡ผ","order":4539,"group":9,"version":2},{"shortcodes":["flag_gy","guyana"],"annotation":"flag: Guyana","tags":["GY","flag"],"emoji":"๐Ÿ‡ฌ๐Ÿ‡พ","order":4540,"group":9,"version":2},{"shortcodes":["flag_hk","hong_kong"],"annotation":"flag: Hong Kong SAR China","tags":["HK","flag"],"emoji":"๐Ÿ‡ญ๐Ÿ‡ฐ","order":4541,"group":9,"version":2},{"shortcodes":["flag_hm","heard_mcdonald_islands"],"annotation":"flag: Heard & McDonald Islands","tags":["HM","flag"],"emoji":"๐Ÿ‡ญ๐Ÿ‡ฒ","order":4542,"group":9,"version":2},{"shortcodes":["flag_hn","honduras"],"annotation":"flag: Honduras","tags":["HN","flag"],"emoji":"๐Ÿ‡ญ๐Ÿ‡ณ","order":4543,"group":9,"version":2},{"shortcodes":["croatia","flag_hr"],"annotation":"flag: Croatia","tags":["HR","flag"],"emoji":"๐Ÿ‡ญ๐Ÿ‡ท","order":4544,"group":9,"version":2},{"shortcodes":["flag_ht","haiti"],"annotation":"flag: Haiti","tags":["HT","flag"],"emoji":"๐Ÿ‡ญ๐Ÿ‡น","order":4545,"group":9,"version":2},{"shortcodes":["flag_hu","hungary"],"annotation":"flag: Hungary","tags":["HU","flag"],"emoji":"๐Ÿ‡ญ๐Ÿ‡บ","order":4546,"group":9,"version":2},{"shortcodes":["canary_islands","flag_ic"],"annotation":"flag: Canary Islands","tags":["IC","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡จ","order":4547,"group":9,"version":2},{"shortcodes":["flag_id","indonesia"],"annotation":"flag: Indonesia","tags":["ID","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡ฉ","order":4548,"group":9,"version":2},{"shortcodes":["flag_ie","ireland"],"annotation":"flag: Ireland","tags":["IE","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡ช","order":4549,"group":9,"version":2},{"shortcodes":["flag_il","israel"],"annotation":"flag: Israel","tags":["IL","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡ฑ","order":4550,"group":9,"version":2},{"shortcodes":["flag_im","isle_of_man"],"annotation":"flag: Isle of Man","tags":["IM","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡ฒ","order":4551,"group":9,"version":2},{"shortcodes":["flag_in","india"],"annotation":"flag: India","tags":["IN","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡ณ","order":4552,"group":9,"version":2},{"shortcodes":["british_indian_ocean_territory","flag_io"],"annotation":"flag: British Indian Ocean Territory","tags":["IO","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡ด","order":4553,"group":9,"version":2},{"shortcodes":["flag_iq","iraq"],"annotation":"flag: Iraq","tags":["IQ","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡ถ","order":4554,"group":9,"version":2},{"shortcodes":["flag_ir","iran"],"annotation":"flag: Iran","tags":["IR","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡ท","order":4555,"group":9,"version":2},{"shortcodes":["flag_is","iceland"],"annotation":"flag: Iceland","tags":["IS","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡ธ","order":4556,"group":9,"version":2},{"shortcodes":["flag_it","italy"],"annotation":"flag: Italy","tags":["IT","flag"],"emoji":"๐Ÿ‡ฎ๐Ÿ‡น","order":4557,"group":9,"version":0.6},{"shortcodes":["flag_je","jersey"],"annotation":"flag: Jersey","tags":["JE","flag"],"emoji":"๐Ÿ‡ฏ๐Ÿ‡ช","order":4558,"group":9,"version":2},{"shortcodes":["flag_jm","jamaica"],"annotation":"flag: Jamaica","tags":["JM","flag"],"emoji":"๐Ÿ‡ฏ๐Ÿ‡ฒ","order":4559,"group":9,"version":2},{"shortcodes":["flag_jo","jordan"],"annotation":"flag: Jordan","tags":["JO","flag"],"emoji":"๐Ÿ‡ฏ๐Ÿ‡ด","order":4560,"group":9,"version":2},{"shortcodes":["flag_jp","japan"],"annotation":"flag: Japan","tags":["JP","flag"],"emoji":"๐Ÿ‡ฏ๐Ÿ‡ต","order":4561,"group":9,"version":0.6},{"shortcodes":["flag_ke","kenya"],"annotation":"flag: Kenya","tags":["KE","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ช","order":4562,"group":9,"version":2},{"shortcodes":["flag_kg","kyrgyzstan"],"annotation":"flag: Kyrgyzstan","tags":["KG","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ฌ","order":4563,"group":9,"version":2},{"shortcodes":["cambodia","flag_kh"],"annotation":"flag: Cambodia","tags":["KH","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ญ","order":4564,"group":9,"version":2},{"shortcodes":["flag_ki","kiribati"],"annotation":"flag: Kiribati","tags":["KI","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ฎ","order":4565,"group":9,"version":2},{"shortcodes":["comoros","flag_km"],"annotation":"flag: Comoros","tags":["KM","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ฒ","order":4566,"group":9,"version":2},{"shortcodes":["flag_kn","st_kitts_nevis"],"annotation":"flag: St. Kitts & Nevis","tags":["KN","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ณ","order":4567,"group":9,"version":2},{"shortcodes":["flag_kp","north_korea"],"annotation":"flag: North Korea","tags":["KP","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ต","order":4568,"group":9,"version":2},{"shortcodes":["flag_kr","south_korea"],"annotation":"flag: South Korea","tags":["KR","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ท","order":4569,"group":9,"version":0.6},{"shortcodes":["flag_kw","kuwait"],"annotation":"flag: Kuwait","tags":["KW","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ผ","order":4570,"group":9,"version":2},{"shortcodes":["cayman_islands","flag_ky"],"annotation":"flag: Cayman Islands","tags":["KY","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡พ","order":4571,"group":9,"version":2},{"shortcodes":["flag_kz","kazakhstan"],"annotation":"flag: Kazakhstan","tags":["KZ","flag"],"emoji":"๐Ÿ‡ฐ๐Ÿ‡ฟ","order":4572,"group":9,"version":2},{"shortcodes":["flag_la","laos"],"annotation":"flag: Laos","tags":["LA","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡ฆ","order":4573,"group":9,"version":2},{"shortcodes":["flag_lb","lebanon"],"annotation":"flag: Lebanon","tags":["LB","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡ง","order":4574,"group":9,"version":2},{"shortcodes":["flag_lc","st_lucia"],"annotation":"flag: St. Lucia","tags":["LC","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡จ","order":4575,"group":9,"version":2},{"shortcodes":["flag_li","liechtenstein"],"annotation":"flag: Liechtenstein","tags":["LI","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡ฎ","order":4576,"group":9,"version":2},{"shortcodes":["flag_lk","sri_lanka"],"annotation":"flag: Sri Lanka","tags":["LK","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡ฐ","order":4577,"group":9,"version":2},{"shortcodes":["flag_lr","liberia"],"annotation":"flag: Liberia","tags":["LR","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡ท","order":4578,"group":9,"version":2},{"shortcodes":["flag_ls","lesotho"],"annotation":"flag: Lesotho","tags":["LS","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡ธ","order":4579,"group":9,"version":2},{"shortcodes":["flag_lt","lithuania"],"annotation":"flag: Lithuania","tags":["LT","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡น","order":4580,"group":9,"version":2},{"shortcodes":["flag_lu","luxembourg"],"annotation":"flag: Luxembourg","tags":["LU","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡บ","order":4581,"group":9,"version":2},{"shortcodes":["flag_lv","latvia"],"annotation":"flag: Latvia","tags":["LV","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡ป","order":4582,"group":9,"version":2},{"shortcodes":["flag_ly","libya"],"annotation":"flag: Libya","tags":["LY","flag"],"emoji":"๐Ÿ‡ฑ๐Ÿ‡พ","order":4583,"group":9,"version":2},{"shortcodes":["flag_ma","morocco"],"annotation":"flag: Morocco","tags":["MA","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฆ","order":4584,"group":9,"version":2},{"shortcodes":["flag_mc","monaco"],"annotation":"flag: Monaco","tags":["MC","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡จ","order":4585,"group":9,"version":2},{"shortcodes":["flag_md","moldova"],"annotation":"flag: Moldova","tags":["MD","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฉ","order":4586,"group":9,"version":2},{"shortcodes":["flag_me","montenegro"],"annotation":"flag: Montenegro","tags":["ME","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ช","order":4587,"group":9,"version":2},{"shortcodes":["flag_mf","st_martin"],"annotation":"flag: St. Martin","tags":["MF","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ซ","order":4588,"group":9,"version":2},{"shortcodes":["flag_mg","madagascar"],"annotation":"flag: Madagascar","tags":["MG","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฌ","order":4589,"group":9,"version":2},{"shortcodes":["flag_mh","marshall_islands"],"annotation":"flag: Marshall Islands","tags":["MH","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ญ","order":4590,"group":9,"version":2},{"shortcodes":["flag_mk","macedonia"],"annotation":"flag: North Macedonia","tags":["MK","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฐ","order":4591,"group":9,"version":2},{"shortcodes":["flag_ml","mali"],"annotation":"flag: Mali","tags":["ML","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฑ","order":4592,"group":9,"version":2},{"shortcodes":["burma","flag_mm","myanmar"],"annotation":"flag: Myanmar (Burma)","tags":["MM","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฒ","order":4593,"group":9,"version":2},{"shortcodes":["flag_mn","mongolia"],"annotation":"flag: Mongolia","tags":["MN","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ณ","order":4594,"group":9,"version":2},{"shortcodes":["flag_mo","macao","macau"],"annotation":"flag: Macao SAR China","tags":["MO","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ด","order":4595,"group":9,"version":2},{"shortcodes":["flag_mp","northern_mariana_islands"],"annotation":"flag: Northern Mariana Islands","tags":["MP","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ต","order":4596,"group":9,"version":2},{"shortcodes":["flag_mq","martinique"],"annotation":"flag: Martinique","tags":["MQ","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ถ","order":4597,"group":9,"version":2},{"shortcodes":["flag_mr","mauritania"],"annotation":"flag: Mauritania","tags":["MR","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ท","order":4598,"group":9,"version":2},{"shortcodes":["flag_ms","montserrat"],"annotation":"flag: Montserrat","tags":["MS","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ธ","order":4599,"group":9,"version":2},{"shortcodes":["flag_mt","malta"],"annotation":"flag: Malta","tags":["MT","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡น","order":4600,"group":9,"version":2},{"shortcodes":["flag_mu","mauritius"],"annotation":"flag: Mauritius","tags":["MU","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡บ","order":4601,"group":9,"version":2},{"shortcodes":["flag_mv","maldives"],"annotation":"flag: Maldives","tags":["MV","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ป","order":4602,"group":9,"version":2},{"shortcodes":["flag_mw","malawi"],"annotation":"flag: Malawi","tags":["MW","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ผ","order":4603,"group":9,"version":2},{"shortcodes":["flag_mx","mexico"],"annotation":"flag: Mexico","tags":["MX","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฝ","order":4604,"group":9,"version":2},{"shortcodes":["flag_my","malaysia"],"annotation":"flag: Malaysia","tags":["MY","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡พ","order":4605,"group":9,"version":2},{"shortcodes":["flag_mz","mozambique"],"annotation":"flag: Mozambique","tags":["MZ","flag"],"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฟ","order":4606,"group":9,"version":2},{"shortcodes":["flag_na","namibia"],"annotation":"flag: Namibia","tags":["NA","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ฆ","order":4607,"group":9,"version":2},{"shortcodes":["flag_nc","new_caledonia"],"annotation":"flag: New Caledonia","tags":["NC","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡จ","order":4608,"group":9,"version":2},{"shortcodes":["flag_ne","niger"],"annotation":"flag: Niger","tags":["NE","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ช","order":4609,"group":9,"version":2},{"shortcodes":["flag_nf","norfolk_island"],"annotation":"flag: Norfolk Island","tags":["NF","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ซ","order":4610,"group":9,"version":2},{"shortcodes":["flag_ng","nigeria"],"annotation":"flag: Nigeria","tags":["NG","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ฌ","order":4611,"group":9,"version":2},{"shortcodes":["flag_ni","nicaragua"],"annotation":"flag: Nicaragua","tags":["NI","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ฎ","order":4612,"group":9,"version":2},{"shortcodes":["flag_nl","netherlands"],"annotation":"flag: Netherlands","tags":["NL","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ฑ","order":4613,"group":9,"version":2},{"shortcodes":["flag_no","norway"],"annotation":"flag: Norway","tags":["NO","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ด","order":4614,"group":9,"version":2},{"shortcodes":["flag_np","nepal"],"annotation":"flag: Nepal","tags":["NP","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ต","order":4615,"group":9,"version":2},{"shortcodes":["flag_nr","nauru"],"annotation":"flag: Nauru","tags":["NR","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ท","order":4616,"group":9,"version":2},{"shortcodes":["flag_nu","niue"],"annotation":"flag: Niue","tags":["NU","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡บ","order":4617,"group":9,"version":2},{"shortcodes":["flag_nz","new_zealand"],"annotation":"flag: New Zealand","tags":["NZ","flag"],"emoji":"๐Ÿ‡ณ๐Ÿ‡ฟ","order":4618,"group":9,"version":2},{"shortcodes":["flag_om","oman"],"annotation":"flag: Oman","tags":["OM","flag"],"emoji":"๐Ÿ‡ด๐Ÿ‡ฒ","order":4619,"group":9,"version":2},{"shortcodes":["flag_pa","panama"],"annotation":"flag: Panama","tags":["PA","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ฆ","order":4620,"group":9,"version":2},{"shortcodes":["flag_pe","peru"],"annotation":"flag: Peru","tags":["PE","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ช","order":4621,"group":9,"version":2},{"shortcodes":["flag_pf","french_polynesia"],"annotation":"flag: French Polynesia","tags":["PF","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ซ","order":4622,"group":9,"version":2},{"shortcodes":["flag_pg","papua_new_guinea"],"annotation":"flag: Papua New Guinea","tags":["PG","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ฌ","order":4623,"group":9,"version":2},{"shortcodes":["flag_ph","philippines"],"annotation":"flag: Philippines","tags":["PH","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ญ","order":4624,"group":9,"version":2},{"shortcodes":["flag_pk","pakistan"],"annotation":"flag: Pakistan","tags":["PK","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ฐ","order":4625,"group":9,"version":2},{"shortcodes":["flag_pl","poland"],"annotation":"flag: Poland","tags":["PL","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ฑ","order":4626,"group":9,"version":2},{"shortcodes":["flag_pm","st_pierre_miquelon"],"annotation":"flag: St. Pierre & Miquelon","tags":["PM","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ฒ","order":4627,"group":9,"version":2},{"shortcodes":["flag_pn","pitcairn_islands"],"annotation":"flag: Pitcairn Islands","tags":["PN","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ณ","order":4628,"group":9,"version":2},{"shortcodes":["flag_pr","puerto_rico"],"annotation":"flag: Puerto Rico","tags":["PR","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ท","order":4629,"group":9,"version":2},{"shortcodes":["flag_ps","palestinian_territories"],"annotation":"flag: Palestinian Territories","tags":["PS","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ธ","order":4630,"group":9,"version":2},{"shortcodes":["flag_pt","portugal"],"annotation":"flag: Portugal","tags":["PT","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡น","order":4631,"group":9,"version":2},{"shortcodes":["flag_pw","palau"],"annotation":"flag: Palau","tags":["PW","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡ผ","order":4632,"group":9,"version":2},{"shortcodes":["flag_py","paraguay"],"annotation":"flag: Paraguay","tags":["PY","flag"],"emoji":"๐Ÿ‡ต๐Ÿ‡พ","order":4633,"group":9,"version":2},{"shortcodes":["flag_qa","qatar"],"annotation":"flag: Qatar","tags":["QA","flag"],"emoji":"๐Ÿ‡ถ๐Ÿ‡ฆ","order":4634,"group":9,"version":2},{"shortcodes":["flag_re","reunion"],"annotation":"flag: Rรฉunion","tags":["RE","flag"],"emoji":"๐Ÿ‡ท๐Ÿ‡ช","order":4635,"group":9,"version":2},{"shortcodes":["flag_ro","romania"],"annotation":"flag: Romania","tags":["RO","flag"],"emoji":"๐Ÿ‡ท๐Ÿ‡ด","order":4636,"group":9,"version":2},{"shortcodes":["flag_rs","serbia"],"annotation":"flag: Serbia","tags":["RS","flag"],"emoji":"๐Ÿ‡ท๐Ÿ‡ธ","order":4637,"group":9,"version":2},{"shortcodes":["flag_ru","russia"],"annotation":"flag: Russia","tags":["RU","flag"],"emoji":"๐Ÿ‡ท๐Ÿ‡บ","order":4638,"group":9,"version":0.6},{"shortcodes":["flag_rw","rwanda"],"annotation":"flag: Rwanda","tags":["RW","flag"],"emoji":"๐Ÿ‡ท๐Ÿ‡ผ","order":4639,"group":9,"version":2},{"shortcodes":["flag_sa","saudi_arabia"],"annotation":"flag: Saudi Arabia","tags":["SA","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฆ","order":4640,"group":9,"version":2},{"shortcodes":["flag_sb","solomon_islands"],"annotation":"flag: Solomon Islands","tags":["SB","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ง","order":4641,"group":9,"version":2},{"shortcodes":["flag_sc","seychelles"],"annotation":"flag: Seychelles","tags":["SC","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡จ","order":4642,"group":9,"version":2},{"shortcodes":["flag_sd","sudan"],"annotation":"flag: Sudan","tags":["SD","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฉ","order":4643,"group":9,"version":2},{"shortcodes":["flag_se","sweden"],"annotation":"flag: Sweden","tags":["SE","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ช","order":4644,"group":9,"version":2},{"shortcodes":["flag_sg","singapore"],"annotation":"flag: Singapore","tags":["SG","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฌ","order":4645,"group":9,"version":2},{"shortcodes":["flag_sh","st_helena"],"annotation":"flag: St. Helena","tags":["SH","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ญ","order":4646,"group":9,"version":2},{"shortcodes":["flag_si","slovenia"],"annotation":"flag: Slovenia","tags":["SI","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฎ","order":4647,"group":9,"version":2},{"shortcodes":["flag_sj","svalbard_jan_mayen"],"annotation":"flag: Svalbard & Jan Mayen","tags":["SJ","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฏ","order":4648,"group":9,"version":2},{"shortcodes":["flag_sk","slovakia"],"annotation":"flag: Slovakia","tags":["SK","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฐ","order":4649,"group":9,"version":2},{"shortcodes":["flag_sl","sierra_leone"],"annotation":"flag: Sierra Leone","tags":["SL","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฑ","order":4650,"group":9,"version":2},{"shortcodes":["flag_sm","san_marino"],"annotation":"flag: San Marino","tags":["SM","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฒ","order":4651,"group":9,"version":2},{"shortcodes":["flag_sn","senegal"],"annotation":"flag: Senegal","tags":["SN","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ณ","order":4652,"group":9,"version":2},{"shortcodes":["flag_so","somalia"],"annotation":"flag: Somalia","tags":["SO","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ด","order":4653,"group":9,"version":2},{"shortcodes":["flag_sr","suriname"],"annotation":"flag: Suriname","tags":["SR","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ท","order":4654,"group":9,"version":2},{"shortcodes":["flag_ss","south_sudan"],"annotation":"flag: South Sudan","tags":["SS","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ธ","order":4655,"group":9,"version":2},{"shortcodes":["flag_st","sao_tome_principe"],"annotation":"flag: Sรฃo Tomรฉ & Prรญncipe","tags":["ST","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡น","order":4656,"group":9,"version":2},{"shortcodes":["el_salvador","flag_sv"],"annotation":"flag: El Salvador","tags":["SV","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ป","order":4657,"group":9,"version":2},{"shortcodes":["flag_sx","sint_maarten"],"annotation":"flag: Sint Maarten","tags":["SX","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฝ","order":4658,"group":9,"version":2},{"shortcodes":["flag_sy","syria"],"annotation":"flag: Syria","tags":["SY","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡พ","order":4659,"group":9,"version":2},{"shortcodes":["eswatini","flag_sz","swaziland"],"annotation":"flag: Eswatini","tags":["SZ","flag"],"emoji":"๐Ÿ‡ธ๐Ÿ‡ฟ","order":4660,"group":9,"version":2},{"shortcodes":["flag_ta","tristan_da_cunha"],"annotation":"flag: Tristan da Cunha","tags":["TA","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ฆ","order":4661,"group":9,"version":2},{"shortcodes":["flag_tc","turks_caicos_islands"],"annotation":"flag: Turks & Caicos Islands","tags":["TC","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡จ","order":4662,"group":9,"version":2},{"shortcodes":["chad","flag_td"],"annotation":"flag: Chad","tags":["TD","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ฉ","order":4663,"group":9,"version":2},{"shortcodes":["flag_tf","french_southern_territories"],"annotation":"flag: French Southern Territories","tags":["TF","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ซ","order":4664,"group":9,"version":2},{"shortcodes":["flag_tg","togo"],"annotation":"flag: Togo","tags":["TG","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ฌ","order":4665,"group":9,"version":2},{"shortcodes":["flag_th","thailand"],"annotation":"flag: Thailand","tags":["TH","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ญ","order":4666,"group":9,"version":2},{"shortcodes":["flag_tj","tajikistan"],"annotation":"flag: Tajikistan","tags":["TJ","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ฏ","order":4667,"group":9,"version":2},{"shortcodes":["flag_tk","tokelau"],"annotation":"flag: Tokelau","tags":["TK","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ฐ","order":4668,"group":9,"version":2},{"shortcodes":["flag_tl","timor_leste"],"annotation":"flag: Timor-Leste","tags":["TL","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ฑ","order":4669,"group":9,"version":2},{"shortcodes":["flag_tm","turkmenistan"],"annotation":"flag: Turkmenistan","tags":["TM","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ฒ","order":4670,"group":9,"version":2},{"shortcodes":["flag_tn","tunisia"],"annotation":"flag: Tunisia","tags":["TN","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ณ","order":4671,"group":9,"version":2},{"shortcodes":["flag_to","tonga"],"annotation":"flag: Tonga","tags":["TO","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ด","order":4672,"group":9,"version":2},{"shortcodes":["flag_tr","turkey_tr"],"annotation":"flag: Turkey","tags":["TR","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ท","order":4673,"group":9,"version":2},{"shortcodes":["flag_tt","trinidad_tobago"],"annotation":"flag: Trinidad & Tobago","tags":["TT","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡น","order":4674,"group":9,"version":2},{"shortcodes":["flag_tv","tuvalu"],"annotation":"flag: Tuvalu","tags":["TV","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ป","order":4675,"group":9,"version":2},{"shortcodes":["flag_tw","taiwan"],"annotation":"flag: Taiwan","tags":["TW","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ผ","order":4676,"group":9,"version":2},{"shortcodes":["flag_tz","tanzania"],"annotation":"flag: Tanzania","tags":["TZ","flag"],"emoji":"๐Ÿ‡น๐Ÿ‡ฟ","order":4677,"group":9,"version":2},{"shortcodes":["flag_ua","ukraine"],"annotation":"flag: Ukraine","tags":["UA","flag"],"emoji":"๐Ÿ‡บ๐Ÿ‡ฆ","order":4678,"group":9,"version":2},{"shortcodes":["flag_ug","uganda"],"annotation":"flag: Uganda","tags":["UG","flag"],"emoji":"๐Ÿ‡บ๐Ÿ‡ฌ","order":4679,"group":9,"version":2},{"shortcodes":["flag_um","us_outlying_islands"],"annotation":"flag: U.S. Outlying Islands","tags":["UM","flag"],"emoji":"๐Ÿ‡บ๐Ÿ‡ฒ","order":4680,"group":9,"version":2},{"shortcodes":["flag_un","un","united_nations"],"annotation":"flag: United Nations","tags":["UN","flag"],"emoji":"๐Ÿ‡บ๐Ÿ‡ณ","order":4681,"group":9,"version":4},{"shortcodes":["flag_us","united_states","usa"],"annotation":"flag: United States","tags":["US","flag"],"emoji":"๐Ÿ‡บ๐Ÿ‡ธ","order":4682,"group":9,"version":0.6},{"shortcodes":["flag_uy","uruguay"],"annotation":"flag: Uruguay","tags":["UY","flag"],"emoji":"๐Ÿ‡บ๐Ÿ‡พ","order":4683,"group":9,"version":2},{"shortcodes":["flag_uz","uzbekistan"],"annotation":"flag: Uzbekistan","tags":["UZ","flag"],"emoji":"๐Ÿ‡บ๐Ÿ‡ฟ","order":4684,"group":9,"version":2},{"shortcodes":["flag_va","vatican_city"],"annotation":"flag: Vatican City","tags":["VA","flag"],"emoji":"๐Ÿ‡ป๐Ÿ‡ฆ","order":4685,"group":9,"version":2},{"shortcodes":["flag_vc","st_vincent_grenadines"],"annotation":"flag: St. Vincent & Grenadines","tags":["VC","flag"],"emoji":"๐Ÿ‡ป๐Ÿ‡จ","order":4686,"group":9,"version":2},{"shortcodes":["flag_ve","venezuela"],"annotation":"flag: Venezuela","tags":["VE","flag"],"emoji":"๐Ÿ‡ป๐Ÿ‡ช","order":4687,"group":9,"version":2},{"shortcodes":["british_virgin_islands","flag_vg"],"annotation":"flag: British Virgin Islands","tags":["VG","flag"],"emoji":"๐Ÿ‡ป๐Ÿ‡ฌ","order":4688,"group":9,"version":2},{"shortcodes":["flag_vi","us_virgin_islands"],"annotation":"flag: U.S. Virgin Islands","tags":["VI","flag"],"emoji":"๐Ÿ‡ป๐Ÿ‡ฎ","order":4689,"group":9,"version":2},{"shortcodes":["flag_vn","vietnam"],"annotation":"flag: Vietnam","tags":["VN","flag"],"emoji":"๐Ÿ‡ป๐Ÿ‡ณ","order":4690,"group":9,"version":2},{"shortcodes":["flag_vu","vanuatu"],"annotation":"flag: Vanuatu","tags":["VU","flag"],"emoji":"๐Ÿ‡ป๐Ÿ‡บ","order":4691,"group":9,"version":2},{"shortcodes":["flag_wf","wallis_futuna"],"annotation":"flag: Wallis & Futuna","tags":["WF","flag"],"emoji":"๐Ÿ‡ผ๐Ÿ‡ซ","order":4692,"group":9,"version":2},{"shortcodes":["flag_ws","samoa"],"annotation":"flag: Samoa","tags":["WS","flag"],"emoji":"๐Ÿ‡ผ๐Ÿ‡ธ","order":4693,"group":9,"version":2},{"shortcodes":["flag_xk","kosovo"],"annotation":"flag: Kosovo","tags":["XK","flag"],"emoji":"๐Ÿ‡ฝ๐Ÿ‡ฐ","order":4694,"group":9,"version":2},{"shortcodes":["flag_ye","yemen"],"annotation":"flag: Yemen","tags":["YE","flag"],"emoji":"๐Ÿ‡พ๐Ÿ‡ช","order":4695,"group":9,"version":2},{"shortcodes":["flag_yt","mayotte"],"annotation":"flag: Mayotte","tags":["YT","flag"],"emoji":"๐Ÿ‡พ๐Ÿ‡น","order":4696,"group":9,"version":2},{"shortcodes":["flag_za","south_africa"],"annotation":"flag: South Africa","tags":["ZA","flag"],"emoji":"๐Ÿ‡ฟ๐Ÿ‡ฆ","order":4697,"group":9,"version":2},{"shortcodes":["flag_zm","zambia"],"annotation":"flag: Zambia","tags":["ZM","flag"],"emoji":"๐Ÿ‡ฟ๐Ÿ‡ฒ","order":4698,"group":9,"version":2},{"shortcodes":["flag_zw","zimbabwe"],"annotation":"flag: Zimbabwe","tags":["ZW","flag"],"emoji":"๐Ÿ‡ฟ๐Ÿ‡ผ","order":4699,"group":9,"version":2},{"shortcodes":["england","flag_gbeng"],"annotation":"flag: England","tags":["flag","gbeng"],"emoji":"๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ","order":4700,"group":9,"version":5},{"shortcodes":["flag_gbsct","scotland"],"annotation":"flag: Scotland","tags":["flag","gbsct"],"emoji":"๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ","order":4701,"group":9,"version":5},{"shortcodes":["flag_gbwls","wales"],"annotation":"flag: Wales","tags":["flag","gbwls"],"emoji":"๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ","order":4702,"group":9,"version":5}] \ No newline at end of file diff --git a/app/static/scripts/emoji-picker-element/database.js b/app/static/scripts/emoji-picker-element/database.js new file mode 100644 index 0000000..ada5098 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/database.js @@ -0,0 +1,972 @@ +function assertNonEmptyString (str) { + if (typeof str !== 'string' || !str) { + throw new Error('expected a non-empty string, got: ' + str) + } +} + +function assertNumber (number) { + if (typeof number !== 'number') { + throw new Error('expected a number, got: ' + number) + } +} + +const DB_VERSION_CURRENT = 1; +const DB_VERSION_INITIAL = 1; +const STORE_EMOJI = 'emoji'; +const STORE_KEYVALUE = 'keyvalue'; +const STORE_FAVORITES = 'favorites'; +const FIELD_TOKENS = 'tokens'; +const INDEX_TOKENS = 'tokens'; +const FIELD_UNICODE = 'unicode'; +const INDEX_COUNT = 'count'; +const FIELD_GROUP = 'group'; +const FIELD_ORDER = 'order'; +const INDEX_GROUP_AND_ORDER = 'group-order'; +const KEY_ETAG = 'eTag'; +const KEY_URL = 'url'; +const KEY_PREFERRED_SKINTONE = 'skinTone'; +const MODE_READONLY = 'readonly'; +const MODE_READWRITE = 'readwrite'; +const INDEX_SKIN_UNICODE = 'skinUnicodes'; +const FIELD_SKIN_UNICODE = 'skinUnicodes'; + +const DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json'; +const DEFAULT_LOCALE = 'en'; + +// like lodash's uniqBy but much smaller +function uniqBy (arr, func) { + const set = new Set(); + const res = []; + for (const item of arr) { + const key = func(item); + if (!set.has(key)) { + set.add(key); + res.push(item); + } + } + return res +} + +function uniqEmoji (emojis) { + return uniqBy(emojis, _ => _.unicode) +} + +function initialMigration (db) { + function createObjectStore (name, keyPath, indexes) { + const store = keyPath + ? db.createObjectStore(name, { keyPath }) + : db.createObjectStore(name); + if (indexes) { + for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes)) { + store.createIndex(indexName, keyPath, { multiEntry }); + } + } + return store + } + + createObjectStore(STORE_KEYVALUE); + createObjectStore(STORE_EMOJI, /* keyPath */ FIELD_UNICODE, { + [INDEX_TOKENS]: [FIELD_TOKENS, /* multiEntry */ true], + [INDEX_GROUP_AND_ORDER]: [[FIELD_GROUP, FIELD_ORDER]], + [INDEX_SKIN_UNICODE]: [FIELD_SKIN_UNICODE, /* multiEntry */ true] + }); + createObjectStore(STORE_FAVORITES, undefined, { + [INDEX_COUNT]: [''] + }); +} + +const openIndexedDBRequests = {}; +const databaseCache = {}; +const onCloseListeners = {}; + +function handleOpenOrDeleteReq (resolve, reject, req) { + // These things are almost impossible to test with fakeIndexedDB sadly + /* istanbul ignore next */ + req.onerror = () => reject(req.error); + /* istanbul ignore next */ + req.onblocked = () => reject(new Error('IDB blocked')); + req.onsuccess = () => resolve(req.result); +} + +async function createDatabase (dbName) { + const db = await new Promise((resolve, reject) => { + const req = indexedDB.open(dbName, DB_VERSION_CURRENT); + openIndexedDBRequests[dbName] = req; + req.onupgradeneeded = e => { + // Technically there is only one version, so we don't need this `if` check + // But if an old version of the JS is in another browser tab + // and it gets upgraded in the future and we have a new DB version, well... + // better safe than sorry. + /* istanbul ignore else */ + if (e.oldVersion < DB_VERSION_INITIAL) { + initialMigration(req.result); + } + }; + handleOpenOrDeleteReq(resolve, reject, req); + }); + // Handle abnormal closes, e.g. "delete database" in chrome dev tools. + // No need for removeEventListener, because once the DB can no longer + // fire "close" events, it will auto-GC. + // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50 + /* istanbul ignore next */ + db.onclose = () => closeDatabase(dbName); + return db +} + +function openDatabase (dbName) { + if (!databaseCache[dbName]) { + databaseCache[dbName] = createDatabase(dbName); + } + return databaseCache[dbName] +} + +function dbPromise (db, storeName, readOnlyOrReadWrite, cb) { + return new Promise((resolve, reject) => { + // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone + // are really irreplaceable data. IndexedDB is just a cache in this case. + const txn = db.transaction(storeName, readOnlyOrReadWrite, { durability: 'relaxed' }); + const store = typeof storeName === 'string' + ? txn.objectStore(storeName) + : storeName.map(name => txn.objectStore(name)); + let res; + cb(store, txn, (result) => { + res = result; + }); + + txn.oncomplete = () => resolve(res); + /* istanbul ignore next */ + txn.onerror = () => reject(txn.error); + }) +} + +function closeDatabase (dbName) { + // close any open requests + const req = openIndexedDBRequests[dbName]; + const db = req && req.result; + if (db) { + db.close(); + const listeners = onCloseListeners[dbName]; + /* istanbul ignore else */ + if (listeners) { + for (const listener of listeners) { + listener(); + } + } + } + delete openIndexedDBRequests[dbName]; + delete databaseCache[dbName]; + delete onCloseListeners[dbName]; +} + +function deleteDatabase (dbName) { + return new Promise((resolve, reject) => { + // close any open requests + closeDatabase(dbName); + const req = indexedDB.deleteDatabase(dbName); + handleOpenOrDeleteReq(resolve, reject, req); + }) +} + +// The "close" event occurs during an abnormal shutdown, e.g. a user clearing their browser data. +// However, it doesn't occur with the normal "close" event, so we handle that separately. +// https://www.w3.org/TR/IndexedDB/#close-a-database-connection +function addOnCloseListener (dbName, listener) { + let listeners = onCloseListeners[dbName]; + if (!listeners) { + listeners = onCloseListeners[dbName] = []; + } + listeners.push(listener); +} + +// list of emoticons that don't match a simple \W+ regex +// extracted using: +// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\W+$/.test(_)) +const irregularEmoticons = new Set([ + ':D', 'XD', ":'D", 'O:)', + ':X', ':P', ';P', 'XP', + ':L', ':Z', ':j', '8D', + 'XO', '8)', ':B', ':O', + ':S', ":'o", 'Dx', 'X(', + 'D:', ':C', '>0)', ':3', + ' { + if (!word.match(/\w/) || irregularEmoticons.has(word)) { + // for pure emoticons like :) or :-), just leave them as-is + return word.toLowerCase() + } + + return word + .replace(/[)(:,]/g, '') + .replace(/โ€™/g, "'") + .toLowerCase() + }).filter(Boolean) +} + +const MIN_SEARCH_TEXT_LENGTH = 2; + +// This is an extra step in addition to extractTokens(). The difference here is that we expect +// the input to have already been run through extractTokens(). This is useful for cases like +// emoticons, where we don't want to do any tokenization (because it makes no sense to split up +// ">:)" by the colon) but we do want to lowercase it to have consistent search results, so that +// the user can type ':P' or ':p' and still get the same result. +function normalizeTokens (str) { + return str + .filter(Boolean) + .map(_ => _.toLowerCase()) + .filter(_ => _.length >= MIN_SEARCH_TEXT_LENGTH) +} + +// Transform emoji data for storage in IDB +function transformEmojiData (emojiData) { + const res = emojiData.map(({ annotation, emoticon, group, order, shortcodes, skins, tags, emoji, version }) => { + const tokens = [...new Set( + normalizeTokens([ + ...(shortcodes || []).map(extractTokens).flat(), + ...tags.map(extractTokens).flat(), + ...extractTokens(annotation), + emoticon + ]) + )].sort(); + const res = { + annotation, + group, + order, + tags, + tokens, + unicode: emoji, + version + }; + if (emoticon) { + res.emoticon = emoticon; + } + if (shortcodes) { + res.shortcodes = shortcodes; + } + if (skins) { + res.skinTones = []; + res.skinUnicodes = []; + res.skinVersions = []; + for (const { tone, emoji, version } of skins) { + res.skinTones.push(tone); + res.skinUnicodes.push(emoji); + res.skinVersions.push(version); + } + } + return res + }); + return res +} + +// helper functions that help compress the code better + +function callStore (store, method, key, cb) { + store[method](key).onsuccess = e => (cb && cb(e.target.result)); +} + +function getIDB (store, key, cb) { + callStore(store, 'get', key, cb); +} + +function getAllIDB (store, key, cb) { + callStore(store, 'getAll', key, cb); +} + +function commit (txn) { + /* istanbul ignore else */ + if (txn.commit) { + txn.commit(); + } +} + +// like lodash's minBy +function minBy (array, func) { + let minItem = array[0]; + for (let i = 1; i < array.length; i++) { + const item = array[i]; + if (func(minItem) > func(item)) { + minItem = item; + } + } + return minItem +} + +// return an array of results representing all items that are found in each one of the arrays + +function findCommonMembers (arrays, uniqByFunc) { + const shortestArray = minBy(arrays, _ => _.length); + const results = []; + for (const item of shortestArray) { + // if this item is included in every array in the intermediate results, add it to the final results + if (!arrays.some(array => array.findIndex(_ => uniqByFunc(_) === uniqByFunc(item)) === -1)) { + results.push(item); + } + } + return results +} + +async function isEmpty (db) { + return !(await get(db, STORE_KEYVALUE, KEY_URL)) +} + +async function hasData (db, url, eTag) { + const [oldETag, oldUrl] = await Promise.all([KEY_ETAG, KEY_URL] + .map(key => get(db, STORE_KEYVALUE, key))); + return (oldETag === eTag && oldUrl === url) +} + +async function doFullDatabaseScanForSingleResult (db, predicate) { + // This batching algorithm is just a perf improvement over a basic + // cursor. The BATCH_SIZE is an estimate of what would give the best + // perf for doing a full DB scan (worst case). + // + // Mini-benchmark for determining the best batch size: + // + // PERF=1 yarn build:rollup && yarn test:adhoc + // + // (async () => { + // performance.mark('start') + // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist') + // performance.measure('total', 'start') + // console.log(performance.getEntriesByName('total').slice(-1)[0].duration) + // })() + const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark + return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => { + let lastKey; + + const processNextBatch = () => { + emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = e => { + const results = e.target.result; + for (const result of results) { + lastKey = result.unicode; + if (predicate(result)) { + return cb(result) + } + } + if (results.length < BATCH_SIZE) { + return cb() + } + processNextBatch(); + }; + }; + processNextBatch(); + }) +} + +async function loadData (db, emojiData, url, eTag) { + try { + const transformedData = transformEmojiData(emojiData); + await dbPromise(db, [STORE_EMOJI, STORE_KEYVALUE], MODE_READWRITE, ([emojiStore, metaStore], txn) => { + let oldETag; + let oldUrl; + let todo = 0; + + function checkFetched () { + if (++todo === 2) { // 2 requests made + onFetched(); + } + } + + function onFetched () { + if (oldETag === eTag && oldUrl === url) { + // check again within the transaction to guard against concurrency, e.g. multiple browser tabs + return + } + // delete old data + emojiStore.clear(); + // insert new data + for (const data of transformedData) { + emojiStore.put(data); + } + metaStore.put(eTag, KEY_ETAG); + metaStore.put(url, KEY_URL); + commit(txn); + } + + getIDB(metaStore, KEY_ETAG, result => { + oldETag = result; + checkFetched(); + }); + + getIDB(metaStore, KEY_URL, result => { + oldUrl = result; + checkFetched(); + }); + }); + } finally { + } +} + +async function getEmojiByGroup (db, group) { + return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => { + const range = IDBKeyRange.bound([group, 0], [group + 1, 0], false, true); + getAllIDB(emojiStore.index(INDEX_GROUP_AND_ORDER), range, cb); + }) +} + +async function getEmojiBySearchQuery (db, query) { + const tokens = normalizeTokens(extractTokens(query)); + + if (!tokens.length) { + return [] + } + + return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => { + // get all results that contain all tokens (i.e. an AND query) + const intermediateResults = []; + + const checkDone = () => { + if (intermediateResults.length === tokens.length) { + onDone(); + } + }; + + const onDone = () => { + const results = findCommonMembers(intermediateResults, _ => _.unicode); + cb(results.sort((a, b) => a.order < b.order ? -1 : 1)); + }; + + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + const range = i === tokens.length - 1 + ? IDBKeyRange.bound(token, token + '\uffff', false, true) // treat last token as a prefix search + : IDBKeyRange.only(token); // treat all other tokens as an exact match + getAllIDB(emojiStore.index(INDEX_TOKENS), range, result => { + intermediateResults.push(result); + checkDone(); + }); + } + }) +} + +// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that +// when we can already query by tokens and this will give us what we're looking for 99.9% of the time +async function getEmojiByShortcode (db, shortcode) { + const emojis = await getEmojiBySearchQuery(db, shortcode); + + // In very rare cases (e.g. the shortcode "v" as in "v for victory"), we cannot search because + // there are no usable tokens (too short in this case). In that case, we have to do an inefficient + // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra + // index on shortcodes. + + if (!emojis.length) { + const predicate = _ => ((_.shortcodes || []).includes(shortcode.toLowerCase())); + return (await doFullDatabaseScanForSingleResult(db, predicate)) || null + } + + return emojis.filter(_ => { + const lowerShortcodes = (_.shortcodes || []).map(_ => _.toLowerCase()); + return lowerShortcodes.includes(shortcode.toLowerCase()) + })[0] || null +} + +async function getEmojiByUnicode (db, unicode) { + return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => ( + getIDB(emojiStore, unicode, result => { + if (result) { + return cb(result) + } + getIDB(emojiStore.index(INDEX_SKIN_UNICODE), unicode, result => cb(result || null)); + }) + )) +} + +function get (db, storeName, key) { + return dbPromise(db, storeName, MODE_READONLY, (store, txn, cb) => ( + getIDB(store, key, cb) + )) +} + +function set (db, storeName, key, value) { + return dbPromise(db, storeName, MODE_READWRITE, (store, txn) => { + store.put(value, key); + commit(txn); + }) +} + +function incrementFavoriteEmojiCount (db, unicode) { + return dbPromise(db, STORE_FAVORITES, MODE_READWRITE, (store, txn) => ( + getIDB(store, unicode, result => { + store.put((result || 0) + 1, unicode); + commit(txn); + }) + )) +} + +function getTopFavoriteEmoji (db, customEmojiIndex, limit) { + if (limit === 0) { + return [] + } + return dbPromise(db, [STORE_FAVORITES, STORE_EMOJI], MODE_READONLY, ([favoritesStore, emojiStore], txn, cb) => { + const results = []; + favoritesStore.index(INDEX_COUNT).openCursor(undefined, 'prev').onsuccess = e => { + const cursor = e.target.result; + if (!cursor) { // no more results + return cb(results) + } + + function addResult (result) { + results.push(result); + if (results.length === limit) { + return cb(results) // done, reached the limit + } + cursor.continue(); + } + + const unicodeOrName = cursor.primaryKey; + const custom = customEmojiIndex.byName(unicodeOrName); + if (custom) { + return addResult(custom) + } + // This could be done in parallel (i.e. make the cursor and the get()s parallelized), + // but my testing suggests it's not actually faster. + getIDB(emojiStore, unicodeOrName, emoji => { + if (emoji) { + return addResult(emoji) + } + // emoji not found somehow, ignore (may happen if custom emoji change) + cursor.continue(); + }); + }; + }) +} + +// trie data structure for prefix searches +// loosely based on https://github.com/nolanlawson/substring-trie + +const CODA_MARKER = ''; // marks the end of the string + +function trie (arr, itemToTokens) { + const map = new Map(); + for (const item of arr) { + const tokens = itemToTokens(item); + for (const token of tokens) { + let currentMap = map; + for (let i = 0; i < token.length; i++) { + const char = token.charAt(i); + let nextMap = currentMap.get(char); + if (!nextMap) { + nextMap = new Map(); + currentMap.set(char, nextMap); + } + currentMap = nextMap; + } + let valuesAtCoda = currentMap.get(CODA_MARKER); + if (!valuesAtCoda) { + valuesAtCoda = []; + currentMap.set(CODA_MARKER, valuesAtCoda); + } + valuesAtCoda.push(item); + } + } + + const search = (query, exact) => { + let currentMap = map; + for (let i = 0; i < query.length; i++) { + const char = query.charAt(i); + const nextMap = currentMap.get(char); + if (nextMap) { + currentMap = nextMap; + } else { + return [] + } + } + + if (exact) { + const results = currentMap.get(CODA_MARKER); + return results || [] + } + + const results = []; + // traverse + const queue = [currentMap]; + while (queue.length) { + const currentMap = queue.shift(); + const entriesSortedByKey = [...currentMap.entries()].sort((a, b) => a[0] < b[0] ? -1 : 1); + for (const [key, value] of entriesSortedByKey) { + if (key === CODA_MARKER) { // CODA_MARKER always comes first; it's the empty string + results.push(...value); + } else { + queue.push(value); + } + } + } + return results + }; + + return search +} + +const requiredKeys$1 = [ + 'name', + 'url' +]; + +function assertCustomEmojis (customEmojis) { + const isArray = customEmojis && Array.isArray(customEmojis); + const firstItemIsFaulty = isArray && + customEmojis.length && + (!customEmojis[0] || requiredKeys$1.some(key => !(key in customEmojis[0]))); + if (!isArray || firstItemIsFaulty) { + throw new Error('Custom emojis are in the wrong format') + } +} + +function customEmojiIndex (customEmojis) { + assertCustomEmojis(customEmojis); + + const sortByName = (a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1; + + // + // all() + // + const all = customEmojis.sort(sortByName); + + // + // search() + // + const emojiToTokens = emoji => ( + [...new Set((emoji.shortcodes || []).map(shortcode => extractTokens(shortcode)).flat())] + ); + const searchTrie = trie(customEmojis, emojiToTokens); + const searchByExactMatch = _ => searchTrie(_, true); + const searchByPrefix = _ => searchTrie(_, false); + + // Search by query for custom emoji. Similar to how we do this in IDB, the last token + // is treated as a prefix search, but every other one is treated as an exact match. + // Then we AND the results together + const search = query => { + const tokens = extractTokens(query); + const intermediateResults = tokens.map((token, i) => ( + (i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token) + )); + return findCommonMembers(intermediateResults, _ => _.name).sort(sortByName) + }; + + // + // byShortcode, byName + // + const shortcodeToEmoji = new Map(); + const nameToEmoji = new Map(); + for (const customEmoji of customEmojis) { + nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji); + for (const shortcode of (customEmoji.shortcodes || [])) { + shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji); + } + } + + const byShortcode = shortcode => shortcodeToEmoji.get(shortcode.toLowerCase()); + const byName = name => nameToEmoji.get(name.toLowerCase()); + + return { + all, + search, + byShortcode, + byName + } +} + +// remove some internal implementation details, i.e. the "tokens" array on the emoji object +// essentially, convert the emoji from the version stored in IDB to the version used in-memory +function cleanEmoji (emoji) { + if (!emoji) { + return emoji + } + delete emoji.tokens; + if (emoji.skinTones) { + const len = emoji.skinTones.length; + emoji.skins = Array(len); + for (let i = 0; i < len; i++) { + emoji.skins[i] = { + tone: emoji.skinTones[i], + unicode: emoji.skinUnicodes[i], + version: emoji.skinVersions[i] + }; + } + delete emoji.skinTones; + delete emoji.skinUnicodes; + delete emoji.skinVersions; + } + return emoji +} + +function warnETag (eTag) { + if (!eTag) { + console.warn('emoji-picker-element is more efficient if the dataSource server exposes an ETag header.'); + } +} + +const requiredKeys = [ + 'annotation', + 'emoji', + 'group', + 'order', + 'tags', + 'version' +]; + +function assertEmojiData (emojiData) { + if (!emojiData || + !Array.isArray(emojiData) || + !emojiData[0] || + (typeof emojiData[0] !== 'object') || + requiredKeys.some(key => (!(key in emojiData[0])))) { + throw new Error('Emoji data is in the wrong format') + } +} + +function assertStatus (response, dataSource) { + if (Math.floor(response.status / 100) !== 2) { + throw new Error('Failed to fetch: ' + dataSource + ': ' + response.status) + } +} + +async function getETag (dataSource) { + const response = await fetch(dataSource, { method: 'HEAD' }); + assertStatus(response, dataSource); + const eTag = response.headers.get('etag'); + warnETag(eTag); + return eTag +} + +async function getETagAndData (dataSource) { + const response = await fetch(dataSource); + assertStatus(response, dataSource); + const eTag = response.headers.get('etag'); + warnETag(eTag); + const emojiData = await response.json(); + assertEmojiData(emojiData); + return [eTag, emojiData] +} + +// TODO: including these in blob-util.ts causes typedoc to generate docs for them, +/** + * Convert an `ArrayBuffer` to a binary string. + * + * Example: + * + * ```js + * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff) + * ``` + * + * @param buffer - array buffer + * @returns binary string + */ +function arrayBufferToBinaryString(buffer) { + var binary = ''; + var bytes = new Uint8Array(buffer); + var length = bytes.byteLength; + var i = -1; + while (++i < length) { + binary += String.fromCharCode(bytes[i]); + } + return binary; +} +/** + * Convert a binary string to an `ArrayBuffer`. + * + * ```js + * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString) + * ``` + * + * @param binary - binary string + * @returns array buffer + */ +function binaryStringToArrayBuffer(binary) { + var length = binary.length; + var buf = new ArrayBuffer(length); + var arr = new Uint8Array(buf); + var i = -1; + while (++i < length) { + arr[i] = binary.charCodeAt(i); + } + return buf; +} + +// generate a checksum based on the stringified JSON +async function jsonChecksum (object) { + const inString = JSON.stringify(object); + const inBuffer = binaryStringToArrayBuffer(inString); + // this does not need to be cryptographically secure, SHA-1 is fine + const outBuffer = await crypto.subtle.digest('SHA-1', inBuffer); + const outBinString = arrayBufferToBinaryString(outBuffer); + const res = btoa(outBinString); + return res +} + +async function checkForUpdates (db, dataSource) { + // just do a simple HEAD request first to see if the eTags match + let emojiData; + let eTag = await getETag(dataSource); + if (!eTag) { // work around lack of ETag/Access-Control-Expose-Headers + const eTagAndData = await getETagAndData(dataSource); + eTag = eTagAndData[0]; + emojiData = eTagAndData[1]; + if (!eTag) { + eTag = await jsonChecksum(emojiData); + } + } + if (await hasData(db, dataSource, eTag)) ; else { + if (!emojiData) { + const eTagAndData = await getETagAndData(dataSource); + emojiData = eTagAndData[1]; + } + await loadData(db, emojiData, dataSource, eTag); + } +} + +async function loadDataForFirstTime (db, dataSource) { + let [eTag, emojiData] = await getETagAndData(dataSource); + if (!eTag) { + // Handle lack of support for ETag or Access-Control-Expose-Headers + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility + eTag = await jsonChecksum(emojiData); + } + + await loadData(db, emojiData, dataSource, eTag); +} + +class Database { + constructor ({ dataSource = DEFAULT_DATA_SOURCE, locale = DEFAULT_LOCALE, customEmoji = [] } = {}) { + this.dataSource = dataSource; + this.locale = locale; + this._dbName = `emoji-picker-element-${this.locale}`; + this._db = undefined; + this._lazyUpdate = undefined; + this._custom = customEmojiIndex(customEmoji); + + this._clear = this._clear.bind(this); + this._ready = this._init(); + } + + async _init () { + const db = this._db = await openDatabase(this._dbName); + + addOnCloseListener(this._dbName, this._clear); + const dataSource = this.dataSource; + const empty = await isEmpty(db); + + if (empty) { + await loadDataForFirstTime(db, dataSource); + } else { // offline-first - do an update asynchronously + this._lazyUpdate = checkForUpdates(db, dataSource); + } + } + + async ready () { + const checkReady = async () => { + if (!this._ready) { + this._ready = this._init(); + } + return this._ready + }; + await checkReady(); + // There's a possibility of a race condition where the element gets added, removed, and then added again + // with a particular timing, which would set the _db to undefined. + // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop. + if (!this._db) { + await checkReady(); + } + } + + async getEmojiByGroup (group) { + assertNumber(group); + await this.ready(); + return uniqEmoji(await getEmojiByGroup(this._db, group)).map(cleanEmoji) + } + + async getEmojiBySearchQuery (query) { + assertNonEmptyString(query); + await this.ready(); + const customs = this._custom.search(query); + const natives = uniqEmoji(await getEmojiBySearchQuery(this._db, query)).map(cleanEmoji); + return [ + ...customs, + ...natives + ] + } + + async getEmojiByShortcode (shortcode) { + assertNonEmptyString(shortcode); + await this.ready(); + const custom = this._custom.byShortcode(shortcode); + if (custom) { + return custom + } + return cleanEmoji(await getEmojiByShortcode(this._db, shortcode)) + } + + async getEmojiByUnicodeOrName (unicodeOrName) { + assertNonEmptyString(unicodeOrName); + await this.ready(); + const custom = this._custom.byName(unicodeOrName); + if (custom) { + return custom + } + return cleanEmoji(await getEmojiByUnicode(this._db, unicodeOrName)) + } + + async getPreferredSkinTone () { + await this.ready(); + return (await get(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE)) || 0 + } + + async setPreferredSkinTone (skinTone) { + assertNumber(skinTone); + await this.ready(); + return set(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE, skinTone) + } + + async incrementFavoriteEmojiCount (unicodeOrName) { + assertNonEmptyString(unicodeOrName); + await this.ready(); + return incrementFavoriteEmojiCount(this._db, unicodeOrName) + } + + async getTopFavoriteEmoji (limit) { + assertNumber(limit); + await this.ready(); + return (await getTopFavoriteEmoji(this._db, this._custom, limit)).map(cleanEmoji) + } + + set customEmoji (customEmojis) { + this._custom = customEmojiIndex(customEmojis); + } + + get customEmoji () { + return this._custom.all + } + + async _shutdown () { + await this.ready(); // reopen if we've already been closed/deleted + try { + await this._lazyUpdate; // allow any lazy updates to process before closing/deleting + } catch (err) { /* ignore network errors (offline-first) */ } + } + + // clear references to IDB, e.g. during a close event + _clear () { + // We don't need to call removeEventListener or remove the manual "close" listeners. + // The memory leak tests prove this is unnecessary. It's because: + // 1) IDBDatabases that can no longer fire "close" automatically have listeners GCed + // 2) we clear the manual close listeners in databaseLifecycle.js. + this._db = this._ready = this._lazyUpdate = undefined; + } + + async close () { + await this._shutdown(); + await closeDatabase(this._dbName); + } + + async delete () { + await this._shutdown(); + await deleteDatabase(this._dbName); + } +} + +export { Database as default }; diff --git a/app/static/scripts/emoji-picker-element/i18n/ar.js b/app/static/scripts/emoji-picker-element/i18n/ar.js new file mode 100644 index 0000000..672a0d9 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/ar.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'ุงู„ูุฆุงุช', + emojiUnsupportedMessage: 'ู…ุชุตูุญูƒ ู„ุง ูŠุฏุนู… ุฑู…ูˆุฒ ุงู„ู…ุดุงุนุฑ ุงู„ู…ู„ูˆู†ุฉ.', + favoritesLabel: 'ุงู„ู…ูุถู„ุฉ', + loadingMessage: 'ุฌุงุฑู ุงู„ุชุญู…ูŠู„โ€ฆ', + networkErrorMessage: 'ุชุนุฐุฑ ุชุญู…ูŠู„ ุฑู…ุฒ ู…ุดุงุนุฑ.', + regionLabel: 'ู…ู†ุชู‚ูŠ ุฑู…ูˆุฒ ุงู„ู…ุดุงุนุฑ', + searchDescription: 'ุนู†ุฏู…ุง ุชูƒูˆู† ู†ุชุงุฆุฌ ุงู„ุจุญุซ ู…ุชุงุญุฉุŒ ุงุถุบุท ุงู„ุณู‡ู… ู„ุฃุนู„ู‰ ุฃูˆ ู„ุฃุณูู„ ู„ู„ุชุญุฏูŠุฏ ูˆุงุถุบุท enter ู„ู„ุงุฎุชูŠุงุฑ.', + searchLabel: 'ุจุญุซ', + searchResultsLabel: 'ู†ุชุงุฆุฌ ุงู„ุจุญุซ', + skinToneDescription: 'ุนู†ุฏ ุชูˆุณูŠุน ุงู„ู†ุชุงุฆุฌุŒ ุงุถุบุท ุงู„ุณู‡ู… ู„ุฃุนู„ู‰ ุฃูˆ ู„ุฃุณูู„ ู„ู„ุชุญุฏูŠุฏ ูˆุงุถุบุท enter ู„ู„ุงุฎุชูŠุงุฑ.', + skinToneLabel: 'ุงุฎุชุฑ ุฏุฑุฌุฉ ู„ูˆู† ุงู„ุจุดุฑุฉ (ุญุงู„ูŠู‹ุง {skinTone})', + skinTonesLabel: 'ุฏุฑุฌุงุช ู„ูˆู† ุงู„ุจุดุฑุฉ', + skinTones: [ + 'ุงูุชุฑุงุถูŠ', + 'ูุงุชุญ', + 'ูุงุชุญ ู…ุชูˆุณุท', + 'ู…ุชูˆุณุท', + 'ุฏุงูƒู† ู…ุชูˆุณุท', + 'ุฏุงูƒู†' + ], + categories: { + custom: 'ู…ุฎุตุต', + 'smileys-emotion': 'ุงู„ูˆุฌูˆู‡ ุงู„ุถุงุญูƒุฉ ูˆุฑู…ูˆุฒ ุงู„ู…ุดุงุนุฑ', + 'people-body': 'ุงู„ุฃุดุฎุงุต ูˆุงู„ุฌุณุฏ', + 'animals-nature': 'ุงู„ุญูŠูˆุงู†ุงุช ูˆุงู„ุทุจูŠุนุฉ', + 'food-drink': 'ุงู„ุทุนุงู… ูˆุงู„ุดุฑุงุจ', + 'travel-places': 'ุงู„ุณูุฑ ูˆุงู„ุฃู…ุงูƒู†', + activities: 'ุงู„ุฃู†ุดุทุฉ', + objects: 'ุงู„ุฃุดูŠุงุก', + symbols: 'ุงู„ุฑู…ูˆุฒ', + flags: 'ุงู„ุฃุนู„ุงู…' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/de.js b/app/static/scripts/emoji-picker-element/i18n/de.js new file mode 100644 index 0000000..bd21ed3 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/de.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategorien', + emojiUnsupportedMessage: 'Dein Browser unterstรผtzt keine farbigen Emojis.', + favoritesLabel: 'Favoriten', + loadingMessage: 'Wird geladenโ€ฆ', + networkErrorMessage: 'Konnte Emoji nicht laden.', + regionLabel: 'Emoji auswรคhlen', + searchDescription: 'Wenn Suchergebnisse verfรผgbar sind, wรคhle sie mit Pfeil rauf und runter, dann Eingabetaste, aus.', + searchLabel: 'Suchen', + searchResultsLabel: 'Suchergebnisse', + skinToneDescription: 'Wenn angezeigt, nutze Pfeiltasten rauf und runter zum Auswรคhlen, Eingabe zum Akzeptieren.', + skinToneLabel: 'Wรคhle einen Hautton (aktuell {skinTone})', + skinTonesLabel: 'Hauttรถne', + skinTones: [ + 'Standard', + 'Hell', + 'Mittel-hell', + 'Mittel', + 'Mittel-dunkel', + 'Dunkel' + ], + categories: { + custom: 'Benutzerdefiniert', + 'smileys-emotion': 'Smileys und Emoticons', + 'people-body': 'Menschen und Kรถrper', + 'animals-nature': 'Tiere und Natur', + 'food-drink': 'Essen und Trinken', + 'travel-places': 'Reisen und Orte', + activities: 'Aktivitรคten', + objects: 'Objekte', + symbols: 'Symbole', + flags: 'Flaggen' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/en.js b/app/static/scripts/emoji-picker-element/i18n/en.js new file mode 100644 index 0000000..57e15ff --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/en.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categories', + emojiUnsupportedMessage: 'Your browser does not support color emoji.', + favoritesLabel: 'Favorites', + loadingMessage: 'Loadingโ€ฆ', + networkErrorMessage: 'Could not load emoji.', + regionLabel: 'Emoji picker', + searchDescription: 'When search results are available, press up or down to select and enter to choose.', + searchLabel: 'Search', + searchResultsLabel: 'Search results', + skinToneDescription: 'When expanded, press up or down to select and enter to choose.', + skinToneLabel: 'Choose a skin tone (currently {skinTone})', + skinTonesLabel: 'Skin tones', + skinTones: [ + 'Default', + 'Light', + 'Medium-Light', + 'Medium', + 'Medium-Dark', + 'Dark' + ], + categories: { + custom: 'Custom', + 'smileys-emotion': 'Smileys and emoticons', + 'people-body': 'People and body', + 'animals-nature': 'Animals and nature', + 'food-drink': 'Food and drink', + 'travel-places': 'Travel and places', + activities: 'Activities', + objects: 'Objects', + symbols: 'Symbols', + flags: 'Flags' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/es.js b/app/static/scripts/emoji-picker-element/i18n/es.js new file mode 100644 index 0000000..9b8ec49 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/es.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorรญas', + emojiUnsupportedMessage: 'El navegador no admite emojis de color.', + favoritesLabel: 'Favoritos', + loadingMessage: 'Cargandoโ€ฆ', + networkErrorMessage: 'No se pudo cargar el emoji.', + regionLabel: 'Selector de emojis', + searchDescription: 'Cuando estรฉn disponibles los resultados, pulsa la tecla hacia arriba o hacia abajo para seleccionar y la tecla intro para elegir.', + searchLabel: 'Buscar', + searchResultsLabel: 'Resultados de bรบsqueda', + skinToneDescription: 'Cuando se abran las opciones, pulsa la tecla hacia arriba o hacia abajo para seleccionar y la tecla intro para elegir.', + skinToneLabel: 'Elige un tono de piel ({skinTone} es el actual)', + skinTonesLabel: 'Tonos de piel', + skinTones: [ + 'Predeterminado', + 'Claro', + 'Claro medio', + 'Medio', + 'Oscuro medio', + 'Oscuro' + ], + categories: { + custom: 'Personalizado', + 'smileys-emotion': 'Emojis y emoticones', + 'people-body': 'Personas y partes del cuerpo', + 'animals-nature': 'Animales y naturaleza', + 'food-drink': 'Comida y bebida', + 'travel-places': 'Viajes y lugares', + activities: 'Actividades', + objects: 'Objetos', + symbols: 'Sรญmbolos', + flags: 'Banderas' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/fr.js b/app/static/scripts/emoji-picker-element/i18n/fr.js new file mode 100644 index 0000000..d61e2cf --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/fr.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Catรฉgories', + emojiUnsupportedMessage: 'Votre navigateur ne soutient pas les emojis en couleur.', + favoritesLabel: 'Favoris', + loadingMessage: 'Chargement en coursโ€ฆ', + networkErrorMessage: 'Impossible de charger les emojis.', + regionLabel: 'Choisir un emoji', + searchDescription: 'Quand les rรฉsultats sont disponisbles, appuyez la fleche vers le haut ou le bas et la touche entrรฉe pour choisir.', + searchLabel: 'Rechercher', + searchResultsLabel: 'Rรฉsultats', + skinToneDescription: 'Quand disponible, appuyez la fleche vers le haut ou le bas et la touch entrรฉe pour choisir.', + skinToneLabel: 'Choisir une couleur de peau (actuellement {skinTone})', + skinTonesLabel: 'Couleurs de peau', + skinTones: [ + 'Dรฉfaut', + 'Clair', + 'Moyennement clair', + 'Moyen', + 'Moyennement sombre', + 'Sombre' + ], + categories: { + custom: 'Customisรฉ', + 'smileys-emotion': 'Les smileyes et les รฉmoticรดnes', + 'people-body': 'Les gens et le corps', + 'animals-nature': 'Les animaux et la nature', + 'food-drink': 'La nourriture et les boissons', + 'travel-places': 'Les voyages et les endroits', + activities: 'Les activitรฉs', + objects: 'Les objets', + symbols: 'Les symbols', + flags: 'Les drapeaux' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/hi.js b/app/static/scripts/emoji-picker-element/i18n/hi.js new file mode 100644 index 0000000..1141cd1 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/hi.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'เคถเฅเคฐเฅ‡เคฃเคฟเคฏเคพเค', + emojiUnsupportedMessage: 'เค†เคชเค•เคพ เคฌเฅเคฐเคพเค‰เคœเคผเคฐ เค•เคฒเคฐ เค‡เคฎเฅ‹เคœเฅ€ เค•เคพ เคธเคฎเคฐเฅเคฅเคจ เคจเคนเฅ€เค‚ เค•เคฐเคคเคพเฅค', + favoritesLabel: 'เคชเคธเค‚เคฆเฅ€เคฆเคพ', + loadingMessage: 'เคฒเฅ‹เคก เคนเฅ‹ เคฐเคนเคพ เคนเฅˆ...', + networkErrorMessage: 'เค‡เคฎเฅ‹เคœเฅ€ เคฒเฅ‹เคก เคจเคนเฅ€เค‚ เคนเฅ‹ เคธเค•เฅ‡เฅค', + regionLabel: 'เค‡เคฎเฅ‹เคœเฅ€ เคšเฅเคจเคจเฅ‡เคตเคพเคฒเคพ', + searchDescription: 'เคœเคฌ เค–เฅ‹เคœ เคชเคฐเคฟเคฃเคพเคฎ เค‰เคชเคฒเคฌเฅเคง เคนเฅ‹เค‚ เคคเฅ‹ เคšเคฏเคจ เค•เคฐเคจเฅ‡ เค•เฅ‡ เคฒเคฟเค เคŠเคชเคฐ เคฏเคพ เคจเฅ€เคšเฅ‡ เคฆเคฌเคพเคเค‚ เค”เคฐ เคšเฅเคจเคจเฅ‡ เค•เฅ‡ เคฒเคฟเค เคเค‚เคŸเคฐ เคฆเคฌเคพเคเค‚เฅค', + searchLabel: 'เค–เฅ‹เคœ', + searchResultsLabel: 'เค–เฅ‹เคœ เค•เฅ‡ เคชเคฐเคฟเคฃเคพเคฎ', + skinToneDescription: 'เคœเคฌ เคตเคฟเคธเฅเคคเฅƒเคค เค•เคฟเคฏเคพ เคœเคพเคคเคพ เคนเฅˆ เคคเฅ‹ เคšเคฏเคจ เค•เคฐเคจเฅ‡ เค•เฅ‡ เคฒเคฟเค เคŠเคชเคฐ เคฏเคพ เคจเฅ€เคšเฅ‡ เคฆเคฌเคพเคเค‚ เค”เคฐ เคšเฅเคจเคจเฅ‡ เค•เฅ‡ เคฒเคฟเค เคเค‚เคŸเคฐ เคฆเคฌเคพเคเค‚เฅค', + skinToneLabel: 'เคคเฅเคตเคšเคพ เค•เคพ เคฐเค‚เค— เคšเฅเคจเฅ‡เค‚ (เคตเคฐเฅเคคเคฎเคพเคจ เคฎเฅ‡เค‚ {skinTone})', + skinTonesLabel: 'เคคเฅเคตเคšเคพ เค•เฅ‡ เคฐเค‚เค—', + skinTones: [ + 'เคกเคฟเคซเฅ‰เคฒเฅเคŸ', + 'เคนเคฒเฅเค•เคพ', + 'เคฎเคงเฅเคฏเคฎ เคนเคฒเฅเค•เคพ', + 'เคฎเคงเฅเคฏเคฎ', + 'เคฎเคงเฅเคฏเคฎ เค—เคนเคฐเคพ', + 'เค—เคนเคฐเคพ' + ], + categories: { + custom: 'เค•เคธเฅเคŸเคฎ', + 'smileys-emotion': 'เคธเฅเคฎเคพเค‡เคฒเฅ€ เค”เคฐ เค‡เคฎเฅ‹เคŸเคฟเค•เฅ‰เคจเฅเคธ', + 'people-body': 'เคฒเฅ‹เค— เค”เคฐ เคถเคฐเฅ€เคฐ', + 'animals-nature': 'เคชเคถเฅ เค”เคฐ เคชเฅเคฐเค•เฅƒเคคเคฟ', + 'food-drink': 'เค–เคพเคฆเฅเคฏ เค”เคฐ เคชเฅ‡เคฏ', + 'travel-places': 'เคฏเคพเคคเฅเคฐเคพ เค”เคฐ เคธเฅเคฅเคพเคจ', + activities: 'เค—เคคเคฟเคตเคฟเคงเคฟเคฏเคพเค‚', + objects: 'เคตเคธเฅเคคเฅเคเค‚', + symbols: 'เคชเฅเคฐเคคเฅ€เค•', + flags: 'เคเค‚เคกเฅ‡' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/id.js b/app/static/scripts/emoji-picker-element/i18n/id.js new file mode 100644 index 0000000..994a26d --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/id.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategori', + emojiUnsupportedMessage: 'Browser Anda tidak mendukung emoji warna.', + favoritesLabel: 'Favorit', + loadingMessage: 'Memuat...', + networkErrorMessage: 'Tidak dapat memuat emoji.', + regionLabel: 'Pemilih emoji', + searchDescription: 'Ketika hasil pencarian tersedia, tekan atas atau bawah untuk menyeleksi dan enter untuk memilih.', + searchLabel: 'Cari', + searchResultsLabel: 'Hasil Pencarian', + skinToneDescription: 'Saat diperluas tekan atas atau bawah untuk menyeleksi dan enter untuk memilih.', + skinToneLabel: 'Pilih warna skin (saat ini {skinTone})', + skinTonesLabel: 'Warna skin', + skinTones: [ + 'Default', + 'Light', + 'Medium light', + 'Medium', + 'Medium dark', + 'Dark' + ], + categories: { + custom: 'Kustom', + 'smileys-emotion': 'Smiley dan emoticon', + 'people-body': 'Orang dan bagian tubuh', + 'animals-nature': 'Hewan dan tumbuhan', + 'food-drink': 'Makanan dan minuman', + 'travel-places': 'Rekreasi dan tempat', + activities: 'Aktivitas', + objects: 'Objek', + symbols: 'Simbol', + flags: 'Bendera' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/it.js b/app/static/scripts/emoji-picker-element/i18n/it.js new file mode 100644 index 0000000..df55324 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/it.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorie', + emojiUnsupportedMessage: 'Il tuo browser non supporta le emoji colorate.', + favoritesLabel: 'Preferiti', + loadingMessage: 'Caricamento...', + networkErrorMessage: 'Impossibile caricare le emoji.', + regionLabel: 'Selezione emoji', + searchDescription: 'Quando i risultati della ricerca sono disponibili, premi su o giรน per selezionare e invio per scegliere.', + searchLabel: 'Cerca', + searchResultsLabel: 'Risultati di ricerca', + skinToneDescription: 'Quando espanso, premi su o giรน per selezionare e invio per scegliere.', + skinToneLabel: 'Scegli una tonalitร  della pelle (corrente {skinTone})', + skinTonesLabel: 'Tonalitร  della pelle', + skinTones: [ + 'Predefinita', + 'Chiara', + 'Medio-Chiara', + 'Media', + 'Medio-Scura', + 'Scura' + ], + categories: { + custom: 'Personalizzata', + 'smileys-emotion': 'Faccine ed emozioni', + 'people-body': 'Persone e corpi', + 'animals-nature': 'Animali e natura', + 'food-drink': 'Cibi e bevande', + 'travel-places': 'Viaggi e luoghi', + activities: 'Attivitร ', + objects: 'Oggetti', + symbols: 'Simboli', + flags: 'Bandiere' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/ms_MY.js b/app/static/scripts/emoji-picker-element/i18n/ms_MY.js new file mode 100644 index 0000000..21ae388 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/ms_MY.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategori', + emojiUnsupportedMessage: 'Penyemak imbas anda tidak menyokong emoji warna.', + favoritesLabel: 'Kegemaran', + loadingMessage: 'Memuatโ€ฆ', + networkErrorMessage: 'Tidak dapat memuatkan emoji.', + regionLabel: 'Pemilih emoji', + searchDescription: 'Apabila hasil carian tersedia, tekan atas atau bawah untuk memilih dan tekan masukkan untuk memilih.', + searchLabel: 'Cari', + searchResultsLabel: 'Hasil carian', + skinToneDescription: 'Apabila dikembangkan, tekan atas atau bawah untuk memilih dan tekan masukkan untuk memilih.', + skinToneLabel: 'Pilih warna kulit (pada masa ini {skinTone})', + skinTonesLabel: 'Warna kulit', + skinTones: [ + 'Lalai', + 'Cerah', + 'Kuning langsat', + 'Sederhana cerah', + 'Sawo matang', + 'Gelap' + ], + categories: { + custom: 'Tersuai', + 'smileys-emotion': 'Smiley dan emotikon', + 'people-body': 'Orang dan badan', + 'animals-nature': 'Haiwan dan alam semula jadi', + 'food-drink': 'Makanan dan minuman', + 'travel-places': 'Perjalanan dan tempat', + activities: 'Aktiviti', + objects: 'Objek', + symbols: 'Simbol', + flags: 'Bendera' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/nl.js b/app/static/scripts/emoji-picker-element/i18n/nl.js new file mode 100644 index 0000000..a2dabc5 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/nl.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorieรซn', + emojiUnsupportedMessage: 'Uw browser ondersteunt geen kleurenemoji.', + favoritesLabel: 'Favorieten', + loadingMessage: 'Bezig met ladenโ€ฆ', + networkErrorMessage: 'Kan emoji niet laden.', + regionLabel: 'Emoji-kiezer', + searchDescription: 'Als er zoekresultaten beschikbaar zijn, drukt u op omhoog of omlaag om te selecteren en op enter om te kiezen.', + searchLabel: 'Zoeken', + searchResultsLabel: 'Zoekresultaten', + skinToneDescription: 'Wanneer uitgevouwen, druk omhoog of omlaag om te selecteren en enter om te kiezen.', + skinToneLabel: 'Kies een huidskleur (momenteel {skinTone})', + skinTonesLabel: 'Huidskleuren', + skinTones: [ + 'Standaard', + 'Licht', + 'Medium-Licht', + 'Medium', + 'Middeldonker', + 'Donker' + ], + categories: { + custom: 'Aangepast', + 'smileys-emotion': 'Smileys en emoticons', + 'people-body': 'Mensen en lichaam', + 'animals-nature': 'Dieren en natuur', + 'food-drink': 'Eten en drinken', + 'travel-places': 'Reizen en plaatsen', + activities: 'Activiteiten', + objects: 'Voorwerpen', + symbols: 'Symbolen', + flags: 'Vlaggen' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/pl.js b/app/static/scripts/emoji-picker-element/i18n/pl.js new file mode 100644 index 0000000..454cb7d --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/pl.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategorie', + emojiUnsupportedMessage: 'Twoja przeglฤ…darka nie wspiera kolorowych emotikon.', + favoritesLabel: 'Ulubione', + loadingMessage: 'ลadujฤ™โ€ฆ', + networkErrorMessage: 'Nie moลผna zaล‚adowaฤ‡ emoji.', + regionLabel: 'Selektor emoji', + searchDescription: 'Kiedy wyniki wyszukiwania bฤ™dฤ… dostฤ™pne, wciล›nij gรณra lub dรณล‚ aby wybraฤ‡ oraz enter aby zatwierdziฤ‡ wybรณr.', + searchLabel: 'Wyszukaj', + searchResultsLabel: 'Wyniki wyszukiwania', + skinToneDescription: 'Po rozwiniฤ™ciu wciล›nij gรณra lub dรณล‚ aby wybraฤ‡ oraz enter aby zatwierdziฤ‡ wybรณr.', + skinToneLabel: 'Wybierz odcieล„ skรณry (aktualnie {skinTone})', + skinTonesLabel: 'Odcienie skรณry', + skinTones: [ + 'Domyล›lna', + 'Jasna', + 'ลšrednio-jasna', + 'ลšrednia', + 'ลšrednio-ciemna', + 'Ciemna' + ], + categories: { + custom: 'Wล‚asne', + 'smileys-emotion': 'Uล›miechy', + 'people-body': 'Ludzie', + 'animals-nature': 'Zwierzฤ™ta i natura', + 'food-drink': 'ลปywnoล›ฤ‡ i napoje', + 'travel-places': 'Podrรณลผe i miejsca', + activities: 'Aktywnoล›ci', + objects: 'Obiekty', + symbols: 'Symbole', + flags: 'Flagi' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/pt_BR.js b/app/static/scripts/emoji-picker-element/i18n/pt_BR.js new file mode 100644 index 0000000..25b5dc9 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/pt_BR.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorias', + emojiUnsupportedMessage: 'Seu navegador nรฃo suporta emojis coloridos.', + favoritesLabel: 'Favoritos', + loadingMessage: 'Carregandoโ€ฆ', + networkErrorMessage: 'Nรฃo foi possรญvel carregar o emoji.', + regionLabel: 'Seletor de emoji', + searchDescription: 'Quando os resultados da pesquisa estiverem disponรญveis, pressione para cima ou para baixo para selecionar e โ€œenterโ€ para escolher.', + searchLabel: 'Procurar', + searchResultsLabel: 'Resultados da pesquisa', + skinToneDescription: 'Quando expandido, pressione para cima ou para baixo para selecionar e โ€œenterโ€ para escolher.', + skinToneLabel: 'Escolha um tom de pele (atualmente {skinTone})', + skinTonesLabel: 'Tons de pele', + skinTones: [ + 'Padrรฃo', + 'Claro', + 'Claro mรฉdio', + 'Mรฉdio', + 'Escuro mรฉdio', + 'Escuro' + ], + categories: { + custom: 'Personalizar', + 'smileys-emotion': 'Carinhas e emoticons', + 'people-body': 'Pessoas e corpo', + 'animals-nature': 'Animais e natureza', + 'food-drink': 'Alimentos e bebidas', + 'travel-places': 'Viagem e lugares', + activities: 'Atividades', + objects: 'Objetos', + symbols: 'Sรญmbolos', + flags: 'Bandeiras' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/pt_PT.js b/app/static/scripts/emoji-picker-element/i18n/pt_PT.js new file mode 100644 index 0000000..93d88db --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/pt_PT.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorias', + emojiUnsupportedMessage: 'O seu browser nรฃo suporta emojis.', + favoritesLabel: 'Favoritos', + loadingMessage: 'A Carregarโ€ฆ', + networkErrorMessage: 'Nรฃo foi possรญvel carregar o emoji.', + regionLabel: 'Emoji picker', + searchDescription: 'Quando os resultados da pesquisa estiverem disponรญveis, pressione para cima ou para baixo para selecionar e digite para escolher.', + searchLabel: 'Procurar', + searchResultsLabel: 'Resultados da procura', + skinToneDescription: 'Quando expandido, pressione para cima ou para baixo para selecionar e digite para escolher.', + skinToneLabel: 'Escolha um tom de pele (atual {skinTone})', + skinTonesLabel: 'Tons de pele', + skinTones: [ + 'Prรฉ-definido', + 'Claro', + 'Mรฉdio-Claro', + 'Mรฉdio', + 'Mรฉdio-Escuro', + 'Escuro' + ], + categories: { + custom: 'Personalizados', + 'smileys-emotion': 'Smileys e emoticons', + 'people-body': 'Pessoas e corpo', + 'animals-nature': 'Animais e natureza', + 'food-drink': 'Comida e bebida', + 'travel-places': 'Viagens e locais', + activities: 'Atividades', + objects: 'Objetos', + symbols: 'Sรญmbolos', + flags: 'Bandeiras' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/ru_RU.js b/app/static/scripts/emoji-picker-element/i18n/ru_RU.js new file mode 100644 index 0000000..ea90966 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/ru_RU.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'ะšะฐั‚ะตะณะพั€ะธะธ', + emojiUnsupportedMessage: 'ะ’ะฐัˆ ะฑั€ะฐัƒะทะตั€ ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ั†ะฒะตั‚ะฝั‹ะต ัะผะพะดะทะธ.', + favoritesLabel: 'ะ˜ะทะฑั€ะฐะฝะฝะพะต', + loadingMessage: 'ะ—ะฐะณั€ัƒะทะบะฐโ€ฆ', + networkErrorMessage: 'ะะต ัƒะดะฐะปะพััŒ ะทะฐะณั€ัƒะทะธั‚ัŒ ัะผะพะดะทะธ. ะŸะพะฟั€ะพะฑัƒะนั‚ะต ะฟะตั€ะตะทะฐะณั€ัƒะทะธั‚ัŒ ัั‚ั€ะฐะฝะธั†ัƒ.', + regionLabel: 'ะ’ั‹ะฑะตั€ะธั‚ะต ัะผะพะดะทะธ', + searchDescription: 'ะšะพะณะดะฐ ั€ะตะทัƒะปัŒั‚ะฐั‚ั‹ ะฟะพะธัะบะฐ ัั‚ะฐะฝัƒั‚ ะดะพัั‚ัƒะฟะฝั‹, ะฒั‹ะฑะตั€ะธั‚ะต ะธั… ั ะฟะพะผะพั‰ัŒัŽ ัั‚ั€ะตะปะพะบ ะฒะฒะตั€ั… ะธ ะฒะฝะธะท, ะทะฐั‚ะตะผ ะฝะฐะถะผะธั‚ะต ะดะปั ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั.', + searchLabel: 'ะ˜ัะบะฐั‚ัŒ', + searchResultsLabel: 'ะ ะตะทัƒะปัŒั‚ะฐั‚ั‹ ะฟะพะธัะบะฐ', + skinToneDescription: 'ะŸั€ะธ ะพั‚ะพะฑั€ะฐะถะตะฝะธะธ ะธัะฟะพะปัŒะทัƒะนั‚ะต ะบะปะฐะฒะธัˆะธ ัะพ ัั‚ั€ะตะปะบะฐะผะธ ะฒะฒะตั€ั… ะธ ะฒะฝะธะท ะดะปั ะฒั‹ะฑะพั€ะฐ, ะฝะฐะถะผะธั‚ะต ะดะปั ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั.', + skinToneLabel: 'ะ’ั‹ะฑะตั€ะธั‚ะต ะพั‚ั‚ะตะฝะพะบ ะบะพะถะธ (ั‚ะตะบัƒั‰ะธะน {skinTone})', + skinTonesLabel: 'ะžั‚ั‚ะตะฝะบะธ ะบะพะถะธ', + skinTones: [ + 'ะกั‚ะฐะฝะดะฐั€ั‚ะฝั‹ะน', + 'ะกะฒะตั‚ะปั‹ะน', + 'ะกั€ะตะดะฝะต-ัะฒะตั‚ะปั‹ะน', + 'ะกั€ะตะดะฝะธะน', + 'ะกั€ะตะดะฝะต-ั‚ะตะผะฝั‹ะน', + 'ะขะตะผะฝั‹ะน' + ], + categories: { + custom: 'ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะน', + 'smileys-emotion': 'ะกะผะฐะนะปะธะบะธ ะธ ะญะผะพั‚ะธะบะพะฝั‹', + 'people-body': 'ะ›ัŽะดะธ ะธ ะขะตะปะฐ', + 'animals-nature': 'ะ–ะธะฒะพั‚ะฝั‹ะต ะธ ะŸั€ะธั€ะพะดะฐ', + 'food-drink': 'ะ•ะดะฐ ะธ ะะฐะฟะธั‚ะบะธ', + 'travel-places': 'ะŸัƒั‚ะตัˆะตัั‚ะฒะธั ะธ ะœะตัั‚ะฐ', + activities: 'ะ’ะธะดั‹ ะดะตัั‚ะตะปัŒะฝะพัั‚ะธ', + objects: 'ะžะฑัŠะตะบั‚ั‹', + symbols: 'ะกะธะผะฒะพะปั‹', + flags: 'ะคะปะฐะณะธ' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/tr.js b/app/static/scripts/emoji-picker-element/i18n/tr.js new file mode 100644 index 0000000..c41491b --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/tr.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategoriler', + emojiUnsupportedMessage: 'Tarayฤฑcฤฑnฤฑz renkli emojiyi desteklemiyor.', + favoritesLabel: 'Favoriler', + loadingMessage: 'Yรผkleniyorโ€ฆ', + networkErrorMessage: 'Emoji yรผklenemedi.', + regionLabel: 'Emoji seรงici', + searchDescription: 'Arama sonuรงlarฤฑ mevcut olduฤŸunda seรงmek iรงin yukarฤฑ veya aลŸaฤŸฤฑ basฤฑn ve seรงmek iรงin girin.', + searchLabel: 'Arama', + searchResultsLabel: 'Arama sonuรงlarฤฑ', + skinToneDescription: 'GeniลŸletildiฤŸinde seรงmek iรงin yukarฤฑ veya aลŸaฤŸฤฑ basฤฑn ve seรงmek iรงin girin.', + skinToneLabel: 'Cilt tonu seรงin (ลŸu anda {skinTone})', + skinTonesLabel: 'Cilt tonlarฤฑ', + skinTones: [ + 'Varsayฤฑlan', + 'IลŸฤฑk', + 'Orta ฤฑลŸฤฑk', + 'Orta', + 'Orta koyu', + 'Karanlฤฑk' + ], + categories: { + custom: 'Gelenek', + 'smileys-emotion': 'Suratlar ve ifadeler', + 'people-body': 'ฤฐnsanlar ve vรผcut', + 'animals-nature': 'Hayvanlar ve doฤŸa', + 'food-drink': 'Yiyecek ve iรงecek', + 'travel-places': 'Seyahat ve yerler', + activities: 'Aktiviteler', + objects: 'Nesneler', + symbols: 'Semboller', + flags: 'Bayraklar' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/zh_CN.js b/app/static/scripts/emoji-picker-element/i18n/zh_CN.js new file mode 100644 index 0000000..6dd452a --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/zh_CN.js @@ -0,0 +1,27 @@ +export default { + categoriesLabel: '็ฑปๅˆซ', + emojiUnsupportedMessage: 'ๆ‚จ็š„ๆต่งˆๅ™จไธๆ”ฏๆŒๅฝฉ่‰ฒ่กจๆƒ…็ฌฆๅทใ€‚', + favoritesLabel: 'ๆ”ถ่—ๅคน', + loadingMessage: 'ๆญฃๅœจๅŠ ่ฝฝโ€ฆ', + networkErrorMessage: 'ๆ— ๆณ•ๅŠ ่ฝฝ่กจๆƒ…็ฌฆๅทใ€‚', + regionLabel: '่กจๆƒ…็ฌฆๅท้€‰ๆ‹ฉๅ™จ', + searchDescription: 'ๅฝ“ๆœ็ดข็ป“ๆžœๅฏ็”จๆ—ถ๏ผŒๆŒ‰ๅ‘ไธŠๆˆ–ๅ‘ไธ‹้€‰ๆ‹ฉๅนถ่พ“ๅ…ฅ้€‰ๆ‹ฉใ€‚', + searchLabel: 'ๆœ็ดข', + searchResultsLabel: 'ๆœ็ดข็ป“ๆžœ', + skinToneDescription: 'ๅฑ•ๅผ€ๆ—ถ๏ผŒๆŒ‰ๅ‘ไธŠๆˆ–ๅ‘ไธ‹้”ฎ่ฟ›่กŒ้€‰ๆ‹ฉ๏ผŒๆŒ‰ๅ›ž่ฝฆ้”ฎ่ฟ›่กŒ้€‰ๆ‹ฉใ€‚', + skinToneLabel: '้€‰ๆ‹ฉ่‚ค่‰ฒ๏ผˆๅฝ“ๅ‰ไธบ {skinTone}๏ผ‰', + skinTonesLabel: '่‚ค่‰ฒ', + skinTones: ['้ป˜่ฎค', 'ๆ˜Žไบฎ', 'ๅพฎไบฎ', 'ไธญ็ญ‰', 'ๅพฎๆš—', 'ๆš—'], + categories: { + custom: '่‡ชๅฎšไน‰', + 'smileys-emotion': '็ฌ‘่„ธๅ’Œ่กจๆƒ…', + 'people-body': 'ไบบ็‰ฉๅ’Œ่บซไฝ“', + 'animals-nature': 'ๅŠจ็‰ฉไธŽ่‡ช็„ถ', + 'food-drink': '้ฃŸๅ“้ฅฎๆ–™', + 'travel-places': 'ๆ—…่กŒๅ’Œๅœฐๆ–น', + activities: 'ๆดปๅŠจ', + objects: '็‰ฉไฝ“', + symbols: '็ฌฆๅท', + flags: 'ๆ——ๅธœ' + } +} diff --git a/app/static/scripts/emoji-picker-element/index.js b/app/static/scripts/emoji-picker-element/index.js new file mode 100644 index 0000000..aa23cc4 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/index.js @@ -0,0 +1,3 @@ +import Picker from './picker.js' +import Database from './database.js' +export { Picker, Database } diff --git a/app/static/scripts/emoji-picker-element/picker.js b/app/static/scripts/emoji-picker-element/picker.js new file mode 100644 index 0000000..c4ed88b --- /dev/null +++ b/app/static/scripts/emoji-picker-element/picker.js @@ -0,0 +1,2704 @@ +import Database from './database.js'; + +function noop() { } +function run(fn) { + return fn(); +} +function blank_object() { + return Object.create(null); +} +function run_all(fns) { + fns.forEach(run); +} +function is_function(thing) { + return typeof thing === 'function'; +} +function safe_not_equal(a, b) { + return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); +} +let src_url_equal_anchor; +function src_url_equal(element_src, url) { + if (!src_url_equal_anchor) { + src_url_equal_anchor = document.createElement('a'); + } + src_url_equal_anchor.href = url; + return element_src === src_url_equal_anchor.href; +} +function is_empty(obj) { + return Object.keys(obj).length === 0; +} +function action_destroyer(action_result) { + return action_result && is_function(action_result.destroy) ? action_result.destroy : noop; +} +function append(target, node) { + target.appendChild(node); +} +function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); +} +function detach(node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } +} +function element(name) { + return document.createElement(name); +} +function text(data) { + return document.createTextNode(data); +} +function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); +} +function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); +} +function set_data(text, data) { + data = '' + data; + if (text.wholeText !== data) + text.data = data; +} +function set_input_value(input, value) { + input.value = value == null ? '' : value; +} +function set_style(node, key, value, important) { + if (value === null) { + node.style.removeProperty(key); + } + else { + node.style.setProperty(key, value, important ? 'important' : ''); + } +} + +let current_component; +function set_current_component(component) { + current_component = component; +} +function get_current_component() { + if (!current_component) + throw new Error('Function called outside component initialization'); + return current_component; +} +/** + * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM. + * It must be called during the component's initialisation (but doesn't need to live *inside* the component; + * it can be called from an external module). + * + * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api). + * + * https://svelte.dev/docs#run-time-svelte-onmount + */ +function onMount(fn) { + get_current_component().$$.on_mount.push(fn); +} + +const dirty_components = []; +const binding_callbacks = []; +const render_callbacks = []; +const flush_callbacks = []; +const resolved_promise = Promise.resolve(); +let update_scheduled = false; +function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } +} +function tick() { + schedule_update(); + return resolved_promise; +} +function add_render_callback(fn) { + render_callbacks.push(fn); +} +// flush() calls callbacks in this order: +// 1. All beforeUpdate callbacks, in order: parents before children +// 2. All bind:this callbacks, in reverse order: children before parents. +// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT +// for afterUpdates called during the initial onMount, which are called in +// reverse order: children before parents. +// Since callbacks might update component values, which could trigger another +// call to flush(), the following steps guard against this: +// 1. During beforeUpdate, any updated components will be added to the +// dirty_components array and will cause a reentrant call to flush(). Because +// the flush index is kept outside the function, the reentrant call will pick +// up where the earlier call left off and go through all dirty components. The +// current_component value is saved and restored so that the reentrant call will +// not interfere with the "parent" flush() call. +// 2. bind:this callbacks cannot trigger new flush() calls. +// 3. During afterUpdate, any updated components will NOT have their afterUpdate +// callback called a second time; the seen_callbacks set, outside the flush() +// function, guarantees this behavior. +const seen_callbacks = new Set(); +let flushidx = 0; // Do *not* move this inside the flush() function +function flush() { + // Do not reenter flush while dirty components are updated, as this can + // result in an infinite loop. Instead, let the inner flush handle it. + // Reentrancy is ok afterwards for bindings etc. + if (flushidx !== 0) { + return; + } + const saved_component = current_component; + do { + // first, call beforeUpdate functions + // and update components + try { + while (flushidx < dirty_components.length) { + const component = dirty_components[flushidx]; + flushidx++; + set_current_component(component); + update(component.$$); + } + } + catch (e) { + // reset dirty state to not end up in a deadlocked state and then rethrow + dirty_components.length = 0; + flushidx = 0; + throw e; + } + set_current_component(null); + dirty_components.length = 0; + flushidx = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + // ...so guard against infinite loops + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + seen_callbacks.clear(); + set_current_component(saved_component); +} +function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } +} +const outroing = new Set(); +function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } +} + +const globals = (typeof window !== 'undefined' + ? window + : typeof globalThis !== 'undefined' + ? globalThis + : global); + +function destroy_block(block, lookup) { + block.d(1); + lookup.delete(block.key); +} +function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) { + let o = old_blocks.length; + let n = list.length; + let i = o; + const old_indexes = {}; + while (i--) + old_indexes[old_blocks[i].key] = i; + const new_blocks = []; + const new_lookup = new Map(); + const deltas = new Map(); + i = n; + while (i--) { + const child_ctx = get_context(ctx, list, i); + const key = get_key(child_ctx); + let block = lookup.get(key); + if (!block) { + block = create_each_block(key, child_ctx); + block.c(); + } + else if (dynamic) { + block.p(child_ctx, dirty); + } + new_lookup.set(key, new_blocks[i] = block); + if (key in old_indexes) + deltas.set(key, Math.abs(i - old_indexes[key])); + } + const will_move = new Set(); + const did_move = new Set(); + function insert(block) { + transition_in(block, 1); + block.m(node, next); + lookup.set(block.key, block); + next = block.first; + n--; + } + while (o && n) { + const new_block = new_blocks[n - 1]; + const old_block = old_blocks[o - 1]; + const new_key = new_block.key; + const old_key = old_block.key; + if (new_block === old_block) { + // do nothing + next = new_block.first; + o--; + n--; + } + else if (!new_lookup.has(old_key)) { + // remove old block + destroy(old_block, lookup); + o--; + } + else if (!lookup.has(new_key) || will_move.has(new_key)) { + insert(new_block); + } + else if (did_move.has(old_key)) { + o--; + } + else if (deltas.get(new_key) > deltas.get(old_key)) { + did_move.add(new_key); + insert(new_block); + } + else { + will_move.add(old_key); + o--; + } + } + while (o--) { + const old_block = old_blocks[o]; + if (!new_lookup.has(old_block.key)) + destroy(old_block, lookup); + } + while (n) + insert(new_blocks[n - 1]); + return new_blocks; +} +function mount_component(component, target, anchor, customElement) { + const { fragment, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + // onMount happens before the initial afterUpdate + add_render_callback(() => { + const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); + // if the component was destroyed immediately + // it will update the `$$.on_destroy` reference to `null`. + // the destructured on_destroy may still reference to the old array + if (component.$$.on_destroy) { + component.$$.on_destroy.push(...new_on_destroy); + } + else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); +} +function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } +} +function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); +} +function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const $$ = component.$$ = { + fragment: null, + ctx: [], + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map((parent_component ? parent_component.$$.context : [])), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root + }; + append_styles && append_styles($$.root); + let ready = false; + $$.ctx = instance + ? instance(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); + } + return ret; + }) + : []; + $$.update(); + ready = true; + run_all($$.before_update); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); + } + mount_component(component, options.target, undefined, undefined); + flush(); + } + set_current_component(parent_component); +} +/** + * Base class for Svelte components. Used when dev=false. + */ +class SvelteComponent { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + if (!is_function(callback)) { + return noop; + } + const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } +} + +// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json +const allGroups = [ + [-1, 'โœจ', 'custom'], + [0, '๐Ÿ˜€', 'smileys-emotion'], + [1, '๐Ÿ‘‹', 'people-body'], + [3, '๐Ÿฑ', 'animals-nature'], + [4, '๐ŸŽ', 'food-drink'], + [5, '๐Ÿ ๏ธ', 'travel-places'], + [6, 'โšฝ', 'activities'], + [7, '๐Ÿ“', 'objects'], + [8, 'โ›”๏ธ', 'symbols'], + [9, '๐Ÿ', 'flags'] +].map(([id, emoji, name]) => ({ id, emoji, name })); + +const groups = allGroups.slice(1); +const customGroup = allGroups[0]; + +const MIN_SEARCH_TEXT_LENGTH = 2; +const NUM_SKIN_TONES = 6; + +/* istanbul ignore next */ +const rIC = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout; + +// check for ZWJ (zero width joiner) character +function hasZwj (emoji) { + return emoji.unicode.includes('\u200d') +} + +// Find one good representative emoji from each version to test by checking its color. +// Ideally it should have color in the center. For some inspiration, see: +// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/ +// +// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because +// all the emoji from this version are compound-emoji from previous versions. So they would pass a color +// test, even in browsers that display them as double emoji. (E.g. "face in clouds" might render as +// "face without mouth" plus "fog".) These emoji can only be filtered using the width test, +// which happens in checkZwjSupport.js. +const versionsAndTestEmoji = { + '๐Ÿซ ': 14, + '๐Ÿฅฒ': 13.1, // smiling face with tear, technically from v13 but see note above + '๐Ÿฅป': 12.1, // sari, technically from v12 but see note above + '๐Ÿฅฐ': 11, + '๐Ÿคฉ': 5, + '๐Ÿ‘ฑโ€โ™€๏ธ': 4, + '๐Ÿคฃ': 3, + '๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ': 2, + '๐Ÿ˜€': 1, + '๐Ÿ˜๏ธ': 0.7, + '๐Ÿ˜ƒ': 0.6 +}; + +const TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second +const DEFAULT_SKIN_TONE_EMOJI = '๐Ÿ–๏ธ'; +const DEFAULT_NUM_COLUMNS = 8; + +// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and +// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with +// a bit of my own curation. (E.g. avoid the "OK" gesture because of connotations: +// https://emojipedia.org/ok-hand/) +const MOST_COMMONLY_USED_EMOJI = [ + '๐Ÿ˜Š', + '๐Ÿ˜’', + 'โ™ฅ๏ธ', + '๐Ÿ‘๏ธ', + '๐Ÿ˜', + '๐Ÿ˜‚', + '๐Ÿ˜ญ', + 'โ˜บ๏ธ', + '๐Ÿ˜”', + '๐Ÿ˜ฉ', + '๐Ÿ˜', + '๐Ÿ’•', + '๐Ÿ™Œ', + '๐Ÿ˜˜' +]; + +// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their +// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla +// updates faster than the underlying OS, and we don't want to render older emoji in one font and +// newer emoji in another font: +// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283 +const FONT_FAMILY = '"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol",' + + '"Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif'; + +/* istanbul ignore next */ +const DEFAULT_CATEGORY_SORTING = (a, b) => a < b ? -1 : a > b ? 1 : 0; + +// Test if an emoji is supported by rendering it to canvas and checking that the color is not black + +const getTextFeature = (text, color) => { + const canvas = document.createElement('canvas'); + canvas.width = canvas.height = 1; + + const ctx = canvas.getContext('2d'); + ctx.textBaseline = 'top'; + ctx.font = `100px ${FONT_FAMILY}`; + ctx.fillStyle = color; + ctx.scale(0.01, 0.01); + ctx.fillText(text, 0, 0); + + return ctx.getImageData(0, 0, 1, 1).data +}; + +const compareFeatures = (feature1, feature2) => { + const feature1Str = [...feature1].join(','); + const feature2Str = [...feature2].join(','); + // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes. + // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is + // 0,0,0,61 - there is a transparency here. + return feature1Str === feature2Str && !feature1Str.startsWith('0,0,0,') +}; + +function testColorEmojiSupported (text) { + // Render white and black and then compare them to each other and ensure they're the same + // color, and neither one is black. This shows that the emoji was rendered in color. + const feature1 = getTextFeature(text, '#000'); + const feature2 = getTextFeature(text, '#fff'); + return feature1 && feature2 && compareFeatures(feature1, feature2) +} + +// rather than check every emoji ever, which would be expensive, just check some representatives from the + +function determineEmojiSupportLevel () { + const entries = Object.entries(versionsAndTestEmoji); + try { + // start with latest emoji and work backwards + for (const [emoji, version] of entries) { + if (testColorEmojiSupported(emoji)) { + return version + } + } + } catch (e) { // canvas error + } finally { + } + // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors + // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all. + return entries[0][1] // first one in the list is the most recent version +} + +// Check which emojis we know for sure aren't supported, based on Unicode version level +let promise; +const detectEmojiSupportLevel = () => { + if (!promise) { + // Delay so it can run while the IDB database is being created by the browser (on another thread). + // This helps especially with first load โ€“ we want to start pre-populating the database on the main thread, + // and then wait for IDB to commit everything, and while waiting we run this check. + promise = new Promise(resolve => ( + rIC(() => ( + resolve(determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating + )) + )); + } + return promise +}; +// determine which emojis containing ZWJ (zero width joiner) characters +// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs) +const supportedZwjEmojis = new Map(); + +const VARIATION_SELECTOR = '\ufe0f'; +const SKINTONE_MODIFIER = '\ud83c'; +const ZWJ = '\u200d'; +const LIGHT_SKIN_TONE = 0x1F3FB; +const LIGHT_SKIN_TONE_MODIFIER = 0xdffb; + +// TODO: this is a naive implementation, we can improve it later +// It's only used for the skintone picker, so as long as people don't customize with +// really exotic emoji then it should work fine +function applySkinTone (str, skinTone) { + if (skinTone === 0) { + return str + } + const zwjIndex = str.indexOf(ZWJ); + if (zwjIndex !== -1) { + return str.substring(0, zwjIndex) + + String.fromCodePoint(LIGHT_SKIN_TONE + skinTone - 1) + + str.substring(zwjIndex) + } + if (str.endsWith(VARIATION_SELECTOR)) { + str = str.substring(0, str.length - 1); + } + return str + SKINTONE_MODIFIER + String.fromCodePoint(LIGHT_SKIN_TONE_MODIFIER + skinTone - 1) +} + +function halt (event) { + event.preventDefault(); + event.stopPropagation(); +} + +// Implementation left/right or up/down navigation, circling back when you +// reach the start/end of the list +function incrementOrDecrement (decrement, val, arr) { + val += (decrement ? -1 : 1); + if (val < 0) { + val = arr.length - 1; + } else if (val >= arr.length) { + val = 0; + } + return val +} + +// like lodash's uniqBy but much smaller +function uniqBy (arr, func) { + const set = new Set(); + const res = []; + for (const item of arr) { + const key = func(item); + if (!set.has(key)) { + set.add(key); + res.push(item); + } + } + return res +} + +// We don't need all the data on every emoji, and there are specific things we need +// for the UI, so build a "view model" from the emoji object we got from the database + +function summarizeEmojisForUI (emojis, emojiSupportLevel) { + const toSimpleSkinsMap = skins => { + const res = {}; + for (const skin of skins) { + // ignore arrays like [1, 2] with multiple skin tones + // also ignore variants that are in an unsupported emoji version + // (these do exist - variants from a different version than their base emoji) + if (typeof skin.tone === 'number' && skin.version <= emojiSupportLevel) { + res[skin.tone] = skin.unicode; + } + } + return res + }; + + return emojis.map(({ unicode, skins, shortcodes, url, name, category }) => ({ + unicode, + name, + shortcodes, + url, + category, + id: unicode || name, + skins: skins && toSimpleSkinsMap(skins), + title: (shortcodes || []).join(', ') + })) +} + +// import rAF from one place so that the bundle size is a bit smaller +const rAF = requestAnimationFrame; + +// Svelte action to calculate the width of an element and auto-update + +let resizeObserverSupported = typeof ResizeObserver === 'function'; + +function calculateWidth (node, onUpdate) { + let resizeObserver; + if (resizeObserverSupported) { + resizeObserver = new ResizeObserver(entries => ( + onUpdate(entries[0].contentRect.width) + )); + resizeObserver.observe(node); + } else { // just set the width once, don't bother trying to track it + rAF(() => ( + onUpdate(node.getBoundingClientRect().width) + )); + } + + // cleanup function (called on destroy) + return { + destroy () { + if (resizeObserver) { + resizeObserver.disconnect(); + } + } + } +} + +// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742 +function calculateTextWidth (node) { + /* istanbul ignore else */ + { + const range = document.createRange(); + range.selectNode(node.firstChild); + return range.getBoundingClientRect().width + } +} + +let baselineEmojiWidth; + +function checkZwjSupport (zwjEmojisToCheck, baselineEmoji, emojiToDomNode) { + for (const emoji of zwjEmojisToCheck) { + const domNode = emojiToDomNode(emoji); + const emojiWidth = calculateTextWidth(domNode); + if (typeof baselineEmojiWidth === 'undefined') { // calculate the baseline emoji width only once + baselineEmojiWidth = calculateTextWidth(baselineEmoji); + } + // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard + // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with + // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.) + // So here we set the threshold at 1.8 times the size of the baseline emoji. + const supported = emojiWidth / 1.8 < baselineEmojiWidth; + supportedZwjEmojis.set(emoji.unicode, supported); + } +} + +// Measure after style/layout are complete + +const requestPostAnimationFrame = callback => { + rAF(() => { + setTimeout(callback); + }); +}; + +// like lodash's uniq + +function uniq (arr) { + return uniqBy(arr, _ => _) +} + +// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the "setter" here. +// At best the invalidation is useless, at worst it can cause infinite loops: +// https://github.com/nolanlawson/emoji-picker-element/pull/180 +// https://github.com/sveltejs/svelte/issues/6521 +// Also note tabpanelElement can be null if the element is disconnected immediately after connected +function resetScrollTopIfPossible (element) { + if (element) { + element.scrollTop = 0; + } +} + +/* src/picker/components/Picker/Picker.svelte generated by Svelte v3.55.1 */ + +const { Map: Map_1 } = globals; + +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[64] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[67] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[64] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[70] = list[i]; + return child_ctx; +} + +function get_each_context_4(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[73] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +// (43:38) {#each skinTones as skinTone, i (skinTone)} +function create_each_block_4(key_1, ctx) { + let div; + let t_value = /*skinTone*/ ctx[73] + ""; + let t; + let div_id_value; + let div_class_value; + let div_aria_selected_value; + let div_title_value; + let div_aria_label_value; + + return { + key: key_1, + first: null, + c() { + div = element("div"); + t = text(t_value); + attr(div, "id", div_id_value = "skintone-" + /*i*/ ctx[66]); + + attr(div, "class", div_class_value = "emoji hide-focus " + (/*i*/ ctx[66] === /*activeSkinTone*/ ctx[20] + ? 'active' + : '')); + + attr(div, "aria-selected", div_aria_selected_value = /*i*/ ctx[66] === /*activeSkinTone*/ ctx[20]); + attr(div, "role", "option"); + attr(div, "title", div_title_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]]); + attr(div, "tabindex", "-1"); + attr(div, "aria-label", div_aria_label_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]]); + this.first = div; + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, t); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty[0] & /*skinTones*/ 512 && t_value !== (t_value = /*skinTone*/ ctx[73] + "")) set_data(t, t_value); + + if (dirty[0] & /*skinTones*/ 512 && div_id_value !== (div_id_value = "skintone-" + /*i*/ ctx[66])) { + attr(div, "id", div_id_value); + } + + if (dirty[0] & /*skinTones, activeSkinTone*/ 1049088 && div_class_value !== (div_class_value = "emoji hide-focus " + (/*i*/ ctx[66] === /*activeSkinTone*/ ctx[20] + ? 'active' + : ''))) { + attr(div, "class", div_class_value); + } + + if (dirty[0] & /*skinTones, activeSkinTone*/ 1049088 && div_aria_selected_value !== (div_aria_selected_value = /*i*/ ctx[66] === /*activeSkinTone*/ ctx[20])) { + attr(div, "aria-selected", div_aria_selected_value); + } + + if (dirty[0] & /*i18n, skinTones*/ 513 && div_title_value !== (div_title_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]])) { + attr(div, "title", div_title_value); + } + + if (dirty[0] & /*i18n, skinTones*/ 513 && div_aria_label_value !== (div_aria_label_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]])) { + attr(div, "aria-label", div_aria_label_value); + } + }, + d(detaching) { + if (detaching) detach(div); + } + }; +} + +// (53:33) {#each groups as group (group.id)} +function create_each_block_3(key_1, ctx) { + let button; + let div; + let t_value = /*group*/ ctx[70].emoji + ""; + let t; + let button_aria_controls_value; + let button_aria_label_value; + let button_aria_selected_value; + let button_title_value; + let mounted; + let dispose; + + function click_handler() { + return /*click_handler*/ ctx[50](/*group*/ ctx[70]); + } + + return { + key: key_1, + first: null, + c() { + button = element("button"); + div = element("div"); + t = text(t_value); + attr(div, "class", "nav-emoji emoji"); + attr(button, "role", "tab"); + attr(button, "class", "nav-button"); + attr(button, "aria-controls", button_aria_controls_value = "tab-" + /*group*/ ctx[70].id); + attr(button, "aria-label", button_aria_label_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name]); + attr(button, "aria-selected", button_aria_selected_value = !/*searchMode*/ ctx[4] && /*currentGroup*/ ctx[13].id === /*group*/ ctx[70].id); + attr(button, "title", button_title_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name]); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + append(button, div); + append(div, t); + + if (!mounted) { + dispose = listen(button, "click", click_handler); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty[0] & /*groups*/ 4096 && t_value !== (t_value = /*group*/ ctx[70].emoji + "")) set_data(t, t_value); + + if (dirty[0] & /*groups*/ 4096 && button_aria_controls_value !== (button_aria_controls_value = "tab-" + /*group*/ ctx[70].id)) { + attr(button, "aria-controls", button_aria_controls_value); + } + + if (dirty[0] & /*i18n, groups*/ 4097 && button_aria_label_value !== (button_aria_label_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name])) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*searchMode, currentGroup, groups*/ 12304 && button_aria_selected_value !== (button_aria_selected_value = !/*searchMode*/ ctx[4] && /*currentGroup*/ ctx[13].id === /*group*/ ctx[70].id)) { + attr(button, "aria-selected", button_aria_selected_value); + } + + if (dirty[0] & /*i18n, groups*/ 4097 && button_title_value !== (button_title_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name])) { + attr(button, "title", button_title_value); + } + }, + d(detaching) { + if (detaching) detach(button); + mounted = false; + dispose(); + } + }; +} + +// (94:100) {:else} +function create_else_block_1(ctx) { + let img; + let img_src_value; + + return { + c() { + img = element("img"); + attr(img, "class", "custom-emoji"); + if (!src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) attr(img, "src", img_src_value); + attr(img, "alt", ""); + attr(img, "loading", "lazy"); + }, + m(target, anchor) { + insert(target, img, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && !src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) { + attr(img, "src", img_src_value); + } + }, + d(detaching) { + if (detaching) detach(img); + } + }; +} + +// (94:40) {#if emoji.unicode} +function create_if_block_1(ctx) { + let t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + ""; + let t; + + return { + c() { + t = text(t_value); + }, + m(target, anchor) { + insert(target, t, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentEmojisWithCategories, currentSkinTone*/ 33024 && t_value !== (t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(t); + } + }; +} + +// (89:53) {#each emojiWithCategory.emojis as emoji, i (emoji.id)} +function create_each_block_2(key_1, ctx) { + let button; + let button_role_value; + let button_aria_selected_value; + let button_aria_label_value; + let button_title_value; + let button_class_value; + let button_id_value; + + function select_block_type(ctx, dirty) { + if (/*emoji*/ ctx[64].unicode) return create_if_block_1; + return create_else_block_1; + } + + let current_block_type = select_block_type(ctx); + let if_block = current_block_type(ctx); + + return { + key: key_1, + first: null, + c() { + button = element("button"); + if_block.c(); + attr(button, "role", button_role_value = /*searchMode*/ ctx[4] ? 'option' : 'menuitem'); + + attr(button, "aria-selected", button_aria_selected_value = /*searchMode*/ ctx[4] + ? /*i*/ ctx[66] == /*activeSearchItem*/ ctx[5] + : ''); + + attr(button, "aria-label", button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8])); + attr(button, "title", button_title_value = /*emoji*/ ctx[64].title); + + attr(button, "class", button_class_value = "emoji " + (/*searchMode*/ ctx[4] && /*i*/ ctx[66] === /*activeSearchItem*/ ctx[5] + ? 'active' + : '')); + + attr(button, "id", button_id_value = "emo-" + /*emoji*/ ctx[64].id); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + if_block.m(button, null); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(button, null); + } + } + + if (dirty[0] & /*searchMode*/ 16 && button_role_value !== (button_role_value = /*searchMode*/ ctx[4] ? 'option' : 'menuitem')) { + attr(button, "role", button_role_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem*/ 32816 && button_aria_selected_value !== (button_aria_selected_value = /*searchMode*/ ctx[4] + ? /*i*/ ctx[66] == /*activeSearchItem*/ ctx[5] + : '')) { + attr(button, "aria-selected", button_aria_selected_value); + } + + if (dirty[0] & /*currentEmojisWithCategories, currentSkinTone*/ 33024 && button_aria_label_value !== (button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]))) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && button_title_value !== (button_title_value = /*emoji*/ ctx[64].title)) { + attr(button, "title", button_title_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem*/ 32816 && button_class_value !== (button_class_value = "emoji " + (/*searchMode*/ ctx[4] && /*i*/ ctx[66] === /*activeSearchItem*/ ctx[5] + ? 'active' + : ''))) { + attr(button, "class", button_class_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && button_id_value !== (button_id_value = "emo-" + /*emoji*/ ctx[64].id)) { + attr(button, "id", button_id_value); + } + }, + d(detaching) { + if (detaching) detach(button); + if_block.d(); + } + }; +} + +// (70:36) {#each currentEmojisWithCategories as emojiWithCategory, i (emojiWithCategory.category)} +function create_each_block_1(key_1, ctx) { + let div0; + + let t_value = (/*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*emojiWithCategory*/ ctx[67].category + ? /*emojiWithCategory*/ ctx[67].category + : /*currentEmojisWithCategories*/ ctx[15].length > 1 + ? /*i18n*/ ctx[0].categories.custom + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]) + ""; + + let t; + let div0_id_value; + let div0_class_value; + let div1; + let each_blocks = []; + let each_1_lookup = new Map_1(); + let div1_role_value; + let div1_aria_labelledby_value; + let div1_id_value; + let each_value_2 = /*emojiWithCategory*/ ctx[67].emojis; + const get_key = ctx => /*emoji*/ ctx[64].id; + + for (let i = 0; i < each_value_2.length; i += 1) { + let child_ctx = get_each_context_2(ctx, each_value_2, i); + let key = get_key(child_ctx); + each_1_lookup.set(key, each_blocks[i] = create_each_block_2(key, child_ctx)); + } + + return { + key: key_1, + first: null, + c() { + div0 = element("div"); + t = text(t_value); + div1 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(div0, "id", div0_id_value = "menu-label-" + /*i*/ ctx[66]); + + attr(div0, "class", div0_class_value = "category " + (/*currentEmojisWithCategories*/ ctx[15].length === 1 && /*currentEmojisWithCategories*/ ctx[15][0].category === '' + ? 'gone' + : '')); + + attr(div0, "aria-hidden", "true"); + attr(div1, "class", "emoji-menu"); + attr(div1, "role", div1_role_value = /*searchMode*/ ctx[4] ? 'listbox' : 'menu'); + attr(div1, "aria-labelledby", div1_aria_labelledby_value = "menu-label-" + /*i*/ ctx[66]); + attr(div1, "id", div1_id_value = /*searchMode*/ ctx[4] ? 'search-results' : ''); + this.first = div0; + }, + m(target, anchor) { + insert(target, div0, anchor); + append(div0, t); + insert(target, div1, anchor); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (dirty[0] & /*searchMode, i18n, currentEmojisWithCategories, currentGroup*/ 40977 && t_value !== (t_value = (/*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*emojiWithCategory*/ ctx[67].category + ? /*emojiWithCategory*/ ctx[67].category + : /*currentEmojisWithCategories*/ ctx[15].length > 1 + ? /*i18n*/ ctx[0].categories.custom + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]) + "")) set_data(t, t_value); + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div0_id_value !== (div0_id_value = "menu-label-" + /*i*/ ctx[66])) { + attr(div0, "id", div0_id_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div0_class_value !== (div0_class_value = "category " + (/*currentEmojisWithCategories*/ ctx[15].length === 1 && /*currentEmojisWithCategories*/ ctx[15][0].category === '' + ? 'gone' + : ''))) { + attr(div0, "class", div0_class_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem, labelWithSkin, currentSkinTone, unicodeWithSkin*/ 402686256) { + each_value_2 = /*emojiWithCategory*/ ctx[67].emojis; + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value_2, each_1_lookup, div1, destroy_block, create_each_block_2, null, get_each_context_2); + } + + if (dirty[0] & /*searchMode*/ 16 && div1_role_value !== (div1_role_value = /*searchMode*/ ctx[4] ? 'listbox' : 'menu')) { + attr(div1, "role", div1_role_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div1_aria_labelledby_value !== (div1_aria_labelledby_value = "menu-label-" + /*i*/ ctx[66])) { + attr(div1, "aria-labelledby", div1_aria_labelledby_value); + } + + if (dirty[0] & /*searchMode*/ 16 && div1_id_value !== (div1_id_value = /*searchMode*/ ctx[4] ? 'search-results' : '')) { + attr(div1, "id", div1_id_value); + } + }, + d(detaching) { + if (detaching) detach(div0); + if (detaching) detach(div1); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + } + }; +} + +// (103:94) {:else} +function create_else_block(ctx) { + let img; + let img_src_value; + + return { + c() { + img = element("img"); + attr(img, "class", "custom-emoji"); + if (!src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) attr(img, "src", img_src_value); + attr(img, "alt", ""); + attr(img, "loading", "lazy"); + }, + m(target, anchor) { + insert(target, img, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentFavorites*/ 1024 && !src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) { + attr(img, "src", img_src_value); + } + }, + d(detaching) { + if (detaching) detach(img); + } + }; +} + +// (103:34) {#if emoji.unicode} +function create_if_block(ctx) { + let t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + ""; + let t; + + return { + c() { + t = text(t_value); + }, + m(target, anchor) { + insert(target, t, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentFavorites, currentSkinTone*/ 1280 && t_value !== (t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(t); + } + }; +} + +// (99:102) {#each currentFavorites as emoji, i (emoji.id)} +function create_each_block(key_1, ctx) { + let button; + let button_aria_label_value; + let button_title_value; + let button_id_value; + + function select_block_type_1(ctx, dirty) { + if (/*emoji*/ ctx[64].unicode) return create_if_block; + return create_else_block; + } + + let current_block_type = select_block_type_1(ctx); + let if_block = current_block_type(ctx); + + return { + key: key_1, + first: null, + c() { + button = element("button"); + if_block.c(); + attr(button, "role", "menuitem"); + attr(button, "aria-label", button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8])); + attr(button, "title", button_title_value = /*emoji*/ ctx[64].title); + attr(button, "class", "emoji"); + attr(button, "id", button_id_value = "fav-" + /*emoji*/ ctx[64].id); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + if_block.m(button, null); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(button, null); + } + } + + if (dirty[0] & /*currentFavorites, currentSkinTone*/ 1280 && button_aria_label_value !== (button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]))) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*currentFavorites*/ 1024 && button_title_value !== (button_title_value = /*emoji*/ ctx[64].title)) { + attr(button, "title", button_title_value); + } + + if (dirty[0] & /*currentFavorites*/ 1024 && button_id_value !== (button_id_value = "fav-" + /*emoji*/ ctx[64].id)) { + attr(button, "id", button_id_value); + } + }, + d(detaching) { + if (detaching) detach(button); + if_block.d(); + } + }; +} + +function create_fragment(ctx) { + let section; + let div0; + let div4; + let div1; + let input; + let input_placeholder_value; + let input_aria_expanded_value; + let input_aria_activedescendant_value; + let label; + let t0_value = /*i18n*/ ctx[0].searchLabel + ""; + let t0; + let span0; + let t1_value = /*i18n*/ ctx[0].searchDescription + ""; + let t1; + let div2; + let button0; + let t2; + let button0_class_value; + let div2_class_value; + let span1; + let t3_value = /*i18n*/ ctx[0].skinToneDescription + ""; + let t3; + let div3; + let each_blocks_3 = []; + let each0_lookup = new Map_1(); + let div3_class_value; + let div3_aria_label_value; + let div3_aria_activedescendant_value; + let div3_aria_hidden_value; + let div5; + let each_blocks_2 = []; + let each1_lookup = new Map_1(); + let div5_aria_label_value; + let div7; + let div6; + let div8; + let t4; + let div8_class_value; + let div10; + let div9; + let each_blocks_1 = []; + let each2_lookup = new Map_1(); + let div10_class_value; + let div10_role_value; + let div10_aria_label_value; + let div10_id_value; + let div11; + let each_blocks = []; + let each3_lookup = new Map_1(); + let div11_class_value; + let div11_aria_label_value; + let button1; + let section_aria_label_value; + let mounted; + let dispose; + let each_value_4 = /*skinTones*/ ctx[9]; + const get_key = ctx => /*skinTone*/ ctx[73]; + + for (let i = 0; i < each_value_4.length; i += 1) { + let child_ctx = get_each_context_4(ctx, each_value_4, i); + let key = get_key(child_ctx); + each0_lookup.set(key, each_blocks_3[i] = create_each_block_4(key, child_ctx)); + } + + let each_value_3 = /*groups*/ ctx[12]; + const get_key_1 = ctx => /*group*/ ctx[70].id; + + for (let i = 0; i < each_value_3.length; i += 1) { + let child_ctx = get_each_context_3(ctx, each_value_3, i); + let key = get_key_1(child_ctx); + each1_lookup.set(key, each_blocks_2[i] = create_each_block_3(key, child_ctx)); + } + + let each_value_1 = /*currentEmojisWithCategories*/ ctx[15]; + const get_key_2 = ctx => /*emojiWithCategory*/ ctx[67].category; + + for (let i = 0; i < each_value_1.length; i += 1) { + let child_ctx = get_each_context_1(ctx, each_value_1, i); + let key = get_key_2(child_ctx); + each2_lookup.set(key, each_blocks_1[i] = create_each_block_1(key, child_ctx)); + } + + let each_value = /*currentFavorites*/ ctx[10]; + const get_key_3 = ctx => /*emoji*/ ctx[64].id; + + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context(ctx, each_value, i); + let key = get_key_3(child_ctx); + each3_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); + } + + return { + c() { + section = element("section"); + div0 = element("div"); + div4 = element("div"); + div1 = element("div"); + input = element("input"); + label = element("label"); + t0 = text(t0_value); + span0 = element("span"); + t1 = text(t1_value); + div2 = element("div"); + button0 = element("button"); + t2 = text(/*skinToneButtonText*/ ctx[21]); + span1 = element("span"); + t3 = text(t3_value); + div3 = element("div"); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].c(); + } + + div5 = element("div"); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].c(); + } + + div7 = element("div"); + div6 = element("div"); + div8 = element("div"); + t4 = text(/*message*/ ctx[18]); + div10 = element("div"); + div9 = element("div"); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + + div11 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + button1 = element("button"); + button1.textContent = "๐Ÿ˜€"; + attr(div0, "class", "pad-top"); + attr(input, "id", "search"); + attr(input, "class", "search"); + attr(input, "type", "search"); + attr(input, "role", "combobox"); + attr(input, "enterkeyhint", "search"); + attr(input, "placeholder", input_placeholder_value = /*i18n*/ ctx[0].searchLabel); + attr(input, "autocapitalize", "none"); + attr(input, "autocomplete", "off"); + attr(input, "spellcheck", "true"); + attr(input, "aria-expanded", input_aria_expanded_value = !!(/*searchMode*/ ctx[4] && /*currentEmojis*/ ctx[1].length)); + attr(input, "aria-controls", "search-results"); + attr(input, "aria-describedby", "search-description"); + attr(input, "aria-autocomplete", "list"); + + attr(input, "aria-activedescendant", input_aria_activedescendant_value = /*activeSearchItemId*/ ctx[26] + ? `emo-${/*activeSearchItemId*/ ctx[26]}` + : ''); + + attr(label, "class", "sr-only"); + attr(label, "for", "search"); + attr(span0, "id", "search-description"); + attr(span0, "class", "sr-only"); + attr(div1, "class", "search-wrapper"); + attr(button0, "id", "skintone-button"); + attr(button0, "class", button0_class_value = "emoji " + (/*skinTonePickerExpanded*/ ctx[6] ? 'hide-focus' : '')); + attr(button0, "aria-label", /*skinToneButtonLabel*/ ctx[23]); + attr(button0, "title", /*skinToneButtonLabel*/ ctx[23]); + attr(button0, "aria-describedby", "skintone-description"); + attr(button0, "aria-haspopup", "listbox"); + attr(button0, "aria-expanded", /*skinTonePickerExpanded*/ ctx[6]); + attr(button0, "aria-controls", "skintone-list"); + + attr(div2, "class", div2_class_value = "skintone-button-wrapper " + (/*skinTonePickerExpandedAfterAnimation*/ ctx[19] + ? 'expanded' + : '')); + + attr(span1, "id", "skintone-description"); + attr(span1, "class", "sr-only"); + attr(div3, "id", "skintone-list"); + + attr(div3, "class", div3_class_value = "skintone-list " + (/*skinTonePickerExpanded*/ ctx[6] + ? '' + : 'hidden no-animate')); + + set_style(div3, "transform", "translateY(" + (/*skinTonePickerExpanded*/ ctx[6] + ? 0 + : 'calc(-1 * var(--num-skintones) * var(--total-emoji-size))') + ")"); + + attr(div3, "role", "listbox"); + attr(div3, "aria-label", div3_aria_label_value = /*i18n*/ ctx[0].skinTonesLabel); + attr(div3, "aria-activedescendant", div3_aria_activedescendant_value = "skintone-" + /*activeSkinTone*/ ctx[20]); + attr(div3, "aria-hidden", div3_aria_hidden_value = !/*skinTonePickerExpanded*/ ctx[6]); + attr(div4, "class", "search-row"); + attr(div5, "class", "nav"); + attr(div5, "role", "tablist"); + set_style(div5, "grid-template-columns", "repeat(" + /*groups*/ ctx[12].length + ", 1fr)"); + attr(div5, "aria-label", div5_aria_label_value = /*i18n*/ ctx[0].categoriesLabel); + attr(div6, "class", "indicator"); + set_style(div6, "transform", "translateX(" + (/*isRtl*/ ctx[24] ? -1 : 1) * /*currentGroupIndex*/ ctx[11] * 100 + "%)"); + attr(div7, "class", "indicator-wrapper"); + attr(div8, "class", div8_class_value = "message " + (/*message*/ ctx[18] ? '' : 'gone')); + attr(div8, "role", "alert"); + attr(div8, "aria-live", "polite"); + + attr(div10, "class", div10_class_value = "tabpanel " + (!/*databaseLoaded*/ ctx[14] || /*message*/ ctx[18] + ? 'gone' + : '')); + + attr(div10, "role", div10_role_value = /*searchMode*/ ctx[4] ? 'region' : 'tabpanel'); + + attr(div10, "aria-label", div10_aria_label_value = /*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]); + + attr(div10, "id", div10_id_value = /*searchMode*/ ctx[4] + ? '' + : `tab-${/*currentGroup*/ ctx[13].id}`); + + attr(div10, "tabindex", "0"); + attr(div11, "class", div11_class_value = "favorites emoji-menu " + (/*message*/ ctx[18] ? 'gone' : '')); + attr(div11, "role", "menu"); + attr(div11, "aria-label", div11_aria_label_value = /*i18n*/ ctx[0].favoritesLabel); + set_style(div11, "padding-inline-end", /*scrollbarWidth*/ ctx[25] + "px"); + attr(button1, "aria-hidden", "true"); + attr(button1, "tabindex", "-1"); + attr(button1, "class", "abs-pos hidden emoji"); + attr(section, "class", "picker"); + attr(section, "aria-label", section_aria_label_value = /*i18n*/ ctx[0].regionLabel); + attr(section, "style", /*pickerStyle*/ ctx[22]); + }, + m(target, anchor) { + insert(target, section, anchor); + append(section, div0); + append(section, div4); + append(div4, div1); + append(div1, input); + set_input_value(input, /*rawSearchText*/ ctx[2]); + append(div1, label); + append(label, t0); + append(div1, span0); + append(span0, t1); + append(div4, div2); + append(div2, button0); + append(button0, t2); + append(div4, span1); + append(span1, t3); + append(div4, div3); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].m(div3, null); + } + + /*div3_binding*/ ctx[49](div3); + append(section, div5); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].m(div5, null); + } + + append(section, div7); + append(div7, div6); + append(section, div8); + append(div8, t4); + append(section, div10); + append(div10, div9); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(div9, null); + } + + /*div10_binding*/ ctx[51](div10); + append(section, div11); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div11, null); + } + + append(section, button1); + /*button1_binding*/ ctx[52](button1); + /*section_binding*/ ctx[53](section); + + if (!mounted) { + dispose = [ + listen(input, "input", /*input_input_handler*/ ctx[48]), + listen(input, "keydown", /*onSearchKeydown*/ ctx[30]), + listen(button0, "click", /*onClickSkinToneButton*/ ctx[35]), + listen(div3, "focusout", /*onSkinToneOptionsFocusOut*/ ctx[38]), + listen(div3, "click", /*onSkinToneOptionsClick*/ ctx[34]), + listen(div3, "keydown", /*onSkinToneOptionsKeydown*/ ctx[36]), + listen(div3, "keyup", /*onSkinToneOptionsKeyup*/ ctx[37]), + listen(div5, "keydown", /*onNavKeydown*/ ctx[32]), + action_destroyer(/*calculateEmojiGridStyle*/ ctx[29].call(null, div9)), + listen(div10, "click", /*onEmojiClick*/ ctx[33]), + listen(div11, "click", /*onEmojiClick*/ ctx[33]) + ]; + + mounted = true; + } + }, + p(ctx, dirty) { + if (dirty[0] & /*i18n*/ 1 && input_placeholder_value !== (input_placeholder_value = /*i18n*/ ctx[0].searchLabel)) { + attr(input, "placeholder", input_placeholder_value); + } + + if (dirty[0] & /*searchMode, currentEmojis*/ 18 && input_aria_expanded_value !== (input_aria_expanded_value = !!(/*searchMode*/ ctx[4] && /*currentEmojis*/ ctx[1].length))) { + attr(input, "aria-expanded", input_aria_expanded_value); + } + + if (dirty[0] & /*activeSearchItemId*/ 67108864 && input_aria_activedescendant_value !== (input_aria_activedescendant_value = /*activeSearchItemId*/ ctx[26] + ? `emo-${/*activeSearchItemId*/ ctx[26]}` + : '')) { + attr(input, "aria-activedescendant", input_aria_activedescendant_value); + } + + if (dirty[0] & /*rawSearchText*/ 4) { + set_input_value(input, /*rawSearchText*/ ctx[2]); + } + + if (dirty[0] & /*i18n*/ 1 && t0_value !== (t0_value = /*i18n*/ ctx[0].searchLabel + "")) set_data(t0, t0_value); + if (dirty[0] & /*i18n*/ 1 && t1_value !== (t1_value = /*i18n*/ ctx[0].searchDescription + "")) set_data(t1, t1_value); + if (dirty[0] & /*skinToneButtonText*/ 2097152) set_data(t2, /*skinToneButtonText*/ ctx[21]); + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && button0_class_value !== (button0_class_value = "emoji " + (/*skinTonePickerExpanded*/ ctx[6] ? 'hide-focus' : ''))) { + attr(button0, "class", button0_class_value); + } + + if (dirty[0] & /*skinToneButtonLabel*/ 8388608) { + attr(button0, "aria-label", /*skinToneButtonLabel*/ ctx[23]); + } + + if (dirty[0] & /*skinToneButtonLabel*/ 8388608) { + attr(button0, "title", /*skinToneButtonLabel*/ ctx[23]); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64) { + attr(button0, "aria-expanded", /*skinTonePickerExpanded*/ ctx[6]); + } + + if (dirty[0] & /*skinTonePickerExpandedAfterAnimation*/ 524288 && div2_class_value !== (div2_class_value = "skintone-button-wrapper " + (/*skinTonePickerExpandedAfterAnimation*/ ctx[19] + ? 'expanded' + : ''))) { + attr(div2, "class", div2_class_value); + } + + if (dirty[0] & /*i18n*/ 1 && t3_value !== (t3_value = /*i18n*/ ctx[0].skinToneDescription + "")) set_data(t3, t3_value); + + if (dirty[0] & /*skinTones, activeSkinTone, i18n*/ 1049089) { + each_value_4 = /*skinTones*/ ctx[9]; + each_blocks_3 = update_keyed_each(each_blocks_3, dirty, get_key, 1, ctx, each_value_4, each0_lookup, div3, destroy_block, create_each_block_4, null, get_each_context_4); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && div3_class_value !== (div3_class_value = "skintone-list " + (/*skinTonePickerExpanded*/ ctx[6] + ? '' + : 'hidden no-animate'))) { + attr(div3, "class", div3_class_value); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64) { + set_style(div3, "transform", "translateY(" + (/*skinTonePickerExpanded*/ ctx[6] + ? 0 + : 'calc(-1 * var(--num-skintones) * var(--total-emoji-size))') + ")"); + } + + if (dirty[0] & /*i18n*/ 1 && div3_aria_label_value !== (div3_aria_label_value = /*i18n*/ ctx[0].skinTonesLabel)) { + attr(div3, "aria-label", div3_aria_label_value); + } + + if (dirty[0] & /*activeSkinTone*/ 1048576 && div3_aria_activedescendant_value !== (div3_aria_activedescendant_value = "skintone-" + /*activeSkinTone*/ ctx[20])) { + attr(div3, "aria-activedescendant", div3_aria_activedescendant_value); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && div3_aria_hidden_value !== (div3_aria_hidden_value = !/*skinTonePickerExpanded*/ ctx[6])) { + attr(div3, "aria-hidden", div3_aria_hidden_value); + } + + if (dirty[0] & /*groups, i18n, searchMode, currentGroup*/ 12305 | dirty[1] & /*onNavClick*/ 1) { + each_value_3 = /*groups*/ ctx[12]; + each_blocks_2 = update_keyed_each(each_blocks_2, dirty, get_key_1, 1, ctx, each_value_3, each1_lookup, div5, destroy_block, create_each_block_3, null, get_each_context_3); + } + + if (dirty[0] & /*groups*/ 4096) { + set_style(div5, "grid-template-columns", "repeat(" + /*groups*/ ctx[12].length + ", 1fr)"); + } + + if (dirty[0] & /*i18n*/ 1 && div5_aria_label_value !== (div5_aria_label_value = /*i18n*/ ctx[0].categoriesLabel)) { + attr(div5, "aria-label", div5_aria_label_value); + } + + if (dirty[0] & /*isRtl, currentGroupIndex*/ 16779264) { + set_style(div6, "transform", "translateX(" + (/*isRtl*/ ctx[24] ? -1 : 1) * /*currentGroupIndex*/ ctx[11] * 100 + "%)"); + } + + if (dirty[0] & /*message*/ 262144) set_data(t4, /*message*/ ctx[18]); + + if (dirty[0] & /*message*/ 262144 && div8_class_value !== (div8_class_value = "message " + (/*message*/ ctx[18] ? '' : 'gone'))) { + attr(div8, "class", div8_class_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem, labelWithSkin, currentSkinTone, unicodeWithSkin, i18n, currentGroup*/ 402694449) { + each_value_1 = /*currentEmojisWithCategories*/ ctx[15]; + each_blocks_1 = update_keyed_each(each_blocks_1, dirty, get_key_2, 1, ctx, each_value_1, each2_lookup, div9, destroy_block, create_each_block_1, null, get_each_context_1); + } + + if (dirty[0] & /*databaseLoaded, message*/ 278528 && div10_class_value !== (div10_class_value = "tabpanel " + (!/*databaseLoaded*/ ctx[14] || /*message*/ ctx[18] + ? 'gone' + : ''))) { + attr(div10, "class", div10_class_value); + } + + if (dirty[0] & /*searchMode*/ 16 && div10_role_value !== (div10_role_value = /*searchMode*/ ctx[4] ? 'region' : 'tabpanel')) { + attr(div10, "role", div10_role_value); + } + + if (dirty[0] & /*searchMode, i18n, currentGroup*/ 8209 && div10_aria_label_value !== (div10_aria_label_value = /*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name])) { + attr(div10, "aria-label", div10_aria_label_value); + } + + if (dirty[0] & /*searchMode, currentGroup*/ 8208 && div10_id_value !== (div10_id_value = /*searchMode*/ ctx[4] + ? '' + : `tab-${/*currentGroup*/ ctx[13].id}`)) { + attr(div10, "id", div10_id_value); + } + + if (dirty[0] & /*labelWithSkin, currentFavorites, currentSkinTone, unicodeWithSkin*/ 402654464) { + each_value = /*currentFavorites*/ ctx[10]; + each_blocks = update_keyed_each(each_blocks, dirty, get_key_3, 1, ctx, each_value, each3_lookup, div11, destroy_block, create_each_block, null, get_each_context); + } + + if (dirty[0] & /*message*/ 262144 && div11_class_value !== (div11_class_value = "favorites emoji-menu " + (/*message*/ ctx[18] ? 'gone' : ''))) { + attr(div11, "class", div11_class_value); + } + + if (dirty[0] & /*i18n*/ 1 && div11_aria_label_value !== (div11_aria_label_value = /*i18n*/ ctx[0].favoritesLabel)) { + attr(div11, "aria-label", div11_aria_label_value); + } + + if (dirty[0] & /*scrollbarWidth*/ 33554432) { + set_style(div11, "padding-inline-end", /*scrollbarWidth*/ ctx[25] + "px"); + } + + if (dirty[0] & /*i18n*/ 1 && section_aria_label_value !== (section_aria_label_value = /*i18n*/ ctx[0].regionLabel)) { + attr(section, "aria-label", section_aria_label_value); + } + + if (dirty[0] & /*pickerStyle*/ 4194304) { + attr(section, "style", /*pickerStyle*/ ctx[22]); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(section); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].d(); + } + + /*div3_binding*/ ctx[49](null); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].d(); + } + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(); + } + + /*div10_binding*/ ctx[51](null); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + + /*button1_binding*/ ctx[52](null); + /*section_binding*/ ctx[53](null); + mounted = false; + run_all(dispose); + } + }; +} + +function instance($$self, $$props, $$invalidate) { + let { skinToneEmoji } = $$props; + let { i18n } = $$props; + let { database } = $$props; + let { customEmoji } = $$props; + let { customCategorySorting } = $$props; + let { emojiVersion } = $$props; + + // private + let initialLoad = true; + + let currentEmojis = []; + let currentEmojisWithCategories = []; // eslint-disable-line no-unused-vars + let rawSearchText = ''; + let searchText = ''; + let rootElement; + let baselineEmoji; + let tabpanelElement; + let searchMode = false; // eslint-disable-line no-unused-vars + let activeSearchItem = -1; + let message; // eslint-disable-line no-unused-vars + let skinTonePickerExpanded = false; + let skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars + let skinToneDropdown; + let currentSkinTone = 0; + let activeSkinTone = 0; + let skinToneButtonText; // eslint-disable-line no-unused-vars + let pickerStyle; // eslint-disable-line no-unused-vars + let skinToneButtonLabel = ''; // eslint-disable-line no-unused-vars + let skinTones = []; + let currentFavorites = []; // eslint-disable-line no-unused-vars + let defaultFavoriteEmojis; + let numColumns = DEFAULT_NUM_COLUMNS; + let isRtl = false; // eslint-disable-line no-unused-vars + let scrollbarWidth = 0; // eslint-disable-line no-unused-vars + let currentGroupIndex = 0; + let groups$1 = groups; + let currentGroup; + let databaseLoaded = false; // eslint-disable-line no-unused-vars + let activeSearchItemId; // eslint-disable-line no-unused-vars + + // + // Utils/helpers + // + const focus = id => { + rootElement.getRootNode().getElementById(id).focus(); + }; + + // fire a custom event that crosses the shadow boundary + const fireEvent = (name, detail) => { + rootElement.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true })); + }; + + // eslint-disable-next-line no-unused-vars + const unicodeWithSkin = (emoji, currentSkinTone) => currentSkinTone && emoji.skins && emoji.skins[currentSkinTone] || emoji.unicode; + + // eslint-disable-next-line no-unused-vars + const labelWithSkin = (emoji, currentSkinTone) => uniq([ + emoji.name || unicodeWithSkin(emoji, currentSkinTone), + ...emoji.shortcodes || [] + ]).join(', '); + + // Detect a skintone option button + const isSkinToneOption = element => (/^skintone-/).test(element.id); + + // + // Determine the emoji support level (in requestIdleCallback) + // + onMount(() => { + if (!emojiVersion) { + detectEmojiSupportLevel().then(level => { + // Can't actually test emoji support in Jest/JSDom, emoji never render in color in Cairo + /* istanbul ignore next */ + if (!level) { + $$invalidate(18, message = i18n.emojiUnsupportedMessage); + } + }); + } + }); + + // + // Calculate the width of the emoji grid. This serves two purposes: + // 1) Re-calculate the --num-columns var because it may have changed + // 2) Re-calculate the scrollbar width because it may have changed + // (i.e. because the number of items changed) + // 3) Re-calculate whether we're in RTL mode or not. + // + // The benefit of doing this in one place is to align with rAF/ResizeObserver + // and do all the calculations in one go. RTL vs LTR is not strictly width-related, + // but since we're already reading the style here, and since it's already aligned with + // the rAF loop, this is the most appropriate place to do it perf-wise. + // + // eslint-disable-next-line no-unused-vars + function calculateEmojiGridStyle(node) { + return calculateWidth(node, width => { + /* istanbul ignore next */ + if ("production" !== 'test') { + // jsdom throws errors for this kind of fancy stuff + // read all the style/layout calculations we need to make + const style = getComputedStyle(rootElement); + + const newNumColumns = parseInt(style.getPropertyValue('--num-columns'), 10); + const newIsRtl = style.getPropertyValue('direction') === 'rtl'; + const parentWidth = node.parentElement.getBoundingClientRect().width; + const newScrollbarWidth = parentWidth - width; + + // write to Svelte variables + $$invalidate(47, numColumns = newNumColumns); + + $$invalidate(25, scrollbarWidth = newScrollbarWidth); // eslint-disable-line no-unused-vars + $$invalidate(24, isRtl = newIsRtl); // eslint-disable-line no-unused-vars + } + }); + } + + function checkZwjSupportAndUpdate(zwjEmojisToCheck) { + const rootNode = rootElement.getRootNode(); + const emojiToDomNode = emoji => rootNode.getElementById(`emo-${emoji.id}`); + checkZwjSupport(zwjEmojisToCheck, baselineEmoji, emojiToDomNode); + + // force update + $$invalidate(1, currentEmojis = currentEmojis); // eslint-disable-line no-self-assign + } + + function isZwjSupported(emoji) { + return !emoji.unicode || !hasZwj(emoji) || supportedZwjEmojis.get(emoji.unicode); + } + + async function filterEmojisByVersion(emojis) { + const emojiSupportLevel = emojiVersion || await detectEmojiSupportLevel(); + + // !version corresponds to custom emoji + return emojis.filter(({ version }) => !version || version <= emojiSupportLevel); + } + + async function summarizeEmojis(emojis) { + return summarizeEmojisForUI(emojis, emojiVersion || await detectEmojiSupportLevel()); + } + + async function getEmojisByGroup(group) { + + // -1 is custom emoji + const emoji = group === -1 + ? customEmoji + : await database.getEmojiByGroup(group); + + return summarizeEmojis(await filterEmojisByVersion(emoji)); + } + + async function getEmojisBySearchQuery(query) { + return summarizeEmojis(await filterEmojisByVersion(await database.getEmojiBySearchQuery(query))); + } + + // eslint-disable-next-line no-unused-vars + function onSearchKeydown(event) { + if (!searchMode || !currentEmojis.length) { + return; + } + + const goToNextOrPrevious = previous => { + halt(event); + $$invalidate(5, activeSearchItem = incrementOrDecrement(previous, activeSearchItem, currentEmojis)); + }; + + switch (event.key) { + case 'ArrowDown': + return goToNextOrPrevious(false); + case 'ArrowUp': + return goToNextOrPrevious(true); + case 'Enter': + if (activeSearchItem !== -1) { + halt(event); + return clickEmoji(currentEmojis[activeSearchItem].id); + } else if (currentEmojis.length) { + $$invalidate(5, activeSearchItem = 0); + } + } + } + + // + // Handle user input on nav + // + // eslint-disable-next-line no-unused-vars + function onNavClick(group) { + $$invalidate(2, rawSearchText = ''); + $$invalidate(45, searchText = ''); + $$invalidate(5, activeSearchItem = -1); + $$invalidate(11, currentGroupIndex = groups$1.findIndex(_ => _.id === group.id)); + } + + // eslint-disable-next-line no-unused-vars + function onNavKeydown(event) { + const { target, key } = event; + + const doFocus = el => { + if (el) { + halt(event); + el.focus(); + } + }; + + switch (key) { + case 'ArrowLeft': + return doFocus(target.previousSibling); + case 'ArrowRight': + return doFocus(target.nextSibling); + case 'Home': + return doFocus(target.parentElement.firstChild); + case 'End': + return doFocus(target.parentElement.lastChild); + } + } + + // + // Handle user input on an emoji + // + async function clickEmoji(unicodeOrName) { + const emoji = await database.getEmojiByUnicodeOrName(unicodeOrName); + const emojiSummary = [...currentEmojis, ...currentFavorites].find(_ => _.id === unicodeOrName); + const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, currentSkinTone); + await database.incrementFavoriteEmojiCount(unicodeOrName); + + fireEvent('emoji-click', { + emoji, + skinTone: currentSkinTone, + ...skinTonedUnicode && { unicode: skinTonedUnicode }, + ...emojiSummary.name && { name: emojiSummary.name } + }); + } + + // eslint-disable-next-line no-unused-vars + async function onEmojiClick(event) { + const { target } = event; + + if (!target.classList.contains('emoji')) { + return; + } + + halt(event); + const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix + + /* no await */ + clickEmoji(id); + } + + // + // Handle user input on the skintone picker + // + // eslint-disable-next-line no-unused-vars + async function onSkinToneOptionsClick(event) { + const { target } = event; + + if (!isSkinToneOption(target)) { + return; + } + + halt(event); + const skinTone = parseInt(target.id.slice(9), 10); // remove 'skintone-' prefix + $$invalidate(8, currentSkinTone = skinTone); + $$invalidate(6, skinTonePickerExpanded = false); + focus('skintone-button'); + fireEvent('skin-tone-change', { skinTone }); + + /* no await */ + database.setPreferredSkinTone(skinTone); + } + + // eslint-disable-next-line no-unused-vars + async function onClickSkinToneButton(event) { + $$invalidate(6, skinTonePickerExpanded = !skinTonePickerExpanded); + $$invalidate(20, activeSkinTone = currentSkinTone); + + if (skinTonePickerExpanded) { + halt(event); + rAF(() => focus(`skintone-${activeSkinTone}`)); + } + } + + // eslint-disable-next-line no-unused-vars + function onSkinToneOptionsKeydown(event) { + if (!skinTonePickerExpanded) { + return; + } + + const changeActiveSkinTone = async nextSkinTone => { + halt(event); + $$invalidate(20, activeSkinTone = nextSkinTone); + await tick(); + focus(`skintone-${activeSkinTone}`); + }; + + switch (event.key) { + case 'ArrowUp': + return changeActiveSkinTone(incrementOrDecrement(true, activeSkinTone, skinTones)); + case 'ArrowDown': + return changeActiveSkinTone(incrementOrDecrement(false, activeSkinTone, skinTones)); + case 'Home': + return changeActiveSkinTone(0); + case 'End': + return changeActiveSkinTone(skinTones.length - 1); + case 'Enter': + // enter on keydown, space on keyup. this is just how browsers work for buttons + // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html + return onSkinToneOptionsClick(event); + case 'Escape': + halt(event); + $$invalidate(6, skinTonePickerExpanded = false); + return focus('skintone-button'); + } + } + + // eslint-disable-next-line no-unused-vars + function onSkinToneOptionsKeyup(event) { + if (!skinTonePickerExpanded) { + return; + } + + switch (event.key) { + case ' ': + // enter on keydown, space on keyup. this is just how browsers work for buttons + // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html + return onSkinToneOptionsClick(event); + } + } + + // eslint-disable-next-line no-unused-vars + async function onSkinToneOptionsFocusOut(event) { + // On blur outside of the skintone options, collapse the skintone picker. + // Except if focus is just moving to another skintone option, e.g. pressing up/down to change focus + const { relatedTarget } = event; + + if (!relatedTarget || !isSkinToneOption(relatedTarget)) { + $$invalidate(6, skinTonePickerExpanded = false); + } + } + + function input_input_handler() { + rawSearchText = this.value; + $$invalidate(2, rawSearchText); + } + + function div3_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + skinToneDropdown = $$value; + $$invalidate(7, skinToneDropdown); + }); + } + + const click_handler = group => onNavClick(group); + + function div10_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + tabpanelElement = $$value; + $$invalidate(3, tabpanelElement); + }); + } + + function button1_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + baselineEmoji = $$value; + $$invalidate(17, baselineEmoji); + }); + } + + function section_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + rootElement = $$value; + $$invalidate(16, rootElement); + }); + } + + $$self.$$set = $$props => { + if ('skinToneEmoji' in $$props) $$invalidate(40, skinToneEmoji = $$props.skinToneEmoji); + if ('i18n' in $$props) $$invalidate(0, i18n = $$props.i18n); + if ('database' in $$props) $$invalidate(39, database = $$props.database); + if ('customEmoji' in $$props) $$invalidate(41, customEmoji = $$props.customEmoji); + if ('customCategorySorting' in $$props) $$invalidate(42, customCategorySorting = $$props.customCategorySorting); + if ('emojiVersion' in $$props) $$invalidate(43, emojiVersion = $$props.emojiVersion); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty[1] & /*customEmoji, database*/ 1280) { + /* eslint-enable no-unused-vars */ + // + // Set or update the customEmoji + // + { + if (customEmoji && database) { + $$invalidate(39, database.customEmoji = customEmoji, database); + } + } + } + + if ($$self.$$.dirty[0] & /*i18n*/ 1 | $$self.$$.dirty[1] & /*database*/ 256) { + // + // Set or update the database object + // + { + // show a Loading message if it takes a long time, or show an error if there's a network/IDB error + async function handleDatabaseLoading() { + let showingLoadingMessage = false; + + const timeoutHandle = setTimeout( + () => { + showingLoadingMessage = true; + $$invalidate(18, message = i18n.loadingMessage); + }, + TIMEOUT_BEFORE_LOADING_MESSAGE + ); + + try { + await database.ready(); + $$invalidate(14, databaseLoaded = true); // eslint-disable-line no-unused-vars + } catch(err) { + console.error(err); + $$invalidate(18, message = i18n.networkErrorMessage); + } finally { + clearTimeout(timeoutHandle); + + if (showingLoadingMessage) { + // Seems safer than checking the i18n string, which may change + showingLoadingMessage = false; + + $$invalidate(18, message = ''); // eslint-disable-line no-unused-vars + } + } + } + + if (database) { + /* no await */ + handleDatabaseLoading(); + } + } + } + + if ($$self.$$.dirty[0] & /*groups, currentGroupIndex*/ 6144 | $$self.$$.dirty[1] & /*customEmoji*/ 1024) { + { + if (customEmoji && customEmoji.length) { + $$invalidate(12, groups$1 = [customGroup, ...groups]); + } else if (groups$1 !== groups) { + if (currentGroupIndex) { + // If the current group is anything other than "custom" (which is first), decrement. + // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji + $$invalidate(11, currentGroupIndex--, currentGroupIndex); + } + + $$invalidate(12, groups$1 = groups); + } + } + } + + if ($$self.$$.dirty[0] & /*rawSearchText*/ 4) { + /* eslint-enable no-unused-vars */ + // + // Handle user input on the search input + // + { + rIC(() => { + $$invalidate(45, searchText = (rawSearchText || '').trim()); // defer to avoid input delays, plus we can trim here + $$invalidate(5, activeSearchItem = -1); + }); + } + } + + if ($$self.$$.dirty[0] & /*groups, currentGroupIndex*/ 6144) { + // + // Update the current group based on the currentGroupIndex + // + $$invalidate(13, currentGroup = groups$1[currentGroupIndex]); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded, currentGroup*/ 24576 | $$self.$$.dirty[1] & /*searchText*/ 16384) { + // + // Set or update the currentEmojis. Check for invalid ZWJ renderings + // (i.e. double emoji). + // + { + async function updateEmojis() { + + if (!databaseLoaded) { + $$invalidate(1, currentEmojis = []); + $$invalidate(4, searchMode = false); + } else if (searchText.length >= MIN_SEARCH_TEXT_LENGTH) { + const currentSearchText = searchText; + const newEmojis = await getEmojisBySearchQuery(currentSearchText); + + if (currentSearchText === searchText) { + // if the situation changes asynchronously, do not update + $$invalidate(1, currentEmojis = newEmojis); + + $$invalidate(4, searchMode = true); + } + } else if (currentGroup) { + const currentGroupId = currentGroup.id; + const newEmojis = await getEmojisByGroup(currentGroupId); + + if (currentGroupId === currentGroup.id) { + // if the situation changes asynchronously, do not update + $$invalidate(1, currentEmojis = newEmojis); + + $$invalidate(4, searchMode = false); + } + } + } + + /* no await */ + updateEmojis(); + } + } + + if ($$self.$$.dirty[0] & /*groups, searchMode*/ 4112) { + // + // Global styles for the entire picker + // + /* eslint-disable no-unused-vars */ + $$invalidate(22, pickerStyle = ` + --num-groups: ${groups$1.length}; + --indicator-opacity: ${searchMode ? 0 : 1}; + --num-skintones: ${NUM_SKIN_TONES};`); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database*/ 256) { + // + // Set or update the preferred skin tone + // + { + async function updatePreferredSkinTone() { + if (databaseLoaded) { + $$invalidate(8, currentSkinTone = await database.getPreferredSkinTone()); + } + } + + /* no await */ + updatePreferredSkinTone(); + } + } + + if ($$self.$$.dirty[1] & /*skinToneEmoji*/ 512) { + $$invalidate(9, skinTones = Array(NUM_SKIN_TONES).fill().map((_, i) => applySkinTone(skinToneEmoji, i))); + } + + if ($$self.$$.dirty[0] & /*skinTones, currentSkinTone*/ 768) { + /* eslint-disable no-unused-vars */ + $$invalidate(21, skinToneButtonText = skinTones[currentSkinTone]); + } + + if ($$self.$$.dirty[0] & /*i18n, currentSkinTone*/ 257) { + $$invalidate(23, skinToneButtonLabel = i18n.skinToneLabel.replace('{skinTone}', i18n.skinTones[currentSkinTone])); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database*/ 256) { + /* eslint-enable no-unused-vars */ + // + // Set or update the favorites emojis + // + { + async function updateDefaultFavoriteEmojis() { + $$invalidate(46, defaultFavoriteEmojis = (await Promise.all(MOST_COMMONLY_USED_EMOJI.map(unicode => database.getEmojiByUnicodeOrName(unicode)))).filter(Boolean)); // filter because in Jest tests we don't have all the emoji in the DB + } + + if (databaseLoaded) { + /* no await */ + updateDefaultFavoriteEmojis(); + } + } + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database, numColumns, defaultFavoriteEmojis*/ 98560) { + { + async function updateFavorites() { + const dbFavorites = await database.getTopFavoriteEmoji(numColumns); + const favorites = await summarizeEmojis(uniqBy([...dbFavorites, ...defaultFavoriteEmojis], _ => _.unicode || _.name).slice(0, numColumns)); + $$invalidate(10, currentFavorites = favorites); + } + + if (databaseLoaded && defaultFavoriteEmojis) { + /* no await */ + updateFavorites(); + } + } + } + + if ($$self.$$.dirty[0] & /*currentEmojis, tabpanelElement*/ 10 | $$self.$$.dirty[1] & /*emojiVersion*/ 4096) { + // Some emojis have their ligatures rendered as two or more consecutive emojis + // We want to treat these the same as unsupported emojis, so we compare their + // widths against the baseline widths and remove them as necessary + { + const zwjEmojisToCheck = currentEmojis.filter(emoji => emoji.unicode).filter(emoji => hasZwj(emoji) && !supportedZwjEmojis.has(emoji.unicode)); // filter custom emoji + + if (!emojiVersion && zwjEmojisToCheck.length) { + // render now, check their length later + rAF(() => checkZwjSupportAndUpdate(zwjEmojisToCheck)); + } else { + $$invalidate(1, currentEmojis = emojiVersion + ? currentEmojis + : currentEmojis.filter(isZwjSupported)); + + // Reset scroll top to 0 when emojis change + rAF(() => resetScrollTopIfPossible(tabpanelElement)); + } + } + } + + if ($$self.$$.dirty[0] & /*currentEmojis, currentFavorites*/ 1026 | $$self.$$.dirty[1] & /*initialLoad*/ 8192) { + { + // consider initialLoad to be complete when the first tabpanel and favorites are rendered + /* istanbul ignore next */ + if ("production" !== 'production' || false) { + if (currentEmojis.length && currentFavorites.length && initialLoad) { + $$invalidate(44, initialLoad = false); + requestPostAnimationFrame(() => (void 0)); + } + } + } + } + + if ($$self.$$.dirty[0] & /*searchMode, currentEmojis*/ 18 | $$self.$$.dirty[1] & /*customCategorySorting*/ 2048) { + // + // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there + // are no categories, because it's just easier to code the HTML this way. + // + { + function calculateCurrentEmojisWithCategories() { + if (searchMode) { + return [{ category: '', emojis: currentEmojis }]; + } + + const categoriesToEmoji = new Map(); + + for (const emoji of currentEmojis) { + const category = emoji.category || ''; + let emojis = categoriesToEmoji.get(category); + + if (!emojis) { + emojis = []; + categoriesToEmoji.set(category, emojis); + } + + emojis.push(emoji); + } + + return [...categoriesToEmoji.entries()].map(([category, emojis]) => ({ category, emojis })).sort((a, b) => customCategorySorting(a.category, b.category)); + } + + // eslint-disable-next-line no-unused-vars + $$invalidate(15, currentEmojisWithCategories = calculateCurrentEmojisWithCategories()); + } + } + + if ($$self.$$.dirty[0] & /*activeSearchItem, currentEmojis*/ 34) { + // + // Handle active search item (i.e. pressing up or down while searching) + // + /* eslint-disable no-unused-vars */ + $$invalidate(26, activeSearchItemId = activeSearchItem !== -1 && currentEmojis[activeSearchItem].id); + } + + if ($$self.$$.dirty[0] & /*skinTonePickerExpanded, skinToneDropdown*/ 192) { + // To make the animation nicer, change the z-index of the skintone picker button + // *after* the animation has played. This makes it appear that the picker box + // is expanding "below" the button + { + if (skinTonePickerExpanded) { + skinToneDropdown.addEventListener( + 'transitionend', + () => { + $$invalidate(19, skinTonePickerExpandedAfterAnimation = true); // eslint-disable-line no-unused-vars + }, + { once: true } + ); + } else { + $$invalidate(19, skinTonePickerExpandedAfterAnimation = false); // eslint-disable-line no-unused-vars + } + } + } + }; + + return [ + i18n, + currentEmojis, + rawSearchText, + tabpanelElement, + searchMode, + activeSearchItem, + skinTonePickerExpanded, + skinToneDropdown, + currentSkinTone, + skinTones, + currentFavorites, + currentGroupIndex, + groups$1, + currentGroup, + databaseLoaded, + currentEmojisWithCategories, + rootElement, + baselineEmoji, + message, + skinTonePickerExpandedAfterAnimation, + activeSkinTone, + skinToneButtonText, + pickerStyle, + skinToneButtonLabel, + isRtl, + scrollbarWidth, + activeSearchItemId, + unicodeWithSkin, + labelWithSkin, + calculateEmojiGridStyle, + onSearchKeydown, + onNavClick, + onNavKeydown, + onEmojiClick, + onSkinToneOptionsClick, + onClickSkinToneButton, + onSkinToneOptionsKeydown, + onSkinToneOptionsKeyup, + onSkinToneOptionsFocusOut, + database, + skinToneEmoji, + customEmoji, + customCategorySorting, + emojiVersion, + initialLoad, + searchText, + defaultFavoriteEmojis, + numColumns, + input_input_handler, + div3_binding, + click_handler, + div10_binding, + button1_binding, + section_binding + ]; +} + +class Picker extends SvelteComponent { + constructor(options) { + super(); + + init( + this, + options, + instance, + create_fragment, + safe_not_equal, + { + skinToneEmoji: 40, + i18n: 0, + database: 39, + customEmoji: 41, + customCategorySorting: 42, + emojiVersion: 43 + }, + null, + [-1, -1, -1] + ); + } +} + +const DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json'; +const DEFAULT_LOCALE = 'en'; + +var enI18n = { + categoriesLabel: 'Categories', + emojiUnsupportedMessage: 'Your browser does not support color emoji.', + favoritesLabel: 'Favorites', + loadingMessage: 'Loadingโ€ฆ', + networkErrorMessage: 'Could not load emoji.', + regionLabel: 'Emoji picker', + searchDescription: 'When search results are available, press up or down to select and enter to choose.', + searchLabel: 'Search', + searchResultsLabel: 'Search results', + skinToneDescription: 'When expanded, press up or down to select and enter to choose.', + skinToneLabel: 'Choose a skin tone (currently {skinTone})', + skinTonesLabel: 'Skin tones', + skinTones: [ + 'Default', + 'Light', + 'Medium-Light', + 'Medium', + 'Medium-Dark', + 'Dark' + ], + categories: { + custom: 'Custom', + 'smileys-emotion': 'Smileys and emoticons', + 'people-body': 'People and body', + 'animals-nature': 'Animals and nature', + 'food-drink': 'Food and drink', + 'travel-places': 'Travel and places', + activities: 'Activities', + objects: 'Objects', + symbols: 'Symbols', + flags: 'Flags' + } +}; + +const PROPS = [ + 'customEmoji', + 'customCategorySorting', + 'database', + 'dataSource', + 'i18n', + 'locale', + 'skinToneEmoji', + 'emojiVersion' +]; + +// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place +const EXTRA_STYLES = `:host{--emoji-font-family:${FONT_FAMILY}}`; + +class PickerElement extends HTMLElement { + constructor (props) { + super(); + this.attachShadow({ mode: 'open' }); + const style = document.createElement('style'); + style.textContent = ":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.custom-emoji,.emoji,button.emoji{height:var(--total-emoji-size);width:var(--total-emoji-size)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.custom-emoji{padding:var(--emoji-padding);object-fit:contain;pointer-events:none;background-repeat:no-repeat;background-position:center center;background-size:var(--emoji-size) var(--emoji-size)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}" + EXTRA_STYLES; + this.shadowRoot.appendChild(style); + this._ctx = { + // Set defaults + locale: DEFAULT_LOCALE, + dataSource: DEFAULT_DATA_SOURCE, + skinToneEmoji: DEFAULT_SKIN_TONE_EMOJI, + customCategorySorting: DEFAULT_CATEGORY_SORTING, + customEmoji: null, + i18n: enI18n, + emojiVersion: null, + ...props + }; + // Handle properties set before the element was upgraded + for (const prop of PROPS) { + if (prop !== 'database' && Object.prototype.hasOwnProperty.call(this, prop)) { + this._ctx[prop] = this[prop]; + delete this[prop]; + } + } + this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute + } + + connectedCallback () { + // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case, + // do nothing (preserve the state) + if (!this._cmp) { + this._cmp = new Picker({ + target: this.shadowRoot, + props: this._ctx + }); + } + } + + disconnectedCallback () { + // Check in a microtask if the element is still connected. If so, treat this as a "move" rather than a disconnect + // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue + Promise.resolve().then(() => { + // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously + if (!this.isConnected && this._cmp) { + this._cmp.$destroy(); + this._cmp = undefined; + + const { database } = this._ctx; + database.close() + // only happens if the database failed to load in the first place, so we don't care + .catch(err => console.error(err)); + } + }); + } + + static get observedAttributes () { + return ['locale', 'data-source', 'skin-tone-emoji', 'emoji-version'] // complex objects aren't supported, also use kebab-case + } + + attributeChangedCallback (attrName, oldValue, newValue) { + this._set( + // convert from kebab-case to camelcase + // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015 + attrName.replace(/-([a-z])/g, (_, up) => up.toUpperCase()), + // convert string attribute to float if necessary + attrName === 'emoji-version' ? parseFloat(newValue) : newValue + ); + } + + _set (prop, newValue) { + this._ctx[prop] = newValue; + if (this._cmp) { + this._cmp.$set({ [prop]: newValue }); + } + if (['locale', 'dataSource'].includes(prop)) { + this._dbFlush(); + } + } + + _dbCreate () { + const { locale, dataSource, database } = this._ctx; + // only create a new database if we really need to + if (!database || database.locale !== locale || database.dataSource !== dataSource) { + this._set('database', new Database({ locale, dataSource })); + } + } + + // Update the Database in one microtask if the locale/dataSource change. We do one microtask + // so we don't create two Databases if e.g. both the locale and the dataSource change + _dbFlush () { + Promise.resolve().then(() => ( + this._dbCreate() + )); + } +} + +const definitions = {}; + +for (const prop of PROPS) { + definitions[prop] = { + get () { + if (prop === 'database') { + // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB + // now if the user is asking for it + this._dbCreate(); + } + return this._ctx[prop] + }, + set (val) { + if (prop === 'database') { + throw new Error('database is read-only') + } + this._set(prop, val); + } + }; +} + +Object.defineProperties(PickerElement.prototype, definitions); + +/* istanbul ignore else */ +if (!customElements.get('emoji-picker')) { // if already defined, do nothing (e.g. same script imported twice) + customElements.define('emoji-picker', PickerElement); +} + +export { PickerElement as default }; diff --git a/app/static/scripts/emoji-picker-element/svelte.js b/app/static/scripts/emoji-picker-element/svelte.js new file mode 100644 index 0000000..ddc68ff --- /dev/null +++ b/app/static/scripts/emoji-picker-element/svelte.js @@ -0,0 +1,2294 @@ +import { SvelteComponent, init, safe_not_equal, element, text, attr, set_style, insert, append, set_input_value, listen, action_destroyer, set_data, update_keyed_each, destroy_block, noop, detach, run_all, globals, binding_callbacks, src_url_equal } from 'svelte/internal'; +import { onMount, tick } from 'svelte'; +import Database from './database.js'; + +// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json +const allGroups = [ + [-1, 'โœจ', 'custom'], + [0, '๐Ÿ˜€', 'smileys-emotion'], + [1, '๐Ÿ‘‹', 'people-body'], + [3, '๐Ÿฑ', 'animals-nature'], + [4, '๐ŸŽ', 'food-drink'], + [5, '๐Ÿ ๏ธ', 'travel-places'], + [6, 'โšฝ', 'activities'], + [7, '๐Ÿ“', 'objects'], + [8, 'โ›”๏ธ', 'symbols'], + [9, '๐Ÿ', 'flags'] +].map(([id, emoji, name]) => ({ id, emoji, name })); + +const groups = allGroups.slice(1); +const customGroup = allGroups[0]; + +const MIN_SEARCH_TEXT_LENGTH = 2; +const NUM_SKIN_TONES = 6; + +/* istanbul ignore next */ +const rIC = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout; + +// check for ZWJ (zero width joiner) character +function hasZwj (emoji) { + return emoji.unicode.includes('\u200d') +} + +// Find one good representative emoji from each version to test by checking its color. +// Ideally it should have color in the center. For some inspiration, see: +// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/ +// +// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because +// all the emoji from this version are compound-emoji from previous versions. So they would pass a color +// test, even in browsers that display them as double emoji. (E.g. "face in clouds" might render as +// "face without mouth" plus "fog".) These emoji can only be filtered using the width test, +// which happens in checkZwjSupport.js. +const versionsAndTestEmoji = { + '๐Ÿซ ': 14, + '๐Ÿฅฒ': 13.1, // smiling face with tear, technically from v13 but see note above + '๐Ÿฅป': 12.1, // sari, technically from v12 but see note above + '๐Ÿฅฐ': 11, + '๐Ÿคฉ': 5, + '๐Ÿ‘ฑโ€โ™€๏ธ': 4, + '๐Ÿคฃ': 3, + '๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ': 2, + '๐Ÿ˜€': 1, + '๐Ÿ˜๏ธ': 0.7, + '๐Ÿ˜ƒ': 0.6 +}; + +const TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second +const DEFAULT_SKIN_TONE_EMOJI = '๐Ÿ–๏ธ'; +const DEFAULT_NUM_COLUMNS = 8; + +// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and +// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with +// a bit of my own curation. (E.g. avoid the "OK" gesture because of connotations: +// https://emojipedia.org/ok-hand/) +const MOST_COMMONLY_USED_EMOJI = [ + '๐Ÿ˜Š', + '๐Ÿ˜’', + 'โ™ฅ๏ธ', + '๐Ÿ‘๏ธ', + '๐Ÿ˜', + '๐Ÿ˜‚', + '๐Ÿ˜ญ', + 'โ˜บ๏ธ', + '๐Ÿ˜”', + '๐Ÿ˜ฉ', + '๐Ÿ˜', + '๐Ÿ’•', + '๐Ÿ™Œ', + '๐Ÿ˜˜' +]; + +// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their +// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla +// updates faster than the underlying OS, and we don't want to render older emoji in one font and +// newer emoji in another font: +// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283 +const FONT_FAMILY = '"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol",' + + '"Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif'; + +/* istanbul ignore next */ +const DEFAULT_CATEGORY_SORTING = (a, b) => a < b ? -1 : a > b ? 1 : 0; + +// Test if an emoji is supported by rendering it to canvas and checking that the color is not black + +const getTextFeature = (text, color) => { + const canvas = document.createElement('canvas'); + canvas.width = canvas.height = 1; + + const ctx = canvas.getContext('2d'); + ctx.textBaseline = 'top'; + ctx.font = `100px ${FONT_FAMILY}`; + ctx.fillStyle = color; + ctx.scale(0.01, 0.01); + ctx.fillText(text, 0, 0); + + return ctx.getImageData(0, 0, 1, 1).data +}; + +const compareFeatures = (feature1, feature2) => { + const feature1Str = [...feature1].join(','); + const feature2Str = [...feature2].join(','); + // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes. + // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is + // 0,0,0,61 - there is a transparency here. + return feature1Str === feature2Str && !feature1Str.startsWith('0,0,0,') +}; + +function testColorEmojiSupported (text) { + // Render white and black and then compare them to each other and ensure they're the same + // color, and neither one is black. This shows that the emoji was rendered in color. + const feature1 = getTextFeature(text, '#000'); + const feature2 = getTextFeature(text, '#fff'); + return feature1 && feature2 && compareFeatures(feature1, feature2) +} + +// rather than check every emoji ever, which would be expensive, just check some representatives from the + +function determineEmojiSupportLevel () { + const entries = Object.entries(versionsAndTestEmoji); + try { + // start with latest emoji and work backwards + for (const [emoji, version] of entries) { + if (testColorEmojiSupported(emoji)) { + return version + } + } + } catch (e) { // canvas error + } finally { + } + // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors + // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all. + return entries[0][1] // first one in the list is the most recent version +} + +// Check which emojis we know for sure aren't supported, based on Unicode version level +let promise; +const detectEmojiSupportLevel = () => { + if (!promise) { + // Delay so it can run while the IDB database is being created by the browser (on another thread). + // This helps especially with first load โ€“ we want to start pre-populating the database on the main thread, + // and then wait for IDB to commit everything, and while waiting we run this check. + promise = new Promise(resolve => ( + rIC(() => ( + resolve(determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating + )) + )); + } + return promise +}; +// determine which emojis containing ZWJ (zero width joiner) characters +// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs) +const supportedZwjEmojis = new Map(); + +const VARIATION_SELECTOR = '\ufe0f'; +const SKINTONE_MODIFIER = '\ud83c'; +const ZWJ = '\u200d'; +const LIGHT_SKIN_TONE = 0x1F3FB; +const LIGHT_SKIN_TONE_MODIFIER = 0xdffb; + +// TODO: this is a naive implementation, we can improve it later +// It's only used for the skintone picker, so as long as people don't customize with +// really exotic emoji then it should work fine +function applySkinTone (str, skinTone) { + if (skinTone === 0) { + return str + } + const zwjIndex = str.indexOf(ZWJ); + if (zwjIndex !== -1) { + return str.substring(0, zwjIndex) + + String.fromCodePoint(LIGHT_SKIN_TONE + skinTone - 1) + + str.substring(zwjIndex) + } + if (str.endsWith(VARIATION_SELECTOR)) { + str = str.substring(0, str.length - 1); + } + return str + SKINTONE_MODIFIER + String.fromCodePoint(LIGHT_SKIN_TONE_MODIFIER + skinTone - 1) +} + +function halt (event) { + event.preventDefault(); + event.stopPropagation(); +} + +// Implementation left/right or up/down navigation, circling back when you +// reach the start/end of the list +function incrementOrDecrement (decrement, val, arr) { + val += (decrement ? -1 : 1); + if (val < 0) { + val = arr.length - 1; + } else if (val >= arr.length) { + val = 0; + } + return val +} + +// like lodash's uniqBy but much smaller +function uniqBy (arr, func) { + const set = new Set(); + const res = []; + for (const item of arr) { + const key = func(item); + if (!set.has(key)) { + set.add(key); + res.push(item); + } + } + return res +} + +// We don't need all the data on every emoji, and there are specific things we need +// for the UI, so build a "view model" from the emoji object we got from the database + +function summarizeEmojisForUI (emojis, emojiSupportLevel) { + const toSimpleSkinsMap = skins => { + const res = {}; + for (const skin of skins) { + // ignore arrays like [1, 2] with multiple skin tones + // also ignore variants that are in an unsupported emoji version + // (these do exist - variants from a different version than their base emoji) + if (typeof skin.tone === 'number' && skin.version <= emojiSupportLevel) { + res[skin.tone] = skin.unicode; + } + } + return res + }; + + return emojis.map(({ unicode, skins, shortcodes, url, name, category }) => ({ + unicode, + name, + shortcodes, + url, + category, + id: unicode || name, + skins: skins && toSimpleSkinsMap(skins), + title: (shortcodes || []).join(', ') + })) +} + +// import rAF from one place so that the bundle size is a bit smaller +const rAF = requestAnimationFrame; + +// Svelte action to calculate the width of an element and auto-update + +let resizeObserverSupported = typeof ResizeObserver === 'function'; + +function calculateWidth (node, onUpdate) { + let resizeObserver; + if (resizeObserverSupported) { + resizeObserver = new ResizeObserver(entries => ( + onUpdate(entries[0].contentRect.width) + )); + resizeObserver.observe(node); + } else { // just set the width once, don't bother trying to track it + rAF(() => ( + onUpdate(node.getBoundingClientRect().width) + )); + } + + // cleanup function (called on destroy) + return { + destroy () { + if (resizeObserver) { + resizeObserver.disconnect(); + } + } + } +} + +// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742 +function calculateTextWidth (node) { + /* istanbul ignore else */ + { + const range = document.createRange(); + range.selectNode(node.firstChild); + return range.getBoundingClientRect().width + } +} + +let baselineEmojiWidth; + +function checkZwjSupport (zwjEmojisToCheck, baselineEmoji, emojiToDomNode) { + for (const emoji of zwjEmojisToCheck) { + const domNode = emojiToDomNode(emoji); + const emojiWidth = calculateTextWidth(domNode); + if (typeof baselineEmojiWidth === 'undefined') { // calculate the baseline emoji width only once + baselineEmojiWidth = calculateTextWidth(baselineEmoji); + } + // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard + // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with + // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.) + // So here we set the threshold at 1.8 times the size of the baseline emoji. + const supported = emojiWidth / 1.8 < baselineEmojiWidth; + supportedZwjEmojis.set(emoji.unicode, supported); + } +} + +// Measure after style/layout are complete + +const requestPostAnimationFrame = callback => { + rAF(() => { + setTimeout(callback); + }); +}; + +// like lodash's uniq + +function uniq (arr) { + return uniqBy(arr, _ => _) +} + +// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the "setter" here. +// At best the invalidation is useless, at worst it can cause infinite loops: +// https://github.com/nolanlawson/emoji-picker-element/pull/180 +// https://github.com/sveltejs/svelte/issues/6521 +// Also note tabpanelElement can be null if the element is disconnected immediately after connected +function resetScrollTopIfPossible (element) { + if (element) { + element.scrollTop = 0; + } +} + +/* src/picker/components/Picker/Picker.svelte generated by Svelte v3.55.1 */ + +const { Map: Map_1 } = globals; + +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[64] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[67] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[64] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[70] = list[i]; + return child_ctx; +} + +function get_each_context_4(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[73] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +// (43:38) {#each skinTones as skinTone, i (skinTone)} +function create_each_block_4(key_1, ctx) { + let div; + let t_value = /*skinTone*/ ctx[73] + ""; + let t; + let div_id_value; + let div_class_value; + let div_aria_selected_value; + let div_title_value; + let div_aria_label_value; + + return { + key: key_1, + first: null, + c() { + div = element("div"); + t = text(t_value); + attr(div, "id", div_id_value = "skintone-" + /*i*/ ctx[66]); + + attr(div, "class", div_class_value = "emoji hide-focus " + (/*i*/ ctx[66] === /*activeSkinTone*/ ctx[20] + ? 'active' + : '')); + + attr(div, "aria-selected", div_aria_selected_value = /*i*/ ctx[66] === /*activeSkinTone*/ ctx[20]); + attr(div, "role", "option"); + attr(div, "title", div_title_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]]); + attr(div, "tabindex", "-1"); + attr(div, "aria-label", div_aria_label_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]]); + this.first = div; + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, t); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty[0] & /*skinTones*/ 512 && t_value !== (t_value = /*skinTone*/ ctx[73] + "")) set_data(t, t_value); + + if (dirty[0] & /*skinTones*/ 512 && div_id_value !== (div_id_value = "skintone-" + /*i*/ ctx[66])) { + attr(div, "id", div_id_value); + } + + if (dirty[0] & /*skinTones, activeSkinTone*/ 1049088 && div_class_value !== (div_class_value = "emoji hide-focus " + (/*i*/ ctx[66] === /*activeSkinTone*/ ctx[20] + ? 'active' + : ''))) { + attr(div, "class", div_class_value); + } + + if (dirty[0] & /*skinTones, activeSkinTone*/ 1049088 && div_aria_selected_value !== (div_aria_selected_value = /*i*/ ctx[66] === /*activeSkinTone*/ ctx[20])) { + attr(div, "aria-selected", div_aria_selected_value); + } + + if (dirty[0] & /*i18n, skinTones*/ 513 && div_title_value !== (div_title_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]])) { + attr(div, "title", div_title_value); + } + + if (dirty[0] & /*i18n, skinTones*/ 513 && div_aria_label_value !== (div_aria_label_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]])) { + attr(div, "aria-label", div_aria_label_value); + } + }, + d(detaching) { + if (detaching) detach(div); + } + }; +} + +// (53:33) {#each groups as group (group.id)} +function create_each_block_3(key_1, ctx) { + let button; + let div; + let t_value = /*group*/ ctx[70].emoji + ""; + let t; + let button_aria_controls_value; + let button_aria_label_value; + let button_aria_selected_value; + let button_title_value; + let mounted; + let dispose; + + function click_handler() { + return /*click_handler*/ ctx[50](/*group*/ ctx[70]); + } + + return { + key: key_1, + first: null, + c() { + button = element("button"); + div = element("div"); + t = text(t_value); + attr(div, "class", "nav-emoji emoji"); + attr(button, "role", "tab"); + attr(button, "class", "nav-button"); + attr(button, "aria-controls", button_aria_controls_value = "tab-" + /*group*/ ctx[70].id); + attr(button, "aria-label", button_aria_label_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name]); + attr(button, "aria-selected", button_aria_selected_value = !/*searchMode*/ ctx[4] && /*currentGroup*/ ctx[13].id === /*group*/ ctx[70].id); + attr(button, "title", button_title_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name]); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + append(button, div); + append(div, t); + + if (!mounted) { + dispose = listen(button, "click", click_handler); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty[0] & /*groups*/ 4096 && t_value !== (t_value = /*group*/ ctx[70].emoji + "")) set_data(t, t_value); + + if (dirty[0] & /*groups*/ 4096 && button_aria_controls_value !== (button_aria_controls_value = "tab-" + /*group*/ ctx[70].id)) { + attr(button, "aria-controls", button_aria_controls_value); + } + + if (dirty[0] & /*i18n, groups*/ 4097 && button_aria_label_value !== (button_aria_label_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name])) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*searchMode, currentGroup, groups*/ 12304 && button_aria_selected_value !== (button_aria_selected_value = !/*searchMode*/ ctx[4] && /*currentGroup*/ ctx[13].id === /*group*/ ctx[70].id)) { + attr(button, "aria-selected", button_aria_selected_value); + } + + if (dirty[0] & /*i18n, groups*/ 4097 && button_title_value !== (button_title_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name])) { + attr(button, "title", button_title_value); + } + }, + d(detaching) { + if (detaching) detach(button); + mounted = false; + dispose(); + } + }; +} + +// (94:100) {:else} +function create_else_block_1(ctx) { + let img; + let img_src_value; + + return { + c() { + img = element("img"); + attr(img, "class", "custom-emoji"); + if (!src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) attr(img, "src", img_src_value); + attr(img, "alt", ""); + attr(img, "loading", "lazy"); + }, + m(target, anchor) { + insert(target, img, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && !src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) { + attr(img, "src", img_src_value); + } + }, + d(detaching) { + if (detaching) detach(img); + } + }; +} + +// (94:40) {#if emoji.unicode} +function create_if_block_1(ctx) { + let t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + ""; + let t; + + return { + c() { + t = text(t_value); + }, + m(target, anchor) { + insert(target, t, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentEmojisWithCategories, currentSkinTone*/ 33024 && t_value !== (t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(t); + } + }; +} + +// (89:53) {#each emojiWithCategory.emojis as emoji, i (emoji.id)} +function create_each_block_2(key_1, ctx) { + let button; + let button_role_value; + let button_aria_selected_value; + let button_aria_label_value; + let button_title_value; + let button_class_value; + let button_id_value; + + function select_block_type(ctx, dirty) { + if (/*emoji*/ ctx[64].unicode) return create_if_block_1; + return create_else_block_1; + } + + let current_block_type = select_block_type(ctx); + let if_block = current_block_type(ctx); + + return { + key: key_1, + first: null, + c() { + button = element("button"); + if_block.c(); + attr(button, "role", button_role_value = /*searchMode*/ ctx[4] ? 'option' : 'menuitem'); + + attr(button, "aria-selected", button_aria_selected_value = /*searchMode*/ ctx[4] + ? /*i*/ ctx[66] == /*activeSearchItem*/ ctx[5] + : ''); + + attr(button, "aria-label", button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8])); + attr(button, "title", button_title_value = /*emoji*/ ctx[64].title); + + attr(button, "class", button_class_value = "emoji " + (/*searchMode*/ ctx[4] && /*i*/ ctx[66] === /*activeSearchItem*/ ctx[5] + ? 'active' + : '')); + + attr(button, "id", button_id_value = "emo-" + /*emoji*/ ctx[64].id); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + if_block.m(button, null); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(button, null); + } + } + + if (dirty[0] & /*searchMode*/ 16 && button_role_value !== (button_role_value = /*searchMode*/ ctx[4] ? 'option' : 'menuitem')) { + attr(button, "role", button_role_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem*/ 32816 && button_aria_selected_value !== (button_aria_selected_value = /*searchMode*/ ctx[4] + ? /*i*/ ctx[66] == /*activeSearchItem*/ ctx[5] + : '')) { + attr(button, "aria-selected", button_aria_selected_value); + } + + if (dirty[0] & /*currentEmojisWithCategories, currentSkinTone*/ 33024 && button_aria_label_value !== (button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]))) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && button_title_value !== (button_title_value = /*emoji*/ ctx[64].title)) { + attr(button, "title", button_title_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem*/ 32816 && button_class_value !== (button_class_value = "emoji " + (/*searchMode*/ ctx[4] && /*i*/ ctx[66] === /*activeSearchItem*/ ctx[5] + ? 'active' + : ''))) { + attr(button, "class", button_class_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && button_id_value !== (button_id_value = "emo-" + /*emoji*/ ctx[64].id)) { + attr(button, "id", button_id_value); + } + }, + d(detaching) { + if (detaching) detach(button); + if_block.d(); + } + }; +} + +// (70:36) {#each currentEmojisWithCategories as emojiWithCategory, i (emojiWithCategory.category)} +function create_each_block_1(key_1, ctx) { + let div0; + + let t_value = (/*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*emojiWithCategory*/ ctx[67].category + ? /*emojiWithCategory*/ ctx[67].category + : /*currentEmojisWithCategories*/ ctx[15].length > 1 + ? /*i18n*/ ctx[0].categories.custom + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]) + ""; + + let t; + let div0_id_value; + let div0_class_value; + let div1; + let each_blocks = []; + let each_1_lookup = new Map_1(); + let div1_role_value; + let div1_aria_labelledby_value; + let div1_id_value; + let each_value_2 = /*emojiWithCategory*/ ctx[67].emojis; + const get_key = ctx => /*emoji*/ ctx[64].id; + + for (let i = 0; i < each_value_2.length; i += 1) { + let child_ctx = get_each_context_2(ctx, each_value_2, i); + let key = get_key(child_ctx); + each_1_lookup.set(key, each_blocks[i] = create_each_block_2(key, child_ctx)); + } + + return { + key: key_1, + first: null, + c() { + div0 = element("div"); + t = text(t_value); + div1 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(div0, "id", div0_id_value = "menu-label-" + /*i*/ ctx[66]); + + attr(div0, "class", div0_class_value = "category " + (/*currentEmojisWithCategories*/ ctx[15].length === 1 && /*currentEmojisWithCategories*/ ctx[15][0].category === '' + ? 'gone' + : '')); + + attr(div0, "aria-hidden", "true"); + attr(div1, "class", "emoji-menu"); + attr(div1, "role", div1_role_value = /*searchMode*/ ctx[4] ? 'listbox' : 'menu'); + attr(div1, "aria-labelledby", div1_aria_labelledby_value = "menu-label-" + /*i*/ ctx[66]); + attr(div1, "id", div1_id_value = /*searchMode*/ ctx[4] ? 'search-results' : ''); + this.first = div0; + }, + m(target, anchor) { + insert(target, div0, anchor); + append(div0, t); + insert(target, div1, anchor); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (dirty[0] & /*searchMode, i18n, currentEmojisWithCategories, currentGroup*/ 40977 && t_value !== (t_value = (/*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*emojiWithCategory*/ ctx[67].category + ? /*emojiWithCategory*/ ctx[67].category + : /*currentEmojisWithCategories*/ ctx[15].length > 1 + ? /*i18n*/ ctx[0].categories.custom + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]) + "")) set_data(t, t_value); + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div0_id_value !== (div0_id_value = "menu-label-" + /*i*/ ctx[66])) { + attr(div0, "id", div0_id_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div0_class_value !== (div0_class_value = "category " + (/*currentEmojisWithCategories*/ ctx[15].length === 1 && /*currentEmojisWithCategories*/ ctx[15][0].category === '' + ? 'gone' + : ''))) { + attr(div0, "class", div0_class_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem, labelWithSkin, currentSkinTone, unicodeWithSkin*/ 402686256) { + each_value_2 = /*emojiWithCategory*/ ctx[67].emojis; + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value_2, each_1_lookup, div1, destroy_block, create_each_block_2, null, get_each_context_2); + } + + if (dirty[0] & /*searchMode*/ 16 && div1_role_value !== (div1_role_value = /*searchMode*/ ctx[4] ? 'listbox' : 'menu')) { + attr(div1, "role", div1_role_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div1_aria_labelledby_value !== (div1_aria_labelledby_value = "menu-label-" + /*i*/ ctx[66])) { + attr(div1, "aria-labelledby", div1_aria_labelledby_value); + } + + if (dirty[0] & /*searchMode*/ 16 && div1_id_value !== (div1_id_value = /*searchMode*/ ctx[4] ? 'search-results' : '')) { + attr(div1, "id", div1_id_value); + } + }, + d(detaching) { + if (detaching) detach(div0); + if (detaching) detach(div1); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + } + }; +} + +// (103:94) {:else} +function create_else_block(ctx) { + let img; + let img_src_value; + + return { + c() { + img = element("img"); + attr(img, "class", "custom-emoji"); + if (!src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) attr(img, "src", img_src_value); + attr(img, "alt", ""); + attr(img, "loading", "lazy"); + }, + m(target, anchor) { + insert(target, img, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentFavorites*/ 1024 && !src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) { + attr(img, "src", img_src_value); + } + }, + d(detaching) { + if (detaching) detach(img); + } + }; +} + +// (103:34) {#if emoji.unicode} +function create_if_block(ctx) { + let t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + ""; + let t; + + return { + c() { + t = text(t_value); + }, + m(target, anchor) { + insert(target, t, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentFavorites, currentSkinTone*/ 1280 && t_value !== (t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(t); + } + }; +} + +// (99:102) {#each currentFavorites as emoji, i (emoji.id)} +function create_each_block(key_1, ctx) { + let button; + let button_aria_label_value; + let button_title_value; + let button_id_value; + + function select_block_type_1(ctx, dirty) { + if (/*emoji*/ ctx[64].unicode) return create_if_block; + return create_else_block; + } + + let current_block_type = select_block_type_1(ctx); + let if_block = current_block_type(ctx); + + return { + key: key_1, + first: null, + c() { + button = element("button"); + if_block.c(); + attr(button, "role", "menuitem"); + attr(button, "aria-label", button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8])); + attr(button, "title", button_title_value = /*emoji*/ ctx[64].title); + attr(button, "class", "emoji"); + attr(button, "id", button_id_value = "fav-" + /*emoji*/ ctx[64].id); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + if_block.m(button, null); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(button, null); + } + } + + if (dirty[0] & /*currentFavorites, currentSkinTone*/ 1280 && button_aria_label_value !== (button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]))) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*currentFavorites*/ 1024 && button_title_value !== (button_title_value = /*emoji*/ ctx[64].title)) { + attr(button, "title", button_title_value); + } + + if (dirty[0] & /*currentFavorites*/ 1024 && button_id_value !== (button_id_value = "fav-" + /*emoji*/ ctx[64].id)) { + attr(button, "id", button_id_value); + } + }, + d(detaching) { + if (detaching) detach(button); + if_block.d(); + } + }; +} + +function create_fragment(ctx) { + let section; + let div0; + let div4; + let div1; + let input; + let input_placeholder_value; + let input_aria_expanded_value; + let input_aria_activedescendant_value; + let label; + let t0_value = /*i18n*/ ctx[0].searchLabel + ""; + let t0; + let span0; + let t1_value = /*i18n*/ ctx[0].searchDescription + ""; + let t1; + let div2; + let button0; + let t2; + let button0_class_value; + let div2_class_value; + let span1; + let t3_value = /*i18n*/ ctx[0].skinToneDescription + ""; + let t3; + let div3; + let each_blocks_3 = []; + let each0_lookup = new Map_1(); + let div3_class_value; + let div3_aria_label_value; + let div3_aria_activedescendant_value; + let div3_aria_hidden_value; + let div5; + let each_blocks_2 = []; + let each1_lookup = new Map_1(); + let div5_aria_label_value; + let div7; + let div6; + let div8; + let t4; + let div8_class_value; + let div10; + let div9; + let each_blocks_1 = []; + let each2_lookup = new Map_1(); + let div10_class_value; + let div10_role_value; + let div10_aria_label_value; + let div10_id_value; + let div11; + let each_blocks = []; + let each3_lookup = new Map_1(); + let div11_class_value; + let div11_aria_label_value; + let button1; + let section_aria_label_value; + let mounted; + let dispose; + let each_value_4 = /*skinTones*/ ctx[9]; + const get_key = ctx => /*skinTone*/ ctx[73]; + + for (let i = 0; i < each_value_4.length; i += 1) { + let child_ctx = get_each_context_4(ctx, each_value_4, i); + let key = get_key(child_ctx); + each0_lookup.set(key, each_blocks_3[i] = create_each_block_4(key, child_ctx)); + } + + let each_value_3 = /*groups*/ ctx[12]; + const get_key_1 = ctx => /*group*/ ctx[70].id; + + for (let i = 0; i < each_value_3.length; i += 1) { + let child_ctx = get_each_context_3(ctx, each_value_3, i); + let key = get_key_1(child_ctx); + each1_lookup.set(key, each_blocks_2[i] = create_each_block_3(key, child_ctx)); + } + + let each_value_1 = /*currentEmojisWithCategories*/ ctx[15]; + const get_key_2 = ctx => /*emojiWithCategory*/ ctx[67].category; + + for (let i = 0; i < each_value_1.length; i += 1) { + let child_ctx = get_each_context_1(ctx, each_value_1, i); + let key = get_key_2(child_ctx); + each2_lookup.set(key, each_blocks_1[i] = create_each_block_1(key, child_ctx)); + } + + let each_value = /*currentFavorites*/ ctx[10]; + const get_key_3 = ctx => /*emoji*/ ctx[64].id; + + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context(ctx, each_value, i); + let key = get_key_3(child_ctx); + each3_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); + } + + return { + c() { + section = element("section"); + div0 = element("div"); + div4 = element("div"); + div1 = element("div"); + input = element("input"); + label = element("label"); + t0 = text(t0_value); + span0 = element("span"); + t1 = text(t1_value); + div2 = element("div"); + button0 = element("button"); + t2 = text(/*skinToneButtonText*/ ctx[21]); + span1 = element("span"); + t3 = text(t3_value); + div3 = element("div"); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].c(); + } + + div5 = element("div"); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].c(); + } + + div7 = element("div"); + div6 = element("div"); + div8 = element("div"); + t4 = text(/*message*/ ctx[18]); + div10 = element("div"); + div9 = element("div"); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + + div11 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + button1 = element("button"); + button1.textContent = "๐Ÿ˜€"; + attr(div0, "class", "pad-top"); + attr(input, "id", "search"); + attr(input, "class", "search"); + attr(input, "type", "search"); + attr(input, "role", "combobox"); + attr(input, "enterkeyhint", "search"); + attr(input, "placeholder", input_placeholder_value = /*i18n*/ ctx[0].searchLabel); + attr(input, "autocapitalize", "none"); + attr(input, "autocomplete", "off"); + attr(input, "spellcheck", "true"); + attr(input, "aria-expanded", input_aria_expanded_value = !!(/*searchMode*/ ctx[4] && /*currentEmojis*/ ctx[1].length)); + attr(input, "aria-controls", "search-results"); + attr(input, "aria-describedby", "search-description"); + attr(input, "aria-autocomplete", "list"); + + attr(input, "aria-activedescendant", input_aria_activedescendant_value = /*activeSearchItemId*/ ctx[26] + ? `emo-${/*activeSearchItemId*/ ctx[26]}` + : ''); + + attr(label, "class", "sr-only"); + attr(label, "for", "search"); + attr(span0, "id", "search-description"); + attr(span0, "class", "sr-only"); + attr(div1, "class", "search-wrapper"); + attr(button0, "id", "skintone-button"); + attr(button0, "class", button0_class_value = "emoji " + (/*skinTonePickerExpanded*/ ctx[6] ? 'hide-focus' : '')); + attr(button0, "aria-label", /*skinToneButtonLabel*/ ctx[23]); + attr(button0, "title", /*skinToneButtonLabel*/ ctx[23]); + attr(button0, "aria-describedby", "skintone-description"); + attr(button0, "aria-haspopup", "listbox"); + attr(button0, "aria-expanded", /*skinTonePickerExpanded*/ ctx[6]); + attr(button0, "aria-controls", "skintone-list"); + + attr(div2, "class", div2_class_value = "skintone-button-wrapper " + (/*skinTonePickerExpandedAfterAnimation*/ ctx[19] + ? 'expanded' + : '')); + + attr(span1, "id", "skintone-description"); + attr(span1, "class", "sr-only"); + attr(div3, "id", "skintone-list"); + + attr(div3, "class", div3_class_value = "skintone-list " + (/*skinTonePickerExpanded*/ ctx[6] + ? '' + : 'hidden no-animate')); + + set_style(div3, "transform", "translateY(" + (/*skinTonePickerExpanded*/ ctx[6] + ? 0 + : 'calc(-1 * var(--num-skintones) * var(--total-emoji-size))') + ")"); + + attr(div3, "role", "listbox"); + attr(div3, "aria-label", div3_aria_label_value = /*i18n*/ ctx[0].skinTonesLabel); + attr(div3, "aria-activedescendant", div3_aria_activedescendant_value = "skintone-" + /*activeSkinTone*/ ctx[20]); + attr(div3, "aria-hidden", div3_aria_hidden_value = !/*skinTonePickerExpanded*/ ctx[6]); + attr(div4, "class", "search-row"); + attr(div5, "class", "nav"); + attr(div5, "role", "tablist"); + set_style(div5, "grid-template-columns", "repeat(" + /*groups*/ ctx[12].length + ", 1fr)"); + attr(div5, "aria-label", div5_aria_label_value = /*i18n*/ ctx[0].categoriesLabel); + attr(div6, "class", "indicator"); + set_style(div6, "transform", "translateX(" + (/*isRtl*/ ctx[24] ? -1 : 1) * /*currentGroupIndex*/ ctx[11] * 100 + "%)"); + attr(div7, "class", "indicator-wrapper"); + attr(div8, "class", div8_class_value = "message " + (/*message*/ ctx[18] ? '' : 'gone')); + attr(div8, "role", "alert"); + attr(div8, "aria-live", "polite"); + + attr(div10, "class", div10_class_value = "tabpanel " + (!/*databaseLoaded*/ ctx[14] || /*message*/ ctx[18] + ? 'gone' + : '')); + + attr(div10, "role", div10_role_value = /*searchMode*/ ctx[4] ? 'region' : 'tabpanel'); + + attr(div10, "aria-label", div10_aria_label_value = /*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]); + + attr(div10, "id", div10_id_value = /*searchMode*/ ctx[4] + ? '' + : `tab-${/*currentGroup*/ ctx[13].id}`); + + attr(div10, "tabindex", "0"); + attr(div11, "class", div11_class_value = "favorites emoji-menu " + (/*message*/ ctx[18] ? 'gone' : '')); + attr(div11, "role", "menu"); + attr(div11, "aria-label", div11_aria_label_value = /*i18n*/ ctx[0].favoritesLabel); + set_style(div11, "padding-inline-end", /*scrollbarWidth*/ ctx[25] + "px"); + attr(button1, "aria-hidden", "true"); + attr(button1, "tabindex", "-1"); + attr(button1, "class", "abs-pos hidden emoji"); + attr(section, "class", "picker"); + attr(section, "aria-label", section_aria_label_value = /*i18n*/ ctx[0].regionLabel); + attr(section, "style", /*pickerStyle*/ ctx[22]); + }, + m(target, anchor) { + insert(target, section, anchor); + append(section, div0); + append(section, div4); + append(div4, div1); + append(div1, input); + set_input_value(input, /*rawSearchText*/ ctx[2]); + append(div1, label); + append(label, t0); + append(div1, span0); + append(span0, t1); + append(div4, div2); + append(div2, button0); + append(button0, t2); + append(div4, span1); + append(span1, t3); + append(div4, div3); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].m(div3, null); + } + + /*div3_binding*/ ctx[49](div3); + append(section, div5); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].m(div5, null); + } + + append(section, div7); + append(div7, div6); + append(section, div8); + append(div8, t4); + append(section, div10); + append(div10, div9); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(div9, null); + } + + /*div10_binding*/ ctx[51](div10); + append(section, div11); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div11, null); + } + + append(section, button1); + /*button1_binding*/ ctx[52](button1); + /*section_binding*/ ctx[53](section); + + if (!mounted) { + dispose = [ + listen(input, "input", /*input_input_handler*/ ctx[48]), + listen(input, "keydown", /*onSearchKeydown*/ ctx[30]), + listen(button0, "click", /*onClickSkinToneButton*/ ctx[35]), + listen(div3, "focusout", /*onSkinToneOptionsFocusOut*/ ctx[38]), + listen(div3, "click", /*onSkinToneOptionsClick*/ ctx[34]), + listen(div3, "keydown", /*onSkinToneOptionsKeydown*/ ctx[36]), + listen(div3, "keyup", /*onSkinToneOptionsKeyup*/ ctx[37]), + listen(div5, "keydown", /*onNavKeydown*/ ctx[32]), + action_destroyer(/*calculateEmojiGridStyle*/ ctx[29].call(null, div9)), + listen(div10, "click", /*onEmojiClick*/ ctx[33]), + listen(div11, "click", /*onEmojiClick*/ ctx[33]) + ]; + + mounted = true; + } + }, + p(ctx, dirty) { + if (dirty[0] & /*i18n*/ 1 && input_placeholder_value !== (input_placeholder_value = /*i18n*/ ctx[0].searchLabel)) { + attr(input, "placeholder", input_placeholder_value); + } + + if (dirty[0] & /*searchMode, currentEmojis*/ 18 && input_aria_expanded_value !== (input_aria_expanded_value = !!(/*searchMode*/ ctx[4] && /*currentEmojis*/ ctx[1].length))) { + attr(input, "aria-expanded", input_aria_expanded_value); + } + + if (dirty[0] & /*activeSearchItemId*/ 67108864 && input_aria_activedescendant_value !== (input_aria_activedescendant_value = /*activeSearchItemId*/ ctx[26] + ? `emo-${/*activeSearchItemId*/ ctx[26]}` + : '')) { + attr(input, "aria-activedescendant", input_aria_activedescendant_value); + } + + if (dirty[0] & /*rawSearchText*/ 4) { + set_input_value(input, /*rawSearchText*/ ctx[2]); + } + + if (dirty[0] & /*i18n*/ 1 && t0_value !== (t0_value = /*i18n*/ ctx[0].searchLabel + "")) set_data(t0, t0_value); + if (dirty[0] & /*i18n*/ 1 && t1_value !== (t1_value = /*i18n*/ ctx[0].searchDescription + "")) set_data(t1, t1_value); + if (dirty[0] & /*skinToneButtonText*/ 2097152) set_data(t2, /*skinToneButtonText*/ ctx[21]); + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && button0_class_value !== (button0_class_value = "emoji " + (/*skinTonePickerExpanded*/ ctx[6] ? 'hide-focus' : ''))) { + attr(button0, "class", button0_class_value); + } + + if (dirty[0] & /*skinToneButtonLabel*/ 8388608) { + attr(button0, "aria-label", /*skinToneButtonLabel*/ ctx[23]); + } + + if (dirty[0] & /*skinToneButtonLabel*/ 8388608) { + attr(button0, "title", /*skinToneButtonLabel*/ ctx[23]); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64) { + attr(button0, "aria-expanded", /*skinTonePickerExpanded*/ ctx[6]); + } + + if (dirty[0] & /*skinTonePickerExpandedAfterAnimation*/ 524288 && div2_class_value !== (div2_class_value = "skintone-button-wrapper " + (/*skinTonePickerExpandedAfterAnimation*/ ctx[19] + ? 'expanded' + : ''))) { + attr(div2, "class", div2_class_value); + } + + if (dirty[0] & /*i18n*/ 1 && t3_value !== (t3_value = /*i18n*/ ctx[0].skinToneDescription + "")) set_data(t3, t3_value); + + if (dirty[0] & /*skinTones, activeSkinTone, i18n*/ 1049089) { + each_value_4 = /*skinTones*/ ctx[9]; + each_blocks_3 = update_keyed_each(each_blocks_3, dirty, get_key, 1, ctx, each_value_4, each0_lookup, div3, destroy_block, create_each_block_4, null, get_each_context_4); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && div3_class_value !== (div3_class_value = "skintone-list " + (/*skinTonePickerExpanded*/ ctx[6] + ? '' + : 'hidden no-animate'))) { + attr(div3, "class", div3_class_value); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64) { + set_style(div3, "transform", "translateY(" + (/*skinTonePickerExpanded*/ ctx[6] + ? 0 + : 'calc(-1 * var(--num-skintones) * var(--total-emoji-size))') + ")"); + } + + if (dirty[0] & /*i18n*/ 1 && div3_aria_label_value !== (div3_aria_label_value = /*i18n*/ ctx[0].skinTonesLabel)) { + attr(div3, "aria-label", div3_aria_label_value); + } + + if (dirty[0] & /*activeSkinTone*/ 1048576 && div3_aria_activedescendant_value !== (div3_aria_activedescendant_value = "skintone-" + /*activeSkinTone*/ ctx[20])) { + attr(div3, "aria-activedescendant", div3_aria_activedescendant_value); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && div3_aria_hidden_value !== (div3_aria_hidden_value = !/*skinTonePickerExpanded*/ ctx[6])) { + attr(div3, "aria-hidden", div3_aria_hidden_value); + } + + if (dirty[0] & /*groups, i18n, searchMode, currentGroup*/ 12305 | dirty[1] & /*onNavClick*/ 1) { + each_value_3 = /*groups*/ ctx[12]; + each_blocks_2 = update_keyed_each(each_blocks_2, dirty, get_key_1, 1, ctx, each_value_3, each1_lookup, div5, destroy_block, create_each_block_3, null, get_each_context_3); + } + + if (dirty[0] & /*groups*/ 4096) { + set_style(div5, "grid-template-columns", "repeat(" + /*groups*/ ctx[12].length + ", 1fr)"); + } + + if (dirty[0] & /*i18n*/ 1 && div5_aria_label_value !== (div5_aria_label_value = /*i18n*/ ctx[0].categoriesLabel)) { + attr(div5, "aria-label", div5_aria_label_value); + } + + if (dirty[0] & /*isRtl, currentGroupIndex*/ 16779264) { + set_style(div6, "transform", "translateX(" + (/*isRtl*/ ctx[24] ? -1 : 1) * /*currentGroupIndex*/ ctx[11] * 100 + "%)"); + } + + if (dirty[0] & /*message*/ 262144) set_data(t4, /*message*/ ctx[18]); + + if (dirty[0] & /*message*/ 262144 && div8_class_value !== (div8_class_value = "message " + (/*message*/ ctx[18] ? '' : 'gone'))) { + attr(div8, "class", div8_class_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem, labelWithSkin, currentSkinTone, unicodeWithSkin, i18n, currentGroup*/ 402694449) { + each_value_1 = /*currentEmojisWithCategories*/ ctx[15]; + each_blocks_1 = update_keyed_each(each_blocks_1, dirty, get_key_2, 1, ctx, each_value_1, each2_lookup, div9, destroy_block, create_each_block_1, null, get_each_context_1); + } + + if (dirty[0] & /*databaseLoaded, message*/ 278528 && div10_class_value !== (div10_class_value = "tabpanel " + (!/*databaseLoaded*/ ctx[14] || /*message*/ ctx[18] + ? 'gone' + : ''))) { + attr(div10, "class", div10_class_value); + } + + if (dirty[0] & /*searchMode*/ 16 && div10_role_value !== (div10_role_value = /*searchMode*/ ctx[4] ? 'region' : 'tabpanel')) { + attr(div10, "role", div10_role_value); + } + + if (dirty[0] & /*searchMode, i18n, currentGroup*/ 8209 && div10_aria_label_value !== (div10_aria_label_value = /*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name])) { + attr(div10, "aria-label", div10_aria_label_value); + } + + if (dirty[0] & /*searchMode, currentGroup*/ 8208 && div10_id_value !== (div10_id_value = /*searchMode*/ ctx[4] + ? '' + : `tab-${/*currentGroup*/ ctx[13].id}`)) { + attr(div10, "id", div10_id_value); + } + + if (dirty[0] & /*labelWithSkin, currentFavorites, currentSkinTone, unicodeWithSkin*/ 402654464) { + each_value = /*currentFavorites*/ ctx[10]; + each_blocks = update_keyed_each(each_blocks, dirty, get_key_3, 1, ctx, each_value, each3_lookup, div11, destroy_block, create_each_block, null, get_each_context); + } + + if (dirty[0] & /*message*/ 262144 && div11_class_value !== (div11_class_value = "favorites emoji-menu " + (/*message*/ ctx[18] ? 'gone' : ''))) { + attr(div11, "class", div11_class_value); + } + + if (dirty[0] & /*i18n*/ 1 && div11_aria_label_value !== (div11_aria_label_value = /*i18n*/ ctx[0].favoritesLabel)) { + attr(div11, "aria-label", div11_aria_label_value); + } + + if (dirty[0] & /*scrollbarWidth*/ 33554432) { + set_style(div11, "padding-inline-end", /*scrollbarWidth*/ ctx[25] + "px"); + } + + if (dirty[0] & /*i18n*/ 1 && section_aria_label_value !== (section_aria_label_value = /*i18n*/ ctx[0].regionLabel)) { + attr(section, "aria-label", section_aria_label_value); + } + + if (dirty[0] & /*pickerStyle*/ 4194304) { + attr(section, "style", /*pickerStyle*/ ctx[22]); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(section); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].d(); + } + + /*div3_binding*/ ctx[49](null); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].d(); + } + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(); + } + + /*div10_binding*/ ctx[51](null); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + + /*button1_binding*/ ctx[52](null); + /*section_binding*/ ctx[53](null); + mounted = false; + run_all(dispose); + } + }; +} + +function instance($$self, $$props, $$invalidate) { + let { skinToneEmoji } = $$props; + let { i18n } = $$props; + let { database } = $$props; + let { customEmoji } = $$props; + let { customCategorySorting } = $$props; + let { emojiVersion } = $$props; + + // private + let initialLoad = true; + + let currentEmojis = []; + let currentEmojisWithCategories = []; // eslint-disable-line no-unused-vars + let rawSearchText = ''; + let searchText = ''; + let rootElement; + let baselineEmoji; + let tabpanelElement; + let searchMode = false; // eslint-disable-line no-unused-vars + let activeSearchItem = -1; + let message; // eslint-disable-line no-unused-vars + let skinTonePickerExpanded = false; + let skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars + let skinToneDropdown; + let currentSkinTone = 0; + let activeSkinTone = 0; + let skinToneButtonText; // eslint-disable-line no-unused-vars + let pickerStyle; // eslint-disable-line no-unused-vars + let skinToneButtonLabel = ''; // eslint-disable-line no-unused-vars + let skinTones = []; + let currentFavorites = []; // eslint-disable-line no-unused-vars + let defaultFavoriteEmojis; + let numColumns = DEFAULT_NUM_COLUMNS; + let isRtl = false; // eslint-disable-line no-unused-vars + let scrollbarWidth = 0; // eslint-disable-line no-unused-vars + let currentGroupIndex = 0; + let groups$1 = groups; + let currentGroup; + let databaseLoaded = false; // eslint-disable-line no-unused-vars + let activeSearchItemId; // eslint-disable-line no-unused-vars + + // + // Utils/helpers + // + const focus = id => { + rootElement.getRootNode().getElementById(id).focus(); + }; + + // fire a custom event that crosses the shadow boundary + const fireEvent = (name, detail) => { + rootElement.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true })); + }; + + // eslint-disable-next-line no-unused-vars + const unicodeWithSkin = (emoji, currentSkinTone) => currentSkinTone && emoji.skins && emoji.skins[currentSkinTone] || emoji.unicode; + + // eslint-disable-next-line no-unused-vars + const labelWithSkin = (emoji, currentSkinTone) => uniq([ + emoji.name || unicodeWithSkin(emoji, currentSkinTone), + ...emoji.shortcodes || [] + ]).join(', '); + + // Detect a skintone option button + const isSkinToneOption = element => (/^skintone-/).test(element.id); + + // + // Determine the emoji support level (in requestIdleCallback) + // + onMount(() => { + if (!emojiVersion) { + detectEmojiSupportLevel().then(level => { + // Can't actually test emoji support in Jest/JSDom, emoji never render in color in Cairo + /* istanbul ignore next */ + if (!level) { + $$invalidate(18, message = i18n.emojiUnsupportedMessage); + } + }); + } + }); + + // + // Calculate the width of the emoji grid. This serves two purposes: + // 1) Re-calculate the --num-columns var because it may have changed + // 2) Re-calculate the scrollbar width because it may have changed + // (i.e. because the number of items changed) + // 3) Re-calculate whether we're in RTL mode or not. + // + // The benefit of doing this in one place is to align with rAF/ResizeObserver + // and do all the calculations in one go. RTL vs LTR is not strictly width-related, + // but since we're already reading the style here, and since it's already aligned with + // the rAF loop, this is the most appropriate place to do it perf-wise. + // + // eslint-disable-next-line no-unused-vars + function calculateEmojiGridStyle(node) { + return calculateWidth(node, width => { + /* istanbul ignore next */ + if ("production" !== 'test') { + // jsdom throws errors for this kind of fancy stuff + // read all the style/layout calculations we need to make + const style = getComputedStyle(rootElement); + + const newNumColumns = parseInt(style.getPropertyValue('--num-columns'), 10); + const newIsRtl = style.getPropertyValue('direction') === 'rtl'; + const parentWidth = node.parentElement.getBoundingClientRect().width; + const newScrollbarWidth = parentWidth - width; + + // write to Svelte variables + $$invalidate(47, numColumns = newNumColumns); + + $$invalidate(25, scrollbarWidth = newScrollbarWidth); // eslint-disable-line no-unused-vars + $$invalidate(24, isRtl = newIsRtl); // eslint-disable-line no-unused-vars + } + }); + } + + function checkZwjSupportAndUpdate(zwjEmojisToCheck) { + const rootNode = rootElement.getRootNode(); + const emojiToDomNode = emoji => rootNode.getElementById(`emo-${emoji.id}`); + checkZwjSupport(zwjEmojisToCheck, baselineEmoji, emojiToDomNode); + + // force update + $$invalidate(1, currentEmojis = currentEmojis); // eslint-disable-line no-self-assign + } + + function isZwjSupported(emoji) { + return !emoji.unicode || !hasZwj(emoji) || supportedZwjEmojis.get(emoji.unicode); + } + + async function filterEmojisByVersion(emojis) { + const emojiSupportLevel = emojiVersion || await detectEmojiSupportLevel(); + + // !version corresponds to custom emoji + return emojis.filter(({ version }) => !version || version <= emojiSupportLevel); + } + + async function summarizeEmojis(emojis) { + return summarizeEmojisForUI(emojis, emojiVersion || await detectEmojiSupportLevel()); + } + + async function getEmojisByGroup(group) { + + // -1 is custom emoji + const emoji = group === -1 + ? customEmoji + : await database.getEmojiByGroup(group); + + return summarizeEmojis(await filterEmojisByVersion(emoji)); + } + + async function getEmojisBySearchQuery(query) { + return summarizeEmojis(await filterEmojisByVersion(await database.getEmojiBySearchQuery(query))); + } + + // eslint-disable-next-line no-unused-vars + function onSearchKeydown(event) { + if (!searchMode || !currentEmojis.length) { + return; + } + + const goToNextOrPrevious = previous => { + halt(event); + $$invalidate(5, activeSearchItem = incrementOrDecrement(previous, activeSearchItem, currentEmojis)); + }; + + switch (event.key) { + case 'ArrowDown': + return goToNextOrPrevious(false); + case 'ArrowUp': + return goToNextOrPrevious(true); + case 'Enter': + if (activeSearchItem !== -1) { + halt(event); + return clickEmoji(currentEmojis[activeSearchItem].id); + } else if (currentEmojis.length) { + $$invalidate(5, activeSearchItem = 0); + } + } + } + + // + // Handle user input on nav + // + // eslint-disable-next-line no-unused-vars + function onNavClick(group) { + $$invalidate(2, rawSearchText = ''); + $$invalidate(45, searchText = ''); + $$invalidate(5, activeSearchItem = -1); + $$invalidate(11, currentGroupIndex = groups$1.findIndex(_ => _.id === group.id)); + } + + // eslint-disable-next-line no-unused-vars + function onNavKeydown(event) { + const { target, key } = event; + + const doFocus = el => { + if (el) { + halt(event); + el.focus(); + } + }; + + switch (key) { + case 'ArrowLeft': + return doFocus(target.previousSibling); + case 'ArrowRight': + return doFocus(target.nextSibling); + case 'Home': + return doFocus(target.parentElement.firstChild); + case 'End': + return doFocus(target.parentElement.lastChild); + } + } + + // + // Handle user input on an emoji + // + async function clickEmoji(unicodeOrName) { + const emoji = await database.getEmojiByUnicodeOrName(unicodeOrName); + const emojiSummary = [...currentEmojis, ...currentFavorites].find(_ => _.id === unicodeOrName); + const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, currentSkinTone); + await database.incrementFavoriteEmojiCount(unicodeOrName); + + fireEvent('emoji-click', { + emoji, + skinTone: currentSkinTone, + ...skinTonedUnicode && { unicode: skinTonedUnicode }, + ...emojiSummary.name && { name: emojiSummary.name } + }); + } + + // eslint-disable-next-line no-unused-vars + async function onEmojiClick(event) { + const { target } = event; + + if (!target.classList.contains('emoji')) { + return; + } + + halt(event); + const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix + + /* no await */ + clickEmoji(id); + } + + // + // Handle user input on the skintone picker + // + // eslint-disable-next-line no-unused-vars + async function onSkinToneOptionsClick(event) { + const { target } = event; + + if (!isSkinToneOption(target)) { + return; + } + + halt(event); + const skinTone = parseInt(target.id.slice(9), 10); // remove 'skintone-' prefix + $$invalidate(8, currentSkinTone = skinTone); + $$invalidate(6, skinTonePickerExpanded = false); + focus('skintone-button'); + fireEvent('skin-tone-change', { skinTone }); + + /* no await */ + database.setPreferredSkinTone(skinTone); + } + + // eslint-disable-next-line no-unused-vars + async function onClickSkinToneButton(event) { + $$invalidate(6, skinTonePickerExpanded = !skinTonePickerExpanded); + $$invalidate(20, activeSkinTone = currentSkinTone); + + if (skinTonePickerExpanded) { + halt(event); + rAF(() => focus(`skintone-${activeSkinTone}`)); + } + } + + // eslint-disable-next-line no-unused-vars + function onSkinToneOptionsKeydown(event) { + if (!skinTonePickerExpanded) { + return; + } + + const changeActiveSkinTone = async nextSkinTone => { + halt(event); + $$invalidate(20, activeSkinTone = nextSkinTone); + await tick(); + focus(`skintone-${activeSkinTone}`); + }; + + switch (event.key) { + case 'ArrowUp': + return changeActiveSkinTone(incrementOrDecrement(true, activeSkinTone, skinTones)); + case 'ArrowDown': + return changeActiveSkinTone(incrementOrDecrement(false, activeSkinTone, skinTones)); + case 'Home': + return changeActiveSkinTone(0); + case 'End': + return changeActiveSkinTone(skinTones.length - 1); + case 'Enter': + // enter on keydown, space on keyup. this is just how browsers work for buttons + // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html + return onSkinToneOptionsClick(event); + case 'Escape': + halt(event); + $$invalidate(6, skinTonePickerExpanded = false); + return focus('skintone-button'); + } + } + + // eslint-disable-next-line no-unused-vars + function onSkinToneOptionsKeyup(event) { + if (!skinTonePickerExpanded) { + return; + } + + switch (event.key) { + case ' ': + // enter on keydown, space on keyup. this is just how browsers work for buttons + // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html + return onSkinToneOptionsClick(event); + } + } + + // eslint-disable-next-line no-unused-vars + async function onSkinToneOptionsFocusOut(event) { + // On blur outside of the skintone options, collapse the skintone picker. + // Except if focus is just moving to another skintone option, e.g. pressing up/down to change focus + const { relatedTarget } = event; + + if (!relatedTarget || !isSkinToneOption(relatedTarget)) { + $$invalidate(6, skinTonePickerExpanded = false); + } + } + + function input_input_handler() { + rawSearchText = this.value; + $$invalidate(2, rawSearchText); + } + + function div3_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + skinToneDropdown = $$value; + $$invalidate(7, skinToneDropdown); + }); + } + + const click_handler = group => onNavClick(group); + + function div10_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + tabpanelElement = $$value; + $$invalidate(3, tabpanelElement); + }); + } + + function button1_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + baselineEmoji = $$value; + $$invalidate(17, baselineEmoji); + }); + } + + function section_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + rootElement = $$value; + $$invalidate(16, rootElement); + }); + } + + $$self.$$set = $$props => { + if ('skinToneEmoji' in $$props) $$invalidate(40, skinToneEmoji = $$props.skinToneEmoji); + if ('i18n' in $$props) $$invalidate(0, i18n = $$props.i18n); + if ('database' in $$props) $$invalidate(39, database = $$props.database); + if ('customEmoji' in $$props) $$invalidate(41, customEmoji = $$props.customEmoji); + if ('customCategorySorting' in $$props) $$invalidate(42, customCategorySorting = $$props.customCategorySorting); + if ('emojiVersion' in $$props) $$invalidate(43, emojiVersion = $$props.emojiVersion); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty[1] & /*customEmoji, database*/ 1280) { + /* eslint-enable no-unused-vars */ + // + // Set or update the customEmoji + // + { + if (customEmoji && database) { + $$invalidate(39, database.customEmoji = customEmoji, database); + } + } + } + + if ($$self.$$.dirty[0] & /*i18n*/ 1 | $$self.$$.dirty[1] & /*database*/ 256) { + // + // Set or update the database object + // + { + // show a Loading message if it takes a long time, or show an error if there's a network/IDB error + async function handleDatabaseLoading() { + let showingLoadingMessage = false; + + const timeoutHandle = setTimeout( + () => { + showingLoadingMessage = true; + $$invalidate(18, message = i18n.loadingMessage); + }, + TIMEOUT_BEFORE_LOADING_MESSAGE + ); + + try { + await database.ready(); + $$invalidate(14, databaseLoaded = true); // eslint-disable-line no-unused-vars + } catch(err) { + console.error(err); + $$invalidate(18, message = i18n.networkErrorMessage); + } finally { + clearTimeout(timeoutHandle); + + if (showingLoadingMessage) { + // Seems safer than checking the i18n string, which may change + showingLoadingMessage = false; + + $$invalidate(18, message = ''); // eslint-disable-line no-unused-vars + } + } + } + + if (database) { + /* no await */ + handleDatabaseLoading(); + } + } + } + + if ($$self.$$.dirty[0] & /*groups, currentGroupIndex*/ 6144 | $$self.$$.dirty[1] & /*customEmoji*/ 1024) { + { + if (customEmoji && customEmoji.length) { + $$invalidate(12, groups$1 = [customGroup, ...groups]); + } else if (groups$1 !== groups) { + if (currentGroupIndex) { + // If the current group is anything other than "custom" (which is first), decrement. + // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji + $$invalidate(11, currentGroupIndex--, currentGroupIndex); + } + + $$invalidate(12, groups$1 = groups); + } + } + } + + if ($$self.$$.dirty[0] & /*rawSearchText*/ 4) { + /* eslint-enable no-unused-vars */ + // + // Handle user input on the search input + // + { + rIC(() => { + $$invalidate(45, searchText = (rawSearchText || '').trim()); // defer to avoid input delays, plus we can trim here + $$invalidate(5, activeSearchItem = -1); + }); + } + } + + if ($$self.$$.dirty[0] & /*groups, currentGroupIndex*/ 6144) { + // + // Update the current group based on the currentGroupIndex + // + $$invalidate(13, currentGroup = groups$1[currentGroupIndex]); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded, currentGroup*/ 24576 | $$self.$$.dirty[1] & /*searchText*/ 16384) { + // + // Set or update the currentEmojis. Check for invalid ZWJ renderings + // (i.e. double emoji). + // + { + async function updateEmojis() { + + if (!databaseLoaded) { + $$invalidate(1, currentEmojis = []); + $$invalidate(4, searchMode = false); + } else if (searchText.length >= MIN_SEARCH_TEXT_LENGTH) { + const currentSearchText = searchText; + const newEmojis = await getEmojisBySearchQuery(currentSearchText); + + if (currentSearchText === searchText) { + // if the situation changes asynchronously, do not update + $$invalidate(1, currentEmojis = newEmojis); + + $$invalidate(4, searchMode = true); + } + } else if (currentGroup) { + const currentGroupId = currentGroup.id; + const newEmojis = await getEmojisByGroup(currentGroupId); + + if (currentGroupId === currentGroup.id) { + // if the situation changes asynchronously, do not update + $$invalidate(1, currentEmojis = newEmojis); + + $$invalidate(4, searchMode = false); + } + } + } + + /* no await */ + updateEmojis(); + } + } + + if ($$self.$$.dirty[0] & /*groups, searchMode*/ 4112) { + // + // Global styles for the entire picker + // + /* eslint-disable no-unused-vars */ + $$invalidate(22, pickerStyle = ` + --num-groups: ${groups$1.length}; + --indicator-opacity: ${searchMode ? 0 : 1}; + --num-skintones: ${NUM_SKIN_TONES};`); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database*/ 256) { + // + // Set or update the preferred skin tone + // + { + async function updatePreferredSkinTone() { + if (databaseLoaded) { + $$invalidate(8, currentSkinTone = await database.getPreferredSkinTone()); + } + } + + /* no await */ + updatePreferredSkinTone(); + } + } + + if ($$self.$$.dirty[1] & /*skinToneEmoji*/ 512) { + $$invalidate(9, skinTones = Array(NUM_SKIN_TONES).fill().map((_, i) => applySkinTone(skinToneEmoji, i))); + } + + if ($$self.$$.dirty[0] & /*skinTones, currentSkinTone*/ 768) { + /* eslint-disable no-unused-vars */ + $$invalidate(21, skinToneButtonText = skinTones[currentSkinTone]); + } + + if ($$self.$$.dirty[0] & /*i18n, currentSkinTone*/ 257) { + $$invalidate(23, skinToneButtonLabel = i18n.skinToneLabel.replace('{skinTone}', i18n.skinTones[currentSkinTone])); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database*/ 256) { + /* eslint-enable no-unused-vars */ + // + // Set or update the favorites emojis + // + { + async function updateDefaultFavoriteEmojis() { + $$invalidate(46, defaultFavoriteEmojis = (await Promise.all(MOST_COMMONLY_USED_EMOJI.map(unicode => database.getEmojiByUnicodeOrName(unicode)))).filter(Boolean)); // filter because in Jest tests we don't have all the emoji in the DB + } + + if (databaseLoaded) { + /* no await */ + updateDefaultFavoriteEmojis(); + } + } + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database, numColumns, defaultFavoriteEmojis*/ 98560) { + { + async function updateFavorites() { + const dbFavorites = await database.getTopFavoriteEmoji(numColumns); + const favorites = await summarizeEmojis(uniqBy([...dbFavorites, ...defaultFavoriteEmojis], _ => _.unicode || _.name).slice(0, numColumns)); + $$invalidate(10, currentFavorites = favorites); + } + + if (databaseLoaded && defaultFavoriteEmojis) { + /* no await */ + updateFavorites(); + } + } + } + + if ($$self.$$.dirty[0] & /*currentEmojis, tabpanelElement*/ 10 | $$self.$$.dirty[1] & /*emojiVersion*/ 4096) { + // Some emojis have their ligatures rendered as two or more consecutive emojis + // We want to treat these the same as unsupported emojis, so we compare their + // widths against the baseline widths and remove them as necessary + { + const zwjEmojisToCheck = currentEmojis.filter(emoji => emoji.unicode).filter(emoji => hasZwj(emoji) && !supportedZwjEmojis.has(emoji.unicode)); // filter custom emoji + + if (!emojiVersion && zwjEmojisToCheck.length) { + // render now, check their length later + rAF(() => checkZwjSupportAndUpdate(zwjEmojisToCheck)); + } else { + $$invalidate(1, currentEmojis = emojiVersion + ? currentEmojis + : currentEmojis.filter(isZwjSupported)); + + // Reset scroll top to 0 when emojis change + rAF(() => resetScrollTopIfPossible(tabpanelElement)); + } + } + } + + if ($$self.$$.dirty[0] & /*currentEmojis, currentFavorites*/ 1026 | $$self.$$.dirty[1] & /*initialLoad*/ 8192) { + { + // consider initialLoad to be complete when the first tabpanel and favorites are rendered + /* istanbul ignore next */ + if ("production" !== 'production' || false) { + if (currentEmojis.length && currentFavorites.length && initialLoad) { + $$invalidate(44, initialLoad = false); + requestPostAnimationFrame(() => (void 0)); + } + } + } + } + + if ($$self.$$.dirty[0] & /*searchMode, currentEmojis*/ 18 | $$self.$$.dirty[1] & /*customCategorySorting*/ 2048) { + // + // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there + // are no categories, because it's just easier to code the HTML this way. + // + { + function calculateCurrentEmojisWithCategories() { + if (searchMode) { + return [{ category: '', emojis: currentEmojis }]; + } + + const categoriesToEmoji = new Map(); + + for (const emoji of currentEmojis) { + const category = emoji.category || ''; + let emojis = categoriesToEmoji.get(category); + + if (!emojis) { + emojis = []; + categoriesToEmoji.set(category, emojis); + } + + emojis.push(emoji); + } + + return [...categoriesToEmoji.entries()].map(([category, emojis]) => ({ category, emojis })).sort((a, b) => customCategorySorting(a.category, b.category)); + } + + // eslint-disable-next-line no-unused-vars + $$invalidate(15, currentEmojisWithCategories = calculateCurrentEmojisWithCategories()); + } + } + + if ($$self.$$.dirty[0] & /*activeSearchItem, currentEmojis*/ 34) { + // + // Handle active search item (i.e. pressing up or down while searching) + // + /* eslint-disable no-unused-vars */ + $$invalidate(26, activeSearchItemId = activeSearchItem !== -1 && currentEmojis[activeSearchItem].id); + } + + if ($$self.$$.dirty[0] & /*skinTonePickerExpanded, skinToneDropdown*/ 192) { + // To make the animation nicer, change the z-index of the skintone picker button + // *after* the animation has played. This makes it appear that the picker box + // is expanding "below" the button + { + if (skinTonePickerExpanded) { + skinToneDropdown.addEventListener( + 'transitionend', + () => { + $$invalidate(19, skinTonePickerExpandedAfterAnimation = true); // eslint-disable-line no-unused-vars + }, + { once: true } + ); + } else { + $$invalidate(19, skinTonePickerExpandedAfterAnimation = false); // eslint-disable-line no-unused-vars + } + } + } + }; + + return [ + i18n, + currentEmojis, + rawSearchText, + tabpanelElement, + searchMode, + activeSearchItem, + skinTonePickerExpanded, + skinToneDropdown, + currentSkinTone, + skinTones, + currentFavorites, + currentGroupIndex, + groups$1, + currentGroup, + databaseLoaded, + currentEmojisWithCategories, + rootElement, + baselineEmoji, + message, + skinTonePickerExpandedAfterAnimation, + activeSkinTone, + skinToneButtonText, + pickerStyle, + skinToneButtonLabel, + isRtl, + scrollbarWidth, + activeSearchItemId, + unicodeWithSkin, + labelWithSkin, + calculateEmojiGridStyle, + onSearchKeydown, + onNavClick, + onNavKeydown, + onEmojiClick, + onSkinToneOptionsClick, + onClickSkinToneButton, + onSkinToneOptionsKeydown, + onSkinToneOptionsKeyup, + onSkinToneOptionsFocusOut, + database, + skinToneEmoji, + customEmoji, + customCategorySorting, + emojiVersion, + initialLoad, + searchText, + defaultFavoriteEmojis, + numColumns, + input_input_handler, + div3_binding, + click_handler, + div10_binding, + button1_binding, + section_binding + ]; +} + +class Picker extends SvelteComponent { + constructor(options) { + super(); + + init( + this, + options, + instance, + create_fragment, + safe_not_equal, + { + skinToneEmoji: 40, + i18n: 0, + database: 39, + customEmoji: 41, + customCategorySorting: 42, + emojiVersion: 43 + }, + null, + [-1, -1, -1] + ); + } +} + +const DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json'; +const DEFAULT_LOCALE = 'en'; + +var enI18n = { + categoriesLabel: 'Categories', + emojiUnsupportedMessage: 'Your browser does not support color emoji.', + favoritesLabel: 'Favorites', + loadingMessage: 'Loadingโ€ฆ', + networkErrorMessage: 'Could not load emoji.', + regionLabel: 'Emoji picker', + searchDescription: 'When search results are available, press up or down to select and enter to choose.', + searchLabel: 'Search', + searchResultsLabel: 'Search results', + skinToneDescription: 'When expanded, press up or down to select and enter to choose.', + skinToneLabel: 'Choose a skin tone (currently {skinTone})', + skinTonesLabel: 'Skin tones', + skinTones: [ + 'Default', + 'Light', + 'Medium-Light', + 'Medium', + 'Medium-Dark', + 'Dark' + ], + categories: { + custom: 'Custom', + 'smileys-emotion': 'Smileys and emoticons', + 'people-body': 'People and body', + 'animals-nature': 'Animals and nature', + 'food-drink': 'Food and drink', + 'travel-places': 'Travel and places', + activities: 'Activities', + objects: 'Objects', + symbols: 'Symbols', + flags: 'Flags' + } +}; + +const PROPS = [ + 'customEmoji', + 'customCategorySorting', + 'database', + 'dataSource', + 'i18n', + 'locale', + 'skinToneEmoji', + 'emojiVersion' +]; + +// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place +const EXTRA_STYLES = `:host{--emoji-font-family:${FONT_FAMILY}}`; + +class PickerElement extends HTMLElement { + constructor (props) { + super(); + this.attachShadow({ mode: 'open' }); + const style = document.createElement('style'); + style.textContent = ":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.custom-emoji,.emoji,button.emoji{height:var(--total-emoji-size);width:var(--total-emoji-size)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.custom-emoji{padding:var(--emoji-padding);object-fit:contain;pointer-events:none;background-repeat:no-repeat;background-position:center center;background-size:var(--emoji-size) var(--emoji-size)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}" + EXTRA_STYLES; + this.shadowRoot.appendChild(style); + this._ctx = { + // Set defaults + locale: DEFAULT_LOCALE, + dataSource: DEFAULT_DATA_SOURCE, + skinToneEmoji: DEFAULT_SKIN_TONE_EMOJI, + customCategorySorting: DEFAULT_CATEGORY_SORTING, + customEmoji: null, + i18n: enI18n, + emojiVersion: null, + ...props + }; + // Handle properties set before the element was upgraded + for (const prop of PROPS) { + if (prop !== 'database' && Object.prototype.hasOwnProperty.call(this, prop)) { + this._ctx[prop] = this[prop]; + delete this[prop]; + } + } + this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute + } + + connectedCallback () { + // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case, + // do nothing (preserve the state) + if (!this._cmp) { + this._cmp = new Picker({ + target: this.shadowRoot, + props: this._ctx + }); + } + } + + disconnectedCallback () { + // Check in a microtask if the element is still connected. If so, treat this as a "move" rather than a disconnect + // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue + Promise.resolve().then(() => { + // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously + if (!this.isConnected && this._cmp) { + this._cmp.$destroy(); + this._cmp = undefined; + + const { database } = this._ctx; + database.close() + // only happens if the database failed to load in the first place, so we don't care + .catch(err => console.error(err)); + } + }); + } + + static get observedAttributes () { + return ['locale', 'data-source', 'skin-tone-emoji', 'emoji-version'] // complex objects aren't supported, also use kebab-case + } + + attributeChangedCallback (attrName, oldValue, newValue) { + this._set( + // convert from kebab-case to camelcase + // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015 + attrName.replace(/-([a-z])/g, (_, up) => up.toUpperCase()), + // convert string attribute to float if necessary + attrName === 'emoji-version' ? parseFloat(newValue) : newValue + ); + } + + _set (prop, newValue) { + this._ctx[prop] = newValue; + if (this._cmp) { + this._cmp.$set({ [prop]: newValue }); + } + if (['locale', 'dataSource'].includes(prop)) { + this._dbFlush(); + } + } + + _dbCreate () { + const { locale, dataSource, database } = this._ctx; + // only create a new database if we really need to + if (!database || database.locale !== locale || database.dataSource !== dataSource) { + this._set('database', new Database({ locale, dataSource })); + } + } + + // Update the Database in one microtask if the locale/dataSource change. We do one microtask + // so we don't create two Databases if e.g. both the locale and the dataSource change + _dbFlush () { + Promise.resolve().then(() => ( + this._dbCreate() + )); + } +} + +const definitions = {}; + +for (const prop of PROPS) { + definitions[prop] = { + get () { + if (prop === 'database') { + // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB + // now if the user is asking for it + this._dbCreate(); + } + return this._ctx[prop] + }, + set (val) { + if (prop === 'database') { + throw new Error('database is read-only') + } + this._set(prop, val); + } + }; +} + +Object.defineProperties(PickerElement.prototype, definitions); + +/* istanbul ignore else */ +if (!customElements.get('emoji-picker')) { // if already defined, do nothing (e.g. same script imported twice) + customElements.define('emoji-picker', PickerElement); +} + +export { PickerElement as default }; diff --git a/app/templates/base/scripts.html b/app/templates/base/scripts.html index 0f08ce6..09062fb 100644 --- a/app/templates/base/scripts.html +++ b/app/templates/base/scripts.html @@ -1,4 +1,4 @@ {% for s in scripts %} {% endfor %} - + diff --git a/app/templates/widgets/editor.html b/app/templates/widgets/editor.html index bb75b2e..2d30dc7 100644 --- a/app/templates/widgets/editor.html +++ b/app/templates/widgets/editor.html @@ -98,7 +98,7 @@