diff --git a/docs/account.md b/docs/account.md index cd4dc2b..f529188 100644 --- a/docs/account.md +++ b/docs/account.md @@ -515,6 +515,42 @@ account.send_image( ) ``` +#### `send_emoji_reaction(message_id, emoji_shortname, chat_id=None)` + +React to a message with an emoji, the same as reacting to a message in Status App. The reaction is a **toggle** - calling the method again with the same emoji on the same message removes it, so the same call both sets and unsets the reaction. + +Emojis are identified by their **shortname**, exactly as Status App names them (`:thumbsup:`, `:heart_eyes:`). The surrounding colons are optional - `thumbsup` and `:thumbsup:` are the same emoji - and the full list of supported shortnames is documented under [Emojis](./utils.md#emojis). + +Passing `chat_id` is purely an **optimisation**. Without it the chat has to be resolved from the message first, which costs one extra round trip to the Status Backend per reaction - worth avoiding when reacting to many messages in a chat that is already known, such as inside a [`listen_messages`](./account.md#listen_messages) loop. A `chat_id` that does not match the message is rejected by the backend and raises a custom exception, so pass it only when it is certain. + +| Name | Type | Required | Description | +|-----|-----|-----|-------------| +| `message_id` | `str` | Yes | The `id` of the message to react to. Message IDs can be obtained from the `id` key of [`get_messages`](./account.md#get_messageschat_id-start_timestampnone-end_timestampnone), from the `lastMessage` of a [`listen_messages`](./account.md#listen_messages) event, or directly from the return value of [`send_message`](./account.md#send_messagechat_id-message-reply_to_message_idnone) / [`send_image`](./account.md#send_imagechat_id-file_path-messagenone-reply_to_message_idnone). | +| `emoji_shortname` | `str` | Yes | The emoji shortname as in Status App, with or without the surrounding colons. See [Emojis](./utils.md#emojis) for all supported values. | +| `chat_id` | `str` | No | Identifier of the chat the message belongs to, as found in the [`chats`](./account.md#chats) property. When omitted (default), it is resolved from `message_id` with an extra call to the Status Backend. | + +```python +from status_sdk import Account + +account = Account() +params = { + "name": "status-app-bot", + "password": "SNTPUMP" +} +account.login(**params) + +chat = account.chats[0] + +# Messages are returned newest first, so this is the latest message in the chat +messages = account.get_messages(chat["id"]) +latest = messages[0] + +account.send_emoji_reaction(latest["id"], ":thumbsup:") + +# Reacting with the same emoji again removes the reaction +account.send_emoji_reaction(latest["id"], ":thumbsup:") +``` + #### `get_messages(chat_id, start_timestamp=None, end_timestamp=None)` Retrieve messages from the specified chat within an optional time range. Messages are returned in **descending order** (newest to oldest). The method automatically paginates through the backend until all messages in the specified range are collected. This method is ideal for backfilling, [batch processing](https://aws.amazon.com/what-is/batch-processing/) or [micro batch processing](https://www.dremio.com/wiki/micro-batch-processing/). @@ -609,9 +645,6 @@ Listen for new incoming messages **in real time**. This method yields raw messag ```python from status_sdk import Account -# For terminal readability only -from rich import print as rprint -from rich.pretty import Pretty account = Account() params = { @@ -621,20 +654,38 @@ params = { account.login(**params) for msg in account.listen_messages(): - rprint(Pretty(msg)) + print(msg) ``` **Note**: If you receive multiple messages at once, `contacts` and `chats` will grow. #### `listen_contact_requests()` -Listen for incoming contact requests **in real time**. +Listen for contact requests **in real time**. Both **incoming** contact requests sent to the account and contact requests sent by the account that were **accepted** by the other user are yielded. Every yielded event carries a `request_type` key that tells the two apart: + +| `request_type` | Meaning | +|-----|-----| +| `incoming` | Another user sent a contact request to the account. Approve it with [`add_contact`](./account.md#add_contactpublic_key-display_namenone). | +| `accepted` | Another user accepted a contact request that the account had sent. The contact is now mutual. | + +```python +from status_sdk import Account + +account = Account() +params = { + "name": "status-app-bot", + "password": "SNTPUMP" +} +account.login(**params) + +for request in account.listen_contact_requests(): + print(request) +``` + +Handle each type separately: ```python from status_sdk import Account -# For terminal readability only -from rich import print as rprint -from rich.pretty import Pretty account = Account() params = { @@ -644,7 +695,28 @@ params = { account.login(**params) for request in account.listen_contact_requests(): - rprint(Pretty(request)) + if request["request_type"] == "incoming": + print("New contact request received") + elif request["request_type"] == "accepted": + print("Contact request was accepted") +``` + +#### `listen_message_mentions()` + +Listen for `@0x...` mentions **in real time**. + +```python +from status_sdk import Account + +account = Account() +params = { + "name": "status-app-bot", + "password": "SNTPUMP" +} +account.login(**params) + +for mention in account.listen_message_mentions(): + print(mention) ``` #### `add_contact(public_key, display_name=None)` @@ -1750,7 +1822,6 @@ Returns `list[dict]` where each element represents a community. | `verified` | `bool` | Whether the community is verified. | | `tags` | `list[str]` | Tags associated with the community. | | `is_member` | `bool` | Whether the account is currently a member of the community. | -| `joined` | `bool` | Whether the account has joined the community. | | `joined_timestamp` | `datetime.datetime`
`None` | Timestamp when the account joined the community. `None` when the account has not joined. | | `requested_timestamp` | `datetime.datetime`
`None` | Timestamp when the join request was submitted. `None` when no request was made. | | `encrypted` | `bool` | Whether the community messaging is encrypted. | diff --git a/docs/community.md b/docs/community.md index 85192a6..68b30de 100644 --- a/docs/community.md +++ b/docs/community.md @@ -534,11 +534,11 @@ community.delete_channel("announcements") Listen for join requests to the community **in real time**. -Returns a `Generator` that yields one `dict` per request event: +Returns a `Generator` that yields one `models.CommunityRequest` **dataclass** per request event, so the fields are reached as attributes (`request.state`) rather than dictionary keys: -| Key | Type | Description | +| Attribute | Type | Description | |----|----|-------------| -| `request_id` | `str` | The join request id. Pass this to [`accept`](./community.md#acceptpending_request_id) or [`decline`](./community.md#declinepending_request_id). | +| `id` | `str` | The join request id. Pass this to [`accept`](./community.md#acceptpending_request_id) or [`decline`](./community.md#declinepending_request_id). | | `state` | `str` | The state the request moved into - see the table below. | | `public_key` | `str` | Public key of the requesting member. | @@ -568,12 +568,12 @@ community = Community(account, url=url) # Auto-accept everyone who asks to join for request in community.listen_requests(): - print(f"{request['public_key']}\t{request['state']}") + print(f"{request.public_key}\t{request.state}") - if request["state"] != "pending": + if request.state != "pending": continue - community.accept(request["request_id"]) + community.accept(request.id) community["general"].send_message("Welcome to the community!") ``` @@ -1239,6 +1239,42 @@ message_id = channel.send_image("./meme-67.png", "Daily random meme") print(f"Sent image: {message_id}") ``` +### `send_emoji_reaction(message_id, emoji_shortname)` + +React to a message in the channel with an emoji, the same as reacting to a message in Status App. The reaction is a **toggle** - calling the method again with the same emoji on the same message removes it, so the same call both sets and unsets the reaction. + +Emojis are identified by their **shortname**, exactly as Status App names them (`:thumbsup:`, `:heart_eyes:`). The surrounding colons are optional - `thumbsup` and `:thumbsup:` are the same emoji - and the full list of supported shortnames is documented under [Emojis](./utils.md#emojis). + +| Name | Type | Required | Description | +|-----|-----|-----|-------------| +| `message_id` | `str` | Yes | The `id` of the message to react to. Message IDs can be obtained from the `id` key of [`get_messages`](./community.md#get_messagesstart_timestampnone-end_timestampnone), or directly from the return value of [`send_message`](./community.md#send_messagemessage-reply_to_message_idnone) / [`send_image`](./community.md#send_imagefile_path-messagenone-reply_to_message_idnone). | +| `emoji_shortname` | `str` | Yes | The emoji shortname as in Status App, with or without the surrounding colons. See [Emojis](./utils.md#emojis) for all supported values. | + +```python +from status_sdk import Account, Community + +account = Account() +params = { + "name": "status-app-bot", + "password": "SNTPUMP" +} +account.login(**params) + +url = "https://status.app/c/G3QAAMQn9ueHRsR3W5Ouuy25fkCxziknAIEkCbYAoC04HjyGeQ6X8k45q3GVeyZiksbd38tQ4S_EfhrJKhRV3sDvjhmrCuSoDBIf2QJiEKwAOZipxis8ntNRVyPhC5IoWaEsj9X4P5zw093pcLofZzTV2gM=#zQ3shZeEJqTC1xhGUjxuS4rtHSrhJ8vUYp64v6qWkLpvdy9L9" +community = Community(account, url=url) + +channel = community["general"] + +# Messages are returned newest first, so this is the latest message in the channel +messages = channel.get_messages() +latest = messages[0] + +channel.send_emoji_reaction(latest["id"], ":thumbsup:") + +# Reacting with the same emoji again removes the reaction +channel.send_emoji_reaction(latest["id"], ":thumbsup:") +``` + ### `get_messages(start_timestamp=None, end_timestamp=None)` Retrieve messages from the channel within an optional time range. Messages are returned in **descending order** (newest to oldest). diff --git a/docs/group-chat.md b/docs/group-chat.md index 2496a9f..58e8b76 100644 --- a/docs/group-chat.md +++ b/docs/group-chat.md @@ -252,6 +252,40 @@ message_id = group_chat.send_image("./meme-67.png", "Daily random meme") print(f"Sent image: {message_id}") ``` +### `send_emoji_reaction(message_id, emoji_shortname)` + +React to a message in the group chat with an emoji, the same as reacting to a message in Status App. The reaction is a **toggle** - calling the method again with the same emoji on the same message removes it, so the same call both sets and unsets the reaction. + +Emojis are identified by their **shortname**, exactly as Status App names them (`:thumbsup:`, `:heart_eyes:`). The surrounding colons are optional - `thumbsup` and `:thumbsup:` are the same emoji - and the full list of supported shortnames is documented under [Emojis](./utils.md#emojis). + +| Name | Type | Required | Description | +|-----|-----|-----|-------------| +| `message_id` | `str` | Yes | The `id` of the message to react to. Message IDs can be obtained from the `id` key of [`get_messages`](./group-chat.md#get_messagesstart_timestampnone-end_timestampnone), or directly from the return value of [`send_message`](./group-chat.md#send_messagemessage-reply_to_message_idnone) / [`send_image`](./group-chat.md#send_imagefile_path-messagenone-reply_to_message_idnone). | +| `emoji_shortname` | `str` | Yes | The emoji shortname as in Status App, with or without the surrounding colons. See [Emojis](./utils.md#emojis) for all supported values. | + +```python +from status_sdk import Account, GroupChat + +account = Account() +params = { + "name": "status-app-bot", + "password": "SNTPUMP" +} +account.login(**params) + +chat = [chat for chat in account.chats if chat["type"] == "group_chat"][0] +group_chat = GroupChat(account, chat["id"]) + +# Messages are returned newest first, so this is the latest message in the chat +messages = group_chat.get_messages() +latest = messages[0] + +group_chat.send_emoji_reaction(latest["id"], ":thumbsup:") + +# Reacting with the same emoji again removes the reaction +group_chat.send_emoji_reaction(latest["id"], ":thumbsup:") +``` + ### `delete_message(id)` Delete one of your **own** messages from the group chat. The deletion is propagated to the other members, so the message disappears for everybody. You can only delete messages that the logged-in account has sent. diff --git a/docs/utils.md b/docs/utils.md index c15eca3..a47fb15 100644 --- a/docs/utils.md +++ b/docs/utils.md @@ -136,3 +136,1879 @@ pip install -e . Treat `dev` as "not installed" rather than as a real release - it is deliberately lower than every published version, so the `packaging` check above will fail against it. +## Emojis + +Status App identifies every emoji by a **shortname** - a lowercase name wrapped in colons, such as `:thumbsup:` or `:heart_eyes:`. The SDK ships the available Status App emojis. All supported shortnames: + +| Emoji | Emoji Short Name | unicode | +|:-------------------------------------------|:---------------------------------------------|:---------------------------------------------| +| :grinning: | `:grinning:` | `1f600` | +| :smiley: | `:smiley:` | `1f603` | +| :smile: | `:smile:` | `1f604` | +| :grin: | `:grin:` | `1f601` | +| :laughing: | `:laughing:` | `1f606` | +| :sweat_smile: | `:sweat_smile:` | `1f605` | +| :rofl: | `:rofl:` | `1f923` | +| :joy: | `:joy:` | `1f602` | +| :slight_smile: | `:slight_smile:` | `1f642` | +| :upside_down: | `:upside_down:` | `1f643` | +| :melting_face: | `:melting_face:` | `1fae0` | +| :wink: | `:wink:` | `1f609` | +| :blush: | `:blush:` | `1f60a` | +| :innocent: | `:innocent:` | `1f607` | +| :smiling_face_with_3_hearts: | `:smiling_face_with_3_hearts:` | `1f970` | +| :heart_eyes: | `:heart_eyes:` | `1f60d` | +| :star_struck: | `:star_struck:` | `1f929` | +| :kissing_heart: | `:kissing_heart:` | `1f618` | +| :kissing: | `:kissing:` | `1f617` | +| :relaxed: | `:relaxed:` | `263a` | +| :kissing_closed_eyes: | `:kissing_closed_eyes:` | `1f61a` | +| :kissing_smiling_eyes: | `:kissing_smiling_eyes:` | `1f619` | +| :smiling_face_with_tear: | `:smiling_face_with_tear:` | `1f972` | +| :yum: | `:yum:` | `1f60b` | +| :stuck_out_tongue: | `:stuck_out_tongue:` | `1f61b` | +| :stuck_out_tongue_winking_eye: | `:stuck_out_tongue_winking_eye:` | `1f61c` | +| :zany_face: | `:zany_face:` | `1f92a` | +| :stuck_out_tongue_closed_eyes: | `:stuck_out_tongue_closed_eyes:` | `1f61d` | +| :money_mouth: | `:money_mouth:` | `1f911` | +| :hugging: | `:hugging:` | `1f917` | +| :face_with_hand_over_mouth: | `:face_with_hand_over_mouth:` | `1f92d` | +| :face_with_open_eyes_and_hand_over_mouth: | `:face_with_open_eyes_and_hand_over_mouth:` | `1fae2` | +| :face_with_peeking_eye: | `:face_with_peeking_eye:` | `1fae3` | +| :shushing_face: | `:shushing_face:` | `1f92b` | +| :thinking: | `:thinking:` | `1f914` | +| :saluting_face: | `:saluting_face:` | `1fae1` | +| :zipper_mouth: | `:zipper_mouth:` | `1f910` | +| :face_with_raised_eyebrow: | `:face_with_raised_eyebrow:` | `1f928` | +| :neutral_face: | `:neutral_face:` | `1f610` | +| :expressionless: | `:expressionless:` | `1f611` | +| :no_mouth: | `:no_mouth:` | `1f636` | +| :dotted_line_face: | `:dotted_line_face:` | `1fae5` | +| :face_in_clouds: | `:face_in_clouds:` | `1f636-200d-1f32b-fe0f` | +| :smirk: | `:smirk:` | `1f60f` | +| :unamused: | `:unamused:` | `1f612` | +| :rolling_eyes: | `:rolling_eyes:` | `1f644` | +| :grimacing: | `:grimacing:` | `1f62c` | +| :face_exhaling: | `:face_exhaling:` | `1f62e-200d-1f4a8` | +| :lying_face: | `:lying_face:` | `1f925` | +| :shaking_face: | `:shaking_face:` | `1fae8` | +| :relieved: | `:relieved:` | `1f60c` | +| :pensive: | `:pensive:` | `1f614` | +| :sleepy: | `:sleepy:` | `1f62a` | +| :drooling_face: | `:drooling_face:` | `1f924` | +| :sleeping: | `:sleeping:` | `1f634` | +| :mask: | `:mask:` | `1f637` | +| :thermometer_face: | `:thermometer_face:` | `1f912` | +| :head_bandage: | `:head_bandage:` | `1f915` | +| :nauseated_face: | `:nauseated_face:` | `1f922` | +| :face_vomiting: | `:face_vomiting:` | `1f92e` | +| :sneezing_face: | `:sneezing_face:` | `1f927` | +| :hot_face: | `:hot_face:` | `1f975` | +| :cold_face: | `:cold_face:` | `1f976` | +| :woozy_face: | `:woozy_face:` | `1f974` | +| :dizzy_face: | `:dizzy_face:` | `1f635` | +| :face_with_spiral_eyes: | `:face_with_spiral_eyes:` | `1f635-200d-1f4ab` | +| :exploding_head: | `:exploding_head:` | `1f92f` | +| :cowboy: | `:cowboy:` | `1f920` | +| :partying_face: | `:partying_face:` | `1f973` | +| :disguised_face: | `:disguised_face:` | `1f978` | +| :sunglasses: | `:sunglasses:` | `1f60e` | +| :nerd: | `:nerd:` | `1f913` | +| :face_with_monocle: | `:face_with_monocle:` | `1f9d0` | +| :confused: | `:confused:` | `1f615` | +| :face_with_diagonal_mouth: | `:face_with_diagonal_mouth:` | `1fae4` | +| :worried: | `:worried:` | `1f61f` | +| :slight_frown: | `:slight_frown:` | `1f641` | +| :frowning2: | `:frowning2:` | `2639` | +| :open_mouth: | `:open_mouth:` | `1f62e` | +| :hushed: | `:hushed:` | `1f62f` | +| :astonished: | `:astonished:` | `1f632` | +| :flushed: | `:flushed:` | `1f633` | +| :pleading_face: | `:pleading_face:` | `1f97a` | +| :face_holding_back_tears: | `:face_holding_back_tears:` | `1f979` | +| :frowning: | `:frowning:` | `1f626` | +| :anguished: | `:anguished:` | `1f627` | +| :fearful: | `:fearful:` | `1f628` | +| :cold_sweat: | `:cold_sweat:` | `1f630` | +| :disappointed_relieved: | `:disappointed_relieved:` | `1f625` | +| :cry: | `:cry:` | `1f622` | +| :sob: | `:sob:` | `1f62d` | +| :scream: | `:scream:` | `1f631` | +| :confounded: | `:confounded:` | `1f616` | +| :persevere: | `:persevere:` | `1f623` | +| :disappointed: | `:disappointed:` | `1f61e` | +| :sweat: | `:sweat:` | `1f613` | +| :weary: | `:weary:` | `1f629` | +| :tired_face: | `:tired_face:` | `1f62b` | +| :yawning_face: | `:yawning_face:` | `1f971` | +| :triumph: | `:triumph:` | `1f624` | +| :rage: | `:rage:` | `1f621` | +| :angry: | `:angry:` | `1f620` | +| :face_with_symbols_over_mouth: | `:face_with_symbols_over_mouth:` | `1f92c` | +| :smiling_imp: | `:smiling_imp:` | `1f608` | +| :imp: | `:imp:` | `1f47f` | +| :skull: | `:skull:` | `1f480` | +| :skull_crossbones: | `:skull_crossbones:` | `2620` | +| :poop: | `:poop:` | `1f4a9` | +| :clown: | `:clown:` | `1f921` | +| :japanese_ogre: | `:japanese_ogre:` | `1f479` | +| :japanese_goblin: | `:japanese_goblin:` | `1f47a` | +| :ghost: | `:ghost:` | `1f47b` | +| :alien: | `:alien:` | `1f47d` | +| :space_invader: | `:space_invader:` | `1f47e` | +| :robot: | `:robot:` | `1f916` | +| :smiley_cat: | `:smiley_cat:` | `1f63a` | +| :smile_cat: | `:smile_cat:` | `1f638` | +| :joy_cat: | `:joy_cat:` | `1f639` | +| :heart_eyes_cat: | `:heart_eyes_cat:` | `1f63b` | +| :smirk_cat: | `:smirk_cat:` | `1f63c` | +| :kissing_cat: | `:kissing_cat:` | `1f63d` | +| :scream_cat: | `:scream_cat:` | `1f640` | +| :crying_cat_face: | `:crying_cat_face:` | `1f63f` | +| :pouting_cat: | `:pouting_cat:` | `1f63e` | +| :see_no_evil: | `:see_no_evil:` | `1f648` | +| :hear_no_evil: | `:hear_no_evil:` | `1f649` | +| :speak_no_evil: | `:speak_no_evil:` | `1f64a` | +| :love_letter: | `:love_letter:` | `1f48c` | +| :cupid: | `:cupid:` | `1f498` | +| :gift_heart: | `:gift_heart:` | `1f49d` | +| :sparkling_heart: | `:sparkling_heart:` | `1f496` | +| :heartpulse: | `:heartpulse:` | `1f497` | +| :heartbeat: | `:heartbeat:` | `1f493` | +| :revolving_hearts: | `:revolving_hearts:` | `1f49e` | +| :two_hearts: | `:two_hearts:` | `1f495` | +| :heart_decoration: | `:heart_decoration:` | `1f49f` | +| :heart_exclamation: | `:heart_exclamation:` | `2763` | +| :broken_heart: | `:broken_heart:` | `1f494` | +| :heart_on_fire: | `:heart_on_fire:` | `2764-fe0f-200d-1f525` | +| :mending_heart: | `:mending_heart:` | `2764-fe0f-200d-1fa79` | +| :heart: | `:heart:` | `2764` | +| :pink_heart: | `:pink_heart:` | `1fa77` | +| :orange_heart: | `:orange_heart:` | `1f9e1` | +| :yellow_heart: | `:yellow_heart:` | `1f49b` | +| :green_heart: | `:green_heart:` | `1f49a` | +| :blue_heart: | `:blue_heart:` | `1f499` | +| :light_blue_heart: | `:light_blue_heart:` | `1fa75` | +| :purple_heart: | `:purple_heart:` | `1f49c` | +| :brown_heart: | `:brown_heart:` | `1f90e` | +| :black_heart: | `:black_heart:` | `1f5a4` | +| :grey_heart: | `:grey_heart:` | `1fa76` | +| :white_heart: | `:white_heart:` | `1f90d` | +| :kiss: | `:kiss:` | `1f48b` | +| :100: | `:100:` | `1f4af` | +| :anger: | `:anger:` | `1f4a2` | +| :boom: | `:boom:` | `1f4a5` | +| :dizzy: | `:dizzy:` | `1f4ab` | +| :sweat_drops: | `:sweat_drops:` | `1f4a6` | +| :dash: | `:dash:` | `1f4a8` | +| :hole: | `:hole:` | `1f573` | +| :speech_balloon: | `:speech_balloon:` | `1f4ac` | +| :eye_in_speech_bubble: | `:eye_in_speech_bubble:` | `1f441-200d-1f5e8` | +| :speech_left: | `:speech_left:` | `1f5e8` | +| :anger_right: | `:anger_right:` | `1f5ef` | +| :thought_balloon: | `:thought_balloon:` | `1f4ad` | +| :zzz: | `:zzz:` | `1f4a4` | +| :wave: | `:wave:` | `1f44b` | +| :raised_back_of_hand: | `:raised_back_of_hand:` | `1f91a` | +| :hand_splayed: | `:hand_splayed:` | `1f590` | +| :raised_hand: | `:raised_hand:` | `270b` | +| :vulcan: | `:vulcan:` | `1f596` | +| :rightwards_hand: | `:rightwards_hand:` | `1faf1` | +| :leftwards_hand: | `:leftwards_hand:` | `1faf2` | +| :palm_down_hand: | `:palm_down_hand:` | `1faf3` | +| :palm_up_hand: | `:palm_up_hand:` | `1faf4` | +| :leftwards_pushing_hand: | `:leftwards_pushing_hand:` | `1faf7` | +| :rightwards_pushing_hand: | `:rightwards_pushing_hand:` | `1faf8` | +| :ok_hand: | `:ok_hand:` | `1f44c` | +| :pinched_fingers: | `:pinched_fingers:` | `1f90c` | +| :pinching_hand: | `:pinching_hand:` | `1f90f` | +| :v: | `:v:` | `270c` | +| :fingers_crossed: | `:fingers_crossed:` | `1f91e` | +| :hand_with_index_finger_and_thumb_crossed: | `:hand_with_index_finger_and_thumb_crossed:` | `1faf0` | +| :love_you_gesture: | `:love_you_gesture:` | `1f91f` | +| :metal: | `:metal:` | `1f918` | +| :call_me: | `:call_me:` | `1f919` | +| :point_left: | `:point_left:` | `1f448` | +| :point_right: | `:point_right:` | `1f449` | +| :point_up_2: | `:point_up_2:` | `1f446` | +| :middle_finger: | `:middle_finger:` | `1f595` | +| :point_down: | `:point_down:` | `1f447` | +| :point_up: | `:point_up:` | `261d` | +| :index_pointing_at_the_viewer: | `:index_pointing_at_the_viewer:` | `1faf5` | +| :thumbsup: | `:thumbsup:` | `1f44d` | +| :thumbsdown: | `:thumbsdown:` | `1f44e` | +| :fist: | `:fist:` | `270a` | +| :punch: | `:punch:` | `1f44a` | +| :left_facing_fist: | `:left_facing_fist:` | `1f91b` | +| :right_facing_fist: | `:right_facing_fist:` | `1f91c` | +| :clap: | `:clap:` | `1f44f` | +| :raised_hands: | `:raised_hands:` | `1f64c` | +| :heart_hands: | `:heart_hands:` | `1faf6` | +| :open_hands: | `:open_hands:` | `1f450` | +| :palms_up_together: | `:palms_up_together:` | `1f932` | +| :handshake: | `:handshake:` | `1f91d` | +| :pray: | `:pray:` | `1f64f` | +| :writing_hand: | `:writing_hand:` | `270d` | +| :nail_care: | `:nail_care:` | `1f485` | +| :selfie: | `:selfie:` | `1f933` | +| :muscle: | `:muscle:` | `1f4aa` | +| :mechanical_arm: | `:mechanical_arm:` | `1f9be` | +| :mechanical_leg: | `:mechanical_leg:` | `1f9bf` | +| :leg: | `:leg:` | `1f9b5` | +| :foot: | `:foot:` | `1f9b6` | +| :ear: | `:ear:` | `1f442` | +| :ear_with_hearing_aid: | `:ear_with_hearing_aid:` | `1f9bb` | +| :nose: | `:nose:` | `1f443` | +| :brain: | `:brain:` | `1f9e0` | +| :anatomical_heart: | `:anatomical_heart:` | `1fac0` | +| :lungs: | `:lungs:` | `1fac1` | +| :tooth: | `:tooth:` | `1f9b7` | +| :bone: | `:bone:` | `1f9b4` | +| :eyes: | `:eyes:` | `1f440` | +| :eye: | `:eye:` | `1f441` | +| :tongue: | `:tongue:` | `1f445` | +| :lips: | `:lips:` | `1f444` | +| :biting_lip: | `:biting_lip:` | `1fae6` | +| :baby: | `:baby:` | `1f476` | +| :child: | `:child:` | `1f9d2` | +| :boy: | `:boy:` | `1f466` | +| :girl: | `:girl:` | `1f467` | +| :adult: | `:adult:` | `1f9d1` | +| :blond_haired_person: | `:blond_haired_person:` | `1f471` | +| :man: | `:man:` | `1f468` | +| :bearded_person: | `:bearded_person:` | `1f9d4` | +| :man_beard: | `:man_beard:` | `1f9d4-200d-2642-fe0f` | +| :woman_beard: | `:woman_beard:` | `1f9d4-200d-2640-fe0f` | +| :man_red_haired: | `:man_red_haired:` | `1f468-200d-1f9b0` | +| :man_curly_haired: | `:man_curly_haired:` | `1f468-200d-1f9b1` | +| :man_white_haired: | `:man_white_haired:` | `1f468-200d-1f9b3` | +| :man_bald: | `:man_bald:` | `1f468-200d-1f9b2` | +| :woman: | `:woman:` | `1f469` | +| :woman_red_haired: | `:woman_red_haired:` | `1f469-200d-1f9b0` | +| :person_red_hair: | `:person_red_hair:` | `1f9d1-200d-1f9b0` | +| :woman_curly_haired: | `:woman_curly_haired:` | `1f469-200d-1f9b1` | +| :person_curly_hair: | `:person_curly_hair:` | `1f9d1-200d-1f9b1` | +| :woman_white_haired: | `:woman_white_haired:` | `1f469-200d-1f9b3` | +| :person_white_hair: | `:person_white_hair:` | `1f9d1-200d-1f9b3` | +| :woman_bald: | `:woman_bald:` | `1f469-200d-1f9b2` | +| :person_bald: | `:person_bald:` | `1f9d1-200d-1f9b2` | +| :blond-haired_woman: | `:blond-haired_woman:` | `1f471-200d-2640-fe0f` | +| :blond-haired_man: | `:blond-haired_man:` | `1f471-200d-2642-fe0f` | +| :older_adult: | `:older_adult:` | `1f9d3` | +| :older_man: | `:older_man:` | `1f474` | +| :older_woman: | `:older_woman:` | `1f475` | +| :person_frowning: | `:person_frowning:` | `1f64d` | +| :man_frowning: | `:man_frowning:` | `1f64d-200d-2642-fe0f` | +| :woman_frowning: | `:woman_frowning:` | `1f64d-200d-2640-fe0f` | +| :person_pouting: | `:person_pouting:` | `1f64e` | +| :man_pouting: | `:man_pouting:` | `1f64e-200d-2642-fe0f` | +| :woman_pouting: | `:woman_pouting:` | `1f64e-200d-2640-fe0f` | +| :person_gesturing_no: | `:person_gesturing_no:` | `1f645` | +| :man_gesturing_no: | `:man_gesturing_no:` | `1f645-200d-2642-fe0f` | +| :woman_gesturing_no: | `:woman_gesturing_no:` | `1f645-200d-2640-fe0f` | +| :person_gesturing_ok: | `:person_gesturing_ok:` | `1f646` | +| :man_gesturing_ok: | `:man_gesturing_ok:` | `1f646-200d-2642-fe0f` | +| :woman_gesturing_ok: | `:woman_gesturing_ok:` | `1f646-200d-2640-fe0f` | +| :person_tipping_hand: | `:person_tipping_hand:` | `1f481` | +| :man_tipping_hand: | `:man_tipping_hand:` | `1f481-200d-2642-fe0f` | +| :woman_tipping_hand: | `:woman_tipping_hand:` | `1f481-200d-2640-fe0f` | +| :person_raising_hand: | `:person_raising_hand:` | `1f64b` | +| :man_raising_hand: | `:man_raising_hand:` | `1f64b-200d-2642-fe0f` | +| :woman_raising_hand: | `:woman_raising_hand:` | `1f64b-200d-2640-fe0f` | +| :deaf_person: | `:deaf_person:` | `1f9cf` | +| :deaf_man: | `:deaf_man:` | `1f9cf-200d-2642-fe0f` | +| :deaf_woman: | `:deaf_woman:` | `1f9cf-200d-2640-fe0f` | +| :person_bowing: | `:person_bowing:` | `1f647` | +| :man_bowing: | `:man_bowing:` | `1f647-200d-2642-fe0f` | +| :woman_bowing: | `:woman_bowing:` | `1f647-200d-2640-fe0f` | +| :person_facepalming: | `:person_facepalming:` | `1f926` | +| :man_facepalming: | `:man_facepalming:` | `1f926-200d-2642-fe0f` | +| :woman_facepalming: | `:woman_facepalming:` | `1f926-200d-2640-fe0f` | +| :person_shrugging: | `:person_shrugging:` | `1f937` | +| :man_shrugging: | `:man_shrugging:` | `1f937-200d-2642-fe0f` | +| :woman_shrugging: | `:woman_shrugging:` | `1f937-200d-2640-fe0f` | +| :health_worker: | `:health_worker:` | `1f9d1-200d-2695-fe0f` | +| :man_health_worker: | `:man_health_worker:` | `1f468-200d-2695-fe0f` | +| :woman_health_worker: | `:woman_health_worker:` | `1f469-200d-2695-fe0f` | +| :student: | `:student:` | `1f9d1-200d-1f393` | +| :man_student: | `:man_student:` | `1f468-200d-1f393` | +| :woman_student: | `:woman_student:` | `1f469-200d-1f393` | +| :teacher: | `:teacher:` | `1f9d1-200d-1f3eb` | +| :man_teacher: | `:man_teacher:` | `1f468-200d-1f3eb` | +| :woman_teacher: | `:woman_teacher:` | `1f469-200d-1f3eb` | +| :judge: | `:judge:` | `1f9d1-200d-2696-fe0f` | +| :man_judge: | `:man_judge:` | `1f468-200d-2696-fe0f` | +| :woman_judge: | `:woman_judge:` | `1f469-200d-2696-fe0f` | +| :farmer: | `:farmer:` | `1f9d1-200d-1f33e` | +| :man_farmer: | `:man_farmer:` | `1f468-200d-1f33e` | +| :woman_farmer: | `:woman_farmer:` | `1f469-200d-1f33e` | +| :cook: | `:cook:` | `1f9d1-200d-1f373` | +| :man_cook: | `:man_cook:` | `1f468-200d-1f373` | +| :woman_cook: | `:woman_cook:` | `1f469-200d-1f373` | +| :mechanic: | `:mechanic:` | `1f9d1-200d-1f527` | +| :man_mechanic: | `:man_mechanic:` | `1f468-200d-1f527` | +| :woman_mechanic: | `:woman_mechanic:` | `1f469-200d-1f527` | +| :factory_worker: | `:factory_worker:` | `1f9d1-200d-1f3ed` | +| :man_factory_worker: | `:man_factory_worker:` | `1f468-200d-1f3ed` | +| :woman_factory_worker: | `:woman_factory_worker:` | `1f469-200d-1f3ed` | +| :office_worker: | `:office_worker:` | `1f9d1-200d-1f4bc` | +| :man_office_worker: | `:man_office_worker:` | `1f468-200d-1f4bc` | +| :woman_office_worker: | `:woman_office_worker:` | `1f469-200d-1f4bc` | +| :scientist: | `:scientist:` | `1f9d1-200d-1f52c` | +| :man_scientist: | `:man_scientist:` | `1f468-200d-1f52c` | +| :woman_scientist: | `:woman_scientist:` | `1f469-200d-1f52c` | +| :technologist: | `:technologist:` | `1f9d1-200d-1f4bb` | +| :man_technologist: | `:man_technologist:` | `1f468-200d-1f4bb` | +| :woman_technologist: | `:woman_technologist:` | `1f469-200d-1f4bb` | +| :singer: | `:singer:` | `1f9d1-200d-1f3a4` | +| :man_singer: | `:man_singer:` | `1f468-200d-1f3a4` | +| :woman_singer: | `:woman_singer:` | `1f469-200d-1f3a4` | +| :artist: | `:artist:` | `1f9d1-200d-1f3a8` | +| :man_artist: | `:man_artist:` | `1f468-200d-1f3a8` | +| :woman_artist: | `:woman_artist:` | `1f469-200d-1f3a8` | +| :pilot: | `:pilot:` | `1f9d1-200d-2708-fe0f` | +| :man_pilot: | `:man_pilot:` | `1f468-200d-2708-fe0f` | +| :woman_pilot: | `:woman_pilot:` | `1f469-200d-2708-fe0f` | +| :astronaut: | `:astronaut:` | `1f9d1-200d-1f680` | +| :man_astronaut: | `:man_astronaut:` | `1f468-200d-1f680` | +| :woman_astronaut: | `:woman_astronaut:` | `1f469-200d-1f680` | +| :firefighter: | `:firefighter:` | `1f9d1-200d-1f692` | +| :man_firefighter: | `:man_firefighter:` | `1f468-200d-1f692` | +| :woman_firefighter: | `:woman_firefighter:` | `1f469-200d-1f692` | +| :police_officer: | `:police_officer:` | `1f46e` | +| :man_police_officer: | `:man_police_officer:` | `1f46e-200d-2642-fe0f` | +| :woman_police_officer: | `:woman_police_officer:` | `1f46e-200d-2640-fe0f` | +| :detective: | `:detective:` | `1f575` | +| :man_detective: | `:man_detective:` | `1f575-fe0f-200d-2642-fe0f` | +| :woman_detective: | `:woman_detective:` | `1f575-fe0f-200d-2640-fe0f` | +| :guard: | `:guard:` | `1f482` | +| :man_guard: | `:man_guard:` | `1f482-200d-2642-fe0f` | +| :woman_guard: | `:woman_guard:` | `1f482-200d-2640-fe0f` | +| :ninja: | `:ninja:` | `1f977` | +| :construction_worker: | `:construction_worker:` | `1f477` | +| :man_construction_worker: | `:man_construction_worker:` | `1f477-200d-2642-fe0f` | +| :woman_construction_worker: | `:woman_construction_worker:` | `1f477-200d-2640-fe0f` | +| :person_with_crown: | `:person_with_crown:` | `1fac5` | +| :prince: | `:prince:` | `1f934` | +| :princess: | `:princess:` | `1f478` | +| :person_wearing_turban: | `:person_wearing_turban:` | `1f473` | +| :man_wearing_turban: | `:man_wearing_turban:` | `1f473-200d-2642-fe0f` | +| :woman_wearing_turban: | `:woman_wearing_turban:` | `1f473-200d-2640-fe0f` | +| :man_with_chinese_cap: | `:man_with_chinese_cap:` | `1f472` | +| :woman_with_headscarf: | `:woman_with_headscarf:` | `1f9d5` | +| :person_in_tuxedo: | `:person_in_tuxedo:` | `1f935` | +| :man_in_tuxedo: | `:man_in_tuxedo:` | `1f935-200d-2642-fe0f` | +| :woman_in_tuxedo: | `:woman_in_tuxedo:` | `1f935-200d-2640-fe0f` | +| :person_with_veil: | `:person_with_veil:` | `1f470` | +| :man_with_veil: | `:man_with_veil:` | `1f470-200d-2642-fe0f` | +| :woman_with_veil: | `:woman_with_veil:` | `1f470-200d-2640-fe0f` | +| :pregnant_woman: | `:pregnant_woman:` | `1f930` | +| :pregnant_man: | `:pregnant_man:` | `1fac3` | +| :pregnant_person: | `:pregnant_person:` | `1fac4` | +| :breast_feeding: | `:breast_feeding:` | `1f931` | +| :woman_feeding_baby: | `:woman_feeding_baby:` | `1f469-200d-1f37c` | +| :man_feeding_baby: | `:man_feeding_baby:` | `1f468-200d-1f37c` | +| :person_feeding_baby: | `:person_feeding_baby:` | `1f9d1-200d-1f37c` | +| :angel: | `:angel:` | `1f47c` | +| :santa: | `:santa:` | `1f385` | +| :mrs_claus: | `:mrs_claus:` | `1f936` | +| :mx_claus: | `:mx_claus:` | `1f9d1-200d-1f384` | +| :superhero: | `:superhero:` | `1f9b8` | +| :man_superhero: | `:man_superhero:` | `1f9b8-200d-2642-fe0f` | +| :woman_superhero: | `:woman_superhero:` | `1f9b8-200d-2640-fe0f` | +| :supervillain: | `:supervillain:` | `1f9b9` | +| :man_supervillain: | `:man_supervillain:` | `1f9b9-200d-2642-fe0f` | +| :woman_supervillain: | `:woman_supervillain:` | `1f9b9-200d-2640-fe0f` | +| :mage: | `:mage:` | `1f9d9` | +| :man_mage: | `:man_mage:` | `1f9d9-200d-2642-fe0f` | +| :woman_mage: | `:woman_mage:` | `1f9d9-200d-2640-fe0f` | +| :fairy: | `:fairy:` | `1f9da` | +| :man_fairy: | `:man_fairy:` | `1f9da-200d-2642-fe0f` | +| :woman_fairy: | `:woman_fairy:` | `1f9da-200d-2640-fe0f` | +| :vampire: | `:vampire:` | `1f9db` | +| :man_vampire: | `:man_vampire:` | `1f9db-200d-2642-fe0f` | +| :woman_vampire: | `:woman_vampire:` | `1f9db-200d-2640-fe0f` | +| :merperson: | `:merperson:` | `1f9dc` | +| :merman: | `:merman:` | `1f9dc-200d-2642-fe0f` | +| :mermaid: | `:mermaid:` | `1f9dc-200d-2640-fe0f` | +| :elf: | `:elf:` | `1f9dd` | +| :man_elf: | `:man_elf:` | `1f9dd-200d-2642-fe0f` | +| :woman_elf: | `:woman_elf:` | `1f9dd-200d-2640-fe0f` | +| :genie: | `:genie:` | `1f9de` | +| :man_genie: | `:man_genie:` | `1f9de-200d-2642-fe0f` | +| :woman_genie: | `:woman_genie:` | `1f9de-200d-2640-fe0f` | +| :zombie: | `:zombie:` | `1f9df` | +| :man_zombie: | `:man_zombie:` | `1f9df-200d-2642-fe0f` | +| :woman_zombie: | `:woman_zombie:` | `1f9df-200d-2640-fe0f` | +| :troll: | `:troll:` | `1f9cc` | +| :person_getting_massage: | `:person_getting_massage:` | `1f486` | +| :man_getting_face_massage: | `:man_getting_face_massage:` | `1f486-200d-2642-fe0f` | +| :woman_getting_face_massage: | `:woman_getting_face_massage:` | `1f486-200d-2640-fe0f` | +| :person_getting_haircut: | `:person_getting_haircut:` | `1f487` | +| :man_getting_haircut: | `:man_getting_haircut:` | `1f487-200d-2642-fe0f` | +| :woman_getting_haircut: | `:woman_getting_haircut:` | `1f487-200d-2640-fe0f` | +| :person_walking: | `:person_walking:` | `1f6b6` | +| :man_walking: | `:man_walking:` | `1f6b6-200d-2642-fe0f` | +| :woman_walking: | `:woman_walking:` | `1f6b6-200d-2640-fe0f` | +| :person_standing: | `:person_standing:` | `1f9cd` | +| :man_standing: | `:man_standing:` | `1f9cd-200d-2642-fe0f` | +| :woman_standing: | `:woman_standing:` | `1f9cd-200d-2640-fe0f` | +| :person_kneeling: | `:person_kneeling:` | `1f9ce` | +| :man_kneeling: | `:man_kneeling:` | `1f9ce-200d-2642-fe0f` | +| :woman_kneeling: | `:woman_kneeling:` | `1f9ce-200d-2640-fe0f` | +| :person_with_probing_cane: | `:person_with_probing_cane:` | `1f9d1-200d-1f9af` | +| :man_with_probing_cane: | `:man_with_probing_cane:` | `1f468-200d-1f9af` | +| :woman_with_probing_cane: | `:woman_with_probing_cane:` | `1f469-200d-1f9af` | +| :person_in_motorized_wheelchair: | `:person_in_motorized_wheelchair:` | `1f9d1-200d-1f9bc` | +| :man_in_motorized_wheelchair: | `:man_in_motorized_wheelchair:` | `1f468-200d-1f9bc` | +| :woman_in_motorized_wheelchair: | `:woman_in_motorized_wheelchair:` | `1f469-200d-1f9bc` | +| :person_in_manual_wheelchair: | `:person_in_manual_wheelchair:` | `1f9d1-200d-1f9bd` | +| :man_in_manual_wheelchair: | `:man_in_manual_wheelchair:` | `1f468-200d-1f9bd` | +| :woman_in_manual_wheelchair: | `:woman_in_manual_wheelchair:` | `1f469-200d-1f9bd` | +| :person_running: | `:person_running:` | `1f3c3` | +| :man_running: | `:man_running:` | `1f3c3-200d-2642-fe0f` | +| :woman_running: | `:woman_running:` | `1f3c3-200d-2640-fe0f` | +| :dancer: | `:dancer:` | `1f483` | +| :man_dancing: | `:man_dancing:` | `1f57a` | +| :levitate: | `:levitate:` | `1f574` | +| :people_with_bunny_ears_partying: | `:people_with_bunny_ears_partying:` | `1f46f` | +| :men_with_bunny_ears_partying: | `:men_with_bunny_ears_partying:` | `1f46f-200d-2642-fe0f` | +| :women_with_bunny_ears_partying: | `:women_with_bunny_ears_partying:` | `1f46f-200d-2640-fe0f` | +| :person_in_steamy_room: | `:person_in_steamy_room:` | `1f9d6` | +| :man_in_steamy_room: | `:man_in_steamy_room:` | `1f9d6-200d-2642-fe0f` | +| :woman_in_steamy_room: | `:woman_in_steamy_room:` | `1f9d6-200d-2640-fe0f` | +| :person_climbing: | `:person_climbing:` | `1f9d7` | +| :man_climbing: | `:man_climbing:` | `1f9d7-200d-2642-fe0f` | +| :woman_climbing: | `:woman_climbing:` | `1f9d7-200d-2640-fe0f` | +| :person_fencing: | `:person_fencing:` | `1f93a` | +| :horse_racing: | `:horse_racing:` | `1f3c7` | +| :skier: | `:skier:` | `26f7` | +| :snowboarder: | `:snowboarder:` | `1f3c2` | +| :person_golfing: | `:person_golfing:` | `1f3cc` | +| :man_golfing: | `:man_golfing:` | `1f3cc-fe0f-200d-2642-fe0f` | +| :woman_golfing: | `:woman_golfing:` | `1f3cc-fe0f-200d-2640-fe0f` | +| :person_surfing: | `:person_surfing:` | `1f3c4` | +| :man_surfing: | `:man_surfing:` | `1f3c4-200d-2642-fe0f` | +| :woman_surfing: | `:woman_surfing:` | `1f3c4-200d-2640-fe0f` | +| :person_rowing_boat: | `:person_rowing_boat:` | `1f6a3` | +| :man_rowing_boat: | `:man_rowing_boat:` | `1f6a3-200d-2642-fe0f` | +| :woman_rowing_boat: | `:woman_rowing_boat:` | `1f6a3-200d-2640-fe0f` | +| :person_swimming: | `:person_swimming:` | `1f3ca` | +| :man_swimming: | `:man_swimming:` | `1f3ca-200d-2642-fe0f` | +| :woman_swimming: | `:woman_swimming:` | `1f3ca-200d-2640-fe0f` | +| :person_bouncing_ball: | `:person_bouncing_ball:` | `26f9` | +| :man_bouncing_ball: | `:man_bouncing_ball:` | `26f9-fe0f-200d-2642-fe0f` | +| :woman_bouncing_ball: | `:woman_bouncing_ball:` | `26f9-fe0f-200d-2640-fe0f` | +| :person_lifting_weights: | `:person_lifting_weights:` | `1f3cb` | +| :man_lifting_weights: | `:man_lifting_weights:` | `1f3cb-fe0f-200d-2642-fe0f` | +| :woman_lifting_weights: | `:woman_lifting_weights:` | `1f3cb-fe0f-200d-2640-fe0f` | +| :person_biking: | `:person_biking:` | `1f6b4` | +| :man_biking: | `:man_biking:` | `1f6b4-200d-2642-fe0f` | +| :woman_biking: | `:woman_biking:` | `1f6b4-200d-2640-fe0f` | +| :person_mountain_biking: | `:person_mountain_biking:` | `1f6b5` | +| :man_mountain_biking: | `:man_mountain_biking:` | `1f6b5-200d-2642-fe0f` | +| :woman_mountain_biking: | `:woman_mountain_biking:` | `1f6b5-200d-2640-fe0f` | +| :person_doing_cartwheel: | `:person_doing_cartwheel:` | `1f938` | +| :man_cartwheeling: | `:man_cartwheeling:` | `1f938-200d-2642-fe0f` | +| :woman_cartwheeling: | `:woman_cartwheeling:` | `1f938-200d-2640-fe0f` | +| :people_wrestling: | `:people_wrestling:` | `1f93c` | +| :men_wrestling: | `:men_wrestling:` | `1f93c-200d-2642-fe0f` | +| :women_wrestling: | `:women_wrestling:` | `1f93c-200d-2640-fe0f` | +| :person_playing_water_polo: | `:person_playing_water_polo:` | `1f93d` | +| :man_playing_water_polo: | `:man_playing_water_polo:` | `1f93d-200d-2642-fe0f` | +| :woman_playing_water_polo: | `:woman_playing_water_polo:` | `1f93d-200d-2640-fe0f` | +| :person_playing_handball: | `:person_playing_handball:` | `1f93e` | +| :man_playing_handball: | `:man_playing_handball:` | `1f93e-200d-2642-fe0f` | +| :woman_playing_handball: | `:woman_playing_handball:` | `1f93e-200d-2640-fe0f` | +| :person_juggling: | `:person_juggling:` | `1f939` | +| :man_juggling: | `:man_juggling:` | `1f939-200d-2642-fe0f` | +| :woman_juggling: | `:woman_juggling:` | `1f939-200d-2640-fe0f` | +| :person_in_lotus_position: | `:person_in_lotus_position:` | `1f9d8` | +| :man_in_lotus_position: | `:man_in_lotus_position:` | `1f9d8-200d-2642-fe0f` | +| :woman_in_lotus_position: | `:woman_in_lotus_position:` | `1f9d8-200d-2640-fe0f` | +| :bath: | `:bath:` | `1f6c0` | +| :sleeping_accommodation: | `:sleeping_accommodation:` | `1f6cc` | +| :people_holding_hands: | `:people_holding_hands:` | `1f9d1-200d-1f91d-200d-1f9d1` | +| :two_women_holding_hands: | `:two_women_holding_hands:` | `1f46d` | +| :couple: | `:couple:` | `1f46b` | +| :two_men_holding_hands: | `:two_men_holding_hands:` | `1f46c` | +| :couplekiss: | `:couplekiss:` | `1f48f` | +| :kiss_woman_man: | `:kiss_woman_man:` | `1f469-200d-2764-fe0f-200d-1f48b-200d-1f468` | +| :kiss_mm: | `:kiss_mm:` | `1f468-200d-2764-fe0f-200d-1f48b-200d-1f468` | +| :kiss_ww: | `:kiss_ww:` | `1f469-200d-2764-fe0f-200d-1f48b-200d-1f469` | +| :couple_with_heart: | `:couple_with_heart:` | `1f491` | +| :couple_with_heart_woman_man: | `:couple_with_heart_woman_man:` | `1f469-200d-2764-fe0f-200d-1f468` | +| :couple_mm: | `:couple_mm:` | `1f468-200d-2764-fe0f-200d-1f468` | +| :couple_ww: | `:couple_ww:` | `1f469-200d-2764-fe0f-200d-1f469` | +| :family_man_woman_boy: | `:family_man_woman_boy:` | `1f468-200d-1f469-200d-1f466` | +| :family_mwg: | `:family_mwg:` | `1f468-200d-1f469-200d-1f467` | +| :family_mwgb: | `:family_mwgb:` | `1f468-200d-1f469-200d-1f467-200d-1f466` | +| :family_mwbb: | `:family_mwbb:` | `1f468-200d-1f469-200d-1f466-200d-1f466` | +| :family_mwgg: | `:family_mwgg:` | `1f468-200d-1f469-200d-1f467-200d-1f467` | +| :family_mmb: | `:family_mmb:` | `1f468-200d-1f468-200d-1f466` | +| :family_mmg: | `:family_mmg:` | `1f468-200d-1f468-200d-1f467` | +| :family_mmgb: | `:family_mmgb:` | `1f468-200d-1f468-200d-1f467-200d-1f466` | +| :family_mmbb: | `:family_mmbb:` | `1f468-200d-1f468-200d-1f466-200d-1f466` | +| :family_mmgg: | `:family_mmgg:` | `1f468-200d-1f468-200d-1f467-200d-1f467` | +| :family_wwb: | `:family_wwb:` | `1f469-200d-1f469-200d-1f466` | +| :family_wwg: | `:family_wwg:` | `1f469-200d-1f469-200d-1f467` | +| :family_wwgb: | `:family_wwgb:` | `1f469-200d-1f469-200d-1f467-200d-1f466` | +| :family_wwbb: | `:family_wwbb:` | `1f469-200d-1f469-200d-1f466-200d-1f466` | +| :family_wwgg: | `:family_wwgg:` | `1f469-200d-1f469-200d-1f467-200d-1f467` | +| :family_man_boy: | `:family_man_boy:` | `1f468-200d-1f466` | +| :family_man_boy_boy: | `:family_man_boy_boy:` | `1f468-200d-1f466-200d-1f466` | +| :family_man_girl: | `:family_man_girl:` | `1f468-200d-1f467` | +| :family_man_girl_boy: | `:family_man_girl_boy:` | `1f468-200d-1f467-200d-1f466` | +| :family_man_girl_girl: | `:family_man_girl_girl:` | `1f468-200d-1f467-200d-1f467` | +| :family_woman_boy: | `:family_woman_boy:` | `1f469-200d-1f466` | +| :family_woman_boy_boy: | `:family_woman_boy_boy:` | `1f469-200d-1f466-200d-1f466` | +| :family_woman_girl: | `:family_woman_girl:` | `1f469-200d-1f467` | +| :family_woman_girl_boy: | `:family_woman_girl_boy:` | `1f469-200d-1f467-200d-1f466` | +| :family_woman_girl_girl: | `:family_woman_girl_girl:` | `1f469-200d-1f467-200d-1f467` | +| :speaking_head: | `:speaking_head:` | `1f5e3` | +| :bust_in_silhouette: | `:bust_in_silhouette:` | `1f464` | +| :busts_in_silhouette: | `:busts_in_silhouette:` | `1f465` | +| :people_hugging: | `:people_hugging:` | `1fac2` | +| :family: | `:family:` | `1f46a` | +| :footprints: | `:footprints:` | `1f463` | +| :monkey_face: | `:monkey_face:` | `1f435` | +| :monkey: | `:monkey:` | `1f412` | +| :gorilla: | `:gorilla:` | `1f98d` | +| :orangutan: | `:orangutan:` | `1f9a7` | +| :dog: | `:dog:` | `1f436` | +| :dog2: | `:dog2:` | `1f415` | +| :guide_dog: | `:guide_dog:` | `1f9ae` | +| :service_dog: | `:service_dog:` | `1f415-200d-1f9ba` | +| :poodle: | `:poodle:` | `1f429` | +| :wolf: | `:wolf:` | `1f43a` | +| :fox: | `:fox:` | `1f98a` | +| :raccoon: | `:raccoon:` | `1f99d` | +| :cat: | `:cat:` | `1f431` | +| :cat2: | `:cat2:` | `1f408` | +| :black_cat: | `:black_cat:` | `1f408-200d-2b1b` | +| :lion_face: | `:lion_face:` | `1f981` | +| :tiger: | `:tiger:` | `1f42f` | +| :tiger2: | `:tiger2:` | `1f405` | +| :leopard: | `:leopard:` | `1f406` | +| :horse: | `:horse:` | `1f434` | +| :moose: | `:moose:` | `1face` | +| :donkey: | `:donkey:` | `1facf` | +| :racehorse: | `:racehorse:` | `1f40e` | +| :unicorn: | `:unicorn:` | `1f984` | +| :zebra: | `:zebra:` | `1f993` | +| :deer: | `:deer:` | `1f98c` | +| :bison: | `:bison:` | `1f9ac` | +| :cow: | `:cow:` | `1f42e` | +| :ox: | `:ox:` | `1f402` | +| :water_buffalo: | `:water_buffalo:` | `1f403` | +| :cow2: | `:cow2:` | `1f404` | +| :pig: | `:pig:` | `1f437` | +| :pig2: | `:pig2:` | `1f416` | +| :boar: | `:boar:` | `1f417` | +| :pig_nose: | `:pig_nose:` | `1f43d` | +| :ram: | `:ram:` | `1f40f` | +| :sheep: | `:sheep:` | `1f411` | +| :goat: | `:goat:` | `1f410` | +| :dromedary_camel: | `:dromedary_camel:` | `1f42a` | +| :camel: | `:camel:` | `1f42b` | +| :llama: | `:llama:` | `1f999` | +| :giraffe: | `:giraffe:` | `1f992` | +| :elephant: | `:elephant:` | `1f418` | +| :mammoth: | `:mammoth:` | `1f9a3` | +| :rhino: | `:rhino:` | `1f98f` | +| :hippopotamus: | `:hippopotamus:` | `1f99b` | +| :mouse: | `:mouse:` | `1f42d` | +| :mouse2: | `:mouse2:` | `1f401` | +| :rat: | `:rat:` | `1f400` | +| :hamster: | `:hamster:` | `1f439` | +| :rabbit: | `:rabbit:` | `1f430` | +| :rabbit2: | `:rabbit2:` | `1f407` | +| :chipmunk: | `:chipmunk:` | `1f43f` | +| :beaver: | `:beaver:` | `1f9ab` | +| :hedgehog: | `:hedgehog:` | `1f994` | +| :bat: | `:bat:` | `1f987` | +| :bear: | `:bear:` | `1f43b` | +| :polar_bear: | `:polar_bear:` | `1f43b-200d-2744-fe0f` | +| :koala: | `:koala:` | `1f428` | +| :panda_face: | `:panda_face:` | `1f43c` | +| :sloth: | `:sloth:` | `1f9a5` | +| :otter: | `:otter:` | `1f9a6` | +| :skunk: | `:skunk:` | `1f9a8` | +| :kangaroo: | `:kangaroo:` | `1f998` | +| :badger: | `:badger:` | `1f9a1` | +| :feet: | `:feet:` | `1f43e` | +| :turkey: | `:turkey:` | `1f983` | +| :chicken: | `:chicken:` | `1f414` | +| :rooster: | `:rooster:` | `1f413` | +| :hatching_chick: | `:hatching_chick:` | `1f423` | +| :baby_chick: | `:baby_chick:` | `1f424` | +| :hatched_chick: | `:hatched_chick:` | `1f425` | +| :bird: | `:bird:` | `1f426` | +| :penguin: | `:penguin:` | `1f427` | +| :dove: | `:dove:` | `1f54a` | +| :eagle: | `:eagle:` | `1f985` | +| :duck: | `:duck:` | `1f986` | +| :swan: | `:swan:` | `1f9a2` | +| :owl: | `:owl:` | `1f989` | +| :dodo: | `:dodo:` | `1f9a4` | +| :feather: | `:feather:` | `1fab6` | +| :flamingo: | `:flamingo:` | `1f9a9` | +| :peacock: | `:peacock:` | `1f99a` | +| :parrot: | `:parrot:` | `1f99c` | +| :wing: | `:wing:` | `1fabd` | +| :black_bird: | `:black_bird:` | `1f426-200d-2b1b` | +| :goose: | `:goose:` | `1fabf` | +| :frog: | `:frog:` | `1f438` | +| :crocodile: | `:crocodile:` | `1f40a` | +| :turtle: | `:turtle:` | `1f422` | +| :lizard: | `:lizard:` | `1f98e` | +| :snake: | `:snake:` | `1f40d` | +| :dragon_face: | `:dragon_face:` | `1f432` | +| :dragon: | `:dragon:` | `1f409` | +| :sauropod: | `:sauropod:` | `1f995` | +| :t_rex: | `:t_rex:` | `1f996` | +| :whale: | `:whale:` | `1f433` | +| :whale2: | `:whale2:` | `1f40b` | +| :dolphin: | `:dolphin:` | `1f42c` | +| :seal: | `:seal:` | `1f9ad` | +| :fish: | `:fish:` | `1f41f` | +| :tropical_fish: | `:tropical_fish:` | `1f420` | +| :blowfish: | `:blowfish:` | `1f421` | +| :shark: | `:shark:` | `1f988` | +| :octopus: | `:octopus:` | `1f419` | +| :shell: | `:shell:` | `1f41a` | +| :coral: | `:coral:` | `1fab8` | +| :jellyfish: | `:jellyfish:` | `1fabc` | +| :snail: | `:snail:` | `1f40c` | +| :butterfly: | `:butterfly:` | `1f98b` | +| :bug: | `:bug:` | `1f41b` | +| :ant: | `:ant:` | `1f41c` | +| :bee: | `:bee:` | `1f41d` | +| :beetle: | `:beetle:` | `1fab2` | +| :lady_beetle: | `:lady_beetle:` | `1f41e` | +| :cricket: | `:cricket:` | `1f997` | +| :cockroach: | `:cockroach:` | `1fab3` | +| :spider: | `:spider:` | `1f577` | +| :spider_web: | `:spider_web:` | `1f578` | +| :scorpion: | `:scorpion:` | `1f982` | +| :mosquito: | `:mosquito:` | `1f99f` | +| :fly: | `:fly:` | `1fab0` | +| :worm: | `:worm:` | `1fab1` | +| :microbe: | `:microbe:` | `1f9a0` | +| :bouquet: | `:bouquet:` | `1f490` | +| :cherry_blossom: | `:cherry_blossom:` | `1f338` | +| :white_flower: | `:white_flower:` | `1f4ae` | +| :lotus: | `:lotus:` | `1fab7` | +| :rosette: | `:rosette:` | `1f3f5` | +| :rose: | `:rose:` | `1f339` | +| :wilted_rose: | `:wilted_rose:` | `1f940` | +| :hibiscus: | `:hibiscus:` | `1f33a` | +| :sunflower: | `:sunflower:` | `1f33b` | +| :blossom: | `:blossom:` | `1f33c` | +| :tulip: | `:tulip:` | `1f337` | +| :hyacinth: | `:hyacinth:` | `1fabb` | +| :seedling: | `:seedling:` | `1f331` | +| :potted_plant: | `:potted_plant:` | `1fab4` | +| :evergreen_tree: | `:evergreen_tree:` | `1f332` | +| :deciduous_tree: | `:deciduous_tree:` | `1f333` | +| :palm_tree: | `:palm_tree:` | `1f334` | +| :cactus: | `:cactus:` | `1f335` | +| :ear_of_rice: | `:ear_of_rice:` | `1f33e` | +| :herb: | `:herb:` | `1f33f` | +| :shamrock: | `:shamrock:` | `2618` | +| :four_leaf_clover: | `:four_leaf_clover:` | `1f340` | +| :maple_leaf: | `:maple_leaf:` | `1f341` | +| :fallen_leaf: | `:fallen_leaf:` | `1f342` | +| :leaves: | `:leaves:` | `1f343` | +| :empty_nest: | `:empty_nest:` | `1fab9` | +| :nest_with_eggs: | `:nest_with_eggs:` | `1faba` | +| :mushroom: | `:mushroom:` | `1f344` | +| :grapes: | `:grapes:` | `1f347` | +| :melon: | `:melon:` | `1f348` | +| :watermelon: | `:watermelon:` | `1f349` | +| :tangerine: | `:tangerine:` | `1f34a` | +| :lemon: | `:lemon:` | `1f34b` | +| :banana: | `:banana:` | `1f34c` | +| :pineapple: | `:pineapple:` | `1f34d` | +| :mango: | `:mango:` | `1f96d` | +| :apple: | `:apple:` | `1f34e` | +| :green_apple: | `:green_apple:` | `1f34f` | +| :pear: | `:pear:` | `1f350` | +| :peach: | `:peach:` | `1f351` | +| :cherries: | `:cherries:` | `1f352` | +| :strawberry: | `:strawberry:` | `1f353` | +| :blueberries: | `:blueberries:` | `1fad0` | +| :kiwi: | `:kiwi:` | `1f95d` | +| :tomato: | `:tomato:` | `1f345` | +| :olive: | `:olive:` | `1fad2` | +| :coconut: | `:coconut:` | `1f965` | +| :avocado: | `:avocado:` | `1f951` | +| :eggplant: | `:eggplant:` | `1f346` | +| :potato: | `:potato:` | `1f954` | +| :carrot: | `:carrot:` | `1f955` | +| :corn: | `:corn:` | `1f33d` | +| :hot_pepper: | `:hot_pepper:` | `1f336` | +| :bell_pepper: | `:bell_pepper:` | `1fad1` | +| :cucumber: | `:cucumber:` | `1f952` | +| :leafy_green: | `:leafy_green:` | `1f96c` | +| :broccoli: | `:broccoli:` | `1f966` | +| :garlic: | `:garlic:` | `1f9c4` | +| :onion: | `:onion:` | `1f9c5` | +| :peanuts: | `:peanuts:` | `1f95c` | +| :beans: | `:beans:` | `1fad8` | +| :chestnut: | `:chestnut:` | `1f330` | +| :ginger_root: | `:ginger_root:` | `1fada` | +| :pea_pod: | `:pea_pod:` | `1fadb` | +| :bread: | `:bread:` | `1f35e` | +| :croissant: | `:croissant:` | `1f950` | +| :french_bread: | `:french_bread:` | `1f956` | +| :flatbread: | `:flatbread:` | `1fad3` | +| :pretzel: | `:pretzel:` | `1f968` | +| :bagel: | `:bagel:` | `1f96f` | +| :pancakes: | `:pancakes:` | `1f95e` | +| :waffle: | `:waffle:` | `1f9c7` | +| :cheese: | `:cheese:` | `1f9c0` | +| :meat_on_bone: | `:meat_on_bone:` | `1f356` | +| :poultry_leg: | `:poultry_leg:` | `1f357` | +| :cut_of_meat: | `:cut_of_meat:` | `1f969` | +| :bacon: | `:bacon:` | `1f953` | +| :hamburger: | `:hamburger:` | `1f354` | +| :fries: | `:fries:` | `1f35f` | +| :pizza: | `:pizza:` | `1f355` | +| :hotdog: | `:hotdog:` | `1f32d` | +| :sandwich: | `:sandwich:` | `1f96a` | +| :taco: | `:taco:` | `1f32e` | +| :burrito: | `:burrito:` | `1f32f` | +| :tamale: | `:tamale:` | `1fad4` | +| :stuffed_flatbread: | `:stuffed_flatbread:` | `1f959` | +| :falafel: | `:falafel:` | `1f9c6` | +| :egg: | `:egg:` | `1f95a` | +| :cooking: | `:cooking:` | `1f373` | +| :shallow_pan_of_food: | `:shallow_pan_of_food:` | `1f958` | +| :stew: | `:stew:` | `1f372` | +| :fondue: | `:fondue:` | `1fad5` | +| :bowl_with_spoon: | `:bowl_with_spoon:` | `1f963` | +| :salad: | `:salad:` | `1f957` | +| :popcorn: | `:popcorn:` | `1f37f` | +| :butter: | `:butter:` | `1f9c8` | +| :salt: | `:salt:` | `1f9c2` | +| :canned_food: | `:canned_food:` | `1f96b` | +| :bento: | `:bento:` | `1f371` | +| :rice_cracker: | `:rice_cracker:` | `1f358` | +| :rice_ball: | `:rice_ball:` | `1f359` | +| :rice: | `:rice:` | `1f35a` | +| :curry: | `:curry:` | `1f35b` | +| :ramen: | `:ramen:` | `1f35c` | +| :spaghetti: | `:spaghetti:` | `1f35d` | +| :sweet_potato: | `:sweet_potato:` | `1f360` | +| :oden: | `:oden:` | `1f362` | +| :sushi: | `:sushi:` | `1f363` | +| :fried_shrimp: | `:fried_shrimp:` | `1f364` | +| :fish_cake: | `:fish_cake:` | `1f365` | +| :moon_cake: | `:moon_cake:` | `1f96e` | +| :dango: | `:dango:` | `1f361` | +| :dumpling: | `:dumpling:` | `1f95f` | +| :fortune_cookie: | `:fortune_cookie:` | `1f960` | +| :takeout_box: | `:takeout_box:` | `1f961` | +| :crab: | `:crab:` | `1f980` | +| :lobster: | `:lobster:` | `1f99e` | +| :shrimp: | `:shrimp:` | `1f990` | +| :squid: | `:squid:` | `1f991` | +| :oyster: | `:oyster:` | `1f9aa` | +| :icecream: | `:icecream:` | `1f366` | +| :shaved_ice: | `:shaved_ice:` | `1f367` | +| :ice_cream: | `:ice_cream:` | `1f368` | +| :doughnut: | `:doughnut:` | `1f369` | +| :cookie: | `:cookie:` | `1f36a` | +| :birthday: | `:birthday:` | `1f382` | +| :cake: | `:cake:` | `1f370` | +| :cupcake: | `:cupcake:` | `1f9c1` | +| :pie: | `:pie:` | `1f967` | +| :chocolate_bar: | `:chocolate_bar:` | `1f36b` | +| :candy: | `:candy:` | `1f36c` | +| :lollipop: | `:lollipop:` | `1f36d` | +| :custard: | `:custard:` | `1f36e` | +| :honey_pot: | `:honey_pot:` | `1f36f` | +| :baby_bottle: | `:baby_bottle:` | `1f37c` | +| :milk: | `:milk:` | `1f95b` | +| :coffee: | `:coffee:` | `2615` | +| :teapot: | `:teapot:` | `1fad6` | +| :tea: | `:tea:` | `1f375` | +| :sake: | `:sake:` | `1f376` | +| :champagne: | `:champagne:` | `1f37e` | +| :wine_glass: | `:wine_glass:` | `1f377` | +| :cocktail: | `:cocktail:` | `1f378` | +| :tropical_drink: | `:tropical_drink:` | `1f379` | +| :beer: | `:beer:` | `1f37a` | +| :beers: | `:beers:` | `1f37b` | +| :champagne_glass: | `:champagne_glass:` | `1f942` | +| :tumbler_glass: | `:tumbler_glass:` | `1f943` | +| :pouring_liquid: | `:pouring_liquid:` | `1fad7` | +| :cup_with_straw: | `:cup_with_straw:` | `1f964` | +| :bubble_tea: | `:bubble_tea:` | `1f9cb` | +| :beverage_box: | `:beverage_box:` | `1f9c3` | +| :mate: | `:mate:` | `1f9c9` | +| :ice_cube: | `:ice_cube:` | `1f9ca` | +| :chopsticks: | `:chopsticks:` | `1f962` | +| :fork_knife_plate: | `:fork_knife_plate:` | `1f37d` | +| :fork_and_knife: | `:fork_and_knife:` | `1f374` | +| :spoon: | `:spoon:` | `1f944` | +| :knife: | `:knife:` | `1f52a` | +| :jar: | `:jar:` | `1fad9` | +| :amphora: | `:amphora:` | `1f3fa` | +| :earth_africa: | `:earth_africa:` | `1f30d` | +| :earth_americas: | `:earth_americas:` | `1f30e` | +| :earth_asia: | `:earth_asia:` | `1f30f` | +| :globe_with_meridians: | `:globe_with_meridians:` | `1f310` | +| :map: | `:map:` | `1f5fa` | +| :japan: | `:japan:` | `1f5fe` | +| :compass: | `:compass:` | `1f9ed` | +| :mountain_snow: | `:mountain_snow:` | `1f3d4` | +| :mountain: | `:mountain:` | `26f0` | +| :volcano: | `:volcano:` | `1f30b` | +| :mount_fuji: | `:mount_fuji:` | `1f5fb` | +| :camping: | `:camping:` | `1f3d5` | +| :beach: | `:beach:` | `1f3d6` | +| :desert: | `:desert:` | `1f3dc` | +| :island: | `:island:` | `1f3dd` | +| :park: | `:park:` | `1f3de` | +| :stadium: | `:stadium:` | `1f3df` | +| :classical_building: | `:classical_building:` | `1f3db` | +| :construction_site: | `:construction_site:` | `1f3d7` | +| :bricks: | `:bricks:` | `1f9f1` | +| :rock: | `:rock:` | `1faa8` | +| :wood: | `:wood:` | `1fab5` | +| :hut: | `:hut:` | `1f6d6` | +| :homes: | `:homes:` | `1f3d8` | +| :house_abandoned: | `:house_abandoned:` | `1f3da` | +| :house: | `:house:` | `1f3e0` | +| :house_with_garden: | `:house_with_garden:` | `1f3e1` | +| :office: | `:office:` | `1f3e2` | +| :post_office: | `:post_office:` | `1f3e3` | +| :european_post_office: | `:european_post_office:` | `1f3e4` | +| :hospital: | `:hospital:` | `1f3e5` | +| :bank: | `:bank:` | `1f3e6` | +| :hotel: | `:hotel:` | `1f3e8` | +| :love_hotel: | `:love_hotel:` | `1f3e9` | +| :convenience_store: | `:convenience_store:` | `1f3ea` | +| :school: | `:school:` | `1f3eb` | +| :department_store: | `:department_store:` | `1f3ec` | +| :factory: | `:factory:` | `1f3ed` | +| :japanese_castle: | `:japanese_castle:` | `1f3ef` | +| :european_castle: | `:european_castle:` | `1f3f0` | +| :wedding: | `:wedding:` | `1f492` | +| :tokyo_tower: | `:tokyo_tower:` | `1f5fc` | +| :statue_of_liberty: | `:statue_of_liberty:` | `1f5fd` | +| :church: | `:church:` | `26ea` | +| :mosque: | `:mosque:` | `1f54c` | +| :hindu_temple: | `:hindu_temple:` | `1f6d5` | +| :synagogue: | `:synagogue:` | `1f54d` | +| :shinto_shrine: | `:shinto_shrine:` | `26e9` | +| :kaaba: | `:kaaba:` | `1f54b` | +| :fountain: | `:fountain:` | `26f2` | +| :tent: | `:tent:` | `26fa` | +| :foggy: | `:foggy:` | `1f301` | +| :night_with_stars: | `:night_with_stars:` | `1f303` | +| :cityscape: | `:cityscape:` | `1f3d9` | +| :sunrise_over_mountains: | `:sunrise_over_mountains:` | `1f304` | +| :sunrise: | `:sunrise:` | `1f305` | +| :city_dusk: | `:city_dusk:` | `1f306` | +| :city_sunset: | `:city_sunset:` | `1f307` | +| :bridge_at_night: | `:bridge_at_night:` | `1f309` | +| :hotsprings: | `:hotsprings:` | `2668` | +| :carousel_horse: | `:carousel_horse:` | `1f3a0` | +| :playground_slide: | `:playground_slide:` | `1f6dd` | +| :ferris_wheel: | `:ferris_wheel:` | `1f3a1` | +| :roller_coaster: | `:roller_coaster:` | `1f3a2` | +| :barber: | `:barber:` | `1f488` | +| :circus_tent: | `:circus_tent:` | `1f3aa` | +| :steam_locomotive: | `:steam_locomotive:` | `1f682` | +| :railway_car: | `:railway_car:` | `1f683` | +| :bullettrain_side: | `:bullettrain_side:` | `1f684` | +| :bullettrain_front: | `:bullettrain_front:` | `1f685` | +| :train2: | `:train2:` | `1f686` | +| :metro: | `:metro:` | `1f687` | +| :light_rail: | `:light_rail:` | `1f688` | +| :station: | `:station:` | `1f689` | +| :tram: | `:tram:` | `1f68a` | +| :monorail: | `:monorail:` | `1f69d` | +| :mountain_railway: | `:mountain_railway:` | `1f69e` | +| :train: | `:train:` | `1f68b` | +| :bus: | `:bus:` | `1f68c` | +| :oncoming_bus: | `:oncoming_bus:` | `1f68d` | +| :trolleybus: | `:trolleybus:` | `1f68e` | +| :minibus: | `:minibus:` | `1f690` | +| :ambulance: | `:ambulance:` | `1f691` | +| :fire_engine: | `:fire_engine:` | `1f692` | +| :police_car: | `:police_car:` | `1f693` | +| :oncoming_police_car: | `:oncoming_police_car:` | `1f694` | +| :taxi: | `:taxi:` | `1f695` | +| :oncoming_taxi: | `:oncoming_taxi:` | `1f696` | +| :red_car: | `:red_car:` | `1f697` | +| :oncoming_automobile: | `:oncoming_automobile:` | `1f698` | +| :blue_car: | `:blue_car:` | `1f699` | +| :pickup_truck: | `:pickup_truck:` | `1f6fb` | +| :truck: | `:truck:` | `1f69a` | +| :articulated_lorry: | `:articulated_lorry:` | `1f69b` | +| :tractor: | `:tractor:` | `1f69c` | +| :race_car: | `:race_car:` | `1f3ce` | +| :motorcycle: | `:motorcycle:` | `1f3cd` | +| :motor_scooter: | `:motor_scooter:` | `1f6f5` | +| :manual_wheelchair: | `:manual_wheelchair:` | `1f9bd` | +| :motorized_wheelchair: | `:motorized_wheelchair:` | `1f9bc` | +| :auto_rickshaw: | `:auto_rickshaw:` | `1f6fa` | +| :bike: | `:bike:` | `1f6b2` | +| :scooter: | `:scooter:` | `1f6f4` | +| :skateboard: | `:skateboard:` | `1f6f9` | +| :roller_skate: | `:roller_skate:` | `1f6fc` | +| :busstop: | `:busstop:` | `1f68f` | +| :motorway: | `:motorway:` | `1f6e3` | +| :railway_track: | `:railway_track:` | `1f6e4` | +| :oil: | `:oil:` | `1f6e2` | +| :fuelpump: | `:fuelpump:` | `26fd` | +| :wheel: | `:wheel:` | `1f6de` | +| :rotating_light: | `:rotating_light:` | `1f6a8` | +| :traffic_light: | `:traffic_light:` | `1f6a5` | +| :vertical_traffic_light: | `:vertical_traffic_light:` | `1f6a6` | +| :octagonal_sign: | `:octagonal_sign:` | `1f6d1` | +| :construction: | `:construction:` | `1f6a7` | +| :anchor: | `:anchor:` | `2693` | +| :ring_buoy: | `:ring_buoy:` | `1f6df` | +| :sailboat: | `:sailboat:` | `26f5` | +| :canoe: | `:canoe:` | `1f6f6` | +| :speedboat: | `:speedboat:` | `1f6a4` | +| :cruise_ship: | `:cruise_ship:` | `1f6f3` | +| :ferry: | `:ferry:` | `26f4` | +| :motorboat: | `:motorboat:` | `1f6e5` | +| :ship: | `:ship:` | `1f6a2` | +| :airplane: | `:airplane:` | `2708` | +| :airplane_small: | `:airplane_small:` | `1f6e9` | +| :airplane_departure: | `:airplane_departure:` | `1f6eb` | +| :airplane_arriving: | `:airplane_arriving:` | `1f6ec` | +| :parachute: | `:parachute:` | `1fa82` | +| :seat: | `:seat:` | `1f4ba` | +| :helicopter: | `:helicopter:` | `1f681` | +| :suspension_railway: | `:suspension_railway:` | `1f69f` | +| :mountain_cableway: | `:mountain_cableway:` | `1f6a0` | +| :aerial_tramway: | `:aerial_tramway:` | `1f6a1` | +| :satellite_orbital: | `:satellite_orbital:` | `1f6f0` | +| :rocket: | `:rocket:` | `1f680` | +| :flying_saucer: | `:flying_saucer:` | `1f6f8` | +| :bellhop: | `:bellhop:` | `1f6ce` | +| :luggage: | `:luggage:` | `1f9f3` | +| :hourglass: | `:hourglass:` | `231b` | +| :hourglass_flowing_sand: | `:hourglass_flowing_sand:` | `23f3` | +| :watch: | `:watch:` | `231a` | +| :alarm_clock: | `:alarm_clock:` | `23f0` | +| :stopwatch: | `:stopwatch:` | `23f1` | +| :timer: | `:timer:` | `23f2` | +| :clock: | `:clock:` | `1f570` | +| :clock12: | `:clock12:` | `1f55b` | +| :clock1230: | `:clock1230:` | `1f567` | +| :clock1: | `:clock1:` | `1f550` | +| :clock130: | `:clock130:` | `1f55c` | +| :clock2: | `:clock2:` | `1f551` | +| :clock230: | `:clock230:` | `1f55d` | +| :clock3: | `:clock3:` | `1f552` | +| :clock330: | `:clock330:` | `1f55e` | +| :clock4: | `:clock4:` | `1f553` | +| :clock430: | `:clock430:` | `1f55f` | +| :clock5: | `:clock5:` | `1f554` | +| :clock530: | `:clock530:` | `1f560` | +| :clock6: | `:clock6:` | `1f555` | +| :clock630: | `:clock630:` | `1f561` | +| :clock7: | `:clock7:` | `1f556` | +| :clock730: | `:clock730:` | `1f562` | +| :clock8: | `:clock8:` | `1f557` | +| :clock830: | `:clock830:` | `1f563` | +| :clock9: | `:clock9:` | `1f558` | +| :clock930: | `:clock930:` | `1f564` | +| :clock10: | `:clock10:` | `1f559` | +| :clock1030: | `:clock1030:` | `1f565` | +| :clock11: | `:clock11:` | `1f55a` | +| :clock1130: | `:clock1130:` | `1f566` | +| :new_moon: | `:new_moon:` | `1f311` | +| :waxing_crescent_moon: | `:waxing_crescent_moon:` | `1f312` | +| :first_quarter_moon: | `:first_quarter_moon:` | `1f313` | +| :waxing_gibbous_moon: | `:waxing_gibbous_moon:` | `1f314` | +| :full_moon: | `:full_moon:` | `1f315` | +| :waning_gibbous_moon: | `:waning_gibbous_moon:` | `1f316` | +| :last_quarter_moon: | `:last_quarter_moon:` | `1f317` | +| :waning_crescent_moon: | `:waning_crescent_moon:` | `1f318` | +| :crescent_moon: | `:crescent_moon:` | `1f319` | +| :new_moon_with_face: | `:new_moon_with_face:` | `1f31a` | +| :first_quarter_moon_with_face: | `:first_quarter_moon_with_face:` | `1f31b` | +| :last_quarter_moon_with_face: | `:last_quarter_moon_with_face:` | `1f31c` | +| :thermometer: | `:thermometer:` | `1f321` | +| :sunny: | `:sunny:` | `2600` | +| :full_moon_with_face: | `:full_moon_with_face:` | `1f31d` | +| :sun_with_face: | `:sun_with_face:` | `1f31e` | +| :ringed_planet: | `:ringed_planet:` | `1fa90` | +| :star: | `:star:` | `2b50` | +| :star2: | `:star2:` | `1f31f` | +| :stars: | `:stars:` | `1f320` | +| :milky_way: | `:milky_way:` | `1f30c` | +| :cloud: | `:cloud:` | `2601` | +| :partly_sunny: | `:partly_sunny:` | `26c5` | +| :thunder_cloud_rain: | `:thunder_cloud_rain:` | `26c8` | +| :white_sun_small_cloud: | `:white_sun_small_cloud:` | `1f324` | +| :white_sun_cloud: | `:white_sun_cloud:` | `1f325` | +| :white_sun_rain_cloud: | `:white_sun_rain_cloud:` | `1f326` | +| :cloud_rain: | `:cloud_rain:` | `1f327` | +| :cloud_snow: | `:cloud_snow:` | `1f328` | +| :cloud_lightning: | `:cloud_lightning:` | `1f329` | +| :cloud_tornado: | `:cloud_tornado:` | `1f32a` | +| :fog: | `:fog:` | `1f32b` | +| :wind_blowing_face: | `:wind_blowing_face:` | `1f32c` | +| :cyclone: | `:cyclone:` | `1f300` | +| :rainbow: | `:rainbow:` | `1f308` | +| :closed_umbrella: | `:closed_umbrella:` | `1f302` | +| :umbrella2: | `:umbrella2:` | `2602` | +| :umbrella: | `:umbrella:` | `2614` | +| :beach_umbrella: | `:beach_umbrella:` | `26f1` | +| :zap: | `:zap:` | `26a1` | +| :snowflake: | `:snowflake:` | `2744` | +| :snowman2: | `:snowman2:` | `2603` | +| :snowman: | `:snowman:` | `26c4` | +| :comet: | `:comet:` | `2604` | +| :fire: | `:fire:` | `1f525` | +| :droplet: | `:droplet:` | `1f4a7` | +| :ocean: | `:ocean:` | `1f30a` | +| :jack_o_lantern: | `:jack_o_lantern:` | `1f383` | +| :christmas_tree: | `:christmas_tree:` | `1f384` | +| :fireworks: | `:fireworks:` | `1f386` | +| :sparkler: | `:sparkler:` | `1f387` | +| :firecracker: | `:firecracker:` | `1f9e8` | +| :sparkles: | `:sparkles:` | `2728` | +| :balloon: | `:balloon:` | `1f388` | +| :tada: | `:tada:` | `1f389` | +| :confetti_ball: | `:confetti_ball:` | `1f38a` | +| :tanabata_tree: | `:tanabata_tree:` | `1f38b` | +| :bamboo: | `:bamboo:` | `1f38d` | +| :dolls: | `:dolls:` | `1f38e` | +| :flags: | `:flags:` | `1f38f` | +| :wind_chime: | `:wind_chime:` | `1f390` | +| :rice_scene: | `:rice_scene:` | `1f391` | +| :red_envelope: | `:red_envelope:` | `1f9e7` | +| :ribbon: | `:ribbon:` | `1f380` | +| :gift: | `:gift:` | `1f381` | +| :reminder_ribbon: | `:reminder_ribbon:` | `1f397` | +| :tickets: | `:tickets:` | `1f39f` | +| :ticket: | `:ticket:` | `1f3ab` | +| :military_medal: | `:military_medal:` | `1f396` | +| :trophy: | `:trophy:` | `1f3c6` | +| :medal: | `:medal:` | `1f3c5` | +| :first_place: | `:first_place:` | `1f947` | +| :second_place: | `:second_place:` | `1f948` | +| :third_place: | `:third_place:` | `1f949` | +| :soccer: | `:soccer:` | `26bd` | +| :baseball: | `:baseball:` | `26be` | +| :softball: | `:softball:` | `1f94e` | +| :basketball: | `:basketball:` | `1f3c0` | +| :volleyball: | `:volleyball:` | `1f3d0` | +| :football: | `:football:` | `1f3c8` | +| :rugby_football: | `:rugby_football:` | `1f3c9` | +| :tennis: | `:tennis:` | `1f3be` | +| :flying_disc: | `:flying_disc:` | `1f94f` | +| :bowling: | `:bowling:` | `1f3b3` | +| :cricket_game: | `:cricket_game:` | `1f3cf` | +| :field_hockey: | `:field_hockey:` | `1f3d1` | +| :hockey: | `:hockey:` | `1f3d2` | +| :lacrosse: | `:lacrosse:` | `1f94d` | +| :ping_pong: | `:ping_pong:` | `1f3d3` | +| :badminton: | `:badminton:` | `1f3f8` | +| :boxing_glove: | `:boxing_glove:` | `1f94a` | +| :martial_arts_uniform: | `:martial_arts_uniform:` | `1f94b` | +| :goal: | `:goal:` | `1f945` | +| :golf: | `:golf:` | `26f3` | +| :ice_skate: | `:ice_skate:` | `26f8` | +| :fishing_pole_and_fish: | `:fishing_pole_and_fish:` | `1f3a3` | +| :diving_mask: | `:diving_mask:` | `1f93f` | +| :running_shirt_with_sash: | `:running_shirt_with_sash:` | `1f3bd` | +| :ski: | `:ski:` | `1f3bf` | +| :sled: | `:sled:` | `1f6f7` | +| :curling_stone: | `:curling_stone:` | `1f94c` | +| :dart: | `:dart:` | `1f3af` | +| :yo_yo: | `:yo_yo:` | `1fa80` | +| :kite: | `:kite:` | `1fa81` | +| :gun: | `:gun:` | `1f52b` | +| :8ball: | `:8ball:` | `1f3b1` | +| :crystal_ball: | `:crystal_ball:` | `1f52e` | +| :magic_wand: | `:magic_wand:` | `1fa84` | +| :video_game: | `:video_game:` | `1f3ae` | +| :joystick: | `:joystick:` | `1f579` | +| :slot_machine: | `:slot_machine:` | `1f3b0` | +| :game_die: | `:game_die:` | `1f3b2` | +| :jigsaw: | `:jigsaw:` | `1f9e9` | +| :teddy_bear: | `:teddy_bear:` | `1f9f8` | +| :pinata: | `:pinata:` | `1fa85` | +| :mirror_ball: | `:mirror_ball:` | `1faa9` | +| :nesting_dolls: | `:nesting_dolls:` | `1fa86` | +| :spades: | `:spades:` | `2660` | +| :hearts: | `:hearts:` | `2665` | +| :diamonds: | `:diamonds:` | `2666` | +| :clubs: | `:clubs:` | `2663` | +| :chess_pawn: | `:chess_pawn:` | `265f` | +| :black_joker: | `:black_joker:` | `1f0cf` | +| :mahjong: | `:mahjong:` | `1f004` | +| :flower_playing_cards: | `:flower_playing_cards:` | `1f3b4` | +| :performing_arts: | `:performing_arts:` | `1f3ad` | +| :frame_photo: | `:frame_photo:` | `1f5bc` | +| :art: | `:art:` | `1f3a8` | +| :thread: | `:thread:` | `1f9f5` | +| :sewing_needle: | `:sewing_needle:` | `1faa1` | +| :yarn: | `:yarn:` | `1f9f6` | +| :knot: | `:knot:` | `1faa2` | +| :eyeglasses: | `:eyeglasses:` | `1f453` | +| :dark_sunglasses: | `:dark_sunglasses:` | `1f576` | +| :goggles: | `:goggles:` | `1f97d` | +| :lab_coat: | `:lab_coat:` | `1f97c` | +| :safety_vest: | `:safety_vest:` | `1f9ba` | +| :necktie: | `:necktie:` | `1f454` | +| :shirt: | `:shirt:` | `1f455` | +| :jeans: | `:jeans:` | `1f456` | +| :scarf: | `:scarf:` | `1f9e3` | +| :gloves: | `:gloves:` | `1f9e4` | +| :coat: | `:coat:` | `1f9e5` | +| :socks: | `:socks:` | `1f9e6` | +| :dress: | `:dress:` | `1f457` | +| :kimono: | `:kimono:` | `1f458` | +| :sari: | `:sari:` | `1f97b` | +| :one_piece_swimsuit: | `:one_piece_swimsuit:` | `1fa71` | +| :briefs: | `:briefs:` | `1fa72` | +| :shorts: | `:shorts:` | `1fa73` | +| :bikini: | `:bikini:` | `1f459` | +| :womans_clothes: | `:womans_clothes:` | `1f45a` | +| :folding_hand_fan: | `:folding_hand_fan:` | `1faad` | +| :purse: | `:purse:` | `1f45b` | +| :handbag: | `:handbag:` | `1f45c` | +| :pouch: | `:pouch:` | `1f45d` | +| :shopping_bags: | `:shopping_bags:` | `1f6cd` | +| :school_satchel: | `:school_satchel:` | `1f392` | +| :thong_sandal: | `:thong_sandal:` | `1fa74` | +| :mans_shoe: | `:mans_shoe:` | `1f45e` | +| :athletic_shoe: | `:athletic_shoe:` | `1f45f` | +| :hiking_boot: | `:hiking_boot:` | `1f97e` | +| :womans_flat_shoe: | `:womans_flat_shoe:` | `1f97f` | +| :high_heel: | `:high_heel:` | `1f460` | +| :sandal: | `:sandal:` | `1f461` | +| :ballet_shoes: | `:ballet_shoes:` | `1fa70` | +| :boot: | `:boot:` | `1f462` | +| :hair_pick: | `:hair_pick:` | `1faae` | +| :crown: | `:crown:` | `1f451` | +| :womans_hat: | `:womans_hat:` | `1f452` | +| :tophat: | `:tophat:` | `1f3a9` | +| :mortar_board: | `:mortar_board:` | `1f393` | +| :billed_cap: | `:billed_cap:` | `1f9e2` | +| :military_helmet: | `:military_helmet:` | `1fa96` | +| :helmet_with_cross: | `:helmet_with_cross:` | `26d1` | +| :prayer_beads: | `:prayer_beads:` | `1f4ff` | +| :lipstick: | `:lipstick:` | `1f484` | +| :ring: | `:ring:` | `1f48d` | +| :gem: | `:gem:` | `1f48e` | +| :mute: | `:mute:` | `1f507` | +| :speaker: | `:speaker:` | `1f508` | +| :sound: | `:sound:` | `1f509` | +| :loud_sound: | `:loud_sound:` | `1f50a` | +| :loudspeaker: | `:loudspeaker:` | `1f4e2` | +| :mega: | `:mega:` | `1f4e3` | +| :postal_horn: | `:postal_horn:` | `1f4ef` | +| :bell: | `:bell:` | `1f514` | +| :no_bell: | `:no_bell:` | `1f515` | +| :musical_score: | `:musical_score:` | `1f3bc` | +| :musical_note: | `:musical_note:` | `1f3b5` | +| :notes: | `:notes:` | `1f3b6` | +| :microphone2: | `:microphone2:` | `1f399` | +| :level_slider: | `:level_slider:` | `1f39a` | +| :control_knobs: | `:control_knobs:` | `1f39b` | +| :microphone: | `:microphone:` | `1f3a4` | +| :headphones: | `:headphones:` | `1f3a7` | +| :radio: | `:radio:` | `1f4fb` | +| :saxophone: | `:saxophone:` | `1f3b7` | +| :accordion: | `:accordion:` | `1fa97` | +| :guitar: | `:guitar:` | `1f3b8` | +| :musical_keyboard: | `:musical_keyboard:` | `1f3b9` | +| :trumpet: | `:trumpet:` | `1f3ba` | +| :violin: | `:violin:` | `1f3bb` | +| :banjo: | `:banjo:` | `1fa95` | +| :drum: | `:drum:` | `1f941` | +| :long_drum: | `:long_drum:` | `1fa98` | +| :maracas: | `:maracas:` | `1fa87` | +| :flute: | `:flute:` | `1fa88` | +| :mobile_phone: | `:mobile_phone:` | `1f4f1` | +| :calling: | `:calling:` | `1f4f2` | +| :telephone: | `:telephone:` | `260e` | +| :telephone_receiver: | `:telephone_receiver:` | `1f4de` | +| :pager: | `:pager:` | `1f4df` | +| :fax: | `:fax:` | `1f4e0` | +| :battery: | `:battery:` | `1f50b` | +| :low_battery: | `:low_battery:` | `1faab` | +| :electric_plug: | `:electric_plug:` | `1f50c` | +| :computer: | `:computer:` | `1f4bb` | +| :desktop: | `:desktop:` | `1f5a5` | +| :printer: | `:printer:` | `1f5a8` | +| :keyboard: | `:keyboard:` | `2328` | +| :mouse_three_button: | `:mouse_three_button:` | `1f5b1` | +| :trackball: | `:trackball:` | `1f5b2` | +| :minidisc: | `:minidisc:` | `1f4bd` | +| :floppy_disk: | `:floppy_disk:` | `1f4be` | +| :cd: | `:cd:` | `1f4bf` | +| :dvd: | `:dvd:` | `1f4c0` | +| :abacus: | `:abacus:` | `1f9ee` | +| :movie_camera: | `:movie_camera:` | `1f3a5` | +| :film_frames: | `:film_frames:` | `1f39e` | +| :projector: | `:projector:` | `1f4fd` | +| :clapper: | `:clapper:` | `1f3ac` | +| :tv: | `:tv:` | `1f4fa` | +| :camera: | `:camera:` | `1f4f7` | +| :camera_with_flash: | `:camera_with_flash:` | `1f4f8` | +| :video_camera: | `:video_camera:` | `1f4f9` | +| :vhs: | `:vhs:` | `1f4fc` | +| :mag: | `:mag:` | `1f50d` | +| :mag_right: | `:mag_right:` | `1f50e` | +| :candle: | `:candle:` | `1f56f` | +| :bulb: | `:bulb:` | `1f4a1` | +| :flashlight: | `:flashlight:` | `1f526` | +| :izakaya_lantern: | `:izakaya_lantern:` | `1f3ee` | +| :diya_lamp: | `:diya_lamp:` | `1fa94` | +| :notebook_with_decorative_cover: | `:notebook_with_decorative_cover:` | `1f4d4` | +| :closed_book: | `:closed_book:` | `1f4d5` | +| :book: | `:book:` | `1f4d6` | +| :green_book: | `:green_book:` | `1f4d7` | +| :blue_book: | `:blue_book:` | `1f4d8` | +| :orange_book: | `:orange_book:` | `1f4d9` | +| :books: | `:books:` | `1f4da` | +| :notebook: | `:notebook:` | `1f4d3` | +| :ledger: | `:ledger:` | `1f4d2` | +| :page_with_curl: | `:page_with_curl:` | `1f4c3` | +| :scroll: | `:scroll:` | `1f4dc` | +| :page_facing_up: | `:page_facing_up:` | `1f4c4` | +| :newspaper: | `:newspaper:` | `1f4f0` | +| :newspaper2: | `:newspaper2:` | `1f5de` | +| :bookmark_tabs: | `:bookmark_tabs:` | `1f4d1` | +| :bookmark: | `:bookmark:` | `1f516` | +| :label: | `:label:` | `1f3f7` | +| :moneybag: | `:moneybag:` | `1f4b0` | +| :coin: | `:coin:` | `1fa99` | +| :yen: | `:yen:` | `1f4b4` | +| :dollar: | `:dollar:` | `1f4b5` | +| :euro: | `:euro:` | `1f4b6` | +| :pound: | `:pound:` | `1f4b7` | +| :money_with_wings: | `:money_with_wings:` | `1f4b8` | +| :credit_card: | `:credit_card:` | `1f4b3` | +| :receipt: | `:receipt:` | `1f9fe` | +| :chart: | `:chart:` | `1f4b9` | +| :envelope: | `:envelope:` | `2709` | +| :e-mail: | `:e-mail:` | `1f4e7` | +| :incoming_envelope: | `:incoming_envelope:` | `1f4e8` | +| :envelope_with_arrow: | `:envelope_with_arrow:` | `1f4e9` | +| :outbox_tray: | `:outbox_tray:` | `1f4e4` | +| :inbox_tray: | `:inbox_tray:` | `1f4e5` | +| :package: | `:package:` | `1f4e6` | +| :mailbox: | `:mailbox:` | `1f4eb` | +| :mailbox_closed: | `:mailbox_closed:` | `1f4ea` | +| :mailbox_with_mail: | `:mailbox_with_mail:` | `1f4ec` | +| :mailbox_with_no_mail: | `:mailbox_with_no_mail:` | `1f4ed` | +| :postbox: | `:postbox:` | `1f4ee` | +| :ballot_box: | `:ballot_box:` | `1f5f3` | +| :pencil2: | `:pencil2:` | `270f` | +| :black_nib: | `:black_nib:` | `2712` | +| :pen_fountain: | `:pen_fountain:` | `1f58b` | +| :pen_ballpoint: | `:pen_ballpoint:` | `1f58a` | +| :paintbrush: | `:paintbrush:` | `1f58c` | +| :crayon: | `:crayon:` | `1f58d` | +| :pencil: | `:pencil:` | `1f4dd` | +| :briefcase: | `:briefcase:` | `1f4bc` | +| :file_folder: | `:file_folder:` | `1f4c1` | +| :open_file_folder: | `:open_file_folder:` | `1f4c2` | +| :dividers: | `:dividers:` | `1f5c2` | +| :date: | `:date:` | `1f4c5` | +| :calendar: | `:calendar:` | `1f4c6` | +| :notepad_spiral: | `:notepad_spiral:` | `1f5d2` | +| :calendar_spiral: | `:calendar_spiral:` | `1f5d3` | +| :card_index: | `:card_index:` | `1f4c7` | +| :chart_with_upwards_trend: | `:chart_with_upwards_trend:` | `1f4c8` | +| :chart_with_downwards_trend: | `:chart_with_downwards_trend:` | `1f4c9` | +| :bar_chart: | `:bar_chart:` | `1f4ca` | +| :clipboard: | `:clipboard:` | `1f4cb` | +| :pushpin: | `:pushpin:` | `1f4cc` | +| :round_pushpin: | `:round_pushpin:` | `1f4cd` | +| :paperclip: | `:paperclip:` | `1f4ce` | +| :paperclips: | `:paperclips:` | `1f587` | +| :straight_ruler: | `:straight_ruler:` | `1f4cf` | +| :triangular_ruler: | `:triangular_ruler:` | `1f4d0` | +| :scissors: | `:scissors:` | `2702` | +| :card_box: | `:card_box:` | `1f5c3` | +| :file_cabinet: | `:file_cabinet:` | `1f5c4` | +| :wastebasket: | `:wastebasket:` | `1f5d1` | +| :lock: | `:lock:` | `1f512` | +| :unlock: | `:unlock:` | `1f513` | +| :lock_with_ink_pen: | `:lock_with_ink_pen:` | `1f50f` | +| :closed_lock_with_key: | `:closed_lock_with_key:` | `1f510` | +| :key: | `:key:` | `1f511` | +| :key2: | `:key2:` | `1f5dd` | +| :hammer: | `:hammer:` | `1f528` | +| :axe: | `:axe:` | `1fa93` | +| :pick: | `:pick:` | `26cf` | +| :hammer_pick: | `:hammer_pick:` | `2692` | +| :tools: | `:tools:` | `1f6e0` | +| :dagger: | `:dagger:` | `1f5e1` | +| :crossed_swords: | `:crossed_swords:` | `2694` | +| :bomb: | `:bomb:` | `1f4a3` | +| :boomerang: | `:boomerang:` | `1fa83` | +| :bow_and_arrow: | `:bow_and_arrow:` | `1f3f9` | +| :shield: | `:shield:` | `1f6e1` | +| :carpentry_saw: | `:carpentry_saw:` | `1fa9a` | +| :wrench: | `:wrench:` | `1f527` | +| :screwdriver: | `:screwdriver:` | `1fa9b` | +| :nut_and_bolt: | `:nut_and_bolt:` | `1f529` | +| :gear: | `:gear:` | `2699` | +| :compression: | `:compression:` | `1f5dc` | +| :scales: | `:scales:` | `2696` | +| :probing_cane: | `:probing_cane:` | `1f9af` | +| :link: | `:link:` | `1f517` | +| :chains: | `:chains:` | `26d3` | +| :hook: | `:hook:` | `1fa9d` | +| :toolbox: | `:toolbox:` | `1f9f0` | +| :magnet: | `:magnet:` | `1f9f2` | +| :ladder: | `:ladder:` | `1fa9c` | +| :alembic: | `:alembic:` | `2697` | +| :test_tube: | `:test_tube:` | `1f9ea` | +| :petri_dish: | `:petri_dish:` | `1f9eb` | +| :dna: | `:dna:` | `1f9ec` | +| :microscope: | `:microscope:` | `1f52c` | +| :telescope: | `:telescope:` | `1f52d` | +| :satellite: | `:satellite:` | `1f4e1` | +| :syringe: | `:syringe:` | `1f489` | +| :drop_of_blood: | `:drop_of_blood:` | `1fa78` | +| :pill: | `:pill:` | `1f48a` | +| :adhesive_bandage: | `:adhesive_bandage:` | `1fa79` | +| :crutch: | `:crutch:` | `1fa7c` | +| :stethoscope: | `:stethoscope:` | `1fa7a` | +| :x_ray: | `:x_ray:` | `1fa7b` | +| :door: | `:door:` | `1f6aa` | +| :elevator: | `:elevator:` | `1f6d7` | +| :mirror: | `:mirror:` | `1fa9e` | +| :window: | `:window:` | `1fa9f` | +| :bed: | `:bed:` | `1f6cf` | +| :couch: | `:couch:` | `1f6cb` | +| :chair: | `:chair:` | `1fa91` | +| :toilet: | `:toilet:` | `1f6bd` | +| :plunger: | `:plunger:` | `1faa0` | +| :shower: | `:shower:` | `1f6bf` | +| :bathtub: | `:bathtub:` | `1f6c1` | +| :mouse_trap: | `:mouse_trap:` | `1faa4` | +| :razor: | `:razor:` | `1fa92` | +| :squeeze_bottle: | `:squeeze_bottle:` | `1f9f4` | +| :safety_pin: | `:safety_pin:` | `1f9f7` | +| :broom: | `:broom:` | `1f9f9` | +| :basket: | `:basket:` | `1f9fa` | +| :roll_of_paper: | `:roll_of_paper:` | `1f9fb` | +| :bucket: | `:bucket:` | `1faa3` | +| :soap: | `:soap:` | `1f9fc` | +| :bubbles: | `:bubbles:` | `1fae7` | +| :toothbrush: | `:toothbrush:` | `1faa5` | +| :sponge: | `:sponge:` | `1f9fd` | +| :fire_extinguisher: | `:fire_extinguisher:` | `1f9ef` | +| :shopping_cart: | `:shopping_cart:` | `1f6d2` | +| :smoking: | `:smoking:` | `1f6ac` | +| :coffin: | `:coffin:` | `26b0` | +| :headstone: | `:headstone:` | `1faa6` | +| :urn: | `:urn:` | `26b1` | +| :nazar_amulet: | `:nazar_amulet:` | `1f9ff` | +| :hamsa: | `:hamsa:` | `1faac` | +| :moyai: | `:moyai:` | `1f5ff` | +| :placard: | `:placard:` | `1faa7` | +| :identification_card: | `:identification_card:` | `1faaa` | +| :atm: | `:atm:` | `1f3e7` | +| :put_litter_in_its_place: | `:put_litter_in_its_place:` | `1f6ae` | +| :potable_water: | `:potable_water:` | `1f6b0` | +| :wheelchair: | `:wheelchair:` | `267f` | +| :mens: | `:mens:` | `1f6b9` | +| :womens: | `:womens:` | `1f6ba` | +| :restroom: | `:restroom:` | `1f6bb` | +| :baby_symbol: | `:baby_symbol:` | `1f6bc` | +| :wc: | `:wc:` | `1f6be` | +| :passport_control: | `:passport_control:` | `1f6c2` | +| :customs: | `:customs:` | `1f6c3` | +| :baggage_claim: | `:baggage_claim:` | `1f6c4` | +| :left_luggage: | `:left_luggage:` | `1f6c5` | +| :warning: | `:warning:` | `26a0` | +| :children_crossing: | `:children_crossing:` | `1f6b8` | +| :no_entry: | `:no_entry:` | `26d4` | +| :no_entry_sign: | `:no_entry_sign:` | `1f6ab` | +| :no_bicycles: | `:no_bicycles:` | `1f6b3` | +| :no_smoking: | `:no_smoking:` | `1f6ad` | +| :do_not_litter: | `:do_not_litter:` | `1f6af` | +| :non-potable_water: | `:non-potable_water:` | `1f6b1` | +| :no_pedestrians: | `:no_pedestrians:` | `1f6b7` | +| :no_mobile_phones: | `:no_mobile_phones:` | `1f4f5` | +| :underage: | `:underage:` | `1f51e` | +| :radioactive: | `:radioactive:` | `2622` | +| :biohazard: | `:biohazard:` | `2623` | +| :arrow_up: | `:arrow_up:` | `2b06` | +| :arrow_upper_right: | `:arrow_upper_right:` | `2197` | +| :arrow_right: | `:arrow_right:` | `27a1` | +| :arrow_lower_right: | `:arrow_lower_right:` | `2198` | +| :arrow_down: | `:arrow_down:` | `2b07` | +| :arrow_lower_left: | `:arrow_lower_left:` | `2199` | +| :arrow_left: | `:arrow_left:` | `2b05` | +| :arrow_upper_left: | `:arrow_upper_left:` | `2196` | +| :arrow_up_down: | `:arrow_up_down:` | `2195` | +| :left_right_arrow: | `:left_right_arrow:` | `2194` | +| :leftwards_arrow_with_hook: | `:leftwards_arrow_with_hook:` | `21a9` | +| :arrow_right_hook: | `:arrow_right_hook:` | `21aa` | +| :arrow_heading_up: | `:arrow_heading_up:` | `2934` | +| :arrow_heading_down: | `:arrow_heading_down:` | `2935` | +| :arrows_clockwise: | `:arrows_clockwise:` | `1f503` | +| :arrows_counterclockwise: | `:arrows_counterclockwise:` | `1f504` | +| :back: | `:back:` | `1f519` | +| :end: | `:end:` | `1f51a` | +| :on: | `:on:` | `1f51b` | +| :soon: | `:soon:` | `1f51c` | +| :top: | `:top:` | `1f51d` | +| :place_of_worship: | `:place_of_worship:` | `1f6d0` | +| :atom: | `:atom:` | `269b` | +| :om_symbol: | `:om_symbol:` | `1f549` | +| :star_of_david: | `:star_of_david:` | `2721` | +| :wheel_of_dharma: | `:wheel_of_dharma:` | `2638` | +| :yin_yang: | `:yin_yang:` | `262f` | +| :cross: | `:cross:` | `271d` | +| :orthodox_cross: | `:orthodox_cross:` | `2626` | +| :star_and_crescent: | `:star_and_crescent:` | `262a` | +| :peace: | `:peace:` | `262e` | +| :menorah: | `:menorah:` | `1f54e` | +| :six_pointed_star: | `:six_pointed_star:` | `1f52f` | +| :khanda: | `:khanda:` | `1faaf` | +| :aries: | `:aries:` | `2648` | +| :taurus: | `:taurus:` | `2649` | +| :gemini: | `:gemini:` | `264a` | +| :cancer: | `:cancer:` | `264b` | +| :leo: | `:leo:` | `264c` | +| :virgo: | `:virgo:` | `264d` | +| :libra: | `:libra:` | `264e` | +| :scorpius: | `:scorpius:` | `264f` | +| :sagittarius: | `:sagittarius:` | `2650` | +| :capricorn: | `:capricorn:` | `2651` | +| :aquarius: | `:aquarius:` | `2652` | +| :pisces: | `:pisces:` | `2653` | +| :ophiuchus: | `:ophiuchus:` | `26ce` | +| :twisted_rightwards_arrows: | `:twisted_rightwards_arrows:` | `1f500` | +| :repeat: | `:repeat:` | `1f501` | +| :repeat_one: | `:repeat_one:` | `1f502` | +| :arrow_forward: | `:arrow_forward:` | `25b6` | +| :fast_forward: | `:fast_forward:` | `23e9` | +| :track_next: | `:track_next:` | `23ed` | +| :play_pause: | `:play_pause:` | `23ef` | +| :arrow_backward: | `:arrow_backward:` | `25c0` | +| :rewind: | `:rewind:` | `23ea` | +| :track_previous: | `:track_previous:` | `23ee` | +| :arrow_up_small: | `:arrow_up_small:` | `1f53c` | +| :arrow_double_up: | `:arrow_double_up:` | `23eb` | +| :arrow_down_small: | `:arrow_down_small:` | `1f53d` | +| :arrow_double_down: | `:arrow_double_down:` | `23ec` | +| :pause_button: | `:pause_button:` | `23f8` | +| :stop_button: | `:stop_button:` | `23f9` | +| :record_button: | `:record_button:` | `23fa` | +| :eject: | `:eject:` | `23cf` | +| :cinema: | `:cinema:` | `1f3a6` | +| :low_brightness: | `:low_brightness:` | `1f505` | +| :high_brightness: | `:high_brightness:` | `1f506` | +| :signal_strength: | `:signal_strength:` | `1f4f6` | +| :wireless: | `:wireless:` | `1f6dc` | +| :vibration_mode: | `:vibration_mode:` | `1f4f3` | +| :mobile_phone_off: | `:mobile_phone_off:` | `1f4f4` | +| :female_sign: | `:female_sign:` | `2640` | +| :male_sign: | `:male_sign:` | `2642` | +| :transgender_symbol: | `:transgender_symbol:` | `26a7` | +| :heavy_multiplication_x: | `:heavy_multiplication_x:` | `2716` | +| :heavy_plus_sign: | `:heavy_plus_sign:` | `2795` | +| :heavy_minus_sign: | `:heavy_minus_sign:` | `2796` | +| :heavy_division_sign: | `:heavy_division_sign:` | `2797` | +| :heavy_equals_sign: | `:heavy_equals_sign:` | `1f7f0` | +| :infinity: | `:infinity:` | `267e` | +| :bangbang: | `:bangbang:` | `203c` | +| :interrobang: | `:interrobang:` | `2049` | +| :question: | `:question:` | `2753` | +| :grey_question: | `:grey_question:` | `2754` | +| :grey_exclamation: | `:grey_exclamation:` | `2755` | +| :exclamation: | `:exclamation:` | `2757` | +| :wavy_dash: | `:wavy_dash:` | `3030` | +| :currency_exchange: | `:currency_exchange:` | `1f4b1` | +| :heavy_dollar_sign: | `:heavy_dollar_sign:` | `1f4b2` | +| :medical_symbol: | `:medical_symbol:` | `2695` | +| :recycle: | `:recycle:` | `267b` | +| :fleur-de-lis: | `:fleur-de-lis:` | `269c` | +| :trident: | `:trident:` | `1f531` | +| :name_badge: | `:name_badge:` | `1f4db` | +| :beginner: | `:beginner:` | `1f530` | +| :o: | `:o:` | `2b55` | +| :white_check_mark: | `:white_check_mark:` | `2705` | +| :ballot_box_with_check: | `:ballot_box_with_check:` | `2611` | +| :heavy_check_mark: | `:heavy_check_mark:` | `2714` | +| :x: | `:x:` | `274c` | +| :negative_squared_cross_mark: | `:negative_squared_cross_mark:` | `274e` | +| :curly_loop: | `:curly_loop:` | `27b0` | +| :loop: | `:loop:` | `27bf` | +| :part_alternation_mark: | `:part_alternation_mark:` | `303d` | +| :eight_spoked_asterisk: | `:eight_spoked_asterisk:` | `2733` | +| :eight_pointed_black_star: | `:eight_pointed_black_star:` | `2734` | +| :sparkle: | `:sparkle:` | `2747` | +| :copyright: | `:copyright:` | `a9` | +| :registered: | `:registered:` | `ae` | +| :tm: | `:tm:` | `2122` | +| :hash: | `:hash:` | `23-20e3` | +| :asterisk: | `:asterisk:` | `2a-20e3` | +| :zero: | `:zero:` | `30-20e3` | +| :one: | `:one:` | `31-20e3` | +| :two: | `:two:` | `32-20e3` | +| :three: | `:three:` | `33-20e3` | +| :four: | `:four:` | `34-20e3` | +| :five: | `:five:` | `35-20e3` | +| :six: | `:six:` | `36-20e3` | +| :seven: | `:seven:` | `37-20e3` | +| :eight: | `:eight:` | `38-20e3` | +| :nine: | `:nine:` | `39-20e3` | +| :keycap_ten: | `:keycap_ten:` | `1f51f` | +| :capital_abcd: | `:capital_abcd:` | `1f520` | +| :abcd: | `:abcd:` | `1f521` | +| :1234: | `:1234:` | `1f522` | +| :symbols: | `:symbols:` | `1f523` | +| :abc: | `:abc:` | `1f524` | +| :a: | `:a:` | `1f170` | +| :ab: | `:ab:` | `1f18e` | +| :b: | `:b:` | `1f171` | +| :cl: | `:cl:` | `1f191` | +| :cool: | `:cool:` | `1f192` | +| :free: | `:free:` | `1f193` | +| :information_source: | `:information_source:` | `2139` | +| :id: | `:id:` | `1f194` | +| :m: | `:m:` | `24c2` | +| :new: | `:new:` | `1f195` | +| :ng: | `:ng:` | `1f196` | +| :o2: | `:o2:` | `1f17e` | +| :ok: | `:ok:` | `1f197` | +| :parking: | `:parking:` | `1f17f` | +| :sos: | `:sos:` | `1f198` | +| :up: | `:up:` | `1f199` | +| :vs: | `:vs:` | `1f19a` | +| :koko: | `:koko:` | `1f201` | +| :sa: | `:sa:` | `1f202` | +| :u6708: | `:u6708:` | `1f237` | +| :u6709: | `:u6709:` | `1f236` | +| :u6307: | `:u6307:` | `1f22f` | +| :ideograph_advantage: | `:ideograph_advantage:` | `1f250` | +| :u5272: | `:u5272:` | `1f239` | +| :u7121: | `:u7121:` | `1f21a` | +| :u7981: | `:u7981:` | `1f232` | +| :accept: | `:accept:` | `1f251` | +| :u7533: | `:u7533:` | `1f238` | +| :u5408: | `:u5408:` | `1f234` | +| :u7a7a: | `:u7a7a:` | `1f233` | +| :congratulations: | `:congratulations:` | `3297` | +| :secret: | `:secret:` | `3299` | +| :u55b6: | `:u55b6:` | `1f23a` | +| :u6e80: | `:u6e80:` | `1f235` | +| :red_circle: | `:red_circle:` | `1f534` | +| :orange_circle: | `:orange_circle:` | `1f7e0` | +| :yellow_circle: | `:yellow_circle:` | `1f7e1` | +| :green_circle: | `:green_circle:` | `1f7e2` | +| :blue_circle: | `:blue_circle:` | `1f535` | +| :purple_circle: | `:purple_circle:` | `1f7e3` | +| :brown_circle: | `:brown_circle:` | `1f7e4` | +| :black_circle: | `:black_circle:` | `26ab` | +| :white_circle: | `:white_circle:` | `26aa` | +| :red_square: | `:red_square:` | `1f7e5` | +| :orange_square: | `:orange_square:` | `1f7e7` | +| :yellow_square: | `:yellow_square:` | `1f7e8` | +| :green_square: | `:green_square:` | `1f7e9` | +| :blue_square: | `:blue_square:` | `1f7e6` | +| :purple_square: | `:purple_square:` | `1f7ea` | +| :brown_square: | `:brown_square:` | `1f7eb` | +| :black_large_square: | `:black_large_square:` | `2b1b` | +| :white_large_square: | `:white_large_square:` | `2b1c` | +| :black_medium_square: | `:black_medium_square:` | `25fc` | +| :white_medium_square: | `:white_medium_square:` | `25fb` | +| :black_medium_small_square: | `:black_medium_small_square:` | `25fe` | +| :white_medium_small_square: | `:white_medium_small_square:` | `25fd` | +| :black_small_square: | `:black_small_square:` | `25aa` | +| :white_small_square: | `:white_small_square:` | `25ab` | +| :large_orange_diamond: | `:large_orange_diamond:` | `1f536` | +| :large_blue_diamond: | `:large_blue_diamond:` | `1f537` | +| :small_orange_diamond: | `:small_orange_diamond:` | `1f538` | +| :small_blue_diamond: | `:small_blue_diamond:` | `1f539` | +| :small_red_triangle: | `:small_red_triangle:` | `1f53a` | +| :small_red_triangle_down: | `:small_red_triangle_down:` | `1f53b` | +| :diamond_shape_with_a_dot_inside: | `:diamond_shape_with_a_dot_inside:` | `1f4a0` | +| :radio_button: | `:radio_button:` | `1f518` | +| :white_square_button: | `:white_square_button:` | `1f533` | +| :black_square_button: | `:black_square_button:` | `1f532` | +| :checkered_flag: | `:checkered_flag:` | `1f3c1` | +| :triangular_flag_on_post: | `:triangular_flag_on_post:` | `1f6a9` | +| :crossed_flags: | `:crossed_flags:` | `1f38c` | +| :flag_black: | `:flag_black:` | `1f3f4` | +| :flag_white: | `:flag_white:` | `1f3f3` | +| :rainbow_flag: | `:rainbow_flag:` | `1f3f3-fe0f-200d-1f308` | +| :transgender_flag: | `:transgender_flag:` | `1f3f3-fe0f-200d-26a7-fe0f` | +| :pirate_flag: | `:pirate_flag:` | `1f3f4-200d-2620-fe0f` | +| :flag_ac: | `:flag_ac:` | `1f1e6-1f1e8` | +| :flag_ad: | `:flag_ad:` | `1f1e6-1f1e9` | +| :flag_ae: | `:flag_ae:` | `1f1e6-1f1ea` | +| :flag_af: | `:flag_af:` | `1f1e6-1f1eb` | +| :flag_ag: | `:flag_ag:` | `1f1e6-1f1ec` | +| :flag_ai: | `:flag_ai:` | `1f1e6-1f1ee` | +| :flag_al: | `:flag_al:` | `1f1e6-1f1f1` | +| :flag_am: | `:flag_am:` | `1f1e6-1f1f2` | +| :flag_ao: | `:flag_ao:` | `1f1e6-1f1f4` | +| :flag_aq: | `:flag_aq:` | `1f1e6-1f1f6` | +| :flag_ar: | `:flag_ar:` | `1f1e6-1f1f7` | +| :flag_as: | `:flag_as:` | `1f1e6-1f1f8` | +| :flag_at: | `:flag_at:` | `1f1e6-1f1f9` | +| :flag_au: | `:flag_au:` | `1f1e6-1f1fa` | +| :flag_aw: | `:flag_aw:` | `1f1e6-1f1fc` | +| :flag_ax: | `:flag_ax:` | `1f1e6-1f1fd` | +| :flag_az: | `:flag_az:` | `1f1e6-1f1ff` | +| :flag_ba: | `:flag_ba:` | `1f1e7-1f1e6` | +| :flag_bb: | `:flag_bb:` | `1f1e7-1f1e7` | +| :flag_bd: | `:flag_bd:` | `1f1e7-1f1e9` | +| :flag_be: | `:flag_be:` | `1f1e7-1f1ea` | +| :flag_bf: | `:flag_bf:` | `1f1e7-1f1eb` | +| :flag_bg: | `:flag_bg:` | `1f1e7-1f1ec` | +| :flag_bh: | `:flag_bh:` | `1f1e7-1f1ed` | +| :flag_bi: | `:flag_bi:` | `1f1e7-1f1ee` | +| :flag_bj: | `:flag_bj:` | `1f1e7-1f1ef` | +| :flag_bl: | `:flag_bl:` | `1f1e7-1f1f1` | +| :flag_bm: | `:flag_bm:` | `1f1e7-1f1f2` | +| :flag_bn: | `:flag_bn:` | `1f1e7-1f1f3` | +| :flag_bo: | `:flag_bo:` | `1f1e7-1f1f4` | +| :flag_bq: | `:flag_bq:` | `1f1e7-1f1f6` | +| :flag_br: | `:flag_br:` | `1f1e7-1f1f7` | +| :flag_bs: | `:flag_bs:` | `1f1e7-1f1f8` | +| :flag_bt: | `:flag_bt:` | `1f1e7-1f1f9` | +| :flag_bv: | `:flag_bv:` | `1f1e7-1f1fb` | +| :flag_bw: | `:flag_bw:` | `1f1e7-1f1fc` | +| :flag_by: | `:flag_by:` | `1f1e7-1f1fe` | +| :flag_bz: | `:flag_bz:` | `1f1e7-1f1ff` | +| :flag_ca: | `:flag_ca:` | `1f1e8-1f1e6` | +| :flag_cc: | `:flag_cc:` | `1f1e8-1f1e8` | +| :flag_cd: | `:flag_cd:` | `1f1e8-1f1e9` | +| :flag_cf: | `:flag_cf:` | `1f1e8-1f1eb` | +| :flag_cg: | `:flag_cg:` | `1f1e8-1f1ec` | +| :flag_ch: | `:flag_ch:` | `1f1e8-1f1ed` | +| :flag_ci: | `:flag_ci:` | `1f1e8-1f1ee` | +| :flag_ck: | `:flag_ck:` | `1f1e8-1f1f0` | +| :flag_cl: | `:flag_cl:` | `1f1e8-1f1f1` | +| :flag_cm: | `:flag_cm:` | `1f1e8-1f1f2` | +| :flag_cn: | `:flag_cn:` | `1f1e8-1f1f3` | +| :flag_co: | `:flag_co:` | `1f1e8-1f1f4` | +| :flag_cp: | `:flag_cp:` | `1f1e8-1f1f5` | +| :flag_cr: | `:flag_cr:` | `1f1e8-1f1f7` | +| :flag_cu: | `:flag_cu:` | `1f1e8-1f1fa` | +| :flag_cv: | `:flag_cv:` | `1f1e8-1f1fb` | +| :flag_cw: | `:flag_cw:` | `1f1e8-1f1fc` | +| :flag_cx: | `:flag_cx:` | `1f1e8-1f1fd` | +| :flag_cy: | `:flag_cy:` | `1f1e8-1f1fe` | +| :flag_cz: | `:flag_cz:` | `1f1e8-1f1ff` | +| :flag_de: | `:flag_de:` | `1f1e9-1f1ea` | +| :flag_dg: | `:flag_dg:` | `1f1e9-1f1ec` | +| :flag_dj: | `:flag_dj:` | `1f1e9-1f1ef` | +| :flag_dk: | `:flag_dk:` | `1f1e9-1f1f0` | +| :flag_dm: | `:flag_dm:` | `1f1e9-1f1f2` | +| :flag_do: | `:flag_do:` | `1f1e9-1f1f4` | +| :flag_dz: | `:flag_dz:` | `1f1e9-1f1ff` | +| :flag_ea: | `:flag_ea:` | `1f1ea-1f1e6` | +| :flag_ec: | `:flag_ec:` | `1f1ea-1f1e8` | +| :flag_ee: | `:flag_ee:` | `1f1ea-1f1ea` | +| :flag_eg: | `:flag_eg:` | `1f1ea-1f1ec` | +| :flag_eh: | `:flag_eh:` | `1f1ea-1f1ed` | +| :flag_er: | `:flag_er:` | `1f1ea-1f1f7` | +| :flag_es: | `:flag_es:` | `1f1ea-1f1f8` | +| :flag_et: | `:flag_et:` | `1f1ea-1f1f9` | +| :flag_eu: | `:flag_eu:` | `1f1ea-1f1fa` | +| :flag_fi: | `:flag_fi:` | `1f1eb-1f1ee` | +| :flag_fj: | `:flag_fj:` | `1f1eb-1f1ef` | +| :flag_fk: | `:flag_fk:` | `1f1eb-1f1f0` | +| :flag_fm: | `:flag_fm:` | `1f1eb-1f1f2` | +| :flag_fo: | `:flag_fo:` | `1f1eb-1f1f4` | +| :flag_fr: | `:flag_fr:` | `1f1eb-1f1f7` | +| :flag_ga: | `:flag_ga:` | `1f1ec-1f1e6` | +| :flag_gb: | `:flag_gb:` | `1f1ec-1f1e7` | +| :flag_gd: | `:flag_gd:` | `1f1ec-1f1e9` | +| :flag_ge: | `:flag_ge:` | `1f1ec-1f1ea` | +| :flag_gf: | `:flag_gf:` | `1f1ec-1f1eb` | +| :flag_gg: | `:flag_gg:` | `1f1ec-1f1ec` | +| :flag_gh: | `:flag_gh:` | `1f1ec-1f1ed` | +| :flag_gi: | `:flag_gi:` | `1f1ec-1f1ee` | +| :flag_gl: | `:flag_gl:` | `1f1ec-1f1f1` | +| :flag_gm: | `:flag_gm:` | `1f1ec-1f1f2` | +| :flag_gn: | `:flag_gn:` | `1f1ec-1f1f3` | +| :flag_gp: | `:flag_gp:` | `1f1ec-1f1f5` | +| :flag_gq: | `:flag_gq:` | `1f1ec-1f1f6` | +| :flag_gr: | `:flag_gr:` | `1f1ec-1f1f7` | +| :flag_gs: | `:flag_gs:` | `1f1ec-1f1f8` | +| :flag_gt: | `:flag_gt:` | `1f1ec-1f1f9` | +| :flag_gu: | `:flag_gu:` | `1f1ec-1f1fa` | +| :flag_gw: | `:flag_gw:` | `1f1ec-1f1fc` | +| :flag_gy: | `:flag_gy:` | `1f1ec-1f1fe` | +| :flag_hk: | `:flag_hk:` | `1f1ed-1f1f0` | +| :flag_hm: | `:flag_hm:` | `1f1ed-1f1f2` | +| :flag_hn: | `:flag_hn:` | `1f1ed-1f1f3` | +| :flag_hr: | `:flag_hr:` | `1f1ed-1f1f7` | +| :flag_ht: | `:flag_ht:` | `1f1ed-1f1f9` | +| :flag_hu: | `:flag_hu:` | `1f1ed-1f1fa` | +| :flag_ic: | `:flag_ic:` | `1f1ee-1f1e8` | +| :flag_id: | `:flag_id:` | `1f1ee-1f1e9` | +| :flag_ie: | `:flag_ie:` | `1f1ee-1f1ea` | +| :flag_il: | `:flag_il:` | `1f1ee-1f1f1` | +| :flag_im: | `:flag_im:` | `1f1ee-1f1f2` | +| :flag_in: | `:flag_in:` | `1f1ee-1f1f3` | +| :flag_io: | `:flag_io:` | `1f1ee-1f1f4` | +| :flag_iq: | `:flag_iq:` | `1f1ee-1f1f6` | +| :flag_ir: | `:flag_ir:` | `1f1ee-1f1f7` | +| :flag_is: | `:flag_is:` | `1f1ee-1f1f8` | +| :flag_it: | `:flag_it:` | `1f1ee-1f1f9` | +| :flag_je: | `:flag_je:` | `1f1ef-1f1ea` | +| :flag_jm: | `:flag_jm:` | `1f1ef-1f1f2` | +| :flag_jo: | `:flag_jo:` | `1f1ef-1f1f4` | +| :flag_jp: | `:flag_jp:` | `1f1ef-1f1f5` | +| :flag_ke: | `:flag_ke:` | `1f1f0-1f1ea` | +| :flag_kg: | `:flag_kg:` | `1f1f0-1f1ec` | +| :flag_kh: | `:flag_kh:` | `1f1f0-1f1ed` | +| :flag_ki: | `:flag_ki:` | `1f1f0-1f1ee` | +| :flag_km: | `:flag_km:` | `1f1f0-1f1f2` | +| :flag_kn: | `:flag_kn:` | `1f1f0-1f1f3` | +| :flag_kp: | `:flag_kp:` | `1f1f0-1f1f5` | +| :flag_kr: | `:flag_kr:` | `1f1f0-1f1f7` | +| :flag_kw: | `:flag_kw:` | `1f1f0-1f1fc` | +| :flag_ky: | `:flag_ky:` | `1f1f0-1f1fe` | +| :flag_kz: | `:flag_kz:` | `1f1f0-1f1ff` | +| :flag_la: | `:flag_la:` | `1f1f1-1f1e6` | +| :flag_lb: | `:flag_lb:` | `1f1f1-1f1e7` | +| :flag_lc: | `:flag_lc:` | `1f1f1-1f1e8` | +| :flag_li: | `:flag_li:` | `1f1f1-1f1ee` | +| :flag_lk: | `:flag_lk:` | `1f1f1-1f1f0` | +| :flag_lr: | `:flag_lr:` | `1f1f1-1f1f7` | +| :flag_ls: | `:flag_ls:` | `1f1f1-1f1f8` | +| :flag_lt: | `:flag_lt:` | `1f1f1-1f1f9` | +| :flag_lu: | `:flag_lu:` | `1f1f1-1f1fa` | +| :flag_lv: | `:flag_lv:` | `1f1f1-1f1fb` | +| :flag_ly: | `:flag_ly:` | `1f1f1-1f1fe` | +| :flag_ma: | `:flag_ma:` | `1f1f2-1f1e6` | +| :flag_mc: | `:flag_mc:` | `1f1f2-1f1e8` | +| :flag_md: | `:flag_md:` | `1f1f2-1f1e9` | +| :flag_me: | `:flag_me:` | `1f1f2-1f1ea` | +| :flag_mf: | `:flag_mf:` | `1f1f2-1f1eb` | +| :flag_mg: | `:flag_mg:` | `1f1f2-1f1ec` | +| :flag_mh: | `:flag_mh:` | `1f1f2-1f1ed` | +| :flag_mk: | `:flag_mk:` | `1f1f2-1f1f0` | +| :flag_ml: | `:flag_ml:` | `1f1f2-1f1f1` | +| :flag_mm: | `:flag_mm:` | `1f1f2-1f1f2` | +| :flag_mn: | `:flag_mn:` | `1f1f2-1f1f3` | +| :flag_mo: | `:flag_mo:` | `1f1f2-1f1f4` | +| :flag_mp: | `:flag_mp:` | `1f1f2-1f1f5` | +| :flag_mq: | `:flag_mq:` | `1f1f2-1f1f6` | +| :flag_mr: | `:flag_mr:` | `1f1f2-1f1f7` | +| :flag_ms: | `:flag_ms:` | `1f1f2-1f1f8` | +| :flag_mt: | `:flag_mt:` | `1f1f2-1f1f9` | +| :flag_mu: | `:flag_mu:` | `1f1f2-1f1fa` | +| :flag_mv: | `:flag_mv:` | `1f1f2-1f1fb` | +| :flag_mw: | `:flag_mw:` | `1f1f2-1f1fc` | +| :flag_mx: | `:flag_mx:` | `1f1f2-1f1fd` | +| :flag_my: | `:flag_my:` | `1f1f2-1f1fe` | +| :flag_mz: | `:flag_mz:` | `1f1f2-1f1ff` | +| :flag_na: | `:flag_na:` | `1f1f3-1f1e6` | +| :flag_nc: | `:flag_nc:` | `1f1f3-1f1e8` | +| :flag_ne: | `:flag_ne:` | `1f1f3-1f1ea` | +| :flag_nf: | `:flag_nf:` | `1f1f3-1f1eb` | +| :flag_ng: | `:flag_ng:` | `1f1f3-1f1ec` | +| :flag_ni: | `:flag_ni:` | `1f1f3-1f1ee` | +| :flag_nl: | `:flag_nl:` | `1f1f3-1f1f1` | +| :flag_no: | `:flag_no:` | `1f1f3-1f1f4` | +| :flag_np: | `:flag_np:` | `1f1f3-1f1f5` | +| :flag_nr: | `:flag_nr:` | `1f1f3-1f1f7` | +| :flag_nu: | `:flag_nu:` | `1f1f3-1f1fa` | +| :flag_nz: | `:flag_nz:` | `1f1f3-1f1ff` | +| :flag_om: | `:flag_om:` | `1f1f4-1f1f2` | +| :flag_pa: | `:flag_pa:` | `1f1f5-1f1e6` | +| :flag_pe: | `:flag_pe:` | `1f1f5-1f1ea` | +| :flag_pf: | `:flag_pf:` | `1f1f5-1f1eb` | +| :flag_pg: | `:flag_pg:` | `1f1f5-1f1ec` | +| :flag_ph: | `:flag_ph:` | `1f1f5-1f1ed` | +| :flag_pk: | `:flag_pk:` | `1f1f5-1f1f0` | +| :flag_pl: | `:flag_pl:` | `1f1f5-1f1f1` | +| :flag_pm: | `:flag_pm:` | `1f1f5-1f1f2` | +| :flag_pn: | `:flag_pn:` | `1f1f5-1f1f3` | +| :flag_pr: | `:flag_pr:` | `1f1f5-1f1f7` | +| :flag_ps: | `:flag_ps:` | `1f1f5-1f1f8` | +| :flag_pt: | `:flag_pt:` | `1f1f5-1f1f9` | +| :flag_pw: | `:flag_pw:` | `1f1f5-1f1fc` | +| :flag_py: | `:flag_py:` | `1f1f5-1f1fe` | +| :flag_qa: | `:flag_qa:` | `1f1f6-1f1e6` | +| :flag_re: | `:flag_re:` | `1f1f7-1f1ea` | +| :flag_ro: | `:flag_ro:` | `1f1f7-1f1f4` | +| :flag_rs: | `:flag_rs:` | `1f1f7-1f1f8` | +| :flag_ru: | `:flag_ru:` | `1f1f7-1f1fa` | +| :flag_rw: | `:flag_rw:` | `1f1f7-1f1fc` | +| :flag_sa: | `:flag_sa:` | `1f1f8-1f1e6` | +| :flag_sb: | `:flag_sb:` | `1f1f8-1f1e7` | +| :flag_sc: | `:flag_sc:` | `1f1f8-1f1e8` | +| :flag_sd: | `:flag_sd:` | `1f1f8-1f1e9` | +| :flag_se: | `:flag_se:` | `1f1f8-1f1ea` | +| :flag_sg: | `:flag_sg:` | `1f1f8-1f1ec` | +| :flag_sh: | `:flag_sh:` | `1f1f8-1f1ed` | +| :flag_si: | `:flag_si:` | `1f1f8-1f1ee` | +| :flag_sj: | `:flag_sj:` | `1f1f8-1f1ef` | +| :flag_sk: | `:flag_sk:` | `1f1f8-1f1f0` | +| :flag_sl: | `:flag_sl:` | `1f1f8-1f1f1` | +| :flag_sm: | `:flag_sm:` | `1f1f8-1f1f2` | +| :flag_sn: | `:flag_sn:` | `1f1f8-1f1f3` | +| :flag_so: | `:flag_so:` | `1f1f8-1f1f4` | +| :flag_sr: | `:flag_sr:` | `1f1f8-1f1f7` | +| :flag_ss: | `:flag_ss:` | `1f1f8-1f1f8` | +| :flag_st: | `:flag_st:` | `1f1f8-1f1f9` | +| :flag_sv: | `:flag_sv:` | `1f1f8-1f1fb` | +| :flag_sx: | `:flag_sx:` | `1f1f8-1f1fd` | +| :flag_sy: | `:flag_sy:` | `1f1f8-1f1fe` | +| :flag_sz: | `:flag_sz:` | `1f1f8-1f1ff` | +| :flag_ta: | `:flag_ta:` | `1f1f9-1f1e6` | +| :flag_tc: | `:flag_tc:` | `1f1f9-1f1e8` | +| :flag_td: | `:flag_td:` | `1f1f9-1f1e9` | +| :flag_tf: | `:flag_tf:` | `1f1f9-1f1eb` | +| :flag_tg: | `:flag_tg:` | `1f1f9-1f1ec` | +| :flag_th: | `:flag_th:` | `1f1f9-1f1ed` | +| :flag_tj: | `:flag_tj:` | `1f1f9-1f1ef` | +| :flag_tk: | `:flag_tk:` | `1f1f9-1f1f0` | +| :flag_tl: | `:flag_tl:` | `1f1f9-1f1f1` | +| :flag_tm: | `:flag_tm:` | `1f1f9-1f1f2` | +| :flag_tn: | `:flag_tn:` | `1f1f9-1f1f3` | +| :flag_to: | `:flag_to:` | `1f1f9-1f1f4` | +| :flag_tr: | `:flag_tr:` | `1f1f9-1f1f7` | +| :flag_tt: | `:flag_tt:` | `1f1f9-1f1f9` | +| :flag_tv: | `:flag_tv:` | `1f1f9-1f1fb` | +| :flag_tw: | `:flag_tw:` | `1f1f9-1f1fc` | +| :flag_tz: | `:flag_tz:` | `1f1f9-1f1ff` | +| :flag_ua: | `:flag_ua:` | `1f1fa-1f1e6` | +| :flag_ug: | `:flag_ug:` | `1f1fa-1f1ec` | +| :flag_um: | `:flag_um:` | `1f1fa-1f1f2` | +| :united_nations: | `:united_nations:` | `1f1fa-1f1f3` | +| :flag_us: | `:flag_us:` | `1f1fa-1f1f8` | +| :flag_uy: | `:flag_uy:` | `1f1fa-1f1fe` | +| :flag_uz: | `:flag_uz:` | `1f1fa-1f1ff` | +| :flag_va: | `:flag_va:` | `1f1fb-1f1e6` | +| :flag_vc: | `:flag_vc:` | `1f1fb-1f1e8` | +| :flag_ve: | `:flag_ve:` | `1f1fb-1f1ea` | +| :flag_vg: | `:flag_vg:` | `1f1fb-1f1ec` | +| :flag_vi: | `:flag_vi:` | `1f1fb-1f1ee` | +| :flag_vn: | `:flag_vn:` | `1f1fb-1f1f3` | +| :flag_vu: | `:flag_vu:` | `1f1fb-1f1fa` | +| :flag_wf: | `:flag_wf:` | `1f1fc-1f1eb` | +| :flag_ws: | `:flag_ws:` | `1f1fc-1f1f8` | +| :flag_xk: | `:flag_xk:` | `1f1fd-1f1f0` | +| :flag_ye: | `:flag_ye:` | `1f1fe-1f1ea` | +| :flag_yt: | `:flag_yt:` | `1f1fe-1f1f9` | +| :flag_za: | `:flag_za:` | `1f1ff-1f1e6` | +| :flag_zm: | `:flag_zm:` | `1f1ff-1f1f2` | +| :flag_zw: | `:flag_zw:` | `1f1ff-1f1fc` | +| :england: | `:england:` | `1f3f4-e0067-e0062-e0065-e006e-e0067-e007f` | +| :scotland: | `:scotland:` | `1f3f4-e0067-e0062-e0073-e0063-e0074-e007f` | +| :wales: | `:wales:` | `1f3f4-e0067-e0062-e0077-e006c-e0073-e007f` | diff --git a/examples/agents/main.py b/examples/agents/main.py index 91b13a7..1faafa4 100644 --- a/examples/agents/main.py +++ b/examples/agents/main.py @@ -91,40 +91,27 @@ def normalize_amount(self, amount: str, token_key: str) -> float: ) for message in status_toolkit.account.listen_messages(): - content = None - for chat in message["event"]["chats"]: - - latest_message: dict = chat.get("lastMessage", {}) - if not latest_message: - continue - - from_public_key = latest_message.get("from") - if from_public_key != PUBLIC_KEY: - continue - - content = chat["lastMessage"]["text"] - payment_requests: list[dict] = latest_message.get("paymentRequests", []) - if payment_requests: - payment_request = payment_requests[0] - amount = status_toolkit.normalize_amount(payment_request["amount"], payment_request["tokenKey"]) - chain_id, token_address = payment_request["tokenKey"].split("-") - payment_content = { - "Receiver Wallet": payment_request['receiver'], - "Token Symbol": payment_request['symbol'], - "Token Address": token_address, - "Amount": amount, - "Chain ID": chain_id - } - content += f"\n---\n# Payment request\n" + "\n".join([ - f"{name}: {value}" - for name, value in payment_content.items() - ]) - - break - if not content: + if message.from_public_key != PUBLIC_KEY: continue + content = message.content + payment_requests = message.payment_requests + if payment_requests: + payment_request = payment_requests[0] + amount = status_toolkit.normalize_amount(payment_request.amount, f"{payment_request.chain_id}-{payment_request.token_address}") + payment_content = { + "Receiver Wallet": payment_request.to_address, + "Token Symbol": payment_request.token_symbol, + "Token Address": payment_request.token_address, + "Amount": amount, + "Chain ID": payment_request.chain_id + } + content += f"\n---\n# Payment request\n" + "\n".join([ + f"{name}: {value}" + for name, value in payment_content.items() + ]) + result = agent.invoke({ "messages": [ { diff --git a/examples/community-greet/main.py b/examples/community-greet/main.py index 953895e..758a038 100644 --- a/examples/community-greet/main.py +++ b/examples/community-greet/main.py @@ -111,17 +111,17 @@ def main(channel_name: str, approve: bool): account.logger.info(f"Listening for incoming {community.name} [{community.id}] requests") pending_requests = [] for request in community.listen_requests(): - member_public_key: str = request["public_key"] - request_id: str = request["request_id"] - if request["state"] == "pending" and member_public_key not in pending_requests: + member_public_key: str = request.public_key + + if request.state == "pending" and member_public_key not in pending_requests: pending_requests.append(member_public_key) - if approve and request["state"] == "pending": - community.accept(request_id) + if approve and request.state == "pending": + community.accept(request.id) account.logger.info(f"Accepted {member_public_key}") continue - if request["state"] != "accept" or member_public_key not in pending_requests: + if request.state != "accept" or member_public_key not in pending_requests: continue message = generate_message(member_public_key) diff --git a/examples/group-chat-moderator/main.py b/examples/group-chat-moderator/main.py index 9875d0a..05927d0 100644 --- a/examples/group-chat-moderator/main.py +++ b/examples/group-chat-moderator/main.py @@ -1,5 +1,5 @@ from dotenv import load_dotenv -from status_sdk import Account, GroupChat, launch_docker_container +from status_sdk import Account, GroupChat, launch_docker_container, models from detoxify import Detoxify import os, threading, torch @@ -7,16 +7,16 @@ # read-modify-write of a member's warning count must be atomic warnings_lock = threading.Lock() -def check_message(account: Account, message: dict, warnings: dict, group_chat: GroupChat, model: Detoxify, threshold: float = 0.6, warning_limit: int = 3): +def check_message(account: Account, message: models.Message, warnings: dict, group_chat: GroupChat, model: Detoxify, threshold: float = 0.6, warning_limit: int = 3): """ Score a single message and warn (or remove) its author. """ - public_key = message["from"] + public_key = message.from_public_key if public_key == account.info["public_key"]: return - label, score = max(model.predict(message["text"]).items(), key=lambda item: item[1]) - account.logger.info(f"Message: '{message['text']}'\t\t{label} - {(score * 100):.2f}%") + label, score = max(model.predict(message.content).items(), key=lambda item: item[1]) + account.logger.info(f"Message: '{message.content}'\t\t{label} - {(score * 100):.2f}%") if score < threshold: return @@ -26,7 +26,7 @@ def check_message(account: Account, message: dict, warnings: dict, group_chat: G count = warnings[public_key] if count < warning_limit: - group_chat.send_message(f"Warning {count} /{warning_limit} - @{public_key} please keep it civil.", message["id"]) + group_chat.send_message(f"Warning {count} /{warning_limit} - @{public_key} please keep it civil.", message.id) account.logger.info(f"Sent warning to {public_key}") elif count >= warning_limit: group_chat.send_message(f"Removing @{public_key} member after {warning_limit} warnings.") @@ -50,15 +50,13 @@ def main(): model = Detoxify("original", device=device) account.logger.info(f"Listening Group Chat {group_chat.name}") for message in account.listen_messages(): - for chat in message["event"]["chats"]: - if chat["id"] != group_chat.id: - continue - - threading.Thread( - target=check_message, - args=(account, chat["lastMessage"], warnings, group_chat, model), - daemon=True - ).start() + if message.chat_id != group_chat.id: + continue + threading.Thread( + target=check_message, + args=(account, message, warnings, group_chat, model), + daemon=True + ).start() if __name__ == "__main__": main() diff --git a/pyproject.toml b/pyproject.toml index f27fdc6..4228477 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "status-sdk" -version = "1.1.2" +version = "1.1.3" description = "Private chat. Communities. Multi-chain wallet. Browser. dApps all in one app, powered by SNT." readme = "README.md" requires-python = ">=3.11" diff --git a/status_sdk/__init__.py b/status_sdk/__init__.py index e9dd45f..f3c258f 100644 --- a/status_sdk/__init__.py +++ b/status_sdk/__init__.py @@ -4,7 +4,7 @@ from .group_chat import GroupChat from .community.base import Community from .utils import launch_docker_container -from . import exceptions +from . import exceptions, models try: __version__ = _version("status-sdk") diff --git a/status_sdk/account.py b/status_sdk/account.py index 3ccd869..739eac2 100644 --- a/status_sdk/account.py +++ b/status_sdk/account.py @@ -8,7 +8,7 @@ from PIL import Image from PIL.JpegImagePlugin import JpegImageFile from PIL.PngImagePlugin import PngImageFile -from . import constants +from . import constants, models from .signal import Signal from .logger import Logger @@ -490,7 +490,6 @@ def communities(self) -> list[dict]: "verified": community["verified"], "tags": community["tags"], "is_member": community["isMember"], - "joined": community["verified"], "joined_timestamp": to_datetime("joinedAt", community), "requested_timestamp": to_datetime("requestedToJoinAt", community), "encrypted": community["encrypted"], @@ -530,6 +529,7 @@ def chats(self) -> list[dict]: contacts = [ {"type": "contact", "id": contact["chat_id"], "name": contact["display_name"]} for contact in self.contacts.values() + if contact["mutual"] ] # Group chats in RPC endpoint are chat type 3 @@ -674,6 +674,40 @@ def send_message(self, chat_id: str, message: str, reply_to_message_id: Optional """ return self.__send_content(chat_id, message, reply_to_message_id) + + def send_emoji_reaction(self, message_id: str, emoji_shortname: str, chat_id: Optional[str] = None): + """ + Set / unset emoji reaction for a message. + + Parameters: + - `message_id`- the `id` of the message + - `emoji_shortname` - the emoji shortname as in Status App + - `chat_id` - the `id` of the chat. If not provided it will be found from `message_id` + """ + if not emoji_shortname.startswith(":"): + emoji_shortname = f":{emoji_shortname}" + + if not emoji_shortname.endswith(":"): + emoji_shortname += ":" + + emoji_unicode = constants.EMOJI_UNICODES.get(emoji_shortname) + if not emoji_unicode: + raise exceptions.EmojiNotFoundError(emoji_shortname) + + if not chat_id: + response = self._call_rpc("messaging", "messageByMessageID", [message_id]) + error = response.get("error", {}) or {} + if error: + raise exceptions.ChatNotFoundError(error.get("message")) + + chat_id: str = response["result"]["localChatId"] + + params = [chat_id, message_id, emoji_unicode] + response = self._call_rpc("messaging", "sendEmojiReaction", params) + error = response.get("error", {}) or {} + if error: + raise exceptions.ChatNotFoundError(error.get("message")) + def __send_content(self, chat_id: str, message: Optional[str] = None, reply_to_message_id: Optional[str] = None, image_path: Optional[str] = None) -> str: """ Send a message with optional media attached to the given chat. @@ -794,24 +828,53 @@ def delete_message(self, id: str) -> bool: return not any(errors) if errors else False - def listen_contact_requests(self) -> Generator: + def listen_contact_requests(self) -> Generator[models.ContactRequest, None, None]: + """ + Listen for incoming contact requests and for contact requests that were accepted. Can be used for real time processing. + """ + accepted_contact_request = re.compile(r"@(0x04[0-9a-fA-F]{128}) accepted your contact request") + for message in self.signal.listen(["local-notifications", "messages.new"]): + event: dict = message.get("event", {}) + + if message["type"] == "local-notifications": + category = event.get("category") + if category == "contactRequest": + yield models.ContactRequest(message["event"]["body"]["message"]["from"], incoming=True) + + if message["type"] == "messages.new" and accepted_contact_request.search(str(message)): + for public_key in set(accepted_contact_request.findall(str(message))): + + if self.info["public_key"] == public_key: + continue + + yield models.ContactRequest(public_key, accepted=True) + + def listen_message_mentions(self) -> Generator[models.Message, None, None]: """ - Listen for new contact requests. Can be used for real time processing. + Listen for `@0xpublic-key` mentions. Can be used for real time processing. """ + mention_everyone = "@0x00001" + account_mention = f"@{self.info['public_key']}" + for message in self.signal.listen("local-notifications"): event: dict = message.get("event", {}) category = event.get("category") - if category == "contactRequest": - yield message + if category != "newMessage": + continue + + current_text: str = event["body"]["message"]["text"] + if mention_everyone in current_text or account_mention in current_text: + yield models.Message.from_raw(event["body"]["message"]) - def listen_messages(self) -> Generator: + def listen_messages(self) -> Generator[models.Message, None, None]: """ Listen for new **RAW** messages continuously. Can be used for real time processing. """ for message in self.signal.listen("messages.new"): event: dict = message.get("event", {}) if "chats" in event or "messages" in event: - yield message + for raw in event["messages"]: + yield models.Message.from_raw(raw) def get_messages(self, chat_id: str, start_timestamp: Optional[Union[str, datetime.datetime, datetime.date, pd.Timestamp]] = None, end_timestamp: Optional[Union[str, datetime.datetime, datetime.date, pd.Timestamp]] = None) -> list[dict]: """ diff --git a/status_sdk/community/base.py b/status_sdk/community/base.py index 1705533..7547fd0 100644 --- a/status_sdk/community/base.py +++ b/status_sdk/community/base.py @@ -1,5 +1,5 @@ from ..account import Account -from .. import exceptions +from .. import exceptions, models from .channel import Channel from typing import Union, Optional, Generator import pandas as pd @@ -281,7 +281,7 @@ def delete_channel(self, channel_name: str): params = [self.id, channel.id.replace(self.id, "")] self.__account._call_rpc("messaging", "deleteCommunityChat", params) - def listen_requests(self) -> Generator: + def listen_requests(self) -> Generator[models.CommunityRequest, None, None]: """ Listen for commnunity requests """ @@ -300,11 +300,7 @@ def listen_requests(self) -> Generator: if not state: continue - yield { - "request_id": request["id"], - "state": state, - "public_key": request["publicKey"] - } + yield models.CommunityRequest(request["id"], state, request["publicKey"]) @property def categories(self) -> dict[str, str]: diff --git a/status_sdk/community/channel.py b/status_sdk/community/channel.py index 1736783..b46ed6b 100644 --- a/status_sdk/community/channel.py +++ b/status_sdk/community/channel.py @@ -214,6 +214,15 @@ def send_image(self, file_path: str, message: Optional[str] = None, reply_to_mes """ return self.__account.send_image(self.id, file_path, message, reply_to_message_id) + def send_emoji_reaction(self, message_id: str, emoji_shortname: str): + """ + Set / unset emoji reaction for a message in the channel. + + Parameters: + - `message_id` - the `id` of the message, as it appears in `self.get_messages()` + - `emoji_shortname` - the emoji shortname as in Status App, with or without the surrounding colons + """ + self.__account.send_emoji_reaction(message_id, emoji_shortname, self.id) def get_messages(self, start_timestamp: Optional[Union[str, datetime.datetime, datetime.date, pd.Timestamp]] = None, end_timestamp: Optional[Union[str, datetime.datetime, datetime.date, pd.Timestamp]] = None) -> list[dict]: """ diff --git a/status_sdk/constants.py b/status_sdk/constants.py index 7dabeca..9eb494b 100644 --- a/status_sdk/constants.py +++ b/status_sdk/constants.py @@ -15,3 +15,1876 @@ "apechain-mainnet": 33139, "apechain-curtis": 33111, } + +EMOJI_UNICODES = { + ":grinning:": "1f600", + ":smiley:": "1f603", + ":smile:": "1f604", + ":grin:": "1f601", + ":laughing:": "1f606", + ":sweat_smile:": "1f605", + ":rofl:": "1f923", + ":joy:": "1f602", + ":slight_smile:": "1f642", + ":upside_down:": "1f643", + ":melting_face:": "1fae0", + ":wink:": "1f609", + ":blush:": "1f60a", + ":innocent:": "1f607", + ":smiling_face_with_3_hearts:": "1f970", + ":heart_eyes:": "1f60d", + ":star_struck:": "1f929", + ":kissing_heart:": "1f618", + ":kissing:": "1f617", + ":relaxed:": "263a", + ":kissing_closed_eyes:": "1f61a", + ":kissing_smiling_eyes:": "1f619", + ":smiling_face_with_tear:": "1f972", + ":yum:": "1f60b", + ":stuck_out_tongue:": "1f61b", + ":stuck_out_tongue_winking_eye:": "1f61c", + ":zany_face:": "1f92a", + ":stuck_out_tongue_closed_eyes:": "1f61d", + ":money_mouth:": "1f911", + ":hugging:": "1f917", + ":face_with_hand_over_mouth:": "1f92d", + ":face_with_open_eyes_and_hand_over_mouth:": "1fae2", + ":face_with_peeking_eye:": "1fae3", + ":shushing_face:": "1f92b", + ":thinking:": "1f914", + ":saluting_face:": "1fae1", + ":zipper_mouth:": "1f910", + ":face_with_raised_eyebrow:": "1f928", + ":neutral_face:": "1f610", + ":expressionless:": "1f611", + ":no_mouth:": "1f636", + ":dotted_line_face:": "1fae5", + ":face_in_clouds:": "1f636-200d-1f32b-fe0f", + ":smirk:": "1f60f", + ":unamused:": "1f612", + ":rolling_eyes:": "1f644", + ":grimacing:": "1f62c", + ":face_exhaling:": "1f62e-200d-1f4a8", + ":lying_face:": "1f925", + ":shaking_face:": "1fae8", + ":relieved:": "1f60c", + ":pensive:": "1f614", + ":sleepy:": "1f62a", + ":drooling_face:": "1f924", + ":sleeping:": "1f634", + ":mask:": "1f637", + ":thermometer_face:": "1f912", + ":head_bandage:": "1f915", + ":nauseated_face:": "1f922", + ":face_vomiting:": "1f92e", + ":sneezing_face:": "1f927", + ":hot_face:": "1f975", + ":cold_face:": "1f976", + ":woozy_face:": "1f974", + ":dizzy_face:": "1f635", + ":face_with_spiral_eyes:": "1f635-200d-1f4ab", + ":exploding_head:": "1f92f", + ":cowboy:": "1f920", + ":partying_face:": "1f973", + ":disguised_face:": "1f978", + ":sunglasses:": "1f60e", + ":nerd:": "1f913", + ":face_with_monocle:": "1f9d0", + ":confused:": "1f615", + ":face_with_diagonal_mouth:": "1fae4", + ":worried:": "1f61f", + ":slight_frown:": "1f641", + ":frowning2:": "2639", + ":open_mouth:": "1f62e", + ":hushed:": "1f62f", + ":astonished:": "1f632", + ":flushed:": "1f633", + ":pleading_face:": "1f97a", + ":face_holding_back_tears:": "1f979", + ":frowning:": "1f626", + ":anguished:": "1f627", + ":fearful:": "1f628", + ":cold_sweat:": "1f630", + ":disappointed_relieved:": "1f625", + ":cry:": "1f622", + ":sob:": "1f62d", + ":scream:": "1f631", + ":confounded:": "1f616", + ":persevere:": "1f623", + ":disappointed:": "1f61e", + ":sweat:": "1f613", + ":weary:": "1f629", + ":tired_face:": "1f62b", + ":yawning_face:": "1f971", + ":triumph:": "1f624", + ":rage:": "1f621", + ":angry:": "1f620", + ":face_with_symbols_over_mouth:": "1f92c", + ":smiling_imp:": "1f608", + ":imp:": "1f47f", + ":skull:": "1f480", + ":skull_crossbones:": "2620", + ":poop:": "1f4a9", + ":clown:": "1f921", + ":japanese_ogre:": "1f479", + ":japanese_goblin:": "1f47a", + ":ghost:": "1f47b", + ":alien:": "1f47d", + ":space_invader:": "1f47e", + ":robot:": "1f916", + ":smiley_cat:": "1f63a", + ":smile_cat:": "1f638", + ":joy_cat:": "1f639", + ":heart_eyes_cat:": "1f63b", + ":smirk_cat:": "1f63c", + ":kissing_cat:": "1f63d", + ":scream_cat:": "1f640", + ":crying_cat_face:": "1f63f", + ":pouting_cat:": "1f63e", + ":see_no_evil:": "1f648", + ":hear_no_evil:": "1f649", + ":speak_no_evil:": "1f64a", + ":love_letter:": "1f48c", + ":cupid:": "1f498", + ":gift_heart:": "1f49d", + ":sparkling_heart:": "1f496", + ":heartpulse:": "1f497", + ":heartbeat:": "1f493", + ":revolving_hearts:": "1f49e", + ":two_hearts:": "1f495", + ":heart_decoration:": "1f49f", + ":heart_exclamation:": "2763", + ":broken_heart:": "1f494", + ":heart_on_fire:": "2764-fe0f-200d-1f525", + ":mending_heart:": "2764-fe0f-200d-1fa79", + ":heart:": "2764", + ":pink_heart:": "1fa77", + ":orange_heart:": "1f9e1", + ":yellow_heart:": "1f49b", + ":green_heart:": "1f49a", + ":blue_heart:": "1f499", + ":light_blue_heart:": "1fa75", + ":purple_heart:": "1f49c", + ":brown_heart:": "1f90e", + ":black_heart:": "1f5a4", + ":grey_heart:": "1fa76", + ":white_heart:": "1f90d", + ":kiss:": "1f48b", + ":100:": "1f4af", + ":anger:": "1f4a2", + ":boom:": "1f4a5", + ":dizzy:": "1f4ab", + ":sweat_drops:": "1f4a6", + ":dash:": "1f4a8", + ":hole:": "1f573", + ":speech_balloon:": "1f4ac", + ":eye_in_speech_bubble:": "1f441-200d-1f5e8", + ":speech_left:": "1f5e8", + ":anger_right:": "1f5ef", + ":thought_balloon:": "1f4ad", + ":zzz:": "1f4a4", + ":wave:": "1f44b", + ":raised_back_of_hand:": "1f91a", + ":hand_splayed:": "1f590", + ":raised_hand:": "270b", + ":vulcan:": "1f596", + ":rightwards_hand:": "1faf1", + ":leftwards_hand:": "1faf2", + ":palm_down_hand:": "1faf3", + ":palm_up_hand:": "1faf4", + ":leftwards_pushing_hand:": "1faf7", + ":rightwards_pushing_hand:": "1faf8", + ":ok_hand:": "1f44c", + ":pinched_fingers:": "1f90c", + ":pinching_hand:": "1f90f", + ":v:": "270c", + ":fingers_crossed:": "1f91e", + ":hand_with_index_finger_and_thumb_crossed:": "1faf0", + ":love_you_gesture:": "1f91f", + ":metal:": "1f918", + ":call_me:": "1f919", + ":point_left:": "1f448", + ":point_right:": "1f449", + ":point_up_2:": "1f446", + ":middle_finger:": "1f595", + ":point_down:": "1f447", + ":point_up:": "261d", + ":index_pointing_at_the_viewer:": "1faf5", + ":thumbsup:": "1f44d", + ":thumbsdown:": "1f44e", + ":fist:": "270a", + ":punch:": "1f44a", + ":left_facing_fist:": "1f91b", + ":right_facing_fist:": "1f91c", + ":clap:": "1f44f", + ":raised_hands:": "1f64c", + ":heart_hands:": "1faf6", + ":open_hands:": "1f450", + ":palms_up_together:": "1f932", + ":handshake:": "1f91d", + ":pray:": "1f64f", + ":writing_hand:": "270d", + ":nail_care:": "1f485", + ":selfie:": "1f933", + ":muscle:": "1f4aa", + ":mechanical_arm:": "1f9be", + ":mechanical_leg:": "1f9bf", + ":leg:": "1f9b5", + ":foot:": "1f9b6", + ":ear:": "1f442", + ":ear_with_hearing_aid:": "1f9bb", + ":nose:": "1f443", + ":brain:": "1f9e0", + ":anatomical_heart:": "1fac0", + ":lungs:": "1fac1", + ":tooth:": "1f9b7", + ":bone:": "1f9b4", + ":eyes:": "1f440", + ":eye:": "1f441", + ":tongue:": "1f445", + ":lips:": "1f444", + ":biting_lip:": "1fae6", + ":baby:": "1f476", + ":child:": "1f9d2", + ":boy:": "1f466", + ":girl:": "1f467", + ":adult:": "1f9d1", + ":blond_haired_person:": "1f471", + ":man:": "1f468", + ":bearded_person:": "1f9d4", + ":man_beard:": "1f9d4-200d-2642-fe0f", + ":woman_beard:": "1f9d4-200d-2640-fe0f", + ":man_red_haired:": "1f468-200d-1f9b0", + ":man_curly_haired:": "1f468-200d-1f9b1", + ":man_white_haired:": "1f468-200d-1f9b3", + ":man_bald:": "1f468-200d-1f9b2", + ":woman:": "1f469", + ":woman_red_haired:": "1f469-200d-1f9b0", + ":person_red_hair:": "1f9d1-200d-1f9b0", + ":woman_curly_haired:": "1f469-200d-1f9b1", + ":person_curly_hair:": "1f9d1-200d-1f9b1", + ":woman_white_haired:": "1f469-200d-1f9b3", + ":person_white_hair:": "1f9d1-200d-1f9b3", + ":woman_bald:": "1f469-200d-1f9b2", + ":person_bald:": "1f9d1-200d-1f9b2", + ":blond-haired_woman:": "1f471-200d-2640-fe0f", + ":blond-haired_man:": "1f471-200d-2642-fe0f", + ":older_adult:": "1f9d3", + ":older_man:": "1f474", + ":older_woman:": "1f475", + ":person_frowning:": "1f64d", + ":man_frowning:": "1f64d-200d-2642-fe0f", + ":woman_frowning:": "1f64d-200d-2640-fe0f", + ":person_pouting:": "1f64e", + ":man_pouting:": "1f64e-200d-2642-fe0f", + ":woman_pouting:": "1f64e-200d-2640-fe0f", + ":person_gesturing_no:": "1f645", + ":man_gesturing_no:": "1f645-200d-2642-fe0f", + ":woman_gesturing_no:": "1f645-200d-2640-fe0f", + ":person_gesturing_ok:": "1f646", + ":man_gesturing_ok:": "1f646-200d-2642-fe0f", + ":woman_gesturing_ok:": "1f646-200d-2640-fe0f", + ":person_tipping_hand:": "1f481", + ":man_tipping_hand:": "1f481-200d-2642-fe0f", + ":woman_tipping_hand:": "1f481-200d-2640-fe0f", + ":person_raising_hand:": "1f64b", + ":man_raising_hand:": "1f64b-200d-2642-fe0f", + ":woman_raising_hand:": "1f64b-200d-2640-fe0f", + ":deaf_person:": "1f9cf", + ":deaf_man:": "1f9cf-200d-2642-fe0f", + ":deaf_woman:": "1f9cf-200d-2640-fe0f", + ":person_bowing:": "1f647", + ":man_bowing:": "1f647-200d-2642-fe0f", + ":woman_bowing:": "1f647-200d-2640-fe0f", + ":person_facepalming:": "1f926", + ":man_facepalming:": "1f926-200d-2642-fe0f", + ":woman_facepalming:": "1f926-200d-2640-fe0f", + ":person_shrugging:": "1f937", + ":man_shrugging:": "1f937-200d-2642-fe0f", + ":woman_shrugging:": "1f937-200d-2640-fe0f", + ":health_worker:": "1f9d1-200d-2695-fe0f", + ":man_health_worker:": "1f468-200d-2695-fe0f", + ":woman_health_worker:": "1f469-200d-2695-fe0f", + ":student:": "1f9d1-200d-1f393", + ":man_student:": "1f468-200d-1f393", + ":woman_student:": "1f469-200d-1f393", + ":teacher:": "1f9d1-200d-1f3eb", + ":man_teacher:": "1f468-200d-1f3eb", + ":woman_teacher:": "1f469-200d-1f3eb", + ":judge:": "1f9d1-200d-2696-fe0f", + ":man_judge:": "1f468-200d-2696-fe0f", + ":woman_judge:": "1f469-200d-2696-fe0f", + ":farmer:": "1f9d1-200d-1f33e", + ":man_farmer:": "1f468-200d-1f33e", + ":woman_farmer:": "1f469-200d-1f33e", + ":cook:": "1f9d1-200d-1f373", + ":man_cook:": "1f468-200d-1f373", + ":woman_cook:": "1f469-200d-1f373", + ":mechanic:": "1f9d1-200d-1f527", + ":man_mechanic:": "1f468-200d-1f527", + ":woman_mechanic:": "1f469-200d-1f527", + ":factory_worker:": "1f9d1-200d-1f3ed", + ":man_factory_worker:": "1f468-200d-1f3ed", + ":woman_factory_worker:": "1f469-200d-1f3ed", + ":office_worker:": "1f9d1-200d-1f4bc", + ":man_office_worker:": "1f468-200d-1f4bc", + ":woman_office_worker:": "1f469-200d-1f4bc", + ":scientist:": "1f9d1-200d-1f52c", + ":man_scientist:": "1f468-200d-1f52c", + ":woman_scientist:": "1f469-200d-1f52c", + ":technologist:": "1f9d1-200d-1f4bb", + ":man_technologist:": "1f468-200d-1f4bb", + ":woman_technologist:": "1f469-200d-1f4bb", + ":singer:": "1f9d1-200d-1f3a4", + ":man_singer:": "1f468-200d-1f3a4", + ":woman_singer:": "1f469-200d-1f3a4", + ":artist:": "1f9d1-200d-1f3a8", + ":man_artist:": "1f468-200d-1f3a8", + ":woman_artist:": "1f469-200d-1f3a8", + ":pilot:": "1f9d1-200d-2708-fe0f", + ":man_pilot:": "1f468-200d-2708-fe0f", + ":woman_pilot:": "1f469-200d-2708-fe0f", + ":astronaut:": "1f9d1-200d-1f680", + ":man_astronaut:": "1f468-200d-1f680", + ":woman_astronaut:": "1f469-200d-1f680", + ":firefighter:": "1f9d1-200d-1f692", + ":man_firefighter:": "1f468-200d-1f692", + ":woman_firefighter:": "1f469-200d-1f692", + ":police_officer:": "1f46e", + ":man_police_officer:": "1f46e-200d-2642-fe0f", + ":woman_police_officer:": "1f46e-200d-2640-fe0f", + ":detective:": "1f575", + ":man_detective:": "1f575-fe0f-200d-2642-fe0f", + ":woman_detective:": "1f575-fe0f-200d-2640-fe0f", + ":guard:": "1f482", + ":man_guard:": "1f482-200d-2642-fe0f", + ":woman_guard:": "1f482-200d-2640-fe0f", + ":ninja:": "1f977", + ":construction_worker:": "1f477", + ":man_construction_worker:": "1f477-200d-2642-fe0f", + ":woman_construction_worker:": "1f477-200d-2640-fe0f", + ":person_with_crown:": "1fac5", + ":prince:": "1f934", + ":princess:": "1f478", + ":person_wearing_turban:": "1f473", + ":man_wearing_turban:": "1f473-200d-2642-fe0f", + ":woman_wearing_turban:": "1f473-200d-2640-fe0f", + ":man_with_chinese_cap:": "1f472", + ":woman_with_headscarf:": "1f9d5", + ":person_in_tuxedo:": "1f935", + ":man_in_tuxedo:": "1f935-200d-2642-fe0f", + ":woman_in_tuxedo:": "1f935-200d-2640-fe0f", + ":person_with_veil:": "1f470", + ":man_with_veil:": "1f470-200d-2642-fe0f", + ":woman_with_veil:": "1f470-200d-2640-fe0f", + ":pregnant_woman:": "1f930", + ":pregnant_man:": "1fac3", + ":pregnant_person:": "1fac4", + ":breast_feeding:": "1f931", + ":woman_feeding_baby:": "1f469-200d-1f37c", + ":man_feeding_baby:": "1f468-200d-1f37c", + ":person_feeding_baby:": "1f9d1-200d-1f37c", + ":angel:": "1f47c", + ":santa:": "1f385", + ":mrs_claus:": "1f936", + ":mx_claus:": "1f9d1-200d-1f384", + ":superhero:": "1f9b8", + ":man_superhero:": "1f9b8-200d-2642-fe0f", + ":woman_superhero:": "1f9b8-200d-2640-fe0f", + ":supervillain:": "1f9b9", + ":man_supervillain:": "1f9b9-200d-2642-fe0f", + ":woman_supervillain:": "1f9b9-200d-2640-fe0f", + ":mage:": "1f9d9", + ":man_mage:": "1f9d9-200d-2642-fe0f", + ":woman_mage:": "1f9d9-200d-2640-fe0f", + ":fairy:": "1f9da", + ":man_fairy:": "1f9da-200d-2642-fe0f", + ":woman_fairy:": "1f9da-200d-2640-fe0f", + ":vampire:": "1f9db", + ":man_vampire:": "1f9db-200d-2642-fe0f", + ":woman_vampire:": "1f9db-200d-2640-fe0f", + ":merperson:": "1f9dc", + ":merman:": "1f9dc-200d-2642-fe0f", + ":mermaid:": "1f9dc-200d-2640-fe0f", + ":elf:": "1f9dd", + ":man_elf:": "1f9dd-200d-2642-fe0f", + ":woman_elf:": "1f9dd-200d-2640-fe0f", + ":genie:": "1f9de", + ":man_genie:": "1f9de-200d-2642-fe0f", + ":woman_genie:": "1f9de-200d-2640-fe0f", + ":zombie:": "1f9df", + ":man_zombie:": "1f9df-200d-2642-fe0f", + ":woman_zombie:": "1f9df-200d-2640-fe0f", + ":troll:": "1f9cc", + ":person_getting_massage:": "1f486", + ":man_getting_face_massage:": "1f486-200d-2642-fe0f", + ":woman_getting_face_massage:": "1f486-200d-2640-fe0f", + ":person_getting_haircut:": "1f487", + ":man_getting_haircut:": "1f487-200d-2642-fe0f", + ":woman_getting_haircut:": "1f487-200d-2640-fe0f", + ":person_walking:": "1f6b6", + ":man_walking:": "1f6b6-200d-2642-fe0f", + ":woman_walking:": "1f6b6-200d-2640-fe0f", + ":person_standing:": "1f9cd", + ":man_standing:": "1f9cd-200d-2642-fe0f", + ":woman_standing:": "1f9cd-200d-2640-fe0f", + ":person_kneeling:": "1f9ce", + ":man_kneeling:": "1f9ce-200d-2642-fe0f", + ":woman_kneeling:": "1f9ce-200d-2640-fe0f", + ":person_with_probing_cane:": "1f9d1-200d-1f9af", + ":man_with_probing_cane:": "1f468-200d-1f9af", + ":woman_with_probing_cane:": "1f469-200d-1f9af", + ":person_in_motorized_wheelchair:": "1f9d1-200d-1f9bc", + ":man_in_motorized_wheelchair:": "1f468-200d-1f9bc", + ":woman_in_motorized_wheelchair:": "1f469-200d-1f9bc", + ":person_in_manual_wheelchair:": "1f9d1-200d-1f9bd", + ":man_in_manual_wheelchair:": "1f468-200d-1f9bd", + ":woman_in_manual_wheelchair:": "1f469-200d-1f9bd", + ":person_running:": "1f3c3", + ":man_running:": "1f3c3-200d-2642-fe0f", + ":woman_running:": "1f3c3-200d-2640-fe0f", + ":dancer:": "1f483", + ":man_dancing:": "1f57a", + ":levitate:": "1f574", + ":people_with_bunny_ears_partying:": "1f46f", + ":men_with_bunny_ears_partying:": "1f46f-200d-2642-fe0f", + ":women_with_bunny_ears_partying:": "1f46f-200d-2640-fe0f", + ":person_in_steamy_room:": "1f9d6", + ":man_in_steamy_room:": "1f9d6-200d-2642-fe0f", + ":woman_in_steamy_room:": "1f9d6-200d-2640-fe0f", + ":person_climbing:": "1f9d7", + ":man_climbing:": "1f9d7-200d-2642-fe0f", + ":woman_climbing:": "1f9d7-200d-2640-fe0f", + ":person_fencing:": "1f93a", + ":horse_racing:": "1f3c7", + ":skier:": "26f7", + ":snowboarder:": "1f3c2", + ":person_golfing:": "1f3cc", + ":man_golfing:": "1f3cc-fe0f-200d-2642-fe0f", + ":woman_golfing:": "1f3cc-fe0f-200d-2640-fe0f", + ":person_surfing:": "1f3c4", + ":man_surfing:": "1f3c4-200d-2642-fe0f", + ":woman_surfing:": "1f3c4-200d-2640-fe0f", + ":person_rowing_boat:": "1f6a3", + ":man_rowing_boat:": "1f6a3-200d-2642-fe0f", + ":woman_rowing_boat:": "1f6a3-200d-2640-fe0f", + ":person_swimming:": "1f3ca", + ":man_swimming:": "1f3ca-200d-2642-fe0f", + ":woman_swimming:": "1f3ca-200d-2640-fe0f", + ":person_bouncing_ball:": "26f9", + ":man_bouncing_ball:": "26f9-fe0f-200d-2642-fe0f", + ":woman_bouncing_ball:": "26f9-fe0f-200d-2640-fe0f", + ":person_lifting_weights:": "1f3cb", + ":man_lifting_weights:": "1f3cb-fe0f-200d-2642-fe0f", + ":woman_lifting_weights:": "1f3cb-fe0f-200d-2640-fe0f", + ":person_biking:": "1f6b4", + ":man_biking:": "1f6b4-200d-2642-fe0f", + ":woman_biking:": "1f6b4-200d-2640-fe0f", + ":person_mountain_biking:": "1f6b5", + ":man_mountain_biking:": "1f6b5-200d-2642-fe0f", + ":woman_mountain_biking:": "1f6b5-200d-2640-fe0f", + ":person_doing_cartwheel:": "1f938", + ":man_cartwheeling:": "1f938-200d-2642-fe0f", + ":woman_cartwheeling:": "1f938-200d-2640-fe0f", + ":people_wrestling:": "1f93c", + ":men_wrestling:": "1f93c-200d-2642-fe0f", + ":women_wrestling:": "1f93c-200d-2640-fe0f", + ":person_playing_water_polo:": "1f93d", + ":man_playing_water_polo:": "1f93d-200d-2642-fe0f", + ":woman_playing_water_polo:": "1f93d-200d-2640-fe0f", + ":person_playing_handball:": "1f93e", + ":man_playing_handball:": "1f93e-200d-2642-fe0f", + ":woman_playing_handball:": "1f93e-200d-2640-fe0f", + ":person_juggling:": "1f939", + ":man_juggling:": "1f939-200d-2642-fe0f", + ":woman_juggling:": "1f939-200d-2640-fe0f", + ":person_in_lotus_position:": "1f9d8", + ":man_in_lotus_position:": "1f9d8-200d-2642-fe0f", + ":woman_in_lotus_position:": "1f9d8-200d-2640-fe0f", + ":bath:": "1f6c0", + ":sleeping_accommodation:": "1f6cc", + ":people_holding_hands:": "1f9d1-200d-1f91d-200d-1f9d1", + ":two_women_holding_hands:": "1f46d", + ":couple:": "1f46b", + ":two_men_holding_hands:": "1f46c", + ":couplekiss:": "1f48f", + ":kiss_woman_man:": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f468", + ":kiss_mm:": "1f468-200d-2764-fe0f-200d-1f48b-200d-1f468", + ":kiss_ww:": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f469", + ":couple_with_heart:": "1f491", + ":couple_with_heart_woman_man:": "1f469-200d-2764-fe0f-200d-1f468", + ":couple_mm:": "1f468-200d-2764-fe0f-200d-1f468", + ":couple_ww:": "1f469-200d-2764-fe0f-200d-1f469", + ":family_man_woman_boy:": "1f468-200d-1f469-200d-1f466", + ":family_mwg:": "1f468-200d-1f469-200d-1f467", + ":family_mwgb:": "1f468-200d-1f469-200d-1f467-200d-1f466", + ":family_mwbb:": "1f468-200d-1f469-200d-1f466-200d-1f466", + ":family_mwgg:": "1f468-200d-1f469-200d-1f467-200d-1f467", + ":family_mmb:": "1f468-200d-1f468-200d-1f466", + ":family_mmg:": "1f468-200d-1f468-200d-1f467", + ":family_mmgb:": "1f468-200d-1f468-200d-1f467-200d-1f466", + ":family_mmbb:": "1f468-200d-1f468-200d-1f466-200d-1f466", + ":family_mmgg:": "1f468-200d-1f468-200d-1f467-200d-1f467", + ":family_wwb:": "1f469-200d-1f469-200d-1f466", + ":family_wwg:": "1f469-200d-1f469-200d-1f467", + ":family_wwgb:": "1f469-200d-1f469-200d-1f467-200d-1f466", + ":family_wwbb:": "1f469-200d-1f469-200d-1f466-200d-1f466", + ":family_wwgg:": "1f469-200d-1f469-200d-1f467-200d-1f467", + ":family_man_boy:": "1f468-200d-1f466", + ":family_man_boy_boy:": "1f468-200d-1f466-200d-1f466", + ":family_man_girl:": "1f468-200d-1f467", + ":family_man_girl_boy:": "1f468-200d-1f467-200d-1f466", + ":family_man_girl_girl:": "1f468-200d-1f467-200d-1f467", + ":family_woman_boy:": "1f469-200d-1f466", + ":family_woman_boy_boy:": "1f469-200d-1f466-200d-1f466", + ":family_woman_girl:": "1f469-200d-1f467", + ":family_woman_girl_boy:": "1f469-200d-1f467-200d-1f466", + ":family_woman_girl_girl:": "1f469-200d-1f467-200d-1f467", + ":speaking_head:": "1f5e3", + ":bust_in_silhouette:": "1f464", + ":busts_in_silhouette:": "1f465", + ":people_hugging:": "1fac2", + ":family:": "1f46a", + ":footprints:": "1f463", + ":monkey_face:": "1f435", + ":monkey:": "1f412", + ":gorilla:": "1f98d", + ":orangutan:": "1f9a7", + ":dog:": "1f436", + ":dog2:": "1f415", + ":guide_dog:": "1f9ae", + ":service_dog:": "1f415-200d-1f9ba", + ":poodle:": "1f429", + ":wolf:": "1f43a", + ":fox:": "1f98a", + ":raccoon:": "1f99d", + ":cat:": "1f431", + ":cat2:": "1f408", + ":black_cat:": "1f408-200d-2b1b", + ":lion_face:": "1f981", + ":tiger:": "1f42f", + ":tiger2:": "1f405", + ":leopard:": "1f406", + ":horse:": "1f434", + ":moose:": "1face", + ":donkey:": "1facf", + ":racehorse:": "1f40e", + ":unicorn:": "1f984", + ":zebra:": "1f993", + ":deer:": "1f98c", + ":bison:": "1f9ac", + ":cow:": "1f42e", + ":ox:": "1f402", + ":water_buffalo:": "1f403", + ":cow2:": "1f404", + ":pig:": "1f437", + ":pig2:": "1f416", + ":boar:": "1f417", + ":pig_nose:": "1f43d", + ":ram:": "1f40f", + ":sheep:": "1f411", + ":goat:": "1f410", + ":dromedary_camel:": "1f42a", + ":camel:": "1f42b", + ":llama:": "1f999", + ":giraffe:": "1f992", + ":elephant:": "1f418", + ":mammoth:": "1f9a3", + ":rhino:": "1f98f", + ":hippopotamus:": "1f99b", + ":mouse:": "1f42d", + ":mouse2:": "1f401", + ":rat:": "1f400", + ":hamster:": "1f439", + ":rabbit:": "1f430", + ":rabbit2:": "1f407", + ":chipmunk:": "1f43f", + ":beaver:": "1f9ab", + ":hedgehog:": "1f994", + ":bat:": "1f987", + ":bear:": "1f43b", + ":polar_bear:": "1f43b-200d-2744-fe0f", + ":koala:": "1f428", + ":panda_face:": "1f43c", + ":sloth:": "1f9a5", + ":otter:": "1f9a6", + ":skunk:": "1f9a8", + ":kangaroo:": "1f998", + ":badger:": "1f9a1", + ":feet:": "1f43e", + ":turkey:": "1f983", + ":chicken:": "1f414", + ":rooster:": "1f413", + ":hatching_chick:": "1f423", + ":baby_chick:": "1f424", + ":hatched_chick:": "1f425", + ":bird:": "1f426", + ":penguin:": "1f427", + ":dove:": "1f54a", + ":eagle:": "1f985", + ":duck:": "1f986", + ":swan:": "1f9a2", + ":owl:": "1f989", + ":dodo:": "1f9a4", + ":feather:": "1fab6", + ":flamingo:": "1f9a9", + ":peacock:": "1f99a", + ":parrot:": "1f99c", + ":wing:": "1fabd", + ":black_bird:": "1f426-200d-2b1b", + ":goose:": "1fabf", + ":frog:": "1f438", + ":crocodile:": "1f40a", + ":turtle:": "1f422", + ":lizard:": "1f98e", + ":snake:": "1f40d", + ":dragon_face:": "1f432", + ":dragon:": "1f409", + ":sauropod:": "1f995", + ":t_rex:": "1f996", + ":whale:": "1f433", + ":whale2:": "1f40b", + ":dolphin:": "1f42c", + ":seal:": "1f9ad", + ":fish:": "1f41f", + ":tropical_fish:": "1f420", + ":blowfish:": "1f421", + ":shark:": "1f988", + ":octopus:": "1f419", + ":shell:": "1f41a", + ":coral:": "1fab8", + ":jellyfish:": "1fabc", + ":snail:": "1f40c", + ":butterfly:": "1f98b", + ":bug:": "1f41b", + ":ant:": "1f41c", + ":bee:": "1f41d", + ":beetle:": "1fab2", + ":lady_beetle:": "1f41e", + ":cricket:": "1f997", + ":cockroach:": "1fab3", + ":spider:": "1f577", + ":spider_web:": "1f578", + ":scorpion:": "1f982", + ":mosquito:": "1f99f", + ":fly:": "1fab0", + ":worm:": "1fab1", + ":microbe:": "1f9a0", + ":bouquet:": "1f490", + ":cherry_blossom:": "1f338", + ":white_flower:": "1f4ae", + ":lotus:": "1fab7", + ":rosette:": "1f3f5", + ":rose:": "1f339", + ":wilted_rose:": "1f940", + ":hibiscus:": "1f33a", + ":sunflower:": "1f33b", + ":blossom:": "1f33c", + ":tulip:": "1f337", + ":hyacinth:": "1fabb", + ":seedling:": "1f331", + ":potted_plant:": "1fab4", + ":evergreen_tree:": "1f332", + ":deciduous_tree:": "1f333", + ":palm_tree:": "1f334", + ":cactus:": "1f335", + ":ear_of_rice:": "1f33e", + ":herb:": "1f33f", + ":shamrock:": "2618", + ":four_leaf_clover:": "1f340", + ":maple_leaf:": "1f341", + ":fallen_leaf:": "1f342", + ":leaves:": "1f343", + ":empty_nest:": "1fab9", + ":nest_with_eggs:": "1faba", + ":mushroom:": "1f344", + ":grapes:": "1f347", + ":melon:": "1f348", + ":watermelon:": "1f349", + ":tangerine:": "1f34a", + ":lemon:": "1f34b", + ":banana:": "1f34c", + ":pineapple:": "1f34d", + ":mango:": "1f96d", + ":apple:": "1f34e", + ":green_apple:": "1f34f", + ":pear:": "1f350", + ":peach:": "1f351", + ":cherries:": "1f352", + ":strawberry:": "1f353", + ":blueberries:": "1fad0", + ":kiwi:": "1f95d", + ":tomato:": "1f345", + ":olive:": "1fad2", + ":coconut:": "1f965", + ":avocado:": "1f951", + ":eggplant:": "1f346", + ":potato:": "1f954", + ":carrot:": "1f955", + ":corn:": "1f33d", + ":hot_pepper:": "1f336", + ":bell_pepper:": "1fad1", + ":cucumber:": "1f952", + ":leafy_green:": "1f96c", + ":broccoli:": "1f966", + ":garlic:": "1f9c4", + ":onion:": "1f9c5", + ":peanuts:": "1f95c", + ":beans:": "1fad8", + ":chestnut:": "1f330", + ":ginger_root:": "1fada", + ":pea_pod:": "1fadb", + ":bread:": "1f35e", + ":croissant:": "1f950", + ":french_bread:": "1f956", + ":flatbread:": "1fad3", + ":pretzel:": "1f968", + ":bagel:": "1f96f", + ":pancakes:": "1f95e", + ":waffle:": "1f9c7", + ":cheese:": "1f9c0", + ":meat_on_bone:": "1f356", + ":poultry_leg:": "1f357", + ":cut_of_meat:": "1f969", + ":bacon:": "1f953", + ":hamburger:": "1f354", + ":fries:": "1f35f", + ":pizza:": "1f355", + ":hotdog:": "1f32d", + ":sandwich:": "1f96a", + ":taco:": "1f32e", + ":burrito:": "1f32f", + ":tamale:": "1fad4", + ":stuffed_flatbread:": "1f959", + ":falafel:": "1f9c6", + ":egg:": "1f95a", + ":cooking:": "1f373", + ":shallow_pan_of_food:": "1f958", + ":stew:": "1f372", + ":fondue:": "1fad5", + ":bowl_with_spoon:": "1f963", + ":salad:": "1f957", + ":popcorn:": "1f37f", + ":butter:": "1f9c8", + ":salt:": "1f9c2", + ":canned_food:": "1f96b", + ":bento:": "1f371", + ":rice_cracker:": "1f358", + ":rice_ball:": "1f359", + ":rice:": "1f35a", + ":curry:": "1f35b", + ":ramen:": "1f35c", + ":spaghetti:": "1f35d", + ":sweet_potato:": "1f360", + ":oden:": "1f362", + ":sushi:": "1f363", + ":fried_shrimp:": "1f364", + ":fish_cake:": "1f365", + ":moon_cake:": "1f96e", + ":dango:": "1f361", + ":dumpling:": "1f95f", + ":fortune_cookie:": "1f960", + ":takeout_box:": "1f961", + ":crab:": "1f980", + ":lobster:": "1f99e", + ":shrimp:": "1f990", + ":squid:": "1f991", + ":oyster:": "1f9aa", + ":icecream:": "1f366", + ":shaved_ice:": "1f367", + ":ice_cream:": "1f368", + ":doughnut:": "1f369", + ":cookie:": "1f36a", + ":birthday:": "1f382", + ":cake:": "1f370", + ":cupcake:": "1f9c1", + ":pie:": "1f967", + ":chocolate_bar:": "1f36b", + ":candy:": "1f36c", + ":lollipop:": "1f36d", + ":custard:": "1f36e", + ":honey_pot:": "1f36f", + ":baby_bottle:": "1f37c", + ":milk:": "1f95b", + ":coffee:": "2615", + ":teapot:": "1fad6", + ":tea:": "1f375", + ":sake:": "1f376", + ":champagne:": "1f37e", + ":wine_glass:": "1f377", + ":cocktail:": "1f378", + ":tropical_drink:": "1f379", + ":beer:": "1f37a", + ":beers:": "1f37b", + ":champagne_glass:": "1f942", + ":tumbler_glass:": "1f943", + ":pouring_liquid:": "1fad7", + ":cup_with_straw:": "1f964", + ":bubble_tea:": "1f9cb", + ":beverage_box:": "1f9c3", + ":mate:": "1f9c9", + ":ice_cube:": "1f9ca", + ":chopsticks:": "1f962", + ":fork_knife_plate:": "1f37d", + ":fork_and_knife:": "1f374", + ":spoon:": "1f944", + ":knife:": "1f52a", + ":jar:": "1fad9", + ":amphora:": "1f3fa", + ":earth_africa:": "1f30d", + ":earth_americas:": "1f30e", + ":earth_asia:": "1f30f", + ":globe_with_meridians:": "1f310", + ":map:": "1f5fa", + ":japan:": "1f5fe", + ":compass:": "1f9ed", + ":mountain_snow:": "1f3d4", + ":mountain:": "26f0", + ":volcano:": "1f30b", + ":mount_fuji:": "1f5fb", + ":camping:": "1f3d5", + ":beach:": "1f3d6", + ":desert:": "1f3dc", + ":island:": "1f3dd", + ":park:": "1f3de", + ":stadium:": "1f3df", + ":classical_building:": "1f3db", + ":construction_site:": "1f3d7", + ":bricks:": "1f9f1", + ":rock:": "1faa8", + ":wood:": "1fab5", + ":hut:": "1f6d6", + ":homes:": "1f3d8", + ":house_abandoned:": "1f3da", + ":house:": "1f3e0", + ":house_with_garden:": "1f3e1", + ":office:": "1f3e2", + ":post_office:": "1f3e3", + ":european_post_office:": "1f3e4", + ":hospital:": "1f3e5", + ":bank:": "1f3e6", + ":hotel:": "1f3e8", + ":love_hotel:": "1f3e9", + ":convenience_store:": "1f3ea", + ":school:": "1f3eb", + ":department_store:": "1f3ec", + ":factory:": "1f3ed", + ":japanese_castle:": "1f3ef", + ":european_castle:": "1f3f0", + ":wedding:": "1f492", + ":tokyo_tower:": "1f5fc", + ":statue_of_liberty:": "1f5fd", + ":church:": "26ea", + ":mosque:": "1f54c", + ":hindu_temple:": "1f6d5", + ":synagogue:": "1f54d", + ":shinto_shrine:": "26e9", + ":kaaba:": "1f54b", + ":fountain:": "26f2", + ":tent:": "26fa", + ":foggy:": "1f301", + ":night_with_stars:": "1f303", + ":cityscape:": "1f3d9", + ":sunrise_over_mountains:": "1f304", + ":sunrise:": "1f305", + ":city_dusk:": "1f306", + ":city_sunset:": "1f307", + ":bridge_at_night:": "1f309", + ":hotsprings:": "2668", + ":carousel_horse:": "1f3a0", + ":playground_slide:": "1f6dd", + ":ferris_wheel:": "1f3a1", + ":roller_coaster:": "1f3a2", + ":barber:": "1f488", + ":circus_tent:": "1f3aa", + ":steam_locomotive:": "1f682", + ":railway_car:": "1f683", + ":bullettrain_side:": "1f684", + ":bullettrain_front:": "1f685", + ":train2:": "1f686", + ":metro:": "1f687", + ":light_rail:": "1f688", + ":station:": "1f689", + ":tram:": "1f68a", + ":monorail:": "1f69d", + ":mountain_railway:": "1f69e", + ":train:": "1f68b", + ":bus:": "1f68c", + ":oncoming_bus:": "1f68d", + ":trolleybus:": "1f68e", + ":minibus:": "1f690", + ":ambulance:": "1f691", + ":fire_engine:": "1f692", + ":police_car:": "1f693", + ":oncoming_police_car:": "1f694", + ":taxi:": "1f695", + ":oncoming_taxi:": "1f696", + ":red_car:": "1f697", + ":oncoming_automobile:": "1f698", + ":blue_car:": "1f699", + ":pickup_truck:": "1f6fb", + ":truck:": "1f69a", + ":articulated_lorry:": "1f69b", + ":tractor:": "1f69c", + ":race_car:": "1f3ce", + ":motorcycle:": "1f3cd", + ":motor_scooter:": "1f6f5", + ":manual_wheelchair:": "1f9bd", + ":motorized_wheelchair:": "1f9bc", + ":auto_rickshaw:": "1f6fa", + ":bike:": "1f6b2", + ":scooter:": "1f6f4", + ":skateboard:": "1f6f9", + ":roller_skate:": "1f6fc", + ":busstop:": "1f68f", + ":motorway:": "1f6e3", + ":railway_track:": "1f6e4", + ":oil:": "1f6e2", + ":fuelpump:": "26fd", + ":wheel:": "1f6de", + ":rotating_light:": "1f6a8", + ":traffic_light:": "1f6a5", + ":vertical_traffic_light:": "1f6a6", + ":octagonal_sign:": "1f6d1", + ":construction:": "1f6a7", + ":anchor:": "2693", + ":ring_buoy:": "1f6df", + ":sailboat:": "26f5", + ":canoe:": "1f6f6", + ":speedboat:": "1f6a4", + ":cruise_ship:": "1f6f3", + ":ferry:": "26f4", + ":motorboat:": "1f6e5", + ":ship:": "1f6a2", + ":airplane:": "2708", + ":airplane_small:": "1f6e9", + ":airplane_departure:": "1f6eb", + ":airplane_arriving:": "1f6ec", + ":parachute:": "1fa82", + ":seat:": "1f4ba", + ":helicopter:": "1f681", + ":suspension_railway:": "1f69f", + ":mountain_cableway:": "1f6a0", + ":aerial_tramway:": "1f6a1", + ":satellite_orbital:": "1f6f0", + ":rocket:": "1f680", + ":flying_saucer:": "1f6f8", + ":bellhop:": "1f6ce", + ":luggage:": "1f9f3", + ":hourglass:": "231b", + ":hourglass_flowing_sand:": "23f3", + ":watch:": "231a", + ":alarm_clock:": "23f0", + ":stopwatch:": "23f1", + ":timer:": "23f2", + ":clock:": "1f570", + ":clock12:": "1f55b", + ":clock1230:": "1f567", + ":clock1:": "1f550", + ":clock130:": "1f55c", + ":clock2:": "1f551", + ":clock230:": "1f55d", + ":clock3:": "1f552", + ":clock330:": "1f55e", + ":clock4:": "1f553", + ":clock430:": "1f55f", + ":clock5:": "1f554", + ":clock530:": "1f560", + ":clock6:": "1f555", + ":clock630:": "1f561", + ":clock7:": "1f556", + ":clock730:": "1f562", + ":clock8:": "1f557", + ":clock830:": "1f563", + ":clock9:": "1f558", + ":clock930:": "1f564", + ":clock10:": "1f559", + ":clock1030:": "1f565", + ":clock11:": "1f55a", + ":clock1130:": "1f566", + ":new_moon:": "1f311", + ":waxing_crescent_moon:": "1f312", + ":first_quarter_moon:": "1f313", + ":waxing_gibbous_moon:": "1f314", + ":full_moon:": "1f315", + ":waning_gibbous_moon:": "1f316", + ":last_quarter_moon:": "1f317", + ":waning_crescent_moon:": "1f318", + ":crescent_moon:": "1f319", + ":new_moon_with_face:": "1f31a", + ":first_quarter_moon_with_face:": "1f31b", + ":last_quarter_moon_with_face:": "1f31c", + ":thermometer:": "1f321", + ":sunny:": "2600", + ":full_moon_with_face:": "1f31d", + ":sun_with_face:": "1f31e", + ":ringed_planet:": "1fa90", + ":star:": "2b50", + ":star2:": "1f31f", + ":stars:": "1f320", + ":milky_way:": "1f30c", + ":cloud:": "2601", + ":partly_sunny:": "26c5", + ":thunder_cloud_rain:": "26c8", + ":white_sun_small_cloud:": "1f324", + ":white_sun_cloud:": "1f325", + ":white_sun_rain_cloud:": "1f326", + ":cloud_rain:": "1f327", + ":cloud_snow:": "1f328", + ":cloud_lightning:": "1f329", + ":cloud_tornado:": "1f32a", + ":fog:": "1f32b", + ":wind_blowing_face:": "1f32c", + ":cyclone:": "1f300", + ":rainbow:": "1f308", + ":closed_umbrella:": "1f302", + ":umbrella2:": "2602", + ":umbrella:": "2614", + ":beach_umbrella:": "26f1", + ":zap:": "26a1", + ":snowflake:": "2744", + ":snowman2:": "2603", + ":snowman:": "26c4", + ":comet:": "2604", + ":fire:": "1f525", + ":droplet:": "1f4a7", + ":ocean:": "1f30a", + ":jack_o_lantern:": "1f383", + ":christmas_tree:": "1f384", + ":fireworks:": "1f386", + ":sparkler:": "1f387", + ":firecracker:": "1f9e8", + ":sparkles:": "2728", + ":balloon:": "1f388", + ":tada:": "1f389", + ":confetti_ball:": "1f38a", + ":tanabata_tree:": "1f38b", + ":bamboo:": "1f38d", + ":dolls:": "1f38e", + ":flags:": "1f38f", + ":wind_chime:": "1f390", + ":rice_scene:": "1f391", + ":red_envelope:": "1f9e7", + ":ribbon:": "1f380", + ":gift:": "1f381", + ":reminder_ribbon:": "1f397", + ":tickets:": "1f39f", + ":ticket:": "1f3ab", + ":military_medal:": "1f396", + ":trophy:": "1f3c6", + ":medal:": "1f3c5", + ":first_place:": "1f947", + ":second_place:": "1f948", + ":third_place:": "1f949", + ":soccer:": "26bd", + ":baseball:": "26be", + ":softball:": "1f94e", + ":basketball:": "1f3c0", + ":volleyball:": "1f3d0", + ":football:": "1f3c8", + ":rugby_football:": "1f3c9", + ":tennis:": "1f3be", + ":flying_disc:": "1f94f", + ":bowling:": "1f3b3", + ":cricket_game:": "1f3cf", + ":field_hockey:": "1f3d1", + ":hockey:": "1f3d2", + ":lacrosse:": "1f94d", + ":ping_pong:": "1f3d3", + ":badminton:": "1f3f8", + ":boxing_glove:": "1f94a", + ":martial_arts_uniform:": "1f94b", + ":goal:": "1f945", + ":golf:": "26f3", + ":ice_skate:": "26f8", + ":fishing_pole_and_fish:": "1f3a3", + ":diving_mask:": "1f93f", + ":running_shirt_with_sash:": "1f3bd", + ":ski:": "1f3bf", + ":sled:": "1f6f7", + ":curling_stone:": "1f94c", + ":dart:": "1f3af", + ":yo_yo:": "1fa80", + ":kite:": "1fa81", + ":gun:": "1f52b", + ":8ball:": "1f3b1", + ":crystal_ball:": "1f52e", + ":magic_wand:": "1fa84", + ":video_game:": "1f3ae", + ":joystick:": "1f579", + ":slot_machine:": "1f3b0", + ":game_die:": "1f3b2", + ":jigsaw:": "1f9e9", + ":teddy_bear:": "1f9f8", + ":pinata:": "1fa85", + ":mirror_ball:": "1faa9", + ":nesting_dolls:": "1fa86", + ":spades:": "2660", + ":hearts:": "2665", + ":diamonds:": "2666", + ":clubs:": "2663", + ":chess_pawn:": "265f", + ":black_joker:": "1f0cf", + ":mahjong:": "1f004", + ":flower_playing_cards:": "1f3b4", + ":performing_arts:": "1f3ad", + ":frame_photo:": "1f5bc", + ":art:": "1f3a8", + ":thread:": "1f9f5", + ":sewing_needle:": "1faa1", + ":yarn:": "1f9f6", + ":knot:": "1faa2", + ":eyeglasses:": "1f453", + ":dark_sunglasses:": "1f576", + ":goggles:": "1f97d", + ":lab_coat:": "1f97c", + ":safety_vest:": "1f9ba", + ":necktie:": "1f454", + ":shirt:": "1f455", + ":jeans:": "1f456", + ":scarf:": "1f9e3", + ":gloves:": "1f9e4", + ":coat:": "1f9e5", + ":socks:": "1f9e6", + ":dress:": "1f457", + ":kimono:": "1f458", + ":sari:": "1f97b", + ":one_piece_swimsuit:": "1fa71", + ":briefs:": "1fa72", + ":shorts:": "1fa73", + ":bikini:": "1f459", + ":womans_clothes:": "1f45a", + ":folding_hand_fan:": "1faad", + ":purse:": "1f45b", + ":handbag:": "1f45c", + ":pouch:": "1f45d", + ":shopping_bags:": "1f6cd", + ":school_satchel:": "1f392", + ":thong_sandal:": "1fa74", + ":mans_shoe:": "1f45e", + ":athletic_shoe:": "1f45f", + ":hiking_boot:": "1f97e", + ":womans_flat_shoe:": "1f97f", + ":high_heel:": "1f460", + ":sandal:": "1f461", + ":ballet_shoes:": "1fa70", + ":boot:": "1f462", + ":hair_pick:": "1faae", + ":crown:": "1f451", + ":womans_hat:": "1f452", + ":tophat:": "1f3a9", + ":mortar_board:": "1f393", + ":billed_cap:": "1f9e2", + ":military_helmet:": "1fa96", + ":helmet_with_cross:": "26d1", + ":prayer_beads:": "1f4ff", + ":lipstick:": "1f484", + ":ring:": "1f48d", + ":gem:": "1f48e", + ":mute:": "1f507", + ":speaker:": "1f508", + ":sound:": "1f509", + ":loud_sound:": "1f50a", + ":loudspeaker:": "1f4e2", + ":mega:": "1f4e3", + ":postal_horn:": "1f4ef", + ":bell:": "1f514", + ":no_bell:": "1f515", + ":musical_score:": "1f3bc", + ":musical_note:": "1f3b5", + ":notes:": "1f3b6", + ":microphone2:": "1f399", + ":level_slider:": "1f39a", + ":control_knobs:": "1f39b", + ":microphone:": "1f3a4", + ":headphones:": "1f3a7", + ":radio:": "1f4fb", + ":saxophone:": "1f3b7", + ":accordion:": "1fa97", + ":guitar:": "1f3b8", + ":musical_keyboard:": "1f3b9", + ":trumpet:": "1f3ba", + ":violin:": "1f3bb", + ":banjo:": "1fa95", + ":drum:": "1f941", + ":long_drum:": "1fa98", + ":maracas:": "1fa87", + ":flute:": "1fa88", + ":mobile_phone:": "1f4f1", + ":calling:": "1f4f2", + ":telephone:": "260e", + ":telephone_receiver:": "1f4de", + ":pager:": "1f4df", + ":fax:": "1f4e0", + ":battery:": "1f50b", + ":low_battery:": "1faab", + ":electric_plug:": "1f50c", + ":computer:": "1f4bb", + ":desktop:": "1f5a5", + ":printer:": "1f5a8", + ":keyboard:": "2328", + ":mouse_three_button:": "1f5b1", + ":trackball:": "1f5b2", + ":minidisc:": "1f4bd", + ":floppy_disk:": "1f4be", + ":cd:": "1f4bf", + ":dvd:": "1f4c0", + ":abacus:": "1f9ee", + ":movie_camera:": "1f3a5", + ":film_frames:": "1f39e", + ":projector:": "1f4fd", + ":clapper:": "1f3ac", + ":tv:": "1f4fa", + ":camera:": "1f4f7", + ":camera_with_flash:": "1f4f8", + ":video_camera:": "1f4f9", + ":vhs:": "1f4fc", + ":mag:": "1f50d", + ":mag_right:": "1f50e", + ":candle:": "1f56f", + ":bulb:": "1f4a1", + ":flashlight:": "1f526", + ":izakaya_lantern:": "1f3ee", + ":diya_lamp:": "1fa94", + ":notebook_with_decorative_cover:": "1f4d4", + ":closed_book:": "1f4d5", + ":book:": "1f4d6", + ":green_book:": "1f4d7", + ":blue_book:": "1f4d8", + ":orange_book:": "1f4d9", + ":books:": "1f4da", + ":notebook:": "1f4d3", + ":ledger:": "1f4d2", + ":page_with_curl:": "1f4c3", + ":scroll:": "1f4dc", + ":page_facing_up:": "1f4c4", + ":newspaper:": "1f4f0", + ":newspaper2:": "1f5de", + ":bookmark_tabs:": "1f4d1", + ":bookmark:": "1f516", + ":label:": "1f3f7", + ":moneybag:": "1f4b0", + ":coin:": "1fa99", + ":yen:": "1f4b4", + ":dollar:": "1f4b5", + ":euro:": "1f4b6", + ":pound:": "1f4b7", + ":money_with_wings:": "1f4b8", + ":credit_card:": "1f4b3", + ":receipt:": "1f9fe", + ":chart:": "1f4b9", + ":envelope:": "2709", + ":e-mail:": "1f4e7", + ":incoming_envelope:": "1f4e8", + ":envelope_with_arrow:": "1f4e9", + ":outbox_tray:": "1f4e4", + ":inbox_tray:": "1f4e5", + ":package:": "1f4e6", + ":mailbox:": "1f4eb", + ":mailbox_closed:": "1f4ea", + ":mailbox_with_mail:": "1f4ec", + ":mailbox_with_no_mail:": "1f4ed", + ":postbox:": "1f4ee", + ":ballot_box:": "1f5f3", + ":pencil2:": "270f", + ":black_nib:": "2712", + ":pen_fountain:": "1f58b", + ":pen_ballpoint:": "1f58a", + ":paintbrush:": "1f58c", + ":crayon:": "1f58d", + ":pencil:": "1f4dd", + ":briefcase:": "1f4bc", + ":file_folder:": "1f4c1", + ":open_file_folder:": "1f4c2", + ":dividers:": "1f5c2", + ":date:": "1f4c5", + ":calendar:": "1f4c6", + ":notepad_spiral:": "1f5d2", + ":calendar_spiral:": "1f5d3", + ":card_index:": "1f4c7", + ":chart_with_upwards_trend:": "1f4c8", + ":chart_with_downwards_trend:": "1f4c9", + ":bar_chart:": "1f4ca", + ":clipboard:": "1f4cb", + ":pushpin:": "1f4cc", + ":round_pushpin:": "1f4cd", + ":paperclip:": "1f4ce", + ":paperclips:": "1f587", + ":straight_ruler:": "1f4cf", + ":triangular_ruler:": "1f4d0", + ":scissors:": "2702", + ":card_box:": "1f5c3", + ":file_cabinet:": "1f5c4", + ":wastebasket:": "1f5d1", + ":lock:": "1f512", + ":unlock:": "1f513", + ":lock_with_ink_pen:": "1f50f", + ":closed_lock_with_key:": "1f510", + ":key:": "1f511", + ":key2:": "1f5dd", + ":hammer:": "1f528", + ":axe:": "1fa93", + ":pick:": "26cf", + ":hammer_pick:": "2692", + ":tools:": "1f6e0", + ":dagger:": "1f5e1", + ":crossed_swords:": "2694", + ":bomb:": "1f4a3", + ":boomerang:": "1fa83", + ":bow_and_arrow:": "1f3f9", + ":shield:": "1f6e1", + ":carpentry_saw:": "1fa9a", + ":wrench:": "1f527", + ":screwdriver:": "1fa9b", + ":nut_and_bolt:": "1f529", + ":gear:": "2699", + ":compression:": "1f5dc", + ":scales:": "2696", + ":probing_cane:": "1f9af", + ":link:": "1f517", + ":chains:": "26d3", + ":hook:": "1fa9d", + ":toolbox:": "1f9f0", + ":magnet:": "1f9f2", + ":ladder:": "1fa9c", + ":alembic:": "2697", + ":test_tube:": "1f9ea", + ":petri_dish:": "1f9eb", + ":dna:": "1f9ec", + ":microscope:": "1f52c", + ":telescope:": "1f52d", + ":satellite:": "1f4e1", + ":syringe:": "1f489", + ":drop_of_blood:": "1fa78", + ":pill:": "1f48a", + ":adhesive_bandage:": "1fa79", + ":crutch:": "1fa7c", + ":stethoscope:": "1fa7a", + ":x_ray:": "1fa7b", + ":door:": "1f6aa", + ":elevator:": "1f6d7", + ":mirror:": "1fa9e", + ":window:": "1fa9f", + ":bed:": "1f6cf", + ":couch:": "1f6cb", + ":chair:": "1fa91", + ":toilet:": "1f6bd", + ":plunger:": "1faa0", + ":shower:": "1f6bf", + ":bathtub:": "1f6c1", + ":mouse_trap:": "1faa4", + ":razor:": "1fa92", + ":squeeze_bottle:": "1f9f4", + ":safety_pin:": "1f9f7", + ":broom:": "1f9f9", + ":basket:": "1f9fa", + ":roll_of_paper:": "1f9fb", + ":bucket:": "1faa3", + ":soap:": "1f9fc", + ":bubbles:": "1fae7", + ":toothbrush:": "1faa5", + ":sponge:": "1f9fd", + ":fire_extinguisher:": "1f9ef", + ":shopping_cart:": "1f6d2", + ":smoking:": "1f6ac", + ":coffin:": "26b0", + ":headstone:": "1faa6", + ":urn:": "26b1", + ":nazar_amulet:": "1f9ff", + ":hamsa:": "1faac", + ":moyai:": "1f5ff", + ":placard:": "1faa7", + ":identification_card:": "1faaa", + ":atm:": "1f3e7", + ":put_litter_in_its_place:": "1f6ae", + ":potable_water:": "1f6b0", + ":wheelchair:": "267f", + ":mens:": "1f6b9", + ":womens:": "1f6ba", + ":restroom:": "1f6bb", + ":baby_symbol:": "1f6bc", + ":wc:": "1f6be", + ":passport_control:": "1f6c2", + ":customs:": "1f6c3", + ":baggage_claim:": "1f6c4", + ":left_luggage:": "1f6c5", + ":warning:": "26a0", + ":children_crossing:": "1f6b8", + ":no_entry:": "26d4", + ":no_entry_sign:": "1f6ab", + ":no_bicycles:": "1f6b3", + ":no_smoking:": "1f6ad", + ":do_not_litter:": "1f6af", + ":non-potable_water:": "1f6b1", + ":no_pedestrians:": "1f6b7", + ":no_mobile_phones:": "1f4f5", + ":underage:": "1f51e", + ":radioactive:": "2622", + ":biohazard:": "2623", + ":arrow_up:": "2b06", + ":arrow_upper_right:": "2197", + ":arrow_right:": "27a1", + ":arrow_lower_right:": "2198", + ":arrow_down:": "2b07", + ":arrow_lower_left:": "2199", + ":arrow_left:": "2b05", + ":arrow_upper_left:": "2196", + ":arrow_up_down:": "2195", + ":left_right_arrow:": "2194", + ":leftwards_arrow_with_hook:": "21a9", + ":arrow_right_hook:": "21aa", + ":arrow_heading_up:": "2934", + ":arrow_heading_down:": "2935", + ":arrows_clockwise:": "1f503", + ":arrows_counterclockwise:": "1f504", + ":back:": "1f519", + ":end:": "1f51a", + ":on:": "1f51b", + ":soon:": "1f51c", + ":top:": "1f51d", + ":place_of_worship:": "1f6d0", + ":atom:": "269b", + ":om_symbol:": "1f549", + ":star_of_david:": "2721", + ":wheel_of_dharma:": "2638", + ":yin_yang:": "262f", + ":cross:": "271d", + ":orthodox_cross:": "2626", + ":star_and_crescent:": "262a", + ":peace:": "262e", + ":menorah:": "1f54e", + ":six_pointed_star:": "1f52f", + ":khanda:": "1faaf", + ":aries:": "2648", + ":taurus:": "2649", + ":gemini:": "264a", + ":cancer:": "264b", + ":leo:": "264c", + ":virgo:": "264d", + ":libra:": "264e", + ":scorpius:": "264f", + ":sagittarius:": "2650", + ":capricorn:": "2651", + ":aquarius:": "2652", + ":pisces:": "2653", + ":ophiuchus:": "26ce", + ":twisted_rightwards_arrows:": "1f500", + ":repeat:": "1f501", + ":repeat_one:": "1f502", + ":arrow_forward:": "25b6", + ":fast_forward:": "23e9", + ":track_next:": "23ed", + ":play_pause:": "23ef", + ":arrow_backward:": "25c0", + ":rewind:": "23ea", + ":track_previous:": "23ee", + ":arrow_up_small:": "1f53c", + ":arrow_double_up:": "23eb", + ":arrow_down_small:": "1f53d", + ":arrow_double_down:": "23ec", + ":pause_button:": "23f8", + ":stop_button:": "23f9", + ":record_button:": "23fa", + ":eject:": "23cf", + ":cinema:": "1f3a6", + ":low_brightness:": "1f505", + ":high_brightness:": "1f506", + ":signal_strength:": "1f4f6", + ":wireless:": "1f6dc", + ":vibration_mode:": "1f4f3", + ":mobile_phone_off:": "1f4f4", + ":female_sign:": "2640", + ":male_sign:": "2642", + ":transgender_symbol:": "26a7", + ":heavy_multiplication_x:": "2716", + ":heavy_plus_sign:": "2795", + ":heavy_minus_sign:": "2796", + ":heavy_division_sign:": "2797", + ":heavy_equals_sign:": "1f7f0", + ":infinity:": "267e", + ":bangbang:": "203c", + ":interrobang:": "2049", + ":question:": "2753", + ":grey_question:": "2754", + ":grey_exclamation:": "2755", + ":exclamation:": "2757", + ":wavy_dash:": "3030", + ":currency_exchange:": "1f4b1", + ":heavy_dollar_sign:": "1f4b2", + ":medical_symbol:": "2695", + ":recycle:": "267b", + ":fleur-de-lis:": "269c", + ":trident:": "1f531", + ":name_badge:": "1f4db", + ":beginner:": "1f530", + ":o:": "2b55", + ":white_check_mark:": "2705", + ":ballot_box_with_check:": "2611", + ":heavy_check_mark:": "2714", + ":x:": "274c", + ":negative_squared_cross_mark:": "274e", + ":curly_loop:": "27b0", + ":loop:": "27bf", + ":part_alternation_mark:": "303d", + ":eight_spoked_asterisk:": "2733", + ":eight_pointed_black_star:": "2734", + ":sparkle:": "2747", + ":copyright:": "a9", + ":registered:": "ae", + ":tm:": "2122", + ":hash:": "23-20e3", + ":asterisk:": "2a-20e3", + ":zero:": "30-20e3", + ":one:": "31-20e3", + ":two:": "32-20e3", + ":three:": "33-20e3", + ":four:": "34-20e3", + ":five:": "35-20e3", + ":six:": "36-20e3", + ":seven:": "37-20e3", + ":eight:": "38-20e3", + ":nine:": "39-20e3", + ":keycap_ten:": "1f51f", + ":capital_abcd:": "1f520", + ":abcd:": "1f521", + ":1234:": "1f522", + ":symbols:": "1f523", + ":abc:": "1f524", + ":a:": "1f170", + ":ab:": "1f18e", + ":b:": "1f171", + ":cl:": "1f191", + ":cool:": "1f192", + ":free:": "1f193", + ":information_source:": "2139", + ":id:": "1f194", + ":m:": "24c2", + ":new:": "1f195", + ":ng:": "1f196", + ":o2:": "1f17e", + ":ok:": "1f197", + ":parking:": "1f17f", + ":sos:": "1f198", + ":up:": "1f199", + ":vs:": "1f19a", + ":koko:": "1f201", + ":sa:": "1f202", + ":u6708:": "1f237", + ":u6709:": "1f236", + ":u6307:": "1f22f", + ":ideograph_advantage:": "1f250", + ":u5272:": "1f239", + ":u7121:": "1f21a", + ":u7981:": "1f232", + ":accept:": "1f251", + ":u7533:": "1f238", + ":u5408:": "1f234", + ":u7a7a:": "1f233", + ":congratulations:": "3297", + ":secret:": "3299", + ":u55b6:": "1f23a", + ":u6e80:": "1f235", + ":red_circle:": "1f534", + ":orange_circle:": "1f7e0", + ":yellow_circle:": "1f7e1", + ":green_circle:": "1f7e2", + ":blue_circle:": "1f535", + ":purple_circle:": "1f7e3", + ":brown_circle:": "1f7e4", + ":black_circle:": "26ab", + ":white_circle:": "26aa", + ":red_square:": "1f7e5", + ":orange_square:": "1f7e7", + ":yellow_square:": "1f7e8", + ":green_square:": "1f7e9", + ":blue_square:": "1f7e6", + ":purple_square:": "1f7ea", + ":brown_square:": "1f7eb", + ":black_large_square:": "2b1b", + ":white_large_square:": "2b1c", + ":black_medium_square:": "25fc", + ":white_medium_square:": "25fb", + ":black_medium_small_square:": "25fe", + ":white_medium_small_square:": "25fd", + ":black_small_square:": "25aa", + ":white_small_square:": "25ab", + ":large_orange_diamond:": "1f536", + ":large_blue_diamond:": "1f537", + ":small_orange_diamond:": "1f538", + ":small_blue_diamond:": "1f539", + ":small_red_triangle:": "1f53a", + ":small_red_triangle_down:": "1f53b", + ":diamond_shape_with_a_dot_inside:": "1f4a0", + ":radio_button:": "1f518", + ":white_square_button:": "1f533", + ":black_square_button:": "1f532", + ":checkered_flag:": "1f3c1", + ":triangular_flag_on_post:": "1f6a9", + ":crossed_flags:": "1f38c", + ":flag_black:": "1f3f4", + ":flag_white:": "1f3f3", + ":rainbow_flag:": "1f3f3-fe0f-200d-1f308", + ":transgender_flag:": "1f3f3-fe0f-200d-26a7-fe0f", + ":pirate_flag:": "1f3f4-200d-2620-fe0f", + ":flag_ac:": "1f1e6-1f1e8", + ":flag_ad:": "1f1e6-1f1e9", + ":flag_ae:": "1f1e6-1f1ea", + ":flag_af:": "1f1e6-1f1eb", + ":flag_ag:": "1f1e6-1f1ec", + ":flag_ai:": "1f1e6-1f1ee", + ":flag_al:": "1f1e6-1f1f1", + ":flag_am:": "1f1e6-1f1f2", + ":flag_ao:": "1f1e6-1f1f4", + ":flag_aq:": "1f1e6-1f1f6", + ":flag_ar:": "1f1e6-1f1f7", + ":flag_as:": "1f1e6-1f1f8", + ":flag_at:": "1f1e6-1f1f9", + ":flag_au:": "1f1e6-1f1fa", + ":flag_aw:": "1f1e6-1f1fc", + ":flag_ax:": "1f1e6-1f1fd", + ":flag_az:": "1f1e6-1f1ff", + ":flag_ba:": "1f1e7-1f1e6", + ":flag_bb:": "1f1e7-1f1e7", + ":flag_bd:": "1f1e7-1f1e9", + ":flag_be:": "1f1e7-1f1ea", + ":flag_bf:": "1f1e7-1f1eb", + ":flag_bg:": "1f1e7-1f1ec", + ":flag_bh:": "1f1e7-1f1ed", + ":flag_bi:": "1f1e7-1f1ee", + ":flag_bj:": "1f1e7-1f1ef", + ":flag_bl:": "1f1e7-1f1f1", + ":flag_bm:": "1f1e7-1f1f2", + ":flag_bn:": "1f1e7-1f1f3", + ":flag_bo:": "1f1e7-1f1f4", + ":flag_bq:": "1f1e7-1f1f6", + ":flag_br:": "1f1e7-1f1f7", + ":flag_bs:": "1f1e7-1f1f8", + ":flag_bt:": "1f1e7-1f1f9", + ":flag_bv:": "1f1e7-1f1fb", + ":flag_bw:": "1f1e7-1f1fc", + ":flag_by:": "1f1e7-1f1fe", + ":flag_bz:": "1f1e7-1f1ff", + ":flag_ca:": "1f1e8-1f1e6", + ":flag_cc:": "1f1e8-1f1e8", + ":flag_cd:": "1f1e8-1f1e9", + ":flag_cf:": "1f1e8-1f1eb", + ":flag_cg:": "1f1e8-1f1ec", + ":flag_ch:": "1f1e8-1f1ed", + ":flag_ci:": "1f1e8-1f1ee", + ":flag_ck:": "1f1e8-1f1f0", + ":flag_cl:": "1f1e8-1f1f1", + ":flag_cm:": "1f1e8-1f1f2", + ":flag_cn:": "1f1e8-1f1f3", + ":flag_co:": "1f1e8-1f1f4", + ":flag_cp:": "1f1e8-1f1f5", + ":flag_cr:": "1f1e8-1f1f7", + ":flag_cu:": "1f1e8-1f1fa", + ":flag_cv:": "1f1e8-1f1fb", + ":flag_cw:": "1f1e8-1f1fc", + ":flag_cx:": "1f1e8-1f1fd", + ":flag_cy:": "1f1e8-1f1fe", + ":flag_cz:": "1f1e8-1f1ff", + ":flag_de:": "1f1e9-1f1ea", + ":flag_dg:": "1f1e9-1f1ec", + ":flag_dj:": "1f1e9-1f1ef", + ":flag_dk:": "1f1e9-1f1f0", + ":flag_dm:": "1f1e9-1f1f2", + ":flag_do:": "1f1e9-1f1f4", + ":flag_dz:": "1f1e9-1f1ff", + ":flag_ea:": "1f1ea-1f1e6", + ":flag_ec:": "1f1ea-1f1e8", + ":flag_ee:": "1f1ea-1f1ea", + ":flag_eg:": "1f1ea-1f1ec", + ":flag_eh:": "1f1ea-1f1ed", + ":flag_er:": "1f1ea-1f1f7", + ":flag_es:": "1f1ea-1f1f8", + ":flag_et:": "1f1ea-1f1f9", + ":flag_eu:": "1f1ea-1f1fa", + ":flag_fi:": "1f1eb-1f1ee", + ":flag_fj:": "1f1eb-1f1ef", + ":flag_fk:": "1f1eb-1f1f0", + ":flag_fm:": "1f1eb-1f1f2", + ":flag_fo:": "1f1eb-1f1f4", + ":flag_fr:": "1f1eb-1f1f7", + ":flag_ga:": "1f1ec-1f1e6", + ":flag_gb:": "1f1ec-1f1e7", + ":flag_gd:": "1f1ec-1f1e9", + ":flag_ge:": "1f1ec-1f1ea", + ":flag_gf:": "1f1ec-1f1eb", + ":flag_gg:": "1f1ec-1f1ec", + ":flag_gh:": "1f1ec-1f1ed", + ":flag_gi:": "1f1ec-1f1ee", + ":flag_gl:": "1f1ec-1f1f1", + ":flag_gm:": "1f1ec-1f1f2", + ":flag_gn:": "1f1ec-1f1f3", + ":flag_gp:": "1f1ec-1f1f5", + ":flag_gq:": "1f1ec-1f1f6", + ":flag_gr:": "1f1ec-1f1f7", + ":flag_gs:": "1f1ec-1f1f8", + ":flag_gt:": "1f1ec-1f1f9", + ":flag_gu:": "1f1ec-1f1fa", + ":flag_gw:": "1f1ec-1f1fc", + ":flag_gy:": "1f1ec-1f1fe", + ":flag_hk:": "1f1ed-1f1f0", + ":flag_hm:": "1f1ed-1f1f2", + ":flag_hn:": "1f1ed-1f1f3", + ":flag_hr:": "1f1ed-1f1f7", + ":flag_ht:": "1f1ed-1f1f9", + ":flag_hu:": "1f1ed-1f1fa", + ":flag_ic:": "1f1ee-1f1e8", + ":flag_id:": "1f1ee-1f1e9", + ":flag_ie:": "1f1ee-1f1ea", + ":flag_il:": "1f1ee-1f1f1", + ":flag_im:": "1f1ee-1f1f2", + ":flag_in:": "1f1ee-1f1f3", + ":flag_io:": "1f1ee-1f1f4", + ":flag_iq:": "1f1ee-1f1f6", + ":flag_ir:": "1f1ee-1f1f7", + ":flag_is:": "1f1ee-1f1f8", + ":flag_it:": "1f1ee-1f1f9", + ":flag_je:": "1f1ef-1f1ea", + ":flag_jm:": "1f1ef-1f1f2", + ":flag_jo:": "1f1ef-1f1f4", + ":flag_jp:": "1f1ef-1f1f5", + ":flag_ke:": "1f1f0-1f1ea", + ":flag_kg:": "1f1f0-1f1ec", + ":flag_kh:": "1f1f0-1f1ed", + ":flag_ki:": "1f1f0-1f1ee", + ":flag_km:": "1f1f0-1f1f2", + ":flag_kn:": "1f1f0-1f1f3", + ":flag_kp:": "1f1f0-1f1f5", + ":flag_kr:": "1f1f0-1f1f7", + ":flag_kw:": "1f1f0-1f1fc", + ":flag_ky:": "1f1f0-1f1fe", + ":flag_kz:": "1f1f0-1f1ff", + ":flag_la:": "1f1f1-1f1e6", + ":flag_lb:": "1f1f1-1f1e7", + ":flag_lc:": "1f1f1-1f1e8", + ":flag_li:": "1f1f1-1f1ee", + ":flag_lk:": "1f1f1-1f1f0", + ":flag_lr:": "1f1f1-1f1f7", + ":flag_ls:": "1f1f1-1f1f8", + ":flag_lt:": "1f1f1-1f1f9", + ":flag_lu:": "1f1f1-1f1fa", + ":flag_lv:": "1f1f1-1f1fb", + ":flag_ly:": "1f1f1-1f1fe", + ":flag_ma:": "1f1f2-1f1e6", + ":flag_mc:": "1f1f2-1f1e8", + ":flag_md:": "1f1f2-1f1e9", + ":flag_me:": "1f1f2-1f1ea", + ":flag_mf:": "1f1f2-1f1eb", + ":flag_mg:": "1f1f2-1f1ec", + ":flag_mh:": "1f1f2-1f1ed", + ":flag_mk:": "1f1f2-1f1f0", + ":flag_ml:": "1f1f2-1f1f1", + ":flag_mm:": "1f1f2-1f1f2", + ":flag_mn:": "1f1f2-1f1f3", + ":flag_mo:": "1f1f2-1f1f4", + ":flag_mp:": "1f1f2-1f1f5", + ":flag_mq:": "1f1f2-1f1f6", + ":flag_mr:": "1f1f2-1f1f7", + ":flag_ms:": "1f1f2-1f1f8", + ":flag_mt:": "1f1f2-1f1f9", + ":flag_mu:": "1f1f2-1f1fa", + ":flag_mv:": "1f1f2-1f1fb", + ":flag_mw:": "1f1f2-1f1fc", + ":flag_mx:": "1f1f2-1f1fd", + ":flag_my:": "1f1f2-1f1fe", + ":flag_mz:": "1f1f2-1f1ff", + ":flag_na:": "1f1f3-1f1e6", + ":flag_nc:": "1f1f3-1f1e8", + ":flag_ne:": "1f1f3-1f1ea", + ":flag_nf:": "1f1f3-1f1eb", + ":flag_ng:": "1f1f3-1f1ec", + ":flag_ni:": "1f1f3-1f1ee", + ":flag_nl:": "1f1f3-1f1f1", + ":flag_no:": "1f1f3-1f1f4", + ":flag_np:": "1f1f3-1f1f5", + ":flag_nr:": "1f1f3-1f1f7", + ":flag_nu:": "1f1f3-1f1fa", + ":flag_nz:": "1f1f3-1f1ff", + ":flag_om:": "1f1f4-1f1f2", + ":flag_pa:": "1f1f5-1f1e6", + ":flag_pe:": "1f1f5-1f1ea", + ":flag_pf:": "1f1f5-1f1eb", + ":flag_pg:": "1f1f5-1f1ec", + ":flag_ph:": "1f1f5-1f1ed", + ":flag_pk:": "1f1f5-1f1f0", + ":flag_pl:": "1f1f5-1f1f1", + ":flag_pm:": "1f1f5-1f1f2", + ":flag_pn:": "1f1f5-1f1f3", + ":flag_pr:": "1f1f5-1f1f7", + ":flag_ps:": "1f1f5-1f1f8", + ":flag_pt:": "1f1f5-1f1f9", + ":flag_pw:": "1f1f5-1f1fc", + ":flag_py:": "1f1f5-1f1fe", + ":flag_qa:": "1f1f6-1f1e6", + ":flag_re:": "1f1f7-1f1ea", + ":flag_ro:": "1f1f7-1f1f4", + ":flag_rs:": "1f1f7-1f1f8", + ":flag_ru:": "1f1f7-1f1fa", + ":flag_rw:": "1f1f7-1f1fc", + ":flag_sa:": "1f1f8-1f1e6", + ":flag_sb:": "1f1f8-1f1e7", + ":flag_sc:": "1f1f8-1f1e8", + ":flag_sd:": "1f1f8-1f1e9", + ":flag_se:": "1f1f8-1f1ea", + ":flag_sg:": "1f1f8-1f1ec", + ":flag_sh:": "1f1f8-1f1ed", + ":flag_si:": "1f1f8-1f1ee", + ":flag_sj:": "1f1f8-1f1ef", + ":flag_sk:": "1f1f8-1f1f0", + ":flag_sl:": "1f1f8-1f1f1", + ":flag_sm:": "1f1f8-1f1f2", + ":flag_sn:": "1f1f8-1f1f3", + ":flag_so:": "1f1f8-1f1f4", + ":flag_sr:": "1f1f8-1f1f7", + ":flag_ss:": "1f1f8-1f1f8", + ":flag_st:": "1f1f8-1f1f9", + ":flag_sv:": "1f1f8-1f1fb", + ":flag_sx:": "1f1f8-1f1fd", + ":flag_sy:": "1f1f8-1f1fe", + ":flag_sz:": "1f1f8-1f1ff", + ":flag_ta:": "1f1f9-1f1e6", + ":flag_tc:": "1f1f9-1f1e8", + ":flag_td:": "1f1f9-1f1e9", + ":flag_tf:": "1f1f9-1f1eb", + ":flag_tg:": "1f1f9-1f1ec", + ":flag_th:": "1f1f9-1f1ed", + ":flag_tj:": "1f1f9-1f1ef", + ":flag_tk:": "1f1f9-1f1f0", + ":flag_tl:": "1f1f9-1f1f1", + ":flag_tm:": "1f1f9-1f1f2", + ":flag_tn:": "1f1f9-1f1f3", + ":flag_to:": "1f1f9-1f1f4", + ":flag_tr:": "1f1f9-1f1f7", + ":flag_tt:": "1f1f9-1f1f9", + ":flag_tv:": "1f1f9-1f1fb", + ":flag_tw:": "1f1f9-1f1fc", + ":flag_tz:": "1f1f9-1f1ff", + ":flag_ua:": "1f1fa-1f1e6", + ":flag_ug:": "1f1fa-1f1ec", + ":flag_um:": "1f1fa-1f1f2", + ":united_nations:": "1f1fa-1f1f3", + ":flag_us:": "1f1fa-1f1f8", + ":flag_uy:": "1f1fa-1f1fe", + ":flag_uz:": "1f1fa-1f1ff", + ":flag_va:": "1f1fb-1f1e6", + ":flag_vc:": "1f1fb-1f1e8", + ":flag_ve:": "1f1fb-1f1ea", + ":flag_vg:": "1f1fb-1f1ec", + ":flag_vi:": "1f1fb-1f1ee", + ":flag_vn:": "1f1fb-1f1f3", + ":flag_vu:": "1f1fb-1f1fa", + ":flag_wf:": "1f1fc-1f1eb", + ":flag_ws:": "1f1fc-1f1f8", + ":flag_xk:": "1f1fd-1f1f0", + ":flag_ye:": "1f1fe-1f1ea", + ":flag_yt:": "1f1fe-1f1f9", + ":flag_za:": "1f1ff-1f1e6", + ":flag_zm:": "1f1ff-1f1f2", + ":flag_zw:": "1f1ff-1f1fc", + ":england:": "1f3f4-e0067-e0062-e0065-e006e-e0067-e007f", + ":scotland:": "1f3f4-e0067-e0062-e0073-e0063-e0074-e007f", + ":wales:": "1f3f4-e0067-e0062-e0077-e006c-e0073-e007f", +} diff --git a/status_sdk/exceptions.py b/status_sdk/exceptions.py index 28c496a..7a6f550 100644 --- a/status_sdk/exceptions.py +++ b/status_sdk/exceptions.py @@ -74,6 +74,13 @@ class InvalidCommunityChannelColourError(ValueError): class InvalidCommunityChannelEmojiError(ValueError): pass +class ChatNotFoundError(Exception): + pass + +class EmojiNotFoundError(Exception): + def __init__(self, shortname: str): + super().__init__(f"Emoji shortcode '{shortname}' does not exist...") + class GroupChatCreationError(Exception): pass diff --git a/status_sdk/group_chat.py b/status_sdk/group_chat.py index 0f76c98..ee65b6b 100644 --- a/status_sdk/group_chat.py +++ b/status_sdk/group_chat.py @@ -84,6 +84,15 @@ def send_image(self, file_path: str, message: Optional[str] = None, reply_to_mes """ return self.__account.send_image(self.id, file_path, message, reply_to_message_id) + def send_emoji_reaction(self, message_id: str, emoji_shortname: str): + """ + Set / unset emoji reaction for a message in the group chat. + + Parameters: + - `message_id` - the `id` of the message, as it appears in `self.get_messages()` + - `emoji_shortname` - the emoji shortname as in Status App, with or without the surrounding colons + """ + self.__account.send_emoji_reaction(message_id, emoji_shortname, self.id) def get_messages(self, start_timestamp: Optional[Union[str, datetime.datetime, datetime.date, pd.Timestamp]] = None, end_timestamp: Optional[Union[str, datetime.datetime, datetime.date, pd.Timestamp]] = None) -> list[dict]: """ diff --git a/status_sdk/models.py b/status_sdk/models.py new file mode 100644 index 0000000..61cefb2 --- /dev/null +++ b/status_sdk/models.py @@ -0,0 +1,99 @@ +from dataclasses import dataclass, field +from typing import Self, Optional +import datetime + +@dataclass +class ContactRequest: + public_key: str + incoming: bool = False + accepted: bool = False + + def __post_init__(self): + if not (self.incoming or self.accepted): + raise ValueError("A ContactRequest must be `incoming` or `accepted`") + +@dataclass +class PaymentRequest: + to_address: str + token_symbol: str + token_address: str + chain_id: int + amount: str + + @classmethod + def from_raw(cls, raw: dict) -> Self: + chain_id, token_address = raw["tokenKey"].split("-") + params = { + "to_address": raw["receiver"], + "token_symbol": raw["symbol"], + "token_address": token_address, + "chain_id": int(chain_id), + "amount": raw["amount"] + } + return cls(**params) + +@dataclass +class Message: + id: str + chat_id: str + content: str + content_type: str + from_public_key: str + timestamp: datetime.datetime + chat_type: str + reply_id: Optional[str] = None + payment_requests: list[PaymentRequest] = field(default_factory=list) + + @classmethod + def from_raw(cls, raw: dict) -> Self: + content_type: int = raw["contentType"] + msg_type: int = raw["messageType"] + params = { + "id": raw["id"], + "chat_id": raw["chatId"], + "from_public_key": raw["from"], + "timestamp": datetime.datetime.fromtimestamp(raw["whisperTimestamp"] / 1_000) + } + + if len(raw["responseTo"]) > 0: + params["reply_id"] = raw["responseTo"] + + if msg_type == 5: + params["chat_type"] = "community" + + elif msg_type == 1: + params["chat_type"] = "private" + + elif msg_type in [2, 3]: + params["chat_type"] = "group" + + # Text & Emojis + if content_type in [1, 4]: + params["content"] = raw["text"] + params["content_type"] = "text" if content_type == 1 else "image" + # Sticker + elif content_type == 2: + params["content"] = raw["sticker"]["url"] + params["content_type"] = "sticker" + # Image + elif content_type == 7: + img_path = raw["image"] + text = raw["text"] + caption = f"{text}\n\n" if len(text) > 0 else "" + params["content"] = f"{caption}{img_path}" + params["content_type"] = "image" + + payments = raw.get("paymentRequests", []) + if payments: + params["payment_requests"] = [ + PaymentRequest.from_raw(payment) + for payment in payments + ] + return cls(**params) + + +@dataclass +class CommunityRequest: + id: str + state: str + public_key: str diff --git a/status_sdk/signal.py b/status_sdk/signal.py index dd2265a..7fefd16 100644 --- a/status_sdk/signal.py +++ b/status_sdk/signal.py @@ -102,13 +102,18 @@ def __listen_message(self, ws: websocket.WebSocketApp, signal: str): Listen continuously for Status Backend signals """ signal: dict = json.loads(signal) - if signal["type"] != self.__signal_type: + + if isinstance(self.__signal_type, str) and self.__signal_type != signal["type"]: + return + + if isinstance(self.__signal_type, list) and signal["type"] not in self.__signal_type: return event: Optional[dict] = signal.get("event", {}) or {} data = { "timestamp": datetime.datetime.fromtimestamp(signal["timestamp"]), "is_error": not isinstance(event.get("error"), type(None)), + "type": signal["type"], "error_message": event.get("error"), "event": event } @@ -124,13 +129,16 @@ def __close_thread(self): if self.__thread.is_alive(): self.__thread.join(1) - def listen(self, signal_type: str): + def listen(self, signal_type: Optional[Union[str, list[str]]] = None): """ Listen for a specific Signal forever Parameters: - `signal_type` - the "type" as it is in Status Backend """ + if isinstance(signal_type, list) and len(signal_type) == 0: + signal_type = None + self.__signal_type = signal_type ws = websocket.WebSocketApp( self.__url,