From 211095352316c190742f2f7e6736a45cea07875e Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Sat, 8 Apr 2023 07:45:39 -0400 Subject: [PATCH 001/101] Modernize dpp::permission - Made value data member public, changed class to struct - Made member functions constexpr and noexcept (except conversion to json) - Added unit tests for it --- include/dpp/permissions.h | 43 +++++++++++++++++++++------------------ src/dpp/permissions.cpp | 12 ----------- src/unittest/test.cpp | 32 +++++++++++++++++++++-------- 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/include/dpp/permissions.h b/include/dpp/permissions.h index a39fbb6bd0..f5fffcbc67 100644 --- a/include/dpp/permissions.h +++ b/include/dpp/permissions.h @@ -82,38 +82,41 @@ enum permissions : uint64_t { using role_permissions = permissions; /** - * @brief Represents a permission bitmask (refer to enum dpp::permissions) which are hold in an uint64_t + * @brief Represents a permission bitmask (refer to enum dpp::permissions) which are held in an uint64_t */ -class DPP_EXPORT permission { -protected: +struct DPP_EXPORT permission { + /** * @brief The permission bitmask value */ - uint64_t value; + uint64_t value{0}; -public: /** - * @brief Construct a permission object - * @param value A permission bitmask + * @brief Default constructor, initializes permission to 0 */ - permission(const uint64_t& value); + constexpr permission() = default; /** - * @brief Construct a permission object - */ - permission(); + * @brief Bitmask constructor, initializes permission to the argument + * @param value The bitmask to initialize the permission to + */ + constexpr permission(uint64_t value) noexcept : value{value} {} /** * @brief For acting like an integer * @return The permission bitmask value */ - operator uint64_t() const; + constexpr operator uint64_t() const noexcept { + return value; + } /** * @brief For acting like an integer * @return A reference to the permission bitmask value */ - operator uint64_t &(); + constexpr operator uint64_t &() noexcept { + return value; + } /** * @brief For building json @@ -136,7 +139,7 @@ class DPP_EXPORT permission { * @return bool True if it has all the given permissions */ template - bool has(T... values) const { + constexpr bool has(T... values) const noexcept { return (value & (0 | ... | values)) == (0 | ... | values); } @@ -155,8 +158,8 @@ class DPP_EXPORT permission { * @return permission& reference to self for chaining */ template - typename std::enable_if<(std::is_convertible::value && ...), permission&>::type - add(T... values) { + std::enable_if_t<(std::is_convertible_v && ...), permission&> + constexpr add(T... values) noexcept { value |= (0 | ... | values); return *this; } @@ -175,8 +178,8 @@ class DPP_EXPORT permission { * @return permission& reference to self for chaining */ template - typename std::enable_if<(std::is_convertible::value && ...), permission&>::type - set(T... values) { + std::enable_if_t<(std::is_convertible_v && ...), permission&> + constexpr set(T... values) noexcept { value = (0 | ... | values); return *this; } @@ -196,8 +199,8 @@ class DPP_EXPORT permission { * @return permission& reference to self for chaining */ template - typename std::enable_if<(std::is_convertible::value && ...), permission&>::type - remove(T... values) { + std::enable_if_t<(std::is_convertible_v && ...), permission&> + constexpr remove(T... values) noexcept { value &= ~(0 | ... | values); return *this; } diff --git a/src/dpp/permissions.cpp b/src/dpp/permissions.cpp index 0623586a79..58eefaa3ce 100644 --- a/src/dpp/permissions.cpp +++ b/src/dpp/permissions.cpp @@ -23,18 +23,6 @@ namespace dpp { -permission::permission(const uint64_t &value) : value(value) {} - -permission::permission() : permission(0) {} - -permission::operator uint64_t() const { - return value; -} - -permission::operator uint64_t &() { - return value; -} - permission::operator nlohmann::json() const { return std::to_string(value); } diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index a75925f857..534eb830f1 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -293,15 +293,29 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b #ifndef _WIN32 success = dpp::snowflake_not_null(&j, "value") == 5120 && success; #endif - p.set(dpp::p_administrator, dpp::p_ban_members); - success = p.has(dpp::p_administrator) && success; - success = p.has(dpp::p_administrator) && p.has(dpp::p_ban_members) && success; - success = p.has(dpp::p_administrator, dpp::p_ban_members) && success; - success = p.has(dpp::p_administrator | dpp::p_ban_members) && success; - - p.set(dpp::p_administrator); - success = ! p.has(dpp::p_administrator, dpp::p_ban_members) && success; // must return false because they're not both set - success = ! p.has(dpp::p_administrator | dpp::p_ban_members) && success; + p.set(0).add(~uint64_t{0}).remove(dpp::p_speak).set(dpp::p_administrator); + success = !p.has(dpp::p_administrator, dpp::p_ban_members) && success; // must return false because they're not both set + success = !p.has(dpp::p_administrator | dpp::p_ban_members) && success; + + constexpr auto constexpr_test = [](dpp::permission p) constexpr noexcept { + bool success{true}; + + p.set(0).add(~uint64_t{0}).remove(dpp::p_speak).set(dpp::p_connect); + p.set(dpp::p_administrator, dpp::p_ban_members); + success = p.has(dpp::p_administrator) && success; + success = p.has(dpp::p_administrator) && p.has(dpp::p_ban_members) && success; + success = p.has(dpp::p_administrator, dpp::p_ban_members) && success; + success = p.has(dpp::p_administrator | dpp::p_ban_members) && success; + success = p.add(dpp::p_speak).has(dpp::p_administrator, dpp::p_speak) && success; + success = !p.remove(dpp::p_speak).has(dpp::p_administrator, dpp::p_speak) && success; + return success; + }; + constexpr auto constexpr_success = constexpr_test({~uint64_t{0}}); + + static_assert(constexpr_success, "dpp::permission constexpr test failed"); + static_assert(noexcept(dpp::permission{}) && noexcept(dpp::permission(dpp::p_speak))); + static_assert(noexcept(p = 0) && noexcept(p = dpp::permission{})); + set_test("PERMISSION_CLASS", success); } From a8b23590f39ef0df6f20c01a7583154aa430ddf4 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Sat, 29 Apr 2023 20:22:03 +0000 Subject: [PATCH 002/101] fix cluster sync definition for threads_get_active and add an error check to the sync generator so we know sooner if its broken --- buildtools/make_struct.php | 10 +++++++ include/dpp/cluster_sync_calls.h | 50 +++++++++++++++++++------------- src/dpp/cluster/user.cpp | 8 ++--- src/dpp/cluster_sync_calls.cpp | 4 +-- 4 files changed, 44 insertions(+), 28 deletions(-) diff --git a/buildtools/make_struct.php b/buildtools/make_struct.php index 61ff1f36c4..78c0fce48e 100644 --- a/buildtools/make_struct.php +++ b/buildtools/make_struct.php @@ -42,6 +42,8 @@ 'message_create' => 'message', 'message_edit' => 'message', 'thread_create_in_forum' => 'thread', + 'threads_get_active' => 'active_threads', + 'user_get_cached' => 'user_identified', ]; /* Get the contents of cluster.h into an array */ @@ -61,8 +63,11 @@ exit(0); } +$lastFunc = ''; +$l = 0; /* Scan every line of the C++ source */ foreach ($clustercpp as $cpp) { + $l++; /* Look for declaration of function body */ if ($state == STATE_SEARCH_FOR_FUNCTION && preg_match('/^\s*void\s+cluster::([^(]+)\s*\((.*)command_completion_event_t\s*callback\s*\)/', $cpp, $matches)) { @@ -111,10 +116,15 @@ $content .= $generator->generateHeaderDef($returnType, $currentFunction, $parameters, $noDefaults, $parameterNames); $cppcontent .= $generator->generateCppDef($returnType, $currentFunction, $parameters, $noDefaults, $parameterNames); } + $lastFunc = $currentFunction; $currentFunction = $parameters = $returnType = ''; $state = STATE_SEARCH_FOR_FUNCTION; } } +if ($state != STATE_SEARCH_FOR_FUNCTION) { + die("\n\n\nBuilding headers is broken ($l) - state machine finished in the middle of function $currentFunction (previous $lastFunc) with parameters $parameters rv $returnType state=$state\n\n\n"); +} + $content .= <<(this, API_PATH "/users", std::to_string(user_id), "", m_get, "", callback); } -}; \ No newline at end of file +}; diff --git a/src/dpp/cluster_sync_calls.cpp b/src/dpp/cluster_sync_calls.cpp index bb44e96f1b..9fff3564ba 100644 --- a/src/dpp/cluster_sync_calls.cpp +++ b/src/dpp/cluster_sync_calls.cpp @@ -541,8 +541,8 @@ confirmation cluster::current_user_leave_thread_sync(snowflake thread_id) { return dpp::sync(this, &cluster::current_user_leave_thread, thread_id); } -thread_map cluster::threads_get_active_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::threads_get_active, guild_id); +active_threads cluster::threads_get_active_sync(snowflake guild_id) { + return dpp::sync(this, &cluster::threads_get_active, guild_id); } thread_map cluster::threads_get_joined_private_archived_sync(snowflake channel_id, snowflake before_id, uint16_t limit) { From 4d9fa8fdb87c3d491f423fb58d92cb9fa6d75d57 Mon Sep 17 00:00:00 2001 From: wizard7377 Date: Sat, 29 Apr 2023 20:51:08 -0400 Subject: [PATCH 003/101] Updated information regarding WSL --- docpages/make_a_bot/windows_vs.md | 2 ++ docpages/make_a_bot/windows_wsl.md | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docpages/make_a_bot/windows_vs.md b/docpages/make_a_bot/windows_vs.md index 535c84774b..c5f2d92864 100644 --- a/docpages/make_a_bot/windows_vs.md +++ b/docpages/make_a_bot/windows_vs.md @@ -18,3 +18,5 @@ To create a basic bot using **Visual Studio 2019** or **Visual Studio 2022**, fo - If you get an error that a dll is missing (e.g. `dpp.dll` or `opus.dll`) when starting your bot, then simply copy all dlls from the **bin** directory of where you extracted the DPP zip file to, into the same directory where your bot's executable is. You only need to do this once. There should be several of these dll files: `dpp.dll`, `zlib.dll`, `openssl.dll` and `libcrypto.dll` (or similarly named SSL related files), `libsodium.dll` and `opus.dll`. Note the template project does this for you, so you should never encounter this issue. - Stuck? You can find us on the [official discord server](https://discord.gg/dpp) - ask away! We don't bite! + +*Note: If you are on windows, it's highly likely that* [*WSL*](/make_a_bot/windows_wsl.md) *is a better option for you.* diff --git a/docpages/make_a_bot/windows_wsl.md b/docpages/make_a_bot/windows_wsl.md index 1ae42e1e83..9d0a51eb0b 100644 --- a/docpages/make_a_bot/windows_wsl.md +++ b/docpages/make_a_bot/windows_wsl.md @@ -10,9 +10,8 @@ This Tutorial will use WSL's default distribution, **Ubuntu**! You might use oth 4. Download the latest build for your Distro using `wget [url here]`. In this guide we will use the latest build for 64 bit Ubuntu: `wget -O libdpp.deb https://dl.dpp.dev/latest` 5. Finally install all required deps and the library using `sudo apt-get install libopus0 && sudo apt-get install -y libopus-dev && sudo apt-get install -y libsodium-dev && sudo dpkg -i libdpp.deb && rm libdpp.deb` 6. Congratulations, you've successfully installed all dependencies! Now comes the real fun: Setting up the environment! For this tutorial we'll use a as small as possible setup, so you might create a more advanced one for production bots. -7. Navigate to a folder of your choice using `cd your/path/here` or create a new directory using `mkdir MyBot && cd MyBot` +7. Navigate to a folder of your choice using `cd your/path/here` or create a new directory using `mkdir your/path/here && cd your/path/here` 8. Now that you've a folder to work in type `> mybot.cxx` to create a file you can work in! -9. Now you can open this file in Visual Studio Code by pressing `CTRL+SHIFT+P` and typing `Remote-WSL: New WSL Window`. This will bring up a new window. In the new window, choose `open folder` and choose the folder you've created prior. Press OK and now you have your Folder opened as a Workspace! -10. Add code to your CXX file and compile it by running `g++ -std=c++17 *.cxx -o bot -ldpp` in the same folder as your cxx file. +9. Simply type in `code .` to have WSL download and run visual studio code automatically +10. Add code to your C++ file and compile it by running `g++ -std=c++17 mybot.cxx -o bot -ldpp` in the same folder as your cxx file. 11. start your bot by typing `./bot`! - From cb710290e7378faf2083523918ed7aafb4a1a2d8 Mon Sep 17 00:00:00 2001 From: wizard7377 Date: Sun, 30 Apr 2023 15:23:34 -0400 Subject: [PATCH 004/101] Fixed for gcc 13.1 --- include/dpp/sslclient.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/dpp/sslclient.h b/include/dpp/sslclient.h index 801f388ff4..02a724cbca 100644 --- a/include/dpp/sslclient.h +++ b/include/dpp/sslclient.h @@ -24,6 +24,7 @@ #include #include #include +#include namespace dpp { From c431fd9da5db954f405ace7d8e16984f3af596b1 Mon Sep 17 00:00:00 2001 From: wizard7377 Date: Sun, 30 Apr 2023 16:55:38 -0400 Subject: [PATCH 005/101] Revert "Fixed for gcc 13.1" This reverts commit cb710290e7378faf2083523918ed7aafb4a1a2d8. --- include/dpp/sslclient.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/dpp/sslclient.h b/include/dpp/sslclient.h index 02a724cbca..801f388ff4 100644 --- a/include/dpp/sslclient.h +++ b/include/dpp/sslclient.h @@ -24,7 +24,6 @@ #include #include #include -#include namespace dpp { From 007c086ac48d53759c6961296c0caef4d6d4009a Mon Sep 17 00:00:00 2001 From: wizard7377 Date: Sun, 30 Apr 2023 16:57:47 -0400 Subject: [PATCH 006/101] Revert "Revert "Fixed for gcc 13.1"" This reverts commit c431fd9da5db954f405ace7d8e16984f3af596b1. --- include/dpp/sslclient.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/dpp/sslclient.h b/include/dpp/sslclient.h index 801f388ff4..02a724cbca 100644 --- a/include/dpp/sslclient.h +++ b/include/dpp/sslclient.h @@ -24,6 +24,7 @@ #include #include #include +#include namespace dpp { From d0e2ff995b464b7e9d63f7cebf53069d5e5b80d4 Mon Sep 17 00:00:00 2001 From: wizard7377 Date: Sun, 30 Apr 2023 17:00:14 -0400 Subject: [PATCH 007/101] Revert "Updated information regarding WSL" This reverts commit 4d9fa8fdb87c3d491f423fb58d92cb9fa6d75d57. --- docpages/make_a_bot/windows_vs.md | 2 -- docpages/make_a_bot/windows_wsl.md | 7 ++++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docpages/make_a_bot/windows_vs.md b/docpages/make_a_bot/windows_vs.md index c5f2d92864..535c84774b 100644 --- a/docpages/make_a_bot/windows_vs.md +++ b/docpages/make_a_bot/windows_vs.md @@ -18,5 +18,3 @@ To create a basic bot using **Visual Studio 2019** or **Visual Studio 2022**, fo - If you get an error that a dll is missing (e.g. `dpp.dll` or `opus.dll`) when starting your bot, then simply copy all dlls from the **bin** directory of where you extracted the DPP zip file to, into the same directory where your bot's executable is. You only need to do this once. There should be several of these dll files: `dpp.dll`, `zlib.dll`, `openssl.dll` and `libcrypto.dll` (or similarly named SSL related files), `libsodium.dll` and `opus.dll`. Note the template project does this for you, so you should never encounter this issue. - Stuck? You can find us on the [official discord server](https://discord.gg/dpp) - ask away! We don't bite! - -*Note: If you are on windows, it's highly likely that* [*WSL*](/make_a_bot/windows_wsl.md) *is a better option for you.* diff --git a/docpages/make_a_bot/windows_wsl.md b/docpages/make_a_bot/windows_wsl.md index 9d0a51eb0b..1ae42e1e83 100644 --- a/docpages/make_a_bot/windows_wsl.md +++ b/docpages/make_a_bot/windows_wsl.md @@ -10,8 +10,9 @@ This Tutorial will use WSL's default distribution, **Ubuntu**! You might use oth 4. Download the latest build for your Distro using `wget [url here]`. In this guide we will use the latest build for 64 bit Ubuntu: `wget -O libdpp.deb https://dl.dpp.dev/latest` 5. Finally install all required deps and the library using `sudo apt-get install libopus0 && sudo apt-get install -y libopus-dev && sudo apt-get install -y libsodium-dev && sudo dpkg -i libdpp.deb && rm libdpp.deb` 6. Congratulations, you've successfully installed all dependencies! Now comes the real fun: Setting up the environment! For this tutorial we'll use a as small as possible setup, so you might create a more advanced one for production bots. -7. Navigate to a folder of your choice using `cd your/path/here` or create a new directory using `mkdir your/path/here && cd your/path/here` +7. Navigate to a folder of your choice using `cd your/path/here` or create a new directory using `mkdir MyBot && cd MyBot` 8. Now that you've a folder to work in type `> mybot.cxx` to create a file you can work in! -9. Simply type in `code .` to have WSL download and run visual studio code automatically -10. Add code to your C++ file and compile it by running `g++ -std=c++17 mybot.cxx -o bot -ldpp` in the same folder as your cxx file. +9. Now you can open this file in Visual Studio Code by pressing `CTRL+SHIFT+P` and typing `Remote-WSL: New WSL Window`. This will bring up a new window. In the new window, choose `open folder` and choose the folder you've created prior. Press OK and now you have your Folder opened as a Workspace! +10. Add code to your CXX file and compile it by running `g++ -std=c++17 *.cxx -o bot -ldpp` in the same folder as your cxx file. 11. start your bot by typing `./bot`! + From 1fd11bdacfb7ccd5aa7e08953855503929270360 Mon Sep 17 00:00:00 2001 From: Phil B Date: Mon, 8 May 2023 19:12:49 +0200 Subject: [PATCH 008/101] test: Added unittests for automod rule creation, fetching and deleting --- src/unittest/test.cpp | 74 +++++++++++++++++++++++++++++++++++++++ src/unittest/unittest.cpp | 5 ++- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 0ba014815f..c78c69bd46 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -614,6 +614,80 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b }); } + set_test("AUTOMOD_RULE_CREATE", false); + set_test("AUTOMOD_RULE_GET", false); + set_test("AUTOMOD_RULE_DELETE", false); + if (!offline) { + /* + * NOTE: This unit test will fail forever when failed once and didn't delete them. + * Because at the next run, it cannot create new ones as you can only have one of the same type per guild + */ + dpp::automod_rule rule1; + rule1.name = "rule1 (spam)"; + rule1.trigger_type = dpp::amod_type_spam; + dpp::automod_action action1; + action1.type = dpp::amod_action_block_message; + action1.custom_message = "your message is suspected of being spam by discord and blocked!"; + rule1.actions.push_back(action1); + + dpp::automod_rule rule2; + rule2.name = "rule2 (keyword)"; + rule2.trigger_type = dpp::amod_type_keyword; + dpp::automod_metadata metadata1; + metadata1.keywords.emplace_back("*cat*"); + metadata1.keywords.emplace_back("train"); + metadata1.keywords.emplace_back("*.exe"); + metadata1.regex_patterns.emplace_back("^[^a-z]$"); + metadata1.allow_list.emplace_back("@silent*"); + rule2.trigger_metadata = metadata1; + dpp::automod_action action2; + action2.type = dpp::amod_action_timeout; + action2.duration_seconds = 6000; + rule2.actions.emplace_back(action2); + + bot.automod_rule_create(TEST_GUILD_ID, rule1, [&bot, rule2](const dpp::confirmation_callback_t &event) { + if (event.is_error()) { + return; + } + auto created1 = event.get(); + bot.automod_rule_create(TEST_GUILD_ID, rule2, [&bot, rule2, created1](const dpp::confirmation_callback_t &event) { + if (event.is_error()) { + return; + } + auto created2 = event.get(); + if (created2.name == rule2.name) { + set_test("AUTOMOD_RULE_CREATE", true); + } + + // get automod rule 2 + bot.automod_rule_get(TEST_GUILD_ID, created2.id, [rule2, &bot, created2, created1](const dpp::confirmation_callback_t &event) { + if (event.is_error()) { + return; + } + auto retrieved = event.get(); + if (retrieved.name == rule2.name && + retrieved.trigger_type == rule2.trigger_type && + retrieved.trigger_metadata.keywords == rule2.trigger_metadata.keywords && + retrieved.trigger_metadata.regex_patterns == rule2.trigger_metadata.regex_patterns && + retrieved.trigger_metadata.allow_list == rule2.trigger_metadata.allow_list) { + set_test("AUTOMOD_RULE_GET", true); + } + + // delete the automod rules + bot.automod_rule_delete(TEST_GUILD_ID, created1.id, [&bot, created2](const dpp::confirmation_callback_t &event) { + if (!event.is_error()) { + bot.automod_rule_delete(TEST_GUILD_ID, created2.id, [](const dpp::confirmation_callback_t &event) { + if (!event.is_error()) { + set_test("AUTOMOD_RULE_DELETE", true); + } + }); + } + }); + }); + }); + }); + } + set_test("USER_GET", false); set_test("USER_GET_FLAGS", false); if (!offline) { diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index ff29c0da20..4e3686d1f1 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -125,6 +125,9 @@ std::map tests = { {"USER_GET_CACHED_ABSENT", {tt_online, "cluster::user_get_cached_sync() with not present member", false, false}}, {"GET_PARAMETER_WITH_SUBCOMMANDS", {tt_offline, "interaction_create_t::get_parameter() with subcommands", false, false}}, {"GET_PARAMETER_WITHOUT_SUBCOMMANDS", {tt_offline, "interaction_create_t::get_parameter() without subcommands", false, false}}, + {"AUTOMOD_RULE_CREATE", {tt_offline, "cluster::automod_rule_create", false, false}}, + {"AUTOMOD_RULE_GET", {tt_offline, "cluster::automod_rule_edit", false, false}}, + {"AUTOMOD_RULE_DELETE", {tt_offline, "cluster::automod_rule_delete", false, false}}, }; double start = dpp::utility::time_f(); @@ -182,7 +185,7 @@ int test_summary() { passed++; } } - std::cout << std::left << std::setw(60) << t.second.description << " " << std::fixed << std::setw(6) << (test_skipped ? "\u001b[33mSKIPPED" : (t.second.executed && t.second.success ? "\u001b[32mPASS" : "\u001b[31mFAIL")) << std::setw(0) << "\u001b[0m\n"; + std::cout << std::left << std::setw(60) << t.second.description << " " << std::fixed << std::setw(6) << (test_skipped ? "\u001b[33mSKIPPED" : (t.second.executed && t.second.success ? "\u001b[32mPASS" : (!t.second.executed ? "\u001b[31mNOT EXECUTED" : "\u001b[31mFAIL"))) << std::setw(0) << "\u001b[0m\n"; } std::cout << "\u001b[37;1m\nExecution finished in " << std::fixed << std::setprecision(3) << get_time() << std::setprecision(0) << " seconds.\nFailed: " << failed << " Passed: " << passed << (skipped ? " Skipped: " : "") << (skipped ? std::to_string(skipped) : "") << " Percentage: " << std::setprecision(2) << ((float)(passed) / (float)(passed + failed) * 100.0f) << "%\u001b[0m\n"; return failed; From dd32a601ae70d3b8fa062ba2950e095f2cd2ebd9 Mon Sep 17 00:00:00 2001 From: Phil B Date: Mon, 8 May 2023 19:19:18 +0200 Subject: [PATCH 009/101] feat: added automod mention raid protection to the trigger metadata class --- include/dpp/automod.h | 5 +++++ src/dpp/automod.cpp | 2 ++ 2 files changed, 7 insertions(+) diff --git a/include/dpp/automod.h b/include/dpp/automod.h index c9df1daa4d..5815c8cdcd 100644 --- a/include/dpp/automod.h +++ b/include/dpp/automod.h @@ -209,6 +209,11 @@ struct DPP_EXPORT automod_metadata : public json_interface { */ uint8_t mention_total_limit; + /** + * @brief Whether to automatically detect mention raids + */ + bool mention_raid_protection_enabled; + /** * @brief Construct a new automod metadata object */ diff --git a/src/dpp/automod.cpp b/src/dpp/automod.cpp index 940ea2471c..c5a924675a 100644 --- a/src/dpp/automod.cpp +++ b/src/dpp/automod.cpp @@ -97,6 +97,7 @@ automod_metadata& automod_metadata::fill_from_json(nlohmann::json* j) { allow_list.push_back(k); } mention_total_limit = int8_not_null(j, "mention_total_limit"); + mention_raid_protection_enabled = bool_not_null(j, "mention_raid_protection_enabled"); return *this; } @@ -119,6 +120,7 @@ std::string automod_metadata::build_json(bool with_id) const { j["allow_list"].push_back(v); } j["mention_total_limit"] = mention_total_limit; + j["mention_raid_protection_enabled"] = mention_raid_protection_enabled; return j.dump(); } From 2d226dd73c3a0ea475d8a3959af5611c8a0487ea Mon Sep 17 00:00:00 2001 From: Phil B Date: Mon, 8 May 2023 19:23:23 +0200 Subject: [PATCH 010/101] feat: added join raid protection guild feature. This bumps the guild flags_extra field from 1 byte to 2 bytes! --- include/dpp/guild.h | 39 +++++++++++++++++++++++++-------------- src/dpp/guild.cpp | 14 ++++++++++++-- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/include/dpp/guild.h b/include/dpp/guild.h index 78d6b9a142..bda4a2fd2d 100644 --- a/include/dpp/guild.h +++ b/include/dpp/guild.h @@ -135,23 +135,25 @@ enum guild_flags : uint32_t { /** * @brief Additional boolean flag values for guild, as guild_flags is full */ -enum guild_flags_extra : uint8_t { +enum guild_flags_extra : uint16_t { /** Guild has premium progress bar enabled */ - g_premium_progress_bar_enabled = 0b00000001, + g_premium_progress_bar_enabled = 0b0000000000000001, /** Guild can have an animated banner (doesn't mean it actually has one though) */ - g_animated_banner = 0b00000010, + g_animated_banner = 0b0000000000000010, /** Guild has auto moderation */ - g_auto_moderation = 0b00000100, + g_auto_moderation = 0b0000000000000100, /** Guild has paused invites, preventing new users from joining */ - g_invites_disabled = 0b00001000, + g_invites_disabled = 0b0000000000001000, /** Guild has been set as support server of an app in the App Directory */ - g_developer_support_server = 0b00010000, + g_developer_support_server = 0b0000000000010000, /** Guild role subscription purchase and renewal notifications are off */ - g_no_role_subscription_notifications = 0b00100000, + g_no_role_subscription_notifications = 0b0000000000100000, /** Guild role subscription sticker reply buttons are off */ - g_no_role_subscription_notification_replies = 0b01000000, + g_no_role_subscription_notification_replies = 0b0000000001000000, /** Guild has role subscriptions that can be purchased */ - g_role_subscriptions_available_for_purchase = 0b10000000, + g_role_subscriptions_available_for_purchase = 0b0000000010000000, + /** Guild has disabled alerts for join raids in the configured safety alerts channel */ + g_raid_alerts_disabled = 0b0000000100000000, }; /** @@ -536,6 +538,9 @@ class DPP_EXPORT guild : public managed, public json_interface { /** Snowflake ID of widget channel, or 0 */ snowflake widget_channel_id; + /** The id of the channel where admins and moderators of Community guilds receive safety alerts from Discord */ + snowflake safety_alerts_channel_id; + /** Approximate member count. May be sent as zero */ uint32_t member_count; @@ -553,6 +558,11 @@ class DPP_EXPORT guild : public managed, public json_interface { */ uint32_t max_members; + /** + * @brief Additional flags (values from dpp::guild_flags_extra) + */ + uint16_t flags_extra; + /** Shard ID of the guild */ uint16_t shard_id; @@ -585,11 +595,6 @@ class DPP_EXPORT guild : public managed, public json_interface { */ guild_nsfw_level_t nsfw_level; - /** - * @brief Additional flags - */ - uint8_t flags_extra; - /** Default constructor, zeroes all values */ guild(); @@ -846,6 +851,12 @@ class DPP_EXPORT guild : public managed, public json_interface { */ bool has_role_subscriptions_available_for_purchase() const; + /** + * @brief Guild has disabled alerts for join raids in the configured safety alerts channel + * @return bool dpp::g_raid_alerts_disabled flag is set + */ + bool has_raid_alerts_disabled() const; + /** * @brief Guild has access to set an animated guild icon * @return bool can have animated icon diff --git a/src/dpp/guild.cpp b/src/dpp/guild.cpp index 91a421ec43..2985b706c6 100644 --- a/src/dpp/guild.cpp +++ b/src/dpp/guild.cpp @@ -49,6 +49,7 @@ const std::mapflags_extra & g_role_subscriptions_available_for_purchase; } +bool guild::has_raid_alerts_disabled() const { + return this->flags_extra & g_raid_alerts_disabled; +} + bool guild::has_animated_icon() const { return this->flags & g_animated_icon; } @@ -426,6 +431,9 @@ std::string guild::build_json(bool with_id) const { if (!description.empty()) { j["description"] = description; } + if (!safety_alerts_channel_id.empty()) { + j["safety_alerts_channel_id"] = safety_alerts_channel_id; + } return j.dump(); } @@ -572,6 +580,8 @@ guild& guild::fill_from_json(discord_client* shard, nlohmann::json* d) { welcome_screen.welcome_channels.emplace_back(wchan); } } + + set_snowflake_not_null(d, "safety_alerts_channel_id", this->safety_alerts_channel_id); } else { this->flags |= dpp::g_unavailable; From 1953b1328a515d44671509e38676560a52ffb1d4 Mon Sep 17 00:00:00 2001 From: Phil B Date: Tue, 9 May 2023 18:33:21 +0200 Subject: [PATCH 011/101] misc: updated some docs & command option min_length and max_length parsing --- include/dpp/appcommand.h | 20 +++++++++++--------- include/dpp/automod.h | 12 ++++++------ src/dpp/slashcommand.cpp | 39 +++++++++++++++++++-------------------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/include/dpp/appcommand.h b/include/dpp/appcommand.h index 36a14c96d4..22ecf2d257 100644 --- a/include/dpp/appcommand.h +++ b/include/dpp/appcommand.h @@ -139,7 +139,8 @@ struct DPP_EXPORT command_option_choice : public json_interface command_option_range; @@ -162,8 +163,9 @@ struct DPP_EXPORT command_option : public json_interface { bool autocomplete; //!< True if this option supports auto completion std::vector options; //!< Sub-commands std::vector channel_types; //!< Allowed channel types for channel snowflake id options - command_option_range min_value; //!< Minimum value allowed, for co_number and co_integer types only - command_option_range max_value; //!< Maximum value allowed, for co_number and co_integer types only + // Combines the `min_length` and `max_length` field by storing its value in the int64_t of the command_option_range + command_option_range min_value; //!< Minimum value/length that can be entered, for dpp::co_number, dpp::co_integer and dpp::co_string types only + command_option_range max_value; //!< Maximum value/length that can be entered, for dpp::co_number, dpp::co_integer and dpp::co_string types only std::map name_localizations; //!< Localisations of command name std::map description_localizations; //!< Localisations of command description @@ -209,7 +211,7 @@ struct DPP_EXPORT command_option : public json_interface { /** * @brief Set the minimum numeric value of the option. - * Only valid if the type is co_number or co_integer. + * Only valid if the type is dpp::co_number or dpp::co_integer. * @param min_v Minimum value * @return command_option& returns a reference to self for chaining of calls */ @@ -217,23 +219,23 @@ struct DPP_EXPORT command_option : public json_interface { /** * @brief Set the maximum numeric value of the option. - * Only valid if the type is co_number or co_integer. + * Only valid if the type is dpp::co_number or dpp::co_integer. * @param max_v Maximum value * @return command_option& returns a reference to self for chaining of calls */ command_option& set_max_value(command_option_range max_v); /** - * @brief Set the minimum string length of the option. - * Only valid if the type is co_string + * @brief Set the minimum string length of the option. Must be between 0 and 6000 (inclusive). + * Only valid if the type is dpp::co_string * @param min_v Minimum value * @return command_option& returns a reference to self for chaining of calls */ command_option& set_min_length(command_option_range min_v); /** - * @brief Set the maximum string length of the option. - * Only valid if the type is co_string + * @brief Set the maximum string length of the option. Must be between 1 and 6000 (inclusive). + * Only valid if the type is dpp::co_string * @param max_v Maximum value * @return command_option& returns a reference to self for chaining of calls */ diff --git a/include/dpp/automod.h b/include/dpp/automod.h index c9df1daa4d..53250c2985 100644 --- a/include/dpp/automod.h +++ b/include/dpp/automod.h @@ -82,7 +82,7 @@ enum automod_event_type : uint8_t { */ enum automod_trigger_type : uint8_t { /** - * @brief Check if content contains words from a user defined list of keywords + * @brief Check if content contains words from a user defined list of keywords (max 6 of this type per guild) */ amod_type_keyword = 1, /** @@ -91,21 +91,21 @@ enum automod_trigger_type : uint8_t { */ amod_type_harmful_link = 2, /** - * @brief Check if content represents generic spam + * @brief Check if content represents generic spam (max 1 of this type per guild) */ amod_type_spam = 3, /** - * @brief Check if content contains words from discord pre-defined wordsets + * @brief Check if content contains words from discord pre-defined wordsets (max 1 of this type per guild) */ amod_type_keyword_preset = 4, /** - * @brief Check if content contains more mentions than allowed + * @brief Check if content contains more mentions than allowed (max 1 of this type per guild) */ amod_type_mention_spam = 5, }; /** - * @brief Metadata associated with an automod action + * @brief Metadata associated with an automod action. Different fields are relevant based on the value of dpp::automod_rule::trigger_type. */ struct DPP_EXPORT automod_metadata : public json_interface { /** @@ -164,7 +164,7 @@ struct DPP_EXPORT automod_metadata : public json_interface { std::vector presets; /** - * @brief Substrings which should not trigger the rule. + * @brief Substrings which should not trigger the rule (Maximum of 100 for the trigger type dpp::amod_type_keyword, Maximum of 1000 for the trigger type dpp::amod_type_keyword_preset). * * Each keyword can be a phrase which contains multiple words. * All keywords are case insensitive and can be up to 60 characters. diff --git a/src/dpp/slashcommand.cpp b/src/dpp/slashcommand.cpp index 70a1f5ba09..79b9c7b7d4 100644 --- a/src/dpp/slashcommand.cpp +++ b/src/dpp/slashcommand.cpp @@ -141,19 +141,26 @@ void to_json(json& j, const command_option& opt) { } /* Check for minimum and maximum values */ - if (opt.type == dpp::co_number || opt.type == dpp::co_integer || opt.type == dpp::co_string) { - std::string key = (opt.type == dpp::co_string) ? "_length" : "_value"; - /* Min */ + if (opt.type == dpp::co_string) { + if (std::holds_alternative(opt.min_value)) { + j["min_length"] = std::get(opt.min_value); + } + if (std::holds_alternative(opt.max_value)) { + j["max_length"] = std::get(opt.max_value); + } + } else if (opt.type == dpp::co_integer) { + if (std::holds_alternative(opt.min_value)) { + j["min_value"] = std::get(opt.min_value); + } + if (std::holds_alternative(opt.max_value)) { + j["max_value"] = std::get(opt.max_value); + } + } else if (opt.type == dpp::co_number) { if (std::holds_alternative(opt.min_value)) { - j["min" + key] = std::get(opt.min_value); - } else if (std::holds_alternative(opt.min_value)) { - j["min" + key] = std::get(opt.min_value); + j["min_value"] = std::get(opt.min_value); } - /* Max */ if (std::holds_alternative(opt.max_value)) { - j["max" + key] = std::to_string(std::get(opt.max_value)); - } else if (std::holds_alternative(opt.max_value)) { - j["max" + key] = std::get(opt.max_value); + j["max_value"] = std::get(opt.max_value); } } @@ -414,18 +421,10 @@ command_option &command_option::fill_from_json(nlohmann::json *j) { } } if (j->contains("min_length")) { - if ((*j)["min_length"].is_number_integer()) { - o.min_value.emplace(int64_not_null(j, "min_length")); - } else if ((*j)["min_length"].is_number()) { - o.min_value.emplace(double_not_null(j, "min_length")); - } + o.min_value.emplace(int32_not_null(j, "min_length")); } if (j->contains("max_length")) { - if ((*j)["max_length"].is_number_integer()) { - o.max_value.emplace(int64_not_null(j, "max_length")); - } else if ((*j)["max_length"].is_number()) { - o.max_value.emplace(double_not_null(j, "max_length")); - } + o.max_value.emplace(int32_not_null(j, "max_length")); } o.autocomplete = bool_not_null(j, "autocomplete"); }; From b298609ba67178a3a1bec2008f31bb6299fc0c8b Mon Sep 17 00:00:00 2001 From: Phil B Date: Tue, 9 May 2023 19:49:09 +0200 Subject: [PATCH 012/101] fixed bug in automod parsing that caused the actions being empty when fetching an automod rule --- src/dpp/automod.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dpp/automod.cpp b/src/dpp/automod.cpp index 940ea2471c..1380ff6f17 100644 --- a/src/dpp/automod.cpp +++ b/src/dpp/automod.cpp @@ -142,7 +142,7 @@ automod_rule& automod_rule::fill_from_json(nlohmann::json* j) { enabled = bool_not_null(j, "enabled"); exempt_roles.clear(); exempt_channels.clear(); - for (auto k : (*j)["automod_actions"]) { + for (auto k : (*j)["actions"]) { actions.push_back(automod_action().fill_from_json(&k)); } for (auto k : (*j)["exempt_roles"]) { From 4d20869ad989f6078f90ce40dc6bad620446dc53 Mon Sep 17 00:00:00 2001 From: Phil B Date: Tue, 9 May 2023 19:49:56 +0200 Subject: [PATCH 013/101] test: updated unit test for automod --- src/unittest/test.cpp | 92 ++++++++++++++++++--------------------- src/unittest/unittest.cpp | 7 +-- 2 files changed, 47 insertions(+), 52 deletions(-) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index c78c69bd46..4111a42b66 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -616,74 +616,68 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("AUTOMOD_RULE_CREATE", false); set_test("AUTOMOD_RULE_GET", false); + set_test("AUTOMOD_RULE_GET_ALL", false); set_test("AUTOMOD_RULE_DELETE", false); if (!offline) { - /* - * NOTE: This unit test will fail forever when failed once and didn't delete them. - * Because at the next run, it cannot create new ones as you can only have one of the same type per guild - */ - dpp::automod_rule rule1; - rule1.name = "rule1 (spam)"; - rule1.trigger_type = dpp::amod_type_spam; - dpp::automod_action action1; - action1.type = dpp::amod_action_block_message; - action1.custom_message = "your message is suspected of being spam by discord and blocked!"; - rule1.actions.push_back(action1); - - dpp::automod_rule rule2; - rule2.name = "rule2 (keyword)"; - rule2.trigger_type = dpp::amod_type_keyword; + dpp::automod_rule automodRule; + automodRule.name = "automod rule (keyword type)"; + automodRule.trigger_type = dpp::amod_type_keyword; dpp::automod_metadata metadata1; metadata1.keywords.emplace_back("*cat*"); metadata1.keywords.emplace_back("train"); metadata1.keywords.emplace_back("*.exe"); metadata1.regex_patterns.emplace_back("^[^a-z]$"); metadata1.allow_list.emplace_back("@silent*"); - rule2.trigger_metadata = metadata1; - dpp::automod_action action2; - action2.type = dpp::amod_action_timeout; - action2.duration_seconds = 6000; - rule2.actions.emplace_back(action2); + automodRule.trigger_metadata = metadata1; + dpp::automod_action automodAction; + automodAction.type = dpp::amod_action_timeout; + automodAction.duration_seconds = 6000; + automodRule.actions.emplace_back(automodAction); - bot.automod_rule_create(TEST_GUILD_ID, rule1, [&bot, rule2](const dpp::confirmation_callback_t &event) { + bot.automod_rules_get(TEST_GUILD_ID, [&bot, automodRule](const dpp::confirmation_callback_t &event) { if (event.is_error()) { return; } - auto created1 = event.get(); - bot.automod_rule_create(TEST_GUILD_ID, rule2, [&bot, rule2, created1](const dpp::confirmation_callback_t &event) { + auto rules = event.get(); + set_test("AUTOMOD_RULE_GET_ALL", true); + for (const auto &rule: rules) { + if (rule.second.trigger_type == dpp::amod_type_keyword) { + // delete one automod rule of type KEYWORD before creating one to make space... + bot.automod_rule_delete(TEST_GUILD_ID, rule.first); + } + } + + // start creating the automod rules + bot.automod_rule_create(TEST_GUILD_ID, automodRule, [&bot, automodRule](const dpp::confirmation_callback_t &event) { + if (event.is_error()) { + return; + } + auto created = event.get(); + if (created.name == automodRule.name) { + set_test("AUTOMOD_RULE_CREATE", true); + } + + // get automod rule + bot.automod_rule_get(TEST_GUILD_ID, created.id, [automodRule, &bot, created](const dpp::confirmation_callback_t &event) { if (event.is_error()) { return; } - auto created2 = event.get(); - if (created2.name == rule2.name) { - set_test("AUTOMOD_RULE_CREATE", true); + auto retrieved = event.get(); + if (retrieved.name == automodRule.name && + retrieved.trigger_type == automodRule.trigger_type && + retrieved.trigger_metadata.keywords == automodRule.trigger_metadata.keywords && + retrieved.trigger_metadata.regex_patterns == automodRule.trigger_metadata.regex_patterns && + retrieved.trigger_metadata.allow_list == automodRule.trigger_metadata.allow_list && retrieved.actions.size() == automodRule.actions.size()) { + set_test("AUTOMOD_RULE_GET", true); } - // get automod rule 2 - bot.automod_rule_get(TEST_GUILD_ID, created2.id, [rule2, &bot, created2, created1](const dpp::confirmation_callback_t &event) { - if (event.is_error()) { - return; - } - auto retrieved = event.get(); - if (retrieved.name == rule2.name && - retrieved.trigger_type == rule2.trigger_type && - retrieved.trigger_metadata.keywords == rule2.trigger_metadata.keywords && - retrieved.trigger_metadata.regex_patterns == rule2.trigger_metadata.regex_patterns && - retrieved.trigger_metadata.allow_list == rule2.trigger_metadata.allow_list) { - set_test("AUTOMOD_RULE_GET", true); + // delete the automod rule + bot.automod_rule_delete(TEST_GUILD_ID, retrieved.id, [](const dpp::confirmation_callback_t &event) { + if (!event.is_error()) { + set_test("AUTOMOD_RULE_DELETE", true); } - - // delete the automod rules - bot.automod_rule_delete(TEST_GUILD_ID, created1.id, [&bot, created2](const dpp::confirmation_callback_t &event) { - if (!event.is_error()) { - bot.automod_rule_delete(TEST_GUILD_ID, created2.id, [](const dpp::confirmation_callback_t &event) { - if (!event.is_error()) { - set_test("AUTOMOD_RULE_DELETE", true); - } - }); - } - }); }); + }); }); }); } diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index 4e3686d1f1..bede7478bd 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -125,9 +125,10 @@ std::map tests = { {"USER_GET_CACHED_ABSENT", {tt_online, "cluster::user_get_cached_sync() with not present member", false, false}}, {"GET_PARAMETER_WITH_SUBCOMMANDS", {tt_offline, "interaction_create_t::get_parameter() with subcommands", false, false}}, {"GET_PARAMETER_WITHOUT_SUBCOMMANDS", {tt_offline, "interaction_create_t::get_parameter() without subcommands", false, false}}, - {"AUTOMOD_RULE_CREATE", {tt_offline, "cluster::automod_rule_create", false, false}}, - {"AUTOMOD_RULE_GET", {tt_offline, "cluster::automod_rule_edit", false, false}}, - {"AUTOMOD_RULE_DELETE", {tt_offline, "cluster::automod_rule_delete", false, false}}, + {"AUTOMOD_RULE_CREATE", {tt_online, "cluster::automod_rule_create", false, false}}, + {"AUTOMOD_RULE_GET", {tt_online, "cluster::automod_rule_get", false, false}}, + {"AUTOMOD_RULE_GET_ALL", {tt_online, "cluster::automod_rules_get", false, false}}, + {"AUTOMOD_RULE_DELETE", {tt_online, "cluster::automod_rule_delete", false, false}}, }; double start = dpp::utility::time_f(); From 4b2bdb5ec7b07cb93e8334e678c664edc696bdf4 Mon Sep 17 00:00:00 2001 From: Phil B Date: Tue, 9 May 2023 21:30:30 +0200 Subject: [PATCH 014/101] docs: added link to all events pointing to the discord documentation's gateway events --- include/dpp/cluster.h | 60 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index dede0f3d53..42c5f88cf3 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -408,6 +408,7 @@ class DPP_EXPORT cluster { /** * @brief on voice state update event * + * @see https://discord.com/developers/docs/topics/gateway-events#voice-state-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type voice_state_update_t&, and returns void. */ @@ -458,6 +459,7 @@ class DPP_EXPORT cluster { * Interactions are created by discord when commands you have registered are issued * by a user. For an example of this in action please see \ref slashcommands * + * @see https://discord.com/developers/docs/topics/gateway-events#interaction-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type interaction_create_t&, and returns void. * @@ -542,6 +544,7 @@ class DPP_EXPORT cluster { * explicitly with dpp::cluster::guild_delete, or via the guild being unavailable due to * an outage. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_delete_t&, and returns void. */ @@ -554,6 +557,7 @@ class DPP_EXPORT cluster { * channel should not be retained long-term as they will be deleted by the garbage * collector. * + * @see https://discord.com/developers/docs/topics/gateway-events#channel-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type channel_delete_t&, and returns void. */ @@ -565,6 +569,7 @@ class DPP_EXPORT cluster { * The new channel details have already been applied to the guild when you * receive this event. * + * @see https://discord.com/developers/docs/topics/gateway-events#channel-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type channel_update_t&, and returns void. */ @@ -575,6 +580,7 @@ class DPP_EXPORT cluster { * @brief Called when a shard is connected and ready. * A set of cluster::on_guild_create events will follow this event. * + * @see https://discord.com/developers/docs/topics/gateway-events#ready * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type ready_t&, and returns void. */ @@ -586,6 +592,7 @@ class DPP_EXPORT cluster { * The message has already been deleted from Discord when you * receive this event. * + * @see https://discord.com/developers/docs/topics/gateway-events#message-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type message_delete_t&, and returns void. */ @@ -595,6 +602,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a user leaves a guild (either through being kicked, or choosing to leave) * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-member-remove * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_member_remove_t&, and returns void. */ @@ -606,6 +614,7 @@ class DPP_EXPORT cluster { * A resumed session does not need to re-synchronise guilds, members, etc. * This is generally non-fatal and informational only. * + * @see https://discord.com/developers/docs/topics/gateway-events#resumed * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type resumed_t&, and returns void. */ @@ -615,6 +624,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a new role is created on a guild. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-role-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_role_create_t&, and returns void. */ @@ -624,6 +634,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a user is typing on a channel. * + * @see https://discord.com/developers/docs/topics/gateway-events#typing-start * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type typing_start_t&, and returns void. */ @@ -633,6 +644,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a new reaction is added to a message. * + * @see https://discord.com/developers/docs/topics/gateway-events#message-reaction-add * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type message_reaction_add_t&, and returns void. */ @@ -644,6 +656,7 @@ class DPP_EXPORT cluster { * D++ will request these for all new guilds if needed, after the cluster::on_guild_create * events. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-members-chunk * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_members_chunk_t&, and returns void. */ @@ -653,6 +666,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a single reaction is removed from a message. * + * @see https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type message_reaction_remove_t&, and returns void. */ @@ -663,6 +677,7 @@ class DPP_EXPORT cluster { * @brief Called when a new guild is created. * D++ will request members for the guild for its cache using guild_members_chunk. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_create_t&, and returns void. */ @@ -672,6 +687,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a new channel is created on a guild. * + * @see https://discord.com/developers/docs/topics/gateway-events#channel-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type channel_create_t&, and returns void. */ @@ -681,6 +697,7 @@ class DPP_EXPORT cluster { /** * @brief Called when all reactions for a particular emoji are removed from a message. * + * @see https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove-emoji * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type message_reaction_remove_emoji_t&, and returns void. */ @@ -690,6 +707,7 @@ class DPP_EXPORT cluster { /** * @brief Called when multiple messages are deleted from a channel or DM. * + * @see https://discord.com/developers/docs/topics/gateway-events#message-delete-bulk * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type message_delete_bulk_t&, and returns void. */ @@ -699,6 +717,7 @@ class DPP_EXPORT cluster { /** * @brief Called when an existing role is updated on a guild. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-role-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_role_update_t&, and returns void. */ @@ -708,6 +727,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a role is deleted in a guild. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-role-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_role_delete_t&, and returns void. */ @@ -719,6 +739,7 @@ class DPP_EXPORT cluster { * Note that the pinned message is not returned to this event, just the timestamp * of the last pinned message. * + * @see https://discord.com/developers/docs/topics/gateway-events#channel-pins-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type channel_pins_update_t&, and returns void. */ @@ -728,6 +749,7 @@ class DPP_EXPORT cluster { /** * @brief Called when all reactions are removed from a message. * + * @see https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove-all * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type message_reaction_remove_all_t&, and returns void. */ @@ -749,6 +771,7 @@ class DPP_EXPORT cluster { * @brief Called when new emojis are added to a guild. * The complete set of emojis is sent every time. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-emojis-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_emojis_update_t&, and returns void. */ @@ -759,6 +782,7 @@ class DPP_EXPORT cluster { * @brief Called when new stickers are added to a guild. * The complete set of stickers is sent every time. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-stickers-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_stickers_update_t&, and returns void. */ @@ -772,6 +796,7 @@ class DPP_EXPORT cluster { * increase your bot's CPU usage. If you don't need them it is recommended to not ask * for them. * + * @see https://discord.com/developers/docs/topics/gateway-events#presence-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type presence_update_t&, and returns void. */ @@ -781,6 +806,7 @@ class DPP_EXPORT cluster { /** * @brief Called when the webhooks for a guild are updated. * + * @see https://discord.com/developers/docs/topics/gateway-events#webhooks-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type webhooks_update_t&, and returns void. */ @@ -789,6 +815,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a new automod rule is created. * + * @see https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type automod_rule_create_t&, and returns void. */ @@ -798,6 +825,7 @@ class DPP_EXPORT cluster { /** * @brief Called when an automod rule is updated. * + * @see https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type automod_rule_update_t&, and returns void. */ @@ -806,6 +834,7 @@ class DPP_EXPORT cluster { /** * @brief Called when an automod rule is deleted. * + * @see https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type automod_rule_delete_t&, and returns void. */ @@ -814,6 +843,7 @@ class DPP_EXPORT cluster { /** * @brief Called when an automod rule is triggered/executed. * + * @see https://discord.com/developers/docs/topics/gateway-events#auto-moderation-action-execution * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type automod_rule_execute_t&, and returns void. */ @@ -822,6 +852,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a new member joins a guild. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-member-add * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_member_add_t&, and returns void. */ @@ -831,6 +862,7 @@ class DPP_EXPORT cluster { /** * @brief Called when an invite is deleted from a guild. * + * @see https://discord.com/developers/docs/topics/gateway-events#invite-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type invite_delete_t&, and returns void. */ @@ -840,6 +872,7 @@ class DPP_EXPORT cluster { /** * @brief Called when details of a guild are updated. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_update_t&, and returns void. */ @@ -852,6 +885,7 @@ class DPP_EXPORT cluster { * An integration is a connection to a guild of a user's associated accounts, * e.g. youtube or twitch, for automatic assignment of roles etc. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-integrations-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_integrations_update_t&, and returns void. */ @@ -861,6 +895,7 @@ class DPP_EXPORT cluster { /** * @brief Called when details of a guild member (e.g. their roles or nickname) are updated. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-member-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_member_update_t&, and returns void. */ @@ -870,6 +905,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a new invite is created for a guild. * + * @see https://discord.com/developers/docs/topics/gateway-events#invite-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type invite_create_t&, and returns void. */ @@ -879,6 +915,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a message is updated (edited). * + * @see https://discord.com/developers/docs/topics/gateway-events#message-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type message_update_t&, and returns void. */ @@ -890,6 +927,7 @@ class DPP_EXPORT cluster { * This is separate to cluster::on_guild_member_update and includes things such as an avatar change, * username change, discriminator change or change in subscription status for nitro. * + * @see https://discord.com/developers/docs/topics/gateway-events#user-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type user_update_t&, and returns void. */ @@ -903,6 +941,7 @@ class DPP_EXPORT cluster { * the roadmap to be supported as it consumes excessive amounts of RAM. * For an example for caching of messages, please see \ref caching-messages * + * @see https://discord.com/developers/docs/topics/gateway-events#message-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type message_create_t&, and returns void. */ @@ -912,6 +951,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a ban is added to a guild. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-ban-add * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_ban_add_t&, and returns void. */ @@ -921,6 +961,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a ban is removed from a guild. * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-ban-remove * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_ban_remove_t&, and returns void. */ @@ -932,6 +973,7 @@ class DPP_EXPORT cluster { * An integration is a connection to a guild of a user's associated accounts, * e.g. youtube or twitch, for automatic assignment of roles etc. * + * @see https://discord.com/developers/docs/topics/gateway-events#integration-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type integration_create_t&, and returns void. */ @@ -944,6 +986,7 @@ class DPP_EXPORT cluster { * An integration is a connection to a guild of a user's associated accounts, * e.g. youtube or twitch, for automatic assignment of roles etc. * + * @see https://discord.com/developers/docs/topics/gateway-events#integration-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type integration_update_t&, and returns void. */ @@ -955,6 +998,7 @@ class DPP_EXPORT cluster { * An integration is a connection to a guild of a user's associated accounts, * e.g. youtube or twitch, for automatic assignment of roles etc. * + * @see https://discord.com/developers/docs/topics/gateway-events#integration-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type integration_delete_t&, and returns void. */ @@ -965,6 +1009,7 @@ class DPP_EXPORT cluster { * @brief Called when a thread is created. * Note that threads are not cached by D++, but a list of thread IDs is accessible in a guild object * + * @see https://discord.com/developers/docs/topics/gateway-events#thread-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type thread_create_t&, and returns void. */ @@ -974,6 +1019,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a thread is updated * + * @see https://discord.com/developers/docs/topics/gateway-events#thread-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type thread_update_t&, and returns void. */ @@ -983,6 +1029,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a thread is deleted * + * @see https://discord.com/developers/docs/topics/gateway-events#thread-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type thread_delete_t&, and returns void. */ @@ -993,6 +1040,7 @@ class DPP_EXPORT cluster { * @brief Called when thread list is synced (upon gaining access to a channel). * Note that threads are not cached by D++, but a list of thread IDs is accessible in a guild object * + * @see https://discord.com/developers/docs/topics/gateway-events#thread-list-sync * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type thread_list_sync_t&, and returns void. */ @@ -1002,6 +1050,7 @@ class DPP_EXPORT cluster { /** * @brief Called when current user's thread member object is updated * + * @see https://discord.com/developers/docs/topics/gateway-events#thread-member-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type thread_member_update_t&, and returns void. */ @@ -1011,6 +1060,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a thread's member list is updated (without GUILD_MEMBERS intent, is only called for current user) * + * @see https://discord.com/developers/docs/topics/gateway-events#thread-members-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type thread_members_update_t&, and returns void. */ @@ -1020,6 +1070,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a new scheduled event is created * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_scheduled_event_create_t&, and returns void. */ @@ -1029,6 +1080,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a new scheduled event is updated * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_scheduled_event_update_t&, and returns void. */ @@ -1038,6 +1090,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a new scheduled event is deleted * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_scheduled_event_delete_t&, and returns void. */ @@ -1047,6 +1100,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a user is added to a scheduled event * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-user-add * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_scheduled_event_user_add_t&, and returns void. */ @@ -1056,6 +1110,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a user is removed to a scheduled event * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-user-remove * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type guild_scheduled_event_user_remove_t&, and returns void. */ @@ -1134,8 +1189,9 @@ class DPP_EXPORT cluster { /** * @brief Called when a new stage instance is created on a stage channel. * + * @see https://discord.com/developers/docs/topics/gateway-events#stage-instance-create * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. - * + * The function signature for this event takes a single `const` reference of type stage_instance_create_t&, and returns void. */ event_router_t on_stage_instance_create; @@ -1143,6 +1199,7 @@ class DPP_EXPORT cluster { /** * @brief Called when a stage instance is updated. * + * @see https://discord.com/developers/docs/topics/gateway-events#stage-instance-update * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type stage_instance_update_t&, and returns void. */ @@ -1152,6 +1209,7 @@ class DPP_EXPORT cluster { /** * @brief Called when an existing stage instance is deleted from a stage channel. * + * @see https://discord.com/developers/docs/topics/gateway-events#stage-instance-delete * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. * The function signature for this event takes a single `const` reference of type stage_instance_delete_t&, and returns void. */ From 17d976d6d27fe7fce9280f233e31277a557f646a Mon Sep 17 00:00:00 2001 From: Norbert Schmitz Date: Wed, 10 May 2023 13:07:15 +0200 Subject: [PATCH 015/101] added explicit casting to avoid warnings --- include/dpp/stringops.h | 4 ++-- src/dpp/discordvoiceclient.cpp | 4 ++-- src/dpp/sslclient.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/dpp/stringops.h b/include/dpp/stringops.h index 856ff30103..bdab70bdef 100644 --- a/include/dpp/stringops.h +++ b/include/dpp/stringops.h @@ -165,7 +165,7 @@ template uint64_t from_string(const std::string &s) */ template uint32_t from_string(const std::string &s) { - return std::stoul(s, 0, 10); + return (uint32_t) std::stoul(s, 0, 10); } /** @@ -205,7 +205,7 @@ template std::string to_hex(T i) template std::string leading_zeroes(T i, size_t width) { std::stringstream stream; - stream << std::setfill('0') << std::setw(width) << std::dec << i; + stream << std::setfill('0') << std::setw((int)width) << std::dec << i; return stream.str(); } diff --git a/src/dpp/discordvoiceclient.cpp b/src/dpp/discordvoiceclient.cpp index 7e1308b264..7d9ff7ccc5 100644 --- a/src/dpp/discordvoiceclient.cpp +++ b/src/dpp/discordvoiceclient.cpp @@ -398,12 +398,12 @@ int discord_voice_client::udp_send(const char* data, size_t length) servaddr.sin_family = AF_INET; servaddr.sin_port = htons(this->port); servaddr.sin_addr.s_addr = inet_addr(this->ip.c_str()); - return sendto(this->fd, data, (int)length, 0, (const sockaddr*)&servaddr, (int)sizeof(sockaddr_in)); + return (int) sendto(this->fd, data, (int)length, 0, (const sockaddr*)&servaddr, (int)sizeof(sockaddr_in)); } int discord_voice_client::udp_recv(char* data, size_t max_length) { - return recv(this->fd, data, (int)max_length, 0); + return (int) recv(this->fd, data, (int)max_length, 0); } bool discord_voice_client::handle_frame(const std::string &data) diff --git a/src/dpp/sslclient.cpp b/src/dpp/sslclient.cpp index 54069681ac..95789f0720 100644 --- a/src/dpp/sslclient.cpp +++ b/src/dpp/sslclient.cpp @@ -480,7 +480,7 @@ void ssl_client::read_loop() if (plaintext) { read_blocked_on_write = false; read_blocked = false; - r = ::recv(sfd, server_to_client_buffer, DPP_BUFSIZE, 0); + r = (int) ::recv(sfd, server_to_client_buffer, DPP_BUFSIZE, 0); if (r <= 0) { /* error or EOF */ return; @@ -551,7 +551,7 @@ void ssl_client::read_loop() /* Try to write */ if (plaintext) { - r = ::send(sfd, client_to_server_buffer + client_to_server_offset, (int)client_to_server_length, 0); + r = (int) ::send(sfd, client_to_server_buffer + client_to_server_offset, (int)client_to_server_length, 0); if (r < 0) { /* Write error */ From 31d7c6e8210181f4ba4d113172ea553025dc01b4 Mon Sep 17 00:00:00 2001 From: Phil B Date: Wed, 10 May 2023 21:07:05 +0200 Subject: [PATCH 016/101] feat: added on_guild_audit_log_entry_create gateway event --- include/dpp/auditlog.h | 14 +++- include/dpp/cluster.h | 8 ++ include/dpp/dispatcher.h | 14 ++++ include/dpp/event.h | 3 + src/dpp/auditlog.cpp | 80 ++++++++++--------- src/dpp/discordevents.cpp | 2 +- src/dpp/dispatcher.cpp | 1 + .../events/guild_audit_log_entry_create.cpp | 49 ++++++++++++ 8 files changed, 132 insertions(+), 39 deletions(-) create mode 100644 src/dpp/events/guild_audit_log_entry_create.cpp diff --git a/include/dpp/auditlog.h b/include/dpp/auditlog.h index 25252a3fb8..c9f0a09a42 100644 --- a/include/dpp/auditlog.h +++ b/include/dpp/auditlog.h @@ -177,7 +177,7 @@ struct DPP_EXPORT audit_extra { /** * @brief An individual audit log entry */ -struct DPP_EXPORT audit_entry { +struct DPP_EXPORT audit_entry : public json_interface { snowflake id; //!< id of the entry /** * ID of the affected entity (webhook, user, role, etc.) (may be empty) @@ -189,6 +189,18 @@ struct DPP_EXPORT audit_entry { audit_type type; //!< type of action that occurred std::optional extra; //!< Optional: additional info for certain action types std::string reason; //!< Optional: the reason for the change (1-512 characters) + + /** Constructor */ + audit_entry(); + + /** Destructor */ + virtual ~audit_entry() = default; + + /** Read class values from json object + * @param j A json object to read from + * @return A reference to self + */ + audit_entry& fill_from_json(nlohmann::json* j); }; /** diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 42c5f88cf3..114c354f66 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -947,6 +947,14 @@ class DPP_EXPORT cluster { */ event_router_t on_message_create; + /** + * @brief Called when a guild audit log entry is created. + * + * @see https://discord.com/developers/docs/topics/gateway-events#guild-audit-log-entry-create + * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. + * The function signature for this event takes a single `const` reference of type guild_audit_log_entry_create_t&, and returns void. + */ + event_router_t on_guild_audit_log_entry_create; /** * @brief Called when a ban is added to a guild. diff --git a/include/dpp/dispatcher.h b/include/dpp/dispatcher.h index 289fefb153..c3cfe1d97b 100644 --- a/include/dpp/dispatcher.h +++ b/include/dpp/dispatcher.h @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -1400,6 +1401,19 @@ struct DPP_EXPORT message_create_t : public event_dispatch_t { void reply(message&& msg, bool mention_replied_user = false, command_completion_event_t callback = utility::log_error()) const; }; +/** @brief Guild audit log entry create */ +struct DPP_EXPORT guild_audit_log_entry_create_t : public event_dispatch_t { + /** Constructor + * @param client The shard the event originated on + * @param raw Raw event text as JSON + */ + guild_audit_log_entry_create_t(class discord_client* client, const std::string& raw); + /** + * @brief created audit log entry + */ + audit_entry entry; +}; + /** @brief Guild ban add */ struct DPP_EXPORT guild_ban_add_t : public event_dispatch_t { /** Constructor diff --git a/include/dpp/event.h b/include/dpp/event.h index f4e4398cfb..cf1695fde6 100644 --- a/include/dpp/event.h +++ b/include/dpp/event.h @@ -148,4 +148,7 @@ event_decl(automod_rule_update, AUTO_MODERATION_RULE_UPDATE); event_decl(automod_rule_delete, AUTO_MODERATION_RULE_DELETE); event_decl(automod_rule_execute, AUTO_MODERATION_ACTION_EXECUTION); +/* Audit log */ +event_decl(guild_audit_log_entry_create, GUILD_AUDIT_LOG_ENTRY_CREATE); + }}; diff --git a/src/dpp/auditlog.cpp b/src/dpp/auditlog.cpp index 04f75b8f50..3fd65d596c 100644 --- a/src/dpp/auditlog.cpp +++ b/src/dpp/auditlog.cpp @@ -26,45 +26,51 @@ namespace dpp { using json = nlohmann::json; -auditlog& auditlog::fill_from_json(nlohmann::json* j) { - for (auto &ai : (*j)["audit_log_entries"]) { - audit_entry ae; - ae.id = snowflake_not_null(&ai, "id"); - ae.type = (audit_type)int8_not_null(&ai, "action_type"); - ae.user_id = snowflake_not_null(&ai, "user_id"); - ae.target_id = snowflake_not_null(&ai, "target_id"); - ae.reason = string_not_null(&ai, "reason"); - if (ai.contains("changes")) { - auto &c = ai["changes"]; - for (auto & change : c) { - audit_change ac; - ac.key = string_not_null(&change, "key"); - if (change.find("new_value") != change.end()) { - ac.new_value = change["new_value"].dump(); - } - if (change.find("old_value") != change.end()) { - ac.old_value = change["old_value"].dump(); - } - ae.changes.push_back(ac); +audit_entry::audit_entry(): type(aut_guild_update) { +} + +audit_entry &audit_entry::fill_from_json(nlohmann::json *j) { + this->id = snowflake_not_null(j, "id"); + this->type = (audit_type)int8_not_null(j, "action_type"); + this->user_id = snowflake_not_null(j, "user_id"); + this->target_id = snowflake_not_null(j, "target_id"); + this->reason = string_not_null(j, "reason"); + if (j->contains("changes")) { + auto &c = (*j)["changes"]; + for (auto & change : c) { + audit_change ac; + ac.key = string_not_null(&change, "key"); + if (change.find("new_value") != change.end()) { + ac.new_value = change["new_value"].dump(); } + if (change.find("old_value") != change.end()) { + ac.old_value = change["old_value"].dump(); + } + this->changes.push_back(ac); } - if (ai.contains("options")) { - auto &o = ai["options"]; - audit_extra opts; - opts.automod_rule_name = string_not_null(&o, "auto_moderation_rule_name"); - opts.automod_rule_trigger_type = string_not_null(&o, "auto_moderation_rule_trigger_type"); - opts.channel_id = snowflake_not_null(&o, "channel_id"); - opts.count = string_not_null(&o, "count"); - opts.delete_member_days = string_not_null(&o, "delete_member_days"); - opts.id = snowflake_not_null(&o, "id"); - opts.members_removed = string_not_null(&o, "members_removed"); - opts.message_id = snowflake_not_null(&o, "message_id"); - opts.role_name = string_not_null(&o, "role_name"); - opts.type = string_not_null(&o, "type"); - opts.application_id = snowflake_not_null(&o, "application_id"); - ae.extra = opts; - } - this->entries.emplace_back(ae); + } + if (j->contains("options")) { + auto &o = (*j)["options"]; + audit_extra opts; + opts.automod_rule_name = string_not_null(&o, "auto_moderation_rule_name"); + opts.automod_rule_trigger_type = string_not_null(&o, "auto_moderation_rule_trigger_type"); + opts.channel_id = snowflake_not_null(&o, "channel_id"); + opts.count = string_not_null(&o, "count"); + opts.delete_member_days = string_not_null(&o, "delete_member_days"); + opts.id = snowflake_not_null(&o, "id"); + opts.members_removed = string_not_null(&o, "members_removed"); + opts.message_id = snowflake_not_null(&o, "message_id"); + opts.role_name = string_not_null(&o, "role_name"); + opts.type = string_not_null(&o, "type"); + opts.application_id = snowflake_not_null(&o, "application_id"); + this->extra = opts; + } + return *this; +} + +auditlog& auditlog::fill_from_json(nlohmann::json* j) { + for (auto &ai : (*j)["audit_log_entries"]) { + this->entries.emplace_back(audit_entry().fill_from_json(&ai)); } return *this; } diff --git a/src/dpp/discordevents.cpp b/src/dpp/discordevents.cpp index abed08e675..7f68217fdd 100644 --- a/src/dpp/discordevents.cpp +++ b/src/dpp/discordevents.cpp @@ -341,7 +341,7 @@ const std::map eventmap = { { "AUTO_MODERATION_RULE_UPDATE", new dpp::events::automod_rule_update() }, { "AUTO_MODERATION_RULE_DELETE", new dpp::events::automod_rule_delete() }, { "AUTO_MODERATION_ACTION_EXECUTION", new dpp::events::automod_rule_execute() }, - { "GUILD_AUDIT_LOG_ENTRY_CREATE", nullptr }, /* TODO: Implement this event */ + { "GUILD_AUDIT_LOG_ENTRY_CREATE", new dpp::events::guild_audit_log_entry_create() }, }; void discord_client::handle_event(const std::string &event, json &j, const std::string &raw) diff --git a/src/dpp/dispatcher.cpp b/src/dpp/dispatcher.cpp index 61bdc41a18..7ab6b68385 100644 --- a/src/dpp/dispatcher.cpp +++ b/src/dpp/dispatcher.cpp @@ -299,6 +299,7 @@ event_ctor(invite_create_t, event_dispatch_t); event_ctor(message_update_t, event_dispatch_t); event_ctor(user_update_t, event_dispatch_t); event_ctor(message_create_t, event_dispatch_t); +event_ctor(guild_audit_log_entry_create_t, event_dispatch_t); event_ctor(guild_ban_add_t, event_dispatch_t); event_ctor(guild_ban_remove_t, event_dispatch_t); event_ctor(integration_create_t, event_dispatch_t); diff --git a/src/dpp/events/guild_audit_log_entry_create.cpp b/src/dpp/events/guild_audit_log_entry_create.cpp new file mode 100644 index 0000000000..6b75a772ce --- /dev/null +++ b/src/dpp/events/guild_audit_log_entry_create.cpp @@ -0,0 +1,49 @@ +/************************************************************************************ + * + * D++, A Lightweight C++ library for Discord + * + * Copyright 2021 Craig Edwards and D++ contributors + * (https://github.com/brainboxdotcc/DPP/graphs/contributors) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ************************************************************************************/ +#include +#include +#include +#include +#include + +namespace dpp { namespace events { + +using json = nlohmann::json; +using namespace dpp; + + +/** + * @brief Handle event + * + * @param client Websocket client (current shard) + * @param j JSON data for the event + * @param raw Raw JSON string + */ +void guild_audit_log_entry_create::handle(discord_client* client, json &j, const std::string &raw) { + json& d = j["d"]; + if (!client->creator->on_guild_audit_log_entry_create.empty()) { + dpp::guild_audit_log_entry_create_t ec(client, raw); + ec.entry.fill_from_json(&d); + client->creator->on_guild_audit_log_entry_create.call(ec); + } +} + +}}; \ No newline at end of file From ba7df8ad0a8317af5fb50e57132f308aa5a8bfe8 Mon Sep 17 00:00:00 2001 From: Phil B Date: Wed, 10 May 2023 21:08:47 +0200 Subject: [PATCH 017/101] refactoring: removed unused #include from guild_audit_log_entry_create.cpp --- src/dpp/events/guild_audit_log_entry_create.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/dpp/events/guild_audit_log_entry_create.cpp b/src/dpp/events/guild_audit_log_entry_create.cpp index 6b75a772ce..ed1e8ff9a7 100644 --- a/src/dpp/events/guild_audit_log_entry_create.cpp +++ b/src/dpp/events/guild_audit_log_entry_create.cpp @@ -20,9 +20,6 @@ ************************************************************************************/ #include #include -#include -#include -#include namespace dpp { namespace events { From a3811cba07f294061709730648a5c3f6e6f04c82 Mon Sep 17 00:00:00 2001 From: Phil B Date: Wed, 10 May 2023 22:19:05 +0200 Subject: [PATCH 018/101] feat: added guild member flags --- include/dpp/guild.h | 65 +++++++++++++++++++++++++++++++++++++++------ src/dpp/guild.cpp | 45 +++++++++++++++++++++++++++++-- 2 files changed, 100 insertions(+), 10 deletions(-) diff --git a/include/dpp/guild.h b/include/dpp/guild.h index bda4a2fd2d..99e7426a08 100644 --- a/include/dpp/guild.h +++ b/include/dpp/guild.h @@ -158,19 +158,27 @@ enum guild_flags_extra : uint16_t { /** * @brief Various flags that can be used to indicate the status of a guild member. - * @note Use set_mute and set_deaf member functions and do not toggle the bits yourself. + * @note Use the setter functions in dpp::guild_member and do not toggle the bits yourself. */ -enum guild_member_flags : uint8_t { +enum guild_member_flags : uint16_t { /** Member deafened in voice channels */ - gm_deaf = 0b00000001, + gm_deaf = 0b0000000000000001, /** Member muted in voice channels */ - gm_mute = 0b00000010, + gm_mute = 0b0000000000000010, /** Member pending verification by membership screening */ - gm_pending = 0b00000100, + gm_pending = 0b0000000000000100, /** Member has animated guild-specific avatar */ - gm_animated_avatar = 0b00001000, + gm_animated_avatar = 0b0000000000001000, /** gm_deaf or gm_mute has been toggled */ - gm_voice_action = 0b00010000, + gm_voice_action = 0b0000000000010000, + /** Member has left and rejoined the guild */ + gm_did_rejoin = 0b0000000000100000, + /** Member has completed onboarding */ + gm_completed_onboarding = 0b0000000001000000, + /** Member is exempt from guild verification requirements */ + gm_bypasses_verification = 0b0000000010000000, + /** Member has started onboarding */ + gm_started_onboarding = 0b0000000100000000, }; /** @@ -196,7 +204,7 @@ class DPP_EXPORT guild_member { /** Boosting since */ time_t premium_since; /** A set of flags built from the bitmask defined by dpp::guild_member_flags */ - uint8_t flags; + uint16_t flags; /** Default constructor */ guild_member(); @@ -249,6 +257,38 @@ class DPP_EXPORT guild_member { */ bool is_pending() const; + /** + * @brief Returns true if the user has left and rejoined the guild + * + * @return true user has left and rejoined the guild + * @return false user has not rejoined + */ + bool has_rejoined() const; + + /** + * @brief Returns true if the user has completed onboarding + * + * @return true user has completed onboarding + * @return false user has not completed onboarding + */ + bool has_completed_onboarding() const; + + /** + * @brief Returns true if the user has started onboarding + * + * @return true user has started onboarding + * @return false user has not started onboarding yet + */ + bool has_started_onboarding() const; + + /** + * @brief Returns true if the user is exempt from guild verification requirements + * + * @return true user bypasses verification + * @return false user doesn't bypass verification + */ + bool has_bypasses_verification() const; + /** * @brief Returns true if the user's per-guild custom avatar is animated * @@ -295,6 +335,15 @@ class DPP_EXPORT guild_member { bool operator == (guild_member const& other_member) const; + /** + * @brief Set whether the user is exempt from guild verification requirements + * + * @param is_bypassing_verification value to set + * + * @return guild_member& reference to self + */ + guild_member& set_bypasses_verification(const bool is_bypassing_verification); + /** * @brief Set whether the user is muted in voice channels * diff --git a/src/dpp/guild.cpp b/src/dpp/guild.cpp index 2985b706c6..683fd1ec50 100644 --- a/src/dpp/guild.cpp +++ b/src/dpp/guild.cpp @@ -107,6 +107,11 @@ guild_member& guild_member::set_nickname(const std::string& nick) { return *this; } +guild_member& guild_member::set_bypasses_verification(const bool is_bypassing_verification) { + this->flags = (is_bypassing_verification) ? flags | gm_bypasses_verification : flags & ~gm_bypasses_verification; + return *this; +} + guild_member& guild_member::set_mute(const bool is_muted) { this->flags = (is_muted) ? flags | gm_mute : flags & ~gm_mute; this->flags |= gm_voice_action; @@ -148,6 +153,20 @@ void from_json(const nlohmann::json& j, guild_member& gm) { set_ts_not_null(&j, "premium_since", gm.premium_since); set_ts_not_null(&j, "communication_disabled_until", gm.communication_disabled_until); + uint16_t flags = int16_not_null(&j, "flags"); + if (flags & 1 << 0) { + gm.flags |= dpp::gm_did_rejoin; + } + if (flags & 1 << 1) { + gm.flags |= dpp::gm_completed_onboarding; + } + if (flags & 1 << 2) { + gm.flags |= dpp::gm_bypasses_verification; + } + if (flags & 1 << 3) { + gm.flags |= dpp::gm_started_onboarding; + } + gm.roles.clear(); if (j.contains("roles") && !j.at("roles").is_null()) { gm.roles.reserve(j.at("roles").size()); @@ -213,16 +232,22 @@ std::string guild_member::build_json(bool with_id) const { j["nick"] = this->nickname; if (!this->roles.empty()) { j["roles"] = {}; - for (auto & role : roles) { + for (auto & role : this->roles) { j["roles"].push_back(std::to_string(role)); } } - if (flags & gm_voice_action) { + if (this->flags & gm_voice_action) { j["mute"] = is_muted(); j["deaf"] = is_deaf(); } + uint16_t out_flags = 0; + if (this->flags & gm_bypasses_verification) { + out_flags |= 1 << 2; + } + j["flags"] = out_flags; + return j.dump(); } @@ -247,6 +272,22 @@ bool guild_member::is_pending() const { return flags & dpp::gm_pending; } +bool guild_member::has_rejoined() const { + return flags & dpp::gm_did_rejoin; +} + +bool guild_member::has_completed_onboarding() const { + return flags & dpp::gm_completed_onboarding; +} + +bool guild_member::has_started_onboarding() const { + return flags & dpp::gm_started_onboarding; +} + +bool guild_member::has_bypasses_verification() const { + return flags & dpp::gm_bypasses_verification; +} + bool guild::is_large() const { return this->flags & g_large; } From 10b470bcb50e4a163a50bafc530865e6ac9b003f Mon Sep 17 00:00:00 2001 From: Phil B Date: Wed, 10 May 2023 22:27:51 +0200 Subject: [PATCH 019/101] refactor: changed the way guild member flags are parsed --- src/dpp/guild.cpp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/dpp/guild.cpp b/src/dpp/guild.cpp index 683fd1ec50..4ae3dde966 100644 --- a/src/dpp/guild.cpp +++ b/src/dpp/guild.cpp @@ -31,6 +31,14 @@ namespace dpp { using json = nlohmann::json; +/* A mapping of discord's flag values to our bitmap (they're different bit positions to fit other stuff in) */ +std::map membermap = { + { 1 << 0, dpp::gm_did_rejoin }, + { 1 << 1, dpp::gm_completed_onboarding }, + { 1 << 2, dpp::gm_bypasses_verification }, + { 1 << 3, dpp::gm_started_onboarding }, +}; + const std::map> featuremap = { {"ANIMATED_BANNER", dpp::g_animated_banner }, {"ANIMATED_ICON", dpp::g_animated_icon }, @@ -154,17 +162,10 @@ void from_json(const nlohmann::json& j, guild_member& gm) { set_ts_not_null(&j, "communication_disabled_until", gm.communication_disabled_until); uint16_t flags = int16_not_null(&j, "flags"); - if (flags & 1 << 0) { - gm.flags |= dpp::gm_did_rejoin; - } - if (flags & 1 << 1) { - gm.flags |= dpp::gm_completed_onboarding; - } - if (flags & 1 << 2) { - gm.flags |= dpp::gm_bypasses_verification; - } - if (flags & 1 << 3) { - gm.flags |= dpp::gm_started_onboarding; + for (auto & flag : membermap) { + if (flags & flag.first) { + gm.flags |= flag.second; + } } gm.roles.clear(); @@ -242,9 +243,11 @@ std::string guild_member::build_json(bool with_id) const { j["deaf"] = is_deaf(); } - uint16_t out_flags = 0; - if (this->flags & gm_bypasses_verification) { - out_flags |= 1 << 2; + uint32_t out_flags = 0; + for (auto & flag : membermap) { + if (flags & flag.second) { + out_flags |= flag.first; + } } j["flags"] = out_flags; From b2b4213b192afa83eb6dc5997d1bb2268c8822dd Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Fri, 12 May 2023 09:53:18 -0400 Subject: [PATCH 020/101] Applied changes discussed in PR #651 --- include/dpp/permissions.h | 5 +++-- src/unittest/test.cpp | 10 +++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/include/dpp/permissions.h b/include/dpp/permissions.h index f5fffcbc67..8b50600ea1 100644 --- a/include/dpp/permissions.h +++ b/include/dpp/permissions.h @@ -84,13 +84,14 @@ using role_permissions = permissions; /** * @brief Represents a permission bitmask (refer to enum dpp::permissions) which are held in an uint64_t */ -struct DPP_EXPORT permission { - +class DPP_EXPORT permission { +protected: /** * @brief The permission bitmask value */ uint64_t value{0}; +public: /** * @brief Default constructor, initializes permission to 0 */ diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 534eb830f1..298ae24a6c 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -297,7 +297,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b success = !p.has(dpp::p_administrator, dpp::p_ban_members) && success; // must return false because they're not both set success = !p.has(dpp::p_administrator | dpp::p_ban_members) && success; - constexpr auto constexpr_test = [](dpp::permission p) constexpr noexcept { + constexpr auto permission_test = [](dpp::permission p) constexpr noexcept { bool success{true}; p.set(0).add(~uint64_t{0}).remove(dpp::p_speak).set(dpp::p_connect); @@ -310,12 +310,8 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b success = !p.remove(dpp::p_speak).has(dpp::p_administrator, dpp::p_speak) && success; return success; }; - constexpr auto constexpr_success = constexpr_test({~uint64_t{0}}); - - static_assert(constexpr_success, "dpp::permission constexpr test failed"); - static_assert(noexcept(dpp::permission{}) && noexcept(dpp::permission(dpp::p_speak))); - static_assert(noexcept(p = 0) && noexcept(p = dpp::permission{})); - + constexpr auto constexpr_success = permission_test({~uint64_t{0}}); // test in constant evaluated + success = permission_test({~uint64_t{0}}) && constexpr_success && success; // test at runtime set_test("PERMISSION_CLASS", success); } From 0b7db17cd21d600946363c808ded5e24726c59ff Mon Sep 17 00:00:00 2001 From: Phil B Date: Fri, 12 May 2023 18:28:48 +0200 Subject: [PATCH 021/101] feat: added url getter for emojis --- include/dpp/emoji.h | 13 +++++++++++++ src/dpp/emoji.cpp | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/dpp/emoji.h b/include/dpp/emoji.h index 0dd7b7f570..ab4c599513 100644 --- a/include/dpp/emoji.h +++ b/include/dpp/emoji.h @@ -167,6 +167,19 @@ class DPP_EXPORT emoji : public managed, public json_interface { * @return std::string mention */ std::string get_mention() const; + + /** + * @brief Get the custom emoji url + * + * @param size The size of the emoji in pixels. It can be any power of two between 16 and 4096, + * otherwise the default sized emoji is returned. + * @param format The format to use for the emoji. It can be one of `i_webp`, `i_jpg`, `i_png` or `i_gif`. + * Passing `i_gif` might result in an invalid url for non-animated emojis. Consider using the `prefer_animated` parameter instead. + * @param prefer_animated Whether you prefer gif format. + * If true, it'll return gif format whenever the emoji is available as animated. + * @return std::string emoji url or an empty string, if the id is not set + */ + std::string get_url(uint16_t size = 0, const image_type format = i_png, bool prefer_animated = true) const; }; /** diff --git a/src/dpp/emoji.cpp b/src/dpp/emoji.cpp index 37ee6c7270..bbc41c87c4 100644 --- a/src/dpp/emoji.cpp +++ b/src/dpp/emoji.cpp @@ -117,6 +117,28 @@ std::string emoji::get_mention() const { return utility::emoji_mention(name,id,is_animated()); } +std::string emoji::get_url(uint16_t size, const dpp::image_type format, bool prefer_animated) const { + static const std::map extensions = { + { i_gif, "gif" }, + { i_jpg, "jpg" }, + { i_png, "png" }, + { i_webp, "webp" }, + }; + + if (extensions.find(format) == extensions.end()) { + return std::string(); + } + + if (this->id) { + return utility::cdn_host + "/emojis/" + + std::to_string(this->id) + "." + + (is_animated() && prefer_animated ? "gif" : extensions.find(format)->second) + + utility::avatar_size(size); + } else { + return std::string(); + } +} + }; From d76c77fddaac3391f64f9a77cb9c6d9217b4c020 Mon Sep 17 00:00:00 2001 From: Phil B Date: Fri, 12 May 2023 18:29:53 +0200 Subject: [PATCH 022/101] test: added unittests for creating/getting/deleting a custom emoji --- src/unittest/test.cpp | 50 +++++++++++++++++++++++++++++++++++++++ src/unittest/unittest.cpp | 4 ++++ 2 files changed, 54 insertions(+) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 4111a42b66..61213f5341 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -349,6 +349,14 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b ); } + { // emoji url getter + dpp::emoji emoji; + emoji.id = 825407338755653641; + + set_test("EMOJI.GET_URL", false); + set_test("EMOJI.GET_URL", emoji.get_url() == dpp::utility::cdn_host + "/emojis/825407338755653641.png"); + } + { // channel methods set_test("CHANNEL.SET_TYPE", false); dpp::channel c; @@ -614,6 +622,48 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b }); } + set_test("REQUEST_GET_IMAGE", false); + if (!offline) { + bot.request("https://dpp.dev/DPP-Logo.png", dpp::m_get, [&bot](const dpp::http_request_completion_t &callback) { + if (callback.status != 200) { + return; + } + set_test("REQUEST_GET_IMAGE", true); + + dpp::emoji emoji; + emoji.load_image(callback.body, dpp::i_png); + emoji.name = "dpp"; + + // emoji unit test with the requested image + set_test("EMOJI_CREATE", false); + set_test("EMOJI_GET", false); + set_test("EMOJI_DELETE", false); + bot.guild_emoji_create(TEST_GUILD_ID, emoji, [&bot](const dpp::confirmation_callback_t &event) { + if (event.is_error()) { + return; + } + set_test("EMOJI_CREATE", true); + + auto created = event.get(); + bot.guild_emoji_get(TEST_GUILD_ID, created.id, [&bot, created](const dpp::confirmation_callback_t &event) { + if (event.is_error()) { + return; + } + auto fetched = event.get(); + if (created.id == fetched.id && created.name == fetched.name && created.flags == fetched.flags && created.user_id == fetched.user_id) { + set_test("EMOJI_GET", true); + } + + bot.guild_emoji_delete(TEST_GUILD_ID, fetched.id, [](const dpp::confirmation_callback_t &event) { + if (!event.is_error()) { + set_test("EMOJI_DELETE", true); + } + }); + }); + }); + }); + } + set_test("AUTOMOD_RULE_CREATE", false); set_test("AUTOMOD_RULE_GET", false); set_test("AUTOMOD_RULE_GET_ALL", false); diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index bede7478bd..57ad1ab895 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -116,6 +116,7 @@ std::map tests = { {"UTILITY.USER_MENTION", {tt_offline, "utility::user_mention", false, false}}, {"UTILITY.ROLE_MENTION", {tt_offline, "utility::role_mention", false, false}}, {"UTILITY.EMOJI_MENTION", {tt_offline, "utility::emoji_mention", false, false}}, + {"EMOJI.GET_URL", {tt_offline, "emoji::get_url", false, false}}, {"ROLE.COMPARE", {tt_offline, "role::operator<", false, false}}, {"ROLE_CREATE", {tt_online, "cluster::role_create", false, false}}, {"ROLE_EDIT", {tt_online, "cluster::role_edit", false, false}}, @@ -129,6 +130,9 @@ std::map tests = { {"AUTOMOD_RULE_GET", {tt_online, "cluster::automod_rule_get", false, false}}, {"AUTOMOD_RULE_GET_ALL", {tt_online, "cluster::automod_rules_get", false, false}}, {"AUTOMOD_RULE_DELETE", {tt_online, "cluster::automod_rule_delete", false, false}}, + {"REQUEST_GET_IMAGE", {tt_online, "using the cluster::request method to fetch an image", false, false}}, + {"EMOJI_CREATE", {tt_online, "cluster::guild_emoji_create", false, false}}, + {"EMOJI_DELETE", {tt_online, "cluster::guild_emoji_delete", false, false}}, }; double start = dpp::utility::time_f(); From f7bd10bae5b29a4f921c3f22b5baed9e16b72172 Mon Sep 17 00:00:00 2001 From: Phil B Date: Fri, 12 May 2023 18:31:20 +0200 Subject: [PATCH 023/101] misc: forgot something in emoji unittest --- src/unittest/unittest.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index 57ad1ab895..0471a4122f 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -132,6 +132,7 @@ std::map tests = { {"AUTOMOD_RULE_DELETE", {tt_online, "cluster::automod_rule_delete", false, false}}, {"REQUEST_GET_IMAGE", {tt_online, "using the cluster::request method to fetch an image", false, false}}, {"EMOJI_CREATE", {tt_online, "cluster::guild_emoji_create", false, false}}, + {"EMOJI_GET", {tt_online, "cluster::guild_emoji_get", false, false}}, {"EMOJI_DELETE", {tt_online, "cluster::guild_emoji_delete", false, false}}, }; From 64f5091aa02b9e0836b30afc9f929523c6a66a12 Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Sat, 13 May 2023 10:51:16 -0400 Subject: [PATCH 024/101] test: added message edit test --- src/unittest/test.cpp | 15 +++++++++++++++ src/unittest/unittest.cpp | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 4111a42b66..36f7c38456 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -512,6 +512,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b if (!callback.is_error()) { set_test("DELCOMMAND", true); set_test("MESSAGECREATE", false); + set_test("MESSAGEEDIT", false); set_test("MESSAGERECEIVE", false); bot.message_create(dpp::message(TEST_TEXT_CHANNEL_ID, "test message"), [&bot](const dpp::confirmation_callback_t &callback) { if (!callback.is_error()) { @@ -527,6 +528,14 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("REACT", false); } }); + set_test("EDITEVENT", false); + bot.message_edit(dpp::message(m).set_content("test edit"), [](const dpp::confirmation_callback_t &callback) { + if (!callback.is_error()) { + set_test("MESSAGEEDIT", true); + } else { + set_test("MESSAGEEDIT", false); + } + }); bot.message_delete(m.id, TEST_TEXT_CHANNEL_ID, [](const dpp::confirmation_callback_t &callback) { if (!callback.is_error()) { @@ -921,6 +930,12 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } }); + bot.on_message_update([&](const dpp::message_update_t & event) { + if (event.msg.author == bot.me.id && event.msg.content == "test edit") { + set_test("EDITEVENT", true); + } + }); + bot.on_voice_ready([&](const dpp::voice_ready_t & event) { set_test("VOICECONN", true); dpp::discord_voice_client* v = event.voice_client; diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index bede7478bd..719d10de26 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -31,6 +31,8 @@ std::map tests = { {"DELCOMMAND", {tt_online, "Deletion of application command", false, false}}, {"LOGGER", {tt_online, "Log events", false, false}}, {"MESSAGECREATE", {tt_online, "Creation of a channel message", false, false}}, + {"MESSAGEEDIT", {tt_online, "Editing a channel message", false, false}}, + {"EDITEVENT", {tt_online, "Message edit event", false, false}}, {"MESSAGEDELETE", {tt_online, "Deletion of a channel message", false, false}}, {"MESSAGERECEIVE", {tt_online, "Receipt of a created message", false, false}}, {"CACHE", {tt_online, "Test guild cache", false, false}}, From 7b97a9a37b1359875d6e43b29d0b318ae79e4fd4 Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Sat, 13 May 2023 13:05:36 -0400 Subject: [PATCH 025/101] test: added message pin test --- src/unittest/test.cpp | 39 ++++++++++++++++++++++++++++++--------- src/unittest/unittest.cpp | 2 ++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 36f7c38456..3fa99e6193 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -518,7 +518,6 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b if (!callback.is_error()) { set_test("MESSAGECREATE", true); set_test("REACT", false); - set_test("MESSAGEDELETE", false); dpp::message m = std::get(callback.value); set_test("REACTEVENT", false); bot.message_add_reaction(m.id, TEST_TEXT_CHANNEL_ID, "😄", [](const dpp::confirmation_callback_t &callback) { @@ -536,14 +535,6 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("MESSAGEEDIT", false); } }); - bot.message_delete(m.id, TEST_TEXT_CHANNEL_ID, [](const dpp::confirmation_callback_t &callback) { - - if (!callback.is_error()) { - set_test("MESSAGEDELETE", true); - } else { - set_test("MESSAGEDELETE", false); - } - }); } else { set_test("MESSAGECREATE", false); } @@ -984,6 +975,26 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b if (event.msg.author.id == bot.me.id && !message_tested) { message_tested = true; set_test("MESSAGERECEIVE", true); + std::promise pin_test_promise; + auto pin_test_future = pin_test_promise.get_future(); + set_test("MESSAGEPIN", false); + bot.message_pin(event.msg.channel_id, event.msg.id, [&bot, id = event.msg.id, &pin_test_promise](const dpp::confirmation_callback_t &callback) { + if (!callback.is_error()) { + set_test("MESSAGEPIN", true); + bot.message_unpin(TEST_TEXT_CHANNEL_ID, id, [&pin_test_promise](const dpp::confirmation_callback_t &callback) { + if (!callback.is_error()) { + set_test("MESSAGEUNPIN", true); + } + else { + set_test("MESSAGEUNPIN", false); + } + pin_test_promise.set_value(); + }); + } else { + set_test("MESSAGEPIN", false); + pin_test_promise.set_value(); + } + }); set_test("MESSAGESGET", false); bot.messages_get(event.msg.channel_id, 0, event.msg.id, 0, 5, [](const dpp::confirmation_callback_t &cc){ if (!cc.is_error()) { @@ -1004,6 +1015,16 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("MESSAGESGET", false); } }); + pin_test_future.wait_for(std::chrono::seconds(15)); + set_test("MESSAGEDELETE", false); + bot.message_delete(event.msg.id, event.msg.channel_id, [](const dpp::confirmation_callback_t &callback) { + + if (!callback.is_error()) { + set_test("MESSAGEDELETE", true); + } else { + set_test("MESSAGEDELETE", false); + } + }); set_test("MSGCREATESEND", false); event.send("MSGCREATESEND", [&bot, ch_id = event.msg.channel_id] (const auto& cc) { if (!cc.is_error()) { diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index 719d10de26..11954e0aa6 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -33,6 +33,8 @@ std::map tests = { {"MESSAGECREATE", {tt_online, "Creation of a channel message", false, false}}, {"MESSAGEEDIT", {tt_online, "Editing a channel message", false, false}}, {"EDITEVENT", {tt_online, "Message edit event", false, false}}, + {"MESSAGEPIN", {tt_online, "Pinning a channel message", false, false}}, + {"MESSAGEUNPIN", {tt_online, "Unpinning a channel message", false, false}}, {"MESSAGEDELETE", {tt_online, "Deletion of a channel message", false, false}}, {"MESSAGERECEIVE", {tt_online, "Receipt of a created message", false, false}}, {"CACHE", {tt_online, "Test guild cache", false, false}}, From 63758dfa3a57a89d8653b6e9bc971b5491652856 Mon Sep 17 00:00:00 2001 From: Phil B Date: Sat, 13 May 2023 21:31:58 +0200 Subject: [PATCH 026/101] refactor: removed cout --- src/dpp/queues.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dpp/queues.cpp b/src/dpp/queues.cpp index d48dc16c26..9d9d035565 100644 --- a/src/dpp/queues.cpp +++ b/src/dpp/queues.cpp @@ -49,8 +49,6 @@ http_request::http_request(const std::string &_endpoint, const std::string &_par http_request::http_request(const std::string &_endpoint, const std::string &_parameters, http_completion_event completion, const std::string &_postdata, http_method method, const std::string &audit_reason, const std::vector &filename, const std::vector &filecontent, const std::vector &filemimetypes) : complete_handler(completion), completed(false), non_discord(false), endpoint(_endpoint), parameters(_parameters), postdata(_postdata), method(method), reason(audit_reason), file_name(filename), file_content(filecontent), file_mimetypes(filemimetypes), mimetype("application/json"), waiting(false) { - if (filecontent.size() && !filemimetypes.size()) - std::cout << "hi" << std::endl; } From f5a09fc0f03faccfe7355d160632b0b591897b81 Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Sat, 13 May 2023 15:32:49 -0400 Subject: [PATCH 027/101] test: added file attachment tests --- src/unittest/test.cpp | 62 +++++++++++++++++++++++++++++++++++--- src/unittest/test.h | 7 +++++ src/unittest/unittest.cpp | 18 +++++++++++ testdata/DPP-Logo.png | Bin 0 -> 1705 bytes 4 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 testdata/DPP-Logo.png diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 3fa99e6193..13871b9e25 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -445,6 +445,8 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b dpp::managed m(TEST_USER_ID); set_test("TS", ((uint64_t)m.get_creation_time()) == 1617131800); + std::vector test_image = load_test_image(); + set_test("PRESENCE", false); set_test("CLUSTER", false); try { @@ -490,7 +492,8 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b bot.on_voice_receive_combined([&](auto& event) { }); - bot.on_ready([&bot](const dpp::ready_t & event) { + + bot.on_ready([&](const dpp::ready_t & event) { set_test("CONNECTION", true); set_test("APPCOMMAND", false); @@ -503,18 +506,23 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b .add_option(dpp::command_option(dpp::co_attachment, "file", "a file")) .set_application_id(bot.me.id) .add_localization("fr", "zut", "Ou est la salor dans Discord?"), - TEST_GUILD_ID, [&bot](const dpp::confirmation_callback_t &callback) { + TEST_GUILD_ID, [&](const dpp::confirmation_callback_t &callback) { if (!callback.is_error()) { set_test("APPCOMMAND", true); set_test("DELCOMMAND", false); dpp::slashcommand s = std::get(callback.value); - bot.guild_command_delete(s.id, TEST_GUILD_ID, [&bot](const dpp::confirmation_callback_t &callback) { + bot.guild_command_delete(s.id, TEST_GUILD_ID, [&](const dpp::confirmation_callback_t &callback) { if (!callback.is_error()) { + dpp::message test_message(TEST_TEXT_CHANNEL_ID, "test message"); + set_test("DELCOMMAND", true); set_test("MESSAGECREATE", false); set_test("MESSAGEEDIT", false); set_test("MESSAGERECEIVE", false); - bot.message_create(dpp::message(TEST_TEXT_CHANNEL_ID, "test message"), [&bot](const dpp::confirmation_callback_t &callback) { + test_message.add_file("no-mime", "test"); + test_message.add_file("test.txt", "test", "text/plain"); + test_message.add_file("test.png", std::string{test_image.begin(), test_image.end()}, "image/png"); + bot.message_create(test_message, [&bot](const dpp::confirmation_callback_t &callback) { if (!callback.is_error()) { set_test("MESSAGECREATE", true); set_test("REACT", false); @@ -995,6 +1003,47 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b pin_test_promise.set_value(); } }); + set_test("MESSAGEFILE", false); + std::promise file_test_promise; + auto file_test_future = file_test_promise.get_future(); + if (event.msg.attachments.size() == 3) + { + constexpr auto check_mimetype = [](const auto &headers, std::string mimetype) { + if (auto it = headers.find("content-type"); it != headers.end()) { + // check that the mime type starts with what we gave : for example discord will change "text/plain" to "text/plain; charset=UTF-8" + return it->second.size() >= mimetype.size() && std::equal(it->second.begin(), it->second.begin() + mimetype.size(), mimetype.begin()); + } + else { + return false; + } + }; + event.msg.attachments[0].download([&](const dpp::http_request_completion_t &callback){ + if (callback.status == 200 && callback.body == "test") { + event.msg.attachments[1].download([&](const dpp::http_request_completion_t &callback){ + if (callback.status == 200 && check_mimetype(callback.headers, "text/plain") && callback.body == "test") { + event.msg.attachments[2].download([&](const dpp::http_request_completion_t &callback){ + // do not check the contents here because discord can change compression + if (callback.status == 200 && check_mimetype(callback.headers, "image/png")) { + set_test("MESSAGEFILE", true); + } + else { + set_test("MESSAGEFILE", false); + } + file_test_promise.set_value(); + }); + } + else { + set_test("MESSAGEFILE", false); + file_test_promise.set_value(); + } + }); + } + else { + set_test("MESSAGEFILE", false); + file_test_promise.set_value(); + } + }); + } set_test("MESSAGESGET", false); bot.messages_get(event.msg.channel_id, 0, event.msg.id, 0, 5, [](const dpp::confirmation_callback_t &cc){ if (!cc.is_error()) { @@ -1015,7 +1064,10 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("MESSAGESGET", false); } }); - pin_test_future.wait_for(std::chrono::seconds(15)); + // wait for tasks with the message to finish before deleting, up to 20 seconds + std::chrono::time_point timeout_point = std::chrono::steady_clock::now() + std::chrono::seconds(20); + pin_test_future.wait_until(timeout_point); + file_test_future.wait_until(timeout_point); set_test("MESSAGEDELETE", false); bot.message_delete(event.msg.id, event.msg.channel_id, [](const dpp::confirmation_callback_t &callback) { diff --git a/src/unittest/test.h b/src/unittest/test.h index b76a524a17..edc060e164 100644 --- a/src/unittest/test.h +++ b/src/unittest/test.h @@ -232,6 +232,13 @@ int test_summary(); */ std::vector load_test_audio(); +/** + * @brief Load test image for the attachment tests + * + * @return std::vector data and size for test image + */ +std::vector load_test_image(); + /** * @brief Get the token from the environment variable DPP_UNIT_TEST_TOKEN * diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index 11954e0aa6..b3bd9b65ae 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -37,6 +37,7 @@ std::map tests = { {"MESSAGEUNPIN", {tt_online, "Unpinning a channel message", false, false}}, {"MESSAGEDELETE", {tt_online, "Deletion of a channel message", false, false}}, {"MESSAGERECEIVE", {tt_online, "Receipt of a created message", false, false}}, + {"MESSAGEFILE", {tt_online, "Message attachment send and check", false, false}}, {"CACHE", {tt_online, "Test guild cache", false, false}}, {"USERCACHE", {tt_online, "Test user cache", false, false}}, {"VOICECONN", {tt_online, "Connect to voice channel", false, false}}, @@ -213,6 +214,23 @@ std::vector load_test_audio() { return testaudio; } +std::vector load_test_image() { + std::vector testimage; + std::ifstream input ("../../testdata/DPP-logo.png", std::ios::in|std::ios::binary|std::ios::ate); + if (input.is_open()) { + size_t testimage_size = input.tellg(); + testimage.resize(testimage_size); + input.seekg(0, std::ios::beg); + input.read((char*)testimage.data(), testimage_size); + input.close(); + } + else { + std::cout << "ERROR: Can't load ../../testdata/DPP-logo.png\n"; + exit(1); + } + return testimage; +} + std::string get_token() { char* t = getenv("DPP_UNIT_TEST_TOKEN"); std::string tok; diff --git a/testdata/DPP-Logo.png b/testdata/DPP-Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..86f6d9ac667f522a37b4075fe5ebadea3a1c85d5 GIT binary patch literal 1705 zcmbVMZEO=|9KQ}GV}g*7=masB8xb*F@2xNE*<&4T-Ad?Ix8gPv=dO28+e>@*-0rUH zZ8L7D5f@|R#e^t?Ow=zL2PTM#d|)n^5H#`SgKR_1Le#{lnVEjki1WFwZH7XKT<-39 z`#rz^`+q#q-nzbib3KM(>tk(^PBe}=U)?J7|9$?@A81e#dy~;u-+uq_8}Bx5f9Siay-0j_y=s&t^&%hJ< zd&c-|C_X3_K1|9df~~p7^Y1*c)0Y{!u(Y(auTLI%;n0ycCsSG>YdtkFxG;!>uGQOm zO$@tplk>T-*N!(}SnWn7*<M75^)SdPZNmoW8g5TY!#OD+6V1Eupv@x!6<8u}t9i}jZGkB9@@VdCQv_au zSUG`caRlN$@dO@*2Ecu8nv`go#r**{oqY$D|TamZ~_tVB|}}Wr+fLpaRV@5tgZ9 z^(?fYnT0o@t{z_}0J%0EugbWgE~;7;VOr5aWJcK`H$cobmHe;pL%i!55=Ey1$Hr=g*W$XZ1eGl0^y41rgD$cJGb8c49C+RFV{ zIGiwGTFIjWv$J(K9*c&3Ou*+OSvONsHy-C>nrVre1Y!|^K%Q|cip=}yR8xveab&>D zu_TZ@Ua~3OB$Iw7B}slp_Ok)5az6s4f)oGBeffXh?=Tcpe`5Z&d7P?r5{GY7Occ_g za@}-+f$}V`;H6yQMaiiFfsmZw1DPmqE4S@|W!hpEAkv#9#WKc(X{#t2pe2J`b<2#S zkmi(As>?=D|F*AmwxX;naMUZDX|+kAMYYWV4fQqyH8JU9V+u9EOR-2x(w_TewxxbL zv@Z0;RlfV;wNpFlrjuKKyg2jncjr}c@g71=U)dHrjNUWmIV||MRI~M0yP@l=yFdMG z>FmT^_K9P)!Fi#kZe}~~8eg++Z8CJ#rGz#gRBN6e-5Q*qnE!sp`1<4+J%z2BTYVuC z8tS>WI7;+4L~B>yztIjIY@QbHyBAI7UHjLdojd;On7VX%vFo=}8=C&~EM7Tnjy-(x zha5lr= Date: Sat, 13 May 2023 17:31:43 -0400 Subject: [PATCH 028/101] test: fixed testdata/DPP-Logo.png case in unit tests --- src/unittest/unittest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index b3bd9b65ae..54266c0472 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -216,7 +216,7 @@ std::vector load_test_audio() { std::vector load_test_image() { std::vector testimage; - std::ifstream input ("../../testdata/DPP-logo.png", std::ios::in|std::ios::binary|std::ios::ate); + std::ifstream input ("../../testdata/DPP-Logo.png", std::ios::in|std::ios::binary|std::ios::ate); if (input.is_open()) { size_t testimage_size = input.tellg(); testimage.resize(testimage_size); @@ -225,7 +225,7 @@ std::vector load_test_image() { input.close(); } else { - std::cout << "ERROR: Can't load ../../testdata/DPP-logo.png\n"; + std::cout << "ERROR: Can't load ../../testdata/DPP-Logo.png\n"; exit(1); } return testimage; From 1d161ba6c7daaca522d2914d5f4ad62f51658b5a Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Sat, 13 May 2023 19:40:43 -0400 Subject: [PATCH 029/101] test: slightly polished dpp::message unit tests --- src/unittest/test.cpp | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 13871b9e25..0d42351be7 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -539,12 +539,8 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b bot.message_edit(dpp::message(m).set_content("test edit"), [](const dpp::confirmation_callback_t &callback) { if (!callback.is_error()) { set_test("MESSAGEEDIT", true); - } else { - set_test("MESSAGEEDIT", false); } }); - } else { - set_test("MESSAGECREATE", false); } }); } else { @@ -929,8 +925,10 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } }); + bool message_edit_tested = false; bot.on_message_update([&](const dpp::message_update_t & event) { - if (event.msg.author == bot.me.id && event.msg.content == "test edit") { + if (!message_edit_tested && event.msg.author == bot.me.id && event.msg.content == "test edit") { + message_edit_tested = true; set_test("EDITEVENT", true); } }); @@ -986,6 +984,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b std::promise pin_test_promise; auto pin_test_future = pin_test_promise.get_future(); set_test("MESSAGEPIN", false); + set_test("MESSAGEUNPIN", false); bot.message_pin(event.msg.channel_id, event.msg.id, [&bot, id = event.msg.id, &pin_test_promise](const dpp::confirmation_callback_t &callback) { if (!callback.is_error()) { set_test("MESSAGEPIN", true); @@ -993,13 +992,9 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b if (!callback.is_error()) { set_test("MESSAGEUNPIN", true); } - else { - set_test("MESSAGEUNPIN", false); - } pin_test_promise.set_value(); }); } else { - set_test("MESSAGEPIN", false); pin_test_promise.set_value(); } }); @@ -1026,20 +1021,15 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b if (callback.status == 200 && check_mimetype(callback.headers, "image/png")) { set_test("MESSAGEFILE", true); } - else { - set_test("MESSAGEFILE", false); - } file_test_promise.set_value(); }); } else { - set_test("MESSAGEFILE", false); file_test_promise.set_value(); } }); } else { - set_test("MESSAGEFILE", false); file_test_promise.set_value(); } }); @@ -1073,8 +1063,6 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b if (!callback.is_error()) { set_test("MESSAGEDELETE", true); - } else { - set_test("MESSAGEDELETE", false); } }); set_test("MSGCREATESEND", false); From 84a1eeb57675a8d2354d3cb4a24a1fdefa1e22e9 Mon Sep 17 00:00:00 2001 From: Axyte <85938894+Axyte@users.noreply.gtihub.com> Date: Sun, 14 May 2023 20:32:40 +0530 Subject: [PATCH 030/101] [ci] fix broken x86 builds --- cmake/LINUXx86ToolChain.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/LINUXx86ToolChain.cmake b/cmake/LINUXx86ToolChain.cmake index 9f941ea4f3..992c7a5c87 100644 --- a/cmake/LINUXx86ToolChain.cmake +++ b/cmake/LINUXx86ToolChain.cmake @@ -25,6 +25,7 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 " CACHE INTERNAL "" FORCE) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture i386) EXECUTE_PROCESS(COMMAND sudo apt update) +EXECUTE_PROCESS(COMMAND sudo apt install -f) EXECUTE_PROCESS(COMMAND sudo apt install -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium-dev:i386) -EXECUTE_PROCESS(COMMAND sudo mv /usr/lib/i386-linux-gnu/pkgconfig/libsodium.pc /usr/lib/pkgconfig/) +EXECUTE_PROCESS(COMMAND export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/) From 527a4e1c1f57566dde86e744a7dd39720071bf16 Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Sun, 14 May 2023 12:08:20 -0400 Subject: [PATCH 031/101] fix: fix memory leak and potential use-after-free bug with voiceconn --- include/dpp/discordclient.h | 2 +- src/dpp/discordclient.cpp | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/include/dpp/discordclient.h b/include/dpp/discordclient.h index c1e3211390..74648a24d8 100644 --- a/include/dpp/discordclient.h +++ b/include/dpp/discordclient.h @@ -360,7 +360,7 @@ class DPP_EXPORT discord_client : public websocket_client /** * @brief List of voice channels we are connecting to keyed by guild id */ - std::unordered_map connecting_voice_channels; + std::unordered_map> connecting_voice_channels; /** * @brief The gateway address we reconnect to when we resume a session diff --git a/src/dpp/discordclient.cpp b/src/dpp/discordclient.cpp index 5c920e278a..f0742b5dd3 100644 --- a/src/dpp/discordclient.cpp +++ b/src/dpp/discordclient.cpp @@ -610,7 +610,7 @@ discord_client& discord_client::connect_voice(snowflake guild_id, snowflake chan #ifdef HAVE_VOICE std::unique_lock lock(voice_mutex); if (connecting_voice_channels.find(guild_id) == connecting_voice_channels.end()) { - connecting_voice_channels[guild_id] = new voiceconn(this, channel_id); + connecting_voice_channels[guild_id] = std::make_unique(this, channel_id); /* Once sent, this expects two events (in any order) on the websocket: * VOICE_SERVER_UPDATE and VOICE_STATUS_UPDATE */ @@ -658,8 +658,6 @@ void discord_client::disconnect_voice_internal(snowflake guild_id, bool emit_jso } })), false); } - delete v->second; - v->second = nullptr; connecting_voice_channels.erase(v); } #endif @@ -675,7 +673,7 @@ voiceconn* discord_client::get_voice(snowflake guild_id) { std::shared_lock lock(voice_mutex); auto v = connecting_voice_channels.find(guild_id); if (v != connecting_voice_channels.end()) { - return v->second; + return v->second.get(); } #endif return nullptr; From e4affca3b04f248d77c592fc2ceb7e9c6c0667e0 Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Sun, 14 May 2023 15:27:57 -0400 Subject: [PATCH 032/101] fix: moved online unit tests from on_ready event handler to main thread this fixes start_timer, message_collector unit test failing due to blocking calls in the first shard's thread --- src/unittest/test.cpp | 388 ++++++++++++++++++++++-------------------- 1 file changed, 199 insertions(+), 189 deletions(-) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 8e3a7b3277..783cbeb759 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -510,13 +510,14 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b bot.on_voice_receive_combined([&](auto& event) { }); - + std::promise ready_promise; + std::future ready_future = ready_promise.get_future(); bot.on_ready([&](const dpp::ready_t & event) { - set_test("CONNECTION", true); + ready_promise.set_value(); + set_test("APPCOMMAND", false); set_test("LOGGER", false); - bot.log(dpp::ll_info, "Test log message"); bot.guild_command_create(dpp::slashcommand().set_name("testcommand") @@ -567,7 +568,195 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b }); } }); + }); + + std::mutex loglock; + bot.on_log([&](const dpp::log_t & event) { + std::lock_guard locker(loglock); + if (event.severity > dpp::ll_trace) { + std::cout << "[" << std::fixed << std::setprecision(3) << (dpp::utility::time_f() - get_start_time()) << "]: [\u001b[36m" << dpp::utility::loglevel(event.severity) << "\u001b[0m] " << event.message << "\n"; + } + if (event.message == "Test log message") { + set_test("LOGGER", true); + } + }); + + set_test("RUNONCE", false); + uint8_t runs = 0; + for (int x = 0; x < 10; ++x) { + if (dpp::run_once()) { + runs++; + } + } + set_test("RUNONCE", (runs == 1)); + + bot.on_message_reaction_add([&](const dpp::message_reaction_add_t & event) { + if (event.reacting_user.id == bot.me.id && event.reacting_emoji.name == "😄") { + set_test("REACTEVENT", true); + } + }); + + bool message_edit_tested = false; + bot.on_message_update([&](const dpp::message_update_t & event) { + if (!message_edit_tested && event.msg.author == bot.me.id && event.msg.content == "test edit") { + message_edit_tested = true; + set_test("EDITEVENT", true); + } + }); + + bot.on_voice_ready([&](const dpp::voice_ready_t & event) { + set_test("VOICECONN", true); + dpp::discord_voice_client* v = event.voice_client; + set_test("VOICESEND", false); + if (v && v->is_ready()) { + v->send_audio_raw((uint16_t*)testaudio.data(), testaudio.size()); + } else { + set_test("VOICESEND", false); + } + }); + + bot.on_voice_buffer_send([&](const dpp::voice_buffer_send_t & event) { + if (event.buffer_size == 0) { + set_test("VOICESEND", true); + } + }); + + set_test("SYNC", false); + if (!offline) { + dpp::message m = dpp::sync(&bot, &dpp::cluster::message_create, dpp::message(TEST_TEXT_CHANNEL_ID, "TEST")); + set_test("SYNC", m.content == "TEST"); + } + + bot.on_guild_create([&](const dpp::guild_create_t & event) { + if (event.created->id == TEST_GUILD_ID) { + set_test("GUILDCREATE", true); + if (event.presences.size() && event.presences.begin()->second.user_id > 0) { + set_test("PRESENCE", true); + } + dpp::guild* g = dpp::find_guild(TEST_GUILD_ID); + set_test("CACHE", false); + if (g) { + set_test("CACHE", true); + set_test("VOICECONN", false); + dpp::discord_client* s = bot.get_shard(0); + s->connect_voice(g->id, TEST_VC_ID, false, false); + } + else { + set_test("CACHE", false); + } + } + }); + bool message_tested = false; + bot.on_message_create([&](const dpp::message_create_t & event) { + if (event.msg.author.id == bot.me.id && !message_tested) { + message_tested = true; + set_test("MESSAGERECEIVE", true); + std::promise pin_test_promise; + auto pin_test_future = pin_test_promise.get_future(); + set_test("MESSAGEPIN", false); + set_test("MESSAGEUNPIN", false); + bot.message_pin(event.msg.channel_id, event.msg.id, [&bot, id = event.msg.id, &pin_test_promise](const dpp::confirmation_callback_t &callback) { + if (!callback.is_error()) { + set_test("MESSAGEPIN", true); + bot.message_unpin(TEST_TEXT_CHANNEL_ID, id, [&pin_test_promise](const dpp::confirmation_callback_t &callback) { + if (!callback.is_error()) { + set_test("MESSAGEUNPIN", true); + } + pin_test_promise.set_value(); + }); + } else { + pin_test_promise.set_value(); + } + }); + set_test("MESSAGEFILE", false); + std::promise file_test_promise; + auto file_test_future = file_test_promise.get_future(); + if (event.msg.attachments.size() == 3) + { + constexpr auto check_mimetype = [](const auto &headers, std::string mimetype) { + if (auto it = headers.find("content-type"); it != headers.end()) { + // check that the mime type starts with what we gave : for example discord will change "text/plain" to "text/plain; charset=UTF-8" + return it->second.size() >= mimetype.size() && std::equal(it->second.begin(), it->second.begin() + mimetype.size(), mimetype.begin()); + } + else { + return false; + } + }; + event.msg.attachments[0].download([&](const dpp::http_request_completion_t &callback){ + if (callback.status == 200 && callback.body == "test") { + event.msg.attachments[1].download([&](const dpp::http_request_completion_t &callback){ + if (callback.status == 200 && check_mimetype(callback.headers, "text/plain") && callback.body == "test") { + event.msg.attachments[2].download([&](const dpp::http_request_completion_t &callback){ + // do not check the contents here because discord can change compression + if (callback.status == 200 && check_mimetype(callback.headers, "image/png")) { + set_test("MESSAGEFILE", true); + } + file_test_promise.set_value(); + }); + } + else { + file_test_promise.set_value(); + } + }); + } + else { + file_test_promise.set_value(); + } + }); + } + set_test("MESSAGESGET", false); + bot.messages_get(event.msg.channel_id, 0, event.msg.id, 0, 5, [](const dpp::confirmation_callback_t &cc){ + if (!cc.is_error()) { + dpp::message_map mm = std::get(cc.value); + if (mm.size()) { + set_test("MESSAGESGET", true); + set_test("TIMESTAMP", false); + dpp::message m = mm.begin()->second; + if (m.sent > 0) { + set_test("TIMESTAMP", true); + } else { + set_test("TIMESTAMP", false); + } + } else { + set_test("MESSAGESGET", false); + } + } else { + set_test("MESSAGESGET", false); + } + }); + // wait for tasks with the message to finish before deleting, up to 20 seconds + std::chrono::time_point timeout_point = std::chrono::steady_clock::now() + std::chrono::seconds(20); + pin_test_future.wait_until(timeout_point); + file_test_future.wait_until(timeout_point); + set_test("MESSAGEDELETE", false); + bot.message_delete(event.msg.id, event.msg.channel_id, [](const dpp::confirmation_callback_t &callback) { + + if (!callback.is_error()) { + set_test("MESSAGEDELETE", true); + } + }); + set_test("MSGCREATESEND", false); + event.send("MSGCREATESEND", [&bot, ch_id = event.msg.channel_id] (const auto& cc) { + if (!cc.is_error()) { + dpp::message m = std::get(cc.value); + if (m.channel_id == ch_id) { + set_test("MSGCREATESEND", true); + } else { + bot.log(dpp::ll_debug, cc.http_info.body); + set_test("MSGCREATESEND", false); + } + bot.message_delete(m.id, m.channel_id); + } else { + bot.log(dpp::ll_debug, cc.http_info.body); + set_test("MSGCREATESEND", false); + } + }); + } + }); + + // set to execute from this thread (main thread) after on_ready is fired + auto do_online_tests = [&] { set_test("GUILD_BAN_CREATE", false); set_test("GUILD_BAN_GET", false); set_test("GUILD_BANS_GET", false); @@ -957,192 +1146,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("ROLE_DELETE", false); } } - }); - - std::mutex loglock; - bot.on_log([&](const dpp::log_t & event) { - std::lock_guard locker(loglock); - if (event.severity > dpp::ll_trace) { - std::cout << "[" << std::fixed << std::setprecision(3) << (dpp::utility::time_f() - get_start_time()) << "]: [\u001b[36m" << dpp::utility::loglevel(event.severity) << "\u001b[0m] " << event.message << "\n"; - } - if (event.message == "Test log message") { - set_test("LOGGER", true); - } - }); - - set_test("RUNONCE", false); - uint8_t runs = 0; - for (int x = 0; x < 10; ++x) { - if (dpp::run_once()) { - runs++; - } - } - set_test("RUNONCE", (runs == 1)); - - bot.on_message_reaction_add([&](const dpp::message_reaction_add_t & event) { - if (event.reacting_user.id == bot.me.id && event.reacting_emoji.name == "😄") { - set_test("REACTEVENT", true); - } - }); - - bool message_edit_tested = false; - bot.on_message_update([&](const dpp::message_update_t & event) { - if (!message_edit_tested && event.msg.author == bot.me.id && event.msg.content == "test edit") { - message_edit_tested = true; - set_test("EDITEVENT", true); - } - }); - - bot.on_voice_ready([&](const dpp::voice_ready_t & event) { - set_test("VOICECONN", true); - dpp::discord_voice_client* v = event.voice_client; - set_test("VOICESEND", false); - if (v && v->is_ready()) { - v->send_audio_raw((uint16_t*)testaudio.data(), testaudio.size()); - } else { - set_test("VOICESEND", false); - } - }); - - bot.on_voice_buffer_send([&](const dpp::voice_buffer_send_t & event) { - if (event.buffer_size == 0) { - set_test("VOICESEND", true); - } - }); - - set_test("SYNC", false); - if (!offline) { - dpp::message m = dpp::sync(&bot, &dpp::cluster::message_create, dpp::message(TEST_TEXT_CHANNEL_ID, "TEST")); - set_test("SYNC", m.content == "TEST"); - } - - bot.on_guild_create([&](const dpp::guild_create_t & event) { - if (event.created->id == TEST_GUILD_ID) { - set_test("GUILDCREATE", true); - if (event.presences.size() && event.presences.begin()->second.user_id > 0) { - set_test("PRESENCE", true); - } - dpp::guild* g = dpp::find_guild(TEST_GUILD_ID); - set_test("CACHE", false); - if (g) { - set_test("CACHE", true); - set_test("VOICECONN", false); - dpp::discord_client* s = bot.get_shard(0); - s->connect_voice(g->id, TEST_VC_ID, false, false); - } - else { - set_test("CACHE", false); - } - } - }); - - bool message_tested = false; - bot.on_message_create([&](const dpp::message_create_t & event) { - if (event.msg.author.id == bot.me.id && !message_tested) { - message_tested = true; - set_test("MESSAGERECEIVE", true); - std::promise pin_test_promise; - auto pin_test_future = pin_test_promise.get_future(); - set_test("MESSAGEPIN", false); - set_test("MESSAGEUNPIN", false); - bot.message_pin(event.msg.channel_id, event.msg.id, [&bot, id = event.msg.id, &pin_test_promise](const dpp::confirmation_callback_t &callback) { - if (!callback.is_error()) { - set_test("MESSAGEPIN", true); - bot.message_unpin(TEST_TEXT_CHANNEL_ID, id, [&pin_test_promise](const dpp::confirmation_callback_t &callback) { - if (!callback.is_error()) { - set_test("MESSAGEUNPIN", true); - } - pin_test_promise.set_value(); - }); - } else { - pin_test_promise.set_value(); - } - }); - set_test("MESSAGEFILE", false); - std::promise file_test_promise; - auto file_test_future = file_test_promise.get_future(); - if (event.msg.attachments.size() == 3) - { - constexpr auto check_mimetype = [](const auto &headers, std::string mimetype) { - if (auto it = headers.find("content-type"); it != headers.end()) { - // check that the mime type starts with what we gave : for example discord will change "text/plain" to "text/plain; charset=UTF-8" - return it->second.size() >= mimetype.size() && std::equal(it->second.begin(), it->second.begin() + mimetype.size(), mimetype.begin()); - } - else { - return false; - } - }; - event.msg.attachments[0].download([&](const dpp::http_request_completion_t &callback){ - if (callback.status == 200 && callback.body == "test") { - event.msg.attachments[1].download([&](const dpp::http_request_completion_t &callback){ - if (callback.status == 200 && check_mimetype(callback.headers, "text/plain") && callback.body == "test") { - event.msg.attachments[2].download([&](const dpp::http_request_completion_t &callback){ - // do not check the contents here because discord can change compression - if (callback.status == 200 && check_mimetype(callback.headers, "image/png")) { - set_test("MESSAGEFILE", true); - } - file_test_promise.set_value(); - }); - } - else { - file_test_promise.set_value(); - } - }); - } - else { - file_test_promise.set_value(); - } - }); - } - set_test("MESSAGESGET", false); - bot.messages_get(event.msg.channel_id, 0, event.msg.id, 0, 5, [](const dpp::confirmation_callback_t &cc){ - if (!cc.is_error()) { - dpp::message_map mm = std::get(cc.value); - if (mm.size()) { - set_test("MESSAGESGET", true); - set_test("TIMESTAMP", false); - dpp::message m = mm.begin()->second; - if (m.sent > 0) { - set_test("TIMESTAMP", true); - } else { - set_test("TIMESTAMP", false); - } - } else { - set_test("MESSAGESGET", false); - } - } else { - set_test("MESSAGESGET", false); - } - }); - // wait for tasks with the message to finish before deleting, up to 20 seconds - std::chrono::time_point timeout_point = std::chrono::steady_clock::now() + std::chrono::seconds(20); - pin_test_future.wait_until(timeout_point); - file_test_future.wait_until(timeout_point); - set_test("MESSAGEDELETE", false); - bot.message_delete(event.msg.id, event.msg.channel_id, [](const dpp::confirmation_callback_t &callback) { - - if (!callback.is_error()) { - set_test("MESSAGEDELETE", true); - } - }); - set_test("MSGCREATESEND", false); - event.send("MSGCREATESEND", [&bot, ch_id = event.msg.channel_id] (const auto& cc) { - if (!cc.is_error()) { - dpp::message m = std::get(cc.value); - if (m.channel_id == ch_id) { - set_test("MSGCREATESEND", true); - } else { - bot.log(dpp::ll_debug, cc.http_info.body); - set_test("MSGCREATESEND", false); - } - bot.message_delete(m.id, m.channel_id); - } else { - bot.log(dpp::ll_debug, cc.http_info.body); - set_test("MSGCREATESEND", false); - } - }); - } - }); + }; set_test("BOTSTART", false); try { @@ -1220,6 +1224,12 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } testcache.remove(found_tco); + if (!offline) { + if (std::future_status status = ready_future.wait_for(std::chrono::seconds(20)); status != std::future_status::timeout) { + do_online_tests(); + } + } + noparam_api_test(current_user_get, dpp::user_identified, "CURRENTUSER"); singleparam_api_test(channel_get, TEST_TEXT_CHANNEL_ID, dpp::channel, "GETCHAN"); singleparam_api_test(guild_get, TEST_GUILD_ID, dpp::guild, "GETGUILD"); From 65cb206f64eca0c741e0c70c0606a05f4d52bd47 Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Sun, 14 May 2023 17:17:51 -0400 Subject: [PATCH 033/101] fix: redesign message unit tests so there is no blocking calls in on_message_receive --- src/unittest/test.cpp | 163 ++++++++++++++++++++++++++++-------------- 1 file changed, 108 insertions(+), 55 deletions(-) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 783cbeb759..cf160f7756 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -647,34 +647,48 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } }); - bool message_tested = false; - bot.on_message_create([&](const dpp::message_create_t & event) { - if (event.msg.author.id == bot.me.id && !message_tested) { - message_tested = true; - set_test("MESSAGERECEIVE", true); - std::promise pin_test_promise; - auto pin_test_future = pin_test_promise.get_future(); - set_test("MESSAGEPIN", false); - set_test("MESSAGEUNPIN", false); - bot.message_pin(event.msg.channel_id, event.msg.id, [&bot, id = event.msg.id, &pin_test_promise](const dpp::confirmation_callback_t &callback) { - if (!callback.is_error()) { - set_test("MESSAGEPIN", true); - bot.message_unpin(TEST_TEXT_CHANNEL_ID, id, [&pin_test_promise](const dpp::confirmation_callback_t &callback) { - if (!callback.is_error()) { - set_test("MESSAGEUNPIN", true); - } - pin_test_promise.set_value(); - }); - } else { - pin_test_promise.set_value(); - } - }); + // this helper class contains logic for the message tests, deletes the message when all tests are done + class message_test_helper + { + private: + std::mutex mutex; + bool pin_tested; + std::array files_tested; + std::array files_success; + dpp::snowflake channel_id; + dpp::snowflake message_id; + dpp::cluster ⊥ + + void delete_message_if_done() { + if (files_tested == std::array{true, true, true} && pin_tested) { + set_test("MESSAGEDELETE", false); + bot.message_delete(message_id, channel_id, [](const dpp::confirmation_callback_t &callback) { + if (!callback.is_error()) { + set_test("MESSAGEDELETE", true); + } + }); + } + } + + void set_pin_tested() { + assert(!pin_tested); + pin_tested = true; + delete_message_if_done(); + } + + void set_file_tested(size_t index) { + assert(!files_tested[index]); + files_tested[index] = true; + if (files_tested == std::array{true, true, true}) { + set_test("MESSAGEFILE", files_success == std::array{true, true, true}); + } + delete_message_if_done(); + } + + void test_files(const dpp::message &message) { set_test("MESSAGEFILE", false); - std::promise file_test_promise; - auto file_test_future = file_test_promise.get_future(); - if (event.msg.attachments.size() == 3) - { - constexpr auto check_mimetype = [](const auto &headers, std::string mimetype) { + if (message.attachments.size() == 3) { + static constexpr auto check_mimetype = [](const auto &headers, std::string mimetype) { if (auto it = headers.find("content-type"); it != headers.end()) { // check that the mime type starts with what we gave : for example discord will change "text/plain" to "text/plain; charset=UTF-8" return it->second.size() >= mimetype.size() && std::equal(it->second.begin(), it->second.begin() + mimetype.size(), mimetype.begin()); @@ -683,28 +697,78 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b return false; } }; - event.msg.attachments[0].download([&](const dpp::http_request_completion_t &callback){ + message.attachments[0].download([&](const dpp::http_request_completion_t &callback) { + std::lock_guard lock(mutex); if (callback.status == 200 && callback.body == "test") { - event.msg.attachments[1].download([&](const dpp::http_request_completion_t &callback){ - if (callback.status == 200 && check_mimetype(callback.headers, "text/plain") && callback.body == "test") { - event.msg.attachments[2].download([&](const dpp::http_request_completion_t &callback){ - // do not check the contents here because discord can change compression - if (callback.status == 200 && check_mimetype(callback.headers, "image/png")) { - set_test("MESSAGEFILE", true); - } - file_test_promise.set_value(); - }); - } - else { - file_test_promise.set_value(); - } - }); + files_success[0] = true; } - else { - file_test_promise.set_value(); + set_file_tested(0); + }); + message.attachments[1].download([&](const dpp::http_request_completion_t &callback) { + std::lock_guard lock(mutex); + if (callback.status == 200 && check_mimetype(callback.headers, "text/plain") && callback.body == "test") { + files_success[1] = true; + } + set_file_tested(1); + }); + message.attachments[2].download([&](const dpp::http_request_completion_t &callback) { + std::lock_guard lock(mutex); + // do not check the contents here because discord can change compression + if (callback.status == 200 && check_mimetype(callback.headers, "image/png")) { + files_success[2] = true; } + set_file_tested(2); }); } + else { + set_file_tested(0); + set_file_tested(1); + set_file_tested(2); + } + } + + void test_pin() { + set_test("MESSAGEPIN", false); + set_test("MESSAGEUNPIN", false); + bot.message_pin(channel_id, message_id, [=](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock(mutex); + if (!callback.is_error()) { + set_test("MESSAGEPIN", true); + bot.message_unpin(TEST_TEXT_CHANNEL_ID, message_id, [=](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock(mutex); + if (!callback.is_error()) { + set_test("MESSAGEUNPIN", true); + } + set_pin_tested(); + }); + } + else { + set_pin_tested(); + } + }); + } + + public: + message_test_helper(dpp::cluster &_bot) : bot(_bot) {} + + void run(const dpp::message &message) { + pin_tested = false; + files_tested = {false, false, false}; + files_success = {false, false, false}; + channel_id = message.channel_id; + message_id = message.id; + test_pin(); + test_files(message); + } + }; + + message_test_helper message_helper(bot); + bool message_tested = false; + bot.on_message_create([&](const dpp::message_create_t & event) { + if (event.msg.author.id == bot.me.id && !message_tested) { + message_tested = true; + set_test("MESSAGERECEIVE", true); + message_helper.run(event.msg); set_test("MESSAGESGET", false); bot.messages_get(event.msg.channel_id, 0, event.msg.id, 0, 5, [](const dpp::confirmation_callback_t &cc){ if (!cc.is_error()) { @@ -725,17 +789,6 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("MESSAGESGET", false); } }); - // wait for tasks with the message to finish before deleting, up to 20 seconds - std::chrono::time_point timeout_point = std::chrono::steady_clock::now() + std::chrono::seconds(20); - pin_test_future.wait_until(timeout_point); - file_test_future.wait_until(timeout_point); - set_test("MESSAGEDELETE", false); - bot.message_delete(event.msg.id, event.msg.channel_id, [](const dpp::confirmation_callback_t &callback) { - - if (!callback.is_error()) { - set_test("MESSAGEDELETE", true); - } - }); set_test("MSGCREATESEND", false); event.send("MSGCREATESEND", [&bot, ch_id = event.msg.channel_id] (const auto& cc) { if (!cc.is_error()) { From c23a1c0807c264a787f55816e34cd4dc1904b570 Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 15 May 2023 21:57:16 +0200 Subject: [PATCH 034/101] refactor: added helper functions to create endpoint urls (#684) this also adds unit tests for the new functionalities --- include/dpp/cluster.h | 4 +- include/dpp/emoji.h | 2 +- include/dpp/guild.h | 4 +- include/dpp/user.h | 4 +- include/dpp/utility.h | 43 +++++++++++++++++ src/dpp/application.cpp | 28 +++-------- src/dpp/channel.cpp | 14 ++---- src/dpp/cluster/invite.cpp | 4 +- src/dpp/emoji.cpp | 18 ++----- src/dpp/guild.cpp | 98 ++++++-------------------------------- src/dpp/message.cpp | 13 +---- src/dpp/presence.cpp | 28 +++-------- src/dpp/role.cpp | 14 ++---- src/dpp/user.cpp | 44 ++++------------- src/dpp/utility.cpp | 47 ++++++++++++++++++ src/unittest/test.cpp | 41 ++++++++++++++++ src/unittest/unittest.cpp | 3 ++ 17 files changed, 189 insertions(+), 220 deletions(-) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 114c354f66..563d834ac2 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -1886,11 +1886,11 @@ class DPP_EXPORT cluster { * @brief Get details about an invite * * @see https://discord.com/developers/docs/resources/invite#get-invite - * @param invite Invite code to get information on + * @param invite_code Invite code to get information on * @param callback Function to call when the API call completes. * On success the callback will contain a dpp::invite object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). */ - void invite_get(const std::string &invite, command_completion_event_t callback); + void invite_get(const std::string &invite_code, command_completion_event_t callback); /** * @brief Delete an invite diff --git a/include/dpp/emoji.h b/include/dpp/emoji.h index ab4c599513..d8c0f48da9 100644 --- a/include/dpp/emoji.h +++ b/include/dpp/emoji.h @@ -174,7 +174,7 @@ class DPP_EXPORT emoji : public managed, public json_interface { * @param size The size of the emoji in pixels. It can be any power of two between 16 and 4096, * otherwise the default sized emoji is returned. * @param format The format to use for the emoji. It can be one of `i_webp`, `i_jpg`, `i_png` or `i_gif`. - * Passing `i_gif` might result in an invalid url for non-animated emojis. Consider using the `prefer_animated` parameter instead. + * When passing `i_gif`, it returns an empty string for non-animated emojis. Consider using the `prefer_animated` parameter instead. * @param prefer_animated Whether you prefer gif format. * If true, it'll return gif format whenever the emoji is available as animated. * @return std::string emoji url or an empty string, if the id is not set diff --git a/include/dpp/guild.h b/include/dpp/guild.h index 99e7426a08..13815d5127 100644 --- a/include/dpp/guild.h +++ b/include/dpp/guild.h @@ -305,7 +305,7 @@ class DPP_EXPORT guild_member { * @param size The size of the avatar in pixels. It can be any power of two between 16 and 4096, * otherwise the default sized avatar is returned. * @param format The format to use for the avatar. It can be one of `i_webp`, `i_jpg`, `i_png` or `i_gif`. - * Passing `i_gif` might result in an invalid url for non-animated images. Consider using the `prefer_animated` parameter instead. + * When passing `i_gif`, it returns an empty string for non-animated images. Consider using the `prefer_animated` parameter instead. * @param prefer_animated Whether you prefer gif format. * If true, it'll return gif format whenever the image is available as animated. * @return std::string avatar url or an empty string, if required attributes are missing or an invalid format was passed @@ -772,7 +772,7 @@ class DPP_EXPORT guild : public managed, public json_interface { * @param size The size of the icon in pixels. It can be any power of two between 16 and 4096, * otherwise the default sized icon is returned. * @param format The format to use for the avatar. It can be one of `i_webp`, `i_jpg`, `i_png` or `i_gif`. - * Passing `i_gif` might result in an invalid url for non-animated images. Consider using the `prefer_animated` parameter instead. + * When passing `i_gif`, it returns an empty string for non-animated images. Consider using the `prefer_animated` parameter instead. * @param prefer_animated Whether you prefer gif format. * If true, it'll return gif format whenever the image is available as animated. * @return std::string icon url or an empty string, if required attributes are missing or an invalid format was passed diff --git a/include/dpp/user.h b/include/dpp/user.h index 2ddd3c6065..dabad9dee6 100644 --- a/include/dpp/user.h +++ b/include/dpp/user.h @@ -140,7 +140,7 @@ class DPP_EXPORT user : public managed, public json_interface { * @param size The size of the avatar in pixels. It can be any power of two between 16 and 4096, * otherwise the default sized avatar is returned. * @param format The format to use for the avatar. It can be one of `i_webp`, `i_jpg`, `i_png` or `i_gif`. - * Passing `i_gif` might result in an invalid url for non-animated images. Consider using the `prefer_animated` parameter instead. + * When passing `i_gif`, it returns an empty string for non-animated images. Consider using the `prefer_animated` parameter instead. * @param prefer_animated Whether you prefer gif format. * If true, it'll return gif format whenever the image is available as animated. * @return std::string avatar url or an empty string, if required attributes are missing or an invalid format was passed @@ -371,7 +371,7 @@ class DPP_EXPORT user_identified : public user, public json_interface &allowed_formats, const std::string &path_without_extension, const dpp::image_type format, uint16_t size, bool prefer_animated = false, bool is_animated = false); + + /** + * For internal use only. Helper function to easily create discord's cdn endpoint urls + * @see https://discord.com/developers/docs/reference#image-formatting-cdn-endpoints + * @param allowed_formats A vector of supported formats for the endpoint from the discord docs + * @param path_without_extension The path for the endpoint (without the extension e.g. `.png`) + * @param hash The hash (optional). If passed, it will be prefixed with `a_` for animated images (`is_animated`=true) + * @param format the wished format to return. Must be one of the formats passed in `allowed_formats`, otherwise it returns an empty string + * @param size the image size which will be appended as a querystring to the url. + * It must be any power of two between 16 and 4096, otherwise no querystring will be appended (discord then returns the image as their default size) + * @param prefer_animated Whether the user prefers gif format. If true, it'll return gif format whenever the emoji is available as animated. + * In this case, the `format`-parameter is only used for non-animated images. + * @param is_animated Whether the image is actually animated or not + * @return std::string endpoint url or empty string + */ + std::string cdn_endpoint_url_hash(const std::vector &allowed_formats, const std::string &path_without_extension, const std::string &hash, const dpp::image_type format, uint16_t size, bool prefer_animated = false, bool is_animated = false); + + /** + * For internal use only. Helper function to easily create discord's cdn endpoint urls (specialised for stickers) + * @see https://discord.com/developers/docs/reference#image-formatting-cdn-endpoints + * @param sticker_id The sticker ID. Returns empty string if 0 + * @param format The format type + * @return std::string endpoint url or empty string + */ + std::string cdn_endpoint_url_sticker(snowflake sticker_id, sticker_format format); + /** * @brief Timestamp formats for dpp::utility::timestamp() * diff --git a/src/dpp/application.cpp b/src/dpp/application.cpp index a977fc7aa7..5361f0330c 100644 --- a/src/dpp/application.cpp +++ b/src/dpp/application.cpp @@ -94,36 +94,20 @@ application& application::fill_from_json(nlohmann::json* j) { } std::string application::get_cover_image_url(uint16_t size, const image_type format) const { - static const std::map extensions = { - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->cover_image.to_string().empty() && this->id) { - return utility::cdn_host + "/app-icons/" + std::to_string(this->id) + "/" + this->cover_image.to_string() + "." + extensions.find(format)->second + utility::avatar_size(size); + return utility::cdn_endpoint_url({ i_jpg, i_png, i_webp }, + "app-icons/" + std::to_string(this->id) + "/" + this->cover_image.to_string(), + format, size); } else { return std::string(); } } std::string application::get_icon_url(uint16_t size, const image_type format) const { - static const std::map extensions = { - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->icon.to_string().empty() && this->id) { - return utility::cdn_host + "/app-icons/" + std::to_string(this->id) + "/" + this->icon.to_string() + "." + extensions.find(format)->second + utility::avatar_size(size); + return utility::cdn_endpoint_url({ i_jpg, i_png, i_webp }, + "app-icons/" + std::to_string(this->id) + "/" + this->icon.to_string(), + format, size); } else { return std::string(); } diff --git a/src/dpp/channel.cpp b/src/dpp/channel.cpp index b905ac53db..3017e713e2 100644 --- a/src/dpp/channel.cpp +++ b/src/dpp/channel.cpp @@ -589,18 +589,10 @@ std::map channel::get_voice_members() { } std::string channel::get_icon_url(uint16_t size, const image_type format) const { - static const std::map extensions = { - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (this->id && !this->icon.to_string().empty()) { - return utility::cdn_host + "/channel-icons/" + std::to_string(this->id) + "/" + this->icon.to_string() + "." + extensions.find(format)->second + utility::avatar_size(size); + return utility::cdn_endpoint_url({ i_jpg, i_png, i_webp }, + "channel-icons/" + std::to_string(this->id) + "/" + this->icon.to_string(), + format, size); } else { return std::string(); } diff --git a/src/dpp/cluster/invite.cpp b/src/dpp/cluster/invite.cpp index d87b139967..44176c4852 100644 --- a/src/dpp/cluster/invite.cpp +++ b/src/dpp/cluster/invite.cpp @@ -31,8 +31,8 @@ void cluster::invite_delete(const std::string &invitecode, command_completion_ev } -void cluster::invite_get(const std::string &invitecode, command_completion_event_t callback) { - rest_request(this, API_PATH "/invites", utility::url_encode(invitecode) + "?with_counts=true&with_expiration=true", "", m_get, "", callback); +void cluster::invite_get(const std::string &invite_code, command_completion_event_t callback) { + rest_request(this, API_PATH "/invites", utility::url_encode(invite_code) + "?with_counts=true&with_expiration=true", "", m_get, "", callback); } }; \ No newline at end of file diff --git a/src/dpp/emoji.cpp b/src/dpp/emoji.cpp index bbc41c87c4..b4a59508b7 100644 --- a/src/dpp/emoji.cpp +++ b/src/dpp/emoji.cpp @@ -118,22 +118,10 @@ std::string emoji::get_mention() const { } std::string emoji::get_url(uint16_t size, const dpp::image_type format, bool prefer_animated) const { - static const std::map extensions = { - { i_gif, "gif" }, - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (this->id) { - return utility::cdn_host + "/emojis/" + - std::to_string(this->id) + "." + - (is_animated() && prefer_animated ? "gif" : extensions.find(format)->second) + - utility::avatar_size(size); + return utility::cdn_endpoint_url({ i_jpg, i_png, i_webp, i_gif }, + "emojis/" + std::to_string(this->id), + format, size, prefer_animated, is_animated()); } else { return std::string(); } diff --git a/src/dpp/guild.cpp b/src/dpp/guild.cpp index 4ae3dde966..0a839de60b 100644 --- a/src/dpp/guild.cpp +++ b/src/dpp/guild.cpp @@ -190,26 +190,10 @@ void from_json(const nlohmann::json& j, guild_member& gm) { } std::string guild_member::get_avatar_url(uint16_t size, const image_type format, bool prefer_animated) const { - static const std::map extensions = { - { i_gif, "gif" }, - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (this->guild_id && this->user_id && !this->avatar.to_string().empty()) { - return utility::cdn_host + "/guilds/" + - std::to_string(this->guild_id) + - "/" + - std::to_string(this->user_id) + - (has_animated_guild_avatar() ? "/a_" : "/") + - this->avatar.to_string() + "." + - (has_animated_guild_avatar() && prefer_animated ? "gif" : extensions.find(format)->second) + - utility::avatar_size(size); + return utility::cdn_endpoint_url_hash({ i_jpg, i_png, i_webp, i_gif }, + "guilds/" + std::to_string(this->guild_id) + "/" + std::to_string(this->user_id), this->avatar.to_string(), + format, size, prefer_animated, has_animated_guild_avatar()); } else { return std::string(); } @@ -820,92 +804,40 @@ bool guild::connect_member_voice(snowflake user_id, bool self_mute, bool self_de } std::string guild::get_banner_url(uint16_t size, const image_type format, bool prefer_animated) const { - static const std::map extensions = { - { i_gif, "gif" }, - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->banner.to_string().empty() && this->id) { - return utility::cdn_host + "/banners/" + - std::to_string(this->id) + - (has_animated_banner_hash() ? "/a_" : "/") + - this->banner.to_string() + "." + - (has_animated_banner_hash() && prefer_animated ? "gif" : extensions.find(format)->second) + - utility::avatar_size(size); + return utility::cdn_endpoint_url_hash({ i_jpg, i_png, i_webp, i_gif }, + "banners/" + std::to_string(this->id), this->banner.to_string(), + format, size, prefer_animated, has_animated_banner_hash()); } else { return std::string(); } } std::string guild::get_discovery_splash_url(uint16_t size, const image_type format) const { - static const std::map extensions = { - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->discovery_splash.to_string().empty() && this->id) { - return utility::cdn_host + "/discovery-splashes/" + - std::to_string(this->id) + "/" + - this->discovery_splash.to_string() + - "." + extensions.find(format)->second + - utility::avatar_size(size); + return utility::cdn_endpoint_url({ i_jpg, i_png, i_webp }, + "discovery-splashes/" + std::to_string(this->id) + "/" + this->discovery_splash.to_string(), + format, size); } else { return std::string(); } } std::string guild::get_icon_url(uint16_t size, const image_type format, bool prefer_animated) const { - static const std::map extensions = { - { i_gif, "gif" }, - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->icon.to_string().empty() && this->id) { - return utility::cdn_host + "/icons/" + - std::to_string(this->id) + - (has_animated_icon_hash() ? "/a_" : "/") + - this->icon.to_string() + "." + - (has_animated_icon_hash() && prefer_animated ? "gif" : extensions.find(format)->second) + - utility::avatar_size(size); + return utility::cdn_endpoint_url_hash({ i_jpg, i_png, i_webp, i_gif }, + "icons/" + std::to_string(this->id), this->icon.to_string(), + format, size, prefer_animated, has_animated_icon_hash()); } else { return std::string(); } } std::string guild::get_splash_url(uint16_t size, const image_type format) const { - static const std::map extensions = { - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->splash.to_string().empty() && this->id) { - return utility::cdn_host + "/splashes/" + - std::to_string(this->id) + "/" + - this->splash.to_string() + - "." + extensions.find(format)->second + - utility::avatar_size(size); + return utility::cdn_endpoint_url({ i_jpg, i_png, i_webp, i_gif }, + "splashes/" + std::to_string(this->id) + "/" + this->splash.to_string(), + format, size); } else { return std::string(); } diff --git a/src/dpp/message.cpp b/src/dpp/message.cpp index dca29444be..d328256116 100644 --- a/src/dpp/message.cpp +++ b/src/dpp/message.cpp @@ -1198,18 +1198,7 @@ std::string sticker_pack::build_json(bool with_id) const { } std::string sticker::get_url() const { - if (this->id) { - static const std::map extensions = { - { sticker_format::sf_png, "png" }, - { sticker_format::sf_apng, "png" }, - { sticker_format::sf_lottie, "json" }, - { sticker_format::sf_gif, "gif" }, - }; - - return utility::cdn_host + "/stickers/" + std::to_string(this->id) + "." + extensions.find(this->format_type)->second; - } else { - return std::string(); - } + return utility::cdn_endpoint_url_sticker(this->id, this->format_type); } sticker& sticker::set_filename(const std::string &fn) { diff --git a/src/dpp/presence.cpp b/src/dpp/presence.cpp index ca0a354412..a63a355708 100644 --- a/src/dpp/presence.cpp +++ b/src/dpp/presence.cpp @@ -31,38 +31,22 @@ namespace dpp { using json = nlohmann::json; std::string activity::get_large_asset_url(uint16_t size, const image_type format) const { - static const std::map extensions = { - { i_jpg, "jpeg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->assets.large_image.empty() && this->application_id && this->assets.large_image.find(':') == std::string::npos) { // make sure it's not a prefixed proxy image - return utility::cdn_host + "/app-assets/" + std::to_string(this->application_id) + "/" + this->assets.large_image + "." + extensions.find(format)->second + utility::avatar_size(size); + return utility::cdn_endpoint_url({ i_jpg, i_png, i_webp }, + "app-assets/" + std::to_string(this->application_id) + "/" + this->assets.large_image, + format, size); } else { return std::string(); } } std::string activity::get_small_asset_url(uint16_t size, const image_type format) const { - static const std::map extensions = { - { i_jpg, "jpeg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->assets.small_image.empty() && this->application_id && this->assets.small_image.find(':') == std::string::npos) { // make sure it's not a prefixed proxy image - return utility::cdn_host + "/app-assets/" + std::to_string(this->application_id) + "/" + this->assets.small_image + "." + extensions.find(format)->second + utility::avatar_size(size); + return utility::cdn_endpoint_url({ i_jpg, i_png, i_webp }, + "app-assets/" + std::to_string(this->application_id) + "/" + this->assets.small_image, + format, size); } else { return std::string(); } diff --git a/src/dpp/role.cpp b/src/dpp/role.cpp index 8fd7ccc0a3..fce320cb35 100644 --- a/src/dpp/role.cpp +++ b/src/dpp/role.cpp @@ -377,18 +377,10 @@ members_container role::get_members() const { } std::string role::get_icon_url(uint16_t size, const image_type format) const { - static const std::map extensions = { - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->icon.to_string().empty() && this->id) { - return utility::cdn_host + "/role-icons/" + std::to_string(this->id) + "/" + this->icon.to_string() + "." + extensions.find(format)->second + utility::avatar_size(size); + return utility::cdn_endpoint_url({ i_jpg, i_png, i_webp }, + "role-icons/" + std::to_string(this->id) + "/" + this->icon.to_string(), + format, size); } else { return std::string(); } diff --git a/src/dpp/user.cpp b/src/dpp/user.cpp index 06755321bf..654cd4eb25 100644 --- a/src/dpp/user.cpp +++ b/src/dpp/user.cpp @@ -100,26 +100,12 @@ user_identified::~user_identified() { } std::string user::get_avatar_url(uint16_t size, const image_type format, bool prefer_animated) const { - static const std::map extensions = { - { i_gif, "gif" }, - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (this->avatar.to_string().empty()) { return get_default_avatar_url(); } else if (this->id) { - return utility::cdn_host + "/avatars/" + - std::to_string(this->id) + - (has_animated_icon() ? "/a_" : "/") + - this->avatar.to_string() + "." + - (has_animated_icon() && prefer_animated ? "gif" : extensions.find(format)->second) + - utility::avatar_size(size); + return utility::cdn_endpoint_url_hash({ i_jpg, i_png, i_webp, i_gif }, + "avatars/" + std::to_string(this->id), this->avatar.to_string(), + format, size, prefer_animated, has_animated_icon()); } else { return std::string(); } @@ -127,7 +113,9 @@ std::string user::get_avatar_url(uint16_t size, const image_type format, bool pr std::string user::get_default_avatar_url() const { if (this->discriminator) { - return utility::cdn_host + "/embed/avatars/" + std::to_string(this->discriminator % 5) + ".png"; + return utility::cdn_endpoint_url({ i_png }, + "embed/avatars/" + std::to_string(this->discriminator % 5), + i_png, 0); } else { return std::string(); } @@ -248,24 +236,10 @@ bool user_identified::has_animated_banner() const { } std::string user_identified::get_banner_url(uint16_t size, const image_type format, bool prefer_animated) const { - static const std::map extensions = { - { i_gif, "gif" }, - { i_jpg, "jpg" }, - { i_png, "png" }, - { i_webp, "webp" }, - }; - - if (extensions.find(format) == extensions.end()) { - return std::string(); - } - if (!this->banner.to_string().empty() && this->id) { - return utility::cdn_host + "/banners/" + - std::to_string(this->id) + - (has_animated_banner() ? "/a_" : "/") + - this->banner.to_string() + "." + - (has_animated_banner() && prefer_animated ? "gif" : extensions.find(format)->second) + - utility::avatar_size(size); + return utility::cdn_endpoint_url_hash({ i_jpg, i_png, i_webp, i_gif }, + "banners/" + std::to_string(this->id), this->banner.to_string(), + format, size, prefer_animated, has_animated_banner()); } else { return std::string(); } diff --git a/src/dpp/utility.cpp b/src/dpp/utility.cpp index 49c3d65589..8ffe07905c 100644 --- a/src/dpp/utility.cpp +++ b/src/dpp/utility.cpp @@ -53,6 +53,53 @@ namespace dpp { namespace utility { + std::string cdn_endpoint_url(const std::vector &allowed_formats, const std::string &path_without_extension, const dpp::image_type format, uint16_t size, bool prefer_animated, bool is_animated) { + return cdn_endpoint_url_hash(allowed_formats, path_without_extension, "", format, size, prefer_animated, is_animated); + } + + std::string cdn_endpoint_url_hash(const std::vector &allowed_formats, const std::string &path_without_extension, const std::string &hash, const dpp::image_type format, uint16_t size, bool prefer_animated, bool is_animated) { + + if (std::find(allowed_formats.begin(), allowed_formats.end(), format) == allowed_formats.end()) { + return std::string(); // if the given format is not allowed for this endpoint + } + + std::string extension; + if (is_animated && (prefer_animated || format == i_gif)) { + extension = ".gif"; + } else if (format == i_png) { + extension = ".png"; + } else if (format == i_jpg) { + extension = ".jpg"; + } else if (format == i_webp) { + extension = ".webp"; + } else { + return std::string(); + } + + std::string suffix = (hash.empty() ? "" : (is_animated ? "/a_" : "/") + hash); // > In the case of endpoints that support GIFs, the hash will begin with a_ if it is available in GIF format. + + return cdn_host + '/' + path_without_extension + suffix + extension + utility::avatar_size(size); + } + + std::string cdn_endpoint_url_sticker(snowflake sticker_id, sticker_format format) { + if (!sticker_id) { + return std::string(); + } + + std::string extension; + if (format == sf_png || format == sf_apng) { + extension = ".png"; + } else if (format == sf_lottie) { + extension = ".json"; + } else if (format == sf_gif) { + extension = ".gif"; + } else { + return std::string(); + } + + return utility::cdn_host + "/stickers/" + std::to_string(sticker_id) + extension; + } + double time_f() { using namespace std::chrono; diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index cf160f7756..bbe502a113 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -331,6 +331,47 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("USER.GET_CREATION_TIME", (uint64_t)user1.get_creation_time() == 1465312605); } + { // avatar size function + set_test("UTILITY.AVATAR_SIZE", false); + bool success = false; + success = dpp::utility::avatar_size(0).empty(); + success = dpp::utility::avatar_size(16) == "?size=16" && success; + success = dpp::utility::avatar_size(256) == "?size=256" && success; + success = dpp::utility::avatar_size(4096) == "?size=4096" && success; + success = dpp::utility::avatar_size(8192).empty() && success; + success = dpp::utility::avatar_size(3000).empty() && success; + set_test("UTILITY.AVATAR_SIZE", success); + } + + { // cdn endpoint url getter + set_test("UTILITY.CDN_ENDPOINT_URL_HASH", false); + bool success = false; + success = dpp::utility::cdn_endpoint_url_hash({ dpp::i_png }, "foobar/test", "", dpp::i_jpg, 0).empty(); + success = dpp::utility::cdn_endpoint_url_hash({ dpp::i_png }, "foobar/test", "", dpp::i_png, 0) == "https://cdn.discordapp.com/foobar/test.png" && success; + success = dpp::utility::cdn_endpoint_url_hash({ dpp::i_png }, "foobar/test", "", dpp::i_png, 128) == "https://cdn.discordapp.com/foobar/test.png?size=128" && success; + success = dpp::utility::cdn_endpoint_url_hash({ dpp::i_png, dpp::i_gif }, "foobar/test", "12345", dpp::i_gif, 0, false, true) == "https://cdn.discordapp.com/foobar/test/a_12345.gif" && success; + success = dpp::utility::cdn_endpoint_url_hash({ dpp::i_png, dpp::i_gif }, "foobar/test", "12345", dpp::i_png, 0, false, true) == "https://cdn.discordapp.com/foobar/test/a_12345.png" && success; + success = dpp::utility::cdn_endpoint_url_hash({ dpp::i_png, dpp::i_gif }, "foobar/test", "12345", dpp::i_png, 0, false, false) == "https://cdn.discordapp.com/foobar/test/12345.png" && success; + success = dpp::utility::cdn_endpoint_url_hash({ dpp::i_png, dpp::i_gif }, "foobar/test", "12345", dpp::i_png, 0, true, true) == "https://cdn.discordapp.com/foobar/test/a_12345.gif" && success; + success = dpp::utility::cdn_endpoint_url_hash({ dpp::i_png, dpp::i_gif }, "foobar/test", "", dpp::i_png, 0, true, true) == "https://cdn.discordapp.com/foobar/test.gif" && success; + success = dpp::utility::cdn_endpoint_url_hash({ dpp::i_png, dpp::i_gif }, "foobar/test", "", dpp::i_gif, 0, false, false).empty() && success; + set_test("UTILITY.CDN_ENDPOINT_URL_HASH", success); + } + + { // sticker url getter + set_test("STICKER.GET_URL", false); + dpp::sticker s; + s.format_type = dpp::sf_png; + bool success = s.get_url().empty(); + s.id = 12345; + success = s.get_url() == "https://cdn.discordapp.com/stickers/12345.png" && success; + s.format_type = dpp::sf_gif; + success = s.get_url() == "https://cdn.discordapp.com/stickers/12345.gif" && success; + s.format_type = dpp::sf_lottie; + success = s.get_url() == "https://cdn.discordapp.com/stickers/12345.json" && success; + set_test("STICKER.GET_URL", success); + } + { // user url getter dpp::user user1; user1.id = 189759562910400512; diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index f0165a4de3..15ef790a59 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -121,6 +121,9 @@ std::map tests = { {"UTILITY.USER_MENTION", {tt_offline, "utility::user_mention", false, false}}, {"UTILITY.ROLE_MENTION", {tt_offline, "utility::role_mention", false, false}}, {"UTILITY.EMOJI_MENTION", {tt_offline, "utility::emoji_mention", false, false}}, + {"UTILITY.AVATAR_SIZE", {tt_offline, "utility::avatar_size", false, false}}, + {"UTILITY.CDN_ENDPOINT_URL_HASH", {tt_offline, "utility::cdn_endpoint_url_hash", false, false}}, + {"STICKER.GET_URL", {tt_offline, "sticker::get_url aka utility::cdn_endpoint_url_sticker", false, false}}, {"EMOJI.GET_URL", {tt_offline, "emoji::get_url", false, false}}, {"ROLE.COMPARE", {tt_offline, "role::operator<", false, false}}, {"ROLE_CREATE", {tt_online, "cluster::role_create", false, false}}, From a580324617de7ee5c419a0a1173f473df3c0edd4 Mon Sep 17 00:00:00 2001 From: Phil B Date: Wed, 17 May 2023 17:31:03 +0200 Subject: [PATCH 035/101] test: fixed emoji get unittest. It failed because discord's respond doesn't include the user which created the emoji on creation --- src/unittest/test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index bbe502a113..d2f0cba452 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -947,7 +947,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b return; } auto fetched = event.get(); - if (created.id == fetched.id && created.name == fetched.name && created.flags == fetched.flags && created.user_id == fetched.user_id) { + if (created.id == fetched.id && created.name == fetched.name && created.flags == fetched.flags) { set_test("EMOJI_GET", true); } From 7572b39f6775a86c1bd75b647577496f4b8f0047 Mon Sep 17 00:00:00 2001 From: Phil B Date: Wed, 17 May 2023 18:05:11 +0200 Subject: [PATCH 036/101] test: fixed managed::get_creation_date unittest --- src/unittest/test.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index d2f0cba452..4a14bd346c 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -500,9 +500,11 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("TIMESTRINGTOTIMESTAMP", true); #endif - set_test("TS", false); - dpp::managed m(TEST_USER_ID); - set_test("TS", ((uint64_t)m.get_creation_time()) == 1617131800); + { + set_test("TS", false); + dpp::managed m(189759562910400512); + set_test("TS", ((uint64_t) m.get_creation_time()) == 1465312605); + } std::vector test_image = load_test_image(); From db12254c69cf5c670b72b0d0baf6d03f1f5b5404 Mon Sep 17 00:00:00 2001 From: Phil B Date: Thu, 18 May 2023 14:46:42 +0200 Subject: [PATCH 037/101] feat: added some missing role fields --- include/dpp/role.h | 25 ++++++++++++++++++++++--- src/dpp/role.cpp | 20 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/include/dpp/role.h b/include/dpp/role.h index c78347d775..6862d6b6d0 100644 --- a/include/dpp/role.h +++ b/include/dpp/role.h @@ -31,10 +31,12 @@ namespace dpp { /** Various flags related to dpp::role */ enum role_flags : uint8_t { - r_hoist = 0b00000001, //!< Hoisted role + r_hoist = 0b00000001, //!< Hoisted role (if the role is pinned in the user listing) r_managed = 0b00000010, //!< Managed role (introduced by a bot or application) - r_mentionable = 0b00000100, //!< Mentionable with a ping - r_premium_subscriber = 0b00001000, //!< This is set for the role given to nitro + r_mentionable = 0b00000100, //!< Whether this role is mentionable with a ping + r_premium_subscriber = 0b00001000, //!< Whether this is the guild's booster role + r_available_for_purchase = 0b00010000, //!< Whether the role is available for purchase + r_guild_connections = 0b00100000, //!< Whether the role is a guild's linked role }; /** @@ -72,6 +74,8 @@ class DPP_EXPORT role : public managed, public json_interface { snowflake integration_id; /** Bot id if any (e.g. role is a bot's role created when it was invited) */ snowflake bot_id; + /** The id of the role's subscription sku and listing */ + snowflake subscription_listing_id; /** The unicode emoji used for the role's icon, can be an empty string */ std::string unicode_emoji; /** The role icon hash, can be an empty string */ @@ -268,6 +272,21 @@ class DPP_EXPORT role : public managed, public json_interface { * @return bool True if the role is managed (introduced for a bot or other application by Discord) */ bool is_managed() const; + /** + * @brief True if the role is the guild's Booster role + * @return bool True if the role is the guild's Booster role + */ + bool is_premium_subscription() const; + /** + * @brief True if the role is available for purchase + * @return bool whether this role is available for purchase + */ + bool is_available_for_purchase() const; + /** + * @brief True if the role is a linked role + * @return bool True if the role is a linked role + */ + bool is_linked() const; /** * @brief True if has create instant invite permission * @note Having the administrator permission causes this method to always return true diff --git a/src/dpp/role.cpp b/src/dpp/role.cpp index fce320cb35..9328597c4d 100644 --- a/src/dpp/role.cpp +++ b/src/dpp/role.cpp @@ -41,6 +41,7 @@ role::role() : flags(0), integration_id(0), bot_id(0), + subscription_listing_id(0), image_data(nullptr) { } @@ -82,8 +83,15 @@ role& role::fill_from_json(snowflake _guild_id, nlohmann::json* j) if (t.find("premium_subscriber") != t.end()) { this->flags |= dpp::r_premium_subscriber; } + if (t.find("available_for_purchase") != t.end()) { + this->flags |= dpp::r_available_for_purchase; + } + if (t.find("guild_connections") != t.end()) { + this->flags |= dpp::r_guild_connections; + } this->bot_id = snowflake_not_null(&t, "bot_id"); this->integration_id = snowflake_not_null(&t, "integration_id"); + this->subscription_listing_id = snowflake_not_null(&t, "subscription_listing_id"); } return *this; } @@ -147,6 +155,18 @@ bool role::is_managed() const { return this->flags & dpp::r_managed; } +bool role::is_premium_subscription() const { + return this->flags & dpp::r_premium_subscriber; +} + +bool role::is_available_for_purchase() const { + return this->flags & dpp::r_available_for_purchase; +} + +bool role::is_linked() const { + return this->flags & dpp::r_guild_connections; +} + bool role::has_create_instant_invite() const { return has_administrator() || permissions.has(p_create_instant_invite); } From b484d89433b50abafe6aa7e89cd58b8a19abdc7d Mon Sep 17 00:00:00 2001 From: Phil B Date: Thu, 18 May 2023 15:02:44 +0200 Subject: [PATCH 038/101] feat: added i_guild_subscription integration type --- include/dpp/integration.h | 4 +++- src/dpp/integration.cpp | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/dpp/integration.h b/include/dpp/integration.h index 817b0eae2c..5c45b78314 100644 --- a/include/dpp/integration.h +++ b/include/dpp/integration.h @@ -37,7 +37,9 @@ enum integration_type { /// YouTube integration i_youtube, /// Discord integration - i_discord + i_discord, + /// Subscription + i_guild_subscription, }; /** diff --git a/src/dpp/integration.cpp b/src/dpp/integration.cpp index 5271eaf930..674266ba43 100644 --- a/src/dpp/integration.cpp +++ b/src/dpp/integration.cpp @@ -54,7 +54,8 @@ integration& integration::fill_from_json(nlohmann::json* j) { "", i_discord }, { "youtube", i_youtube }, { "twitch", i_twitch }, - { "discord", i_discord } + { "discord", i_discord }, + { "guild_subscription", i_guild_subscription } }; this->id = snowflake_not_null(j, "id"); this->name = string_not_null(j, "name"); From 945a122226e72605183ab0dbff881c0c5f6065e4 Mon Sep 17 00:00:00 2001 From: Phil B Date: Fri, 19 May 2023 11:17:14 +0200 Subject: [PATCH 039/101] refactor: renamed is_premium_subscription to is_premium_subscriber --- include/dpp/role.h | 4 ++-- src/dpp/role.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/dpp/role.h b/include/dpp/role.h index 6862d6b6d0..9afae7d444 100644 --- a/include/dpp/role.h +++ b/include/dpp/role.h @@ -274,9 +274,9 @@ class DPP_EXPORT role : public managed, public json_interface { bool is_managed() const; /** * @brief True if the role is the guild's Booster role - * @return bool True if the role is the guild's Booster role + * @return bool whether the role is the premium subscriber, AKA "boost", role for the guild */ - bool is_premium_subscription() const; + bool is_premium_subscriber() const; /** * @brief True if the role is available for purchase * @return bool whether this role is available for purchase diff --git a/src/dpp/role.cpp b/src/dpp/role.cpp index 9328597c4d..d8a4f63232 100644 --- a/src/dpp/role.cpp +++ b/src/dpp/role.cpp @@ -155,7 +155,7 @@ bool role::is_managed() const { return this->flags & dpp::r_managed; } -bool role::is_premium_subscription() const { +bool role::is_premium_subscriber() const { return this->flags & dpp::r_premium_subscriber; } From 56ac2077d674c57c1662a41ba1aa06ab6acc8518 Mon Sep 17 00:00:00 2001 From: Phil Date: Fri, 19 May 2023 16:43:54 +0200 Subject: [PATCH 040/101] refactor: updated invite struct & added unittests for invites (#695) --- include/dpp/invite.h | 28 ++++++++++++--------- src/dpp/cluster/channel.cpp | 2 +- src/dpp/invite.cpp | 27 ++++++++++++-------- src/unittest/test.cpp | 50 +++++++++++++++++++++++++++++++++++++ src/unittest/unittest.cpp | 5 ++++ 5 files changed, 89 insertions(+), 23 deletions(-) diff --git a/include/dpp/invite.h b/include/dpp/invite.h index cd5a045c97..e23592fae0 100644 --- a/include/dpp/invite.h +++ b/include/dpp/invite.h @@ -37,50 +37,54 @@ class DPP_EXPORT invite : public json_interface { */ std::string code; /** Readonly expiration timestamp of this invite or 0 if the invite doesn't expire + * @note Only returned from cluster::invite_get */ time_t expires_at; - /** Guild for the invite + /** Guild ID this invite is for */ snowflake guild_id; - /** Channel id for invite + /** Channel ID this invite is for */ snowflake channel_id; - /** User ID of invite creator + /** User ID who created this invite */ snowflake inviter_id; - /** Target user ID of invite, for invites sent via DM + /** The user ID whose stream to display for this voice channel stream invite */ snowflake target_user_id; - /** Target user type (generally this is always 1, "stream") + /** Target type */ - uint8_t target_user_type; + uint8_t target_type; /** Approximate number of online users + * @note Only returned from cluster::invite_get */ uint32_t approximate_presence_count; - /** Approximate total users online and offline + /** Approximate number of total users online and offline + * @note Only returned from cluster::invite_get */ uint32_t approximate_member_count; - /** Maximum age (in seconds) of invite + /** Duration (in seconds) after which the invite expires, or 0 for no expiration. Must be between 0 and 604800 (7 days). Defaults to 86400 (1 day) */ uint32_t max_age; - /** Maximum number of uses + /** Maximum number of uses, or 0 for unlimited. Must be between 0 and 100. Defaults to 0 */ uint32_t max_uses; - /** True if a temporary invite which grants access for a limited time + /** Whether this invite only grants temporary membership */ bool temporary; /** True if this invite should not replace or "attach to" similar invites */ bool unique; /** How many times this invite has been used - * - * @note Only set when using cluster::channel_invites_get */ uint32_t uses; /** The stage instance data if there is a public stage instance in the stage channel this invite is for * @deprecated Deprecated */ stage_instance stage; + /** Timestamp at which the invite was created + */ + time_t created_at; /** Constructor */ diff --git a/src/dpp/cluster/channel.cpp b/src/dpp/cluster/channel.cpp index 9db9995294..7faf3cba9c 100644 --- a/src/dpp/cluster/channel.cpp +++ b/src/dpp/cluster/channel.cpp @@ -76,7 +76,7 @@ void cluster::channel_get(snowflake c, command_completion_event_t callback) { } void cluster::channel_invite_create(const class channel &c, const class invite &i, command_completion_event_t callback) { - rest_request(this, API_PATH "/channels", std::to_string(c.id), "invites", m_post, i.build_json(), callback); + rest_request(this, API_PATH "/channels", std::to_string(c.id), "invites", m_post, i.build_json(), callback); } void cluster::channel_invites_get(const class channel &c, command_completion_event_t callback) { diff --git a/src/dpp/invite.cpp b/src/dpp/invite.cpp index ded29a84d7..640bf42b8f 100644 --- a/src/dpp/invite.cpp +++ b/src/dpp/invite.cpp @@ -28,18 +28,27 @@ namespace dpp { using json = nlohmann::json; -invite::invite() : expires_at(0), guild_id(0), channel_id(0), inviter_id(0), target_user_id(0), target_user_type(1), approximate_presence_count(0), approximate_member_count(0), uses(0) +invite::invite() : expires_at(0), guild_id(0), channel_id(0), inviter_id(0), target_user_id(0), target_type(0), approximate_presence_count(0), approximate_member_count(0), max_age(86400), max_uses(0), temporary(false), unique(false), uses(0), created_at(0) { } invite& invite::fill_from_json(nlohmann::json* j) { code = string_not_null(j, "code"); expires_at = (j->contains("expires_at")) ? ts_not_null(j, "expires_at") : 0; - guild_id = (j->contains("guild")) ? snowflake_not_null(&((*j)["guild"]), "id") : 0; - channel_id = (j->contains("channel")) ? snowflake_not_null(&((*j)["channel"]), "id") : 0; + created_at = (j->contains("created_at")) ? ts_not_null(j, "created_at") : 0; + if (j->contains("guild") && !j->at("guild").is_null()) { + guild_id = snowflake_not_null(&((*j)["guild"]), "id"); + } else if (j->contains("guild_id")) { // check ID for the invite create event + guild_id = snowflake_not_null(j, "guild_id"); + } + if (j->contains("channel") && !j->at("channel").is_null()) { + channel_id = snowflake_not_null(&((*j)["channel"]), "id"); + } else if (j->contains("channel_id")) { // check ID for the invite create event + channel_id = snowflake_not_null(j, "channel_id"); + } inviter_id = (j->contains("inviter")) ? snowflake_not_null(&((*j)["inviter"]), "id") : 0; target_user_id = (j->contains("target_user")) ? snowflake_not_null(&((*j)["target_user"]), "id") : 0; - target_user_type = int8_not_null(j, "target_user_type"); + target_type = int8_not_null(j, "target_type"); approximate_presence_count = int32_not_null(j, "approximate_presence_count"); approximate_member_count = int32_not_null(j, "approximate_member_count"); max_age = int32_not_null(j, "max_age"); @@ -55,14 +64,12 @@ invite& invite::fill_from_json(nlohmann::json* j) { std::string invite::build_json(bool with_id) const { json j; - if (max_age > 0) - j["max_age"] = max_age; - if (max_uses > 0) - j["max_uses"] = max_uses; + j["max_age"] = max_age; + j["max_uses"] = max_uses; if (target_user_id > 0) j["target_user"] = target_user_id; - if (target_user_type > 0) - j["target_user_type"] = target_user_type; + if (target_type > 0) + j["target_type"] = target_type; if (temporary) j["temporary"] = temporary; if (unique) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 4a14bd346c..246cfbbace 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -658,6 +658,20 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } }); + bot.on_invite_create([](const dpp::invite_create_t &event) { + auto &inv = event.created_invite; + if (!inv.code.empty() && inv.channel_id == TEST_TEXT_CHANNEL_ID && inv.guild_id == TEST_GUILD_ID && inv.created_at != 0 && inv.max_uses == 100) { + set_test("INVITE_CREATE_EVENT", true); + } + }); + + bot.on_invite_delete([](const dpp::invite_delete_t &event) { + auto &inv = event.deleted_invite; + if (!inv.code.empty() && inv.channel_id == TEST_TEXT_CHANNEL_ID && inv.guild_id == TEST_GUILD_ID) { + set_test("INVITE_DELETE_EVENT", true); + } + }); + bot.on_voice_buffer_send([&](const dpp::voice_buffer_send_t & event) { if (event.buffer_size == 0) { set_test("VOICESEND", true); @@ -963,6 +977,42 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b }); } + set_test("INVITE_CREATE", false); + set_test("INVITE_GET", false); + set_test("INVITE_DELETE", false); + if (!offline) { + dpp::channel channel; + channel.id = TEST_TEXT_CHANNEL_ID; + dpp::invite invite; + invite.max_age = 0; + invite.max_uses = 100; + set_test("INVITE_CREATE_EVENT", false); + bot.channel_invite_create(channel, invite, [&bot, invite](const dpp::confirmation_callback_t &event) { + if (event.is_error()) return; + + auto created = event.get(); + if (!created.code.empty() && created.channel_id == TEST_TEXT_CHANNEL_ID && created.guild_id == TEST_GUILD_ID && created.inviter_id != 0) { + set_test("INVITE_CREATE", true); + } + + bot.invite_get(created.code, [&bot, created](const dpp::confirmation_callback_t &event) { + if (event.is_error()) return; + + auto retrieved = event.get(); + if (retrieved.code == created.code && retrieved.expires_at == 0 && retrieved.guild_id == created.guild_id && retrieved.channel_id == created.channel_id && retrieved.inviter_id == created.inviter_id) { + set_test("INVITE_GET", true); + } + + set_test("INVITE_DELETE_EVENT", false); + bot.invite_delete(retrieved.code, [](const dpp::confirmation_callback_t &event) { + if (!event.is_error()) { + set_test("INVITE_DELETE", true); + } + }); + }); + }); + } + set_test("AUTOMOD_RULE_CREATE", false); set_test("AUTOMOD_RULE_GET", false); set_test("AUTOMOD_RULE_GET_ALL", false); diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index 15ef790a59..6313b33c37 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -142,6 +142,11 @@ std::map tests = { {"EMOJI_CREATE", {tt_online, "cluster::guild_emoji_create", false, false}}, {"EMOJI_GET", {tt_online, "cluster::guild_emoji_get", false, false}}, {"EMOJI_DELETE", {tt_online, "cluster::guild_emoji_delete", false, false}}, + {"INVITE_CREATE_EVENT", {tt_online, "cluster::on_invite_create", false, false}}, + {"INVITE_DELETE_EVENT", {tt_online, "cluster::on_invite_delete", false, false}}, + {"INVITE_CREATE", {tt_online, "cluster::channel_invite_create", false, false}}, + {"INVITE_GET", {tt_online, "cluster::invite_get", false, false}}, + {"INVITE_DELETE", {tt_online, "cluster::invite_delete", false, false}}, }; double start = dpp::utility::time_f(); From 513eb29d1423f5839564f71823f925f260d3702c Mon Sep 17 00:00:00 2001 From: Phil Date: Fri, 19 May 2023 19:19:47 +0200 Subject: [PATCH 041/101] fixed message reaction events not executed in threads (#696) --- include/dpp/dispatcher.h | 28 ++++++++++++++++--- src/dpp/events/message_reaction_add.cpp | 5 ++-- src/dpp/events/message_reaction_remove.cpp | 5 ++-- .../events/message_reaction_remove_all.cpp | 5 ++-- .../events/message_reaction_remove_emoji.cpp | 5 ++-- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/include/dpp/dispatcher.h b/include/dpp/dispatcher.h index c3cfe1d97b..8119b62160 100644 --- a/include/dpp/dispatcher.h +++ b/include/dpp/dispatcher.h @@ -916,7 +916,12 @@ struct DPP_EXPORT message_reaction_add_t : public event_dispatch_t { */ guild_member reacting_member; /** - * @brief channel the reaction happened on + * @brief Channel ID the reaction happened on + */ + snowflake channel_id; + /** + * @brief channel the reaction happened on (Optional) + * @note only filled when the channel is cached */ channel* reacting_channel; /** @@ -962,7 +967,12 @@ struct DPP_EXPORT message_reaction_remove_t : public event_dispatch_t { */ dpp::snowflake reacting_user_id; /** - * @brief channel the reaction happened on + * @brief Channel ID the reaction was removed in + */ + snowflake channel_id; + /** + * @brief channel the reaction happened on (optional) + * @note only filled when the channel is cached */ channel* reacting_channel; /** @@ -1040,7 +1050,12 @@ struct DPP_EXPORT message_reaction_remove_emoji_t : public event_dispatch_t { */ guild* reacting_guild; /** - * @brief channel the reaction happened on + * @brief Channel ID the reactions was removed in + */ + snowflake channel_id; + /** + * @brief channel the reaction happened on (optional) + * @note only filled when the channel is cached */ channel* reacting_channel; /** @@ -1149,7 +1164,12 @@ struct DPP_EXPORT message_reaction_remove_all_t : public event_dispatch_t { */ guild* reacting_guild; /** - * @brief channel the reaction happened on + * @brief Channel ID the reactions was removed in + */ + snowflake channel_id; + /** + * @brief channel the reaction happened on (optional) + * @note only filled when the channel is cached */ channel* reacting_channel; /** diff --git a/src/dpp/events/message_reaction_add.cpp b/src/dpp/events/message_reaction_add.cpp index b03b33465b..6c4c5ae184 100644 --- a/src/dpp/events/message_reaction_add.cpp +++ b/src/dpp/events/message_reaction_add.cpp @@ -45,10 +45,11 @@ void message_reaction_add::handle(discord_client* client, json &j, const std::st mra.reacting_guild = dpp::find_guild(guild_id); mra.reacting_user = dpp::user().fill_from_json(&(d["member"]["user"])); mra.reacting_member = dpp::guild_member().fill_from_json(&(d["member"]), guild_id, mra.reacting_user.id); - mra.reacting_channel = dpp::find_channel(snowflake_not_null(&d, "channel_id")); + mra.channel_id = snowflake_not_null(&d, "channel_id"); + mra.reacting_channel = dpp::find_channel(mra.channel_id); mra.message_id = snowflake_not_null(&d, "message_id"); mra.reacting_emoji = dpp::emoji().fill_from_json(&(d["emoji"])); - if (mra.reacting_channel && mra.message_id) { + if (mra.channel_id && mra.message_id) { client->creator->on_message_reaction_add.call(mra); } } diff --git a/src/dpp/events/message_reaction_remove.cpp b/src/dpp/events/message_reaction_remove.cpp index 5fe1edfa02..24ea1d2826 100644 --- a/src/dpp/events/message_reaction_remove.cpp +++ b/src/dpp/events/message_reaction_remove.cpp @@ -44,10 +44,11 @@ void message_reaction_remove::handle(discord_client* client, json &j, const std: dpp::snowflake guild_id = snowflake_not_null(&d, "guild_id"); mrr.reacting_guild = dpp::find_guild(guild_id); mrr.reacting_user_id = snowflake_not_null(&d, "user_id"); - mrr.reacting_channel = dpp::find_channel(snowflake_not_null(&d, "channel_id")); + mrr.channel_id = snowflake_not_null(&d, "channel_id"); + mrr.reacting_channel = dpp::find_channel(mrr.channel_id); mrr.message_id = snowflake_not_null(&d, "message_id"); mrr.reacting_emoji = dpp::emoji().fill_from_json(&(d["emoji"])); - if (mrr.reacting_channel && mrr.message_id) { + if (mrr.channel_id && mrr.message_id) { client->creator->on_message_reaction_remove.call(mrr); } } diff --git a/src/dpp/events/message_reaction_remove_all.cpp b/src/dpp/events/message_reaction_remove_all.cpp index ebf9f36220..d2147f0cac 100644 --- a/src/dpp/events/message_reaction_remove_all.cpp +++ b/src/dpp/events/message_reaction_remove_all.cpp @@ -42,9 +42,10 @@ void message_reaction_remove_all::handle(discord_client* client, json &j, const json &d = j["d"]; dpp::message_reaction_remove_all_t mrra(client, raw); mrra.reacting_guild = dpp::find_guild(snowflake_not_null(&d, "guild_id")); - mrra.reacting_channel = dpp::find_channel(snowflake_not_null(&d, "channel_id")); + mrra.channel_id = snowflake_not_null(&d, "channel_id"); + mrra.reacting_channel = dpp::find_channel(mrra.channel_id); mrra.message_id = snowflake_not_null(&d, "message_id"); - if (mrra.reacting_channel && mrra.message_id) { + if (mrra.channel_id && mrra.message_id) { client->creator->on_message_reaction_remove_all.call(mrra); } } diff --git a/src/dpp/events/message_reaction_remove_emoji.cpp b/src/dpp/events/message_reaction_remove_emoji.cpp index f334a46596..25fe4a5625 100644 --- a/src/dpp/events/message_reaction_remove_emoji.cpp +++ b/src/dpp/events/message_reaction_remove_emoji.cpp @@ -42,10 +42,11 @@ void message_reaction_remove_emoji::handle(discord_client* client, json &j, cons json &d = j["d"]; dpp::message_reaction_remove_emoji_t mrre(client, raw); mrre.reacting_guild = dpp::find_guild(snowflake_not_null(&d, "guild_id")); - mrre.reacting_channel = dpp::find_channel(snowflake_not_null(&d, "channel_id")); + mrre.channel_id = snowflake_not_null(&d, "channel_id"); + mrre.reacting_channel = dpp::find_channel(mrre.channel_id); mrre.message_id = snowflake_not_null(&d, "message_id"); mrre.reacting_emoji = dpp::emoji().fill_from_json(&(d["emoji"])); - if (mrre.reacting_channel && mrre.message_id) { + if (mrre.channel_id && mrre.message_id) { client->creator->on_message_reaction_remove_emoji.call(mrre); } } From 0b7218403d9e827d849d397cc05fc4715f8a59da Mon Sep 17 00:00:00 2001 From: harshfeudal <87577447+harshfeudal@users.noreply.github.com> Date: Sat, 20 May 2023 20:18:26 +0700 Subject: [PATCH 042/101] Bug fix Fix bug from not removing roles and reset nickname --- src/dpp/guild.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/dpp/guild.cpp b/src/dpp/guild.cpp index 4ae3dde966..3eadd20cc9 100644 --- a/src/dpp/guild.cpp +++ b/src/dpp/guild.cpp @@ -229,13 +229,20 @@ std::string guild_member::build_json(bool with_id) const { j["communication_disabled_until"] = json::value_t::null; } } - if (!this->nickname.empty()) - j["nick"] = this->nickname; + + if (!this->nickname.empty()) { + j["nick"] = json::value_t::null; + } else { + j["nick"] = find_user(user_id)->username; + } + if (!this->roles.empty()) { j["roles"] = {}; for (auto & role : this->roles) { j["roles"].push_back(std::to_string(role)); } + } else { + j["roles"] = {}; } if (this->flags & gm_voice_action) { From eef67e1dc22b6c6651e642b9cf011461720293bd Mon Sep 17 00:00:00 2001 From: harshfeudal <87577447+harshfeudal@users.noreply.github.com> Date: Sat, 20 May 2023 21:17:25 +0700 Subject: [PATCH 043/101] Fix: I stupid somehow --- src/dpp/guild.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dpp/guild.cpp b/src/dpp/guild.cpp index 3eadd20cc9..f30d48bda8 100644 --- a/src/dpp/guild.cpp +++ b/src/dpp/guild.cpp @@ -231,9 +231,9 @@ std::string guild_member::build_json(bool with_id) const { } if (!this->nickname.empty()) { - j["nick"] = json::value_t::null; + j["nick"] = this->nickname; } else { - j["nick"] = find_user(user_id)->username; + j["nick"] = json::value_t::null; } if (!this->roles.empty()) { From 810a82fa422bb14fc6cdb3d53a4c89be5fe0bb2e Mon Sep 17 00:00:00 2001 From: Amber Ehrlich Date: Fri, 19 May 2023 14:44:48 -0400 Subject: [PATCH 044/101] fix: fix linking errors on windows when linking an executable with dpp --- include/dpp/utility.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/dpp/utility.h b/include/dpp/utility.h index 4b003cc33a..dce4462982 100644 --- a/include/dpp/utility.h +++ b/include/dpp/utility.h @@ -60,7 +60,7 @@ namespace dpp { * @param is_animated Whether the image is actually animated or not * @return std::string endpoint url or empty string */ - std::string cdn_endpoint_url(const std::vector &allowed_formats, const std::string &path_without_extension, const dpp::image_type format, uint16_t size, bool prefer_animated = false, bool is_animated = false); + std::string DPP_EXPORT cdn_endpoint_url(const std::vector &allowed_formats, const std::string &path_without_extension, const dpp::image_type format, uint16_t size, bool prefer_animated = false, bool is_animated = false); /** * For internal use only. Helper function to easily create discord's cdn endpoint urls @@ -76,7 +76,7 @@ namespace dpp { * @param is_animated Whether the image is actually animated or not * @return std::string endpoint url or empty string */ - std::string cdn_endpoint_url_hash(const std::vector &allowed_formats, const std::string &path_without_extension, const std::string &hash, const dpp::image_type format, uint16_t size, bool prefer_animated = false, bool is_animated = false); + std::string DPP_EXPORT cdn_endpoint_url_hash(const std::vector &allowed_formats, const std::string &path_without_extension, const std::string &hash, const dpp::image_type format, uint16_t size, bool prefer_animated = false, bool is_animated = false); /** * For internal use only. Helper function to easily create discord's cdn endpoint urls (specialised for stickers) @@ -85,7 +85,7 @@ namespace dpp { * @param format The format type * @return std::string endpoint url or empty string */ - std::string cdn_endpoint_url_sticker(snowflake sticker_id, sticker_format format); + std::string DPP_EXPORT cdn_endpoint_url_sticker(snowflake sticker_id, sticker_format format); /** * @brief Timestamp formats for dpp::utility::timestamp() @@ -114,7 +114,7 @@ namespace dpp { /** * @brief The base URL for CDN content such as profile pictures and guild icons. */ - const std::string cdn_host = "https://cdn.discordapp.com"; + inline const std::string cdn_host = "https://cdn.discordapp.com"; /** * @brief Callback for the results of a command executed via dpp::utility::exec From 7e2ea124a7359d02e5e72c0aad04384e8074f3dd Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 08:15:21 +0000 Subject: [PATCH 045/101] force upgrade after update, we are possibly too far behind --- cmake/LINUXx86ToolChain.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/LINUXx86ToolChain.cmake b/cmake/LINUXx86ToolChain.cmake index 9f941ea4f3..e54d370ccf 100644 --- a/cmake/LINUXx86ToolChain.cmake +++ b/cmake/LINUXx86ToolChain.cmake @@ -25,6 +25,7 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 " CACHE INTERNAL "" FORCE) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture i386) EXECUTE_PROCESS(COMMAND sudo apt update) +EXECUTE_PROCESS(COMMAND sudo apt upgrade) EXECUTE_PROCESS(COMMAND sudo apt install -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium-dev:i386) EXECUTE_PROCESS(COMMAND sudo mv /usr/lib/i386-linux-gnu/pkgconfig/libsodium.pc /usr/lib/pkgconfig/) From ab7dc94ac3c508e65f290049f4d7b97dd4feafa5 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 08:20:33 +0000 Subject: [PATCH 046/101] bump to g++11 --- cmake/LINUXx86ToolChain.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/LINUXx86ToolChain.cmake b/cmake/LINUXx86ToolChain.cmake index f27670dd4e..57330d37e2 100644 --- a/cmake/LINUXx86ToolChain.cmake +++ b/cmake/LINUXx86ToolChain.cmake @@ -26,6 +26,6 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 " CACHE INTERNAL "" FORCE) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture i386) EXECUTE_PROCESS(COMMAND sudo apt-get update) EXECUTE_PROCESS(COMMAND sudo apt-get upgrade) -EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium-dev:i386) +EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-11 gcc-11-multilib glibc-*:i386 libc6-dev-i386 g++-11-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium-dev:i386) EXECUTE_PROCESS(COMMAND export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/) From cf1bac0638653c0069cc0ad1bdfe7fa32a6294f0 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 08:25:36 +0000 Subject: [PATCH 047/101] fix hard coded ref to g++ 10 --- cmake/LINUXx86ToolChain.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/LINUXx86ToolChain.cmake b/cmake/LINUXx86ToolChain.cmake index 57330d37e2..c2f0603a85 100644 --- a/cmake/LINUXx86ToolChain.cmake +++ b/cmake/LINUXx86ToolChain.cmake @@ -2,8 +2,8 @@ SET(CMAKE_SYSTEM_NAME Linux) # Possibly needed tweak #SET(CMAKE_SYSTEM_PROCESSOR i386) -SET(CMAKE_C_COMPILER gcc-10) -SET(CMAKE_CXX_COMPILER g++-10) +SET(CMAKE_C_COMPILER gcc-11) +SET(CMAKE_CXX_COMPILER g++-11) # Below call is necessary to avoid non-RT problem. SET(CMAKE_LIBRARY_ARCHITECTURE i386-linux-gnu) From fd16fd5997f8a7949134d1b07573fe86809d96b5 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 08:37:08 +0000 Subject: [PATCH 048/101] further adjustments --- .github/workflows/ci.yml | 2 +- cmake/LINUXx86ToolChain.cmake | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f9335ea9a0..1e96d931d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -191,7 +191,7 @@ jobs: cfg: - {name: "ARM64", os: ubuntu-20.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/ARM64ToolChain.cmake} - {name: "ARMv7 HF", os: ubuntu-20.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/ARMv7ToolChain.cmake} - - {name: "Linux x86", os: ubuntu-22.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/LINUXx86ToolChain.cmake} + - {name: "Linux x86", os: ubuntu-20.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/LINUXx86ToolChain.cmake} - {name: "ARMv6", os: ubuntu-20.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/ARMv6ToolChain.cmake} name: ${{matrix.cfg.name}} diff --git a/cmake/LINUXx86ToolChain.cmake b/cmake/LINUXx86ToolChain.cmake index c2f0603a85..f27670dd4e 100644 --- a/cmake/LINUXx86ToolChain.cmake +++ b/cmake/LINUXx86ToolChain.cmake @@ -2,8 +2,8 @@ SET(CMAKE_SYSTEM_NAME Linux) # Possibly needed tweak #SET(CMAKE_SYSTEM_PROCESSOR i386) -SET(CMAKE_C_COMPILER gcc-11) -SET(CMAKE_CXX_COMPILER g++-11) +SET(CMAKE_C_COMPILER gcc-10) +SET(CMAKE_CXX_COMPILER g++-10) # Below call is necessary to avoid non-RT problem. SET(CMAKE_LIBRARY_ARCHITECTURE i386-linux-gnu) @@ -26,6 +26,6 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 " CACHE INTERNAL "" FORCE) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture i386) EXECUTE_PROCESS(COMMAND sudo apt-get update) EXECUTE_PROCESS(COMMAND sudo apt-get upgrade) -EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-11 gcc-11-multilib glibc-*:i386 libc6-dev-i386 g++-11-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium-dev:i386) +EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium-dev:i386) EXECUTE_PROCESS(COMMAND export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/) From 42e1ed88fe4cf45269f2c44a7730b0cfa6d8064a Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 08:53:14 +0000 Subject: [PATCH 049/101] i386 pkgconfig test --- cmake/LINUXx86ToolChain.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/LINUXx86ToolChain.cmake b/cmake/LINUXx86ToolChain.cmake index f27670dd4e..106dc195d4 100644 --- a/cmake/LINUXx86ToolChain.cmake +++ b/cmake/LINUXx86ToolChain.cmake @@ -26,6 +26,6 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 " CACHE INTERNAL "" FORCE) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture i386) EXECUTE_PROCESS(COMMAND sudo apt-get update) EXECUTE_PROCESS(COMMAND sudo apt-get upgrade) -EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium-dev:i386) +EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium:i386 pkg-config:i386 libsodium-dev:i386) EXECUTE_PROCESS(COMMAND export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/) From 57a2262fc8be8f3005ac4676ac5b76c24082078b Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 08:56:27 +0000 Subject: [PATCH 050/101] revert some tweaks --- cmake/LINUXx86ToolChain.cmake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmake/LINUXx86ToolChain.cmake b/cmake/LINUXx86ToolChain.cmake index 106dc195d4..0b2cd3930e 100644 --- a/cmake/LINUXx86ToolChain.cmake +++ b/cmake/LINUXx86ToolChain.cmake @@ -25,7 +25,6 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 " CACHE INTERNAL "" FORCE) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture i386) EXECUTE_PROCESS(COMMAND sudo apt-get update) -EXECUTE_PROCESS(COMMAND sudo apt-get upgrade) -EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium:i386 pkg-config:i386 libsodium-dev:i386) +EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 pkg-config:i386 libsodium-dev:i386) EXECUTE_PROCESS(COMMAND export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/) From b27f2f6a46ac37b07d2ff0a44438bb24afad6821 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 09:00:15 +0000 Subject: [PATCH 051/101] fixes --- cmake/LINUXx86ToolChain.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/LINUXx86ToolChain.cmake b/cmake/LINUXx86ToolChain.cmake index 0b2cd3930e..93994a3511 100644 --- a/cmake/LINUXx86ToolChain.cmake +++ b/cmake/LINUXx86ToolChain.cmake @@ -25,6 +25,8 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 " CACHE INTERNAL "" FORCE) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture i386) EXECUTE_PROCESS(COMMAND sudo apt-get update) -EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 pkg-config:i386 libsodium-dev:i386) +EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium-dev:i386) EXECUTE_PROCESS(COMMAND export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/) +set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") + From f68bc2d5eef0b43c5080045a58a8aeafc3bdf68f Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 09:05:37 +0000 Subject: [PATCH 052/101] check for sodium_LIBRARY_RELEASE --- library/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index bf67e020b4..782afc717f 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -110,7 +110,7 @@ if (BUILD_VOICE_SUPPORT) if(DEFINED OPUS_FOUND) message("-- Found Opus ${Green}${OPUS_LIBRARIES}${ColourReset}") - if((WIN32 OR PKG_CONFIG_FOUND) AND DEFINED sodium_VERSION_STRING) + if((WIN32 OR PKG_CONFIG_FOUND) AND DEFINED sodium_VERSION_STRING AND DEFINED sodium_LIBRARY_RELEASE) add_compile_definitions(HAVE_VOICE) message("-- Sodium ${Green}${sodium_VERSION_STRING}${ColourReset}") From adb8946d6027b602ac1c44a34e6483b4c41e0199 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 09:10:23 +0000 Subject: [PATCH 053/101] disable broken voice support on packaged cross compiled x86 --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e96d931d8..1ec9ea239f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ on: - '**.cpp' - '**.h' - '**.hpp' - - '**.cmake' +1 - '**.cmake' - '**ci.yml' - '**CMakeLists.txt' @@ -191,7 +191,7 @@ jobs: cfg: - {name: "ARM64", os: ubuntu-20.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/ARM64ToolChain.cmake} - {name: "ARMv7 HF", os: ubuntu-20.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/ARMv7ToolChain.cmake} - - {name: "Linux x86", os: ubuntu-20.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/LINUXx86ToolChain.cmake} + - {name: "Linux x86", os: ubuntu-20.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/LINUXx86ToolChain.cmake -DBUILD_VOICE_SUPPORT=OFF} - {name: "ARMv6", os: ubuntu-20.04, cmake-options: -DCMAKE_TOOLCHAIN_FILE=cmake/ARMv6ToolChain.cmake} name: ${{matrix.cfg.name}} From 63ac3fed8bdd92e3122c6079b944f70fc9546dc2 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 09:11:45 +0000 Subject: [PATCH 054/101] stray character broke yaml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1ec9ea239f..8c2ed6ff86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ on: - '**.cpp' - '**.h' - '**.hpp' -1 - '**.cmake' + - '**.cmake' - '**ci.yml' - '**CMakeLists.txt' From f18c17d0a58df71e9244447ee5fc8353c54955fc Mon Sep 17 00:00:00 2001 From: DPP VCPKG Bot Date: Mon, 22 May 2023 16:32:39 +0000 Subject: [PATCH 055/101] [bot] VCPKG info update [skip ci] --- vcpkg/ports/dpp/portfile.cmake | 2 +- vcpkg/ports/dpp/vcpkg.json | 2 +- vcpkg/versions/baseline.json | 2847 +++++++++++++++++--------------- vcpkg/versions/d-/dpp.json | 10 + 4 files changed, 1556 insertions(+), 1305 deletions(-) diff --git a/vcpkg/ports/dpp/portfile.cmake b/vcpkg/ports/dpp/portfile.cmake index 5960baa8c9..f7f8c312d6 100644 --- a/vcpkg/ports/dpp/portfile.cmake +++ b/vcpkg/ports/dpp/portfile.cmake @@ -3,7 +3,7 @@ vcpkg_from_github( REPO brainboxdotcc/DPP REF "v${VERSION}" # Auto-generated by release CI action at brainboxdotcc/DPP - SHA512 18bbb7d2c1385d179cac9ded31d1b11e8d24f172e7ffe2ba79071203e1e2f277657e21d660b18ee4b849bc093d350f4bc5401702400084b56c3ebd6f03ce28df + SHA512 2f1e5415c121d5f19d2abb1b389512ad22c3cac6779ed897403d430b2c4e62c758ab25d46a3fd02538add711073fadd616a690b4981f3782e46c18ff05d116dc ) vcpkg_cmake_configure( diff --git a/vcpkg/ports/dpp/vcpkg.json b/vcpkg/ports/dpp/vcpkg.json index 196220474c..016e2b4faa 100644 --- a/vcpkg/ports/dpp/vcpkg.json +++ b/vcpkg/ports/dpp/vcpkg.json @@ -1,6 +1,6 @@ { "name": "dpp", - "version": "10.0.23", + "version": "10.0.24", "description": "D++ Extremely Lightweight C++ Discord Library.", "homepage": "https://dpp.dev/", "license": "Apache-2.0", diff --git a/vcpkg/versions/baseline.json b/vcpkg/versions/baseline.json index ea4472b03a..c27866ba0e 100644 --- a/vcpkg/versions/baseline.json +++ b/vcpkg/versions/baseline.json @@ -2,7 +2,7 @@ "default": { "3fd": { "baseline": "2.6.3", - "port-version": 2 + "port-version": 3 }, "7zip": { "baseline": "22.01", @@ -18,15 +18,15 @@ }, "abseil": { "baseline": "20230125.0", - "port-version": 0 + "port-version": 1 }, "absent": { "baseline": "0.3.1", - "port-version": 1 + "port-version": 3 }, "ace": { - "baseline": "7.0.11", - "port-version": 2 + "baseline": "7.1.0", + "port-version": 1 }, "acl": { "baseline": "2.3.1", @@ -34,11 +34,11 @@ }, "activemq-cpp": { "baseline": "3.9.5", - "port-version": 10 + "port-version": 12 }, "ade": { "baseline": "0.1.1f", - "port-version": 2 + "port-version": 3 }, "adios2": { "baseline": "2.8.3", @@ -56,25 +56,25 @@ "baseline": "1.5.0", "port-version": 1 }, - "akali": { - "baseline": "1.43", + "aklomp-base64": { + "baseline": "2023-01-06", "port-version": 1 }, "alac": { "baseline": "2017-11-03-c38887c5", - "port-version": 2 + "port-version": 4 }, "alac-decoder": { "baseline": "0.2", - "port-version": 5 + "port-version": 7 }, "alembic": { - "baseline": "1.8.3", - "port-version": 1 + "baseline": "1.8.5", + "port-version": 0 }, "aliyun-oss-c-sdk": { "baseline": "3.10.0", - "port-version": 1 + "port-version": 3 }, "allegro5": { "baseline": "5.2.6.0", @@ -89,11 +89,11 @@ "port-version": 1 }, "alsa": { - "baseline": "1.2.6.1", - "port-version": 2 + "baseline": "1.2.8", + "port-version": 1 }, "amd-amf": { - "baseline": "1.4.26", + "baseline": "1.4.29", "port-version": 0 }, "ampl-asl": { @@ -102,10 +102,10 @@ }, "ampl-mp": { "baseline": "2020-11-11", - "port-version": 3 + "port-version": 4 }, "amqpcpp": { - "baseline": "4.3.19", + "baseline": "4.3.23", "port-version": 0 }, "anax": { @@ -114,14 +114,14 @@ }, "angelscript": { "baseline": "2.36.0", - "port-version": 0 + "port-version": 1 }, "angle": { "baseline": "chromium_5414", - "port-version": 1 + "port-version": 2 }, "annoy": { - "baseline": "2023-02-25", + "baseline": "1.17.2", "port-version": 0 }, "antlr4": { @@ -134,7 +134,7 @@ }, "anyrpc": { "baseline": "2021-08-24", - "port-version": 1 + "port-version": 2 }, "aom": { "baseline": "3.5.0", @@ -145,8 +145,8 @@ "port-version": 0 }, "apr": { - "baseline": "1.7.0", - "port-version": 12 + "baseline": "1.7.2", + "port-version": 1 }, "apr-util": { "baseline": "1.6.1", @@ -165,12 +165,12 @@ "port-version": 2 }, "arg-router": { - "baseline": "1.2.0", + "baseline": "1.3.0", "port-version": 0 }, "argagg": { "baseline": "0.4.6", - "port-version": 1 + "port-version": 3 }, "argh": { "baseline": "1.3.2", @@ -178,10 +178,10 @@ }, "argon2": { "baseline": "20190702", - "port-version": 0 + "port-version": 1 }, "argparse": { - "baseline": "2.8", + "baseline": "2.9", "port-version": 0 }, "args": { @@ -197,15 +197,15 @@ "port-version": 3 }, "argumentum": { - "baseline": "0.3.1", - "port-version": 1 + "baseline": "0.3.2", + "port-version": 0 }, "aricpp": { "baseline": "1.1.2", "port-version": 0 }, "armadillo": { - "baseline": "11.4.4", + "baseline": "12.0.1", "port-version": 0 }, "arpack-ng": { @@ -214,18 +214,18 @@ }, "arrayfire": { "baseline": "3.8.0", - "port-version": 2 + "port-version": 4 }, "arrow": { - "baseline": "10.0.1", - "port-version": 4 + "baseline": "12.0.0", + "port-version": 1 }, "arsenalgear": { "baseline": "2.1.0", "port-version": 0 }, "ashes": { - "baseline": "2022-06-08", + "baseline": "2023-03-12", "port-version": 0 }, "asio": { @@ -233,16 +233,20 @@ "port-version": 1 }, "asio-grpc": { - "baseline": "2.4.0", + "baseline": "2.5.1", "port-version": 0 }, "asiosdk": { "baseline": "2.3.3", - "port-version": 5 + "port-version": 6 }, "asmjit": { - "baseline": "2021-10-26", - "port-version": 1 + "baseline": "2023-03-25", + "port-version": 0 + }, + "asmtk": { + "baseline": "2022-11-06", + "port-version": 0 }, "assimp": { "baseline": "5.2.5", @@ -250,7 +254,7 @@ }, "asynch": { "baseline": "2019-09-21", - "port-version": 2 + "port-version": 3 }, "asyncplusplus": { "baseline": "1.1", @@ -262,7 +266,7 @@ }, "at-spi2-core": { "baseline": "2.44.1", - "port-version": 1 + "port-version": 2 }, "atk": { "baseline": "2.38.0", @@ -270,11 +274,11 @@ }, "atkmm": { "baseline": "2.36.1", - "port-version": 0 + "port-version": 1 }, "atlmfc": { "baseline": "0", - "port-version": 1 + "port-version": 2 }, "atomic-queue": { "baseline": "2021-05-03", @@ -294,11 +298,11 @@ }, "aurora": { "baseline": "2017-06-21-c75699d2a8caa726260c29b6d7a0fd35f8f28933", - "port-version": 1 + "port-version": 2 }, "autobahn": { "baseline": "20.8.1", - "port-version": 1 + "port-version": 2 }, "autodock-vina": { "baseline": "1.2.3", @@ -354,7 +358,7 @@ }, "aws-c-s3": { "baseline": "0.2.3", - "port-version": 0 + "port-version": 1 }, "aws-c-sdkutils": { "baseline": "0.1.7", @@ -373,7 +377,7 @@ "port-version": 1 }, "aws-sdk-cpp": { - "baseline": "1.11.4", + "baseline": "1.11.65", "port-version": 0 }, "azmq": { @@ -385,7 +389,7 @@ "port-version": 0 }, "azure-core-cpp": { - "baseline": "1.8.0", + "baseline": "1.9.0", "port-version": 0 }, "azure-core-tracing-opentelemetry-cpp": { @@ -393,7 +397,7 @@ "port-version": 0 }, "azure-identity-cpp": { - "baseline": "1.4.0", + "baseline": "1.5.0", "port-version": 0 }, "azure-iot-sdk-c": { @@ -402,7 +406,7 @@ }, "azure-kinect-sensor-sdk": { "baseline": "1.4.1", - "port-version": 4 + "port-version": 5 }, "azure-macro-utils-c": { "baseline": "2022-01-21", @@ -412,36 +416,40 @@ "baseline": "1.1.0", "port-version": 0 }, + "azure-security-keyvault-administration-cpp": { + "baseline": "4.0.0-beta.3", + "port-version": 0 + }, "azure-security-keyvault-certificates-cpp": { - "baseline": "4.1.0", + "baseline": "4.2.0", "port-version": 0 }, "azure-security-keyvault-keys-cpp": { - "baseline": "4.3.0", + "baseline": "4.4.0", "port-version": 0 }, "azure-security-keyvault-secrets-cpp": { - "baseline": "4.1.0", + "baseline": "4.2.0", "port-version": 0 }, "azure-storage-blobs-cpp": { - "baseline": "12.6.2", + "baseline": "12.7.0", "port-version": 0 }, "azure-storage-common-cpp": { - "baseline": "12.3.0", + "baseline": "12.3.2", "port-version": 0 }, "azure-storage-cpp": { "baseline": "7.5.0", - "port-version": 3 + "port-version": 5 }, "azure-storage-files-datalake-cpp": { - "baseline": "12.5.0", + "baseline": "12.6.0", "port-version": 0 }, "azure-storage-files-shares-cpp": { - "baseline": "12.3.0", + "baseline": "12.5.0", "port-version": 0 }, "azure-storage-queues-cpp": { @@ -464,6 +472,10 @@ "baseline": "2.0.0.1", "port-version": 2 }, + "backward-cpp": { + "baseline": "1.6", + "port-version": 1 + }, "basisu": { "baseline": "1.11", "port-version": 7 @@ -486,14 +498,14 @@ }, "beast": { "baseline": "0", - "port-version": 1 + "port-version": 2 }, "behaviortree-cpp": { - "baseline": "3.5.6", - "port-version": 2 + "baseline": "4.1.1", + "port-version": 0 }, "benchmark": { - "baseline": "1.7.1", + "baseline": "1.8.0", "port-version": 0 }, "bento4": { @@ -502,7 +514,7 @@ }, "berkeleydb": { "baseline": "4.8.30", - "port-version": 8 + "port-version": 9 }, "bext-di": { "baseline": "1.2.0", @@ -530,15 +542,15 @@ }, "bigint": { "baseline": "2010.04.30", - "port-version": 7 + "port-version": 8 }, "binlog": { "baseline": "2021-04-16", - "port-version": 0 + "port-version": 1 }, "binn": { "baseline": "3.0", - "port-version": 1 + "port-version": 3 }, "bitmagic": { "baseline": "7.12.3", @@ -573,8 +585,8 @@ "port-version": 0 }, "blas": { - "baseline": "1", - "port-version": 1 + "baseline": "2023-03-25", + "port-version": 0 }, "blaze": { "baseline": "3.8.1", @@ -582,7 +594,11 @@ }, "blend2d": { "baseline": "2022-12-31", - "port-version": 2 + "port-version": 3 + }, + "blingfire": { + "baseline": "0.1.8.1", + "port-version": 0 }, "blitz": { "baseline": "2020-03-25", @@ -593,636 +609,640 @@ "port-version": 0 }, "boinc": { - "baseline": "7.22.0", - "port-version": 0 + "baseline": "7.22.1", + "port-version": 1 }, "bond": { - "baseline": "9.0.3", - "port-version": 3 + "baseline": "10.0.0", + "port-version": 0 }, "boolinq": { "baseline": "3.0.4", "port-version": 0 }, "boost": { - "baseline": "1.81.0", - "port-version": 3 + "baseline": "1.82.0", + "port-version": 1 }, "boost-accumulators": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-algorithm": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-align": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-any": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-array": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-asio": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-assert": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-assign": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-atomic": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-beast": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-bimap": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-bind": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-build": { - "baseline": "1.81.0", - "port-version": 3 + "baseline": "1.82.0", + "port-version": 1 }, "boost-callable-traits": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-chrono": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-circular-buffer": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-compatibility": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-compute": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-concept-check": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-config": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-container": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-container-hash": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-context": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-contract": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-conversion": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-convert": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-core": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-coroutine": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-coroutine2": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-crc": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-date-time": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-describe": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-detail": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-di": { "baseline": "1.2.0", "port-version": 0 }, "boost-dll": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-dynamic-bitset": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-endian": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-exception": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-fiber": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-filesystem": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-flyweight": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-foreach": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-format": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-function": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-function-types": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-functional": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-fusion": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-geometry": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-gil": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-graph": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-graph-parallel": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-hana": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-heap": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-histogram": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-hof": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-icl": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-integer": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-interprocess": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-interval": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-intrusive": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-io": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-iostreams": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-iterator": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-json": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-lambda": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-lambda2": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-leaf": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-lexical-cast": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-local-function": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-locale": { - "baseline": "1.81.0", - "port-version": 3 + "baseline": "1.82.0", + "port-version": 1 }, "boost-lockfree": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-log": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-logic": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-math": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-metaparse": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-modular-build-helper": { - "baseline": "1.81.0", - "port-version": 5 + "baseline": "1.82.0", + "port-version": 1 }, "boost-move": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-mp11": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-mpi": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-mpl": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-msm": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-multi-array": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-multi-index": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-multiprecision": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 + }, + "boost-mysql": { + "baseline": "1.82.0", + "port-version": 1 }, "boost-nowide": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-numeric-conversion": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-odeint": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-optional": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-outcome": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-parameter": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-parameter-python": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-pfr": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-phoenix": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-poly-collection": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-polygon": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-pool": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-predef": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-preprocessor": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-process": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-program-options": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-property-map": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-property-map-parallel": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-property-tree": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-proto": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-ptr-container": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-python": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-qvm": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-random": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-range": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-ratio": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-rational": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-regex": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-safe-numerics": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-scope-exit": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-serialization": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-signals2": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-smart-ptr": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-sort": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-spirit": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-stacktrace": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-statechart": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-static-assert": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-static-string": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-stl-interfaces": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-system": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-test": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-thread": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-throw-exception": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-timer": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-tokenizer": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-tti": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-tuple": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-type-erasure": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-type-index": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-type-traits": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-typeof": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-ublas": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-uninstall": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-units": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-unordered": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-url": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-utility": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-uuid": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-variant": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-variant2": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-vcpkg-helpers": { - "baseline": "1.81.0", - "port-version": 3 + "baseline": "1.82.0", + "port-version": 1 }, "boost-vmd": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-wave": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-winapi": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-xpressive": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boost-yap": { - "baseline": "1.81.0", - "port-version": 2 + "baseline": "1.82.0", + "port-version": 1 }, "boringssl": { "baseline": "2021-06-23", - "port-version": 3 + "port-version": 4 }, "botan": { "baseline": "2.19.3", - "port-version": 0 + "port-version": 1 }, "box2d": { "baseline": "2.4.1", - "port-version": 2 + "port-version": 3 }, "braft": { "baseline": "2021-26-04", @@ -1230,11 +1250,11 @@ }, "breakpad": { "baseline": "2022-07-12", - "port-version": 2 + "port-version": 4 }, "brigand": { "baseline": "1.3.0", - "port-version": 2 + "port-version": 3 }, "brotli": { "baseline": "1.0.9", @@ -1253,7 +1273,7 @@ "port-version": 0 }, "bshoshany-thread-pool": { - "baseline": "3.3.0", + "baseline": "3.4.0", "port-version": 0 }, "bsio": { @@ -1273,8 +1293,8 @@ "port-version": 0 }, "bullet3": { - "baseline": "3.22", - "port-version": 2 + "baseline": "3.25", + "port-version": 0 }, "bustache": { "baseline": "1.1.0", @@ -1282,7 +1302,11 @@ }, "butteraugli": { "baseline": "2019-05-08", - "port-version": 2 + "port-version": 4 + }, + "bxzstr": { + "baseline": "1.2.0", + "port-version": 0 }, "byte-lite": { "baseline": "0.3.0", @@ -1290,7 +1314,7 @@ }, "bzip2": { "baseline": "1.0.8", - "port-version": 3 + "port-version": 4 }, "c-ares": { "baseline": "1.19.0", @@ -1312,9 +1336,13 @@ "baseline": "0.7.0", "port-version": 0 }, + "cachelib": { + "baseline": "2023.05.08.00", + "port-version": 0 + }, "caf": { - "baseline": "0.18.6", - "port-version": 1 + "baseline": "0.19.1", + "port-version": 0 }, "caffe2": { "baseline": "0.8.1", @@ -1326,10 +1354,10 @@ }, "cairomm": { "baseline": "1.16.2", - "port-version": 2 + "port-version": 3 }, "calceph": { - "baseline": "3.5.1", + "baseline": "3.5.2", "port-version": 0 }, "camport3": { @@ -1342,7 +1370,7 @@ }, "capstone": { "baseline": "5.0.0-rc2", - "port-version": 1 + "port-version": 2 }, "cargs": { "baseline": "1.0.3", @@ -1362,10 +1390,10 @@ }, "catch-classic": { "baseline": "1.12.2", - "port-version": 1 + "port-version": 2 }, "catch2": { - "baseline": "3.3.1", + "baseline": "3.3.2", "port-version": 0 }, "cccapstone": { @@ -1378,15 +1406,19 @@ }, "ccfits": { "baseline": "2.5", - "port-version": 9 + "port-version": 11 }, "cctag": { "baseline": "1.0.2", - "port-version": 2 + "port-version": 3 }, "cctz": { "baseline": "2.3", - "port-version": 3 + "port-version": 5 + }, + "cdt": { + "baseline": "1.3.0", + "port-version": 0 }, "celero": { "baseline": "2.8.5", @@ -1394,7 +1426,7 @@ }, "cello": { "baseline": "2019-07-23", - "port-version": 2 + "port-version": 3 }, "cereal": { "baseline": "1.3.2", @@ -1402,19 +1434,19 @@ }, "ceres": { "baseline": "2.1.0", - "port-version": 3 + "port-version": 4 }, "cfitsio": { "baseline": "3.49", - "port-version": 2 + "port-version": 3 }, "cgal": { - "baseline": "5.5.1", + "baseline": "5.5.2", "port-version": 0 }, "cgicc": { "baseline": "3.2.19", - "port-version": 5 + "port-version": 7 }, "cgl": { "baseline": "0.60.3", @@ -1434,11 +1466,11 @@ }, "chaiscript": { "baseline": "6.1.0", - "port-version": 2 + "port-version": 3 }, "chakracore": { "baseline": "2022-11-09", - "port-version": 2 + "port-version": 3 }, "charls": { "baseline": "2.4.1", @@ -1446,7 +1478,7 @@ }, "chartdir": { "baseline": "7.0.0", - "port-version": 6 + "port-version": 7 }, "check": { "baseline": "0.15.2", @@ -1454,15 +1486,15 @@ }, "chipmunk": { "baseline": "7.0.3", - "port-version": 2 + "port-version": 4 }, "chmlib": { "baseline": "0.40", - "port-version": 6 + "port-version": 7 }, "chromaprint": { "baseline": "1.5.0", - "port-version": 1 + "port-version": 2 }, "chromium-base": { "baseline": "86.0.4199.1", @@ -1472,6 +1504,10 @@ "baseline": "8.0.0", "port-version": 0 }, + "cialloo-rcon": { + "baseline": "1.0.0", + "port-version": 0 + }, "cimg": { "baseline": "2.9.9", "port-version": 0 @@ -1494,15 +1530,15 @@ }, "clamav": { "baseline": "0.103.0", - "port-version": 3 + "port-version": 4 }, "clapack": { "baseline": "3.2.1", - "port-version": 20 + "port-version": 21 }, "clara": { "baseline": "1.1.5", - "port-version": 1 + "port-version": 2 }, "clblas": { "baseline": "2.12", @@ -1566,15 +1602,15 @@ }, "cmcstl2": { "baseline": "2019-07-20", - "port-version": 1 + "port-version": 3 }, "cminpack": { "baseline": "1.3.8", - "port-version": 1 + "port-version": 3 }, "cmocka": { "baseline": "2020-08-01", - "port-version": 1 + "port-version": 3 }, "cnats": { "baseline": "3.6.0", @@ -1582,7 +1618,7 @@ }, "cnl": { "baseline": "1.1.7", - "port-version": 1 + "port-version": 3 }, "co": { "baseline": "2.0.3", @@ -1594,7 +1630,7 @@ }, "coin": { "baseline": "4.0.0", - "port-version": 5 + "port-version": 7 }, "coin-or-buildtools": { "baseline": "2023-02-02", @@ -1622,11 +1658,11 @@ }, "collada-dom": { "baseline": "2.5.0", - "port-version": 8 + "port-version": 9 }, "colmap": { - "baseline": "2022-03-14", - "port-version": 2 + "baseline": "2023-03-12", + "port-version": 1 }, "color-console": { "baseline": "2022-03-20", @@ -1649,15 +1685,15 @@ "port-version": 0 }, "concurrencpp": { - "baseline": "0.1.5", + "baseline": "0.1.6", "port-version": 0 }, "concurrentqueue": { "baseline": "1.0.3", - "port-version": 0 + "port-version": 1 }, "configcat": { - "baseline": "1.0.0", + "baseline": "2.0.1", "port-version": 0 }, "console-bridge": { @@ -1670,7 +1706,7 @@ }, "constexpr-contracts": { "baseline": "2020-08-09", - "port-version": 1 + "port-version": 3 }, "continuable": { "baseline": "4.2.0", @@ -1681,24 +1717,24 @@ "port-version": 0 }, "coolprop": { - "baseline": "6.4.1", + "baseline": "6.4.3", "port-version": 2 }, "coroutine": { "baseline": "1.5.0", - "port-version": 4 + "port-version": 5 }, "corrade": { "baseline": "2020.06", - "port-version": 4 + "port-version": 5 }, "cpp-base64": { "baseline": "V2.rc.08", "port-version": 0 }, "cpp-httplib": { - "baseline": "0.11.3", - "port-version": 1 + "baseline": "0.12.3", + "port-version": 0 }, "cpp-ipc": { "baseline": "1.2.0", @@ -1710,7 +1746,7 @@ }, "cpp-netlib": { "baseline": "0.13.0", - "port-version": 6 + "port-version": 8 }, "cpp-peglib": { "baseline": "1.3.10", @@ -1722,7 +1758,7 @@ }, "cpp-taskflow": { "baseline": "2.6.0", - "port-version": 1 + "port-version": 2 }, "cpp-timsort": { "baseline": "2.1.0", @@ -1738,7 +1774,7 @@ }, "cppcodec": { "baseline": "0.2", - "port-version": 3 + "port-version": 4 }, "cppcoro": { "baseline": "2022-10-25", @@ -1754,27 +1790,31 @@ }, "cppitertools": { "baseline": "2.1", - "port-version": 2 + "port-version": 3 }, "cppkafka": { - "baseline": "0.3.1", - "port-version": 3 + "baseline": "0.4.0", + "port-version": 0 }, "cppmicroservices": { "baseline": "3.6.0", - "port-version": 0 + "port-version": 1 }, "cpprestsdk": { "baseline": "2.10.18", "port-version": 2 }, + "cppslippi": { + "baseline": "1.0.3.14", + "port-version": 0 + }, "cpptoml": { "baseline": "v0.1.1", "port-version": 2 }, "cppunit": { "baseline": "1.15.1", - "port-version": 3 + "port-version": 4 }, "cpputest": { "baseline": "2019-9-16", @@ -1786,14 +1826,14 @@ }, "cppxaml": { "baseline": "0.0.16", - "port-version": 0 + "port-version": 1 }, "cppzmq": { "baseline": "4.9.0", "port-version": 0 }, "cpr": { - "baseline": "1.9.3", + "baseline": "1.10.2+3", "port-version": 0 }, "cpu-features": { @@ -1810,11 +1850,11 @@ }, "cr": { "baseline": "2020-04-26", - "port-version": 1 + "port-version": 2 }, "crashpad": { "baseline": "2022-09-05", - "port-version": 3 + "port-version": 4 }, "crashrpt": { "baseline": "1.4.3", @@ -1845,24 +1885,24 @@ "port-version": 3 }, "cserialport": { - "baseline": "4.2.1", + "baseline": "4.3.0", "port-version": 0 }, "cspice": { "baseline": "67", - "port-version": 2 + "port-version": 3 }, "ctbignum": { "baseline": "2019-08-02", - "port-version": 1 + "port-version": 3 }, "ctemplate": { "baseline": "2020-09-14", - "port-version": 4 + "port-version": 5 }, "ctp": { "baseline": "6.6.1_P1_20210406_se", - "port-version": 3 + "port-version": 4 }, "ctpg": { "baseline": "1.3.7", @@ -1882,19 +1922,19 @@ }, "cuda": { "baseline": "10.1", - "port-version": 11 + "port-version": 13 }, "cudnn": { "baseline": "7.6.5", - "port-version": 8 + "port-version": 9 }, "cunit": { "baseline": "2.1.3", "port-version": 8 }, "curl": { - "baseline": "7.88.1", - "port-version": 1 + "baseline": "8.0.1", + "port-version": 0 }, "curlpp": { "baseline": "2018-06-15", @@ -1902,7 +1942,7 @@ }, "cute-headers": { "baseline": "2019-09-20", - "port-version": 1 + "port-version": 2 }, "cutelyst2": { "baseline": "2.12.0", @@ -1913,11 +1953,11 @@ "port-version": 0 }, "cxxopts": { - "baseline": "3.1.0", + "baseline": "3.1.1", "port-version": 0 }, "cyclonedds": { - "baseline": "0.10.2", + "baseline": "0.10.3", "port-version": 0 }, "cyclonedds-cxx": { @@ -1934,19 +1974,19 @@ }, "d3dx12": { "baseline": "may2021", - "port-version": 0 + "port-version": 1 }, "darknet": { "baseline": "2022-03-06", - "port-version": 2 + "port-version": 3 }, "darts-clone": { "baseline": "1767ab87cffe", - "port-version": 2 + "port-version": 3 }, "dartsim": { "baseline": "6.12.2", - "port-version": 1 + "port-version": 2 }, "dataframe": { "baseline": "1.22.0", @@ -1958,18 +1998,22 @@ }, "dav1d": { "baseline": "1.1.0", - "port-version": 0 + "port-version": 1 }, "daw-header-libraries": { - "baseline": "2.76.2", + "baseline": "2.88.0", "port-version": 0 }, "daw-json-link": { - "baseline": "3.10.0", + "baseline": "3.15.0", "port-version": 0 }, "daw-utf-range": { - "baseline": "2.2.2", + "baseline": "2.2.3", + "port-version": 0 + }, + "daxa": { + "baseline": "1.0.0", "port-version": 0 }, "dbg-macro": { @@ -1982,7 +2026,7 @@ }, "dbow2": { "baseline": "2019-08-05", - "port-version": 1 + "port-version": 3 }, "dbow3": { "baseline": "1.0.0", @@ -1998,11 +2042,11 @@ }, "debug-assert": { "baseline": "1.3.3", - "port-version": 0 + "port-version": 2 }, "decimal-for-cpp": { "baseline": "1.18", - "port-version": 0 + "port-version": 1 }, "detours": { "baseline": "4.0.1", @@ -2014,18 +2058,18 @@ }, "devil": { "baseline": "1.8.0", - "port-version": 9 + "port-version": 10 }, "dimcli": { "baseline": "7.1.0", "port-version": 0 }, "directx-dxc": { - "baseline": "2022-12-16", - "port-version": 0 + "baseline": "2023-03-01", + "port-version": 1 }, "directx-headers": { - "baseline": "1.608.2", + "baseline": "1.610.2", "port-version": 0 }, "directxmath": { @@ -2033,36 +2077,36 @@ "port-version": 0 }, "directxmesh": { - "baseline": "2022-12-15", + "baseline": "2023-04-28", "port-version": 0 }, "directxsdk": { "baseline": "jun10", - "port-version": 5 + "port-version": 7 }, "directxtex": { - "baseline": "2023-01-31", + "baseline": "2023-04-28", "port-version": 1 }, "directxtk": { - "baseline": "2023-02-06", + "baseline": "2023-04-28", "port-version": 0 }, "directxtk12": { - "baseline": "2023-02-06", + "baseline": "2023-04-28", "port-version": 0 }, "dirent": { "baseline": "1.23.2", - "port-version": 1 + "port-version": 2 }, "discord-game-sdk": { - "baseline": "2.5.6", - "port-version": 4 + "baseline": "3.2.1", + "port-version": 0 }, "discord-rpc": { "baseline": "3.4.0", - "port-version": 1 + "port-version": 3 }, "discordcoreapi": { "baseline": "2023-01-02", @@ -2070,11 +2114,11 @@ }, "discount": { "baseline": "2.2.6", - "port-version": 1 + "port-version": 3 }, "discreture": { "baseline": "2020-01-29", - "port-version": 1 + "port-version": 3 }, "distorm": { "baseline": "3.5.2b", @@ -2094,26 +2138,26 @@ }, "docopt": { "baseline": "2018-11-01", - "port-version": 1 + "port-version": 3 }, "doctest": { - "baseline": "2.4.9", + "baseline": "2.4.11", "port-version": 0 }, "double-conversion": { "baseline": "3.2.1", - "port-version": 0 + "port-version": 1 }, "dpdk": { "baseline": "22.07", "port-version": 1 }, "dpp": { - "baseline": "10.0.23", + "baseline": "10.0.24", "port-version": 0 }, "draco": { - "baseline": "1.5.3", + "baseline": "1.5.6", "port-version": 0 }, "drlibs": { @@ -2121,12 +2165,12 @@ "port-version": 0 }, "drogon": { - "baseline": "1.8.2", - "port-version": 1 + "baseline": "1.8.4", + "port-version": 0 }, "dstorage": { - "baseline": "1.1.0", - "port-version": 1 + "baseline": "1.2.0", + "port-version": 0 }, "dtl": { "baseline": "1.20", @@ -2142,27 +2186,31 @@ }, "duktape": { "baseline": "2.5.0", - "port-version": 2 + "port-version": 4 + }, + "dumb": { + "baseline": "2.0.3", + "port-version": 0 }, "dv-processing": { "baseline": "1.7.8", - "port-version": 0 + "port-version": 1 }, "dx": { "baseline": "1.0.1", - "port-version": 2 + "port-version": 3 }, "dxsdk-d3dx": { "baseline": "9.29.952.8", - "port-version": 4 + "port-version": 6 }, "dxut": { "baseline": "11.31", - "port-version": 1 + "port-version": 2 }, "eabase": { "baseline": "2.09.12", - "port-version": 2 + "port-version": 3 }, "earcut-hpp": { "baseline": "2.2.4", @@ -2174,7 +2222,7 @@ }, "easycl": { "baseline": "0.3", - "port-version": 1 + "port-version": 2 }, "easyexif": { "baseline": "2022-10-07", @@ -2182,18 +2230,18 @@ }, "easyhook": { "baseline": "2.7.7097.0", - "port-version": 5 + "port-version": 6 }, "easyloggingpp": { "baseline": "9.97.0", - "port-version": 2 + "port-version": 3 }, "eathread": { "baseline": "1.32.09", - "port-version": 3 + "port-version": 5 }, "ebml": { - "baseline": "1.4.2", + "baseline": "1.4.4", "port-version": 1 }, "ecm": { @@ -2202,14 +2250,14 @@ }, "ecos": { "baseline": "2.0.8", - "port-version": 1 + "port-version": 3 }, "ecsutil": { "baseline": "1.0.7.15", - "port-version": 3 + "port-version": 4 }, "edflib": { - "baseline": "1.21", + "baseline": "1.24", "port-version": 0 }, "edlib": { @@ -2218,7 +2266,7 @@ }, "effects11": { "baseline": "11.29", - "port-version": 1 + "port-version": 2 }, "effolkronium-random": { "baseline": "1.4.1", @@ -2254,7 +2302,7 @@ }, "embree3": { "baseline": "3.13.5", - "port-version": 1 + "port-version": 2 }, "enet": { "baseline": "1.3.17", @@ -2266,7 +2314,7 @@ }, "entityx": { "baseline": "1.3.0", - "port-version": 3 + "port-version": 5 }, "entt": { "baseline": "3.11.1", @@ -2285,7 +2333,7 @@ "port-version": 1 }, "etcd-cpp-apiv3": { - "baseline": "0.2.12", + "baseline": "0.14.2", "port-version": 1 }, "etl": { @@ -2293,7 +2341,7 @@ "port-version": 0 }, "eve": { - "baseline": "2022.9.1", + "baseline": "2023.2.15", "port-version": 0 }, "eventpp": { @@ -2313,7 +2361,7 @@ "port-version": 3 }, "expected-lite": { - "baseline": "0.6.2", + "baseline": "0.6.3", "port-version": 0 }, "exprtk": { @@ -2334,10 +2382,10 @@ }, "fadbad": { "baseline": "2.1.0", - "port-version": 1 + "port-version": 2 }, "faiss": { - "baseline": "1.7.2", + "baseline": "1.7.3", "port-version": 0 }, "fakeit": { @@ -2357,7 +2405,7 @@ "port-version": 2 }, "fast-float": { - "baseline": "3.5.1", + "baseline": "4.0.0", "port-version": 0 }, "fastcdr": { @@ -2370,10 +2418,10 @@ }, "fastfeat": { "baseline": "391d5e9", - "port-version": 2 + "port-version": 4 }, "fastgltf": { - "baseline": "0.2.0", + "baseline": "0.4.0", "port-version": 0 }, "fastio": { @@ -2382,7 +2430,7 @@ }, "fastlz": { "baseline": "2021-05-10", - "port-version": 0 + "port-version": 2 }, "fastor": { "baseline": "2021-11-22", @@ -2390,19 +2438,19 @@ }, "fastrtps": { "baseline": "2.7.0", - "port-version": 0 + "port-version": 1 }, "fawdlstty-libfv": { "baseline": "0.0.8", "port-version": 0 }, "fbgemm": { - "baseline": "2021-03-18", - "port-version": 4 + "baseline": "0.4.1", + "port-version": 0 }, "fbthrift": { "baseline": "2022.03.21.00", - "port-version": 2 + "port-version": 3 }, "fcl": { "baseline": "0.7.0", @@ -2414,11 +2462,11 @@ }, "fdlibm": { "baseline": "5.3", - "port-version": 5 + "port-version": 7 }, "ffmpeg": { "baseline": "5.1.2", - "port-version": 4 + "port-version": 6 }, "ffnvcodec": { "baseline": "11.1.5.0", @@ -2426,19 +2474,23 @@ }, "fftw3": { "baseline": "3.3.10", - "port-version": 5 + "port-version": 6 }, "fftwpp": { "baseline": "2019-12-19", "port-version": 2 }, + "fineftp": { + "baseline": "1.3.4", + "port-version": 0 + }, "fixed-string": { "baseline": "0.1.1", "port-version": 0 }, "fizz": { "baseline": "2022.10.31.00", - "port-version": 0 + "port-version": 1 }, "flann": { "baseline": "2019-04-07", @@ -2450,43 +2502,43 @@ }, "flashlight-cpu": { "baseline": "0.3", - "port-version": 3 + "port-version": 5 }, "flashlight-cuda": { "baseline": "0.3", - "port-version": 4 + "port-version": 6 }, "flat": { "baseline": "2022-08-30", "port-version": 0 }, "flatbuffers": { - "baseline": "23.1.21", - "port-version": 1 + "baseline": "23.3.3", + "port-version": 0 }, "flecs": { - "baseline": "3.1.4", - "port-version": 0 + "baseline": "3.2.2", + "port-version": 1 }, "flint": { "baseline": "2.8.0", - "port-version": 1 + "port-version": 2 }, "fltk": { "baseline": "1.3.8", - "port-version": 4 + "port-version": 5 }, "fluidlite": { - "baseline": "2020-08-27", - "port-version": 3 + "baseline": "2023-04-18", + "port-version": 0 }, "fluidsynth": { - "baseline": "2.3.1", - "port-version": 1 + "baseline": "2.3.2", + "port-version": 2 }, "fmem": { "baseline": "c-libs-2ccee3d2fb", - "port-version": 1 + "port-version": 3 }, "fmi4cpp": { "baseline": "0.8.0", @@ -2494,15 +2546,15 @@ }, "fmilib": { "baseline": "2.4.1", - "port-version": 0 + "port-version": 2 }, "fmt": { - "baseline": "9.1.0", - "port-version": 1 + "baseline": "10.0.0", + "port-version": 0 }, "folly": { "baseline": "2022.10.31.00", - "port-version": 4 + "port-version": 6 }, "font-chef": { "baseline": "1.1.0", @@ -2513,8 +2565,8 @@ "port-version": 1 }, "fontconfig": { - "baseline": "2.14.1", - "port-version": 1 + "baseline": "2.14.2", + "port-version": 0 }, "foonathan-lexy": { "baseline": "2022.12.1", @@ -2522,7 +2574,7 @@ }, "foonathan-memory": { "baseline": "2019-07-21", - "port-version": 2 + "port-version": 4 }, "forest": { "baseline": "12.1.0", @@ -2530,7 +2582,7 @@ }, "forge": { "baseline": "1.0.8", - "port-version": 1 + "port-version": 3 }, "foxi": { "baseline": "2021-12-01", @@ -2538,7 +2590,7 @@ }, "fp16": { "baseline": "2021-02-21", - "port-version": 0 + "port-version": 2 }, "fplus": { "baseline": "0.2.18-p0", @@ -2558,7 +2610,7 @@ }, "freeopcua": { "baseline": "20190125", - "port-version": 5 + "port-version": 7 }, "freerdp": { "baseline": "2.9.0", @@ -2574,11 +2626,11 @@ }, "freetype-gl": { "baseline": "2022-01-17", - "port-version": 1 + "port-version": 2 }, "freexl": { "baseline": "1.0.6", - "port-version": 1 + "port-version": 2 }, "fribidi": { "baseline": "1.0.12", @@ -2610,7 +2662,7 @@ }, "functions-framework-cpp": { "baseline": "1.1.0", - "port-version": 1 + "port-version": 4 }, "fuzzylite": { "baseline": "6.0", @@ -2618,15 +2670,15 @@ }, "fxdiv": { "baseline": "2021-02-21", - "port-version": 0 + "port-version": 2 }, "g2o": { "baseline": "2020-02-07", - "port-version": 2 + "port-version": 4 }, "g3log": { - "baseline": "2.1", - "port-version": 0 + "baseline": "2.3", + "port-version": 1 }, "gainput": { "baseline": "1.0.0", @@ -2642,15 +2694,15 @@ }, "gamma": { "baseline": "gamma-2018-01-27", - "port-version": 4 + "port-version": 6 }, "gasol": { "baseline": "2018-01-04", - "port-version": 2 + "port-version": 4 }, "gaussianlib": { "baseline": "2019-08-04", - "port-version": 1 + "port-version": 2 }, "gazebo": { "baseline": "2022-01-20", @@ -2661,20 +2713,20 @@ "port-version": 0 }, "gdal": { - "baseline": "3.6.2", - "port-version": 2 + "baseline": "3.7.0", + "port-version": 0 }, "gdcm": { - "baseline": "3.0.12", - "port-version": 1 + "baseline": "3.0.22", + "port-version": 0 }, "gdcm2": { "baseline": "deprecated", "port-version": 1 }, "gdk-pixbuf": { - "baseline": "2.42.9", - "port-version": 5 + "baseline": "2.42.10", + "port-version": 0 }, "gemmlowp": { "baseline": "2021-09-28", @@ -2682,18 +2734,18 @@ }, "genann": { "baseline": "2019-07-10", - "port-version": 1 + "port-version": 3 }, "geogram": { - "baseline": "1.7.6", - "port-version": 4 + "baseline": "1.8.3", + "port-version": 0 }, "geographiclib": { - "baseline": "2.1.2", + "baseline": "2.2", "port-version": 0 }, "geos": { - "baseline": "3.11.1", + "baseline": "3.11.2", "port-version": 0 }, "geotrans": { @@ -2706,23 +2758,27 @@ }, "getopt": { "baseline": "0", - "port-version": 2 + "port-version": 3 }, "getopt-win32": { "baseline": "0.1", "port-version": 7 }, "gettext": { + "baseline": "0.21.1", + "port-version": 1 + }, + "gettext-libintl": { "baseline": "0.21.1", "port-version": 0 }, "gettimeofday": { "baseline": "2017-10-14", - "port-version": 4 + "port-version": 6 }, "gflags": { "baseline": "2.2.2", - "port-version": 5 + "port-version": 7 }, "ghc-filesystem": { "baseline": "1.5.12", @@ -2746,7 +2802,7 @@ }, "gl2ps": { "baseline": "1.4.2", - "port-version": 1 + "port-version": 3 }, "gl3w": { "baseline": "2018-05-31", @@ -2756,13 +2812,17 @@ "baseline": "0.1.36", "port-version": 0 }, + "glaze": { + "baseline": "1.2.3", + "port-version": 0 + }, "glbinding": { "baseline": "3.1.0", "port-version": 4 }, "glew": { "baseline": "2.2.0", - "port-version": 0 + "port-version": 3 }, "glfw3": { "baseline": "3.3.8", @@ -2770,14 +2830,14 @@ }, "gli": { "baseline": "2021-07-06", - "port-version": 0 + "port-version": 2 }, "glib": { - "baseline": "2.75.3", + "baseline": "2.76.2", "port-version": 0 }, "glibmm": { - "baseline": "2.74.0", + "baseline": "2.76.0", "port-version": 0 }, "glm": { @@ -2786,7 +2846,7 @@ }, "globjects": { "baseline": "1.1.0", - "port-version": 4 + "port-version": 6 }, "glog": { "baseline": "0.6.0", @@ -2794,23 +2854,23 @@ }, "gloo": { "baseline": "20201203", - "port-version": 0 + "port-version": 2 }, "glpk": { "baseline": "5.0", "port-version": 1 }, "glslang": { - "baseline": "11.13.0", + "baseline": "12.2.0", "port-version": 0 }, "glui": { "baseline": "2019-11-30", - "port-version": 1 + "port-version": 3 }, "gmime": { "baseline": "3.2.6", - "port-version": 3 + "port-version": 5 }, "gmmlib": { "baseline": "21.3.2", @@ -2818,7 +2878,7 @@ }, "gmp": { "baseline": "6.2.1", - "port-version": 16 + "port-version": 18 }, "gmsh": { "baseline": "4.9.0", @@ -2826,10 +2886,10 @@ }, "gobject-introspection": { "baseline": "1.72.0", - "port-version": 1 + "port-version": 3 }, "google-cloud-cpp": { - "baseline": "2.8.0", + "baseline": "2.10.0", "port-version": 0 }, "google-cloud-cpp-common": { @@ -2846,11 +2906,11 @@ }, "gperf": { "baseline": "3.1", - "port-version": 4 + "port-version": 5 }, "gperftools": { "baseline": "2019-09-02", - "port-version": 3 + "port-version": 4 }, "gpgme": { "baseline": "1.18.0", @@ -2866,15 +2926,15 @@ }, "grantlee": { "baseline": "5.3.1", - "port-version": 0 + "port-version": 1 }, "graphene": { "baseline": "1.10.8", - "port-version": 1 + "port-version": 2 }, "graphicsmagick": { "baseline": "1.3.37", - "port-version": 1 + "port-version": 3 }, "graphite2": { "baseline": "1.3.14", @@ -2902,10 +2962,10 @@ }, "gsl": { "baseline": "2.7.1", - "port-version": 1 + "port-version": 2 }, "gsl-lite": { - "baseline": "0.40.0", + "baseline": "0.41.0", "port-version": 0 }, "gsoap": { @@ -2914,36 +2974,40 @@ }, "gst-rtsp-server": { "baseline": "1.20.5", - "port-version": 0 + "port-version": 1 }, "gstreamer": { "baseline": "1.20.5", - "port-version": 1 + "port-version": 8 }, "gtest": { "baseline": "1.13.0", "port-version": 0 }, "gtk": { - "baseline": "4.6.8", - "port-version": 1 + "baseline": "4.10.1", + "port-version": 0 }, "gtk3": { - "baseline": "3.24.34", - "port-version": 2 + "baseline": "3.24.37", + "port-version": 0 }, "gtkmm": { - "baseline": "4.6.0", + "baseline": "4.10.0", "port-version": 0 }, "gtl": { - "baseline": "1.1.5", + "baseline": "1.1.8", "port-version": 0 }, "gts": { "baseline": "0.7.6", "port-version": 7 }, + "gtsam": { + "baseline": "4.2a9", + "port-version": 0 + }, "guetzli": { "baseline": "2020-09-14", "port-version": 2 @@ -2957,16 +3021,32 @@ "port-version": 0 }, "gul14": { - "baseline": "2.7.1", + "baseline": "2.8.0", "port-version": 0 }, "gumbo": { "baseline": "0.10.1", "port-version": 6 }, + "gz-cmake3": { + "baseline": "3.0.1", + "port-version": 0 + }, + "gz-math7": { + "baseline": "7.0.2", + "port-version": 1 + }, + "gz-tools2": { + "baseline": "2.0.0", + "port-version": 1 + }, + "gz-utils2": { + "baseline": "2.0.0", + "port-version": 0 + }, "gzip-hpp": { "baseline": "0.1.0", - "port-version": 1 + "port-version": 2 }, "h3": { "baseline": "4.1.0", @@ -2974,10 +3054,10 @@ }, "h5py-lzf": { "baseline": "2019-12-04", - "port-version": 1 + "port-version": 3 }, "halide": { - "baseline": "14.0.0", + "baseline": "15.0.0", "port-version": 1 }, "happly": { @@ -2989,8 +3069,8 @@ "port-version": 0 }, "harfbuzz": { - "baseline": "6.0.0", - "port-version": 1 + "baseline": "7.2.0", + "port-version": 0 }, "hash-library": { "baseline": "8", @@ -3002,19 +3082,19 @@ }, "hayai": { "baseline": "2019-08-10", - "port-version": 1 + "port-version": 3 }, "hazelcast-cpp-client": { - "baseline": "5.1.0", + "baseline": "5.2.0", "port-version": 0 }, "hdf5": { "baseline": "1.14.0", - "port-version": 0 + "port-version": 1 }, "healpix": { "baseline": "1.12.10", - "port-version": 8 + "port-version": 9 }, "hedley": { "baseline": "15", @@ -3040,6 +3120,10 @@ "baseline": "2.6.2", "port-version": 2 }, + "highs": { + "baseline": "1.5.1", + "port-version": 0 + }, "highway": { "baseline": "1.0.3", "port-version": 0 @@ -3050,38 +3134,38 @@ }, "hiredis": { "baseline": "1.0.2", - "port-version": 4 + "port-version": 5 }, "hnswlib": { "baseline": "0.7.0", - "port-version": 0 + "port-version": 1 }, "hps": { "baseline": "2022-01-18", "port-version": 0 }, "hpx": { - "baseline": "1.8.0", - "port-version": 2 + "baseline": "1.8.1", + "port-version": 0 }, "http-parser": { "baseline": "2.9.4", - "port-version": 1 + "port-version": 3 }, "hungarian": { - "baseline": "v0.1.3", - "port-version": 1 + "baseline": "0.1.3", + "port-version": 3 }, "hunspell": { "baseline": "1.7.1", - "port-version": 2 + "port-version": 3 }, "hwloc": { "baseline": "2.9.0", "port-version": 0 }, "hyperscan": { - "baseline": "5.4.0", + "baseline": "5.4.2", "port-version": 0 }, "hypodermic": { @@ -3098,7 +3182,7 @@ }, "icu": { "baseline": "72.1", - "port-version": 3 + "port-version": 4 }, "ideviceinstaller": { "baseline": "1.1.2.23", @@ -3108,13 +3192,17 @@ "baseline": "1.0.12", "port-version": 7 }, + "idyntree": { + "baseline": "8.1.0", + "port-version": 0 + }, "if97": { "baseline": "2.1.3", "port-version": 0 }, "igloo": { "baseline": "1.1.1", - "port-version": 1 + "port-version": 2 }, "ignition-cmake0": { "baseline": "0.6.2", @@ -3149,8 +3237,8 @@ "port-version": 1 }, "ignition-modularscripts": { - "baseline": "2022-05-11", - "port-version": 1 + "baseline": "2023-05-05", + "port-version": 0 }, "ignition-msgs1": { "baseline": "1.0.0", @@ -3170,7 +3258,7 @@ }, "ignition-tools": { "baseline": "1.5.0", - "port-version": 0 + "port-version": 1 }, "ignition-transport4": { "baseline": "4.0.0", @@ -3198,7 +3286,7 @@ }, "ijg-libjpeg": { "baseline": "9e", - "port-version": 0 + "port-version": 1 }, "ilmbase": { "baseline": "3", @@ -3217,8 +3305,8 @@ "port-version": 0 }, "imgui": { - "baseline": "1.89.3", - "port-version": 0 + "baseline": "1.89.4", + "port-version": 1 }, "imgui-sfml": { "baseline": "2.5", @@ -3226,7 +3314,7 @@ }, "imguizmo": { "baseline": "1.83", - "port-version": 0 + "port-version": 1 }, "immer": { "baseline": "0.8.0", @@ -3234,19 +3322,19 @@ }, "implot": { "baseline": "0.14", - "port-version": 0 + "port-version": 1 }, "indicators": { - "baseline": "2.2", + "baseline": "2.3", "port-version": 0 }, "influxdb-cxx": { - "baseline": "2022-09-02", + "baseline": "0.7.1", "port-version": 0 }, "infoware": { - "baseline": "2021-06-16", - "port-version": 1 + "baseline": "2023-04-12", + "port-version": 0 }, "inih": { "baseline": "56", @@ -3254,7 +3342,7 @@ }, "iniparser": { "baseline": "2020-04-06", - "port-version": 3 + "port-version": 5 }, "inipp": { "baseline": "1.0.12", @@ -3269,24 +3357,24 @@ "port-version": 0 }, "intel-mkl": { - "baseline": "2020.0.0", - "port-version": 2 + "baseline": "2023.0.0", + "port-version": 1 }, "intelrdfpmathlib": { "baseline": "20U2", - "port-version": 4 + "port-version": 6 }, "io2d": { "baseline": "2020-09-14", - "port-version": 3 + "port-version": 5 }, "irrlicht": { "baseline": "1.8.4", - "port-version": 13 + "port-version": 14 }, "irrxml": { "baseline": "0", - "port-version": 0 + "port-version": 1 }, "isal": { "baseline": "2.30.0", @@ -3302,7 +3390,7 @@ }, "itpp": { "baseline": "4.3.1", - "port-version": 8 + "port-version": 10 }, "ixwebsocket": { "baseline": "11.4.3", @@ -3314,7 +3402,7 @@ }, "jaeger-client-cpp": { "baseline": "0.7.0", - "port-version": 1 + "port-version": 2 }, "jansson": { "baseline": "2.14", @@ -3322,15 +3410,15 @@ }, "jasper": { "baseline": "4.0.0", - "port-version": 0 + "port-version": 2 }, "jbig2dec": { "baseline": "0.19", - "port-version": 1 + "port-version": 3 }, "jbigkit": { "baseline": "2.1", - "port-version": 5 + "port-version": 7 }, "jemalloc": { "baseline": "5.3.0", @@ -3338,23 +3426,23 @@ }, "jinja2cpplight": { "baseline": "2018-05-08", - "port-version": 1 + "port-version": 3 }, "joltphysics": { - "baseline": "2.0.1", - "port-version": 2 + "baseline": "3.0.1", + "port-version": 0 }, "josuttis-jthread": { "baseline": "2020-07-21", - "port-version": 2 + "port-version": 3 }, "jsmn": { "baseline": "2019-04-27", - "port-version": 1 + "port-version": 2 }, "json-c": { "baseline": "2022-06-26", - "port-version": 2 + "port-version": 3 }, "json-dto": { "baseline": "0.3.1", @@ -3366,24 +3454,28 @@ }, "json-spirit": { "baseline": "4.1.0", - "port-version": 2 + "port-version": 4 }, "json11": { "baseline": "2017-06-20", - "port-version": 4 + "port-version": 6 }, "json5-parser": { "baseline": "1.0.0", - "port-version": 3 + "port-version": 5 }, "jsoncons": { - "baseline": "0.169.0", + "baseline": "0.170.2", "port-version": 0 }, "jsoncpp": { "baseline": "1.9.5", "port-version": 0 }, + "jsonifier": { + "baseline": "0.9.1", + "port-version": 0 + }, "jsonnet": { "baseline": "0.18.0", "port-version": 1 @@ -3409,7 +3501,7 @@ "port-version": 0 }, "kd-soap": { - "baseline": "1.9.0", + "baseline": "2.1.1", "port-version": 1 }, "kdalgorithms": { @@ -3430,7 +3522,7 @@ }, "kenlm": { "baseline": "20200924", - "port-version": 1 + "port-version": 4 }, "keystone": { "baseline": "0.9.2", @@ -3586,18 +3678,18 @@ }, "kinectsdk1": { "baseline": "1.8", - "port-version": 6 + "port-version": 7 }, "kinectsdk2": { "baseline": "2.0", - "port-version": 5 + "port-version": 6 }, "kissfft": { "baseline": "2021-11-14", "port-version": 0 }, "kissnet": { - "baseline": "2022-10-18", + "baseline": "2023-02-04", "port-version": 0 }, "klein": { @@ -3613,8 +3705,8 @@ "port-version": 1 }, "ktx": { - "baseline": "4.1.0-rc3", - "port-version": 1 + "baseline": "4.1.0", + "port-version": 0 }, "kubazip": { "baseline": "0.2.4", @@ -3622,27 +3714,27 @@ }, "kubernetes": { "baseline": "0.6.0", - "port-version": 0 + "port-version": 1 }, "kuku": { "baseline": "2.1", - "port-version": 1 + "port-version": 3 }, "kvasir-mpl": { "baseline": "2019-08-06", - "port-version": 1 + "port-version": 3 }, "kwsys": { "baseline": "2021-08-06", "port-version": 1 }, "lager": { - "baseline": "2022-02-21", + "baseline": "2023-03-19", "port-version": 0 }, "lapack": { "baseline": "2022-02-22", - "port-version": 0 + "port-version": 2 }, "lapack-reference": { "baseline": "3.11.0", @@ -3650,7 +3742,7 @@ }, "lastools": { "baseline": "2.0.2+20230206", - "port-version": 0 + "port-version": 1 }, "laszip": { "baseline": "3.4.3", @@ -3674,11 +3766,11 @@ }, "leaf": { "baseline": "0.2.2", - "port-version": 1 + "port-version": 2 }, "lemon": { "baseline": "0", - "port-version": 1 + "port-version": 2 }, "lemon-parser-generator": { "baseline": "3.39.3", @@ -3694,7 +3786,7 @@ }, "lest": { "baseline": "1.35.1", - "port-version": 2 + "port-version": 3 }, "leveldb": { "baseline": "1.22", @@ -3702,15 +3794,19 @@ }, "levmar": { "baseline": "2.6", - "port-version": 1 + "port-version": 3 + }, + "lexbor": { + "baseline": "2.2.0", + "port-version": 0 }, "libaaplus": { "baseline": "2.36", - "port-version": 0 + "port-version": 1 }, "libadlmidi": { "baseline": "1.5.1", - "port-version": 0 + "port-version": 1 }, "libadwaita": { "baseline": "1.2.0", @@ -3718,7 +3814,7 @@ }, "libaiff": { "baseline": "5.0", - "port-version": 7 + "port-version": 9 }, "libalkimia": { "baseline": "8.1.70", @@ -3733,7 +3829,7 @@ "port-version": 0 }, "libass": { - "baseline": "0.16.0", + "baseline": "0.17.1", "port-version": 0 }, "libassuan": { @@ -3741,12 +3837,12 @@ "port-version": 0 }, "libatomic-ops": { - "baseline": "7.7.0", - "port-version": 1 + "baseline": "7.8.0", + "port-version": 0 }, "libavif": { "baseline": "0.11.1", - "port-version": 0 + "port-version": 1 }, "libb2": { "baseline": "0.98.1", @@ -3765,35 +3861,35 @@ "port-version": 0 }, "libcaer": { - "baseline": "2022-07-25", - "port-version": 2 + "baseline": "3.3.15", + "port-version": 0 }, "libcanberra": { "baseline": "0.30", "port-version": 4 }, "libcbor": { - "baseline": "0.9.0", + "baseline": "0.10.2", "port-version": 0 }, "libcds": { "baseline": "2.3.3", - "port-version": 2 + "port-version": 4 }, "libcerf": { "baseline": "1.13", - "port-version": 3 + "port-version": 4 }, "libconfig": { "baseline": "1.7.3", - "port-version": 1 + "port-version": 3 }, "libconfuse": { "baseline": "2019-07-14", - "port-version": 2 + "port-version": 4 }, "libcopp": { - "baseline": "2.1.2", + "baseline": "2.2.0", "port-version": 0 }, "libcorrect": { @@ -3810,7 +3906,7 @@ }, "libcroco": { "baseline": "0.6.13", - "port-version": 3 + "port-version": 4 }, "libcsv": { "baseline": "3.0.3", @@ -3826,7 +3922,7 @@ }, "libdatachannel": { "baseline": "0.18.2", - "port-version": 0 + "port-version": 1 }, "libdatrie": { "baseline": "0.2.13", @@ -3837,19 +3933,20 @@ "port-version": 1 }, "libde265": { - "baseline": "1.0.8", - "port-version": 6 + "baseline": "1.0.11", + "port-version": 1 }, "libdeflate": { - "baseline": "1.17" + "baseline": "1.17", + "port-version": 0 }, "libdisasm": { "baseline": "0.23", - "port-version": 9 + "port-version": 10 }, "libdivide": { "baseline": "5.0", - "port-version": 0 + "port-version": 1 }, "libdjinterop": { "baseline": "0.16.0", @@ -3873,7 +3970,7 @@ }, "libebur128": { "baseline": "1.2.6", - "port-version": 0 + "port-version": 2 }, "libenvpp": { "baseline": "1.0.0", @@ -3889,7 +3986,7 @@ }, "libevhtp": { "baseline": "1.2.18", - "port-version": 3 + "port-version": 5 }, "libexif": { "baseline": "0.6.24", @@ -3904,8 +4001,8 @@ "port-version": 1 }, "libfido2": { - "baseline": "1.10.0", - "port-version": 1 + "baseline": "1.13.0", + "port-version": 0 }, "libflac": { "baseline": "1.4.2", @@ -3929,11 +4026,11 @@ }, "libftdi": { "baseline": "0.20", - "port-version": 3 + "port-version": 5 }, "libftdi1": { "baseline": "1.5", - "port-version": 3 + "port-version": 4 }, "libgcrypt": { "baseline": "1.10.1", @@ -3949,6 +4046,10 @@ }, "libgit2": { "baseline": "1.4.2", + "port-version": 3 + }, + "libgme": { + "baseline": "0.6.3", "port-version": 0 }, "libgnutls": { @@ -3964,8 +4065,8 @@ "port-version": 0 }, "libgpiod": { - "baseline": "1.6.3", - "port-version": 2 + "baseline": "2.0.1", + "port-version": 0 }, "libgpod": { "baseline": "2019-08-29", @@ -3973,19 +4074,19 @@ }, "libgta": { "baseline": "1.0.8", - "port-version": 3 + "port-version": 5 }, "libguarded": { "baseline": "2019-08-27", - "port-version": 2 + "port-version": 3 }, "libgwenhywfar": { "baseline": "5.6.0", - "port-version": 2 + "port-version": 3 }, "libgxps": { "baseline": "0.3.2", - "port-version": 1 + "port-version": 2 }, "libharu": { "baseline": "2.4.3", @@ -3993,11 +4094,11 @@ }, "libhdfs3": { "baseline": "2019-11-05", - "port-version": 3 + "port-version": 4 }, "libheif": { "baseline": "1.15.1", - "port-version": 0 + "port-version": 1 }, "libhsplasma": { "baseline": "2022-05-19", @@ -4021,7 +4122,7 @@ }, "libiconv": { "baseline": "1.17", - "port-version": 0 + "port-version": 1 }, "libics": { "baseline": "1.6.5", @@ -4036,8 +4137,8 @@ "port-version": 2 }, "libigl": { - "baseline": "2.3.0", - "port-version": 2 + "baseline": "2.4.0", + "port-version": 4 }, "libilbc": { "baseline": "3.0.4", @@ -4045,7 +4146,7 @@ }, "libimobiledevice": { "baseline": "1.3.17", - "port-version": 2 + "port-version": 3 }, "libirecovery": { "baseline": "1.0.25", @@ -4053,7 +4154,7 @@ }, "libjpeg-turbo": { "baseline": "2.1.5.1", - "port-version": 0 + "port-version": 1 }, "libjuice": { "baseline": "1.0.6", @@ -4065,27 +4166,27 @@ }, "libkeyfinder": { "baseline": "2.2.6", - "port-version": 0 + "port-version": 1 }, "libkml": { "baseline": "1.3.0", - "port-version": 11 + "port-version": 12 }, "liblas": { "baseline": "1.8.1", - "port-version": 11 + "port-version": 13 }, "liblbfgs": { "baseline": "1.10", "port-version": 2 }, "libleidenalg": { - "baseline": "0.9.0", - "port-version": 1 + "baseline": "0.10.0", + "port-version": 0 }, "liblemon": { "baseline": "2019-06-13", - "port-version": 3 + "port-version": 5 }, "liblinear": { "baseline": "243", @@ -4093,7 +4194,7 @@ }, "liblo": { "baseline": "0.31", - "port-version": 2 + "port-version": 4 }, "liblrc": { "baseline": "1.0.0", @@ -4113,11 +4214,11 @@ }, "libmad": { "baseline": "0.15.1", - "port-version": 9 + "port-version": 12 }, "libmagic": { "baseline": "5.40", - "port-version": 1 + "port-version": 2 }, "libmariadb": { "baseline": "3.3.1", @@ -4125,11 +4226,11 @@ }, "libmaxminddb": { "baseline": "1.4.3", - "port-version": 1 + "port-version": 3 }, "libmediainfo": { - "baseline": "21.03", - "port-version": 2 + "baseline": "23.4", + "port-version": 0 }, "libmesh": { "baseline": "1.5.0", @@ -4141,7 +4242,7 @@ }, "libmicrohttpd": { "baseline": "0.9.75", - "port-version": 0 + "port-version": 1 }, "libmikmod": { "baseline": "3.3.11.1", @@ -4149,11 +4250,11 @@ }, "libmodbus": { "baseline": "3.1.6", - "port-version": 3 + "port-version": 4 }, "libmodman": { "baseline": "2.0.1", - "port-version": 4 + "port-version": 5 }, "libmodplug": { "baseline": "0.8.9.0", @@ -4165,15 +4266,15 @@ }, "libmount": { "baseline": "2.38", - "port-version": 1 + "port-version": 2 }, "libmpeg2": { "baseline": "0.5.1", - "port-version": 2 + "port-version": 3 }, "libmspack": { "baseline": "0.10.1", - "port-version": 4 + "port-version": 6 }, "libmt32emu": { "baseline": "2.7.0", @@ -4184,11 +4285,15 @@ "port-version": 1 }, "libmysql": { - "baseline": "8.0.20", - "port-version": 9 + "baseline": "8.0.32", + "port-version": 4 }, "libnice": { - "baseline": "0.1.18", + "baseline": "0.1.21", + "port-version": 0 + }, + "libnice-gst": { + "baseline": "0.1.21", "port-version": 1 }, "libnoise": { @@ -4201,23 +4306,23 @@ }, "libodb": { "baseline": "2.4.0", - "port-version": 9 + "port-version": 10 }, "libodb-boost": { "baseline": "2.4.0", - "port-version": 6 + "port-version": 7 }, "libodb-mysql": { "baseline": "2.4.0", - "port-version": 10 + "port-version": 11 }, "libodb-pgsql": { "baseline": "2.4.0", - "port-version": 6 + "port-version": 7 }, "libodb-sqlite": { "baseline": "2.4.0", - "port-version": 10 + "port-version": 11 }, "libofx": { "baseline": "0.10.9", @@ -4233,15 +4338,19 @@ }, "libopensp": { "baseline": "1.5.2", + "port-version": 2 + }, + "libopnmidi": { + "baseline": "1.5.1", "port-version": 1 }, "libopusenc": { "baseline": "0.2.1", - "port-version": 1 + "port-version": 3 }, "libosip2": { "baseline": "5.2.0", - "port-version": 2 + "port-version": 3 }, "libosmium": { "baseline": "2.18.0", @@ -4249,7 +4358,7 @@ }, "libosmscout": { "baseline": "1.1.1", - "port-version": 0 + "port-version": 2 }, "libp7-baical": { "baseline": "replaced", @@ -4257,19 +4366,19 @@ }, "libp7client": { "baseline": "5.6", - "port-version": 2 + "port-version": 4 }, "libpcap": { "baseline": "1.10.1", - "port-version": 1 + "port-version": 3 }, "libpff": { "baseline": "2021-11-14", - "port-version": 0 + "port-version": 1 }, "libphonenumber": { - "baseline": "8.13.1", - "port-version": 1 + "baseline": "8.13.11", + "port-version": 0 }, "libplist": { "baseline": "1.3.6", @@ -4281,15 +4390,15 @@ }, "libpng": { "baseline": "1.6.39", - "port-version": 0 + "port-version": 1 }, "libpopt": { "baseline": "1.16", - "port-version": 14 + "port-version": 16 }, "libpq": { "baseline": "15.2", - "port-version": 0 + "port-version": 3 }, "libpqxx": { "baseline": "7.7.4", @@ -4297,23 +4406,23 @@ }, "libprotobuf-mutator": { "baseline": "1.0", - "port-version": 0 + "port-version": 2 }, "libproxy": { "baseline": "0.4.18", - "port-version": 1 + "port-version": 2 }, "libqcow": { "baseline": "20221124", "port-version": 0 }, "libqglviewer": { - "baseline": "2.7.2", - "port-version": 4 + "baseline": "2.9.1", + "port-version": 0 }, "libqrencode": { "baseline": "4.1.1", - "port-version": 1 + "port-version": 2 }, "librabbitmq": { "baseline": "0.11.0", @@ -4321,23 +4430,27 @@ }, "libraqm": { "baseline": "0.9.0", - "port-version": 0 + "port-version": 1 }, "libraw": { "baseline": "0.21.1", "port-version": 0 }, "librdkafka": { - "baseline": "2.0.2", + "baseline": "2.1.1", + "port-version": 0 + }, + "libredwg": { + "baseline": "0.12.5.5178", "port-version": 0 }, "libressl": { - "baseline": "3.4.2", + "baseline": "3.6.2", "port-version": 0 }, "librsvg": { "baseline": "2.40.20", - "port-version": 5 + "port-version": 6 }, "librsync": { "baseline": "2.3.2", @@ -4345,11 +4458,11 @@ }, "librtmp": { "baseline": "2019-11-11", - "port-version": 3 + "port-version": 4 }, "librttopo": { "baseline": "1.1.0", - "port-version": 7 + "port-version": 8 }, "libsamplerate": { "baseline": "0.2.2", @@ -4360,8 +4473,8 @@ "port-version": 1 }, "libsbml": { - "baseline": "5.19.0", - "port-version": 2 + "baseline": "5.20.0", + "port-version": 0 }, "libsbsms": { "baseline": "2.3.0", @@ -4369,7 +4482,7 @@ }, "libsecret": { "baseline": "0.20.4", - "port-version": 1 + "port-version": 2 }, "libsercomm": { "baseline": "1.3.2", @@ -4397,7 +4510,7 @@ }, "libsmb2": { "baseline": "2021-04-29", - "port-version": 1 + "port-version": 2 }, "libsndfile": { "baseline": "1.2.0", @@ -4411,9 +4524,13 @@ "baseline": "1.0.18", "port-version": 8 }, + "libsonic": { + "baseline": "0.2.0", + "port-version": 0 + }, "libsoundio": { "baseline": "2.0.0", - "port-version": 6 + "port-version": 7 }, "libspatialindex": { "baseline": "1.9.3", @@ -4421,7 +4538,7 @@ }, "libspatialite": { "baseline": "5.0.1", - "port-version": 9 + "port-version": 12 }, "libspnav": { "baseline": "0.2.3", @@ -4449,19 +4566,23 @@ }, "libstemmer": { "baseline": "2017-9", - "port-version": 6 + "port-version": 8 }, "libstk": { "baseline": "4.6.1", - "port-version": 1 + "port-version": 3 }, "libsvm": { "baseline": "3.25", "port-version": 0 }, + "libtar": { + "baseline": "1.2.20", + "port-version": 0 + }, "libtasn1": { "baseline": "4.19.0", - "port-version": 0 + "port-version": 1 }, "libtcod": { "baseline": "1.23.1", @@ -4481,15 +4602,15 @@ }, "libtomcrypt": { "baseline": "1.18.2", - "port-version": 2 + "port-version": 3 }, "libtommath": { "baseline": "1.2.0", - "port-version": 2 + "port-version": 3 }, "libtorch": { "baseline": "1.12.1", - "port-version": 1 + "port-version": 3 }, "libtorrent": { "baseline": "2.0.8", @@ -4497,7 +4618,7 @@ }, "libu2f-server": { "baseline": "1.1.0", - "port-version": 4 + "port-version": 5 }, "libudis86": { "baseline": "2018-01-28", @@ -4505,7 +4626,7 @@ }, "libudns": { "baseline": "0.4", - "port-version": 4 + "port-version": 5 }, "libui": { "baseline": "2018-11-03", @@ -4517,7 +4638,7 @@ }, "libunifex": { "baseline": "2023-01-25", - "port-version": 0 + "port-version": 1 }, "libunistring": { "baseline": "1.1", @@ -4525,11 +4646,11 @@ }, "liburing": { "baseline": "2.2", - "port-version": 1 + "port-version": 2 }, "libusb": { - "baseline": "1.0.26", - "port-version": 3 + "baseline": "1.0.26.11791", + "port-version": 0 }, "libusb-win32": { "baseline": "1.2.6.0", @@ -4541,7 +4662,7 @@ }, "libuuid": { "baseline": "1.0.3", - "port-version": 11 + "port-version": 13 }, "libuv": { "baseline": "1.44.2", @@ -4549,11 +4670,15 @@ }, "libuvc": { "baseline": "2020-11-24", - "port-version": 3 + "port-version": 4 + }, + "libvault": { + "baseline": "0.56.0", + "port-version": 0 }, "libvmdk": { "baseline": "20200926", - "port-version": 2 + "port-version": 4 }, "libvorbis": { "baseline": "1.3.7", @@ -4561,7 +4686,7 @@ }, "libvpx": { "baseline": "1.12.0", - "port-version": 0 + "port-version": 1 }, "libwandio": { "baseline": "4.2.1", @@ -4605,7 +4730,7 @@ }, "libxdiff": { "baseline": "0.23", - "port-version": 2 + "port-version": 3 }, "libxdmcp": { "baseline": "1.1.3", @@ -4645,11 +4770,11 @@ }, "libxlsxwriter": { "baseline": "1.1.5", - "port-version": 0 + "port-version": 1 }, "libxml2": { "baseline": "2.10.3", - "port-version": 0 + "port-version": 1 }, "libxmlmm": { "baseline": "0.6.0", @@ -4657,11 +4782,11 @@ }, "libxmlpp": { "baseline": "5.0.0", - "port-version": 2 + "port-version": 3 }, - "libxmp-lite": { - "baseline": "4.4.1", - "port-version": 8 + "libxmp": { + "baseline": "2023-04-13", + "port-version": 0 }, "libxmu": { "baseline": "1.1.3", @@ -4713,46 +4838,50 @@ }, "libyaml": { "baseline": "0.2.5", - "port-version": 3 + "port-version": 4 }, "libyuv": { "baseline": "1857", "port-version": 0 }, "libzen": { - "baseline": "0.4.39", + "baseline": "0.4.41", + "port-version": 0 + }, + "libzim": { + "baseline": "8.2.0", "port-version": 1 }, "libzip": { "baseline": "1.9.2", - "port-version": 0 + "port-version": 1 }, "libzippp": { - "baseline": "6.0-1.9.2", + "baseline": "6.1-1.9.2", "port-version": 0 }, "licensepp": { - "baseline": "2020-05-19", - "port-version": 3 + "baseline": "2020-11-24", + "port-version": 0 }, "lilv": { "baseline": "0.24.10", - "port-version": 1 + "port-version": 2 }, "linalg": { "baseline": "2.1", - "port-version": 1 + "port-version": 2 }, "linenoise-ng": { "baseline": "4754bee2d8eb3", - "port-version": 2 + "port-version": 3 }, "linmath": { "baseline": "2022-07-30", "port-version": 0 }, "lionkor-commandline": { - "baseline": "2.0.0", + "baseline": "2.2.0", "port-version": 0 }, "litehtml": { @@ -4760,24 +4889,24 @@ "port-version": 2 }, "live555": { - "baseline": "2023-01-19", + "baseline": "2023-05-10", "port-version": 0 }, "llfio": { - "baseline": "2023-01-27", - "port-version": 0 + "baseline": "2023-03-13", + "port-version": 1 }, "llgl": { - "baseline": "2019-08-15", - "port-version": 2 + "baseline": "2023-03-05", + "port-version": 0 }, "llhttp": { "baseline": "8.1.0", "port-version": 1 }, "llvm": { - "baseline": "14.0.6", - "port-version": 0 + "baseline": "15.0.7", + "port-version": 2 }, "lmdb": { "baseline": "0.9.29", @@ -4801,10 +4930,10 @@ }, "log4cpp": { "baseline": "2.9.1", - "port-version": 7 + "port-version": 8 }, "log4cxx": { - "baseline": "0.13.0.1", + "baseline": "1.0.0", "port-version": 0 }, "loguru": { @@ -4813,11 +4942,35 @@ }, "lpeg": { "baseline": "1.0.2", - "port-version": 2 + "port-version": 4 + }, + "ltla-aarand": { + "baseline": "2023-03-19", + "port-version": 0 + }, + "ltla-cppirlba": { + "baseline": "2023-04-07", + "port-version": 0 + }, + "ltla-cppkmeans": { + "baseline": "2023-03-20", + "port-version": 0 + }, + "ltla-knncolle": { + "baseline": "2023-05-09", + "port-version": 0 + }, + "ltla-powerit": { + "baseline": "2023-03-19", + "port-version": 0 + }, + "ltla-umappp": { + "baseline": "2023-05-11", + "port-version": 0 }, "lua": { "baseline": "5.4.4", - "port-version": 5 + "port-version": 7 }, "lua-compat53": { "baseline": "0.10", @@ -4828,24 +4981,24 @@ "port-version": 0 }, "luabridge3": { - "baseline": "3.0-beta4", + "baseline": "3.0-rc3", "port-version": 0 }, "luafilesystem": { "baseline": "1.8.0", - "port-version": 2 + "port-version": 4 }, "luajit": { "baseline": "2023-01-04", - "port-version": 0 + "port-version": 1 }, "luasec": { - "baseline": "1.1.0", + "baseline": "1.3.1", "port-version": 0 }, "luasocket": { - "baseline": "3.0.0", - "port-version": 1 + "baseline": "3.1.0", + "port-version": 0 }, "luminoengine": { "baseline": "0.10.1", @@ -4869,14 +5022,18 @@ }, "lzfse": { "baseline": "1.0", - "port-version": 3 + "port-version": 5 }, "lzo": { "baseline": "2.10", - "port-version": 7 + "port-version": 9 }, "lzokay": { "baseline": "2020-07-30", + "port-version": 2 + }, + "maddy": { + "baseline": "1.1.2+20210419", "port-version": 0 }, "magic-enum": { @@ -4885,11 +5042,11 @@ }, "magic-get": { "baseline": "2019-09-02", - "port-version": 2 + "port-version": 3 }, "magnum": { "baseline": "2020.06", - "port-version": 11 + "port-version": 12 }, "magnum-extras": { "baseline": "2020.06", @@ -4897,16 +5054,20 @@ }, "magnum-integration": { "baseline": "2020.06", - "port-version": 2 + "port-version": 3 }, "magnum-plugins": { "baseline": "2020.06", - "port-version": 9 + "port-version": 10 }, "mailio": { "baseline": "0.21.0", "port-version": 2 }, + "makeid": { + "baseline": "1.0.2", + "port-version": 0 + }, "mapbox-geojson-cpp": { "baseline": "0.5.1", "port-version": 1 @@ -4925,7 +5086,7 @@ }, "mapbox-variant": { "baseline": "1.2.0", - "port-version": 1 + "port-version": 2 }, "mapbox-wagyu": { "baseline": "0.5.0", @@ -4933,7 +5094,7 @@ }, "mapnik": { "baseline": "2023-01-17", - "port-version": 0 + "port-version": 1 }, "marble": { "baseline": "22.04.0", @@ -4957,11 +5118,11 @@ }, "mathc": { "baseline": "2019-09-29", - "port-version": 1 + "port-version": 3 }, "mathgl": { "baseline": "8.0.1", - "port-version": 0 + "port-version": 2 }, "matio": { "baseline": "1.5.23", @@ -4969,15 +5130,15 @@ }, "matplotlib-cpp": { "baseline": "2020-08-27", - "port-version": 1 + "port-version": 2 }, "matplotplusplus": { "baseline": "2021-04-11", "port-version": 6 }, "matroska": { - "baseline": "1.6.3", - "port-version": 0 + "baseline": "1.7.1", + "port-version": 1 }, "mbedtls": { "baseline": "2.28.1", @@ -4985,11 +5146,11 @@ }, "mchehab-zbar": { "baseline": "0.23.90", - "port-version": 3 + "port-version": 4 }, "mcpp": { "baseline": "2.7.2.14", - "port-version": 3 + "port-version": 5 }, "mdl-sdk": { "baseline": "2021.1.2", @@ -5009,19 +5170,19 @@ }, "mecab": { "baseline": "2019-09-25", - "port-version": 2 + "port-version": 4 }, "memorymodule": { "baseline": "2019-12-31", - "port-version": 2 + "port-version": 3 }, "mesa": { - "baseline": "22.1.7", + "baseline": "23.0.1", "port-version": 1 }, "meschach": { "baseline": "1.2b", - "port-version": 5 + "port-version": 6 }, "meshoptimizer": { "baseline": "0.18", @@ -5033,11 +5194,11 @@ }, "metrohash": { "baseline": "1.1.3", - "port-version": 4 + "port-version": 5 }, "mfl": { "baseline": "0.0.1", - "port-version": 1 + "port-version": 2 }, "mfx-dispatch": { "baseline": "1.35.1", @@ -5053,18 +5214,18 @@ }, "microsoft-signalr": { "baseline": "0.1.0-alpha4", - "port-version": 1 + "port-version": 6 }, "mikktspace": { "baseline": "2020-10-06", - "port-version": 1 + "port-version": 3 }, "milerius-sfml-imgui": { "baseline": "1.1", "port-version": 6 }, "mimalloc": { - "baseline": "2.0.9", + "baseline": "2.1.1", "port-version": 0 }, "minc": { @@ -5076,7 +5237,7 @@ "port-version": 3 }, "miniaudio": { - "baseline": "0.11.11", + "baseline": "0.11.14", "port-version": 0 }, "minifb": { @@ -5091,17 +5252,21 @@ "baseline": "0.1.1", "port-version": 1 }, + "miniply": { + "baseline": "2022-09-15", + "port-version": 1 + }, "minisat-master-keying": { "baseline": "2.3.6", "port-version": 0 }, "minitrace": { - "baseline": "2019.02.06", - "port-version": 2 + "baseline": "2023-04-23", + "port-version": 0 }, "miniupnpc": { "baseline": "2.1", - "port-version": 2 + "port-version": 4 }, "miniz": { "baseline": "3.0.2", @@ -5109,18 +5274,18 @@ }, "minizip": { "baseline": "1.2.13", - "port-version": 0 + "port-version": 2 }, "minizip-ng": { "baseline": "3.0.7", "port-version": 0 }, "mio": { - "baseline": "2023-01-25", + "baseline": "2023-03-03", "port-version": 0 }, "mlpack": { - "baseline": "4.0.0", + "baseline": "4.0.1", "port-version": 0 }, "mman": { @@ -5132,8 +5297,8 @@ "port-version": 2 }, "mmx": { - "baseline": "2019-09-29", - "port-version": 1 + "baseline": "2022-03-27", + "port-version": 0 }, "mnn": { "baseline": "1.1.0", @@ -5156,24 +5321,24 @@ "port-version": 0 }, "monkeys-audio": { - "baseline": "9.04", - "port-version": 4 + "baseline": "10.08", + "port-version": 0 }, "moos-core": { "baseline": "10.4.0", - "port-version": 7 + "port-version": 8 }, "moos-essential": { "baseline": "10.0.1", - "port-version": 4 + "port-version": 5 }, "moos-ui": { "baseline": "10.0.1", - "port-version": 4 + "port-version": 5 }, "morton-nd": { "baseline": "4.0.0", - "port-version": 2 + "port-version": 3 }, "mosquitto": { "baseline": "2.0.14", @@ -5193,23 +5358,23 @@ }, "mpark-variant": { "baseline": "1.4.0", - "port-version": 2 + "port-version": 3 }, "mpc": { "baseline": "1.2.0", - "port-version": 2 + "port-version": 3 }, "mpfr": { "baseline": "4.2.0", "port-version": 0 }, "mpg123": { - "baseline": "1.31.2", + "baseline": "1.31.3", "port-version": 0 }, "mpi": { "baseline": "1", - "port-version": 3 + "port-version": 4 }, "mpir": { "baseline": "2022-03-02", @@ -5227,9 +5392,13 @@ "baseline": "alias", "port-version": 1 }, + "ms-gdkx": { + "baseline": "1.0.0", + "port-version": 1 + }, "ms-gltf": { "baseline": "2022-06-28", - "port-version": 1 + "port-version": 2 }, "ms-gsl": { "baseline": "4.0.0", @@ -5244,8 +5413,12 @@ "port-version": 0 }, "msgpack": { - "baseline": "3.3.0", - "port-version": 4 + "baseline": "6.0.0", + "port-version": 0 + }, + "msgpack-c": { + "baseline": "6.0.0", + "port-version": 0 }, "msgpack11": { "baseline": "0.0.10", @@ -5253,7 +5426,7 @@ }, "msinttypes": { "baseline": "2018-02-25", - "port-version": 1 + "port-version": 2 }, "msix": { "baseline": "1.7", @@ -5265,7 +5438,7 @@ }, "mstch": { "baseline": "1.0.2", - "port-version": 4 + "port-version": 5 }, "mujoco": { "baseline": "2.3.2", @@ -5293,7 +5466,7 @@ }, "mygui": { "baseline": "3.4.1", - "port-version": 4 + "port-version": 5 }, "mysql-connector-cpp": { "baseline": "8.0.30", @@ -5305,11 +5478,11 @@ }, "nana": { "baseline": "1.7.4", - "port-version": 3 + "port-version": 4 }, "nano-signal-slot": { "baseline": "2.0.1", - "port-version": 1 + "port-version": 2 }, "nanobench": { "baseline": "4.3.10", @@ -5333,11 +5506,11 @@ }, "nanopb": { "baseline": "0.4.7", - "port-version": 0 + "port-version": 1 }, "nanoprintf": { "baseline": "2020-05-27", - "port-version": 1 + "port-version": 2 }, "nanorange": { "baseline": "2020-07-06", @@ -5345,10 +5518,10 @@ }, "nanort": { "baseline": "2019-08-20", - "port-version": 2 + "port-version": 3 }, "nanosvg": { - "baseline": "2022-04-29", + "baseline": "2022-12-04", "port-version": 0 }, "nanovg": { @@ -5360,7 +5533,7 @@ "port-version": 0 }, "nayuki-qr-code-generator": { - "baseline": "1.7.0", + "baseline": "1.8.0", "port-version": 0 }, "nccl": { @@ -5380,7 +5553,7 @@ "port-version": 1 }, "ned14-internal-quickcpplib": { - "baseline": "2023-01-27", + "baseline": "2023-03-13", "port-version": 0 }, "neon2sse": { @@ -5389,38 +5562,42 @@ }, "netcdf-c": { "baseline": "4.8.1", - "port-version": 2 + "port-version": 3 }, "netcdf-cxx4": { "baseline": "4.3.1", - "port-version": 4 + "port-version": 5 }, "nethost": { "baseline": "7.0.0", "port-version": 0 }, "nettle": { - "baseline": "3.7.3", + "baseline": "3.8.1", "port-version": 1 }, "networkdirect-sdk": { "baseline": "2.0.1", - "port-version": 3 + "port-version": 4 }, "nghttp2": { - "baseline": "1.51.0", + "baseline": "1.53.0", + "port-version": 0 + }, + "nghttp2-asio": { + "baseline": "2022-08-11", "port-version": 1 }, "nghttp3": { - "baseline": "0.9.0", + "baseline": "0.11.0", "port-version": 0 }, "ngspice": { - "baseline": "37", + "baseline": "39", "port-version": 0 }, "ngtcp2": { - "baseline": "0.13.1", + "baseline": "0.14.1", "port-version": 0 }, "nifly": { @@ -5429,7 +5606,7 @@ }, "nifticlib": { "baseline": "2020-04-30", - "port-version": 3 + "port-version": 4 }, "nlohmann-fifo-map": { "baseline": "2018.05.07", @@ -5445,7 +5622,7 @@ }, "nmap": { "baseline": "7.70", - "port-version": 8 + "port-version": 9 }, "nmslib": { "baseline": "2.1.1", @@ -5457,27 +5634,27 @@ }, "nngpp": { "baseline": "1.3.0", - "port-version": 2 + "port-version": 3 }, "nnpack": { "baseline": "2021-02-21", "port-version": 3 }, "node-addon-api": { - "baseline": "6.0.0", + "baseline": "6.1.0", "port-version": 0 }, - "node-api": { - "baseline": "18.12.1", - "port-version": 2 + "node-api-headers": { + "baseline": "1.0.0", + "port-version": 1 }, "nonius": { "baseline": "2019-04-20", - "port-version": 3 + "port-version": 4 }, "nowide": { "baseline": "11.2.0", - "port-version": 0 + "port-version": 1 }, "nrf-ble-driver": { "baseline": "4.1.4", @@ -5485,11 +5662,11 @@ }, "nspr": { "baseline": "4.35", - "port-version": 2 + "port-version": 3 }, "nss": { "baseline": "3.87", - "port-version": 0 + "port-version": 1 }, "nsync": { "baseline": "1.24.0", @@ -5497,11 +5674,11 @@ }, "nt-wrapper": { "baseline": "2019-08-10", - "port-version": 2 + "port-version": 3 }, "nu-book-zxing-cpp": { "baseline": "2.0.0", - "port-version": 0 + "port-version": 1 }, "nuklear": { "baseline": "2022-05-12", @@ -5512,7 +5689,7 @@ "port-version": 1 }, "numcpp": { - "baseline": "2.6.0", + "baseline": "2.10.1", "port-version": 0 }, "nuspell": { @@ -5577,11 +5754,11 @@ }, "observer-ptr-lite": { "baseline": "0.4.0", - "port-version": 2 + "port-version": 3 }, "ocilib": { "baseline": "4.7.5", - "port-version": 0 + "port-version": 2 }, "octomap": { "baseline": "1.9.6", @@ -5589,7 +5766,7 @@ }, "ode": { "baseline": "0.16.3", - "port-version": 0 + "port-version": 1 }, "offscale-libetcd-cpp": { "baseline": "2019-07-10", @@ -5601,7 +5778,7 @@ }, "ogre": { "baseline": "13.6.2", - "port-version": 0 + "port-version": 2 }, "ogre-next": { "baseline": "2.3.1", @@ -5611,6 +5788,10 @@ "baseline": "1.5.1", "port-version": 1 }, + "omniorb": { + "baseline": "4.3.0", + "port-version": 0 + }, "ompl": { "baseline": "1.5.1", "port-version": 5 @@ -5628,16 +5809,16 @@ "port-version": 1 }, "onnx": { - "baseline": "1.10.2", - "port-version": 1 + "baseline": "1.13.1", + "port-version": 0 }, "onnx-optimizer": { "baseline": "0.2.6", "port-version": 0 }, "onnxruntime-gpu": { - "baseline": "1.12.1", - "port-version": 0 + "baseline": "1.14.1", + "port-version": 1 }, "oof": { "baseline": "2021-11-23", @@ -5648,31 +5829,31 @@ "port-version": 0 }, "open62541": { - "baseline": "1.2.3", - "port-version": 1 + "baseline": "1.3.5", + "port-version": 0 }, "openal-soft": { "baseline": "1.23.0", "port-version": 0 }, "openblas": { - "baseline": "0.3.21", + "baseline": "0.3.23", "port-version": 0 }, "opencascade": { "baseline": "7.6.2", - "port-version": 1 + "port-version": 3 }, "opencc": { "baseline": "1.1.6", - "port-version": 0 + "port-version": 1 }, "opencensus-cpp": { "baseline": "2021-08-26", "port-version": 2 }, "opencl": { - "baseline": "v2022.09.30", + "baseline": "v2023.02.06", "port-version": 0 }, "opencolorio": { @@ -5685,7 +5866,7 @@ }, "opencsg": { "baseline": "1.4.2", - "port-version": 3 + "port-version": 4 }, "openctm": { "baseline": "1.0.3", @@ -5697,22 +5878,22 @@ }, "opencv2": { "baseline": "2.4.13.7", - "port-version": 16 + "port-version": 18 }, "opencv3": { "baseline": "3.4.18", - "port-version": 6 + "port-version": 10 }, "opencv4": { "baseline": "4.7.0", - "port-version": 3 + "port-version": 6 }, "opendnp3": { "baseline": "3.1.1", "port-version": 1 }, "openexr": { - "baseline": "3.1.5", + "baseline": "3.1.7", "port-version": 0 }, "openfbx": { @@ -5721,11 +5902,11 @@ }, "opengl": { "baseline": "2022-12-04", - "port-version": 1 + "port-version": 3 }, "opengl-registry": { "baseline": "2022-09-29", - "port-version": 0 + "port-version": 1 }, "openh264": { "baseline": "2021-03-16", @@ -5733,11 +5914,11 @@ }, "openigtlink": { "baseline": "3.0", - "port-version": 3 + "port-version": 4 }, "openimageio": { - "baseline": "2.4.5.0", - "port-version": 6 + "baseline": "2.4.11.1", + "port-version": 0 }, "openjpeg": { "baseline": "2.5.0", @@ -5745,10 +5926,10 @@ }, "openldap": { "baseline": "2.5.13", - "port-version": 0 + "port-version": 1 }, "openmama": { - "baseline": "6.3.1", + "baseline": "6.3.2", "port-version": 2 }, "openmesh": { @@ -5757,11 +5938,11 @@ }, "openmpi": { "baseline": "4.1.3", - "port-version": 1 + "port-version": 2 }, "openmvg": { "baseline": "2.0", - "port-version": 6 + "port-version": 7 }, "openmvs": { "baseline": "2.1.0", @@ -5777,11 +5958,11 @@ }, "openslide": { "baseline": "3.4.1", - "port-version": 0 + "port-version": 1 }, "openssl": { - "baseline": "3.0.8", - "port-version": 1 + "baseline": "3.1.0", + "port-version": 4 }, "openssl-unix": { "baseline": "deprecated", @@ -5800,12 +5981,12 @@ "port-version": 0 }, "opentelemetry-cpp": { - "baseline": "1.8.2", - "port-version": 0 + "baseline": "1.8.3", + "port-version": 6 }, "opentracing": { "baseline": "1.6.0", - "port-version": 3 + "port-version": 4 }, "openturns": { "baseline": "1.20", @@ -5813,7 +5994,7 @@ }, "openvdb": { "baseline": "10.0.0", - "port-version": 1 + "port-version": 2 }, "openvpn3": { "baseline": "3.7.0", @@ -5833,15 +6014,15 @@ }, "optional-bare": { "baseline": "1.1.0", - "port-version": 2 + "port-version": 3 }, "optional-lite": { "baseline": "3.5.0", "port-version": 1 }, "opus": { - "baseline": "1.3.1", - "port-version": 9 + "baseline": "1.4", + "port-version": 0 }, "opusfile": { "baseline": "0.12+20221121", @@ -5852,8 +6033,8 @@ "port-version": 0 }, "orocos-kdl": { - "baseline": "1.4", - "port-version": 6 + "baseline": "1.5.1", + "port-version": 0 }, "osg": { "baseline": "3.6.5", @@ -5865,12 +6046,16 @@ }, "osgearth": { "baseline": "3.3", - "port-version": 5 + "port-version": 7 }, "osi": { "baseline": "0.108.6", "port-version": 1 }, + "osmanip": { + "baseline": "4.5.1", + "port-version": 0 + }, "otl": { "baseline": "4.0.476", "port-version": 0 @@ -5881,18 +6066,18 @@ }, "p-ranav-csv": { "baseline": "2019-07-11", - "port-version": 2 + "port-version": 3 }, "p-ranav-csv2": { "baseline": "2020-12-14", - "port-version": 3 + "port-version": 4 }, "pagmo2": { "baseline": "2.19.0", "port-version": 0 }, "paho-mqtt": { - "baseline": "1.3.10", + "baseline": "1.3.12", "port-version": 0 }, "paho-mqttpp3": { @@ -5904,8 +6089,8 @@ "port-version": 0 }, "pango": { - "baseline": "1.50.12", - "port-version": 2 + "baseline": "1.50.14", + "port-version": 0 }, "pangolin": { "baseline": "0.8", @@ -5913,19 +6098,19 @@ }, "pangomm": { "baseline": "2.50.1", - "port-version": 0 + "port-version": 2 }, "parallel-hashmap": { - "baseline": "1.3.8", + "baseline": "1.3.11", "port-version": 0 }, "parallelstl": { "baseline": "20200330", - "port-version": 2 + "port-version": 3 }, "paraview": { "baseline": "5.11.0", - "port-version": 1 + "port-version": 2 }, "parmetis": { "baseline": "2022-07-27", @@ -5933,7 +6118,7 @@ }, "parquet": { "baseline": "0", - "port-version": 1 + "port-version": 2 }, "parson": { "baseline": "2022-11-13", @@ -5941,19 +6126,23 @@ }, "pbc": { "baseline": "0.5.14", - "port-version": 6 + "port-version": 7 }, "pcapplusplus": { "baseline": "22.11", - "port-version": 0 + "port-version": 1 }, "pcg": { "baseline": "2021-04-06", - "port-version": 1 + "port-version": 2 + }, + "pciids": { + "baseline": "2023-04-11", + "port-version": 0 }, "pcl": { "baseline": "1.13.0", - "port-version": 0 + "port-version": 3 }, "pcre": { "baseline": "8.45", @@ -5961,35 +6150,35 @@ }, "pcre2": { "baseline": "10.40", - "port-version": 1 + "port-version": 2 }, "pdal": { - "baseline": "2.4.3", + "baseline": "2.5.3", "port-version": 1 }, "pdal-c": { - "baseline": "2.1", + "baseline": "2.2.0", "port-version": 0 }, "pdcurses": { "baseline": "3.9", - "port-version": 3 + "port-version": 5 }, "pdqsort": { "baseline": "2019-07-30", - "port-version": 1 + "port-version": 2 }, "pe-parse": { "baseline": "2.1.0", - "port-version": 0 + "port-version": 1 }, "pegtl": { - "baseline": "3.2.6", + "baseline": "3.2.7", "port-version": 0 }, "pegtl-2": { "baseline": "2.8.3", - "port-version": 2 + "port-version": 3 }, "pffft": { "baseline": "2021-10-09", @@ -6001,7 +6190,7 @@ }, "pfultz2-linq": { "baseline": "2019-05-14", - "port-version": 2 + "port-version": 3 }, "phnt": { "baseline": "2020-12-21", @@ -6017,15 +6206,15 @@ }, "physx": { "baseline": "4.1.2", - "port-version": 5 + "port-version": 6 }, "picojson": { "baseline": "1.3.0", - "port-version": 2 + "port-version": 3 }, "picosha2": { "baseline": "2018-07-30", - "port-version": 1 + "port-version": 2 }, "piex": { "baseline": "2019-07-11", @@ -6069,19 +6258,19 @@ }, "plf-list": { "baseline": "2019-08-10", - "port-version": 1 + "port-version": 2 }, "plf-nanotimer": { "baseline": "2019-08-10", - "port-version": 1 + "port-version": 2 }, "plf-stack": { "baseline": "2019-08-10", - "port-version": 1 + "port-version": 2 }, "plib": { "baseline": "1.8.5", - "port-version": 6 + "port-version": 7 }, "plibsys": { "baseline": "0.0.4", @@ -6093,11 +6282,11 @@ }, "plplot": { "baseline": "5.15.0", - "port-version": 0 + "port-version": 1 }, "plustache": { "baseline": "0.4.0", - "port-version": 3 + "port-version": 4 }, "pmdk": { "baseline": "1.12.0", @@ -6105,11 +6294,11 @@ }, "pngpp": { "baseline": "0.2.10", - "port-version": 1 + "port-version": 2 }, "pngwriter": { "baseline": "0.7.0", - "port-version": 4 + "port-version": 5 }, "poco": { "baseline": "1.12.4", @@ -6129,10 +6318,10 @@ }, "polyclipping": { "baseline": "6.4.2", - "port-version": 11 + "port-version": 12 }, "polyhook2": { - "baseline": "2022-03-01", + "baseline": "2023-02-24", "port-version": 0 }, "polymorphic-value": { @@ -6141,7 +6330,7 @@ }, "ponder": { "baseline": "3.0.0", - "port-version": 4 + "port-version": 5 }, "poppler": { "baseline": "23.1.0", @@ -6149,7 +6338,7 @@ }, "popsift": { "baseline": "0.9", - "port-version": 4 + "port-version": 5 }, "portable-snippets": { "baseline": "2019-09-20", @@ -6161,34 +6350,34 @@ }, "portmidi": { "baseline": "2.0.4", - "port-version": 0 + "port-version": 1 }, "portsmf": { - "baseline": "0.238", - "port-version": 1 + "baseline": "239", + "port-version": 0 }, "ppconsul": { "baseline": "0.5", - "port-version": 4 + "port-version": 5 }, "ppmagic": { "baseline": "2020-07-03", - "port-version": 1 + "port-version": 2 }, "pprint": { "baseline": "2019-07-19", - "port-version": 2 + "port-version": 3 }, "pqp": { "baseline": "1.3", - "port-version": 6 + "port-version": 7 }, "presentmon": { "baseline": "1.7.0", "port-version": 2 }, "proj": { - "baseline": "9.1.1", + "baseline": "9.2.0", "port-version": 0 }, "proj4": { @@ -6209,7 +6398,7 @@ }, "protobuf-c": { "baseline": "1.4.0", - "port-version": 1 + "port-version": 2 }, "protopuf": { "baseline": "2.2.1", @@ -6225,11 +6414,11 @@ }, "proxygen": { "baseline": "2022.07.11.00", - "port-version": 0 + "port-version": 1 }, "psimd": { "baseline": "2021-02-21", - "port-version": 1 + "port-version": 2 }, "ptc-print": { "baseline": "1.4.0", @@ -6241,7 +6430,7 @@ }, "pthread": { "baseline": "3.0.0", - "port-version": 1 + "port-version": 2 }, "pthread-stubs": { "baseline": "0.4", @@ -6253,7 +6442,7 @@ }, "pthreads": { "baseline": "3.0.0", - "port-version": 13 + "port-version": 14 }, "ptyqt": { "baseline": "0.6.5", @@ -6273,19 +6462,19 @@ }, "python2": { "baseline": "2.7.18", - "port-version": 5 + "port-version": 6 }, "python3": { "baseline": "3.10.7", - "port-version": 5 + "port-version": 6 }, "qca": { - "baseline": "2.3.4", - "port-version": 3 + "baseline": "2.3.5", + "port-version": 2 }, "qcustomplot": { - "baseline": "2.0.1", - "port-version": 5 + "baseline": "2.1.1", + "port-version": 0 }, "qhttpengine": { "baseline": "1.0.2", @@ -6300,87 +6489,87 @@ "port-version": 3 }, "qpid-proton": { - "baseline": "0.37.0", - "port-version": 3 + "baseline": "0.38.0", + "port-version": 0 }, "qscintilla": { - "baseline": "2.12.0", + "baseline": "2.13.4", "port-version": 1 }, "qt": { - "baseline": "6.4.2", - "port-version": 1 + "baseline": "6.5.0", + "port-version": 0 }, "qt-advanced-docking-system": { - "baseline": "3.8.2", - "port-version": 2 + "baseline": "4.0.3", + "port-version": 0 }, "qt3d": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qt5": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-3d": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-activeqt": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-androidextras": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-base": { - "baseline": "5.15.8", - "port-version": 4 + "baseline": "5.15.9", + "port-version": 2 }, "qt5-canvas3d": { "baseline": "0", - "port-version": 1 + "port-version": 2 }, "qt5-charts": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-connectivity": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-datavis3d": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-declarative": { - "baseline": "5.15.8", - "port-version": 0 + "baseline": "5.15.9", + "port-version": 1 }, "qt5-doc": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-gamepad": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-graphicaleffects": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-imageformats": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 1 }, "qt5-location": { - "baseline": "5.15.8", - "port-version": 0 + "baseline": "5.15.9", + "port-version": 1 }, "qt5-macextras": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-modularscripts": { @@ -6388,111 +6577,111 @@ "port-version": 1 }, "qt5-mqtt": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-multimedia": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-networkauth": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-purchasing": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-quickcontrols": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-quickcontrols2": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-remoteobjects": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-script": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-scxml": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-sensors": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-serialbus": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-serialport": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-speech": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-svg": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-tools": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-translations": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-virtualkeyboard": { - "baseline": "5.15.8", - "port-version": 0 + "baseline": "5.15.9", + "port-version": 1 }, "qt5-wayland": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-webchannel": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-webengine": { - "baseline": "5.15.8", - "port-version": 1 + "baseline": "5.15.9", + "port-version": 0 }, "qt5-webglplugin": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-websockets": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-webview": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-winextras": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5-x11extras": { - "baseline": "5.15.8", - "port-version": 1 + "baseline": "5.15.9", + "port-version": 0 }, "qt5-xmlpatterns": { - "baseline": "5.15.8", + "baseline": "5.15.9", "port-version": 0 }, "qt5compat": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qt6betablock": { @@ -6500,175 +6689,183 @@ "port-version": 0 }, "qtactiveqt": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtapplicationmanager": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtbase": { - "baseline": "6.4.2", - "port-version": 0 + "baseline": "6.5.0", + "port-version": 2 }, "qtcharts": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtcoap": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtconnectivity": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtdatavis3d": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtdeclarative": { - "baseline": "6.4.2", - "port-version": 1 + "baseline": "6.5.0", + "port-version": 0 }, "qtdeviceutilities": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtdoc": { - "baseline": "6.4.2", + "baseline": "6.5.0", + "port-version": 0 + }, + "qtgrpc": { + "baseline": "6.5.0", "port-version": 0 }, "qthttpserver": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtimageformats": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtinterfaceframework": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtkeychain": { "baseline": "0.13.2", - "port-version": 3 + "port-version": 4 }, "qtkeychain-qt6": { "baseline": "0.13.2", "port-version": 1 }, "qtlanguageserver": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtlocation": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtlottie": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtmqtt": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtmultimedia": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtnetworkauth": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtopcua": { - "baseline": "6.4.2", - "port-version": 0 + "baseline": "6.5.0", + "port-version": 1 }, "qtpositioning": { - "baseline": "6.4.2", - "port-version": 0 + "baseline": "6.5.0", + "port-version": 1 }, "qtquick3d": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtquick3dphysics": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtquickcontrols2": { "baseline": "deprecated", "port-version": 0 }, + "qtquickeffectmaker": { + "baseline": "6.5.0", + "port-version": 0 + }, "qtquicktimeline": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtremoteobjects": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtscxml": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtsensors": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtserialbus": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtserialport": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtshadertools": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtspeech": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtsvg": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qttools": { - "baseline": "6.4.2", - "port-version": 2 + "baseline": "6.5.0", + "port-version": 1 }, "qttranslations": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtvirtualkeyboard": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtwayland": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtwebchannel": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtwebengine": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtwebsockets": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "qtwebview": { - "baseline": "6.4.2", + "baseline": "6.5.0", "port-version": 0 }, "quadtree": { @@ -6676,27 +6873,27 @@ "port-version": 0 }, "quantlib": { - "baseline": "1.29", + "baseline": "1.30", "port-version": 0 }, "quaternions": { "baseline": "1.0.0", - "port-version": 1 + "port-version": 2 }, "quazip": { - "baseline": "1.3", - "port-version": 2 + "baseline": "1.4", + "port-version": 0 }, "quickfast": { "baseline": "1.5", - "port-version": 2 + "port-version": 3 }, "quickfix": { "baseline": "1.15.1", "port-version": 8 }, "quill": { - "baseline": "2.7.0", + "baseline": "2.8.0", "port-version": 0 }, "quirc": { @@ -6713,11 +6910,11 @@ }, "rabit": { "baseline": "0.1", - "port-version": 4 + "port-version": 5 }, "ragel": { "baseline": "6.10", - "port-version": 5 + "port-version": 6 }, "random123": { "baseline": "1.14.0", @@ -6737,7 +6934,7 @@ }, "range-v3-vs2015": { "baseline": "20151130-vcpkg5", - "port-version": 1 + "port-version": 2 }, "rapidcheck": { "baseline": "2023-01-13", @@ -6752,27 +6949,27 @@ "port-version": 0 }, "rapidjson": { - "baseline": "2022-06-28", - "port-version": 3 + "baseline": "2023-04-27", + "port-version": 0 }, "rapidxml": { "baseline": "1.13", - "port-version": 5 + "port-version": 6 }, "rapidxml-ns": { "baseline": "1.13.2", - "port-version": 1 + "port-version": 2 }, "rappture": { "baseline": "1.9", - "port-version": 2 + "port-version": 4 }, "raygui": { "baseline": "3.2", "port-version": 0 }, "raylib": { - "baseline": "4.2.0", + "baseline": "4.5.0", "port-version": 1 }, "rbdl": { @@ -6797,7 +6994,7 @@ }, "readline": { "baseline": "0", - "port-version": 3 + "port-version": 4 }, "readline-osx": { "baseline": "2020-01-04", @@ -6837,10 +7034,10 @@ }, "refprop-headers": { "baseline": "2019-04-14", - "port-version": 1 + "port-version": 2 }, "rendergraph": { - "baseline": "1.2.0", + "baseline": "1.3.0", "port-version": 0 }, "replxx": { @@ -6857,7 +7054,7 @@ }, "restbed": { "baseline": "4.8", - "port-version": 1 + "port-version": 2 }, "restc-cpp": { "baseline": "0.10.0", @@ -6868,7 +7065,7 @@ "port-version": 0 }, "restinio": { - "baseline": "0.6.17", + "baseline": "0.6.18", "port-version": 0 }, "rexo": { @@ -6885,7 +7082,7 @@ }, "riffcpp": { "baseline": "2.2.4", - "port-version": 2 + "port-version": 3 }, "ring-span-lite": { "baseline": "0.6.0", @@ -6900,7 +7097,7 @@ "port-version": 0 }, "rmlui": { - "baseline": "5.0", + "baseline": "5.1", "port-version": 0 }, "roaring": { @@ -6916,7 +7113,7 @@ "port-version": 0 }, "rocksdb": { - "baseline": "7.9.2", + "baseline": "8.0.0", "port-version": 0 }, "rpclib": { @@ -6925,11 +7122,11 @@ }, "rply": { "baseline": "1.1.4", - "port-version": 2 + "port-version": 3 }, "rsasynccpp": { "baseline": "0.0.7", - "port-version": 1 + "port-version": 2 }, "rsig": { "baseline": "0.1.1", @@ -6952,12 +7149,12 @@ "port-version": 1 }, "rtabmap": { - "baseline": "0.20.23", - "port-version": 2 + "baseline": "0.21.0", + "port-version": 1 }, "rtaudio": { "baseline": "2021-11-16", - "port-version": 1 + "port-version": 2 }, "rtlsdr": { "baseline": "2020-04-16", @@ -6976,7 +7173,7 @@ "port-version": 0 }, "rubberband": { - "baseline": "3.1.1", + "baseline": "3.2.0", "port-version": 0 }, "rxcpp": { @@ -6997,7 +7194,7 @@ }, "ryu": { "baseline": "2.0", - "port-version": 6 + "port-version": 9 }, "s2geometry": { "baseline": "0.10.0", @@ -7013,15 +7210,15 @@ }, "sail": { "baseline": "0.9.0-rc3", - "port-version": 0 + "port-version": 2 }, "sais": { "baseline": "2.4.1", - "port-version": 4 + "port-version": 5 }, "sajson": { "baseline": "2018-09-21", - "port-version": 2 + "port-version": 3 }, "sassc": { "baseline": "3.6.2", @@ -7029,19 +7226,19 @@ }, "saucer": { "baseline": "1.0.1", - "port-version": 2 + "port-version": 3 }, "sbp": { "baseline": "3.4.10", "port-version": 1 }, "scenepic": { - "baseline": "1.0.16", + "baseline": "1.1.0", "port-version": 1 }, "scintilla": { "baseline": "4.4.6", - "port-version": 1 + "port-version": 2 }, "sciplot": { "baseline": "0.3.1", @@ -7060,7 +7257,7 @@ "port-version": 1 }, "scope-guard": { - "baseline": "1.0.0", + "baseline": "1.1.0", "port-version": 0 }, "scottt-debugbreak": { @@ -7069,7 +7266,7 @@ }, "scylla-wrapper": { "baseline": "2018-08-26-16e6f435", - "port-version": 2 + "port-version": 3 }, "sdformat10": { "baseline": "10.0.0", @@ -7087,17 +7284,21 @@ "baseline": "1.2.15", "port-version": 17 }, + "sdl1-mixer": { + "baseline": "2023-03-25", + "port-version": 1 + }, "sdl1-net": { "baseline": "1.2.8", - "port-version": 5 + "port-version": 6 }, "sdl2": { - "baseline": "2.26.3", - "port-version": 1 + "baseline": "2.26.5", + "port-version": 0 }, "sdl2-gfx": { "baseline": "1.0.4", - "port-version": 9 + "port-version": 10 }, "sdl2-image": { "baseline": "2.6.3", @@ -7105,6 +7306,10 @@ }, "sdl2-mixer": { "baseline": "2.6.3", + "port-version": 1 + }, + "sdl2-mixer-ext": { + "baseline": "2023-05-04", "port-version": 0 }, "sdl2-net": { @@ -7117,11 +7322,11 @@ }, "sdl2pp": { "baseline": "0.16.1", - "port-version": 6 + "port-version": 7 }, "seacas": { "baseline": "2022-11-22", - "port-version": 2 + "port-version": 4 }, "seal": { "baseline": "4.1.1", @@ -7140,7 +7345,7 @@ "port-version": 2 }, "sentry-native": { - "baseline": "0.6.0", + "baseline": "0.6.2", "port-version": 0 }, "septag-dmon": { @@ -7149,15 +7354,15 @@ }, "septag-sx": { "baseline": "2019-05-07", - "port-version": 4 + "port-version": 5 }, "seqan": { "baseline": "2.4.0", - "port-version": 2 + "port-version": 3 }, "serd": { "baseline": "0.30.4", - "port-version": 1 + "port-version": 2 }, "serdepp": { "baseline": "0.1.4.1", @@ -7165,7 +7370,7 @@ }, "sf2cute": { "baseline": "0.2.0", - "port-version": 3 + "port-version": 4 }, "sfgui": { "baseline": "0.4.0", @@ -7173,27 +7378,27 @@ }, "sfml": { "baseline": "2.5.1", - "port-version": 14 + "port-version": 15 }, "sfsexp": { "baseline": "1.3.1", "port-version": 1 }, "shader-slang": { - "baseline": "0.24.43", - "port-version": 1 + "baseline": "0.27.20", + "port-version": 0 }, "shaderc": { "baseline": "2021.1", "port-version": 3 }, "shaderwriter": { - "baseline": "2.5.0", + "baseline": "2.6.0", "port-version": 0 }, "shapelib": { "baseline": "1.5.0", - "port-version": 3 + "port-version": 4 }, "shiftmedia-libgcrypt": { "baseline": "1.10.1-1", @@ -7201,7 +7406,7 @@ }, "shiftmedia-libgnutls": { "baseline": "3.7.6", - "port-version": 0 + "port-version": 2 }, "shiftmedia-libgpg-error": { "baseline": "1.45", @@ -7213,19 +7418,19 @@ }, "shiva-sfml": { "baseline": "1.0", - "port-version": 3 + "port-version": 4 }, "shogun": { "baseline": "6.1.4", - "port-version": 8 + "port-version": 9 }, "signalrclient": { "baseline": "1.0.0-beta1-9", - "port-version": 3 + "port-version": 4 }, "sigslot": { "baseline": "1.0.0", - "port-version": 4 + "port-version": 5 }, "simage": { "baseline": "1.8.2", @@ -7236,15 +7441,15 @@ "port-version": 0 }, "simd": { - "baseline": "5.1.119", - "port-version": 2 + "baseline": "5.2.123", + "port-version": 1 }, "simde": { - "baseline": "0.7.2", - "port-version": 1 + "baseline": "0.7.4", + "port-version": 0 }, "simdjson": { - "baseline": "3.1.2", + "baseline": "3.1.8", "port-version": 0 }, "simdutf": { @@ -7253,7 +7458,7 @@ }, "simple-fft": { "baseline": "2020-06-14", - "port-version": 1 + "port-version": 2 }, "simpleini": { "baseline": "4.19", @@ -7281,7 +7486,7 @@ }, "sleepy-discord": { "baseline": "2022-02-05", - "port-version": 0 + "port-version": 1 }, "slikenet": { "baseline": "2021-06-07", @@ -7289,7 +7494,7 @@ }, "sltbench": { "baseline": "2.4.0", - "port-version": 1 + "port-version": 2 }, "smf": { "baseline": "0.1.1", @@ -7297,7 +7502,7 @@ }, "smpeg2": { "baseline": "2.0.0", - "port-version": 8 + "port-version": 9 }, "snappy": { "baseline": "1.1.9", @@ -7305,11 +7510,11 @@ }, "sndfile": { "baseline": "0", - "port-version": 1 + "port-version": 2 }, "snowhouse": { "baseline": "5.0.0", - "port-version": 1 + "port-version": 2 }, "so5extra": { "baseline": "1.5.2", @@ -7345,7 +7550,7 @@ }, "sokol": { "baseline": "2019-09-09", - "port-version": 1 + "port-version": 2 }, "sol2": { "baseline": "3.3.0", @@ -7365,7 +7570,7 @@ }, "sord": { "baseline": "0.16.4", - "port-version": 1 + "port-version": 2 }, "soundtouch": { "baseline": "2.3.1", @@ -7377,7 +7582,7 @@ }, "spaceland": { "baseline": "7.8.2", - "port-version": 6 + "port-version": 8 }, "span-lite": { "baseline": "0.10.3", @@ -7389,11 +7594,11 @@ }, "sparsepp": { "baseline": "1.22", - "port-version": 3 + "port-version": 4 }, "spatialite-tools": { "baseline": "5.0.1", - "port-version": 2 + "port-version": 3 }, "spdk": { "baseline": "19.01.1", @@ -7413,7 +7618,7 @@ }, "spdlog": { "baseline": "1.11.0", - "port-version": 0 + "port-version": 1 }, "spectra": { "baseline": "1.0.1", @@ -7425,7 +7630,7 @@ }, "speexdsp": { "baseline": "1.2.1", - "port-version": 0 + "port-version": 1 }, "spine-runtimes": { "baseline": "4.1.0", @@ -7433,7 +7638,7 @@ }, "spirit-po": { "baseline": "1.1.2", - "port-version": 2 + "port-version": 3 }, "spirv-cross": { "baseline": "2021-01-15", @@ -7452,32 +7657,36 @@ "port-version": 0 }, "spix": { - "baseline": "0.4", + "baseline": "0.5", + "port-version": 0 + }, + "spout2": { + "baseline": "2.007.009", "port-version": 0 }, "sprout": { "baseline": "2019-06-20", - "port-version": 1 + "port-version": 2 }, "spscqueue": { "baseline": "1.1", - "port-version": 2 + "port-version": 3 }, "sqlcipher": { - "baseline": "4.5.2", - "port-version": 0 + "baseline": "4.5.3", + "port-version": 1 }, "sqlite-modern-cpp": { "baseline": "3.2-936cd0c8", - "port-version": 1 + "port-version": 2 }, "sqlite-orm": { - "baseline": "1.8.1", + "baseline": "1.8.2", "port-version": 0 }, "sqlite3": { "baseline": "3.40.1", - "port-version": 1 + "port-version": 3 }, "sqlitecpp": { "baseline": "3.2.0", @@ -7501,7 +7710,7 @@ }, "sratom": { "baseline": "0.6.4", - "port-version": 1 + "port-version": 2 }, "srell": { "baseline": "3.010", @@ -7515,9 +7724,13 @@ "baseline": "1.5.1", "port-version": 1 }, + "stackwalker": { + "baseline": "1.20", + "port-version": 0 + }, "starlink-ast": { - "baseline": "9.2.7", - "port-version": 1 + "baseline": "9.2.10", + "port-version": 0 }, "staticjson": { "baseline": "1.0.0", @@ -7525,15 +7738,19 @@ }, "status-code": { "baseline": "2023-01-27", - "port-version": 1 + "port-version": 2 }, "status-value-lite": { "baseline": "1.1.0", - "port-version": 2 + "port-version": 3 }, "stb": { - "baseline": "2022-09-09", - "port-version": 0 + "baseline": "2023-04-11", + "port-version": 1 + }, + "stdexec": { + "baseline": "2023-03-05", + "port-version": 1 }, "stduuid": { "baseline": "1.2.2", @@ -7544,16 +7761,16 @@ "port-version": 0 }, "stlab": { - "baseline": "1.6.2", - "port-version": 2 + "baseline": "1.7.1", + "port-version": 1 }, "stormlib": { "baseline": "2019-05-10", - "port-version": 4 + "port-version": 5 }, "strict-variant": { "baseline": "0.5", - "port-version": 1 + "port-version": 2 }, "string-theory": { "baseline": "3.6", @@ -7573,7 +7790,7 @@ }, "strtk": { "baseline": "2020-09-14", - "port-version": 1 + "port-version": 2 }, "stx": { "baseline": "0.0.3", @@ -7592,8 +7809,8 @@ "port-version": 0 }, "superlu": { - "baseline": "5.3.0", - "port-version": 1 + "baseline": "6.0.0", + "port-version": 0 }, "symengine": { "baseline": "0.9.0", @@ -7601,11 +7818,11 @@ }, "systemc": { "baseline": "2.3.3", - "port-version": 7 + "port-version": 8 }, "szip": { "baseline": "2.1.1", - "port-version": 9 + "port-version": 11 }, "tabulate": { "baseline": "1.4", @@ -7613,7 +7830,7 @@ }, "tacopie": { "baseline": "3.2.0", - "port-version": 4 + "port-version": 5 }, "taglib": { "baseline": "1.13.0", @@ -7621,18 +7838,18 @@ }, "taocpp-json": { "baseline": "2020-09-14", - "port-version": 2 + "port-version": 3 }, "tap-windows6": { "baseline": "9.21.2-0e30f5c", - "port-version": 1 + "port-version": 2 }, "taskflow": { - "baseline": "3.5.0", + "baseline": "3.6.0", "port-version": 0 }, "tbb": { - "baseline": "2021.8.0", + "baseline": "2021.9.0", "port-version": 0 }, "tcb-span": { @@ -7657,7 +7874,7 @@ }, "telnetpp": { "baseline": "2.1.2", - "port-version": 2 + "port-version": 3 }, "tensorflow": { "baseline": "2.10.0", @@ -7673,7 +7890,7 @@ }, "tensorpipe": { "baseline": "2022-03-16", - "port-version": 2 + "port-version": 3 }, "termcolor": { "baseline": "2.1.0", @@ -7681,7 +7898,7 @@ }, "tesseract": { "baseline": "5.3.0", - "port-version": 0 + "port-version": 1 }, "tfhe": { "baseline": "1.0.1", @@ -7693,7 +7910,7 @@ }, "tgc": { "baseline": "2019-08-11", - "port-version": 3 + "port-version": 4 }, "tgui": { "baseline": "0.9.5", @@ -7701,7 +7918,7 @@ }, "theia": { "baseline": "0.8", - "port-version": 8 + "port-version": 9 }, "think-cell-range": { "baseline": "498839d", @@ -7712,16 +7929,16 @@ "port-version": 6 }, "thorvg": { - "baseline": "0.8.3", + "baseline": "0.9.0", "port-version": 0 }, "threadpool": { "baseline": "0.2.5", - "port-version": 2 + "port-version": 3 }, "thrift": { "baseline": "0.16.0", - "port-version": 0 + "port-version": 1 }, "tidy-html5": { "baseline": "5.8.0", @@ -7729,7 +7946,7 @@ }, "tiff": { "baseline": "4.5.0", - "port-version": 2 + "port-version": 3 }, "tinkerforge": { "baseline": "2.1.25", @@ -7737,15 +7954,15 @@ }, "tiny-aes-c": { "baseline": "2019-07-31", - "port-version": 2 + "port-version": 3 }, "tiny-bignum-c": { "baseline": "2019-07-31", - "port-version": 2 + "port-version": 3 }, "tiny-dnn": { "baseline": "2018-10-25", - "port-version": 1 + "port-version": 2 }, "tiny-process-library": { "baseline": "2.0.4", @@ -7753,7 +7970,7 @@ }, "tiny-regex-c": { "baseline": "2019-07-31", - "port-version": 2 + "port-version": 3 }, "tinycbor": { "baseline": "0.6.0", @@ -7761,7 +7978,7 @@ }, "tinycthread": { "baseline": "2019-08-06", - "port-version": 2 + "port-version": 3 }, "tinydir": { "baseline": "1.2.5", @@ -7773,7 +7990,7 @@ }, "tinyexpr": { "baseline": "2020-09-25", - "port-version": 1 + "port-version": 2 }, "tinyexr": { "baseline": "1.0.1", @@ -7783,13 +8000,17 @@ "baseline": "3.8.8", "port-version": 4 }, + "tinyfsm": { + "baseline": "0.3.3", + "port-version": 0 + }, "tinygltf": { - "baseline": "2.5.0", + "baseline": "2.8.4", "port-version": 0 }, "tinynpy": { "baseline": "1.0.0", - "port-version": 5 + "port-version": 6 }, "tinyobjloader": { "baseline": "2.0.0-rc9", @@ -7805,11 +8026,11 @@ }, "tinythread": { "baseline": "1.1", - "port-version": 5 + "port-version": 6 }, "tinytoml": { "baseline": "20180219", - "port-version": 2 + "port-version": 3 }, "tinyutf8": { "baseline": "4.4.3", @@ -7817,19 +8038,19 @@ }, "tinyxml": { "baseline": "2.6.2", - "port-version": 9 + "port-version": 10 }, "tinyxml2": { "baseline": "9.0.0", "port-version": 2 }, "tl-expected": { - "baseline": "2022-11-24", + "baseline": "1.1.0", "port-version": 0 }, "tl-function-ref": { "baseline": "1.0.0", - "port-version": 3 + "port-version": 4 }, "tl-generator": { "baseline": "2021-09-28", @@ -7845,7 +8066,7 @@ }, "tlx": { "baseline": "0.5.20191212", - "port-version": 3 + "port-version": 4 }, "tmx": { "baseline": "1.2.0", @@ -7876,21 +8097,25 @@ "port-version": 4 }, "tracy": { - "baseline": "0.9.0", - "port-version": 3 + "baseline": "0.9.1", + "port-version": 0 }, "transwarp": { "baseline": "2.2.2", "port-version": 0 }, "trantor": { - "baseline": "1.5.8", + "baseline": "1.5.11", "port-version": 0 }, "tre": { "baseline": "0.8.0", "port-version": 5 }, + "tree-similarity": { + "baseline": "0.1.1", + "port-version": 0 + }, "tree-sitter": { "baseline": "0.20.6", "port-version": 0 @@ -7901,7 +8126,7 @@ }, "treehopper": { "baseline": "1.11.3", - "port-version": 6 + "port-version": 7 }, "triangle": { "baseline": "1.6", @@ -7917,15 +8142,15 @@ }, "tsl-hopscotch-map": { "baseline": "2.3.0", - "port-version": 2 + "port-version": 3 }, "tsl-ordered-map": { "baseline": "1.0.0", - "port-version": 2 + "port-version": 3 }, "tsl-sparse-map": { "baseline": "0.6.2", - "port-version": 2 + "port-version": 3 }, "ttauri": { "baseline": "0.5.0", @@ -7945,7 +8170,7 @@ }, "type-lite": { "baseline": "0.1.0", - "port-version": 2 + "port-version": 3 }, "type-safe": { "baseline": "0.2.2", @@ -7955,6 +8180,10 @@ "baseline": "0.0.8", "port-version": 0 }, + "udt": { + "baseline": "4.11", + "port-version": 0 + }, "umock-c": { "baseline": "2022-01-21", "port-version": 1 @@ -7985,18 +8214,18 @@ }, "unqlite": { "baseline": "1.1.9", - "port-version": 1 + "port-version": 2 }, "unrar": { "baseline": "6.1.7", - "port-version": 0 + "port-version": 2 }, "upb": { "baseline": "2022-06-21", "port-version": 0 }, "urdfdom": { - "baseline": "3.1.0", + "baseline": "3.1.1", "port-version": 0 }, "urdfdom-headers": { @@ -8005,7 +8234,7 @@ }, "urho3d": { "baseline": "2021-03-01", - "port-version": 3 + "port-version": 4 }, "uriparser": { "baseline": "0.9.7", @@ -8016,8 +8245,8 @@ "port-version": 3 }, "usd": { - "baseline": "20.08", - "port-version": 4 + "baseline": "23.5", + "port-version": 0 }, "usockets": { "baseline": "0.8.5", @@ -8041,7 +8270,7 @@ }, "utfz": { "baseline": "1.2", - "port-version": 3 + "port-version": 4 }, "uthash": { "baseline": "2.3.0", @@ -8052,15 +8281,15 @@ "port-version": 2 }, "uvatlas": { - "baseline": "2023-02-06", - "port-version": 1 + "baseline": "2023-04-28", + "port-version": 0 }, "uvw": { - "baseline": "2.12.1", - "port-version": 2 + "baseline": "3.0.0", + "port-version": 0 }, "uwebsockets": { - "baseline": "20.36.0", + "baseline": "20.41.0", "port-version": 0 }, "v-hacd": { @@ -8104,7 +8333,7 @@ "port-version": 1 }, "vcpkg-cmake-get-vars": { - "baseline": "2022-12-16", + "baseline": "2023-03-02", "port-version": 0 }, "vcpkg-get-python-packages": { @@ -8124,7 +8353,7 @@ "port-version": 1 }, "vcpkg-qmake": { - "baseline": "2022-11-16", + "baseline": "2023-03-22", "port-version": 0 }, "vcpkg-tool-bazel": { @@ -8176,20 +8405,20 @@ "port-version": 1 }, "visit-struct": { - "baseline": "1.0", - "port-version": 3 + "baseline": "1.1.0", + "port-version": 0 }, "vk-bootstrap": { - "baseline": "0.5", - "port-version": 1 + "baseline": "0.7", + "port-version": 0 }, "vkfft": { - "baseline": "1.2.17", + "baseline": "1.2.31", "port-version": 0 }, "vlfeat": { "baseline": "2020-07-10", - "port-version": 2 + "port-version": 3 }, "vlpp": { "baseline": "1.1.0.0", @@ -8200,16 +8429,20 @@ "port-version": 1 }, "vowpal-wabbit": { - "baseline": "9.6.0", - "port-version": 0 + "baseline": "9.8.0", + "port-version": 2 }, "vs-yasm": { "baseline": "0.5.0", - "port-version": 1 + "port-version": 2 + }, + "vsg": { + "baseline": "1.0.5", + "port-version": 0 }, "vtk": { "baseline": "9.2.0-pv5.11.0", - "port-version": 4 + "port-version": 6 }, "vtk-dicom": { "baseline": "0.8.14", @@ -8217,27 +8450,27 @@ }, "vtk-m": { "baseline": "1.9.0", - "port-version": 1 + "port-version": 2 }, "vulkan": { "baseline": "1.1.82.1", - "port-version": 3 + "port-version": 6 }, "vulkan-headers": { - "baseline": "1.3.239", - "port-version": 0 + "baseline": "1.3.243", + "port-version": 2 }, "vulkan-hpp": { "baseline": "1.3.231", - "port-version": 0 + "port-version": 2 }, "vulkan-memory-allocator": { "baseline": "3.0.1", - "port-version": 0 + "port-version": 1 }, "vulkan-memory-allocator-hpp": { "baseline": "3.0.1", - "port-version": 0 + "port-version": 1 }, "vvenc": { "baseline": "1.7.0", @@ -8253,11 +8486,11 @@ }, "wangle": { "baseline": "2022.03.21.00", - "port-version": 0 + "port-version": 1 }, "wasmedge": { - "baseline": "0.12.0-alpha.1", - "port-version": 0 + "baseline": "0.12.1", + "port-version": 1 }, "wavelib": { "baseline": "2021-11-26", @@ -8275,17 +8508,21 @@ "baseline": "1.31", "port-version": 1 }, + "wcslib": { + "baseline": "7.12", + "port-version": 0 + }, "websocketpp": { "baseline": "0.8.2", "port-version": 2 }, "webview2": { "baseline": "1.0.1210.39", - "port-version": 0 + "port-version": 1 }, "wepoll": { "baseline": "1.5.8", - "port-version": 2 + "port-version": 3 }, "wg21-linear-algebra": { "baseline": "0.7.2", @@ -8293,10 +8530,10 @@ }, "wg21-sg14": { "baseline": "2019-08-13", - "port-version": 1 + "port-version": 2 }, "wil": { - "baseline": "2023-02-02", + "baseline": "2023-04-11", "port-version": 0 }, "wildmidi": { @@ -8313,7 +8550,7 @@ }, "winpcap": { "baseline": "4.1.3", - "port-version": 8 + "port-version": 9 }, "winpty": { "baseline": "0.4.3", @@ -8329,7 +8566,7 @@ }, "winsparkle": { "baseline": "0.7.0", - "port-version": 1 + "port-version": 2 }, "wintoast": { "baseline": "1.2.0", @@ -8353,7 +8590,7 @@ }, "wordnet": { "baseline": "3.0", - "port-version": 2 + "port-version": 3 }, "workflow": { "baseline": "0.10.5", @@ -8385,7 +8622,7 @@ }, "wxwidgets": { "baseline": "3.2.2.1", - "port-version": 0 + "port-version": 2 }, "wyhash": { "baseline": "2023-01-25", @@ -8393,23 +8630,27 @@ }, "x-plane": { "baseline": "3.0.3", - "port-version": 1 + "port-version": 2 }, "x264": { "baseline": "0.164.3095", - "port-version": 2 + "port-version": 4 }, "x265": { "baseline": "3.4", "port-version": 8 }, + "x86-simd-sort": { + "baseline": "2023-03-04", + "port-version": 0 + }, "xapian": { - "baseline": "1.4.21", + "baseline": "1.4.22", "port-version": 1 }, "xaudio2redist": { "baseline": "1.2.11", - "port-version": 0 + "port-version": 1 }, "xbitmaps": { "baseline": "1.1.2", @@ -8461,22 +8702,22 @@ }, "xeus": { "baseline": "0.24.3", - "port-version": 2 + "port-version": 3 }, "xframe": { "baseline": "0.3.0", - "port-version": 2 + "port-version": 3 }, "xlnt": { "baseline": "1.5.0", "port-version": 4 }, "xlsxio": { - "baseline": "2021-03-24", - "port-version": 1 + "baseline": "0.2.34", + "port-version": 0 }, "xmlsec": { - "baseline": "1.2.36", + "baseline": "1.2.37", "port-version": 0 }, "xnnpack": { @@ -8492,12 +8733,12 @@ "port-version": 0 }, "xpack": { - "baseline": "2023-02-06", + "baseline": "1.0.5", "port-version": 0 }, "xproperty": { "baseline": "0.8.1", - "port-version": 2 + "port-version": 3 }, "xproto": { "baseline": "2021.5", @@ -8505,14 +8746,14 @@ }, "xqilla": { "baseline": "2.3.4", - "port-version": 1 + "port-version": 2 }, "xsimd": { - "baseline": "9.0.1", + "baseline": "10.0.0", "port-version": 0 }, "xtensor": { - "baseline": "0.24.3", + "baseline": "0.24.6", "port-version": 0 }, "xtensor-blas": { @@ -8521,15 +8762,15 @@ }, "xtensor-fftw": { "baseline": "2019-11-30", - "port-version": 3 + "port-version": 4 }, "xtensor-io": { "baseline": "0.13.0", "port-version": 1 }, "xtl": { - "baseline": "0.7.2", - "port-version": 1 + "baseline": "0.7.5", + "port-version": 0 }, "xtrans": { "baseline": "1.4.0", @@ -8537,19 +8778,19 @@ }, "xxhash": { "baseline": "0.8.1", - "port-version": 1 + "port-version": 2 }, "yajl": { "baseline": "2.1.0", - "port-version": 3 + "port-version": 4 }, "yaml-cpp": { "baseline": "0.7.0", "port-version": 1 }, "yara": { - "baseline": "4.2.3", - "port-version": 0 + "baseline": "4.3.0", + "port-version": 1 }, "yas": { "baseline": "7.1.0", @@ -8576,8 +8817,8 @@ "port-version": 0 }, "yomm2": { - "baseline": "1.1.2", - "port-version": 1 + "baseline": "1.3.1", + "port-version": 0 }, "yyjson": { "baseline": "0.6.0", @@ -8593,15 +8834,15 @@ }, "z85": { "baseline": "1.0", - "port-version": 1 + "port-version": 2 }, "zeroc-ice": { - "baseline": "3.7.7", - "port-version": 3 + "baseline": "3.7.9", + "port-version": 0 }, "zeromq": { "baseline": "2023-01-31", - "port-version": 0 + "port-version": 4 }, "zfp": { "baseline": "1.0.0", @@ -8625,7 +8866,7 @@ }, "zookeeper": { "baseline": "3.5.6", - "port-version": 0 + "port-version": 1 }, "zopfli": { "baseline": "1.0.3", @@ -8636,11 +8877,11 @@ "port-version": 0 }, "zserge-webview": { - "baseline": "2022-09-07", + "baseline": "2023-04-15", "port-version": 0 }, "zstd": { - "baseline": "1.5.4", + "baseline": "1.5.5", "port-version": 0 }, "zstr": { @@ -8665,7 +8906,7 @@ }, "zyre": { "baseline": "2019-07-07", - "port-version": 4 + "port-version": 5 }, "zziplib": { "baseline": "0.13.72", diff --git a/vcpkg/versions/d-/dpp.json b/vcpkg/versions/d-/dpp.json index 39456f4301..770d2b8fd9 100644 --- a/vcpkg/versions/d-/dpp.json +++ b/vcpkg/versions/d-/dpp.json @@ -1,5 +1,15 @@ { "versions": [ + { + "git-tree": "8d605903b75a46d8a4a2278261c81fd2c68e6281", + "version": "10.0.24", + "port-version": 0 + }, + { + "git-tree": "f5258ce203526b7be2ba77c9ab6deb7a197273af", + "version": "10.0.23", + "port-version": 1 + }, { "git-tree": "1701fdce3e1e8a3557382fcc806d87abf06fd452", "version": "10.0.23", From b76f561192a0526c5e45dc1160ccdef1575a9b4b Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 22 May 2023 17:05:42 +0000 Subject: [PATCH 056/101] version bump --- include/dpp/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/dpp/version.h b/include/dpp/version.h index 26db82aa1e..aa8e2ec25e 100644 --- a/include/dpp/version.h +++ b/include/dpp/version.h @@ -21,9 +21,9 @@ #pragma once #if !defined(DPP_VERSION_LONG) -#define DPP_VERSION_LONG 0x00100024 -#define DPP_VERSION_SHORT 100024 -#define DPP_VERSION_TEXT "D++ 10.0.24 (28-Feb-2023)" +#define DPP_VERSION_LONG 0x00100025 +#define DPP_VERSION_SHORT 100025 +#define DPP_VERSION_TEXT "D++ 10.0.25 (22-May-2023)" #define DPP_VERSION_MAJOR ((DPP_VERSION_LONG & 0x00ff0000) >> 16) #define DPP_VERSION_MINOR ((DPP_VERSION_LONG & 0x0000ff00) >> 8) From 7d7b6f814bee30c7c2d68deb30847b70a31957fb Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Wed, 24 May 2023 07:59:33 +0000 Subject: [PATCH 057/101] Adjust vcpkg ci action to modernize for next release, ref: https://github.com/microsoft/vcpkg/pull/31568#discussion_r1203637718 --- buildtools/classes/Packager/Vcpkg.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/buildtools/classes/Packager/Vcpkg.php b/buildtools/classes/Packager/Vcpkg.php index 87523ab066..3b3bee9d12 100644 --- a/buildtools/classes/Packager/Vcpkg.php +++ b/buildtools/classes/Packager/Vcpkg.php @@ -138,7 +138,6 @@ function constructPortAndVersionFile(string $sha512 = "0"): string OUT_SOURCE_PATH SOURCE_PATH REPO brainboxdotcc/DPP REF "v${VERSION}" - # Auto-generated by release CI action at brainboxdotcc/DPP SHA512 ' . $sha512 . ' ) @@ -158,11 +157,7 @@ function constructPortAndVersionFile(string $sha512 = "0"): string file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin" "${CURRENT_PACKAGES_DIR}/debug/bin") endif() -file( - INSTALL "${SOURCE_PATH}/LICENSE" - DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" - RENAME copyright -) +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") file(COPY "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") '; From 013ee8b0cb87e96e1ebea2575f2d9716b19d1954 Mon Sep 17 00:00:00 2001 From: Phil B Date: Fri, 26 May 2023 15:02:32 +0200 Subject: [PATCH 058/101] feat: added the USE_EXTERNAL_SOUNDS permission --- include/dpp/permissions.h | 1 + include/dpp/role.h | 7 +++++++ include/dpp/utility.h | 6 +++--- src/dpp/role.cpp | 4 ++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/include/dpp/permissions.h b/include/dpp/permissions.h index 9da2d7ee29..7e027ccf18 100644 --- a/include/dpp/permissions.h +++ b/include/dpp/permissions.h @@ -73,6 +73,7 @@ enum permissions : uint64_t { p_moderate_members = 0x10000000000, //!< allows for timing out users to prevent them from sending or reacting to messages in chat and threads, and from speaking in voice and stage channels p_view_creator_monetization_analytics = 0x20000000000, //!< allows for viewing role subscription insights p_use_soundboard = 0x40000000000, //!< allows for using soundboard in a voice channel + p_use_external_sounds = 0x0000200000000000, //!< allows the usage of custom soundboard sounds from other servers p_send_voice_messages = 0x0000400000000000, //!< allows sending voice messages }; diff --git a/include/dpp/role.h b/include/dpp/role.h index 6862d6b6d0..078abbdb8e 100644 --- a/include/dpp/role.h +++ b/include/dpp/role.h @@ -583,6 +583,13 @@ class DPP_EXPORT role : public managed, public json_interface { * @return bool True if user has the use soundboard permission or is administrator. */ bool has_use_soundboard() const; + /** + * @brief True if has the use external sounds permission. + * @note Having the administrator permission causes this method to always return true + * Channel specific overrides may apply to permissions. + * @return bool True if user has the use external sounds permission or is administrator. + */ + bool has_use_external_sounds() const; /** * @brief True if has the send voice messages permission. * @note Having the administrator permission causes this method to always return true diff --git a/include/dpp/utility.h b/include/dpp/utility.h index 4b003cc33a..8528ca7008 100644 --- a/include/dpp/utility.h +++ b/include/dpp/utility.h @@ -55,7 +55,7 @@ namespace dpp { * @param format the wished format to return. Must be one of the formats passed in `allowed_formats`, otherwise it returns an empty string * @param size the image size which will be appended as a querystring to the url. * It must be any power of two between 16 and 4096, otherwise no querystring will be appended (discord then returns the image as their default size) - * @param prefer_animated Whether the user prefers gif format. If true, it'll return gif format whenever the emoji is available as animated. + * @param prefer_animated Whether the user prefers gif format. If true, it'll return gif format whenever the image is available as animated. * In this case, the `format`-parameter is only used for non-animated images. * @param is_animated Whether the image is actually animated or not * @return std::string endpoint url or empty string @@ -67,11 +67,11 @@ namespace dpp { * @see https://discord.com/developers/docs/reference#image-formatting-cdn-endpoints * @param allowed_formats A vector of supported formats for the endpoint from the discord docs * @param path_without_extension The path for the endpoint (without the extension e.g. `.png`) - * @param hash The hash (optional). If passed, it will be prefixed with `a_` for animated images (`is_animated`=true) + * @param hash The hash (optional). If not empty, it will be prefixed with `a_` for animated images (`is_animated`=true) * @param format the wished format to return. Must be one of the formats passed in `allowed_formats`, otherwise it returns an empty string * @param size the image size which will be appended as a querystring to the url. * It must be any power of two between 16 and 4096, otherwise no querystring will be appended (discord then returns the image as their default size) - * @param prefer_animated Whether the user prefers gif format. If true, it'll return gif format whenever the emoji is available as animated. + * @param prefer_animated Whether the user prefers gif format. If true, it'll return gif format whenever the image is available as animated. * In this case, the `format`-parameter is only used for non-animated images. * @param is_animated Whether the image is actually animated or not * @return std::string endpoint url or empty string diff --git a/src/dpp/role.cpp b/src/dpp/role.cpp index 9328597c4d..effb93231e 100644 --- a/src/dpp/role.cpp +++ b/src/dpp/role.cpp @@ -339,6 +339,10 @@ bool role::has_use_soundboard() const { return has_administrator() || permissions.has(p_use_soundboard); } +bool role::has_use_external_sounds() const { + return has_administrator() || permissions.has(p_use_external_sounds); +} + bool role::has_send_voice_messages() const { return has_administrator() || permissions.has(p_send_voice_messages); } From 6cc12d9bffe4c33d8828f2486c951aef8934b97a Mon Sep 17 00:00:00 2001 From: Phil B Date: Sun, 28 May 2023 18:04:51 +0200 Subject: [PATCH 059/101] refactor: changed the behaviour of channel::add_permission_overwrite & added set_permission_overwrite and remove_permission_overwrite methods --- include/dpp/channel.h | 37 ++++++++++++++++++++++++++++++------- src/dpp/channel.cpp | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/include/dpp/channel.h b/include/dpp/channel.h index d39a0e0998..5a28fcc906 100644 --- a/include/dpp/channel.h +++ b/include/dpp/channel.h @@ -504,16 +504,39 @@ class DPP_EXPORT channel : public managed, public json_interface { channel& set_rate_limit_per_user(const uint16_t rate_limit_per_user); /** - * @brief Add a permission_overwrite to this channel object - * - * @param id ID of the role or the member you want to add overwrite for + * @brief Add permission overwrites for a user or role. + * If the channel already has permission overwrites for the passed target, the existing ones will be adjusted by the passed permissions + * + * @param target ID of the role or the member you want to adjust overwrites for * @param type type of overwrite - * @param allowed_permissions bitmask of allowed permissions (refer to enum dpp::permissions) for this user/role in this channel - * @param denied_permissions bitmask of denied permissions (refer to enum dpp::permissions) for this user/role in this channel + * @param allowed_permissions bitmask of dpp::permissions you want to allow for this user/role in this channel. Note: You can use the dpp::permission class + * @param denied_permissions bitmask of dpp::permissions you want to deny for this user/role in this channel. Note: You can use the dpp::permission class * - * @return Reference to self, so these method calls may be chained + * @return Reference to self, so these method calls may be chained + */ + channel& add_permission_overwrite(const snowflake target, const overwrite_type type, const uint64_t allowed_permissions, const uint64_t denied_permissions); + /** + * @brief Set permission overwrites for a user or role on this channel object. Old permission overwrites for the target will be overwritten + * + * @param target ID of the role or the member you want to set overwrites for + * @param type type of overwrite + * @param allowed_permissions bitmask of allowed dpp::permissions for this user/role in this channel. Note: You can use the dpp::permission class + * @param denied_permissions bitmask of denied dpp::permissions for this user/role in this channel. Note: You can use the dpp::permission class + * + * @return Reference to self, so these method calls may be chained + * + * @note If both `allowed_permissions` and `denied_permissions` parameters are 0, the permission overwrite for the target will be removed + */ + channel& set_permission_overwrite(const snowflake target, const overwrite_type type, const uint64_t allowed_permissions, const uint64_t denied_permissions); + /** + * @brief Remove channel specific permission overwrites of a user or role + * + * @param target ID of the role or the member you want to remove permission overwrites of + * @param type type of overwrite + * + * @return Reference to self, so these method calls may be chained */ - channel& add_permission_overwrite(const snowflake id, const overwrite_type type, const uint64_t allowed_permissions, const uint64_t denied_permissions); + channel& remove_permission_overwrite(const snowflake target, const overwrite_type type); /** * @brief Get the channel type diff --git a/src/dpp/channel.cpp b/src/dpp/channel.cpp index 3017e713e2..e22db2d7e5 100644 --- a/src/dpp/channel.cpp +++ b/src/dpp/channel.cpp @@ -219,12 +219,42 @@ channel& channel::set_user_limit(const uint8_t user_limit) { return *this; } -channel& channel::add_permission_overwrite(const snowflake id, const overwrite_type type, const uint64_t allowed_permissions, const uint64_t denied_permissions) { - permission_overwrite po {id, allowed_permissions, denied_permissions, type}; +channel& channel::add_permission_overwrite(const snowflake target, const overwrite_type type, const uint64_t allowed_permissions, const uint64_t denied_permissions) { + for (auto &o : this->permission_overwrites) { + if (o.id == target && o.type == type) { + o.allow.remove(denied_permissions); + o.allow.add(allowed_permissions); + o.deny.remove(allowed_permissions); + o.deny.add(denied_permissions); + return *this; + } + } + permission_overwrite po {target, allowed_permissions, denied_permissions, type}; this->permission_overwrites.push_back(po); return *this; } +channel& channel::set_permission_overwrite(const snowflake target, const overwrite_type type, const uint64_t allowed_permissions, const uint64_t denied_permissions) { + this->remove_permission_overwrite(target, type); + if (allowed_permissions != 0 || denied_permissions != 0) { + permission_overwrite po{target, allowed_permissions, denied_permissions, type}; + this->permission_overwrites.push_back(po); + } + return *this; +} + +channel& channel::remove_permission_overwrite(const dpp::snowflake target, const dpp::overwrite_type type) { + auto it = this->permission_overwrites.begin(); + while (it != this->permission_overwrites.end()) { + if (it->id == target && it->type == type) { + it = this->permission_overwrites.erase(it); + } else { + it++; + } + } + return *this; +} + bool channel::is_nsfw() const { return flags & dpp::c_nsfw; } From 324eadd6512fb2b07329400c21ef24c5876b7341 Mon Sep 17 00:00:00 2001 From: Phil Date: Tue, 30 May 2023 16:37:40 +0200 Subject: [PATCH 060/101] feat: added user field to dpp::invite (#698) --- include/dpp/invite.h | 28 +++++++++++++++++++++++++--- src/dpp/invite.cpp | 23 ++++++++++++++--------- src/unittest/test.cpp | 4 ++-- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/include/dpp/invite.h b/include/dpp/invite.h index e23592fae0..b04dd7b733 100644 --- a/include/dpp/invite.h +++ b/include/dpp/invite.h @@ -25,9 +25,21 @@ #include #include #include +#include +#include +#include namespace dpp { +/** + * @brief Invite target types for dpp::invite + */ +enum invite_target_t : uint8_t { + itt_none = 0, //!< Undefined invite target type + itt_stream = 1, //!< Stream target type + itt_embedded_application = 2, //!< Embedded Application target type +}; + /** * @brief Represents an invite to a discord guild or channel */ @@ -43,18 +55,28 @@ class DPP_EXPORT invite : public json_interface { /** Guild ID this invite is for */ snowflake guild_id; + /** The partial guild this invite is for. Only filled in retrieved invites + */ + guild destination_guild; /** Channel ID this invite is for */ snowflake channel_id; + /** The partial channel this invite is for. Only filled in retrieved invites + */ + channel destination_channel; /** User ID who created this invite + * @deprecated Use the `inviter` field instead */ snowflake inviter_id; + /** User who created this invite + */ + user inviter; /** The user ID whose stream to display for this voice channel stream invite */ snowflake target_user_id; - /** Target type + /** Target type for this voice channel invite */ - uint8_t target_type; + invite_target_t target_type; /** Approximate number of online users * @note Only returned from cluster::invite_get */ @@ -68,7 +90,7 @@ class DPP_EXPORT invite : public json_interface { uint32_t max_age; /** Maximum number of uses, or 0 for unlimited. Must be between 0 and 100. Defaults to 0 */ - uint32_t max_uses; + uint8_t max_uses; /** Whether this invite only grants temporary membership */ bool temporary; diff --git a/src/dpp/invite.cpp b/src/dpp/invite.cpp index 640bf42b8f..c3d26ba4f1 100644 --- a/src/dpp/invite.cpp +++ b/src/dpp/invite.cpp @@ -28,7 +28,7 @@ namespace dpp { using json = nlohmann::json; -invite::invite() : expires_at(0), guild_id(0), channel_id(0), inviter_id(0), target_user_id(0), target_type(0), approximate_presence_count(0), approximate_member_count(0), max_age(86400), max_uses(0), temporary(false), unique(false), uses(0), created_at(0) +invite::invite() : expires_at(0), guild_id(0), channel_id(0), inviter_id(0), target_user_id(0), target_type(itt_none), approximate_presence_count(0), approximate_member_count(0), max_age(86400), max_uses(0), temporary(false), unique(false), uses(0), created_at(0) { } @@ -37,22 +37,27 @@ invite& invite::fill_from_json(nlohmann::json* j) { expires_at = (j->contains("expires_at")) ? ts_not_null(j, "expires_at") : 0; created_at = (j->contains("created_at")) ? ts_not_null(j, "created_at") : 0; if (j->contains("guild") && !j->at("guild").is_null()) { - guild_id = snowflake_not_null(&((*j)["guild"]), "id"); - } else if (j->contains("guild_id")) { // check ID for the invite create event + destination_guild = dpp::guild().fill_from_json(&((*j)["guild"])); + guild_id = destination_guild.id; + } else if (j->contains("guild_id")) { // check ID for invite gateway events guild_id = snowflake_not_null(j, "guild_id"); } if (j->contains("channel") && !j->at("channel").is_null()) { - channel_id = snowflake_not_null(&((*j)["channel"]), "id"); - } else if (j->contains("channel_id")) { // check ID for the invite create event + destination_channel = dpp::channel().fill_from_json(&((*j)["channel"])); + channel_id = destination_channel.id; + } else if (j->contains("channel_id")) { // check ID for invite gateway events channel_id = snowflake_not_null(j, "channel_id"); } - inviter_id = (j->contains("inviter")) ? snowflake_not_null(&((*j)["inviter"]), "id") : 0; + if (j->contains("inviter") && !j->at("inviter").is_null()) { + inviter = dpp::user().fill_from_json(&((*j)["inviter"])); + inviter_id = inviter.id; + } target_user_id = (j->contains("target_user")) ? snowflake_not_null(&((*j)["target_user"]), "id") : 0; - target_type = int8_not_null(j, "target_type"); + target_type = static_cast(int8_not_null(j, "target_type")); approximate_presence_count = int32_not_null(j, "approximate_presence_count"); approximate_member_count = int32_not_null(j, "approximate_member_count"); max_age = int32_not_null(j, "max_age"); - max_uses = int32_not_null(j, "max_uses"); + max_uses = int8_not_null(j, "max_uses"); temporary = bool_not_null(j, "temporary"); unique = bool_not_null(j, "unique"); uses = (j->contains("uses")) ? int32_not_null(j, "uses") : 0; @@ -68,7 +73,7 @@ std::string invite::build_json(bool with_id) const { j["max_uses"] = max_uses; if (target_user_id > 0) j["target_user"] = target_user_id; - if (target_type > 0) + if (target_type != itt_none) j["target_type"] = target_type; if (temporary) j["temporary"] = temporary; diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 246cfbbace..1b93e059eb 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -991,7 +991,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b if (event.is_error()) return; auto created = event.get(); - if (!created.code.empty() && created.channel_id == TEST_TEXT_CHANNEL_ID && created.guild_id == TEST_GUILD_ID && created.inviter_id != 0) { + if (!created.code.empty() && created.channel_id == TEST_TEXT_CHANNEL_ID && created.guild_id == TEST_GUILD_ID && created.inviter.id == bot.me.id) { set_test("INVITE_CREATE", true); } @@ -999,7 +999,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b if (event.is_error()) return; auto retrieved = event.get(); - if (retrieved.code == created.code && retrieved.expires_at == 0 && retrieved.guild_id == created.guild_id && retrieved.channel_id == created.channel_id && retrieved.inviter_id == created.inviter_id) { + if (retrieved.code == created.code && retrieved.expires_at == 0 && retrieved.guild_id == created.guild_id && retrieved.channel_id == created.channel_id && retrieved.inviter.id == created.inviter.id) { set_test("INVITE_GET", true); } From e19b019802ac27b1bb2836739ceb12eb82369f9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 00:57:53 +0100 Subject: [PATCH 061/101] build(deps): bump doxygen-awesome-css from `245c7c9` to `1141ff5` (#704) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- doxygen-awesome-css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doxygen-awesome-css b/doxygen-awesome-css index 245c7c94c2..1141ff5fb6 160000 --- a/doxygen-awesome-css +++ b/doxygen-awesome-css @@ -1 +1 @@ -Subproject commit 245c7c94c20eac22730ef89035967f78b77bf405 +Subproject commit 1141ff5fb6888f8536088cfe6dc5a7834094bad7 From 6564867f2e7b353d8cd18c85a4bf8fca45b148f1 Mon Sep 17 00:00:00 2001 From: Phil Date: Thu, 1 Jun 2023 02:00:03 +0200 Subject: [PATCH 062/101] fix: interaction_modal_response::fill_from_json (#703) --- include/dpp/appcommand.h | 2 +- include/dpp/message.h | 26 ++++++++-------- src/dpp/message.cpp | 64 ++++++++++++++++++++++------------------ src/dpp/slashcommand.cpp | 12 +++++--- 4 files changed, 57 insertions(+), 47 deletions(-) diff --git a/include/dpp/appcommand.h b/include/dpp/appcommand.h index 22ecf2d257..1177edf1be 100644 --- a/include/dpp/appcommand.h +++ b/include/dpp/appcommand.h @@ -395,7 +395,7 @@ struct DPP_EXPORT interaction_modal_response : public interaction_response, publ std::string custom_id; /** - * @brief Title of the modal form box + * @brief Title of the modal form box (max 25 characters) */ std::string title; diff --git a/include/dpp/message.h b/include/dpp/message.h index e95f96c30a..a12cb52a27 100644 --- a/include/dpp/message.h +++ b/include/dpp/message.h @@ -85,15 +85,15 @@ enum component_style : uint8_t { */ struct DPP_EXPORT select_option : public json_interface { /** - * @brief Label for option + * @brief User-facing name of the option */ std::string label; /** - * @brief Value for option + * @brief Dev-defined value of the option */ std::string value; /** - * @brief Description of option + * @brief Additional description of the option */ std::string description; /** @@ -256,12 +256,12 @@ class DPP_EXPORT component : public json_interface { */ std::string placeholder; - /** Minimum number of items that must be chosen for a select menu. + /** Minimum number of items that must be chosen for a select menu (0-25). * Default is -1 to not set this */ int32_t min_values; - /** Maximum number of items that can be chosen for a select menu. + /** Maximum number of items that can be chosen for a select menu (0-25). * Default is -1 to not set this */ int32_t max_values; @@ -441,33 +441,33 @@ class DPP_EXPORT component : public json_interface { component& set_placeholder(const std::string &placeholder); /** - * @brief Set the min value + * @brief Set the minimum number of items that must be chosen for a select menu * - * @param min_values min value to set + * @param min_values min value to set (0-25) * @return component& Reference to self */ component& set_min_values(uint32_t min_values); /** - * @brief Set the max value + * @brief Set the maximum number of items that can be chosen for a select menu * - * @param max_values max value to set (0 - 25) + * @param max_values max value to set (0-25) * @return component& Reference to self */ component& set_max_values(uint32_t max_values); /** - * @brief Set the min length of text input + * @brief Set the minimum input length for a text input * - * @param min_l min value to set (0 - 25) + * @param min_l min length to set (0-4000) * @return component& Reference to self */ component& set_min_length(uint32_t min_l); /** - * @brief Set the max length of text input + * @brief Set the maximum input length for a text input * - * @param max_l max value to set + * @param max_l max length to set (1-4000) * @return component& Reference to self */ component& set_max_length(uint32_t max_l); diff --git a/src/dpp/message.cpp b/src/dpp/message.cpp index d328256116..eb776c8a65 100644 --- a/src/dpp/message.cpp +++ b/src/dpp/message.cpp @@ -47,35 +47,53 @@ component::component() : component& component::fill_from_json(nlohmann::json* j) { type = static_cast(int8_not_null(j, "type")); + label = string_not_null(j, "label"); + custom_id = string_not_null(j, "custom_id"); + disabled = bool_not_null(j, "disabled"); + placeholder = string_not_null(j, "placeholder"); + if (j->contains("min_values") && j->at("min_values").is_number_integer()) { + min_values = j->at("min_values").get(); + } + if (j->contains("max_values") && j->at("max_values").is_number_integer()) { + max_values = j->at("max_values").get(); + } if (type == cot_action_row) { for (json sub_component : (*j)["components"]) { dpp::component new_component; new_component.fill_from_json(&sub_component); components.emplace_back(new_component); } - } else if (type == cot_button) { - label = string_not_null(j, "label"); + } else if (type == cot_button) { // button specific fields style = static_cast(int8_not_null(j, "style")); - custom_id = string_not_null(j, "custom_id"); - disabled = bool_not_null(j, "disabled"); + url = string_not_null(j, "url"); if (j->contains("emoji")) { json emo = (*j)["emoji"]; emoji.id = snowflake_not_null(&emo, "id"); emoji.name = string_not_null(&emo, "name"); emoji.animated = bool_not_null(&emo, "animated"); } - } else if (type == cot_selectmenu) { - label = ""; - custom_id = string_not_null(j, "custom_id"); - disabled = bool_not_null(j, "disabled"); + } else if (type == cot_selectmenu) { // string select menu specific fields if (j->contains("options")) { - for(json opt : (*j)["options"]) { + for (json opt : (*j)["options"]) { options.push_back(dpp::select_option().fill_from_json(&opt)); } } - } else if (type == cot_text) { - custom_id = string_not_null(j, "custom_id"); - type = (component_type)int8_not_null(j, "type"); + } else if (type == cot_channel_selectmenu) { // channel select menu specific fields + if (j->contains("channel_types")) { + for (json &ct : (*j)["channel_types"]) { + if (ct.is_number_integer()) { + channel_types.push_back(ct.get()); + } + } + } + } else if (type == cot_text) { // text inputs (modal) specific fields + text_style = static_cast(int8_not_null(j, "style")); + if (j->contains("min_length") && j->at("min_length").is_number_integer()) { + min_length = j->at("min_length").get(); + } + if (j->contains("max_length") && j->at("max_length").is_number_integer()) { + max_length = j->at("max_length").get(); + } required = bool_not_null(j, "required"); json v = (*j)["value"]; if (!v.is_null() && v.is_number_integer()) { @@ -85,19 +103,6 @@ component& component::fill_from_json(nlohmann::json* j) { } else if (!v.is_null() && v.is_string()) { value = v.get(); } - } else if (type == cot_user_selectmenu || type == cot_role_selectmenu || type == cot_mentionable_selectmenu) { - custom_id = string_not_null(j, "custom_id"); - disabled = bool_not_null(j, "disabled"); - } else if (type == cot_channel_selectmenu) { - custom_id = string_not_null(j, "custom_id"); - disabled = bool_not_null(j, "disabled"); - if (j->contains("channel_types")) { - for (json &ct : (*j)["channel_types"]) { - if (ct.is_number_integer()) { - channel_types.push_back(ct.get()); - } - } - } } return *this; } @@ -219,13 +224,13 @@ component& component::set_emoji(const std::string& name, dpp::snowflake id, bool component& component::set_min_length(uint32_t min_l) { - min_length = min_l; + min_length = static_cast(min_l); return *this; } component& component::set_max_length(uint32_t max_l) { - max_length = max_l; + max_length = static_cast(max_l); return *this; } @@ -409,6 +414,7 @@ select_option& select_option::fill_from_json(nlohmann::json* j) { emoji.name = string_not_null(&emoj, "name"); emoji.id = snowflake_not_null(&emoj, "id"); } + is_default = bool_not_null(j, "default"); return *this; } @@ -424,12 +430,12 @@ component& component::set_placeholder(const std::string &_placeholder) { } component& component::set_min_values(uint32_t _min_values) { - min_values = _min_values; + min_values = static_cast(_min_values); return *this; } component& component::set_max_values(uint32_t _max_values) { - max_values = _max_values; + max_values = static_cast(_max_values); return *this; } diff --git a/src/dpp/slashcommand.cpp b/src/dpp/slashcommand.cpp index 79b9c7b7d4..27a97904fd 100644 --- a/src/dpp/slashcommand.cpp +++ b/src/dpp/slashcommand.cpp @@ -764,13 +764,17 @@ interaction_response& interaction_response::fill_from_json(nlohmann::json* j) { } interaction_modal_response& interaction_modal_response::fill_from_json(nlohmann::json* j) { - json& d = (*j)["data"]; type = (interaction_response_type)int8_not_null(j, "type"); + json& d = (*j)["data"]; custom_id = string_not_null(&d, "custom_id"); - title = string_not_null(&d, "custom_id"); - if (d.find("components") != d.end()) { + title = string_not_null(&d, "title"); + if (d.contains("components")) { + components.clear(); for (auto& c : d["components"]) { - components[current_row].push_back(dpp::component().fill_from_json(&c)); + auto row = dpp::component().fill_from_json(&c); + if (!row.components.empty()) { + components.push_back(row.components); + } } } return *this; From 472f5231ef0d6394b400b36f62b5f612e583931b Mon Sep 17 00:00:00 2001 From: Nathan Jager <84308084+NaJager@users.noreply.github.com> Date: Sat, 10 Jun 2023 10:06:41 +0200 Subject: [PATCH 063/101] feat: Added global_name to dpp::user (#712) --- include/dpp/user.h | 5 ++++- src/dpp/user.cpp | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/dpp/user.h b/include/dpp/user.h index dabad9dee6..0f84ac4c35 100644 --- a/include/dpp/user.h +++ b/include/dpp/user.h @@ -89,13 +89,16 @@ class DPP_EXPORT user : public managed, public json_interface { public: /** Discord username */ std::string username; + /** Global display name */ + std::string global_name; /** Avatar hash */ utility::iconhash avatar; /** Flags built from a bitmask of values in dpp::user_flags */ uint32_t flags; /** Discriminator (aka tag), 4 digits usually displayed with leading zeroes. * - * @note To print the discriminator with leading zeroes, use format_username() + * @note To print the discriminator with leading zeroes, use format_username(). + * 0 for users that have migrated to the new username format. */ uint16_t discriminator; /** Reference count of how many guilds this user is in */ diff --git a/src/dpp/user.cpp b/src/dpp/user.cpp index 654cd4eb25..aa32488c4e 100644 --- a/src/dpp/user.cpp +++ b/src/dpp/user.cpp @@ -67,6 +67,7 @@ std::string user::build_json(bool with_id) const { j["id"] = id; j["username"] = username; + j["global_name"] = global_name; j["avatar"] = avatar.to_string(); j["discriminator"] = discriminator; j["bot"] = is_bot(); @@ -265,6 +266,7 @@ void from_json(const nlohmann::json& j, user_identified& u) { void from_json(const nlohmann::json& j, user& u) { u.id = snowflake_not_null(&j, "id"); u.username = string_not_null(&j, "username"); + u.global_name = string_not_null(&j, "global_name"); std::string av = string_not_null(&j, "avatar"); if (av.length() > 2 && av.substr(0, 2) == "a_") { From 3dbe984d4839231aceec55f8e529e4a9ec4cf7f8 Mon Sep 17 00:00:00 2001 From: Phil Date: Sat, 10 Jun 2023 10:08:24 +0200 Subject: [PATCH 064/101] docs: updated README.md (#707) --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 310759d0d5..934a458739 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,9 @@ [![Codacy Badge](https://app.codacy.com/project/badge/Grade/39b054c38bba411d9b25b39524016c9e)](https://www.codacy.com/gh/brainboxdotcc/DPP/dashboard?utm_source=github.com&utm_medium=referral&utm_content=brainboxdotcc/DPP&utm_campaign=Badge_Grade) ![Lines of code](https://img.shields.io/tokei/lines/github/brainboxdotcc/DPP) [![D++ CI](https://github.com/brainboxdotcc/DPP/actions/workflows/ci.yml/badge.svg)](https://github.com/brainboxdotcc/DPP/actions/workflows/ci.yml) -[![AUR version](https://img.shields.io/aur/version/dpp)](https://aur.archlinux.org/packages/dpp) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) +[![AUR version](https://img.shields.io/aur/version/dpp)](https://aur.archlinux.org/packages/dpp) +![vcpkg version](https://img.shields.io/vcpkg/v/dpp) +[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) @@ -88,6 +90,20 @@ For running your bot on a **Raspberry Pi**, we offer a prebuilt .deb package for ### Other OS The library should work fine on other operating systems as well, and if you run a D++ bot on something not listed here, please let us know! +## Getting Started + +### Installation + +D++ can be easily installed using various package managers. Please refer [to our documentation](https://dpp.dev/md_docpages_01_installing.html) for installation tutorials based on your preferred package manager. + +### Building from Source + +If you prefer to build the library from source, detailed instructions are available [here](https://dpp.dev/install-from-source.html). + +### FAQ + +For frequently asked questions and their answers, please visit our [FAQ page](https://dpp.dev/md_docpages_01_frequently_asked_questions.html). + ## 🤝 Contributing Contributions, issues and feature requests are welcome. After cloning and setting up project locally, you can just submit From 480a5f0f5a489812d925dea3bd1d7f5dbb6327bb Mon Sep 17 00:00:00 2001 From: Miuna <809711+Mishura4@users.noreply.github.com> Date: Sat, 10 Jun 2023 04:11:00 -0400 Subject: [PATCH 065/101] fix: allowed sync/coro function generator to handle overloaded functions, update sync/coro methods (#705) --- .../classes/Generator/CoroGenerator.php | 4 +- .../classes/Generator/SyncGenerator.php | 6 +- .../classes/StructGeneratorInterface.php | 4 +- buildtools/make_struct.php | 32 +- include/dpp/cluster_coro_calls.h | 411 ++++++++++++++++-- include/dpp/cluster_sync_calls.h | 303 ++++++++++++- src/dpp/cluster_sync_calls.cpp | 402 ++++++++++------- 7 files changed, 943 insertions(+), 219 deletions(-) diff --git a/buildtools/classes/Generator/CoroGenerator.php b/buildtools/classes/Generator/CoroGenerator.php index fd89ee1608..e3ce67bb8a 100644 --- a/buildtools/classes/Generator/CoroGenerator.php +++ b/buildtools/classes/Generator/CoroGenerator.php @@ -86,7 +86,7 @@ public function checkForChanges(): bool /** * @inheritDoc */ - public function generateHeaderDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterNames): string + public function generateHeaderDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterTypes, string $parameterNames): string { $parameterNames = preg_replace('/^, /', '', $parameterNames); if (!empty($parameterNames)) { @@ -98,7 +98,7 @@ public function generateHeaderDef(string $returnType, string $currentFunction, s /** * @inheritDoc */ - public function generateCppDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterNames): string + public function generateCppDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterTypes, string $parameterNames): string { return ''; } diff --git a/buildtools/classes/Generator/SyncGenerator.php b/buildtools/classes/Generator/SyncGenerator.php index 9e6513ff97..e666feffdd 100644 --- a/buildtools/classes/Generator/SyncGenerator.php +++ b/buildtools/classes/Generator/SyncGenerator.php @@ -86,7 +86,7 @@ public function checkForChanges(): bool /** * @inheritDoc */ - public function generateHeaderDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterNames): string + public function generateHeaderDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterTypes, string $parameterNames): string { return "$returnType {$currentFunction}_sync($parameters);\n\n"; } @@ -94,9 +94,9 @@ public function generateHeaderDef(string $returnType, string $currentFunction, s /** * @inheritDoc */ - public function generateCppDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterNames): string + public function generateCppDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterTypes, string $parameterNames): string { - return "$returnType cluster::{$currentFunction}_sync($noDefaults) {\n\treturn dpp::sync<$returnType>(this, &cluster::$currentFunction$parameterNames);\n}\n\n"; + return "$returnType cluster::{$currentFunction}_sync($noDefaults) {\n\treturn dpp::sync<$returnType>(this, static_cast(&cluster::$currentFunction)$parameterNames);\n}\n\n"; } /** diff --git a/buildtools/classes/StructGeneratorInterface.php b/buildtools/classes/StructGeneratorInterface.php index 65c044484f..5f5ba72979 100644 --- a/buildtools/classes/StructGeneratorInterface.php +++ b/buildtools/classes/StructGeneratorInterface.php @@ -38,7 +38,7 @@ public function checkForchanges(): bool; * @param string $parameterNames Parameter names only * @return string header content to append */ - public function generateHeaderDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterNames): string; + public function generateHeaderDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterTypes, string $parameterNames): string; /** * Generate cpp definition for a function @@ -50,7 +50,7 @@ public function generateHeaderDef(string $returnType, string $currentFunction, s * @param string $parameterNames Parameter names only * @return string cpp content to append */ - public function generateCppDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterNames): string; + public function generateCppDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterTypes, string $parameterNames): string; /** * Return comment lines to add to each header definition diff --git a/buildtools/make_struct.php b/buildtools/make_struct.php index 78c0fce48e..3f43a1e105 100644 --- a/buildtools/make_struct.php +++ b/buildtools/make_struct.php @@ -20,16 +20,6 @@ /* These methods have signatures incompatible with this script */ $blacklist = [ - 'channel_edit_permissions', - 'message_add_reaction', - 'message_delete_reaction', - 'message_delete_reaction_emoji', - 'message_delete_all_reactions', - 'message_delete_own_reaction', - 'message_get_reactions', - 'channel_typing', - 'application_role_connection_get', // TODO: rest_request_vector - 'application_role_connection_update', ]; /* The script cannot determine the correct return type of these methods, @@ -41,9 +31,19 @@ 'guild_search_members' => 'guild_member_map', 'message_create' => 'message', 'message_edit' => 'message', + 'message_add_reaction' => 'confirmation', + 'message_delete_reaction' => 'confirmation', + 'message_delete_reaction_emoji' => 'confirmation', + 'message_delete_all_reactions' => 'confirmation', + 'message_delete_own_reaction' => 'confirmation', + 'channel_edit_permissions' => 'confirmation', + 'channel_typing' => 'confirmation', + 'message_get_reactions' => 'emoji_map', 'thread_create_in_forum' => 'thread', 'threads_get_active' => 'active_threads', 'user_get_cached' => 'user_identified', + 'application_role_connection_get' => 'application_role_connection', + 'application_role_connection_update' => 'application_role_connection' ]; /* Get the contents of cluster.h into an array */ @@ -101,22 +101,26 @@ if (!in_array($currentFunction, $blacklist)) { $parameterList = explode(',', $parameters); $parameterNames = []; + $parameterTypes = []; foreach ($parameterList as $parameter) { $parts = explode(' ', trim($parameter)); - $parameterNames[] = trim(preg_replace('/[\s\*\&]+/', '', $parts[count($parts) - 1])); + $name = trim(preg_replace('/[\s\*\&]+/', '', $parts[count($parts) - 1])); + $parameterNames[] = $name; + $parameterTypes[] = trim(substr($parameter, 0, strlen($parameter) - strlen($name))); } $content .= getComments($generator, $currentFunction, $returnType, $parameterNames) . "\n"; $fullParameters = getFullParameters($currentFunction, $parameterNames); $parameterNames = trim(join(', ', $parameterNames)); + $parameterTypes = trim(join(', ', $parameterTypes)); if (!empty($parameterNames)) { $parameterNames = ', ' . $parameterNames; } $noDefaults = $parameters; $parameters = !empty($fullParameters) ? $fullParameters : $parameters; - $content .= $generator->generateHeaderDef($returnType, $currentFunction, $parameters, $noDefaults, $parameterNames); - $cppcontent .= $generator->generateCppDef($returnType, $currentFunction, $parameters, $noDefaults, $parameterNames); + $content .= $generator->generateHeaderDef($returnType, $currentFunction, $parameters, $noDefaults, $parameterTypes, $parameterNames); + $cppcontent .= $generator->generateCppDef($returnType, $currentFunction, $parameters, $noDefaults, $parameterTypes, $parameterNames); } - $lastFunc = $currentFunction; + $lastFunc = $currentFunction; $currentFunction = $parameters = $returnType = ''; $state = STATE_SEARCH_FOR_FUNCTION; } diff --git a/include/dpp/cluster_coro_calls.h b/include/dpp/cluster_coro_calls.h index cf5b959493..64d5d2fac3 100644 --- a/include/dpp/cluster_coro_calls.h +++ b/include/dpp/cluster_coro_calls.h @@ -285,7 +285,9 @@ auto inline co_interaction_response_edit(const std::string &token, const message /** * @brief Create a followup message to a slash command - * + * + * @see dpp::cluster::interaction_followup_create + * @see https://discord.com/developers/docs/interactions/receiving-and-responding#create-interaction-response * @param token Token for the interaction webhook * @param m followup message to create * @return confirmation returned object on completion @@ -311,8 +313,10 @@ auto inline co_interaction_followup_edit_original(const std::string &token, cons } /** - * @brief - * + * @brief Delete the initial interaction response + * + * @see dpp::cluster::interaction_followup_delete + * @see https://discord.com/developers/docs/interactions/receiving-and-responding#delete-original-interaction-response * @param token Token for the interaction webhook * @return confirmation returned object on completion * \memberof dpp::cluster @@ -324,6 +328,9 @@ auto inline co_interaction_followup_delete(const std::string &token) { /** * @brief Edit followup message to a slash command * The message ID in the message you pass should be correctly set to that of a followup message you previously sent + * + * @see dpp::cluster::interaction_followup_edit + * @see https://discord.com/developers/docs/interactions/receiving-and-responding#edit-followup-message * @param token Token for the interaction webhook * @param m message to edit, the ID should be set * @return confirmation returned object on completion @@ -335,6 +342,9 @@ auto inline co_interaction_followup_edit(const std::string &token, const message /** * @brief Get the followup message to a slash command + * + * @see dpp::cluster::interaction_followup_get + * @see https://discord.com/developers/docs/interactions/receiving-and-responding#get-followup-message * @param token Token for the interaction webhook * @param message_id message to retrieve * @return message returned object on completion @@ -450,6 +460,42 @@ auto inline co_channel_delete(snowflake channel_id) { return dpp::awaitable(this, [&] (auto cc) { this->channel_delete(channel_id, cc); }); } +/** + * @brief Edit a channel's permissions + * + * @see dpp::cluster::channel_edit_permissions + * @see https://discord.com/developers/docs/resources/channel#edit-channel-permissions + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * @param c Channel to set permissions for + * @param overwrite_id Overwrite to change (a user or role ID) + * @param allow allow permissions bitmask + * @param deny deny permissions bitmask + * @param member true if the overwrite_id is a user id, false if it is a channel id + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_channel_edit_permissions(const class channel &c, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member) { + return dpp::awaitable(this, [&] (auto cc) { this->channel_edit_permissions(c, overwrite_id, allow, deny, member, cc); }); +} + +/** + * @brief Edit a channel's permissions + * + * @see dpp::cluster::channel_edit_permissions + * @see https://discord.com/developers/docs/resources/channel#edit-channel-permissions + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * @param channel_id ID of the channel to set permissions for + * @param overwrite_id Overwrite to change (a user or role ID) + * @param allow allow permissions bitmask + * @param deny deny permissions bitmask + * @param member true if the overwrite_id is a user id, false if it is a channel id + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_channel_edit_permissions(const snowflake channel_id, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member) { + return dpp::awaitable(this, [&] (auto cc) { this->channel_edit_permissions(channel_id, overwrite_id, allow, deny, member, cc); }); +} + /** * @brief Edit multiple channels positions * @@ -513,7 +559,7 @@ auto inline co_channel_get(snowflake c) { * @see https://discord.com/developers/docs/resources/channel#create-channel-invite * @param c Channel to create an invite on * @param i Invite to create - * @return confirmation returned object on completion + * @return invite returned object on completion * \memberof dpp::cluster */ auto inline co_channel_invite_create(const class channel &c, const class invite &i) { @@ -533,6 +579,30 @@ auto inline co_channel_invites_get(const class channel &c) { return dpp::awaitable(this, [&] (auto cc) { this->channel_invites_get(c, cc); }); } +/** + * @brief Trigger channel typing indicator + * @see dpp::cluster::channel_typing + * @see https://discord.com/developers/docs/resources/channel#trigger-typing-indicator + * @param c Channel to set as typing on + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_channel_typing(const class channel &c) { + return dpp::awaitable(this, [&] (auto cc) { this->channel_typing(c, cc); }); +} + +/** + * @brief Trigger channel typing indicator + * @see dpp::cluster::channel_typing + * @see https://discord.com/developers/docs/resources/channel#trigger-typing-indicator + * @param cid Channel ID to set as typing on + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_channel_typing(snowflake cid) { + return dpp::awaitable(this, [&] (auto cc) { this->channel_typing(cid, cc); }); +} + /** * @brief Get all channels for a guild * @@ -648,7 +718,7 @@ auto inline co_guild_emoji_delete(snowflake guild_id, snowflake emoji_id) { * * You must ensure that the emoji passed contained image data using the emoji::load_image() method. * @see dpp::cluster::guild_emoji_edit - * @see https://discord.com/developers/docs/resources/emoji#get-guild-emoji + * @see https://discord.com/developers/docs/resources/emoji#modify-guild-emoji * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. * @param guild_id Guild ID to edit emoji on * @param newemoji Emoji to edit @@ -677,7 +747,7 @@ auto inline co_guild_emoji_get(snowflake guild_id, snowflake emoji_id) { * @brief Get all emojis for a guild * * @see dpp::cluster::guild_emojis_get - * @see https://discord.com/developers/docs/resources/emoji#get-guild-emojis + * @see https://discord.com/developers/docs/resources/emoji#list-guild-emojis * @param guild_id Guild ID to get emojis for * @return emoji_map returned object on completion * \memberof dpp::cluster @@ -723,8 +793,8 @@ auto inline co_guild_current_member_edit(snowflake guild_id, const std::string & * @param guild_id Guild to get the audit log of * @param user_id Entries from a specific user ID. Set this to `0` will fetch any user * @param action_type Entries for a specific dpp::audit_type. Set this to `0` will fetch any type - * @param before Entries that preceded a specific audit log entry ID. Used for paginating - * @param after Entries that succeeded a specific audit log entry ID. Used for paginating + * @param before Entries with ID less than a specific audit log entry ID. Used for paginating + * @param after Entries with ID greater than a specific audit log entry ID. Used for paginating * @param limit Maximum number of entries (between 1-100) to return * @return auditlog returned object on completion * \memberof dpp::cluster @@ -907,6 +977,8 @@ auto inline co_guild_get(snowflake guild_id) { * @see https://discord.com/developers/docs/resources/guild#get-guild-integrations * @param guild_id Guild ID to get integrations for * @return integration_map returned object on completion + * + * @note This endpoint returns a maximum of 50 integrations. If a guild has more integrations, they cannot be accessed. * \memberof dpp::cluster */ auto inline co_guild_get_integrations(snowflake guild_id) { @@ -1266,9 +1338,46 @@ auto inline co_invite_delete(const std::string &invitecode) { return dpp::awaitable(this, [&] (auto cc) { this->invite_delete(invitecode, cc); }); } +/** + * @brief Get details about an invite + * + * @see dpp::cluster::invite_get + * @see https://discord.com/developers/docs/resources/invite#get-invite + * @param invite_code Invite code to get information on + * @return invite returned object on completion + * \memberof dpp::cluster + */ +auto inline co_invite_get(const std::string &invite_code) { + return dpp::awaitable(this, [&] (auto cc) { this->invite_get(invite_code, cc); }); +} + +/** + * @brief Add a reaction to a message. The reaction string must be either an `emojiname:id` or a unicode character. + * + * @see dpp::cluster::message_add_reaction + * @see https://discord.com/developers/docs/resources/channel#create-reaction + * @param m Message to add a reaction to + * @param reaction Reaction to add. Emojis should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_add_reaction(const struct message &m, const std::string &reaction) { + return dpp::awaitable(this, [&] (auto cc) { this->message_add_reaction(m, reaction, cc); }); +} -auto inline co_invite_get(const std::string &invitecode) { - return dpp::awaitable(this, [&] (auto cc) { this->invite_get(invitecode, cc); }); +/** + * @brief Add a reaction to a message by id. The reaction string must be either an `emojiname:id` or a unicode character. + * + * @see dpp::cluster::message_add_reaction + * @see https://discord.com/developers/docs/topics/gateway#message-reaction-add + * @param message_id Message to add reactions to + * @param channel_id Channel to add reactions to + * @param reaction Reaction to add. Emojis should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_add_reaction(snowflake message_id, snowflake channel_id, const std::string &reaction) { + return dpp::awaitable(this, [&] (auto cc) { this->message_add_reaction(message_id, channel_id, reaction, cc); }); } /** @@ -1298,6 +1407,33 @@ auto inline co_message_crosspost(snowflake message_id, snowflake channel_id) { return dpp::awaitable(this, [&] (auto cc) { this->message_crosspost(message_id, channel_id, cc); }); } +/** + * @brief Delete all reactions on a message + * + * @see dpp::cluster::message_delete_all_reactions + * @see https://discord.com/developers/docs/resources/channel#delete-all-reactions + * @param m Message to delete reactions from + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_delete_all_reactions(const struct message &m) { + return dpp::awaitable(this, [&] (auto cc) { this->message_delete_all_reactions(m, cc); }); +} + +/** + * @brief Delete all reactions on a message by id + * + * @see dpp::cluster::message_delete_all_reactions + * @see https://discord.com/developers/docs/resources/channel#delete-all-reactions + * @param message_id Message to delete reactions from + * @param channel_id Channel to delete reactions from + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_delete_all_reactions(snowflake message_id, snowflake channel_id) { + return dpp::awaitable(this, [&] (auto cc) { this->message_delete_all_reactions(message_id, channel_id, cc); }); +} + /** * @brief Bulk delete messages from a channel. The callback function is called when the message has been edited * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. @@ -1330,6 +1466,95 @@ auto inline co_message_delete(snowflake message_id, snowflake channel_id) { return dpp::awaitable(this, [&] (auto cc) { this->message_delete(message_id, channel_id, cc); }); } +/** + * @brief Delete own reaction from a message. The reaction string must be either an `emojiname:id` or a unicode character. + * + * @see dpp::cluster::message_delete_own_reaction + * @see https://discord.com/developers/docs/resources/channel#delete-own-reaction + * @param m Message to delete own reaction from + * @param reaction Reaction to delete. The reaction should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_delete_own_reaction(const struct message &m, const std::string &reaction) { + return dpp::awaitable(this, [&] (auto cc) { this->message_delete_own_reaction(m, reaction, cc); }); +} + +/** + * @brief Delete own reaction from a message by id. The reaction string must be either an `emojiname:id` or a unicode character. + * + * @see dpp::cluster::message_delete_own_reaction + * @see https://discord.com/developers/docs/resources/channel#delete-own-reaction + * @param message_id Message to delete reactions from + * @param channel_id Channel to delete reactions from + * @param reaction Reaction to delete. The reaction should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_delete_own_reaction(snowflake message_id, snowflake channel_id, const std::string &reaction) { + return dpp::awaitable(this, [&] (auto cc) { this->message_delete_own_reaction(message_id, channel_id, reaction, cc); }); +} + +/** + * @brief Delete a user's reaction from a message. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_delete_reaction + * @see https://discord.com/developers/docs/resources/channel#delete-user-reaction + * @param m Message to delete a user's reaction from + * @param user_id User ID who's reaction you want to remove + * @param reaction Reaction to remove. Reactions should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_delete_reaction(const struct message &m, snowflake user_id, const std::string &reaction) { + return dpp::awaitable(this, [&] (auto cc) { this->message_delete_reaction(m, user_id, reaction, cc); }); +} + +/** + * @brief Delete a user's reaction from a message by id. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_delete_reaction + * @see https://discord.com/developers/docs/resources/channel#delete-user-reaction + * @param message_id Message to delete reactions from + * @param channel_id Channel to delete reactions from + * @param user_id User ID who's reaction you want to remove + * @param reaction Reaction to remove. Reactions should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_delete_reaction(snowflake message_id, snowflake channel_id, snowflake user_id, const std::string &reaction) { + return dpp::awaitable(this, [&] (auto cc) { this->message_delete_reaction(message_id, channel_id, user_id, reaction, cc); }); +} + +/** + * @brief Delete all reactions on a message using a particular emoji. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_delete_reaction_emoji + * @see https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji + * @param m Message to delete reactions from + * @param reaction Reaction to delete, in the form emojiname:id or a unicode character + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_delete_reaction_emoji(const struct message &m, const std::string &reaction) { + return dpp::awaitable(this, [&] (auto cc) { this->message_delete_reaction_emoji(m, reaction, cc); }); +} + +/** + * @brief Delete all reactions on a message using a particular emoji by id. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_delete_reaction_emoji + * @see https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji + * @param message_id Message to delete reactions from + * @param channel_id Channel to delete reactions from + * @param reaction Reaction to delete, in the form emojiname:id or a unicode character + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_delete_reaction_emoji(snowflake message_id, snowflake channel_id, const std::string &reaction) { + return dpp::awaitable(this, [&] (auto cc) { this->message_delete_reaction_emoji(message_id, channel_id, reaction, cc); }); +} + /** * @brief Edit a message on a channel. The callback function is called when the message has been edited * @@ -1357,6 +1582,41 @@ auto inline co_message_get(snowflake message_id, snowflake channel_id) { return dpp::awaitable(this, [&] (auto cc) { this->message_get(message_id, channel_id, cc); }); } +/** + * @brief Get reactions on a message for a particular emoji. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_get_reactions + * @see https://discord.com/developers/docs/resources/channel#get-reactions + * @param m Message to get reactions for + * @param reaction Reaction should be in the form emojiname:id or a unicode character + * @param before Reactions before this ID should be retrieved if this is set to non-zero + * @param after Reactions before this ID should be retrieved if this is set to non-zero + * @param limit This number of reactions maximum should be returned + * @return user_map returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_get_reactions(const struct message &m, const std::string &reaction, snowflake before, snowflake after, snowflake limit) { + return dpp::awaitable(this, [&] (auto cc) { this->message_get_reactions(m, reaction, before, after, limit, cc); }); +} + +/** + * @brief Get reactions on a message for a particular emoji by id. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_get_reactions + * @see https://discord.com/developers/docs/resources/channel#get-reactions + * @param message_id Message to get reactions for + * @param channel_id Channel to get reactions for + * @param reaction Reaction should be in the form emojiname:id or a unicode character + * @param before Reactions before this ID should be retrieved if this is set to non-zero + * @param after Reactions before this ID should be retrieved if this is set to non-zero + * @param limit This number of reactions maximum should be returned + * @return emoji_map returned object on completion + * \memberof dpp::cluster + */ +auto inline co_message_get_reactions(snowflake message_id, snowflake channel_id, const std::string &reaction, snowflake before, snowflake after, snowflake limit) { + return dpp::awaitable(this, [&] (auto cc) { this->message_get_reactions(message_id, channel_id, reaction, before, after, limit, cc); }); +} + /** * @brief Pin a message * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. @@ -1497,6 +1757,61 @@ auto inline co_roles_get(snowflake guild_id) { return dpp::awaitable(this, [&] (auto cc) { this->roles_get(guild_id, cc); }); } +/** + * @brief Get the application's role connection metadata records + * + * @see dpp::cluster::application_role_connection_get + * @see https://discord.com/developers/docs/resources/application-role-connection-metadata#get-application-role-connection-metadata-records + * @param application_id The application ID + * @return application_role_connection returned object on completion + * \memberof dpp::cluster + */ +auto inline co_application_role_connection_get(snowflake application_id) { + return dpp::awaitable(this, [&] (auto cc) { this->application_role_connection_get(application_id, cc); }); +} + +/** + * @brief Update the application's role connection metadata records + * + * @see dpp::cluster::application_role_connection_update + * @see https://discord.com/developers/docs/resources/application-role-connection-metadata#update-application-role-connection-metadata-records + * @param application_id The application ID + * @param connection_metadata The application role connection metadata to update + * @return application_role_connection returned object on completion + * @note An application can have a maximum of 5 metadata records. + * \memberof dpp::cluster + */ +auto inline co_application_role_connection_update(snowflake application_id, const std::vector &connection_metadata) { + return dpp::awaitable(this, [&] (auto cc) { this->application_role_connection_update(application_id, connection_metadata, cc); }); +} + +/** + * @brief Get user application role connection + * + * @see dpp::cluster::user_application_role_connection_get + * @see https://discord.com/developers/docs/resources/user#get-user-application-role-connection + * @param application_id The application ID + * @return application_role_connection returned object on completion + * \memberof dpp::cluster + */ +auto inline co_user_application_role_connection_get(snowflake application_id) { + return dpp::awaitable(this, [&] (auto cc) { this->user_application_role_connection_get(application_id, cc); }); +} + +/** + * @brief Update user application role connection + * + * @see dpp::cluster::user_application_role_connection_update + * @see https://discord.com/developers/docs/resources/user#update-user-application-role-connection + * @param application_id The application ID + * @param connection The application role connection to update + * @return application_role_connection returned object on completion + * \memberof dpp::cluster + */ +auto inline co_user_application_role_connection_update(snowflake application_id, const application_role_connection &connection) { + return dpp::awaitable(this, [&] (auto cc) { this->user_application_role_connection_update(application_id, connection, cc); }); +} + /** * @brief Get all scheduled events for a guild * @see dpp::cluster::guild_events_get @@ -1787,7 +2102,7 @@ auto inline co_template_get(const std::string &code) { /** * @brief Join a thread * @see dpp::cluster::current_user_join_thread - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#join-thread * @param thread_id Thread ID to join * @return confirmation returned object on completion * \memberof dpp::cluster @@ -1799,7 +2114,7 @@ auto inline co_current_user_join_thread(snowflake thread_id) { /** * @brief Leave a thread * @see dpp::cluster::current_user_leave_thread - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#leave-thread * @param thread_id Thread ID to leave * @return confirmation returned object on completion * \memberof dpp::cluster @@ -1809,21 +2124,21 @@ auto inline co_current_user_leave_thread(snowflake thread_id) { } /** - * @brief Get active threads in a channel (Sorted by ID in descending order) + * @brief Get all active threads in the guild, including public and private threads. Threads are ordered by their id, in descending order. * @see dpp::cluster::threads_get_active - * @see https://discord.com/developers/docs/topics/threads - * @param channel_id Channel to get active threads for - * @return thread_map returned object on completion + * @see https://discord.com/developers/docs/resources/guild#list-active-guild-threads + * @param guild_id Guild to get active threads for + * @return active_threads returned object on completion * \memberof dpp::cluster */ -auto inline co_threads_get_active(snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->threads_get_active(channel_id, cc); }); +auto inline co_threads_get_active(snowflake guild_id) { + return dpp::awaitable(this, [&] (auto cc) { this->threads_get_active(guild_id, cc); }); } /** * @brief Get private archived threads in a channel which current user has joined (Sorted by ID in descending order) * @see dpp::cluster::threads_get_joined_private_archived - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#list-joined-private-archived-threads * @param channel_id Channel to get public archived threads for * @param before_id Get threads before this id * @param limit Number of threads to get @@ -1837,7 +2152,7 @@ auto inline co_threads_get_joined_private_archived(snowflake channel_id, snowfla /** * @brief Get private archived threads in a channel (Sorted by archive_timestamp in descending order) * @see dpp::cluster::threads_get_private_archived - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#list-private-archived-threads * @param channel_id Channel to get public archived threads for * @param before_timestamp Get threads before this timestamp * @param limit Number of threads to get @@ -1851,7 +2166,7 @@ auto inline co_threads_get_private_archived(snowflake channel_id, time_t before_ /** * @brief Get public archived threads in a channel (Sorted by archive_timestamp in descending order) * @see dpp::cluster::threads_get_public_archived - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#list-public-archived-threads * @param channel_id Channel to get public archived threads for * @param before_timestamp Get threads before this timestamp * @param limit Number of threads to get @@ -1865,7 +2180,7 @@ auto inline co_threads_get_public_archived(snowflake channel_id, time_t before_t /** * @brief Get a thread member * @see dpp::cluster::thread_member_get - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#get-thread-member * @param thread_id Thread to get member for * @param user_id ID of the user to get * @return thread_member returned object on completion @@ -1878,7 +2193,7 @@ auto inline co_thread_member_get(const snowflake thread_id, const snowflake user /** * @brief Get members of a thread * @see dpp::cluster::thread_members_get - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#list-thread-members * @param thread_id Thread to get members for * @return thread_member_map returned object on completion * \memberof dpp::cluster @@ -1887,12 +2202,31 @@ auto inline co_thread_members_get(snowflake thread_id) { return dpp::awaitable(this, [&] (auto cc) { this->thread_members_get(thread_id, cc); }); } +/** + * @brief Create a thread in forum channel + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * + * @see dpp::cluster::thread_create_in_forum + * @see https://discord.com/developers/docs/resources/channel#start-thread-in-forum-channel + * @param thread_name Name of the forum thread + * @param channel_id Forum channel in which thread to create + * @param msg The message to start the thread with + * @param auto_archive_duration Duration to automatically archive the thread after recent activity + * @param rate_limit_per_user amount of seconds a user has to wait before sending another message (0-21600); bots, as well as users with the permission manage_messages, manage_thread, or manage_channel, are unaffected + * @param applied_tags List of IDs of forum tags (dpp::forum_tag) to apply to this thread + * @return thread returned object on completion + * \memberof dpp::cluster + */ +auto inline co_thread_create_in_forum(const std::string& thread_name, snowflake channel_id, const message& msg, auto_archive_duration_t auto_archive_duration, uint16_t rate_limit_per_user, std::vector applied_tags) { + return dpp::awaitable(this, [&] (auto cc) { this->thread_create_in_forum(thread_name, channel_id, msg, auto_archive_duration, rate_limit_per_user, applied_tags, cc); }); +} + /** * @brief Create a thread * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. * * @see dpp::cluster::thread_create - * @see https://discord.com/developers/docs/resources/guild#create-guild-channel + * @see https://discord.com/developers/docs/resources/channel#start-thread-without-message * @param thread_name Name of the thread * @param channel_id Channel in which thread to create * @param auto_archive_duration Duration after which thread auto-archives. Can be set to - 60, 1440 (for boosted guilds can also be: 4320, 10080) @@ -1910,7 +2244,7 @@ auto inline co_thread_create(const std::string& thread_name, snowflake channel_i * @brief Create a thread with a message (Discord: ID of a thread is same as message ID) * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. * @see dpp::cluster::thread_create_with_message - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#start-thread-from-message * @param thread_name Name of the thread * @param channel_id Channel in which thread to create * @param message_id message to start thread with @@ -1926,7 +2260,7 @@ auto inline co_thread_create_with_message(const std::string& thread_name, snowfl /** * @brief Add a member to a thread * @see dpp::cluster::thread_member_add - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#add-thread-member * @param thread_id Thread ID to add to * @param user_id Member ID to add * @return confirmation returned object on completion @@ -1939,7 +2273,7 @@ auto inline co_thread_member_add(snowflake thread_id, snowflake user_id) { /** * @brief Remove a member from a thread * @see dpp::cluster::thread_member_remove - * @see https://discord.com/developers/docs/topics/threads + * @see https://discord.com/developers/docs/resources/channel#remove-thread-member * @param thread_id Thread ID to remove from * @param user_id Member ID to remove * @return confirmation returned object on completion @@ -1958,9 +2292,9 @@ auto inline co_thread_member_remove(snowflake thread_id, snowflake user_id) { * @see https://discord.com/developers/docs/resources/user#modify-current-user * @param nickname Nickname to set * @param image_blob Avatar data to upload (NOTE: Very heavily rate limited!) - * @param type Type of image for avatar + * @param type Type of image for avatar. It can be one of `i_gif`, `i_jpg` or `i_png`. * @return user returned object on completion - * @throw dpp::exception Image data is larger than the maximum size of 256 kilobytes + * @throw dpp::length_exception Image data is larger than the maximum size of 256 kilobytes * \memberof dpp::cluster */ auto inline co_current_user_edit(const std::string &nickname, const std::string& image_blob, const image_type type) { @@ -2083,7 +2417,7 @@ auto inline co_current_user_leave_guild(snowflake guild_id) { } /** - * @brief Get a user by id + * @brief Get a user by id, without using the cache * * @see dpp::cluster::user_get * @see https://discord.com/developers/docs/resources/user#get-user @@ -2099,6 +2433,23 @@ auto inline co_user_get(snowflake user_id) { return dpp::awaitable(this, [&] (auto cc) { this->user_get(user_id, cc); }); } +/** + * @brief Get a user by id, checking in the cache first + * + * @see dpp::cluster::user_get_cached + * @see https://discord.com/developers/docs/resources/user#get-user + * @param user_id User ID to retrieve + * @return user_identified returned object on completion + * @note The user_identified object is a subclass of dpp::user which contains further details if you have the oauth2 identify or email scopes. + * If you do not have these scopes, these fields are empty. You can safely convert a user_identified to user with `dynamic_cast`. + * @note If the user is found in the cache, special values set in `dpp::user_identified` will be undefined. This call should be used + * where you want to for example resolve a user who may no longer be in the bot's guilds, for something like a ban log message. + * \memberof dpp::cluster + */ +auto inline co_user_get_cached(snowflake user_id) { + return dpp::awaitable(this, [&] (auto cc) { this->user_get_cached(user_id, cc); }); +} + /** * @brief Get all voice regions * @see dpp::cluster::get_voice_regions diff --git a/include/dpp/cluster_sync_calls.h b/include/dpp/cluster_sync_calls.h index eff86aef2b..626b4b72f4 100644 --- a/include/dpp/cluster_sync_calls.h +++ b/include/dpp/cluster_sync_calls.h @@ -491,6 +491,44 @@ confirmation channel_delete_permission_sync(const class channel &c, snowflake ov */ confirmation channel_delete_sync(snowflake channel_id); +/** + * @brief Edit a channel's permissions + * + * @see dpp::cluster::channel_edit_permissions + * @see https://discord.com/developers/docs/resources/channel#edit-channel-permissions + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * @param c Channel to set permissions for + * @param overwrite_id Overwrite to change (a user or role ID) + * @param allow allow permissions bitmask + * @param deny deny permissions bitmask + * @param member true if the overwrite_id is a user id, false if it is a channel id + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation channel_edit_permissions_sync(const class channel &c, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member); + +/** + * @brief Edit a channel's permissions + * + * @see dpp::cluster::channel_edit_permissions + * @see https://discord.com/developers/docs/resources/channel#edit-channel-permissions + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * @param channel_id ID of the channel to set permissions for + * @param overwrite_id Overwrite to change (a user or role ID) + * @param allow allow permissions bitmask + * @param deny deny permissions bitmask + * @param member true if the overwrite_id is a user id, false if it is a channel id + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation channel_edit_permissions_sync(const snowflake channel_id, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member); + /** * @brief Edit multiple channels positions * @@ -558,13 +596,13 @@ channel channel_get_sync(snowflake c); * @see https://discord.com/developers/docs/resources/channel#create-channel-invite * @param c Channel to create an invite on * @param i Invite to create - * @return confirmation returned object on completion + * @return invite returned object on completion * \memberof dpp::cluster * @throw dpp::rest_exception upon failure to execute REST function * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. * Avoid direct use of this function inside an event handler. */ -confirmation channel_invite_create_sync(const class channel &c, const class invite &i); +invite channel_invite_create_sync(const class channel &c, const class invite &i); /** * @brief Get invites for a channel @@ -580,6 +618,32 @@ confirmation channel_invite_create_sync(const class channel &c, const class invi */ invite_map channel_invites_get_sync(const class channel &c); +/** + * @brief Trigger channel typing indicator + * @see dpp::cluster::channel_typing + * @see https://discord.com/developers/docs/resources/channel#trigger-typing-indicator + * @param c Channel to set as typing on + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation channel_typing_sync(const class channel &c); + +/** + * @brief Trigger channel typing indicator + * @see dpp::cluster::channel_typing + * @see https://discord.com/developers/docs/resources/channel#trigger-typing-indicator + * @param cid Channel ID to set as typing on + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation channel_typing_sync(snowflake cid); + /** * @brief Get all channels for a guild * @@ -1353,8 +1417,50 @@ invite_map guild_get_invites_sync(snowflake guild_id); invite invite_delete_sync(const std::string &invitecode); +/** + * @brief Get details about an invite + * + * @see dpp::cluster::invite_get + * @see https://discord.com/developers/docs/resources/invite#get-invite + * @param invite_code Invite code to get information on + * @return invite returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +invite invite_get_sync(const std::string &invite_code); + +/** + * @brief Add a reaction to a message. The reaction string must be either an `emojiname:id` or a unicode character. + * + * @see dpp::cluster::message_add_reaction + * @see https://discord.com/developers/docs/resources/channel#create-reaction + * @param m Message to add a reaction to + * @param reaction Reaction to add. Emojis should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_add_reaction_sync(const struct message &m, const std::string &reaction); -invite invite_get_sync(const std::string &invitecode); +/** + * @brief Add a reaction to a message by id. The reaction string must be either an `emojiname:id` or a unicode character. + * + * @see dpp::cluster::message_add_reaction + * @see https://discord.com/developers/docs/topics/gateway#message-reaction-add + * @param message_id Message to add reactions to + * @param channel_id Channel to add reactions to + * @param reaction Reaction to add. Emojis should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_add_reaction_sync(snowflake message_id, snowflake channel_id, const std::string &reaction); /** * @brief Send a message to a channel. The callback function is called when the message has been sent @@ -1385,6 +1491,35 @@ message message_create_sync(const struct message &m); */ message message_crosspost_sync(snowflake message_id, snowflake channel_id); +/** + * @brief Delete all reactions on a message + * + * @see dpp::cluster::message_delete_all_reactions + * @see https://discord.com/developers/docs/resources/channel#delete-all-reactions + * @param m Message to delete reactions from + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_delete_all_reactions_sync(const struct message &m); + +/** + * @brief Delete all reactions on a message by id + * + * @see dpp::cluster::message_delete_all_reactions + * @see https://discord.com/developers/docs/resources/channel#delete-all-reactions + * @param message_id Message to delete reactions from + * @param channel_id Channel to delete reactions from + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_delete_all_reactions_sync(snowflake message_id, snowflake channel_id); + /** * @brief Bulk delete messages from a channel. The callback function is called when the message has been edited * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. @@ -1419,6 +1554,101 @@ confirmation message_delete_bulk_sync(const std::vector &message_ids, */ confirmation message_delete_sync(snowflake message_id, snowflake channel_id); +/** + * @brief Delete own reaction from a message. The reaction string must be either an `emojiname:id` or a unicode character. + * + * @see dpp::cluster::message_delete_own_reaction + * @see https://discord.com/developers/docs/resources/channel#delete-own-reaction + * @param m Message to delete own reaction from + * @param reaction Reaction to delete. The reaction should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_delete_own_reaction_sync(const struct message &m, const std::string &reaction); + +/** + * @brief Delete own reaction from a message by id. The reaction string must be either an `emojiname:id` or a unicode character. + * + * @see dpp::cluster::message_delete_own_reaction + * @see https://discord.com/developers/docs/resources/channel#delete-own-reaction + * @param message_id Message to delete reactions from + * @param channel_id Channel to delete reactions from + * @param reaction Reaction to delete. The reaction should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_delete_own_reaction_sync(snowflake message_id, snowflake channel_id, const std::string &reaction); + +/** + * @brief Delete a user's reaction from a message. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_delete_reaction + * @see https://discord.com/developers/docs/resources/channel#delete-user-reaction + * @param m Message to delete a user's reaction from + * @param user_id User ID who's reaction you want to remove + * @param reaction Reaction to remove. Reactions should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_delete_reaction_sync(const struct message &m, snowflake user_id, const std::string &reaction); + +/** + * @brief Delete a user's reaction from a message by id. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_delete_reaction + * @see https://discord.com/developers/docs/resources/channel#delete-user-reaction + * @param message_id Message to delete reactions from + * @param channel_id Channel to delete reactions from + * @param user_id User ID who's reaction you want to remove + * @param reaction Reaction to remove. Reactions should be in the form emojiname:id + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_delete_reaction_sync(snowflake message_id, snowflake channel_id, snowflake user_id, const std::string &reaction); + +/** + * @brief Delete all reactions on a message using a particular emoji. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_delete_reaction_emoji + * @see https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji + * @param m Message to delete reactions from + * @param reaction Reaction to delete, in the form emojiname:id or a unicode character + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_delete_reaction_emoji_sync(const struct message &m, const std::string &reaction); + +/** + * @brief Delete all reactions on a message using a particular emoji by id. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_delete_reaction_emoji + * @see https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji + * @param message_id Message to delete reactions from + * @param channel_id Channel to delete reactions from + * @param reaction Reaction to delete, in the form emojiname:id or a unicode character + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation message_delete_reaction_emoji_sync(snowflake message_id, snowflake channel_id, const std::string &reaction); + /** * @brief Edit a message on a channel. The callback function is called when the message has been edited * @@ -1448,6 +1678,43 @@ message message_edit_sync(const struct message &m); */ message message_get_sync(snowflake message_id, snowflake channel_id); +/** + * @brief Get reactions on a message for a particular emoji. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_get_reactions + * @see https://discord.com/developers/docs/resources/channel#get-reactions + * @param m Message to get reactions for + * @param reaction Reaction should be in the form emojiname:id or a unicode character + * @param before Reactions before this ID should be retrieved if this is set to non-zero + * @param after Reactions before this ID should be retrieved if this is set to non-zero + * @param limit This number of reactions maximum should be returned + * @return user_map returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +user_map message_get_reactions_sync(const struct message &m, const std::string &reaction, snowflake before, snowflake after, snowflake limit); + +/** + * @brief Get reactions on a message for a particular emoji by id. The reaction string must be either an `emojiname:id` or a unicode character + * + * @see dpp::cluster::message_get_reactions + * @see https://discord.com/developers/docs/resources/channel#get-reactions + * @param message_id Message to get reactions for + * @param channel_id Channel to get reactions for + * @param reaction Reaction should be in the form emojiname:id or a unicode character + * @param before Reactions before this ID should be retrieved if this is set to non-zero + * @param after Reactions before this ID should be retrieved if this is set to non-zero + * @param limit This number of reactions maximum should be returned + * @return emoji_map returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +emoji_map message_get_reactions_sync(snowflake message_id, snowflake channel_id, const std::string &reaction, snowflake before, snowflake after, snowflake limit); + /** * @brief Pin a message * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. @@ -1597,6 +1864,36 @@ role_map roles_edit_position_sync(snowflake guild_id, const std::vector &r */ role_map roles_get_sync(snowflake guild_id); +/** + * @brief Get the application's role connection metadata records + * + * @see dpp::cluster::application_role_connection_get + * @see https://discord.com/developers/docs/resources/application-role-connection-metadata#get-application-role-connection-metadata-records + * @param application_id The application ID + * @return application_role_connection returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +application_role_connection application_role_connection_get_sync(snowflake application_id); + +/** + * @brief Update the application's role connection metadata records + * + * @see dpp::cluster::application_role_connection_update + * @see https://discord.com/developers/docs/resources/application-role-connection-metadata#update-application-role-connection-metadata-records + * @param application_id The application ID + * @param connection_metadata The application role connection metadata to update + * @return application_role_connection returned object on completion + * @note An application can have a maximum of 5 metadata records. + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +application_role_connection application_role_connection_update_sync(snowflake application_id, const std::vector &connection_metadata); + /** * @brief Get user application role connection * diff --git a/src/dpp/cluster_sync_calls.cpp b/src/dpp/cluster_sync_calls.cpp index 9fff3564ba..08e4af5c1b 100644 --- a/src/dpp/cluster_sync_calls.cpp +++ b/src/dpp/cluster_sync_calls.cpp @@ -34,655 +34,727 @@ namespace dpp { slashcommand_map cluster::global_bulk_command_create_sync(const std::vector &commands) { - return dpp::sync(this, &cluster::global_bulk_command_create, commands); + return dpp::sync(this, static_cast &, command_completion_event_t)>(&cluster::global_bulk_command_create), commands); } slashcommand cluster::global_command_create_sync(const slashcommand &s) { - return dpp::sync(this, &cluster::global_command_create, s); + return dpp::sync(this, static_cast(&cluster::global_command_create), s); } slashcommand cluster::global_command_get_sync(snowflake id) { - return dpp::sync(this, &cluster::global_command_get, id); + return dpp::sync(this, static_cast(&cluster::global_command_get), id); } confirmation cluster::global_command_delete_sync(snowflake id) { - return dpp::sync(this, &cluster::global_command_delete, id); + return dpp::sync(this, static_cast(&cluster::global_command_delete), id); } confirmation cluster::global_command_edit_sync(const slashcommand &s) { - return dpp::sync(this, &cluster::global_command_edit, s); + return dpp::sync(this, static_cast(&cluster::global_command_edit), s); } slashcommand_map cluster::global_commands_get_sync() { - return dpp::sync(this, &cluster::global_commands_get); + return dpp::sync(this, static_cast(&cluster::global_commands_get)); } slashcommand_map cluster::guild_bulk_command_create_sync(const std::vector &commands, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_bulk_command_create, commands, guild_id); + return dpp::sync(this, static_cast &, snowflake, command_completion_event_t)>(&cluster::guild_bulk_command_create), commands, guild_id); } guild_command_permissions_map cluster::guild_commands_get_permissions_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_commands_get_permissions, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_commands_get_permissions), guild_id); } guild_command_permissions_map cluster::guild_bulk_command_edit_permissions_sync(const std::vector &commands, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_bulk_command_edit_permissions, commands, guild_id); + return dpp::sync(this, static_cast &, snowflake, command_completion_event_t)>(&cluster::guild_bulk_command_edit_permissions), commands, guild_id); } slashcommand cluster::guild_command_create_sync(const slashcommand &s, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_command_create, s, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_command_create), s, guild_id); } confirmation cluster::guild_command_delete_sync(snowflake id, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_command_delete, id, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_command_delete), id, guild_id); } confirmation cluster::guild_command_edit_permissions_sync(const slashcommand &s, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_command_edit_permissions, s, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_command_edit_permissions), s, guild_id); } slashcommand cluster::guild_command_get_sync(snowflake id, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_command_get, id, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_command_get), id, guild_id); } guild_command_permissions cluster::guild_command_get_permissions_sync(snowflake id, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_command_get_permissions, id, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_command_get_permissions), id, guild_id); } confirmation cluster::guild_command_edit_sync(const slashcommand &s, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_command_edit, s, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_command_edit), s, guild_id); } slashcommand_map cluster::guild_commands_get_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_commands_get, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_commands_get), guild_id); } confirmation cluster::interaction_response_create_sync(snowflake interaction_id, const std::string &token, const interaction_response &r) { - return dpp::sync(this, &cluster::interaction_response_create, interaction_id, token, r); + return dpp::sync(this, static_cast(&cluster::interaction_response_create), interaction_id, token, r); } confirmation cluster::interaction_response_edit_sync(const std::string &token, const message &m) { - return dpp::sync(this, &cluster::interaction_response_edit, token, m); + return dpp::sync(this, static_cast(&cluster::interaction_response_edit), token, m); } confirmation cluster::interaction_followup_create_sync(const std::string &token, const message &m) { - return dpp::sync(this, &cluster::interaction_followup_create, token, m); + return dpp::sync(this, static_cast(&cluster::interaction_followup_create), token, m); } confirmation cluster::interaction_followup_edit_original_sync(const std::string &token, const message &m) { - return dpp::sync(this, &cluster::interaction_followup_edit_original, token, m); + return dpp::sync(this, static_cast(&cluster::interaction_followup_edit_original), token, m); } confirmation cluster::interaction_followup_delete_sync(const std::string &token) { - return dpp::sync(this, &cluster::interaction_followup_delete, token); + return dpp::sync(this, static_cast(&cluster::interaction_followup_delete), token); } confirmation cluster::interaction_followup_edit_sync(const std::string &token, const message &m) { - return dpp::sync(this, &cluster::interaction_followup_edit, token, m); + return dpp::sync(this, static_cast(&cluster::interaction_followup_edit), token, m); } message cluster::interaction_followup_get_sync(const std::string &token, snowflake message_id) { - return dpp::sync(this, &cluster::interaction_followup_get, token, message_id); + return dpp::sync(this, static_cast(&cluster::interaction_followup_get), token, message_id); } automod_rule_map cluster::automod_rules_get_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::automod_rules_get, guild_id); + return dpp::sync(this, static_cast(&cluster::automod_rules_get), guild_id); } automod_rule cluster::automod_rule_get_sync(snowflake guild_id, snowflake rule_id) { - return dpp::sync(this, &cluster::automod_rule_get, guild_id, rule_id); + return dpp::sync(this, static_cast(&cluster::automod_rule_get), guild_id, rule_id); } automod_rule cluster::automod_rule_create_sync(snowflake guild_id, const automod_rule& r) { - return dpp::sync(this, &cluster::automod_rule_create, guild_id, r); + return dpp::sync(this, static_cast(&cluster::automod_rule_create), guild_id, r); } automod_rule cluster::automod_rule_edit_sync(snowflake guild_id, const automod_rule& r) { - return dpp::sync(this, &cluster::automod_rule_edit, guild_id, r); + return dpp::sync(this, static_cast(&cluster::automod_rule_edit), guild_id, r); } confirmation cluster::automod_rule_delete_sync(snowflake guild_id, snowflake rule_id) { - return dpp::sync(this, &cluster::automod_rule_delete, guild_id, rule_id); + return dpp::sync(this, static_cast(&cluster::automod_rule_delete), guild_id, rule_id); } channel cluster::channel_create_sync(const class channel &c) { - return dpp::sync(this, &cluster::channel_create, c); + return dpp::sync(this, static_cast(&cluster::channel_create), c); } confirmation cluster::channel_delete_permission_sync(const class channel &c, snowflake overwrite_id) { - return dpp::sync(this, &cluster::channel_delete_permission, c, overwrite_id); + return dpp::sync(this, static_cast(&cluster::channel_delete_permission), c, overwrite_id); } confirmation cluster::channel_delete_sync(snowflake channel_id) { - return dpp::sync(this, &cluster::channel_delete, channel_id); + return dpp::sync(this, static_cast(&cluster::channel_delete), channel_id); +} + +confirmation cluster::channel_edit_permissions_sync(const class channel &c, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member) { + return dpp::sync(this, static_cast(&cluster::channel_edit_permissions), c, overwrite_id, allow, deny, member); +} + +confirmation cluster::channel_edit_permissions_sync(const snowflake channel_id, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member) { + return dpp::sync(this, static_cast(&cluster::channel_edit_permissions), channel_id, overwrite_id, allow, deny, member); } confirmation cluster::channel_edit_positions_sync(const std::vector &c) { - return dpp::sync(this, &cluster::channel_edit_positions, c); + return dpp::sync(this, static_cast &, command_completion_event_t)>(&cluster::channel_edit_positions), c); } channel cluster::channel_edit_sync(const class channel &c) { - return dpp::sync(this, &cluster::channel_edit, c); + return dpp::sync(this, static_cast(&cluster::channel_edit), c); } confirmation cluster::channel_follow_news_sync(const class channel &c, snowflake target_channel_id) { - return dpp::sync(this, &cluster::channel_follow_news, c, target_channel_id); + return dpp::sync(this, static_cast(&cluster::channel_follow_news), c, target_channel_id); } channel cluster::channel_get_sync(snowflake c) { - return dpp::sync(this, &cluster::channel_get, c); + return dpp::sync(this, static_cast(&cluster::channel_get), c); } -confirmation cluster::channel_invite_create_sync(const class channel &c, const class invite &i) { - return dpp::sync(this, &cluster::channel_invite_create, c, i); +invite cluster::channel_invite_create_sync(const class channel &c, const class invite &i) { + return dpp::sync(this, static_cast(&cluster::channel_invite_create), c, i); } invite_map cluster::channel_invites_get_sync(const class channel &c) { - return dpp::sync(this, &cluster::channel_invites_get, c); + return dpp::sync(this, static_cast(&cluster::channel_invites_get), c); +} + +confirmation cluster::channel_typing_sync(const class channel &c) { + return dpp::sync(this, static_cast(&cluster::channel_typing), c); +} + +confirmation cluster::channel_typing_sync(snowflake cid) { + return dpp::sync(this, static_cast(&cluster::channel_typing), cid); } channel_map cluster::channels_get_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::channels_get, guild_id); + return dpp::sync(this, static_cast(&cluster::channels_get), guild_id); } channel cluster::create_dm_channel_sync(snowflake user_id) { - return dpp::sync(this, &cluster::create_dm_channel, user_id); + return dpp::sync(this, static_cast(&cluster::create_dm_channel), user_id); } channel_map cluster::current_user_get_dms_sync() { - return dpp::sync(this, &cluster::current_user_get_dms); + return dpp::sync(this, static_cast(&cluster::current_user_get_dms)); } message cluster::direct_message_create_sync(snowflake user_id, const message &m) { - return dpp::sync(this, &cluster::direct_message_create, user_id, m); + return dpp::sync(this, static_cast(&cluster::direct_message_create), user_id, m); } confirmation cluster::gdm_add_sync(snowflake channel_id, snowflake user_id, const std::string &access_token, const std::string &nick) { - return dpp::sync(this, &cluster::gdm_add, channel_id, user_id, access_token, nick); + return dpp::sync(this, static_cast(&cluster::gdm_add), channel_id, user_id, access_token, nick); } confirmation cluster::gdm_remove_sync(snowflake channel_id, snowflake user_id) { - return dpp::sync(this, &cluster::gdm_remove, channel_id, user_id); + return dpp::sync(this, static_cast(&cluster::gdm_remove), channel_id, user_id); } emoji cluster::guild_emoji_create_sync(snowflake guild_id, const class emoji& newemoji) { - return dpp::sync(this, &cluster::guild_emoji_create, guild_id, newemoji); + return dpp::sync(this, static_cast(&cluster::guild_emoji_create), guild_id, newemoji); } confirmation cluster::guild_emoji_delete_sync(snowflake guild_id, snowflake emoji_id) { - return dpp::sync(this, &cluster::guild_emoji_delete, guild_id, emoji_id); + return dpp::sync(this, static_cast(&cluster::guild_emoji_delete), guild_id, emoji_id); } emoji cluster::guild_emoji_edit_sync(snowflake guild_id, const class emoji& newemoji) { - return dpp::sync(this, &cluster::guild_emoji_edit, guild_id, newemoji); + return dpp::sync(this, static_cast(&cluster::guild_emoji_edit), guild_id, newemoji); } emoji cluster::guild_emoji_get_sync(snowflake guild_id, snowflake emoji_id) { - return dpp::sync(this, &cluster::guild_emoji_get, guild_id, emoji_id); + return dpp::sync(this, static_cast(&cluster::guild_emoji_get), guild_id, emoji_id); } emoji_map cluster::guild_emojis_get_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_emojis_get, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_emojis_get), guild_id); } gateway cluster::get_gateway_bot_sync() { - return dpp::sync(this, &cluster::get_gateway_bot); + return dpp::sync(this, static_cast(&cluster::get_gateway_bot)); } confirmation cluster::guild_current_member_edit_sync(snowflake guild_id, const std::string &nickname) { - return dpp::sync(this, &cluster::guild_current_member_edit, guild_id, nickname); + return dpp::sync(this, static_cast(&cluster::guild_current_member_edit), guild_id, nickname); } auditlog cluster::guild_auditlog_get_sync(snowflake guild_id, snowflake user_id, uint32_t action_type, snowflake before, snowflake after, uint32_t limit) { - return dpp::sync(this, &cluster::guild_auditlog_get, guild_id, user_id, action_type, before, after, limit); + return dpp::sync(this, static_cast(&cluster::guild_auditlog_get), guild_id, user_id, action_type, before, after, limit); } confirmation cluster::guild_ban_add_sync(snowflake guild_id, snowflake user_id, uint32_t delete_message_seconds) { - return dpp::sync(this, &cluster::guild_ban_add, guild_id, user_id, delete_message_seconds); + return dpp::sync(this, static_cast(&cluster::guild_ban_add), guild_id, user_id, delete_message_seconds); } confirmation cluster::guild_ban_delete_sync(snowflake guild_id, snowflake user_id) { - return dpp::sync(this, &cluster::guild_ban_delete, guild_id, user_id); + return dpp::sync(this, static_cast(&cluster::guild_ban_delete), guild_id, user_id); } guild cluster::guild_create_sync(const class guild &g) { - return dpp::sync(this, &cluster::guild_create, g); + return dpp::sync(this, static_cast(&cluster::guild_create), g); } confirmation cluster::guild_delete_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_delete, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_delete), guild_id); } confirmation cluster::guild_delete_integration_sync(snowflake guild_id, snowflake integration_id) { - return dpp::sync(this, &cluster::guild_delete_integration, guild_id, integration_id); + return dpp::sync(this, static_cast(&cluster::guild_delete_integration), guild_id, integration_id); } guild cluster::guild_edit_sync(const class guild &g) { - return dpp::sync(this, &cluster::guild_edit, g); + return dpp::sync(this, static_cast(&cluster::guild_edit), g); } guild_widget cluster::guild_edit_widget_sync(snowflake guild_id, const class guild_widget &gw) { - return dpp::sync(this, &cluster::guild_edit_widget, guild_id, gw); + return dpp::sync(this, static_cast(&cluster::guild_edit_widget), guild_id, gw); } ban cluster::guild_get_ban_sync(snowflake guild_id, snowflake user_id) { - return dpp::sync(this, &cluster::guild_get_ban, guild_id, user_id); + return dpp::sync(this, static_cast(&cluster::guild_get_ban), guild_id, user_id); } ban_map cluster::guild_get_bans_sync(snowflake guild_id, snowflake before, snowflake after, snowflake limit) { - return dpp::sync(this, &cluster::guild_get_bans, guild_id, before, after, limit); + return dpp::sync(this, static_cast(&cluster::guild_get_bans), guild_id, before, after, limit); } guild cluster::guild_get_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_get, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_get), guild_id); } integration_map cluster::guild_get_integrations_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_get_integrations, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_get_integrations), guild_id); } guild cluster::guild_get_preview_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_get_preview, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_get_preview), guild_id); } invite cluster::guild_get_vanity_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_get_vanity, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_get_vanity), guild_id); } guild_widget cluster::guild_get_widget_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_get_widget, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_get_widget), guild_id); } confirmation cluster::guild_modify_integration_sync(snowflake guild_id, const class integration &i) { - return dpp::sync(this, &cluster::guild_modify_integration, guild_id, i); + return dpp::sync(this, static_cast(&cluster::guild_modify_integration), guild_id, i); } prune cluster::guild_get_prune_counts_sync(snowflake guild_id, const struct prune& pruneinfo) { - return dpp::sync(this, &cluster::guild_get_prune_counts, guild_id, pruneinfo); + return dpp::sync(this, static_cast(&cluster::guild_get_prune_counts), guild_id, pruneinfo); } prune cluster::guild_begin_prune_sync(snowflake guild_id, const struct prune& pruneinfo) { - return dpp::sync(this, &cluster::guild_begin_prune, guild_id, pruneinfo); + return dpp::sync(this, static_cast(&cluster::guild_begin_prune), guild_id, pruneinfo); } confirmation cluster::guild_set_nickname_sync(snowflake guild_id, const std::string &nickname) { - return dpp::sync(this, &cluster::guild_set_nickname, guild_id, nickname); + return dpp::sync(this, static_cast(&cluster::guild_set_nickname), guild_id, nickname); } confirmation cluster::guild_sync_integration_sync(snowflake guild_id, snowflake integration_id) { - return dpp::sync(this, &cluster::guild_sync_integration, guild_id, integration_id); + return dpp::sync(this, static_cast(&cluster::guild_sync_integration), guild_id, integration_id); } confirmation cluster::guild_add_member_sync(const guild_member& gm, const std::string &access_token) { - return dpp::sync(this, &cluster::guild_add_member, gm, access_token); + return dpp::sync(this, static_cast(&cluster::guild_add_member), gm, access_token); } guild_member cluster::guild_edit_member_sync(const guild_member& gm) { - return dpp::sync(this, &cluster::guild_edit_member, gm); + return dpp::sync(this, static_cast(&cluster::guild_edit_member), gm); } guild_member cluster::guild_get_member_sync(snowflake guild_id, snowflake user_id) { - return dpp::sync(this, &cluster::guild_get_member, guild_id, user_id); + return dpp::sync(this, static_cast(&cluster::guild_get_member), guild_id, user_id); } guild_member_map cluster::guild_get_members_sync(snowflake guild_id, uint16_t limit, snowflake after) { - return dpp::sync(this, &cluster::guild_get_members, guild_id, limit, after); + return dpp::sync(this, static_cast(&cluster::guild_get_members), guild_id, limit, after); } confirmation cluster::guild_member_add_role_sync(snowflake guild_id, snowflake user_id, snowflake role_id) { - return dpp::sync(this, &cluster::guild_member_add_role, guild_id, user_id, role_id); + return dpp::sync(this, static_cast(&cluster::guild_member_add_role), guild_id, user_id, role_id); } confirmation cluster::guild_member_delete_sync(snowflake guild_id, snowflake user_id) { - return dpp::sync(this, &cluster::guild_member_delete, guild_id, user_id); + return dpp::sync(this, static_cast(&cluster::guild_member_delete), guild_id, user_id); } confirmation cluster::guild_member_kick_sync(snowflake guild_id, snowflake user_id) { - return dpp::sync(this, &cluster::guild_member_kick, guild_id, user_id); + return dpp::sync(this, static_cast(&cluster::guild_member_kick), guild_id, user_id); } confirmation cluster::guild_member_timeout_sync(snowflake guild_id, snowflake user_id, time_t communication_disabled_until) { - return dpp::sync(this, &cluster::guild_member_timeout, guild_id, user_id, communication_disabled_until); + return dpp::sync(this, static_cast(&cluster::guild_member_timeout), guild_id, user_id, communication_disabled_until); } confirmation cluster::guild_member_delete_role_sync(snowflake guild_id, snowflake user_id, snowflake role_id) { - return dpp::sync(this, &cluster::guild_member_delete_role, guild_id, user_id, role_id); + return dpp::sync(this, static_cast(&cluster::guild_member_delete_role), guild_id, user_id, role_id); } confirmation cluster::guild_member_remove_role_sync(snowflake guild_id, snowflake user_id, snowflake role_id) { - return dpp::sync(this, &cluster::guild_member_remove_role, guild_id, user_id, role_id); + return dpp::sync(this, static_cast(&cluster::guild_member_remove_role), guild_id, user_id, role_id); } guild_member cluster::guild_member_move_sync(const snowflake channel_id, const snowflake guild_id, const snowflake user_id) { - return dpp::sync(this, &cluster::guild_member_move, channel_id, guild_id, user_id); + return dpp::sync(this, static_cast(&cluster::guild_member_move), channel_id, guild_id, user_id); } guild_member_map cluster::guild_search_members_sync(snowflake guild_id, const std::string& query, uint16_t limit) { - return dpp::sync(this, &cluster::guild_search_members, guild_id, query, limit); + return dpp::sync(this, static_cast(&cluster::guild_search_members), guild_id, query, limit); } invite_map cluster::guild_get_invites_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_get_invites, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_get_invites), guild_id); } invite cluster::invite_delete_sync(const std::string &invitecode) { - return dpp::sync(this, &cluster::invite_delete, invitecode); + return dpp::sync(this, static_cast(&cluster::invite_delete), invitecode); +} + +invite cluster::invite_get_sync(const std::string &invite_code) { + return dpp::sync(this, static_cast(&cluster::invite_get), invite_code); +} + +confirmation cluster::message_add_reaction_sync(const struct message &m, const std::string &reaction) { + return dpp::sync(this, static_cast(&cluster::message_add_reaction), m, reaction); } -invite cluster::invite_get_sync(const std::string &invitecode) { - return dpp::sync(this, &cluster::invite_get, invitecode); +confirmation cluster::message_add_reaction_sync(snowflake message_id, snowflake channel_id, const std::string &reaction) { + return dpp::sync(this, static_cast(&cluster::message_add_reaction), message_id, channel_id, reaction); } message cluster::message_create_sync(const message &m) { - return dpp::sync(this, &cluster::message_create, m); + return dpp::sync(this, static_cast(&cluster::message_create), m); } message cluster::message_crosspost_sync(snowflake message_id, snowflake channel_id) { - return dpp::sync(this, &cluster::message_crosspost, message_id, channel_id); + return dpp::sync(this, static_cast(&cluster::message_crosspost), message_id, channel_id); +} + +confirmation cluster::message_delete_all_reactions_sync(const struct message &m) { + return dpp::sync(this, static_cast(&cluster::message_delete_all_reactions), m); +} + +confirmation cluster::message_delete_all_reactions_sync(snowflake message_id, snowflake channel_id) { + return dpp::sync(this, static_cast(&cluster::message_delete_all_reactions), message_id, channel_id); } confirmation cluster::message_delete_bulk_sync(const std::vector& message_ids, snowflake channel_id) { - return dpp::sync(this, &cluster::message_delete_bulk, message_ids, channel_id); + return dpp::sync(this, static_cast&, snowflake, command_completion_event_t)>(&cluster::message_delete_bulk), message_ids, channel_id); } confirmation cluster::message_delete_sync(snowflake message_id, snowflake channel_id) { - return dpp::sync(this, &cluster::message_delete, message_id, channel_id); + return dpp::sync(this, static_cast(&cluster::message_delete), message_id, channel_id); +} + +confirmation cluster::message_delete_own_reaction_sync(const struct message &m, const std::string &reaction) { + return dpp::sync(this, static_cast(&cluster::message_delete_own_reaction), m, reaction); +} + +confirmation cluster::message_delete_own_reaction_sync(snowflake message_id, snowflake channel_id, const std::string &reaction) { + return dpp::sync(this, static_cast(&cluster::message_delete_own_reaction), message_id, channel_id, reaction); +} + +confirmation cluster::message_delete_reaction_sync(const struct message &m, snowflake user_id, const std::string &reaction) { + return dpp::sync(this, static_cast(&cluster::message_delete_reaction), m, user_id, reaction); +} + +confirmation cluster::message_delete_reaction_sync(snowflake message_id, snowflake channel_id, snowflake user_id, const std::string &reaction) { + return dpp::sync(this, static_cast(&cluster::message_delete_reaction), message_id, channel_id, user_id, reaction); +} + +confirmation cluster::message_delete_reaction_emoji_sync(const struct message &m, const std::string &reaction) { + return dpp::sync(this, static_cast(&cluster::message_delete_reaction_emoji), m, reaction); +} + +confirmation cluster::message_delete_reaction_emoji_sync(snowflake message_id, snowflake channel_id, const std::string &reaction) { + return dpp::sync(this, static_cast(&cluster::message_delete_reaction_emoji), message_id, channel_id, reaction); } message cluster::message_edit_sync(const message &m) { - return dpp::sync(this, &cluster::message_edit, m); + return dpp::sync(this, static_cast(&cluster::message_edit), m); } message cluster::message_get_sync(snowflake message_id, snowflake channel_id) { - return dpp::sync(this, &cluster::message_get, message_id, channel_id); + return dpp::sync(this, static_cast(&cluster::message_get), message_id, channel_id); +} + +user_map cluster::message_get_reactions_sync(const struct message &m, const std::string &reaction, snowflake before, snowflake after, snowflake limit) { + return dpp::sync(this, static_cast(&cluster::message_get_reactions), m, reaction, before, after, limit); +} + +emoji_map cluster::message_get_reactions_sync(snowflake message_id, snowflake channel_id, const std::string &reaction, snowflake before, snowflake after, snowflake limit) { + return dpp::sync(this, static_cast(&cluster::message_get_reactions), message_id, channel_id, reaction, before, after, limit); } confirmation cluster::message_pin_sync(snowflake channel_id, snowflake message_id) { - return dpp::sync(this, &cluster::message_pin, channel_id, message_id); + return dpp::sync(this, static_cast(&cluster::message_pin), channel_id, message_id); } message_map cluster::messages_get_sync(snowflake channel_id, snowflake around, snowflake before, snowflake after, uint64_t limit) { - return dpp::sync(this, &cluster::messages_get, channel_id, around, before, after, limit); + return dpp::sync(this, static_cast(&cluster::messages_get), channel_id, around, before, after, limit); } confirmation cluster::message_unpin_sync(snowflake channel_id, snowflake message_id) { - return dpp::sync(this, &cluster::message_unpin, channel_id, message_id); + return dpp::sync(this, static_cast(&cluster::message_unpin), channel_id, message_id); } message_map cluster::channel_pins_get_sync(snowflake channel_id) { - return dpp::sync(this, &cluster::channel_pins_get, channel_id); + return dpp::sync(this, static_cast(&cluster::channel_pins_get), channel_id); } role cluster::role_create_sync(const class role &r) { - return dpp::sync(this, &cluster::role_create, r); + return dpp::sync(this, static_cast(&cluster::role_create), r); } confirmation cluster::role_delete_sync(snowflake guild_id, snowflake role_id) { - return dpp::sync(this, &cluster::role_delete, guild_id, role_id); + return dpp::sync(this, static_cast(&cluster::role_delete), guild_id, role_id); } role cluster::role_edit_sync(const class role &r) { - return dpp::sync(this, &cluster::role_edit, r); + return dpp::sync(this, static_cast(&cluster::role_edit), r); } role_map cluster::roles_edit_position_sync(snowflake guild_id, const std::vector &roles) { - return dpp::sync(this, &cluster::roles_edit_position, guild_id, roles); + return dpp::sync(this, static_cast &, command_completion_event_t)>(&cluster::roles_edit_position), guild_id, roles); } role_map cluster::roles_get_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::roles_get, guild_id); + return dpp::sync(this, static_cast(&cluster::roles_get), guild_id); +} + +application_role_connection cluster::application_role_connection_get_sync(snowflake application_id) { + return dpp::sync(this, static_cast(&cluster::application_role_connection_get), application_id); +} + +application_role_connection cluster::application_role_connection_update_sync(snowflake application_id, const std::vector &connection_metadata) { + return dpp::sync(this, static_cast &, command_completion_event_t)>(&cluster::application_role_connection_update), application_id, connection_metadata); } application_role_connection cluster::user_application_role_connection_get_sync(snowflake application_id) { - return dpp::sync(this, &cluster::user_application_role_connection_get, application_id); + return dpp::sync(this, static_cast(&cluster::user_application_role_connection_get), application_id); } application_role_connection cluster::user_application_role_connection_update_sync(snowflake application_id, const application_role_connection &connection) { - return dpp::sync(this, &cluster::user_application_role_connection_update, application_id, connection); + return dpp::sync(this, static_cast(&cluster::user_application_role_connection_update), application_id, connection); } scheduled_event_map cluster::guild_events_get_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_events_get, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_events_get), guild_id); } scheduled_event cluster::guild_event_create_sync(const scheduled_event& event) { - return dpp::sync(this, &cluster::guild_event_create, event); + return dpp::sync(this, static_cast(&cluster::guild_event_create), event); } confirmation cluster::guild_event_delete_sync(snowflake event_id, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_event_delete, event_id, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_event_delete), event_id, guild_id); } scheduled_event cluster::guild_event_edit_sync(const scheduled_event& event) { - return dpp::sync(this, &cluster::guild_event_edit, event); + return dpp::sync(this, static_cast(&cluster::guild_event_edit), event); } scheduled_event cluster::guild_event_get_sync(snowflake guild_id, snowflake event_id) { - return dpp::sync(this, &cluster::guild_event_get, guild_id, event_id); + return dpp::sync(this, static_cast(&cluster::guild_event_get), guild_id, event_id); } stage_instance cluster::stage_instance_create_sync(const stage_instance& si) { - return dpp::sync(this, &cluster::stage_instance_create, si); + return dpp::sync(this, static_cast(&cluster::stage_instance_create), si); } stage_instance cluster::stage_instance_get_sync(const snowflake channel_id) { - return dpp::sync(this, &cluster::stage_instance_get, channel_id); + return dpp::sync(this, static_cast(&cluster::stage_instance_get), channel_id); } stage_instance cluster::stage_instance_edit_sync(const stage_instance& si) { - return dpp::sync(this, &cluster::stage_instance_edit, si); + return dpp::sync(this, static_cast(&cluster::stage_instance_edit), si); } confirmation cluster::stage_instance_delete_sync(const snowflake channel_id) { - return dpp::sync(this, &cluster::stage_instance_delete, channel_id); + return dpp::sync(this, static_cast(&cluster::stage_instance_delete), channel_id); } sticker cluster::guild_sticker_create_sync(sticker &s) { - return dpp::sync(this, &cluster::guild_sticker_create, s); + return dpp::sync(this, static_cast(&cluster::guild_sticker_create), s); } confirmation cluster::guild_sticker_delete_sync(snowflake sticker_id, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_sticker_delete, sticker_id, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_sticker_delete), sticker_id, guild_id); } sticker cluster::guild_sticker_get_sync(snowflake id, snowflake guild_id) { - return dpp::sync(this, &cluster::guild_sticker_get, id, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_sticker_get), id, guild_id); } sticker cluster::guild_sticker_modify_sync(sticker &s) { - return dpp::sync(this, &cluster::guild_sticker_modify, s); + return dpp::sync(this, static_cast(&cluster::guild_sticker_modify), s); } sticker_map cluster::guild_stickers_get_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_stickers_get, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_stickers_get), guild_id); } sticker cluster::nitro_sticker_get_sync(snowflake id) { - return dpp::sync(this, &cluster::nitro_sticker_get, id); + return dpp::sync(this, static_cast(&cluster::nitro_sticker_get), id); } sticker_pack_map cluster::sticker_packs_get_sync() { - return dpp::sync(this, &cluster::sticker_packs_get); + return dpp::sync(this, static_cast(&cluster::sticker_packs_get)); } guild cluster::guild_create_from_template_sync(const std::string &code, const std::string &name) { - return dpp::sync(this, &cluster::guild_create_from_template, code, name); + return dpp::sync(this, static_cast(&cluster::guild_create_from_template), code, name); } dtemplate cluster::guild_template_create_sync(snowflake guild_id, const std::string &name, const std::string &description) { - return dpp::sync(this, &cluster::guild_template_create, guild_id, name, description); + return dpp::sync(this, static_cast(&cluster::guild_template_create), guild_id, name, description); } confirmation cluster::guild_template_delete_sync(snowflake guild_id, const std::string &code) { - return dpp::sync(this, &cluster::guild_template_delete, guild_id, code); + return dpp::sync(this, static_cast(&cluster::guild_template_delete), guild_id, code); } dtemplate cluster::guild_template_modify_sync(snowflake guild_id, const std::string &code, const std::string &name, const std::string &description) { - return dpp::sync(this, &cluster::guild_template_modify, guild_id, code, name, description); + return dpp::sync(this, static_cast(&cluster::guild_template_modify), guild_id, code, name, description); } dtemplate_map cluster::guild_templates_get_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_templates_get, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_templates_get), guild_id); } dtemplate cluster::guild_template_sync_sync(snowflake guild_id, const std::string &code) { - return dpp::sync(this, &cluster::guild_template_sync, guild_id, code); + return dpp::sync(this, static_cast(&cluster::guild_template_sync), guild_id, code); } dtemplate cluster::template_get_sync(const std::string &code) { - return dpp::sync(this, &cluster::template_get, code); + return dpp::sync(this, static_cast(&cluster::template_get), code); } confirmation cluster::current_user_join_thread_sync(snowflake thread_id) { - return dpp::sync(this, &cluster::current_user_join_thread, thread_id); + return dpp::sync(this, static_cast(&cluster::current_user_join_thread), thread_id); } confirmation cluster::current_user_leave_thread_sync(snowflake thread_id) { - return dpp::sync(this, &cluster::current_user_leave_thread, thread_id); + return dpp::sync(this, static_cast(&cluster::current_user_leave_thread), thread_id); } active_threads cluster::threads_get_active_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::threads_get_active, guild_id); + return dpp::sync(this, static_cast(&cluster::threads_get_active), guild_id); } thread_map cluster::threads_get_joined_private_archived_sync(snowflake channel_id, snowflake before_id, uint16_t limit) { - return dpp::sync(this, &cluster::threads_get_joined_private_archived, channel_id, before_id, limit); + return dpp::sync(this, static_cast(&cluster::threads_get_joined_private_archived), channel_id, before_id, limit); } thread_map cluster::threads_get_private_archived_sync(snowflake channel_id, time_t before_timestamp, uint16_t limit) { - return dpp::sync(this, &cluster::threads_get_private_archived, channel_id, before_timestamp, limit); + return dpp::sync(this, static_cast(&cluster::threads_get_private_archived), channel_id, before_timestamp, limit); } thread_map cluster::threads_get_public_archived_sync(snowflake channel_id, time_t before_timestamp, uint16_t limit) { - return dpp::sync(this, &cluster::threads_get_public_archived, channel_id, before_timestamp, limit); + return dpp::sync(this, static_cast(&cluster::threads_get_public_archived), channel_id, before_timestamp, limit); } thread_member cluster::thread_member_get_sync(const snowflake thread_id, const snowflake user_id) { - return dpp::sync(this, &cluster::thread_member_get, thread_id, user_id); + return dpp::sync(this, static_cast(&cluster::thread_member_get), thread_id, user_id); } thread_member_map cluster::thread_members_get_sync(snowflake thread_id) { - return dpp::sync(this, &cluster::thread_members_get, thread_id); + return dpp::sync(this, static_cast(&cluster::thread_members_get), thread_id); } thread cluster::thread_create_in_forum_sync(const std::string& thread_name, snowflake channel_id, const message& msg, auto_archive_duration_t auto_archive_duration, uint16_t rate_limit_per_user, std::vector applied_tags) { - return dpp::sync(this, &cluster::thread_create_in_forum, thread_name, channel_id, msg, auto_archive_duration, rate_limit_per_user, applied_tags); + return dpp::sync(this, static_cast, command_completion_event_t)>(&cluster::thread_create_in_forum), thread_name, channel_id, msg, auto_archive_duration, rate_limit_per_user, applied_tags); } thread cluster::thread_create_sync(const std::string& thread_name, snowflake channel_id, uint16_t auto_archive_duration, channel_type thread_type, bool invitable, uint16_t rate_limit_per_user) { - return dpp::sync(this, &cluster::thread_create, thread_name, channel_id, auto_archive_duration, thread_type, invitable, rate_limit_per_user); + return dpp::sync(this, static_cast(&cluster::thread_create), thread_name, channel_id, auto_archive_duration, thread_type, invitable, rate_limit_per_user); } thread cluster::thread_create_with_message_sync(const std::string& thread_name, snowflake channel_id, snowflake message_id, uint16_t auto_archive_duration, uint16_t rate_limit_per_user) { - return dpp::sync(this, &cluster::thread_create_with_message, thread_name, channel_id, message_id, auto_archive_duration, rate_limit_per_user); + return dpp::sync(this, static_cast(&cluster::thread_create_with_message), thread_name, channel_id, message_id, auto_archive_duration, rate_limit_per_user); } confirmation cluster::thread_member_add_sync(snowflake thread_id, snowflake user_id) { - return dpp::sync(this, &cluster::thread_member_add, thread_id, user_id); + return dpp::sync(this, static_cast(&cluster::thread_member_add), thread_id, user_id); } confirmation cluster::thread_member_remove_sync(snowflake thread_id, snowflake user_id) { - return dpp::sync(this, &cluster::thread_member_remove, thread_id, user_id); + return dpp::sync(this, static_cast(&cluster::thread_member_remove), thread_id, user_id); } user cluster::current_user_edit_sync(const std::string &nickname, const std::string& image_blob, const image_type type) { - return dpp::sync(this, &cluster::current_user_edit, nickname, image_blob, type); + return dpp::sync(this, static_cast(&cluster::current_user_edit), nickname, image_blob, type); } application cluster::current_application_get_sync() { - return dpp::sync(this, &cluster::current_application_get); + return dpp::sync(this, static_cast(&cluster::current_application_get)); } user_identified cluster::current_user_get_sync() { - return dpp::sync(this, &cluster::current_user_get); + return dpp::sync(this, static_cast(&cluster::current_user_get)); } confirmation cluster::current_user_set_voice_state_sync(snowflake guild_id, snowflake channel_id, bool suppress, time_t request_to_speak_timestamp) { - return dpp::sync(this, &cluster::current_user_set_voice_state, guild_id, channel_id, suppress, request_to_speak_timestamp); + return dpp::sync(this, static_cast(&cluster::current_user_set_voice_state), guild_id, channel_id, suppress, request_to_speak_timestamp); } confirmation cluster::user_set_voice_state_sync(snowflake user_id, snowflake guild_id, snowflake channel_id, bool suppress) { - return dpp::sync(this, &cluster::user_set_voice_state, user_id, guild_id, channel_id, suppress); + return dpp::sync(this, static_cast(&cluster::user_set_voice_state), user_id, guild_id, channel_id, suppress); } connection_map cluster::current_user_connections_get_sync() { - return dpp::sync(this, &cluster::current_user_connections_get); + return dpp::sync(this, static_cast(&cluster::current_user_connections_get)); } guild_map cluster::current_user_get_guilds_sync() { - return dpp::sync(this, &cluster::current_user_get_guilds); + return dpp::sync(this, static_cast(&cluster::current_user_get_guilds)); } confirmation cluster::current_user_leave_guild_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::current_user_leave_guild, guild_id); + return dpp::sync(this, static_cast(&cluster::current_user_leave_guild), guild_id); } user_identified cluster::user_get_sync(snowflake user_id) { - return dpp::sync(this, &cluster::user_get, user_id); + return dpp::sync(this, static_cast(&cluster::user_get), user_id); } user_identified cluster::user_get_cached_sync(snowflake user_id) { - return dpp::sync(this, &cluster::user_get_cached, user_id); + return dpp::sync(this, static_cast(&cluster::user_get_cached), user_id); } voiceregion_map cluster::get_voice_regions_sync() { - return dpp::sync(this, &cluster::get_voice_regions); + return dpp::sync(this, static_cast(&cluster::get_voice_regions)); } voiceregion_map cluster::guild_get_voice_regions_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::guild_get_voice_regions, guild_id); + return dpp::sync(this, static_cast(&cluster::guild_get_voice_regions), guild_id); } webhook cluster::create_webhook_sync(const class webhook &w) { - return dpp::sync(this, &cluster::create_webhook, w); + return dpp::sync(this, static_cast(&cluster::create_webhook), w); } confirmation cluster::delete_webhook_sync(snowflake webhook_id) { - return dpp::sync(this, &cluster::delete_webhook, webhook_id); + return dpp::sync(this, static_cast(&cluster::delete_webhook), webhook_id); } confirmation cluster::delete_webhook_message_sync(const class webhook &wh, snowflake message_id, snowflake thread_id) { - return dpp::sync(this, &cluster::delete_webhook_message, wh, message_id, thread_id); + return dpp::sync(this, static_cast(&cluster::delete_webhook_message), wh, message_id, thread_id); } confirmation cluster::delete_webhook_with_token_sync(snowflake webhook_id, const std::string &token) { - return dpp::sync(this, &cluster::delete_webhook_with_token, webhook_id, token); + return dpp::sync(this, static_cast(&cluster::delete_webhook_with_token), webhook_id, token); } webhook cluster::edit_webhook_sync(const class webhook& wh) { - return dpp::sync(this, &cluster::edit_webhook, wh); + return dpp::sync(this, static_cast(&cluster::edit_webhook), wh); } message cluster::edit_webhook_message_sync(const class webhook &wh, const struct message& m, snowflake thread_id) { - return dpp::sync(this, &cluster::edit_webhook_message, wh, m, thread_id); + return dpp::sync(this, static_cast(&cluster::edit_webhook_message), wh, m, thread_id); } webhook cluster::edit_webhook_with_token_sync(const class webhook& wh) { - return dpp::sync(this, &cluster::edit_webhook_with_token, wh); + return dpp::sync(this, static_cast(&cluster::edit_webhook_with_token), wh); } message cluster::execute_webhook_sync(const class webhook &wh, const struct message& m, bool wait, snowflake thread_id, const std::string& thread_name) { - return dpp::sync(this, &cluster::execute_webhook, wh, m, wait, thread_id, thread_name); + return dpp::sync(this, static_cast(&cluster::execute_webhook), wh, m, wait, thread_id, thread_name); } webhook_map cluster::get_channel_webhooks_sync(snowflake channel_id) { - return dpp::sync(this, &cluster::get_channel_webhooks, channel_id); + return dpp::sync(this, static_cast(&cluster::get_channel_webhooks), channel_id); } webhook_map cluster::get_guild_webhooks_sync(snowflake guild_id) { - return dpp::sync(this, &cluster::get_guild_webhooks, guild_id); + return dpp::sync(this, static_cast(&cluster::get_guild_webhooks), guild_id); } webhook cluster::get_webhook_sync(snowflake webhook_id) { - return dpp::sync(this, &cluster::get_webhook, webhook_id); + return dpp::sync(this, static_cast(&cluster::get_webhook), webhook_id); } message cluster::get_webhook_message_sync(const class webhook &wh, snowflake message_id, snowflake thread_id) { - return dpp::sync(this, &cluster::get_webhook_message, wh, message_id, thread_id); + return dpp::sync(this, static_cast(&cluster::get_webhook_message), wh, message_id, thread_id); } webhook cluster::get_webhook_with_token_sync(snowflake webhook_id, const std::string &token) { - return dpp::sync(this, &cluster::get_webhook_with_token, webhook_id, token); + return dpp::sync(this, static_cast(&cluster::get_webhook_with_token), webhook_id, token); } From 01c2c31b94bf06232b3a9a1efc5a2f99790f75f2 Mon Sep 17 00:00:00 2001 From: Phil Date: Sat, 10 Jun 2023 10:57:21 +0200 Subject: [PATCH 066/101] feat: added setter methods to dpp::invite class (#708) --- include/dpp/invite.h | 48 ++++++++++++++++++++++++++++++++++++++++++++ src/dpp/invite.cpp | 30 +++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/include/dpp/invite.h b/include/dpp/invite.h index b04dd7b733..fea11a7eab 100644 --- a/include/dpp/invite.h +++ b/include/dpp/invite.h @@ -116,6 +116,54 @@ class DPP_EXPORT invite : public json_interface { */ virtual ~invite() = default; + /** + * @brief Set the max age after which the invite expires + * + * @param max_age_ The duration in seconds, or 0 for no expiration. Must be between 0 and 604800 (7 days) + * @return invite& reference to self for chaining of calls + */ + invite& set_max_age(const uint32_t max_age_); + + /** + * @brief Set the maximum number of uses for this invite + * + * @param max_uses_ Maximum number of uses, or 0 for unlimited. Must be between 0 and 100 + * @return invite& reference to self for chaining of calls + */ + invite& set_max_uses(const uint8_t max_uses_); + + /** + * @brief Set the target user id + * + * @param user_id The user ID whose stream to display for this voice channel stream invite + * @return invite& reference to self for chaining of calls + */ + invite& set_target_user_id(const snowflake user_id); + + /** + * @brief Set the target type for this voice channel invite + * + * @param type invite_target_t Target type + * @return invite& reference to self for chaining of calls + */ + invite& set_target_type(const invite_target_t type); + + /** + * @brief Set temporary property of this invite object + * + * @param is_temporary Whether this invite only grants temporary membership + * @return invite& reference to self for chaining of calls + */ + invite& set_temporary(const bool is_temporary); + + /** + * @brief Set unique property of this invite object + * + * @param is_unique True if this invite should not replace or "attach to" similar invites + * @return invite& reference to self for chaining of calls + */ + invite& set_unique(const bool is_unique); + /** Read class values from json object * @param j A json object to read from * @return A reference to self diff --git a/src/dpp/invite.cpp b/src/dpp/invite.cpp index c3d26ba4f1..bfd23bb04f 100644 --- a/src/dpp/invite.cpp +++ b/src/dpp/invite.cpp @@ -82,4 +82,34 @@ std::string invite::build_json(bool with_id) const { return j.dump(); } +invite &invite::set_max_age(const uint32_t max_age_) { + this->max_age = max_age_; + return *this; +} + +invite &invite::set_max_uses(const uint8_t max_uses_) { + this->max_uses = max_uses_; + return *this; +} + +invite &invite::set_target_user_id(const snowflake user_id) { + this->target_user_id = user_id; + return *this; +} + +invite &invite::set_target_type(const invite_target_t type) { + this->target_type = type; + return *this; +} + +invite &invite::set_temporary(const bool is_temporary) { + this->temporary = is_temporary; + return *this; +} + +invite &invite::set_unique(const bool is_unique) { + this->unique = is_unique; + return *this; +} + }; From c06a8d17ec196ad4c4930aabccf17deea1e05e26 Mon Sep 17 00:00:00 2001 From: Nathan Jager <84308084+NaJager@users.noreply.github.com> Date: Sat, 10 Jun 2023 12:19:25 +0200 Subject: [PATCH 067/101] Fix: Adapt dpp::user::get_default_avatar() to new username system (#711) --- src/dpp/user.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/dpp/user.cpp b/src/dpp/user.cpp index aa32488c4e..b9faa8767d 100644 --- a/src/dpp/user.cpp +++ b/src/dpp/user.cpp @@ -117,6 +117,10 @@ std::string user::get_default_avatar_url() const { return utility::cdn_endpoint_url({ i_png }, "embed/avatars/" + std::to_string(this->discriminator % 5), i_png, 0); + } else if (this->id){ + return utility::cdn_endpoint_url({ i_png }, + "embed/avatars/" + std::to_string((this->id >> 22) % 6), + i_png, 0); } else { return std::string(); } From cd5b9cab3fb6a49ece575e0f86475268f886766b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 10 Jun 2023 13:01:28 +0100 Subject: [PATCH 068/101] build(deps): bump doxygen-awesome-css from `1141ff5` to `df83fbf` (#709) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- doxygen-awesome-css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doxygen-awesome-css b/doxygen-awesome-css index 1141ff5fb6..df83fbf22c 160000 --- a/doxygen-awesome-css +++ b/doxygen-awesome-css @@ -1 +1 @@ -Subproject commit 1141ff5fb6888f8536088cfe6dc5a7834094bad7 +Subproject commit df83fbf22cfff76b875c13d324baf584c74e96d0 From d31b1d30377fcecf786d8dc451918fba33746a31 Mon Sep 17 00:00:00 2001 From: Miuna <809711+Mishura4@users.noreply.github.com> Date: Thu, 22 Jun 2023 13:29:01 -0400 Subject: [PATCH 069/101] fix, refactor, test, feat: added cluster::thread_edit, fix cluster::thread_members_get, refactor cluster::threads_get_active, add a bunch of tests for threads (#700) Co-authored-by: Brain --- include/dpp/channel.h | 24 +- include/dpp/cluster.h | 11 + include/dpp/cluster_coro_calls.h | 14 + include/dpp/cluster_sync_calls.h | 15 + src/dpp/cluster/thread.cpp | 15 +- src/dpp/cluster_sync_calls.cpp | 4 + src/unittest/test.cpp | 468 +++++++++++++++++++++++++++---- src/unittest/test.h | 42 +++ src/unittest/unittest.cpp | 22 ++ 9 files changed, 558 insertions(+), 57 deletions(-) diff --git a/include/dpp/channel.h b/include/dpp/channel.h index 5a28fcc906..df47429828 100644 --- a/include/dpp/channel.h +++ b/include/dpp/channel.h @@ -250,7 +250,7 @@ struct DPP_EXPORT forum_tag : public managed { }; /** - * @brief A group of thread member objects. the key is the thread_id of the dpp::thread_member + * @brief A group of thread member objects. the key is the user_id of the dpp::thread_member */ typedef std::unordered_map thread_member_map; @@ -835,12 +835,24 @@ typedef std::unordered_map channel_map; typedef std::unordered_map thread_map; /** - * @brief A group of threads and thread_members. returned from the cluster::threads_get_active method + * @brief A thread alongside the bot's optional thread_member object tied to it */ -typedef struct { - thread_map threads; - thread_member_map thread_members; -} active_threads; +struct active_thread_info { + /** + * @brief The thread object + */ + thread active_thread; + + /** + * @brief The bot as a thread member, only present if the bot is in the thread + */ + std::optional bot_member; +}; + +/** + * @brief A map of threads alongside optionally the thread_member tied to the bot if it is in the thread. The map's key is the thread id. Returned from the cluster::threads_get_active method + */ +using active_threads = std::map; }; diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 563d834ac2..1e74b500c0 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -3027,6 +3027,17 @@ class DPP_EXPORT cluster { */ void thread_create(const std::string& thread_name, snowflake channel_id, uint16_t auto_archive_duration, channel_type thread_type, bool invitable, uint16_t rate_limit_per_user, command_completion_event_t callback = utility::log_error()); + /** + * @brief Edit a thread + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * + * @see https://discord.com/developers/docs/topics/threads#editing-deleting-threads + * @param t Thread to edit + * @param callback Function to call when the API call completes. + * On success the callback will contain a dpp::thread object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void thread_edit(const thread &t, command_completion_event_t callback = utility::log_error()); + /** * @brief Create a thread with a message (Discord: ID of a thread is same as message ID) * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. diff --git a/include/dpp/cluster_coro_calls.h b/include/dpp/cluster_coro_calls.h index 64d5d2fac3..d7ed89b80a 100644 --- a/include/dpp/cluster_coro_calls.h +++ b/include/dpp/cluster_coro_calls.h @@ -2240,6 +2240,20 @@ auto inline co_thread_create(const std::string& thread_name, snowflake channel_i return dpp::awaitable(this, [&] (auto cc) { this->thread_create(thread_name, channel_id, auto_archive_duration, thread_type, invitable, rate_limit_per_user, cc); }); } +/** + * @brief Edit a thread + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * + * @see dpp::cluster::thread_edit + * @see https://discord.com/developers/docs/topics/threads#editing-deleting-threads + * @param t Thread to edit + * @return thread returned object on completion + * \memberof dpp::cluster + */ +auto inline co_thread_edit(const thread &t) { + return dpp::awaitable(this, [&] (auto cc) { this->thread_edit(t, cc); }); +} + /** * @brief Create a thread with a message (Discord: ID of a thread is same as message ID) * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. diff --git a/include/dpp/cluster_sync_calls.h b/include/dpp/cluster_sync_calls.h index 626b4b72f4..756026c517 100644 --- a/include/dpp/cluster_sync_calls.h +++ b/include/dpp/cluster_sync_calls.h @@ -2378,6 +2378,21 @@ thread thread_create_in_forum_sync(const std::string& thread_name, snowflake cha */ thread thread_create_sync(const std::string& thread_name, snowflake channel_id, uint16_t auto_archive_duration, channel_type thread_type, bool invitable, uint16_t rate_limit_per_user); +/** + * @brief Edit a thread + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * + * @see dpp::cluster::thread_edit + * @see https://discord.com/developers/docs/topics/threads#editing-deleting-threads + * @param t Thread to edit + * @return thread returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +thread thread_edit_sync(const thread &t); + /** * @brief Create a thread with a message (Discord: ID of a thread is same as message ID) * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. diff --git a/src/dpp/cluster/thread.cpp b/src/dpp/cluster/thread.cpp index 44b5575a4a..a07fef85ab 100644 --- a/src/dpp/cluster/thread.cpp +++ b/src/dpp/cluster/thread.cpp @@ -38,12 +38,16 @@ void cluster::threads_get_active(snowflake guild_id, command_completion_event_t if (!e.is_error()) { if (j.contains("threads")) { for (auto &curr_item: j["threads"]) { - list.threads[snowflake_not_null(&curr_item, "id")] = thread().fill_from_json(&curr_item); + list[snowflake_not_null(&curr_item, "id")].active_thread.fill_from_json(&curr_item); } } if (j.contains("members")) { for (auto &curr_item: j["members"]) { - list.thread_members[snowflake_not_null(&curr_item, "id")] = thread_member().fill_from_json(&curr_item); + snowflake thread_id = snowflake_not_null(&curr_item, "id"); + snowflake user_id = snowflake_not_null(&curr_item, "user_id"); + if (user_id == me.id) { + list[thread_id].bot_member = thread_member().fill_from_json(&curr_item); + } } } } @@ -82,7 +86,7 @@ void cluster::thread_member_get(const snowflake thread_id, const snowflake user_ } void cluster::thread_members_get(snowflake thread_id, command_completion_event_t callback) { - rest_request_list(this, API_PATH "/channels", std::to_string(thread_id), "/thread-members", m_get, "", callback); + rest_request_list(this, API_PATH "/channels", std::to_string(thread_id), "/thread-members", m_get, "", callback, "user_id"); } void cluster::thread_create_in_forum(const std::string& thread_name, snowflake channel_id, const message& msg, auto_archive_duration_t auto_archive_duration, uint16_t rate_limit_per_user, std::vector applied_tags, command_completion_event_t callback) @@ -133,6 +137,11 @@ void cluster::thread_create(const std::string& thread_name, snowflake channel_id rest_request(this, API_PATH "/channels", std::to_string(channel_id), "threads", m_post, j.dump(), callback); } +void cluster::thread_edit(const thread &t, command_completion_event_t callback) +{ + rest_request(this, API_PATH "/channels", std::to_string(t.id), "", m_patch, t.build_json(), callback); +} + void cluster::thread_create_with_message(const std::string& thread_name, snowflake channel_id, snowflake message_id, uint16_t auto_archive_duration, uint16_t rate_limit_per_user, command_completion_event_t callback) { json j({ diff --git a/src/dpp/cluster_sync_calls.cpp b/src/dpp/cluster_sync_calls.cpp index 08e4af5c1b..207a6500d2 100644 --- a/src/dpp/cluster_sync_calls.cpp +++ b/src/dpp/cluster_sync_calls.cpp @@ -645,6 +645,10 @@ thread cluster::thread_create_sync(const std::string& thread_name, snowflake cha return dpp::sync(this, static_cast(&cluster::thread_create), thread_name, channel_id, auto_archive_duration, thread_type, invitable, rate_limit_per_user); } +thread cluster::thread_edit_sync(const thread &t) { + return dpp::sync(this, static_cast(&cluster::thread_edit), t); +} + thread cluster::thread_create_with_message_sync(const std::string& thread_name, snowflake channel_id, snowflake message_id, uint16_t auto_archive_duration, uint16_t rate_limit_per_user) { return dpp::sync(this, static_cast(&cluster::thread_create_with_message), thread_name, channel_id, message_id, auto_archive_duration, rate_limit_per_user); } diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 1b93e059eb..d4393cf9c7 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -633,20 +633,6 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } set_test("RUNONCE", (runs == 1)); - bot.on_message_reaction_add([&](const dpp::message_reaction_add_t & event) { - if (event.reacting_user.id == bot.me.id && event.reacting_emoji.name == "😄") { - set_test("REACTEVENT", true); - } - }); - - bool message_edit_tested = false; - bot.on_message_update([&](const dpp::message_update_t & event) { - if (!message_edit_tested && event.msg.author == bot.me.id && event.msg.content == "test edit") { - message_edit_tested = true; - set_test("EDITEVENT", true); - } - }); - bot.on_voice_ready([&](const dpp::voice_ready_t & event) { set_test("VOICECONN", true); dpp::discord_voice_client* v = event.voice_client; @@ -710,6 +696,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b private: std::mutex mutex; bool pin_tested; + bool thread_tested; std::array files_tested; std::array files_success; dpp::snowflake channel_id; @@ -717,7 +704,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b dpp::cluster ⊥ void delete_message_if_done() { - if (files_tested == std::array{true, true, true} && pin_tested) { + if (files_tested == std::array{true, true, true} && pin_tested && thread_tested) { set_test("MESSAGEDELETE", false); bot.message_delete(message_id, channel_id, [](const dpp::confirmation_callback_t &callback) { if (!callback.is_error()) { @@ -733,6 +720,12 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b delete_message_if_done(); } + void set_thread_tested() { + assert(!thread_tested); + thread_tested = true; + delete_message_if_done(); + } + void set_file_tested(size_t index) { assert(!files_tested[index]); files_tested[index] = true; @@ -742,6 +735,28 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b delete_message_if_done(); } + void test_threads(const dpp::message &message) + { + set_test("THREAD_CREATE_MESSAGE", false); + set_test("THREAD_DELETE", false); + set_test("THREAD_DELETE_EVENT", false); + bot.thread_create_with_message("test", message.channel_id, message.id, 60, 60, [this](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock(mutex); + if (callback.is_error()) { + set_thread_tested(); + } + else { + auto thread = callback.get(); + thread_id = thread.id; + set_test("THREAD_CREATE_MESSAGE", true); + bot.channel_delete(thread.id, [this](const dpp::confirmation_callback_t &callback) { + set_test("THREAD_DELETE", !callback.is_error()); + set_thread_tested(); + }); + } + }); + } + void test_files(const dpp::message &message) { set_test("MESSAGEFILE", false); if (message.attachments.size() == 3) { @@ -806,62 +821,408 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } public: + dpp::snowflake thread_id; + message_test_helper(dpp::cluster &_bot) : bot(_bot) {} void run(const dpp::message &message) { pin_tested = false; + thread_tested = false; files_tested = {false, false, false}; files_success = {false, false, false}; channel_id = message.channel_id; message_id = message.id; test_pin(); test_files(message); + test_threads(message); } }; message_test_helper message_helper(bot); + + class thread_test_helper + { + public: + enum event_flag + { + MESSAGE_CREATE = 1 << 0, + MESSAGE_EDIT = 1 << 1, + MESSAGE_REACT = 1 << 2, + MESSAGE_REMOVE_REACT = 1 << 3, + MESSAGE_DELETE = 1 << 4, + EVENT_END = 1 << 5 + }; + private: + std::mutex mutex; + dpp::cluster ⊥ + bool edit_tested = false; + bool members_tested = false; + bool messages_tested = false; + bool events_tested = false; + uint32_t events_tested_mask = 0; + uint32_t events_to_test_mask = 0; + + void delete_if_done() + { + if (edit_tested && members_tested && messages_tested && events_tested) { + bot.channel_delete(thread_id); + } + } + + void set_events_tested() + { + if (events_tested) { + return; + } + events_tested = true; + delete_if_done(); + } + + void set_edit_tested() + { + if (edit_tested) { + return; + } + edit_tested = true; + delete_if_done(); + } + + void set_members_tested() + { + if (members_tested) { + return; + } + members_tested = true; + delete_if_done(); + } + + void set_messages_tested() + { + if (messages_tested) { + return; + } + messages_tested = true; + delete_if_done(); + } + + void set_event_tested(event_flag flag) + { + if (events_tested_mask & flag) { + return; + } + events_tested_mask |= flag; + for (uint32_t i = 1; i < EVENT_END; i <<= 1) { + if ((events_tested_mask & i) != i) + return; + } + set_events_tested(); + } + + void events_abort() + { + events_tested_mask |= ~events_to_test_mask; + for (uint32_t i = 1; i < EVENT_END; i <<= 1) { + if ((events_tested_mask & i) != i) + return; + } + set_events_tested(); + } + + public: + /** + * @Brief wrapper for set_event_tested, locking the mutex. Meant to be used from outside the class + */ + void notify_event_tested(event_flag flag) + { + std::lock_guard lock{mutex}; + + set_event_tested(flag); + } + + dpp::snowflake thread_id; + + void test_edit(const dpp::thread &thread) + { + std::lock_guard lock{mutex}; + + if (!edit_tested) { + dpp::thread edit = thread; + set_test("THREAD_EDIT", false); + set_test("THREAD_UPDATE_EVENT", false); + edit.name = "edited"; + edit.metadata.locked = true; + bot.thread_edit(edit, [this, id = edit.id](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock(mutex); + if (!callback.is_error()) { + set_test("THREAD_EDIT", true); + } + set_edit_tested(); + }); + } + } + + void test_members(const dpp::thread &thread) + { + std::lock_guard lock{mutex}; + set_test("THREAD_MEMBER_ADD", false); + set_test("THREAD_MEMBER_GET", false); + set_test("THREAD_MEMBERS_GET", false); + set_test("THREAD_MEMBER_REMOVE", false); + set_test("THREAD_MEMBERS_ADD_EVENT", false); + set_test("THREAD_MEMBERS_REMOVE_EVENT", false); + set_test("THREAD_GET_ACTIVE", false); + if (!members_tested) { + bot.thread_member_add(thread_id, TEST_USER_ID, [this](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (callback.is_error()) { + set_members_tested(); + return; + } + set_test("THREAD_MEMBER_ADD", true); + bot.thread_member_get(thread_id, TEST_USER_ID, [this](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (callback.is_error()) { + set_members_tested(); + return; + } + set_test("THREAD_MEMBER_GET", true); + bot.thread_members_get(thread_id, [this](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (callback.is_error()) { + set_members_tested(); + return; + } + const auto &members = callback.get(); + if (members.find(TEST_USER_ID) == members.end() || members.find(bot.me.id) == members.end()) { + set_members_tested(); + return; + } + set_test("THREAD_MEMBERS_GET", true); + bot.threads_get_active(TEST_GUILD_ID, [this](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (!callback.is_error()) { + const auto &threads = callback.get(); + if (auto thread_it = threads.find(thread_id); thread_it != threads.end()) { + const auto &thread = thread_it->second.active_thread; + const auto &member = thread_it->second.bot_member; + if (thread.id == thread_id && member.has_value() && member->user_id == bot.me.id) { + set_test("THREAD_GET_ACTIVE", true); + } + } + } + bot.thread_member_remove(thread_id, TEST_USER_ID, [this](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (!callback.is_error()) { + set_test("THREAD_MEMBER_REMOVE", true); + } + set_members_tested(); + }); + }); + }); + }); + }); + } + } + + void test_messages(const dpp::thread &thread) + { + std::lock_guard lock{mutex}; + set_test("THREAD_MESSAGE", false); + set_test("THREAD_MESSAGE_CREATE_EVENT", false); + set_test("THREAD_MESSAGE_EDIT_EVENT", false); + set_test("THREAD_MESSAGE_REACT_ADD_EVENT", false); + set_test("THREAD_MESSAGE_REACT_REMOVE_EVENT", false); + set_test("THREAD_MESSAGE_DELETE_EVENT", false); + events_to_test_mask |= MESSAGE_CREATE; + bot.message_create(dpp::message{"hello thread"}.set_channel_id(thread.id), [this](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (callback.is_error()) { + events_abort(); + set_messages_tested(); + return; + } + auto m = callback.get(); + m.content = "hello thread?"; + events_to_test_mask |= MESSAGE_EDIT; + bot.message_edit(m, [this, message_id = m.id](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (callback.is_error()) { + events_abort(); + set_messages_tested(); + return; + } + events_to_test_mask |= MESSAGE_REACT; + bot.message_add_reaction(message_id, thread_id, THREAD_EMOJI, [this, message_id](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (callback.is_error()) { + events_abort(); + set_messages_tested(); + return; + } + events_to_test_mask |= MESSAGE_REMOVE_REACT; + bot.message_delete_reaction(message_id, thread_id, bot.me.id, THREAD_EMOJI, [this, message_id](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (callback.is_error()) { + events_abort(); + set_messages_tested(); + return; + } + events_to_test_mask |= MESSAGE_DELETE; + bot.message_delete(message_id, thread_id, [this] (const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + set_messages_tested(); + if (callback.is_error()) { + events_abort(); + return; + } + set_test("THREAD_MESSAGE", true); + }); + }); + }); + }); + }); + } + + void confirm_message_receive() + { + std::lock_guard lock{mutex}; + } + + void run(const dpp::thread &thread) + { + thread_id = thread.id; + test_edit(thread); + test_members(thread); + test_messages(thread); + } + + thread_test_helper(dpp::cluster &bot_) : bot{bot_} + { + } + }; + + thread_test_helper thread_helper(bot); + + bot.on_thread_create([&](const dpp::thread_create_t &event) { + if (event.created.name == "thread test") { + set_test("THREAD_CREATE_EVENT", true); + thread_helper.run(event.created); + } + }); + bool message_tested = false; bot.on_message_create([&](const dpp::message_create_t & event) { - if (event.msg.author.id == bot.me.id && !message_tested) { - message_tested = true; - set_test("MESSAGERECEIVE", true); - message_helper.run(event.msg); - set_test("MESSAGESGET", false); - bot.messages_get(event.msg.channel_id, 0, event.msg.id, 0, 5, [](const dpp::confirmation_callback_t &cc){ - if (!cc.is_error()) { - dpp::message_map mm = std::get(cc.value); - if (mm.size()) { - set_test("MESSAGESGET", true); - set_test("TIMESTAMP", false); - dpp::message m = mm.begin()->second; - if (m.sent > 0) { - set_test("TIMESTAMP", true); - } else { + if (event.msg.author.id == bot.me.id) { + if (event.msg.content == "test message" && !message_tested) { + message_tested = true; + set_test("MESSAGERECEIVE", true); + message_helper.run(event.msg); + set_test("MESSAGESGET", false); + bot.messages_get(event.msg.channel_id, 0, event.msg.id, 0, 5, [](const dpp::confirmation_callback_t &cc){ + if (!cc.is_error()) { + dpp::message_map mm = std::get(cc.value); + if (mm.size()) { + set_test("MESSAGESGET", true); set_test("TIMESTAMP", false); + dpp::message m = mm.begin()->second; + if (m.sent > 0) { + set_test("TIMESTAMP", true); + } else { + set_test("TIMESTAMP", false); + } + } else { + set_test("MESSAGESGET", false); } - } else { - set_test("MESSAGESGET", false); + } else { + set_test("MESSAGESGET", false); } - } else { - set_test("MESSAGESGET", false); - } - }); - set_test("MSGCREATESEND", false); - event.send("MSGCREATESEND", [&bot, ch_id = event.msg.channel_id] (const auto& cc) { - if (!cc.is_error()) { - dpp::message m = std::get(cc.value); - if (m.channel_id == ch_id) { - set_test("MSGCREATESEND", true); + }); + set_test("MSGCREATESEND", false); + event.send("MSGCREATESEND", [&bot, ch_id = event.msg.channel_id] (const auto& cc) { + if (!cc.is_error()) { + dpp::message m = std::get(cc.value); + if (m.channel_id == ch_id) { + set_test("MSGCREATESEND", true); + } else { + bot.log(dpp::ll_debug, cc.http_info.body); + set_test("MSGCREATESEND", false); + } + bot.message_delete(m.id, m.channel_id); } else { bot.log(dpp::ll_debug, cc.http_info.body); set_test("MSGCREATESEND", false); } - bot.message_delete(m.id, m.channel_id); - } else { - bot.log(dpp::ll_debug, cc.http_info.body); - set_test("MSGCREATESEND", false); - } - }); + }); + } + if (event.msg.channel_id == thread_helper.thread_id && event.msg.content == "hello thread") { + set_test("THREAD_MESSAGE_CREATE_EVENT", true); + thread_helper.notify_event_tested(thread_test_helper::MESSAGE_CREATE); + } + } + }); + + bot.on_message_reaction_add([&](const dpp::message_reaction_add_t & event) { + if (event.reacting_user.id == bot.me.id) { + if (event.reacting_emoji.name == "😄") { + set_test("REACTEVENT", true); + } + if (event.channel_id == thread_helper.thread_id && event.reacting_emoji.name == THREAD_EMOJI) { + set_test("THREAD_MESSAGE_REACT_ADD_EVENT", true); + thread_helper.notify_event_tested(thread_test_helper::MESSAGE_REACT); + } + } + }); + + bot.on_message_reaction_remove([&](const dpp::message_reaction_remove_t & event) { + if (event.reacting_user_id == bot.me.id) { + if (event.channel_id == thread_helper.thread_id && event.reacting_emoji.name == THREAD_EMOJI) { + set_test("THREAD_MESSAGE_REACT_REMOVE_EVENT", true); + thread_helper.notify_event_tested(thread_test_helper::MESSAGE_REMOVE_REACT); + } + } + }); + + bot.on_message_delete([&](const dpp::message_delete_t & event) { + if (event.deleted->channel_id == thread_helper.thread_id) { + set_test("THREAD_MESSAGE_DELETE_EVENT", true); + thread_helper.notify_event_tested(thread_test_helper::MESSAGE_DELETE); + } + }); + + bool message_edit_tested = false; + bot.on_message_update([&](const dpp::message_update_t &event) { + if (event.msg.author == bot.me.id) { + if (event.msg.content == "test edit" && !message_edit_tested) { + message_edit_tested = true; + set_test("EDITEVENT", true); + } + if (event.msg.channel_id == thread_helper.thread_id && event.msg.content == "hello thread?") { + set_test("THREAD_MESSAGE_EDIT_EVENT", true); + thread_helper.notify_event_tested(thread_test_helper::MESSAGE_EDIT); + } + } + }); + + bot.on_thread_update([&](const dpp::thread_update_t &event) { + if (event.updating_guild->id == TEST_GUILD_ID && event.updated.id == thread_helper.thread_id && event.updated.name == "edited") { + set_test("THREAD_UPDATE_EVENT", true); + } + }); + + bot.on_thread_members_update([&](const dpp::thread_members_update_t &event) { + if (event.updating_guild->id == TEST_GUILD_ID && event.thread_id == thread_helper.thread_id) { + if (std::find_if(std::begin(event.added), std::end(event.added), is_owner) != std::end(event.added)) { + set_test("THREAD_MEMBERS_ADD_EVENT", true); + } + if (std::find_if(std::begin(event.removed_ids), std::end(event.removed_ids), is_owner) != std::end(event.removed_ids)) { + set_test("THREAD_MEMBERS_REMOVE_EVENT", true); + } + } + }); + + bot.on_thread_delete([&](const dpp::thread_delete_t &event) { + if (event.deleting_guild->id == TEST_GUILD_ID && event.deleted.id == message_helper.thread_id) { + set_test("THREAD_DELETE_EVENT", true); } }); @@ -1235,6 +1596,17 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } }); } + + set_test("THREAD_CREATE", false); + if (!offline) { + bot.thread_create("thread test", TEST_TEXT_CHANNEL_ID, 60, dpp::channel_type::CHANNEL_PUBLIC_THREAD, true, 60, [&](const dpp::confirmation_callback_t &event) { + if (!event.is_error()) { + const auto &thread = event.get(); + set_test("THREAD_CREATE", true); + } + // the thread tests are in the on_thread_create event handler + }); + } set_test("MEMBER_GET", false); if (!offline) { diff --git a/src/unittest/test.h b/src/unittest/test.h index edc060e164..331002a997 100644 --- a/src/unittest/test.h +++ b/src/unittest/test.h @@ -277,3 +277,45 @@ class message_collector : public dpp::message_collector { set_test("MSGCOLLECT", list.size() > 0); } }; + +/** + * @brief Convenience functor to get the snowflake of a certain type + */ +struct user_project_id_t { + dpp::snowflake operator()(const dpp::user &user) const noexcept { + return user.id; + } + + dpp::snowflake operator()(const dpp::guild_member &user) const noexcept { + return user.user_id; + } + + dpp::snowflake operator()(dpp::snowflake user) const noexcept { + return user; + } + + dpp::snowflake operator()(const dpp::thread_member &user) const noexcept { + return user.user_id; + } +}; + +/** + * @brief Convenience lambda to get the user snowflake of a certain user type + * @see user_project_id_t + */ +inline constexpr user_project_id_t get_user_snowflake; + +/** + * @brief Convenience lambda to check if a certain user is the owner of the test bot, mostly meant to be passed to standard algorithms + * @see get_user_snowflake + * + * @return bool whether the user is the test bot owner + */ +inline constexpr auto is_owner = [](auto &&user) noexcept { + return get_user_snowflake(user) == TEST_USER_ID; +}; + +/** + * @brief Thread emoji - https://www.compart.com/en/unicode/U+1F9F5 + */ +inline const std::string THREAD_EMOJI = "\xF0\x9F\xA7\xB5"; diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index 6313b33c37..70c9b53788 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -97,6 +97,28 @@ std::map tests = { {"GUILD_BANS_GET", {tt_online, "cluster::guild_get_bans get bans using the after-parameter", false, false}}, {"GUILD_BAN_DELETE", {tt_online, "cluster::guild_ban_delete unban the banned discord accounts", false, false}}, + {"THREAD_CREATE", {tt_online, "cluster::thread_create", false, false}}, + {"THREAD_CREATE_EVENT", {tt_online, "cluster::on_thread_create event", false, false}}, + {"THREAD_DELETE", {tt_online, "cluster::channel_delete with thread", false, false}}, + {"THREAD_DELETE_EVENT", {tt_online, "cluster::on_thread_delete event", false, false}}, + {"THREAD_EDIT", {tt_online, "cluster::thread_edit", false, false}}, + {"THREAD_UPDATE_EVENT", {tt_online, "cluster::on_thread_update event", false, false}}, + {"THREAD_MEMBER_ADD", {tt_online, "cluster::thread_member_add", false, false}}, + {"THREAD_MEMBER_GET", {tt_online, "cluster::thread_member_get", false, false}}, + {"THREAD_MEMBERS_GET", {tt_online, "cluster::thread_members_get", false, false}}, + {"THREAD_MEMBER_REMOVE", {tt_online, "cluster::thread_member_remove", false, false}}, + {"THREAD_MEMBERS_ADD_EVENT", {tt_online, "cluster::on_thread_members_update event with member addition", false, false}}, + {"THREAD_MEMBERS_REMOVE_EVENT", {tt_online, "cluster::on_thread_members_update event with member removal", false, false}}, + {"THREAD_CREATE_MESSAGE", {tt_online, "cluster::thread_create_with_message", false, false}}, + {"THREAD_GET_ACTIVE", {tt_online, "cluster::threads_get_active", false, false}}, + + {"THREAD_MESSAGE", {tt_online, "message manipulation in thread", false, false}}, + {"THREAD_MESSAGE_CREATE_EVENT", {tt_online, "cluster::on_message_create in thread", false, false}}, + {"THREAD_MESSAGE_EDIT_EVENT", {tt_online, "cluster::on_message_edit in thread", false, false}}, + {"THREAD_MESSAGE_DELETE_EVENT", {tt_online, "cluster::on_message_delete in thread", false, false}}, + {"THREAD_MESSAGE_REACT_ADD_EVENT", {tt_online, "cluster::on_reaction_add in thread", false, false}}, + {"THREAD_MESSAGE_REACT_REMOVE_EVENT", {tt_online, "cluster::on_reaction_remove in thread", false, false}}, + {"VOICE_CHANNEL_CREATE", {tt_online, "creating a voice channel", false, false}}, {"VOICE_CHANNEL_EDIT", {tt_online, "editing the created voice channel", false, false}}, {"VOICE_CHANNEL_DELETE", {tt_online, "deleting the created voice channel", false, false}}, From 0c77102c6b7b0c4d9fe04f2dd90a591f9d694bc0 Mon Sep 17 00:00:00 2001 From: Denis Ahmatovic <37641046+Andosius@users.noreply.github.com> Date: Thu, 22 Jun 2023 20:42:13 +0200 Subject: [PATCH 070/101] [vcpkg] Move misplaced compiler definitions to options and make linker option Debug-Mode dependent (#715) --- library-vcpkg/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library-vcpkg/CMakeLists.txt b/library-vcpkg/CMakeLists.txt index 6f69f5b723..ecb4e7643a 100644 --- a/library-vcpkg/CMakeLists.txt +++ b/library-vcpkg/CMakeLists.txt @@ -14,13 +14,13 @@ add_library("${PROJECT_NAME}::${LIB_NAME}" ALIAS "${LIB_NAME}") target_compile_definitions( "${LIB_NAME}" PUBLIC "DPP_BUILD" - "$<$:$<$:/sdl;/std:c++17;/Od;/DEBUG;/sdl;/MP;/DFD_SETSIZE=1024;/Zc:preprocessor>>" - "$<$:$<$:/std:c++17;/O2;/Oi;/Oy;/GL;/Gy;/sdl;/MP;/DFD_SETSIZE=1024;/Zc:preprocessor>>" ) target_compile_options( "${LIB_NAME}" PUBLIC "$<$:/bigobj>" + "$<$:$<$:/sdl;/std:c++17;/Od;/DEBUG;/sdl;/MP;/DFD_SETSIZE=1024;/Zc:preprocessor>>" + "$<$:$<$:/std:c++17;/O2;/Oi;/Oy;/GL;/Gy;/sdl;/MP;/DFD_SETSIZE=1024;/Zc:preprocessor>>" "$<$:$<$:-std=c++17;-Wall;-Wempty-body;-Wno-psabi;-Wunknown-pragmas;-Wignored-qualifiers;-Wimplicit-fallthrough;-Wmissing-field-initializers;-Wsign-compare;-Wtype-limits;-Wuninitialized;-Wshift-negative-value;-pthread;-g;-Og;-fPIC>>" "$<$:$<$:-std=c++17;-Wall;-Wempty-body;-Wno-psabi;-Wunknown-pragmas;-Wignored-qualifiers;-Wimplicit-fallthrough;-Wmissing-field-initializers;-Wsign-compare;-Wtype-limits;-Wuninitialized;-Wshift-negative-value;-pthread;-O3;-fPIC>>" ) @@ -47,7 +47,7 @@ set_target_properties( target_link_options( "${LIB_NAME}" PUBLIC - "$<$:/DEBUG>" + "$<$:$<$:/DEBUG>>" ) add_compile_definitions(HAVE_VOICE) From 88d07dabd3c32e1f3cad59750b1c41f4cb00744f Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Wed, 28 Jun 2023 06:54:12 +0000 Subject: [PATCH 071/101] add embed::set_colour(), alias of set_color with correct spelling --- doxygen-awesome-css | 2 +- include/dpp/message.h | 6 ++++++ src/dpp/message.cpp | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/doxygen-awesome-css b/doxygen-awesome-css index df83fbf22c..245c7c94c2 160000 --- a/doxygen-awesome-css +++ b/doxygen-awesome-css @@ -1 +1 @@ -Subproject commit df83fbf22cfff76b875c13d324baf584c74e96d0 +Subproject commit 245c7c94c20eac22730ef89035967f78b77bf405 diff --git a/include/dpp/message.h b/include/dpp/message.h index a12cb52a27..5f11536f98 100644 --- a/include/dpp/message.h +++ b/include/dpp/message.h @@ -670,6 +670,12 @@ struct DPP_EXPORT embed { */ embed& set_color(uint32_t col); + /** Set embed colour. Returns the embed itself so these method calls may be "chained" + * @param col The colour of the embed + * @return A reference to self + */ + embed& set_colour(uint32_t col); + /** Set embed timestamp. Returns the embed itself so these method calls may be "chained" * @param tstamp The timestamp to show in the footer, should be in UTC * @return A reference to self diff --git a/src/dpp/message.cpp b/src/dpp/message.cpp index eb776c8a65..3f4331ad05 100644 --- a/src/dpp/message.cpp +++ b/src/dpp/message.cpp @@ -724,6 +724,10 @@ embed& embed::set_color(uint32_t col) { return *this; } +embed& embed::set_colour(uint32_t col) { + return this->set_color(col); +} + embed& embed::set_url(const std::string &u) { url = u; return *this; From 7cd163d533cf9877fa5074712be99e4087946c9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 09:42:08 +0100 Subject: [PATCH 072/101] build(deps): bump doxygen-awesome-css from `245c7c9` to `df83fbf` (#720) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- doxygen-awesome-css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doxygen-awesome-css b/doxygen-awesome-css index 245c7c94c2..df83fbf22c 160000 --- a/doxygen-awesome-css +++ b/doxygen-awesome-css @@ -1 +1 @@ -Subproject commit 245c7c94c20eac22730ef89035967f78b77bf405 +Subproject commit df83fbf22cfff76b875c13d324baf584c74e96d0 From 33870f7595ffcabf7fe1b67334ac2b1826409c61 Mon Sep 17 00:00:00 2001 From: Miuna <809711+Mishura4@users.noreply.github.com> Date: Tue, 11 Jul 2023 08:40:02 -0400 Subject: [PATCH 073/101] fix: force dpp::to_hex to use std::locale::classic for formatting (#725) --- include/dpp/stringops.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/dpp/stringops.h b/include/dpp/stringops.h index bdab70bdef..2d9f23d2b8 100644 --- a/include/dpp/stringops.h +++ b/include/dpp/stringops.h @@ -190,6 +190,7 @@ template int from_string(const std::string &s) template std::string to_hex(T i) { std::stringstream stream; + stream.imbue(std::locale::classic()); stream << std::setfill('0') << std::setw(sizeof(T)*2) << std::hex << i; return stream.str(); } @@ -205,6 +206,7 @@ template std::string to_hex(T i) template std::string leading_zeroes(T i, size_t width) { std::stringstream stream; + stream.imbue(std::locale::classic()); stream << std::setfill('0') << std::setw((int)width) << std::dec << i; return stream.str(); } From 7af74b132a4ef3f5262c2860f19d014f669c3e26 Mon Sep 17 00:00:00 2001 From: Raghav Narang Date: Wed, 12 Jul 2023 14:39:04 +0530 Subject: [PATCH 074/101] [feat] add .clang-tidy for linting rules --- .clang-tidy | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .clang-tidy diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000000..b1312fbca0 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,2 @@ +# TODO: Discuss about -readability-identifier-length, -readability-avoid-const-params-in-decls +Checks: "-*,bugprone-*,cert-*,clang-analyzer-*,concurrency-*,cppcoreguidelines-*,llvm-namespace-comment,modernize-*,performance-*,portability-*,readability-*,-bugprone-implicit-widening-of-multiplication-result, -bugprone-easily-swappable-parameters,-readability-identifier-length,-portability-restrict-system-includes,-modernize-use-trailing-return-type,-cppcoreguidelines-non-private-member-variables-in-classes,-readability-avoid-const-params-in-decls" From 102bd133b72f81cc73a78e1dd250d1228a2f6614 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Wed, 12 Jul 2023 16:07:32 +0000 Subject: [PATCH 075/101] fix header, add emoji gen --- buildtools/emojis.php | 15 + include/dpp/collector.h | 33 +- include/dpp/unicode_emoji.h | 5472 +++++++++++++++++++++++++++++++++++ library/CMakeLists.txt | 6 + 4 files changed, 5510 insertions(+), 16 deletions(-) create mode 100644 buildtools/emojis.php create mode 100644 include/dpp/unicode_emoji.h diff --git a/buildtools/emojis.php b/buildtools/emojis.php new file mode 100644 index 0000000000..f68be3624d --- /dev/null +++ b/buildtools/emojis.php @@ -0,0 +1,15 @@ +$code) { + if (preg_match("/^\d+/", $name)) { + $name = "_" . $name; + } + $header .= " constexpr std::string " .$name . "(\"$code\");\n"; + } + $header .= "}\n};\n"; + file_put_contents("include/dpp/unicode_emoji.h", $header); +} diff --git a/include/dpp/collector.h b/include/dpp/collector.h index a27d0a2d7a..0bdb930758 100644 --- a/include/dpp/collector.h +++ b/include/dpp/collector.h @@ -1,22 +1,23 @@ -/* - * Discord erlpack - tidied up for D++, Craig Edwards 2021. - * - * MessagePack system dependencies modified for erlpack. - * - * Copyright (C) 2008-2010 FURUHASHI Sadayuki +/************************************************************************************ * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * D++, A Lightweight C++ library for Discord * - * http://www.apache.org/licenses/LICENSE-2.0 + * Copyright 2021 Craig Edwards and D++ contributors + * (https://github.com/brainboxdotcc/DPP/graphs/contributors) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ************************************************************************************/ #pragma once #include diff --git a/include/dpp/unicode_emoji.h b/include/dpp/unicode_emoji.h new file mode 100644 index 0000000000..31e69e641c --- /dev/null +++ b/include/dpp/unicode_emoji.h @@ -0,0 +1,5472 @@ +#pragma once + +namespace dpp { namespace unicode_emoji { + constexpr std::string _100("💯"); + constexpr std::string _1234("🔢"); + constexpr std::string soccer("⚽"); + constexpr std::string basketball("🏀"); + constexpr std::string football("🏈"); + constexpr std::string baseball("⚾"); + constexpr std::string softball("🥎"); + constexpr std::string tennis("🎾"); + constexpr std::string volleyball("🏐"); + constexpr std::string rugby_football("🏉"); + constexpr std::string flying_disc("🥏"); + constexpr std::string _8ball("🎱"); + constexpr std::string yo_yo("🪀"); + constexpr std::string ping_pong("🏓"); + constexpr std::string table_tennis("🏓"); + constexpr std::string badminton("🏸"); + constexpr std::string hockey("🏒"); + constexpr std::string field_hockey("🏑"); + constexpr std::string lacrosse("🥍"); + constexpr std::string cricket_game("🏏"); + constexpr std::string cricket_bat_ball("🏏"); + constexpr std::string boomerang("🪃"); + constexpr std::string goal("🥅"); + constexpr std::string goal_net("🥅"); + constexpr std::string golf("⛳"); + constexpr std::string kite("🪁"); + constexpr std::string playground_slide("🛝"); + constexpr std::string bow_and_arrow("🏹"); + constexpr std::string archery("🏹"); + constexpr std::string fishing_pole_and_fish("🎣"); + constexpr std::string diving_mask("🤿"); + constexpr std::string boxing_glove("🥊"); + constexpr std::string boxing_gloves("🥊"); + constexpr std::string martial_arts_uniform("🥋"); + constexpr std::string karate_uniform("🥋"); + constexpr std::string running_shirt_with_sash("🎽"); + constexpr std::string skateboard("🛹"); + constexpr std::string roller_skate("🛼"); + constexpr std::string sled("🛷"); + constexpr std::string ice_skate("⛸️"); + constexpr std::string curling_stone("🥌"); + constexpr std::string ski("🎿"); + constexpr std::string skier("⛷️"); + constexpr std::string snowboarder("🏂"); + constexpr std::string snowboarder_tone1("🏂🏻"); + constexpr std::string snowboarder_light_skin_tone("🏂🏻"); + constexpr std::string snowboarder_tone2("🏂🏼"); + constexpr std::string snowboarder_medium_light_skin_tone("🏂🏼"); + constexpr std::string snowboarder_tone3("🏂🏽"); + constexpr std::string snowboarder_medium_skin_tone("🏂🏽"); + constexpr std::string snowboarder_tone4("🏂🏾"); + constexpr std::string snowboarder_medium_dark_skin_tone("🏂🏾"); + constexpr std::string snowboarder_tone5("🏂🏿"); + constexpr std::string snowboarder_dark_skin_tone("🏂🏿"); + constexpr std::string parachute("🪂"); + constexpr std::string person_lifting_weights("🏋️"); + constexpr std::string lifter("🏋️"); + constexpr std::string weight_lifter("🏋️"); + constexpr std::string person_lifting_weights_tone1("🏋🏻"); + constexpr std::string lifter_tone1("🏋🏻"); + constexpr std::string weight_lifter_tone1("🏋🏻"); + constexpr std::string person_lifting_weights_tone2("🏋🏼"); + constexpr std::string lifter_tone2("🏋🏼"); + constexpr std::string weight_lifter_tone2("🏋🏼"); + constexpr std::string person_lifting_weights_tone3("🏋🏽"); + constexpr std::string lifter_tone3("🏋🏽"); + constexpr std::string weight_lifter_tone3("🏋🏽"); + constexpr std::string person_lifting_weights_tone4("🏋🏾"); + constexpr std::string lifter_tone4("🏋🏾"); + constexpr std::string weight_lifter_tone4("🏋🏾"); + constexpr std::string person_lifting_weights_tone5("🏋🏿"); + constexpr std::string lifter_tone5("🏋🏿"); + constexpr std::string weight_lifter_tone5("🏋🏿"); + constexpr std::string woman_lifting_weights("🏋️‍♀️"); + constexpr std::string woman_lifting_weights_tone1("🏋🏻‍♀️"); + constexpr std::string woman_lifting_weights_light_skin_tone("🏋🏻‍♀️"); + constexpr std::string woman_lifting_weights_tone2("🏋🏼‍♀️"); + constexpr std::string woman_lifting_weights_medium_light_skin_tone("🏋🏼‍♀️"); + constexpr std::string woman_lifting_weights_tone3("🏋🏽‍♀️"); + constexpr std::string woman_lifting_weights_medium_skin_tone("🏋🏽‍♀️"); + constexpr std::string woman_lifting_weights_tone4("🏋🏾‍♀️"); + constexpr std::string woman_lifting_weights_medium_dark_skin_tone("🏋🏾‍♀️"); + constexpr std::string woman_lifting_weights_tone5("🏋🏿‍♀️"); + constexpr std::string woman_lifting_weights_dark_skin_tone("🏋🏿‍♀️"); + constexpr std::string man_lifting_weights("🏋️‍♂️"); + constexpr std::string man_lifting_weights_tone1("🏋🏻‍♂️"); + constexpr std::string man_lifting_weights_light_skin_tone("🏋🏻‍♂️"); + constexpr std::string man_lifting_weights_tone2("🏋🏼‍♂️"); + constexpr std::string man_lifting_weights_medium_light_skin_tone("🏋🏼‍♂️"); + constexpr std::string man_lifting_weights_tone3("🏋🏽‍♂️"); + constexpr std::string man_lifting_weights_medium_skin_tone("🏋🏽‍♂️"); + constexpr std::string man_lifting_weights_tone4("🏋🏾‍♂️"); + constexpr std::string man_lifting_weights_medium_dark_skin_tone("🏋🏾‍♂️"); + constexpr std::string man_lifting_weights_tone5("🏋🏿‍♂️"); + constexpr std::string man_lifting_weights_dark_skin_tone("🏋🏿‍♂️"); + constexpr std::string people_wrestling("🤼"); + constexpr std::string wrestlers("🤼"); + constexpr std::string wrestling("🤼"); + constexpr std::string women_wrestling("🤼‍♀️"); + constexpr std::string men_wrestling("🤼‍♂️"); + constexpr std::string person_doing_cartwheel("🤸"); + constexpr std::string cartwheel("🤸"); + constexpr std::string person_doing_cartwheel_tone1("🤸🏻"); + constexpr std::string cartwheel_tone1("🤸🏻"); + constexpr std::string person_doing_cartwheel_tone2("🤸🏼"); + constexpr std::string cartwheel_tone2("🤸🏼"); + constexpr std::string person_doing_cartwheel_tone3("🤸🏽"); + constexpr std::string cartwheel_tone3("🤸🏽"); + constexpr std::string person_doing_cartwheel_tone4("🤸🏾"); + constexpr std::string cartwheel_tone4("🤸🏾"); + constexpr std::string person_doing_cartwheel_tone5("🤸🏿"); + constexpr std::string cartwheel_tone5("🤸🏿"); + constexpr std::string woman_cartwheeling("🤸‍♀️"); + constexpr std::string woman_cartwheeling_tone1("🤸🏻‍♀️"); + constexpr std::string woman_cartwheeling_light_skin_tone("🤸🏻‍♀️"); + constexpr std::string woman_cartwheeling_tone2("🤸🏼‍♀️"); + constexpr std::string woman_cartwheeling_medium_light_skin_tone("🤸🏼‍♀️"); + constexpr std::string woman_cartwheeling_tone3("🤸🏽‍♀️"); + constexpr std::string woman_cartwheeling_medium_skin_tone("🤸🏽‍♀️"); + constexpr std::string woman_cartwheeling_tone4("🤸🏾‍♀️"); + constexpr std::string woman_cartwheeling_medium_dark_skin_tone("🤸🏾‍♀️"); + constexpr std::string woman_cartwheeling_tone5("🤸🏿‍♀️"); + constexpr std::string woman_cartwheeling_dark_skin_tone("🤸🏿‍♀️"); + constexpr std::string man_cartwheeling("🤸‍♂️"); + constexpr std::string man_cartwheeling_tone1("🤸🏻‍♂️"); + constexpr std::string man_cartwheeling_light_skin_tone("🤸🏻‍♂️"); + constexpr std::string man_cartwheeling_tone2("🤸🏼‍♂️"); + constexpr std::string man_cartwheeling_medium_light_skin_tone("🤸🏼‍♂️"); + constexpr std::string man_cartwheeling_tone3("🤸🏽‍♂️"); + constexpr std::string man_cartwheeling_medium_skin_tone("🤸🏽‍♂️"); + constexpr std::string man_cartwheeling_tone4("🤸🏾‍♂️"); + constexpr std::string man_cartwheeling_medium_dark_skin_tone("🤸🏾‍♂️"); + constexpr std::string man_cartwheeling_tone5("🤸🏿‍♂️"); + constexpr std::string man_cartwheeling_dark_skin_tone("🤸🏿‍♂️"); + constexpr std::string person_bouncing_ball("⛹️"); + constexpr std::string basketball_player("⛹️"); + constexpr std::string person_with_ball("⛹️"); + constexpr std::string person_bouncing_ball_tone1("⛹🏻"); + constexpr std::string basketball_player_tone1("⛹🏻"); + constexpr std::string person_with_ball_tone1("⛹🏻"); + constexpr std::string person_bouncing_ball_tone2("⛹🏼"); + constexpr std::string basketball_player_tone2("⛹🏼"); + constexpr std::string person_with_ball_tone2("⛹🏼"); + constexpr std::string person_bouncing_ball_tone3("⛹🏽"); + constexpr std::string basketball_player_tone3("⛹🏽"); + constexpr std::string person_with_ball_tone3("⛹🏽"); + constexpr std::string person_bouncing_ball_tone4("⛹🏾"); + constexpr std::string basketball_player_tone4("⛹🏾"); + constexpr std::string person_with_ball_tone4("⛹🏾"); + constexpr std::string person_bouncing_ball_tone5("⛹🏿"); + constexpr std::string basketball_player_tone5("⛹🏿"); + constexpr std::string person_with_ball_tone5("⛹🏿"); + constexpr std::string woman_bouncing_ball("⛹️‍♀️"); + constexpr std::string woman_bouncing_ball_tone1("⛹🏻‍♀️"); + constexpr std::string woman_bouncing_ball_light_skin_tone("⛹🏻‍♀️"); + constexpr std::string woman_bouncing_ball_tone2("⛹🏼‍♀️"); + constexpr std::string woman_bouncing_ball_medium_light_skin_tone("⛹🏼‍♀️"); + constexpr std::string woman_bouncing_ball_tone3("⛹🏽‍♀️"); + constexpr std::string woman_bouncing_ball_medium_skin_tone("⛹🏽‍♀️"); + constexpr std::string woman_bouncing_ball_tone4("⛹🏾‍♀️"); + constexpr std::string woman_bouncing_ball_medium_dark_skin_tone("⛹🏾‍♀️"); + constexpr std::string woman_bouncing_ball_tone5("⛹🏿‍♀️"); + constexpr std::string woman_bouncing_ball_dark_skin_tone("⛹🏿‍♀️"); + constexpr std::string man_bouncing_ball("⛹️‍♂️"); + constexpr std::string man_bouncing_ball_tone1("⛹🏻‍♂️"); + constexpr std::string man_bouncing_ball_light_skin_tone("⛹🏻‍♂️"); + constexpr std::string man_bouncing_ball_tone2("⛹🏼‍♂️"); + constexpr std::string man_bouncing_ball_medium_light_skin_tone("⛹🏼‍♂️"); + constexpr std::string man_bouncing_ball_tone3("⛹🏽‍♂️"); + constexpr std::string man_bouncing_ball_medium_skin_tone("⛹🏽‍♂️"); + constexpr std::string man_bouncing_ball_tone4("⛹🏾‍♂️"); + constexpr std::string man_bouncing_ball_medium_dark_skin_tone("⛹🏾‍♂️"); + constexpr std::string man_bouncing_ball_tone5("⛹🏿‍♂️"); + constexpr std::string man_bouncing_ball_dark_skin_tone("⛹🏿‍♂️"); + constexpr std::string person_fencing("🤺"); + constexpr std::string fencer("🤺"); + constexpr std::string fencing("🤺"); + constexpr std::string person_playing_handball("🤾"); + constexpr std::string handball("🤾"); + constexpr std::string person_playing_handball_tone1("🤾🏻"); + constexpr std::string handball_tone1("🤾🏻"); + constexpr std::string person_playing_handball_tone2("🤾🏼"); + constexpr std::string handball_tone2("🤾🏼"); + constexpr std::string person_playing_handball_tone3("🤾🏽"); + constexpr std::string handball_tone3("🤾🏽"); + constexpr std::string person_playing_handball_tone4("🤾🏾"); + constexpr std::string handball_tone4("🤾🏾"); + constexpr std::string person_playing_handball_tone5("🤾🏿"); + constexpr std::string handball_tone5("🤾🏿"); + constexpr std::string woman_playing_handball("🤾‍♀️"); + constexpr std::string woman_playing_handball_tone1("🤾🏻‍♀️"); + constexpr std::string woman_playing_handball_light_skin_tone("🤾🏻‍♀️"); + constexpr std::string woman_playing_handball_tone2("🤾🏼‍♀️"); + constexpr std::string woman_playing_handball_medium_light_skin_tone("🤾🏼‍♀️"); + constexpr std::string woman_playing_handball_tone3("🤾🏽‍♀️"); + constexpr std::string woman_playing_handball_medium_skin_tone("🤾🏽‍♀️"); + constexpr std::string woman_playing_handball_tone4("🤾🏾‍♀️"); + constexpr std::string woman_playing_handball_medium_dark_skin_tone("🤾🏾‍♀️"); + constexpr std::string woman_playing_handball_tone5("🤾🏿‍♀️"); + constexpr std::string woman_playing_handball_dark_skin_tone("🤾🏿‍♀️"); + constexpr std::string man_playing_handball("🤾‍♂️"); + constexpr std::string man_playing_handball_tone1("🤾🏻‍♂️"); + constexpr std::string man_playing_handball_light_skin_tone("🤾🏻‍♂️"); + constexpr std::string man_playing_handball_tone2("🤾🏼‍♂️"); + constexpr std::string man_playing_handball_medium_light_skin_tone("🤾🏼‍♂️"); + constexpr std::string man_playing_handball_tone3("🤾🏽‍♂️"); + constexpr std::string man_playing_handball_medium_skin_tone("🤾🏽‍♂️"); + constexpr std::string man_playing_handball_tone4("🤾🏾‍♂️"); + constexpr std::string man_playing_handball_medium_dark_skin_tone("🤾🏾‍♂️"); + constexpr std::string man_playing_handball_tone5("🤾🏿‍♂️"); + constexpr std::string man_playing_handball_dark_skin_tone("🤾🏿‍♂️"); + constexpr std::string person_golfing("🏌️"); + constexpr std::string golfer("🏌️"); + constexpr std::string person_golfing_tone1("🏌🏻"); + constexpr std::string person_golfing_light_skin_tone("🏌🏻"); + constexpr std::string person_golfing_tone2("🏌🏼"); + constexpr std::string person_golfing_medium_light_skin_tone("🏌🏼"); + constexpr std::string person_golfing_tone3("🏌🏽"); + constexpr std::string person_golfing_medium_skin_tone("🏌🏽"); + constexpr std::string person_golfing_tone4("🏌🏾"); + constexpr std::string person_golfing_medium_dark_skin_tone("🏌🏾"); + constexpr std::string person_golfing_tone5("🏌🏿"); + constexpr std::string person_golfing_dark_skin_tone("🏌🏿"); + constexpr std::string woman_golfing("🏌️‍♀️"); + constexpr std::string woman_golfing_tone1("🏌🏻‍♀️"); + constexpr std::string woman_golfing_light_skin_tone("🏌🏻‍♀️"); + constexpr std::string woman_golfing_tone2("🏌🏼‍♀️"); + constexpr std::string woman_golfing_medium_light_skin_tone("🏌🏼‍♀️"); + constexpr std::string woman_golfing_tone3("🏌🏽‍♀️"); + constexpr std::string woman_golfing_medium_skin_tone("🏌🏽‍♀️"); + constexpr std::string woman_golfing_tone4("🏌🏾‍♀️"); + constexpr std::string woman_golfing_medium_dark_skin_tone("🏌🏾‍♀️"); + constexpr std::string woman_golfing_tone5("🏌🏿‍♀️"); + constexpr std::string woman_golfing_dark_skin_tone("🏌🏿‍♀️"); + constexpr std::string man_golfing("🏌️‍♂️"); + constexpr std::string man_golfing_tone1("🏌🏻‍♂️"); + constexpr std::string man_golfing_light_skin_tone("🏌🏻‍♂️"); + constexpr std::string man_golfing_tone2("🏌🏼‍♂️"); + constexpr std::string man_golfing_medium_light_skin_tone("🏌🏼‍♂️"); + constexpr std::string man_golfing_tone3("🏌🏽‍♂️"); + constexpr std::string man_golfing_medium_skin_tone("🏌🏽‍♂️"); + constexpr std::string man_golfing_tone4("🏌🏾‍♂️"); + constexpr std::string man_golfing_medium_dark_skin_tone("🏌🏾‍♂️"); + constexpr std::string man_golfing_tone5("🏌🏿‍♂️"); + constexpr std::string man_golfing_dark_skin_tone("🏌🏿‍♂️"); + constexpr std::string horse_racing("🏇"); + constexpr std::string horse_racing_tone1("🏇🏻"); + constexpr std::string horse_racing_tone2("🏇🏼"); + constexpr std::string horse_racing_tone3("🏇🏽"); + constexpr std::string horse_racing_tone4("🏇🏾"); + constexpr std::string horse_racing_tone5("🏇🏿"); + constexpr std::string person_in_lotus_position("🧘"); + constexpr std::string person_in_lotus_position_tone1("🧘🏻"); + constexpr std::string person_in_lotus_position_light_skin_tone("🧘🏻"); + constexpr std::string person_in_lotus_position_tone2("🧘🏼"); + constexpr std::string person_in_lotus_position_medium_light_skin_tone("🧘🏼"); + constexpr std::string person_in_lotus_position_tone3("🧘🏽"); + constexpr std::string person_in_lotus_position_medium_skin_tone("🧘🏽"); + constexpr std::string person_in_lotus_position_tone4("🧘🏾"); + constexpr std::string person_in_lotus_position_medium_dark_skin_tone("🧘🏾"); + constexpr std::string person_in_lotus_position_tone5("🧘🏿"); + constexpr std::string person_in_lotus_position_dark_skin_tone("🧘🏿"); + constexpr std::string woman_in_lotus_position("🧘‍♀️"); + constexpr std::string woman_in_lotus_position_tone1("🧘🏻‍♀️"); + constexpr std::string woman_in_lotus_position_light_skin_tone("🧘🏻‍♀️"); + constexpr std::string woman_in_lotus_position_tone2("🧘🏼‍♀️"); + constexpr std::string woman_in_lotus_position_medium_light_skin_tone("🧘🏼‍♀️"); + constexpr std::string woman_in_lotus_position_tone3("🧘🏽‍♀️"); + constexpr std::string woman_in_lotus_position_medium_skin_tone("🧘🏽‍♀️"); + constexpr std::string woman_in_lotus_position_tone4("🧘🏾‍♀️"); + constexpr std::string woman_in_lotus_position_medium_dark_skin_tone("🧘🏾‍♀️"); + constexpr std::string woman_in_lotus_position_tone5("🧘🏿‍♀️"); + constexpr std::string woman_in_lotus_position_dark_skin_tone("🧘🏿‍♀️"); + constexpr std::string man_in_lotus_position("🧘‍♂️"); + constexpr std::string man_in_lotus_position_tone1("🧘🏻‍♂️"); + constexpr std::string man_in_lotus_position_light_skin_tone("🧘🏻‍♂️"); + constexpr std::string man_in_lotus_position_tone2("🧘🏼‍♂️"); + constexpr std::string man_in_lotus_position_medium_light_skin_tone("🧘🏼‍♂️"); + constexpr std::string man_in_lotus_position_tone3("🧘🏽‍♂️"); + constexpr std::string man_in_lotus_position_medium_skin_tone("🧘🏽‍♂️"); + constexpr std::string man_in_lotus_position_tone4("🧘🏾‍♂️"); + constexpr std::string man_in_lotus_position_medium_dark_skin_tone("🧘🏾‍♂️"); + constexpr std::string man_in_lotus_position_tone5("🧘🏿‍♂️"); + constexpr std::string man_in_lotus_position_dark_skin_tone("🧘🏿‍♂️"); + constexpr std::string person_surfing("🏄"); + constexpr std::string surfer("🏄"); + constexpr std::string person_surfing_tone1("🏄🏻"); + constexpr std::string surfer_tone1("🏄🏻"); + constexpr std::string person_surfing_tone2("🏄🏼"); + constexpr std::string surfer_tone2("🏄🏼"); + constexpr std::string person_surfing_tone3("🏄🏽"); + constexpr std::string surfer_tone3("🏄🏽"); + constexpr std::string person_surfing_tone4("🏄🏾"); + constexpr std::string surfer_tone4("🏄🏾"); + constexpr std::string person_surfing_tone5("🏄🏿"); + constexpr std::string surfer_tone5("🏄🏿"); + constexpr std::string woman_surfing("🏄‍♀️"); + constexpr std::string woman_surfing_tone1("🏄🏻‍♀️"); + constexpr std::string woman_surfing_light_skin_tone("🏄🏻‍♀️"); + constexpr std::string woman_surfing_tone2("🏄🏼‍♀️"); + constexpr std::string woman_surfing_medium_light_skin_tone("🏄🏼‍♀️"); + constexpr std::string woman_surfing_tone3("🏄🏽‍♀️"); + constexpr std::string woman_surfing_medium_skin_tone("🏄🏽‍♀️"); + constexpr std::string woman_surfing_tone4("🏄🏾‍♀️"); + constexpr std::string woman_surfing_medium_dark_skin_tone("🏄🏾‍♀️"); + constexpr std::string woman_surfing_tone5("🏄🏿‍♀️"); + constexpr std::string woman_surfing_dark_skin_tone("🏄🏿‍♀️"); + constexpr std::string man_surfing("🏄‍♂️"); + constexpr std::string man_surfing_tone1("🏄🏻‍♂️"); + constexpr std::string man_surfing_light_skin_tone("🏄🏻‍♂️"); + constexpr std::string man_surfing_tone2("🏄🏼‍♂️"); + constexpr std::string man_surfing_medium_light_skin_tone("🏄🏼‍♂️"); + constexpr std::string man_surfing_tone3("🏄🏽‍♂️"); + constexpr std::string man_surfing_medium_skin_tone("🏄🏽‍♂️"); + constexpr std::string man_surfing_tone4("🏄🏾‍♂️"); + constexpr std::string man_surfing_medium_dark_skin_tone("🏄🏾‍♂️"); + constexpr std::string man_surfing_tone5("🏄🏿‍♂️"); + constexpr std::string man_surfing_dark_skin_tone("🏄🏿‍♂️"); + constexpr std::string person_swimming("🏊"); + constexpr std::string swimmer("🏊"); + constexpr std::string person_swimming_tone1("🏊🏻"); + constexpr std::string swimmer_tone1("🏊🏻"); + constexpr std::string person_swimming_tone2("🏊🏼"); + constexpr std::string swimmer_tone2("🏊🏼"); + constexpr std::string person_swimming_tone3("🏊🏽"); + constexpr std::string swimmer_tone3("🏊🏽"); + constexpr std::string person_swimming_tone4("🏊🏾"); + constexpr std::string swimmer_tone4("🏊🏾"); + constexpr std::string person_swimming_tone5("🏊🏿"); + constexpr std::string swimmer_tone5("🏊🏿"); + constexpr std::string woman_swimming("🏊‍♀️"); + constexpr std::string woman_swimming_tone1("🏊🏻‍♀️"); + constexpr std::string woman_swimming_light_skin_tone("🏊🏻‍♀️"); + constexpr std::string woman_swimming_tone2("🏊🏼‍♀️"); + constexpr std::string woman_swimming_medium_light_skin_tone("🏊🏼‍♀️"); + constexpr std::string woman_swimming_tone3("🏊🏽‍♀️"); + constexpr std::string woman_swimming_medium_skin_tone("🏊🏽‍♀️"); + constexpr std::string woman_swimming_tone4("🏊🏾‍♀️"); + constexpr std::string woman_swimming_medium_dark_skin_tone("🏊🏾‍♀️"); + constexpr std::string woman_swimming_tone5("🏊🏿‍♀️"); + constexpr std::string woman_swimming_dark_skin_tone("🏊🏿‍♀️"); + constexpr std::string man_swimming("🏊‍♂️"); + constexpr std::string man_swimming_tone1("🏊🏻‍♂️"); + constexpr std::string man_swimming_light_skin_tone("🏊🏻‍♂️"); + constexpr std::string man_swimming_tone2("🏊🏼‍♂️"); + constexpr std::string man_swimming_medium_light_skin_tone("🏊🏼‍♂️"); + constexpr std::string man_swimming_tone3("🏊🏽‍♂️"); + constexpr std::string man_swimming_medium_skin_tone("🏊🏽‍♂️"); + constexpr std::string man_swimming_tone4("🏊🏾‍♂️"); + constexpr std::string man_swimming_medium_dark_skin_tone("🏊🏾‍♂️"); + constexpr std::string man_swimming_tone5("🏊🏿‍♂️"); + constexpr std::string man_swimming_dark_skin_tone("🏊🏿‍♂️"); + constexpr std::string person_playing_water_polo("🤽"); + constexpr std::string water_polo("🤽"); + constexpr std::string person_playing_water_polo_tone1("🤽🏻"); + constexpr std::string water_polo_tone1("🤽🏻"); + constexpr std::string person_playing_water_polo_tone2("🤽🏼"); + constexpr std::string water_polo_tone2("🤽🏼"); + constexpr std::string person_playing_water_polo_tone3("🤽🏽"); + constexpr std::string water_polo_tone3("🤽🏽"); + constexpr std::string person_playing_water_polo_tone4("🤽🏾"); + constexpr std::string water_polo_tone4("🤽🏾"); + constexpr std::string person_playing_water_polo_tone5("🤽🏿"); + constexpr std::string water_polo_tone5("🤽🏿"); + constexpr std::string woman_playing_water_polo("🤽‍♀️"); + constexpr std::string woman_playing_water_polo_tone1("🤽🏻‍♀️"); + constexpr std::string woman_playing_water_polo_light_skin_tone("🤽🏻‍♀️"); + constexpr std::string woman_playing_water_polo_tone2("🤽🏼‍♀️"); + constexpr std::string woman_playing_water_polo_medium_light_skin_tone("🤽🏼‍♀️"); + constexpr std::string woman_playing_water_polo_tone3("🤽🏽‍♀️"); + constexpr std::string woman_playing_water_polo_medium_skin_tone("🤽🏽‍♀️"); + constexpr std::string woman_playing_water_polo_tone4("🤽🏾‍♀️"); + constexpr std::string woman_playing_water_polo_medium_dark_skin_tone("🤽🏾‍♀️"); + constexpr std::string woman_playing_water_polo_tone5("🤽🏿‍♀️"); + constexpr std::string woman_playing_water_polo_dark_skin_tone("🤽🏿‍♀️"); + constexpr std::string man_playing_water_polo("🤽‍♂️"); + constexpr std::string man_playing_water_polo_tone1("🤽🏻‍♂️"); + constexpr std::string man_playing_water_polo_light_skin_tone("🤽🏻‍♂️"); + constexpr std::string man_playing_water_polo_tone2("🤽🏼‍♂️"); + constexpr std::string man_playing_water_polo_medium_light_skin_tone("🤽🏼‍♂️"); + constexpr std::string man_playing_water_polo_tone3("🤽🏽‍♂️"); + constexpr std::string man_playing_water_polo_medium_skin_tone("🤽🏽‍♂️"); + constexpr std::string man_playing_water_polo_tone4("🤽🏾‍♂️"); + constexpr std::string man_playing_water_polo_medium_dark_skin_tone("🤽🏾‍♂️"); + constexpr std::string man_playing_water_polo_tone5("🤽🏿‍♂️"); + constexpr std::string man_playing_water_polo_dark_skin_tone("🤽🏿‍♂️"); + constexpr std::string person_rowing_boat("🚣"); + constexpr std::string rowboat("🚣"); + constexpr std::string person_rowing_boat_tone1("🚣🏻"); + constexpr std::string rowboat_tone1("🚣🏻"); + constexpr std::string person_rowing_boat_tone2("🚣🏼"); + constexpr std::string rowboat_tone2("🚣🏼"); + constexpr std::string person_rowing_boat_tone3("🚣🏽"); + constexpr std::string rowboat_tone3("🚣🏽"); + constexpr std::string person_rowing_boat_tone4("🚣🏾"); + constexpr std::string rowboat_tone4("🚣🏾"); + constexpr std::string person_rowing_boat_tone5("🚣🏿"); + constexpr std::string rowboat_tone5("🚣🏿"); + constexpr std::string woman_rowing_boat("🚣‍♀️"); + constexpr std::string woman_rowing_boat_tone1("🚣🏻‍♀️"); + constexpr std::string woman_rowing_boat_light_skin_tone("🚣🏻‍♀️"); + constexpr std::string woman_rowing_boat_tone2("🚣🏼‍♀️"); + constexpr std::string woman_rowing_boat_medium_light_skin_tone("🚣🏼‍♀️"); + constexpr std::string woman_rowing_boat_tone3("🚣🏽‍♀️"); + constexpr std::string woman_rowing_boat_medium_skin_tone("🚣🏽‍♀️"); + constexpr std::string woman_rowing_boat_tone4("🚣🏾‍♀️"); + constexpr std::string woman_rowing_boat_medium_dark_skin_tone("🚣🏾‍♀️"); + constexpr std::string woman_rowing_boat_tone5("🚣🏿‍♀️"); + constexpr std::string woman_rowing_boat_dark_skin_tone("🚣🏿‍♀️"); + constexpr std::string man_rowing_boat("🚣‍♂️"); + constexpr std::string man_rowing_boat_tone1("🚣🏻‍♂️"); + constexpr std::string man_rowing_boat_light_skin_tone("🚣🏻‍♂️"); + constexpr std::string man_rowing_boat_tone2("🚣🏼‍♂️"); + constexpr std::string man_rowing_boat_medium_light_skin_tone("🚣🏼‍♂️"); + constexpr std::string man_rowing_boat_tone3("🚣🏽‍♂️"); + constexpr std::string man_rowing_boat_medium_skin_tone("🚣🏽‍♂️"); + constexpr std::string man_rowing_boat_tone4("🚣🏾‍♂️"); + constexpr std::string man_rowing_boat_medium_dark_skin_tone("🚣🏾‍♂️"); + constexpr std::string man_rowing_boat_tone5("🚣🏿‍♂️"); + constexpr std::string man_rowing_boat_dark_skin_tone("🚣🏿‍♂️"); + constexpr std::string person_climbing("🧗"); + constexpr std::string person_climbing_tone1("🧗🏻"); + constexpr std::string person_climbing_light_skin_tone("🧗🏻"); + constexpr std::string person_climbing_tone2("🧗🏼"); + constexpr std::string person_climbing_medium_light_skin_tone("🧗🏼"); + constexpr std::string person_climbing_tone3("🧗🏽"); + constexpr std::string person_climbing_medium_skin_tone("🧗🏽"); + constexpr std::string person_climbing_tone4("🧗🏾"); + constexpr std::string person_climbing_medium_dark_skin_tone("🧗🏾"); + constexpr std::string person_climbing_tone5("🧗🏿"); + constexpr std::string person_climbing_dark_skin_tone("🧗🏿"); + constexpr std::string woman_climbing("🧗‍♀️"); + constexpr std::string woman_climbing_tone1("🧗🏻‍♀️"); + constexpr std::string woman_climbing_light_skin_tone("🧗🏻‍♀️"); + constexpr std::string woman_climbing_tone2("🧗🏼‍♀️"); + constexpr std::string woman_climbing_medium_light_skin_tone("🧗🏼‍♀️"); + constexpr std::string woman_climbing_tone3("🧗🏽‍♀️"); + constexpr std::string woman_climbing_medium_skin_tone("🧗🏽‍♀️"); + constexpr std::string woman_climbing_tone4("🧗🏾‍♀️"); + constexpr std::string woman_climbing_medium_dark_skin_tone("🧗🏾‍♀️"); + constexpr std::string woman_climbing_tone5("🧗🏿‍♀️"); + constexpr std::string woman_climbing_dark_skin_tone("🧗🏿‍♀️"); + constexpr std::string man_climbing("🧗‍♂️"); + constexpr std::string man_climbing_tone1("🧗🏻‍♂️"); + constexpr std::string man_climbing_light_skin_tone("🧗🏻‍♂️"); + constexpr std::string man_climbing_tone2("🧗🏼‍♂️"); + constexpr std::string man_climbing_medium_light_skin_tone("🧗🏼‍♂️"); + constexpr std::string man_climbing_tone3("🧗🏽‍♂️"); + constexpr std::string man_climbing_medium_skin_tone("🧗🏽‍♂️"); + constexpr std::string man_climbing_tone4("🧗🏾‍♂️"); + constexpr std::string man_climbing_medium_dark_skin_tone("🧗🏾‍♂️"); + constexpr std::string man_climbing_tone5("🧗🏿‍♂️"); + constexpr std::string man_climbing_dark_skin_tone("🧗🏿‍♂️"); + constexpr std::string person_mountain_biking("🚵"); + constexpr std::string mountain_bicyclist("🚵"); + constexpr std::string person_mountain_biking_tone1("🚵🏻"); + constexpr std::string mountain_bicyclist_tone1("🚵🏻"); + constexpr std::string person_mountain_biking_tone2("🚵🏼"); + constexpr std::string mountain_bicyclist_tone2("🚵🏼"); + constexpr std::string person_mountain_biking_tone3("🚵🏽"); + constexpr std::string mountain_bicyclist_tone3("🚵🏽"); + constexpr std::string person_mountain_biking_tone4("🚵🏾"); + constexpr std::string mountain_bicyclist_tone4("🚵🏾"); + constexpr std::string person_mountain_biking_tone5("🚵🏿"); + constexpr std::string mountain_bicyclist_tone5("🚵🏿"); + constexpr std::string woman_mountain_biking("🚵‍♀️"); + constexpr std::string woman_mountain_biking_tone1("🚵🏻‍♀️"); + constexpr std::string woman_mountain_biking_light_skin_tone("🚵🏻‍♀️"); + constexpr std::string woman_mountain_biking_tone2("🚵🏼‍♀️"); + constexpr std::string woman_mountain_biking_medium_light_skin_tone("🚵🏼‍♀️"); + constexpr std::string woman_mountain_biking_tone3("🚵🏽‍♀️"); + constexpr std::string woman_mountain_biking_medium_skin_tone("🚵🏽‍♀️"); + constexpr std::string woman_mountain_biking_tone4("🚵🏾‍♀️"); + constexpr std::string woman_mountain_biking_medium_dark_skin_tone("🚵🏾‍♀️"); + constexpr std::string woman_mountain_biking_tone5("🚵🏿‍♀️"); + constexpr std::string woman_mountain_biking_dark_skin_tone("🚵🏿‍♀️"); + constexpr std::string man_mountain_biking("🚵‍♂️"); + constexpr std::string man_mountain_biking_tone1("🚵🏻‍♂️"); + constexpr std::string man_mountain_biking_light_skin_tone("🚵🏻‍♂️"); + constexpr std::string man_mountain_biking_tone2("🚵🏼‍♂️"); + constexpr std::string man_mountain_biking_medium_light_skin_tone("🚵🏼‍♂️"); + constexpr std::string man_mountain_biking_tone3("🚵🏽‍♂️"); + constexpr std::string man_mountain_biking_medium_skin_tone("🚵🏽‍♂️"); + constexpr std::string man_mountain_biking_tone4("🚵🏾‍♂️"); + constexpr std::string man_mountain_biking_medium_dark_skin_tone("🚵🏾‍♂️"); + constexpr std::string man_mountain_biking_tone5("🚵🏿‍♂️"); + constexpr std::string man_mountain_biking_dark_skin_tone("🚵🏿‍♂️"); + constexpr std::string person_biking("🚴"); + constexpr std::string bicyclist("🚴"); + constexpr std::string person_biking_tone1("🚴🏻"); + constexpr std::string bicyclist_tone1("🚴🏻"); + constexpr std::string person_biking_tone2("🚴🏼"); + constexpr std::string bicyclist_tone2("🚴🏼"); + constexpr std::string person_biking_tone3("🚴🏽"); + constexpr std::string bicyclist_tone3("🚴🏽"); + constexpr std::string person_biking_tone4("🚴🏾"); + constexpr std::string bicyclist_tone4("🚴🏾"); + constexpr std::string person_biking_tone5("🚴🏿"); + constexpr std::string bicyclist_tone5("🚴🏿"); + constexpr std::string woman_biking("🚴‍♀️"); + constexpr std::string woman_biking_tone1("🚴🏻‍♀️"); + constexpr std::string woman_biking_light_skin_tone("🚴🏻‍♀️"); + constexpr std::string woman_biking_tone2("🚴🏼‍♀️"); + constexpr std::string woman_biking_medium_light_skin_tone("🚴🏼‍♀️"); + constexpr std::string woman_biking_tone3("🚴🏽‍♀️"); + constexpr std::string woman_biking_medium_skin_tone("🚴🏽‍♀️"); + constexpr std::string woman_biking_tone4("🚴🏾‍♀️"); + constexpr std::string woman_biking_medium_dark_skin_tone("🚴🏾‍♀️"); + constexpr std::string woman_biking_tone5("🚴🏿‍♀️"); + constexpr std::string woman_biking_dark_skin_tone("🚴🏿‍♀️"); + constexpr std::string man_biking("🚴‍♂️"); + constexpr std::string man_biking_tone1("🚴🏻‍♂️"); + constexpr std::string man_biking_light_skin_tone("🚴🏻‍♂️"); + constexpr std::string man_biking_tone2("🚴🏼‍♂️"); + constexpr std::string man_biking_medium_light_skin_tone("🚴🏼‍♂️"); + constexpr std::string man_biking_tone3("🚴🏽‍♂️"); + constexpr std::string man_biking_medium_skin_tone("🚴🏽‍♂️"); + constexpr std::string man_biking_tone4("🚴🏾‍♂️"); + constexpr std::string man_biking_medium_dark_skin_tone("🚴🏾‍♂️"); + constexpr std::string man_biking_tone5("🚴🏿‍♂️"); + constexpr std::string man_biking_dark_skin_tone("🚴🏿‍♂️"); + constexpr std::string trophy("🏆"); + constexpr std::string first_place("🥇"); + constexpr std::string first_place_medal("🥇"); + constexpr std::string second_place("🥈"); + constexpr std::string second_place_medal("🥈"); + constexpr std::string third_place("🥉"); + constexpr std::string third_place_medal("🥉"); + constexpr std::string medal("🏅"); + constexpr std::string sports_medal("🏅"); + constexpr std::string military_medal("🎖️"); + constexpr std::string rosette("🏵️"); + constexpr std::string reminder_ribbon("🎗️"); + constexpr std::string ticket("🎫"); + constexpr std::string tickets("🎟️"); + constexpr std::string admission_tickets("🎟️"); + constexpr std::string circus_tent("🎪"); + constexpr std::string person_juggling("🤹"); + constexpr std::string juggling("🤹"); + constexpr std::string juggler("🤹"); + constexpr std::string person_juggling_tone1("🤹🏻"); + constexpr std::string juggling_tone1("🤹🏻"); + constexpr std::string juggler_tone1("🤹🏻"); + constexpr std::string person_juggling_tone2("🤹🏼"); + constexpr std::string juggling_tone2("🤹🏼"); + constexpr std::string juggler_tone2("🤹🏼"); + constexpr std::string person_juggling_tone3("🤹🏽"); + constexpr std::string juggling_tone3("🤹🏽"); + constexpr std::string juggler_tone3("🤹🏽"); + constexpr std::string person_juggling_tone4("🤹🏾"); + constexpr std::string juggling_tone4("🤹🏾"); + constexpr std::string juggler_tone4("🤹🏾"); + constexpr std::string person_juggling_tone5("🤹🏿"); + constexpr std::string juggling_tone5("🤹🏿"); + constexpr std::string juggler_tone5("🤹🏿"); + constexpr std::string woman_juggling("🤹‍♀️"); + constexpr std::string woman_juggling_tone1("🤹🏻‍♀️"); + constexpr std::string woman_juggling_light_skin_tone("🤹🏻‍♀️"); + constexpr std::string woman_juggling_tone2("🤹🏼‍♀️"); + constexpr std::string woman_juggling_medium_light_skin_tone("🤹🏼‍♀️"); + constexpr std::string woman_juggling_tone3("🤹🏽‍♀️"); + constexpr std::string woman_juggling_medium_skin_tone("🤹🏽‍♀️"); + constexpr std::string woman_juggling_tone4("🤹🏾‍♀️"); + constexpr std::string woman_juggling_medium_dark_skin_tone("🤹🏾‍♀️"); + constexpr std::string woman_juggling_tone5("🤹🏿‍♀️"); + constexpr std::string woman_juggling_dark_skin_tone("🤹🏿‍♀️"); + constexpr std::string man_juggling("🤹‍♂️"); + constexpr std::string man_juggling_tone1("🤹🏻‍♂️"); + constexpr std::string man_juggling_light_skin_tone("🤹🏻‍♂️"); + constexpr std::string man_juggling_tone2("🤹🏼‍♂️"); + constexpr std::string man_juggling_medium_light_skin_tone("🤹🏼‍♂️"); + constexpr std::string man_juggling_tone3("🤹🏽‍♂️"); + constexpr std::string man_juggling_medium_skin_tone("🤹🏽‍♂️"); + constexpr std::string man_juggling_tone4("🤹🏾‍♂️"); + constexpr std::string man_juggling_medium_dark_skin_tone("🤹🏾‍♂️"); + constexpr std::string man_juggling_tone5("🤹🏿‍♂️"); + constexpr std::string man_juggling_dark_skin_tone("🤹🏿‍♂️"); + constexpr std::string performing_arts("🎭"); + constexpr std::string ballet_shoes("🩰"); + constexpr std::string art("🎨"); + constexpr std::string clapper("🎬"); + constexpr std::string microphone("🎤"); + constexpr std::string headphones("🎧"); + constexpr std::string musical_score("🎼"); + constexpr std::string musical_keyboard("🎹"); + constexpr std::string drum("🥁"); + constexpr std::string drum_with_drumsticks("🥁"); + constexpr std::string long_drum("🪘"); + constexpr std::string saxophone("🎷"); + constexpr std::string trumpet("🎺"); + constexpr std::string accordion("🪗"); + constexpr std::string guitar("🎸"); + constexpr std::string banjo("🪕"); + constexpr std::string violin("🎻"); + constexpr std::string game_die("🎲"); + constexpr std::string chess_pawn("♟️"); + constexpr std::string dart("🎯"); + constexpr std::string bowling("🎳"); + constexpr std::string video_game("🎮"); + constexpr std::string slot_machine("🎰"); + constexpr std::string jigsaw("🧩"); + constexpr std::string flag_white("🏳️"); + constexpr std::string flag_black("🏴"); + constexpr std::string checkered_flag("🏁"); + constexpr std::string triangular_flag_on_post("🚩"); + constexpr std::string rainbow_flag("🏳️‍🌈"); + constexpr std::string gay_pride_flag("🏳️‍🌈"); + constexpr std::string transgender_flag("🏳️‍⚧️"); + constexpr std::string pirate_flag("🏴‍☠️"); + constexpr std::string flag_af("🇦🇫"); + constexpr std::string flag_ax("🇦🇽"); + constexpr std::string flag_al("🇦🇱"); + constexpr std::string flag_dz("🇩🇿"); + constexpr std::string flag_as("🇦🇸"); + constexpr std::string flag_ad("🇦🇩"); + constexpr std::string flag_ao("🇦🇴"); + constexpr std::string flag_ai("🇦🇮"); + constexpr std::string flag_aq("🇦🇶"); + constexpr std::string flag_ag("🇦🇬"); + constexpr std::string flag_ar("🇦🇷"); + constexpr std::string flag_am("🇦🇲"); + constexpr std::string flag_aw("🇦🇼"); + constexpr std::string flag_au("🇦🇺"); + constexpr std::string flag_at("🇦🇹"); + constexpr std::string flag_az("🇦🇿"); + constexpr std::string flag_bs("🇧🇸"); + constexpr std::string flag_bh("🇧🇭"); + constexpr std::string flag_bd("🇧🇩"); + constexpr std::string flag_bb("🇧🇧"); + constexpr std::string flag_by("🇧🇾"); + constexpr std::string flag_be("🇧🇪"); + constexpr std::string flag_bz("🇧🇿"); + constexpr std::string flag_bj("🇧🇯"); + constexpr std::string flag_bm("🇧🇲"); + constexpr std::string flag_bt("🇧🇹"); + constexpr std::string flag_bo("🇧🇴"); + constexpr std::string flag_ba("🇧🇦"); + constexpr std::string flag_bw("🇧🇼"); + constexpr std::string flag_br("🇧🇷"); + constexpr std::string flag_io("🇮🇴"); + constexpr std::string flag_vg("🇻🇬"); + constexpr std::string flag_bn("🇧🇳"); + constexpr std::string flag_bg("🇧🇬"); + constexpr std::string flag_bf("🇧🇫"); + constexpr std::string flag_bi("🇧🇮"); + constexpr std::string flag_kh("🇰🇭"); + constexpr std::string flag_cm("🇨🇲"); + constexpr std::string flag_ca("🇨🇦"); + constexpr std::string flag_ic("🇮🇨"); + constexpr std::string flag_cv("🇨🇻"); + constexpr std::string flag_bq("🇧🇶"); + constexpr std::string flag_ky("🇰🇾"); + constexpr std::string flag_cf("🇨🇫"); + constexpr std::string flag_td("🇹🇩"); + constexpr std::string flag_cl("🇨🇱"); + constexpr std::string flag_cn("🇨🇳"); + constexpr std::string flag_cx("🇨🇽"); + constexpr std::string flag_cc("🇨🇨"); + constexpr std::string flag_co("🇨🇴"); + constexpr std::string flag_km("🇰🇲"); + constexpr std::string flag_cg("🇨🇬"); + constexpr std::string flag_cd("🇨🇩"); + constexpr std::string flag_ck("🇨🇰"); + constexpr std::string flag_cr("🇨🇷"); + constexpr std::string flag_ci("🇨🇮"); + constexpr std::string flag_hr("🇭🇷"); + constexpr std::string flag_cu("🇨🇺"); + constexpr std::string flag_cw("🇨🇼"); + constexpr std::string flag_cy("🇨🇾"); + constexpr std::string flag_cz("🇨🇿"); + constexpr std::string flag_dk("🇩🇰"); + constexpr std::string flag_dj("🇩🇯"); + constexpr std::string flag_dm("🇩🇲"); + constexpr std::string flag_do("🇩🇴"); + constexpr std::string flag_ec("🇪🇨"); + constexpr std::string flag_eg("🇪🇬"); + constexpr std::string flag_sv("🇸🇻"); + constexpr std::string flag_gq("🇬🇶"); + constexpr std::string flag_er("🇪🇷"); + constexpr std::string flag_ee("🇪🇪"); + constexpr std::string flag_et("🇪🇹"); + constexpr std::string flag_eu("🇪🇺"); + constexpr std::string flag_fk("🇫🇰"); + constexpr std::string flag_fo("🇫🇴"); + constexpr std::string flag_fj("🇫🇯"); + constexpr std::string flag_fi("🇫🇮"); + constexpr std::string flag_fr("🇫🇷"); + constexpr std::string flag_gf("🇬🇫"); + constexpr std::string flag_pf("🇵🇫"); + constexpr std::string flag_tf("🇹🇫"); + constexpr std::string flag_ga("🇬🇦"); + constexpr std::string flag_gm("🇬🇲"); + constexpr std::string flag_ge("🇬🇪"); + constexpr std::string flag_de("🇩🇪"); + constexpr std::string flag_gh("🇬🇭"); + constexpr std::string flag_gi("🇬🇮"); + constexpr std::string flag_gr("🇬🇷"); + constexpr std::string flag_gl("🇬🇱"); + constexpr std::string flag_gd("🇬🇩"); + constexpr std::string flag_gp("🇬🇵"); + constexpr std::string flag_gu("🇬🇺"); + constexpr std::string flag_gt("🇬🇹"); + constexpr std::string flag_gg("🇬🇬"); + constexpr std::string flag_gn("🇬🇳"); + constexpr std::string flag_gw("🇬🇼"); + constexpr std::string flag_gy("🇬🇾"); + constexpr std::string flag_ht("🇭🇹"); + constexpr std::string flag_hn("🇭🇳"); + constexpr std::string flag_hk("🇭🇰"); + constexpr std::string flag_hu("🇭🇺"); + constexpr std::string flag_is("🇮🇸"); + constexpr std::string flag_in("🇮🇳"); + constexpr std::string flag_id("🇮🇩"); + constexpr std::string flag_ir("🇮🇷"); + constexpr std::string flag_iq("🇮🇶"); + constexpr std::string flag_ie("🇮🇪"); + constexpr std::string flag_im("🇮🇲"); + constexpr std::string flag_il("🇮🇱"); + constexpr std::string flag_it("🇮🇹"); + constexpr std::string flag_jm("🇯🇲"); + constexpr std::string flag_jp("🇯🇵"); + constexpr std::string crossed_flags("🎌"); + constexpr std::string flag_je("🇯🇪"); + constexpr std::string flag_jo("🇯🇴"); + constexpr std::string flag_kz("🇰🇿"); + constexpr std::string flag_ke("🇰🇪"); + constexpr std::string flag_ki("🇰🇮"); + constexpr std::string flag_xk("🇽🇰"); + constexpr std::string flag_kw("🇰🇼"); + constexpr std::string flag_kg("🇰🇬"); + constexpr std::string flag_la("🇱🇦"); + constexpr std::string flag_lv("🇱🇻"); + constexpr std::string flag_lb("🇱🇧"); + constexpr std::string flag_ls("🇱🇸"); + constexpr std::string flag_lr("🇱🇷"); + constexpr std::string flag_ly("🇱🇾"); + constexpr std::string flag_li("🇱🇮"); + constexpr std::string flag_lt("🇱🇹"); + constexpr std::string flag_lu("🇱🇺"); + constexpr std::string flag_mo("🇲🇴"); + constexpr std::string flag_mk("🇲🇰"); + constexpr std::string flag_mg("🇲🇬"); + constexpr std::string flag_mw("🇲🇼"); + constexpr std::string flag_my("🇲🇾"); + constexpr std::string flag_mv("🇲🇻"); + constexpr std::string flag_ml("🇲🇱"); + constexpr std::string flag_mt("🇲🇹"); + constexpr std::string flag_mh("🇲🇭"); + constexpr std::string flag_mq("🇲🇶"); + constexpr std::string flag_mr("🇲🇷"); + constexpr std::string flag_mu("🇲🇺"); + constexpr std::string flag_yt("🇾🇹"); + constexpr std::string flag_mx("🇲🇽"); + constexpr std::string flag_fm("🇫🇲"); + constexpr std::string flag_md("🇲🇩"); + constexpr std::string flag_mc("🇲🇨"); + constexpr std::string flag_mn("🇲🇳"); + constexpr std::string flag_me("🇲🇪"); + constexpr std::string flag_ms("🇲🇸"); + constexpr std::string flag_ma("🇲🇦"); + constexpr std::string flag_mz("🇲🇿"); + constexpr std::string flag_mm("🇲🇲"); + constexpr std::string flag_na("🇳🇦"); + constexpr std::string flag_nr("🇳🇷"); + constexpr std::string flag_np("🇳🇵"); + constexpr std::string flag_nl("🇳🇱"); + constexpr std::string flag_nc("🇳🇨"); + constexpr std::string flag_nz("🇳🇿"); + constexpr std::string flag_ni("🇳🇮"); + constexpr std::string flag_ne("🇳🇪"); + constexpr std::string flag_ng("🇳🇬"); + constexpr std::string flag_nu("🇳🇺"); + constexpr std::string flag_nf("🇳🇫"); + constexpr std::string flag_kp("🇰🇵"); + constexpr std::string flag_mp("🇲🇵"); + constexpr std::string flag_no("🇳🇴"); + constexpr std::string flag_om("🇴🇲"); + constexpr std::string flag_pk("🇵🇰"); + constexpr std::string flag_pw("🇵🇼"); + constexpr std::string flag_ps("🇵🇸"); + constexpr std::string flag_pa("🇵🇦"); + constexpr std::string flag_pg("🇵🇬"); + constexpr std::string flag_py("🇵🇾"); + constexpr std::string flag_pe("🇵🇪"); + constexpr std::string flag_ph("🇵🇭"); + constexpr std::string flag_pn("🇵🇳"); + constexpr std::string flag_pl("🇵🇱"); + constexpr std::string flag_pt("🇵🇹"); + constexpr std::string flag_pr("🇵🇷"); + constexpr std::string flag_qa("🇶🇦"); + constexpr std::string flag_re("🇷🇪"); + constexpr std::string flag_ro("🇷🇴"); + constexpr std::string flag_ru("🇷🇺"); + constexpr std::string flag_rw("🇷🇼"); + constexpr std::string flag_ws("🇼🇸"); + constexpr std::string flag_sm("🇸🇲"); + constexpr std::string flag_st("🇸🇹"); + constexpr std::string flag_sa("🇸🇦"); + constexpr std::string flag_sn("🇸🇳"); + constexpr std::string flag_rs("🇷🇸"); + constexpr std::string flag_sc("🇸🇨"); + constexpr std::string flag_sl("🇸🇱"); + constexpr std::string flag_sg("🇸🇬"); + constexpr std::string flag_sx("🇸🇽"); + constexpr std::string flag_sk("🇸🇰"); + constexpr std::string flag_si("🇸🇮"); + constexpr std::string flag_gs("🇬🇸"); + constexpr std::string flag_sb("🇸🇧"); + constexpr std::string flag_so("🇸🇴"); + constexpr std::string flag_za("🇿🇦"); + constexpr std::string flag_kr("🇰🇷"); + constexpr std::string flag_ss("🇸🇸"); + constexpr std::string flag_es("🇪🇸"); + constexpr std::string flag_lk("🇱🇰"); + constexpr std::string flag_bl("🇧🇱"); + constexpr std::string flag_sh("🇸🇭"); + constexpr std::string flag_kn("🇰🇳"); + constexpr std::string flag_lc("🇱🇨"); + constexpr std::string flag_pm("🇵🇲"); + constexpr std::string flag_vc("🇻🇨"); + constexpr std::string flag_sd("🇸🇩"); + constexpr std::string flag_sr("🇸🇷"); + constexpr std::string flag_sz("🇸🇿"); + constexpr std::string flag_se("🇸🇪"); + constexpr std::string flag_ch("🇨🇭"); + constexpr std::string flag_sy("🇸🇾"); + constexpr std::string flag_tw("🇹🇼"); + constexpr std::string flag_tj("🇹🇯"); + constexpr std::string flag_tz("🇹🇿"); + constexpr std::string flag_th("🇹🇭"); + constexpr std::string flag_tl("🇹🇱"); + constexpr std::string flag_tg("🇹🇬"); + constexpr std::string flag_tk("🇹🇰"); + constexpr std::string flag_to("🇹🇴"); + constexpr std::string flag_tt("🇹🇹"); + constexpr std::string flag_tn("🇹🇳"); + constexpr std::string flag_tr("🇹🇷"); + constexpr std::string flag_tm("🇹🇲"); + constexpr std::string flag_tc("🇹🇨"); + constexpr std::string flag_vi("🇻🇮"); + constexpr std::string flag_tv("🇹🇻"); + constexpr std::string flag_ug("🇺🇬"); + constexpr std::string flag_ua("🇺🇦"); + constexpr std::string flag_ae("🇦🇪"); + constexpr std::string flag_gb("🇬🇧"); + constexpr std::string england("🏴󠁧󠁢󠁥󠁮󠁧󠁿"); + constexpr std::string scotland("🏴󠁧󠁢󠁳󠁣󠁴󠁿"); + constexpr std::string wales("🏴󠁧󠁢󠁷󠁬󠁳󠁿"); + constexpr std::string flag_us("🇺🇸"); + constexpr std::string flag_uy("🇺🇾"); + constexpr std::string flag_uz("🇺🇿"); + constexpr std::string flag_vu("🇻🇺"); + constexpr std::string flag_va("🇻🇦"); + constexpr std::string flag_ve("🇻🇪"); + constexpr std::string flag_vn("🇻🇳"); + constexpr std::string flag_wf("🇼🇫"); + constexpr std::string flag_eh("🇪🇭"); + constexpr std::string flag_ye("🇾🇪"); + constexpr std::string flag_zm("🇿🇲"); + constexpr std::string flag_zw("🇿🇼"); + constexpr std::string flag_ac("🇦🇨"); + constexpr std::string flag_bv("🇧🇻"); + constexpr std::string flag_cp("🇨🇵"); + constexpr std::string flag_ea("🇪🇦"); + constexpr std::string flag_dg("🇩🇬"); + constexpr std::string flag_hm("🇭🇲"); + constexpr std::string flag_mf("🇲🇫"); + constexpr std::string flag_sj("🇸🇯"); + constexpr std::string flag_ta("🇹🇦"); + constexpr std::string flag_um("🇺🇲"); + constexpr std::string united_nations("🇺🇳"); + constexpr std::string green_apple("🍏"); + constexpr std::string apple("🍎"); + constexpr std::string pear("🍐"); + constexpr std::string tangerine("🍊"); + constexpr std::string lemon("🍋"); + constexpr std::string banana("🍌"); + constexpr std::string watermelon("🍉"); + constexpr std::string grapes("🍇"); + constexpr std::string blueberries("🫐"); + constexpr std::string strawberry("🍓"); + constexpr std::string melon("🍈"); + constexpr std::string cherries("🍒"); + constexpr std::string peach("🍑"); + constexpr std::string mango("🥭"); + constexpr std::string pineapple("🍍"); + constexpr std::string coconut("🥥"); + constexpr std::string kiwi("🥝"); + constexpr std::string kiwifruit("🥝"); + constexpr std::string tomato("🍅"); + constexpr std::string eggplant("🍆"); + constexpr std::string avocado("🥑"); + constexpr std::string olive("🫒"); + constexpr std::string broccoli("🥦"); + constexpr std::string leafy_green("🥬"); + constexpr std::string bell_pepper("🫑"); + constexpr std::string cucumber("🥒"); + constexpr std::string hot_pepper("🌶️"); + constexpr std::string corn("🌽"); + constexpr std::string carrot("🥕"); + constexpr std::string garlic("🧄"); + constexpr std::string onion("🧅"); + constexpr std::string potato("🥔"); + constexpr std::string sweet_potato("🍠"); + constexpr std::string croissant("🥐"); + constexpr std::string bagel("🥯"); + constexpr std::string bread("🍞"); + constexpr std::string french_bread("🥖"); + constexpr std::string baguette_bread("🥖"); + constexpr std::string flatbread("🫓"); + constexpr std::string pretzel("🥨"); + constexpr std::string cheese("🧀"); + constexpr std::string cheese_wedge("🧀"); + constexpr std::string egg("🥚"); + constexpr std::string cooking("🍳"); + constexpr std::string butter("🧈"); + constexpr std::string pancakes("🥞"); + constexpr std::string waffle("🧇"); + constexpr std::string bacon("🥓"); + constexpr std::string cut_of_meat("🥩"); + constexpr std::string poultry_leg("🍗"); + constexpr std::string meat_on_bone("🍖"); + constexpr std::string bone("🦴"); + constexpr std::string hotdog("🌭"); + constexpr std::string hot_dog("🌭"); + constexpr std::string hamburger("🍔"); + constexpr std::string fries("🍟"); + constexpr std::string pizza("🍕"); + constexpr std::string sandwich("🥪"); + constexpr std::string stuffed_flatbread("🥙"); + constexpr std::string stuffed_pita("🥙"); + constexpr std::string falafel("🧆"); + constexpr std::string taco("🌮"); + constexpr std::string burrito("🌯"); + constexpr std::string tamale("🫔"); + constexpr std::string salad("🥗"); + constexpr std::string green_salad("🥗"); + constexpr std::string shallow_pan_of_food("🥘"); + constexpr std::string paella("🥘"); + constexpr std::string fondue("🫕"); + constexpr std::string canned_food("🥫"); + constexpr std::string jar("🫙"); + constexpr std::string spaghetti("🍝"); + constexpr std::string ramen("🍜"); + constexpr std::string stew("🍲"); + constexpr std::string curry("🍛"); + constexpr std::string sushi("🍣"); + constexpr std::string bento("🍱"); + constexpr std::string dumpling("🥟"); + constexpr std::string oyster("🦪"); + constexpr std::string fried_shrimp("🍤"); + constexpr std::string rice_ball("🍙"); + constexpr std::string rice("🍚"); + constexpr std::string rice_cracker("🍘"); + constexpr std::string fish_cake("🍥"); + constexpr std::string fortune_cookie("🥠"); + constexpr std::string moon_cake("🥮"); + constexpr std::string oden("🍢"); + constexpr std::string dango("🍡"); + constexpr std::string shaved_ice("🍧"); + constexpr std::string ice_cream("🍨"); + constexpr std::string icecream("🍦"); + constexpr std::string pie("🥧"); + constexpr std::string cupcake("🧁"); + constexpr std::string cake("🍰"); + constexpr std::string birthday("🎂"); + constexpr std::string custard("🍮"); + constexpr std::string pudding("🍮"); + constexpr std::string flan("🍮"); + constexpr std::string lollipop("🍭"); + constexpr std::string candy("🍬"); + constexpr std::string chocolate_bar("🍫"); + constexpr std::string popcorn("🍿"); + constexpr std::string doughnut("🍩"); + constexpr std::string cookie("🍪"); + constexpr std::string chestnut("🌰"); + constexpr std::string peanuts("🥜"); + constexpr std::string shelled_peanut("🥜"); + constexpr std::string beans("🫘"); + constexpr std::string honey_pot("🍯"); + constexpr std::string milk("🥛"); + constexpr std::string glass_of_milk("🥛"); + constexpr std::string pouring_liquid("🫗"); + constexpr std::string baby_bottle("🍼"); + constexpr std::string teapot("🫖"); + constexpr std::string coffee("☕"); + constexpr std::string tea("🍵"); + constexpr std::string mate("🧉"); + constexpr std::string beverage_box("🧃"); + constexpr std::string cup_with_straw("🥤"); + constexpr std::string bubble_tea("🧋"); + constexpr std::string sake("🍶"); + constexpr std::string beer("🍺"); + constexpr std::string beers("🍻"); + constexpr std::string champagne_glass("🥂"); + constexpr std::string clinking_glass("🥂"); + constexpr std::string wine_glass("🍷"); + constexpr std::string tumbler_glass("🥃"); + constexpr std::string whisky("🥃"); + constexpr std::string cocktail("🍸"); + constexpr std::string tropical_drink("🍹"); + constexpr std::string champagne("🍾"); + constexpr std::string bottle_with_popping_cork("🍾"); + constexpr std::string ice_cube("🧊"); + constexpr std::string spoon("🥄"); + constexpr std::string fork_and_knife("🍴"); + constexpr std::string fork_knife_plate("🍽️"); + constexpr std::string fork_and_knife_with_plate("🍽️"); + constexpr std::string bowl_with_spoon("🥣"); + constexpr std::string takeout_box("🥡"); + constexpr std::string chopsticks("🥢"); + constexpr std::string salt("🧂"); + constexpr std::string dog("🐶"); + constexpr std::string cat("🐱"); + constexpr std::string mouse("🐭"); + constexpr std::string hamster("🐹"); + constexpr std::string rabbit("🐰"); + constexpr std::string fox("🦊"); + constexpr std::string fox_face("🦊"); + constexpr std::string bear("🐻"); + constexpr std::string panda_face("🐼"); + constexpr std::string polar_bear("🐻‍❄️"); + constexpr std::string koala("🐨"); + constexpr std::string tiger("🐯"); + constexpr std::string lion_face("🦁"); + constexpr std::string lion("🦁"); + constexpr std::string cow("🐮"); + constexpr std::string pig("🐷"); + constexpr std::string pig_nose("🐽"); + constexpr std::string frog("🐸"); + constexpr std::string monkey_face("🐵"); + constexpr std::string see_no_evil("🙈"); + constexpr std::string hear_no_evil("🙉"); + constexpr std::string speak_no_evil("🙊"); + constexpr std::string monkey("🐒"); + constexpr std::string chicken("🐔"); + constexpr std::string penguin("🐧"); + constexpr std::string bird("🐦"); + constexpr std::string baby_chick("🐤"); + constexpr std::string hatching_chick("🐣"); + constexpr std::string hatched_chick("🐥"); + constexpr std::string duck("🦆"); + constexpr std::string eagle("🦅"); + constexpr std::string owl("🦉"); + constexpr std::string bat("🦇"); + constexpr std::string wolf("🐺"); + constexpr std::string boar("🐗"); + constexpr std::string horse("🐴"); + constexpr std::string unicorn("🦄"); + constexpr std::string unicorn_face("🦄"); + constexpr std::string bee("🐝"); + constexpr std::string bug("🐛"); + constexpr std::string butterfly("🦋"); + constexpr std::string snail("🐌"); + constexpr std::string worm("🪱"); + constexpr std::string lady_beetle("🐞"); + constexpr std::string ant("🐜"); + constexpr std::string fly("🪰"); + constexpr std::string mosquito("🦟"); + constexpr std::string cockroach("🪳"); + constexpr std::string beetle("🪲"); + constexpr std::string cricket("🦗"); + constexpr std::string spider("🕷️"); + constexpr std::string spider_web("🕸️"); + constexpr std::string scorpion("🦂"); + constexpr std::string turtle("🐢"); + constexpr std::string snake("🐍"); + constexpr std::string lizard("🦎"); + constexpr std::string t_rex("🦖"); + constexpr std::string sauropod("🦕"); + constexpr std::string octopus("🐙"); + constexpr std::string squid("🦑"); + constexpr std::string shrimp("🦐"); + constexpr std::string lobster("🦞"); + constexpr std::string crab("🦀"); + constexpr std::string blowfish("🐡"); + constexpr std::string tropical_fish("🐠"); + constexpr std::string fish("🐟"); + constexpr std::string seal("🦭"); + constexpr std::string dolphin("🐬"); + constexpr std::string whale("🐳"); + constexpr std::string whale2("🐋"); + constexpr std::string shark("🦈"); + constexpr std::string crocodile("🐊"); + constexpr std::string tiger2("🐅"); + constexpr std::string leopard("🐆"); + constexpr std::string zebra("🦓"); + constexpr std::string gorilla("🦍"); + constexpr std::string orangutan("🦧"); + constexpr std::string elephant("🐘"); + constexpr std::string mammoth("🦣"); + constexpr std::string bison("🦬"); + constexpr std::string hippopotamus("🦛"); + constexpr std::string rhino("🦏"); + constexpr std::string rhinoceros("🦏"); + constexpr std::string dromedary_camel("🐪"); + constexpr std::string camel("🐫"); + constexpr std::string giraffe("🦒"); + constexpr std::string kangaroo("🦘"); + constexpr std::string water_buffalo("🐃"); + constexpr std::string ox("🐂"); + constexpr std::string cow2("🐄"); + constexpr std::string racehorse("🐎"); + constexpr std::string pig2("🐖"); + constexpr std::string ram("🐏"); + constexpr std::string sheep("🐑"); + constexpr std::string llama("🦙"); + constexpr std::string goat("🐐"); + constexpr std::string deer("🦌"); + constexpr std::string dog2("🐕"); + constexpr std::string poodle("🐩"); + constexpr std::string guide_dog("🦮"); + constexpr std::string service_dog("🐕‍🦺"); + constexpr std::string cat2("🐈"); + constexpr std::string black_cat("🐈‍⬛"); + constexpr std::string feather("🪶"); + constexpr std::string rooster("🐓"); + constexpr std::string turkey("🦃"); + constexpr std::string dodo("🦤"); + constexpr std::string peacock("🦚"); + constexpr std::string parrot("🦜"); + constexpr std::string swan("🦢"); + constexpr std::string flamingo("🦩"); + constexpr std::string dove("🕊️"); + constexpr std::string dove_of_peace("🕊️"); + constexpr std::string rabbit2("🐇"); + constexpr std::string raccoon("🦝"); + constexpr std::string skunk("🦨"); + constexpr std::string badger("🦡"); + constexpr std::string beaver("🦫"); + constexpr std::string otter("🦦"); + constexpr std::string sloth("🦥"); + constexpr std::string mouse2("🐁"); + constexpr std::string rat("🐀"); + constexpr std::string chipmunk("🐿️"); + constexpr std::string hedgehog("🦔"); + constexpr std::string feet("🐾"); + constexpr std::string paw_prints("🐾"); + constexpr std::string dragon("🐉"); + constexpr std::string dragon_face("🐲"); + constexpr std::string cactus("🌵"); + constexpr std::string christmas_tree("🎄"); + constexpr std::string evergreen_tree("🌲"); + constexpr std::string deciduous_tree("🌳"); + constexpr std::string palm_tree("🌴"); + constexpr std::string seedling("🌱"); + constexpr std::string herb("🌿"); + constexpr std::string shamrock("☘️"); + constexpr std::string four_leaf_clover("🍀"); + constexpr std::string bamboo("🎍"); + constexpr std::string tanabata_tree("🎋"); + constexpr std::string leaves("🍃"); + constexpr std::string fallen_leaf("🍂"); + constexpr std::string maple_leaf("🍁"); + constexpr std::string empty_nest("🪹"); + constexpr std::string nest_with_eggs("🪺"); + constexpr std::string mushroom("🍄"); + constexpr std::string shell("🐚"); + constexpr std::string coral("🪸"); + constexpr std::string rock("🪨"); + constexpr std::string wood("🪵"); + constexpr std::string ear_of_rice("🌾"); + constexpr std::string potted_plant("🪴"); + constexpr std::string bouquet("💐"); + constexpr std::string tulip("🌷"); + constexpr std::string rose("🌹"); + constexpr std::string wilted_rose("🥀"); + constexpr std::string wilted_flower("🥀"); + constexpr std::string lotus("🪷"); + constexpr std::string hibiscus("🌺"); + constexpr std::string cherry_blossom("🌸"); + constexpr std::string blossom("🌼"); + constexpr std::string sunflower("🌻"); + constexpr std::string sun_with_face("🌞"); + constexpr std::string full_moon_with_face("🌝"); + constexpr std::string first_quarter_moon_with_face("🌛"); + constexpr std::string last_quarter_moon_with_face("🌜"); + constexpr std::string new_moon_with_face("🌚"); + constexpr std::string full_moon("🌕"); + constexpr std::string waning_gibbous_moon("🌖"); + constexpr std::string last_quarter_moon("🌗"); + constexpr std::string waning_crescent_moon("🌘"); + constexpr std::string new_moon("🌑"); + constexpr std::string waxing_crescent_moon("🌒"); + constexpr std::string first_quarter_moon("🌓"); + constexpr std::string waxing_gibbous_moon("🌔"); + constexpr std::string crescent_moon("🌙"); + constexpr std::string earth_americas("🌎"); + constexpr std::string earth_africa("🌍"); + constexpr std::string earth_asia("🌏"); + constexpr std::string ringed_planet("🪐"); + constexpr std::string dizzy("💫"); + constexpr std::string star("⭐"); + constexpr std::string star2("🌟"); + constexpr std::string sparkles("✨"); + constexpr std::string zap("⚡"); + constexpr std::string comet("☄️"); + constexpr std::string boom("💥"); + constexpr std::string fire("🔥"); + constexpr std::string flame("🔥"); + constexpr std::string cloud_tornado("🌪️"); + constexpr std::string cloud_with_tornado("🌪️"); + constexpr std::string rainbow("🌈"); + constexpr std::string sunny("☀️"); + constexpr std::string white_sun_small_cloud("🌤️"); + constexpr std::string white_sun_with_small_cloud("🌤️"); + constexpr std::string partly_sunny("⛅"); + constexpr std::string white_sun_cloud("🌥️"); + constexpr std::string white_sun_behind_cloud("🌥️"); + constexpr std::string cloud("☁️"); + constexpr std::string white_sun_rain_cloud("🌦️"); + constexpr std::string white_sun_behind_cloud_with_rain("🌦️"); + constexpr std::string cloud_rain("🌧️"); + constexpr std::string cloud_with_rain("🌧️"); + constexpr std::string thunder_cloud_rain("⛈️"); + constexpr std::string thunder_cloud_and_rain("⛈️"); + constexpr std::string cloud_lightning("🌩️"); + constexpr std::string cloud_with_lightning("🌩️"); + constexpr std::string cloud_snow("🌨️"); + constexpr std::string cloud_with_snow("🌨️"); + constexpr std::string snowflake("❄️"); + constexpr std::string snowman2("☃️"); + constexpr std::string snowman("⛄"); + constexpr std::string wind_blowing_face("🌬️"); + constexpr std::string dash("💨"); + constexpr std::string droplet("💧"); + constexpr std::string sweat_drops("💦"); + constexpr std::string bubbles("🫧"); + constexpr std::string umbrella("☔"); + constexpr std::string umbrella2("☂️"); + constexpr std::string ocean("🌊"); + constexpr std::string fog("🌫️"); + constexpr std::string watch("⌚"); + constexpr std::string mobile_phone("📱"); + constexpr std::string iphone("📱"); + constexpr std::string calling("📲"); + constexpr std::string computer("💻"); + constexpr std::string keyboard("⌨️"); + constexpr std::string desktop("🖥️"); + constexpr std::string desktop_computer("🖥️"); + constexpr std::string printer("🖨️"); + constexpr std::string mouse_three_button("🖱️"); + constexpr std::string three_button_mouse("🖱️"); + constexpr std::string trackball("🖲️"); + constexpr std::string joystick("🕹️"); + constexpr std::string compression("🗜️"); + constexpr std::string minidisc("💽"); + constexpr std::string floppy_disk("💾"); + constexpr std::string cd("💿"); + constexpr std::string dvd("📀"); + constexpr std::string vhs("📼"); + constexpr std::string camera("📷"); + constexpr std::string camera_with_flash("📸"); + constexpr std::string video_camera("📹"); + constexpr std::string movie_camera("🎥"); + constexpr std::string projector("📽️"); + constexpr std::string film_projector("📽️"); + constexpr std::string film_frames("🎞️"); + constexpr std::string telephone_receiver("📞"); + constexpr std::string telephone("☎️"); + constexpr std::string pager("📟"); + constexpr std::string fax("📠"); + constexpr std::string tv("📺"); + constexpr std::string radio("📻"); + constexpr std::string microphone2("🎙️"); + constexpr std::string studio_microphone("🎙️"); + constexpr std::string level_slider("🎚️"); + constexpr std::string control_knobs("🎛️"); + constexpr std::string compass("🧭"); + constexpr std::string stopwatch("⏱️"); + constexpr std::string timer("⏲️"); + constexpr std::string timer_clock("⏲️"); + constexpr std::string alarm_clock("⏰"); + constexpr std::string clock("🕰️"); + constexpr std::string mantlepiece_clock("🕰️"); + constexpr std::string hourglass("⌛"); + constexpr std::string hourglass_flowing_sand("⏳"); + constexpr std::string satellite("📡"); + constexpr std::string battery("🔋"); + constexpr std::string low_battery("🪫"); + constexpr std::string electric_plug("🔌"); + constexpr std::string bulb("💡"); + constexpr std::string flashlight("🔦"); + constexpr std::string candle("🕯️"); + constexpr std::string diya_lamp("🪔"); + constexpr std::string fire_extinguisher("🧯"); + constexpr std::string oil("🛢️"); + constexpr std::string oil_drum("🛢️"); + constexpr std::string money_with_wings("💸"); + constexpr std::string dollar("💵"); + constexpr std::string yen("💴"); + constexpr std::string euro("💶"); + constexpr std::string pound("💷"); + constexpr std::string coin("🪙"); + constexpr std::string moneybag("💰"); + constexpr std::string credit_card("💳"); + constexpr std::string identification_card("🪪"); + constexpr std::string gem("💎"); + constexpr std::string scales("⚖️"); + constexpr std::string ladder("🪜"); + constexpr std::string toolbox("🧰"); + constexpr std::string screwdriver("🪛"); + constexpr std::string wrench("🔧"); + constexpr std::string hammer("🔨"); + constexpr std::string hammer_pick("⚒️"); + constexpr std::string hammer_and_pick("⚒️"); + constexpr std::string tools("🛠️"); + constexpr std::string hammer_and_wrench("🛠️"); + constexpr std::string pick("⛏️"); + constexpr std::string carpentry_saw("🪚"); + constexpr std::string nut_and_bolt("🔩"); + constexpr std::string gear("⚙️"); + constexpr std::string mouse_trap("🪤"); + constexpr std::string bricks("🧱"); + constexpr std::string chains("⛓️"); + constexpr std::string magnet("🧲"); + constexpr std::string gun("🔫"); + constexpr std::string bomb("💣"); + constexpr std::string firecracker("🧨"); + constexpr std::string axe("🪓"); + constexpr std::string knife("🔪"); + constexpr std::string dagger("🗡️"); + constexpr std::string dagger_knife("🗡️"); + constexpr std::string crossed_swords("⚔️"); + constexpr std::string shield("🛡️"); + constexpr std::string smoking("🚬"); + constexpr std::string coffin("⚰️"); + constexpr std::string headstone("🪦"); + constexpr std::string urn("⚱️"); + constexpr std::string funeral_urn("⚱️"); + constexpr std::string amphora("🏺"); + constexpr std::string crystal_ball("🔮"); + constexpr std::string prayer_beads("📿"); + constexpr std::string nazar_amulet("🧿"); + constexpr std::string hamsa("🪬"); + constexpr std::string barber("💈"); + constexpr std::string alembic("⚗️"); + constexpr std::string telescope("🔭"); + constexpr std::string microscope("🔬"); + constexpr std::string hole("🕳️"); + constexpr std::string x_ray("🩻"); + constexpr std::string adhesive_bandage("🩹"); + constexpr std::string stethoscope("🩺"); + constexpr std::string pill("💊"); + constexpr std::string syringe("💉"); + constexpr std::string drop_of_blood("🩸"); + constexpr std::string dna("🧬"); + constexpr std::string microbe("🦠"); + constexpr std::string petri_dish("🧫"); + constexpr std::string test_tube("🧪"); + constexpr std::string thermometer("🌡️"); + constexpr std::string broom("🧹"); + constexpr std::string plunger("🪠"); + constexpr std::string basket("🧺"); + constexpr std::string roll_of_paper("🧻"); + constexpr std::string toilet("🚽"); + constexpr std::string potable_water("🚰"); + constexpr std::string shower("🚿"); + constexpr std::string bathtub("🛁"); + constexpr std::string bath("🛀"); + constexpr std::string bath_tone1("🛀🏻"); + constexpr std::string bath_tone2("🛀🏼"); + constexpr std::string bath_tone3("🛀🏽"); + constexpr std::string bath_tone4("🛀🏾"); + constexpr std::string bath_tone5("🛀🏿"); + constexpr std::string soap("🧼"); + constexpr std::string toothbrush("🪥"); + constexpr std::string razor("🪒"); + constexpr std::string sponge("🧽"); + constexpr std::string bucket("🪣"); + constexpr std::string squeeze_bottle("🧴"); + constexpr std::string bellhop("🛎️"); + constexpr std::string bellhop_bell("🛎️"); + constexpr std::string key("🔑"); + constexpr std::string key2("🗝️"); + constexpr std::string old_key("🗝️"); + constexpr std::string door("🚪"); + constexpr std::string chair("🪑"); + constexpr std::string couch("🛋️"); + constexpr std::string couch_and_lamp("🛋️"); + constexpr std::string bed("🛏️"); + constexpr std::string sleeping_accommodation("🛌"); + constexpr std::string person_in_bed_tone1("🛌🏻"); + constexpr std::string person_in_bed_light_skin_tone("🛌🏻"); + constexpr std::string person_in_bed_tone2("🛌🏼"); + constexpr std::string person_in_bed_medium_light_skin_tone("🛌🏼"); + constexpr std::string person_in_bed_tone3("🛌🏽"); + constexpr std::string person_in_bed_medium_skin_tone("🛌🏽"); + constexpr std::string person_in_bed_tone4("🛌🏾"); + constexpr std::string person_in_bed_medium_dark_skin_tone("🛌🏾"); + constexpr std::string person_in_bed_tone5("🛌🏿"); + constexpr std::string person_in_bed_dark_skin_tone("🛌🏿"); + constexpr std::string teddy_bear("🧸"); + constexpr std::string nesting_dolls("🪆"); + constexpr std::string frame_photo("🖼️"); + constexpr std::string frame_with_picture("🖼️"); + constexpr std::string mirror("🪞"); + constexpr std::string window("🪟"); + constexpr std::string shopping_bags("🛍️"); + constexpr std::string shopping_cart("🛒"); + constexpr std::string shopping_trolley("🛒"); + constexpr std::string gift("🎁"); + constexpr std::string balloon("🎈"); + constexpr std::string flags("🎏"); + constexpr std::string ribbon("🎀"); + constexpr std::string magic_wand("🪄"); + constexpr std::string piñata("🪅"); + constexpr std::string confetti_ball("🎊"); + constexpr std::string tada("🎉"); + constexpr std::string dolls("🎎"); + constexpr std::string izakaya_lantern("🏮"); + constexpr std::string wind_chime("🎐"); + constexpr std::string mirror_ball("🪩"); + constexpr std::string red_envelope("🧧"); + constexpr std::string envelope("✉️"); + constexpr std::string envelope_with_arrow("📩"); + constexpr std::string incoming_envelope("📨"); + constexpr std::string e_mail("📧"); + constexpr std::string email("📧"); + constexpr std::string love_letter("💌"); + constexpr std::string inbox_tray("📥"); + constexpr std::string outbox_tray("📤"); + constexpr std::string package("📦"); + constexpr std::string label("🏷️"); + constexpr std::string placard("🪧"); + constexpr std::string mailbox_closed("📪"); + constexpr std::string mailbox("📫"); + constexpr std::string mailbox_with_mail("📬"); + constexpr std::string mailbox_with_no_mail("📭"); + constexpr std::string postbox("📮"); + constexpr std::string postal_horn("📯"); + constexpr std::string scroll("📜"); + constexpr std::string page_with_curl("📃"); + constexpr std::string page_facing_up("📄"); + constexpr std::string bookmark_tabs("📑"); + constexpr std::string receipt("🧾"); + constexpr std::string bar_chart("📊"); + constexpr std::string chart_with_upwards_trend("📈"); + constexpr std::string chart_with_downwards_trend("📉"); + constexpr std::string notepad_spiral("🗒️"); + constexpr std::string spiral_note_pad("🗒️"); + constexpr std::string calendar_spiral("🗓️"); + constexpr std::string spiral_calendar_pad("🗓️"); + constexpr std::string calendar("📆"); + constexpr std::string date("📅"); + constexpr std::string wastebasket("🗑️"); + constexpr std::string card_index("📇"); + constexpr std::string card_box("🗃️"); + constexpr std::string card_file_box("🗃️"); + constexpr std::string ballot_box("🗳️"); + constexpr std::string ballot_box_with_ballot("🗳️"); + constexpr std::string file_cabinet("🗄️"); + constexpr std::string clipboard("📋"); + constexpr std::string file_folder("📁"); + constexpr std::string open_file_folder("📂"); + constexpr std::string dividers("🗂️"); + constexpr std::string card_index_dividers("🗂️"); + constexpr std::string newspaper2("🗞️"); + constexpr std::string rolled_up_newspaper("🗞️"); + constexpr std::string newspaper("📰"); + constexpr std::string notebook("📓"); + constexpr std::string notebook_with_decorative_cover("📔"); + constexpr std::string ledger("📒"); + constexpr std::string closed_book("📕"); + constexpr std::string green_book("📗"); + constexpr std::string blue_book("📘"); + constexpr std::string orange_book("📙"); + constexpr std::string books("📚"); + constexpr std::string book("📖"); + constexpr std::string bookmark("🔖"); + constexpr std::string safety_pin("🧷"); + constexpr std::string link("🔗"); + constexpr std::string paperclip("📎"); + constexpr std::string paperclips("🖇️"); + constexpr std::string linked_paperclips("🖇️"); + constexpr std::string triangular_ruler("📐"); + constexpr std::string straight_ruler("📏"); + constexpr std::string abacus("🧮"); + constexpr std::string pushpin("📌"); + constexpr std::string round_pushpin("📍"); + constexpr std::string scissors("✂️"); + constexpr std::string pen_ballpoint("🖊️"); + constexpr std::string lower_left_ballpoint_pen("🖊️"); + constexpr std::string pen_fountain("🖋️"); + constexpr std::string lower_left_fountain_pen("🖋️"); + constexpr std::string black_nib("✒️"); + constexpr std::string paintbrush("🖌️"); + constexpr std::string lower_left_paintbrush("🖌️"); + constexpr std::string crayon("🖍️"); + constexpr std::string lower_left_crayon("🖍️"); + constexpr std::string pencil("📝"); + constexpr std::string memo("📝"); + constexpr std::string pencil2("✏️"); + constexpr std::string mag("🔍"); + constexpr std::string mag_right("🔎"); + constexpr std::string lock_with_ink_pen("🔏"); + constexpr std::string closed_lock_with_key("🔐"); + constexpr std::string lock("🔒"); + constexpr std::string unlock("🔓"); + constexpr std::string grinning("😀"); + constexpr std::string smiley("😃"); + constexpr std::string smile("😄"); + constexpr std::string grin("😁"); + constexpr std::string laughing("😆"); + constexpr std::string satisfied("😆"); + constexpr std::string face_holding_back_tears("🥹"); + constexpr std::string sweat_smile("😅"); + constexpr std::string joy("😂"); + constexpr std::string rofl("🤣"); + constexpr std::string rolling_on_the_floor_laughing("🤣"); + constexpr std::string smiling_face_with_tear("🥲"); + constexpr std::string relaxed("☺️"); + constexpr std::string blush("😊"); + constexpr std::string innocent("😇"); + constexpr std::string slight_smile("🙂"); + constexpr std::string slightly_smiling_face("🙂"); + constexpr std::string upside_down("🙃"); + constexpr std::string upside_down_face("🙃"); + constexpr std::string wink("😉"); + constexpr std::string relieved("😌"); + constexpr std::string heart_eyes("😍"); + constexpr std::string smiling_face_with_3_hearts("🥰"); + constexpr std::string kissing_heart("😘"); + constexpr std::string kissing("😗"); + constexpr std::string kissing_smiling_eyes("😙"); + constexpr std::string kissing_closed_eyes("😚"); + constexpr std::string yum("😋"); + constexpr std::string stuck_out_tongue("😛"); + constexpr std::string stuck_out_tongue_closed_eyes("😝"); + constexpr std::string stuck_out_tongue_winking_eye("😜"); + constexpr std::string zany_face("🤪"); + constexpr std::string face_with_raised_eyebrow("🤨"); + constexpr std::string face_with_monocle("🧐"); + constexpr std::string nerd("🤓"); + constexpr std::string nerd_face("🤓"); + constexpr std::string sunglasses("😎"); + constexpr std::string disguised_face("🥸"); + constexpr std::string star_struck("🤩"); + constexpr std::string partying_face("🥳"); + constexpr std::string smirk("😏"); + constexpr std::string unamused("😒"); + constexpr std::string disappointed("😞"); + constexpr std::string pensive("😔"); + constexpr std::string worried("😟"); + constexpr std::string confused("😕"); + constexpr std::string slight_frown("🙁"); + constexpr std::string slightly_frowning_face("🙁"); + constexpr std::string frowning2("☹️"); + constexpr std::string white_frowning_face("☹️"); + constexpr std::string persevere("😣"); + constexpr std::string confounded("😖"); + constexpr std::string tired_face("😫"); + constexpr std::string weary("😩"); + constexpr std::string pleading_face("🥺"); + constexpr std::string cry("😢"); + constexpr std::string sob("😭"); + constexpr std::string triumph("😤"); + constexpr std::string angry("😠"); + constexpr std::string rage("😡"); + constexpr std::string face_with_symbols_over_mouth("🤬"); + constexpr std::string exploding_head("🤯"); + constexpr std::string flushed("😳"); + constexpr std::string hot_face("🥵"); + constexpr std::string cold_face("🥶"); + constexpr std::string face_in_clouds("😶‍🌫️"); + constexpr std::string scream("😱"); + constexpr std::string fearful("😨"); + constexpr std::string cold_sweat("😰"); + constexpr std::string disappointed_relieved("😥"); + constexpr std::string sweat("😓"); + constexpr std::string hugging("🤗"); + constexpr std::string hugging_face("🤗"); + constexpr std::string thinking("🤔"); + constexpr std::string thinking_face("🤔"); + constexpr std::string face_with_peeking_eye("🫣"); + constexpr std::string face_with_hand_over_mouth("🤭"); + constexpr std::string face_with_open_eyes_and_hand_over_mouth("🫢"); + constexpr std::string saluting_face("🫡"); + constexpr std::string shushing_face("🤫"); + constexpr std::string melting_face("🫠"); + constexpr std::string lying_face("🤥"); + constexpr std::string liar("🤥"); + constexpr std::string no_mouth("😶"); + constexpr std::string dotted_line_face("🫥"); + constexpr std::string neutral_face("😐"); + constexpr std::string face_with_diagonal_mouth("🫤"); + constexpr std::string expressionless("😑"); + constexpr std::string grimacing("😬"); + constexpr std::string rolling_eyes("🙄"); + constexpr std::string face_with_rolling_eyes("🙄"); + constexpr std::string hushed("😯"); + constexpr std::string frowning("😦"); + constexpr std::string anguished("😧"); + constexpr std::string open_mouth("😮"); + constexpr std::string astonished("😲"); + constexpr std::string yawning_face("🥱"); + constexpr std::string sleeping("😴"); + constexpr std::string drooling_face("🤤"); + constexpr std::string drool("🤤"); + constexpr std::string sleepy("😪"); + constexpr std::string face_exhaling("😮‍💨"); + constexpr std::string dizzy_face("😵"); + constexpr std::string face_with_spiral_eyes("😵‍💫"); + constexpr std::string zipper_mouth("🤐"); + constexpr std::string zipper_mouth_face("🤐"); + constexpr std::string woozy_face("🥴"); + constexpr std::string nauseated_face("🤢"); + constexpr std::string sick("🤢"); + constexpr std::string face_vomiting("🤮"); + constexpr std::string sneezing_face("🤧"); + constexpr std::string sneeze("🤧"); + constexpr std::string mask("😷"); + constexpr std::string thermometer_face("🤒"); + constexpr std::string face_with_thermometer("🤒"); + constexpr std::string head_bandage("🤕"); + constexpr std::string face_with_head_bandage("🤕"); + constexpr std::string money_mouth("🤑"); + constexpr std::string money_mouth_face("🤑"); + constexpr std::string cowboy("🤠"); + constexpr std::string face_with_cowboy_hat("🤠"); + constexpr std::string smiling_imp("😈"); + constexpr std::string imp("👿"); + constexpr std::string japanese_ogre("👹"); + constexpr std::string japanese_goblin("👺"); + constexpr std::string clown("🤡"); + constexpr std::string clown_face("🤡"); + constexpr std::string poop("💩"); + constexpr std::string shit("💩"); + constexpr std::string hankey("💩"); + constexpr std::string poo("💩"); + constexpr std::string ghost("👻"); + constexpr std::string skull("💀"); + constexpr std::string skeleton("💀"); + constexpr std::string skull_crossbones("☠️"); + constexpr std::string skull_and_crossbones("☠️"); + constexpr std::string alien("👽"); + constexpr std::string space_invader("👾"); + constexpr std::string robot("🤖"); + constexpr std::string robot_face("🤖"); + constexpr std::string jack_o_lantern("🎃"); + constexpr std::string smiley_cat("😺"); + constexpr std::string smile_cat("😸"); + constexpr std::string joy_cat("😹"); + constexpr std::string heart_eyes_cat("😻"); + constexpr std::string smirk_cat("😼"); + constexpr std::string kissing_cat("😽"); + constexpr std::string scream_cat("🙀"); + constexpr std::string crying_cat_face("😿"); + constexpr std::string pouting_cat("😾"); + constexpr std::string heart_hands("🫶"); + constexpr std::string heart_hands_tone1("🫶🏻"); + constexpr std::string heart_hands_light_skin_tone("🫶🏻"); + constexpr std::string heart_hands_tone2("🫶🏼"); + constexpr std::string heart_hands_medium_light_skin_tone("🫶🏼"); + constexpr std::string heart_hands_tone3("🫶🏽"); + constexpr std::string heart_hands_medium_skin_tone("🫶🏽"); + constexpr std::string heart_hands_tone4("🫶🏾"); + constexpr std::string heart_hands_medium_dark_skin_tone("🫶🏾"); + constexpr std::string heart_hands_tone5("🫶🏿"); + constexpr std::string heart_hands_dark_skin_tone("🫶🏿"); + constexpr std::string palms_up_together("🤲"); + constexpr std::string palms_up_together_tone1("🤲🏻"); + constexpr std::string palms_up_together_light_skin_tone("🤲🏻"); + constexpr std::string palms_up_together_tone2("🤲🏼"); + constexpr std::string palms_up_together_medium_light_skin_tone("🤲🏼"); + constexpr std::string palms_up_together_tone3("🤲🏽"); + constexpr std::string palms_up_together_medium_skin_tone("🤲🏽"); + constexpr std::string palms_up_together_tone4("🤲🏾"); + constexpr std::string palms_up_together_medium_dark_skin_tone("🤲🏾"); + constexpr std::string palms_up_together_tone5("🤲🏿"); + constexpr std::string palms_up_together_dark_skin_tone("🤲🏿"); + constexpr std::string open_hands("👐"); + constexpr std::string open_hands_tone1("👐🏻"); + constexpr std::string open_hands_tone2("👐🏼"); + constexpr std::string open_hands_tone3("👐🏽"); + constexpr std::string open_hands_tone4("👐🏾"); + constexpr std::string open_hands_tone5("👐🏿"); + constexpr std::string raised_hands("🙌"); + constexpr std::string raised_hands_tone1("🙌🏻"); + constexpr std::string raised_hands_tone2("🙌🏼"); + constexpr std::string raised_hands_tone3("🙌🏽"); + constexpr std::string raised_hands_tone4("🙌🏾"); + constexpr std::string raised_hands_tone5("🙌🏿"); + constexpr std::string clap("👏"); + constexpr std::string clap_tone1("👏🏻"); + constexpr std::string clap_tone2("👏🏼"); + constexpr std::string clap_tone3("👏🏽"); + constexpr std::string clap_tone4("👏🏾"); + constexpr std::string clap_tone5("👏🏿"); + constexpr std::string handshake("🤝"); + constexpr std::string shaking_hands("🤝"); + constexpr std::string handshake_light_skin_tone("🤝🏻"); + constexpr std::string handshake_tone1_tone2("🫱🏻‍🫲🏼"); + constexpr std::string handshake_light_skin_tone_medium_light_skin_tone("🫱🏻‍🫲🏼"); + constexpr std::string handshake_tone1_tone3("🫱🏻‍🫲🏽"); + constexpr std::string handshake_light_skin_tone_medium_skin_tone("🫱🏻‍🫲🏽"); + constexpr std::string handshake_tone1_tone4("🫱🏻‍🫲🏾"); + constexpr std::string handshake_light_skin_tone_medium_dark_skin_tone("🫱🏻‍🫲🏾"); + constexpr std::string handshake_tone1_tone5("🫱🏻‍🫲🏿"); + constexpr std::string handshake_light_skin_tone_dark_skin_tone("🫱🏻‍🫲🏿"); + constexpr std::string handshake_tone2_tone1("🫱🏼‍🫲🏻"); + constexpr std::string handshake_medium_light_skin_tone_light_skin_tone("🫱🏼‍🫲🏻"); + constexpr std::string handshake_medium_light_skin_tone("🤝🏼"); + constexpr std::string handshake_tone2_tone3("🫱🏼‍🫲🏽"); + constexpr std::string handshake_medium_light_skin_tone_medium_skin_tone("🫱🏼‍🫲🏽"); + constexpr std::string handshake_tone2_tone4("🫱🏼‍🫲🏾"); + constexpr std::string handshake_medium_light_skin_tone_medium_dark_skin_tone("🫱🏼‍🫲🏾"); + constexpr std::string handshake_tone2_tone5("🫱🏼‍🫲🏿"); + constexpr std::string handshake_medium_light_skin_tone_dark_skin_tone("🫱🏼‍🫲🏿"); + constexpr std::string handshake_tone3_tone1("🫱🏽‍🫲🏻"); + constexpr std::string handshake_medium_skin_tone_light_skin_tone("🫱🏽‍🫲🏻"); + constexpr std::string handshake_tone3_tone2("🫱🏽‍🫲🏼"); + constexpr std::string handshake_medium_skin_tone_medium_light_skin_tone("🫱🏽‍🫲🏼"); + constexpr std::string handshake_medium_skin_tone("🤝🏽"); + constexpr std::string handshake_tone3_tone4("🫱🏽‍🫲🏾"); + constexpr std::string handshake_medium_skin_tone_medium_dark_skin_tone("🫱🏽‍🫲🏾"); + constexpr std::string handshake_tone3_tone5("🫱🏽‍🫲🏿"); + constexpr std::string handshake_medium_skin_tone_dark_skin_tone("🫱🏽‍🫲🏿"); + constexpr std::string handshake_tone4_tone1("🫱🏾‍🫲🏻"); + constexpr std::string handshake_medium_dark_skin_tone_light_skin_tone("🫱🏾‍🫲🏻"); + constexpr std::string handshake_tone4_tone2("🫱🏾‍🫲🏼"); + constexpr std::string handshake_medium_dark_skin_tone_medium_light_skin_tone("🫱🏾‍🫲🏼"); + constexpr std::string handshake_tone4_tone3("🫱🏾‍🫲🏽"); + constexpr std::string handshake_medium_dark_skin_tone_medium_skin_tone("🫱🏾‍🫲🏽"); + constexpr std::string handshake_medium_dark_skin_tone("🤝🏾"); + constexpr std::string handshake_tone4_tone5("🫱🏾‍🫲🏿"); + constexpr std::string handshake_medium_dark_skin_tone_dark_skin_tone("🫱🏾‍🫲🏿"); + constexpr std::string handshake_tone5_tone1("🫱🏿‍🫲🏻"); + constexpr std::string handshake_dark_skin_tone_light_skin_tone("🫱🏿‍🫲🏻"); + constexpr std::string handshake_tone5_tone2("🫱🏿‍🫲🏼"); + constexpr std::string handshake_dark_skin_tone_medium_light_skin_tone("🫱🏿‍🫲🏼"); + constexpr std::string handshake_tone5_tone3("🫱🏿‍🫲🏽"); + constexpr std::string handshake_dark_skin_tone_medium_skin_tone("🫱🏿‍🫲🏽"); + constexpr std::string handshake_tone5_tone4("🫱🏿‍🫲🏾"); + constexpr std::string handshake_dark_skin_tone_medium_dark_skin_tone("🫱🏿‍🫲🏾"); + constexpr std::string handshake_dark_skin_tone("🤝🏿"); + constexpr std::string thumbsup("👍"); + constexpr std::string +1("👍"); + constexpr std::string thumbup("👍"); + constexpr std::string thumbsup_tone1("👍🏻"); + constexpr std::string +1_tone1("👍🏻"); + constexpr std::string thumbup_tone1("👍🏻"); + constexpr std::string thumbsup_tone2("👍🏼"); + constexpr std::string +1_tone2("👍🏼"); + constexpr std::string thumbup_tone2("👍🏼"); + constexpr std::string thumbsup_tone3("👍🏽"); + constexpr std::string +1_tone3("👍🏽"); + constexpr std::string thumbup_tone3("👍🏽"); + constexpr std::string thumbsup_tone4("👍🏾"); + constexpr std::string +1_tone4("👍🏾"); + constexpr std::string thumbup_tone4("👍🏾"); + constexpr std::string thumbsup_tone5("👍🏿"); + constexpr std::string +1_tone5("👍🏿"); + constexpr std::string thumbup_tone5("👍🏿"); + constexpr std::string thumbsdown("👎"); + constexpr std::string -1("👎"); + constexpr std::string thumbdown("👎"); + constexpr std::string thumbsdown_tone1("👎🏻"); + constexpr std::string _1_tone1("👎🏻"); + constexpr std::string thumbdown_tone1("👎🏻"); + constexpr std::string thumbsdown_tone2("👎🏼"); + constexpr std::string _1_tone2("👎🏼"); + constexpr std::string thumbdown_tone2("👎🏼"); + constexpr std::string thumbsdown_tone3("👎🏽"); + constexpr std::string _1_tone3("👎🏽"); + constexpr std::string thumbdown_tone3("👎🏽"); + constexpr std::string thumbsdown_tone4("👎🏾"); + constexpr std::string _1_tone4("👎🏾"); + constexpr std::string thumbdown_tone4("👎🏾"); + constexpr std::string thumbsdown_tone5("👎🏿"); + constexpr std::string _1_tone5("👎🏿"); + constexpr std::string thumbdown_tone5("👎🏿"); + constexpr std::string punch("👊"); + constexpr std::string punch_tone1("👊🏻"); + constexpr std::string punch_tone2("👊🏼"); + constexpr std::string punch_tone3("👊🏽"); + constexpr std::string punch_tone4("👊🏾"); + constexpr std::string punch_tone5("👊🏿"); + constexpr std::string fist("✊"); + constexpr std::string fist_tone1("✊🏻"); + constexpr std::string fist_tone2("✊🏼"); + constexpr std::string fist_tone3("✊🏽"); + constexpr std::string fist_tone4("✊🏾"); + constexpr std::string fist_tone5("✊🏿"); + constexpr std::string left_facing_fist("🤛"); + constexpr std::string left_fist("🤛"); + constexpr std::string left_facing_fist_tone1("🤛🏻"); + constexpr std::string left_fist_tone1("🤛🏻"); + constexpr std::string left_facing_fist_tone2("🤛🏼"); + constexpr std::string left_fist_tone2("🤛🏼"); + constexpr std::string left_facing_fist_tone3("🤛🏽"); + constexpr std::string left_fist_tone3("🤛🏽"); + constexpr std::string left_facing_fist_tone4("🤛🏾"); + constexpr std::string left_fist_tone4("🤛🏾"); + constexpr std::string left_facing_fist_tone5("🤛🏿"); + constexpr std::string left_fist_tone5("🤛🏿"); + constexpr std::string right_facing_fist("🤜"); + constexpr std::string right_fist("🤜"); + constexpr std::string right_facing_fist_tone1("🤜🏻"); + constexpr std::string right_fist_tone1("🤜🏻"); + constexpr std::string right_facing_fist_tone2("🤜🏼"); + constexpr std::string right_fist_tone2("🤜🏼"); + constexpr std::string right_facing_fist_tone3("🤜🏽"); + constexpr std::string right_fist_tone3("🤜🏽"); + constexpr std::string right_facing_fist_tone4("🤜🏾"); + constexpr std::string right_fist_tone4("🤜🏾"); + constexpr std::string right_facing_fist_tone5("🤜🏿"); + constexpr std::string right_fist_tone5("🤜🏿"); + constexpr std::string fingers_crossed("🤞"); + constexpr std::string hand_with_index_and_middle_finger_crossed("🤞"); + constexpr std::string fingers_crossed_tone1("🤞🏻"); + constexpr std::string hand_with_index_and_middle_fingers_crossed_tone1("🤞🏻"); + constexpr std::string fingers_crossed_tone2("🤞🏼"); + constexpr std::string hand_with_index_and_middle_fingers_crossed_tone2("🤞🏼"); + constexpr std::string fingers_crossed_tone3("🤞🏽"); + constexpr std::string hand_with_index_and_middle_fingers_crossed_tone3("🤞🏽"); + constexpr std::string fingers_crossed_tone4("🤞🏾"); + constexpr std::string hand_with_index_and_middle_fingers_crossed_tone4("🤞🏾"); + constexpr std::string fingers_crossed_tone5("🤞🏿"); + constexpr std::string hand_with_index_and_middle_fingers_crossed_tone5("🤞🏿"); + constexpr std::string v("✌️"); + constexpr std::string v_tone1("✌🏻"); + constexpr std::string v_tone2("✌🏼"); + constexpr std::string v_tone3("✌🏽"); + constexpr std::string v_tone4("✌🏾"); + constexpr std::string v_tone5("✌🏿"); + constexpr std::string hand_with_index_finger_and_thumb_crossed("🫰"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_tone1("🫰🏻"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_light_skin_tone("🫰🏻"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_tone2("🫰🏼"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_medium_light_skin_tone("🫰🏼"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_tone3("🫰🏽"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_medium_skin_tone("🫰🏽"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_tone4("🫰🏾"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_medium_dark_skin_tone("🫰🏾"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_tone5("🫰🏿"); + constexpr std::string hand_with_index_finger_and_thumb_crossed_dark_skin_tone("🫰🏿"); + constexpr std::string love_you_gesture("🤟"); + constexpr std::string love_you_gesture_tone1("🤟🏻"); + constexpr std::string love_you_gesture_light_skin_tone("🤟🏻"); + constexpr std::string love_you_gesture_tone2("🤟🏼"); + constexpr std::string love_you_gesture_medium_light_skin_tone("🤟🏼"); + constexpr std::string love_you_gesture_tone3("🤟🏽"); + constexpr std::string love_you_gesture_medium_skin_tone("🤟🏽"); + constexpr std::string love_you_gesture_tone4("🤟🏾"); + constexpr std::string love_you_gesture_medium_dark_skin_tone("🤟🏾"); + constexpr std::string love_you_gesture_tone5("🤟🏿"); + constexpr std::string love_you_gesture_dark_skin_tone("🤟🏿"); + constexpr std::string metal("🤘"); + constexpr std::string sign_of_the_horns("🤘"); + constexpr std::string metal_tone1("🤘🏻"); + constexpr std::string sign_of_the_horns_tone1("🤘🏻"); + constexpr std::string metal_tone2("🤘🏼"); + constexpr std::string sign_of_the_horns_tone2("🤘🏼"); + constexpr std::string metal_tone3("🤘🏽"); + constexpr std::string sign_of_the_horns_tone3("🤘🏽"); + constexpr std::string metal_tone4("🤘🏾"); + constexpr std::string sign_of_the_horns_tone4("🤘🏾"); + constexpr std::string metal_tone5("🤘🏿"); + constexpr std::string sign_of_the_horns_tone5("🤘🏿"); + constexpr std::string ok_hand("👌"); + constexpr std::string ok_hand_tone1("👌🏻"); + constexpr std::string ok_hand_tone2("👌🏼"); + constexpr std::string ok_hand_tone3("👌🏽"); + constexpr std::string ok_hand_tone4("👌🏾"); + constexpr std::string ok_hand_tone5("👌🏿"); + constexpr std::string pinched_fingers("🤌"); + constexpr std::string pinched_fingers_tone2("🤌🏼"); + constexpr std::string pinched_fingers_medium_light_skin_tone("🤌🏼"); + constexpr std::string pinched_fingers_tone1("🤌🏻"); + constexpr std::string pinched_fingers_light_skin_tone("🤌🏻"); + constexpr std::string pinched_fingers_tone3("🤌🏽"); + constexpr std::string pinched_fingers_medium_skin_tone("🤌🏽"); + constexpr std::string pinched_fingers_tone4("🤌🏾"); + constexpr std::string pinched_fingers_medium_dark_skin_tone("🤌🏾"); + constexpr std::string pinched_fingers_tone5("🤌🏿"); + constexpr std::string pinched_fingers_dark_skin_tone("🤌🏿"); + constexpr std::string pinching_hand("🤏"); + constexpr std::string pinching_hand_tone1("🤏🏻"); + constexpr std::string pinching_hand_light_skin_tone("🤏🏻"); + constexpr std::string pinching_hand_tone2("🤏🏼"); + constexpr std::string pinching_hand_medium_light_skin_tone("🤏🏼"); + constexpr std::string pinching_hand_tone3("🤏🏽"); + constexpr std::string pinching_hand_medium_skin_tone("🤏🏽"); + constexpr std::string pinching_hand_tone4("🤏🏾"); + constexpr std::string pinching_hand_medium_dark_skin_tone("🤏🏾"); + constexpr std::string pinching_hand_tone5("🤏🏿"); + constexpr std::string pinching_hand_dark_skin_tone("🤏🏿"); + constexpr std::string palm_down_hand("🫳"); + constexpr std::string palm_down_hand_tone1("🫳🏻"); + constexpr std::string palm_down_hand_light_skin_tone("🫳🏻"); + constexpr std::string palm_down_hand_tone2("🫳🏼"); + constexpr std::string palm_down_hand_medium_light_skin_tone("🫳🏼"); + constexpr std::string palm_down_hand_tone3("🫳🏽"); + constexpr std::string palm_down_hand_medium_skin_tone("🫳🏽"); + constexpr std::string palm_down_hand_tone4("🫳🏾"); + constexpr std::string palm_down_hand_medium_dark_skin_tone("🫳🏾"); + constexpr std::string palm_down_hand_tone5("🫳🏿"); + constexpr std::string palm_down_hand_dark_skin_tone("🫳🏿"); + constexpr std::string palm_up_hand("🫴"); + constexpr std::string palm_up_hand_tone1("🫴🏻"); + constexpr std::string palm_up_hand_light_skin_tone("🫴🏻"); + constexpr std::string palm_up_hand_tone2("🫴🏼"); + constexpr std::string palm_up_hand_medium_light_skin_tone("🫴🏼"); + constexpr std::string palm_up_hand_tone3("🫴🏽"); + constexpr std::string palm_up_hand_medium_skin_tone("🫴🏽"); + constexpr std::string palm_up_hand_tone4("🫴🏾"); + constexpr std::string palm_up_hand_medium_dark_skin_tone("🫴🏾"); + constexpr std::string palm_up_hand_tone5("🫴🏿"); + constexpr std::string palm_up_hand_dark_skin_tone("🫴🏿"); + constexpr std::string point_left("👈"); + constexpr std::string point_left_tone1("👈🏻"); + constexpr std::string point_left_tone2("👈🏼"); + constexpr std::string point_left_tone3("👈🏽"); + constexpr std::string point_left_tone4("👈🏾"); + constexpr std::string point_left_tone5("👈🏿"); + constexpr std::string point_right("👉"); + constexpr std::string point_right_tone1("👉🏻"); + constexpr std::string point_right_tone2("👉🏼"); + constexpr std::string point_right_tone3("👉🏽"); + constexpr std::string point_right_tone4("👉🏾"); + constexpr std::string point_right_tone5("👉🏿"); + constexpr std::string point_up_2("👆"); + constexpr std::string point_up_2_tone1("👆🏻"); + constexpr std::string point_up_2_tone2("👆🏼"); + constexpr std::string point_up_2_tone3("👆🏽"); + constexpr std::string point_up_2_tone4("👆🏾"); + constexpr std::string point_up_2_tone5("👆🏿"); + constexpr std::string point_down("👇"); + constexpr std::string point_down_tone1("👇🏻"); + constexpr std::string point_down_tone2("👇🏼"); + constexpr std::string point_down_tone3("👇🏽"); + constexpr std::string point_down_tone4("👇🏾"); + constexpr std::string point_down_tone5("👇🏿"); + constexpr std::string point_up("☝️"); + constexpr std::string point_up_tone1("☝🏻"); + constexpr std::string point_up_tone2("☝🏼"); + constexpr std::string point_up_tone3("☝🏽"); + constexpr std::string point_up_tone4("☝🏾"); + constexpr std::string point_up_tone5("☝🏿"); + constexpr std::string raised_hand("✋"); + constexpr std::string raised_hand_tone1("✋🏻"); + constexpr std::string raised_hand_tone2("✋🏼"); + constexpr std::string raised_hand_tone3("✋🏽"); + constexpr std::string raised_hand_tone4("✋🏾"); + constexpr std::string raised_hand_tone5("✋🏿"); + constexpr std::string raised_back_of_hand("🤚"); + constexpr std::string back_of_hand("🤚"); + constexpr std::string raised_back_of_hand_tone1("🤚🏻"); + constexpr std::string back_of_hand_tone1("🤚🏻"); + constexpr std::string raised_back_of_hand_tone2("🤚🏼"); + constexpr std::string back_of_hand_tone2("🤚🏼"); + constexpr std::string raised_back_of_hand_tone3("🤚🏽"); + constexpr std::string back_of_hand_tone3("🤚🏽"); + constexpr std::string raised_back_of_hand_tone4("🤚🏾"); + constexpr std::string back_of_hand_tone4("🤚🏾"); + constexpr std::string raised_back_of_hand_tone5("🤚🏿"); + constexpr std::string back_of_hand_tone5("🤚🏿"); + constexpr std::string hand_splayed("🖐️"); + constexpr std::string raised_hand_with_fingers_splayed("🖐️"); + constexpr std::string hand_splayed_tone1("🖐🏻"); + constexpr std::string raised_hand_with_fingers_splayed_tone1("🖐🏻"); + constexpr std::string hand_splayed_tone2("🖐🏼"); + constexpr std::string raised_hand_with_fingers_splayed_tone2("🖐🏼"); + constexpr std::string hand_splayed_tone3("🖐🏽"); + constexpr std::string raised_hand_with_fingers_splayed_tone3("🖐🏽"); + constexpr std::string hand_splayed_tone4("🖐🏾"); + constexpr std::string raised_hand_with_fingers_splayed_tone4("🖐🏾"); + constexpr std::string hand_splayed_tone5("🖐🏿"); + constexpr std::string raised_hand_with_fingers_splayed_tone5("🖐🏿"); + constexpr std::string vulcan("🖖"); + constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers("🖖"); + constexpr std::string vulcan_tone1("🖖🏻"); + constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone1("🖖🏻"); + constexpr std::string vulcan_tone2("🖖🏼"); + constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone2("🖖🏼"); + constexpr std::string vulcan_tone3("🖖🏽"); + constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone3("🖖🏽"); + constexpr std::string vulcan_tone4("🖖🏾"); + constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone4("🖖🏾"); + constexpr std::string vulcan_tone5("🖖🏿"); + constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone5("🖖🏿"); + constexpr std::string wave("👋"); + constexpr std::string wave_tone1("👋🏻"); + constexpr std::string wave_tone2("👋🏼"); + constexpr std::string wave_tone3("👋🏽"); + constexpr std::string wave_tone4("👋🏾"); + constexpr std::string wave_tone5("👋🏿"); + constexpr std::string call_me("🤙"); + constexpr std::string call_me_hand("🤙"); + constexpr std::string call_me_tone1("🤙🏻"); + constexpr std::string call_me_hand_tone1("🤙🏻"); + constexpr std::string call_me_tone2("🤙🏼"); + constexpr std::string call_me_hand_tone2("🤙🏼"); + constexpr std::string call_me_tone3("🤙🏽"); + constexpr std::string call_me_hand_tone3("🤙🏽"); + constexpr std::string call_me_tone4("🤙🏾"); + constexpr std::string call_me_hand_tone4("🤙🏾"); + constexpr std::string call_me_tone5("🤙🏿"); + constexpr std::string call_me_hand_tone5("🤙🏿"); + constexpr std::string leftwards_hand("🫲"); + constexpr std::string leftwards_hand_tone1("🫲🏻"); + constexpr std::string leftwards_hand_light_skin_tone("🫲🏻"); + constexpr std::string leftwards_hand_tone2("🫲🏼"); + constexpr std::string leftwards_hand_medium_light_skin_tone("🫲🏼"); + constexpr std::string leftwards_hand_tone3("🫲🏽"); + constexpr std::string leftwards_hand_medium_skin_tone("🫲🏽"); + constexpr std::string leftwards_hand_tone4("🫲🏾"); + constexpr std::string leftwards_hand_medium_dark_skin_tone("🫲🏾"); + constexpr std::string leftwards_hand_tone5("🫲🏿"); + constexpr std::string leftwards_hand_dark_skin_tone("🫲🏿"); + constexpr std::string rightwards_hand("🫱"); + constexpr std::string rightwards_hand_tone1("🫱🏻"); + constexpr std::string rightwards_hand_light_skin_tone("🫱🏻"); + constexpr std::string rightwards_hand_tone2("🫱🏼"); + constexpr std::string rightwards_hand_medium_light_skin_tone("🫱🏼"); + constexpr std::string rightwards_hand_tone3("🫱🏽"); + constexpr std::string rightwards_hand_medium_skin_tone("🫱🏽"); + constexpr std::string rightwards_hand_tone4("🫱🏾"); + constexpr std::string rightwards_hand_medium_dark_skin_tone("🫱🏾"); + constexpr std::string rightwards_hand_tone5("🫱🏿"); + constexpr std::string rightwards_hand_dark_skin_tone("🫱🏿"); + constexpr std::string muscle("💪"); + constexpr std::string muscle_tone1("💪🏻"); + constexpr std::string muscle_tone2("💪🏼"); + constexpr std::string muscle_tone3("💪🏽"); + constexpr std::string muscle_tone4("💪🏾"); + constexpr std::string muscle_tone5("💪🏿"); + constexpr std::string mechanical_arm("🦾"); + constexpr std::string middle_finger("🖕"); + constexpr std::string reversed_hand_with_middle_finger_extended("🖕"); + constexpr std::string middle_finger_tone1("🖕🏻"); + constexpr std::string reversed_hand_with_middle_finger_extended_tone1("🖕🏻"); + constexpr std::string middle_finger_tone2("🖕🏼"); + constexpr std::string reversed_hand_with_middle_finger_extended_tone2("🖕🏼"); + constexpr std::string middle_finger_tone3("🖕🏽"); + constexpr std::string reversed_hand_with_middle_finger_extended_tone3("🖕🏽"); + constexpr std::string middle_finger_tone4("🖕🏾"); + constexpr std::string reversed_hand_with_middle_finger_extended_tone4("🖕🏾"); + constexpr std::string middle_finger_tone5("🖕🏿"); + constexpr std::string reversed_hand_with_middle_finger_extended_tone5("🖕🏿"); + constexpr std::string writing_hand("✍️"); + constexpr std::string writing_hand_tone1("✍🏻"); + constexpr std::string writing_hand_tone2("✍🏼"); + constexpr std::string writing_hand_tone3("✍🏽"); + constexpr std::string writing_hand_tone4("✍🏾"); + constexpr std::string writing_hand_tone5("✍🏿"); + constexpr std::string pray("🙏"); + constexpr std::string pray_tone1("🙏🏻"); + constexpr std::string pray_tone2("🙏🏼"); + constexpr std::string pray_tone3("🙏🏽"); + constexpr std::string pray_tone4("🙏🏾"); + constexpr std::string pray_tone5("🙏🏿"); + constexpr std::string index_pointing_at_the_viewer("🫵"); + constexpr std::string index_pointing_at_the_viewer_tone1("🫵🏻"); + constexpr std::string index_pointing_at_the_viewer_light_skin_tone("🫵🏻"); + constexpr std::string index_pointing_at_the_viewer_tone2("🫵🏼"); + constexpr std::string index_pointing_at_the_viewer_medium_light_skin_tone("🫵🏼"); + constexpr std::string index_pointing_at_the_viewer_tone3("🫵🏽"); + constexpr std::string index_pointing_at_the_viewer_medium_skin_tone("🫵🏽"); + constexpr std::string index_pointing_at_the_viewer_tone4("🫵🏾"); + constexpr std::string index_pointing_at_the_viewer_medium_dark_skin_tone("🫵🏾"); + constexpr std::string index_pointing_at_the_viewer_tone5("🫵🏿"); + constexpr std::string index_pointing_at_the_viewer_dark_skin_tone("🫵🏿"); + constexpr std::string foot("🦶"); + constexpr std::string foot_tone1("🦶🏻"); + constexpr std::string foot_light_skin_tone("🦶🏻"); + constexpr std::string foot_tone2("🦶🏼"); + constexpr std::string foot_medium_light_skin_tone("🦶🏼"); + constexpr std::string foot_tone3("🦶🏽"); + constexpr std::string foot_medium_skin_tone("🦶🏽"); + constexpr std::string foot_tone4("🦶🏾"); + constexpr std::string foot_medium_dark_skin_tone("🦶🏾"); + constexpr std::string foot_tone5("🦶🏿"); + constexpr std::string foot_dark_skin_tone("🦶🏿"); + constexpr std::string leg("🦵"); + constexpr std::string leg_tone1("🦵🏻"); + constexpr std::string leg_light_skin_tone("🦵🏻"); + constexpr std::string leg_tone2("🦵🏼"); + constexpr std::string leg_medium_light_skin_tone("🦵🏼"); + constexpr std::string leg_tone3("🦵🏽"); + constexpr std::string leg_medium_skin_tone("🦵🏽"); + constexpr std::string leg_tone4("🦵🏾"); + constexpr std::string leg_medium_dark_skin_tone("🦵🏾"); + constexpr std::string leg_tone5("🦵🏿"); + constexpr std::string leg_dark_skin_tone("🦵🏿"); + constexpr std::string mechanical_leg("🦿"); + constexpr std::string lipstick("💄"); + constexpr std::string kiss("💋"); + constexpr std::string lips("👄"); + constexpr std::string biting_lip("🫦"); + constexpr std::string tooth("🦷"); + constexpr std::string tongue("👅"); + constexpr std::string ear("👂"); + constexpr std::string ear_tone1("👂🏻"); + constexpr std::string ear_tone2("👂🏼"); + constexpr std::string ear_tone3("👂🏽"); + constexpr std::string ear_tone4("👂🏾"); + constexpr std::string ear_tone5("👂🏿"); + constexpr std::string ear_with_hearing_aid("🦻"); + constexpr std::string ear_with_hearing_aid_tone1("🦻🏻"); + constexpr std::string ear_with_hearing_aid_light_skin_tone("🦻🏻"); + constexpr std::string ear_with_hearing_aid_tone2("🦻🏼"); + constexpr std::string ear_with_hearing_aid_medium_light_skin_tone("🦻🏼"); + constexpr std::string ear_with_hearing_aid_tone3("🦻🏽"); + constexpr std::string ear_with_hearing_aid_medium_skin_tone("🦻🏽"); + constexpr std::string ear_with_hearing_aid_tone4("🦻🏾"); + constexpr std::string ear_with_hearing_aid_medium_dark_skin_tone("🦻🏾"); + constexpr std::string ear_with_hearing_aid_tone5("🦻🏿"); + constexpr std::string ear_with_hearing_aid_dark_skin_tone("🦻🏿"); + constexpr std::string nose("👃"); + constexpr std::string nose_tone1("👃🏻"); + constexpr std::string nose_tone2("👃🏼"); + constexpr std::string nose_tone3("👃🏽"); + constexpr std::string nose_tone4("👃🏾"); + constexpr std::string nose_tone5("👃🏿"); + constexpr std::string footprints("👣"); + constexpr std::string eye("👁️"); + constexpr std::string eyes("👀"); + constexpr std::string anatomical_heart("🫀"); + constexpr std::string lungs("🫁"); + constexpr std::string brain("🧠"); + constexpr std::string speaking_head("🗣️"); + constexpr std::string speaking_head_in_silhouette("🗣️"); + constexpr std::string bust_in_silhouette("👤"); + constexpr std::string busts_in_silhouette("👥"); + constexpr std::string people_hugging("🫂"); + constexpr std::string baby("👶"); + constexpr std::string baby_tone1("👶🏻"); + constexpr std::string baby_tone2("👶🏼"); + constexpr std::string baby_tone3("👶🏽"); + constexpr std::string baby_tone4("👶🏾"); + constexpr std::string baby_tone5("👶🏿"); + constexpr std::string child("🧒"); + constexpr std::string child_tone1("🧒🏻"); + constexpr std::string child_light_skin_tone("🧒🏻"); + constexpr std::string child_tone2("🧒🏼"); + constexpr std::string child_medium_light_skin_tone("🧒🏼"); + constexpr std::string child_tone3("🧒🏽"); + constexpr std::string child_medium_skin_tone("🧒🏽"); + constexpr std::string child_tone4("🧒🏾"); + constexpr std::string child_medium_dark_skin_tone("🧒🏾"); + constexpr std::string child_tone5("🧒🏿"); + constexpr std::string child_dark_skin_tone("🧒🏿"); + constexpr std::string girl("👧"); + constexpr std::string girl_tone1("👧🏻"); + constexpr std::string girl_tone2("👧🏼"); + constexpr std::string girl_tone3("👧🏽"); + constexpr std::string girl_tone4("👧🏾"); + constexpr std::string girl_tone5("👧🏿"); + constexpr std::string boy("👦"); + constexpr std::string boy_tone1("👦🏻"); + constexpr std::string boy_tone2("👦🏼"); + constexpr std::string boy_tone3("👦🏽"); + constexpr std::string boy_tone4("👦🏾"); + constexpr std::string boy_tone5("👦🏿"); + constexpr std::string adult("🧑"); + constexpr std::string adult_tone1("🧑🏻"); + constexpr std::string adult_light_skin_tone("🧑🏻"); + constexpr std::string adult_tone2("🧑🏼"); + constexpr std::string adult_medium_light_skin_tone("🧑🏼"); + constexpr std::string adult_tone3("🧑🏽"); + constexpr std::string adult_medium_skin_tone("🧑🏽"); + constexpr std::string adult_tone4("🧑🏾"); + constexpr std::string adult_medium_dark_skin_tone("🧑🏾"); + constexpr std::string adult_tone5("🧑🏿"); + constexpr std::string adult_dark_skin_tone("🧑🏿"); + constexpr std::string woman("👩"); + constexpr std::string woman_tone1("👩🏻"); + constexpr std::string woman_tone2("👩🏼"); + constexpr std::string woman_tone3("👩🏽"); + constexpr std::string woman_tone4("👩🏾"); + constexpr std::string woman_tone5("👩🏿"); + constexpr std::string man("👨"); + constexpr std::string man_tone1("👨🏻"); + constexpr std::string man_tone2("👨🏼"); + constexpr std::string man_tone3("👨🏽"); + constexpr std::string man_tone4("👨🏾"); + constexpr std::string man_tone5("👨🏿"); + constexpr std::string person_curly_hair("🧑‍🦱"); + constexpr std::string person_tone1_curly_hair("🧑🏻‍🦱"); + constexpr std::string person_light_skin_tone_curly_hair("🧑🏻‍🦱"); + constexpr std::string person_tone2_curly_hair("🧑🏼‍🦱"); + constexpr std::string person_medium_light_skin_tone_curly_hair("🧑🏼‍🦱"); + constexpr std::string person_tone3_curly_hair("🧑🏽‍🦱"); + constexpr std::string person_medium_skin_tone_curly_hair("🧑🏽‍🦱"); + constexpr std::string person_tone4_curly_hair("🧑🏾‍🦱"); + constexpr std::string person_medium_dark_skin_tone_curly_hair("🧑🏾‍🦱"); + constexpr std::string person_tone5_curly_hair("🧑🏿‍🦱"); + constexpr std::string person_dark_skin_tone_curly_hair("🧑🏿‍🦱"); + constexpr std::string woman_curly_haired("👩‍🦱"); + constexpr std::string woman_curly_haired_tone1("👩🏻‍🦱"); + constexpr std::string woman_curly_haired_light_skin_tone("👩🏻‍🦱"); + constexpr std::string woman_curly_haired_tone2("👩🏼‍🦱"); + constexpr std::string woman_curly_haired_medium_light_skin_tone("👩🏼‍🦱"); + constexpr std::string woman_curly_haired_tone3("👩🏽‍🦱"); + constexpr std::string woman_curly_haired_medium_skin_tone("👩🏽‍🦱"); + constexpr std::string woman_curly_haired_tone4("👩🏾‍🦱"); + constexpr std::string woman_curly_haired_medium_dark_skin_tone("👩🏾‍🦱"); + constexpr std::string woman_curly_haired_tone5("👩🏿‍🦱"); + constexpr std::string woman_curly_haired_dark_skin_tone("👩🏿‍🦱"); + constexpr std::string man_curly_haired("👨‍🦱"); + constexpr std::string man_curly_haired_tone1("👨🏻‍🦱"); + constexpr std::string man_curly_haired_light_skin_tone("👨🏻‍🦱"); + constexpr std::string man_curly_haired_tone2("👨🏼‍🦱"); + constexpr std::string man_curly_haired_medium_light_skin_tone("👨🏼‍🦱"); + constexpr std::string man_curly_haired_tone3("👨🏽‍🦱"); + constexpr std::string man_curly_haired_medium_skin_tone("👨🏽‍🦱"); + constexpr std::string man_curly_haired_tone4("👨🏾‍🦱"); + constexpr std::string man_curly_haired_medium_dark_skin_tone("👨🏾‍🦱"); + constexpr std::string man_curly_haired_tone5("👨🏿‍🦱"); + constexpr std::string man_curly_haired_dark_skin_tone("👨🏿‍🦱"); + constexpr std::string person_red_hair("🧑‍🦰"); + constexpr std::string person_tone1_red_hair("🧑🏻‍🦰"); + constexpr std::string person_light_skin_tone_red_hair("🧑🏻‍🦰"); + constexpr std::string person_tone2_red_hair("🧑🏼‍🦰"); + constexpr std::string person_medium_light_skin_tone_red_hair("🧑🏼‍🦰"); + constexpr std::string person_tone3_red_hair("🧑🏽‍🦰"); + constexpr std::string person_medium_skin_tone_red_hair("🧑🏽‍🦰"); + constexpr std::string person_tone4_red_hair("🧑🏾‍🦰"); + constexpr std::string person_medium_dark_skin_tone_red_hair("🧑🏾‍🦰"); + constexpr std::string person_tone5_red_hair("🧑🏿‍🦰"); + constexpr std::string person_dark_skin_tone_red_hair("🧑🏿‍🦰"); + constexpr std::string woman_red_haired("👩‍🦰"); + constexpr std::string woman_red_haired_tone1("👩🏻‍🦰"); + constexpr std::string woman_red_haired_light_skin_tone("👩🏻‍🦰"); + constexpr std::string woman_red_haired_tone2("👩🏼‍🦰"); + constexpr std::string woman_red_haired_medium_light_skin_tone("👩🏼‍🦰"); + constexpr std::string woman_red_haired_tone3("👩🏽‍🦰"); + constexpr std::string woman_red_haired_medium_skin_tone("👩🏽‍🦰"); + constexpr std::string woman_red_haired_tone4("👩🏾‍🦰"); + constexpr std::string woman_red_haired_medium_dark_skin_tone("👩🏾‍🦰"); + constexpr std::string woman_red_haired_tone5("👩🏿‍🦰"); + constexpr std::string woman_red_haired_dark_skin_tone("👩🏿‍🦰"); + constexpr std::string man_red_haired("👨‍🦰"); + constexpr std::string man_red_haired_tone1("👨🏻‍🦰"); + constexpr std::string man_red_haired_light_skin_tone("👨🏻‍🦰"); + constexpr std::string man_red_haired_tone2("👨🏼‍🦰"); + constexpr std::string man_red_haired_medium_light_skin_tone("👨🏼‍🦰"); + constexpr std::string man_red_haired_tone3("👨🏽‍🦰"); + constexpr std::string man_red_haired_medium_skin_tone("👨🏽‍🦰"); + constexpr std::string man_red_haired_tone4("👨🏾‍🦰"); + constexpr std::string man_red_haired_medium_dark_skin_tone("👨🏾‍🦰"); + constexpr std::string man_red_haired_tone5("👨🏿‍🦰"); + constexpr std::string man_red_haired_dark_skin_tone("👨🏿‍🦰"); + constexpr std::string blond_haired_person("👱"); + constexpr std::string person_with_blond_hair("👱"); + constexpr std::string blond_haired_person_tone1("👱🏻"); + constexpr std::string person_with_blond_hair_tone1("👱🏻"); + constexpr std::string blond_haired_person_tone2("👱🏼"); + constexpr std::string person_with_blond_hair_tone2("👱🏼"); + constexpr std::string blond_haired_person_tone3("👱🏽"); + constexpr std::string person_with_blond_hair_tone3("👱🏽"); + constexpr std::string blond_haired_person_tone4("👱🏾"); + constexpr std::string person_with_blond_hair_tone4("👱🏾"); + constexpr std::string blond_haired_person_tone5("👱🏿"); + constexpr std::string person_with_blond_hair_tone5("👱🏿"); + constexpr std::string blond_haired_woman("👱‍♀️"); + constexpr std::string blond_haired_woman_tone1("👱🏻‍♀️"); + constexpr std::string blond_haired_woman_light_skin_tone("👱🏻‍♀️"); + constexpr std::string blond_haired_woman_tone2("👱🏼‍♀️"); + constexpr std::string blond_haired_woman_medium_light_skin_tone("👱🏼‍♀️"); + constexpr std::string blond_haired_woman_tone3("👱🏽‍♀️"); + constexpr std::string blond_haired_woman_medium_skin_tone("👱🏽‍♀️"); + constexpr std::string blond_haired_woman_tone4("👱🏾‍♀️"); + constexpr std::string blond_haired_woman_medium_dark_skin_tone("👱🏾‍♀️"); + constexpr std::string blond_haired_woman_tone5("👱🏿‍♀️"); + constexpr std::string blond_haired_woman_dark_skin_tone("👱🏿‍♀️"); + constexpr std::string blond_haired_man("👱‍♂️"); + constexpr std::string blond_haired_man_tone1("👱🏻‍♂️"); + constexpr std::string blond_haired_man_light_skin_tone("👱🏻‍♂️"); + constexpr std::string blond_haired_man_tone2("👱🏼‍♂️"); + constexpr std::string blond_haired_man_medium_light_skin_tone("👱🏼‍♂️"); + constexpr std::string blond_haired_man_tone3("👱🏽‍♂️"); + constexpr std::string blond_haired_man_medium_skin_tone("👱🏽‍♂️"); + constexpr std::string blond_haired_man_tone4("👱🏾‍♂️"); + constexpr std::string blond_haired_man_medium_dark_skin_tone("👱🏾‍♂️"); + constexpr std::string blond_haired_man_tone5("👱🏿‍♂️"); + constexpr std::string blond_haired_man_dark_skin_tone("👱🏿‍♂️"); + constexpr std::string person_white_hair("🧑‍🦳"); + constexpr std::string person_tone1_white_hair("🧑🏻‍🦳"); + constexpr std::string person_light_skin_tone_white_hair("🧑🏻‍🦳"); + constexpr std::string person_tone2_white_hair("🧑🏼‍🦳"); + constexpr std::string person_medium_light_skin_tone_white_hair("🧑🏼‍🦳"); + constexpr std::string person_tone3_white_hair("🧑🏽‍🦳"); + constexpr std::string person_medium_skin_tone_white_hair("🧑🏽‍🦳"); + constexpr std::string person_tone4_white_hair("🧑🏾‍🦳"); + constexpr std::string person_medium_dark_skin_tone_white_hair("🧑🏾‍🦳"); + constexpr std::string person_tone5_white_hair("🧑🏿‍🦳"); + constexpr std::string person_dark_skin_tone_white_hair("🧑🏿‍🦳"); + constexpr std::string woman_white_haired("👩‍🦳"); + constexpr std::string woman_white_haired_tone1("👩🏻‍🦳"); + constexpr std::string woman_white_haired_light_skin_tone("👩🏻‍🦳"); + constexpr std::string woman_white_haired_tone2("👩🏼‍🦳"); + constexpr std::string woman_white_haired_medium_light_skin_tone("👩🏼‍🦳"); + constexpr std::string woman_white_haired_tone3("👩🏽‍🦳"); + constexpr std::string woman_white_haired_medium_skin_tone("👩🏽‍🦳"); + constexpr std::string woman_white_haired_tone4("👩🏾‍🦳"); + constexpr std::string woman_white_haired_medium_dark_skin_tone("👩🏾‍🦳"); + constexpr std::string woman_white_haired_tone5("👩🏿‍🦳"); + constexpr std::string woman_white_haired_dark_skin_tone("👩🏿‍🦳"); + constexpr std::string man_white_haired("👨‍🦳"); + constexpr std::string man_white_haired_tone1("👨🏻‍🦳"); + constexpr std::string man_white_haired_light_skin_tone("👨🏻‍🦳"); + constexpr std::string man_white_haired_tone2("👨🏼‍🦳"); + constexpr std::string man_white_haired_medium_light_skin_tone("👨🏼‍🦳"); + constexpr std::string man_white_haired_tone3("👨🏽‍🦳"); + constexpr std::string man_white_haired_medium_skin_tone("👨🏽‍🦳"); + constexpr std::string man_white_haired_tone4("👨🏾‍🦳"); + constexpr std::string man_white_haired_medium_dark_skin_tone("👨🏾‍🦳"); + constexpr std::string man_white_haired_tone5("👨🏿‍🦳"); + constexpr std::string man_white_haired_dark_skin_tone("👨🏿‍🦳"); + constexpr std::string person_bald("🧑‍🦲"); + constexpr std::string person_tone1_bald("🧑🏻‍🦲"); + constexpr std::string person_light_skin_tone_bald("🧑🏻‍🦲"); + constexpr std::string person_tone2_bald("🧑🏼‍🦲"); + constexpr std::string person_medium_light_skin_tone_bald("🧑🏼‍🦲"); + constexpr std::string person_tone3_bald("🧑🏽‍🦲"); + constexpr std::string person_medium_skin_tone_bald("🧑🏽‍🦲"); + constexpr std::string person_tone4_bald("🧑🏾‍🦲"); + constexpr std::string person_medium_dark_skin_tone_bald("🧑🏾‍🦲"); + constexpr std::string person_tone5_bald("🧑🏿‍🦲"); + constexpr std::string person_dark_skin_tone_bald("🧑🏿‍🦲"); + constexpr std::string woman_bald("👩‍🦲"); + constexpr std::string woman_bald_tone1("👩🏻‍🦲"); + constexpr std::string woman_bald_light_skin_tone("👩🏻‍🦲"); + constexpr std::string woman_bald_tone2("👩🏼‍🦲"); + constexpr std::string woman_bald_medium_light_skin_tone("👩🏼‍🦲"); + constexpr std::string woman_bald_tone3("👩🏽‍🦲"); + constexpr std::string woman_bald_medium_skin_tone("👩🏽‍🦲"); + constexpr std::string woman_bald_tone4("👩🏾‍🦲"); + constexpr std::string woman_bald_medium_dark_skin_tone("👩🏾‍🦲"); + constexpr std::string woman_bald_tone5("👩🏿‍🦲"); + constexpr std::string woman_bald_dark_skin_tone("👩🏿‍🦲"); + constexpr std::string man_bald("👨‍🦲"); + constexpr std::string man_bald_tone1("👨🏻‍🦲"); + constexpr std::string man_bald_light_skin_tone("👨🏻‍🦲"); + constexpr std::string man_bald_tone2("👨🏼‍🦲"); + constexpr std::string man_bald_medium_light_skin_tone("👨🏼‍🦲"); + constexpr std::string man_bald_tone3("👨🏽‍🦲"); + constexpr std::string man_bald_medium_skin_tone("👨🏽‍🦲"); + constexpr std::string man_bald_tone4("👨🏾‍🦲"); + constexpr std::string man_bald_medium_dark_skin_tone("👨🏾‍🦲"); + constexpr std::string man_bald_tone5("👨🏿‍🦲"); + constexpr std::string man_bald_dark_skin_tone("👨🏿‍🦲"); + constexpr std::string bearded_person("🧔"); + constexpr std::string bearded_person_tone1("🧔🏻"); + constexpr std::string bearded_person_light_skin_tone("🧔🏻"); + constexpr std::string bearded_person_tone2("🧔🏼"); + constexpr std::string bearded_person_medium_light_skin_tone("🧔🏼"); + constexpr std::string bearded_person_tone3("🧔🏽"); + constexpr std::string bearded_person_medium_skin_tone("🧔🏽"); + constexpr std::string bearded_person_tone4("🧔🏾"); + constexpr std::string bearded_person_medium_dark_skin_tone("🧔🏾"); + constexpr std::string bearded_person_tone5("🧔🏿"); + constexpr std::string bearded_person_dark_skin_tone("🧔🏿"); + constexpr std::string woman_beard("🧔‍♀️"); + constexpr std::string woman_tone1_beard("🧔🏻‍♀️"); + constexpr std::string woman_light_skin_tone_beard("🧔🏻‍♀️"); + constexpr std::string woman_tone2_beard("🧔🏼‍♀️"); + constexpr std::string woman_medium_light_skin_tone_beard("🧔🏼‍♀️"); + constexpr std::string woman_tone3_beard("🧔🏽‍♀️"); + constexpr std::string woman_medium_skin_tone_beard("🧔🏽‍♀️"); + constexpr std::string woman_tone4_beard("🧔🏾‍♀️"); + constexpr std::string woman_medium_dark_skin_tone_beard("🧔🏾‍♀️"); + constexpr std::string woman_tone5_beard("🧔🏿‍♀️"); + constexpr std::string woman_dark_skin_tone_beard("🧔🏿‍♀️"); + constexpr std::string man_beard("🧔‍♂️"); + constexpr std::string man_tone1_beard("🧔🏻‍♂️"); + constexpr std::string man_light_skin_tone_beard("🧔🏻‍♂️"); + constexpr std::string man_tone2_beard("🧔🏼‍♂️"); + constexpr std::string man_medium_light_skin_tone_beard("🧔🏼‍♂️"); + constexpr std::string man_tone3_beard("🧔🏽‍♂️"); + constexpr std::string man_medium_skin_tone_beard("🧔🏽‍♂️"); + constexpr std::string man_tone4_beard("🧔🏾‍♂️"); + constexpr std::string man_medium_dark_skin_tone_beard("🧔🏾‍♂️"); + constexpr std::string man_tone5_beard("🧔🏿‍♂️"); + constexpr std::string man_dark_skin_tone_beard("🧔🏿‍♂️"); + constexpr std::string older_adult("🧓"); + constexpr std::string older_adult_tone1("🧓🏻"); + constexpr std::string older_adult_light_skin_tone("🧓🏻"); + constexpr std::string older_adult_tone2("🧓🏼"); + constexpr std::string older_adult_medium_light_skin_tone("🧓🏼"); + constexpr std::string older_adult_tone3("🧓🏽"); + constexpr std::string older_adult_medium_skin_tone("🧓🏽"); + constexpr std::string older_adult_tone4("🧓🏾"); + constexpr std::string older_adult_medium_dark_skin_tone("🧓🏾"); + constexpr std::string older_adult_tone5("🧓🏿"); + constexpr std::string older_adult_dark_skin_tone("🧓🏿"); + constexpr std::string older_woman("👵"); + constexpr std::string grandma("👵"); + constexpr std::string older_woman_tone1("👵🏻"); + constexpr std::string grandma_tone1("👵🏻"); + constexpr std::string older_woman_tone2("👵🏼"); + constexpr std::string grandma_tone2("👵🏼"); + constexpr std::string older_woman_tone3("👵🏽"); + constexpr std::string grandma_tone3("👵🏽"); + constexpr std::string older_woman_tone4("👵🏾"); + constexpr std::string grandma_tone4("👵🏾"); + constexpr std::string older_woman_tone5("👵🏿"); + constexpr std::string grandma_tone5("👵🏿"); + constexpr std::string older_man("👴"); + constexpr std::string older_man_tone1("👴🏻"); + constexpr std::string older_man_tone2("👴🏼"); + constexpr std::string older_man_tone3("👴🏽"); + constexpr std::string older_man_tone4("👴🏾"); + constexpr std::string older_man_tone5("👴🏿"); + constexpr std::string man_with_chinese_cap("👲"); + constexpr std::string man_with_gua_pi_mao("👲"); + constexpr std::string man_with_chinese_cap_tone1("👲🏻"); + constexpr std::string man_with_gua_pi_mao_tone1("👲🏻"); + constexpr std::string man_with_chinese_cap_tone2("👲🏼"); + constexpr std::string man_with_gua_pi_mao_tone2("👲🏼"); + constexpr std::string man_with_chinese_cap_tone3("👲🏽"); + constexpr std::string man_with_gua_pi_mao_tone3("👲🏽"); + constexpr std::string man_with_chinese_cap_tone4("👲🏾"); + constexpr std::string man_with_gua_pi_mao_tone4("👲🏾"); + constexpr std::string man_with_chinese_cap_tone5("👲🏿"); + constexpr std::string man_with_gua_pi_mao_tone5("👲🏿"); + constexpr std::string person_wearing_turban("👳"); + constexpr std::string man_with_turban("👳"); + constexpr std::string person_wearing_turban_tone1("👳🏻"); + constexpr std::string man_with_turban_tone1("👳🏻"); + constexpr std::string person_wearing_turban_tone2("👳🏼"); + constexpr std::string man_with_turban_tone2("👳🏼"); + constexpr std::string person_wearing_turban_tone3("👳🏽"); + constexpr std::string man_with_turban_tone3("👳🏽"); + constexpr std::string person_wearing_turban_tone4("👳🏾"); + constexpr std::string man_with_turban_tone4("👳🏾"); + constexpr std::string person_wearing_turban_tone5("👳🏿"); + constexpr std::string man_with_turban_tone5("👳🏿"); + constexpr std::string woman_wearing_turban("👳‍♀️"); + constexpr std::string woman_wearing_turban_tone1("👳🏻‍♀️"); + constexpr std::string woman_wearing_turban_light_skin_tone("👳🏻‍♀️"); + constexpr std::string woman_wearing_turban_tone2("👳🏼‍♀️"); + constexpr std::string woman_wearing_turban_medium_light_skin_tone("👳🏼‍♀️"); + constexpr std::string woman_wearing_turban_tone3("👳🏽‍♀️"); + constexpr std::string woman_wearing_turban_medium_skin_tone("👳🏽‍♀️"); + constexpr std::string woman_wearing_turban_tone4("👳🏾‍♀️"); + constexpr std::string woman_wearing_turban_medium_dark_skin_tone("👳🏾‍♀️"); + constexpr std::string woman_wearing_turban_tone5("👳🏿‍♀️"); + constexpr std::string woman_wearing_turban_dark_skin_tone("👳🏿‍♀️"); + constexpr std::string man_wearing_turban("👳‍♂️"); + constexpr std::string man_wearing_turban_tone1("👳🏻‍♂️"); + constexpr std::string man_wearing_turban_light_skin_tone("👳🏻‍♂️"); + constexpr std::string man_wearing_turban_tone2("👳🏼‍♂️"); + constexpr std::string man_wearing_turban_medium_light_skin_tone("👳🏼‍♂️"); + constexpr std::string man_wearing_turban_tone3("👳🏽‍♂️"); + constexpr std::string man_wearing_turban_medium_skin_tone("👳🏽‍♂️"); + constexpr std::string man_wearing_turban_tone4("👳🏾‍♂️"); + constexpr std::string man_wearing_turban_medium_dark_skin_tone("👳🏾‍♂️"); + constexpr std::string man_wearing_turban_tone5("👳🏿‍♂️"); + constexpr std::string man_wearing_turban_dark_skin_tone("👳🏿‍♂️"); + constexpr std::string woman_with_headscarf("🧕"); + constexpr std::string woman_with_headscarf_tone1("🧕🏻"); + constexpr std::string woman_with_headscarf_light_skin_tone("🧕🏻"); + constexpr std::string woman_with_headscarf_tone2("🧕🏼"); + constexpr std::string woman_with_headscarf_medium_light_skin_tone("🧕🏼"); + constexpr std::string woman_with_headscarf_tone3("🧕🏽"); + constexpr std::string woman_with_headscarf_medium_skin_tone("🧕🏽"); + constexpr std::string woman_with_headscarf_tone4("🧕🏾"); + constexpr std::string woman_with_headscarf_medium_dark_skin_tone("🧕🏾"); + constexpr std::string woman_with_headscarf_tone5("🧕🏿"); + constexpr std::string woman_with_headscarf_dark_skin_tone("🧕🏿"); + constexpr std::string police_officer("👮"); + constexpr std::string cop("👮"); + constexpr std::string police_officer_tone1("👮🏻"); + constexpr std::string cop_tone1("👮🏻"); + constexpr std::string police_officer_tone2("👮🏼"); + constexpr std::string cop_tone2("👮🏼"); + constexpr std::string police_officer_tone3("👮🏽"); + constexpr std::string cop_tone3("👮🏽"); + constexpr std::string police_officer_tone4("👮🏾"); + constexpr std::string cop_tone4("👮🏾"); + constexpr std::string police_officer_tone5("👮🏿"); + constexpr std::string cop_tone5("👮🏿"); + constexpr std::string woman_police_officer("👮‍♀️"); + constexpr std::string woman_police_officer_tone1("👮🏻‍♀️"); + constexpr std::string woman_police_officer_light_skin_tone("👮🏻‍♀️"); + constexpr std::string woman_police_officer_tone2("👮🏼‍♀️"); + constexpr std::string woman_police_officer_medium_light_skin_tone("👮🏼‍♀️"); + constexpr std::string woman_police_officer_tone3("👮🏽‍♀️"); + constexpr std::string woman_police_officer_medium_skin_tone("👮🏽‍♀️"); + constexpr std::string woman_police_officer_tone4("👮🏾‍♀️"); + constexpr std::string woman_police_officer_medium_dark_skin_tone("👮🏾‍♀️"); + constexpr std::string woman_police_officer_tone5("👮🏿‍♀️"); + constexpr std::string woman_police_officer_dark_skin_tone("👮🏿‍♀️"); + constexpr std::string man_police_officer("👮‍♂️"); + constexpr std::string man_police_officer_tone1("👮🏻‍♂️"); + constexpr std::string man_police_officer_light_skin_tone("👮🏻‍♂️"); + constexpr std::string man_police_officer_tone2("👮🏼‍♂️"); + constexpr std::string man_police_officer_medium_light_skin_tone("👮🏼‍♂️"); + constexpr std::string man_police_officer_tone3("👮🏽‍♂️"); + constexpr std::string man_police_officer_medium_skin_tone("👮🏽‍♂️"); + constexpr std::string man_police_officer_tone4("👮🏾‍♂️"); + constexpr std::string man_police_officer_medium_dark_skin_tone("👮🏾‍♂️"); + constexpr std::string man_police_officer_tone5("👮🏿‍♂️"); + constexpr std::string man_police_officer_dark_skin_tone("👮🏿‍♂️"); + constexpr std::string construction_worker("👷"); + constexpr std::string construction_worker_tone1("👷🏻"); + constexpr std::string construction_worker_tone2("👷🏼"); + constexpr std::string construction_worker_tone3("👷🏽"); + constexpr std::string construction_worker_tone4("👷🏾"); + constexpr std::string construction_worker_tone5("👷🏿"); + constexpr std::string woman_construction_worker("👷‍♀️"); + constexpr std::string woman_construction_worker_tone1("👷🏻‍♀️"); + constexpr std::string woman_construction_worker_light_skin_tone("👷🏻‍♀️"); + constexpr std::string woman_construction_worker_tone2("👷🏼‍♀️"); + constexpr std::string woman_construction_worker_medium_light_skin_tone("👷🏼‍♀️"); + constexpr std::string woman_construction_worker_tone3("👷🏽‍♀️"); + constexpr std::string woman_construction_worker_medium_skin_tone("👷🏽‍♀️"); + constexpr std::string woman_construction_worker_tone4("👷🏾‍♀️"); + constexpr std::string woman_construction_worker_medium_dark_skin_tone("👷🏾‍♀️"); + constexpr std::string woman_construction_worker_tone5("👷🏿‍♀️"); + constexpr std::string woman_construction_worker_dark_skin_tone("👷🏿‍♀️"); + constexpr std::string man_construction_worker("👷‍♂️"); + constexpr std::string man_construction_worker_tone1("👷🏻‍♂️"); + constexpr std::string man_construction_worker_light_skin_tone("👷🏻‍♂️"); + constexpr std::string man_construction_worker_tone2("👷🏼‍♂️"); + constexpr std::string man_construction_worker_medium_light_skin_tone("👷🏼‍♂️"); + constexpr std::string man_construction_worker_tone3("👷🏽‍♂️"); + constexpr std::string man_construction_worker_medium_skin_tone("👷🏽‍♂️"); + constexpr std::string man_construction_worker_tone4("👷🏾‍♂️"); + constexpr std::string man_construction_worker_medium_dark_skin_tone("👷🏾‍♂️"); + constexpr std::string man_construction_worker_tone5("👷🏿‍♂️"); + constexpr std::string man_construction_worker_dark_skin_tone("👷🏿‍♂️"); + constexpr std::string guard("💂"); + constexpr std::string guardsman("💂"); + constexpr std::string guard_tone1("💂🏻"); + constexpr std::string guardsman_tone1("💂🏻"); + constexpr std::string guard_tone2("💂🏼"); + constexpr std::string guardsman_tone2("💂🏼"); + constexpr std::string guard_tone3("💂🏽"); + constexpr std::string guardsman_tone3("💂🏽"); + constexpr std::string guard_tone4("💂🏾"); + constexpr std::string guardsman_tone4("💂🏾"); + constexpr std::string guard_tone5("💂🏿"); + constexpr std::string guardsman_tone5("💂🏿"); + constexpr std::string woman_guard("💂‍♀️"); + constexpr std::string woman_guard_tone1("💂🏻‍♀️"); + constexpr std::string woman_guard_light_skin_tone("💂🏻‍♀️"); + constexpr std::string woman_guard_tone2("💂🏼‍♀️"); + constexpr std::string woman_guard_medium_light_skin_tone("💂🏼‍♀️"); + constexpr std::string woman_guard_tone3("💂🏽‍♀️"); + constexpr std::string woman_guard_medium_skin_tone("💂🏽‍♀️"); + constexpr std::string woman_guard_tone4("💂🏾‍♀️"); + constexpr std::string woman_guard_medium_dark_skin_tone("💂🏾‍♀️"); + constexpr std::string woman_guard_tone5("💂🏿‍♀️"); + constexpr std::string woman_guard_dark_skin_tone("💂🏿‍♀️"); + constexpr std::string man_guard("💂‍♂️"); + constexpr std::string man_guard_tone1("💂🏻‍♂️"); + constexpr std::string man_guard_light_skin_tone("💂🏻‍♂️"); + constexpr std::string man_guard_tone2("💂🏼‍♂️"); + constexpr std::string man_guard_medium_light_skin_tone("💂🏼‍♂️"); + constexpr std::string man_guard_tone3("💂🏽‍♂️"); + constexpr std::string man_guard_medium_skin_tone("💂🏽‍♂️"); + constexpr std::string man_guard_tone4("💂🏾‍♂️"); + constexpr std::string man_guard_medium_dark_skin_tone("💂🏾‍♂️"); + constexpr std::string man_guard_tone5("💂🏿‍♂️"); + constexpr std::string man_guard_dark_skin_tone("💂🏿‍♂️"); + constexpr std::string detective("🕵️"); + constexpr std::string spy("🕵️"); + constexpr std::string sleuth_or_spy("🕵️"); + constexpr std::string detective_tone1("🕵🏻"); + constexpr std::string spy_tone1("🕵🏻"); + constexpr std::string sleuth_or_spy_tone1("🕵🏻"); + constexpr std::string detective_tone2("🕵🏼"); + constexpr std::string spy_tone2("🕵🏼"); + constexpr std::string sleuth_or_spy_tone2("🕵🏼"); + constexpr std::string detective_tone3("🕵🏽"); + constexpr std::string spy_tone3("🕵🏽"); + constexpr std::string sleuth_or_spy_tone3("🕵🏽"); + constexpr std::string detective_tone4("🕵🏾"); + constexpr std::string spy_tone4("🕵🏾"); + constexpr std::string sleuth_or_spy_tone4("🕵🏾"); + constexpr std::string detective_tone5("🕵🏿"); + constexpr std::string spy_tone5("🕵🏿"); + constexpr std::string sleuth_or_spy_tone5("🕵🏿"); + constexpr std::string woman_detective("🕵️‍♀️"); + constexpr std::string woman_detective_tone1("🕵🏻‍♀️"); + constexpr std::string woman_detective_light_skin_tone("🕵🏻‍♀️"); + constexpr std::string woman_detective_tone2("🕵🏼‍♀️"); + constexpr std::string woman_detective_medium_light_skin_tone("🕵🏼‍♀️"); + constexpr std::string woman_detective_tone3("🕵🏽‍♀️"); + constexpr std::string woman_detective_medium_skin_tone("🕵🏽‍♀️"); + constexpr std::string woman_detective_tone4("🕵🏾‍♀️"); + constexpr std::string woman_detective_medium_dark_skin_tone("🕵🏾‍♀️"); + constexpr std::string woman_detective_tone5("🕵🏿‍♀️"); + constexpr std::string woman_detective_dark_skin_tone("🕵🏿‍♀️"); + constexpr std::string man_detective("🕵️‍♂️"); + constexpr std::string man_detective_tone1("🕵🏻‍♂️"); + constexpr std::string man_detective_light_skin_tone("🕵🏻‍♂️"); + constexpr std::string man_detective_tone2("🕵🏼‍♂️"); + constexpr std::string man_detective_medium_light_skin_tone("🕵🏼‍♂️"); + constexpr std::string man_detective_tone3("🕵🏽‍♂️"); + constexpr std::string man_detective_medium_skin_tone("🕵🏽‍♂️"); + constexpr std::string man_detective_tone4("🕵🏾‍♂️"); + constexpr std::string man_detective_medium_dark_skin_tone("🕵🏾‍♂️"); + constexpr std::string man_detective_tone5("🕵🏿‍♂️"); + constexpr std::string man_detective_dark_skin_tone("🕵🏿‍♂️"); + constexpr std::string health_worker("🧑‍⚕️"); + constexpr std::string health_worker_tone1("🧑🏻‍⚕️"); + constexpr std::string health_worker_light_skin_tone("🧑🏻‍⚕️"); + constexpr std::string health_worker_tone2("🧑🏼‍⚕️"); + constexpr std::string health_worker_medium_light_skin_tone("🧑🏼‍⚕️"); + constexpr std::string health_worker_tone3("🧑🏽‍⚕️"); + constexpr std::string health_worker_medium_skin_tone("🧑🏽‍⚕️"); + constexpr std::string health_worker_tone4("🧑🏾‍⚕️"); + constexpr std::string health_worker_medium_dark_skin_tone("🧑🏾‍⚕️"); + constexpr std::string health_worker_tone5("🧑🏿‍⚕️"); + constexpr std::string health_worker_dark_skin_tone("🧑🏿‍⚕️"); + constexpr std::string woman_health_worker("👩‍⚕️"); + constexpr std::string woman_health_worker_tone1("👩🏻‍⚕️"); + constexpr std::string woman_health_worker_light_skin_tone("👩🏻‍⚕️"); + constexpr std::string woman_health_worker_tone2("👩🏼‍⚕️"); + constexpr std::string woman_health_worker_medium_light_skin_tone("👩🏼‍⚕️"); + constexpr std::string woman_health_worker_tone3("👩🏽‍⚕️"); + constexpr std::string woman_health_worker_medium_skin_tone("👩🏽‍⚕️"); + constexpr std::string woman_health_worker_tone4("👩🏾‍⚕️"); + constexpr std::string woman_health_worker_medium_dark_skin_tone("👩🏾‍⚕️"); + constexpr std::string woman_health_worker_tone5("👩🏿‍⚕️"); + constexpr std::string woman_health_worker_dark_skin_tone("👩🏿‍⚕️"); + constexpr std::string man_health_worker("👨‍⚕️"); + constexpr std::string man_health_worker_tone1("👨🏻‍⚕️"); + constexpr std::string man_health_worker_light_skin_tone("👨🏻‍⚕️"); + constexpr std::string man_health_worker_tone2("👨🏼‍⚕️"); + constexpr std::string man_health_worker_medium_light_skin_tone("👨🏼‍⚕️"); + constexpr std::string man_health_worker_tone3("👨🏽‍⚕️"); + constexpr std::string man_health_worker_medium_skin_tone("👨🏽‍⚕️"); + constexpr std::string man_health_worker_tone4("👨🏾‍⚕️"); + constexpr std::string man_health_worker_medium_dark_skin_tone("👨🏾‍⚕️"); + constexpr std::string man_health_worker_tone5("👨🏿‍⚕️"); + constexpr std::string man_health_worker_dark_skin_tone("👨🏿‍⚕️"); + constexpr std::string farmer("🧑‍🌾"); + constexpr std::string farmer_tone1("🧑🏻‍🌾"); + constexpr std::string farmer_light_skin_tone("🧑🏻‍🌾"); + constexpr std::string farmer_tone2("🧑🏼‍🌾"); + constexpr std::string farmer_medium_light_skin_tone("🧑🏼‍🌾"); + constexpr std::string farmer_tone3("🧑🏽‍🌾"); + constexpr std::string farmer_medium_skin_tone("🧑🏽‍🌾"); + constexpr std::string farmer_tone4("🧑🏾‍🌾"); + constexpr std::string farmer_medium_dark_skin_tone("🧑🏾‍🌾"); + constexpr std::string farmer_tone5("🧑🏿‍🌾"); + constexpr std::string farmer_dark_skin_tone("🧑🏿‍🌾"); + constexpr std::string woman_farmer("👩‍🌾"); + constexpr std::string woman_farmer_tone1("👩🏻‍🌾"); + constexpr std::string woman_farmer_light_skin_tone("👩🏻‍🌾"); + constexpr std::string woman_farmer_tone2("👩🏼‍🌾"); + constexpr std::string woman_farmer_medium_light_skin_tone("👩🏼‍🌾"); + constexpr std::string woman_farmer_tone3("👩🏽‍🌾"); + constexpr std::string woman_farmer_medium_skin_tone("👩🏽‍🌾"); + constexpr std::string woman_farmer_tone4("👩🏾‍🌾"); + constexpr std::string woman_farmer_medium_dark_skin_tone("👩🏾‍🌾"); + constexpr std::string woman_farmer_tone5("👩🏿‍🌾"); + constexpr std::string woman_farmer_dark_skin_tone("👩🏿‍🌾"); + constexpr std::string man_farmer("👨‍🌾"); + constexpr std::string man_farmer_tone1("👨🏻‍🌾"); + constexpr std::string man_farmer_light_skin_tone("👨🏻‍🌾"); + constexpr std::string man_farmer_tone2("👨🏼‍🌾"); + constexpr std::string man_farmer_medium_light_skin_tone("👨🏼‍🌾"); + constexpr std::string man_farmer_tone3("👨🏽‍🌾"); + constexpr std::string man_farmer_medium_skin_tone("👨🏽‍🌾"); + constexpr std::string man_farmer_tone4("👨🏾‍🌾"); + constexpr std::string man_farmer_medium_dark_skin_tone("👨🏾‍🌾"); + constexpr std::string man_farmer_tone5("👨🏿‍🌾"); + constexpr std::string man_farmer_dark_skin_tone("👨🏿‍🌾"); + constexpr std::string cook("🧑‍🍳"); + constexpr std::string cook_tone1("🧑🏻‍🍳"); + constexpr std::string cook_light_skin_tone("🧑🏻‍🍳"); + constexpr std::string cook_tone2("🧑🏼‍🍳"); + constexpr std::string cook_medium_light_skin_tone("🧑🏼‍🍳"); + constexpr std::string cook_tone3("🧑🏽‍🍳"); + constexpr std::string cook_medium_skin_tone("🧑🏽‍🍳"); + constexpr std::string cook_tone4("🧑🏾‍🍳"); + constexpr std::string cook_medium_dark_skin_tone("🧑🏾‍🍳"); + constexpr std::string cook_tone5("🧑🏿‍🍳"); + constexpr std::string cook_dark_skin_tone("🧑🏿‍🍳"); + constexpr std::string woman_cook("👩‍🍳"); + constexpr std::string woman_cook_tone1("👩🏻‍🍳"); + constexpr std::string woman_cook_light_skin_tone("👩🏻‍🍳"); + constexpr std::string woman_cook_tone2("👩🏼‍🍳"); + constexpr std::string woman_cook_medium_light_skin_tone("👩🏼‍🍳"); + constexpr std::string woman_cook_tone3("👩🏽‍🍳"); + constexpr std::string woman_cook_medium_skin_tone("👩🏽‍🍳"); + constexpr std::string woman_cook_tone4("👩🏾‍🍳"); + constexpr std::string woman_cook_medium_dark_skin_tone("👩🏾‍🍳"); + constexpr std::string woman_cook_tone5("👩🏿‍🍳"); + constexpr std::string woman_cook_dark_skin_tone("👩🏿‍🍳"); + constexpr std::string man_cook("👨‍🍳"); + constexpr std::string man_cook_tone1("👨🏻‍🍳"); + constexpr std::string man_cook_light_skin_tone("👨🏻‍🍳"); + constexpr std::string man_cook_tone2("👨🏼‍🍳"); + constexpr std::string man_cook_medium_light_skin_tone("👨🏼‍🍳"); + constexpr std::string man_cook_tone3("👨🏽‍🍳"); + constexpr std::string man_cook_medium_skin_tone("👨🏽‍🍳"); + constexpr std::string man_cook_tone4("👨🏾‍🍳"); + constexpr std::string man_cook_medium_dark_skin_tone("👨🏾‍🍳"); + constexpr std::string man_cook_tone5("👨🏿‍🍳"); + constexpr std::string man_cook_dark_skin_tone("👨🏿‍🍳"); + constexpr std::string student("🧑‍🎓"); + constexpr std::string student_tone1("🧑🏻‍🎓"); + constexpr std::string student_light_skin_tone("🧑🏻‍🎓"); + constexpr std::string student_tone2("🧑🏼‍🎓"); + constexpr std::string student_medium_light_skin_tone("🧑🏼‍🎓"); + constexpr std::string student_tone3("🧑🏽‍🎓"); + constexpr std::string student_medium_skin_tone("🧑🏽‍🎓"); + constexpr std::string student_tone4("🧑🏾‍🎓"); + constexpr std::string student_medium_dark_skin_tone("🧑🏾‍🎓"); + constexpr std::string student_tone5("🧑🏿‍🎓"); + constexpr std::string student_dark_skin_tone("🧑🏿‍🎓"); + constexpr std::string woman_student("👩‍🎓"); + constexpr std::string woman_student_tone1("👩🏻‍🎓"); + constexpr std::string woman_student_light_skin_tone("👩🏻‍🎓"); + constexpr std::string woman_student_tone2("👩🏼‍🎓"); + constexpr std::string woman_student_medium_light_skin_tone("👩🏼‍🎓"); + constexpr std::string woman_student_tone3("👩🏽‍🎓"); + constexpr std::string woman_student_medium_skin_tone("👩🏽‍🎓"); + constexpr std::string woman_student_tone4("👩🏾‍🎓"); + constexpr std::string woman_student_medium_dark_skin_tone("👩🏾‍🎓"); + constexpr std::string woman_student_tone5("👩🏿‍🎓"); + constexpr std::string woman_student_dark_skin_tone("👩🏿‍🎓"); + constexpr std::string man_student("👨‍🎓"); + constexpr std::string man_student_tone1("👨🏻‍🎓"); + constexpr std::string man_student_light_skin_tone("👨🏻‍🎓"); + constexpr std::string man_student_tone2("👨🏼‍🎓"); + constexpr std::string man_student_medium_light_skin_tone("👨🏼‍🎓"); + constexpr std::string man_student_tone3("👨🏽‍🎓"); + constexpr std::string man_student_medium_skin_tone("👨🏽‍🎓"); + constexpr std::string man_student_tone4("👨🏾‍🎓"); + constexpr std::string man_student_medium_dark_skin_tone("👨🏾‍🎓"); + constexpr std::string man_student_tone5("👨🏿‍🎓"); + constexpr std::string man_student_dark_skin_tone("👨🏿‍🎓"); + constexpr std::string singer("🧑‍🎤"); + constexpr std::string singer_tone1("🧑🏻‍🎤"); + constexpr std::string singer_light_skin_tone("🧑🏻‍🎤"); + constexpr std::string singer_tone2("🧑🏼‍🎤"); + constexpr std::string singer_medium_light_skin_tone("🧑🏼‍🎤"); + constexpr std::string singer_tone3("🧑🏽‍🎤"); + constexpr std::string singer_medium_skin_tone("🧑🏽‍🎤"); + constexpr std::string singer_tone4("🧑🏾‍🎤"); + constexpr std::string singer_medium_dark_skin_tone("🧑🏾‍🎤"); + constexpr std::string singer_tone5("🧑🏿‍🎤"); + constexpr std::string singer_dark_skin_tone("🧑🏿‍🎤"); + constexpr std::string woman_singer("👩‍🎤"); + constexpr std::string woman_singer_tone1("👩🏻‍🎤"); + constexpr std::string woman_singer_light_skin_tone("👩🏻‍🎤"); + constexpr std::string woman_singer_tone2("👩🏼‍🎤"); + constexpr std::string woman_singer_medium_light_skin_tone("👩🏼‍🎤"); + constexpr std::string woman_singer_tone3("👩🏽‍🎤"); + constexpr std::string woman_singer_medium_skin_tone("👩🏽‍🎤"); + constexpr std::string woman_singer_tone4("👩🏾‍🎤"); + constexpr std::string woman_singer_medium_dark_skin_tone("👩🏾‍🎤"); + constexpr std::string woman_singer_tone5("👩🏿‍🎤"); + constexpr std::string woman_singer_dark_skin_tone("👩🏿‍🎤"); + constexpr std::string man_singer("👨‍🎤"); + constexpr std::string man_singer_tone1("👨🏻‍🎤"); + constexpr std::string man_singer_light_skin_tone("👨🏻‍🎤"); + constexpr std::string man_singer_tone2("👨🏼‍🎤"); + constexpr std::string man_singer_medium_light_skin_tone("👨🏼‍🎤"); + constexpr std::string man_singer_tone3("👨🏽‍🎤"); + constexpr std::string man_singer_medium_skin_tone("👨🏽‍🎤"); + constexpr std::string man_singer_tone4("👨🏾‍🎤"); + constexpr std::string man_singer_medium_dark_skin_tone("👨🏾‍🎤"); + constexpr std::string man_singer_tone5("👨🏿‍🎤"); + constexpr std::string man_singer_dark_skin_tone("👨🏿‍🎤"); + constexpr std::string teacher("🧑‍🏫"); + constexpr std::string teacher_tone1("🧑🏻‍🏫"); + constexpr std::string teacher_light_skin_tone("🧑🏻‍🏫"); + constexpr std::string teacher_tone2("🧑🏼‍🏫"); + constexpr std::string teacher_medium_light_skin_tone("🧑🏼‍🏫"); + constexpr std::string teacher_tone3("🧑🏽‍🏫"); + constexpr std::string teacher_medium_skin_tone("🧑🏽‍🏫"); + constexpr std::string teacher_tone4("🧑🏾‍🏫"); + constexpr std::string teacher_medium_dark_skin_tone("🧑🏾‍🏫"); + constexpr std::string teacher_tone5("🧑🏿‍🏫"); + constexpr std::string teacher_dark_skin_tone("🧑🏿‍🏫"); + constexpr std::string woman_teacher("👩‍🏫"); + constexpr std::string woman_teacher_tone1("👩🏻‍🏫"); + constexpr std::string woman_teacher_light_skin_tone("👩🏻‍🏫"); + constexpr std::string woman_teacher_tone2("👩🏼‍🏫"); + constexpr std::string woman_teacher_medium_light_skin_tone("👩🏼‍🏫"); + constexpr std::string woman_teacher_tone3("👩🏽‍🏫"); + constexpr std::string woman_teacher_medium_skin_tone("👩🏽‍🏫"); + constexpr std::string woman_teacher_tone4("👩🏾‍🏫"); + constexpr std::string woman_teacher_medium_dark_skin_tone("👩🏾‍🏫"); + constexpr std::string woman_teacher_tone5("👩🏿‍🏫"); + constexpr std::string woman_teacher_dark_skin_tone("👩🏿‍🏫"); + constexpr std::string man_teacher("👨‍🏫"); + constexpr std::string man_teacher_tone1("👨🏻‍🏫"); + constexpr std::string man_teacher_light_skin_tone("👨🏻‍🏫"); + constexpr std::string man_teacher_tone2("👨🏼‍🏫"); + constexpr std::string man_teacher_medium_light_skin_tone("👨🏼‍🏫"); + constexpr std::string man_teacher_tone3("👨🏽‍🏫"); + constexpr std::string man_teacher_medium_skin_tone("👨🏽‍🏫"); + constexpr std::string man_teacher_tone4("👨🏾‍🏫"); + constexpr std::string man_teacher_medium_dark_skin_tone("👨🏾‍🏫"); + constexpr std::string man_teacher_tone5("👨🏿‍🏫"); + constexpr std::string man_teacher_dark_skin_tone("👨🏿‍🏫"); + constexpr std::string factory_worker("🧑‍🏭"); + constexpr std::string factory_worker_tone1("🧑🏻‍🏭"); + constexpr std::string factory_worker_light_skin_tone("🧑🏻‍🏭"); + constexpr std::string factory_worker_tone2("🧑🏼‍🏭"); + constexpr std::string factory_worker_medium_light_skin_tone("🧑🏼‍🏭"); + constexpr std::string factory_worker_tone3("🧑🏽‍🏭"); + constexpr std::string factory_worker_medium_skin_tone("🧑🏽‍🏭"); + constexpr std::string factory_worker_tone4("🧑🏾‍🏭"); + constexpr std::string factory_worker_medium_dark_skin_tone("🧑🏾‍🏭"); + constexpr std::string factory_worker_tone5("🧑🏿‍🏭"); + constexpr std::string factory_worker_dark_skin_tone("🧑🏿‍🏭"); + constexpr std::string woman_factory_worker("👩‍🏭"); + constexpr std::string woman_factory_worker_tone1("👩🏻‍🏭"); + constexpr std::string woman_factory_worker_light_skin_tone("👩🏻‍🏭"); + constexpr std::string woman_factory_worker_tone2("👩🏼‍🏭"); + constexpr std::string woman_factory_worker_medium_light_skin_tone("👩🏼‍🏭"); + constexpr std::string woman_factory_worker_tone3("👩🏽‍🏭"); + constexpr std::string woman_factory_worker_medium_skin_tone("👩🏽‍🏭"); + constexpr std::string woman_factory_worker_tone4("👩🏾‍🏭"); + constexpr std::string woman_factory_worker_medium_dark_skin_tone("👩🏾‍🏭"); + constexpr std::string woman_factory_worker_tone5("👩🏿‍🏭"); + constexpr std::string woman_factory_worker_dark_skin_tone("👩🏿‍🏭"); + constexpr std::string man_factory_worker("👨‍🏭"); + constexpr std::string man_factory_worker_tone1("👨🏻‍🏭"); + constexpr std::string man_factory_worker_light_skin_tone("👨🏻‍🏭"); + constexpr std::string man_factory_worker_tone2("👨🏼‍🏭"); + constexpr std::string man_factory_worker_medium_light_skin_tone("👨🏼‍🏭"); + constexpr std::string man_factory_worker_tone3("👨🏽‍🏭"); + constexpr std::string man_factory_worker_medium_skin_tone("👨🏽‍🏭"); + constexpr std::string man_factory_worker_tone4("👨🏾‍🏭"); + constexpr std::string man_factory_worker_medium_dark_skin_tone("👨🏾‍🏭"); + constexpr std::string man_factory_worker_tone5("👨🏿‍🏭"); + constexpr std::string man_factory_worker_dark_skin_tone("👨🏿‍🏭"); + constexpr std::string technologist("🧑‍💻"); + constexpr std::string technologist_tone1("🧑🏻‍💻"); + constexpr std::string technologist_light_skin_tone("🧑🏻‍💻"); + constexpr std::string technologist_tone2("🧑🏼‍💻"); + constexpr std::string technologist_medium_light_skin_tone("🧑🏼‍💻"); + constexpr std::string technologist_tone3("🧑🏽‍💻"); + constexpr std::string technologist_medium_skin_tone("🧑🏽‍💻"); + constexpr std::string technologist_tone4("🧑🏾‍💻"); + constexpr std::string technologist_medium_dark_skin_tone("🧑🏾‍💻"); + constexpr std::string technologist_tone5("🧑🏿‍💻"); + constexpr std::string technologist_dark_skin_tone("🧑🏿‍💻"); + constexpr std::string woman_technologist("👩‍💻"); + constexpr std::string woman_technologist_tone1("👩🏻‍💻"); + constexpr std::string woman_technologist_light_skin_tone("👩🏻‍💻"); + constexpr std::string woman_technologist_tone2("👩🏼‍💻"); + constexpr std::string woman_technologist_medium_light_skin_tone("👩🏼‍💻"); + constexpr std::string woman_technologist_tone3("👩🏽‍💻"); + constexpr std::string woman_technologist_medium_skin_tone("👩🏽‍💻"); + constexpr std::string woman_technologist_tone4("👩🏾‍💻"); + constexpr std::string woman_technologist_medium_dark_skin_tone("👩🏾‍💻"); + constexpr std::string woman_technologist_tone5("👩🏿‍💻"); + constexpr std::string woman_technologist_dark_skin_tone("👩🏿‍💻"); + constexpr std::string man_technologist("👨‍💻"); + constexpr std::string man_technologist_tone1("👨🏻‍💻"); + constexpr std::string man_technologist_light_skin_tone("👨🏻‍💻"); + constexpr std::string man_technologist_tone2("👨🏼‍💻"); + constexpr std::string man_technologist_medium_light_skin_tone("👨🏼‍💻"); + constexpr std::string man_technologist_tone3("👨🏽‍💻"); + constexpr std::string man_technologist_medium_skin_tone("👨🏽‍💻"); + constexpr std::string man_technologist_tone4("👨🏾‍💻"); + constexpr std::string man_technologist_medium_dark_skin_tone("👨🏾‍💻"); + constexpr std::string man_technologist_tone5("👨🏿‍💻"); + constexpr std::string man_technologist_dark_skin_tone("👨🏿‍💻"); + constexpr std::string office_worker("🧑‍💼"); + constexpr std::string office_worker_tone1("🧑🏻‍💼"); + constexpr std::string office_worker_light_skin_tone("🧑🏻‍💼"); + constexpr std::string office_worker_tone2("🧑🏼‍💼"); + constexpr std::string office_worker_medium_light_skin_tone("🧑🏼‍💼"); + constexpr std::string office_worker_tone3("🧑🏽‍💼"); + constexpr std::string office_worker_medium_skin_tone("🧑🏽‍💼"); + constexpr std::string office_worker_tone4("🧑🏾‍💼"); + constexpr std::string office_worker_medium_dark_skin_tone("🧑🏾‍💼"); + constexpr std::string office_worker_tone5("🧑🏿‍💼"); + constexpr std::string office_worker_dark_skin_tone("🧑🏿‍💼"); + constexpr std::string woman_office_worker("👩‍💼"); + constexpr std::string woman_office_worker_tone1("👩🏻‍💼"); + constexpr std::string woman_office_worker_light_skin_tone("👩🏻‍💼"); + constexpr std::string woman_office_worker_tone2("👩🏼‍💼"); + constexpr std::string woman_office_worker_medium_light_skin_tone("👩🏼‍💼"); + constexpr std::string woman_office_worker_tone3("👩🏽‍💼"); + constexpr std::string woman_office_worker_medium_skin_tone("👩🏽‍💼"); + constexpr std::string woman_office_worker_tone4("👩🏾‍💼"); + constexpr std::string woman_office_worker_medium_dark_skin_tone("👩🏾‍💼"); + constexpr std::string woman_office_worker_tone5("👩🏿‍💼"); + constexpr std::string woman_office_worker_dark_skin_tone("👩🏿‍💼"); + constexpr std::string man_office_worker("👨‍💼"); + constexpr std::string man_office_worker_tone1("👨🏻‍💼"); + constexpr std::string man_office_worker_light_skin_tone("👨🏻‍💼"); + constexpr std::string man_office_worker_tone2("👨🏼‍💼"); + constexpr std::string man_office_worker_medium_light_skin_tone("👨🏼‍💼"); + constexpr std::string man_office_worker_tone3("👨🏽‍💼"); + constexpr std::string man_office_worker_medium_skin_tone("👨🏽‍💼"); + constexpr std::string man_office_worker_tone4("👨🏾‍💼"); + constexpr std::string man_office_worker_medium_dark_skin_tone("👨🏾‍💼"); + constexpr std::string man_office_worker_tone5("👨🏿‍💼"); + constexpr std::string man_office_worker_dark_skin_tone("👨🏿‍💼"); + constexpr std::string mechanic("🧑‍🔧"); + constexpr std::string mechanic_tone1("🧑🏻‍🔧"); + constexpr std::string mechanic_light_skin_tone("🧑🏻‍🔧"); + constexpr std::string mechanic_tone2("🧑🏼‍🔧"); + constexpr std::string mechanic_medium_light_skin_tone("🧑🏼‍🔧"); + constexpr std::string mechanic_tone3("🧑🏽‍🔧"); + constexpr std::string mechanic_medium_skin_tone("🧑🏽‍🔧"); + constexpr std::string mechanic_tone4("🧑🏾‍🔧"); + constexpr std::string mechanic_medium_dark_skin_tone("🧑🏾‍🔧"); + constexpr std::string mechanic_tone5("🧑🏿‍🔧"); + constexpr std::string mechanic_dark_skin_tone("🧑🏿‍🔧"); + constexpr std::string woman_mechanic("👩‍🔧"); + constexpr std::string woman_mechanic_tone1("👩🏻‍🔧"); + constexpr std::string woman_mechanic_light_skin_tone("👩🏻‍🔧"); + constexpr std::string woman_mechanic_tone2("👩🏼‍🔧"); + constexpr std::string woman_mechanic_medium_light_skin_tone("👩🏼‍🔧"); + constexpr std::string woman_mechanic_tone3("👩🏽‍🔧"); + constexpr std::string woman_mechanic_medium_skin_tone("👩🏽‍🔧"); + constexpr std::string woman_mechanic_tone4("👩🏾‍🔧"); + constexpr std::string woman_mechanic_medium_dark_skin_tone("👩🏾‍🔧"); + constexpr std::string woman_mechanic_tone5("👩🏿‍🔧"); + constexpr std::string woman_mechanic_dark_skin_tone("👩🏿‍🔧"); + constexpr std::string man_mechanic("👨‍🔧"); + constexpr std::string man_mechanic_tone1("👨🏻‍🔧"); + constexpr std::string man_mechanic_light_skin_tone("👨🏻‍🔧"); + constexpr std::string man_mechanic_tone2("👨🏼‍🔧"); + constexpr std::string man_mechanic_medium_light_skin_tone("👨🏼‍🔧"); + constexpr std::string man_mechanic_tone3("👨🏽‍🔧"); + constexpr std::string man_mechanic_medium_skin_tone("👨🏽‍🔧"); + constexpr std::string man_mechanic_tone4("👨🏾‍🔧"); + constexpr std::string man_mechanic_medium_dark_skin_tone("👨🏾‍🔧"); + constexpr std::string man_mechanic_tone5("👨🏿‍🔧"); + constexpr std::string man_mechanic_dark_skin_tone("👨🏿‍🔧"); + constexpr std::string scientist("🧑‍🔬"); + constexpr std::string scientist_tone1("🧑🏻‍🔬"); + constexpr std::string scientist_light_skin_tone("🧑🏻‍🔬"); + constexpr std::string scientist_tone2("🧑🏼‍🔬"); + constexpr std::string scientist_medium_light_skin_tone("🧑🏼‍🔬"); + constexpr std::string scientist_tone3("🧑🏽‍🔬"); + constexpr std::string scientist_medium_skin_tone("🧑🏽‍🔬"); + constexpr std::string scientist_tone4("🧑🏾‍🔬"); + constexpr std::string scientist_medium_dark_skin_tone("🧑🏾‍🔬"); + constexpr std::string scientist_tone5("🧑🏿‍🔬"); + constexpr std::string scientist_dark_skin_tone("🧑🏿‍🔬"); + constexpr std::string woman_scientist("👩‍🔬"); + constexpr std::string woman_scientist_tone1("👩🏻‍🔬"); + constexpr std::string woman_scientist_light_skin_tone("👩🏻‍🔬"); + constexpr std::string woman_scientist_tone2("👩🏼‍🔬"); + constexpr std::string woman_scientist_medium_light_skin_tone("👩🏼‍🔬"); + constexpr std::string woman_scientist_tone3("👩🏽‍🔬"); + constexpr std::string woman_scientist_medium_skin_tone("👩🏽‍🔬"); + constexpr std::string woman_scientist_tone4("👩🏾‍🔬"); + constexpr std::string woman_scientist_medium_dark_skin_tone("👩🏾‍🔬"); + constexpr std::string woman_scientist_tone5("👩🏿‍🔬"); + constexpr std::string woman_scientist_dark_skin_tone("👩🏿‍🔬"); + constexpr std::string man_scientist("👨‍🔬"); + constexpr std::string man_scientist_tone1("👨🏻‍🔬"); + constexpr std::string man_scientist_light_skin_tone("👨🏻‍🔬"); + constexpr std::string man_scientist_tone2("👨🏼‍🔬"); + constexpr std::string man_scientist_medium_light_skin_tone("👨🏼‍🔬"); + constexpr std::string man_scientist_tone3("👨🏽‍🔬"); + constexpr std::string man_scientist_medium_skin_tone("👨🏽‍🔬"); + constexpr std::string man_scientist_tone4("👨🏾‍🔬"); + constexpr std::string man_scientist_medium_dark_skin_tone("👨🏾‍🔬"); + constexpr std::string man_scientist_tone5("👨🏿‍🔬"); + constexpr std::string man_scientist_dark_skin_tone("👨🏿‍🔬"); + constexpr std::string artist("🧑‍🎨"); + constexpr std::string artist_tone1("🧑🏻‍🎨"); + constexpr std::string artist_light_skin_tone("🧑🏻‍🎨"); + constexpr std::string artist_tone2("🧑🏼‍🎨"); + constexpr std::string artist_medium_light_skin_tone("🧑🏼‍🎨"); + constexpr std::string artist_tone3("🧑🏽‍🎨"); + constexpr std::string artist_medium_skin_tone("🧑🏽‍🎨"); + constexpr std::string artist_tone4("🧑🏾‍🎨"); + constexpr std::string artist_medium_dark_skin_tone("🧑🏾‍🎨"); + constexpr std::string artist_tone5("🧑🏿‍🎨"); + constexpr std::string artist_dark_skin_tone("🧑🏿‍🎨"); + constexpr std::string woman_artist("👩‍🎨"); + constexpr std::string woman_artist_tone1("👩🏻‍🎨"); + constexpr std::string woman_artist_light_skin_tone("👩🏻‍🎨"); + constexpr std::string woman_artist_tone2("👩🏼‍🎨"); + constexpr std::string woman_artist_medium_light_skin_tone("👩🏼‍🎨"); + constexpr std::string woman_artist_tone3("👩🏽‍🎨"); + constexpr std::string woman_artist_medium_skin_tone("👩🏽‍🎨"); + constexpr std::string woman_artist_tone4("👩🏾‍🎨"); + constexpr std::string woman_artist_medium_dark_skin_tone("👩🏾‍🎨"); + constexpr std::string woman_artist_tone5("👩🏿‍🎨"); + constexpr std::string woman_artist_dark_skin_tone("👩🏿‍🎨"); + constexpr std::string man_artist("👨‍🎨"); + constexpr std::string man_artist_tone1("👨🏻‍🎨"); + constexpr std::string man_artist_light_skin_tone("👨🏻‍🎨"); + constexpr std::string man_artist_tone2("👨🏼‍🎨"); + constexpr std::string man_artist_medium_light_skin_tone("👨🏼‍🎨"); + constexpr std::string man_artist_tone3("👨🏽‍🎨"); + constexpr std::string man_artist_medium_skin_tone("👨🏽‍🎨"); + constexpr std::string man_artist_tone4("👨🏾‍🎨"); + constexpr std::string man_artist_medium_dark_skin_tone("👨🏾‍🎨"); + constexpr std::string man_artist_tone5("👨🏿‍🎨"); + constexpr std::string man_artist_dark_skin_tone("👨🏿‍🎨"); + constexpr std::string firefighter("🧑‍🚒"); + constexpr std::string firefighter_tone1("🧑🏻‍🚒"); + constexpr std::string firefighter_light_skin_tone("🧑🏻‍🚒"); + constexpr std::string firefighter_tone2("🧑🏼‍🚒"); + constexpr std::string firefighter_medium_light_skin_tone("🧑🏼‍🚒"); + constexpr std::string firefighter_tone3("🧑🏽‍🚒"); + constexpr std::string firefighter_medium_skin_tone("🧑🏽‍🚒"); + constexpr std::string firefighter_tone4("🧑🏾‍🚒"); + constexpr std::string firefighter_medium_dark_skin_tone("🧑🏾‍🚒"); + constexpr std::string firefighter_tone5("🧑🏿‍🚒"); + constexpr std::string firefighter_dark_skin_tone("🧑🏿‍🚒"); + constexpr std::string woman_firefighter("👩‍🚒"); + constexpr std::string woman_firefighter_tone1("👩🏻‍🚒"); + constexpr std::string woman_firefighter_light_skin_tone("👩🏻‍🚒"); + constexpr std::string woman_firefighter_tone2("👩🏼‍🚒"); + constexpr std::string woman_firefighter_medium_light_skin_tone("👩🏼‍🚒"); + constexpr std::string woman_firefighter_tone3("👩🏽‍🚒"); + constexpr std::string woman_firefighter_medium_skin_tone("👩🏽‍🚒"); + constexpr std::string woman_firefighter_tone4("👩🏾‍🚒"); + constexpr std::string woman_firefighter_medium_dark_skin_tone("👩🏾‍🚒"); + constexpr std::string woman_firefighter_tone5("👩🏿‍🚒"); + constexpr std::string woman_firefighter_dark_skin_tone("👩🏿‍🚒"); + constexpr std::string man_firefighter("👨‍🚒"); + constexpr std::string man_firefighter_tone1("👨🏻‍🚒"); + constexpr std::string man_firefighter_light_skin_tone("👨🏻‍🚒"); + constexpr std::string man_firefighter_tone2("👨🏼‍🚒"); + constexpr std::string man_firefighter_medium_light_skin_tone("👨🏼‍🚒"); + constexpr std::string man_firefighter_tone3("👨🏽‍🚒"); + constexpr std::string man_firefighter_medium_skin_tone("👨🏽‍🚒"); + constexpr std::string man_firefighter_tone4("👨🏾‍🚒"); + constexpr std::string man_firefighter_medium_dark_skin_tone("👨🏾‍🚒"); + constexpr std::string man_firefighter_tone5("👨🏿‍🚒"); + constexpr std::string man_firefighter_dark_skin_tone("👨🏿‍🚒"); + constexpr std::string pilot("🧑‍✈️"); + constexpr std::string pilot_tone1("🧑🏻‍✈️"); + constexpr std::string pilot_light_skin_tone("🧑🏻‍✈️"); + constexpr std::string pilot_tone2("🧑🏼‍✈️"); + constexpr std::string pilot_medium_light_skin_tone("🧑🏼‍✈️"); + constexpr std::string pilot_tone3("🧑🏽‍✈️"); + constexpr std::string pilot_medium_skin_tone("🧑🏽‍✈️"); + constexpr std::string pilot_tone4("🧑🏾‍✈️"); + constexpr std::string pilot_medium_dark_skin_tone("🧑🏾‍✈️"); + constexpr std::string pilot_tone5("🧑🏿‍✈️"); + constexpr std::string pilot_dark_skin_tone("🧑🏿‍✈️"); + constexpr std::string woman_pilot("👩‍✈️"); + constexpr std::string woman_pilot_tone1("👩🏻‍✈️"); + constexpr std::string woman_pilot_light_skin_tone("👩🏻‍✈️"); + constexpr std::string woman_pilot_tone2("👩🏼‍✈️"); + constexpr std::string woman_pilot_medium_light_skin_tone("👩🏼‍✈️"); + constexpr std::string woman_pilot_tone3("👩🏽‍✈️"); + constexpr std::string woman_pilot_medium_skin_tone("👩🏽‍✈️"); + constexpr std::string woman_pilot_tone4("👩🏾‍✈️"); + constexpr std::string woman_pilot_medium_dark_skin_tone("👩🏾‍✈️"); + constexpr std::string woman_pilot_tone5("👩🏿‍✈️"); + constexpr std::string woman_pilot_dark_skin_tone("👩🏿‍✈️"); + constexpr std::string man_pilot("👨‍✈️"); + constexpr std::string man_pilot_tone1("👨🏻‍✈️"); + constexpr std::string man_pilot_light_skin_tone("👨🏻‍✈️"); + constexpr std::string man_pilot_tone2("👨🏼‍✈️"); + constexpr std::string man_pilot_medium_light_skin_tone("👨🏼‍✈️"); + constexpr std::string man_pilot_tone3("👨🏽‍✈️"); + constexpr std::string man_pilot_medium_skin_tone("👨🏽‍✈️"); + constexpr std::string man_pilot_tone4("👨🏾‍✈️"); + constexpr std::string man_pilot_medium_dark_skin_tone("👨🏾‍✈️"); + constexpr std::string man_pilot_tone5("👨🏿‍✈️"); + constexpr std::string man_pilot_dark_skin_tone("👨🏿‍✈️"); + constexpr std::string astronaut("🧑‍🚀"); + constexpr std::string astronaut_tone1("🧑🏻‍🚀"); + constexpr std::string astronaut_light_skin_tone("🧑🏻‍🚀"); + constexpr std::string astronaut_tone2("🧑🏼‍🚀"); + constexpr std::string astronaut_medium_light_skin_tone("🧑🏼‍🚀"); + constexpr std::string astronaut_tone3("🧑🏽‍🚀"); + constexpr std::string astronaut_medium_skin_tone("🧑🏽‍🚀"); + constexpr std::string astronaut_tone4("🧑🏾‍🚀"); + constexpr std::string astronaut_medium_dark_skin_tone("🧑🏾‍🚀"); + constexpr std::string astronaut_tone5("🧑🏿‍🚀"); + constexpr std::string astronaut_dark_skin_tone("🧑🏿‍🚀"); + constexpr std::string woman_astronaut("👩‍🚀"); + constexpr std::string woman_astronaut_tone1("👩🏻‍🚀"); + constexpr std::string woman_astronaut_light_skin_tone("👩🏻‍🚀"); + constexpr std::string woman_astronaut_tone2("👩🏼‍🚀"); + constexpr std::string woman_astronaut_medium_light_skin_tone("👩🏼‍🚀"); + constexpr std::string woman_astronaut_tone3("👩🏽‍🚀"); + constexpr std::string woman_astronaut_medium_skin_tone("👩🏽‍🚀"); + constexpr std::string woman_astronaut_tone4("👩🏾‍🚀"); + constexpr std::string woman_astronaut_medium_dark_skin_tone("👩🏾‍🚀"); + constexpr std::string woman_astronaut_tone5("👩🏿‍🚀"); + constexpr std::string woman_astronaut_dark_skin_tone("👩🏿‍🚀"); + constexpr std::string man_astronaut("👨‍🚀"); + constexpr std::string man_astronaut_tone1("👨🏻‍🚀"); + constexpr std::string man_astronaut_light_skin_tone("👨🏻‍🚀"); + constexpr std::string man_astronaut_tone2("👨🏼‍🚀"); + constexpr std::string man_astronaut_medium_light_skin_tone("👨🏼‍🚀"); + constexpr std::string man_astronaut_tone3("👨🏽‍🚀"); + constexpr std::string man_astronaut_medium_skin_tone("👨🏽‍🚀"); + constexpr std::string man_astronaut_tone4("👨🏾‍🚀"); + constexpr std::string man_astronaut_medium_dark_skin_tone("👨🏾‍🚀"); + constexpr std::string man_astronaut_tone5("👨🏿‍🚀"); + constexpr std::string man_astronaut_dark_skin_tone("👨🏿‍🚀"); + constexpr std::string judge("🧑‍⚖️"); + constexpr std::string judge_tone1("🧑🏻‍⚖️"); + constexpr std::string judge_light_skin_tone("🧑🏻‍⚖️"); + constexpr std::string judge_tone2("🧑🏼‍⚖️"); + constexpr std::string judge_medium_light_skin_tone("🧑🏼‍⚖️"); + constexpr std::string judge_tone3("🧑🏽‍⚖️"); + constexpr std::string judge_medium_skin_tone("🧑🏽‍⚖️"); + constexpr std::string judge_tone4("🧑🏾‍⚖️"); + constexpr std::string judge_medium_dark_skin_tone("🧑🏾‍⚖️"); + constexpr std::string judge_tone5("🧑🏿‍⚖️"); + constexpr std::string judge_dark_skin_tone("🧑🏿‍⚖️"); + constexpr std::string woman_judge("👩‍⚖️"); + constexpr std::string woman_judge_tone1("👩🏻‍⚖️"); + constexpr std::string woman_judge_light_skin_tone("👩🏻‍⚖️"); + constexpr std::string woman_judge_tone2("👩🏼‍⚖️"); + constexpr std::string woman_judge_medium_light_skin_tone("👩🏼‍⚖️"); + constexpr std::string woman_judge_tone3("👩🏽‍⚖️"); + constexpr std::string woman_judge_medium_skin_tone("👩🏽‍⚖️"); + constexpr std::string woman_judge_tone4("👩🏾‍⚖️"); + constexpr std::string woman_judge_medium_dark_skin_tone("👩🏾‍⚖️"); + constexpr std::string woman_judge_tone5("👩🏿‍⚖️"); + constexpr std::string woman_judge_dark_skin_tone("👩🏿‍⚖️"); + constexpr std::string man_judge("👨‍⚖️"); + constexpr std::string man_judge_tone1("👨🏻‍⚖️"); + constexpr std::string man_judge_light_skin_tone("👨🏻‍⚖️"); + constexpr std::string man_judge_tone2("👨🏼‍⚖️"); + constexpr std::string man_judge_medium_light_skin_tone("👨🏼‍⚖️"); + constexpr std::string man_judge_tone3("👨🏽‍⚖️"); + constexpr std::string man_judge_medium_skin_tone("👨🏽‍⚖️"); + constexpr std::string man_judge_tone4("👨🏾‍⚖️"); + constexpr std::string man_judge_medium_dark_skin_tone("👨🏾‍⚖️"); + constexpr std::string man_judge_tone5("👨🏿‍⚖️"); + constexpr std::string man_judge_dark_skin_tone("👨🏿‍⚖️"); + constexpr std::string person_with_veil("👰"); + constexpr std::string person_with_veil_tone1("👰🏻"); + constexpr std::string person_with_veil_tone2("👰🏼"); + constexpr std::string person_with_veil_tone3("👰🏽"); + constexpr std::string person_with_veil_tone4("👰🏾"); + constexpr std::string person_with_veil_tone5("👰🏿"); + constexpr std::string woman_with_veil("👰‍♀️"); + constexpr std::string bride_with_veil("👰‍♀️"); + constexpr std::string woman_with_veil_tone1("👰🏻‍♀️"); + constexpr std::string woman_with_veil_light_skin_tone("👰🏻‍♀️"); + constexpr std::string woman_with_veil_tone2("👰🏼‍♀️"); + constexpr std::string woman_with_veil_medium_light_skin_tone("👰🏼‍♀️"); + constexpr std::string woman_with_veil_tone3("👰🏽‍♀️"); + constexpr std::string woman_with_veil_medium_skin_tone("👰🏽‍♀️"); + constexpr std::string woman_with_veil_tone4("👰🏾‍♀️"); + constexpr std::string woman_with_veil_medium_dark_skin_tone("👰🏾‍♀️"); + constexpr std::string woman_with_veil_tone5("👰🏿‍♀️"); + constexpr std::string woman_with_veil_dark_skin_tone("👰🏿‍♀️"); + constexpr std::string man_with_veil("👰‍♂️"); + constexpr std::string man_with_veil_tone1("👰🏻‍♂️"); + constexpr std::string man_with_veil_light_skin_tone("👰🏻‍♂️"); + constexpr std::string man_with_veil_tone2("👰🏼‍♂️"); + constexpr std::string man_with_veil_medium_light_skin_tone("👰🏼‍♂️"); + constexpr std::string man_with_veil_tone3("👰🏽‍♂️"); + constexpr std::string man_with_veil_medium_skin_tone("👰🏽‍♂️"); + constexpr std::string man_with_veil_tone4("👰🏾‍♂️"); + constexpr std::string man_with_veil_medium_dark_skin_tone("👰🏾‍♂️"); + constexpr std::string man_with_veil_tone5("👰🏿‍♂️"); + constexpr std::string man_with_veil_dark_skin_tone("👰🏿‍♂️"); + constexpr std::string person_in_tuxedo("🤵"); + constexpr std::string person_in_tuxedo_tone1("🤵🏻"); + constexpr std::string tuxedo_tone1("🤵🏻"); + constexpr std::string person_in_tuxedo_tone2("🤵🏼"); + constexpr std::string tuxedo_tone2("🤵🏼"); + constexpr std::string person_in_tuxedo_tone3("🤵🏽"); + constexpr std::string tuxedo_tone3("🤵🏽"); + constexpr std::string person_in_tuxedo_tone4("🤵🏾"); + constexpr std::string tuxedo_tone4("🤵🏾"); + constexpr std::string person_in_tuxedo_tone5("🤵🏿"); + constexpr std::string tuxedo_tone5("🤵🏿"); + constexpr std::string woman_in_tuxedo("🤵‍♀️"); + constexpr std::string woman_in_tuxedo_tone1("🤵🏻‍♀️"); + constexpr std::string woman_in_tuxedo_light_skin_tone("🤵🏻‍♀️"); + constexpr std::string woman_in_tuxedo_tone2("🤵🏼‍♀️"); + constexpr std::string woman_in_tuxedo_medium_light_skin_tone("🤵🏼‍♀️"); + constexpr std::string woman_in_tuxedo_tone3("🤵🏽‍♀️"); + constexpr std::string woman_in_tuxedo_medium_skin_tone("🤵🏽‍♀️"); + constexpr std::string woman_in_tuxedo_tone4("🤵🏾‍♀️"); + constexpr std::string woman_in_tuxedo_medium_dark_skin_tone("🤵🏾‍♀️"); + constexpr std::string woman_in_tuxedo_tone5("🤵🏿‍♀️"); + constexpr std::string woman_in_tuxedo_dark_skin_tone("🤵🏿‍♀️"); + constexpr std::string man_in_tuxedo("🤵‍♂️"); + constexpr std::string man_in_tuxedo_tone1("🤵🏻‍♂️"); + constexpr std::string man_in_tuxedo_light_skin_tone("🤵🏻‍♂️"); + constexpr std::string man_in_tuxedo_tone2("🤵🏼‍♂️"); + constexpr std::string man_in_tuxedo_medium_light_skin_tone("🤵🏼‍♂️"); + constexpr std::string man_in_tuxedo_tone3("🤵🏽‍♂️"); + constexpr std::string man_in_tuxedo_medium_skin_tone("🤵🏽‍♂️"); + constexpr std::string man_in_tuxedo_tone4("🤵🏾‍♂️"); + constexpr std::string man_in_tuxedo_medium_dark_skin_tone("🤵🏾‍♂️"); + constexpr std::string man_in_tuxedo_tone5("🤵🏿‍♂️"); + constexpr std::string man_in_tuxedo_dark_skin_tone("🤵🏿‍♂️"); + constexpr std::string person_with_crown("🫅"); + constexpr std::string person_with_crown_tone1("🫅🏻"); + constexpr std::string person_with_crown_light_skin_tone("🫅🏻"); + constexpr std::string person_with_crown_tone2("🫅🏼"); + constexpr std::string person_with_crown_medium_light_skin_tone("🫅🏼"); + constexpr std::string person_with_crown_tone3("🫅🏽"); + constexpr std::string person_with_crown_medium_skin_tone("🫅🏽"); + constexpr std::string person_with_crown_tone4("🫅🏾"); + constexpr std::string person_with_crown_medium_dark_skin_tone("🫅🏾"); + constexpr std::string person_with_crown_tone5("🫅🏿"); + constexpr std::string person_with_crown_dark_skin_tone("🫅🏿"); + constexpr std::string princess("👸"); + constexpr std::string princess_tone1("👸🏻"); + constexpr std::string princess_tone2("👸🏼"); + constexpr std::string princess_tone3("👸🏽"); + constexpr std::string princess_tone4("👸🏾"); + constexpr std::string princess_tone5("👸🏿"); + constexpr std::string prince("🤴"); + constexpr std::string prince_tone1("🤴🏻"); + constexpr std::string prince_tone2("🤴🏼"); + constexpr std::string prince_tone3("🤴🏽"); + constexpr std::string prince_tone4("🤴🏾"); + constexpr std::string prince_tone5("🤴🏿"); + constexpr std::string superhero("🦸"); + constexpr std::string superhero_tone1("🦸🏻"); + constexpr std::string superhero_light_skin_tone("🦸🏻"); + constexpr std::string superhero_tone2("🦸🏼"); + constexpr std::string superhero_medium_light_skin_tone("🦸🏼"); + constexpr std::string superhero_tone3("🦸🏽"); + constexpr std::string superhero_medium_skin_tone("🦸🏽"); + constexpr std::string superhero_tone4("🦸🏾"); + constexpr std::string superhero_medium_dark_skin_tone("🦸🏾"); + constexpr std::string superhero_tone5("🦸🏿"); + constexpr std::string superhero_dark_skin_tone("🦸🏿"); + constexpr std::string woman_superhero("🦸‍♀️"); + constexpr std::string woman_superhero_tone1("🦸🏻‍♀️"); + constexpr std::string woman_superhero_light_skin_tone("🦸🏻‍♀️"); + constexpr std::string woman_superhero_tone2("🦸🏼‍♀️"); + constexpr std::string woman_superhero_medium_light_skin_tone("🦸🏼‍♀️"); + constexpr std::string woman_superhero_tone3("🦸🏽‍♀️"); + constexpr std::string woman_superhero_medium_skin_tone("🦸🏽‍♀️"); + constexpr std::string woman_superhero_tone4("🦸🏾‍♀️"); + constexpr std::string woman_superhero_medium_dark_skin_tone("🦸🏾‍♀️"); + constexpr std::string woman_superhero_tone5("🦸🏿‍♀️"); + constexpr std::string woman_superhero_dark_skin_tone("🦸🏿‍♀️"); + constexpr std::string man_superhero("🦸‍♂️"); + constexpr std::string man_superhero_tone1("🦸🏻‍♂️"); + constexpr std::string man_superhero_light_skin_tone("🦸🏻‍♂️"); + constexpr std::string man_superhero_tone2("🦸🏼‍♂️"); + constexpr std::string man_superhero_medium_light_skin_tone("🦸🏼‍♂️"); + constexpr std::string man_superhero_tone3("🦸🏽‍♂️"); + constexpr std::string man_superhero_medium_skin_tone("🦸🏽‍♂️"); + constexpr std::string man_superhero_tone4("🦸🏾‍♂️"); + constexpr std::string man_superhero_medium_dark_skin_tone("🦸🏾‍♂️"); + constexpr std::string man_superhero_tone5("🦸🏿‍♂️"); + constexpr std::string man_superhero_dark_skin_tone("🦸🏿‍♂️"); + constexpr std::string supervillain("🦹"); + constexpr std::string supervillain_tone1("🦹🏻"); + constexpr std::string supervillain_light_skin_tone("🦹🏻"); + constexpr std::string supervillain_tone2("🦹🏼"); + constexpr std::string supervillain_medium_light_skin_tone("🦹🏼"); + constexpr std::string supervillain_tone3("🦹🏽"); + constexpr std::string supervillain_medium_skin_tone("🦹🏽"); + constexpr std::string supervillain_tone4("🦹🏾"); + constexpr std::string supervillain_medium_dark_skin_tone("🦹🏾"); + constexpr std::string supervillain_tone5("🦹🏿"); + constexpr std::string supervillain_dark_skin_tone("🦹🏿"); + constexpr std::string woman_supervillain("🦹‍♀️"); + constexpr std::string woman_supervillain_tone1("🦹🏻‍♀️"); + constexpr std::string woman_supervillain_light_skin_tone("🦹🏻‍♀️"); + constexpr std::string woman_supervillain_tone2("🦹🏼‍♀️"); + constexpr std::string woman_supervillain_medium_light_skin_tone("🦹🏼‍♀️"); + constexpr std::string woman_supervillain_tone3("🦹🏽‍♀️"); + constexpr std::string woman_supervillain_medium_skin_tone("🦹🏽‍♀️"); + constexpr std::string woman_supervillain_tone4("🦹🏾‍♀️"); + constexpr std::string woman_supervillain_medium_dark_skin_tone("🦹🏾‍♀️"); + constexpr std::string woman_supervillain_tone5("🦹🏿‍♀️"); + constexpr std::string woman_supervillain_dark_skin_tone("🦹🏿‍♀️"); + constexpr std::string man_supervillain("🦹‍♂️"); + constexpr std::string man_supervillain_tone1("🦹🏻‍♂️"); + constexpr std::string man_supervillain_light_skin_tone("🦹🏻‍♂️"); + constexpr std::string man_supervillain_tone2("🦹🏼‍♂️"); + constexpr std::string man_supervillain_medium_light_skin_tone("🦹🏼‍♂️"); + constexpr std::string man_supervillain_tone3("🦹🏽‍♂️"); + constexpr std::string man_supervillain_medium_skin_tone("🦹🏽‍♂️"); + constexpr std::string man_supervillain_tone4("🦹🏾‍♂️"); + constexpr std::string man_supervillain_medium_dark_skin_tone("🦹🏾‍♂️"); + constexpr std::string man_supervillain_tone5("🦹🏿‍♂️"); + constexpr std::string man_supervillain_dark_skin_tone("🦹🏿‍♂️"); + constexpr std::string ninja("🥷"); + constexpr std::string ninja_tone1("🥷🏻"); + constexpr std::string ninja_light_skin_tone("🥷🏻"); + constexpr std::string ninja_tone2("🥷🏼"); + constexpr std::string ninja_medium_light_skin_tone("🥷🏼"); + constexpr std::string ninja_tone3("🥷🏽"); + constexpr std::string ninja_medium_skin_tone("🥷🏽"); + constexpr std::string ninja_tone4("🥷🏾"); + constexpr std::string ninja_medium_dark_skin_tone("🥷🏾"); + constexpr std::string ninja_tone5("🥷🏿"); + constexpr std::string ninja_dark_skin_tone("🥷🏿"); + constexpr std::string mx_claus("🧑‍🎄"); + constexpr std::string mx_claus_tone1("🧑🏻‍🎄"); + constexpr std::string mx_claus_light_skin_tone("🧑🏻‍🎄"); + constexpr std::string mx_claus_tone2("🧑🏼‍🎄"); + constexpr std::string mx_claus_medium_light_skin_tone("🧑🏼‍🎄"); + constexpr std::string mx_claus_tone3("🧑🏽‍🎄"); + constexpr std::string mx_claus_medium_skin_tone("🧑🏽‍🎄"); + constexpr std::string mx_claus_tone4("🧑🏾‍🎄"); + constexpr std::string mx_claus_medium_dark_skin_tone("🧑🏾‍🎄"); + constexpr std::string mx_claus_tone5("🧑🏿‍🎄"); + constexpr std::string mx_claus_dark_skin_tone("🧑🏿‍🎄"); + constexpr std::string mrs_claus("🤶"); + constexpr std::string mother_christmas("🤶"); + constexpr std::string mrs_claus_tone1("🤶🏻"); + constexpr std::string mother_christmas_tone1("🤶🏻"); + constexpr std::string mrs_claus_tone2("🤶🏼"); + constexpr std::string mother_christmas_tone2("🤶🏼"); + constexpr std::string mrs_claus_tone3("🤶🏽"); + constexpr std::string mother_christmas_tone3("🤶🏽"); + constexpr std::string mrs_claus_tone4("🤶🏾"); + constexpr std::string mother_christmas_tone4("🤶🏾"); + constexpr std::string mrs_claus_tone5("🤶🏿"); + constexpr std::string mother_christmas_tone5("🤶🏿"); + constexpr std::string santa("🎅"); + constexpr std::string santa_tone1("🎅🏻"); + constexpr std::string santa_tone2("🎅🏼"); + constexpr std::string santa_tone3("🎅🏽"); + constexpr std::string santa_tone4("🎅🏾"); + constexpr std::string santa_tone5("🎅🏿"); + constexpr std::string mage("🧙"); + constexpr std::string mage_tone1("🧙🏻"); + constexpr std::string mage_light_skin_tone("🧙🏻"); + constexpr std::string mage_tone2("🧙🏼"); + constexpr std::string mage_medium_light_skin_tone("🧙🏼"); + constexpr std::string mage_tone3("🧙🏽"); + constexpr std::string mage_medium_skin_tone("🧙🏽"); + constexpr std::string mage_tone4("🧙🏾"); + constexpr std::string mage_medium_dark_skin_tone("🧙🏾"); + constexpr std::string mage_tone5("🧙🏿"); + constexpr std::string mage_dark_skin_tone("🧙🏿"); + constexpr std::string woman_mage("🧙‍♀️"); + constexpr std::string woman_mage_tone1("🧙🏻‍♀️"); + constexpr std::string woman_mage_light_skin_tone("🧙🏻‍♀️"); + constexpr std::string woman_mage_tone2("🧙🏼‍♀️"); + constexpr std::string woman_mage_medium_light_skin_tone("🧙🏼‍♀️"); + constexpr std::string woman_mage_tone3("🧙🏽‍♀️"); + constexpr std::string woman_mage_medium_skin_tone("🧙🏽‍♀️"); + constexpr std::string woman_mage_tone4("🧙🏾‍♀️"); + constexpr std::string woman_mage_medium_dark_skin_tone("🧙🏾‍♀️"); + constexpr std::string woman_mage_tone5("🧙🏿‍♀️"); + constexpr std::string woman_mage_dark_skin_tone("🧙🏿‍♀️"); + constexpr std::string man_mage("🧙‍♂️"); + constexpr std::string man_mage_tone1("🧙🏻‍♂️"); + constexpr std::string man_mage_light_skin_tone("🧙🏻‍♂️"); + constexpr std::string man_mage_tone2("🧙🏼‍♂️"); + constexpr std::string man_mage_medium_light_skin_tone("🧙🏼‍♂️"); + constexpr std::string man_mage_tone3("🧙🏽‍♂️"); + constexpr std::string man_mage_medium_skin_tone("🧙🏽‍♂️"); + constexpr std::string man_mage_tone4("🧙🏾‍♂️"); + constexpr std::string man_mage_medium_dark_skin_tone("🧙🏾‍♂️"); + constexpr std::string man_mage_tone5("🧙🏿‍♂️"); + constexpr std::string man_mage_dark_skin_tone("🧙🏿‍♂️"); + constexpr std::string elf("🧝"); + constexpr std::string elf_tone1("🧝🏻"); + constexpr std::string elf_light_skin_tone("🧝🏻"); + constexpr std::string elf_tone2("🧝🏼"); + constexpr std::string elf_medium_light_skin_tone("🧝🏼"); + constexpr std::string elf_tone3("🧝🏽"); + constexpr std::string elf_medium_skin_tone("🧝🏽"); + constexpr std::string elf_tone4("🧝🏾"); + constexpr std::string elf_medium_dark_skin_tone("🧝🏾"); + constexpr std::string elf_tone5("🧝🏿"); + constexpr std::string elf_dark_skin_tone("🧝🏿"); + constexpr std::string woman_elf("🧝‍♀️"); + constexpr std::string woman_elf_tone1("🧝🏻‍♀️"); + constexpr std::string woman_elf_light_skin_tone("🧝🏻‍♀️"); + constexpr std::string woman_elf_tone2("🧝🏼‍♀️"); + constexpr std::string woman_elf_medium_light_skin_tone("🧝🏼‍♀️"); + constexpr std::string woman_elf_tone3("🧝🏽‍♀️"); + constexpr std::string woman_elf_medium_skin_tone("🧝🏽‍♀️"); + constexpr std::string woman_elf_tone4("🧝🏾‍♀️"); + constexpr std::string woman_elf_medium_dark_skin_tone("🧝🏾‍♀️"); + constexpr std::string woman_elf_tone5("🧝🏿‍♀️"); + constexpr std::string woman_elf_dark_skin_tone("🧝🏿‍♀️"); + constexpr std::string man_elf("🧝‍♂️"); + constexpr std::string man_elf_tone1("🧝🏻‍♂️"); + constexpr std::string man_elf_light_skin_tone("🧝🏻‍♂️"); + constexpr std::string man_elf_tone2("🧝🏼‍♂️"); + constexpr std::string man_elf_medium_light_skin_tone("🧝🏼‍♂️"); + constexpr std::string man_elf_tone3("🧝🏽‍♂️"); + constexpr std::string man_elf_medium_skin_tone("🧝🏽‍♂️"); + constexpr std::string man_elf_tone4("🧝🏾‍♂️"); + constexpr std::string man_elf_medium_dark_skin_tone("🧝🏾‍♂️"); + constexpr std::string man_elf_tone5("🧝🏿‍♂️"); + constexpr std::string man_elf_dark_skin_tone("🧝🏿‍♂️"); + constexpr std::string troll("🧌"); + constexpr std::string vampire("🧛"); + constexpr std::string vampire_tone1("🧛🏻"); + constexpr std::string vampire_light_skin_tone("🧛🏻"); + constexpr std::string vampire_tone2("🧛🏼"); + constexpr std::string vampire_medium_light_skin_tone("🧛🏼"); + constexpr std::string vampire_tone3("🧛🏽"); + constexpr std::string vampire_medium_skin_tone("🧛🏽"); + constexpr std::string vampire_tone4("🧛🏾"); + constexpr std::string vampire_medium_dark_skin_tone("🧛🏾"); + constexpr std::string vampire_tone5("🧛🏿"); + constexpr std::string vampire_dark_skin_tone("🧛🏿"); + constexpr std::string woman_vampire("🧛‍♀️"); + constexpr std::string woman_vampire_tone1("🧛🏻‍♀️"); + constexpr std::string woman_vampire_light_skin_tone("🧛🏻‍♀️"); + constexpr std::string woman_vampire_tone2("🧛🏼‍♀️"); + constexpr std::string woman_vampire_medium_light_skin_tone("🧛🏼‍♀️"); + constexpr std::string woman_vampire_tone3("🧛🏽‍♀️"); + constexpr std::string woman_vampire_medium_skin_tone("🧛🏽‍♀️"); + constexpr std::string woman_vampire_tone4("🧛🏾‍♀️"); + constexpr std::string woman_vampire_medium_dark_skin_tone("🧛🏾‍♀️"); + constexpr std::string woman_vampire_tone5("🧛🏿‍♀️"); + constexpr std::string woman_vampire_dark_skin_tone("🧛🏿‍♀️"); + constexpr std::string man_vampire("🧛‍♂️"); + constexpr std::string man_vampire_tone1("🧛🏻‍♂️"); + constexpr std::string man_vampire_light_skin_tone("🧛🏻‍♂️"); + constexpr std::string man_vampire_tone2("🧛🏼‍♂️"); + constexpr std::string man_vampire_medium_light_skin_tone("🧛🏼‍♂️"); + constexpr std::string man_vampire_tone3("🧛🏽‍♂️"); + constexpr std::string man_vampire_medium_skin_tone("🧛🏽‍♂️"); + constexpr std::string man_vampire_tone4("🧛🏾‍♂️"); + constexpr std::string man_vampire_medium_dark_skin_tone("🧛🏾‍♂️"); + constexpr std::string man_vampire_tone5("🧛🏿‍♂️"); + constexpr std::string man_vampire_dark_skin_tone("🧛🏿‍♂️"); + constexpr std::string zombie("🧟"); + constexpr std::string woman_zombie("🧟‍♀️"); + constexpr std::string man_zombie("🧟‍♂️"); + constexpr std::string genie("🧞"); + constexpr std::string woman_genie("🧞‍♀️"); + constexpr std::string man_genie("🧞‍♂️"); + constexpr std::string merperson("🧜"); + constexpr std::string merperson_tone1("🧜🏻"); + constexpr std::string merperson_light_skin_tone("🧜🏻"); + constexpr std::string merperson_tone2("🧜🏼"); + constexpr std::string merperson_medium_light_skin_tone("🧜🏼"); + constexpr std::string merperson_tone3("🧜🏽"); + constexpr std::string merperson_medium_skin_tone("🧜🏽"); + constexpr std::string merperson_tone4("🧜🏾"); + constexpr std::string merperson_medium_dark_skin_tone("🧜🏾"); + constexpr std::string merperson_tone5("🧜🏿"); + constexpr std::string merperson_dark_skin_tone("🧜🏿"); + constexpr std::string mermaid("🧜‍♀️"); + constexpr std::string mermaid_tone1("🧜🏻‍♀️"); + constexpr std::string mermaid_light_skin_tone("🧜🏻‍♀️"); + constexpr std::string mermaid_tone2("🧜🏼‍♀️"); + constexpr std::string mermaid_medium_light_skin_tone("🧜🏼‍♀️"); + constexpr std::string mermaid_tone3("🧜🏽‍♀️"); + constexpr std::string mermaid_medium_skin_tone("🧜🏽‍♀️"); + constexpr std::string mermaid_tone4("🧜🏾‍♀️"); + constexpr std::string mermaid_medium_dark_skin_tone("🧜🏾‍♀️"); + constexpr std::string mermaid_tone5("🧜🏿‍♀️"); + constexpr std::string mermaid_dark_skin_tone("🧜🏿‍♀️"); + constexpr std::string merman("🧜‍♂️"); + constexpr std::string merman_tone1("🧜🏻‍♂️"); + constexpr std::string merman_light_skin_tone("🧜🏻‍♂️"); + constexpr std::string merman_tone2("🧜🏼‍♂️"); + constexpr std::string merman_medium_light_skin_tone("🧜🏼‍♂️"); + constexpr std::string merman_tone3("🧜🏽‍♂️"); + constexpr std::string merman_medium_skin_tone("🧜🏽‍♂️"); + constexpr std::string merman_tone4("🧜🏾‍♂️"); + constexpr std::string merman_medium_dark_skin_tone("🧜🏾‍♂️"); + constexpr std::string merman_tone5("🧜🏿‍♂️"); + constexpr std::string merman_dark_skin_tone("🧜🏿‍♂️"); + constexpr std::string fairy("🧚"); + constexpr std::string fairy_tone1("🧚🏻"); + constexpr std::string fairy_light_skin_tone("🧚🏻"); + constexpr std::string fairy_tone2("🧚🏼"); + constexpr std::string fairy_medium_light_skin_tone("🧚🏼"); + constexpr std::string fairy_tone3("🧚🏽"); + constexpr std::string fairy_medium_skin_tone("🧚🏽"); + constexpr std::string fairy_tone4("🧚🏾"); + constexpr std::string fairy_medium_dark_skin_tone("🧚🏾"); + constexpr std::string fairy_tone5("🧚🏿"); + constexpr std::string fairy_dark_skin_tone("🧚🏿"); + constexpr std::string woman_fairy("🧚‍♀️"); + constexpr std::string woman_fairy_tone1("🧚🏻‍♀️"); + constexpr std::string woman_fairy_light_skin_tone("🧚🏻‍♀️"); + constexpr std::string woman_fairy_tone2("🧚🏼‍♀️"); + constexpr std::string woman_fairy_medium_light_skin_tone("🧚🏼‍♀️"); + constexpr std::string woman_fairy_tone3("🧚🏽‍♀️"); + constexpr std::string woman_fairy_medium_skin_tone("🧚🏽‍♀️"); + constexpr std::string woman_fairy_tone4("🧚🏾‍♀️"); + constexpr std::string woman_fairy_medium_dark_skin_tone("🧚🏾‍♀️"); + constexpr std::string woman_fairy_tone5("🧚🏿‍♀️"); + constexpr std::string woman_fairy_dark_skin_tone("🧚🏿‍♀️"); + constexpr std::string man_fairy("🧚‍♂️"); + constexpr std::string man_fairy_tone1("🧚🏻‍♂️"); + constexpr std::string man_fairy_light_skin_tone("🧚🏻‍♂️"); + constexpr std::string man_fairy_tone2("🧚🏼‍♂️"); + constexpr std::string man_fairy_medium_light_skin_tone("🧚🏼‍♂️"); + constexpr std::string man_fairy_tone3("🧚🏽‍♂️"); + constexpr std::string man_fairy_medium_skin_tone("🧚🏽‍♂️"); + constexpr std::string man_fairy_tone4("🧚🏾‍♂️"); + constexpr std::string man_fairy_medium_dark_skin_tone("🧚🏾‍♂️"); + constexpr std::string man_fairy_tone5("🧚🏿‍♂️"); + constexpr std::string man_fairy_dark_skin_tone("🧚🏿‍♂️"); + constexpr std::string angel("👼"); + constexpr std::string angel_tone1("👼🏻"); + constexpr std::string angel_tone2("👼🏼"); + constexpr std::string angel_tone3("👼🏽"); + constexpr std::string angel_tone4("👼🏾"); + constexpr std::string angel_tone5("👼🏿"); + constexpr std::string pregnant_person("🫄"); + constexpr std::string pregnant_person_tone1("🫄🏻"); + constexpr std::string pregnant_person_light_skin_tone("🫄🏻"); + constexpr std::string pregnant_person_tone2("🫄🏼"); + constexpr std::string pregnant_person_medium_light_skin_tone("🫄🏼"); + constexpr std::string pregnant_person_tone3("🫄🏽"); + constexpr std::string pregnant_person_medium_skin_tone("🫄🏽"); + constexpr std::string pregnant_person_tone4("🫄🏾"); + constexpr std::string pregnant_person_medium_dark_skin_tone("🫄🏾"); + constexpr std::string pregnant_person_tone5("🫄🏿"); + constexpr std::string pregnant_person_dark_skin_tone("🫄🏿"); + constexpr std::string pregnant_woman("🤰"); + constexpr std::string expecting_woman("🤰"); + constexpr std::string pregnant_woman_tone1("🤰🏻"); + constexpr std::string expecting_woman_tone1("🤰🏻"); + constexpr std::string pregnant_woman_tone2("🤰🏼"); + constexpr std::string expecting_woman_tone2("🤰🏼"); + constexpr std::string pregnant_woman_tone3("🤰🏽"); + constexpr std::string expecting_woman_tone3("🤰🏽"); + constexpr std::string pregnant_woman_tone4("🤰🏾"); + constexpr std::string expecting_woman_tone4("🤰🏾"); + constexpr std::string pregnant_woman_tone5("🤰🏿"); + constexpr std::string expecting_woman_tone5("🤰🏿"); + constexpr std::string pregnant_man("🫃"); + constexpr std::string pregnant_man_tone1("🫃🏻"); + constexpr std::string pregnant_man_light_skin_tone("🫃🏻"); + constexpr std::string pregnant_man_tone2("🫃🏼"); + constexpr std::string pregnant_man_medium_light_skin_tone("🫃🏼"); + constexpr std::string pregnant_man_tone3("🫃🏽"); + constexpr std::string pregnant_man_medium_skin_tone("🫃🏽"); + constexpr std::string pregnant_man_tone4("🫃🏾"); + constexpr std::string pregnant_man_medium_dark_skin_tone("🫃🏾"); + constexpr std::string pregnant_man_tone5("🫃🏿"); + constexpr std::string pregnant_man_dark_skin_tone("🫃🏿"); + constexpr std::string breast_feeding("🤱"); + constexpr std::string breast_feeding_tone1("🤱🏻"); + constexpr std::string breast_feeding_light_skin_tone("🤱🏻"); + constexpr std::string breast_feeding_tone2("🤱🏼"); + constexpr std::string breast_feeding_medium_light_skin_tone("🤱🏼"); + constexpr std::string breast_feeding_tone3("🤱🏽"); + constexpr std::string breast_feeding_medium_skin_tone("🤱🏽"); + constexpr std::string breast_feeding_tone4("🤱🏾"); + constexpr std::string breast_feeding_medium_dark_skin_tone("🤱🏾"); + constexpr std::string breast_feeding_tone5("🤱🏿"); + constexpr std::string breast_feeding_dark_skin_tone("🤱🏿"); + constexpr std::string person_feeding_baby("🧑‍🍼"); + constexpr std::string person_feeding_baby_tone1("🧑🏻‍🍼"); + constexpr std::string person_feeding_baby_light_skin_tone("🧑🏻‍🍼"); + constexpr std::string person_feeding_baby_tone2("🧑🏼‍🍼"); + constexpr std::string person_feeding_baby_medium_light_skin_tone("🧑🏼‍🍼"); + constexpr std::string person_feeding_baby_tone3("🧑🏽‍🍼"); + constexpr std::string person_feeding_baby_medium_skin_tone("🧑🏽‍🍼"); + constexpr std::string person_feeding_baby_tone4("🧑🏾‍🍼"); + constexpr std::string person_feeding_baby_medium_dark_skin_tone("🧑🏾‍🍼"); + constexpr std::string person_feeding_baby_tone5("🧑🏿‍🍼"); + constexpr std::string person_feeding_baby_dark_skin_tone("🧑🏿‍🍼"); + constexpr std::string woman_feeding_baby("👩‍🍼"); + constexpr std::string woman_feeding_baby_tone1("👩🏻‍🍼"); + constexpr std::string woman_feeding_baby_light_skin_tone("👩🏻‍🍼"); + constexpr std::string woman_feeding_baby_tone2("👩🏼‍🍼"); + constexpr std::string woman_feeding_baby_medium_light_skin_tone("👩🏼‍🍼"); + constexpr std::string woman_feeding_baby_tone3("👩🏽‍🍼"); + constexpr std::string woman_feeding_baby_medium_skin_tone("👩🏽‍🍼"); + constexpr std::string woman_feeding_baby_tone4("👩🏾‍🍼"); + constexpr std::string woman_feeding_baby_medium_dark_skin_tone("👩🏾‍🍼"); + constexpr std::string woman_feeding_baby_tone5("👩🏿‍🍼"); + constexpr std::string woman_feeding_baby_dark_skin_tone("👩🏿‍🍼"); + constexpr std::string man_feeding_baby("👨‍🍼"); + constexpr std::string man_feeding_baby_tone1("👨🏻‍🍼"); + constexpr std::string man_feeding_baby_light_skin_tone("👨🏻‍🍼"); + constexpr std::string man_feeding_baby_tone2("👨🏼‍🍼"); + constexpr std::string man_feeding_baby_medium_light_skin_tone("👨🏼‍🍼"); + constexpr std::string man_feeding_baby_tone3("👨🏽‍🍼"); + constexpr std::string man_feeding_baby_medium_skin_tone("👨🏽‍🍼"); + constexpr std::string man_feeding_baby_tone4("👨🏾‍🍼"); + constexpr std::string man_feeding_baby_medium_dark_skin_tone("👨🏾‍🍼"); + constexpr std::string man_feeding_baby_tone5("👨🏿‍🍼"); + constexpr std::string man_feeding_baby_dark_skin_tone("👨🏿‍🍼"); + constexpr std::string person_bowing("🙇"); + constexpr std::string bow("🙇"); + constexpr std::string person_bowing_tone1("🙇🏻"); + constexpr std::string bow_tone1("🙇🏻"); + constexpr std::string person_bowing_tone2("🙇🏼"); + constexpr std::string bow_tone2("🙇🏼"); + constexpr std::string person_bowing_tone3("🙇🏽"); + constexpr std::string bow_tone3("🙇🏽"); + constexpr std::string person_bowing_tone4("🙇🏾"); + constexpr std::string bow_tone4("🙇🏾"); + constexpr std::string person_bowing_tone5("🙇🏿"); + constexpr std::string bow_tone5("🙇🏿"); + constexpr std::string woman_bowing("🙇‍♀️"); + constexpr std::string woman_bowing_tone1("🙇🏻‍♀️"); + constexpr std::string woman_bowing_light_skin_tone("🙇🏻‍♀️"); + constexpr std::string woman_bowing_tone2("🙇🏼‍♀️"); + constexpr std::string woman_bowing_medium_light_skin_tone("🙇🏼‍♀️"); + constexpr std::string woman_bowing_tone3("🙇🏽‍♀️"); + constexpr std::string woman_bowing_medium_skin_tone("🙇🏽‍♀️"); + constexpr std::string woman_bowing_tone4("🙇🏾‍♀️"); + constexpr std::string woman_bowing_medium_dark_skin_tone("🙇🏾‍♀️"); + constexpr std::string woman_bowing_tone5("🙇🏿‍♀️"); + constexpr std::string woman_bowing_dark_skin_tone("🙇🏿‍♀️"); + constexpr std::string man_bowing("🙇‍♂️"); + constexpr std::string man_bowing_tone1("🙇🏻‍♂️"); + constexpr std::string man_bowing_light_skin_tone("🙇🏻‍♂️"); + constexpr std::string man_bowing_tone2("🙇🏼‍♂️"); + constexpr std::string man_bowing_medium_light_skin_tone("🙇🏼‍♂️"); + constexpr std::string man_bowing_tone3("🙇🏽‍♂️"); + constexpr std::string man_bowing_medium_skin_tone("🙇🏽‍♂️"); + constexpr std::string man_bowing_tone4("🙇🏾‍♂️"); + constexpr std::string man_bowing_medium_dark_skin_tone("🙇🏾‍♂️"); + constexpr std::string man_bowing_tone5("🙇🏿‍♂️"); + constexpr std::string man_bowing_dark_skin_tone("🙇🏿‍♂️"); + constexpr std::string person_tipping_hand("💁"); + constexpr std::string information_desk_person("💁"); + constexpr std::string person_tipping_hand_tone1("💁🏻"); + constexpr std::string information_desk_person_tone1("💁🏻"); + constexpr std::string person_tipping_hand_tone2("💁🏼"); + constexpr std::string information_desk_person_tone2("💁🏼"); + constexpr std::string person_tipping_hand_tone3("💁🏽"); + constexpr std::string information_desk_person_tone3("💁🏽"); + constexpr std::string person_tipping_hand_tone4("💁🏾"); + constexpr std::string information_desk_person_tone4("💁🏾"); + constexpr std::string person_tipping_hand_tone5("💁🏿"); + constexpr std::string information_desk_person_tone5("💁🏿"); + constexpr std::string woman_tipping_hand("💁‍♀️"); + constexpr std::string woman_tipping_hand_tone1("💁🏻‍♀️"); + constexpr std::string woman_tipping_hand_light_skin_tone("💁🏻‍♀️"); + constexpr std::string woman_tipping_hand_tone2("💁🏼‍♀️"); + constexpr std::string woman_tipping_hand_medium_light_skin_tone("💁🏼‍♀️"); + constexpr std::string woman_tipping_hand_tone3("💁🏽‍♀️"); + constexpr std::string woman_tipping_hand_medium_skin_tone("💁🏽‍♀️"); + constexpr std::string woman_tipping_hand_tone4("💁🏾‍♀️"); + constexpr std::string woman_tipping_hand_medium_dark_skin_tone("💁🏾‍♀️"); + constexpr std::string woman_tipping_hand_tone5("💁🏿‍♀️"); + constexpr std::string woman_tipping_hand_dark_skin_tone("💁🏿‍♀️"); + constexpr std::string man_tipping_hand("💁‍♂️"); + constexpr std::string man_tipping_hand_tone1("💁🏻‍♂️"); + constexpr std::string man_tipping_hand_light_skin_tone("💁🏻‍♂️"); + constexpr std::string man_tipping_hand_tone2("💁🏼‍♂️"); + constexpr std::string man_tipping_hand_medium_light_skin_tone("💁🏼‍♂️"); + constexpr std::string man_tipping_hand_tone3("💁🏽‍♂️"); + constexpr std::string man_tipping_hand_medium_skin_tone("💁🏽‍♂️"); + constexpr std::string man_tipping_hand_tone4("💁🏾‍♂️"); + constexpr std::string man_tipping_hand_medium_dark_skin_tone("💁🏾‍♂️"); + constexpr std::string man_tipping_hand_tone5("💁🏿‍♂️"); + constexpr std::string man_tipping_hand_dark_skin_tone("💁🏿‍♂️"); + constexpr std::string person_gesturing_no("🙅"); + constexpr std::string no_good("🙅"); + constexpr std::string person_gesturing_no_tone1("🙅🏻"); + constexpr std::string no_good_tone1("🙅🏻"); + constexpr std::string person_gesturing_no_tone2("🙅🏼"); + constexpr std::string no_good_tone2("🙅🏼"); + constexpr std::string person_gesturing_no_tone3("🙅🏽"); + constexpr std::string no_good_tone3("🙅🏽"); + constexpr std::string person_gesturing_no_tone4("🙅🏾"); + constexpr std::string no_good_tone4("🙅🏾"); + constexpr std::string person_gesturing_no_tone5("🙅🏿"); + constexpr std::string no_good_tone5("🙅🏿"); + constexpr std::string woman_gesturing_no("🙅‍♀️"); + constexpr std::string woman_gesturing_no_tone1("🙅🏻‍♀️"); + constexpr std::string woman_gesturing_no_light_skin_tone("🙅🏻‍♀️"); + constexpr std::string woman_gesturing_no_tone2("🙅🏼‍♀️"); + constexpr std::string woman_gesturing_no_medium_light_skin_tone("🙅🏼‍♀️"); + constexpr std::string woman_gesturing_no_tone3("🙅🏽‍♀️"); + constexpr std::string woman_gesturing_no_medium_skin_tone("🙅🏽‍♀️"); + constexpr std::string woman_gesturing_no_tone4("🙅🏾‍♀️"); + constexpr std::string woman_gesturing_no_medium_dark_skin_tone("🙅🏾‍♀️"); + constexpr std::string woman_gesturing_no_tone5("🙅🏿‍♀️"); + constexpr std::string woman_gesturing_no_dark_skin_tone("🙅🏿‍♀️"); + constexpr std::string man_gesturing_no("🙅‍♂️"); + constexpr std::string man_gesturing_no_tone1("🙅🏻‍♂️"); + constexpr std::string man_gesturing_no_light_skin_tone("🙅🏻‍♂️"); + constexpr std::string man_gesturing_no_tone2("🙅🏼‍♂️"); + constexpr std::string man_gesturing_no_medium_light_skin_tone("🙅🏼‍♂️"); + constexpr std::string man_gesturing_no_tone3("🙅🏽‍♂️"); + constexpr std::string man_gesturing_no_medium_skin_tone("🙅🏽‍♂️"); + constexpr std::string man_gesturing_no_tone4("🙅🏾‍♂️"); + constexpr std::string man_gesturing_no_medium_dark_skin_tone("🙅🏾‍♂️"); + constexpr std::string man_gesturing_no_tone5("🙅🏿‍♂️"); + constexpr std::string man_gesturing_no_dark_skin_tone("🙅🏿‍♂️"); + constexpr std::string person_gesturing_ok("🙆"); + constexpr std::string person_gesturing_ok_tone1("🙆🏻"); + constexpr std::string person_gesturing_ok_tone2("🙆🏼"); + constexpr std::string person_gesturing_ok_tone3("🙆🏽"); + constexpr std::string person_gesturing_ok_tone4("🙆🏾"); + constexpr std::string person_gesturing_ok_tone5("🙆🏿"); + constexpr std::string woman_gesturing_ok("🙆‍♀️"); + constexpr std::string woman_gesturing_ok_tone1("🙆🏻‍♀️"); + constexpr std::string woman_gesturing_ok_light_skin_tone("🙆🏻‍♀️"); + constexpr std::string woman_gesturing_ok_tone2("🙆🏼‍♀️"); + constexpr std::string woman_gesturing_ok_medium_light_skin_tone("🙆🏼‍♀️"); + constexpr std::string woman_gesturing_ok_tone3("🙆🏽‍♀️"); + constexpr std::string woman_gesturing_ok_medium_skin_tone("🙆🏽‍♀️"); + constexpr std::string woman_gesturing_ok_tone4("🙆🏾‍♀️"); + constexpr std::string woman_gesturing_ok_medium_dark_skin_tone("🙆🏾‍♀️"); + constexpr std::string woman_gesturing_ok_tone5("🙆🏿‍♀️"); + constexpr std::string woman_gesturing_ok_dark_skin_tone("🙆🏿‍♀️"); + constexpr std::string man_gesturing_ok("🙆‍♂️"); + constexpr std::string man_gesturing_ok_tone1("🙆🏻‍♂️"); + constexpr std::string man_gesturing_ok_light_skin_tone("🙆🏻‍♂️"); + constexpr std::string man_gesturing_ok_tone2("🙆🏼‍♂️"); + constexpr std::string man_gesturing_ok_medium_light_skin_tone("🙆🏼‍♂️"); + constexpr std::string man_gesturing_ok_tone3("🙆🏽‍♂️"); + constexpr std::string man_gesturing_ok_medium_skin_tone("🙆🏽‍♂️"); + constexpr std::string man_gesturing_ok_tone4("🙆🏾‍♂️"); + constexpr std::string man_gesturing_ok_medium_dark_skin_tone("🙆🏾‍♂️"); + constexpr std::string man_gesturing_ok_tone5("🙆🏿‍♂️"); + constexpr std::string man_gesturing_ok_dark_skin_tone("🙆🏿‍♂️"); + constexpr std::string person_raising_hand("🙋"); + constexpr std::string raising_hand("🙋"); + constexpr std::string person_raising_hand_tone1("🙋🏻"); + constexpr std::string raising_hand_tone1("🙋🏻"); + constexpr std::string person_raising_hand_tone2("🙋🏼"); + constexpr std::string raising_hand_tone2("🙋🏼"); + constexpr std::string person_raising_hand_tone3("🙋🏽"); + constexpr std::string raising_hand_tone3("🙋🏽"); + constexpr std::string person_raising_hand_tone4("🙋🏾"); + constexpr std::string raising_hand_tone4("🙋🏾"); + constexpr std::string person_raising_hand_tone5("🙋🏿"); + constexpr std::string raising_hand_tone5("🙋🏿"); + constexpr std::string woman_raising_hand("🙋‍♀️"); + constexpr std::string woman_raising_hand_tone1("🙋🏻‍♀️"); + constexpr std::string woman_raising_hand_light_skin_tone("🙋🏻‍♀️"); + constexpr std::string woman_raising_hand_tone2("🙋🏼‍♀️"); + constexpr std::string woman_raising_hand_medium_light_skin_tone("🙋🏼‍♀️"); + constexpr std::string woman_raising_hand_tone3("🙋🏽‍♀️"); + constexpr std::string woman_raising_hand_medium_skin_tone("🙋🏽‍♀️"); + constexpr std::string woman_raising_hand_tone4("🙋🏾‍♀️"); + constexpr std::string woman_raising_hand_medium_dark_skin_tone("🙋🏾‍♀️"); + constexpr std::string woman_raising_hand_tone5("🙋🏿‍♀️"); + constexpr std::string woman_raising_hand_dark_skin_tone("🙋🏿‍♀️"); + constexpr std::string man_raising_hand("🙋‍♂️"); + constexpr std::string man_raising_hand_tone1("🙋🏻‍♂️"); + constexpr std::string man_raising_hand_light_skin_tone("🙋🏻‍♂️"); + constexpr std::string man_raising_hand_tone2("🙋🏼‍♂️"); + constexpr std::string man_raising_hand_medium_light_skin_tone("🙋🏼‍♂️"); + constexpr std::string man_raising_hand_tone3("🙋🏽‍♂️"); + constexpr std::string man_raising_hand_medium_skin_tone("🙋🏽‍♂️"); + constexpr std::string man_raising_hand_tone4("🙋🏾‍♂️"); + constexpr std::string man_raising_hand_medium_dark_skin_tone("🙋🏾‍♂️"); + constexpr std::string man_raising_hand_tone5("🙋🏿‍♂️"); + constexpr std::string man_raising_hand_dark_skin_tone("🙋🏿‍♂️"); + constexpr std::string deaf_person("🧏"); + constexpr std::string deaf_person_tone1("🧏🏻"); + constexpr std::string deaf_person_light_skin_tone("🧏🏻"); + constexpr std::string deaf_person_tone2("🧏🏼"); + constexpr std::string deaf_person_medium_light_skin_tone("🧏🏼"); + constexpr std::string deaf_person_tone3("🧏🏽"); + constexpr std::string deaf_person_medium_skin_tone("🧏🏽"); + constexpr std::string deaf_person_tone4("🧏🏾"); + constexpr std::string deaf_person_medium_dark_skin_tone("🧏🏾"); + constexpr std::string deaf_person_tone5("🧏🏿"); + constexpr std::string deaf_person_dark_skin_tone("🧏🏿"); + constexpr std::string deaf_woman("🧏‍♀️"); + constexpr std::string deaf_woman_tone1("🧏🏻‍♀️"); + constexpr std::string deaf_woman_light_skin_tone("🧏🏻‍♀️"); + constexpr std::string deaf_woman_tone2("🧏🏼‍♀️"); + constexpr std::string deaf_woman_medium_light_skin_tone("🧏🏼‍♀️"); + constexpr std::string deaf_woman_tone3("🧏🏽‍♀️"); + constexpr std::string deaf_woman_medium_skin_tone("🧏🏽‍♀️"); + constexpr std::string deaf_woman_tone4("🧏🏾‍♀️"); + constexpr std::string deaf_woman_medium_dark_skin_tone("🧏🏾‍♀️"); + constexpr std::string deaf_woman_tone5("🧏🏿‍♀️"); + constexpr std::string deaf_woman_dark_skin_tone("🧏🏿‍♀️"); + constexpr std::string deaf_man("🧏‍♂️"); + constexpr std::string deaf_man_tone1("🧏🏻‍♂️"); + constexpr std::string deaf_man_light_skin_tone("🧏🏻‍♂️"); + constexpr std::string deaf_man_tone2("🧏🏼‍♂️"); + constexpr std::string deaf_man_medium_light_skin_tone("🧏🏼‍♂️"); + constexpr std::string deaf_man_tone3("🧏🏽‍♂️"); + constexpr std::string deaf_man_medium_skin_tone("🧏🏽‍♂️"); + constexpr std::string deaf_man_tone4("🧏🏾‍♂️"); + constexpr std::string deaf_man_medium_dark_skin_tone("🧏🏾‍♂️"); + constexpr std::string deaf_man_tone5("🧏🏿‍♂️"); + constexpr std::string deaf_man_dark_skin_tone("🧏🏿‍♂️"); + constexpr std::string person_facepalming("🤦"); + constexpr std::string face_palm("🤦"); + constexpr std::string facepalm("🤦"); + constexpr std::string person_facepalming_tone1("🤦🏻"); + constexpr std::string face_palm_tone1("🤦🏻"); + constexpr std::string facepalm_tone1("🤦🏻"); + constexpr std::string person_facepalming_tone2("🤦🏼"); + constexpr std::string face_palm_tone2("🤦🏼"); + constexpr std::string facepalm_tone2("🤦🏼"); + constexpr std::string person_facepalming_tone3("🤦🏽"); + constexpr std::string face_palm_tone3("🤦🏽"); + constexpr std::string facepalm_tone3("🤦🏽"); + constexpr std::string person_facepalming_tone4("🤦🏾"); + constexpr std::string face_palm_tone4("🤦🏾"); + constexpr std::string facepalm_tone4("🤦🏾"); + constexpr std::string person_facepalming_tone5("🤦🏿"); + constexpr std::string face_palm_tone5("🤦🏿"); + constexpr std::string facepalm_tone5("🤦🏿"); + constexpr std::string woman_facepalming("🤦‍♀️"); + constexpr std::string woman_facepalming_tone1("🤦🏻‍♀️"); + constexpr std::string woman_facepalming_light_skin_tone("🤦🏻‍♀️"); + constexpr std::string woman_facepalming_tone2("🤦🏼‍♀️"); + constexpr std::string woman_facepalming_medium_light_skin_tone("🤦🏼‍♀️"); + constexpr std::string woman_facepalming_tone3("🤦🏽‍♀️"); + constexpr std::string woman_facepalming_medium_skin_tone("🤦🏽‍♀️"); + constexpr std::string woman_facepalming_tone4("🤦🏾‍♀️"); + constexpr std::string woman_facepalming_medium_dark_skin_tone("🤦🏾‍♀️"); + constexpr std::string woman_facepalming_tone5("🤦🏿‍♀️"); + constexpr std::string woman_facepalming_dark_skin_tone("🤦🏿‍♀️"); + constexpr std::string man_facepalming("🤦‍♂️"); + constexpr std::string man_facepalming_tone1("🤦🏻‍♂️"); + constexpr std::string man_facepalming_light_skin_tone("🤦🏻‍♂️"); + constexpr std::string man_facepalming_tone2("🤦🏼‍♂️"); + constexpr std::string man_facepalming_medium_light_skin_tone("🤦🏼‍♂️"); + constexpr std::string man_facepalming_tone3("🤦🏽‍♂️"); + constexpr std::string man_facepalming_medium_skin_tone("🤦🏽‍♂️"); + constexpr std::string man_facepalming_tone4("🤦🏾‍♂️"); + constexpr std::string man_facepalming_medium_dark_skin_tone("🤦🏾‍♂️"); + constexpr std::string man_facepalming_tone5("🤦🏿‍♂️"); + constexpr std::string man_facepalming_dark_skin_tone("🤦🏿‍♂️"); + constexpr std::string person_shrugging("🤷"); + constexpr std::string shrug("🤷"); + constexpr std::string person_shrugging_tone1("🤷🏻"); + constexpr std::string shrug_tone1("🤷🏻"); + constexpr std::string person_shrugging_tone2("🤷🏼"); + constexpr std::string shrug_tone2("🤷🏼"); + constexpr std::string person_shrugging_tone3("🤷🏽"); + constexpr std::string shrug_tone3("🤷🏽"); + constexpr std::string person_shrugging_tone4("🤷🏾"); + constexpr std::string shrug_tone4("🤷🏾"); + constexpr std::string person_shrugging_tone5("🤷🏿"); + constexpr std::string shrug_tone5("🤷🏿"); + constexpr std::string woman_shrugging("🤷‍♀️"); + constexpr std::string woman_shrugging_tone1("🤷🏻‍♀️"); + constexpr std::string woman_shrugging_light_skin_tone("🤷🏻‍♀️"); + constexpr std::string woman_shrugging_tone2("🤷🏼‍♀️"); + constexpr std::string woman_shrugging_medium_light_skin_tone("🤷🏼‍♀️"); + constexpr std::string woman_shrugging_tone3("🤷🏽‍♀️"); + constexpr std::string woman_shrugging_medium_skin_tone("🤷🏽‍♀️"); + constexpr std::string woman_shrugging_tone4("🤷🏾‍♀️"); + constexpr std::string woman_shrugging_medium_dark_skin_tone("🤷🏾‍♀️"); + constexpr std::string woman_shrugging_tone5("🤷🏿‍♀️"); + constexpr std::string woman_shrugging_dark_skin_tone("🤷🏿‍♀️"); + constexpr std::string man_shrugging("🤷‍♂️"); + constexpr std::string man_shrugging_tone1("🤷🏻‍♂️"); + constexpr std::string man_shrugging_light_skin_tone("🤷🏻‍♂️"); + constexpr std::string man_shrugging_tone2("🤷🏼‍♂️"); + constexpr std::string man_shrugging_medium_light_skin_tone("🤷🏼‍♂️"); + constexpr std::string man_shrugging_tone3("🤷🏽‍♂️"); + constexpr std::string man_shrugging_medium_skin_tone("🤷🏽‍♂️"); + constexpr std::string man_shrugging_tone4("🤷🏾‍♂️"); + constexpr std::string man_shrugging_medium_dark_skin_tone("🤷🏾‍♂️"); + constexpr std::string man_shrugging_tone5("🤷🏿‍♂️"); + constexpr std::string man_shrugging_dark_skin_tone("🤷🏿‍♂️"); + constexpr std::string person_pouting("🙎"); + constexpr std::string person_with_pouting_face("🙎"); + constexpr std::string person_pouting_tone1("🙎🏻"); + constexpr std::string person_with_pouting_face_tone1("🙎🏻"); + constexpr std::string person_pouting_tone2("🙎🏼"); + constexpr std::string person_with_pouting_face_tone2("🙎🏼"); + constexpr std::string person_pouting_tone3("🙎🏽"); + constexpr std::string person_with_pouting_face_tone3("🙎🏽"); + constexpr std::string person_pouting_tone4("🙎🏾"); + constexpr std::string person_with_pouting_face_tone4("🙎🏾"); + constexpr std::string person_pouting_tone5("🙎🏿"); + constexpr std::string person_with_pouting_face_tone5("🙎🏿"); + constexpr std::string woman_pouting("🙎‍♀️"); + constexpr std::string woman_pouting_tone1("🙎🏻‍♀️"); + constexpr std::string woman_pouting_light_skin_tone("🙎🏻‍♀️"); + constexpr std::string woman_pouting_tone2("🙎🏼‍♀️"); + constexpr std::string woman_pouting_medium_light_skin_tone("🙎🏼‍♀️"); + constexpr std::string woman_pouting_tone3("🙎🏽‍♀️"); + constexpr std::string woman_pouting_medium_skin_tone("🙎🏽‍♀️"); + constexpr std::string woman_pouting_tone4("🙎🏾‍♀️"); + constexpr std::string woman_pouting_medium_dark_skin_tone("🙎🏾‍♀️"); + constexpr std::string woman_pouting_tone5("🙎🏿‍♀️"); + constexpr std::string woman_pouting_dark_skin_tone("🙎🏿‍♀️"); + constexpr std::string man_pouting("🙎‍♂️"); + constexpr std::string man_pouting_tone1("🙎🏻‍♂️"); + constexpr std::string man_pouting_light_skin_tone("🙎🏻‍♂️"); + constexpr std::string man_pouting_tone2("🙎🏼‍♂️"); + constexpr std::string man_pouting_medium_light_skin_tone("🙎🏼‍♂️"); + constexpr std::string man_pouting_tone3("🙎🏽‍♂️"); + constexpr std::string man_pouting_medium_skin_tone("🙎🏽‍♂️"); + constexpr std::string man_pouting_tone4("🙎🏾‍♂️"); + constexpr std::string man_pouting_medium_dark_skin_tone("🙎🏾‍♂️"); + constexpr std::string man_pouting_tone5("🙎🏿‍♂️"); + constexpr std::string man_pouting_dark_skin_tone("🙎🏿‍♂️"); + constexpr std::string person_frowning("🙍"); + constexpr std::string person_frowning_tone1("🙍🏻"); + constexpr std::string person_frowning_tone2("🙍🏼"); + constexpr std::string person_frowning_tone3("🙍🏽"); + constexpr std::string person_frowning_tone4("🙍🏾"); + constexpr std::string person_frowning_tone5("🙍🏿"); + constexpr std::string woman_frowning("🙍‍♀️"); + constexpr std::string woman_frowning_tone1("🙍🏻‍♀️"); + constexpr std::string woman_frowning_light_skin_tone("🙍🏻‍♀️"); + constexpr std::string woman_frowning_tone2("🙍🏼‍♀️"); + constexpr std::string woman_frowning_medium_light_skin_tone("🙍🏼‍♀️"); + constexpr std::string woman_frowning_tone3("🙍🏽‍♀️"); + constexpr std::string woman_frowning_medium_skin_tone("🙍🏽‍♀️"); + constexpr std::string woman_frowning_tone4("🙍🏾‍♀️"); + constexpr std::string woman_frowning_medium_dark_skin_tone("🙍🏾‍♀️"); + constexpr std::string woman_frowning_tone5("🙍🏿‍♀️"); + constexpr std::string woman_frowning_dark_skin_tone("🙍🏿‍♀️"); + constexpr std::string man_frowning("🙍‍♂️"); + constexpr std::string man_frowning_tone1("🙍🏻‍♂️"); + constexpr std::string man_frowning_light_skin_tone("🙍🏻‍♂️"); + constexpr std::string man_frowning_tone2("🙍🏼‍♂️"); + constexpr std::string man_frowning_medium_light_skin_tone("🙍🏼‍♂️"); + constexpr std::string man_frowning_tone3("🙍🏽‍♂️"); + constexpr std::string man_frowning_medium_skin_tone("🙍🏽‍♂️"); + constexpr std::string man_frowning_tone4("🙍🏾‍♂️"); + constexpr std::string man_frowning_medium_dark_skin_tone("🙍🏾‍♂️"); + constexpr std::string man_frowning_tone5("🙍🏿‍♂️"); + constexpr std::string man_frowning_dark_skin_tone("🙍🏿‍♂️"); + constexpr std::string person_getting_haircut("💇"); + constexpr std::string haircut("💇"); + constexpr std::string person_getting_haircut_tone1("💇🏻"); + constexpr std::string haircut_tone1("💇🏻"); + constexpr std::string person_getting_haircut_tone2("💇🏼"); + constexpr std::string haircut_tone2("💇🏼"); + constexpr std::string person_getting_haircut_tone3("💇🏽"); + constexpr std::string haircut_tone3("💇🏽"); + constexpr std::string person_getting_haircut_tone4("💇🏾"); + constexpr std::string haircut_tone4("💇🏾"); + constexpr std::string person_getting_haircut_tone5("💇🏿"); + constexpr std::string haircut_tone5("💇🏿"); + constexpr std::string woman_getting_haircut("💇‍♀️"); + constexpr std::string woman_getting_haircut_tone1("💇🏻‍♀️"); + constexpr std::string woman_getting_haircut_light_skin_tone("💇🏻‍♀️"); + constexpr std::string woman_getting_haircut_tone2("💇🏼‍♀️"); + constexpr std::string woman_getting_haircut_medium_light_skin_tone("💇🏼‍♀️"); + constexpr std::string woman_getting_haircut_tone3("💇🏽‍♀️"); + constexpr std::string woman_getting_haircut_medium_skin_tone("💇🏽‍♀️"); + constexpr std::string woman_getting_haircut_tone4("💇🏾‍♀️"); + constexpr std::string woman_getting_haircut_medium_dark_skin_tone("💇🏾‍♀️"); + constexpr std::string woman_getting_haircut_tone5("💇🏿‍♀️"); + constexpr std::string woman_getting_haircut_dark_skin_tone("💇🏿‍♀️"); + constexpr std::string man_getting_haircut("💇‍♂️"); + constexpr std::string man_getting_haircut_tone1("💇🏻‍♂️"); + constexpr std::string man_getting_haircut_light_skin_tone("💇🏻‍♂️"); + constexpr std::string man_getting_haircut_tone2("💇🏼‍♂️"); + constexpr std::string man_getting_haircut_medium_light_skin_tone("💇🏼‍♂️"); + constexpr std::string man_getting_haircut_tone3("💇🏽‍♂️"); + constexpr std::string man_getting_haircut_medium_skin_tone("💇🏽‍♂️"); + constexpr std::string man_getting_haircut_tone4("💇🏾‍♂️"); + constexpr std::string man_getting_haircut_medium_dark_skin_tone("💇🏾‍♂️"); + constexpr std::string man_getting_haircut_tone5("💇🏿‍♂️"); + constexpr std::string man_getting_haircut_dark_skin_tone("💇🏿‍♂️"); + constexpr std::string person_getting_massage("💆"); + constexpr std::string massage("💆"); + constexpr std::string person_getting_massage_tone1("💆🏻"); + constexpr std::string massage_tone1("💆🏻"); + constexpr std::string person_getting_massage_tone2("💆🏼"); + constexpr std::string massage_tone2("💆🏼"); + constexpr std::string person_getting_massage_tone3("💆🏽"); + constexpr std::string massage_tone3("💆🏽"); + constexpr std::string person_getting_massage_tone4("💆🏾"); + constexpr std::string massage_tone4("💆🏾"); + constexpr std::string person_getting_massage_tone5("💆🏿"); + constexpr std::string massage_tone5("💆🏿"); + constexpr std::string woman_getting_face_massage("💆‍♀️"); + constexpr std::string woman_getting_face_massage_tone1("💆🏻‍♀️"); + constexpr std::string woman_getting_face_massage_light_skin_tone("💆🏻‍♀️"); + constexpr std::string woman_getting_face_massage_tone2("💆🏼‍♀️"); + constexpr std::string woman_getting_face_massage_medium_light_skin_tone("💆🏼‍♀️"); + constexpr std::string woman_getting_face_massage_tone3("💆🏽‍♀️"); + constexpr std::string woman_getting_face_massage_medium_skin_tone("💆🏽‍♀️"); + constexpr std::string woman_getting_face_massage_tone4("💆🏾‍♀️"); + constexpr std::string woman_getting_face_massage_medium_dark_skin_tone("💆🏾‍♀️"); + constexpr std::string woman_getting_face_massage_tone5("💆🏿‍♀️"); + constexpr std::string woman_getting_face_massage_dark_skin_tone("💆🏿‍♀️"); + constexpr std::string man_getting_face_massage("💆‍♂️"); + constexpr std::string man_getting_face_massage_tone1("💆🏻‍♂️"); + constexpr std::string man_getting_face_massage_light_skin_tone("💆🏻‍♂️"); + constexpr std::string man_getting_face_massage_tone2("💆🏼‍♂️"); + constexpr std::string man_getting_face_massage_medium_light_skin_tone("💆🏼‍♂️"); + constexpr std::string man_getting_face_massage_tone3("💆🏽‍♂️"); + constexpr std::string man_getting_face_massage_medium_skin_tone("💆🏽‍♂️"); + constexpr std::string man_getting_face_massage_tone4("💆🏾‍♂️"); + constexpr std::string man_getting_face_massage_medium_dark_skin_tone("💆🏾‍♂️"); + constexpr std::string man_getting_face_massage_tone5("💆🏿‍♂️"); + constexpr std::string man_getting_face_massage_dark_skin_tone("💆🏿‍♂️"); + constexpr std::string person_in_steamy_room("🧖"); + constexpr std::string person_in_steamy_room_tone1("🧖🏻"); + constexpr std::string person_in_steamy_room_light_skin_tone("🧖🏻"); + constexpr std::string person_in_steamy_room_tone2("🧖🏼"); + constexpr std::string person_in_steamy_room_medium_light_skin_tone("🧖🏼"); + constexpr std::string person_in_steamy_room_tone3("🧖🏽"); + constexpr std::string person_in_steamy_room_medium_skin_tone("🧖🏽"); + constexpr std::string person_in_steamy_room_tone4("🧖🏾"); + constexpr std::string person_in_steamy_room_medium_dark_skin_tone("🧖🏾"); + constexpr std::string person_in_steamy_room_tone5("🧖🏿"); + constexpr std::string person_in_steamy_room_dark_skin_tone("🧖🏿"); + constexpr std::string woman_in_steamy_room("🧖‍♀️"); + constexpr std::string woman_in_steamy_room_tone1("🧖🏻‍♀️"); + constexpr std::string woman_in_steamy_room_light_skin_tone("🧖🏻‍♀️"); + constexpr std::string woman_in_steamy_room_tone2("🧖🏼‍♀️"); + constexpr std::string woman_in_steamy_room_medium_light_skin_tone("🧖🏼‍♀️"); + constexpr std::string woman_in_steamy_room_tone3("🧖🏽‍♀️"); + constexpr std::string woman_in_steamy_room_medium_skin_tone("🧖🏽‍♀️"); + constexpr std::string woman_in_steamy_room_tone4("🧖🏾‍♀️"); + constexpr std::string woman_in_steamy_room_medium_dark_skin_tone("🧖🏾‍♀️"); + constexpr std::string woman_in_steamy_room_tone5("🧖🏿‍♀️"); + constexpr std::string woman_in_steamy_room_dark_skin_tone("🧖🏿‍♀️"); + constexpr std::string man_in_steamy_room("🧖‍♂️"); + constexpr std::string man_in_steamy_room_tone1("🧖🏻‍♂️"); + constexpr std::string man_in_steamy_room_light_skin_tone("🧖🏻‍♂️"); + constexpr std::string man_in_steamy_room_tone2("🧖🏼‍♂️"); + constexpr std::string man_in_steamy_room_medium_light_skin_tone("🧖🏼‍♂️"); + constexpr std::string man_in_steamy_room_tone3("🧖🏽‍♂️"); + constexpr std::string man_in_steamy_room_medium_skin_tone("🧖🏽‍♂️"); + constexpr std::string man_in_steamy_room_tone4("🧖🏾‍♂️"); + constexpr std::string man_in_steamy_room_medium_dark_skin_tone("🧖🏾‍♂️"); + constexpr std::string man_in_steamy_room_tone5("🧖🏿‍♂️"); + constexpr std::string man_in_steamy_room_dark_skin_tone("🧖🏿‍♂️"); + constexpr std::string nail_care("💅"); + constexpr std::string nail_care_tone1("💅🏻"); + constexpr std::string nail_care_tone2("💅🏼"); + constexpr std::string nail_care_tone3("💅🏽"); + constexpr std::string nail_care_tone4("💅🏾"); + constexpr std::string nail_care_tone5("💅🏿"); + constexpr std::string selfie("🤳"); + constexpr std::string selfie_tone1("🤳🏻"); + constexpr std::string selfie_tone2("🤳🏼"); + constexpr std::string selfie_tone3("🤳🏽"); + constexpr std::string selfie_tone4("🤳🏾"); + constexpr std::string selfie_tone5("🤳🏿"); + constexpr std::string dancer("💃"); + constexpr std::string dancer_tone1("💃🏻"); + constexpr std::string dancer_tone2("💃🏼"); + constexpr std::string dancer_tone3("💃🏽"); + constexpr std::string dancer_tone4("💃🏾"); + constexpr std::string dancer_tone5("💃🏿"); + constexpr std::string man_dancing("🕺"); + constexpr std::string male_dancer("🕺"); + constexpr std::string man_dancing_tone1("🕺🏻"); + constexpr std::string male_dancer_tone1("🕺🏻"); + constexpr std::string man_dancing_tone2("🕺🏼"); + constexpr std::string male_dancer_tone2("🕺🏼"); + constexpr std::string man_dancing_tone3("🕺🏽"); + constexpr std::string male_dancer_tone3("🕺🏽"); + constexpr std::string man_dancing_tone5("🕺🏿"); + constexpr std::string male_dancer_tone5("🕺🏿"); + constexpr std::string man_dancing_tone4("🕺🏾"); + constexpr std::string male_dancer_tone4("🕺🏾"); + constexpr std::string people_with_bunny_ears_partying("👯"); + constexpr std::string dancers("👯"); + constexpr std::string women_with_bunny_ears_partying("👯‍♀️"); + constexpr std::string men_with_bunny_ears_partying("👯‍♂️"); + constexpr std::string levitate("🕴️"); + constexpr std::string man_in_business_suit_levitating("🕴️"); + constexpr std::string levitate_tone1("🕴🏻"); + constexpr std::string man_in_business_suit_levitating_tone1("🕴🏻"); + constexpr std::string man_in_business_suit_levitating_light_skin_tone("🕴🏻"); + constexpr std::string levitate_tone2("🕴🏼"); + constexpr std::string man_in_business_suit_levitating_tone2("🕴🏼"); + constexpr std::string man_in_business_suit_levitating_medium_light_skin_tone("🕴🏼"); + constexpr std::string levitate_tone3("🕴🏽"); + constexpr std::string man_in_business_suit_levitating_tone3("🕴🏽"); + constexpr std::string man_in_business_suit_levitating_medium_skin_tone("🕴🏽"); + constexpr std::string levitate_tone4("🕴🏾"); + constexpr std::string man_in_business_suit_levitating_tone4("🕴🏾"); + constexpr std::string man_in_business_suit_levitating_medium_dark_skin_tone("🕴🏾"); + constexpr std::string levitate_tone5("🕴🏿"); + constexpr std::string man_in_business_suit_levitating_tone5("🕴🏿"); + constexpr std::string man_in_business_suit_levitating_dark_skin_tone("🕴🏿"); + constexpr std::string person_in_manual_wheelchair("🧑‍🦽"); + constexpr std::string person_in_manual_wheelchair_tone1("🧑🏻‍🦽"); + constexpr std::string person_in_manual_wheelchair_light_skin_tone("🧑🏻‍🦽"); + constexpr std::string person_in_manual_wheelchair_tone2("🧑🏼‍🦽"); + constexpr std::string person_in_manual_wheelchair_medium_light_skin_tone("🧑🏼‍🦽"); + constexpr std::string person_in_manual_wheelchair_tone3("🧑🏽‍🦽"); + constexpr std::string person_in_manual_wheelchair_medium_skin_tone("🧑🏽‍🦽"); + constexpr std::string person_in_manual_wheelchair_tone4("🧑🏾‍🦽"); + constexpr std::string person_in_manual_wheelchair_medium_dark_skin_tone("🧑🏾‍🦽"); + constexpr std::string person_in_manual_wheelchair_tone5("🧑🏿‍🦽"); + constexpr std::string person_in_manual_wheelchair_dark_skin_tone("🧑🏿‍🦽"); + constexpr std::string woman_in_manual_wheelchair("👩‍🦽"); + constexpr std::string woman_in_manual_wheelchair_tone1("👩🏻‍🦽"); + constexpr std::string woman_in_manual_wheelchair_light_skin_tone("👩🏻‍🦽"); + constexpr std::string woman_in_manual_wheelchair_tone2("👩🏼‍🦽"); + constexpr std::string woman_in_manual_wheelchair_medium_light_skin_tone("👩🏼‍🦽"); + constexpr std::string woman_in_manual_wheelchair_tone3("👩🏽‍🦽"); + constexpr std::string woman_in_manual_wheelchair_medium_skin_tone("👩🏽‍🦽"); + constexpr std::string woman_in_manual_wheelchair_tone4("👩🏾‍🦽"); + constexpr std::string woman_in_manual_wheelchair_medium_dark_skin_tone("👩🏾‍🦽"); + constexpr std::string woman_in_manual_wheelchair_tone5("👩🏿‍🦽"); + constexpr std::string woman_in_manual_wheelchair_dark_skin_tone("👩🏿‍🦽"); + constexpr std::string man_in_manual_wheelchair("👨‍🦽"); + constexpr std::string man_in_manual_wheelchair_tone1("👨🏻‍🦽"); + constexpr std::string man_in_manual_wheelchair_light_skin_tone("👨🏻‍🦽"); + constexpr std::string man_in_manual_wheelchair_tone2("👨🏼‍🦽"); + constexpr std::string man_in_manual_wheelchair_medium_light_skin_tone("👨🏼‍🦽"); + constexpr std::string man_in_manual_wheelchair_tone3("👨🏽‍🦽"); + constexpr std::string man_in_manual_wheelchair_medium_skin_tone("👨🏽‍🦽"); + constexpr std::string man_in_manual_wheelchair_tone4("👨🏾‍🦽"); + constexpr std::string man_in_manual_wheelchair_medium_dark_skin_tone("👨🏾‍🦽"); + constexpr std::string man_in_manual_wheelchair_tone5("👨🏿‍🦽"); + constexpr std::string man_in_manual_wheelchair_dark_skin_tone("👨🏿‍🦽"); + constexpr std::string person_in_motorized_wheelchair("🧑‍🦼"); + constexpr std::string person_in_motorized_wheelchair_tone1("🧑🏻‍🦼"); + constexpr std::string person_in_motorized_wheelchair_light_skin_tone("🧑🏻‍🦼"); + constexpr std::string person_in_motorized_wheelchair_tone2("🧑🏼‍🦼"); + constexpr std::string person_in_motorized_wheelchair_medium_light_skin_tone("🧑🏼‍🦼"); + constexpr std::string person_in_motorized_wheelchair_tone3("🧑🏽‍🦼"); + constexpr std::string person_in_motorized_wheelchair_medium_skin_tone("🧑🏽‍🦼"); + constexpr std::string person_in_motorized_wheelchair_tone4("🧑🏾‍🦼"); + constexpr std::string person_in_motorized_wheelchair_medium_dark_skin_tone("🧑🏾‍🦼"); + constexpr std::string person_in_motorized_wheelchair_tone5("🧑🏿‍🦼"); + constexpr std::string person_in_motorized_wheelchair_dark_skin_tone("🧑🏿‍🦼"); + constexpr std::string woman_in_motorized_wheelchair("👩‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_tone1("👩🏻‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_light_skin_tone("👩🏻‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_tone2("👩🏼‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_medium_light_skin_tone("👩🏼‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_tone3("👩🏽‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_medium_skin_tone("👩🏽‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_tone4("👩🏾‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_medium_dark_skin_tone("👩🏾‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_tone5("👩🏿‍🦼"); + constexpr std::string woman_in_motorized_wheelchair_dark_skin_tone("👩🏿‍🦼"); + constexpr std::string man_in_motorized_wheelchair("👨‍🦼"); + constexpr std::string man_in_motorized_wheelchair_tone1("👨🏻‍🦼"); + constexpr std::string man_in_motorized_wheelchair_light_skin_tone("👨🏻‍🦼"); + constexpr std::string man_in_motorized_wheelchair_tone2("👨🏼‍🦼"); + constexpr std::string man_in_motorized_wheelchair_medium_light_skin_tone("👨🏼‍🦼"); + constexpr std::string man_in_motorized_wheelchair_tone3("👨🏽‍🦼"); + constexpr std::string man_in_motorized_wheelchair_medium_skin_tone("👨🏽‍🦼"); + constexpr std::string man_in_motorized_wheelchair_tone4("👨🏾‍🦼"); + constexpr std::string man_in_motorized_wheelchair_medium_dark_skin_tone("👨🏾‍🦼"); + constexpr std::string man_in_motorized_wheelchair_tone5("👨🏿‍🦼"); + constexpr std::string man_in_motorized_wheelchair_dark_skin_tone("👨🏿‍🦼"); + constexpr std::string person_walking("🚶"); + constexpr std::string walking("🚶"); + constexpr std::string person_walking_tone1("🚶🏻"); + constexpr std::string walking_tone1("🚶🏻"); + constexpr std::string person_walking_tone2("🚶🏼"); + constexpr std::string walking_tone2("🚶🏼"); + constexpr std::string person_walking_tone3("🚶🏽"); + constexpr std::string walking_tone3("🚶🏽"); + constexpr std::string person_walking_tone4("🚶🏾"); + constexpr std::string walking_tone4("🚶🏾"); + constexpr std::string person_walking_tone5("🚶🏿"); + constexpr std::string walking_tone5("🚶🏿"); + constexpr std::string woman_walking("🚶‍♀️"); + constexpr std::string woman_walking_tone1("🚶🏻‍♀️"); + constexpr std::string woman_walking_light_skin_tone("🚶🏻‍♀️"); + constexpr std::string woman_walking_tone2("🚶🏼‍♀️"); + constexpr std::string woman_walking_medium_light_skin_tone("🚶🏼‍♀️"); + constexpr std::string woman_walking_tone3("🚶🏽‍♀️"); + constexpr std::string woman_walking_medium_skin_tone("🚶🏽‍♀️"); + constexpr std::string woman_walking_tone4("🚶🏾‍♀️"); + constexpr std::string woman_walking_medium_dark_skin_tone("🚶🏾‍♀️"); + constexpr std::string woman_walking_tone5("🚶🏿‍♀️"); + constexpr std::string woman_walking_dark_skin_tone("🚶🏿‍♀️"); + constexpr std::string man_walking("🚶‍♂️"); + constexpr std::string man_walking_tone1("🚶🏻‍♂️"); + constexpr std::string man_walking_light_skin_tone("🚶🏻‍♂️"); + constexpr std::string man_walking_tone2("🚶🏼‍♂️"); + constexpr std::string man_walking_medium_light_skin_tone("🚶🏼‍♂️"); + constexpr std::string man_walking_tone3("🚶🏽‍♂️"); + constexpr std::string man_walking_medium_skin_tone("🚶🏽‍♂️"); + constexpr std::string man_walking_tone4("🚶🏾‍♂️"); + constexpr std::string man_walking_medium_dark_skin_tone("🚶🏾‍♂️"); + constexpr std::string man_walking_tone5("🚶🏿‍♂️"); + constexpr std::string man_walking_dark_skin_tone("🚶🏿‍♂️"); + constexpr std::string person_with_probing_cane("🧑‍🦯"); + constexpr std::string person_with_probing_cane_tone1("🧑🏻‍🦯"); + constexpr std::string person_with_probing_cane_light_skin_tone("🧑🏻‍🦯"); + constexpr std::string person_with_probing_cane_tone2("🧑🏼‍🦯"); + constexpr std::string person_with_probing_cane_medium_light_skin_tone("🧑🏼‍🦯"); + constexpr std::string person_with_probing_cane_tone3("🧑🏽‍🦯"); + constexpr std::string person_with_probing_cane_medium_skin_tone("🧑🏽‍🦯"); + constexpr std::string person_with_probing_cane_tone4("🧑🏾‍🦯"); + constexpr std::string person_with_probing_cane_medium_dark_skin_tone("🧑🏾‍🦯"); + constexpr std::string person_with_probing_cane_tone5("🧑🏿‍🦯"); + constexpr std::string person_with_probing_cane_dark_skin_tone("🧑🏿‍🦯"); + constexpr std::string woman_with_probing_cane("👩‍🦯"); + constexpr std::string woman_with_probing_cane_tone1("👩🏻‍🦯"); + constexpr std::string woman_with_probing_cane_light_skin_tone("👩🏻‍🦯"); + constexpr std::string woman_with_probing_cane_tone2("👩🏼‍🦯"); + constexpr std::string woman_with_probing_cane_medium_light_skin_tone("👩🏼‍🦯"); + constexpr std::string woman_with_probing_cane_tone3("👩🏽‍🦯"); + constexpr std::string woman_with_probing_cane_medium_skin_tone("👩🏽‍🦯"); + constexpr std::string woman_with_probing_cane_tone4("👩🏾‍🦯"); + constexpr std::string woman_with_probing_cane_medium_dark_skin_tone("👩🏾‍🦯"); + constexpr std::string woman_with_probing_cane_tone5("👩🏿‍🦯"); + constexpr std::string woman_with_probing_cane_dark_skin_tone("👩🏿‍🦯"); + constexpr std::string man_with_probing_cane("👨‍🦯"); + constexpr std::string man_with_probing_cane_tone1("👨🏻‍🦯"); + constexpr std::string man_with_probing_cane_light_skin_tone("👨🏻‍🦯"); + constexpr std::string man_with_probing_cane_tone2("👨🏼‍🦯"); + constexpr std::string man_with_probing_cane_medium_light_skin_tone("👨🏼‍🦯"); + constexpr std::string man_with_probing_cane_tone3("👨🏽‍🦯"); + constexpr std::string man_with_probing_cane_medium_skin_tone("👨🏽‍🦯"); + constexpr std::string man_with_probing_cane_tone4("👨🏾‍🦯"); + constexpr std::string man_with_probing_cane_medium_dark_skin_tone("👨🏾‍🦯"); + constexpr std::string man_with_probing_cane_tone5("👨🏿‍🦯"); + constexpr std::string man_with_probing_cane_dark_skin_tone("👨🏿‍🦯"); + constexpr std::string person_kneeling("🧎"); + constexpr std::string person_kneeling_tone1("🧎🏻"); + constexpr std::string person_kneeling_light_skin_tone("🧎🏻"); + constexpr std::string person_kneeling_tone2("🧎🏼"); + constexpr std::string person_kneeling_medium_light_skin_tone("🧎🏼"); + constexpr std::string person_kneeling_tone3("🧎🏽"); + constexpr std::string person_kneeling_medium_skin_tone("🧎🏽"); + constexpr std::string person_kneeling_tone4("🧎🏾"); + constexpr std::string person_kneeling_medium_dark_skin_tone("🧎🏾"); + constexpr std::string person_kneeling_tone5("🧎🏿"); + constexpr std::string person_kneeling_dark_skin_tone("🧎🏿"); + constexpr std::string woman_kneeling("🧎‍♀️"); + constexpr std::string woman_kneeling_tone1("🧎🏻‍♀️"); + constexpr std::string woman_kneeling_light_skin_tone("🧎🏻‍♀️"); + constexpr std::string woman_kneeling_tone2("🧎🏼‍♀️"); + constexpr std::string woman_kneeling_medium_light_skin_tone("🧎🏼‍♀️"); + constexpr std::string woman_kneeling_tone3("🧎🏽‍♀️"); + constexpr std::string woman_kneeling_medium_skin_tone("🧎🏽‍♀️"); + constexpr std::string woman_kneeling_tone4("🧎🏾‍♀️"); + constexpr std::string woman_kneeling_medium_dark_skin_tone("🧎🏾‍♀️"); + constexpr std::string woman_kneeling_tone5("🧎🏿‍♀️"); + constexpr std::string woman_kneeling_dark_skin_tone("🧎🏿‍♀️"); + constexpr std::string man_kneeling("🧎‍♂️"); + constexpr std::string man_kneeling_tone1("🧎🏻‍♂️"); + constexpr std::string man_kneeling_light_skin_tone("🧎🏻‍♂️"); + constexpr std::string man_kneeling_tone2("🧎🏼‍♂️"); + constexpr std::string man_kneeling_medium_light_skin_tone("🧎🏼‍♂️"); + constexpr std::string man_kneeling_tone3("🧎🏽‍♂️"); + constexpr std::string man_kneeling_medium_skin_tone("🧎🏽‍♂️"); + constexpr std::string man_kneeling_tone4("🧎🏾‍♂️"); + constexpr std::string man_kneeling_medium_dark_skin_tone("🧎🏾‍♂️"); + constexpr std::string man_kneeling_tone5("🧎🏿‍♂️"); + constexpr std::string man_kneeling_dark_skin_tone("🧎🏿‍♂️"); + constexpr std::string person_running("🏃"); + constexpr std::string runner("🏃"); + constexpr std::string person_running_tone1("🏃🏻"); + constexpr std::string runner_tone1("🏃🏻"); + constexpr std::string person_running_tone2("🏃🏼"); + constexpr std::string runner_tone2("🏃🏼"); + constexpr std::string person_running_tone3("🏃🏽"); + constexpr std::string runner_tone3("🏃🏽"); + constexpr std::string person_running_tone4("🏃🏾"); + constexpr std::string runner_tone4("🏃🏾"); + constexpr std::string person_running_tone5("🏃🏿"); + constexpr std::string runner_tone5("🏃🏿"); + constexpr std::string woman_running("🏃‍♀️"); + constexpr std::string woman_running_tone1("🏃🏻‍♀️"); + constexpr std::string woman_running_light_skin_tone("🏃🏻‍♀️"); + constexpr std::string woman_running_tone2("🏃🏼‍♀️"); + constexpr std::string woman_running_medium_light_skin_tone("🏃🏼‍♀️"); + constexpr std::string woman_running_tone3("🏃🏽‍♀️"); + constexpr std::string woman_running_medium_skin_tone("🏃🏽‍♀️"); + constexpr std::string woman_running_tone4("🏃🏾‍♀️"); + constexpr std::string woman_running_medium_dark_skin_tone("🏃🏾‍♀️"); + constexpr std::string woman_running_tone5("🏃🏿‍♀️"); + constexpr std::string woman_running_dark_skin_tone("🏃🏿‍♀️"); + constexpr std::string man_running("🏃‍♂️"); + constexpr std::string man_running_tone1("🏃🏻‍♂️"); + constexpr std::string man_running_light_skin_tone("🏃🏻‍♂️"); + constexpr std::string man_running_tone2("🏃🏼‍♂️"); + constexpr std::string man_running_medium_light_skin_tone("🏃🏼‍♂️"); + constexpr std::string man_running_tone3("🏃🏽‍♂️"); + constexpr std::string man_running_medium_skin_tone("🏃🏽‍♂️"); + constexpr std::string man_running_tone4("🏃🏾‍♂️"); + constexpr std::string man_running_medium_dark_skin_tone("🏃🏾‍♂️"); + constexpr std::string man_running_tone5("🏃🏿‍♂️"); + constexpr std::string man_running_dark_skin_tone("🏃🏿‍♂️"); + constexpr std::string person_standing("🧍"); + constexpr std::string person_standing_tone1("🧍🏻"); + constexpr std::string person_standing_light_skin_tone("🧍🏻"); + constexpr std::string person_standing_tone2("🧍🏼"); + constexpr std::string person_standing_medium_light_skin_tone("🧍🏼"); + constexpr std::string person_standing_tone3("🧍🏽"); + constexpr std::string person_standing_medium_skin_tone("🧍🏽"); + constexpr std::string person_standing_tone4("🧍🏾"); + constexpr std::string person_standing_medium_dark_skin_tone("🧍🏾"); + constexpr std::string person_standing_tone5("🧍🏿"); + constexpr std::string person_standing_dark_skin_tone("🧍🏿"); + constexpr std::string woman_standing("🧍‍♀️"); + constexpr std::string woman_standing_tone1("🧍🏻‍♀️"); + constexpr std::string woman_standing_light_skin_tone("🧍🏻‍♀️"); + constexpr std::string woman_standing_tone2("🧍🏼‍♀️"); + constexpr std::string woman_standing_medium_light_skin_tone("🧍🏼‍♀️"); + constexpr std::string woman_standing_tone3("🧍🏽‍♀️"); + constexpr std::string woman_standing_medium_skin_tone("🧍🏽‍♀️"); + constexpr std::string woman_standing_tone4("🧍🏾‍♀️"); + constexpr std::string woman_standing_medium_dark_skin_tone("🧍🏾‍♀️"); + constexpr std::string woman_standing_tone5("🧍🏿‍♀️"); + constexpr std::string woman_standing_dark_skin_tone("🧍🏿‍♀️"); + constexpr std::string man_standing("🧍‍♂️"); + constexpr std::string man_standing_tone1("🧍🏻‍♂️"); + constexpr std::string man_standing_light_skin_tone("🧍🏻‍♂️"); + constexpr std::string man_standing_tone2("🧍🏼‍♂️"); + constexpr std::string man_standing_medium_light_skin_tone("🧍🏼‍♂️"); + constexpr std::string man_standing_tone3("🧍🏽‍♂️"); + constexpr std::string man_standing_medium_skin_tone("🧍🏽‍♂️"); + constexpr std::string man_standing_tone4("🧍🏾‍♂️"); + constexpr std::string man_standing_medium_dark_skin_tone("🧍🏾‍♂️"); + constexpr std::string man_standing_tone5("🧍🏿‍♂️"); + constexpr std::string man_standing_dark_skin_tone("🧍🏿‍♂️"); + constexpr std::string people_holding_hands("🧑‍🤝‍🧑"); + constexpr std::string people_holding_hands_tone1("🧑🏻‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_light_skin_tone("🧑🏻‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_tone1_tone2("🧑🏻‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_light_skin_tone_medium_light_skin_tone("🧑🏻‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_tone1_tone3("🧑🏻‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_light_skin_tone_medium_skin_tone("🧑🏻‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_tone1_tone4("🧑🏻‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_light_skin_tone_medium_dark_skin_tone("🧑🏻‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_tone1_tone5("🧑🏻‍🤝‍🧑🏿"); + constexpr std::string people_holding_hands_light_skin_tone_dark_skin_tone("🧑🏻‍🤝‍🧑🏿"); + constexpr std::string people_holding_hands_tone2_tone1("🧑🏼‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_medium_light_skin_tone_light_skin_tone("🧑🏼‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_tone2("🧑🏼‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_medium_light_skin_tone("🧑🏼‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_tone2_tone3("🧑🏼‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_medium_light_skin_tone_medium_skin_tone("🧑🏼‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_tone2_tone4("🧑🏼‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone("🧑🏼‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_tone2_tone5("🧑🏼‍🤝‍🧑🏿"); + constexpr std::string people_holding_hands_medium_light_skin_tone_dark_skin_tone("🧑🏼‍🤝‍🧑🏿"); + constexpr std::string people_holding_hands_tone3_tone1("🧑🏽‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_medium_skin_tone_light_skin_tone("🧑🏽‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_tone3_tone2("🧑🏽‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_medium_skin_tone_medium_light_skin_tone("🧑🏽‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_tone3("🧑🏽‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_medium_skin_tone("🧑🏽‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_tone3_tone4("🧑🏽‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_medium_skin_tone_medium_dark_skin_tone("🧑🏽‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_tone3_tone5("🧑🏽‍🤝‍🧑🏿"); + constexpr std::string people_holding_hands_medium_skin_tone_dark_skin_tone("🧑🏽‍🤝‍🧑🏿"); + constexpr std::string people_holding_hands_tone4_tone1("🧑🏾‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_medium_dark_skin_tone_light_skin_tone("🧑🏾‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_tone4_tone2("🧑🏾‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone("🧑🏾‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_tone4_tone3("🧑🏾‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_medium_dark_skin_tone_medium_skin_tone("🧑🏾‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_tone4("🧑🏾‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_medium_dark_skin_tone("🧑🏾‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_tone4_tone5("🧑🏾‍🤝‍🧑🏿"); + constexpr std::string people_holding_hands_medium_dark_skin_tone_dark_skin_tone("🧑🏾‍🤝‍🧑🏿"); + constexpr std::string people_holding_hands_tone5_tone1("🧑🏿‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_dark_skin_tone_light_skin_tone("🧑🏿‍🤝‍🧑🏻"); + constexpr std::string people_holding_hands_tone5_tone2("🧑🏿‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_dark_skin_tone_medium_light_skin_tone("🧑🏿‍🤝‍🧑🏼"); + constexpr std::string people_holding_hands_tone5_tone3("🧑🏿‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_dark_skin_tone_medium_skin_tone("🧑🏿‍🤝‍🧑🏽"); + constexpr std::string people_holding_hands_tone5_tone4("🧑🏿‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_dark_skin_tone_medium_dark_skin_tone("🧑🏿‍🤝‍🧑🏾"); + constexpr std::string people_holding_hands_tone5("🧑🏿‍🤝‍🧑🏿"); + constexpr std::string people_holding_hands_dark_skin_tone("🧑🏿‍🤝‍🧑🏿"); + constexpr std::string couple("👫"); + constexpr std::string woman_and_man_holding_hands_tone1("👫🏻"); + constexpr std::string woman_and_man_holding_hands_light_skin_tone("👫🏻"); + constexpr std::string woman_and_man_holding_hands_tone1_tone2("👩🏻‍🤝‍👨🏼"); + constexpr std::string woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone("👩🏻‍🤝‍👨🏼"); + constexpr std::string woman_and_man_holding_hands_tone1_tone3("👩🏻‍🤝‍👨🏽"); + constexpr std::string woman_and_man_holding_hands_light_skin_tone_medium_skin_tone("👩🏻‍🤝‍👨🏽"); + constexpr std::string woman_and_man_holding_hands_tone1_tone4("👩🏻‍🤝‍👨🏾"); + constexpr std::string woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone("👩🏻‍🤝‍👨🏾"); + constexpr std::string woman_and_man_holding_hands_tone1_tone5("👩🏻‍🤝‍👨🏿"); + constexpr std::string woman_and_man_holding_hands_light_skin_tone_dark_skin_tone("👩🏻‍🤝‍👨🏿"); + constexpr std::string woman_and_man_holding_hands_tone2_tone1("👩🏼‍🤝‍👨🏻"); + constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone("👩🏼‍🤝‍👨🏻"); + constexpr std::string woman_and_man_holding_hands_tone2("👫🏼"); + constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone("👫🏼"); + constexpr std::string woman_and_man_holding_hands_tone2_tone3("👩🏼‍🤝‍👨🏽"); + constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone("👩🏼‍🤝‍👨🏽"); + constexpr std::string woman_and_man_holding_hands_tone2_tone4("👩🏼‍🤝‍👨🏾"); + constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍🤝‍👨🏾"); + constexpr std::string woman_and_man_holding_hands_tone2_tone5("👩🏼‍🤝‍👨🏿"); + constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone("👩🏼‍🤝‍👨🏿"); + constexpr std::string woman_and_man_holding_hands_tone3_tone1("👩🏽‍🤝‍👨🏻"); + constexpr std::string woman_and_man_holding_hands_medium_skin_tone_light_skin_tone("👩🏽‍🤝‍👨🏻"); + constexpr std::string woman_and_man_holding_hands_tone3_tone2("👩🏽‍🤝‍👨🏼"); + constexpr std::string woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone("👩🏽‍🤝‍👨🏼"); + constexpr std::string woman_and_man_holding_hands_tone3("👫🏽"); + constexpr std::string woman_and_man_holding_hands_medium_skin_tone("👫🏽"); + constexpr std::string woman_and_man_holding_hands_tone3_tone4("👩🏽‍🤝‍👨🏾"); + constexpr std::string woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone("👩🏽‍🤝‍👨🏾"); + constexpr std::string woman_and_man_holding_hands_tone3_tone5("👩🏽‍🤝‍👨🏿"); + constexpr std::string woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone("👩🏽‍🤝‍👨🏿"); + constexpr std::string woman_and_man_holding_hands_tone4_tone1("👩🏾‍🤝‍👨🏻"); + constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone("👩🏾‍🤝‍👨🏻"); + constexpr std::string woman_and_man_holding_hands_tone4_tone2("👩🏾‍🤝‍👨🏼"); + constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍🤝‍👨🏼"); + constexpr std::string woman_and_man_holding_hands_tone4_tone3("👩🏾‍🤝‍👨🏽"); + constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone("👩🏾‍🤝‍👨🏽"); + constexpr std::string woman_and_man_holding_hands_tone4("👫🏾"); + constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone("👫🏾"); + constexpr std::string woman_and_man_holding_hands_tone4_tone5("👩🏾‍🤝‍👨🏿"); + constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone("👩🏾‍🤝‍👨🏿"); + constexpr std::string woman_and_man_holding_hands_tone5_tone1("👩🏿‍🤝‍👨🏻"); + constexpr std::string woman_and_man_holding_hands_dark_skin_tone_light_skin_tone("👩🏿‍🤝‍👨🏻"); + constexpr std::string woman_and_man_holding_hands_tone5_tone2("👩🏿‍🤝‍👨🏼"); + constexpr std::string woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone("👩🏿‍🤝‍👨🏼"); + constexpr std::string woman_and_man_holding_hands_tone5_tone3("👩🏿‍🤝‍👨🏽"); + constexpr std::string woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone("👩🏿‍🤝‍👨🏽"); + constexpr std::string woman_and_man_holding_hands_tone5_tone4("👩🏿‍🤝‍👨🏾"); + constexpr std::string woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone("👩🏿‍🤝‍👨🏾"); + constexpr std::string woman_and_man_holding_hands_tone5("👫🏿"); + constexpr std::string woman_and_man_holding_hands_dark_skin_tone("👫🏿"); + constexpr std::string two_women_holding_hands("👭"); + constexpr std::string women_holding_hands_tone1("👭🏻"); + constexpr std::string women_holding_hands_light_skin_tone("👭🏻"); + constexpr std::string women_holding_hands_tone1_tone2("👩🏻‍🤝‍👩🏼"); + constexpr std::string women_holding_hands_light_skin_tone_medium_light_skin_tone("👩🏻‍🤝‍👩🏼"); + constexpr std::string women_holding_hands_tone1_tone3("👩🏻‍🤝‍👩🏽"); + constexpr std::string women_holding_hands_light_skin_tone_medium_skin_tone("👩🏻‍🤝‍👩🏽"); + constexpr std::string women_holding_hands_tone1_tone4("👩🏻‍🤝‍👩🏾"); + constexpr std::string women_holding_hands_light_skin_tone_medium_dark_skin_tone("👩🏻‍🤝‍👩🏾"); + constexpr std::string women_holding_hands_tone1_tone5("👩🏻‍🤝‍👩🏿"); + constexpr std::string women_holding_hands_light_skin_tone_dark_skin_tone("👩🏻‍🤝‍👩🏿"); + constexpr std::string women_holding_hands_tone2_tone1("👩🏼‍🤝‍👩🏻"); + constexpr std::string women_holding_hands_medium_light_skin_tone_light_skin_tone("👩🏼‍🤝‍👩🏻"); + constexpr std::string women_holding_hands_tone2("👭🏼"); + constexpr std::string women_holding_hands_medium_light_skin_tone("👭🏼"); + constexpr std::string women_holding_hands_tone2_tone3("👩🏼‍🤝‍👩🏽"); + constexpr std::string women_holding_hands_medium_light_skin_tone_medium_skin_tone("👩🏼‍🤝‍👩🏽"); + constexpr std::string women_holding_hands_tone2_tone4("👩🏼‍🤝‍👩🏾"); + constexpr std::string women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍🤝‍👩🏾"); + constexpr std::string women_holding_hands_tone2_tone5("👩🏼‍🤝‍👩🏿"); + constexpr std::string women_holding_hands_medium_light_skin_tone_dark_skin_tone("👩🏼‍🤝‍👩🏿"); + constexpr std::string women_holding_hands_tone3_tone1("👩🏽‍🤝‍👩🏻"); + constexpr std::string women_holding_hands_medium_skin_tone_light_skin_tone("👩🏽‍🤝‍👩🏻"); + constexpr std::string women_holding_hands_tone3_tone2("👩🏽‍🤝‍👩🏼"); + constexpr std::string women_holding_hands_medium_skin_tone_medium_light_skin_tone("👩🏽‍🤝‍👩🏼"); + constexpr std::string women_holding_hands_tone3("👭🏽"); + constexpr std::string women_holding_hands_medium_skin_tone("👭🏽"); + constexpr std::string women_holding_hands_tone3_tone4("👩🏽‍🤝‍👩🏾"); + constexpr std::string women_holding_hands_medium_skin_tone_medium_dark_skin_tone("👩🏽‍🤝‍👩🏾"); + constexpr std::string women_holding_hands_tone3_tone5("👩🏽‍🤝‍👩🏿"); + constexpr std::string women_holding_hands_medium_skin_tone_dark_skin_tone("👩🏽‍🤝‍👩🏿"); + constexpr std::string women_holding_hands_tone4_tone1("👩🏾‍🤝‍👩🏻"); + constexpr std::string women_holding_hands_medium_dark_skin_tone_light_skin_tone("👩🏾‍🤝‍👩🏻"); + constexpr std::string women_holding_hands_tone4_tone2("👩🏾‍🤝‍👩🏼"); + constexpr std::string women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍🤝‍👩🏼"); + constexpr std::string women_holding_hands_tone4_tone3("👩🏾‍🤝‍👩🏽"); + constexpr std::string women_holding_hands_medium_dark_skin_tone_medium_skin_tone("👩🏾‍🤝‍👩🏽"); + constexpr std::string women_holding_hands_tone4("👭🏾"); + constexpr std::string women_holding_hands_medium_dark_skin_tone("👭🏾"); + constexpr std::string women_holding_hands_tone4_tone5("👩🏾‍🤝‍👩🏿"); + constexpr std::string women_holding_hands_medium_dark_skin_tone_dark_skin_tone("👩🏾‍🤝‍👩🏿"); + constexpr std::string women_holding_hands_tone5_tone1("👩🏿‍🤝‍👩🏻"); + constexpr std::string women_holding_hands_dark_skin_tone_light_skin_tone("👩🏿‍🤝‍👩🏻"); + constexpr std::string women_holding_hands_tone5_tone2("👩🏿‍🤝‍👩🏼"); + constexpr std::string women_holding_hands_dark_skin_tone_medium_light_skin_tone("👩🏿‍🤝‍👩🏼"); + constexpr std::string women_holding_hands_tone5_tone3("👩🏿‍🤝‍👩🏽"); + constexpr std::string women_holding_hands_dark_skin_tone_medium_skin_tone("👩🏿‍🤝‍👩🏽"); + constexpr std::string women_holding_hands_tone5_tone4("👩🏿‍🤝‍👩🏾"); + constexpr std::string women_holding_hands_dark_skin_tone_medium_dark_skin_tone("👩🏿‍🤝‍👩🏾"); + constexpr std::string women_holding_hands_tone5("👭🏿"); + constexpr std::string women_holding_hands_dark_skin_tone("👭🏿"); + constexpr std::string two_men_holding_hands("👬"); + constexpr std::string men_holding_hands_tone1("👬🏻"); + constexpr std::string men_holding_hands_light_skin_tone("👬🏻"); + constexpr std::string men_holding_hands_tone1_tone2("👨🏻‍🤝‍👨🏼"); + constexpr std::string men_holding_hands_light_skin_tone_medium_light_skin_tone("👨🏻‍🤝‍👨🏼"); + constexpr std::string men_holding_hands_tone1_tone3("👨🏻‍🤝‍👨🏽"); + constexpr std::string men_holding_hands_light_skin_tone_medium_skin_tone("👨🏻‍🤝‍👨🏽"); + constexpr std::string men_holding_hands_tone1_tone4("👨🏻‍🤝‍👨🏾"); + constexpr std::string men_holding_hands_light_skin_tone_medium_dark_skin_tone("👨🏻‍🤝‍👨🏾"); + constexpr std::string men_holding_hands_tone1_tone5("👨🏻‍🤝‍👨🏿"); + constexpr std::string men_holding_hands_light_skin_tone_dark_skin_tone("👨🏻‍🤝‍👨🏿"); + constexpr std::string men_holding_hands_tone2_tone1("👨🏼‍🤝‍👨🏻"); + constexpr std::string men_holding_hands_medium_light_skin_tone_light_skin_tone("👨🏼‍🤝‍👨🏻"); + constexpr std::string men_holding_hands_tone2("👬🏼"); + constexpr std::string men_holding_hands_medium_light_skin_tone("👬🏼"); + constexpr std::string men_holding_hands_tone2_tone3("👨🏼‍🤝‍👨🏽"); + constexpr std::string men_holding_hands_medium_light_skin_tone_medium_skin_tone("👨🏼‍🤝‍👨🏽"); + constexpr std::string men_holding_hands_tone2_tone4("👨🏼‍🤝‍👨🏾"); + constexpr std::string men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone("👨🏼‍🤝‍👨🏾"); + constexpr std::string men_holding_hands_tone2_tone5("👨🏼‍🤝‍👨🏿"); + constexpr std::string men_holding_hands_medium_light_skin_tone_dark_skin_tone("👨🏼‍🤝‍👨🏿"); + constexpr std::string men_holding_hands_tone3_tone1("👨🏽‍🤝‍👨🏻"); + constexpr std::string men_holding_hands_medium_skin_tone_light_skin_tone("👨🏽‍🤝‍👨🏻"); + constexpr std::string men_holding_hands_tone3_tone2("👨🏽‍🤝‍👨🏼"); + constexpr std::string men_holding_hands_medium_skin_tone_medium_light_skin_tone("👨🏽‍🤝‍👨🏼"); + constexpr std::string men_holding_hands_tone3("👬🏽"); + constexpr std::string men_holding_hands_medium_skin_tone("👬🏽"); + constexpr std::string men_holding_hands_tone3_tone4("👨🏽‍🤝‍👨🏾"); + constexpr std::string men_holding_hands_medium_skin_tone_medium_dark_skin_tone("👨🏽‍🤝‍👨🏾"); + constexpr std::string men_holding_hands_tone3_tone5("👨🏽‍🤝‍👨🏿"); + constexpr std::string men_holding_hands_medium_skin_tone_dark_skin_tone("👨🏽‍🤝‍👨🏿"); + constexpr std::string men_holding_hands_tone4_tone1("👨🏾‍🤝‍👨🏻"); + constexpr std::string men_holding_hands_medium_dark_skin_tone_light_skin_tone("👨🏾‍🤝‍👨🏻"); + constexpr std::string men_holding_hands_tone4_tone2("👨🏾‍🤝‍👨🏼"); + constexpr std::string men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone("👨🏾‍🤝‍👨🏼"); + constexpr std::string men_holding_hands_tone4_tone3("👨🏾‍🤝‍👨🏽"); + constexpr std::string men_holding_hands_medium_dark_skin_tone_medium_skin_tone("👨🏾‍🤝‍👨🏽"); + constexpr std::string men_holding_hands_tone4("👬🏾"); + constexpr std::string men_holding_hands_medium_dark_skin_tone("👬🏾"); + constexpr std::string men_holding_hands_tone4_tone5("👨🏾‍🤝‍👨🏿"); + constexpr std::string men_holding_hands_medium_dark_skin_tone_dark_skin_tone("👨🏾‍🤝‍👨🏿"); + constexpr std::string men_holding_hands_tone5_tone1("👨🏿‍🤝‍👨🏻"); + constexpr std::string men_holding_hands_dark_skin_tone_light_skin_tone("👨🏿‍🤝‍👨🏻"); + constexpr std::string men_holding_hands_tone5_tone2("👨🏿‍🤝‍👨🏼"); + constexpr std::string men_holding_hands_dark_skin_tone_medium_light_skin_tone("👨🏿‍🤝‍👨🏼"); + constexpr std::string men_holding_hands_tone5_tone3("👨🏿‍🤝‍👨🏽"); + constexpr std::string men_holding_hands_dark_skin_tone_medium_skin_tone("👨🏿‍🤝‍👨🏽"); + constexpr std::string men_holding_hands_tone5_tone4("👨🏿‍🤝‍👨🏾"); + constexpr std::string men_holding_hands_dark_skin_tone_medium_dark_skin_tone("👨🏿‍🤝‍👨🏾"); + constexpr std::string men_holding_hands_tone5("👬🏿"); + constexpr std::string men_holding_hands_dark_skin_tone("👬🏿"); + constexpr std::string couple_with_heart("💑"); + constexpr std::string couple_with_heart_tone1("💑🏻"); + constexpr std::string couple_with_heart_light_skin_tone("💑🏻"); + constexpr std::string couple_with_heart_person_person_tone1_tone2("🧑🏻‍❤️‍🧑🏼"); + constexpr std::string couple_with_heart_person_person_light_skin_tone_medium_light_skin_tone("🧑🏻‍❤️‍🧑🏼"); + constexpr std::string couple_with_heart_person_person_tone1_tone3("🧑🏻‍❤️‍🧑🏽"); + constexpr std::string couple_with_heart_person_person_light_skin_tone_medium_skin_tone("🧑🏻‍❤️‍🧑🏽"); + constexpr std::string couple_with_heart_person_person_tone1_tone4("🧑🏻‍❤️‍🧑🏾"); + constexpr std::string couple_with_heart_person_person_light_skin_tone_medium_dark_skin_tone("🧑🏻‍❤️‍🧑🏾"); + constexpr std::string couple_with_heart_person_person_tone1_tone5("🧑🏻‍❤️‍🧑🏿"); + constexpr std::string couple_with_heart_person_person_light_skin_tone_dark_skin_tone("🧑🏻‍❤️‍🧑🏿"); + constexpr std::string couple_with_heart_person_person_tone2_tone1("🧑🏼‍❤️‍🧑🏻"); + constexpr std::string couple_with_heart_person_person_medium_light_skin_tone_light_skin_tone("🧑🏼‍❤️‍🧑🏻"); + constexpr std::string couple_with_heart_tone2("💑🏼"); + constexpr std::string couple_with_heart_medium_light_skin_tone("💑🏼"); + constexpr std::string couple_with_heart_person_person_tone2_tone3("🧑🏼‍❤️‍🧑🏽"); + constexpr std::string couple_with_heart_person_person_medium_light_skin_tone_medium_skin_tone("🧑🏼‍❤️‍🧑🏽"); + constexpr std::string couple_with_heart_person_person_tone2_tone4("🧑🏼‍❤️‍🧑🏾"); + constexpr std::string couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone("🧑🏼‍❤️‍🧑🏾"); + constexpr std::string couple_with_heart_person_person_tone2_tone5("🧑🏼‍❤️‍🧑🏿"); + constexpr std::string couple_with_heart_person_person_medium_light_skin_tone_dark_skin_tone("🧑🏼‍❤️‍🧑🏿"); + constexpr std::string couple_with_heart_person_person_tone3_tone1("🧑🏽‍❤️‍🧑🏻"); + constexpr std::string couple_with_heart_person_person_medium_skin_tone_light_skin_tone("🧑🏽‍❤️‍🧑🏻"); + constexpr std::string couple_with_heart_person_person_tone3_tone2("🧑🏽‍❤️‍🧑🏼"); + constexpr std::string couple_with_heart_person_person_medium_skin_tone_medium_light_skin_tone("🧑🏽‍❤️‍🧑🏼"); + constexpr std::string couple_with_heart_tone3("💑🏽"); + constexpr std::string couple_with_heart_medium_skin_tone("💑🏽"); + constexpr std::string couple_with_heart_person_person_tone3_tone4("🧑🏽‍❤️‍🧑🏾"); + constexpr std::string couple_with_heart_person_person_medium_skin_tone_medium_dark_skin_tone("🧑🏽‍❤️‍🧑🏾"); + constexpr std::string couple_with_heart_person_person_tone3_tone5("🧑🏽‍❤️‍🧑🏿"); + constexpr std::string couple_with_heart_person_person_medium_skin_tone_dark_skin_tone("🧑🏽‍❤️‍🧑🏿"); + constexpr std::string couple_with_heart_person_person_tone4_tone1("🧑🏾‍❤️‍🧑🏻"); + constexpr std::string couple_with_heart_person_person_medium_dark_skin_tone_light_skin_tone("🧑🏾‍❤️‍🧑🏻"); + constexpr std::string couple_with_heart_person_person_tone4_tone2("🧑🏾‍❤️‍🧑🏼"); + constexpr std::string couple_with_heart_person_person_medium_dark_skin_tone_medium_light_skin_tone("🧑🏾‍❤️‍🧑🏼"); + constexpr std::string couple_with_heart_person_person_tone4_tone3("🧑🏾‍❤️‍🧑🏽"); + constexpr std::string couple_with_heart_person_person_medium_dark_skin_tone_medium_skin_tone("🧑🏾‍❤️‍🧑🏽"); + constexpr std::string couple_with_heart_tone4("💑🏾"); + constexpr std::string couple_with_heart_medium_dark_skin_tone("💑🏾"); + constexpr std::string couple_with_heart_person_person_tone4_tone5("🧑🏾‍❤️‍🧑🏿"); + constexpr std::string couple_with_heart_person_person_medium_dark_skin_tone_dark_skin_tone("🧑🏾‍❤️‍🧑🏿"); + constexpr std::string couple_with_heart_person_person_tone5_tone1("🧑🏿‍❤️‍🧑🏻"); + constexpr std::string couple_with_heart_person_person_dark_skin_tone_light_skin_tone("🧑🏿‍❤️‍🧑🏻"); + constexpr std::string couple_with_heart_person_person_tone5_tone2("🧑🏿‍❤️‍🧑🏼"); + constexpr std::string couple_with_heart_person_person_dark_skin_tone_medium_light_skin_tone("🧑🏿‍❤️‍🧑🏼"); + constexpr std::string couple_with_heart_person_person_tone5_tone3("🧑🏿‍❤️‍🧑🏽"); + constexpr std::string couple_with_heart_person_person_dark_skin_tone_medium_skin_tone("🧑🏿‍❤️‍🧑🏽"); + constexpr std::string couple_with_heart_person_person_tone5_tone4("🧑🏿‍❤️‍🧑🏾"); + constexpr std::string couple_with_heart_person_person_dark_skin_tone_medium_dark_skin_tone("🧑🏿‍❤️‍🧑🏾"); + constexpr std::string couple_with_heart_tone5("💑🏿"); + constexpr std::string couple_with_heart_dark_skin_tone("💑🏿"); + constexpr std::string couple_with_heart_woman_man("👩‍❤️‍👨"); + constexpr std::string couple_with_heart_woman_man_tone1("👩🏻‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_light_skin_tone("👩🏻‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_tone1_tone2("👩🏻‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_light_skin_tone_medium_light_skin_tone("👩🏻‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_tone1_tone3("👩🏻‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_light_skin_tone_medium_skin_tone("👩🏻‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_tone1_tone4("👩🏻‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_light_skin_tone_medium_dark_skin_tone("👩🏻‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_tone1_tone5("👩🏻‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_woman_man_light_skin_tone_dark_skin_tone("👩🏻‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_woman_man_tone2_tone1("👩🏼‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone_light_skin_tone("👩🏼‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_tone2("👩🏼‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone("👩🏼‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_tone2_tone3("👩🏼‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone_medium_skin_tone("👩🏼‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_tone2_tone4("👩🏼‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_tone2_tone5("👩🏼‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone_dark_skin_tone("👩🏼‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_woman_man_tone3_tone1("👩🏽‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_medium_skin_tone_light_skin_tone("👩🏽‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_tone3_tone2("👩🏽‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_medium_skin_tone_medium_light_skin_tone("👩🏽‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_tone3("👩🏽‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_medium_skin_tone("👩🏽‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_tone3_tone4("👩🏽‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_medium_skin_tone_medium_dark_skin_tone("👩🏽‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_tone3_tone5("👩🏽‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone("👩🏽‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_woman_man_tone4_tone1("👩🏾‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone_light_skin_tone("👩🏾‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_tone4_tone2("👩🏾‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_tone4_tone3("👩🏾‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone_medium_skin_tone("👩🏾‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_tone4("👩🏾‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone("👩🏾‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_tone4_tone5("👩🏾‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone_dark_skin_tone("👩🏾‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_woman_man_tone5_tone1("👩🏿‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_dark_skin_tone_light_skin_tone("👩🏿‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_woman_man_tone5_tone2("👩🏿‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_dark_skin_tone_medium_light_skin_tone("👩🏿‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_woman_man_tone5_tone3("👩🏿‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone("👩🏿‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_woman_man_tone5_tone4("👩🏿‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_dark_skin_tone_medium_dark_skin_tone("👩🏿‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_woman_man_tone5("👩🏿‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_woman_man_dark_skin_tone("👩🏿‍❤️‍👨🏿"); + constexpr std::string couple_ww("👩‍❤️‍👩"); + constexpr std::string couple_with_heart_ww("👩‍❤️‍👩"); + constexpr std::string couple_with_heart_woman_woman_tone1("👩🏻‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_light_skin_tone("👩🏻‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_tone1_tone2("👩🏻‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_light_skin_tone_medium_light_skin_tone("👩🏻‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_tone1_tone3("👩🏻‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone("👩🏻‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_tone1_tone4("👩🏻‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_light_skin_tone_medium_dark_skin_tone("👩🏻‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_tone1_tone5("👩🏻‍❤️‍👩🏿"); + constexpr std::string couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone("👩🏻‍❤️‍👩🏿"); + constexpr std::string couple_with_heart_woman_woman_tone2_tone1("👩🏼‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone_light_skin_tone("👩🏼‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_tone2("👩🏼‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone("👩🏼‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_tone2_tone3("👩🏼‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone_medium_skin_tone("👩🏼‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_tone2_tone4("👩🏼‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_tone2_tone5("👩🏼‍❤️‍👩🏿"); + constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone_dark_skin_tone("👩🏼‍❤️‍👩🏿"); + constexpr std::string couple_with_heart_woman_woman_tone3_tone1("👩🏽‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone("👩🏽‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_tone3_tone2("👩🏽‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_medium_skin_tone_medium_light_skin_tone("👩🏽‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_tone3("👩🏽‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_medium_skin_tone("👩🏽‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_tone3_tone4("👩🏽‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_medium_skin_tone_medium_dark_skin_tone("👩🏽‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_tone3_tone5("👩🏽‍❤️‍👩🏿"); + constexpr std::string couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone("👩🏽‍❤️‍👩🏿"); + constexpr std::string couple_with_heart_woman_woman_tone4_tone1("👩🏾‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone_light_skin_tone("👩🏾‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_tone4_tone2("👩🏾‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_tone4_tone3("👩🏾‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone_medium_skin_tone("👩🏾‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_tone4("👩🏾‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone("👩🏾‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_tone4_tone5("👩🏾‍❤️‍👩🏿"); + constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone_dark_skin_tone("👩🏾‍❤️‍👩🏿"); + constexpr std::string couple_with_heart_woman_woman_tone5_tone1("👩🏿‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone("👩🏿‍❤️‍👩🏻"); + constexpr std::string couple_with_heart_woman_woman_tone5_tone2("👩🏿‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_dark_skin_tone_medium_light_skin_tone("👩🏿‍❤️‍👩🏼"); + constexpr std::string couple_with_heart_woman_woman_tone5_tone3("👩🏿‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone("👩🏿‍❤️‍👩🏽"); + constexpr std::string couple_with_heart_woman_woman_tone5_tone4("👩🏿‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_dark_skin_tone_medium_dark_skin_tone("👩🏿‍❤️‍👩🏾"); + constexpr std::string couple_with_heart_woman_woman_tone5("👩🏿‍❤️‍👩🏿"); + constexpr std::string couple_with_heart_woman_woman_dark_skin_tone("👩🏿‍❤️‍👩🏿"); + constexpr std::string couple_mm("👨‍❤️‍👨"); + constexpr std::string couple_with_heart_mm("👨‍❤️‍👨"); + constexpr std::string couple_with_heart_man_man_tone1("👨🏻‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_light_skin_tone("👨🏻‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_tone1_tone2("👨🏻‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_light_skin_tone_medium_light_skin_tone("👨🏻‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_tone1_tone3("👨🏻‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_light_skin_tone_medium_skin_tone("👨🏻‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_tone1_tone4("👨🏻‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_light_skin_tone_medium_dark_skin_tone("👨🏻‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_tone1_tone5("👨🏻‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_man_man_light_skin_tone_dark_skin_tone("👨🏻‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_man_man_tone2_tone1("👨🏼‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_medium_light_skin_tone_light_skin_tone("👨🏼‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_tone2("👨🏼‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_medium_light_skin_tone("👨🏼‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_tone2_tone3("👨🏼‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_medium_light_skin_tone_medium_skin_tone("👨🏼‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_tone2_tone4("👨🏼‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_medium_light_skin_tone_medium_dark_skin_tone("👨🏼‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_tone2_tone5("👨🏼‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_man_man_medium_light_skin_tone_dark_skin_tone("👨🏼‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_man_man_tone3_tone1("👨🏽‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_medium_skin_tone_light_skin_tone("👨🏽‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_tone3_tone2("👨🏽‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_medium_skin_tone_medium_light_skin_tone("👨🏽‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_tone3("👨🏽‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_medium_skin_tone("👨🏽‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_tone3_tone4("👨🏽‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_medium_skin_tone_medium_dark_skin_tone("👨🏽‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_tone3_tone5("👨🏽‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_man_man_medium_skin_tone_dark_skin_tone("👨🏽‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_man_man_tone4_tone1("👨🏾‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone_light_skin_tone("👨🏾‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_tone4_tone2("👨🏾‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone_medium_light_skin_tone("👨🏾‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_tone4_tone3("👨🏾‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone_medium_skin_tone("👨🏾‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_tone4("👨🏾‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone("👨🏾‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_tone4_tone5("👨🏾‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone_dark_skin_tone("👨🏾‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_man_man_tone5_tone1("👨🏿‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_dark_skin_tone_light_skin_tone("👨🏿‍❤️‍👨🏻"); + constexpr std::string couple_with_heart_man_man_tone5_tone2("👨🏿‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_dark_skin_tone_medium_light_skin_tone("👨🏿‍❤️‍👨🏼"); + constexpr std::string couple_with_heart_man_man_tone5_tone3("👨🏿‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_dark_skin_tone_medium_skin_tone("👨🏿‍❤️‍👨🏽"); + constexpr std::string couple_with_heart_man_man_tone5_tone4("👨🏿‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_dark_skin_tone_medium_dark_skin_tone("👨🏿‍❤️‍👨🏾"); + constexpr std::string couple_with_heart_man_man_tone5("👨🏿‍❤️‍👨🏿"); + constexpr std::string couple_with_heart_man_man_dark_skin_tone("👨🏿‍❤️‍👨🏿"); + constexpr std::string couplekiss("💏"); + constexpr std::string kiss_tone1("💏🏻"); + constexpr std::string kiss_light_skin_tone("💏🏻"); + constexpr std::string kiss_person_person_tone1_tone2("🧑🏻‍❤️‍💋‍🧑🏼"); + constexpr std::string kiss_person_person_light_skin_tone_medium_light_skin_tone("🧑🏻‍❤️‍💋‍🧑🏼"); + constexpr std::string kiss_person_person_tone1_tone3("🧑🏻‍❤️‍💋‍🧑🏽"); + constexpr std::string kiss_person_person_light_skin_tone_medium_skin_tone("🧑🏻‍❤️‍💋‍🧑🏽"); + constexpr std::string kiss_person_person_tone1_tone4("🧑🏻‍❤️‍💋‍🧑🏾"); + constexpr std::string kiss_person_person_light_skin_tone_medium_dark_skin_tone("🧑🏻‍❤️‍💋‍🧑🏾"); + constexpr std::string kiss_person_person_tone1_tone5("🧑🏻‍❤️‍💋‍🧑🏿"); + constexpr std::string kiss_person_person_light_skin_tone_dark_skin_tone("🧑🏻‍❤️‍💋‍🧑🏿"); + constexpr std::string kiss_person_person_tone2_tone1("🧑🏼‍❤️‍💋‍🧑🏻"); + constexpr std::string kiss_person_person_medium_light_skin_tone_light_skin_tone("🧑🏼‍❤️‍💋‍🧑🏻"); + constexpr std::string kiss_tone2("💏🏼"); + constexpr std::string kiss_medium_light_skin_tone("💏🏼"); + constexpr std::string kiss_person_person_tone2_tone3("🧑🏼‍❤️‍💋‍🧑🏽"); + constexpr std::string kiss_person_person_medium_light_skin_tone_medium_skin_tone("🧑🏼‍❤️‍💋‍🧑🏽"); + constexpr std::string kiss_person_person_tone2_tone4("🧑🏼‍❤️‍💋‍🧑🏾"); + constexpr std::string kiss_person_person_medium_light_skin_tone_medium_dark_skin_tone("🧑🏼‍❤️‍💋‍🧑🏾"); + constexpr std::string kiss_person_person_tone2_tone5("🧑🏼‍❤️‍💋‍🧑🏿"); + constexpr std::string kiss_person_person_medium_light_skin_tone_dark_skin_tone("🧑🏼‍❤️‍💋‍🧑🏿"); + constexpr std::string kiss_person_person_tone3_tone1("🧑🏽‍❤️‍💋‍🧑🏻"); + constexpr std::string kiss_person_person_medium_skin_tone_light_skin_tone("🧑🏽‍❤️‍💋‍🧑🏻"); + constexpr std::string kiss_person_person_tone3_tone2("🧑🏽‍❤️‍💋‍🧑🏼"); + constexpr std::string kiss_person_person_medium_skin_tone_medium_light_skin_tone("🧑🏽‍❤️‍💋‍🧑🏼"); + constexpr std::string kiss_tone3("💏🏽"); + constexpr std::string kiss_medium_skin_tone("💏🏽"); + constexpr std::string kiss_person_person_tone3_tone4("🧑🏽‍❤️‍💋‍🧑🏾"); + constexpr std::string kiss_person_person_medium_skin_tone_medium_dark_skin_tone("🧑🏽‍❤️‍💋‍🧑🏾"); + constexpr std::string kiss_person_person_tone3_tone5("🧑🏽‍❤️‍💋‍🧑🏿"); + constexpr std::string kiss_person_person_medium_skin_tone_dark_skin_tone("🧑🏽‍❤️‍💋‍🧑🏿"); + constexpr std::string kiss_person_person_tone4_tone1("🧑🏾‍❤️‍💋‍🧑🏻"); + constexpr std::string kiss_person_person_medium_dark_skin_tone_light_skin_tone("🧑🏾‍❤️‍💋‍🧑🏻"); + constexpr std::string kiss_person_person_tone4_tone2("🧑🏾‍❤️‍💋‍🧑🏼"); + constexpr std::string kiss_person_person_medium_dark_skin_tone_medium_light_skin_tone("🧑🏾‍❤️‍💋‍🧑🏼"); + constexpr std::string kiss_person_person_tone4_tone3("🧑🏾‍❤️‍💋‍🧑🏽"); + constexpr std::string kiss_person_person_medium_dark_skin_tone_medium_skin_tone("🧑🏾‍❤️‍💋‍🧑🏽"); + constexpr std::string kiss_tone4("💏🏾"); + constexpr std::string kiss_medium_dark_skin_tone("💏🏾"); + constexpr std::string kiss_person_person_tone4_tone5("🧑🏾‍❤️‍💋‍🧑🏿"); + constexpr std::string kiss_person_person_medium_dark_skin_tone_dark_skin_tone("🧑🏾‍❤️‍💋‍🧑🏿"); + constexpr std::string kiss_person_person_tone5_tone1("🧑🏿‍❤️‍💋‍🧑🏻"); + constexpr std::string kiss_person_person_dark_skin_tone_light_skin_tone("🧑🏿‍❤️‍💋‍🧑🏻"); + constexpr std::string kiss_person_person_tone5_tone2("🧑🏿‍❤️‍💋‍🧑🏼"); + constexpr std::string kiss_person_person_dark_skin_tone_medium_light_skin_tone("🧑🏿‍❤️‍💋‍🧑🏼"); + constexpr std::string kiss_person_person_tone5_tone3("🧑🏿‍❤️‍💋‍🧑🏽"); + constexpr std::string kiss_person_person_dark_skin_tone_medium_skin_tone("🧑🏿‍❤️‍💋‍🧑🏽"); + constexpr std::string kiss_person_person_tone5_tone4("🧑🏿‍❤️‍💋‍🧑🏾"); + constexpr std::string kiss_person_person_dark_skin_tone_medium_dark_skin_tone("🧑🏿‍❤️‍💋‍🧑🏾"); + constexpr std::string kiss_tone5("💏🏿"); + constexpr std::string kiss_dark_skin_tone("💏🏿"); + constexpr std::string kiss_woman_man("👩‍❤️‍💋‍👨"); + constexpr std::string kiss_woman_man_tone1("👩🏻‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_light_skin_tone("👩🏻‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_tone1_tone2("👩🏻‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_light_skin_tone_medium_light_skin_tone("👩🏻‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_tone1_tone3("👩🏻‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_light_skin_tone_medium_skin_tone("👩🏻‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_tone1_tone4("👩🏻‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_light_skin_tone_medium_dark_skin_tone("👩🏻‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_tone1_tone5("👩🏻‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_woman_man_light_skin_tone_dark_skin_tone("👩🏻‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_woman_man_tone2_tone1("👩🏼‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_medium_light_skin_tone_light_skin_tone("👩🏼‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_tone2("👩🏼‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_medium_light_skin_tone("👩🏼‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_tone2_tone3("👩🏼‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_medium_light_skin_tone_medium_skin_tone("👩🏼‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_tone2_tone4("👩🏼‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_tone2_tone5("👩🏼‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_woman_man_medium_light_skin_tone_dark_skin_tone("👩🏼‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_woman_man_tone3_tone1("👩🏽‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_medium_skin_tone_light_skin_tone("👩🏽‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_tone3_tone2("👩🏽‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_medium_skin_tone_medium_light_skin_tone("👩🏽‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_tone3("👩🏽‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_medium_skin_tone("👩🏽‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_tone3_tone4("👩🏽‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_medium_skin_tone_medium_dark_skin_tone("👩🏽‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_tone3_tone5("👩🏽‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_woman_man_medium_skin_tone_dark_skin_tone("👩🏽‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_woman_man_tone4_tone1("👩🏾‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_medium_dark_skin_tone_light_skin_tone("👩🏾‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_tone4_tone2("👩🏾‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_tone4_tone3("👩🏾‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_medium_dark_skin_tone_medium_skin_tone("👩🏾‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_tone4("👩🏾‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_medium_dark_skin_tone("👩🏾‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_tone4_tone5("👩🏾‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_woman_man_medium_dark_skin_tone_dark_skin_tone("👩🏾‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_woman_man_tone5_tone1("👩🏿‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_dark_skin_tone_light_skin_tone("👩🏿‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_woman_man_tone5_tone2("👩🏿‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_dark_skin_tone_medium_light_skin_tone("👩🏿‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_woman_man_tone5_tone3("👩🏿‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_dark_skin_tone_medium_skin_tone("👩🏿‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_woman_man_tone5_tone4("👩🏿‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_dark_skin_tone_medium_dark_skin_tone("👩🏿‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_woman_man_tone5("👩🏿‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_woman_man_dark_skin_tone("👩🏿‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_ww("👩‍❤️‍💋‍👩"); + constexpr std::string couplekiss_ww("👩‍❤️‍💋‍👩"); + constexpr std::string kiss_woman_woman_tone1("👩🏻‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_light_skin_tone("👩🏻‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_tone1_tone2("👩🏻‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_light_skin_tone_medium_light_skin_tone("👩🏻‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_tone1_tone3("👩🏻‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_light_skin_tone_medium_skin_tone("👩🏻‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_tone1_tone4("👩🏻‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_light_skin_tone_medium_dark_skin_tone("👩🏻‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_tone1_tone5("👩🏻‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_woman_woman_light_skin_tone_dark_skin_tone("👩🏻‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_woman_woman_tone2_tone1("👩🏼‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_medium_light_skin_tone_light_skin_tone("👩🏼‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_tone2("👩🏼‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_medium_light_skin_tone("👩🏼‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_tone2_tone3("👩🏼‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_medium_light_skin_tone_medium_skin_tone("👩🏼‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_tone2_tone4("👩🏼‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_tone2_tone5("👩🏼‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_woman_woman_medium_light_skin_tone_dark_skin_tone("👩🏼‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_woman_woman_tone3_tone1("👩🏽‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_medium_skin_tone_light_skin_tone("👩🏽‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_tone3_tone2("👩🏽‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_medium_skin_tone_medium_light_skin_tone("👩🏽‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_tone3("👩🏽‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_medium_skin_tone("👩🏽‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_tone3_tone4("👩🏽‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_medium_skin_tone_medium_dark_skin_tone("👩🏽‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_tone3_tone5("👩🏽‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_woman_woman_medium_skin_tone_dark_skin_tone("👩🏽‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_woman_woman_tone4_tone1("👩🏾‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_medium_dark_skin_tone_light_skin_tone("👩🏾‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_tone4_tone2("👩🏾‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_tone4_tone3("👩🏾‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_medium_dark_skin_tone_medium_skin_tone("👩🏾‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_tone4("👩🏾‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_medium_dark_skin_tone("👩🏾‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_tone4_tone5("👩🏾‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_woman_woman_medium_dark_skin_tone_dark_skin_tone("👩🏾‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_woman_woman_tone5_tone1("👩🏿‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_dark_skin_tone_light_skin_tone("👩🏿‍❤️‍💋‍👩🏻"); + constexpr std::string kiss_woman_woman_tone5_tone2("👩🏿‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_dark_skin_tone_medium_light_skin_tone("👩🏿‍❤️‍💋‍👩🏼"); + constexpr std::string kiss_woman_woman_tone5_tone3("👩🏿‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_dark_skin_tone_medium_skin_tone("👩🏿‍❤️‍💋‍👩🏽"); + constexpr std::string kiss_woman_woman_tone5_tone4("👩🏿‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_dark_skin_tone_medium_dark_skin_tone("👩🏿‍❤️‍💋‍👩🏾"); + constexpr std::string kiss_woman_woman_tone5("👩🏿‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_woman_woman_dark_skin_tone("👩🏿‍❤️‍💋‍👩🏿"); + constexpr std::string kiss_mm("👨‍❤️‍💋‍👨"); + constexpr std::string couplekiss_mm("👨‍❤️‍💋‍👨"); + constexpr std::string kiss_man_man_tone1("👨🏻‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_light_skin_tone("👨🏻‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_tone1_tone2("👨🏻‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_light_skin_tone_medium_light_skin_tone("👨🏻‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_tone1_tone3("👨🏻‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_light_skin_tone_medium_skin_tone("👨🏻‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_tone1_tone4("👨🏻‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_light_skin_tone_medium_dark_skin_tone("👨🏻‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_tone1_tone5("👨🏻‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_man_man_light_skin_tone_dark_skin_tone("👨🏻‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_man_man_tone2_tone1("👨🏼‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_medium_light_skin_tone_light_skin_tone("👨🏼‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_tone2("👨🏼‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_medium_light_skin_tone("👨🏼‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_tone2_tone3("👨🏼‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_medium_light_skin_tone_medium_skin_tone("👨🏼‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_tone2_tone4("👨🏼‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_medium_light_skin_tone_medium_dark_skin_tone("👨🏼‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_tone2_tone5("👨🏼‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_man_man_medium_light_skin_tone_dark_skin_tone("👨🏼‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_man_man_tone3_tone1("👨🏽‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_medium_skin_tone_light_skin_tone("👨🏽‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_tone3_tone2("👨🏽‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_medium_skin_tone_medium_light_skin_tone("👨🏽‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_tone3("👨🏽‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_medium_skin_tone("👨🏽‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_tone3_tone4("👨🏽‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_medium_skin_tone_medium_dark_skin_tone("👨🏽‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_tone3_tone5("👨🏽‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_man_man_medium_skin_tone_dark_skin_tone("👨🏽‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_man_man_tone4_tone1("👨🏾‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_medium_dark_skin_tone_light_skin_tone("👨🏾‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_tone4_tone2("👨🏾‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_medium_dark_skin_tone_medium_light_skin_tone("👨🏾‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_tone4_tone3("👨🏾‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_medium_dark_skin_tone_medium_skin_tone("👨🏾‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_tone4("👨🏾‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_medium_dark_skin_tone("👨🏾‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_tone4_tone5("👨🏾‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_man_man_medium_dark_skin_tone_dark_skin_tone("👨🏾‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_man_man_tone5_tone1("👨🏿‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_dark_skin_tone_light_skin_tone("👨🏿‍❤️‍💋‍👨🏻"); + constexpr std::string kiss_man_man_tone5_tone2("👨🏿‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_dark_skin_tone_medium_light_skin_tone("👨🏿‍❤️‍💋‍👨🏼"); + constexpr std::string kiss_man_man_tone5_tone3("👨🏿‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_dark_skin_tone_medium_skin_tone("👨🏿‍❤️‍💋‍👨🏽"); + constexpr std::string kiss_man_man_tone5_tone4("👨🏿‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_dark_skin_tone_medium_dark_skin_tone("👨🏿‍❤️‍💋‍👨🏾"); + constexpr std::string kiss_man_man_tone5("👨🏿‍❤️‍💋‍👨🏿"); + constexpr std::string kiss_man_man_dark_skin_tone("👨🏿‍❤️‍💋‍👨🏿"); + constexpr std::string family("👪"); + constexpr std::string family_man_woman_boy("👨‍👩‍👦"); + constexpr std::string family_mwg("👨‍👩‍👧"); + constexpr std::string family_mwgb("👨‍👩‍👧‍👦"); + constexpr std::string family_mwbb("👨‍👩‍👦‍👦"); + constexpr std::string family_mwgg("👨‍👩‍👧‍👧"); + constexpr std::string family_wwb("👩‍👩‍👦"); + constexpr std::string family_wwg("👩‍👩‍👧"); + constexpr std::string family_wwgb("👩‍👩‍👧‍👦"); + constexpr std::string family_wwbb("👩‍👩‍👦‍👦"); + constexpr std::string family_wwgg("👩‍👩‍👧‍👧"); + constexpr std::string family_mmb("👨‍👨‍👦"); + constexpr std::string family_mmg("👨‍👨‍👧"); + constexpr std::string family_mmgb("👨‍👨‍👧‍👦"); + constexpr std::string family_mmbb("👨‍👨‍👦‍👦"); + constexpr std::string family_mmgg("👨‍👨‍👧‍👧"); + constexpr std::string family_woman_boy("👩‍👦"); + constexpr std::string family_woman_girl("👩‍👧"); + constexpr std::string family_woman_girl_boy("👩‍👧‍👦"); + constexpr std::string family_woman_boy_boy("👩‍👦‍👦"); + constexpr std::string family_woman_girl_girl("👩‍👧‍👧"); + constexpr std::string family_man_boy("👨‍👦"); + constexpr std::string family_man_girl("👨‍👧"); + constexpr std::string family_man_girl_boy("👨‍👧‍👦"); + constexpr std::string family_man_boy_boy("👨‍👦‍👦"); + constexpr std::string family_man_girl_girl("👨‍👧‍👧"); + constexpr std::string knot("🪢"); + constexpr std::string yarn("🧶"); + constexpr std::string thread("🧵"); + constexpr std::string sewing_needle("🪡"); + constexpr std::string coat("🧥"); + constexpr std::string lab_coat("🥼"); + constexpr std::string safety_vest("🦺"); + constexpr std::string womans_clothes("👚"); + constexpr std::string shirt("👕"); + constexpr std::string jeans("👖"); + constexpr std::string briefs("🩲"); + constexpr std::string shorts("🩳"); + constexpr std::string necktie("👔"); + constexpr std::string dress("👗"); + constexpr std::string bikini("👙"); + constexpr std::string one_piece_swimsuit("🩱"); + constexpr std::string kimono("👘"); + constexpr std::string sari("🥻"); + constexpr std::string thong_sandal("🩴"); + constexpr std::string womans_flat_shoe("🥿"); + constexpr std::string high_heel("👠"); + constexpr std::string sandal("👡"); + constexpr std::string boot("👢"); + constexpr std::string mans_shoe("👞"); + constexpr std::string athletic_shoe("👟"); + constexpr std::string hiking_boot("🥾"); + constexpr std::string socks("🧦"); + constexpr std::string gloves("🧤"); + constexpr std::string scarf("🧣"); + constexpr std::string tophat("🎩"); + constexpr std::string billed_cap("🧢"); + constexpr std::string womans_hat("👒"); + constexpr std::string mortar_board("🎓"); + constexpr std::string helmet_with_cross("⛑️"); + constexpr std::string helmet_with_white_cross("⛑️"); + constexpr std::string military_helmet("🪖"); + constexpr std::string crown("👑"); + constexpr std::string ring("💍"); + constexpr std::string pouch("👝"); + constexpr std::string purse("👛"); + constexpr std::string handbag("👜"); + constexpr std::string briefcase("💼"); + constexpr std::string school_satchel("🎒"); + constexpr std::string luggage("🧳"); + constexpr std::string eyeglasses("👓"); + constexpr std::string dark_sunglasses("🕶️"); + constexpr std::string goggles("🥽"); + constexpr std::string closed_umbrella("🌂"); + constexpr std::string heart("❤️"); + constexpr std::string orange_heart("🧡"); + constexpr std::string yellow_heart("💛"); + constexpr std::string green_heart("💚"); + constexpr std::string blue_heart("💙"); + constexpr std::string purple_heart("💜"); + constexpr std::string black_heart("🖤"); + constexpr std::string brown_heart("🤎"); + constexpr std::string white_heart("🤍"); + constexpr std::string broken_heart("💔"); + constexpr std::string heart_exclamation("❣️"); + constexpr std::string heavy_heart_exclamation_mark_ornament("❣️"); + constexpr std::string two_hearts("💕"); + constexpr std::string revolving_hearts("💞"); + constexpr std::string heartbeat("💓"); + constexpr std::string heartpulse("💗"); + constexpr std::string sparkling_heart("💖"); + constexpr std::string cupid("💘"); + constexpr std::string gift_heart("💝"); + constexpr std::string mending_heart("❤️‍🩹"); + constexpr std::string heart_on_fire("❤️‍🔥"); + constexpr std::string heart_decoration("💟"); + constexpr std::string peace("☮️"); + constexpr std::string peace_symbol("☮️"); + constexpr std::string cross("✝️"); + constexpr std::string latin_cross("✝️"); + constexpr std::string star_and_crescent("☪️"); + constexpr std::string om_symbol("🕉️"); + constexpr std::string wheel_of_dharma("☸️"); + constexpr std::string star_of_david("✡️"); + constexpr std::string six_pointed_star("🔯"); + constexpr std::string menorah("🕎"); + constexpr std::string yin_yang("☯️"); + constexpr std::string orthodox_cross("☦️"); + constexpr std::string place_of_worship("🛐"); + constexpr std::string worship_symbol("🛐"); + constexpr std::string ophiuchus("⛎"); + constexpr std::string aries("♈"); + constexpr std::string taurus("♉"); + constexpr std::string gemini("♊"); + constexpr std::string cancer("♋"); + constexpr std::string leo("♌"); + constexpr std::string virgo("♍"); + constexpr std::string libra("♎"); + constexpr std::string scorpius("♏"); + constexpr std::string sagittarius("♐"); + constexpr std::string capricorn("♑"); + constexpr std::string aquarius("♒"); + constexpr std::string pisces("♓"); + constexpr std::string id("🆔"); + constexpr std::string atom("⚛️"); + constexpr std::string atom_symbol("⚛️"); + constexpr std::string accept("🉑"); + constexpr std::string radioactive("☢️"); + constexpr std::string radioactive_sign("☢️"); + constexpr std::string biohazard("☣️"); + constexpr std::string biohazard_sign("☣️"); + constexpr std::string mobile_phone_off("📴"); + constexpr std::string vibration_mode("📳"); + constexpr std::string u6709("🈶"); + constexpr std::string u7121("🈚"); + constexpr std::string u7533("🈸"); + constexpr std::string u55b6("🈺"); + constexpr std::string u6708("🈷️"); + constexpr std::string eight_pointed_black_star("✴️"); + constexpr std::string vs("🆚"); + constexpr std::string white_flower("💮"); + constexpr std::string ideograph_advantage("🉐"); + constexpr std::string secret("㊙️"); + constexpr std::string congratulations("㊗️"); + constexpr std::string u5408("🈴"); + constexpr std::string u6e80("🈵"); + constexpr std::string u5272("🈹"); + constexpr std::string u7981("🈲"); + constexpr std::string a("🅰️"); + constexpr std::string b("🅱️"); + constexpr std::string ab("🆎"); + constexpr std::string cl("🆑"); + constexpr std::string o2("🅾️"); + constexpr std::string sos("🆘"); + constexpr std::string x("❌"); + constexpr std::string o("⭕"); + constexpr std::string octagonal_sign("🛑"); + constexpr std::string stop_sign("🛑"); + constexpr std::string no_entry("⛔"); + constexpr std::string name_badge("📛"); + constexpr std::string no_entry_sign("🚫"); + constexpr std::string anger("💢"); + constexpr std::string hotsprings("♨️"); + constexpr std::string no_pedestrians("🚷"); + constexpr std::string do_not_litter("🚯"); + constexpr std::string no_bicycles("🚳"); + constexpr std::string non_potable_water("🚱"); + constexpr std::string underage("🔞"); + constexpr std::string no_mobile_phones("📵"); + constexpr std::string no_smoking("🚭"); + constexpr std::string exclamation("❗"); + constexpr std::string grey_exclamation("❕"); + constexpr std::string question("❓"); + constexpr std::string grey_question("❔"); + constexpr std::string bangbang("‼️"); + constexpr std::string interrobang("⁉️"); + constexpr std::string low_brightness("🔅"); + constexpr std::string high_brightness("🔆"); + constexpr std::string part_alternation_mark("〽️"); + constexpr std::string warning("⚠️"); + constexpr std::string children_crossing("🚸"); + constexpr std::string trident("🔱"); + constexpr std::string fleur_de_lis("⚜️"); + constexpr std::string beginner("🔰"); + constexpr std::string recycle("♻️"); + constexpr std::string white_check_mark("✅"); + constexpr std::string u6307("🈯"); + constexpr std::string chart("💹"); + constexpr std::string sparkle("❇️"); + constexpr std::string eight_spoked_asterisk("✳️"); + constexpr std::string negative_squared_cross_mark("❎"); + constexpr std::string globe_with_meridians("🌐"); + constexpr std::string diamond_shape_with_a_dot_inside("💠"); + constexpr std::string m("Ⓜ️"); + constexpr std::string cyclone("🌀"); + constexpr std::string zzz("💤"); + constexpr std::string atm("🏧"); + constexpr std::string wc("🚾"); + constexpr std::string wheelchair("♿"); + constexpr std::string parking("🅿️"); + constexpr std::string u7a7a("🈳"); + constexpr std::string sa("🈂️"); + constexpr std::string passport_control("🛂"); + constexpr std::string customs("🛃"); + constexpr std::string baggage_claim("🛄"); + constexpr std::string left_luggage("🛅"); + constexpr std::string elevator("🛗"); + constexpr std::string mens("🚹"); + constexpr std::string womens("🚺"); + constexpr std::string baby_symbol("🚼"); + constexpr std::string restroom("🚻"); + constexpr std::string put_litter_in_its_place("🚮"); + constexpr std::string cinema("🎦"); + constexpr std::string signal_strength("📶"); + constexpr std::string koko("🈁"); + constexpr std::string symbols("🔣"); + constexpr std::string information_source("ℹ️"); + constexpr std::string abc("🔤"); + constexpr std::string abcd("🔡"); + constexpr std::string capital_abcd("🔠"); + constexpr std::string ng("🆖"); + constexpr std::string ok("🆗"); + constexpr std::string up("🆙"); + constexpr std::string cool("🆒"); + constexpr std::string new("🆕"); + constexpr std::string free("🆓"); + constexpr std::string zero("0️⃣"); + constexpr std::string one("1️⃣"); + constexpr std::string two("2️⃣"); + constexpr std::string three("3️⃣"); + constexpr std::string four("4️⃣"); + constexpr std::string five("5️⃣"); + constexpr std::string six("6️⃣"); + constexpr std::string seven("7️⃣"); + constexpr std::string eight("8️⃣"); + constexpr std::string nine("9️⃣"); + constexpr std::string keycap_ten("🔟"); + constexpr std::string hash("#️⃣"); + constexpr std::string asterisk("*️⃣"); + constexpr std::string keycap_asterisk("*️⃣"); + constexpr std::string eject("⏏️"); + constexpr std::string eject_symbol("⏏️"); + constexpr std::string arrow_forward("▶️"); + constexpr std::string pause_button("⏸️"); + constexpr std::string double_vertical_bar("⏸️"); + constexpr std::string play_pause("⏯️"); + constexpr std::string stop_button("⏹️"); + constexpr std::string record_button("⏺️"); + constexpr std::string track_next("⏭️"); + constexpr std::string next_track("⏭️"); + constexpr std::string track_previous("⏮️"); + constexpr std::string previous_track("⏮️"); + constexpr std::string fast_forward("⏩"); + constexpr std::string rewind("⏪"); + constexpr std::string arrow_double_up("⏫"); + constexpr std::string arrow_double_down("⏬"); + constexpr std::string arrow_backward("◀️"); + constexpr std::string arrow_up_small("🔼"); + constexpr std::string arrow_down_small("🔽"); + constexpr std::string arrow_right("➡️"); + constexpr std::string arrow_left("⬅️"); + constexpr std::string arrow_up("⬆️"); + constexpr std::string arrow_down("⬇️"); + constexpr std::string arrow_upper_right("↗️"); + constexpr std::string arrow_lower_right("↘️"); + constexpr std::string arrow_lower_left("↙️"); + constexpr std::string arrow_upper_left("↖️"); + constexpr std::string arrow_up_down("↕️"); + constexpr std::string left_right_arrow("↔️"); + constexpr std::string arrow_right_hook("↪️"); + constexpr std::string leftwards_arrow_with_hook("↩️"); + constexpr std::string arrow_heading_up("⤴️"); + constexpr std::string arrow_heading_down("⤵️"); + constexpr std::string twisted_rightwards_arrows("🔀"); + constexpr std::string repeat("🔁"); + constexpr std::string repeat_one("🔂"); + constexpr std::string arrows_counterclockwise("🔄"); + constexpr std::string arrows_clockwise("🔃"); + constexpr std::string musical_note("🎵"); + constexpr std::string notes("🎶"); + constexpr std::string heavy_plus_sign("➕"); + constexpr std::string heavy_minus_sign("➖"); + constexpr std::string heavy_division_sign("➗"); + constexpr std::string heavy_multiplication_x("✖️"); + constexpr std::string heavy_equals_sign("🟰"); + constexpr std::string infinity("♾️"); + constexpr std::string heavy_dollar_sign("💲"); + constexpr std::string currency_exchange("💱"); + constexpr std::string tm("™️"); + constexpr std::string copyright("©️"); + constexpr std::string registered("®️"); + constexpr std::string wavy_dash("〰️"); + constexpr std::string curly_loop("➰"); + constexpr std::string loop("➿"); + constexpr std::string end("🔚"); + constexpr std::string back("🔙"); + constexpr std::string on("🔛"); + constexpr std::string top("🔝"); + constexpr std::string soon("🔜"); + constexpr std::string heavy_check_mark("✔️"); + constexpr std::string ballot_box_with_check("☑️"); + constexpr std::string radio_button("🔘"); + constexpr std::string white_circle("⚪"); + constexpr std::string black_circle("⚫"); + constexpr std::string red_circle("🔴"); + constexpr std::string blue_circle("🔵"); + constexpr std::string brown_circle("🟤"); + constexpr std::string purple_circle("🟣"); + constexpr std::string green_circle("🟢"); + constexpr std::string yellow_circle("🟡"); + constexpr std::string orange_circle("🟠"); + constexpr std::string small_red_triangle("🔺"); + constexpr std::string small_red_triangle_down("🔻"); + constexpr std::string small_orange_diamond("🔸"); + constexpr std::string small_blue_diamond("🔹"); + constexpr std::string large_orange_diamond("🔶"); + constexpr std::string large_blue_diamond("🔷"); + constexpr std::string white_square_button("🔳"); + constexpr std::string black_square_button("🔲"); + constexpr std::string black_small_square("▪️"); + constexpr std::string white_small_square("▫️"); + constexpr std::string black_medium_small_square("◾"); + constexpr std::string white_medium_small_square("◽"); + constexpr std::string black_medium_square("◼️"); + constexpr std::string white_medium_square("◻️"); + constexpr std::string black_large_square("⬛"); + constexpr std::string white_large_square("⬜"); + constexpr std::string orange_square("🟧"); + constexpr std::string blue_square("🟦"); + constexpr std::string red_square("🟥"); + constexpr std::string brown_square("🟫"); + constexpr std::string purple_square("🟪"); + constexpr std::string green_square("🟩"); + constexpr std::string yellow_square("🟨"); + constexpr std::string speaker("🔈"); + constexpr std::string mute("🔇"); + constexpr std::string sound("🔉"); + constexpr std::string loud_sound("🔊"); + constexpr std::string bell("🔔"); + constexpr std::string no_bell("🔕"); + constexpr std::string mega("📣"); + constexpr std::string loudspeaker("📢"); + constexpr std::string speech_left("🗨️"); + constexpr std::string left_speech_bubble("🗨️"); + constexpr std::string eye_in_speech_bubble("👁‍🗨"); + constexpr std::string speech_balloon("💬"); + constexpr std::string thought_balloon("💭"); + constexpr std::string anger_right("🗯️"); + constexpr std::string right_anger_bubble("🗯️"); + constexpr std::string spades("♠️"); + constexpr std::string clubs("♣️"); + constexpr std::string hearts("♥️"); + constexpr std::string diamonds("♦️"); + constexpr std::string black_joker("🃏"); + constexpr std::string flower_playing_cards("🎴"); + constexpr std::string mahjong("🀄"); + constexpr std::string clock1("🕐"); + constexpr std::string clock2("🕑"); + constexpr std::string clock3("🕒"); + constexpr std::string clock4("🕓"); + constexpr std::string clock5("🕔"); + constexpr std::string clock6("🕕"); + constexpr std::string clock7("🕖"); + constexpr std::string clock8("🕗"); + constexpr std::string clock9("🕘"); + constexpr std::string clock10("🕙"); + constexpr std::string clock11("🕚"); + constexpr std::string clock12("🕛"); + constexpr std::string clock130("🕜"); + constexpr std::string clock230("🕝"); + constexpr std::string clock330("🕞"); + constexpr std::string clock430("🕟"); + constexpr std::string clock530("🕠"); + constexpr std::string clock630("🕡"); + constexpr std::string clock730("🕢"); + constexpr std::string clock830("🕣"); + constexpr std::string clock930("🕤"); + constexpr std::string clock1030("🕥"); + constexpr std::string clock1130("🕦"); + constexpr std::string clock1230("🕧"); + constexpr std::string female_sign("♀️"); + constexpr std::string male_sign("♂️"); + constexpr std::string transgender_symbol("⚧"); + constexpr std::string medical_symbol("⚕️"); + constexpr std::string regional_indicator_z("🇿"); + constexpr std::string regional_indicator_y("🇾"); + constexpr std::string regional_indicator_x("🇽"); + constexpr std::string regional_indicator_w("🇼"); + constexpr std::string regional_indicator_v("🇻"); + constexpr std::string regional_indicator_u("🇺"); + constexpr std::string regional_indicator_t("🇹"); + constexpr std::string regional_indicator_s("🇸"); + constexpr std::string regional_indicator_r("🇷"); + constexpr std::string regional_indicator_q("🇶"); + constexpr std::string regional_indicator_p("🇵"); + constexpr std::string regional_indicator_o("🇴"); + constexpr std::string regional_indicator_n("🇳"); + constexpr std::string regional_indicator_m("🇲"); + constexpr std::string regional_indicator_l("🇱"); + constexpr std::string regional_indicator_k("🇰"); + constexpr std::string regional_indicator_j("🇯"); + constexpr std::string regional_indicator_i("🇮"); + constexpr std::string regional_indicator_h("🇭"); + constexpr std::string regional_indicator_g("🇬"); + constexpr std::string regional_indicator_f("🇫"); + constexpr std::string regional_indicator_e("🇪"); + constexpr std::string regional_indicator_d("🇩"); + constexpr std::string regional_indicator_c("🇨"); + constexpr std::string regional_indicator_b("🇧"); + constexpr std::string regional_indicator_a("🇦"); + constexpr std::string red_car("🚗"); + constexpr std::string taxi("🚕"); + constexpr std::string blue_car("🚙"); + constexpr std::string pickup_truck("🛻"); + constexpr std::string bus("🚌"); + constexpr std::string trolleybus("🚎"); + constexpr std::string race_car("🏎️"); + constexpr std::string racing_car("🏎️"); + constexpr std::string police_car("🚓"); + constexpr std::string ambulance("🚑"); + constexpr std::string fire_engine("🚒"); + constexpr std::string minibus("🚐"); + constexpr std::string truck("🚚"); + constexpr std::string articulated_lorry("🚛"); + constexpr std::string tractor("🚜"); + constexpr std::string probing_cane("🦯"); + constexpr std::string crutch("🩼"); + constexpr std::string manual_wheelchair("🦽"); + constexpr std::string motorized_wheelchair("🦼"); + constexpr std::string scooter("🛴"); + constexpr std::string bike("🚲"); + constexpr std::string motor_scooter("🛵"); + constexpr std::string motorbike("🛵"); + constexpr std::string motorcycle("🏍️"); + constexpr std::string racing_motorcycle("🏍️"); + constexpr std::string auto_rickshaw("🛺"); + constexpr std::string wheel("🛞"); + constexpr std::string rotating_light("🚨"); + constexpr std::string oncoming_police_car("🚔"); + constexpr std::string oncoming_bus("🚍"); + constexpr std::string oncoming_automobile("🚘"); + constexpr std::string oncoming_taxi("🚖"); + constexpr std::string aerial_tramway("🚡"); + constexpr std::string mountain_cableway("🚠"); + constexpr std::string suspension_railway("🚟"); + constexpr std::string railway_car("🚃"); + constexpr std::string train("🚋"); + constexpr std::string mountain_railway("🚞"); + constexpr std::string monorail("🚝"); + constexpr std::string bullettrain_side("🚄"); + constexpr std::string bullettrain_front("🚅"); + constexpr std::string light_rail("🚈"); + constexpr std::string steam_locomotive("🚂"); + constexpr std::string train2("🚆"); + constexpr std::string metro("🚇"); + constexpr std::string tram("🚊"); + constexpr std::string station("🚉"); + constexpr std::string airplane("✈️"); + constexpr std::string airplane_departure("🛫"); + constexpr std::string airplane_arriving("🛬"); + constexpr std::string airplane_small("🛩️"); + constexpr std::string small_airplane("🛩️"); + constexpr std::string seat("💺"); + constexpr std::string satellite_orbital("🛰️"); + constexpr std::string rocket("🚀"); + constexpr std::string flying_saucer("🛸"); + constexpr std::string helicopter("🚁"); + constexpr std::string canoe("🛶"); + constexpr std::string kayak("🛶"); + constexpr std::string sailboat("⛵"); + constexpr std::string speedboat("🚤"); + constexpr std::string motorboat("🛥️"); + constexpr std::string cruise_ship("🛳️"); + constexpr std::string passenger_ship("🛳️"); + constexpr std::string ferry("⛴️"); + constexpr std::string ship("🚢"); + constexpr std::string ring_buoy("🛟"); + constexpr std::string anchor("⚓"); + constexpr std::string hook("🪝"); + constexpr std::string fuelpump("⛽"); + constexpr std::string construction("🚧"); + constexpr std::string vertical_traffic_light("🚦"); + constexpr std::string traffic_light("🚥"); + constexpr std::string busstop("🚏"); + constexpr std::string map("🗺️"); + constexpr std::string world_map("🗺️"); + constexpr std::string moyai("🗿"); + constexpr std::string statue_of_liberty("🗽"); + constexpr std::string tokyo_tower("🗼"); + constexpr std::string european_castle("🏰"); + constexpr std::string japanese_castle("🏯"); + constexpr std::string stadium("🏟️"); + constexpr std::string ferris_wheel("🎡"); + constexpr std::string roller_coaster("🎢"); + constexpr std::string carousel_horse("🎠"); + constexpr std::string fountain("⛲"); + constexpr std::string beach_umbrella("⛱️"); + constexpr std::string umbrella_on_ground("⛱️"); + constexpr std::string beach("🏖️"); + constexpr std::string beach_with_umbrella("🏖️"); + constexpr std::string island("🏝️"); + constexpr std::string desert_island("🏝️"); + constexpr std::string desert("🏜️"); + constexpr std::string volcano("🌋"); + constexpr std::string mountain("⛰️"); + constexpr std::string mountain_snow("🏔️"); + constexpr std::string snow_capped_mountain("🏔️"); + constexpr std::string mount_fuji("🗻"); + constexpr std::string camping("🏕️"); + constexpr std::string tent("⛺"); + constexpr std::string house("🏠"); + constexpr std::string house_with_garden("🏡"); + constexpr std::string homes("🏘️"); + constexpr std::string house_buildings("🏘️"); + constexpr std::string house_abandoned("🏚️"); + constexpr std::string derelict_house_building("🏚️"); + constexpr std::string hut("🛖"); + constexpr std::string construction_site("🏗️"); + constexpr std::string building_construction("🏗️"); + constexpr std::string factory("🏭"); + constexpr std::string office("🏢"); + constexpr std::string department_store("🏬"); + constexpr std::string post_office("🏣"); + constexpr std::string european_post_office("🏤"); + constexpr std::string hospital("🏥"); + constexpr std::string bank("🏦"); + constexpr std::string hotel("🏨"); + constexpr std::string convenience_store("🏪"); + constexpr std::string school("🏫"); + constexpr std::string love_hotel("🏩"); + constexpr std::string wedding("💒"); + constexpr std::string classical_building("🏛️"); + constexpr std::string church("⛪"); + constexpr std::string mosque("🕌"); + constexpr std::string synagogue("🕍"); + constexpr std::string hindu_temple("🛕"); + constexpr std::string kaaba("🕋"); + constexpr std::string shinto_shrine("⛩️"); + constexpr std::string railway_track("🛤️"); + constexpr std::string railroad_track("🛤️"); + constexpr std::string motorway("🛣️"); + constexpr std::string japan("🗾"); + constexpr std::string rice_scene("🎑"); + constexpr std::string park("🏞️"); + constexpr std::string national_park("🏞️"); + constexpr std::string sunrise("🌅"); + constexpr std::string sunrise_over_mountains("🌄"); + constexpr std::string stars("🌠"); + constexpr std::string sparkler("🎇"); + constexpr std::string fireworks("🎆"); + constexpr std::string city_sunset("🌇"); + constexpr std::string city_sunrise("🌇"); + constexpr std::string city_dusk("🌆"); + constexpr std::string cityscape("🏙️"); + constexpr std::string night_with_stars("🌃"); + constexpr std::string milky_way("🌌"); + constexpr std::string bridge_at_night("🌉"); + constexpr std::string foggy("🌁"); +} +} diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 782afc717f..cbe95e9646 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -74,6 +74,12 @@ if (UNIX) COMMAND php buildtools/make_struct.php "\\Dpp\\Generator\\SyncGenerator" ) set_source_files_properties( "${CMAKE_CURRENT_SOURCE_DIR}/../include/dpp/cluster_sync_calls.h" PROPERTIES GENERATED TRUE ) + # target for unicode_emojis.h + execute_process( + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.." + COMMAND php buildtools/emoji.php + ) + set_source_files_properties( "${CMAKE_CURRENT_SOURCE_DIR}/../include/dpp/unicode_emojis.h" PROPERTIES GENERATED TRUE ) else() message("-- Autogeneration is not available") endif() From 5497415ae93ef2bbbf08637ca19da2dcb6205987 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Wed, 12 Jul 2023 16:10:48 +0000 Subject: [PATCH 076/101] fix name --- buildtools/emojis.php | 2 ++ include/dpp/unicode_emoji.h | 2 +- library/CMakeLists.txt | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/buildtools/emojis.php b/buildtools/emojis.php index f68be3624d..cb4038f01a 100644 --- a/buildtools/emojis.php +++ b/buildtools/emojis.php @@ -1,5 +1,7 @@ Date: Wed, 12 Jul 2023 16:34:25 +0000 Subject: [PATCH 077/101] better creation of unicode emojis that will actually work --- buildtools/emojis.php | 3 +- include/dpp/unicode_emoji.h | 10934 +++++++++++++++++----------------- 2 files changed, 5469 insertions(+), 5468 deletions(-) diff --git a/buildtools/emojis.php b/buildtools/emojis.php index cb4038f01a..65bcb2175b 100644 --- a/buildtools/emojis.php +++ b/buildtools/emojis.php @@ -4,13 +4,14 @@ $header = "#pragma once\n\nnamespace dpp { namespace unicode_emoji {\n"; +/* This JSON is generated originally via the NPM package maintained by Discord themselves at https://www.npmjs.com/package/discord-emoji */ $emojis = json_decode(file_get_contents("https://raw.githubusercontent.com/ArkinSolomon/discord-emoji-converter/master/emojis.json")); if ($emojis) { foreach ($emojis as $name=>$code) { if (preg_match("/^\d+/", $name)) { $name = "_" . $name; } - $header .= " constexpr std::string " .$name . "(\"$code\");\n"; + $header .= " constexpr const char[] " .$name . " = \"$code\";\n"; } $header .= "}\n};\n"; file_put_contents("include/dpp/unicode_emoji.h", $header); diff --git a/include/dpp/unicode_emoji.h b/include/dpp/unicode_emoji.h index 00b173164b..b09a5bfb30 100644 --- a/include/dpp/unicode_emoji.h +++ b/include/dpp/unicode_emoji.h @@ -1,5472 +1,5472 @@ #pragma once namespace dpp { namespace unicode_emoji { - constexpr std::string _100("💯"); - constexpr std::string _1234("🔢"); - constexpr std::string soccer("⚽"); - constexpr std::string basketball("🏀"); - constexpr std::string football("🏈"); - constexpr std::string baseball("⚾"); - constexpr std::string softball("🥎"); - constexpr std::string tennis("🎾"); - constexpr std::string volleyball("🏐"); - constexpr std::string rugby_football("🏉"); - constexpr std::string flying_disc("🥏"); - constexpr std::string _8ball("🎱"); - constexpr std::string yo_yo("🪀"); - constexpr std::string ping_pong("🏓"); - constexpr std::string table_tennis("🏓"); - constexpr std::string badminton("🏸"); - constexpr std::string hockey("🏒"); - constexpr std::string field_hockey("🏑"); - constexpr std::string lacrosse("🥍"); - constexpr std::string cricket_game("🏏"); - constexpr std::string cricket_bat_ball("🏏"); - constexpr std::string boomerang("🪃"); - constexpr std::string goal("🥅"); - constexpr std::string goal_net("🥅"); - constexpr std::string golf("⛳"); - constexpr std::string kite("🪁"); - constexpr std::string playground_slide("🛝"); - constexpr std::string bow_and_arrow("🏹"); - constexpr std::string archery("🏹"); - constexpr std::string fishing_pole_and_fish("🎣"); - constexpr std::string diving_mask("🤿"); - constexpr std::string boxing_glove("🥊"); - constexpr std::string boxing_gloves("🥊"); - constexpr std::string martial_arts_uniform("🥋"); - constexpr std::string karate_uniform("🥋"); - constexpr std::string running_shirt_with_sash("🎽"); - constexpr std::string skateboard("🛹"); - constexpr std::string roller_skate("🛼"); - constexpr std::string sled("🛷"); - constexpr std::string ice_skate("⛸️"); - constexpr std::string curling_stone("🥌"); - constexpr std::string ski("🎿"); - constexpr std::string skier("⛷️"); - constexpr std::string snowboarder("🏂"); - constexpr std::string snowboarder_tone1("🏂🏻"); - constexpr std::string snowboarder_light_skin_tone("🏂🏻"); - constexpr std::string snowboarder_tone2("🏂🏼"); - constexpr std::string snowboarder_medium_light_skin_tone("🏂🏼"); - constexpr std::string snowboarder_tone3("🏂🏽"); - constexpr std::string snowboarder_medium_skin_tone("🏂🏽"); - constexpr std::string snowboarder_tone4("🏂🏾"); - constexpr std::string snowboarder_medium_dark_skin_tone("🏂🏾"); - constexpr std::string snowboarder_tone5("🏂🏿"); - constexpr std::string snowboarder_dark_skin_tone("🏂🏿"); - constexpr std::string parachute("🪂"); - constexpr std::string person_lifting_weights("🏋️"); - constexpr std::string lifter("🏋️"); - constexpr std::string weight_lifter("🏋️"); - constexpr std::string person_lifting_weights_tone1("🏋🏻"); - constexpr std::string lifter_tone1("🏋🏻"); - constexpr std::string weight_lifter_tone1("🏋🏻"); - constexpr std::string person_lifting_weights_tone2("🏋🏼"); - constexpr std::string lifter_tone2("🏋🏼"); - constexpr std::string weight_lifter_tone2("🏋🏼"); - constexpr std::string person_lifting_weights_tone3("🏋🏽"); - constexpr std::string lifter_tone3("🏋🏽"); - constexpr std::string weight_lifter_tone3("🏋🏽"); - constexpr std::string person_lifting_weights_tone4("🏋🏾"); - constexpr std::string lifter_tone4("🏋🏾"); - constexpr std::string weight_lifter_tone4("🏋🏾"); - constexpr std::string person_lifting_weights_tone5("🏋🏿"); - constexpr std::string lifter_tone5("🏋🏿"); - constexpr std::string weight_lifter_tone5("🏋🏿"); - constexpr std::string woman_lifting_weights("🏋️‍♀️"); - constexpr std::string woman_lifting_weights_tone1("🏋🏻‍♀️"); - constexpr std::string woman_lifting_weights_light_skin_tone("🏋🏻‍♀️"); - constexpr std::string woman_lifting_weights_tone2("🏋🏼‍♀️"); - constexpr std::string woman_lifting_weights_medium_light_skin_tone("🏋🏼‍♀️"); - constexpr std::string woman_lifting_weights_tone3("🏋🏽‍♀️"); - constexpr std::string woman_lifting_weights_medium_skin_tone("🏋🏽‍♀️"); - constexpr std::string woman_lifting_weights_tone4("🏋🏾‍♀️"); - constexpr std::string woman_lifting_weights_medium_dark_skin_tone("🏋🏾‍♀️"); - constexpr std::string woman_lifting_weights_tone5("🏋🏿‍♀️"); - constexpr std::string woman_lifting_weights_dark_skin_tone("🏋🏿‍♀️"); - constexpr std::string man_lifting_weights("🏋️‍♂️"); - constexpr std::string man_lifting_weights_tone1("🏋🏻‍♂️"); - constexpr std::string man_lifting_weights_light_skin_tone("🏋🏻‍♂️"); - constexpr std::string man_lifting_weights_tone2("🏋🏼‍♂️"); - constexpr std::string man_lifting_weights_medium_light_skin_tone("🏋🏼‍♂️"); - constexpr std::string man_lifting_weights_tone3("🏋🏽‍♂️"); - constexpr std::string man_lifting_weights_medium_skin_tone("🏋🏽‍♂️"); - constexpr std::string man_lifting_weights_tone4("🏋🏾‍♂️"); - constexpr std::string man_lifting_weights_medium_dark_skin_tone("🏋🏾‍♂️"); - constexpr std::string man_lifting_weights_tone5("🏋🏿‍♂️"); - constexpr std::string man_lifting_weights_dark_skin_tone("🏋🏿‍♂️"); - constexpr std::string people_wrestling("🤼"); - constexpr std::string wrestlers("🤼"); - constexpr std::string wrestling("🤼"); - constexpr std::string women_wrestling("🤼‍♀️"); - constexpr std::string men_wrestling("🤼‍♂️"); - constexpr std::string person_doing_cartwheel("🤸"); - constexpr std::string cartwheel("🤸"); - constexpr std::string person_doing_cartwheel_tone1("🤸🏻"); - constexpr std::string cartwheel_tone1("🤸🏻"); - constexpr std::string person_doing_cartwheel_tone2("🤸🏼"); - constexpr std::string cartwheel_tone2("🤸🏼"); - constexpr std::string person_doing_cartwheel_tone3("🤸🏽"); - constexpr std::string cartwheel_tone3("🤸🏽"); - constexpr std::string person_doing_cartwheel_tone4("🤸🏾"); - constexpr std::string cartwheel_tone4("🤸🏾"); - constexpr std::string person_doing_cartwheel_tone5("🤸🏿"); - constexpr std::string cartwheel_tone5("🤸🏿"); - constexpr std::string woman_cartwheeling("🤸‍♀️"); - constexpr std::string woman_cartwheeling_tone1("🤸🏻‍♀️"); - constexpr std::string woman_cartwheeling_light_skin_tone("🤸🏻‍♀️"); - constexpr std::string woman_cartwheeling_tone2("🤸🏼‍♀️"); - constexpr std::string woman_cartwheeling_medium_light_skin_tone("🤸🏼‍♀️"); - constexpr std::string woman_cartwheeling_tone3("🤸🏽‍♀️"); - constexpr std::string woman_cartwheeling_medium_skin_tone("🤸🏽‍♀️"); - constexpr std::string woman_cartwheeling_tone4("🤸🏾‍♀️"); - constexpr std::string woman_cartwheeling_medium_dark_skin_tone("🤸🏾‍♀️"); - constexpr std::string woman_cartwheeling_tone5("🤸🏿‍♀️"); - constexpr std::string woman_cartwheeling_dark_skin_tone("🤸🏿‍♀️"); - constexpr std::string man_cartwheeling("🤸‍♂️"); - constexpr std::string man_cartwheeling_tone1("🤸🏻‍♂️"); - constexpr std::string man_cartwheeling_light_skin_tone("🤸🏻‍♂️"); - constexpr std::string man_cartwheeling_tone2("🤸🏼‍♂️"); - constexpr std::string man_cartwheeling_medium_light_skin_tone("🤸🏼‍♂️"); - constexpr std::string man_cartwheeling_tone3("🤸🏽‍♂️"); - constexpr std::string man_cartwheeling_medium_skin_tone("🤸🏽‍♂️"); - constexpr std::string man_cartwheeling_tone4("🤸🏾‍♂️"); - constexpr std::string man_cartwheeling_medium_dark_skin_tone("🤸🏾‍♂️"); - constexpr std::string man_cartwheeling_tone5("🤸🏿‍♂️"); - constexpr std::string man_cartwheeling_dark_skin_tone("🤸🏿‍♂️"); - constexpr std::string person_bouncing_ball("⛹️"); - constexpr std::string basketball_player("⛹️"); - constexpr std::string person_with_ball("⛹️"); - constexpr std::string person_bouncing_ball_tone1("⛹🏻"); - constexpr std::string basketball_player_tone1("⛹🏻"); - constexpr std::string person_with_ball_tone1("⛹🏻"); - constexpr std::string person_bouncing_ball_tone2("⛹🏼"); - constexpr std::string basketball_player_tone2("⛹🏼"); - constexpr std::string person_with_ball_tone2("⛹🏼"); - constexpr std::string person_bouncing_ball_tone3("⛹🏽"); - constexpr std::string basketball_player_tone3("⛹🏽"); - constexpr std::string person_with_ball_tone3("⛹🏽"); - constexpr std::string person_bouncing_ball_tone4("⛹🏾"); - constexpr std::string basketball_player_tone4("⛹🏾"); - constexpr std::string person_with_ball_tone4("⛹🏾"); - constexpr std::string person_bouncing_ball_tone5("⛹🏿"); - constexpr std::string basketball_player_tone5("⛹🏿"); - constexpr std::string person_with_ball_tone5("⛹🏿"); - constexpr std::string woman_bouncing_ball("⛹️‍♀️"); - constexpr std::string woman_bouncing_ball_tone1("⛹🏻‍♀️"); - constexpr std::string woman_bouncing_ball_light_skin_tone("⛹🏻‍♀️"); - constexpr std::string woman_bouncing_ball_tone2("⛹🏼‍♀️"); - constexpr std::string woman_bouncing_ball_medium_light_skin_tone("⛹🏼‍♀️"); - constexpr std::string woman_bouncing_ball_tone3("⛹🏽‍♀️"); - constexpr std::string woman_bouncing_ball_medium_skin_tone("⛹🏽‍♀️"); - constexpr std::string woman_bouncing_ball_tone4("⛹🏾‍♀️"); - constexpr std::string woman_bouncing_ball_medium_dark_skin_tone("⛹🏾‍♀️"); - constexpr std::string woman_bouncing_ball_tone5("⛹🏿‍♀️"); - constexpr std::string woman_bouncing_ball_dark_skin_tone("⛹🏿‍♀️"); - constexpr std::string man_bouncing_ball("⛹️‍♂️"); - constexpr std::string man_bouncing_ball_tone1("⛹🏻‍♂️"); - constexpr std::string man_bouncing_ball_light_skin_tone("⛹🏻‍♂️"); - constexpr std::string man_bouncing_ball_tone2("⛹🏼‍♂️"); - constexpr std::string man_bouncing_ball_medium_light_skin_tone("⛹🏼‍♂️"); - constexpr std::string man_bouncing_ball_tone3("⛹🏽‍♂️"); - constexpr std::string man_bouncing_ball_medium_skin_tone("⛹🏽‍♂️"); - constexpr std::string man_bouncing_ball_tone4("⛹🏾‍♂️"); - constexpr std::string man_bouncing_ball_medium_dark_skin_tone("⛹🏾‍♂️"); - constexpr std::string man_bouncing_ball_tone5("⛹🏿‍♂️"); - constexpr std::string man_bouncing_ball_dark_skin_tone("⛹🏿‍♂️"); - constexpr std::string person_fencing("🤺"); - constexpr std::string fencer("🤺"); - constexpr std::string fencing("🤺"); - constexpr std::string person_playing_handball("🤾"); - constexpr std::string handball("🤾"); - constexpr std::string person_playing_handball_tone1("🤾🏻"); - constexpr std::string handball_tone1("🤾🏻"); - constexpr std::string person_playing_handball_tone2("🤾🏼"); - constexpr std::string handball_tone2("🤾🏼"); - constexpr std::string person_playing_handball_tone3("🤾🏽"); - constexpr std::string handball_tone3("🤾🏽"); - constexpr std::string person_playing_handball_tone4("🤾🏾"); - constexpr std::string handball_tone4("🤾🏾"); - constexpr std::string person_playing_handball_tone5("🤾🏿"); - constexpr std::string handball_tone5("🤾🏿"); - constexpr std::string woman_playing_handball("🤾‍♀️"); - constexpr std::string woman_playing_handball_tone1("🤾🏻‍♀️"); - constexpr std::string woman_playing_handball_light_skin_tone("🤾🏻‍♀️"); - constexpr std::string woman_playing_handball_tone2("🤾🏼‍♀️"); - constexpr std::string woman_playing_handball_medium_light_skin_tone("🤾🏼‍♀️"); - constexpr std::string woman_playing_handball_tone3("🤾🏽‍♀️"); - constexpr std::string woman_playing_handball_medium_skin_tone("🤾🏽‍♀️"); - constexpr std::string woman_playing_handball_tone4("🤾🏾‍♀️"); - constexpr std::string woman_playing_handball_medium_dark_skin_tone("🤾🏾‍♀️"); - constexpr std::string woman_playing_handball_tone5("🤾🏿‍♀️"); - constexpr std::string woman_playing_handball_dark_skin_tone("🤾🏿‍♀️"); - constexpr std::string man_playing_handball("🤾‍♂️"); - constexpr std::string man_playing_handball_tone1("🤾🏻‍♂️"); - constexpr std::string man_playing_handball_light_skin_tone("🤾🏻‍♂️"); - constexpr std::string man_playing_handball_tone2("🤾🏼‍♂️"); - constexpr std::string man_playing_handball_medium_light_skin_tone("🤾🏼‍♂️"); - constexpr std::string man_playing_handball_tone3("🤾🏽‍♂️"); - constexpr std::string man_playing_handball_medium_skin_tone("🤾🏽‍♂️"); - constexpr std::string man_playing_handball_tone4("🤾🏾‍♂️"); - constexpr std::string man_playing_handball_medium_dark_skin_tone("🤾🏾‍♂️"); - constexpr std::string man_playing_handball_tone5("🤾🏿‍♂️"); - constexpr std::string man_playing_handball_dark_skin_tone("🤾🏿‍♂️"); - constexpr std::string person_golfing("🏌️"); - constexpr std::string golfer("🏌️"); - constexpr std::string person_golfing_tone1("🏌🏻"); - constexpr std::string person_golfing_light_skin_tone("🏌🏻"); - constexpr std::string person_golfing_tone2("🏌🏼"); - constexpr std::string person_golfing_medium_light_skin_tone("🏌🏼"); - constexpr std::string person_golfing_tone3("🏌🏽"); - constexpr std::string person_golfing_medium_skin_tone("🏌🏽"); - constexpr std::string person_golfing_tone4("🏌🏾"); - constexpr std::string person_golfing_medium_dark_skin_tone("🏌🏾"); - constexpr std::string person_golfing_tone5("🏌🏿"); - constexpr std::string person_golfing_dark_skin_tone("🏌🏿"); - constexpr std::string woman_golfing("🏌️‍♀️"); - constexpr std::string woman_golfing_tone1("🏌🏻‍♀️"); - constexpr std::string woman_golfing_light_skin_tone("🏌🏻‍♀️"); - constexpr std::string woman_golfing_tone2("🏌🏼‍♀️"); - constexpr std::string woman_golfing_medium_light_skin_tone("🏌🏼‍♀️"); - constexpr std::string woman_golfing_tone3("🏌🏽‍♀️"); - constexpr std::string woman_golfing_medium_skin_tone("🏌🏽‍♀️"); - constexpr std::string woman_golfing_tone4("🏌🏾‍♀️"); - constexpr std::string woman_golfing_medium_dark_skin_tone("🏌🏾‍♀️"); - constexpr std::string woman_golfing_tone5("🏌🏿‍♀️"); - constexpr std::string woman_golfing_dark_skin_tone("🏌🏿‍♀️"); - constexpr std::string man_golfing("🏌️‍♂️"); - constexpr std::string man_golfing_tone1("🏌🏻‍♂️"); - constexpr std::string man_golfing_light_skin_tone("🏌🏻‍♂️"); - constexpr std::string man_golfing_tone2("🏌🏼‍♂️"); - constexpr std::string man_golfing_medium_light_skin_tone("🏌🏼‍♂️"); - constexpr std::string man_golfing_tone3("🏌🏽‍♂️"); - constexpr std::string man_golfing_medium_skin_tone("🏌🏽‍♂️"); - constexpr std::string man_golfing_tone4("🏌🏾‍♂️"); - constexpr std::string man_golfing_medium_dark_skin_tone("🏌🏾‍♂️"); - constexpr std::string man_golfing_tone5("🏌🏿‍♂️"); - constexpr std::string man_golfing_dark_skin_tone("🏌🏿‍♂️"); - constexpr std::string horse_racing("🏇"); - constexpr std::string horse_racing_tone1("🏇🏻"); - constexpr std::string horse_racing_tone2("🏇🏼"); - constexpr std::string horse_racing_tone3("🏇🏽"); - constexpr std::string horse_racing_tone4("🏇🏾"); - constexpr std::string horse_racing_tone5("🏇🏿"); - constexpr std::string person_in_lotus_position("🧘"); - constexpr std::string person_in_lotus_position_tone1("🧘🏻"); - constexpr std::string person_in_lotus_position_light_skin_tone("🧘🏻"); - constexpr std::string person_in_lotus_position_tone2("🧘🏼"); - constexpr std::string person_in_lotus_position_medium_light_skin_tone("🧘🏼"); - constexpr std::string person_in_lotus_position_tone3("🧘🏽"); - constexpr std::string person_in_lotus_position_medium_skin_tone("🧘🏽"); - constexpr std::string person_in_lotus_position_tone4("🧘🏾"); - constexpr std::string person_in_lotus_position_medium_dark_skin_tone("🧘🏾"); - constexpr std::string person_in_lotus_position_tone5("🧘🏿"); - constexpr std::string person_in_lotus_position_dark_skin_tone("🧘🏿"); - constexpr std::string woman_in_lotus_position("🧘‍♀️"); - constexpr std::string woman_in_lotus_position_tone1("🧘🏻‍♀️"); - constexpr std::string woman_in_lotus_position_light_skin_tone("🧘🏻‍♀️"); - constexpr std::string woman_in_lotus_position_tone2("🧘🏼‍♀️"); - constexpr std::string woman_in_lotus_position_medium_light_skin_tone("🧘🏼‍♀️"); - constexpr std::string woman_in_lotus_position_tone3("🧘🏽‍♀️"); - constexpr std::string woman_in_lotus_position_medium_skin_tone("🧘🏽‍♀️"); - constexpr std::string woman_in_lotus_position_tone4("🧘🏾‍♀️"); - constexpr std::string woman_in_lotus_position_medium_dark_skin_tone("🧘🏾‍♀️"); - constexpr std::string woman_in_lotus_position_tone5("🧘🏿‍♀️"); - constexpr std::string woman_in_lotus_position_dark_skin_tone("🧘🏿‍♀️"); - constexpr std::string man_in_lotus_position("🧘‍♂️"); - constexpr std::string man_in_lotus_position_tone1("🧘🏻‍♂️"); - constexpr std::string man_in_lotus_position_light_skin_tone("🧘🏻‍♂️"); - constexpr std::string man_in_lotus_position_tone2("🧘🏼‍♂️"); - constexpr std::string man_in_lotus_position_medium_light_skin_tone("🧘🏼‍♂️"); - constexpr std::string man_in_lotus_position_tone3("🧘🏽‍♂️"); - constexpr std::string man_in_lotus_position_medium_skin_tone("🧘🏽‍♂️"); - constexpr std::string man_in_lotus_position_tone4("🧘🏾‍♂️"); - constexpr std::string man_in_lotus_position_medium_dark_skin_tone("🧘🏾‍♂️"); - constexpr std::string man_in_lotus_position_tone5("🧘🏿‍♂️"); - constexpr std::string man_in_lotus_position_dark_skin_tone("🧘🏿‍♂️"); - constexpr std::string person_surfing("🏄"); - constexpr std::string surfer("🏄"); - constexpr std::string person_surfing_tone1("🏄🏻"); - constexpr std::string surfer_tone1("🏄🏻"); - constexpr std::string person_surfing_tone2("🏄🏼"); - constexpr std::string surfer_tone2("🏄🏼"); - constexpr std::string person_surfing_tone3("🏄🏽"); - constexpr std::string surfer_tone3("🏄🏽"); - constexpr std::string person_surfing_tone4("🏄🏾"); - constexpr std::string surfer_tone4("🏄🏾"); - constexpr std::string person_surfing_tone5("🏄🏿"); - constexpr std::string surfer_tone5("🏄🏿"); - constexpr std::string woman_surfing("🏄‍♀️"); - constexpr std::string woman_surfing_tone1("🏄🏻‍♀️"); - constexpr std::string woman_surfing_light_skin_tone("🏄🏻‍♀️"); - constexpr std::string woman_surfing_tone2("🏄🏼‍♀️"); - constexpr std::string woman_surfing_medium_light_skin_tone("🏄🏼‍♀️"); - constexpr std::string woman_surfing_tone3("🏄🏽‍♀️"); - constexpr std::string woman_surfing_medium_skin_tone("🏄🏽‍♀️"); - constexpr std::string woman_surfing_tone4("🏄🏾‍♀️"); - constexpr std::string woman_surfing_medium_dark_skin_tone("🏄🏾‍♀️"); - constexpr std::string woman_surfing_tone5("🏄🏿‍♀️"); - constexpr std::string woman_surfing_dark_skin_tone("🏄🏿‍♀️"); - constexpr std::string man_surfing("🏄‍♂️"); - constexpr std::string man_surfing_tone1("🏄🏻‍♂️"); - constexpr std::string man_surfing_light_skin_tone("🏄🏻‍♂️"); - constexpr std::string man_surfing_tone2("🏄🏼‍♂️"); - constexpr std::string man_surfing_medium_light_skin_tone("🏄🏼‍♂️"); - constexpr std::string man_surfing_tone3("🏄🏽‍♂️"); - constexpr std::string man_surfing_medium_skin_tone("🏄🏽‍♂️"); - constexpr std::string man_surfing_tone4("🏄🏾‍♂️"); - constexpr std::string man_surfing_medium_dark_skin_tone("🏄🏾‍♂️"); - constexpr std::string man_surfing_tone5("🏄🏿‍♂️"); - constexpr std::string man_surfing_dark_skin_tone("🏄🏿‍♂️"); - constexpr std::string person_swimming("🏊"); - constexpr std::string swimmer("🏊"); - constexpr std::string person_swimming_tone1("🏊🏻"); - constexpr std::string swimmer_tone1("🏊🏻"); - constexpr std::string person_swimming_tone2("🏊🏼"); - constexpr std::string swimmer_tone2("🏊🏼"); - constexpr std::string person_swimming_tone3("🏊🏽"); - constexpr std::string swimmer_tone3("🏊🏽"); - constexpr std::string person_swimming_tone4("🏊🏾"); - constexpr std::string swimmer_tone4("🏊🏾"); - constexpr std::string person_swimming_tone5("🏊🏿"); - constexpr std::string swimmer_tone5("🏊🏿"); - constexpr std::string woman_swimming("🏊‍♀️"); - constexpr std::string woman_swimming_tone1("🏊🏻‍♀️"); - constexpr std::string woman_swimming_light_skin_tone("🏊🏻‍♀️"); - constexpr std::string woman_swimming_tone2("🏊🏼‍♀️"); - constexpr std::string woman_swimming_medium_light_skin_tone("🏊🏼‍♀️"); - constexpr std::string woman_swimming_tone3("🏊🏽‍♀️"); - constexpr std::string woman_swimming_medium_skin_tone("🏊🏽‍♀️"); - constexpr std::string woman_swimming_tone4("🏊🏾‍♀️"); - constexpr std::string woman_swimming_medium_dark_skin_tone("🏊🏾‍♀️"); - constexpr std::string woman_swimming_tone5("🏊🏿‍♀️"); - constexpr std::string woman_swimming_dark_skin_tone("🏊🏿‍♀️"); - constexpr std::string man_swimming("🏊‍♂️"); - constexpr std::string man_swimming_tone1("🏊🏻‍♂️"); - constexpr std::string man_swimming_light_skin_tone("🏊🏻‍♂️"); - constexpr std::string man_swimming_tone2("🏊🏼‍♂️"); - constexpr std::string man_swimming_medium_light_skin_tone("🏊🏼‍♂️"); - constexpr std::string man_swimming_tone3("🏊🏽‍♂️"); - constexpr std::string man_swimming_medium_skin_tone("🏊🏽‍♂️"); - constexpr std::string man_swimming_tone4("🏊🏾‍♂️"); - constexpr std::string man_swimming_medium_dark_skin_tone("🏊🏾‍♂️"); - constexpr std::string man_swimming_tone5("🏊🏿‍♂️"); - constexpr std::string man_swimming_dark_skin_tone("🏊🏿‍♂️"); - constexpr std::string person_playing_water_polo("🤽"); - constexpr std::string water_polo("🤽"); - constexpr std::string person_playing_water_polo_tone1("🤽🏻"); - constexpr std::string water_polo_tone1("🤽🏻"); - constexpr std::string person_playing_water_polo_tone2("🤽🏼"); - constexpr std::string water_polo_tone2("🤽🏼"); - constexpr std::string person_playing_water_polo_tone3("🤽🏽"); - constexpr std::string water_polo_tone3("🤽🏽"); - constexpr std::string person_playing_water_polo_tone4("🤽🏾"); - constexpr std::string water_polo_tone4("🤽🏾"); - constexpr std::string person_playing_water_polo_tone5("🤽🏿"); - constexpr std::string water_polo_tone5("🤽🏿"); - constexpr std::string woman_playing_water_polo("🤽‍♀️"); - constexpr std::string woman_playing_water_polo_tone1("🤽🏻‍♀️"); - constexpr std::string woman_playing_water_polo_light_skin_tone("🤽🏻‍♀️"); - constexpr std::string woman_playing_water_polo_tone2("🤽🏼‍♀️"); - constexpr std::string woman_playing_water_polo_medium_light_skin_tone("🤽🏼‍♀️"); - constexpr std::string woman_playing_water_polo_tone3("🤽🏽‍♀️"); - constexpr std::string woman_playing_water_polo_medium_skin_tone("🤽🏽‍♀️"); - constexpr std::string woman_playing_water_polo_tone4("🤽🏾‍♀️"); - constexpr std::string woman_playing_water_polo_medium_dark_skin_tone("🤽🏾‍♀️"); - constexpr std::string woman_playing_water_polo_tone5("🤽🏿‍♀️"); - constexpr std::string woman_playing_water_polo_dark_skin_tone("🤽🏿‍♀️"); - constexpr std::string man_playing_water_polo("🤽‍♂️"); - constexpr std::string man_playing_water_polo_tone1("🤽🏻‍♂️"); - constexpr std::string man_playing_water_polo_light_skin_tone("🤽🏻‍♂️"); - constexpr std::string man_playing_water_polo_tone2("🤽🏼‍♂️"); - constexpr std::string man_playing_water_polo_medium_light_skin_tone("🤽🏼‍♂️"); - constexpr std::string man_playing_water_polo_tone3("🤽🏽‍♂️"); - constexpr std::string man_playing_water_polo_medium_skin_tone("🤽🏽‍♂️"); - constexpr std::string man_playing_water_polo_tone4("🤽🏾‍♂️"); - constexpr std::string man_playing_water_polo_medium_dark_skin_tone("🤽🏾‍♂️"); - constexpr std::string man_playing_water_polo_tone5("🤽🏿‍♂️"); - constexpr std::string man_playing_water_polo_dark_skin_tone("🤽🏿‍♂️"); - constexpr std::string person_rowing_boat("🚣"); - constexpr std::string rowboat("🚣"); - constexpr std::string person_rowing_boat_tone1("🚣🏻"); - constexpr std::string rowboat_tone1("🚣🏻"); - constexpr std::string person_rowing_boat_tone2("🚣🏼"); - constexpr std::string rowboat_tone2("🚣🏼"); - constexpr std::string person_rowing_boat_tone3("🚣🏽"); - constexpr std::string rowboat_tone3("🚣🏽"); - constexpr std::string person_rowing_boat_tone4("🚣🏾"); - constexpr std::string rowboat_tone4("🚣🏾"); - constexpr std::string person_rowing_boat_tone5("🚣🏿"); - constexpr std::string rowboat_tone5("🚣🏿"); - constexpr std::string woman_rowing_boat("🚣‍♀️"); - constexpr std::string woman_rowing_boat_tone1("🚣🏻‍♀️"); - constexpr std::string woman_rowing_boat_light_skin_tone("🚣🏻‍♀️"); - constexpr std::string woman_rowing_boat_tone2("🚣🏼‍♀️"); - constexpr std::string woman_rowing_boat_medium_light_skin_tone("🚣🏼‍♀️"); - constexpr std::string woman_rowing_boat_tone3("🚣🏽‍♀️"); - constexpr std::string woman_rowing_boat_medium_skin_tone("🚣🏽‍♀️"); - constexpr std::string woman_rowing_boat_tone4("🚣🏾‍♀️"); - constexpr std::string woman_rowing_boat_medium_dark_skin_tone("🚣🏾‍♀️"); - constexpr std::string woman_rowing_boat_tone5("🚣🏿‍♀️"); - constexpr std::string woman_rowing_boat_dark_skin_tone("🚣🏿‍♀️"); - constexpr std::string man_rowing_boat("🚣‍♂️"); - constexpr std::string man_rowing_boat_tone1("🚣🏻‍♂️"); - constexpr std::string man_rowing_boat_light_skin_tone("🚣🏻‍♂️"); - constexpr std::string man_rowing_boat_tone2("🚣🏼‍♂️"); - constexpr std::string man_rowing_boat_medium_light_skin_tone("🚣🏼‍♂️"); - constexpr std::string man_rowing_boat_tone3("🚣🏽‍♂️"); - constexpr std::string man_rowing_boat_medium_skin_tone("🚣🏽‍♂️"); - constexpr std::string man_rowing_boat_tone4("🚣🏾‍♂️"); - constexpr std::string man_rowing_boat_medium_dark_skin_tone("🚣🏾‍♂️"); - constexpr std::string man_rowing_boat_tone5("🚣🏿‍♂️"); - constexpr std::string man_rowing_boat_dark_skin_tone("🚣🏿‍♂️"); - constexpr std::string person_climbing("🧗"); - constexpr std::string person_climbing_tone1("🧗🏻"); - constexpr std::string person_climbing_light_skin_tone("🧗🏻"); - constexpr std::string person_climbing_tone2("🧗🏼"); - constexpr std::string person_climbing_medium_light_skin_tone("🧗🏼"); - constexpr std::string person_climbing_tone3("🧗🏽"); - constexpr std::string person_climbing_medium_skin_tone("🧗🏽"); - constexpr std::string person_climbing_tone4("🧗🏾"); - constexpr std::string person_climbing_medium_dark_skin_tone("🧗🏾"); - constexpr std::string person_climbing_tone5("🧗🏿"); - constexpr std::string person_climbing_dark_skin_tone("🧗🏿"); - constexpr std::string woman_climbing("🧗‍♀️"); - constexpr std::string woman_climbing_tone1("🧗🏻‍♀️"); - constexpr std::string woman_climbing_light_skin_tone("🧗🏻‍♀️"); - constexpr std::string woman_climbing_tone2("🧗🏼‍♀️"); - constexpr std::string woman_climbing_medium_light_skin_tone("🧗🏼‍♀️"); - constexpr std::string woman_climbing_tone3("🧗🏽‍♀️"); - constexpr std::string woman_climbing_medium_skin_tone("🧗🏽‍♀️"); - constexpr std::string woman_climbing_tone4("🧗🏾‍♀️"); - constexpr std::string woman_climbing_medium_dark_skin_tone("🧗🏾‍♀️"); - constexpr std::string woman_climbing_tone5("🧗🏿‍♀️"); - constexpr std::string woman_climbing_dark_skin_tone("🧗🏿‍♀️"); - constexpr std::string man_climbing("🧗‍♂️"); - constexpr std::string man_climbing_tone1("🧗🏻‍♂️"); - constexpr std::string man_climbing_light_skin_tone("🧗🏻‍♂️"); - constexpr std::string man_climbing_tone2("🧗🏼‍♂️"); - constexpr std::string man_climbing_medium_light_skin_tone("🧗🏼‍♂️"); - constexpr std::string man_climbing_tone3("🧗🏽‍♂️"); - constexpr std::string man_climbing_medium_skin_tone("🧗🏽‍♂️"); - constexpr std::string man_climbing_tone4("🧗🏾‍♂️"); - constexpr std::string man_climbing_medium_dark_skin_tone("🧗🏾‍♂️"); - constexpr std::string man_climbing_tone5("🧗🏿‍♂️"); - constexpr std::string man_climbing_dark_skin_tone("🧗🏿‍♂️"); - constexpr std::string person_mountain_biking("🚵"); - constexpr std::string mountain_bicyclist("🚵"); - constexpr std::string person_mountain_biking_tone1("🚵🏻"); - constexpr std::string mountain_bicyclist_tone1("🚵🏻"); - constexpr std::string person_mountain_biking_tone2("🚵🏼"); - constexpr std::string mountain_bicyclist_tone2("🚵🏼"); - constexpr std::string person_mountain_biking_tone3("🚵🏽"); - constexpr std::string mountain_bicyclist_tone3("🚵🏽"); - constexpr std::string person_mountain_biking_tone4("🚵🏾"); - constexpr std::string mountain_bicyclist_tone4("🚵🏾"); - constexpr std::string person_mountain_biking_tone5("🚵🏿"); - constexpr std::string mountain_bicyclist_tone5("🚵🏿"); - constexpr std::string woman_mountain_biking("🚵‍♀️"); - constexpr std::string woman_mountain_biking_tone1("🚵🏻‍♀️"); - constexpr std::string woman_mountain_biking_light_skin_tone("🚵🏻‍♀️"); - constexpr std::string woman_mountain_biking_tone2("🚵🏼‍♀️"); - constexpr std::string woman_mountain_biking_medium_light_skin_tone("🚵🏼‍♀️"); - constexpr std::string woman_mountain_biking_tone3("🚵🏽‍♀️"); - constexpr std::string woman_mountain_biking_medium_skin_tone("🚵🏽‍♀️"); - constexpr std::string woman_mountain_biking_tone4("🚵🏾‍♀️"); - constexpr std::string woman_mountain_biking_medium_dark_skin_tone("🚵🏾‍♀️"); - constexpr std::string woman_mountain_biking_tone5("🚵🏿‍♀️"); - constexpr std::string woman_mountain_biking_dark_skin_tone("🚵🏿‍♀️"); - constexpr std::string man_mountain_biking("🚵‍♂️"); - constexpr std::string man_mountain_biking_tone1("🚵🏻‍♂️"); - constexpr std::string man_mountain_biking_light_skin_tone("🚵🏻‍♂️"); - constexpr std::string man_mountain_biking_tone2("🚵🏼‍♂️"); - constexpr std::string man_mountain_biking_medium_light_skin_tone("🚵🏼‍♂️"); - constexpr std::string man_mountain_biking_tone3("🚵🏽‍♂️"); - constexpr std::string man_mountain_biking_medium_skin_tone("🚵🏽‍♂️"); - constexpr std::string man_mountain_biking_tone4("🚵🏾‍♂️"); - constexpr std::string man_mountain_biking_medium_dark_skin_tone("🚵🏾‍♂️"); - constexpr std::string man_mountain_biking_tone5("🚵🏿‍♂️"); - constexpr std::string man_mountain_biking_dark_skin_tone("🚵🏿‍♂️"); - constexpr std::string person_biking("🚴"); - constexpr std::string bicyclist("🚴"); - constexpr std::string person_biking_tone1("🚴🏻"); - constexpr std::string bicyclist_tone1("🚴🏻"); - constexpr std::string person_biking_tone2("🚴🏼"); - constexpr std::string bicyclist_tone2("🚴🏼"); - constexpr std::string person_biking_tone3("🚴🏽"); - constexpr std::string bicyclist_tone3("🚴🏽"); - constexpr std::string person_biking_tone4("🚴🏾"); - constexpr std::string bicyclist_tone4("🚴🏾"); - constexpr std::string person_biking_tone5("🚴🏿"); - constexpr std::string bicyclist_tone5("🚴🏿"); - constexpr std::string woman_biking("🚴‍♀️"); - constexpr std::string woman_biking_tone1("🚴🏻‍♀️"); - constexpr std::string woman_biking_light_skin_tone("🚴🏻‍♀️"); - constexpr std::string woman_biking_tone2("🚴🏼‍♀️"); - constexpr std::string woman_biking_medium_light_skin_tone("🚴🏼‍♀️"); - constexpr std::string woman_biking_tone3("🚴🏽‍♀️"); - constexpr std::string woman_biking_medium_skin_tone("🚴🏽‍♀️"); - constexpr std::string woman_biking_tone4("🚴🏾‍♀️"); - constexpr std::string woman_biking_medium_dark_skin_tone("🚴🏾‍♀️"); - constexpr std::string woman_biking_tone5("🚴🏿‍♀️"); - constexpr std::string woman_biking_dark_skin_tone("🚴🏿‍♀️"); - constexpr std::string man_biking("🚴‍♂️"); - constexpr std::string man_biking_tone1("🚴🏻‍♂️"); - constexpr std::string man_biking_light_skin_tone("🚴🏻‍♂️"); - constexpr std::string man_biking_tone2("🚴🏼‍♂️"); - constexpr std::string man_biking_medium_light_skin_tone("🚴🏼‍♂️"); - constexpr std::string man_biking_tone3("🚴🏽‍♂️"); - constexpr std::string man_biking_medium_skin_tone("🚴🏽‍♂️"); - constexpr std::string man_biking_tone4("🚴🏾‍♂️"); - constexpr std::string man_biking_medium_dark_skin_tone("🚴🏾‍♂️"); - constexpr std::string man_biking_tone5("🚴🏿‍♂️"); - constexpr std::string man_biking_dark_skin_tone("🚴🏿‍♂️"); - constexpr std::string trophy("🏆"); - constexpr std::string first_place("🥇"); - constexpr std::string first_place_medal("🥇"); - constexpr std::string second_place("🥈"); - constexpr std::string second_place_medal("🥈"); - constexpr std::string third_place("🥉"); - constexpr std::string third_place_medal("🥉"); - constexpr std::string medal("🏅"); - constexpr std::string sports_medal("🏅"); - constexpr std::string military_medal("🎖️"); - constexpr std::string rosette("🏵️"); - constexpr std::string reminder_ribbon("🎗️"); - constexpr std::string ticket("🎫"); - constexpr std::string tickets("🎟️"); - constexpr std::string admission_tickets("🎟️"); - constexpr std::string circus_tent("🎪"); - constexpr std::string person_juggling("🤹"); - constexpr std::string juggling("🤹"); - constexpr std::string juggler("🤹"); - constexpr std::string person_juggling_tone1("🤹🏻"); - constexpr std::string juggling_tone1("🤹🏻"); - constexpr std::string juggler_tone1("🤹🏻"); - constexpr std::string person_juggling_tone2("🤹🏼"); - constexpr std::string juggling_tone2("🤹🏼"); - constexpr std::string juggler_tone2("🤹🏼"); - constexpr std::string person_juggling_tone3("🤹🏽"); - constexpr std::string juggling_tone3("🤹🏽"); - constexpr std::string juggler_tone3("🤹🏽"); - constexpr std::string person_juggling_tone4("🤹🏾"); - constexpr std::string juggling_tone4("🤹🏾"); - constexpr std::string juggler_tone4("🤹🏾"); - constexpr std::string person_juggling_tone5("🤹🏿"); - constexpr std::string juggling_tone5("🤹🏿"); - constexpr std::string juggler_tone5("🤹🏿"); - constexpr std::string woman_juggling("🤹‍♀️"); - constexpr std::string woman_juggling_tone1("🤹🏻‍♀️"); - constexpr std::string woman_juggling_light_skin_tone("🤹🏻‍♀️"); - constexpr std::string woman_juggling_tone2("🤹🏼‍♀️"); - constexpr std::string woman_juggling_medium_light_skin_tone("🤹🏼‍♀️"); - constexpr std::string woman_juggling_tone3("🤹🏽‍♀️"); - constexpr std::string woman_juggling_medium_skin_tone("🤹🏽‍♀️"); - constexpr std::string woman_juggling_tone4("🤹🏾‍♀️"); - constexpr std::string woman_juggling_medium_dark_skin_tone("🤹🏾‍♀️"); - constexpr std::string woman_juggling_tone5("🤹🏿‍♀️"); - constexpr std::string woman_juggling_dark_skin_tone("🤹🏿‍♀️"); - constexpr std::string man_juggling("🤹‍♂️"); - constexpr std::string man_juggling_tone1("🤹🏻‍♂️"); - constexpr std::string man_juggling_light_skin_tone("🤹🏻‍♂️"); - constexpr std::string man_juggling_tone2("🤹🏼‍♂️"); - constexpr std::string man_juggling_medium_light_skin_tone("🤹🏼‍♂️"); - constexpr std::string man_juggling_tone3("🤹🏽‍♂️"); - constexpr std::string man_juggling_medium_skin_tone("🤹🏽‍♂️"); - constexpr std::string man_juggling_tone4("🤹🏾‍♂️"); - constexpr std::string man_juggling_medium_dark_skin_tone("🤹🏾‍♂️"); - constexpr std::string man_juggling_tone5("🤹🏿‍♂️"); - constexpr std::string man_juggling_dark_skin_tone("🤹🏿‍♂️"); - constexpr std::string performing_arts("🎭"); - constexpr std::string ballet_shoes("🩰"); - constexpr std::string art("🎨"); - constexpr std::string clapper("🎬"); - constexpr std::string microphone("🎤"); - constexpr std::string headphones("🎧"); - constexpr std::string musical_score("🎼"); - constexpr std::string musical_keyboard("🎹"); - constexpr std::string drum("🥁"); - constexpr std::string drum_with_drumsticks("🥁"); - constexpr std::string long_drum("🪘"); - constexpr std::string saxophone("🎷"); - constexpr std::string trumpet("🎺"); - constexpr std::string accordion("🪗"); - constexpr std::string guitar("🎸"); - constexpr std::string banjo("🪕"); - constexpr std::string violin("🎻"); - constexpr std::string game_die("🎲"); - constexpr std::string chess_pawn("♟️"); - constexpr std::string dart("🎯"); - constexpr std::string bowling("🎳"); - constexpr std::string video_game("🎮"); - constexpr std::string slot_machine("🎰"); - constexpr std::string jigsaw("🧩"); - constexpr std::string flag_white("🏳️"); - constexpr std::string flag_black("🏴"); - constexpr std::string checkered_flag("🏁"); - constexpr std::string triangular_flag_on_post("🚩"); - constexpr std::string rainbow_flag("🏳️‍🌈"); - constexpr std::string gay_pride_flag("🏳️‍🌈"); - constexpr std::string transgender_flag("🏳️‍⚧️"); - constexpr std::string pirate_flag("🏴‍☠️"); - constexpr std::string flag_af("🇦🇫"); - constexpr std::string flag_ax("🇦🇽"); - constexpr std::string flag_al("🇦🇱"); - constexpr std::string flag_dz("🇩🇿"); - constexpr std::string flag_as("🇦🇸"); - constexpr std::string flag_ad("🇦🇩"); - constexpr std::string flag_ao("🇦🇴"); - constexpr std::string flag_ai("🇦🇮"); - constexpr std::string flag_aq("🇦🇶"); - constexpr std::string flag_ag("🇦🇬"); - constexpr std::string flag_ar("🇦🇷"); - constexpr std::string flag_am("🇦🇲"); - constexpr std::string flag_aw("🇦🇼"); - constexpr std::string flag_au("🇦🇺"); - constexpr std::string flag_at("🇦🇹"); - constexpr std::string flag_az("🇦🇿"); - constexpr std::string flag_bs("🇧🇸"); - constexpr std::string flag_bh("🇧🇭"); - constexpr std::string flag_bd("🇧🇩"); - constexpr std::string flag_bb("🇧🇧"); - constexpr std::string flag_by("🇧🇾"); - constexpr std::string flag_be("🇧🇪"); - constexpr std::string flag_bz("🇧🇿"); - constexpr std::string flag_bj("🇧🇯"); - constexpr std::string flag_bm("🇧🇲"); - constexpr std::string flag_bt("🇧🇹"); - constexpr std::string flag_bo("🇧🇴"); - constexpr std::string flag_ba("🇧🇦"); - constexpr std::string flag_bw("🇧🇼"); - constexpr std::string flag_br("🇧🇷"); - constexpr std::string flag_io("🇮🇴"); - constexpr std::string flag_vg("🇻🇬"); - constexpr std::string flag_bn("🇧🇳"); - constexpr std::string flag_bg("🇧🇬"); - constexpr std::string flag_bf("🇧🇫"); - constexpr std::string flag_bi("🇧🇮"); - constexpr std::string flag_kh("🇰🇭"); - constexpr std::string flag_cm("🇨🇲"); - constexpr std::string flag_ca("🇨🇦"); - constexpr std::string flag_ic("🇮🇨"); - constexpr std::string flag_cv("🇨🇻"); - constexpr std::string flag_bq("🇧🇶"); - constexpr std::string flag_ky("🇰🇾"); - constexpr std::string flag_cf("🇨🇫"); - constexpr std::string flag_td("🇹🇩"); - constexpr std::string flag_cl("🇨🇱"); - constexpr std::string flag_cn("🇨🇳"); - constexpr std::string flag_cx("🇨🇽"); - constexpr std::string flag_cc("🇨🇨"); - constexpr std::string flag_co("🇨🇴"); - constexpr std::string flag_km("🇰🇲"); - constexpr std::string flag_cg("🇨🇬"); - constexpr std::string flag_cd("🇨🇩"); - constexpr std::string flag_ck("🇨🇰"); - constexpr std::string flag_cr("🇨🇷"); - constexpr std::string flag_ci("🇨🇮"); - constexpr std::string flag_hr("🇭🇷"); - constexpr std::string flag_cu("🇨🇺"); - constexpr std::string flag_cw("🇨🇼"); - constexpr std::string flag_cy("🇨🇾"); - constexpr std::string flag_cz("🇨🇿"); - constexpr std::string flag_dk("🇩🇰"); - constexpr std::string flag_dj("🇩🇯"); - constexpr std::string flag_dm("🇩🇲"); - constexpr std::string flag_do("🇩🇴"); - constexpr std::string flag_ec("🇪🇨"); - constexpr std::string flag_eg("🇪🇬"); - constexpr std::string flag_sv("🇸🇻"); - constexpr std::string flag_gq("🇬🇶"); - constexpr std::string flag_er("🇪🇷"); - constexpr std::string flag_ee("🇪🇪"); - constexpr std::string flag_et("🇪🇹"); - constexpr std::string flag_eu("🇪🇺"); - constexpr std::string flag_fk("🇫🇰"); - constexpr std::string flag_fo("🇫🇴"); - constexpr std::string flag_fj("🇫🇯"); - constexpr std::string flag_fi("🇫🇮"); - constexpr std::string flag_fr("🇫🇷"); - constexpr std::string flag_gf("🇬🇫"); - constexpr std::string flag_pf("🇵🇫"); - constexpr std::string flag_tf("🇹🇫"); - constexpr std::string flag_ga("🇬🇦"); - constexpr std::string flag_gm("🇬🇲"); - constexpr std::string flag_ge("🇬🇪"); - constexpr std::string flag_de("🇩🇪"); - constexpr std::string flag_gh("🇬🇭"); - constexpr std::string flag_gi("🇬🇮"); - constexpr std::string flag_gr("🇬🇷"); - constexpr std::string flag_gl("🇬🇱"); - constexpr std::string flag_gd("🇬🇩"); - constexpr std::string flag_gp("🇬🇵"); - constexpr std::string flag_gu("🇬🇺"); - constexpr std::string flag_gt("🇬🇹"); - constexpr std::string flag_gg("🇬🇬"); - constexpr std::string flag_gn("🇬🇳"); - constexpr std::string flag_gw("🇬🇼"); - constexpr std::string flag_gy("🇬🇾"); - constexpr std::string flag_ht("🇭🇹"); - constexpr std::string flag_hn("🇭🇳"); - constexpr std::string flag_hk("🇭🇰"); - constexpr std::string flag_hu("🇭🇺"); - constexpr std::string flag_is("🇮🇸"); - constexpr std::string flag_in("🇮🇳"); - constexpr std::string flag_id("🇮🇩"); - constexpr std::string flag_ir("🇮🇷"); - constexpr std::string flag_iq("🇮🇶"); - constexpr std::string flag_ie("🇮🇪"); - constexpr std::string flag_im("🇮🇲"); - constexpr std::string flag_il("🇮🇱"); - constexpr std::string flag_it("🇮🇹"); - constexpr std::string flag_jm("🇯🇲"); - constexpr std::string flag_jp("🇯🇵"); - constexpr std::string crossed_flags("🎌"); - constexpr std::string flag_je("🇯🇪"); - constexpr std::string flag_jo("🇯🇴"); - constexpr std::string flag_kz("🇰🇿"); - constexpr std::string flag_ke("🇰🇪"); - constexpr std::string flag_ki("🇰🇮"); - constexpr std::string flag_xk("🇽🇰"); - constexpr std::string flag_kw("🇰🇼"); - constexpr std::string flag_kg("🇰🇬"); - constexpr std::string flag_la("🇱🇦"); - constexpr std::string flag_lv("🇱🇻"); - constexpr std::string flag_lb("🇱🇧"); - constexpr std::string flag_ls("🇱🇸"); - constexpr std::string flag_lr("🇱🇷"); - constexpr std::string flag_ly("🇱🇾"); - constexpr std::string flag_li("🇱🇮"); - constexpr std::string flag_lt("🇱🇹"); - constexpr std::string flag_lu("🇱🇺"); - constexpr std::string flag_mo("🇲🇴"); - constexpr std::string flag_mk("🇲🇰"); - constexpr std::string flag_mg("🇲🇬"); - constexpr std::string flag_mw("🇲🇼"); - constexpr std::string flag_my("🇲🇾"); - constexpr std::string flag_mv("🇲🇻"); - constexpr std::string flag_ml("🇲🇱"); - constexpr std::string flag_mt("🇲🇹"); - constexpr std::string flag_mh("🇲🇭"); - constexpr std::string flag_mq("🇲🇶"); - constexpr std::string flag_mr("🇲🇷"); - constexpr std::string flag_mu("🇲🇺"); - constexpr std::string flag_yt("🇾🇹"); - constexpr std::string flag_mx("🇲🇽"); - constexpr std::string flag_fm("🇫🇲"); - constexpr std::string flag_md("🇲🇩"); - constexpr std::string flag_mc("🇲🇨"); - constexpr std::string flag_mn("🇲🇳"); - constexpr std::string flag_me("🇲🇪"); - constexpr std::string flag_ms("🇲🇸"); - constexpr std::string flag_ma("🇲🇦"); - constexpr std::string flag_mz("🇲🇿"); - constexpr std::string flag_mm("🇲🇲"); - constexpr std::string flag_na("🇳🇦"); - constexpr std::string flag_nr("🇳🇷"); - constexpr std::string flag_np("🇳🇵"); - constexpr std::string flag_nl("🇳🇱"); - constexpr std::string flag_nc("🇳🇨"); - constexpr std::string flag_nz("🇳🇿"); - constexpr std::string flag_ni("🇳🇮"); - constexpr std::string flag_ne("🇳🇪"); - constexpr std::string flag_ng("🇳🇬"); - constexpr std::string flag_nu("🇳🇺"); - constexpr std::string flag_nf("🇳🇫"); - constexpr std::string flag_kp("🇰🇵"); - constexpr std::string flag_mp("🇲🇵"); - constexpr std::string flag_no("🇳🇴"); - constexpr std::string flag_om("🇴🇲"); - constexpr std::string flag_pk("🇵🇰"); - constexpr std::string flag_pw("🇵🇼"); - constexpr std::string flag_ps("🇵🇸"); - constexpr std::string flag_pa("🇵🇦"); - constexpr std::string flag_pg("🇵🇬"); - constexpr std::string flag_py("🇵🇾"); - constexpr std::string flag_pe("🇵🇪"); - constexpr std::string flag_ph("🇵🇭"); - constexpr std::string flag_pn("🇵🇳"); - constexpr std::string flag_pl("🇵🇱"); - constexpr std::string flag_pt("🇵🇹"); - constexpr std::string flag_pr("🇵🇷"); - constexpr std::string flag_qa("🇶🇦"); - constexpr std::string flag_re("🇷🇪"); - constexpr std::string flag_ro("🇷🇴"); - constexpr std::string flag_ru("🇷🇺"); - constexpr std::string flag_rw("🇷🇼"); - constexpr std::string flag_ws("🇼🇸"); - constexpr std::string flag_sm("🇸🇲"); - constexpr std::string flag_st("🇸🇹"); - constexpr std::string flag_sa("🇸🇦"); - constexpr std::string flag_sn("🇸🇳"); - constexpr std::string flag_rs("🇷🇸"); - constexpr std::string flag_sc("🇸🇨"); - constexpr std::string flag_sl("🇸🇱"); - constexpr std::string flag_sg("🇸🇬"); - constexpr std::string flag_sx("🇸🇽"); - constexpr std::string flag_sk("🇸🇰"); - constexpr std::string flag_si("🇸🇮"); - constexpr std::string flag_gs("🇬🇸"); - constexpr std::string flag_sb("🇸🇧"); - constexpr std::string flag_so("🇸🇴"); - constexpr std::string flag_za("🇿🇦"); - constexpr std::string flag_kr("🇰🇷"); - constexpr std::string flag_ss("🇸🇸"); - constexpr std::string flag_es("🇪🇸"); - constexpr std::string flag_lk("🇱🇰"); - constexpr std::string flag_bl("🇧🇱"); - constexpr std::string flag_sh("🇸🇭"); - constexpr std::string flag_kn("🇰🇳"); - constexpr std::string flag_lc("🇱🇨"); - constexpr std::string flag_pm("🇵🇲"); - constexpr std::string flag_vc("🇻🇨"); - constexpr std::string flag_sd("🇸🇩"); - constexpr std::string flag_sr("🇸🇷"); - constexpr std::string flag_sz("🇸🇿"); - constexpr std::string flag_se("🇸🇪"); - constexpr std::string flag_ch("🇨🇭"); - constexpr std::string flag_sy("🇸🇾"); - constexpr std::string flag_tw("🇹🇼"); - constexpr std::string flag_tj("🇹🇯"); - constexpr std::string flag_tz("🇹🇿"); - constexpr std::string flag_th("🇹🇭"); - constexpr std::string flag_tl("🇹🇱"); - constexpr std::string flag_tg("🇹🇬"); - constexpr std::string flag_tk("🇹🇰"); - constexpr std::string flag_to("🇹🇴"); - constexpr std::string flag_tt("🇹🇹"); - constexpr std::string flag_tn("🇹🇳"); - constexpr std::string flag_tr("🇹🇷"); - constexpr std::string flag_tm("🇹🇲"); - constexpr std::string flag_tc("🇹🇨"); - constexpr std::string flag_vi("🇻🇮"); - constexpr std::string flag_tv("🇹🇻"); - constexpr std::string flag_ug("🇺🇬"); - constexpr std::string flag_ua("🇺🇦"); - constexpr std::string flag_ae("🇦🇪"); - constexpr std::string flag_gb("🇬🇧"); - constexpr std::string england("🏴󠁧󠁢󠁥󠁮󠁧󠁿"); - constexpr std::string scotland("🏴󠁧󠁢󠁳󠁣󠁴󠁿"); - constexpr std::string wales("🏴󠁧󠁢󠁷󠁬󠁳󠁿"); - constexpr std::string flag_us("🇺🇸"); - constexpr std::string flag_uy("🇺🇾"); - constexpr std::string flag_uz("🇺🇿"); - constexpr std::string flag_vu("🇻🇺"); - constexpr std::string flag_va("🇻🇦"); - constexpr std::string flag_ve("🇻🇪"); - constexpr std::string flag_vn("🇻🇳"); - constexpr std::string flag_wf("🇼🇫"); - constexpr std::string flag_eh("🇪🇭"); - constexpr std::string flag_ye("🇾🇪"); - constexpr std::string flag_zm("🇿🇲"); - constexpr std::string flag_zw("🇿🇼"); - constexpr std::string flag_ac("🇦🇨"); - constexpr std::string flag_bv("🇧🇻"); - constexpr std::string flag_cp("🇨🇵"); - constexpr std::string flag_ea("🇪🇦"); - constexpr std::string flag_dg("🇩🇬"); - constexpr std::string flag_hm("🇭🇲"); - constexpr std::string flag_mf("🇲🇫"); - constexpr std::string flag_sj("🇸🇯"); - constexpr std::string flag_ta("🇹🇦"); - constexpr std::string flag_um("🇺🇲"); - constexpr std::string united_nations("🇺🇳"); - constexpr std::string green_apple("🍏"); - constexpr std::string apple("🍎"); - constexpr std::string pear("🍐"); - constexpr std::string tangerine("🍊"); - constexpr std::string lemon("🍋"); - constexpr std::string banana("🍌"); - constexpr std::string watermelon("🍉"); - constexpr std::string grapes("🍇"); - constexpr std::string blueberries("🫐"); - constexpr std::string strawberry("🍓"); - constexpr std::string melon("🍈"); - constexpr std::string cherries("🍒"); - constexpr std::string peach("🍑"); - constexpr std::string mango("🥭"); - constexpr std::string pineapple("🍍"); - constexpr std::string coconut("🥥"); - constexpr std::string kiwi("🥝"); - constexpr std::string kiwifruit("🥝"); - constexpr std::string tomato("🍅"); - constexpr std::string eggplant("🍆"); - constexpr std::string avocado("🥑"); - constexpr std::string olive("🫒"); - constexpr std::string broccoli("🥦"); - constexpr std::string leafy_green("🥬"); - constexpr std::string bell_pepper("🫑"); - constexpr std::string cucumber("🥒"); - constexpr std::string hot_pepper("🌶️"); - constexpr std::string corn("🌽"); - constexpr std::string carrot("🥕"); - constexpr std::string garlic("🧄"); - constexpr std::string onion("🧅"); - constexpr std::string potato("🥔"); - constexpr std::string sweet_potato("🍠"); - constexpr std::string croissant("🥐"); - constexpr std::string bagel("🥯"); - constexpr std::string bread("🍞"); - constexpr std::string french_bread("🥖"); - constexpr std::string baguette_bread("🥖"); - constexpr std::string flatbread("🫓"); - constexpr std::string pretzel("🥨"); - constexpr std::string cheese("🧀"); - constexpr std::string cheese_wedge("🧀"); - constexpr std::string egg("🥚"); - constexpr std::string cooking("🍳"); - constexpr std::string butter("🧈"); - constexpr std::string pancakes("🥞"); - constexpr std::string waffle("🧇"); - constexpr std::string bacon("🥓"); - constexpr std::string cut_of_meat("🥩"); - constexpr std::string poultry_leg("🍗"); - constexpr std::string meat_on_bone("🍖"); - constexpr std::string bone("🦴"); - constexpr std::string hotdog("🌭"); - constexpr std::string hot_dog("🌭"); - constexpr std::string hamburger("🍔"); - constexpr std::string fries("🍟"); - constexpr std::string pizza("🍕"); - constexpr std::string sandwich("🥪"); - constexpr std::string stuffed_flatbread("🥙"); - constexpr std::string stuffed_pita("🥙"); - constexpr std::string falafel("🧆"); - constexpr std::string taco("🌮"); - constexpr std::string burrito("🌯"); - constexpr std::string tamale("🫔"); - constexpr std::string salad("🥗"); - constexpr std::string green_salad("🥗"); - constexpr std::string shallow_pan_of_food("🥘"); - constexpr std::string paella("🥘"); - constexpr std::string fondue("🫕"); - constexpr std::string canned_food("🥫"); - constexpr std::string jar("🫙"); - constexpr std::string spaghetti("🍝"); - constexpr std::string ramen("🍜"); - constexpr std::string stew("🍲"); - constexpr std::string curry("🍛"); - constexpr std::string sushi("🍣"); - constexpr std::string bento("🍱"); - constexpr std::string dumpling("🥟"); - constexpr std::string oyster("🦪"); - constexpr std::string fried_shrimp("🍤"); - constexpr std::string rice_ball("🍙"); - constexpr std::string rice("🍚"); - constexpr std::string rice_cracker("🍘"); - constexpr std::string fish_cake("🍥"); - constexpr std::string fortune_cookie("🥠"); - constexpr std::string moon_cake("🥮"); - constexpr std::string oden("🍢"); - constexpr std::string dango("🍡"); - constexpr std::string shaved_ice("🍧"); - constexpr std::string ice_cream("🍨"); - constexpr std::string icecream("🍦"); - constexpr std::string pie("🥧"); - constexpr std::string cupcake("🧁"); - constexpr std::string cake("🍰"); - constexpr std::string birthday("🎂"); - constexpr std::string custard("🍮"); - constexpr std::string pudding("🍮"); - constexpr std::string flan("🍮"); - constexpr std::string lollipop("🍭"); - constexpr std::string candy("🍬"); - constexpr std::string chocolate_bar("🍫"); - constexpr std::string popcorn("🍿"); - constexpr std::string doughnut("🍩"); - constexpr std::string cookie("🍪"); - constexpr std::string chestnut("🌰"); - constexpr std::string peanuts("🥜"); - constexpr std::string shelled_peanut("🥜"); - constexpr std::string beans("🫘"); - constexpr std::string honey_pot("🍯"); - constexpr std::string milk("🥛"); - constexpr std::string glass_of_milk("🥛"); - constexpr std::string pouring_liquid("🫗"); - constexpr std::string baby_bottle("🍼"); - constexpr std::string teapot("🫖"); - constexpr std::string coffee("☕"); - constexpr std::string tea("🍵"); - constexpr std::string mate("🧉"); - constexpr std::string beverage_box("🧃"); - constexpr std::string cup_with_straw("🥤"); - constexpr std::string bubble_tea("🧋"); - constexpr std::string sake("🍶"); - constexpr std::string beer("🍺"); - constexpr std::string beers("🍻"); - constexpr std::string champagne_glass("🥂"); - constexpr std::string clinking_glass("🥂"); - constexpr std::string wine_glass("🍷"); - constexpr std::string tumbler_glass("🥃"); - constexpr std::string whisky("🥃"); - constexpr std::string cocktail("🍸"); - constexpr std::string tropical_drink("🍹"); - constexpr std::string champagne("🍾"); - constexpr std::string bottle_with_popping_cork("🍾"); - constexpr std::string ice_cube("🧊"); - constexpr std::string spoon("🥄"); - constexpr std::string fork_and_knife("🍴"); - constexpr std::string fork_knife_plate("🍽️"); - constexpr std::string fork_and_knife_with_plate("🍽️"); - constexpr std::string bowl_with_spoon("🥣"); - constexpr std::string takeout_box("🥡"); - constexpr std::string chopsticks("🥢"); - constexpr std::string salt("🧂"); - constexpr std::string dog("🐶"); - constexpr std::string cat("🐱"); - constexpr std::string mouse("🐭"); - constexpr std::string hamster("🐹"); - constexpr std::string rabbit("🐰"); - constexpr std::string fox("🦊"); - constexpr std::string fox_face("🦊"); - constexpr std::string bear("🐻"); - constexpr std::string panda_face("🐼"); - constexpr std::string polar_bear("🐻‍❄️"); - constexpr std::string koala("🐨"); - constexpr std::string tiger("🐯"); - constexpr std::string lion_face("🦁"); - constexpr std::string lion("🦁"); - constexpr std::string cow("🐮"); - constexpr std::string pig("🐷"); - constexpr std::string pig_nose("🐽"); - constexpr std::string frog("🐸"); - constexpr std::string monkey_face("🐵"); - constexpr std::string see_no_evil("🙈"); - constexpr std::string hear_no_evil("🙉"); - constexpr std::string speak_no_evil("🙊"); - constexpr std::string monkey("🐒"); - constexpr std::string chicken("🐔"); - constexpr std::string penguin("🐧"); - constexpr std::string bird("🐦"); - constexpr std::string baby_chick("🐤"); - constexpr std::string hatching_chick("🐣"); - constexpr std::string hatched_chick("🐥"); - constexpr std::string duck("🦆"); - constexpr std::string eagle("🦅"); - constexpr std::string owl("🦉"); - constexpr std::string bat("🦇"); - constexpr std::string wolf("🐺"); - constexpr std::string boar("🐗"); - constexpr std::string horse("🐴"); - constexpr std::string unicorn("🦄"); - constexpr std::string unicorn_face("🦄"); - constexpr std::string bee("🐝"); - constexpr std::string bug("🐛"); - constexpr std::string butterfly("🦋"); - constexpr std::string snail("🐌"); - constexpr std::string worm("🪱"); - constexpr std::string lady_beetle("🐞"); - constexpr std::string ant("🐜"); - constexpr std::string fly("🪰"); - constexpr std::string mosquito("🦟"); - constexpr std::string cockroach("🪳"); - constexpr std::string beetle("🪲"); - constexpr std::string cricket("🦗"); - constexpr std::string spider("🕷️"); - constexpr std::string spider_web("🕸️"); - constexpr std::string scorpion("🦂"); - constexpr std::string turtle("🐢"); - constexpr std::string snake("🐍"); - constexpr std::string lizard("🦎"); - constexpr std::string t_rex("🦖"); - constexpr std::string sauropod("🦕"); - constexpr std::string octopus("🐙"); - constexpr std::string squid("🦑"); - constexpr std::string shrimp("🦐"); - constexpr std::string lobster("🦞"); - constexpr std::string crab("🦀"); - constexpr std::string blowfish("🐡"); - constexpr std::string tropical_fish("🐠"); - constexpr std::string fish("🐟"); - constexpr std::string seal("🦭"); - constexpr std::string dolphin("🐬"); - constexpr std::string whale("🐳"); - constexpr std::string whale2("🐋"); - constexpr std::string shark("🦈"); - constexpr std::string crocodile("🐊"); - constexpr std::string tiger2("🐅"); - constexpr std::string leopard("🐆"); - constexpr std::string zebra("🦓"); - constexpr std::string gorilla("🦍"); - constexpr std::string orangutan("🦧"); - constexpr std::string elephant("🐘"); - constexpr std::string mammoth("🦣"); - constexpr std::string bison("🦬"); - constexpr std::string hippopotamus("🦛"); - constexpr std::string rhino("🦏"); - constexpr std::string rhinoceros("🦏"); - constexpr std::string dromedary_camel("🐪"); - constexpr std::string camel("🐫"); - constexpr std::string giraffe("🦒"); - constexpr std::string kangaroo("🦘"); - constexpr std::string water_buffalo("🐃"); - constexpr std::string ox("🐂"); - constexpr std::string cow2("🐄"); - constexpr std::string racehorse("🐎"); - constexpr std::string pig2("🐖"); - constexpr std::string ram("🐏"); - constexpr std::string sheep("🐑"); - constexpr std::string llama("🦙"); - constexpr std::string goat("🐐"); - constexpr std::string deer("🦌"); - constexpr std::string dog2("🐕"); - constexpr std::string poodle("🐩"); - constexpr std::string guide_dog("🦮"); - constexpr std::string service_dog("🐕‍🦺"); - constexpr std::string cat2("🐈"); - constexpr std::string black_cat("🐈‍⬛"); - constexpr std::string feather("🪶"); - constexpr std::string rooster("🐓"); - constexpr std::string turkey("🦃"); - constexpr std::string dodo("🦤"); - constexpr std::string peacock("🦚"); - constexpr std::string parrot("🦜"); - constexpr std::string swan("🦢"); - constexpr std::string flamingo("🦩"); - constexpr std::string dove("🕊️"); - constexpr std::string dove_of_peace("🕊️"); - constexpr std::string rabbit2("🐇"); - constexpr std::string raccoon("🦝"); - constexpr std::string skunk("🦨"); - constexpr std::string badger("🦡"); - constexpr std::string beaver("🦫"); - constexpr std::string otter("🦦"); - constexpr std::string sloth("🦥"); - constexpr std::string mouse2("🐁"); - constexpr std::string rat("🐀"); - constexpr std::string chipmunk("🐿️"); - constexpr std::string hedgehog("🦔"); - constexpr std::string feet("🐾"); - constexpr std::string paw_prints("🐾"); - constexpr std::string dragon("🐉"); - constexpr std::string dragon_face("🐲"); - constexpr std::string cactus("🌵"); - constexpr std::string christmas_tree("🎄"); - constexpr std::string evergreen_tree("🌲"); - constexpr std::string deciduous_tree("🌳"); - constexpr std::string palm_tree("🌴"); - constexpr std::string seedling("🌱"); - constexpr std::string herb("🌿"); - constexpr std::string shamrock("☘️"); - constexpr std::string four_leaf_clover("🍀"); - constexpr std::string bamboo("🎍"); - constexpr std::string tanabata_tree("🎋"); - constexpr std::string leaves("🍃"); - constexpr std::string fallen_leaf("🍂"); - constexpr std::string maple_leaf("🍁"); - constexpr std::string empty_nest("🪹"); - constexpr std::string nest_with_eggs("🪺"); - constexpr std::string mushroom("🍄"); - constexpr std::string shell("🐚"); - constexpr std::string coral("🪸"); - constexpr std::string rock("🪨"); - constexpr std::string wood("🪵"); - constexpr std::string ear_of_rice("🌾"); - constexpr std::string potted_plant("🪴"); - constexpr std::string bouquet("💐"); - constexpr std::string tulip("🌷"); - constexpr std::string rose("🌹"); - constexpr std::string wilted_rose("🥀"); - constexpr std::string wilted_flower("🥀"); - constexpr std::string lotus("🪷"); - constexpr std::string hibiscus("🌺"); - constexpr std::string cherry_blossom("🌸"); - constexpr std::string blossom("🌼"); - constexpr std::string sunflower("🌻"); - constexpr std::string sun_with_face("🌞"); - constexpr std::string full_moon_with_face("🌝"); - constexpr std::string first_quarter_moon_with_face("🌛"); - constexpr std::string last_quarter_moon_with_face("🌜"); - constexpr std::string new_moon_with_face("🌚"); - constexpr std::string full_moon("🌕"); - constexpr std::string waning_gibbous_moon("🌖"); - constexpr std::string last_quarter_moon("🌗"); - constexpr std::string waning_crescent_moon("🌘"); - constexpr std::string new_moon("🌑"); - constexpr std::string waxing_crescent_moon("🌒"); - constexpr std::string first_quarter_moon("🌓"); - constexpr std::string waxing_gibbous_moon("🌔"); - constexpr std::string crescent_moon("🌙"); - constexpr std::string earth_americas("🌎"); - constexpr std::string earth_africa("🌍"); - constexpr std::string earth_asia("🌏"); - constexpr std::string ringed_planet("🪐"); - constexpr std::string dizzy("💫"); - constexpr std::string star("⭐"); - constexpr std::string star2("🌟"); - constexpr std::string sparkles("✨"); - constexpr std::string zap("⚡"); - constexpr std::string comet("☄️"); - constexpr std::string boom("💥"); - constexpr std::string fire("🔥"); - constexpr std::string flame("🔥"); - constexpr std::string cloud_tornado("🌪️"); - constexpr std::string cloud_with_tornado("🌪️"); - constexpr std::string rainbow("🌈"); - constexpr std::string sunny("☀️"); - constexpr std::string white_sun_small_cloud("🌤️"); - constexpr std::string white_sun_with_small_cloud("🌤️"); - constexpr std::string partly_sunny("⛅"); - constexpr std::string white_sun_cloud("🌥️"); - constexpr std::string white_sun_behind_cloud("🌥️"); - constexpr std::string cloud("☁️"); - constexpr std::string white_sun_rain_cloud("🌦️"); - constexpr std::string white_sun_behind_cloud_with_rain("🌦️"); - constexpr std::string cloud_rain("🌧️"); - constexpr std::string cloud_with_rain("🌧️"); - constexpr std::string thunder_cloud_rain("⛈️"); - constexpr std::string thunder_cloud_and_rain("⛈️"); - constexpr std::string cloud_lightning("🌩️"); - constexpr std::string cloud_with_lightning("🌩️"); - constexpr std::string cloud_snow("🌨️"); - constexpr std::string cloud_with_snow("🌨️"); - constexpr std::string snowflake("❄️"); - constexpr std::string snowman2("☃️"); - constexpr std::string snowman("⛄"); - constexpr std::string wind_blowing_face("🌬️"); - constexpr std::string dash("💨"); - constexpr std::string droplet("💧"); - constexpr std::string sweat_drops("💦"); - constexpr std::string bubbles("🫧"); - constexpr std::string umbrella("☔"); - constexpr std::string umbrella2("☂️"); - constexpr std::string ocean("🌊"); - constexpr std::string fog("🌫️"); - constexpr std::string watch("⌚"); - constexpr std::string mobile_phone("📱"); - constexpr std::string iphone("📱"); - constexpr std::string calling("📲"); - constexpr std::string computer("💻"); - constexpr std::string keyboard("⌨️"); - constexpr std::string desktop("🖥️"); - constexpr std::string desktop_computer("🖥️"); - constexpr std::string printer("🖨️"); - constexpr std::string mouse_three_button("🖱️"); - constexpr std::string three_button_mouse("🖱️"); - constexpr std::string trackball("🖲️"); - constexpr std::string joystick("🕹️"); - constexpr std::string compression("🗜️"); - constexpr std::string minidisc("💽"); - constexpr std::string floppy_disk("💾"); - constexpr std::string cd("💿"); - constexpr std::string dvd("📀"); - constexpr std::string vhs("📼"); - constexpr std::string camera("📷"); - constexpr std::string camera_with_flash("📸"); - constexpr std::string video_camera("📹"); - constexpr std::string movie_camera("🎥"); - constexpr std::string projector("📽️"); - constexpr std::string film_projector("📽️"); - constexpr std::string film_frames("🎞️"); - constexpr std::string telephone_receiver("📞"); - constexpr std::string telephone("☎️"); - constexpr std::string pager("📟"); - constexpr std::string fax("📠"); - constexpr std::string tv("📺"); - constexpr std::string radio("📻"); - constexpr std::string microphone2("🎙️"); - constexpr std::string studio_microphone("🎙️"); - constexpr std::string level_slider("🎚️"); - constexpr std::string control_knobs("🎛️"); - constexpr std::string compass("🧭"); - constexpr std::string stopwatch("⏱️"); - constexpr std::string timer("⏲️"); - constexpr std::string timer_clock("⏲️"); - constexpr std::string alarm_clock("⏰"); - constexpr std::string clock("🕰️"); - constexpr std::string mantlepiece_clock("🕰️"); - constexpr std::string hourglass("⌛"); - constexpr std::string hourglass_flowing_sand("⏳"); - constexpr std::string satellite("📡"); - constexpr std::string battery("🔋"); - constexpr std::string low_battery("🪫"); - constexpr std::string electric_plug("🔌"); - constexpr std::string bulb("💡"); - constexpr std::string flashlight("🔦"); - constexpr std::string candle("🕯️"); - constexpr std::string diya_lamp("🪔"); - constexpr std::string fire_extinguisher("🧯"); - constexpr std::string oil("🛢️"); - constexpr std::string oil_drum("🛢️"); - constexpr std::string money_with_wings("💸"); - constexpr std::string dollar("💵"); - constexpr std::string yen("💴"); - constexpr std::string euro("💶"); - constexpr std::string pound("💷"); - constexpr std::string coin("🪙"); - constexpr std::string moneybag("💰"); - constexpr std::string credit_card("💳"); - constexpr std::string identification_card("🪪"); - constexpr std::string gem("💎"); - constexpr std::string scales("⚖️"); - constexpr std::string ladder("🪜"); - constexpr std::string toolbox("🧰"); - constexpr std::string screwdriver("🪛"); - constexpr std::string wrench("🔧"); - constexpr std::string hammer("🔨"); - constexpr std::string hammer_pick("⚒️"); - constexpr std::string hammer_and_pick("⚒️"); - constexpr std::string tools("🛠️"); - constexpr std::string hammer_and_wrench("🛠️"); - constexpr std::string pick("⛏️"); - constexpr std::string carpentry_saw("🪚"); - constexpr std::string nut_and_bolt("🔩"); - constexpr std::string gear("⚙️"); - constexpr std::string mouse_trap("🪤"); - constexpr std::string bricks("🧱"); - constexpr std::string chains("⛓️"); - constexpr std::string magnet("🧲"); - constexpr std::string gun("🔫"); - constexpr std::string bomb("💣"); - constexpr std::string firecracker("🧨"); - constexpr std::string axe("🪓"); - constexpr std::string knife("🔪"); - constexpr std::string dagger("🗡️"); - constexpr std::string dagger_knife("🗡️"); - constexpr std::string crossed_swords("⚔️"); - constexpr std::string shield("🛡️"); - constexpr std::string smoking("🚬"); - constexpr std::string coffin("⚰️"); - constexpr std::string headstone("🪦"); - constexpr std::string urn("⚱️"); - constexpr std::string funeral_urn("⚱️"); - constexpr std::string amphora("🏺"); - constexpr std::string crystal_ball("🔮"); - constexpr std::string prayer_beads("📿"); - constexpr std::string nazar_amulet("🧿"); - constexpr std::string hamsa("🪬"); - constexpr std::string barber("💈"); - constexpr std::string alembic("⚗️"); - constexpr std::string telescope("🔭"); - constexpr std::string microscope("🔬"); - constexpr std::string hole("🕳️"); - constexpr std::string x_ray("🩻"); - constexpr std::string adhesive_bandage("🩹"); - constexpr std::string stethoscope("🩺"); - constexpr std::string pill("💊"); - constexpr std::string syringe("💉"); - constexpr std::string drop_of_blood("🩸"); - constexpr std::string dna("🧬"); - constexpr std::string microbe("🦠"); - constexpr std::string petri_dish("🧫"); - constexpr std::string test_tube("🧪"); - constexpr std::string thermometer("🌡️"); - constexpr std::string broom("🧹"); - constexpr std::string plunger("🪠"); - constexpr std::string basket("🧺"); - constexpr std::string roll_of_paper("🧻"); - constexpr std::string toilet("🚽"); - constexpr std::string potable_water("🚰"); - constexpr std::string shower("🚿"); - constexpr std::string bathtub("🛁"); - constexpr std::string bath("🛀"); - constexpr std::string bath_tone1("🛀🏻"); - constexpr std::string bath_tone2("🛀🏼"); - constexpr std::string bath_tone3("🛀🏽"); - constexpr std::string bath_tone4("🛀🏾"); - constexpr std::string bath_tone5("🛀🏿"); - constexpr std::string soap("🧼"); - constexpr std::string toothbrush("🪥"); - constexpr std::string razor("🪒"); - constexpr std::string sponge("🧽"); - constexpr std::string bucket("🪣"); - constexpr std::string squeeze_bottle("🧴"); - constexpr std::string bellhop("🛎️"); - constexpr std::string bellhop_bell("🛎️"); - constexpr std::string key("🔑"); - constexpr std::string key2("🗝️"); - constexpr std::string old_key("🗝️"); - constexpr std::string door("🚪"); - constexpr std::string chair("🪑"); - constexpr std::string couch("🛋️"); - constexpr std::string couch_and_lamp("🛋️"); - constexpr std::string bed("🛏️"); - constexpr std::string sleeping_accommodation("🛌"); - constexpr std::string person_in_bed_tone1("🛌🏻"); - constexpr std::string person_in_bed_light_skin_tone("🛌🏻"); - constexpr std::string person_in_bed_tone2("🛌🏼"); - constexpr std::string person_in_bed_medium_light_skin_tone("🛌🏼"); - constexpr std::string person_in_bed_tone3("🛌🏽"); - constexpr std::string person_in_bed_medium_skin_tone("🛌🏽"); - constexpr std::string person_in_bed_tone4("🛌🏾"); - constexpr std::string person_in_bed_medium_dark_skin_tone("🛌🏾"); - constexpr std::string person_in_bed_tone5("🛌🏿"); - constexpr std::string person_in_bed_dark_skin_tone("🛌🏿"); - constexpr std::string teddy_bear("🧸"); - constexpr std::string nesting_dolls("🪆"); - constexpr std::string frame_photo("🖼️"); - constexpr std::string frame_with_picture("🖼️"); - constexpr std::string mirror("🪞"); - constexpr std::string window("🪟"); - constexpr std::string shopping_bags("🛍️"); - constexpr std::string shopping_cart("🛒"); - constexpr std::string shopping_trolley("🛒"); - constexpr std::string gift("🎁"); - constexpr std::string balloon("🎈"); - constexpr std::string flags("🎏"); - constexpr std::string ribbon("🎀"); - constexpr std::string magic_wand("🪄"); - constexpr std::string piñata("🪅"); - constexpr std::string confetti_ball("🎊"); - constexpr std::string tada("🎉"); - constexpr std::string dolls("🎎"); - constexpr std::string izakaya_lantern("🏮"); - constexpr std::string wind_chime("🎐"); - constexpr std::string mirror_ball("🪩"); - constexpr std::string red_envelope("🧧"); - constexpr std::string envelope("✉️"); - constexpr std::string envelope_with_arrow("📩"); - constexpr std::string incoming_envelope("📨"); - constexpr std::string e_mail("📧"); - constexpr std::string email("📧"); - constexpr std::string love_letter("💌"); - constexpr std::string inbox_tray("📥"); - constexpr std::string outbox_tray("📤"); - constexpr std::string package("📦"); - constexpr std::string label("🏷️"); - constexpr std::string placard("🪧"); - constexpr std::string mailbox_closed("📪"); - constexpr std::string mailbox("📫"); - constexpr std::string mailbox_with_mail("📬"); - constexpr std::string mailbox_with_no_mail("📭"); - constexpr std::string postbox("📮"); - constexpr std::string postal_horn("📯"); - constexpr std::string scroll("📜"); - constexpr std::string page_with_curl("📃"); - constexpr std::string page_facing_up("📄"); - constexpr std::string bookmark_tabs("📑"); - constexpr std::string receipt("🧾"); - constexpr std::string bar_chart("📊"); - constexpr std::string chart_with_upwards_trend("📈"); - constexpr std::string chart_with_downwards_trend("📉"); - constexpr std::string notepad_spiral("🗒️"); - constexpr std::string spiral_note_pad("🗒️"); - constexpr std::string calendar_spiral("🗓️"); - constexpr std::string spiral_calendar_pad("🗓️"); - constexpr std::string calendar("📆"); - constexpr std::string date("📅"); - constexpr std::string wastebasket("🗑️"); - constexpr std::string card_index("📇"); - constexpr std::string card_box("🗃️"); - constexpr std::string card_file_box("🗃️"); - constexpr std::string ballot_box("🗳️"); - constexpr std::string ballot_box_with_ballot("🗳️"); - constexpr std::string file_cabinet("🗄️"); - constexpr std::string clipboard("📋"); - constexpr std::string file_folder("📁"); - constexpr std::string open_file_folder("📂"); - constexpr std::string dividers("🗂️"); - constexpr std::string card_index_dividers("🗂️"); - constexpr std::string newspaper2("🗞️"); - constexpr std::string rolled_up_newspaper("🗞️"); - constexpr std::string newspaper("📰"); - constexpr std::string notebook("📓"); - constexpr std::string notebook_with_decorative_cover("📔"); - constexpr std::string ledger("📒"); - constexpr std::string closed_book("📕"); - constexpr std::string green_book("📗"); - constexpr std::string blue_book("📘"); - constexpr std::string orange_book("📙"); - constexpr std::string books("📚"); - constexpr std::string book("📖"); - constexpr std::string bookmark("🔖"); - constexpr std::string safety_pin("🧷"); - constexpr std::string link("🔗"); - constexpr std::string paperclip("📎"); - constexpr std::string paperclips("🖇️"); - constexpr std::string linked_paperclips("🖇️"); - constexpr std::string triangular_ruler("📐"); - constexpr std::string straight_ruler("📏"); - constexpr std::string abacus("🧮"); - constexpr std::string pushpin("📌"); - constexpr std::string round_pushpin("📍"); - constexpr std::string scissors("✂️"); - constexpr std::string pen_ballpoint("🖊️"); - constexpr std::string lower_left_ballpoint_pen("🖊️"); - constexpr std::string pen_fountain("🖋️"); - constexpr std::string lower_left_fountain_pen("🖋️"); - constexpr std::string black_nib("✒️"); - constexpr std::string paintbrush("🖌️"); - constexpr std::string lower_left_paintbrush("🖌️"); - constexpr std::string crayon("🖍️"); - constexpr std::string lower_left_crayon("🖍️"); - constexpr std::string pencil("📝"); - constexpr std::string memo("📝"); - constexpr std::string pencil2("✏️"); - constexpr std::string mag("🔍"); - constexpr std::string mag_right("🔎"); - constexpr std::string lock_with_ink_pen("🔏"); - constexpr std::string closed_lock_with_key("🔐"); - constexpr std::string lock("🔒"); - constexpr std::string unlock("🔓"); - constexpr std::string grinning("😀"); - constexpr std::string smiley("😃"); - constexpr std::string smile("😄"); - constexpr std::string grin("😁"); - constexpr std::string laughing("😆"); - constexpr std::string satisfied("😆"); - constexpr std::string face_holding_back_tears("🥹"); - constexpr std::string sweat_smile("😅"); - constexpr std::string joy("😂"); - constexpr std::string rofl("🤣"); - constexpr std::string rolling_on_the_floor_laughing("🤣"); - constexpr std::string smiling_face_with_tear("🥲"); - constexpr std::string relaxed("☺️"); - constexpr std::string blush("😊"); - constexpr std::string innocent("😇"); - constexpr std::string slight_smile("🙂"); - constexpr std::string slightly_smiling_face("🙂"); - constexpr std::string upside_down("🙃"); - constexpr std::string upside_down_face("🙃"); - constexpr std::string wink("😉"); - constexpr std::string relieved("😌"); - constexpr std::string heart_eyes("😍"); - constexpr std::string smiling_face_with_3_hearts("🥰"); - constexpr std::string kissing_heart("😘"); - constexpr std::string kissing("😗"); - constexpr std::string kissing_smiling_eyes("😙"); - constexpr std::string kissing_closed_eyes("😚"); - constexpr std::string yum("😋"); - constexpr std::string stuck_out_tongue("😛"); - constexpr std::string stuck_out_tongue_closed_eyes("😝"); - constexpr std::string stuck_out_tongue_winking_eye("😜"); - constexpr std::string zany_face("🤪"); - constexpr std::string face_with_raised_eyebrow("🤨"); - constexpr std::string face_with_monocle("🧐"); - constexpr std::string nerd("🤓"); - constexpr std::string nerd_face("🤓"); - constexpr std::string sunglasses("😎"); - constexpr std::string disguised_face("🥸"); - constexpr std::string star_struck("🤩"); - constexpr std::string partying_face("🥳"); - constexpr std::string smirk("😏"); - constexpr std::string unamused("😒"); - constexpr std::string disappointed("😞"); - constexpr std::string pensive("😔"); - constexpr std::string worried("😟"); - constexpr std::string confused("😕"); - constexpr std::string slight_frown("🙁"); - constexpr std::string slightly_frowning_face("🙁"); - constexpr std::string frowning2("☹️"); - constexpr std::string white_frowning_face("☹️"); - constexpr std::string persevere("😣"); - constexpr std::string confounded("😖"); - constexpr std::string tired_face("😫"); - constexpr std::string weary("😩"); - constexpr std::string pleading_face("🥺"); - constexpr std::string cry("😢"); - constexpr std::string sob("😭"); - constexpr std::string triumph("😤"); - constexpr std::string angry("😠"); - constexpr std::string rage("😡"); - constexpr std::string face_with_symbols_over_mouth("🤬"); - constexpr std::string exploding_head("🤯"); - constexpr std::string flushed("😳"); - constexpr std::string hot_face("🥵"); - constexpr std::string cold_face("🥶"); - constexpr std::string face_in_clouds("😶‍🌫️"); - constexpr std::string scream("😱"); - constexpr std::string fearful("😨"); - constexpr std::string cold_sweat("😰"); - constexpr std::string disappointed_relieved("😥"); - constexpr std::string sweat("😓"); - constexpr std::string hugging("🤗"); - constexpr std::string hugging_face("🤗"); - constexpr std::string thinking("🤔"); - constexpr std::string thinking_face("🤔"); - constexpr std::string face_with_peeking_eye("🫣"); - constexpr std::string face_with_hand_over_mouth("🤭"); - constexpr std::string face_with_open_eyes_and_hand_over_mouth("🫢"); - constexpr std::string saluting_face("🫡"); - constexpr std::string shushing_face("🤫"); - constexpr std::string melting_face("🫠"); - constexpr std::string lying_face("🤥"); - constexpr std::string liar("🤥"); - constexpr std::string no_mouth("😶"); - constexpr std::string dotted_line_face("🫥"); - constexpr std::string neutral_face("😐"); - constexpr std::string face_with_diagonal_mouth("🫤"); - constexpr std::string expressionless("😑"); - constexpr std::string grimacing("😬"); - constexpr std::string rolling_eyes("🙄"); - constexpr std::string face_with_rolling_eyes("🙄"); - constexpr std::string hushed("😯"); - constexpr std::string frowning("😦"); - constexpr std::string anguished("😧"); - constexpr std::string open_mouth("😮"); - constexpr std::string astonished("😲"); - constexpr std::string yawning_face("🥱"); - constexpr std::string sleeping("😴"); - constexpr std::string drooling_face("🤤"); - constexpr std::string drool("🤤"); - constexpr std::string sleepy("😪"); - constexpr std::string face_exhaling("😮‍💨"); - constexpr std::string dizzy_face("😵"); - constexpr std::string face_with_spiral_eyes("😵‍💫"); - constexpr std::string zipper_mouth("🤐"); - constexpr std::string zipper_mouth_face("🤐"); - constexpr std::string woozy_face("🥴"); - constexpr std::string nauseated_face("🤢"); - constexpr std::string sick("🤢"); - constexpr std::string face_vomiting("🤮"); - constexpr std::string sneezing_face("🤧"); - constexpr std::string sneeze("🤧"); - constexpr std::string mask("😷"); - constexpr std::string thermometer_face("🤒"); - constexpr std::string face_with_thermometer("🤒"); - constexpr std::string head_bandage("🤕"); - constexpr std::string face_with_head_bandage("🤕"); - constexpr std::string money_mouth("🤑"); - constexpr std::string money_mouth_face("🤑"); - constexpr std::string cowboy("🤠"); - constexpr std::string face_with_cowboy_hat("🤠"); - constexpr std::string smiling_imp("😈"); - constexpr std::string imp("👿"); - constexpr std::string japanese_ogre("👹"); - constexpr std::string japanese_goblin("👺"); - constexpr std::string clown("🤡"); - constexpr std::string clown_face("🤡"); - constexpr std::string poop("💩"); - constexpr std::string shit("💩"); - constexpr std::string hankey("💩"); - constexpr std::string poo("💩"); - constexpr std::string ghost("👻"); - constexpr std::string skull("💀"); - constexpr std::string skeleton("💀"); - constexpr std::string skull_crossbones("☠️"); - constexpr std::string skull_and_crossbones("☠️"); - constexpr std::string alien("👽"); - constexpr std::string space_invader("👾"); - constexpr std::string robot("🤖"); - constexpr std::string robot_face("🤖"); - constexpr std::string jack_o_lantern("🎃"); - constexpr std::string smiley_cat("😺"); - constexpr std::string smile_cat("😸"); - constexpr std::string joy_cat("😹"); - constexpr std::string heart_eyes_cat("😻"); - constexpr std::string smirk_cat("😼"); - constexpr std::string kissing_cat("😽"); - constexpr std::string scream_cat("🙀"); - constexpr std::string crying_cat_face("😿"); - constexpr std::string pouting_cat("😾"); - constexpr std::string heart_hands("🫶"); - constexpr std::string heart_hands_tone1("🫶🏻"); - constexpr std::string heart_hands_light_skin_tone("🫶🏻"); - constexpr std::string heart_hands_tone2("🫶🏼"); - constexpr std::string heart_hands_medium_light_skin_tone("🫶🏼"); - constexpr std::string heart_hands_tone3("🫶🏽"); - constexpr std::string heart_hands_medium_skin_tone("🫶🏽"); - constexpr std::string heart_hands_tone4("🫶🏾"); - constexpr std::string heart_hands_medium_dark_skin_tone("🫶🏾"); - constexpr std::string heart_hands_tone5("🫶🏿"); - constexpr std::string heart_hands_dark_skin_tone("🫶🏿"); - constexpr std::string palms_up_together("🤲"); - constexpr std::string palms_up_together_tone1("🤲🏻"); - constexpr std::string palms_up_together_light_skin_tone("🤲🏻"); - constexpr std::string palms_up_together_tone2("🤲🏼"); - constexpr std::string palms_up_together_medium_light_skin_tone("🤲🏼"); - constexpr std::string palms_up_together_tone3("🤲🏽"); - constexpr std::string palms_up_together_medium_skin_tone("🤲🏽"); - constexpr std::string palms_up_together_tone4("🤲🏾"); - constexpr std::string palms_up_together_medium_dark_skin_tone("🤲🏾"); - constexpr std::string palms_up_together_tone5("🤲🏿"); - constexpr std::string palms_up_together_dark_skin_tone("🤲🏿"); - constexpr std::string open_hands("👐"); - constexpr std::string open_hands_tone1("👐🏻"); - constexpr std::string open_hands_tone2("👐🏼"); - constexpr std::string open_hands_tone3("👐🏽"); - constexpr std::string open_hands_tone4("👐🏾"); - constexpr std::string open_hands_tone5("👐🏿"); - constexpr std::string raised_hands("🙌"); - constexpr std::string raised_hands_tone1("🙌🏻"); - constexpr std::string raised_hands_tone2("🙌🏼"); - constexpr std::string raised_hands_tone3("🙌🏽"); - constexpr std::string raised_hands_tone4("🙌🏾"); - constexpr std::string raised_hands_tone5("🙌🏿"); - constexpr std::string clap("👏"); - constexpr std::string clap_tone1("👏🏻"); - constexpr std::string clap_tone2("👏🏼"); - constexpr std::string clap_tone3("👏🏽"); - constexpr std::string clap_tone4("👏🏾"); - constexpr std::string clap_tone5("👏🏿"); - constexpr std::string handshake("🤝"); - constexpr std::string shaking_hands("🤝"); - constexpr std::string handshake_light_skin_tone("🤝🏻"); - constexpr std::string handshake_tone1_tone2("🫱🏻‍🫲🏼"); - constexpr std::string handshake_light_skin_tone_medium_light_skin_tone("🫱🏻‍🫲🏼"); - constexpr std::string handshake_tone1_tone3("🫱🏻‍🫲🏽"); - constexpr std::string handshake_light_skin_tone_medium_skin_tone("🫱🏻‍🫲🏽"); - constexpr std::string handshake_tone1_tone4("🫱🏻‍🫲🏾"); - constexpr std::string handshake_light_skin_tone_medium_dark_skin_tone("🫱🏻‍🫲🏾"); - constexpr std::string handshake_tone1_tone5("🫱🏻‍🫲🏿"); - constexpr std::string handshake_light_skin_tone_dark_skin_tone("🫱🏻‍🫲🏿"); - constexpr std::string handshake_tone2_tone1("🫱🏼‍🫲🏻"); - constexpr std::string handshake_medium_light_skin_tone_light_skin_tone("🫱🏼‍🫲🏻"); - constexpr std::string handshake_medium_light_skin_tone("🤝🏼"); - constexpr std::string handshake_tone2_tone3("🫱🏼‍🫲🏽"); - constexpr std::string handshake_medium_light_skin_tone_medium_skin_tone("🫱🏼‍🫲🏽"); - constexpr std::string handshake_tone2_tone4("🫱🏼‍🫲🏾"); - constexpr std::string handshake_medium_light_skin_tone_medium_dark_skin_tone("🫱🏼‍🫲🏾"); - constexpr std::string handshake_tone2_tone5("🫱🏼‍🫲🏿"); - constexpr std::string handshake_medium_light_skin_tone_dark_skin_tone("🫱🏼‍🫲🏿"); - constexpr std::string handshake_tone3_tone1("🫱🏽‍🫲🏻"); - constexpr std::string handshake_medium_skin_tone_light_skin_tone("🫱🏽‍🫲🏻"); - constexpr std::string handshake_tone3_tone2("🫱🏽‍🫲🏼"); - constexpr std::string handshake_medium_skin_tone_medium_light_skin_tone("🫱🏽‍🫲🏼"); - constexpr std::string handshake_medium_skin_tone("🤝🏽"); - constexpr std::string handshake_tone3_tone4("🫱🏽‍🫲🏾"); - constexpr std::string handshake_medium_skin_tone_medium_dark_skin_tone("🫱🏽‍🫲🏾"); - constexpr std::string handshake_tone3_tone5("🫱🏽‍🫲🏿"); - constexpr std::string handshake_medium_skin_tone_dark_skin_tone("🫱🏽‍🫲🏿"); - constexpr std::string handshake_tone4_tone1("🫱🏾‍🫲🏻"); - constexpr std::string handshake_medium_dark_skin_tone_light_skin_tone("🫱🏾‍🫲🏻"); - constexpr std::string handshake_tone4_tone2("🫱🏾‍🫲🏼"); - constexpr std::string handshake_medium_dark_skin_tone_medium_light_skin_tone("🫱🏾‍🫲🏼"); - constexpr std::string handshake_tone4_tone3("🫱🏾‍🫲🏽"); - constexpr std::string handshake_medium_dark_skin_tone_medium_skin_tone("🫱🏾‍🫲🏽"); - constexpr std::string handshake_medium_dark_skin_tone("🤝🏾"); - constexpr std::string handshake_tone4_tone5("🫱🏾‍🫲🏿"); - constexpr std::string handshake_medium_dark_skin_tone_dark_skin_tone("🫱🏾‍🫲🏿"); - constexpr std::string handshake_tone5_tone1("🫱🏿‍🫲🏻"); - constexpr std::string handshake_dark_skin_tone_light_skin_tone("🫱🏿‍🫲🏻"); - constexpr std::string handshake_tone5_tone2("🫱🏿‍🫲🏼"); - constexpr std::string handshake_dark_skin_tone_medium_light_skin_tone("🫱🏿‍🫲🏼"); - constexpr std::string handshake_tone5_tone3("🫱🏿‍🫲🏽"); - constexpr std::string handshake_dark_skin_tone_medium_skin_tone("🫱🏿‍🫲🏽"); - constexpr std::string handshake_tone5_tone4("🫱🏿‍🫲🏾"); - constexpr std::string handshake_dark_skin_tone_medium_dark_skin_tone("🫱🏿‍🫲🏾"); - constexpr std::string handshake_dark_skin_tone("🤝🏿"); - constexpr std::string thumbsup("👍"); - constexpr std::string +1("👍"); - constexpr std::string thumbup("👍"); - constexpr std::string thumbsup_tone1("👍🏻"); - constexpr std::string +1_tone1("👍🏻"); - constexpr std::string thumbup_tone1("👍🏻"); - constexpr std::string thumbsup_tone2("👍🏼"); - constexpr std::string +1_tone2("👍🏼"); - constexpr std::string thumbup_tone2("👍🏼"); - constexpr std::string thumbsup_tone3("👍🏽"); - constexpr std::string +1_tone3("👍🏽"); - constexpr std::string thumbup_tone3("👍🏽"); - constexpr std::string thumbsup_tone4("👍🏾"); - constexpr std::string +1_tone4("👍🏾"); - constexpr std::string thumbup_tone4("👍🏾"); - constexpr std::string thumbsup_tone5("👍🏿"); - constexpr std::string +1_tone5("👍🏿"); - constexpr std::string thumbup_tone5("👍🏿"); - constexpr std::string thumbsdown("👎"); - constexpr std::string -1("👎"); - constexpr std::string thumbdown("👎"); - constexpr std::string thumbsdown_tone1("👎🏻"); - constexpr std::string _1_tone1("👎🏻"); - constexpr std::string thumbdown_tone1("👎🏻"); - constexpr std::string thumbsdown_tone2("👎🏼"); - constexpr std::string _1_tone2("👎🏼"); - constexpr std::string thumbdown_tone2("👎🏼"); - constexpr std::string thumbsdown_tone3("👎🏽"); - constexpr std::string _1_tone3("👎🏽"); - constexpr std::string thumbdown_tone3("👎🏽"); - constexpr std::string thumbsdown_tone4("👎🏾"); - constexpr std::string _1_tone4("👎🏾"); - constexpr std::string thumbdown_tone4("👎🏾"); - constexpr std::string thumbsdown_tone5("👎🏿"); - constexpr std::string _1_tone5("👎🏿"); - constexpr std::string thumbdown_tone5("👎🏿"); - constexpr std::string punch("👊"); - constexpr std::string punch_tone1("👊🏻"); - constexpr std::string punch_tone2("👊🏼"); - constexpr std::string punch_tone3("👊🏽"); - constexpr std::string punch_tone4("👊🏾"); - constexpr std::string punch_tone5("👊🏿"); - constexpr std::string fist("✊"); - constexpr std::string fist_tone1("✊🏻"); - constexpr std::string fist_tone2("✊🏼"); - constexpr std::string fist_tone3("✊🏽"); - constexpr std::string fist_tone4("✊🏾"); - constexpr std::string fist_tone5("✊🏿"); - constexpr std::string left_facing_fist("🤛"); - constexpr std::string left_fist("🤛"); - constexpr std::string left_facing_fist_tone1("🤛🏻"); - constexpr std::string left_fist_tone1("🤛🏻"); - constexpr std::string left_facing_fist_tone2("🤛🏼"); - constexpr std::string left_fist_tone2("🤛🏼"); - constexpr std::string left_facing_fist_tone3("🤛🏽"); - constexpr std::string left_fist_tone3("🤛🏽"); - constexpr std::string left_facing_fist_tone4("🤛🏾"); - constexpr std::string left_fist_tone4("🤛🏾"); - constexpr std::string left_facing_fist_tone5("🤛🏿"); - constexpr std::string left_fist_tone5("🤛🏿"); - constexpr std::string right_facing_fist("🤜"); - constexpr std::string right_fist("🤜"); - constexpr std::string right_facing_fist_tone1("🤜🏻"); - constexpr std::string right_fist_tone1("🤜🏻"); - constexpr std::string right_facing_fist_tone2("🤜🏼"); - constexpr std::string right_fist_tone2("🤜🏼"); - constexpr std::string right_facing_fist_tone3("🤜🏽"); - constexpr std::string right_fist_tone3("🤜🏽"); - constexpr std::string right_facing_fist_tone4("🤜🏾"); - constexpr std::string right_fist_tone4("🤜🏾"); - constexpr std::string right_facing_fist_tone5("🤜🏿"); - constexpr std::string right_fist_tone5("🤜🏿"); - constexpr std::string fingers_crossed("🤞"); - constexpr std::string hand_with_index_and_middle_finger_crossed("🤞"); - constexpr std::string fingers_crossed_tone1("🤞🏻"); - constexpr std::string hand_with_index_and_middle_fingers_crossed_tone1("🤞🏻"); - constexpr std::string fingers_crossed_tone2("🤞🏼"); - constexpr std::string hand_with_index_and_middle_fingers_crossed_tone2("🤞🏼"); - constexpr std::string fingers_crossed_tone3("🤞🏽"); - constexpr std::string hand_with_index_and_middle_fingers_crossed_tone3("🤞🏽"); - constexpr std::string fingers_crossed_tone4("🤞🏾"); - constexpr std::string hand_with_index_and_middle_fingers_crossed_tone4("🤞🏾"); - constexpr std::string fingers_crossed_tone5("🤞🏿"); - constexpr std::string hand_with_index_and_middle_fingers_crossed_tone5("🤞🏿"); - constexpr std::string v("✌️"); - constexpr std::string v_tone1("✌🏻"); - constexpr std::string v_tone2("✌🏼"); - constexpr std::string v_tone3("✌🏽"); - constexpr std::string v_tone4("✌🏾"); - constexpr std::string v_tone5("✌🏿"); - constexpr std::string hand_with_index_finger_and_thumb_crossed("🫰"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_tone1("🫰🏻"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_light_skin_tone("🫰🏻"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_tone2("🫰🏼"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_medium_light_skin_tone("🫰🏼"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_tone3("🫰🏽"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_medium_skin_tone("🫰🏽"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_tone4("🫰🏾"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_medium_dark_skin_tone("🫰🏾"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_tone5("🫰🏿"); - constexpr std::string hand_with_index_finger_and_thumb_crossed_dark_skin_tone("🫰🏿"); - constexpr std::string love_you_gesture("🤟"); - constexpr std::string love_you_gesture_tone1("🤟🏻"); - constexpr std::string love_you_gesture_light_skin_tone("🤟🏻"); - constexpr std::string love_you_gesture_tone2("🤟🏼"); - constexpr std::string love_you_gesture_medium_light_skin_tone("🤟🏼"); - constexpr std::string love_you_gesture_tone3("🤟🏽"); - constexpr std::string love_you_gesture_medium_skin_tone("🤟🏽"); - constexpr std::string love_you_gesture_tone4("🤟🏾"); - constexpr std::string love_you_gesture_medium_dark_skin_tone("🤟🏾"); - constexpr std::string love_you_gesture_tone5("🤟🏿"); - constexpr std::string love_you_gesture_dark_skin_tone("🤟🏿"); - constexpr std::string metal("🤘"); - constexpr std::string sign_of_the_horns("🤘"); - constexpr std::string metal_tone1("🤘🏻"); - constexpr std::string sign_of_the_horns_tone1("🤘🏻"); - constexpr std::string metal_tone2("🤘🏼"); - constexpr std::string sign_of_the_horns_tone2("🤘🏼"); - constexpr std::string metal_tone3("🤘🏽"); - constexpr std::string sign_of_the_horns_tone3("🤘🏽"); - constexpr std::string metal_tone4("🤘🏾"); - constexpr std::string sign_of_the_horns_tone4("🤘🏾"); - constexpr std::string metal_tone5("🤘🏿"); - constexpr std::string sign_of_the_horns_tone5("🤘🏿"); - constexpr std::string ok_hand("👌"); - constexpr std::string ok_hand_tone1("👌🏻"); - constexpr std::string ok_hand_tone2("👌🏼"); - constexpr std::string ok_hand_tone3("👌🏽"); - constexpr std::string ok_hand_tone4("👌🏾"); - constexpr std::string ok_hand_tone5("👌🏿"); - constexpr std::string pinched_fingers("🤌"); - constexpr std::string pinched_fingers_tone2("🤌🏼"); - constexpr std::string pinched_fingers_medium_light_skin_tone("🤌🏼"); - constexpr std::string pinched_fingers_tone1("🤌🏻"); - constexpr std::string pinched_fingers_light_skin_tone("🤌🏻"); - constexpr std::string pinched_fingers_tone3("🤌🏽"); - constexpr std::string pinched_fingers_medium_skin_tone("🤌🏽"); - constexpr std::string pinched_fingers_tone4("🤌🏾"); - constexpr std::string pinched_fingers_medium_dark_skin_tone("🤌🏾"); - constexpr std::string pinched_fingers_tone5("🤌🏿"); - constexpr std::string pinched_fingers_dark_skin_tone("🤌🏿"); - constexpr std::string pinching_hand("🤏"); - constexpr std::string pinching_hand_tone1("🤏🏻"); - constexpr std::string pinching_hand_light_skin_tone("🤏🏻"); - constexpr std::string pinching_hand_tone2("🤏🏼"); - constexpr std::string pinching_hand_medium_light_skin_tone("🤏🏼"); - constexpr std::string pinching_hand_tone3("🤏🏽"); - constexpr std::string pinching_hand_medium_skin_tone("🤏🏽"); - constexpr std::string pinching_hand_tone4("🤏🏾"); - constexpr std::string pinching_hand_medium_dark_skin_tone("🤏🏾"); - constexpr std::string pinching_hand_tone5("🤏🏿"); - constexpr std::string pinching_hand_dark_skin_tone("🤏🏿"); - constexpr std::string palm_down_hand("🫳"); - constexpr std::string palm_down_hand_tone1("🫳🏻"); - constexpr std::string palm_down_hand_light_skin_tone("🫳🏻"); - constexpr std::string palm_down_hand_tone2("🫳🏼"); - constexpr std::string palm_down_hand_medium_light_skin_tone("🫳🏼"); - constexpr std::string palm_down_hand_tone3("🫳🏽"); - constexpr std::string palm_down_hand_medium_skin_tone("🫳🏽"); - constexpr std::string palm_down_hand_tone4("🫳🏾"); - constexpr std::string palm_down_hand_medium_dark_skin_tone("🫳🏾"); - constexpr std::string palm_down_hand_tone5("🫳🏿"); - constexpr std::string palm_down_hand_dark_skin_tone("🫳🏿"); - constexpr std::string palm_up_hand("🫴"); - constexpr std::string palm_up_hand_tone1("🫴🏻"); - constexpr std::string palm_up_hand_light_skin_tone("🫴🏻"); - constexpr std::string palm_up_hand_tone2("🫴🏼"); - constexpr std::string palm_up_hand_medium_light_skin_tone("🫴🏼"); - constexpr std::string palm_up_hand_tone3("🫴🏽"); - constexpr std::string palm_up_hand_medium_skin_tone("🫴🏽"); - constexpr std::string palm_up_hand_tone4("🫴🏾"); - constexpr std::string palm_up_hand_medium_dark_skin_tone("🫴🏾"); - constexpr std::string palm_up_hand_tone5("🫴🏿"); - constexpr std::string palm_up_hand_dark_skin_tone("🫴🏿"); - constexpr std::string point_left("👈"); - constexpr std::string point_left_tone1("👈🏻"); - constexpr std::string point_left_tone2("👈🏼"); - constexpr std::string point_left_tone3("👈🏽"); - constexpr std::string point_left_tone4("👈🏾"); - constexpr std::string point_left_tone5("👈🏿"); - constexpr std::string point_right("👉"); - constexpr std::string point_right_tone1("👉🏻"); - constexpr std::string point_right_tone2("👉🏼"); - constexpr std::string point_right_tone3("👉🏽"); - constexpr std::string point_right_tone4("👉🏾"); - constexpr std::string point_right_tone5("👉🏿"); - constexpr std::string point_up_2("👆"); - constexpr std::string point_up_2_tone1("👆🏻"); - constexpr std::string point_up_2_tone2("👆🏼"); - constexpr std::string point_up_2_tone3("👆🏽"); - constexpr std::string point_up_2_tone4("👆🏾"); - constexpr std::string point_up_2_tone5("👆🏿"); - constexpr std::string point_down("👇"); - constexpr std::string point_down_tone1("👇🏻"); - constexpr std::string point_down_tone2("👇🏼"); - constexpr std::string point_down_tone3("👇🏽"); - constexpr std::string point_down_tone4("👇🏾"); - constexpr std::string point_down_tone5("👇🏿"); - constexpr std::string point_up("☝️"); - constexpr std::string point_up_tone1("☝🏻"); - constexpr std::string point_up_tone2("☝🏼"); - constexpr std::string point_up_tone3("☝🏽"); - constexpr std::string point_up_tone4("☝🏾"); - constexpr std::string point_up_tone5("☝🏿"); - constexpr std::string raised_hand("✋"); - constexpr std::string raised_hand_tone1("✋🏻"); - constexpr std::string raised_hand_tone2("✋🏼"); - constexpr std::string raised_hand_tone3("✋🏽"); - constexpr std::string raised_hand_tone4("✋🏾"); - constexpr std::string raised_hand_tone5("✋🏿"); - constexpr std::string raised_back_of_hand("🤚"); - constexpr std::string back_of_hand("🤚"); - constexpr std::string raised_back_of_hand_tone1("🤚🏻"); - constexpr std::string back_of_hand_tone1("🤚🏻"); - constexpr std::string raised_back_of_hand_tone2("🤚🏼"); - constexpr std::string back_of_hand_tone2("🤚🏼"); - constexpr std::string raised_back_of_hand_tone3("🤚🏽"); - constexpr std::string back_of_hand_tone3("🤚🏽"); - constexpr std::string raised_back_of_hand_tone4("🤚🏾"); - constexpr std::string back_of_hand_tone4("🤚🏾"); - constexpr std::string raised_back_of_hand_tone5("🤚🏿"); - constexpr std::string back_of_hand_tone5("🤚🏿"); - constexpr std::string hand_splayed("🖐️"); - constexpr std::string raised_hand_with_fingers_splayed("🖐️"); - constexpr std::string hand_splayed_tone1("🖐🏻"); - constexpr std::string raised_hand_with_fingers_splayed_tone1("🖐🏻"); - constexpr std::string hand_splayed_tone2("🖐🏼"); - constexpr std::string raised_hand_with_fingers_splayed_tone2("🖐🏼"); - constexpr std::string hand_splayed_tone3("🖐🏽"); - constexpr std::string raised_hand_with_fingers_splayed_tone3("🖐🏽"); - constexpr std::string hand_splayed_tone4("🖐🏾"); - constexpr std::string raised_hand_with_fingers_splayed_tone4("🖐🏾"); - constexpr std::string hand_splayed_tone5("🖐🏿"); - constexpr std::string raised_hand_with_fingers_splayed_tone5("🖐🏿"); - constexpr std::string vulcan("🖖"); - constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers("🖖"); - constexpr std::string vulcan_tone1("🖖🏻"); - constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone1("🖖🏻"); - constexpr std::string vulcan_tone2("🖖🏼"); - constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone2("🖖🏼"); - constexpr std::string vulcan_tone3("🖖🏽"); - constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone3("🖖🏽"); - constexpr std::string vulcan_tone4("🖖🏾"); - constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone4("🖖🏾"); - constexpr std::string vulcan_tone5("🖖🏿"); - constexpr std::string raised_hand_with_part_between_middle_and_ring_fingers_tone5("🖖🏿"); - constexpr std::string wave("👋"); - constexpr std::string wave_tone1("👋🏻"); - constexpr std::string wave_tone2("👋🏼"); - constexpr std::string wave_tone3("👋🏽"); - constexpr std::string wave_tone4("👋🏾"); - constexpr std::string wave_tone5("👋🏿"); - constexpr std::string call_me("🤙"); - constexpr std::string call_me_hand("🤙"); - constexpr std::string call_me_tone1("🤙🏻"); - constexpr std::string call_me_hand_tone1("🤙🏻"); - constexpr std::string call_me_tone2("🤙🏼"); - constexpr std::string call_me_hand_tone2("🤙🏼"); - constexpr std::string call_me_tone3("🤙🏽"); - constexpr std::string call_me_hand_tone3("🤙🏽"); - constexpr std::string call_me_tone4("🤙🏾"); - constexpr std::string call_me_hand_tone4("🤙🏾"); - constexpr std::string call_me_tone5("🤙🏿"); - constexpr std::string call_me_hand_tone5("🤙🏿"); - constexpr std::string leftwards_hand("🫲"); - constexpr std::string leftwards_hand_tone1("🫲🏻"); - constexpr std::string leftwards_hand_light_skin_tone("🫲🏻"); - constexpr std::string leftwards_hand_tone2("🫲🏼"); - constexpr std::string leftwards_hand_medium_light_skin_tone("🫲🏼"); - constexpr std::string leftwards_hand_tone3("🫲🏽"); - constexpr std::string leftwards_hand_medium_skin_tone("🫲🏽"); - constexpr std::string leftwards_hand_tone4("🫲🏾"); - constexpr std::string leftwards_hand_medium_dark_skin_tone("🫲🏾"); - constexpr std::string leftwards_hand_tone5("🫲🏿"); - constexpr std::string leftwards_hand_dark_skin_tone("🫲🏿"); - constexpr std::string rightwards_hand("🫱"); - constexpr std::string rightwards_hand_tone1("🫱🏻"); - constexpr std::string rightwards_hand_light_skin_tone("🫱🏻"); - constexpr std::string rightwards_hand_tone2("🫱🏼"); - constexpr std::string rightwards_hand_medium_light_skin_tone("🫱🏼"); - constexpr std::string rightwards_hand_tone3("🫱🏽"); - constexpr std::string rightwards_hand_medium_skin_tone("🫱🏽"); - constexpr std::string rightwards_hand_tone4("🫱🏾"); - constexpr std::string rightwards_hand_medium_dark_skin_tone("🫱🏾"); - constexpr std::string rightwards_hand_tone5("🫱🏿"); - constexpr std::string rightwards_hand_dark_skin_tone("🫱🏿"); - constexpr std::string muscle("💪"); - constexpr std::string muscle_tone1("💪🏻"); - constexpr std::string muscle_tone2("💪🏼"); - constexpr std::string muscle_tone3("💪🏽"); - constexpr std::string muscle_tone4("💪🏾"); - constexpr std::string muscle_tone5("💪🏿"); - constexpr std::string mechanical_arm("🦾"); - constexpr std::string middle_finger("🖕"); - constexpr std::string reversed_hand_with_middle_finger_extended("🖕"); - constexpr std::string middle_finger_tone1("🖕🏻"); - constexpr std::string reversed_hand_with_middle_finger_extended_tone1("🖕🏻"); - constexpr std::string middle_finger_tone2("🖕🏼"); - constexpr std::string reversed_hand_with_middle_finger_extended_tone2("🖕🏼"); - constexpr std::string middle_finger_tone3("🖕🏽"); - constexpr std::string reversed_hand_with_middle_finger_extended_tone3("🖕🏽"); - constexpr std::string middle_finger_tone4("🖕🏾"); - constexpr std::string reversed_hand_with_middle_finger_extended_tone4("🖕🏾"); - constexpr std::string middle_finger_tone5("🖕🏿"); - constexpr std::string reversed_hand_with_middle_finger_extended_tone5("🖕🏿"); - constexpr std::string writing_hand("✍️"); - constexpr std::string writing_hand_tone1("✍🏻"); - constexpr std::string writing_hand_tone2("✍🏼"); - constexpr std::string writing_hand_tone3("✍🏽"); - constexpr std::string writing_hand_tone4("✍🏾"); - constexpr std::string writing_hand_tone5("✍🏿"); - constexpr std::string pray("🙏"); - constexpr std::string pray_tone1("🙏🏻"); - constexpr std::string pray_tone2("🙏🏼"); - constexpr std::string pray_tone3("🙏🏽"); - constexpr std::string pray_tone4("🙏🏾"); - constexpr std::string pray_tone5("🙏🏿"); - constexpr std::string index_pointing_at_the_viewer("🫵"); - constexpr std::string index_pointing_at_the_viewer_tone1("🫵🏻"); - constexpr std::string index_pointing_at_the_viewer_light_skin_tone("🫵🏻"); - constexpr std::string index_pointing_at_the_viewer_tone2("🫵🏼"); - constexpr std::string index_pointing_at_the_viewer_medium_light_skin_tone("🫵🏼"); - constexpr std::string index_pointing_at_the_viewer_tone3("🫵🏽"); - constexpr std::string index_pointing_at_the_viewer_medium_skin_tone("🫵🏽"); - constexpr std::string index_pointing_at_the_viewer_tone4("🫵🏾"); - constexpr std::string index_pointing_at_the_viewer_medium_dark_skin_tone("🫵🏾"); - constexpr std::string index_pointing_at_the_viewer_tone5("🫵🏿"); - constexpr std::string index_pointing_at_the_viewer_dark_skin_tone("🫵🏿"); - constexpr std::string foot("🦶"); - constexpr std::string foot_tone1("🦶🏻"); - constexpr std::string foot_light_skin_tone("🦶🏻"); - constexpr std::string foot_tone2("🦶🏼"); - constexpr std::string foot_medium_light_skin_tone("🦶🏼"); - constexpr std::string foot_tone3("🦶🏽"); - constexpr std::string foot_medium_skin_tone("🦶🏽"); - constexpr std::string foot_tone4("🦶🏾"); - constexpr std::string foot_medium_dark_skin_tone("🦶🏾"); - constexpr std::string foot_tone5("🦶🏿"); - constexpr std::string foot_dark_skin_tone("🦶🏿"); - constexpr std::string leg("🦵"); - constexpr std::string leg_tone1("🦵🏻"); - constexpr std::string leg_light_skin_tone("🦵🏻"); - constexpr std::string leg_tone2("🦵🏼"); - constexpr std::string leg_medium_light_skin_tone("🦵🏼"); - constexpr std::string leg_tone3("🦵🏽"); - constexpr std::string leg_medium_skin_tone("🦵🏽"); - constexpr std::string leg_tone4("🦵🏾"); - constexpr std::string leg_medium_dark_skin_tone("🦵🏾"); - constexpr std::string leg_tone5("🦵🏿"); - constexpr std::string leg_dark_skin_tone("🦵🏿"); - constexpr std::string mechanical_leg("🦿"); - constexpr std::string lipstick("💄"); - constexpr std::string kiss("💋"); - constexpr std::string lips("👄"); - constexpr std::string biting_lip("🫦"); - constexpr std::string tooth("🦷"); - constexpr std::string tongue("👅"); - constexpr std::string ear("👂"); - constexpr std::string ear_tone1("👂🏻"); - constexpr std::string ear_tone2("👂🏼"); - constexpr std::string ear_tone3("👂🏽"); - constexpr std::string ear_tone4("👂🏾"); - constexpr std::string ear_tone5("👂🏿"); - constexpr std::string ear_with_hearing_aid("🦻"); - constexpr std::string ear_with_hearing_aid_tone1("🦻🏻"); - constexpr std::string ear_with_hearing_aid_light_skin_tone("🦻🏻"); - constexpr std::string ear_with_hearing_aid_tone2("🦻🏼"); - constexpr std::string ear_with_hearing_aid_medium_light_skin_tone("🦻🏼"); - constexpr std::string ear_with_hearing_aid_tone3("🦻🏽"); - constexpr std::string ear_with_hearing_aid_medium_skin_tone("🦻🏽"); - constexpr std::string ear_with_hearing_aid_tone4("🦻🏾"); - constexpr std::string ear_with_hearing_aid_medium_dark_skin_tone("🦻🏾"); - constexpr std::string ear_with_hearing_aid_tone5("🦻🏿"); - constexpr std::string ear_with_hearing_aid_dark_skin_tone("🦻🏿"); - constexpr std::string nose("👃"); - constexpr std::string nose_tone1("👃🏻"); - constexpr std::string nose_tone2("👃🏼"); - constexpr std::string nose_tone3("👃🏽"); - constexpr std::string nose_tone4("👃🏾"); - constexpr std::string nose_tone5("👃🏿"); - constexpr std::string footprints("👣"); - constexpr std::string eye("👁️"); - constexpr std::string eyes("👀"); - constexpr std::string anatomical_heart("🫀"); - constexpr std::string lungs("🫁"); - constexpr std::string brain("🧠"); - constexpr std::string speaking_head("🗣️"); - constexpr std::string speaking_head_in_silhouette("🗣️"); - constexpr std::string bust_in_silhouette("👤"); - constexpr std::string busts_in_silhouette("👥"); - constexpr std::string people_hugging("🫂"); - constexpr std::string baby("👶"); - constexpr std::string baby_tone1("👶🏻"); - constexpr std::string baby_tone2("👶🏼"); - constexpr std::string baby_tone3("👶🏽"); - constexpr std::string baby_tone4("👶🏾"); - constexpr std::string baby_tone5("👶🏿"); - constexpr std::string child("🧒"); - constexpr std::string child_tone1("🧒🏻"); - constexpr std::string child_light_skin_tone("🧒🏻"); - constexpr std::string child_tone2("🧒🏼"); - constexpr std::string child_medium_light_skin_tone("🧒🏼"); - constexpr std::string child_tone3("🧒🏽"); - constexpr std::string child_medium_skin_tone("🧒🏽"); - constexpr std::string child_tone4("🧒🏾"); - constexpr std::string child_medium_dark_skin_tone("🧒🏾"); - constexpr std::string child_tone5("🧒🏿"); - constexpr std::string child_dark_skin_tone("🧒🏿"); - constexpr std::string girl("👧"); - constexpr std::string girl_tone1("👧🏻"); - constexpr std::string girl_tone2("👧🏼"); - constexpr std::string girl_tone3("👧🏽"); - constexpr std::string girl_tone4("👧🏾"); - constexpr std::string girl_tone5("👧🏿"); - constexpr std::string boy("👦"); - constexpr std::string boy_tone1("👦🏻"); - constexpr std::string boy_tone2("👦🏼"); - constexpr std::string boy_tone3("👦🏽"); - constexpr std::string boy_tone4("👦🏾"); - constexpr std::string boy_tone5("👦🏿"); - constexpr std::string adult("🧑"); - constexpr std::string adult_tone1("🧑🏻"); - constexpr std::string adult_light_skin_tone("🧑🏻"); - constexpr std::string adult_tone2("🧑🏼"); - constexpr std::string adult_medium_light_skin_tone("🧑🏼"); - constexpr std::string adult_tone3("🧑🏽"); - constexpr std::string adult_medium_skin_tone("🧑🏽"); - constexpr std::string adult_tone4("🧑🏾"); - constexpr std::string adult_medium_dark_skin_tone("🧑🏾"); - constexpr std::string adult_tone5("🧑🏿"); - constexpr std::string adult_dark_skin_tone("🧑🏿"); - constexpr std::string woman("👩"); - constexpr std::string woman_tone1("👩🏻"); - constexpr std::string woman_tone2("👩🏼"); - constexpr std::string woman_tone3("👩🏽"); - constexpr std::string woman_tone4("👩🏾"); - constexpr std::string woman_tone5("👩🏿"); - constexpr std::string man("👨"); - constexpr std::string man_tone1("👨🏻"); - constexpr std::string man_tone2("👨🏼"); - constexpr std::string man_tone3("👨🏽"); - constexpr std::string man_tone4("👨🏾"); - constexpr std::string man_tone5("👨🏿"); - constexpr std::string person_curly_hair("🧑‍🦱"); - constexpr std::string person_tone1_curly_hair("🧑🏻‍🦱"); - constexpr std::string person_light_skin_tone_curly_hair("🧑🏻‍🦱"); - constexpr std::string person_tone2_curly_hair("🧑🏼‍🦱"); - constexpr std::string person_medium_light_skin_tone_curly_hair("🧑🏼‍🦱"); - constexpr std::string person_tone3_curly_hair("🧑🏽‍🦱"); - constexpr std::string person_medium_skin_tone_curly_hair("🧑🏽‍🦱"); - constexpr std::string person_tone4_curly_hair("🧑🏾‍🦱"); - constexpr std::string person_medium_dark_skin_tone_curly_hair("🧑🏾‍🦱"); - constexpr std::string person_tone5_curly_hair("🧑🏿‍🦱"); - constexpr std::string person_dark_skin_tone_curly_hair("🧑🏿‍🦱"); - constexpr std::string woman_curly_haired("👩‍🦱"); - constexpr std::string woman_curly_haired_tone1("👩🏻‍🦱"); - constexpr std::string woman_curly_haired_light_skin_tone("👩🏻‍🦱"); - constexpr std::string woman_curly_haired_tone2("👩🏼‍🦱"); - constexpr std::string woman_curly_haired_medium_light_skin_tone("👩🏼‍🦱"); - constexpr std::string woman_curly_haired_tone3("👩🏽‍🦱"); - constexpr std::string woman_curly_haired_medium_skin_tone("👩🏽‍🦱"); - constexpr std::string woman_curly_haired_tone4("👩🏾‍🦱"); - constexpr std::string woman_curly_haired_medium_dark_skin_tone("👩🏾‍🦱"); - constexpr std::string woman_curly_haired_tone5("👩🏿‍🦱"); - constexpr std::string woman_curly_haired_dark_skin_tone("👩🏿‍🦱"); - constexpr std::string man_curly_haired("👨‍🦱"); - constexpr std::string man_curly_haired_tone1("👨🏻‍🦱"); - constexpr std::string man_curly_haired_light_skin_tone("👨🏻‍🦱"); - constexpr std::string man_curly_haired_tone2("👨🏼‍🦱"); - constexpr std::string man_curly_haired_medium_light_skin_tone("👨🏼‍🦱"); - constexpr std::string man_curly_haired_tone3("👨🏽‍🦱"); - constexpr std::string man_curly_haired_medium_skin_tone("👨🏽‍🦱"); - constexpr std::string man_curly_haired_tone4("👨🏾‍🦱"); - constexpr std::string man_curly_haired_medium_dark_skin_tone("👨🏾‍🦱"); - constexpr std::string man_curly_haired_tone5("👨🏿‍🦱"); - constexpr std::string man_curly_haired_dark_skin_tone("👨🏿‍🦱"); - constexpr std::string person_red_hair("🧑‍🦰"); - constexpr std::string person_tone1_red_hair("🧑🏻‍🦰"); - constexpr std::string person_light_skin_tone_red_hair("🧑🏻‍🦰"); - constexpr std::string person_tone2_red_hair("🧑🏼‍🦰"); - constexpr std::string person_medium_light_skin_tone_red_hair("🧑🏼‍🦰"); - constexpr std::string person_tone3_red_hair("🧑🏽‍🦰"); - constexpr std::string person_medium_skin_tone_red_hair("🧑🏽‍🦰"); - constexpr std::string person_tone4_red_hair("🧑🏾‍🦰"); - constexpr std::string person_medium_dark_skin_tone_red_hair("🧑🏾‍🦰"); - constexpr std::string person_tone5_red_hair("🧑🏿‍🦰"); - constexpr std::string person_dark_skin_tone_red_hair("🧑🏿‍🦰"); - constexpr std::string woman_red_haired("👩‍🦰"); - constexpr std::string woman_red_haired_tone1("👩🏻‍🦰"); - constexpr std::string woman_red_haired_light_skin_tone("👩🏻‍🦰"); - constexpr std::string woman_red_haired_tone2("👩🏼‍🦰"); - constexpr std::string woman_red_haired_medium_light_skin_tone("👩🏼‍🦰"); - constexpr std::string woman_red_haired_tone3("👩🏽‍🦰"); - constexpr std::string woman_red_haired_medium_skin_tone("👩🏽‍🦰"); - constexpr std::string woman_red_haired_tone4("👩🏾‍🦰"); - constexpr std::string woman_red_haired_medium_dark_skin_tone("👩🏾‍🦰"); - constexpr std::string woman_red_haired_tone5("👩🏿‍🦰"); - constexpr std::string woman_red_haired_dark_skin_tone("👩🏿‍🦰"); - constexpr std::string man_red_haired("👨‍🦰"); - constexpr std::string man_red_haired_tone1("👨🏻‍🦰"); - constexpr std::string man_red_haired_light_skin_tone("👨🏻‍🦰"); - constexpr std::string man_red_haired_tone2("👨🏼‍🦰"); - constexpr std::string man_red_haired_medium_light_skin_tone("👨🏼‍🦰"); - constexpr std::string man_red_haired_tone3("👨🏽‍🦰"); - constexpr std::string man_red_haired_medium_skin_tone("👨🏽‍🦰"); - constexpr std::string man_red_haired_tone4("👨🏾‍🦰"); - constexpr std::string man_red_haired_medium_dark_skin_tone("👨🏾‍🦰"); - constexpr std::string man_red_haired_tone5("👨🏿‍🦰"); - constexpr std::string man_red_haired_dark_skin_tone("👨🏿‍🦰"); - constexpr std::string blond_haired_person("👱"); - constexpr std::string person_with_blond_hair("👱"); - constexpr std::string blond_haired_person_tone1("👱🏻"); - constexpr std::string person_with_blond_hair_tone1("👱🏻"); - constexpr std::string blond_haired_person_tone2("👱🏼"); - constexpr std::string person_with_blond_hair_tone2("👱🏼"); - constexpr std::string blond_haired_person_tone3("👱🏽"); - constexpr std::string person_with_blond_hair_tone3("👱🏽"); - constexpr std::string blond_haired_person_tone4("👱🏾"); - constexpr std::string person_with_blond_hair_tone4("👱🏾"); - constexpr std::string blond_haired_person_tone5("👱🏿"); - constexpr std::string person_with_blond_hair_tone5("👱🏿"); - constexpr std::string blond_haired_woman("👱‍♀️"); - constexpr std::string blond_haired_woman_tone1("👱🏻‍♀️"); - constexpr std::string blond_haired_woman_light_skin_tone("👱🏻‍♀️"); - constexpr std::string blond_haired_woman_tone2("👱🏼‍♀️"); - constexpr std::string blond_haired_woman_medium_light_skin_tone("👱🏼‍♀️"); - constexpr std::string blond_haired_woman_tone3("👱🏽‍♀️"); - constexpr std::string blond_haired_woman_medium_skin_tone("👱🏽‍♀️"); - constexpr std::string blond_haired_woman_tone4("👱🏾‍♀️"); - constexpr std::string blond_haired_woman_medium_dark_skin_tone("👱🏾‍♀️"); - constexpr std::string blond_haired_woman_tone5("👱🏿‍♀️"); - constexpr std::string blond_haired_woman_dark_skin_tone("👱🏿‍♀️"); - constexpr std::string blond_haired_man("👱‍♂️"); - constexpr std::string blond_haired_man_tone1("👱🏻‍♂️"); - constexpr std::string blond_haired_man_light_skin_tone("👱🏻‍♂️"); - constexpr std::string blond_haired_man_tone2("👱🏼‍♂️"); - constexpr std::string blond_haired_man_medium_light_skin_tone("👱🏼‍♂️"); - constexpr std::string blond_haired_man_tone3("👱🏽‍♂️"); - constexpr std::string blond_haired_man_medium_skin_tone("👱🏽‍♂️"); - constexpr std::string blond_haired_man_tone4("👱🏾‍♂️"); - constexpr std::string blond_haired_man_medium_dark_skin_tone("👱🏾‍♂️"); - constexpr std::string blond_haired_man_tone5("👱🏿‍♂️"); - constexpr std::string blond_haired_man_dark_skin_tone("👱🏿‍♂️"); - constexpr std::string person_white_hair("🧑‍🦳"); - constexpr std::string person_tone1_white_hair("🧑🏻‍🦳"); - constexpr std::string person_light_skin_tone_white_hair("🧑🏻‍🦳"); - constexpr std::string person_tone2_white_hair("🧑🏼‍🦳"); - constexpr std::string person_medium_light_skin_tone_white_hair("🧑🏼‍🦳"); - constexpr std::string person_tone3_white_hair("🧑🏽‍🦳"); - constexpr std::string person_medium_skin_tone_white_hair("🧑🏽‍🦳"); - constexpr std::string person_tone4_white_hair("🧑🏾‍🦳"); - constexpr std::string person_medium_dark_skin_tone_white_hair("🧑🏾‍🦳"); - constexpr std::string person_tone5_white_hair("🧑🏿‍🦳"); - constexpr std::string person_dark_skin_tone_white_hair("🧑🏿‍🦳"); - constexpr std::string woman_white_haired("👩‍🦳"); - constexpr std::string woman_white_haired_tone1("👩🏻‍🦳"); - constexpr std::string woman_white_haired_light_skin_tone("👩🏻‍🦳"); - constexpr std::string woman_white_haired_tone2("👩🏼‍🦳"); - constexpr std::string woman_white_haired_medium_light_skin_tone("👩🏼‍🦳"); - constexpr std::string woman_white_haired_tone3("👩🏽‍🦳"); - constexpr std::string woman_white_haired_medium_skin_tone("👩🏽‍🦳"); - constexpr std::string woman_white_haired_tone4("👩🏾‍🦳"); - constexpr std::string woman_white_haired_medium_dark_skin_tone("👩🏾‍🦳"); - constexpr std::string woman_white_haired_tone5("👩🏿‍🦳"); - constexpr std::string woman_white_haired_dark_skin_tone("👩🏿‍🦳"); - constexpr std::string man_white_haired("👨‍🦳"); - constexpr std::string man_white_haired_tone1("👨🏻‍🦳"); - constexpr std::string man_white_haired_light_skin_tone("👨🏻‍🦳"); - constexpr std::string man_white_haired_tone2("👨🏼‍🦳"); - constexpr std::string man_white_haired_medium_light_skin_tone("👨🏼‍🦳"); - constexpr std::string man_white_haired_tone3("👨🏽‍🦳"); - constexpr std::string man_white_haired_medium_skin_tone("👨🏽‍🦳"); - constexpr std::string man_white_haired_tone4("👨🏾‍🦳"); - constexpr std::string man_white_haired_medium_dark_skin_tone("👨🏾‍🦳"); - constexpr std::string man_white_haired_tone5("👨🏿‍🦳"); - constexpr std::string man_white_haired_dark_skin_tone("👨🏿‍🦳"); - constexpr std::string person_bald("🧑‍🦲"); - constexpr std::string person_tone1_bald("🧑🏻‍🦲"); - constexpr std::string person_light_skin_tone_bald("🧑🏻‍🦲"); - constexpr std::string person_tone2_bald("🧑🏼‍🦲"); - constexpr std::string person_medium_light_skin_tone_bald("🧑🏼‍🦲"); - constexpr std::string person_tone3_bald("🧑🏽‍🦲"); - constexpr std::string person_medium_skin_tone_bald("🧑🏽‍🦲"); - constexpr std::string person_tone4_bald("🧑🏾‍🦲"); - constexpr std::string person_medium_dark_skin_tone_bald("🧑🏾‍🦲"); - constexpr std::string person_tone5_bald("🧑🏿‍🦲"); - constexpr std::string person_dark_skin_tone_bald("🧑🏿‍🦲"); - constexpr std::string woman_bald("👩‍🦲"); - constexpr std::string woman_bald_tone1("👩🏻‍🦲"); - constexpr std::string woman_bald_light_skin_tone("👩🏻‍🦲"); - constexpr std::string woman_bald_tone2("👩🏼‍🦲"); - constexpr std::string woman_bald_medium_light_skin_tone("👩🏼‍🦲"); - constexpr std::string woman_bald_tone3("👩🏽‍🦲"); - constexpr std::string woman_bald_medium_skin_tone("👩🏽‍🦲"); - constexpr std::string woman_bald_tone4("👩🏾‍🦲"); - constexpr std::string woman_bald_medium_dark_skin_tone("👩🏾‍🦲"); - constexpr std::string woman_bald_tone5("👩🏿‍🦲"); - constexpr std::string woman_bald_dark_skin_tone("👩🏿‍🦲"); - constexpr std::string man_bald("👨‍🦲"); - constexpr std::string man_bald_tone1("👨🏻‍🦲"); - constexpr std::string man_bald_light_skin_tone("👨🏻‍🦲"); - constexpr std::string man_bald_tone2("👨🏼‍🦲"); - constexpr std::string man_bald_medium_light_skin_tone("👨🏼‍🦲"); - constexpr std::string man_bald_tone3("👨🏽‍🦲"); - constexpr std::string man_bald_medium_skin_tone("👨🏽‍🦲"); - constexpr std::string man_bald_tone4("👨🏾‍🦲"); - constexpr std::string man_bald_medium_dark_skin_tone("👨🏾‍🦲"); - constexpr std::string man_bald_tone5("👨🏿‍🦲"); - constexpr std::string man_bald_dark_skin_tone("👨🏿‍🦲"); - constexpr std::string bearded_person("🧔"); - constexpr std::string bearded_person_tone1("🧔🏻"); - constexpr std::string bearded_person_light_skin_tone("🧔🏻"); - constexpr std::string bearded_person_tone2("🧔🏼"); - constexpr std::string bearded_person_medium_light_skin_tone("🧔🏼"); - constexpr std::string bearded_person_tone3("🧔🏽"); - constexpr std::string bearded_person_medium_skin_tone("🧔🏽"); - constexpr std::string bearded_person_tone4("🧔🏾"); - constexpr std::string bearded_person_medium_dark_skin_tone("🧔🏾"); - constexpr std::string bearded_person_tone5("🧔🏿"); - constexpr std::string bearded_person_dark_skin_tone("🧔🏿"); - constexpr std::string woman_beard("🧔‍♀️"); - constexpr std::string woman_tone1_beard("🧔🏻‍♀️"); - constexpr std::string woman_light_skin_tone_beard("🧔🏻‍♀️"); - constexpr std::string woman_tone2_beard("🧔🏼‍♀️"); - constexpr std::string woman_medium_light_skin_tone_beard("🧔🏼‍♀️"); - constexpr std::string woman_tone3_beard("🧔🏽‍♀️"); - constexpr std::string woman_medium_skin_tone_beard("🧔🏽‍♀️"); - constexpr std::string woman_tone4_beard("🧔🏾‍♀️"); - constexpr std::string woman_medium_dark_skin_tone_beard("🧔🏾‍♀️"); - constexpr std::string woman_tone5_beard("🧔🏿‍♀️"); - constexpr std::string woman_dark_skin_tone_beard("🧔🏿‍♀️"); - constexpr std::string man_beard("🧔‍♂️"); - constexpr std::string man_tone1_beard("🧔🏻‍♂️"); - constexpr std::string man_light_skin_tone_beard("🧔🏻‍♂️"); - constexpr std::string man_tone2_beard("🧔🏼‍♂️"); - constexpr std::string man_medium_light_skin_tone_beard("🧔🏼‍♂️"); - constexpr std::string man_tone3_beard("🧔🏽‍♂️"); - constexpr std::string man_medium_skin_tone_beard("🧔🏽‍♂️"); - constexpr std::string man_tone4_beard("🧔🏾‍♂️"); - constexpr std::string man_medium_dark_skin_tone_beard("🧔🏾‍♂️"); - constexpr std::string man_tone5_beard("🧔🏿‍♂️"); - constexpr std::string man_dark_skin_tone_beard("🧔🏿‍♂️"); - constexpr std::string older_adult("🧓"); - constexpr std::string older_adult_tone1("🧓🏻"); - constexpr std::string older_adult_light_skin_tone("🧓🏻"); - constexpr std::string older_adult_tone2("🧓🏼"); - constexpr std::string older_adult_medium_light_skin_tone("🧓🏼"); - constexpr std::string older_adult_tone3("🧓🏽"); - constexpr std::string older_adult_medium_skin_tone("🧓🏽"); - constexpr std::string older_adult_tone4("🧓🏾"); - constexpr std::string older_adult_medium_dark_skin_tone("🧓🏾"); - constexpr std::string older_adult_tone5("🧓🏿"); - constexpr std::string older_adult_dark_skin_tone("🧓🏿"); - constexpr std::string older_woman("👵"); - constexpr std::string grandma("👵"); - constexpr std::string older_woman_tone1("👵🏻"); - constexpr std::string grandma_tone1("👵🏻"); - constexpr std::string older_woman_tone2("👵🏼"); - constexpr std::string grandma_tone2("👵🏼"); - constexpr std::string older_woman_tone3("👵🏽"); - constexpr std::string grandma_tone3("👵🏽"); - constexpr std::string older_woman_tone4("👵🏾"); - constexpr std::string grandma_tone4("👵🏾"); - constexpr std::string older_woman_tone5("👵🏿"); - constexpr std::string grandma_tone5("👵🏿"); - constexpr std::string older_man("👴"); - constexpr std::string older_man_tone1("👴🏻"); - constexpr std::string older_man_tone2("👴🏼"); - constexpr std::string older_man_tone3("👴🏽"); - constexpr std::string older_man_tone4("👴🏾"); - constexpr std::string older_man_tone5("👴🏿"); - constexpr std::string man_with_chinese_cap("👲"); - constexpr std::string man_with_gua_pi_mao("👲"); - constexpr std::string man_with_chinese_cap_tone1("👲🏻"); - constexpr std::string man_with_gua_pi_mao_tone1("👲🏻"); - constexpr std::string man_with_chinese_cap_tone2("👲🏼"); - constexpr std::string man_with_gua_pi_mao_tone2("👲🏼"); - constexpr std::string man_with_chinese_cap_tone3("👲🏽"); - constexpr std::string man_with_gua_pi_mao_tone3("👲🏽"); - constexpr std::string man_with_chinese_cap_tone4("👲🏾"); - constexpr std::string man_with_gua_pi_mao_tone4("👲🏾"); - constexpr std::string man_with_chinese_cap_tone5("👲🏿"); - constexpr std::string man_with_gua_pi_mao_tone5("👲🏿"); - constexpr std::string person_wearing_turban("👳"); - constexpr std::string man_with_turban("👳"); - constexpr std::string person_wearing_turban_tone1("👳🏻"); - constexpr std::string man_with_turban_tone1("👳🏻"); - constexpr std::string person_wearing_turban_tone2("👳🏼"); - constexpr std::string man_with_turban_tone2("👳🏼"); - constexpr std::string person_wearing_turban_tone3("👳🏽"); - constexpr std::string man_with_turban_tone3("👳🏽"); - constexpr std::string person_wearing_turban_tone4("👳🏾"); - constexpr std::string man_with_turban_tone4("👳🏾"); - constexpr std::string person_wearing_turban_tone5("👳🏿"); - constexpr std::string man_with_turban_tone5("👳🏿"); - constexpr std::string woman_wearing_turban("👳‍♀️"); - constexpr std::string woman_wearing_turban_tone1("👳🏻‍♀️"); - constexpr std::string woman_wearing_turban_light_skin_tone("👳🏻‍♀️"); - constexpr std::string woman_wearing_turban_tone2("👳🏼‍♀️"); - constexpr std::string woman_wearing_turban_medium_light_skin_tone("👳🏼‍♀️"); - constexpr std::string woman_wearing_turban_tone3("👳🏽‍♀️"); - constexpr std::string woman_wearing_turban_medium_skin_tone("👳🏽‍♀️"); - constexpr std::string woman_wearing_turban_tone4("👳🏾‍♀️"); - constexpr std::string woman_wearing_turban_medium_dark_skin_tone("👳🏾‍♀️"); - constexpr std::string woman_wearing_turban_tone5("👳🏿‍♀️"); - constexpr std::string woman_wearing_turban_dark_skin_tone("👳🏿‍♀️"); - constexpr std::string man_wearing_turban("👳‍♂️"); - constexpr std::string man_wearing_turban_tone1("👳🏻‍♂️"); - constexpr std::string man_wearing_turban_light_skin_tone("👳🏻‍♂️"); - constexpr std::string man_wearing_turban_tone2("👳🏼‍♂️"); - constexpr std::string man_wearing_turban_medium_light_skin_tone("👳🏼‍♂️"); - constexpr std::string man_wearing_turban_tone3("👳🏽‍♂️"); - constexpr std::string man_wearing_turban_medium_skin_tone("👳🏽‍♂️"); - constexpr std::string man_wearing_turban_tone4("👳🏾‍♂️"); - constexpr std::string man_wearing_turban_medium_dark_skin_tone("👳🏾‍♂️"); - constexpr std::string man_wearing_turban_tone5("👳🏿‍♂️"); - constexpr std::string man_wearing_turban_dark_skin_tone("👳🏿‍♂️"); - constexpr std::string woman_with_headscarf("🧕"); - constexpr std::string woman_with_headscarf_tone1("🧕🏻"); - constexpr std::string woman_with_headscarf_light_skin_tone("🧕🏻"); - constexpr std::string woman_with_headscarf_tone2("🧕🏼"); - constexpr std::string woman_with_headscarf_medium_light_skin_tone("🧕🏼"); - constexpr std::string woman_with_headscarf_tone3("🧕🏽"); - constexpr std::string woman_with_headscarf_medium_skin_tone("🧕🏽"); - constexpr std::string woman_with_headscarf_tone4("🧕🏾"); - constexpr std::string woman_with_headscarf_medium_dark_skin_tone("🧕🏾"); - constexpr std::string woman_with_headscarf_tone5("🧕🏿"); - constexpr std::string woman_with_headscarf_dark_skin_tone("🧕🏿"); - constexpr std::string police_officer("👮"); - constexpr std::string cop("👮"); - constexpr std::string police_officer_tone1("👮🏻"); - constexpr std::string cop_tone1("👮🏻"); - constexpr std::string police_officer_tone2("👮🏼"); - constexpr std::string cop_tone2("👮🏼"); - constexpr std::string police_officer_tone3("👮🏽"); - constexpr std::string cop_tone3("👮🏽"); - constexpr std::string police_officer_tone4("👮🏾"); - constexpr std::string cop_tone4("👮🏾"); - constexpr std::string police_officer_tone5("👮🏿"); - constexpr std::string cop_tone5("👮🏿"); - constexpr std::string woman_police_officer("👮‍♀️"); - constexpr std::string woman_police_officer_tone1("👮🏻‍♀️"); - constexpr std::string woman_police_officer_light_skin_tone("👮🏻‍♀️"); - constexpr std::string woman_police_officer_tone2("👮🏼‍♀️"); - constexpr std::string woman_police_officer_medium_light_skin_tone("👮🏼‍♀️"); - constexpr std::string woman_police_officer_tone3("👮🏽‍♀️"); - constexpr std::string woman_police_officer_medium_skin_tone("👮🏽‍♀️"); - constexpr std::string woman_police_officer_tone4("👮🏾‍♀️"); - constexpr std::string woman_police_officer_medium_dark_skin_tone("👮🏾‍♀️"); - constexpr std::string woman_police_officer_tone5("👮🏿‍♀️"); - constexpr std::string woman_police_officer_dark_skin_tone("👮🏿‍♀️"); - constexpr std::string man_police_officer("👮‍♂️"); - constexpr std::string man_police_officer_tone1("👮🏻‍♂️"); - constexpr std::string man_police_officer_light_skin_tone("👮🏻‍♂️"); - constexpr std::string man_police_officer_tone2("👮🏼‍♂️"); - constexpr std::string man_police_officer_medium_light_skin_tone("👮🏼‍♂️"); - constexpr std::string man_police_officer_tone3("👮🏽‍♂️"); - constexpr std::string man_police_officer_medium_skin_tone("👮🏽‍♂️"); - constexpr std::string man_police_officer_tone4("👮🏾‍♂️"); - constexpr std::string man_police_officer_medium_dark_skin_tone("👮🏾‍♂️"); - constexpr std::string man_police_officer_tone5("👮🏿‍♂️"); - constexpr std::string man_police_officer_dark_skin_tone("👮🏿‍♂️"); - constexpr std::string construction_worker("👷"); - constexpr std::string construction_worker_tone1("👷🏻"); - constexpr std::string construction_worker_tone2("👷🏼"); - constexpr std::string construction_worker_tone3("👷🏽"); - constexpr std::string construction_worker_tone4("👷🏾"); - constexpr std::string construction_worker_tone5("👷🏿"); - constexpr std::string woman_construction_worker("👷‍♀️"); - constexpr std::string woman_construction_worker_tone1("👷🏻‍♀️"); - constexpr std::string woman_construction_worker_light_skin_tone("👷🏻‍♀️"); - constexpr std::string woman_construction_worker_tone2("👷🏼‍♀️"); - constexpr std::string woman_construction_worker_medium_light_skin_tone("👷🏼‍♀️"); - constexpr std::string woman_construction_worker_tone3("👷🏽‍♀️"); - constexpr std::string woman_construction_worker_medium_skin_tone("👷🏽‍♀️"); - constexpr std::string woman_construction_worker_tone4("👷🏾‍♀️"); - constexpr std::string woman_construction_worker_medium_dark_skin_tone("👷🏾‍♀️"); - constexpr std::string woman_construction_worker_tone5("👷🏿‍♀️"); - constexpr std::string woman_construction_worker_dark_skin_tone("👷🏿‍♀️"); - constexpr std::string man_construction_worker("👷‍♂️"); - constexpr std::string man_construction_worker_tone1("👷🏻‍♂️"); - constexpr std::string man_construction_worker_light_skin_tone("👷🏻‍♂️"); - constexpr std::string man_construction_worker_tone2("👷🏼‍♂️"); - constexpr std::string man_construction_worker_medium_light_skin_tone("👷🏼‍♂️"); - constexpr std::string man_construction_worker_tone3("👷🏽‍♂️"); - constexpr std::string man_construction_worker_medium_skin_tone("👷🏽‍♂️"); - constexpr std::string man_construction_worker_tone4("👷🏾‍♂️"); - constexpr std::string man_construction_worker_medium_dark_skin_tone("👷🏾‍♂️"); - constexpr std::string man_construction_worker_tone5("👷🏿‍♂️"); - constexpr std::string man_construction_worker_dark_skin_tone("👷🏿‍♂️"); - constexpr std::string guard("💂"); - constexpr std::string guardsman("💂"); - constexpr std::string guard_tone1("💂🏻"); - constexpr std::string guardsman_tone1("💂🏻"); - constexpr std::string guard_tone2("💂🏼"); - constexpr std::string guardsman_tone2("💂🏼"); - constexpr std::string guard_tone3("💂🏽"); - constexpr std::string guardsman_tone3("💂🏽"); - constexpr std::string guard_tone4("💂🏾"); - constexpr std::string guardsman_tone4("💂🏾"); - constexpr std::string guard_tone5("💂🏿"); - constexpr std::string guardsman_tone5("💂🏿"); - constexpr std::string woman_guard("💂‍♀️"); - constexpr std::string woman_guard_tone1("💂🏻‍♀️"); - constexpr std::string woman_guard_light_skin_tone("💂🏻‍♀️"); - constexpr std::string woman_guard_tone2("💂🏼‍♀️"); - constexpr std::string woman_guard_medium_light_skin_tone("💂🏼‍♀️"); - constexpr std::string woman_guard_tone3("💂🏽‍♀️"); - constexpr std::string woman_guard_medium_skin_tone("💂🏽‍♀️"); - constexpr std::string woman_guard_tone4("💂🏾‍♀️"); - constexpr std::string woman_guard_medium_dark_skin_tone("💂🏾‍♀️"); - constexpr std::string woman_guard_tone5("💂🏿‍♀️"); - constexpr std::string woman_guard_dark_skin_tone("💂🏿‍♀️"); - constexpr std::string man_guard("💂‍♂️"); - constexpr std::string man_guard_tone1("💂🏻‍♂️"); - constexpr std::string man_guard_light_skin_tone("💂🏻‍♂️"); - constexpr std::string man_guard_tone2("💂🏼‍♂️"); - constexpr std::string man_guard_medium_light_skin_tone("💂🏼‍♂️"); - constexpr std::string man_guard_tone3("💂🏽‍♂️"); - constexpr std::string man_guard_medium_skin_tone("💂🏽‍♂️"); - constexpr std::string man_guard_tone4("💂🏾‍♂️"); - constexpr std::string man_guard_medium_dark_skin_tone("💂🏾‍♂️"); - constexpr std::string man_guard_tone5("💂🏿‍♂️"); - constexpr std::string man_guard_dark_skin_tone("💂🏿‍♂️"); - constexpr std::string detective("🕵️"); - constexpr std::string spy("🕵️"); - constexpr std::string sleuth_or_spy("🕵️"); - constexpr std::string detective_tone1("🕵🏻"); - constexpr std::string spy_tone1("🕵🏻"); - constexpr std::string sleuth_or_spy_tone1("🕵🏻"); - constexpr std::string detective_tone2("🕵🏼"); - constexpr std::string spy_tone2("🕵🏼"); - constexpr std::string sleuth_or_spy_tone2("🕵🏼"); - constexpr std::string detective_tone3("🕵🏽"); - constexpr std::string spy_tone3("🕵🏽"); - constexpr std::string sleuth_or_spy_tone3("🕵🏽"); - constexpr std::string detective_tone4("🕵🏾"); - constexpr std::string spy_tone4("🕵🏾"); - constexpr std::string sleuth_or_spy_tone4("🕵🏾"); - constexpr std::string detective_tone5("🕵🏿"); - constexpr std::string spy_tone5("🕵🏿"); - constexpr std::string sleuth_or_spy_tone5("🕵🏿"); - constexpr std::string woman_detective("🕵️‍♀️"); - constexpr std::string woman_detective_tone1("🕵🏻‍♀️"); - constexpr std::string woman_detective_light_skin_tone("🕵🏻‍♀️"); - constexpr std::string woman_detective_tone2("🕵🏼‍♀️"); - constexpr std::string woman_detective_medium_light_skin_tone("🕵🏼‍♀️"); - constexpr std::string woman_detective_tone3("🕵🏽‍♀️"); - constexpr std::string woman_detective_medium_skin_tone("🕵🏽‍♀️"); - constexpr std::string woman_detective_tone4("🕵🏾‍♀️"); - constexpr std::string woman_detective_medium_dark_skin_tone("🕵🏾‍♀️"); - constexpr std::string woman_detective_tone5("🕵🏿‍♀️"); - constexpr std::string woman_detective_dark_skin_tone("🕵🏿‍♀️"); - constexpr std::string man_detective("🕵️‍♂️"); - constexpr std::string man_detective_tone1("🕵🏻‍♂️"); - constexpr std::string man_detective_light_skin_tone("🕵🏻‍♂️"); - constexpr std::string man_detective_tone2("🕵🏼‍♂️"); - constexpr std::string man_detective_medium_light_skin_tone("🕵🏼‍♂️"); - constexpr std::string man_detective_tone3("🕵🏽‍♂️"); - constexpr std::string man_detective_medium_skin_tone("🕵🏽‍♂️"); - constexpr std::string man_detective_tone4("🕵🏾‍♂️"); - constexpr std::string man_detective_medium_dark_skin_tone("🕵🏾‍♂️"); - constexpr std::string man_detective_tone5("🕵🏿‍♂️"); - constexpr std::string man_detective_dark_skin_tone("🕵🏿‍♂️"); - constexpr std::string health_worker("🧑‍⚕️"); - constexpr std::string health_worker_tone1("🧑🏻‍⚕️"); - constexpr std::string health_worker_light_skin_tone("🧑🏻‍⚕️"); - constexpr std::string health_worker_tone2("🧑🏼‍⚕️"); - constexpr std::string health_worker_medium_light_skin_tone("🧑🏼‍⚕️"); - constexpr std::string health_worker_tone3("🧑🏽‍⚕️"); - constexpr std::string health_worker_medium_skin_tone("🧑🏽‍⚕️"); - constexpr std::string health_worker_tone4("🧑🏾‍⚕️"); - constexpr std::string health_worker_medium_dark_skin_tone("🧑🏾‍⚕️"); - constexpr std::string health_worker_tone5("🧑🏿‍⚕️"); - constexpr std::string health_worker_dark_skin_tone("🧑🏿‍⚕️"); - constexpr std::string woman_health_worker("👩‍⚕️"); - constexpr std::string woman_health_worker_tone1("👩🏻‍⚕️"); - constexpr std::string woman_health_worker_light_skin_tone("👩🏻‍⚕️"); - constexpr std::string woman_health_worker_tone2("👩🏼‍⚕️"); - constexpr std::string woman_health_worker_medium_light_skin_tone("👩🏼‍⚕️"); - constexpr std::string woman_health_worker_tone3("👩🏽‍⚕️"); - constexpr std::string woman_health_worker_medium_skin_tone("👩🏽‍⚕️"); - constexpr std::string woman_health_worker_tone4("👩🏾‍⚕️"); - constexpr std::string woman_health_worker_medium_dark_skin_tone("👩🏾‍⚕️"); - constexpr std::string woman_health_worker_tone5("👩🏿‍⚕️"); - constexpr std::string woman_health_worker_dark_skin_tone("👩🏿‍⚕️"); - constexpr std::string man_health_worker("👨‍⚕️"); - constexpr std::string man_health_worker_tone1("👨🏻‍⚕️"); - constexpr std::string man_health_worker_light_skin_tone("👨🏻‍⚕️"); - constexpr std::string man_health_worker_tone2("👨🏼‍⚕️"); - constexpr std::string man_health_worker_medium_light_skin_tone("👨🏼‍⚕️"); - constexpr std::string man_health_worker_tone3("👨🏽‍⚕️"); - constexpr std::string man_health_worker_medium_skin_tone("👨🏽‍⚕️"); - constexpr std::string man_health_worker_tone4("👨🏾‍⚕️"); - constexpr std::string man_health_worker_medium_dark_skin_tone("👨🏾‍⚕️"); - constexpr std::string man_health_worker_tone5("👨🏿‍⚕️"); - constexpr std::string man_health_worker_dark_skin_tone("👨🏿‍⚕️"); - constexpr std::string farmer("🧑‍🌾"); - constexpr std::string farmer_tone1("🧑🏻‍🌾"); - constexpr std::string farmer_light_skin_tone("🧑🏻‍🌾"); - constexpr std::string farmer_tone2("🧑🏼‍🌾"); - constexpr std::string farmer_medium_light_skin_tone("🧑🏼‍🌾"); - constexpr std::string farmer_tone3("🧑🏽‍🌾"); - constexpr std::string farmer_medium_skin_tone("🧑🏽‍🌾"); - constexpr std::string farmer_tone4("🧑🏾‍🌾"); - constexpr std::string farmer_medium_dark_skin_tone("🧑🏾‍🌾"); - constexpr std::string farmer_tone5("🧑🏿‍🌾"); - constexpr std::string farmer_dark_skin_tone("🧑🏿‍🌾"); - constexpr std::string woman_farmer("👩‍🌾"); - constexpr std::string woman_farmer_tone1("👩🏻‍🌾"); - constexpr std::string woman_farmer_light_skin_tone("👩🏻‍🌾"); - constexpr std::string woman_farmer_tone2("👩🏼‍🌾"); - constexpr std::string woman_farmer_medium_light_skin_tone("👩🏼‍🌾"); - constexpr std::string woman_farmer_tone3("👩🏽‍🌾"); - constexpr std::string woman_farmer_medium_skin_tone("👩🏽‍🌾"); - constexpr std::string woman_farmer_tone4("👩🏾‍🌾"); - constexpr std::string woman_farmer_medium_dark_skin_tone("👩🏾‍🌾"); - constexpr std::string woman_farmer_tone5("👩🏿‍🌾"); - constexpr std::string woman_farmer_dark_skin_tone("👩🏿‍🌾"); - constexpr std::string man_farmer("👨‍🌾"); - constexpr std::string man_farmer_tone1("👨🏻‍🌾"); - constexpr std::string man_farmer_light_skin_tone("👨🏻‍🌾"); - constexpr std::string man_farmer_tone2("👨🏼‍🌾"); - constexpr std::string man_farmer_medium_light_skin_tone("👨🏼‍🌾"); - constexpr std::string man_farmer_tone3("👨🏽‍🌾"); - constexpr std::string man_farmer_medium_skin_tone("👨🏽‍🌾"); - constexpr std::string man_farmer_tone4("👨🏾‍🌾"); - constexpr std::string man_farmer_medium_dark_skin_tone("👨🏾‍🌾"); - constexpr std::string man_farmer_tone5("👨🏿‍🌾"); - constexpr std::string man_farmer_dark_skin_tone("👨🏿‍🌾"); - constexpr std::string cook("🧑‍🍳"); - constexpr std::string cook_tone1("🧑🏻‍🍳"); - constexpr std::string cook_light_skin_tone("🧑🏻‍🍳"); - constexpr std::string cook_tone2("🧑🏼‍🍳"); - constexpr std::string cook_medium_light_skin_tone("🧑🏼‍🍳"); - constexpr std::string cook_tone3("🧑🏽‍🍳"); - constexpr std::string cook_medium_skin_tone("🧑🏽‍🍳"); - constexpr std::string cook_tone4("🧑🏾‍🍳"); - constexpr std::string cook_medium_dark_skin_tone("🧑🏾‍🍳"); - constexpr std::string cook_tone5("🧑🏿‍🍳"); - constexpr std::string cook_dark_skin_tone("🧑🏿‍🍳"); - constexpr std::string woman_cook("👩‍🍳"); - constexpr std::string woman_cook_tone1("👩🏻‍🍳"); - constexpr std::string woman_cook_light_skin_tone("👩🏻‍🍳"); - constexpr std::string woman_cook_tone2("👩🏼‍🍳"); - constexpr std::string woman_cook_medium_light_skin_tone("👩🏼‍🍳"); - constexpr std::string woman_cook_tone3("👩🏽‍🍳"); - constexpr std::string woman_cook_medium_skin_tone("👩🏽‍🍳"); - constexpr std::string woman_cook_tone4("👩🏾‍🍳"); - constexpr std::string woman_cook_medium_dark_skin_tone("👩🏾‍🍳"); - constexpr std::string woman_cook_tone5("👩🏿‍🍳"); - constexpr std::string woman_cook_dark_skin_tone("👩🏿‍🍳"); - constexpr std::string man_cook("👨‍🍳"); - constexpr std::string man_cook_tone1("👨🏻‍🍳"); - constexpr std::string man_cook_light_skin_tone("👨🏻‍🍳"); - constexpr std::string man_cook_tone2("👨🏼‍🍳"); - constexpr std::string man_cook_medium_light_skin_tone("👨🏼‍🍳"); - constexpr std::string man_cook_tone3("👨🏽‍🍳"); - constexpr std::string man_cook_medium_skin_tone("👨🏽‍🍳"); - constexpr std::string man_cook_tone4("👨🏾‍🍳"); - constexpr std::string man_cook_medium_dark_skin_tone("👨🏾‍🍳"); - constexpr std::string man_cook_tone5("👨🏿‍🍳"); - constexpr std::string man_cook_dark_skin_tone("👨🏿‍🍳"); - constexpr std::string student("🧑‍🎓"); - constexpr std::string student_tone1("🧑🏻‍🎓"); - constexpr std::string student_light_skin_tone("🧑🏻‍🎓"); - constexpr std::string student_tone2("🧑🏼‍🎓"); - constexpr std::string student_medium_light_skin_tone("🧑🏼‍🎓"); - constexpr std::string student_tone3("🧑🏽‍🎓"); - constexpr std::string student_medium_skin_tone("🧑🏽‍🎓"); - constexpr std::string student_tone4("🧑🏾‍🎓"); - constexpr std::string student_medium_dark_skin_tone("🧑🏾‍🎓"); - constexpr std::string student_tone5("🧑🏿‍🎓"); - constexpr std::string student_dark_skin_tone("🧑🏿‍🎓"); - constexpr std::string woman_student("👩‍🎓"); - constexpr std::string woman_student_tone1("👩🏻‍🎓"); - constexpr std::string woman_student_light_skin_tone("👩🏻‍🎓"); - constexpr std::string woman_student_tone2("👩🏼‍🎓"); - constexpr std::string woman_student_medium_light_skin_tone("👩🏼‍🎓"); - constexpr std::string woman_student_tone3("👩🏽‍🎓"); - constexpr std::string woman_student_medium_skin_tone("👩🏽‍🎓"); - constexpr std::string woman_student_tone4("👩🏾‍🎓"); - constexpr std::string woman_student_medium_dark_skin_tone("👩🏾‍🎓"); - constexpr std::string woman_student_tone5("👩🏿‍🎓"); - constexpr std::string woman_student_dark_skin_tone("👩🏿‍🎓"); - constexpr std::string man_student("👨‍🎓"); - constexpr std::string man_student_tone1("👨🏻‍🎓"); - constexpr std::string man_student_light_skin_tone("👨🏻‍🎓"); - constexpr std::string man_student_tone2("👨🏼‍🎓"); - constexpr std::string man_student_medium_light_skin_tone("👨🏼‍🎓"); - constexpr std::string man_student_tone3("👨🏽‍🎓"); - constexpr std::string man_student_medium_skin_tone("👨🏽‍🎓"); - constexpr std::string man_student_tone4("👨🏾‍🎓"); - constexpr std::string man_student_medium_dark_skin_tone("👨🏾‍🎓"); - constexpr std::string man_student_tone5("👨🏿‍🎓"); - constexpr std::string man_student_dark_skin_tone("👨🏿‍🎓"); - constexpr std::string singer("🧑‍🎤"); - constexpr std::string singer_tone1("🧑🏻‍🎤"); - constexpr std::string singer_light_skin_tone("🧑🏻‍🎤"); - constexpr std::string singer_tone2("🧑🏼‍🎤"); - constexpr std::string singer_medium_light_skin_tone("🧑🏼‍🎤"); - constexpr std::string singer_tone3("🧑🏽‍🎤"); - constexpr std::string singer_medium_skin_tone("🧑🏽‍🎤"); - constexpr std::string singer_tone4("🧑🏾‍🎤"); - constexpr std::string singer_medium_dark_skin_tone("🧑🏾‍🎤"); - constexpr std::string singer_tone5("🧑🏿‍🎤"); - constexpr std::string singer_dark_skin_tone("🧑🏿‍🎤"); - constexpr std::string woman_singer("👩‍🎤"); - constexpr std::string woman_singer_tone1("👩🏻‍🎤"); - constexpr std::string woman_singer_light_skin_tone("👩🏻‍🎤"); - constexpr std::string woman_singer_tone2("👩🏼‍🎤"); - constexpr std::string woman_singer_medium_light_skin_tone("👩🏼‍🎤"); - constexpr std::string woman_singer_tone3("👩🏽‍🎤"); - constexpr std::string woman_singer_medium_skin_tone("👩🏽‍🎤"); - constexpr std::string woman_singer_tone4("👩🏾‍🎤"); - constexpr std::string woman_singer_medium_dark_skin_tone("👩🏾‍🎤"); - constexpr std::string woman_singer_tone5("👩🏿‍🎤"); - constexpr std::string woman_singer_dark_skin_tone("👩🏿‍🎤"); - constexpr std::string man_singer("👨‍🎤"); - constexpr std::string man_singer_tone1("👨🏻‍🎤"); - constexpr std::string man_singer_light_skin_tone("👨🏻‍🎤"); - constexpr std::string man_singer_tone2("👨🏼‍🎤"); - constexpr std::string man_singer_medium_light_skin_tone("👨🏼‍🎤"); - constexpr std::string man_singer_tone3("👨🏽‍🎤"); - constexpr std::string man_singer_medium_skin_tone("👨🏽‍🎤"); - constexpr std::string man_singer_tone4("👨🏾‍🎤"); - constexpr std::string man_singer_medium_dark_skin_tone("👨🏾‍🎤"); - constexpr std::string man_singer_tone5("👨🏿‍🎤"); - constexpr std::string man_singer_dark_skin_tone("👨🏿‍🎤"); - constexpr std::string teacher("🧑‍🏫"); - constexpr std::string teacher_tone1("🧑🏻‍🏫"); - constexpr std::string teacher_light_skin_tone("🧑🏻‍🏫"); - constexpr std::string teacher_tone2("🧑🏼‍🏫"); - constexpr std::string teacher_medium_light_skin_tone("🧑🏼‍🏫"); - constexpr std::string teacher_tone3("🧑🏽‍🏫"); - constexpr std::string teacher_medium_skin_tone("🧑🏽‍🏫"); - constexpr std::string teacher_tone4("🧑🏾‍🏫"); - constexpr std::string teacher_medium_dark_skin_tone("🧑🏾‍🏫"); - constexpr std::string teacher_tone5("🧑🏿‍🏫"); - constexpr std::string teacher_dark_skin_tone("🧑🏿‍🏫"); - constexpr std::string woman_teacher("👩‍🏫"); - constexpr std::string woman_teacher_tone1("👩🏻‍🏫"); - constexpr std::string woman_teacher_light_skin_tone("👩🏻‍🏫"); - constexpr std::string woman_teacher_tone2("👩🏼‍🏫"); - constexpr std::string woman_teacher_medium_light_skin_tone("👩🏼‍🏫"); - constexpr std::string woman_teacher_tone3("👩🏽‍🏫"); - constexpr std::string woman_teacher_medium_skin_tone("👩🏽‍🏫"); - constexpr std::string woman_teacher_tone4("👩🏾‍🏫"); - constexpr std::string woman_teacher_medium_dark_skin_tone("👩🏾‍🏫"); - constexpr std::string woman_teacher_tone5("👩🏿‍🏫"); - constexpr std::string woman_teacher_dark_skin_tone("👩🏿‍🏫"); - constexpr std::string man_teacher("👨‍🏫"); - constexpr std::string man_teacher_tone1("👨🏻‍🏫"); - constexpr std::string man_teacher_light_skin_tone("👨🏻‍🏫"); - constexpr std::string man_teacher_tone2("👨🏼‍🏫"); - constexpr std::string man_teacher_medium_light_skin_tone("👨🏼‍🏫"); - constexpr std::string man_teacher_tone3("👨🏽‍🏫"); - constexpr std::string man_teacher_medium_skin_tone("👨🏽‍🏫"); - constexpr std::string man_teacher_tone4("👨🏾‍🏫"); - constexpr std::string man_teacher_medium_dark_skin_tone("👨🏾‍🏫"); - constexpr std::string man_teacher_tone5("👨🏿‍🏫"); - constexpr std::string man_teacher_dark_skin_tone("👨🏿‍🏫"); - constexpr std::string factory_worker("🧑‍🏭"); - constexpr std::string factory_worker_tone1("🧑🏻‍🏭"); - constexpr std::string factory_worker_light_skin_tone("🧑🏻‍🏭"); - constexpr std::string factory_worker_tone2("🧑🏼‍🏭"); - constexpr std::string factory_worker_medium_light_skin_tone("🧑🏼‍🏭"); - constexpr std::string factory_worker_tone3("🧑🏽‍🏭"); - constexpr std::string factory_worker_medium_skin_tone("🧑🏽‍🏭"); - constexpr std::string factory_worker_tone4("🧑🏾‍🏭"); - constexpr std::string factory_worker_medium_dark_skin_tone("🧑🏾‍🏭"); - constexpr std::string factory_worker_tone5("🧑🏿‍🏭"); - constexpr std::string factory_worker_dark_skin_tone("🧑🏿‍🏭"); - constexpr std::string woman_factory_worker("👩‍🏭"); - constexpr std::string woman_factory_worker_tone1("👩🏻‍🏭"); - constexpr std::string woman_factory_worker_light_skin_tone("👩🏻‍🏭"); - constexpr std::string woman_factory_worker_tone2("👩🏼‍🏭"); - constexpr std::string woman_factory_worker_medium_light_skin_tone("👩🏼‍🏭"); - constexpr std::string woman_factory_worker_tone3("👩🏽‍🏭"); - constexpr std::string woman_factory_worker_medium_skin_tone("👩🏽‍🏭"); - constexpr std::string woman_factory_worker_tone4("👩🏾‍🏭"); - constexpr std::string woman_factory_worker_medium_dark_skin_tone("👩🏾‍🏭"); - constexpr std::string woman_factory_worker_tone5("👩🏿‍🏭"); - constexpr std::string woman_factory_worker_dark_skin_tone("👩🏿‍🏭"); - constexpr std::string man_factory_worker("👨‍🏭"); - constexpr std::string man_factory_worker_tone1("👨🏻‍🏭"); - constexpr std::string man_factory_worker_light_skin_tone("👨🏻‍🏭"); - constexpr std::string man_factory_worker_tone2("👨🏼‍🏭"); - constexpr std::string man_factory_worker_medium_light_skin_tone("👨🏼‍🏭"); - constexpr std::string man_factory_worker_tone3("👨🏽‍🏭"); - constexpr std::string man_factory_worker_medium_skin_tone("👨🏽‍🏭"); - constexpr std::string man_factory_worker_tone4("👨🏾‍🏭"); - constexpr std::string man_factory_worker_medium_dark_skin_tone("👨🏾‍🏭"); - constexpr std::string man_factory_worker_tone5("👨🏿‍🏭"); - constexpr std::string man_factory_worker_dark_skin_tone("👨🏿‍🏭"); - constexpr std::string technologist("🧑‍💻"); - constexpr std::string technologist_tone1("🧑🏻‍💻"); - constexpr std::string technologist_light_skin_tone("🧑🏻‍💻"); - constexpr std::string technologist_tone2("🧑🏼‍💻"); - constexpr std::string technologist_medium_light_skin_tone("🧑🏼‍💻"); - constexpr std::string technologist_tone3("🧑🏽‍💻"); - constexpr std::string technologist_medium_skin_tone("🧑🏽‍💻"); - constexpr std::string technologist_tone4("🧑🏾‍💻"); - constexpr std::string technologist_medium_dark_skin_tone("🧑🏾‍💻"); - constexpr std::string technologist_tone5("🧑🏿‍💻"); - constexpr std::string technologist_dark_skin_tone("🧑🏿‍💻"); - constexpr std::string woman_technologist("👩‍💻"); - constexpr std::string woman_technologist_tone1("👩🏻‍💻"); - constexpr std::string woman_technologist_light_skin_tone("👩🏻‍💻"); - constexpr std::string woman_technologist_tone2("👩🏼‍💻"); - constexpr std::string woman_technologist_medium_light_skin_tone("👩🏼‍💻"); - constexpr std::string woman_technologist_tone3("👩🏽‍💻"); - constexpr std::string woman_technologist_medium_skin_tone("👩🏽‍💻"); - constexpr std::string woman_technologist_tone4("👩🏾‍💻"); - constexpr std::string woman_technologist_medium_dark_skin_tone("👩🏾‍💻"); - constexpr std::string woman_technologist_tone5("👩🏿‍💻"); - constexpr std::string woman_technologist_dark_skin_tone("👩🏿‍💻"); - constexpr std::string man_technologist("👨‍💻"); - constexpr std::string man_technologist_tone1("👨🏻‍💻"); - constexpr std::string man_technologist_light_skin_tone("👨🏻‍💻"); - constexpr std::string man_technologist_tone2("👨🏼‍💻"); - constexpr std::string man_technologist_medium_light_skin_tone("👨🏼‍💻"); - constexpr std::string man_technologist_tone3("👨🏽‍💻"); - constexpr std::string man_technologist_medium_skin_tone("👨🏽‍💻"); - constexpr std::string man_technologist_tone4("👨🏾‍💻"); - constexpr std::string man_technologist_medium_dark_skin_tone("👨🏾‍💻"); - constexpr std::string man_technologist_tone5("👨🏿‍💻"); - constexpr std::string man_technologist_dark_skin_tone("👨🏿‍💻"); - constexpr std::string office_worker("🧑‍💼"); - constexpr std::string office_worker_tone1("🧑🏻‍💼"); - constexpr std::string office_worker_light_skin_tone("🧑🏻‍💼"); - constexpr std::string office_worker_tone2("🧑🏼‍💼"); - constexpr std::string office_worker_medium_light_skin_tone("🧑🏼‍💼"); - constexpr std::string office_worker_tone3("🧑🏽‍💼"); - constexpr std::string office_worker_medium_skin_tone("🧑🏽‍💼"); - constexpr std::string office_worker_tone4("🧑🏾‍💼"); - constexpr std::string office_worker_medium_dark_skin_tone("🧑🏾‍💼"); - constexpr std::string office_worker_tone5("🧑🏿‍💼"); - constexpr std::string office_worker_dark_skin_tone("🧑🏿‍💼"); - constexpr std::string woman_office_worker("👩‍💼"); - constexpr std::string woman_office_worker_tone1("👩🏻‍💼"); - constexpr std::string woman_office_worker_light_skin_tone("👩🏻‍💼"); - constexpr std::string woman_office_worker_tone2("👩🏼‍💼"); - constexpr std::string woman_office_worker_medium_light_skin_tone("👩🏼‍💼"); - constexpr std::string woman_office_worker_tone3("👩🏽‍💼"); - constexpr std::string woman_office_worker_medium_skin_tone("👩🏽‍💼"); - constexpr std::string woman_office_worker_tone4("👩🏾‍💼"); - constexpr std::string woman_office_worker_medium_dark_skin_tone("👩🏾‍💼"); - constexpr std::string woman_office_worker_tone5("👩🏿‍💼"); - constexpr std::string woman_office_worker_dark_skin_tone("👩🏿‍💼"); - constexpr std::string man_office_worker("👨‍💼"); - constexpr std::string man_office_worker_tone1("👨🏻‍💼"); - constexpr std::string man_office_worker_light_skin_tone("👨🏻‍💼"); - constexpr std::string man_office_worker_tone2("👨🏼‍💼"); - constexpr std::string man_office_worker_medium_light_skin_tone("👨🏼‍💼"); - constexpr std::string man_office_worker_tone3("👨🏽‍💼"); - constexpr std::string man_office_worker_medium_skin_tone("👨🏽‍💼"); - constexpr std::string man_office_worker_tone4("👨🏾‍💼"); - constexpr std::string man_office_worker_medium_dark_skin_tone("👨🏾‍💼"); - constexpr std::string man_office_worker_tone5("👨🏿‍💼"); - constexpr std::string man_office_worker_dark_skin_tone("👨🏿‍💼"); - constexpr std::string mechanic("🧑‍🔧"); - constexpr std::string mechanic_tone1("🧑🏻‍🔧"); - constexpr std::string mechanic_light_skin_tone("🧑🏻‍🔧"); - constexpr std::string mechanic_tone2("🧑🏼‍🔧"); - constexpr std::string mechanic_medium_light_skin_tone("🧑🏼‍🔧"); - constexpr std::string mechanic_tone3("🧑🏽‍🔧"); - constexpr std::string mechanic_medium_skin_tone("🧑🏽‍🔧"); - constexpr std::string mechanic_tone4("🧑🏾‍🔧"); - constexpr std::string mechanic_medium_dark_skin_tone("🧑🏾‍🔧"); - constexpr std::string mechanic_tone5("🧑🏿‍🔧"); - constexpr std::string mechanic_dark_skin_tone("🧑🏿‍🔧"); - constexpr std::string woman_mechanic("👩‍🔧"); - constexpr std::string woman_mechanic_tone1("👩🏻‍🔧"); - constexpr std::string woman_mechanic_light_skin_tone("👩🏻‍🔧"); - constexpr std::string woman_mechanic_tone2("👩🏼‍🔧"); - constexpr std::string woman_mechanic_medium_light_skin_tone("👩🏼‍🔧"); - constexpr std::string woman_mechanic_tone3("👩🏽‍🔧"); - constexpr std::string woman_mechanic_medium_skin_tone("👩🏽‍🔧"); - constexpr std::string woman_mechanic_tone4("👩🏾‍🔧"); - constexpr std::string woman_mechanic_medium_dark_skin_tone("👩🏾‍🔧"); - constexpr std::string woman_mechanic_tone5("👩🏿‍🔧"); - constexpr std::string woman_mechanic_dark_skin_tone("👩🏿‍🔧"); - constexpr std::string man_mechanic("👨‍🔧"); - constexpr std::string man_mechanic_tone1("👨🏻‍🔧"); - constexpr std::string man_mechanic_light_skin_tone("👨🏻‍🔧"); - constexpr std::string man_mechanic_tone2("👨🏼‍🔧"); - constexpr std::string man_mechanic_medium_light_skin_tone("👨🏼‍🔧"); - constexpr std::string man_mechanic_tone3("👨🏽‍🔧"); - constexpr std::string man_mechanic_medium_skin_tone("👨🏽‍🔧"); - constexpr std::string man_mechanic_tone4("👨🏾‍🔧"); - constexpr std::string man_mechanic_medium_dark_skin_tone("👨🏾‍🔧"); - constexpr std::string man_mechanic_tone5("👨🏿‍🔧"); - constexpr std::string man_mechanic_dark_skin_tone("👨🏿‍🔧"); - constexpr std::string scientist("🧑‍🔬"); - constexpr std::string scientist_tone1("🧑🏻‍🔬"); - constexpr std::string scientist_light_skin_tone("🧑🏻‍🔬"); - constexpr std::string scientist_tone2("🧑🏼‍🔬"); - constexpr std::string scientist_medium_light_skin_tone("🧑🏼‍🔬"); - constexpr std::string scientist_tone3("🧑🏽‍🔬"); - constexpr std::string scientist_medium_skin_tone("🧑🏽‍🔬"); - constexpr std::string scientist_tone4("🧑🏾‍🔬"); - constexpr std::string scientist_medium_dark_skin_tone("🧑🏾‍🔬"); - constexpr std::string scientist_tone5("🧑🏿‍🔬"); - constexpr std::string scientist_dark_skin_tone("🧑🏿‍🔬"); - constexpr std::string woman_scientist("👩‍🔬"); - constexpr std::string woman_scientist_tone1("👩🏻‍🔬"); - constexpr std::string woman_scientist_light_skin_tone("👩🏻‍🔬"); - constexpr std::string woman_scientist_tone2("👩🏼‍🔬"); - constexpr std::string woman_scientist_medium_light_skin_tone("👩🏼‍🔬"); - constexpr std::string woman_scientist_tone3("👩🏽‍🔬"); - constexpr std::string woman_scientist_medium_skin_tone("👩🏽‍🔬"); - constexpr std::string woman_scientist_tone4("👩🏾‍🔬"); - constexpr std::string woman_scientist_medium_dark_skin_tone("👩🏾‍🔬"); - constexpr std::string woman_scientist_tone5("👩🏿‍🔬"); - constexpr std::string woman_scientist_dark_skin_tone("👩🏿‍🔬"); - constexpr std::string man_scientist("👨‍🔬"); - constexpr std::string man_scientist_tone1("👨🏻‍🔬"); - constexpr std::string man_scientist_light_skin_tone("👨🏻‍🔬"); - constexpr std::string man_scientist_tone2("👨🏼‍🔬"); - constexpr std::string man_scientist_medium_light_skin_tone("👨🏼‍🔬"); - constexpr std::string man_scientist_tone3("👨🏽‍🔬"); - constexpr std::string man_scientist_medium_skin_tone("👨🏽‍🔬"); - constexpr std::string man_scientist_tone4("👨🏾‍🔬"); - constexpr std::string man_scientist_medium_dark_skin_tone("👨🏾‍🔬"); - constexpr std::string man_scientist_tone5("👨🏿‍🔬"); - constexpr std::string man_scientist_dark_skin_tone("👨🏿‍🔬"); - constexpr std::string artist("🧑‍🎨"); - constexpr std::string artist_tone1("🧑🏻‍🎨"); - constexpr std::string artist_light_skin_tone("🧑🏻‍🎨"); - constexpr std::string artist_tone2("🧑🏼‍🎨"); - constexpr std::string artist_medium_light_skin_tone("🧑🏼‍🎨"); - constexpr std::string artist_tone3("🧑🏽‍🎨"); - constexpr std::string artist_medium_skin_tone("🧑🏽‍🎨"); - constexpr std::string artist_tone4("🧑🏾‍🎨"); - constexpr std::string artist_medium_dark_skin_tone("🧑🏾‍🎨"); - constexpr std::string artist_tone5("🧑🏿‍🎨"); - constexpr std::string artist_dark_skin_tone("🧑🏿‍🎨"); - constexpr std::string woman_artist("👩‍🎨"); - constexpr std::string woman_artist_tone1("👩🏻‍🎨"); - constexpr std::string woman_artist_light_skin_tone("👩🏻‍🎨"); - constexpr std::string woman_artist_tone2("👩🏼‍🎨"); - constexpr std::string woman_artist_medium_light_skin_tone("👩🏼‍🎨"); - constexpr std::string woman_artist_tone3("👩🏽‍🎨"); - constexpr std::string woman_artist_medium_skin_tone("👩🏽‍🎨"); - constexpr std::string woman_artist_tone4("👩🏾‍🎨"); - constexpr std::string woman_artist_medium_dark_skin_tone("👩🏾‍🎨"); - constexpr std::string woman_artist_tone5("👩🏿‍🎨"); - constexpr std::string woman_artist_dark_skin_tone("👩🏿‍🎨"); - constexpr std::string man_artist("👨‍🎨"); - constexpr std::string man_artist_tone1("👨🏻‍🎨"); - constexpr std::string man_artist_light_skin_tone("👨🏻‍🎨"); - constexpr std::string man_artist_tone2("👨🏼‍🎨"); - constexpr std::string man_artist_medium_light_skin_tone("👨🏼‍🎨"); - constexpr std::string man_artist_tone3("👨🏽‍🎨"); - constexpr std::string man_artist_medium_skin_tone("👨🏽‍🎨"); - constexpr std::string man_artist_tone4("👨🏾‍🎨"); - constexpr std::string man_artist_medium_dark_skin_tone("👨🏾‍🎨"); - constexpr std::string man_artist_tone5("👨🏿‍🎨"); - constexpr std::string man_artist_dark_skin_tone("👨🏿‍🎨"); - constexpr std::string firefighter("🧑‍🚒"); - constexpr std::string firefighter_tone1("🧑🏻‍🚒"); - constexpr std::string firefighter_light_skin_tone("🧑🏻‍🚒"); - constexpr std::string firefighter_tone2("🧑🏼‍🚒"); - constexpr std::string firefighter_medium_light_skin_tone("🧑🏼‍🚒"); - constexpr std::string firefighter_tone3("🧑🏽‍🚒"); - constexpr std::string firefighter_medium_skin_tone("🧑🏽‍🚒"); - constexpr std::string firefighter_tone4("🧑🏾‍🚒"); - constexpr std::string firefighter_medium_dark_skin_tone("🧑🏾‍🚒"); - constexpr std::string firefighter_tone5("🧑🏿‍🚒"); - constexpr std::string firefighter_dark_skin_tone("🧑🏿‍🚒"); - constexpr std::string woman_firefighter("👩‍🚒"); - constexpr std::string woman_firefighter_tone1("👩🏻‍🚒"); - constexpr std::string woman_firefighter_light_skin_tone("👩🏻‍🚒"); - constexpr std::string woman_firefighter_tone2("👩🏼‍🚒"); - constexpr std::string woman_firefighter_medium_light_skin_tone("👩🏼‍🚒"); - constexpr std::string woman_firefighter_tone3("👩🏽‍🚒"); - constexpr std::string woman_firefighter_medium_skin_tone("👩🏽‍🚒"); - constexpr std::string woman_firefighter_tone4("👩🏾‍🚒"); - constexpr std::string woman_firefighter_medium_dark_skin_tone("👩🏾‍🚒"); - constexpr std::string woman_firefighter_tone5("👩🏿‍🚒"); - constexpr std::string woman_firefighter_dark_skin_tone("👩🏿‍🚒"); - constexpr std::string man_firefighter("👨‍🚒"); - constexpr std::string man_firefighter_tone1("👨🏻‍🚒"); - constexpr std::string man_firefighter_light_skin_tone("👨🏻‍🚒"); - constexpr std::string man_firefighter_tone2("👨🏼‍🚒"); - constexpr std::string man_firefighter_medium_light_skin_tone("👨🏼‍🚒"); - constexpr std::string man_firefighter_tone3("👨🏽‍🚒"); - constexpr std::string man_firefighter_medium_skin_tone("👨🏽‍🚒"); - constexpr std::string man_firefighter_tone4("👨🏾‍🚒"); - constexpr std::string man_firefighter_medium_dark_skin_tone("👨🏾‍🚒"); - constexpr std::string man_firefighter_tone5("👨🏿‍🚒"); - constexpr std::string man_firefighter_dark_skin_tone("👨🏿‍🚒"); - constexpr std::string pilot("🧑‍✈️"); - constexpr std::string pilot_tone1("🧑🏻‍✈️"); - constexpr std::string pilot_light_skin_tone("🧑🏻‍✈️"); - constexpr std::string pilot_tone2("🧑🏼‍✈️"); - constexpr std::string pilot_medium_light_skin_tone("🧑🏼‍✈️"); - constexpr std::string pilot_tone3("🧑🏽‍✈️"); - constexpr std::string pilot_medium_skin_tone("🧑🏽‍✈️"); - constexpr std::string pilot_tone4("🧑🏾‍✈️"); - constexpr std::string pilot_medium_dark_skin_tone("🧑🏾‍✈️"); - constexpr std::string pilot_tone5("🧑🏿‍✈️"); - constexpr std::string pilot_dark_skin_tone("🧑🏿‍✈️"); - constexpr std::string woman_pilot("👩‍✈️"); - constexpr std::string woman_pilot_tone1("👩🏻‍✈️"); - constexpr std::string woman_pilot_light_skin_tone("👩🏻‍✈️"); - constexpr std::string woman_pilot_tone2("👩🏼‍✈️"); - constexpr std::string woman_pilot_medium_light_skin_tone("👩🏼‍✈️"); - constexpr std::string woman_pilot_tone3("👩🏽‍✈️"); - constexpr std::string woman_pilot_medium_skin_tone("👩🏽‍✈️"); - constexpr std::string woman_pilot_tone4("👩🏾‍✈️"); - constexpr std::string woman_pilot_medium_dark_skin_tone("👩🏾‍✈️"); - constexpr std::string woman_pilot_tone5("👩🏿‍✈️"); - constexpr std::string woman_pilot_dark_skin_tone("👩🏿‍✈️"); - constexpr std::string man_pilot("👨‍✈️"); - constexpr std::string man_pilot_tone1("👨🏻‍✈️"); - constexpr std::string man_pilot_light_skin_tone("👨🏻‍✈️"); - constexpr std::string man_pilot_tone2("👨🏼‍✈️"); - constexpr std::string man_pilot_medium_light_skin_tone("👨🏼‍✈️"); - constexpr std::string man_pilot_tone3("👨🏽‍✈️"); - constexpr std::string man_pilot_medium_skin_tone("👨🏽‍✈️"); - constexpr std::string man_pilot_tone4("👨🏾‍✈️"); - constexpr std::string man_pilot_medium_dark_skin_tone("👨🏾‍✈️"); - constexpr std::string man_pilot_tone5("👨🏿‍✈️"); - constexpr std::string man_pilot_dark_skin_tone("👨🏿‍✈️"); - constexpr std::string astronaut("🧑‍🚀"); - constexpr std::string astronaut_tone1("🧑🏻‍🚀"); - constexpr std::string astronaut_light_skin_tone("🧑🏻‍🚀"); - constexpr std::string astronaut_tone2("🧑🏼‍🚀"); - constexpr std::string astronaut_medium_light_skin_tone("🧑🏼‍🚀"); - constexpr std::string astronaut_tone3("🧑🏽‍🚀"); - constexpr std::string astronaut_medium_skin_tone("🧑🏽‍🚀"); - constexpr std::string astronaut_tone4("🧑🏾‍🚀"); - constexpr std::string astronaut_medium_dark_skin_tone("🧑🏾‍🚀"); - constexpr std::string astronaut_tone5("🧑🏿‍🚀"); - constexpr std::string astronaut_dark_skin_tone("🧑🏿‍🚀"); - constexpr std::string woman_astronaut("👩‍🚀"); - constexpr std::string woman_astronaut_tone1("👩🏻‍🚀"); - constexpr std::string woman_astronaut_light_skin_tone("👩🏻‍🚀"); - constexpr std::string woman_astronaut_tone2("👩🏼‍🚀"); - constexpr std::string woman_astronaut_medium_light_skin_tone("👩🏼‍🚀"); - constexpr std::string woman_astronaut_tone3("👩🏽‍🚀"); - constexpr std::string woman_astronaut_medium_skin_tone("👩🏽‍🚀"); - constexpr std::string woman_astronaut_tone4("👩🏾‍🚀"); - constexpr std::string woman_astronaut_medium_dark_skin_tone("👩🏾‍🚀"); - constexpr std::string woman_astronaut_tone5("👩🏿‍🚀"); - constexpr std::string woman_astronaut_dark_skin_tone("👩🏿‍🚀"); - constexpr std::string man_astronaut("👨‍🚀"); - constexpr std::string man_astronaut_tone1("👨🏻‍🚀"); - constexpr std::string man_astronaut_light_skin_tone("👨🏻‍🚀"); - constexpr std::string man_astronaut_tone2("👨🏼‍🚀"); - constexpr std::string man_astronaut_medium_light_skin_tone("👨🏼‍🚀"); - constexpr std::string man_astronaut_tone3("👨🏽‍🚀"); - constexpr std::string man_astronaut_medium_skin_tone("👨🏽‍🚀"); - constexpr std::string man_astronaut_tone4("👨🏾‍🚀"); - constexpr std::string man_astronaut_medium_dark_skin_tone("👨🏾‍🚀"); - constexpr std::string man_astronaut_tone5("👨🏿‍🚀"); - constexpr std::string man_astronaut_dark_skin_tone("👨🏿‍🚀"); - constexpr std::string judge("🧑‍⚖️"); - constexpr std::string judge_tone1("🧑🏻‍⚖️"); - constexpr std::string judge_light_skin_tone("🧑🏻‍⚖️"); - constexpr std::string judge_tone2("🧑🏼‍⚖️"); - constexpr std::string judge_medium_light_skin_tone("🧑🏼‍⚖️"); - constexpr std::string judge_tone3("🧑🏽‍⚖️"); - constexpr std::string judge_medium_skin_tone("🧑🏽‍⚖️"); - constexpr std::string judge_tone4("🧑🏾‍⚖️"); - constexpr std::string judge_medium_dark_skin_tone("🧑🏾‍⚖️"); - constexpr std::string judge_tone5("🧑🏿‍⚖️"); - constexpr std::string judge_dark_skin_tone("🧑🏿‍⚖️"); - constexpr std::string woman_judge("👩‍⚖️"); - constexpr std::string woman_judge_tone1("👩🏻‍⚖️"); - constexpr std::string woman_judge_light_skin_tone("👩🏻‍⚖️"); - constexpr std::string woman_judge_tone2("👩🏼‍⚖️"); - constexpr std::string woman_judge_medium_light_skin_tone("👩🏼‍⚖️"); - constexpr std::string woman_judge_tone3("👩🏽‍⚖️"); - constexpr std::string woman_judge_medium_skin_tone("👩🏽‍⚖️"); - constexpr std::string woman_judge_tone4("👩🏾‍⚖️"); - constexpr std::string woman_judge_medium_dark_skin_tone("👩🏾‍⚖️"); - constexpr std::string woman_judge_tone5("👩🏿‍⚖️"); - constexpr std::string woman_judge_dark_skin_tone("👩🏿‍⚖️"); - constexpr std::string man_judge("👨‍⚖️"); - constexpr std::string man_judge_tone1("👨🏻‍⚖️"); - constexpr std::string man_judge_light_skin_tone("👨🏻‍⚖️"); - constexpr std::string man_judge_tone2("👨🏼‍⚖️"); - constexpr std::string man_judge_medium_light_skin_tone("👨🏼‍⚖️"); - constexpr std::string man_judge_tone3("👨🏽‍⚖️"); - constexpr std::string man_judge_medium_skin_tone("👨🏽‍⚖️"); - constexpr std::string man_judge_tone4("👨🏾‍⚖️"); - constexpr std::string man_judge_medium_dark_skin_tone("👨🏾‍⚖️"); - constexpr std::string man_judge_tone5("👨🏿‍⚖️"); - constexpr std::string man_judge_dark_skin_tone("👨🏿‍⚖️"); - constexpr std::string person_with_veil("👰"); - constexpr std::string person_with_veil_tone1("👰🏻"); - constexpr std::string person_with_veil_tone2("👰🏼"); - constexpr std::string person_with_veil_tone3("👰🏽"); - constexpr std::string person_with_veil_tone4("👰🏾"); - constexpr std::string person_with_veil_tone5("👰🏿"); - constexpr std::string woman_with_veil("👰‍♀️"); - constexpr std::string bride_with_veil("👰‍♀️"); - constexpr std::string woman_with_veil_tone1("👰🏻‍♀️"); - constexpr std::string woman_with_veil_light_skin_tone("👰🏻‍♀️"); - constexpr std::string woman_with_veil_tone2("👰🏼‍♀️"); - constexpr std::string woman_with_veil_medium_light_skin_tone("👰🏼‍♀️"); - constexpr std::string woman_with_veil_tone3("👰🏽‍♀️"); - constexpr std::string woman_with_veil_medium_skin_tone("👰🏽‍♀️"); - constexpr std::string woman_with_veil_tone4("👰🏾‍♀️"); - constexpr std::string woman_with_veil_medium_dark_skin_tone("👰🏾‍♀️"); - constexpr std::string woman_with_veil_tone5("👰🏿‍♀️"); - constexpr std::string woman_with_veil_dark_skin_tone("👰🏿‍♀️"); - constexpr std::string man_with_veil("👰‍♂️"); - constexpr std::string man_with_veil_tone1("👰🏻‍♂️"); - constexpr std::string man_with_veil_light_skin_tone("👰🏻‍♂️"); - constexpr std::string man_with_veil_tone2("👰🏼‍♂️"); - constexpr std::string man_with_veil_medium_light_skin_tone("👰🏼‍♂️"); - constexpr std::string man_with_veil_tone3("👰🏽‍♂️"); - constexpr std::string man_with_veil_medium_skin_tone("👰🏽‍♂️"); - constexpr std::string man_with_veil_tone4("👰🏾‍♂️"); - constexpr std::string man_with_veil_medium_dark_skin_tone("👰🏾‍♂️"); - constexpr std::string man_with_veil_tone5("👰🏿‍♂️"); - constexpr std::string man_with_veil_dark_skin_tone("👰🏿‍♂️"); - constexpr std::string person_in_tuxedo("🤵"); - constexpr std::string person_in_tuxedo_tone1("🤵🏻"); - constexpr std::string tuxedo_tone1("🤵🏻"); - constexpr std::string person_in_tuxedo_tone2("🤵🏼"); - constexpr std::string tuxedo_tone2("🤵🏼"); - constexpr std::string person_in_tuxedo_tone3("🤵🏽"); - constexpr std::string tuxedo_tone3("🤵🏽"); - constexpr std::string person_in_tuxedo_tone4("🤵🏾"); - constexpr std::string tuxedo_tone4("🤵🏾"); - constexpr std::string person_in_tuxedo_tone5("🤵🏿"); - constexpr std::string tuxedo_tone5("🤵🏿"); - constexpr std::string woman_in_tuxedo("🤵‍♀️"); - constexpr std::string woman_in_tuxedo_tone1("🤵🏻‍♀️"); - constexpr std::string woman_in_tuxedo_light_skin_tone("🤵🏻‍♀️"); - constexpr std::string woman_in_tuxedo_tone2("🤵🏼‍♀️"); - constexpr std::string woman_in_tuxedo_medium_light_skin_tone("🤵🏼‍♀️"); - constexpr std::string woman_in_tuxedo_tone3("🤵🏽‍♀️"); - constexpr std::string woman_in_tuxedo_medium_skin_tone("🤵🏽‍♀️"); - constexpr std::string woman_in_tuxedo_tone4("🤵🏾‍♀️"); - constexpr std::string woman_in_tuxedo_medium_dark_skin_tone("🤵🏾‍♀️"); - constexpr std::string woman_in_tuxedo_tone5("🤵🏿‍♀️"); - constexpr std::string woman_in_tuxedo_dark_skin_tone("🤵🏿‍♀️"); - constexpr std::string man_in_tuxedo("🤵‍♂️"); - constexpr std::string man_in_tuxedo_tone1("🤵🏻‍♂️"); - constexpr std::string man_in_tuxedo_light_skin_tone("🤵🏻‍♂️"); - constexpr std::string man_in_tuxedo_tone2("🤵🏼‍♂️"); - constexpr std::string man_in_tuxedo_medium_light_skin_tone("🤵🏼‍♂️"); - constexpr std::string man_in_tuxedo_tone3("🤵🏽‍♂️"); - constexpr std::string man_in_tuxedo_medium_skin_tone("🤵🏽‍♂️"); - constexpr std::string man_in_tuxedo_tone4("🤵🏾‍♂️"); - constexpr std::string man_in_tuxedo_medium_dark_skin_tone("🤵🏾‍♂️"); - constexpr std::string man_in_tuxedo_tone5("🤵🏿‍♂️"); - constexpr std::string man_in_tuxedo_dark_skin_tone("🤵🏿‍♂️"); - constexpr std::string person_with_crown("🫅"); - constexpr std::string person_with_crown_tone1("🫅🏻"); - constexpr std::string person_with_crown_light_skin_tone("🫅🏻"); - constexpr std::string person_with_crown_tone2("🫅🏼"); - constexpr std::string person_with_crown_medium_light_skin_tone("🫅🏼"); - constexpr std::string person_with_crown_tone3("🫅🏽"); - constexpr std::string person_with_crown_medium_skin_tone("🫅🏽"); - constexpr std::string person_with_crown_tone4("🫅🏾"); - constexpr std::string person_with_crown_medium_dark_skin_tone("🫅🏾"); - constexpr std::string person_with_crown_tone5("🫅🏿"); - constexpr std::string person_with_crown_dark_skin_tone("🫅🏿"); - constexpr std::string princess("👸"); - constexpr std::string princess_tone1("👸🏻"); - constexpr std::string princess_tone2("👸🏼"); - constexpr std::string princess_tone3("👸🏽"); - constexpr std::string princess_tone4("👸🏾"); - constexpr std::string princess_tone5("👸🏿"); - constexpr std::string prince("🤴"); - constexpr std::string prince_tone1("🤴🏻"); - constexpr std::string prince_tone2("🤴🏼"); - constexpr std::string prince_tone3("🤴🏽"); - constexpr std::string prince_tone4("🤴🏾"); - constexpr std::string prince_tone5("🤴🏿"); - constexpr std::string superhero("🦸"); - constexpr std::string superhero_tone1("🦸🏻"); - constexpr std::string superhero_light_skin_tone("🦸🏻"); - constexpr std::string superhero_tone2("🦸🏼"); - constexpr std::string superhero_medium_light_skin_tone("🦸🏼"); - constexpr std::string superhero_tone3("🦸🏽"); - constexpr std::string superhero_medium_skin_tone("🦸🏽"); - constexpr std::string superhero_tone4("🦸🏾"); - constexpr std::string superhero_medium_dark_skin_tone("🦸🏾"); - constexpr std::string superhero_tone5("🦸🏿"); - constexpr std::string superhero_dark_skin_tone("🦸🏿"); - constexpr std::string woman_superhero("🦸‍♀️"); - constexpr std::string woman_superhero_tone1("🦸🏻‍♀️"); - constexpr std::string woman_superhero_light_skin_tone("🦸🏻‍♀️"); - constexpr std::string woman_superhero_tone2("🦸🏼‍♀️"); - constexpr std::string woman_superhero_medium_light_skin_tone("🦸🏼‍♀️"); - constexpr std::string woman_superhero_tone3("🦸🏽‍♀️"); - constexpr std::string woman_superhero_medium_skin_tone("🦸🏽‍♀️"); - constexpr std::string woman_superhero_tone4("🦸🏾‍♀️"); - constexpr std::string woman_superhero_medium_dark_skin_tone("🦸🏾‍♀️"); - constexpr std::string woman_superhero_tone5("🦸🏿‍♀️"); - constexpr std::string woman_superhero_dark_skin_tone("🦸🏿‍♀️"); - constexpr std::string man_superhero("🦸‍♂️"); - constexpr std::string man_superhero_tone1("🦸🏻‍♂️"); - constexpr std::string man_superhero_light_skin_tone("🦸🏻‍♂️"); - constexpr std::string man_superhero_tone2("🦸🏼‍♂️"); - constexpr std::string man_superhero_medium_light_skin_tone("🦸🏼‍♂️"); - constexpr std::string man_superhero_tone3("🦸🏽‍♂️"); - constexpr std::string man_superhero_medium_skin_tone("🦸🏽‍♂️"); - constexpr std::string man_superhero_tone4("🦸🏾‍♂️"); - constexpr std::string man_superhero_medium_dark_skin_tone("🦸🏾‍♂️"); - constexpr std::string man_superhero_tone5("🦸🏿‍♂️"); - constexpr std::string man_superhero_dark_skin_tone("🦸🏿‍♂️"); - constexpr std::string supervillain("🦹"); - constexpr std::string supervillain_tone1("🦹🏻"); - constexpr std::string supervillain_light_skin_tone("🦹🏻"); - constexpr std::string supervillain_tone2("🦹🏼"); - constexpr std::string supervillain_medium_light_skin_tone("🦹🏼"); - constexpr std::string supervillain_tone3("🦹🏽"); - constexpr std::string supervillain_medium_skin_tone("🦹🏽"); - constexpr std::string supervillain_tone4("🦹🏾"); - constexpr std::string supervillain_medium_dark_skin_tone("🦹🏾"); - constexpr std::string supervillain_tone5("🦹🏿"); - constexpr std::string supervillain_dark_skin_tone("🦹🏿"); - constexpr std::string woman_supervillain("🦹‍♀️"); - constexpr std::string woman_supervillain_tone1("🦹🏻‍♀️"); - constexpr std::string woman_supervillain_light_skin_tone("🦹🏻‍♀️"); - constexpr std::string woman_supervillain_tone2("🦹🏼‍♀️"); - constexpr std::string woman_supervillain_medium_light_skin_tone("🦹🏼‍♀️"); - constexpr std::string woman_supervillain_tone3("🦹🏽‍♀️"); - constexpr std::string woman_supervillain_medium_skin_tone("🦹🏽‍♀️"); - constexpr std::string woman_supervillain_tone4("🦹🏾‍♀️"); - constexpr std::string woman_supervillain_medium_dark_skin_tone("🦹🏾‍♀️"); - constexpr std::string woman_supervillain_tone5("🦹🏿‍♀️"); - constexpr std::string woman_supervillain_dark_skin_tone("🦹🏿‍♀️"); - constexpr std::string man_supervillain("🦹‍♂️"); - constexpr std::string man_supervillain_tone1("🦹🏻‍♂️"); - constexpr std::string man_supervillain_light_skin_tone("🦹🏻‍♂️"); - constexpr std::string man_supervillain_tone2("🦹🏼‍♂️"); - constexpr std::string man_supervillain_medium_light_skin_tone("🦹🏼‍♂️"); - constexpr std::string man_supervillain_tone3("🦹🏽‍♂️"); - constexpr std::string man_supervillain_medium_skin_tone("🦹🏽‍♂️"); - constexpr std::string man_supervillain_tone4("🦹🏾‍♂️"); - constexpr std::string man_supervillain_medium_dark_skin_tone("🦹🏾‍♂️"); - constexpr std::string man_supervillain_tone5("🦹🏿‍♂️"); - constexpr std::string man_supervillain_dark_skin_tone("🦹🏿‍♂️"); - constexpr std::string ninja("🥷"); - constexpr std::string ninja_tone1("🥷🏻"); - constexpr std::string ninja_light_skin_tone("🥷🏻"); - constexpr std::string ninja_tone2("🥷🏼"); - constexpr std::string ninja_medium_light_skin_tone("🥷🏼"); - constexpr std::string ninja_tone3("🥷🏽"); - constexpr std::string ninja_medium_skin_tone("🥷🏽"); - constexpr std::string ninja_tone4("🥷🏾"); - constexpr std::string ninja_medium_dark_skin_tone("🥷🏾"); - constexpr std::string ninja_tone5("🥷🏿"); - constexpr std::string ninja_dark_skin_tone("🥷🏿"); - constexpr std::string mx_claus("🧑‍🎄"); - constexpr std::string mx_claus_tone1("🧑🏻‍🎄"); - constexpr std::string mx_claus_light_skin_tone("🧑🏻‍🎄"); - constexpr std::string mx_claus_tone2("🧑🏼‍🎄"); - constexpr std::string mx_claus_medium_light_skin_tone("🧑🏼‍🎄"); - constexpr std::string mx_claus_tone3("🧑🏽‍🎄"); - constexpr std::string mx_claus_medium_skin_tone("🧑🏽‍🎄"); - constexpr std::string mx_claus_tone4("🧑🏾‍🎄"); - constexpr std::string mx_claus_medium_dark_skin_tone("🧑🏾‍🎄"); - constexpr std::string mx_claus_tone5("🧑🏿‍🎄"); - constexpr std::string mx_claus_dark_skin_tone("🧑🏿‍🎄"); - constexpr std::string mrs_claus("🤶"); - constexpr std::string mother_christmas("🤶"); - constexpr std::string mrs_claus_tone1("🤶🏻"); - constexpr std::string mother_christmas_tone1("🤶🏻"); - constexpr std::string mrs_claus_tone2("🤶🏼"); - constexpr std::string mother_christmas_tone2("🤶🏼"); - constexpr std::string mrs_claus_tone3("🤶🏽"); - constexpr std::string mother_christmas_tone3("🤶🏽"); - constexpr std::string mrs_claus_tone4("🤶🏾"); - constexpr std::string mother_christmas_tone4("🤶🏾"); - constexpr std::string mrs_claus_tone5("🤶🏿"); - constexpr std::string mother_christmas_tone5("🤶🏿"); - constexpr std::string santa("🎅"); - constexpr std::string santa_tone1("🎅🏻"); - constexpr std::string santa_tone2("🎅🏼"); - constexpr std::string santa_tone3("🎅🏽"); - constexpr std::string santa_tone4("🎅🏾"); - constexpr std::string santa_tone5("🎅🏿"); - constexpr std::string mage("🧙"); - constexpr std::string mage_tone1("🧙🏻"); - constexpr std::string mage_light_skin_tone("🧙🏻"); - constexpr std::string mage_tone2("🧙🏼"); - constexpr std::string mage_medium_light_skin_tone("🧙🏼"); - constexpr std::string mage_tone3("🧙🏽"); - constexpr std::string mage_medium_skin_tone("🧙🏽"); - constexpr std::string mage_tone4("🧙🏾"); - constexpr std::string mage_medium_dark_skin_tone("🧙🏾"); - constexpr std::string mage_tone5("🧙🏿"); - constexpr std::string mage_dark_skin_tone("🧙🏿"); - constexpr std::string woman_mage("🧙‍♀️"); - constexpr std::string woman_mage_tone1("🧙🏻‍♀️"); - constexpr std::string woman_mage_light_skin_tone("🧙🏻‍♀️"); - constexpr std::string woman_mage_tone2("🧙🏼‍♀️"); - constexpr std::string woman_mage_medium_light_skin_tone("🧙🏼‍♀️"); - constexpr std::string woman_mage_tone3("🧙🏽‍♀️"); - constexpr std::string woman_mage_medium_skin_tone("🧙🏽‍♀️"); - constexpr std::string woman_mage_tone4("🧙🏾‍♀️"); - constexpr std::string woman_mage_medium_dark_skin_tone("🧙🏾‍♀️"); - constexpr std::string woman_mage_tone5("🧙🏿‍♀️"); - constexpr std::string woman_mage_dark_skin_tone("🧙🏿‍♀️"); - constexpr std::string man_mage("🧙‍♂️"); - constexpr std::string man_mage_tone1("🧙🏻‍♂️"); - constexpr std::string man_mage_light_skin_tone("🧙🏻‍♂️"); - constexpr std::string man_mage_tone2("🧙🏼‍♂️"); - constexpr std::string man_mage_medium_light_skin_tone("🧙🏼‍♂️"); - constexpr std::string man_mage_tone3("🧙🏽‍♂️"); - constexpr std::string man_mage_medium_skin_tone("🧙🏽‍♂️"); - constexpr std::string man_mage_tone4("🧙🏾‍♂️"); - constexpr std::string man_mage_medium_dark_skin_tone("🧙🏾‍♂️"); - constexpr std::string man_mage_tone5("🧙🏿‍♂️"); - constexpr std::string man_mage_dark_skin_tone("🧙🏿‍♂️"); - constexpr std::string elf("🧝"); - constexpr std::string elf_tone1("🧝🏻"); - constexpr std::string elf_light_skin_tone("🧝🏻"); - constexpr std::string elf_tone2("🧝🏼"); - constexpr std::string elf_medium_light_skin_tone("🧝🏼"); - constexpr std::string elf_tone3("🧝🏽"); - constexpr std::string elf_medium_skin_tone("🧝🏽"); - constexpr std::string elf_tone4("🧝🏾"); - constexpr std::string elf_medium_dark_skin_tone("🧝🏾"); - constexpr std::string elf_tone5("🧝🏿"); - constexpr std::string elf_dark_skin_tone("🧝🏿"); - constexpr std::string woman_elf("🧝‍♀️"); - constexpr std::string woman_elf_tone1("🧝🏻‍♀️"); - constexpr std::string woman_elf_light_skin_tone("🧝🏻‍♀️"); - constexpr std::string woman_elf_tone2("🧝🏼‍♀️"); - constexpr std::string woman_elf_medium_light_skin_tone("🧝🏼‍♀️"); - constexpr std::string woman_elf_tone3("🧝🏽‍♀️"); - constexpr std::string woman_elf_medium_skin_tone("🧝🏽‍♀️"); - constexpr std::string woman_elf_tone4("🧝🏾‍♀️"); - constexpr std::string woman_elf_medium_dark_skin_tone("🧝🏾‍♀️"); - constexpr std::string woman_elf_tone5("🧝🏿‍♀️"); - constexpr std::string woman_elf_dark_skin_tone("🧝🏿‍♀️"); - constexpr std::string man_elf("🧝‍♂️"); - constexpr std::string man_elf_tone1("🧝🏻‍♂️"); - constexpr std::string man_elf_light_skin_tone("🧝🏻‍♂️"); - constexpr std::string man_elf_tone2("🧝🏼‍♂️"); - constexpr std::string man_elf_medium_light_skin_tone("🧝🏼‍♂️"); - constexpr std::string man_elf_tone3("🧝🏽‍♂️"); - constexpr std::string man_elf_medium_skin_tone("🧝🏽‍♂️"); - constexpr std::string man_elf_tone4("🧝🏾‍♂️"); - constexpr std::string man_elf_medium_dark_skin_tone("🧝🏾‍♂️"); - constexpr std::string man_elf_tone5("🧝🏿‍♂️"); - constexpr std::string man_elf_dark_skin_tone("🧝🏿‍♂️"); - constexpr std::string troll("🧌"); - constexpr std::string vampire("🧛"); - constexpr std::string vampire_tone1("🧛🏻"); - constexpr std::string vampire_light_skin_tone("🧛🏻"); - constexpr std::string vampire_tone2("🧛🏼"); - constexpr std::string vampire_medium_light_skin_tone("🧛🏼"); - constexpr std::string vampire_tone3("🧛🏽"); - constexpr std::string vampire_medium_skin_tone("🧛🏽"); - constexpr std::string vampire_tone4("🧛🏾"); - constexpr std::string vampire_medium_dark_skin_tone("🧛🏾"); - constexpr std::string vampire_tone5("🧛🏿"); - constexpr std::string vampire_dark_skin_tone("🧛🏿"); - constexpr std::string woman_vampire("🧛‍♀️"); - constexpr std::string woman_vampire_tone1("🧛🏻‍♀️"); - constexpr std::string woman_vampire_light_skin_tone("🧛🏻‍♀️"); - constexpr std::string woman_vampire_tone2("🧛🏼‍♀️"); - constexpr std::string woman_vampire_medium_light_skin_tone("🧛🏼‍♀️"); - constexpr std::string woman_vampire_tone3("🧛🏽‍♀️"); - constexpr std::string woman_vampire_medium_skin_tone("🧛🏽‍♀️"); - constexpr std::string woman_vampire_tone4("🧛🏾‍♀️"); - constexpr std::string woman_vampire_medium_dark_skin_tone("🧛🏾‍♀️"); - constexpr std::string woman_vampire_tone5("🧛🏿‍♀️"); - constexpr std::string woman_vampire_dark_skin_tone("🧛🏿‍♀️"); - constexpr std::string man_vampire("🧛‍♂️"); - constexpr std::string man_vampire_tone1("🧛🏻‍♂️"); - constexpr std::string man_vampire_light_skin_tone("🧛🏻‍♂️"); - constexpr std::string man_vampire_tone2("🧛🏼‍♂️"); - constexpr std::string man_vampire_medium_light_skin_tone("🧛🏼‍♂️"); - constexpr std::string man_vampire_tone3("🧛🏽‍♂️"); - constexpr std::string man_vampire_medium_skin_tone("🧛🏽‍♂️"); - constexpr std::string man_vampire_tone4("🧛🏾‍♂️"); - constexpr std::string man_vampire_medium_dark_skin_tone("🧛🏾‍♂️"); - constexpr std::string man_vampire_tone5("🧛🏿‍♂️"); - constexpr std::string man_vampire_dark_skin_tone("🧛🏿‍♂️"); - constexpr std::string zombie("🧟"); - constexpr std::string woman_zombie("🧟‍♀️"); - constexpr std::string man_zombie("🧟‍♂️"); - constexpr std::string genie("🧞"); - constexpr std::string woman_genie("🧞‍♀️"); - constexpr std::string man_genie("🧞‍♂️"); - constexpr std::string merperson("🧜"); - constexpr std::string merperson_tone1("🧜🏻"); - constexpr std::string merperson_light_skin_tone("🧜🏻"); - constexpr std::string merperson_tone2("🧜🏼"); - constexpr std::string merperson_medium_light_skin_tone("🧜🏼"); - constexpr std::string merperson_tone3("🧜🏽"); - constexpr std::string merperson_medium_skin_tone("🧜🏽"); - constexpr std::string merperson_tone4("🧜🏾"); - constexpr std::string merperson_medium_dark_skin_tone("🧜🏾"); - constexpr std::string merperson_tone5("🧜🏿"); - constexpr std::string merperson_dark_skin_tone("🧜🏿"); - constexpr std::string mermaid("🧜‍♀️"); - constexpr std::string mermaid_tone1("🧜🏻‍♀️"); - constexpr std::string mermaid_light_skin_tone("🧜🏻‍♀️"); - constexpr std::string mermaid_tone2("🧜🏼‍♀️"); - constexpr std::string mermaid_medium_light_skin_tone("🧜🏼‍♀️"); - constexpr std::string mermaid_tone3("🧜🏽‍♀️"); - constexpr std::string mermaid_medium_skin_tone("🧜🏽‍♀️"); - constexpr std::string mermaid_tone4("🧜🏾‍♀️"); - constexpr std::string mermaid_medium_dark_skin_tone("🧜🏾‍♀️"); - constexpr std::string mermaid_tone5("🧜🏿‍♀️"); - constexpr std::string mermaid_dark_skin_tone("🧜🏿‍♀️"); - constexpr std::string merman("🧜‍♂️"); - constexpr std::string merman_tone1("🧜🏻‍♂️"); - constexpr std::string merman_light_skin_tone("🧜🏻‍♂️"); - constexpr std::string merman_tone2("🧜🏼‍♂️"); - constexpr std::string merman_medium_light_skin_tone("🧜🏼‍♂️"); - constexpr std::string merman_tone3("🧜🏽‍♂️"); - constexpr std::string merman_medium_skin_tone("🧜🏽‍♂️"); - constexpr std::string merman_tone4("🧜🏾‍♂️"); - constexpr std::string merman_medium_dark_skin_tone("🧜🏾‍♂️"); - constexpr std::string merman_tone5("🧜🏿‍♂️"); - constexpr std::string merman_dark_skin_tone("🧜🏿‍♂️"); - constexpr std::string fairy("🧚"); - constexpr std::string fairy_tone1("🧚🏻"); - constexpr std::string fairy_light_skin_tone("🧚🏻"); - constexpr std::string fairy_tone2("🧚🏼"); - constexpr std::string fairy_medium_light_skin_tone("🧚🏼"); - constexpr std::string fairy_tone3("🧚🏽"); - constexpr std::string fairy_medium_skin_tone("🧚🏽"); - constexpr std::string fairy_tone4("🧚🏾"); - constexpr std::string fairy_medium_dark_skin_tone("🧚🏾"); - constexpr std::string fairy_tone5("🧚🏿"); - constexpr std::string fairy_dark_skin_tone("🧚🏿"); - constexpr std::string woman_fairy("🧚‍♀️"); - constexpr std::string woman_fairy_tone1("🧚🏻‍♀️"); - constexpr std::string woman_fairy_light_skin_tone("🧚🏻‍♀️"); - constexpr std::string woman_fairy_tone2("🧚🏼‍♀️"); - constexpr std::string woman_fairy_medium_light_skin_tone("🧚🏼‍♀️"); - constexpr std::string woman_fairy_tone3("🧚🏽‍♀️"); - constexpr std::string woman_fairy_medium_skin_tone("🧚🏽‍♀️"); - constexpr std::string woman_fairy_tone4("🧚🏾‍♀️"); - constexpr std::string woman_fairy_medium_dark_skin_tone("🧚🏾‍♀️"); - constexpr std::string woman_fairy_tone5("🧚🏿‍♀️"); - constexpr std::string woman_fairy_dark_skin_tone("🧚🏿‍♀️"); - constexpr std::string man_fairy("🧚‍♂️"); - constexpr std::string man_fairy_tone1("🧚🏻‍♂️"); - constexpr std::string man_fairy_light_skin_tone("🧚🏻‍♂️"); - constexpr std::string man_fairy_tone2("🧚🏼‍♂️"); - constexpr std::string man_fairy_medium_light_skin_tone("🧚🏼‍♂️"); - constexpr std::string man_fairy_tone3("🧚🏽‍♂️"); - constexpr std::string man_fairy_medium_skin_tone("🧚🏽‍♂️"); - constexpr std::string man_fairy_tone4("🧚🏾‍♂️"); - constexpr std::string man_fairy_medium_dark_skin_tone("🧚🏾‍♂️"); - constexpr std::string man_fairy_tone5("🧚🏿‍♂️"); - constexpr std::string man_fairy_dark_skin_tone("🧚🏿‍♂️"); - constexpr std::string angel("👼"); - constexpr std::string angel_tone1("👼🏻"); - constexpr std::string angel_tone2("👼🏼"); - constexpr std::string angel_tone3("👼🏽"); - constexpr std::string angel_tone4("👼🏾"); - constexpr std::string angel_tone5("👼🏿"); - constexpr std::string pregnant_person("🫄"); - constexpr std::string pregnant_person_tone1("🫄🏻"); - constexpr std::string pregnant_person_light_skin_tone("🫄🏻"); - constexpr std::string pregnant_person_tone2("🫄🏼"); - constexpr std::string pregnant_person_medium_light_skin_tone("🫄🏼"); - constexpr std::string pregnant_person_tone3("🫄🏽"); - constexpr std::string pregnant_person_medium_skin_tone("🫄🏽"); - constexpr std::string pregnant_person_tone4("🫄🏾"); - constexpr std::string pregnant_person_medium_dark_skin_tone("🫄🏾"); - constexpr std::string pregnant_person_tone5("🫄🏿"); - constexpr std::string pregnant_person_dark_skin_tone("🫄🏿"); - constexpr std::string pregnant_woman("🤰"); - constexpr std::string expecting_woman("🤰"); - constexpr std::string pregnant_woman_tone1("🤰🏻"); - constexpr std::string expecting_woman_tone1("🤰🏻"); - constexpr std::string pregnant_woman_tone2("🤰🏼"); - constexpr std::string expecting_woman_tone2("🤰🏼"); - constexpr std::string pregnant_woman_tone3("🤰🏽"); - constexpr std::string expecting_woman_tone3("🤰🏽"); - constexpr std::string pregnant_woman_tone4("🤰🏾"); - constexpr std::string expecting_woman_tone4("🤰🏾"); - constexpr std::string pregnant_woman_tone5("🤰🏿"); - constexpr std::string expecting_woman_tone5("🤰🏿"); - constexpr std::string pregnant_man("🫃"); - constexpr std::string pregnant_man_tone1("🫃🏻"); - constexpr std::string pregnant_man_light_skin_tone("🫃🏻"); - constexpr std::string pregnant_man_tone2("🫃🏼"); - constexpr std::string pregnant_man_medium_light_skin_tone("🫃🏼"); - constexpr std::string pregnant_man_tone3("🫃🏽"); - constexpr std::string pregnant_man_medium_skin_tone("🫃🏽"); - constexpr std::string pregnant_man_tone4("🫃🏾"); - constexpr std::string pregnant_man_medium_dark_skin_tone("🫃🏾"); - constexpr std::string pregnant_man_tone5("🫃🏿"); - constexpr std::string pregnant_man_dark_skin_tone("🫃🏿"); - constexpr std::string breast_feeding("🤱"); - constexpr std::string breast_feeding_tone1("🤱🏻"); - constexpr std::string breast_feeding_light_skin_tone("🤱🏻"); - constexpr std::string breast_feeding_tone2("🤱🏼"); - constexpr std::string breast_feeding_medium_light_skin_tone("🤱🏼"); - constexpr std::string breast_feeding_tone3("🤱🏽"); - constexpr std::string breast_feeding_medium_skin_tone("🤱🏽"); - constexpr std::string breast_feeding_tone4("🤱🏾"); - constexpr std::string breast_feeding_medium_dark_skin_tone("🤱🏾"); - constexpr std::string breast_feeding_tone5("🤱🏿"); - constexpr std::string breast_feeding_dark_skin_tone("🤱🏿"); - constexpr std::string person_feeding_baby("🧑‍🍼"); - constexpr std::string person_feeding_baby_tone1("🧑🏻‍🍼"); - constexpr std::string person_feeding_baby_light_skin_tone("🧑🏻‍🍼"); - constexpr std::string person_feeding_baby_tone2("🧑🏼‍🍼"); - constexpr std::string person_feeding_baby_medium_light_skin_tone("🧑🏼‍🍼"); - constexpr std::string person_feeding_baby_tone3("🧑🏽‍🍼"); - constexpr std::string person_feeding_baby_medium_skin_tone("🧑🏽‍🍼"); - constexpr std::string person_feeding_baby_tone4("🧑🏾‍🍼"); - constexpr std::string person_feeding_baby_medium_dark_skin_tone("🧑🏾‍🍼"); - constexpr std::string person_feeding_baby_tone5("🧑🏿‍🍼"); - constexpr std::string person_feeding_baby_dark_skin_tone("🧑🏿‍🍼"); - constexpr std::string woman_feeding_baby("👩‍🍼"); - constexpr std::string woman_feeding_baby_tone1("👩🏻‍🍼"); - constexpr std::string woman_feeding_baby_light_skin_tone("👩🏻‍🍼"); - constexpr std::string woman_feeding_baby_tone2("👩🏼‍🍼"); - constexpr std::string woman_feeding_baby_medium_light_skin_tone("👩🏼‍🍼"); - constexpr std::string woman_feeding_baby_tone3("👩🏽‍🍼"); - constexpr std::string woman_feeding_baby_medium_skin_tone("👩🏽‍🍼"); - constexpr std::string woman_feeding_baby_tone4("👩🏾‍🍼"); - constexpr std::string woman_feeding_baby_medium_dark_skin_tone("👩🏾‍🍼"); - constexpr std::string woman_feeding_baby_tone5("👩🏿‍🍼"); - constexpr std::string woman_feeding_baby_dark_skin_tone("👩🏿‍🍼"); - constexpr std::string man_feeding_baby("👨‍🍼"); - constexpr std::string man_feeding_baby_tone1("👨🏻‍🍼"); - constexpr std::string man_feeding_baby_light_skin_tone("👨🏻‍🍼"); - constexpr std::string man_feeding_baby_tone2("👨🏼‍🍼"); - constexpr std::string man_feeding_baby_medium_light_skin_tone("👨🏼‍🍼"); - constexpr std::string man_feeding_baby_tone3("👨🏽‍🍼"); - constexpr std::string man_feeding_baby_medium_skin_tone("👨🏽‍🍼"); - constexpr std::string man_feeding_baby_tone4("👨🏾‍🍼"); - constexpr std::string man_feeding_baby_medium_dark_skin_tone("👨🏾‍🍼"); - constexpr std::string man_feeding_baby_tone5("👨🏿‍🍼"); - constexpr std::string man_feeding_baby_dark_skin_tone("👨🏿‍🍼"); - constexpr std::string person_bowing("🙇"); - constexpr std::string bow("🙇"); - constexpr std::string person_bowing_tone1("🙇🏻"); - constexpr std::string bow_tone1("🙇🏻"); - constexpr std::string person_bowing_tone2("🙇🏼"); - constexpr std::string bow_tone2("🙇🏼"); - constexpr std::string person_bowing_tone3("🙇🏽"); - constexpr std::string bow_tone3("🙇🏽"); - constexpr std::string person_bowing_tone4("🙇🏾"); - constexpr std::string bow_tone4("🙇🏾"); - constexpr std::string person_bowing_tone5("🙇🏿"); - constexpr std::string bow_tone5("🙇🏿"); - constexpr std::string woman_bowing("🙇‍♀️"); - constexpr std::string woman_bowing_tone1("🙇🏻‍♀️"); - constexpr std::string woman_bowing_light_skin_tone("🙇🏻‍♀️"); - constexpr std::string woman_bowing_tone2("🙇🏼‍♀️"); - constexpr std::string woman_bowing_medium_light_skin_tone("🙇🏼‍♀️"); - constexpr std::string woman_bowing_tone3("🙇🏽‍♀️"); - constexpr std::string woman_bowing_medium_skin_tone("🙇🏽‍♀️"); - constexpr std::string woman_bowing_tone4("🙇🏾‍♀️"); - constexpr std::string woman_bowing_medium_dark_skin_tone("🙇🏾‍♀️"); - constexpr std::string woman_bowing_tone5("🙇🏿‍♀️"); - constexpr std::string woman_bowing_dark_skin_tone("🙇🏿‍♀️"); - constexpr std::string man_bowing("🙇‍♂️"); - constexpr std::string man_bowing_tone1("🙇🏻‍♂️"); - constexpr std::string man_bowing_light_skin_tone("🙇🏻‍♂️"); - constexpr std::string man_bowing_tone2("🙇🏼‍♂️"); - constexpr std::string man_bowing_medium_light_skin_tone("🙇🏼‍♂️"); - constexpr std::string man_bowing_tone3("🙇🏽‍♂️"); - constexpr std::string man_bowing_medium_skin_tone("🙇🏽‍♂️"); - constexpr std::string man_bowing_tone4("🙇🏾‍♂️"); - constexpr std::string man_bowing_medium_dark_skin_tone("🙇🏾‍♂️"); - constexpr std::string man_bowing_tone5("🙇🏿‍♂️"); - constexpr std::string man_bowing_dark_skin_tone("🙇🏿‍♂️"); - constexpr std::string person_tipping_hand("💁"); - constexpr std::string information_desk_person("💁"); - constexpr std::string person_tipping_hand_tone1("💁🏻"); - constexpr std::string information_desk_person_tone1("💁🏻"); - constexpr std::string person_tipping_hand_tone2("💁🏼"); - constexpr std::string information_desk_person_tone2("💁🏼"); - constexpr std::string person_tipping_hand_tone3("💁🏽"); - constexpr std::string information_desk_person_tone3("💁🏽"); - constexpr std::string person_tipping_hand_tone4("💁🏾"); - constexpr std::string information_desk_person_tone4("💁🏾"); - constexpr std::string person_tipping_hand_tone5("💁🏿"); - constexpr std::string information_desk_person_tone5("💁🏿"); - constexpr std::string woman_tipping_hand("💁‍♀️"); - constexpr std::string woman_tipping_hand_tone1("💁🏻‍♀️"); - constexpr std::string woman_tipping_hand_light_skin_tone("💁🏻‍♀️"); - constexpr std::string woman_tipping_hand_tone2("💁🏼‍♀️"); - constexpr std::string woman_tipping_hand_medium_light_skin_tone("💁🏼‍♀️"); - constexpr std::string woman_tipping_hand_tone3("💁🏽‍♀️"); - constexpr std::string woman_tipping_hand_medium_skin_tone("💁🏽‍♀️"); - constexpr std::string woman_tipping_hand_tone4("💁🏾‍♀️"); - constexpr std::string woman_tipping_hand_medium_dark_skin_tone("💁🏾‍♀️"); - constexpr std::string woman_tipping_hand_tone5("💁🏿‍♀️"); - constexpr std::string woman_tipping_hand_dark_skin_tone("💁🏿‍♀️"); - constexpr std::string man_tipping_hand("💁‍♂️"); - constexpr std::string man_tipping_hand_tone1("💁🏻‍♂️"); - constexpr std::string man_tipping_hand_light_skin_tone("💁🏻‍♂️"); - constexpr std::string man_tipping_hand_tone2("💁🏼‍♂️"); - constexpr std::string man_tipping_hand_medium_light_skin_tone("💁🏼‍♂️"); - constexpr std::string man_tipping_hand_tone3("💁🏽‍♂️"); - constexpr std::string man_tipping_hand_medium_skin_tone("💁🏽‍♂️"); - constexpr std::string man_tipping_hand_tone4("💁🏾‍♂️"); - constexpr std::string man_tipping_hand_medium_dark_skin_tone("💁🏾‍♂️"); - constexpr std::string man_tipping_hand_tone5("💁🏿‍♂️"); - constexpr std::string man_tipping_hand_dark_skin_tone("💁🏿‍♂️"); - constexpr std::string person_gesturing_no("🙅"); - constexpr std::string no_good("🙅"); - constexpr std::string person_gesturing_no_tone1("🙅🏻"); - constexpr std::string no_good_tone1("🙅🏻"); - constexpr std::string person_gesturing_no_tone2("🙅🏼"); - constexpr std::string no_good_tone2("🙅🏼"); - constexpr std::string person_gesturing_no_tone3("🙅🏽"); - constexpr std::string no_good_tone3("🙅🏽"); - constexpr std::string person_gesturing_no_tone4("🙅🏾"); - constexpr std::string no_good_tone4("🙅🏾"); - constexpr std::string person_gesturing_no_tone5("🙅🏿"); - constexpr std::string no_good_tone5("🙅🏿"); - constexpr std::string woman_gesturing_no("🙅‍♀️"); - constexpr std::string woman_gesturing_no_tone1("🙅🏻‍♀️"); - constexpr std::string woman_gesturing_no_light_skin_tone("🙅🏻‍♀️"); - constexpr std::string woman_gesturing_no_tone2("🙅🏼‍♀️"); - constexpr std::string woman_gesturing_no_medium_light_skin_tone("🙅🏼‍♀️"); - constexpr std::string woman_gesturing_no_tone3("🙅🏽‍♀️"); - constexpr std::string woman_gesturing_no_medium_skin_tone("🙅🏽‍♀️"); - constexpr std::string woman_gesturing_no_tone4("🙅🏾‍♀️"); - constexpr std::string woman_gesturing_no_medium_dark_skin_tone("🙅🏾‍♀️"); - constexpr std::string woman_gesturing_no_tone5("🙅🏿‍♀️"); - constexpr std::string woman_gesturing_no_dark_skin_tone("🙅🏿‍♀️"); - constexpr std::string man_gesturing_no("🙅‍♂️"); - constexpr std::string man_gesturing_no_tone1("🙅🏻‍♂️"); - constexpr std::string man_gesturing_no_light_skin_tone("🙅🏻‍♂️"); - constexpr std::string man_gesturing_no_tone2("🙅🏼‍♂️"); - constexpr std::string man_gesturing_no_medium_light_skin_tone("🙅🏼‍♂️"); - constexpr std::string man_gesturing_no_tone3("🙅🏽‍♂️"); - constexpr std::string man_gesturing_no_medium_skin_tone("🙅🏽‍♂️"); - constexpr std::string man_gesturing_no_tone4("🙅🏾‍♂️"); - constexpr std::string man_gesturing_no_medium_dark_skin_tone("🙅🏾‍♂️"); - constexpr std::string man_gesturing_no_tone5("🙅🏿‍♂️"); - constexpr std::string man_gesturing_no_dark_skin_tone("🙅🏿‍♂️"); - constexpr std::string person_gesturing_ok("🙆"); - constexpr std::string person_gesturing_ok_tone1("🙆🏻"); - constexpr std::string person_gesturing_ok_tone2("🙆🏼"); - constexpr std::string person_gesturing_ok_tone3("🙆🏽"); - constexpr std::string person_gesturing_ok_tone4("🙆🏾"); - constexpr std::string person_gesturing_ok_tone5("🙆🏿"); - constexpr std::string woman_gesturing_ok("🙆‍♀️"); - constexpr std::string woman_gesturing_ok_tone1("🙆🏻‍♀️"); - constexpr std::string woman_gesturing_ok_light_skin_tone("🙆🏻‍♀️"); - constexpr std::string woman_gesturing_ok_tone2("🙆🏼‍♀️"); - constexpr std::string woman_gesturing_ok_medium_light_skin_tone("🙆🏼‍♀️"); - constexpr std::string woman_gesturing_ok_tone3("🙆🏽‍♀️"); - constexpr std::string woman_gesturing_ok_medium_skin_tone("🙆🏽‍♀️"); - constexpr std::string woman_gesturing_ok_tone4("🙆🏾‍♀️"); - constexpr std::string woman_gesturing_ok_medium_dark_skin_tone("🙆🏾‍♀️"); - constexpr std::string woman_gesturing_ok_tone5("🙆🏿‍♀️"); - constexpr std::string woman_gesturing_ok_dark_skin_tone("🙆🏿‍♀️"); - constexpr std::string man_gesturing_ok("🙆‍♂️"); - constexpr std::string man_gesturing_ok_tone1("🙆🏻‍♂️"); - constexpr std::string man_gesturing_ok_light_skin_tone("🙆🏻‍♂️"); - constexpr std::string man_gesturing_ok_tone2("🙆🏼‍♂️"); - constexpr std::string man_gesturing_ok_medium_light_skin_tone("🙆🏼‍♂️"); - constexpr std::string man_gesturing_ok_tone3("🙆🏽‍♂️"); - constexpr std::string man_gesturing_ok_medium_skin_tone("🙆🏽‍♂️"); - constexpr std::string man_gesturing_ok_tone4("🙆🏾‍♂️"); - constexpr std::string man_gesturing_ok_medium_dark_skin_tone("🙆🏾‍♂️"); - constexpr std::string man_gesturing_ok_tone5("🙆🏿‍♂️"); - constexpr std::string man_gesturing_ok_dark_skin_tone("🙆🏿‍♂️"); - constexpr std::string person_raising_hand("🙋"); - constexpr std::string raising_hand("🙋"); - constexpr std::string person_raising_hand_tone1("🙋🏻"); - constexpr std::string raising_hand_tone1("🙋🏻"); - constexpr std::string person_raising_hand_tone2("🙋🏼"); - constexpr std::string raising_hand_tone2("🙋🏼"); - constexpr std::string person_raising_hand_tone3("🙋🏽"); - constexpr std::string raising_hand_tone3("🙋🏽"); - constexpr std::string person_raising_hand_tone4("🙋🏾"); - constexpr std::string raising_hand_tone4("🙋🏾"); - constexpr std::string person_raising_hand_tone5("🙋🏿"); - constexpr std::string raising_hand_tone5("🙋🏿"); - constexpr std::string woman_raising_hand("🙋‍♀️"); - constexpr std::string woman_raising_hand_tone1("🙋🏻‍♀️"); - constexpr std::string woman_raising_hand_light_skin_tone("🙋🏻‍♀️"); - constexpr std::string woman_raising_hand_tone2("🙋🏼‍♀️"); - constexpr std::string woman_raising_hand_medium_light_skin_tone("🙋🏼‍♀️"); - constexpr std::string woman_raising_hand_tone3("🙋🏽‍♀️"); - constexpr std::string woman_raising_hand_medium_skin_tone("🙋🏽‍♀️"); - constexpr std::string woman_raising_hand_tone4("🙋🏾‍♀️"); - constexpr std::string woman_raising_hand_medium_dark_skin_tone("🙋🏾‍♀️"); - constexpr std::string woman_raising_hand_tone5("🙋🏿‍♀️"); - constexpr std::string woman_raising_hand_dark_skin_tone("🙋🏿‍♀️"); - constexpr std::string man_raising_hand("🙋‍♂️"); - constexpr std::string man_raising_hand_tone1("🙋🏻‍♂️"); - constexpr std::string man_raising_hand_light_skin_tone("🙋🏻‍♂️"); - constexpr std::string man_raising_hand_tone2("🙋🏼‍♂️"); - constexpr std::string man_raising_hand_medium_light_skin_tone("🙋🏼‍♂️"); - constexpr std::string man_raising_hand_tone3("🙋🏽‍♂️"); - constexpr std::string man_raising_hand_medium_skin_tone("🙋🏽‍♂️"); - constexpr std::string man_raising_hand_tone4("🙋🏾‍♂️"); - constexpr std::string man_raising_hand_medium_dark_skin_tone("🙋🏾‍♂️"); - constexpr std::string man_raising_hand_tone5("🙋🏿‍♂️"); - constexpr std::string man_raising_hand_dark_skin_tone("🙋🏿‍♂️"); - constexpr std::string deaf_person("🧏"); - constexpr std::string deaf_person_tone1("🧏🏻"); - constexpr std::string deaf_person_light_skin_tone("🧏🏻"); - constexpr std::string deaf_person_tone2("🧏🏼"); - constexpr std::string deaf_person_medium_light_skin_tone("🧏🏼"); - constexpr std::string deaf_person_tone3("🧏🏽"); - constexpr std::string deaf_person_medium_skin_tone("🧏🏽"); - constexpr std::string deaf_person_tone4("🧏🏾"); - constexpr std::string deaf_person_medium_dark_skin_tone("🧏🏾"); - constexpr std::string deaf_person_tone5("🧏🏿"); - constexpr std::string deaf_person_dark_skin_tone("🧏🏿"); - constexpr std::string deaf_woman("🧏‍♀️"); - constexpr std::string deaf_woman_tone1("🧏🏻‍♀️"); - constexpr std::string deaf_woman_light_skin_tone("🧏🏻‍♀️"); - constexpr std::string deaf_woman_tone2("🧏🏼‍♀️"); - constexpr std::string deaf_woman_medium_light_skin_tone("🧏🏼‍♀️"); - constexpr std::string deaf_woman_tone3("🧏🏽‍♀️"); - constexpr std::string deaf_woman_medium_skin_tone("🧏🏽‍♀️"); - constexpr std::string deaf_woman_tone4("🧏🏾‍♀️"); - constexpr std::string deaf_woman_medium_dark_skin_tone("🧏🏾‍♀️"); - constexpr std::string deaf_woman_tone5("🧏🏿‍♀️"); - constexpr std::string deaf_woman_dark_skin_tone("🧏🏿‍♀️"); - constexpr std::string deaf_man("🧏‍♂️"); - constexpr std::string deaf_man_tone1("🧏🏻‍♂️"); - constexpr std::string deaf_man_light_skin_tone("🧏🏻‍♂️"); - constexpr std::string deaf_man_tone2("🧏🏼‍♂️"); - constexpr std::string deaf_man_medium_light_skin_tone("🧏🏼‍♂️"); - constexpr std::string deaf_man_tone3("🧏🏽‍♂️"); - constexpr std::string deaf_man_medium_skin_tone("🧏🏽‍♂️"); - constexpr std::string deaf_man_tone4("🧏🏾‍♂️"); - constexpr std::string deaf_man_medium_dark_skin_tone("🧏🏾‍♂️"); - constexpr std::string deaf_man_tone5("🧏🏿‍♂️"); - constexpr std::string deaf_man_dark_skin_tone("🧏🏿‍♂️"); - constexpr std::string person_facepalming("🤦"); - constexpr std::string face_palm("🤦"); - constexpr std::string facepalm("🤦"); - constexpr std::string person_facepalming_tone1("🤦🏻"); - constexpr std::string face_palm_tone1("🤦🏻"); - constexpr std::string facepalm_tone1("🤦🏻"); - constexpr std::string person_facepalming_tone2("🤦🏼"); - constexpr std::string face_palm_tone2("🤦🏼"); - constexpr std::string facepalm_tone2("🤦🏼"); - constexpr std::string person_facepalming_tone3("🤦🏽"); - constexpr std::string face_palm_tone3("🤦🏽"); - constexpr std::string facepalm_tone3("🤦🏽"); - constexpr std::string person_facepalming_tone4("🤦🏾"); - constexpr std::string face_palm_tone4("🤦🏾"); - constexpr std::string facepalm_tone4("🤦🏾"); - constexpr std::string person_facepalming_tone5("🤦🏿"); - constexpr std::string face_palm_tone5("🤦🏿"); - constexpr std::string facepalm_tone5("🤦🏿"); - constexpr std::string woman_facepalming("🤦‍♀️"); - constexpr std::string woman_facepalming_tone1("🤦🏻‍♀️"); - constexpr std::string woman_facepalming_light_skin_tone("🤦🏻‍♀️"); - constexpr std::string woman_facepalming_tone2("🤦🏼‍♀️"); - constexpr std::string woman_facepalming_medium_light_skin_tone("🤦🏼‍♀️"); - constexpr std::string woman_facepalming_tone3("🤦🏽‍♀️"); - constexpr std::string woman_facepalming_medium_skin_tone("🤦🏽‍♀️"); - constexpr std::string woman_facepalming_tone4("🤦🏾‍♀️"); - constexpr std::string woman_facepalming_medium_dark_skin_tone("🤦🏾‍♀️"); - constexpr std::string woman_facepalming_tone5("🤦🏿‍♀️"); - constexpr std::string woman_facepalming_dark_skin_tone("🤦🏿‍♀️"); - constexpr std::string man_facepalming("🤦‍♂️"); - constexpr std::string man_facepalming_tone1("🤦🏻‍♂️"); - constexpr std::string man_facepalming_light_skin_tone("🤦🏻‍♂️"); - constexpr std::string man_facepalming_tone2("🤦🏼‍♂️"); - constexpr std::string man_facepalming_medium_light_skin_tone("🤦🏼‍♂️"); - constexpr std::string man_facepalming_tone3("🤦🏽‍♂️"); - constexpr std::string man_facepalming_medium_skin_tone("🤦🏽‍♂️"); - constexpr std::string man_facepalming_tone4("🤦🏾‍♂️"); - constexpr std::string man_facepalming_medium_dark_skin_tone("🤦🏾‍♂️"); - constexpr std::string man_facepalming_tone5("🤦🏿‍♂️"); - constexpr std::string man_facepalming_dark_skin_tone("🤦🏿‍♂️"); - constexpr std::string person_shrugging("🤷"); - constexpr std::string shrug("🤷"); - constexpr std::string person_shrugging_tone1("🤷🏻"); - constexpr std::string shrug_tone1("🤷🏻"); - constexpr std::string person_shrugging_tone2("🤷🏼"); - constexpr std::string shrug_tone2("🤷🏼"); - constexpr std::string person_shrugging_tone3("🤷🏽"); - constexpr std::string shrug_tone3("🤷🏽"); - constexpr std::string person_shrugging_tone4("🤷🏾"); - constexpr std::string shrug_tone4("🤷🏾"); - constexpr std::string person_shrugging_tone5("🤷🏿"); - constexpr std::string shrug_tone5("🤷🏿"); - constexpr std::string woman_shrugging("🤷‍♀️"); - constexpr std::string woman_shrugging_tone1("🤷🏻‍♀️"); - constexpr std::string woman_shrugging_light_skin_tone("🤷🏻‍♀️"); - constexpr std::string woman_shrugging_tone2("🤷🏼‍♀️"); - constexpr std::string woman_shrugging_medium_light_skin_tone("🤷🏼‍♀️"); - constexpr std::string woman_shrugging_tone3("🤷🏽‍♀️"); - constexpr std::string woman_shrugging_medium_skin_tone("🤷🏽‍♀️"); - constexpr std::string woman_shrugging_tone4("🤷🏾‍♀️"); - constexpr std::string woman_shrugging_medium_dark_skin_tone("🤷🏾‍♀️"); - constexpr std::string woman_shrugging_tone5("🤷🏿‍♀️"); - constexpr std::string woman_shrugging_dark_skin_tone("🤷🏿‍♀️"); - constexpr std::string man_shrugging("🤷‍♂️"); - constexpr std::string man_shrugging_tone1("🤷🏻‍♂️"); - constexpr std::string man_shrugging_light_skin_tone("🤷🏻‍♂️"); - constexpr std::string man_shrugging_tone2("🤷🏼‍♂️"); - constexpr std::string man_shrugging_medium_light_skin_tone("🤷🏼‍♂️"); - constexpr std::string man_shrugging_tone3("🤷🏽‍♂️"); - constexpr std::string man_shrugging_medium_skin_tone("🤷🏽‍♂️"); - constexpr std::string man_shrugging_tone4("🤷🏾‍♂️"); - constexpr std::string man_shrugging_medium_dark_skin_tone("🤷🏾‍♂️"); - constexpr std::string man_shrugging_tone5("🤷🏿‍♂️"); - constexpr std::string man_shrugging_dark_skin_tone("🤷🏿‍♂️"); - constexpr std::string person_pouting("🙎"); - constexpr std::string person_with_pouting_face("🙎"); - constexpr std::string person_pouting_tone1("🙎🏻"); - constexpr std::string person_with_pouting_face_tone1("🙎🏻"); - constexpr std::string person_pouting_tone2("🙎🏼"); - constexpr std::string person_with_pouting_face_tone2("🙎🏼"); - constexpr std::string person_pouting_tone3("🙎🏽"); - constexpr std::string person_with_pouting_face_tone3("🙎🏽"); - constexpr std::string person_pouting_tone4("🙎🏾"); - constexpr std::string person_with_pouting_face_tone4("🙎🏾"); - constexpr std::string person_pouting_tone5("🙎🏿"); - constexpr std::string person_with_pouting_face_tone5("🙎🏿"); - constexpr std::string woman_pouting("🙎‍♀️"); - constexpr std::string woman_pouting_tone1("🙎🏻‍♀️"); - constexpr std::string woman_pouting_light_skin_tone("🙎🏻‍♀️"); - constexpr std::string woman_pouting_tone2("🙎🏼‍♀️"); - constexpr std::string woman_pouting_medium_light_skin_tone("🙎🏼‍♀️"); - constexpr std::string woman_pouting_tone3("🙎🏽‍♀️"); - constexpr std::string woman_pouting_medium_skin_tone("🙎🏽‍♀️"); - constexpr std::string woman_pouting_tone4("🙎🏾‍♀️"); - constexpr std::string woman_pouting_medium_dark_skin_tone("🙎🏾‍♀️"); - constexpr std::string woman_pouting_tone5("🙎🏿‍♀️"); - constexpr std::string woman_pouting_dark_skin_tone("🙎🏿‍♀️"); - constexpr std::string man_pouting("🙎‍♂️"); - constexpr std::string man_pouting_tone1("🙎🏻‍♂️"); - constexpr std::string man_pouting_light_skin_tone("🙎🏻‍♂️"); - constexpr std::string man_pouting_tone2("🙎🏼‍♂️"); - constexpr std::string man_pouting_medium_light_skin_tone("🙎🏼‍♂️"); - constexpr std::string man_pouting_tone3("🙎🏽‍♂️"); - constexpr std::string man_pouting_medium_skin_tone("🙎🏽‍♂️"); - constexpr std::string man_pouting_tone4("🙎🏾‍♂️"); - constexpr std::string man_pouting_medium_dark_skin_tone("🙎🏾‍♂️"); - constexpr std::string man_pouting_tone5("🙎🏿‍♂️"); - constexpr std::string man_pouting_dark_skin_tone("🙎🏿‍♂️"); - constexpr std::string person_frowning("🙍"); - constexpr std::string person_frowning_tone1("🙍🏻"); - constexpr std::string person_frowning_tone2("🙍🏼"); - constexpr std::string person_frowning_tone3("🙍🏽"); - constexpr std::string person_frowning_tone4("🙍🏾"); - constexpr std::string person_frowning_tone5("🙍🏿"); - constexpr std::string woman_frowning("🙍‍♀️"); - constexpr std::string woman_frowning_tone1("🙍🏻‍♀️"); - constexpr std::string woman_frowning_light_skin_tone("🙍🏻‍♀️"); - constexpr std::string woman_frowning_tone2("🙍🏼‍♀️"); - constexpr std::string woman_frowning_medium_light_skin_tone("🙍🏼‍♀️"); - constexpr std::string woman_frowning_tone3("🙍🏽‍♀️"); - constexpr std::string woman_frowning_medium_skin_tone("🙍🏽‍♀️"); - constexpr std::string woman_frowning_tone4("🙍🏾‍♀️"); - constexpr std::string woman_frowning_medium_dark_skin_tone("🙍🏾‍♀️"); - constexpr std::string woman_frowning_tone5("🙍🏿‍♀️"); - constexpr std::string woman_frowning_dark_skin_tone("🙍🏿‍♀️"); - constexpr std::string man_frowning("🙍‍♂️"); - constexpr std::string man_frowning_tone1("🙍🏻‍♂️"); - constexpr std::string man_frowning_light_skin_tone("🙍🏻‍♂️"); - constexpr std::string man_frowning_tone2("🙍🏼‍♂️"); - constexpr std::string man_frowning_medium_light_skin_tone("🙍🏼‍♂️"); - constexpr std::string man_frowning_tone3("🙍🏽‍♂️"); - constexpr std::string man_frowning_medium_skin_tone("🙍🏽‍♂️"); - constexpr std::string man_frowning_tone4("🙍🏾‍♂️"); - constexpr std::string man_frowning_medium_dark_skin_tone("🙍🏾‍♂️"); - constexpr std::string man_frowning_tone5("🙍🏿‍♂️"); - constexpr std::string man_frowning_dark_skin_tone("🙍🏿‍♂️"); - constexpr std::string person_getting_haircut("💇"); - constexpr std::string haircut("💇"); - constexpr std::string person_getting_haircut_tone1("💇🏻"); - constexpr std::string haircut_tone1("💇🏻"); - constexpr std::string person_getting_haircut_tone2("💇🏼"); - constexpr std::string haircut_tone2("💇🏼"); - constexpr std::string person_getting_haircut_tone3("💇🏽"); - constexpr std::string haircut_tone3("💇🏽"); - constexpr std::string person_getting_haircut_tone4("💇🏾"); - constexpr std::string haircut_tone4("💇🏾"); - constexpr std::string person_getting_haircut_tone5("💇🏿"); - constexpr std::string haircut_tone5("💇🏿"); - constexpr std::string woman_getting_haircut("💇‍♀️"); - constexpr std::string woman_getting_haircut_tone1("💇🏻‍♀️"); - constexpr std::string woman_getting_haircut_light_skin_tone("💇🏻‍♀️"); - constexpr std::string woman_getting_haircut_tone2("💇🏼‍♀️"); - constexpr std::string woman_getting_haircut_medium_light_skin_tone("💇🏼‍♀️"); - constexpr std::string woman_getting_haircut_tone3("💇🏽‍♀️"); - constexpr std::string woman_getting_haircut_medium_skin_tone("💇🏽‍♀️"); - constexpr std::string woman_getting_haircut_tone4("💇🏾‍♀️"); - constexpr std::string woman_getting_haircut_medium_dark_skin_tone("💇🏾‍♀️"); - constexpr std::string woman_getting_haircut_tone5("💇🏿‍♀️"); - constexpr std::string woman_getting_haircut_dark_skin_tone("💇🏿‍♀️"); - constexpr std::string man_getting_haircut("💇‍♂️"); - constexpr std::string man_getting_haircut_tone1("💇🏻‍♂️"); - constexpr std::string man_getting_haircut_light_skin_tone("💇🏻‍♂️"); - constexpr std::string man_getting_haircut_tone2("💇🏼‍♂️"); - constexpr std::string man_getting_haircut_medium_light_skin_tone("💇🏼‍♂️"); - constexpr std::string man_getting_haircut_tone3("💇🏽‍♂️"); - constexpr std::string man_getting_haircut_medium_skin_tone("💇🏽‍♂️"); - constexpr std::string man_getting_haircut_tone4("💇🏾‍♂️"); - constexpr std::string man_getting_haircut_medium_dark_skin_tone("💇🏾‍♂️"); - constexpr std::string man_getting_haircut_tone5("💇🏿‍♂️"); - constexpr std::string man_getting_haircut_dark_skin_tone("💇🏿‍♂️"); - constexpr std::string person_getting_massage("💆"); - constexpr std::string massage("💆"); - constexpr std::string person_getting_massage_tone1("💆🏻"); - constexpr std::string massage_tone1("💆🏻"); - constexpr std::string person_getting_massage_tone2("💆🏼"); - constexpr std::string massage_tone2("💆🏼"); - constexpr std::string person_getting_massage_tone3("💆🏽"); - constexpr std::string massage_tone3("💆🏽"); - constexpr std::string person_getting_massage_tone4("💆🏾"); - constexpr std::string massage_tone4("💆🏾"); - constexpr std::string person_getting_massage_tone5("💆🏿"); - constexpr std::string massage_tone5("💆🏿"); - constexpr std::string woman_getting_face_massage("💆‍♀️"); - constexpr std::string woman_getting_face_massage_tone1("💆🏻‍♀️"); - constexpr std::string woman_getting_face_massage_light_skin_tone("💆🏻‍♀️"); - constexpr std::string woman_getting_face_massage_tone2("💆🏼‍♀️"); - constexpr std::string woman_getting_face_massage_medium_light_skin_tone("💆🏼‍♀️"); - constexpr std::string woman_getting_face_massage_tone3("💆🏽‍♀️"); - constexpr std::string woman_getting_face_massage_medium_skin_tone("💆🏽‍♀️"); - constexpr std::string woman_getting_face_massage_tone4("💆🏾‍♀️"); - constexpr std::string woman_getting_face_massage_medium_dark_skin_tone("💆🏾‍♀️"); - constexpr std::string woman_getting_face_massage_tone5("💆🏿‍♀️"); - constexpr std::string woman_getting_face_massage_dark_skin_tone("💆🏿‍♀️"); - constexpr std::string man_getting_face_massage("💆‍♂️"); - constexpr std::string man_getting_face_massage_tone1("💆🏻‍♂️"); - constexpr std::string man_getting_face_massage_light_skin_tone("💆🏻‍♂️"); - constexpr std::string man_getting_face_massage_tone2("💆🏼‍♂️"); - constexpr std::string man_getting_face_massage_medium_light_skin_tone("💆🏼‍♂️"); - constexpr std::string man_getting_face_massage_tone3("💆🏽‍♂️"); - constexpr std::string man_getting_face_massage_medium_skin_tone("💆🏽‍♂️"); - constexpr std::string man_getting_face_massage_tone4("💆🏾‍♂️"); - constexpr std::string man_getting_face_massage_medium_dark_skin_tone("💆🏾‍♂️"); - constexpr std::string man_getting_face_massage_tone5("💆🏿‍♂️"); - constexpr std::string man_getting_face_massage_dark_skin_tone("💆🏿‍♂️"); - constexpr std::string person_in_steamy_room("🧖"); - constexpr std::string person_in_steamy_room_tone1("🧖🏻"); - constexpr std::string person_in_steamy_room_light_skin_tone("🧖🏻"); - constexpr std::string person_in_steamy_room_tone2("🧖🏼"); - constexpr std::string person_in_steamy_room_medium_light_skin_tone("🧖🏼"); - constexpr std::string person_in_steamy_room_tone3("🧖🏽"); - constexpr std::string person_in_steamy_room_medium_skin_tone("🧖🏽"); - constexpr std::string person_in_steamy_room_tone4("🧖🏾"); - constexpr std::string person_in_steamy_room_medium_dark_skin_tone("🧖🏾"); - constexpr std::string person_in_steamy_room_tone5("🧖🏿"); - constexpr std::string person_in_steamy_room_dark_skin_tone("🧖🏿"); - constexpr std::string woman_in_steamy_room("🧖‍♀️"); - constexpr std::string woman_in_steamy_room_tone1("🧖🏻‍♀️"); - constexpr std::string woman_in_steamy_room_light_skin_tone("🧖🏻‍♀️"); - constexpr std::string woman_in_steamy_room_tone2("🧖🏼‍♀️"); - constexpr std::string woman_in_steamy_room_medium_light_skin_tone("🧖🏼‍♀️"); - constexpr std::string woman_in_steamy_room_tone3("🧖🏽‍♀️"); - constexpr std::string woman_in_steamy_room_medium_skin_tone("🧖🏽‍♀️"); - constexpr std::string woman_in_steamy_room_tone4("🧖🏾‍♀️"); - constexpr std::string woman_in_steamy_room_medium_dark_skin_tone("🧖🏾‍♀️"); - constexpr std::string woman_in_steamy_room_tone5("🧖🏿‍♀️"); - constexpr std::string woman_in_steamy_room_dark_skin_tone("🧖🏿‍♀️"); - constexpr std::string man_in_steamy_room("🧖‍♂️"); - constexpr std::string man_in_steamy_room_tone1("🧖🏻‍♂️"); - constexpr std::string man_in_steamy_room_light_skin_tone("🧖🏻‍♂️"); - constexpr std::string man_in_steamy_room_tone2("🧖🏼‍♂️"); - constexpr std::string man_in_steamy_room_medium_light_skin_tone("🧖🏼‍♂️"); - constexpr std::string man_in_steamy_room_tone3("🧖🏽‍♂️"); - constexpr std::string man_in_steamy_room_medium_skin_tone("🧖🏽‍♂️"); - constexpr std::string man_in_steamy_room_tone4("🧖🏾‍♂️"); - constexpr std::string man_in_steamy_room_medium_dark_skin_tone("🧖🏾‍♂️"); - constexpr std::string man_in_steamy_room_tone5("🧖🏿‍♂️"); - constexpr std::string man_in_steamy_room_dark_skin_tone("🧖🏿‍♂️"); - constexpr std::string nail_care("💅"); - constexpr std::string nail_care_tone1("💅🏻"); - constexpr std::string nail_care_tone2("💅🏼"); - constexpr std::string nail_care_tone3("💅🏽"); - constexpr std::string nail_care_tone4("💅🏾"); - constexpr std::string nail_care_tone5("💅🏿"); - constexpr std::string selfie("🤳"); - constexpr std::string selfie_tone1("🤳🏻"); - constexpr std::string selfie_tone2("🤳🏼"); - constexpr std::string selfie_tone3("🤳🏽"); - constexpr std::string selfie_tone4("🤳🏾"); - constexpr std::string selfie_tone5("🤳🏿"); - constexpr std::string dancer("💃"); - constexpr std::string dancer_tone1("💃🏻"); - constexpr std::string dancer_tone2("💃🏼"); - constexpr std::string dancer_tone3("💃🏽"); - constexpr std::string dancer_tone4("💃🏾"); - constexpr std::string dancer_tone5("💃🏿"); - constexpr std::string man_dancing("🕺"); - constexpr std::string male_dancer("🕺"); - constexpr std::string man_dancing_tone1("🕺🏻"); - constexpr std::string male_dancer_tone1("🕺🏻"); - constexpr std::string man_dancing_tone2("🕺🏼"); - constexpr std::string male_dancer_tone2("🕺🏼"); - constexpr std::string man_dancing_tone3("🕺🏽"); - constexpr std::string male_dancer_tone3("🕺🏽"); - constexpr std::string man_dancing_tone5("🕺🏿"); - constexpr std::string male_dancer_tone5("🕺🏿"); - constexpr std::string man_dancing_tone4("🕺🏾"); - constexpr std::string male_dancer_tone4("🕺🏾"); - constexpr std::string people_with_bunny_ears_partying("👯"); - constexpr std::string dancers("👯"); - constexpr std::string women_with_bunny_ears_partying("👯‍♀️"); - constexpr std::string men_with_bunny_ears_partying("👯‍♂️"); - constexpr std::string levitate("🕴️"); - constexpr std::string man_in_business_suit_levitating("🕴️"); - constexpr std::string levitate_tone1("🕴🏻"); - constexpr std::string man_in_business_suit_levitating_tone1("🕴🏻"); - constexpr std::string man_in_business_suit_levitating_light_skin_tone("🕴🏻"); - constexpr std::string levitate_tone2("🕴🏼"); - constexpr std::string man_in_business_suit_levitating_tone2("🕴🏼"); - constexpr std::string man_in_business_suit_levitating_medium_light_skin_tone("🕴🏼"); - constexpr std::string levitate_tone3("🕴🏽"); - constexpr std::string man_in_business_suit_levitating_tone3("🕴🏽"); - constexpr std::string man_in_business_suit_levitating_medium_skin_tone("🕴🏽"); - constexpr std::string levitate_tone4("🕴🏾"); - constexpr std::string man_in_business_suit_levitating_tone4("🕴🏾"); - constexpr std::string man_in_business_suit_levitating_medium_dark_skin_tone("🕴🏾"); - constexpr std::string levitate_tone5("🕴🏿"); - constexpr std::string man_in_business_suit_levitating_tone5("🕴🏿"); - constexpr std::string man_in_business_suit_levitating_dark_skin_tone("🕴🏿"); - constexpr std::string person_in_manual_wheelchair("🧑‍🦽"); - constexpr std::string person_in_manual_wheelchair_tone1("🧑🏻‍🦽"); - constexpr std::string person_in_manual_wheelchair_light_skin_tone("🧑🏻‍🦽"); - constexpr std::string person_in_manual_wheelchair_tone2("🧑🏼‍🦽"); - constexpr std::string person_in_manual_wheelchair_medium_light_skin_tone("🧑🏼‍🦽"); - constexpr std::string person_in_manual_wheelchair_tone3("🧑🏽‍🦽"); - constexpr std::string person_in_manual_wheelchair_medium_skin_tone("🧑🏽‍🦽"); - constexpr std::string person_in_manual_wheelchair_tone4("🧑🏾‍🦽"); - constexpr std::string person_in_manual_wheelchair_medium_dark_skin_tone("🧑🏾‍🦽"); - constexpr std::string person_in_manual_wheelchair_tone5("🧑🏿‍🦽"); - constexpr std::string person_in_manual_wheelchair_dark_skin_tone("🧑🏿‍🦽"); - constexpr std::string woman_in_manual_wheelchair("👩‍🦽"); - constexpr std::string woman_in_manual_wheelchair_tone1("👩🏻‍🦽"); - constexpr std::string woman_in_manual_wheelchair_light_skin_tone("👩🏻‍🦽"); - constexpr std::string woman_in_manual_wheelchair_tone2("👩🏼‍🦽"); - constexpr std::string woman_in_manual_wheelchair_medium_light_skin_tone("👩🏼‍🦽"); - constexpr std::string woman_in_manual_wheelchair_tone3("👩🏽‍🦽"); - constexpr std::string woman_in_manual_wheelchair_medium_skin_tone("👩🏽‍🦽"); - constexpr std::string woman_in_manual_wheelchair_tone4("👩🏾‍🦽"); - constexpr std::string woman_in_manual_wheelchair_medium_dark_skin_tone("👩🏾‍🦽"); - constexpr std::string woman_in_manual_wheelchair_tone5("👩🏿‍🦽"); - constexpr std::string woman_in_manual_wheelchair_dark_skin_tone("👩🏿‍🦽"); - constexpr std::string man_in_manual_wheelchair("👨‍🦽"); - constexpr std::string man_in_manual_wheelchair_tone1("👨🏻‍🦽"); - constexpr std::string man_in_manual_wheelchair_light_skin_tone("👨🏻‍🦽"); - constexpr std::string man_in_manual_wheelchair_tone2("👨🏼‍🦽"); - constexpr std::string man_in_manual_wheelchair_medium_light_skin_tone("👨🏼‍🦽"); - constexpr std::string man_in_manual_wheelchair_tone3("👨🏽‍🦽"); - constexpr std::string man_in_manual_wheelchair_medium_skin_tone("👨🏽‍🦽"); - constexpr std::string man_in_manual_wheelchair_tone4("👨🏾‍🦽"); - constexpr std::string man_in_manual_wheelchair_medium_dark_skin_tone("👨🏾‍🦽"); - constexpr std::string man_in_manual_wheelchair_tone5("👨🏿‍🦽"); - constexpr std::string man_in_manual_wheelchair_dark_skin_tone("👨🏿‍🦽"); - constexpr std::string person_in_motorized_wheelchair("🧑‍🦼"); - constexpr std::string person_in_motorized_wheelchair_tone1("🧑🏻‍🦼"); - constexpr std::string person_in_motorized_wheelchair_light_skin_tone("🧑🏻‍🦼"); - constexpr std::string person_in_motorized_wheelchair_tone2("🧑🏼‍🦼"); - constexpr std::string person_in_motorized_wheelchair_medium_light_skin_tone("🧑🏼‍🦼"); - constexpr std::string person_in_motorized_wheelchair_tone3("🧑🏽‍🦼"); - constexpr std::string person_in_motorized_wheelchair_medium_skin_tone("🧑🏽‍🦼"); - constexpr std::string person_in_motorized_wheelchair_tone4("🧑🏾‍🦼"); - constexpr std::string person_in_motorized_wheelchair_medium_dark_skin_tone("🧑🏾‍🦼"); - constexpr std::string person_in_motorized_wheelchair_tone5("🧑🏿‍🦼"); - constexpr std::string person_in_motorized_wheelchair_dark_skin_tone("🧑🏿‍🦼"); - constexpr std::string woman_in_motorized_wheelchair("👩‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_tone1("👩🏻‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_light_skin_tone("👩🏻‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_tone2("👩🏼‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_medium_light_skin_tone("👩🏼‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_tone3("👩🏽‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_medium_skin_tone("👩🏽‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_tone4("👩🏾‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_medium_dark_skin_tone("👩🏾‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_tone5("👩🏿‍🦼"); - constexpr std::string woman_in_motorized_wheelchair_dark_skin_tone("👩🏿‍🦼"); - constexpr std::string man_in_motorized_wheelchair("👨‍🦼"); - constexpr std::string man_in_motorized_wheelchair_tone1("👨🏻‍🦼"); - constexpr std::string man_in_motorized_wheelchair_light_skin_tone("👨🏻‍🦼"); - constexpr std::string man_in_motorized_wheelchair_tone2("👨🏼‍🦼"); - constexpr std::string man_in_motorized_wheelchair_medium_light_skin_tone("👨🏼‍🦼"); - constexpr std::string man_in_motorized_wheelchair_tone3("👨🏽‍🦼"); - constexpr std::string man_in_motorized_wheelchair_medium_skin_tone("👨🏽‍🦼"); - constexpr std::string man_in_motorized_wheelchair_tone4("👨🏾‍🦼"); - constexpr std::string man_in_motorized_wheelchair_medium_dark_skin_tone("👨🏾‍🦼"); - constexpr std::string man_in_motorized_wheelchair_tone5("👨🏿‍🦼"); - constexpr std::string man_in_motorized_wheelchair_dark_skin_tone("👨🏿‍🦼"); - constexpr std::string person_walking("🚶"); - constexpr std::string walking("🚶"); - constexpr std::string person_walking_tone1("🚶🏻"); - constexpr std::string walking_tone1("🚶🏻"); - constexpr std::string person_walking_tone2("🚶🏼"); - constexpr std::string walking_tone2("🚶🏼"); - constexpr std::string person_walking_tone3("🚶🏽"); - constexpr std::string walking_tone3("🚶🏽"); - constexpr std::string person_walking_tone4("🚶🏾"); - constexpr std::string walking_tone4("🚶🏾"); - constexpr std::string person_walking_tone5("🚶🏿"); - constexpr std::string walking_tone5("🚶🏿"); - constexpr std::string woman_walking("🚶‍♀️"); - constexpr std::string woman_walking_tone1("🚶🏻‍♀️"); - constexpr std::string woman_walking_light_skin_tone("🚶🏻‍♀️"); - constexpr std::string woman_walking_tone2("🚶🏼‍♀️"); - constexpr std::string woman_walking_medium_light_skin_tone("🚶🏼‍♀️"); - constexpr std::string woman_walking_tone3("🚶🏽‍♀️"); - constexpr std::string woman_walking_medium_skin_tone("🚶🏽‍♀️"); - constexpr std::string woman_walking_tone4("🚶🏾‍♀️"); - constexpr std::string woman_walking_medium_dark_skin_tone("🚶🏾‍♀️"); - constexpr std::string woman_walking_tone5("🚶🏿‍♀️"); - constexpr std::string woman_walking_dark_skin_tone("🚶🏿‍♀️"); - constexpr std::string man_walking("🚶‍♂️"); - constexpr std::string man_walking_tone1("🚶🏻‍♂️"); - constexpr std::string man_walking_light_skin_tone("🚶🏻‍♂️"); - constexpr std::string man_walking_tone2("🚶🏼‍♂️"); - constexpr std::string man_walking_medium_light_skin_tone("🚶🏼‍♂️"); - constexpr std::string man_walking_tone3("🚶🏽‍♂️"); - constexpr std::string man_walking_medium_skin_tone("🚶🏽‍♂️"); - constexpr std::string man_walking_tone4("🚶🏾‍♂️"); - constexpr std::string man_walking_medium_dark_skin_tone("🚶🏾‍♂️"); - constexpr std::string man_walking_tone5("🚶🏿‍♂️"); - constexpr std::string man_walking_dark_skin_tone("🚶🏿‍♂️"); - constexpr std::string person_with_probing_cane("🧑‍🦯"); - constexpr std::string person_with_probing_cane_tone1("🧑🏻‍🦯"); - constexpr std::string person_with_probing_cane_light_skin_tone("🧑🏻‍🦯"); - constexpr std::string person_with_probing_cane_tone2("🧑🏼‍🦯"); - constexpr std::string person_with_probing_cane_medium_light_skin_tone("🧑🏼‍🦯"); - constexpr std::string person_with_probing_cane_tone3("🧑🏽‍🦯"); - constexpr std::string person_with_probing_cane_medium_skin_tone("🧑🏽‍🦯"); - constexpr std::string person_with_probing_cane_tone4("🧑🏾‍🦯"); - constexpr std::string person_with_probing_cane_medium_dark_skin_tone("🧑🏾‍🦯"); - constexpr std::string person_with_probing_cane_tone5("🧑🏿‍🦯"); - constexpr std::string person_with_probing_cane_dark_skin_tone("🧑🏿‍🦯"); - constexpr std::string woman_with_probing_cane("👩‍🦯"); - constexpr std::string woman_with_probing_cane_tone1("👩🏻‍🦯"); - constexpr std::string woman_with_probing_cane_light_skin_tone("👩🏻‍🦯"); - constexpr std::string woman_with_probing_cane_tone2("👩🏼‍🦯"); - constexpr std::string woman_with_probing_cane_medium_light_skin_tone("👩🏼‍🦯"); - constexpr std::string woman_with_probing_cane_tone3("👩🏽‍🦯"); - constexpr std::string woman_with_probing_cane_medium_skin_tone("👩🏽‍🦯"); - constexpr std::string woman_with_probing_cane_tone4("👩🏾‍🦯"); - constexpr std::string woman_with_probing_cane_medium_dark_skin_tone("👩🏾‍🦯"); - constexpr std::string woman_with_probing_cane_tone5("👩🏿‍🦯"); - constexpr std::string woman_with_probing_cane_dark_skin_tone("👩🏿‍🦯"); - constexpr std::string man_with_probing_cane("👨‍🦯"); - constexpr std::string man_with_probing_cane_tone1("👨🏻‍🦯"); - constexpr std::string man_with_probing_cane_light_skin_tone("👨🏻‍🦯"); - constexpr std::string man_with_probing_cane_tone2("👨🏼‍🦯"); - constexpr std::string man_with_probing_cane_medium_light_skin_tone("👨🏼‍🦯"); - constexpr std::string man_with_probing_cane_tone3("👨🏽‍🦯"); - constexpr std::string man_with_probing_cane_medium_skin_tone("👨🏽‍🦯"); - constexpr std::string man_with_probing_cane_tone4("👨🏾‍🦯"); - constexpr std::string man_with_probing_cane_medium_dark_skin_tone("👨🏾‍🦯"); - constexpr std::string man_with_probing_cane_tone5("👨🏿‍🦯"); - constexpr std::string man_with_probing_cane_dark_skin_tone("👨🏿‍🦯"); - constexpr std::string person_kneeling("🧎"); - constexpr std::string person_kneeling_tone1("🧎🏻"); - constexpr std::string person_kneeling_light_skin_tone("🧎🏻"); - constexpr std::string person_kneeling_tone2("🧎🏼"); - constexpr std::string person_kneeling_medium_light_skin_tone("🧎🏼"); - constexpr std::string person_kneeling_tone3("🧎🏽"); - constexpr std::string person_kneeling_medium_skin_tone("🧎🏽"); - constexpr std::string person_kneeling_tone4("🧎🏾"); - constexpr std::string person_kneeling_medium_dark_skin_tone("🧎🏾"); - constexpr std::string person_kneeling_tone5("🧎🏿"); - constexpr std::string person_kneeling_dark_skin_tone("🧎🏿"); - constexpr std::string woman_kneeling("🧎‍♀️"); - constexpr std::string woman_kneeling_tone1("🧎🏻‍♀️"); - constexpr std::string woman_kneeling_light_skin_tone("🧎🏻‍♀️"); - constexpr std::string woman_kneeling_tone2("🧎🏼‍♀️"); - constexpr std::string woman_kneeling_medium_light_skin_tone("🧎🏼‍♀️"); - constexpr std::string woman_kneeling_tone3("🧎🏽‍♀️"); - constexpr std::string woman_kneeling_medium_skin_tone("🧎🏽‍♀️"); - constexpr std::string woman_kneeling_tone4("🧎🏾‍♀️"); - constexpr std::string woman_kneeling_medium_dark_skin_tone("🧎🏾‍♀️"); - constexpr std::string woman_kneeling_tone5("🧎🏿‍♀️"); - constexpr std::string woman_kneeling_dark_skin_tone("🧎🏿‍♀️"); - constexpr std::string man_kneeling("🧎‍♂️"); - constexpr std::string man_kneeling_tone1("🧎🏻‍♂️"); - constexpr std::string man_kneeling_light_skin_tone("🧎🏻‍♂️"); - constexpr std::string man_kneeling_tone2("🧎🏼‍♂️"); - constexpr std::string man_kneeling_medium_light_skin_tone("🧎🏼‍♂️"); - constexpr std::string man_kneeling_tone3("🧎🏽‍♂️"); - constexpr std::string man_kneeling_medium_skin_tone("🧎🏽‍♂️"); - constexpr std::string man_kneeling_tone4("🧎🏾‍♂️"); - constexpr std::string man_kneeling_medium_dark_skin_tone("🧎🏾‍♂️"); - constexpr std::string man_kneeling_tone5("🧎🏿‍♂️"); - constexpr std::string man_kneeling_dark_skin_tone("🧎🏿‍♂️"); - constexpr std::string person_running("🏃"); - constexpr std::string runner("🏃"); - constexpr std::string person_running_tone1("🏃🏻"); - constexpr std::string runner_tone1("🏃🏻"); - constexpr std::string person_running_tone2("🏃🏼"); - constexpr std::string runner_tone2("🏃🏼"); - constexpr std::string person_running_tone3("🏃🏽"); - constexpr std::string runner_tone3("🏃🏽"); - constexpr std::string person_running_tone4("🏃🏾"); - constexpr std::string runner_tone4("🏃🏾"); - constexpr std::string person_running_tone5("🏃🏿"); - constexpr std::string runner_tone5("🏃🏿"); - constexpr std::string woman_running("🏃‍♀️"); - constexpr std::string woman_running_tone1("🏃🏻‍♀️"); - constexpr std::string woman_running_light_skin_tone("🏃🏻‍♀️"); - constexpr std::string woman_running_tone2("🏃🏼‍♀️"); - constexpr std::string woman_running_medium_light_skin_tone("🏃🏼‍♀️"); - constexpr std::string woman_running_tone3("🏃🏽‍♀️"); - constexpr std::string woman_running_medium_skin_tone("🏃🏽‍♀️"); - constexpr std::string woman_running_tone4("🏃🏾‍♀️"); - constexpr std::string woman_running_medium_dark_skin_tone("🏃🏾‍♀️"); - constexpr std::string woman_running_tone5("🏃🏿‍♀️"); - constexpr std::string woman_running_dark_skin_tone("🏃🏿‍♀️"); - constexpr std::string man_running("🏃‍♂️"); - constexpr std::string man_running_tone1("🏃🏻‍♂️"); - constexpr std::string man_running_light_skin_tone("🏃🏻‍♂️"); - constexpr std::string man_running_tone2("🏃🏼‍♂️"); - constexpr std::string man_running_medium_light_skin_tone("🏃🏼‍♂️"); - constexpr std::string man_running_tone3("🏃🏽‍♂️"); - constexpr std::string man_running_medium_skin_tone("🏃🏽‍♂️"); - constexpr std::string man_running_tone4("🏃🏾‍♂️"); - constexpr std::string man_running_medium_dark_skin_tone("🏃🏾‍♂️"); - constexpr std::string man_running_tone5("🏃🏿‍♂️"); - constexpr std::string man_running_dark_skin_tone("🏃🏿‍♂️"); - constexpr std::string person_standing("🧍"); - constexpr std::string person_standing_tone1("🧍🏻"); - constexpr std::string person_standing_light_skin_tone("🧍🏻"); - constexpr std::string person_standing_tone2("🧍🏼"); - constexpr std::string person_standing_medium_light_skin_tone("🧍🏼"); - constexpr std::string person_standing_tone3("🧍🏽"); - constexpr std::string person_standing_medium_skin_tone("🧍🏽"); - constexpr std::string person_standing_tone4("🧍🏾"); - constexpr std::string person_standing_medium_dark_skin_tone("🧍🏾"); - constexpr std::string person_standing_tone5("🧍🏿"); - constexpr std::string person_standing_dark_skin_tone("🧍🏿"); - constexpr std::string woman_standing("🧍‍♀️"); - constexpr std::string woman_standing_tone1("🧍🏻‍♀️"); - constexpr std::string woman_standing_light_skin_tone("🧍🏻‍♀️"); - constexpr std::string woman_standing_tone2("🧍🏼‍♀️"); - constexpr std::string woman_standing_medium_light_skin_tone("🧍🏼‍♀️"); - constexpr std::string woman_standing_tone3("🧍🏽‍♀️"); - constexpr std::string woman_standing_medium_skin_tone("🧍🏽‍♀️"); - constexpr std::string woman_standing_tone4("🧍🏾‍♀️"); - constexpr std::string woman_standing_medium_dark_skin_tone("🧍🏾‍♀️"); - constexpr std::string woman_standing_tone5("🧍🏿‍♀️"); - constexpr std::string woman_standing_dark_skin_tone("🧍🏿‍♀️"); - constexpr std::string man_standing("🧍‍♂️"); - constexpr std::string man_standing_tone1("🧍🏻‍♂️"); - constexpr std::string man_standing_light_skin_tone("🧍🏻‍♂️"); - constexpr std::string man_standing_tone2("🧍🏼‍♂️"); - constexpr std::string man_standing_medium_light_skin_tone("🧍🏼‍♂️"); - constexpr std::string man_standing_tone3("🧍🏽‍♂️"); - constexpr std::string man_standing_medium_skin_tone("🧍🏽‍♂️"); - constexpr std::string man_standing_tone4("🧍🏾‍♂️"); - constexpr std::string man_standing_medium_dark_skin_tone("🧍🏾‍♂️"); - constexpr std::string man_standing_tone5("🧍🏿‍♂️"); - constexpr std::string man_standing_dark_skin_tone("🧍🏿‍♂️"); - constexpr std::string people_holding_hands("🧑‍🤝‍🧑"); - constexpr std::string people_holding_hands_tone1("🧑🏻‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_light_skin_tone("🧑🏻‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_tone1_tone2("🧑🏻‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_light_skin_tone_medium_light_skin_tone("🧑🏻‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_tone1_tone3("🧑🏻‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_light_skin_tone_medium_skin_tone("🧑🏻‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_tone1_tone4("🧑🏻‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_light_skin_tone_medium_dark_skin_tone("🧑🏻‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_tone1_tone5("🧑🏻‍🤝‍🧑🏿"); - constexpr std::string people_holding_hands_light_skin_tone_dark_skin_tone("🧑🏻‍🤝‍🧑🏿"); - constexpr std::string people_holding_hands_tone2_tone1("🧑🏼‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_medium_light_skin_tone_light_skin_tone("🧑🏼‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_tone2("🧑🏼‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_medium_light_skin_tone("🧑🏼‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_tone2_tone3("🧑🏼‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_medium_light_skin_tone_medium_skin_tone("🧑🏼‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_tone2_tone4("🧑🏼‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone("🧑🏼‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_tone2_tone5("🧑🏼‍🤝‍🧑🏿"); - constexpr std::string people_holding_hands_medium_light_skin_tone_dark_skin_tone("🧑🏼‍🤝‍🧑🏿"); - constexpr std::string people_holding_hands_tone3_tone1("🧑🏽‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_medium_skin_tone_light_skin_tone("🧑🏽‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_tone3_tone2("🧑🏽‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_medium_skin_tone_medium_light_skin_tone("🧑🏽‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_tone3("🧑🏽‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_medium_skin_tone("🧑🏽‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_tone3_tone4("🧑🏽‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_medium_skin_tone_medium_dark_skin_tone("🧑🏽‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_tone3_tone5("🧑🏽‍🤝‍🧑🏿"); - constexpr std::string people_holding_hands_medium_skin_tone_dark_skin_tone("🧑🏽‍🤝‍🧑🏿"); - constexpr std::string people_holding_hands_tone4_tone1("🧑🏾‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_medium_dark_skin_tone_light_skin_tone("🧑🏾‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_tone4_tone2("🧑🏾‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone("🧑🏾‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_tone4_tone3("🧑🏾‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_medium_dark_skin_tone_medium_skin_tone("🧑🏾‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_tone4("🧑🏾‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_medium_dark_skin_tone("🧑🏾‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_tone4_tone5("🧑🏾‍🤝‍🧑🏿"); - constexpr std::string people_holding_hands_medium_dark_skin_tone_dark_skin_tone("🧑🏾‍🤝‍🧑🏿"); - constexpr std::string people_holding_hands_tone5_tone1("🧑🏿‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_dark_skin_tone_light_skin_tone("🧑🏿‍🤝‍🧑🏻"); - constexpr std::string people_holding_hands_tone5_tone2("🧑🏿‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_dark_skin_tone_medium_light_skin_tone("🧑🏿‍🤝‍🧑🏼"); - constexpr std::string people_holding_hands_tone5_tone3("🧑🏿‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_dark_skin_tone_medium_skin_tone("🧑🏿‍🤝‍🧑🏽"); - constexpr std::string people_holding_hands_tone5_tone4("🧑🏿‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_dark_skin_tone_medium_dark_skin_tone("🧑🏿‍🤝‍🧑🏾"); - constexpr std::string people_holding_hands_tone5("🧑🏿‍🤝‍🧑🏿"); - constexpr std::string people_holding_hands_dark_skin_tone("🧑🏿‍🤝‍🧑🏿"); - constexpr std::string couple("👫"); - constexpr std::string woman_and_man_holding_hands_tone1("👫🏻"); - constexpr std::string woman_and_man_holding_hands_light_skin_tone("👫🏻"); - constexpr std::string woman_and_man_holding_hands_tone1_tone2("👩🏻‍🤝‍👨🏼"); - constexpr std::string woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone("👩🏻‍🤝‍👨🏼"); - constexpr std::string woman_and_man_holding_hands_tone1_tone3("👩🏻‍🤝‍👨🏽"); - constexpr std::string woman_and_man_holding_hands_light_skin_tone_medium_skin_tone("👩🏻‍🤝‍👨🏽"); - constexpr std::string woman_and_man_holding_hands_tone1_tone4("👩🏻‍🤝‍👨🏾"); - constexpr std::string woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone("👩🏻‍🤝‍👨🏾"); - constexpr std::string woman_and_man_holding_hands_tone1_tone5("👩🏻‍🤝‍👨🏿"); - constexpr std::string woman_and_man_holding_hands_light_skin_tone_dark_skin_tone("👩🏻‍🤝‍👨🏿"); - constexpr std::string woman_and_man_holding_hands_tone2_tone1("👩🏼‍🤝‍👨🏻"); - constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone("👩🏼‍🤝‍👨🏻"); - constexpr std::string woman_and_man_holding_hands_tone2("👫🏼"); - constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone("👫🏼"); - constexpr std::string woman_and_man_holding_hands_tone2_tone3("👩🏼‍🤝‍👨🏽"); - constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone("👩🏼‍🤝‍👨🏽"); - constexpr std::string woman_and_man_holding_hands_tone2_tone4("👩🏼‍🤝‍👨🏾"); - constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍🤝‍👨🏾"); - constexpr std::string woman_and_man_holding_hands_tone2_tone5("👩🏼‍🤝‍👨🏿"); - constexpr std::string woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone("👩🏼‍🤝‍👨🏿"); - constexpr std::string woman_and_man_holding_hands_tone3_tone1("👩🏽‍🤝‍👨🏻"); - constexpr std::string woman_and_man_holding_hands_medium_skin_tone_light_skin_tone("👩🏽‍🤝‍👨🏻"); - constexpr std::string woman_and_man_holding_hands_tone3_tone2("👩🏽‍🤝‍👨🏼"); - constexpr std::string woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone("👩🏽‍🤝‍👨🏼"); - constexpr std::string woman_and_man_holding_hands_tone3("👫🏽"); - constexpr std::string woman_and_man_holding_hands_medium_skin_tone("👫🏽"); - constexpr std::string woman_and_man_holding_hands_tone3_tone4("👩🏽‍🤝‍👨🏾"); - constexpr std::string woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone("👩🏽‍🤝‍👨🏾"); - constexpr std::string woman_and_man_holding_hands_tone3_tone5("👩🏽‍🤝‍👨🏿"); - constexpr std::string woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone("👩🏽‍🤝‍👨🏿"); - constexpr std::string woman_and_man_holding_hands_tone4_tone1("👩🏾‍🤝‍👨🏻"); - constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone("👩🏾‍🤝‍👨🏻"); - constexpr std::string woman_and_man_holding_hands_tone4_tone2("👩🏾‍🤝‍👨🏼"); - constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍🤝‍👨🏼"); - constexpr std::string woman_and_man_holding_hands_tone4_tone3("👩🏾‍🤝‍👨🏽"); - constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone("👩🏾‍🤝‍👨🏽"); - constexpr std::string woman_and_man_holding_hands_tone4("👫🏾"); - constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone("👫🏾"); - constexpr std::string woman_and_man_holding_hands_tone4_tone5("👩🏾‍🤝‍👨🏿"); - constexpr std::string woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone("👩🏾‍🤝‍👨🏿"); - constexpr std::string woman_and_man_holding_hands_tone5_tone1("👩🏿‍🤝‍👨🏻"); - constexpr std::string woman_and_man_holding_hands_dark_skin_tone_light_skin_tone("👩🏿‍🤝‍👨🏻"); - constexpr std::string woman_and_man_holding_hands_tone5_tone2("👩🏿‍🤝‍👨🏼"); - constexpr std::string woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone("👩🏿‍🤝‍👨🏼"); - constexpr std::string woman_and_man_holding_hands_tone5_tone3("👩🏿‍🤝‍👨🏽"); - constexpr std::string woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone("👩🏿‍🤝‍👨🏽"); - constexpr std::string woman_and_man_holding_hands_tone5_tone4("👩🏿‍🤝‍👨🏾"); - constexpr std::string woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone("👩🏿‍🤝‍👨🏾"); - constexpr std::string woman_and_man_holding_hands_tone5("👫🏿"); - constexpr std::string woman_and_man_holding_hands_dark_skin_tone("👫🏿"); - constexpr std::string two_women_holding_hands("👭"); - constexpr std::string women_holding_hands_tone1("👭🏻"); - constexpr std::string women_holding_hands_light_skin_tone("👭🏻"); - constexpr std::string women_holding_hands_tone1_tone2("👩🏻‍🤝‍👩🏼"); - constexpr std::string women_holding_hands_light_skin_tone_medium_light_skin_tone("👩🏻‍🤝‍👩🏼"); - constexpr std::string women_holding_hands_tone1_tone3("👩🏻‍🤝‍👩🏽"); - constexpr std::string women_holding_hands_light_skin_tone_medium_skin_tone("👩🏻‍🤝‍👩🏽"); - constexpr std::string women_holding_hands_tone1_tone4("👩🏻‍🤝‍👩🏾"); - constexpr std::string women_holding_hands_light_skin_tone_medium_dark_skin_tone("👩🏻‍🤝‍👩🏾"); - constexpr std::string women_holding_hands_tone1_tone5("👩🏻‍🤝‍👩🏿"); - constexpr std::string women_holding_hands_light_skin_tone_dark_skin_tone("👩🏻‍🤝‍👩🏿"); - constexpr std::string women_holding_hands_tone2_tone1("👩🏼‍🤝‍👩🏻"); - constexpr std::string women_holding_hands_medium_light_skin_tone_light_skin_tone("👩🏼‍🤝‍👩🏻"); - constexpr std::string women_holding_hands_tone2("👭🏼"); - constexpr std::string women_holding_hands_medium_light_skin_tone("👭🏼"); - constexpr std::string women_holding_hands_tone2_tone3("👩🏼‍🤝‍👩🏽"); - constexpr std::string women_holding_hands_medium_light_skin_tone_medium_skin_tone("👩🏼‍🤝‍👩🏽"); - constexpr std::string women_holding_hands_tone2_tone4("👩🏼‍🤝‍👩🏾"); - constexpr std::string women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍🤝‍👩🏾"); - constexpr std::string women_holding_hands_tone2_tone5("👩🏼‍🤝‍👩🏿"); - constexpr std::string women_holding_hands_medium_light_skin_tone_dark_skin_tone("👩🏼‍🤝‍👩🏿"); - constexpr std::string women_holding_hands_tone3_tone1("👩🏽‍🤝‍👩🏻"); - constexpr std::string women_holding_hands_medium_skin_tone_light_skin_tone("👩🏽‍🤝‍👩🏻"); - constexpr std::string women_holding_hands_tone3_tone2("👩🏽‍🤝‍👩🏼"); - constexpr std::string women_holding_hands_medium_skin_tone_medium_light_skin_tone("👩🏽‍🤝‍👩🏼"); - constexpr std::string women_holding_hands_tone3("👭🏽"); - constexpr std::string women_holding_hands_medium_skin_tone("👭🏽"); - constexpr std::string women_holding_hands_tone3_tone4("👩🏽‍🤝‍👩🏾"); - constexpr std::string women_holding_hands_medium_skin_tone_medium_dark_skin_tone("👩🏽‍🤝‍👩🏾"); - constexpr std::string women_holding_hands_tone3_tone5("👩🏽‍🤝‍👩🏿"); - constexpr std::string women_holding_hands_medium_skin_tone_dark_skin_tone("👩🏽‍🤝‍👩🏿"); - constexpr std::string women_holding_hands_tone4_tone1("👩🏾‍🤝‍👩🏻"); - constexpr std::string women_holding_hands_medium_dark_skin_tone_light_skin_tone("👩🏾‍🤝‍👩🏻"); - constexpr std::string women_holding_hands_tone4_tone2("👩🏾‍🤝‍👩🏼"); - constexpr std::string women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍🤝‍👩🏼"); - constexpr std::string women_holding_hands_tone4_tone3("👩🏾‍🤝‍👩🏽"); - constexpr std::string women_holding_hands_medium_dark_skin_tone_medium_skin_tone("👩🏾‍🤝‍👩🏽"); - constexpr std::string women_holding_hands_tone4("👭🏾"); - constexpr std::string women_holding_hands_medium_dark_skin_tone("👭🏾"); - constexpr std::string women_holding_hands_tone4_tone5("👩🏾‍🤝‍👩🏿"); - constexpr std::string women_holding_hands_medium_dark_skin_tone_dark_skin_tone("👩🏾‍🤝‍👩🏿"); - constexpr std::string women_holding_hands_tone5_tone1("👩🏿‍🤝‍👩🏻"); - constexpr std::string women_holding_hands_dark_skin_tone_light_skin_tone("👩🏿‍🤝‍👩🏻"); - constexpr std::string women_holding_hands_tone5_tone2("👩🏿‍🤝‍👩🏼"); - constexpr std::string women_holding_hands_dark_skin_tone_medium_light_skin_tone("👩🏿‍🤝‍👩🏼"); - constexpr std::string women_holding_hands_tone5_tone3("👩🏿‍🤝‍👩🏽"); - constexpr std::string women_holding_hands_dark_skin_tone_medium_skin_tone("👩🏿‍🤝‍👩🏽"); - constexpr std::string women_holding_hands_tone5_tone4("👩🏿‍🤝‍👩🏾"); - constexpr std::string women_holding_hands_dark_skin_tone_medium_dark_skin_tone("👩🏿‍🤝‍👩🏾"); - constexpr std::string women_holding_hands_tone5("👭🏿"); - constexpr std::string women_holding_hands_dark_skin_tone("👭🏿"); - constexpr std::string two_men_holding_hands("👬"); - constexpr std::string men_holding_hands_tone1("👬🏻"); - constexpr std::string men_holding_hands_light_skin_tone("👬🏻"); - constexpr std::string men_holding_hands_tone1_tone2("👨🏻‍🤝‍👨🏼"); - constexpr std::string men_holding_hands_light_skin_tone_medium_light_skin_tone("👨🏻‍🤝‍👨🏼"); - constexpr std::string men_holding_hands_tone1_tone3("👨🏻‍🤝‍👨🏽"); - constexpr std::string men_holding_hands_light_skin_tone_medium_skin_tone("👨🏻‍🤝‍👨🏽"); - constexpr std::string men_holding_hands_tone1_tone4("👨🏻‍🤝‍👨🏾"); - constexpr std::string men_holding_hands_light_skin_tone_medium_dark_skin_tone("👨🏻‍🤝‍👨🏾"); - constexpr std::string men_holding_hands_tone1_tone5("👨🏻‍🤝‍👨🏿"); - constexpr std::string men_holding_hands_light_skin_tone_dark_skin_tone("👨🏻‍🤝‍👨🏿"); - constexpr std::string men_holding_hands_tone2_tone1("👨🏼‍🤝‍👨🏻"); - constexpr std::string men_holding_hands_medium_light_skin_tone_light_skin_tone("👨🏼‍🤝‍👨🏻"); - constexpr std::string men_holding_hands_tone2("👬🏼"); - constexpr std::string men_holding_hands_medium_light_skin_tone("👬🏼"); - constexpr std::string men_holding_hands_tone2_tone3("👨🏼‍🤝‍👨🏽"); - constexpr std::string men_holding_hands_medium_light_skin_tone_medium_skin_tone("👨🏼‍🤝‍👨🏽"); - constexpr std::string men_holding_hands_tone2_tone4("👨🏼‍🤝‍👨🏾"); - constexpr std::string men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone("👨🏼‍🤝‍👨🏾"); - constexpr std::string men_holding_hands_tone2_tone5("👨🏼‍🤝‍👨🏿"); - constexpr std::string men_holding_hands_medium_light_skin_tone_dark_skin_tone("👨🏼‍🤝‍👨🏿"); - constexpr std::string men_holding_hands_tone3_tone1("👨🏽‍🤝‍👨🏻"); - constexpr std::string men_holding_hands_medium_skin_tone_light_skin_tone("👨🏽‍🤝‍👨🏻"); - constexpr std::string men_holding_hands_tone3_tone2("👨🏽‍🤝‍👨🏼"); - constexpr std::string men_holding_hands_medium_skin_tone_medium_light_skin_tone("👨🏽‍🤝‍👨🏼"); - constexpr std::string men_holding_hands_tone3("👬🏽"); - constexpr std::string men_holding_hands_medium_skin_tone("👬🏽"); - constexpr std::string men_holding_hands_tone3_tone4("👨🏽‍🤝‍👨🏾"); - constexpr std::string men_holding_hands_medium_skin_tone_medium_dark_skin_tone("👨🏽‍🤝‍👨🏾"); - constexpr std::string men_holding_hands_tone3_tone5("👨🏽‍🤝‍👨🏿"); - constexpr std::string men_holding_hands_medium_skin_tone_dark_skin_tone("👨🏽‍🤝‍👨🏿"); - constexpr std::string men_holding_hands_tone4_tone1("👨🏾‍🤝‍👨🏻"); - constexpr std::string men_holding_hands_medium_dark_skin_tone_light_skin_tone("👨🏾‍🤝‍👨🏻"); - constexpr std::string men_holding_hands_tone4_tone2("👨🏾‍🤝‍👨🏼"); - constexpr std::string men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone("👨🏾‍🤝‍👨🏼"); - constexpr std::string men_holding_hands_tone4_tone3("👨🏾‍🤝‍👨🏽"); - constexpr std::string men_holding_hands_medium_dark_skin_tone_medium_skin_tone("👨🏾‍🤝‍👨🏽"); - constexpr std::string men_holding_hands_tone4("👬🏾"); - constexpr std::string men_holding_hands_medium_dark_skin_tone("👬🏾"); - constexpr std::string men_holding_hands_tone4_tone5("👨🏾‍🤝‍👨🏿"); - constexpr std::string men_holding_hands_medium_dark_skin_tone_dark_skin_tone("👨🏾‍🤝‍👨🏿"); - constexpr std::string men_holding_hands_tone5_tone1("👨🏿‍🤝‍👨🏻"); - constexpr std::string men_holding_hands_dark_skin_tone_light_skin_tone("👨🏿‍🤝‍👨🏻"); - constexpr std::string men_holding_hands_tone5_tone2("👨🏿‍🤝‍👨🏼"); - constexpr std::string men_holding_hands_dark_skin_tone_medium_light_skin_tone("👨🏿‍🤝‍👨🏼"); - constexpr std::string men_holding_hands_tone5_tone3("👨🏿‍🤝‍👨🏽"); - constexpr std::string men_holding_hands_dark_skin_tone_medium_skin_tone("👨🏿‍🤝‍👨🏽"); - constexpr std::string men_holding_hands_tone5_tone4("👨🏿‍🤝‍👨🏾"); - constexpr std::string men_holding_hands_dark_skin_tone_medium_dark_skin_tone("👨🏿‍🤝‍👨🏾"); - constexpr std::string men_holding_hands_tone5("👬🏿"); - constexpr std::string men_holding_hands_dark_skin_tone("👬🏿"); - constexpr std::string couple_with_heart("💑"); - constexpr std::string couple_with_heart_tone1("💑🏻"); - constexpr std::string couple_with_heart_light_skin_tone("💑🏻"); - constexpr std::string couple_with_heart_person_person_tone1_tone2("🧑🏻‍❤️‍🧑🏼"); - constexpr std::string couple_with_heart_person_person_light_skin_tone_medium_light_skin_tone("🧑🏻‍❤️‍🧑🏼"); - constexpr std::string couple_with_heart_person_person_tone1_tone3("🧑🏻‍❤️‍🧑🏽"); - constexpr std::string couple_with_heart_person_person_light_skin_tone_medium_skin_tone("🧑🏻‍❤️‍🧑🏽"); - constexpr std::string couple_with_heart_person_person_tone1_tone4("🧑🏻‍❤️‍🧑🏾"); - constexpr std::string couple_with_heart_person_person_light_skin_tone_medium_dark_skin_tone("🧑🏻‍❤️‍🧑🏾"); - constexpr std::string couple_with_heart_person_person_tone1_tone5("🧑🏻‍❤️‍🧑🏿"); - constexpr std::string couple_with_heart_person_person_light_skin_tone_dark_skin_tone("🧑🏻‍❤️‍🧑🏿"); - constexpr std::string couple_with_heart_person_person_tone2_tone1("🧑🏼‍❤️‍🧑🏻"); - constexpr std::string couple_with_heart_person_person_medium_light_skin_tone_light_skin_tone("🧑🏼‍❤️‍🧑🏻"); - constexpr std::string couple_with_heart_tone2("💑🏼"); - constexpr std::string couple_with_heart_medium_light_skin_tone("💑🏼"); - constexpr std::string couple_with_heart_person_person_tone2_tone3("🧑🏼‍❤️‍🧑🏽"); - constexpr std::string couple_with_heart_person_person_medium_light_skin_tone_medium_skin_tone("🧑🏼‍❤️‍🧑🏽"); - constexpr std::string couple_with_heart_person_person_tone2_tone4("🧑🏼‍❤️‍🧑🏾"); - constexpr std::string couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone("🧑🏼‍❤️‍🧑🏾"); - constexpr std::string couple_with_heart_person_person_tone2_tone5("🧑🏼‍❤️‍🧑🏿"); - constexpr std::string couple_with_heart_person_person_medium_light_skin_tone_dark_skin_tone("🧑🏼‍❤️‍🧑🏿"); - constexpr std::string couple_with_heart_person_person_tone3_tone1("🧑🏽‍❤️‍🧑🏻"); - constexpr std::string couple_with_heart_person_person_medium_skin_tone_light_skin_tone("🧑🏽‍❤️‍🧑🏻"); - constexpr std::string couple_with_heart_person_person_tone3_tone2("🧑🏽‍❤️‍🧑🏼"); - constexpr std::string couple_with_heart_person_person_medium_skin_tone_medium_light_skin_tone("🧑🏽‍❤️‍🧑🏼"); - constexpr std::string couple_with_heart_tone3("💑🏽"); - constexpr std::string couple_with_heart_medium_skin_tone("💑🏽"); - constexpr std::string couple_with_heart_person_person_tone3_tone4("🧑🏽‍❤️‍🧑🏾"); - constexpr std::string couple_with_heart_person_person_medium_skin_tone_medium_dark_skin_tone("🧑🏽‍❤️‍🧑🏾"); - constexpr std::string couple_with_heart_person_person_tone3_tone5("🧑🏽‍❤️‍🧑🏿"); - constexpr std::string couple_with_heart_person_person_medium_skin_tone_dark_skin_tone("🧑🏽‍❤️‍🧑🏿"); - constexpr std::string couple_with_heart_person_person_tone4_tone1("🧑🏾‍❤️‍🧑🏻"); - constexpr std::string couple_with_heart_person_person_medium_dark_skin_tone_light_skin_tone("🧑🏾‍❤️‍🧑🏻"); - constexpr std::string couple_with_heart_person_person_tone4_tone2("🧑🏾‍❤️‍🧑🏼"); - constexpr std::string couple_with_heart_person_person_medium_dark_skin_tone_medium_light_skin_tone("🧑🏾‍❤️‍🧑🏼"); - constexpr std::string couple_with_heart_person_person_tone4_tone3("🧑🏾‍❤️‍🧑🏽"); - constexpr std::string couple_with_heart_person_person_medium_dark_skin_tone_medium_skin_tone("🧑🏾‍❤️‍🧑🏽"); - constexpr std::string couple_with_heart_tone4("💑🏾"); - constexpr std::string couple_with_heart_medium_dark_skin_tone("💑🏾"); - constexpr std::string couple_with_heart_person_person_tone4_tone5("🧑🏾‍❤️‍🧑🏿"); - constexpr std::string couple_with_heart_person_person_medium_dark_skin_tone_dark_skin_tone("🧑🏾‍❤️‍🧑🏿"); - constexpr std::string couple_with_heart_person_person_tone5_tone1("🧑🏿‍❤️‍🧑🏻"); - constexpr std::string couple_with_heart_person_person_dark_skin_tone_light_skin_tone("🧑🏿‍❤️‍🧑🏻"); - constexpr std::string couple_with_heart_person_person_tone5_tone2("🧑🏿‍❤️‍🧑🏼"); - constexpr std::string couple_with_heart_person_person_dark_skin_tone_medium_light_skin_tone("🧑🏿‍❤️‍🧑🏼"); - constexpr std::string couple_with_heart_person_person_tone5_tone3("🧑🏿‍❤️‍🧑🏽"); - constexpr std::string couple_with_heart_person_person_dark_skin_tone_medium_skin_tone("🧑🏿‍❤️‍🧑🏽"); - constexpr std::string couple_with_heart_person_person_tone5_tone4("🧑🏿‍❤️‍🧑🏾"); - constexpr std::string couple_with_heart_person_person_dark_skin_tone_medium_dark_skin_tone("🧑🏿‍❤️‍🧑🏾"); - constexpr std::string couple_with_heart_tone5("💑🏿"); - constexpr std::string couple_with_heart_dark_skin_tone("💑🏿"); - constexpr std::string couple_with_heart_woman_man("👩‍❤️‍👨"); - constexpr std::string couple_with_heart_woman_man_tone1("👩🏻‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_light_skin_tone("👩🏻‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_tone1_tone2("👩🏻‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_light_skin_tone_medium_light_skin_tone("👩🏻‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_tone1_tone3("👩🏻‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_light_skin_tone_medium_skin_tone("👩🏻‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_tone1_tone4("👩🏻‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_light_skin_tone_medium_dark_skin_tone("👩🏻‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_tone1_tone5("👩🏻‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_woman_man_light_skin_tone_dark_skin_tone("👩🏻‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_woman_man_tone2_tone1("👩🏼‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone_light_skin_tone("👩🏼‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_tone2("👩🏼‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone("👩🏼‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_tone2_tone3("👩🏼‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone_medium_skin_tone("👩🏼‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_tone2_tone4("👩🏼‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_tone2_tone5("👩🏼‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_woman_man_medium_light_skin_tone_dark_skin_tone("👩🏼‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_woman_man_tone3_tone1("👩🏽‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_medium_skin_tone_light_skin_tone("👩🏽‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_tone3_tone2("👩🏽‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_medium_skin_tone_medium_light_skin_tone("👩🏽‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_tone3("👩🏽‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_medium_skin_tone("👩🏽‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_tone3_tone4("👩🏽‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_medium_skin_tone_medium_dark_skin_tone("👩🏽‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_tone3_tone5("👩🏽‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone("👩🏽‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_woman_man_tone4_tone1("👩🏾‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone_light_skin_tone("👩🏾‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_tone4_tone2("👩🏾‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_tone4_tone3("👩🏾‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone_medium_skin_tone("👩🏾‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_tone4("👩🏾‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone("👩🏾‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_tone4_tone5("👩🏾‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_woman_man_medium_dark_skin_tone_dark_skin_tone("👩🏾‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_woman_man_tone5_tone1("👩🏿‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_dark_skin_tone_light_skin_tone("👩🏿‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_woman_man_tone5_tone2("👩🏿‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_dark_skin_tone_medium_light_skin_tone("👩🏿‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_woman_man_tone5_tone3("👩🏿‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone("👩🏿‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_woman_man_tone5_tone4("👩🏿‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_dark_skin_tone_medium_dark_skin_tone("👩🏿‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_woman_man_tone5("👩🏿‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_woman_man_dark_skin_tone("👩🏿‍❤️‍👨🏿"); - constexpr std::string couple_ww("👩‍❤️‍👩"); - constexpr std::string couple_with_heart_ww("👩‍❤️‍👩"); - constexpr std::string couple_with_heart_woman_woman_tone1("👩🏻‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_light_skin_tone("👩🏻‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_tone1_tone2("👩🏻‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_light_skin_tone_medium_light_skin_tone("👩🏻‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_tone1_tone3("👩🏻‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone("👩🏻‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_tone1_tone4("👩🏻‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_light_skin_tone_medium_dark_skin_tone("👩🏻‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_tone1_tone5("👩🏻‍❤️‍👩🏿"); - constexpr std::string couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone("👩🏻‍❤️‍👩🏿"); - constexpr std::string couple_with_heart_woman_woman_tone2_tone1("👩🏼‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone_light_skin_tone("👩🏼‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_tone2("👩🏼‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone("👩🏼‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_tone2_tone3("👩🏼‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone_medium_skin_tone("👩🏼‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_tone2_tone4("👩🏼‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_tone2_tone5("👩🏼‍❤️‍👩🏿"); - constexpr std::string couple_with_heart_woman_woman_medium_light_skin_tone_dark_skin_tone("👩🏼‍❤️‍👩🏿"); - constexpr std::string couple_with_heart_woman_woman_tone3_tone1("👩🏽‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone("👩🏽‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_tone3_tone2("👩🏽‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_medium_skin_tone_medium_light_skin_tone("👩🏽‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_tone3("👩🏽‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_medium_skin_tone("👩🏽‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_tone3_tone4("👩🏽‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_medium_skin_tone_medium_dark_skin_tone("👩🏽‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_tone3_tone5("👩🏽‍❤️‍👩🏿"); - constexpr std::string couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone("👩🏽‍❤️‍👩🏿"); - constexpr std::string couple_with_heart_woman_woman_tone4_tone1("👩🏾‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone_light_skin_tone("👩🏾‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_tone4_tone2("👩🏾‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_tone4_tone3("👩🏾‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone_medium_skin_tone("👩🏾‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_tone4("👩🏾‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone("👩🏾‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_tone4_tone5("👩🏾‍❤️‍👩🏿"); - constexpr std::string couple_with_heart_woman_woman_medium_dark_skin_tone_dark_skin_tone("👩🏾‍❤️‍👩🏿"); - constexpr std::string couple_with_heart_woman_woman_tone5_tone1("👩🏿‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone("👩🏿‍❤️‍👩🏻"); - constexpr std::string couple_with_heart_woman_woman_tone5_tone2("👩🏿‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_dark_skin_tone_medium_light_skin_tone("👩🏿‍❤️‍👩🏼"); - constexpr std::string couple_with_heart_woman_woman_tone5_tone3("👩🏿‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone("👩🏿‍❤️‍👩🏽"); - constexpr std::string couple_with_heart_woman_woman_tone5_tone4("👩🏿‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_dark_skin_tone_medium_dark_skin_tone("👩🏿‍❤️‍👩🏾"); - constexpr std::string couple_with_heart_woman_woman_tone5("👩🏿‍❤️‍👩🏿"); - constexpr std::string couple_with_heart_woman_woman_dark_skin_tone("👩🏿‍❤️‍👩🏿"); - constexpr std::string couple_mm("👨‍❤️‍👨"); - constexpr std::string couple_with_heart_mm("👨‍❤️‍👨"); - constexpr std::string couple_with_heart_man_man_tone1("👨🏻‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_light_skin_tone("👨🏻‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_tone1_tone2("👨🏻‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_light_skin_tone_medium_light_skin_tone("👨🏻‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_tone1_tone3("👨🏻‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_light_skin_tone_medium_skin_tone("👨🏻‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_tone1_tone4("👨🏻‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_light_skin_tone_medium_dark_skin_tone("👨🏻‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_tone1_tone5("👨🏻‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_man_man_light_skin_tone_dark_skin_tone("👨🏻‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_man_man_tone2_tone1("👨🏼‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_medium_light_skin_tone_light_skin_tone("👨🏼‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_tone2("👨🏼‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_medium_light_skin_tone("👨🏼‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_tone2_tone3("👨🏼‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_medium_light_skin_tone_medium_skin_tone("👨🏼‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_tone2_tone4("👨🏼‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_medium_light_skin_tone_medium_dark_skin_tone("👨🏼‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_tone2_tone5("👨🏼‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_man_man_medium_light_skin_tone_dark_skin_tone("👨🏼‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_man_man_tone3_tone1("👨🏽‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_medium_skin_tone_light_skin_tone("👨🏽‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_tone3_tone2("👨🏽‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_medium_skin_tone_medium_light_skin_tone("👨🏽‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_tone3("👨🏽‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_medium_skin_tone("👨🏽‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_tone3_tone4("👨🏽‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_medium_skin_tone_medium_dark_skin_tone("👨🏽‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_tone3_tone5("👨🏽‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_man_man_medium_skin_tone_dark_skin_tone("👨🏽‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_man_man_tone4_tone1("👨🏾‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone_light_skin_tone("👨🏾‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_tone4_tone2("👨🏾‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone_medium_light_skin_tone("👨🏾‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_tone4_tone3("👨🏾‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone_medium_skin_tone("👨🏾‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_tone4("👨🏾‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone("👨🏾‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_tone4_tone5("👨🏾‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_man_man_medium_dark_skin_tone_dark_skin_tone("👨🏾‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_man_man_tone5_tone1("👨🏿‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_dark_skin_tone_light_skin_tone("👨🏿‍❤️‍👨🏻"); - constexpr std::string couple_with_heart_man_man_tone5_tone2("👨🏿‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_dark_skin_tone_medium_light_skin_tone("👨🏿‍❤️‍👨🏼"); - constexpr std::string couple_with_heart_man_man_tone5_tone3("👨🏿‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_dark_skin_tone_medium_skin_tone("👨🏿‍❤️‍👨🏽"); - constexpr std::string couple_with_heart_man_man_tone5_tone4("👨🏿‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_dark_skin_tone_medium_dark_skin_tone("👨🏿‍❤️‍👨🏾"); - constexpr std::string couple_with_heart_man_man_tone5("👨🏿‍❤️‍👨🏿"); - constexpr std::string couple_with_heart_man_man_dark_skin_tone("👨🏿‍❤️‍👨🏿"); - constexpr std::string couplekiss("💏"); - constexpr std::string kiss_tone1("💏🏻"); - constexpr std::string kiss_light_skin_tone("💏🏻"); - constexpr std::string kiss_person_person_tone1_tone2("🧑🏻‍❤️‍💋‍🧑🏼"); - constexpr std::string kiss_person_person_light_skin_tone_medium_light_skin_tone("🧑🏻‍❤️‍💋‍🧑🏼"); - constexpr std::string kiss_person_person_tone1_tone3("🧑🏻‍❤️‍💋‍🧑🏽"); - constexpr std::string kiss_person_person_light_skin_tone_medium_skin_tone("🧑🏻‍❤️‍💋‍🧑🏽"); - constexpr std::string kiss_person_person_tone1_tone4("🧑🏻‍❤️‍💋‍🧑🏾"); - constexpr std::string kiss_person_person_light_skin_tone_medium_dark_skin_tone("🧑🏻‍❤️‍💋‍🧑🏾"); - constexpr std::string kiss_person_person_tone1_tone5("🧑🏻‍❤️‍💋‍🧑🏿"); - constexpr std::string kiss_person_person_light_skin_tone_dark_skin_tone("🧑🏻‍❤️‍💋‍🧑🏿"); - constexpr std::string kiss_person_person_tone2_tone1("🧑🏼‍❤️‍💋‍🧑🏻"); - constexpr std::string kiss_person_person_medium_light_skin_tone_light_skin_tone("🧑🏼‍❤️‍💋‍🧑🏻"); - constexpr std::string kiss_tone2("💏🏼"); - constexpr std::string kiss_medium_light_skin_tone("💏🏼"); - constexpr std::string kiss_person_person_tone2_tone3("🧑🏼‍❤️‍💋‍🧑🏽"); - constexpr std::string kiss_person_person_medium_light_skin_tone_medium_skin_tone("🧑🏼‍❤️‍💋‍🧑🏽"); - constexpr std::string kiss_person_person_tone2_tone4("🧑🏼‍❤️‍💋‍🧑🏾"); - constexpr std::string kiss_person_person_medium_light_skin_tone_medium_dark_skin_tone("🧑🏼‍❤️‍💋‍🧑🏾"); - constexpr std::string kiss_person_person_tone2_tone5("🧑🏼‍❤️‍💋‍🧑🏿"); - constexpr std::string kiss_person_person_medium_light_skin_tone_dark_skin_tone("🧑🏼‍❤️‍💋‍🧑🏿"); - constexpr std::string kiss_person_person_tone3_tone1("🧑🏽‍❤️‍💋‍🧑🏻"); - constexpr std::string kiss_person_person_medium_skin_tone_light_skin_tone("🧑🏽‍❤️‍💋‍🧑🏻"); - constexpr std::string kiss_person_person_tone3_tone2("🧑🏽‍❤️‍💋‍🧑🏼"); - constexpr std::string kiss_person_person_medium_skin_tone_medium_light_skin_tone("🧑🏽‍❤️‍💋‍🧑🏼"); - constexpr std::string kiss_tone3("💏🏽"); - constexpr std::string kiss_medium_skin_tone("💏🏽"); - constexpr std::string kiss_person_person_tone3_tone4("🧑🏽‍❤️‍💋‍🧑🏾"); - constexpr std::string kiss_person_person_medium_skin_tone_medium_dark_skin_tone("🧑🏽‍❤️‍💋‍🧑🏾"); - constexpr std::string kiss_person_person_tone3_tone5("🧑🏽‍❤️‍💋‍🧑🏿"); - constexpr std::string kiss_person_person_medium_skin_tone_dark_skin_tone("🧑🏽‍❤️‍💋‍🧑🏿"); - constexpr std::string kiss_person_person_tone4_tone1("🧑🏾‍❤️‍💋‍🧑🏻"); - constexpr std::string kiss_person_person_medium_dark_skin_tone_light_skin_tone("🧑🏾‍❤️‍💋‍🧑🏻"); - constexpr std::string kiss_person_person_tone4_tone2("🧑🏾‍❤️‍💋‍🧑🏼"); - constexpr std::string kiss_person_person_medium_dark_skin_tone_medium_light_skin_tone("🧑🏾‍❤️‍💋‍🧑🏼"); - constexpr std::string kiss_person_person_tone4_tone3("🧑🏾‍❤️‍💋‍🧑🏽"); - constexpr std::string kiss_person_person_medium_dark_skin_tone_medium_skin_tone("🧑🏾‍❤️‍💋‍🧑🏽"); - constexpr std::string kiss_tone4("💏🏾"); - constexpr std::string kiss_medium_dark_skin_tone("💏🏾"); - constexpr std::string kiss_person_person_tone4_tone5("🧑🏾‍❤️‍💋‍🧑🏿"); - constexpr std::string kiss_person_person_medium_dark_skin_tone_dark_skin_tone("🧑🏾‍❤️‍💋‍🧑🏿"); - constexpr std::string kiss_person_person_tone5_tone1("🧑🏿‍❤️‍💋‍🧑🏻"); - constexpr std::string kiss_person_person_dark_skin_tone_light_skin_tone("🧑🏿‍❤️‍💋‍🧑🏻"); - constexpr std::string kiss_person_person_tone5_tone2("🧑🏿‍❤️‍💋‍🧑🏼"); - constexpr std::string kiss_person_person_dark_skin_tone_medium_light_skin_tone("🧑🏿‍❤️‍💋‍🧑🏼"); - constexpr std::string kiss_person_person_tone5_tone3("🧑🏿‍❤️‍💋‍🧑🏽"); - constexpr std::string kiss_person_person_dark_skin_tone_medium_skin_tone("🧑🏿‍❤️‍💋‍🧑🏽"); - constexpr std::string kiss_person_person_tone5_tone4("🧑🏿‍❤️‍💋‍🧑🏾"); - constexpr std::string kiss_person_person_dark_skin_tone_medium_dark_skin_tone("🧑🏿‍❤️‍💋‍🧑🏾"); - constexpr std::string kiss_tone5("💏🏿"); - constexpr std::string kiss_dark_skin_tone("💏🏿"); - constexpr std::string kiss_woman_man("👩‍❤️‍💋‍👨"); - constexpr std::string kiss_woman_man_tone1("👩🏻‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_light_skin_tone("👩🏻‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_tone1_tone2("👩🏻‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_light_skin_tone_medium_light_skin_tone("👩🏻‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_tone1_tone3("👩🏻‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_light_skin_tone_medium_skin_tone("👩🏻‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_tone1_tone4("👩🏻‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_light_skin_tone_medium_dark_skin_tone("👩🏻‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_tone1_tone5("👩🏻‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_woman_man_light_skin_tone_dark_skin_tone("👩🏻‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_woman_man_tone2_tone1("👩🏼‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_medium_light_skin_tone_light_skin_tone("👩🏼‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_tone2("👩🏼‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_medium_light_skin_tone("👩🏼‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_tone2_tone3("👩🏼‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_medium_light_skin_tone_medium_skin_tone("👩🏼‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_tone2_tone4("👩🏼‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_tone2_tone5("👩🏼‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_woman_man_medium_light_skin_tone_dark_skin_tone("👩🏼‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_woman_man_tone3_tone1("👩🏽‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_medium_skin_tone_light_skin_tone("👩🏽‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_tone3_tone2("👩🏽‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_medium_skin_tone_medium_light_skin_tone("👩🏽‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_tone3("👩🏽‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_medium_skin_tone("👩🏽‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_tone3_tone4("👩🏽‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_medium_skin_tone_medium_dark_skin_tone("👩🏽‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_tone3_tone5("👩🏽‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_woman_man_medium_skin_tone_dark_skin_tone("👩🏽‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_woman_man_tone4_tone1("👩🏾‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_medium_dark_skin_tone_light_skin_tone("👩🏾‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_tone4_tone2("👩🏾‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_tone4_tone3("👩🏾‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_medium_dark_skin_tone_medium_skin_tone("👩🏾‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_tone4("👩🏾‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_medium_dark_skin_tone("👩🏾‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_tone4_tone5("👩🏾‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_woman_man_medium_dark_skin_tone_dark_skin_tone("👩🏾‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_woman_man_tone5_tone1("👩🏿‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_dark_skin_tone_light_skin_tone("👩🏿‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_woman_man_tone5_tone2("👩🏿‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_dark_skin_tone_medium_light_skin_tone("👩🏿‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_woman_man_tone5_tone3("👩🏿‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_dark_skin_tone_medium_skin_tone("👩🏿‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_woman_man_tone5_tone4("👩🏿‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_dark_skin_tone_medium_dark_skin_tone("👩🏿‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_woman_man_tone5("👩🏿‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_woman_man_dark_skin_tone("👩🏿‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_ww("👩‍❤️‍💋‍👩"); - constexpr std::string couplekiss_ww("👩‍❤️‍💋‍👩"); - constexpr std::string kiss_woman_woman_tone1("👩🏻‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_light_skin_tone("👩🏻‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_tone1_tone2("👩🏻‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_light_skin_tone_medium_light_skin_tone("👩🏻‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_tone1_tone3("👩🏻‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_light_skin_tone_medium_skin_tone("👩🏻‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_tone1_tone4("👩🏻‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_light_skin_tone_medium_dark_skin_tone("👩🏻‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_tone1_tone5("👩🏻‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_woman_woman_light_skin_tone_dark_skin_tone("👩🏻‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_woman_woman_tone2_tone1("👩🏼‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_medium_light_skin_tone_light_skin_tone("👩🏼‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_tone2("👩🏼‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_medium_light_skin_tone("👩🏼‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_tone2_tone3("👩🏼‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_medium_light_skin_tone_medium_skin_tone("👩🏼‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_tone2_tone4("👩🏼‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_medium_light_skin_tone_medium_dark_skin_tone("👩🏼‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_tone2_tone5("👩🏼‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_woman_woman_medium_light_skin_tone_dark_skin_tone("👩🏼‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_woman_woman_tone3_tone1("👩🏽‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_medium_skin_tone_light_skin_tone("👩🏽‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_tone3_tone2("👩🏽‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_medium_skin_tone_medium_light_skin_tone("👩🏽‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_tone3("👩🏽‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_medium_skin_tone("👩🏽‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_tone3_tone4("👩🏽‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_medium_skin_tone_medium_dark_skin_tone("👩🏽‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_tone3_tone5("👩🏽‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_woman_woman_medium_skin_tone_dark_skin_tone("👩🏽‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_woman_woman_tone4_tone1("👩🏾‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_medium_dark_skin_tone_light_skin_tone("👩🏾‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_tone4_tone2("👩🏾‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_medium_dark_skin_tone_medium_light_skin_tone("👩🏾‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_tone4_tone3("👩🏾‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_medium_dark_skin_tone_medium_skin_tone("👩🏾‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_tone4("👩🏾‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_medium_dark_skin_tone("👩🏾‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_tone4_tone5("👩🏾‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_woman_woman_medium_dark_skin_tone_dark_skin_tone("👩🏾‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_woman_woman_tone5_tone1("👩🏿‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_dark_skin_tone_light_skin_tone("👩🏿‍❤️‍💋‍👩🏻"); - constexpr std::string kiss_woman_woman_tone5_tone2("👩🏿‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_dark_skin_tone_medium_light_skin_tone("👩🏿‍❤️‍💋‍👩🏼"); - constexpr std::string kiss_woman_woman_tone5_tone3("👩🏿‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_dark_skin_tone_medium_skin_tone("👩🏿‍❤️‍💋‍👩🏽"); - constexpr std::string kiss_woman_woman_tone5_tone4("👩🏿‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_dark_skin_tone_medium_dark_skin_tone("👩🏿‍❤️‍💋‍👩🏾"); - constexpr std::string kiss_woman_woman_tone5("👩🏿‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_woman_woman_dark_skin_tone("👩🏿‍❤️‍💋‍👩🏿"); - constexpr std::string kiss_mm("👨‍❤️‍💋‍👨"); - constexpr std::string couplekiss_mm("👨‍❤️‍💋‍👨"); - constexpr std::string kiss_man_man_tone1("👨🏻‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_light_skin_tone("👨🏻‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_tone1_tone2("👨🏻‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_light_skin_tone_medium_light_skin_tone("👨🏻‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_tone1_tone3("👨🏻‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_light_skin_tone_medium_skin_tone("👨🏻‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_tone1_tone4("👨🏻‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_light_skin_tone_medium_dark_skin_tone("👨🏻‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_tone1_tone5("👨🏻‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_man_man_light_skin_tone_dark_skin_tone("👨🏻‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_man_man_tone2_tone1("👨🏼‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_medium_light_skin_tone_light_skin_tone("👨🏼‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_tone2("👨🏼‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_medium_light_skin_tone("👨🏼‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_tone2_tone3("👨🏼‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_medium_light_skin_tone_medium_skin_tone("👨🏼‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_tone2_tone4("👨🏼‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_medium_light_skin_tone_medium_dark_skin_tone("👨🏼‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_tone2_tone5("👨🏼‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_man_man_medium_light_skin_tone_dark_skin_tone("👨🏼‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_man_man_tone3_tone1("👨🏽‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_medium_skin_tone_light_skin_tone("👨🏽‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_tone3_tone2("👨🏽‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_medium_skin_tone_medium_light_skin_tone("👨🏽‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_tone3("👨🏽‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_medium_skin_tone("👨🏽‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_tone3_tone4("👨🏽‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_medium_skin_tone_medium_dark_skin_tone("👨🏽‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_tone3_tone5("👨🏽‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_man_man_medium_skin_tone_dark_skin_tone("👨🏽‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_man_man_tone4_tone1("👨🏾‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_medium_dark_skin_tone_light_skin_tone("👨🏾‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_tone4_tone2("👨🏾‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_medium_dark_skin_tone_medium_light_skin_tone("👨🏾‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_tone4_tone3("👨🏾‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_medium_dark_skin_tone_medium_skin_tone("👨🏾‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_tone4("👨🏾‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_medium_dark_skin_tone("👨🏾‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_tone4_tone5("👨🏾‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_man_man_medium_dark_skin_tone_dark_skin_tone("👨🏾‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_man_man_tone5_tone1("👨🏿‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_dark_skin_tone_light_skin_tone("👨🏿‍❤️‍💋‍👨🏻"); - constexpr std::string kiss_man_man_tone5_tone2("👨🏿‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_dark_skin_tone_medium_light_skin_tone("👨🏿‍❤️‍💋‍👨🏼"); - constexpr std::string kiss_man_man_tone5_tone3("👨🏿‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_dark_skin_tone_medium_skin_tone("👨🏿‍❤️‍💋‍👨🏽"); - constexpr std::string kiss_man_man_tone5_tone4("👨🏿‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_dark_skin_tone_medium_dark_skin_tone("👨🏿‍❤️‍💋‍👨🏾"); - constexpr std::string kiss_man_man_tone5("👨🏿‍❤️‍💋‍👨🏿"); - constexpr std::string kiss_man_man_dark_skin_tone("👨🏿‍❤️‍💋‍👨🏿"); - constexpr std::string family("👪"); - constexpr std::string family_man_woman_boy("👨‍👩‍👦"); - constexpr std::string family_mwg("👨‍👩‍👧"); - constexpr std::string family_mwgb("👨‍👩‍👧‍👦"); - constexpr std::string family_mwbb("👨‍👩‍👦‍👦"); - constexpr std::string family_mwgg("👨‍👩‍👧‍👧"); - constexpr std::string family_wwb("👩‍👩‍👦"); - constexpr std::string family_wwg("👩‍👩‍👧"); - constexpr std::string family_wwgb("👩‍👩‍👧‍👦"); - constexpr std::string family_wwbb("👩‍👩‍👦‍👦"); - constexpr std::string family_wwgg("👩‍👩‍👧‍👧"); - constexpr std::string family_mmb("👨‍👨‍👦"); - constexpr std::string family_mmg("👨‍👨‍👧"); - constexpr std::string family_mmgb("👨‍👨‍👧‍👦"); - constexpr std::string family_mmbb("👨‍👨‍👦‍👦"); - constexpr std::string family_mmgg("👨‍👨‍👧‍👧"); - constexpr std::string family_woman_boy("👩‍👦"); - constexpr std::string family_woman_girl("👩‍👧"); - constexpr std::string family_woman_girl_boy("👩‍👧‍👦"); - constexpr std::string family_woman_boy_boy("👩‍👦‍👦"); - constexpr std::string family_woman_girl_girl("👩‍👧‍👧"); - constexpr std::string family_man_boy("👨‍👦"); - constexpr std::string family_man_girl("👨‍👧"); - constexpr std::string family_man_girl_boy("👨‍👧‍👦"); - constexpr std::string family_man_boy_boy("👨‍👦‍👦"); - constexpr std::string family_man_girl_girl("👨‍👧‍👧"); - constexpr std::string knot("🪢"); - constexpr std::string yarn("🧶"); - constexpr std::string thread("🧵"); - constexpr std::string sewing_needle("🪡"); - constexpr std::string coat("🧥"); - constexpr std::string lab_coat("🥼"); - constexpr std::string safety_vest("🦺"); - constexpr std::string womans_clothes("👚"); - constexpr std::string shirt("👕"); - constexpr std::string jeans("👖"); - constexpr std::string briefs("🩲"); - constexpr std::string shorts("🩳"); - constexpr std::string necktie("👔"); - constexpr std::string dress("👗"); - constexpr std::string bikini("👙"); - constexpr std::string one_piece_swimsuit("🩱"); - constexpr std::string kimono("👘"); - constexpr std::string sari("🥻"); - constexpr std::string thong_sandal("🩴"); - constexpr std::string womans_flat_shoe("🥿"); - constexpr std::string high_heel("👠"); - constexpr std::string sandal("👡"); - constexpr std::string boot("👢"); - constexpr std::string mans_shoe("👞"); - constexpr std::string athletic_shoe("👟"); - constexpr std::string hiking_boot("🥾"); - constexpr std::string socks("🧦"); - constexpr std::string gloves("🧤"); - constexpr std::string scarf("🧣"); - constexpr std::string tophat("🎩"); - constexpr std::string billed_cap("🧢"); - constexpr std::string womans_hat("👒"); - constexpr std::string mortar_board("🎓"); - constexpr std::string helmet_with_cross("⛑️"); - constexpr std::string helmet_with_white_cross("⛑️"); - constexpr std::string military_helmet("🪖"); - constexpr std::string crown("👑"); - constexpr std::string ring("💍"); - constexpr std::string pouch("👝"); - constexpr std::string purse("👛"); - constexpr std::string handbag("👜"); - constexpr std::string briefcase("💼"); - constexpr std::string school_satchel("🎒"); - constexpr std::string luggage("🧳"); - constexpr std::string eyeglasses("👓"); - constexpr std::string dark_sunglasses("🕶️"); - constexpr std::string goggles("🥽"); - constexpr std::string closed_umbrella("🌂"); - constexpr std::string heart("❤️"); - constexpr std::string orange_heart("🧡"); - constexpr std::string yellow_heart("💛"); - constexpr std::string green_heart("💚"); - constexpr std::string blue_heart("💙"); - constexpr std::string purple_heart("💜"); - constexpr std::string black_heart("🖤"); - constexpr std::string brown_heart("🤎"); - constexpr std::string white_heart("🤍"); - constexpr std::string broken_heart("💔"); - constexpr std::string heart_exclamation("❣️"); - constexpr std::string heavy_heart_exclamation_mark_ornament("❣️"); - constexpr std::string two_hearts("💕"); - constexpr std::string revolving_hearts("💞"); - constexpr std::string heartbeat("💓"); - constexpr std::string heartpulse("💗"); - constexpr std::string sparkling_heart("💖"); - constexpr std::string cupid("💘"); - constexpr std::string gift_heart("💝"); - constexpr std::string mending_heart("❤️‍🩹"); - constexpr std::string heart_on_fire("❤️‍🔥"); - constexpr std::string heart_decoration("💟"); - constexpr std::string peace("☮️"); - constexpr std::string peace_symbol("☮️"); - constexpr std::string cross("✝️"); - constexpr std::string latin_cross("✝️"); - constexpr std::string star_and_crescent("☪️"); - constexpr std::string om_symbol("🕉️"); - constexpr std::string wheel_of_dharma("☸️"); - constexpr std::string star_of_david("✡️"); - constexpr std::string six_pointed_star("🔯"); - constexpr std::string menorah("🕎"); - constexpr std::string yin_yang("☯️"); - constexpr std::string orthodox_cross("☦️"); - constexpr std::string place_of_worship("🛐"); - constexpr std::string worship_symbol("🛐"); - constexpr std::string ophiuchus("⛎"); - constexpr std::string aries("♈"); - constexpr std::string taurus("♉"); - constexpr std::string gemini("♊"); - constexpr std::string cancer("♋"); - constexpr std::string leo("♌"); - constexpr std::string virgo("♍"); - constexpr std::string libra("♎"); - constexpr std::string scorpius("♏"); - constexpr std::string sagittarius("♐"); - constexpr std::string capricorn("♑"); - constexpr std::string aquarius("♒"); - constexpr std::string pisces("♓"); - constexpr std::string id("🆔"); - constexpr std::string atom("⚛️"); - constexpr std::string atom_symbol("⚛️"); - constexpr std::string accept("🉑"); - constexpr std::string radioactive("☢️"); - constexpr std::string radioactive_sign("☢️"); - constexpr std::string biohazard("☣️"); - constexpr std::string biohazard_sign("☣️"); - constexpr std::string mobile_phone_off("📴"); - constexpr std::string vibration_mode("📳"); - constexpr std::string u6709("🈶"); - constexpr std::string u7121("🈚"); - constexpr std::string u7533("🈸"); - constexpr std::string u55b6("🈺"); - constexpr std::string u6708("🈷️"); - constexpr std::string eight_pointed_black_star("✴️"); - constexpr std::string vs("🆚"); - constexpr std::string white_flower("💮"); - constexpr std::string ideograph_advantage("🉐"); - constexpr std::string secret("㊙️"); - constexpr std::string congratulations("㊗️"); - constexpr std::string u5408("🈴"); - constexpr std::string u6e80("🈵"); - constexpr std::string u5272("🈹"); - constexpr std::string u7981("🈲"); - constexpr std::string a("🅰️"); - constexpr std::string b("🅱️"); - constexpr std::string ab("🆎"); - constexpr std::string cl("🆑"); - constexpr std::string o2("🅾️"); - constexpr std::string sos("🆘"); - constexpr std::string x("❌"); - constexpr std::string o("⭕"); - constexpr std::string octagonal_sign("🛑"); - constexpr std::string stop_sign("🛑"); - constexpr std::string no_entry("⛔"); - constexpr std::string name_badge("📛"); - constexpr std::string no_entry_sign("🚫"); - constexpr std::string anger("💢"); - constexpr std::string hotsprings("♨️"); - constexpr std::string no_pedestrians("🚷"); - constexpr std::string do_not_litter("🚯"); - constexpr std::string no_bicycles("🚳"); - constexpr std::string non_potable_water("🚱"); - constexpr std::string underage("🔞"); - constexpr std::string no_mobile_phones("📵"); - constexpr std::string no_smoking("🚭"); - constexpr std::string exclamation("❗"); - constexpr std::string grey_exclamation("❕"); - constexpr std::string question("❓"); - constexpr std::string grey_question("❔"); - constexpr std::string bangbang("‼️"); - constexpr std::string interrobang("⁉️"); - constexpr std::string low_brightness("🔅"); - constexpr std::string high_brightness("🔆"); - constexpr std::string part_alternation_mark("〽️"); - constexpr std::string warning("⚠️"); - constexpr std::string children_crossing("🚸"); - constexpr std::string trident("🔱"); - constexpr std::string fleur_de_lis("⚜️"); - constexpr std::string beginner("🔰"); - constexpr std::string recycle("♻️"); - constexpr std::string white_check_mark("✅"); - constexpr std::string u6307("🈯"); - constexpr std::string chart("💹"); - constexpr std::string sparkle("❇️"); - constexpr std::string eight_spoked_asterisk("✳️"); - constexpr std::string negative_squared_cross_mark("❎"); - constexpr std::string globe_with_meridians("🌐"); - constexpr std::string diamond_shape_with_a_dot_inside("💠"); - constexpr std::string m("Ⓜ️"); - constexpr std::string cyclone("🌀"); - constexpr std::string zzz("💤"); - constexpr std::string atm("🏧"); - constexpr std::string wc("🚾"); - constexpr std::string wheelchair("♿"); - constexpr std::string parking("🅿️"); - constexpr std::string u7a7a("🈳"); - constexpr std::string sa("🈂️"); - constexpr std::string passport_control("🛂"); - constexpr std::string customs("🛃"); - constexpr std::string baggage_claim("🛄"); - constexpr std::string left_luggage("🛅"); - constexpr std::string elevator("🛗"); - constexpr std::string mens("🚹"); - constexpr std::string womens("🚺"); - constexpr std::string baby_symbol("🚼"); - constexpr std::string restroom("🚻"); - constexpr std::string put_litter_in_its_place("🚮"); - constexpr std::string cinema("🎦"); - constexpr std::string signal_strength("📶"); - constexpr std::string koko("🈁"); - constexpr std::string symbols("🔣"); - constexpr std::string information_source("ℹ️"); - constexpr std::string abc("🔤"); - constexpr std::string abcd("🔡"); - constexpr std::string capital_abcd("🔠"); - constexpr std::string ng("🆖"); - constexpr std::string ok("🆗"); - constexpr std::string up("🆙"); - constexpr std::string cool("🆒"); - constexpr std::string new("🆕"); - constexpr std::string free("🆓"); - constexpr std::string zero("0️⃣"); - constexpr std::string one("1️⃣"); - constexpr std::string two("2️⃣"); - constexpr std::string three("3️⃣"); - constexpr std::string four("4️⃣"); - constexpr std::string five("5️⃣"); - constexpr std::string six("6️⃣"); - constexpr std::string seven("7️⃣"); - constexpr std::string eight("8️⃣"); - constexpr std::string nine("9️⃣"); - constexpr std::string keycap_ten("🔟"); - constexpr std::string hash("#️⃣"); - constexpr std::string asterisk("*️⃣"); - constexpr std::string keycap_asterisk("*️⃣"); - constexpr std::string eject("⏏️"); - constexpr std::string eject_symbol("⏏️"); - constexpr std::string arrow_forward("▶️"); - constexpr std::string pause_button("⏸️"); - constexpr std::string double_vertical_bar("⏸️"); - constexpr std::string play_pause("⏯️"); - constexpr std::string stop_button("⏹️"); - constexpr std::string record_button("⏺️"); - constexpr std::string track_next("⏭️"); - constexpr std::string next_track("⏭️"); - constexpr std::string track_previous("⏮️"); - constexpr std::string previous_track("⏮️"); - constexpr std::string fast_forward("⏩"); - constexpr std::string rewind("⏪"); - constexpr std::string arrow_double_up("⏫"); - constexpr std::string arrow_double_down("⏬"); - constexpr std::string arrow_backward("◀️"); - constexpr std::string arrow_up_small("🔼"); - constexpr std::string arrow_down_small("🔽"); - constexpr std::string arrow_right("➡️"); - constexpr std::string arrow_left("⬅️"); - constexpr std::string arrow_up("⬆️"); - constexpr std::string arrow_down("⬇️"); - constexpr std::string arrow_upper_right("↗️"); - constexpr std::string arrow_lower_right("↘️"); - constexpr std::string arrow_lower_left("↙️"); - constexpr std::string arrow_upper_left("↖️"); - constexpr std::string arrow_up_down("↕️"); - constexpr std::string left_right_arrow("↔️"); - constexpr std::string arrow_right_hook("↪️"); - constexpr std::string leftwards_arrow_with_hook("↩️"); - constexpr std::string arrow_heading_up("⤴️"); - constexpr std::string arrow_heading_down("⤵️"); - constexpr std::string twisted_rightwards_arrows("🔀"); - constexpr std::string repeat("🔁"); - constexpr std::string repeat_one("🔂"); - constexpr std::string arrows_counterclockwise("🔄"); - constexpr std::string arrows_clockwise("🔃"); - constexpr std::string musical_note("🎵"); - constexpr std::string notes("🎶"); - constexpr std::string heavy_plus_sign("➕"); - constexpr std::string heavy_minus_sign("➖"); - constexpr std::string heavy_division_sign("➗"); - constexpr std::string heavy_multiplication_x("✖️"); - constexpr std::string heavy_equals_sign("🟰"); - constexpr std::string infinity("♾️"); - constexpr std::string heavy_dollar_sign("💲"); - constexpr std::string currency_exchange("💱"); - constexpr std::string tm("™️"); - constexpr std::string copyright("©️"); - constexpr std::string registered("®️"); - constexpr std::string wavy_dash("〰️"); - constexpr std::string curly_loop("➰"); - constexpr std::string loop("➿"); - constexpr std::string end("🔚"); - constexpr std::string back("🔙"); - constexpr std::string on("🔛"); - constexpr std::string top("🔝"); - constexpr std::string soon("🔜"); - constexpr std::string heavy_check_mark("✔️"); - constexpr std::string ballot_box_with_check("☑️"); - constexpr std::string radio_button("🔘"); - constexpr std::string white_circle("⚪"); - constexpr std::string black_circle("⚫"); - constexpr std::string red_circle("🔴"); - constexpr std::string blue_circle("🔵"); - constexpr std::string brown_circle("🟤"); - constexpr std::string purple_circle("🟣"); - constexpr std::string green_circle("🟢"); - constexpr std::string yellow_circle("🟡"); - constexpr std::string orange_circle("🟠"); - constexpr std::string small_red_triangle("🔺"); - constexpr std::string small_red_triangle_down("🔻"); - constexpr std::string small_orange_diamond("🔸"); - constexpr std::string small_blue_diamond("🔹"); - constexpr std::string large_orange_diamond("🔶"); - constexpr std::string large_blue_diamond("🔷"); - constexpr std::string white_square_button("🔳"); - constexpr std::string black_square_button("🔲"); - constexpr std::string black_small_square("▪️"); - constexpr std::string white_small_square("▫️"); - constexpr std::string black_medium_small_square("◾"); - constexpr std::string white_medium_small_square("◽"); - constexpr std::string black_medium_square("◼️"); - constexpr std::string white_medium_square("◻️"); - constexpr std::string black_large_square("⬛"); - constexpr std::string white_large_square("⬜"); - constexpr std::string orange_square("🟧"); - constexpr std::string blue_square("🟦"); - constexpr std::string red_square("🟥"); - constexpr std::string brown_square("🟫"); - constexpr std::string purple_square("🟪"); - constexpr std::string green_square("🟩"); - constexpr std::string yellow_square("🟨"); - constexpr std::string speaker("🔈"); - constexpr std::string mute("🔇"); - constexpr std::string sound("🔉"); - constexpr std::string loud_sound("🔊"); - constexpr std::string bell("🔔"); - constexpr std::string no_bell("🔕"); - constexpr std::string mega("📣"); - constexpr std::string loudspeaker("📢"); - constexpr std::string speech_left("🗨️"); - constexpr std::string left_speech_bubble("🗨️"); - constexpr std::string eye_in_speech_bubble("👁‍🗨"); - constexpr std::string speech_balloon("💬"); - constexpr std::string thought_balloon("💭"); - constexpr std::string anger_right("🗯️"); - constexpr std::string right_anger_bubble("🗯️"); - constexpr std::string spades("♠️"); - constexpr std::string clubs("♣️"); - constexpr std::string hearts("♥️"); - constexpr std::string diamonds("♦️"); - constexpr std::string black_joker("🃏"); - constexpr std::string flower_playing_cards("🎴"); - constexpr std::string mahjong("🀄"); - constexpr std::string clock1("🕐"); - constexpr std::string clock2("🕑"); - constexpr std::string clock3("🕒"); - constexpr std::string clock4("🕓"); - constexpr std::string clock5("🕔"); - constexpr std::string clock6("🕕"); - constexpr std::string clock7("🕖"); - constexpr std::string clock8("🕗"); - constexpr std::string clock9("🕘"); - constexpr std::string clock10("🕙"); - constexpr std::string clock11("🕚"); - constexpr std::string clock12("🕛"); - constexpr std::string clock130("🕜"); - constexpr std::string clock230("🕝"); - constexpr std::string clock330("🕞"); - constexpr std::string clock430("🕟"); - constexpr std::string clock530("🕠"); - constexpr std::string clock630("🕡"); - constexpr std::string clock730("🕢"); - constexpr std::string clock830("🕣"); - constexpr std::string clock930("🕤"); - constexpr std::string clock1030("🕥"); - constexpr std::string clock1130("🕦"); - constexpr std::string clock1230("🕧"); - constexpr std::string female_sign("♀️"); - constexpr std::string male_sign("♂️"); - constexpr std::string transgender_symbol("⚧"); - constexpr std::string medical_symbol("⚕️"); - constexpr std::string regional_indicator_z("🇿"); - constexpr std::string regional_indicator_y("🇾"); - constexpr std::string regional_indicator_x("🇽"); - constexpr std::string regional_indicator_w("🇼"); - constexpr std::string regional_indicator_v("🇻"); - constexpr std::string regional_indicator_u("🇺"); - constexpr std::string regional_indicator_t("🇹"); - constexpr std::string regional_indicator_s("🇸"); - constexpr std::string regional_indicator_r("🇷"); - constexpr std::string regional_indicator_q("🇶"); - constexpr std::string regional_indicator_p("🇵"); - constexpr std::string regional_indicator_o("🇴"); - constexpr std::string regional_indicator_n("🇳"); - constexpr std::string regional_indicator_m("🇲"); - constexpr std::string regional_indicator_l("🇱"); - constexpr std::string regional_indicator_k("🇰"); - constexpr std::string regional_indicator_j("🇯"); - constexpr std::string regional_indicator_i("🇮"); - constexpr std::string regional_indicator_h("🇭"); - constexpr std::string regional_indicator_g("🇬"); - constexpr std::string regional_indicator_f("🇫"); - constexpr std::string regional_indicator_e("🇪"); - constexpr std::string regional_indicator_d("🇩"); - constexpr std::string regional_indicator_c("🇨"); - constexpr std::string regional_indicator_b("🇧"); - constexpr std::string regional_indicator_a("🇦"); - constexpr std::string red_car("🚗"); - constexpr std::string taxi("🚕"); - constexpr std::string blue_car("🚙"); - constexpr std::string pickup_truck("🛻"); - constexpr std::string bus("🚌"); - constexpr std::string trolleybus("🚎"); - constexpr std::string race_car("🏎️"); - constexpr std::string racing_car("🏎️"); - constexpr std::string police_car("🚓"); - constexpr std::string ambulance("🚑"); - constexpr std::string fire_engine("🚒"); - constexpr std::string minibus("🚐"); - constexpr std::string truck("🚚"); - constexpr std::string articulated_lorry("🚛"); - constexpr std::string tractor("🚜"); - constexpr std::string probing_cane("🦯"); - constexpr std::string crutch("🩼"); - constexpr std::string manual_wheelchair("🦽"); - constexpr std::string motorized_wheelchair("🦼"); - constexpr std::string scooter("🛴"); - constexpr std::string bike("🚲"); - constexpr std::string motor_scooter("🛵"); - constexpr std::string motorbike("🛵"); - constexpr std::string motorcycle("🏍️"); - constexpr std::string racing_motorcycle("🏍️"); - constexpr std::string auto_rickshaw("🛺"); - constexpr std::string wheel("🛞"); - constexpr std::string rotating_light("🚨"); - constexpr std::string oncoming_police_car("🚔"); - constexpr std::string oncoming_bus("🚍"); - constexpr std::string oncoming_automobile("🚘"); - constexpr std::string oncoming_taxi("🚖"); - constexpr std::string aerial_tramway("🚡"); - constexpr std::string mountain_cableway("🚠"); - constexpr std::string suspension_railway("🚟"); - constexpr std::string railway_car("🚃"); - constexpr std::string train("🚋"); - constexpr std::string mountain_railway("🚞"); - constexpr std::string monorail("🚝"); - constexpr std::string bullettrain_side("🚄"); - constexpr std::string bullettrain_front("🚅"); - constexpr std::string light_rail("🚈"); - constexpr std::string steam_locomotive("🚂"); - constexpr std::string train2("🚆"); - constexpr std::string metro("🚇"); - constexpr std::string tram("🚊"); - constexpr std::string station("🚉"); - constexpr std::string airplane("✈️"); - constexpr std::string airplane_departure("🛫"); - constexpr std::string airplane_arriving("🛬"); - constexpr std::string airplane_small("🛩️"); - constexpr std::string small_airplane("🛩️"); - constexpr std::string seat("💺"); - constexpr std::string satellite_orbital("🛰️"); - constexpr std::string rocket("🚀"); - constexpr std::string flying_saucer("🛸"); - constexpr std::string helicopter("🚁"); - constexpr std::string canoe("🛶"); - constexpr std::string kayak("🛶"); - constexpr std::string sailboat("⛵"); - constexpr std::string speedboat("🚤"); - constexpr std::string motorboat("🛥️"); - constexpr std::string cruise_ship("🛳️"); - constexpr std::string passenger_ship("🛳️"); - constexpr std::string ferry("⛴️"); - constexpr std::string ship("🚢"); - constexpr std::string ring_buoy("🛟"); - constexpr std::string anchor("⚓"); - constexpr std::string hook("🪝"); - constexpr std::string fuelpump("⛽"); - constexpr std::string construction("🚧"); - constexpr std::string vertical_traffic_light("🚦"); - constexpr std::string traffic_light("🚥"); - constexpr std::string busstop("🚏"); - constexpr std::string map("🗺️"); - constexpr std::string world_map("🗺️"); - constexpr std::string moyai("🗿"); - constexpr std::string statue_of_liberty("🗽"); - constexpr std::string tokyo_tower("🗼"); - constexpr std::string european_castle("🏰"); - constexpr std::string japanese_castle("🏯"); - constexpr std::string stadium("🏟️"); - constexpr std::string ferris_wheel("🎡"); - constexpr std::string roller_coaster("🎢"); - constexpr std::string carousel_horse("🎠"); - constexpr std::string fountain("⛲"); - constexpr std::string beach_umbrella("⛱️"); - constexpr std::string umbrella_on_ground("⛱️"); - constexpr std::string beach("🏖️"); - constexpr std::string beach_with_umbrella("🏖️"); - constexpr std::string island("🏝️"); - constexpr std::string desert_island("🏝️"); - constexpr std::string desert("🏜️"); - constexpr std::string volcano("🌋"); - constexpr std::string mountain("⛰️"); - constexpr std::string mountain_snow("🏔️"); - constexpr std::string snow_capped_mountain("🏔️"); - constexpr std::string mount_fuji("🗻"); - constexpr std::string camping("🏕️"); - constexpr std::string tent("⛺"); - constexpr std::string house("🏠"); - constexpr std::string house_with_garden("🏡"); - constexpr std::string homes("🏘️"); - constexpr std::string house_buildings("🏘️"); - constexpr std::string house_abandoned("🏚️"); - constexpr std::string derelict_house_building("🏚️"); - constexpr std::string hut("🛖"); - constexpr std::string construction_site("🏗️"); - constexpr std::string building_construction("🏗️"); - constexpr std::string factory("🏭"); - constexpr std::string office("🏢"); - constexpr std::string department_store("🏬"); - constexpr std::string post_office("🏣"); - constexpr std::string european_post_office("🏤"); - constexpr std::string hospital("🏥"); - constexpr std::string bank("🏦"); - constexpr std::string hotel("🏨"); - constexpr std::string convenience_store("🏪"); - constexpr std::string school("🏫"); - constexpr std::string love_hotel("🏩"); - constexpr std::string wedding("💒"); - constexpr std::string classical_building("🏛️"); - constexpr std::string church("⛪"); - constexpr std::string mosque("🕌"); - constexpr std::string synagogue("🕍"); - constexpr std::string hindu_temple("🛕"); - constexpr std::string kaaba("🕋"); - constexpr std::string shinto_shrine("⛩️"); - constexpr std::string railway_track("🛤️"); - constexpr std::string railroad_track("🛤️"); - constexpr std::string motorway("🛣️"); - constexpr std::string japan("🗾"); - constexpr std::string rice_scene("🎑"); - constexpr std::string park("🏞️"); - constexpr std::string national_park("🏞️"); - constexpr std::string sunrise("🌅"); - constexpr std::string sunrise_over_mountains("🌄"); - constexpr std::string stars("🌠"); - constexpr std::string sparkler("🎇"); - constexpr std::string fireworks("🎆"); - constexpr std::string city_sunset("🌇"); - constexpr std::string city_sunrise("🌇"); - constexpr std::string city_dusk("🌆"); - constexpr std::string cityscape("🏙️"); - constexpr std::string night_with_stars("🌃"); - constexpr std::string milky_way("🌌"); - constexpr std::string bridge_at_night("🌉"); - constexpr std::string foggy("🌁"); + constexpr const char[] _100 = "💯"; + constexpr const char[] _1234 = "🔢"; + constexpr const char[] soccer = "⚽"; + constexpr const char[] basketball = "🏀"; + constexpr const char[] football = "🏈"; + constexpr const char[] baseball = "⚾"; + constexpr const char[] softball = "🥎"; + constexpr const char[] tennis = "🎾"; + constexpr const char[] volleyball = "🏐"; + constexpr const char[] rugby_football = "🏉"; + constexpr const char[] flying_disc = "🥏"; + constexpr const char[] _8ball = "🎱"; + constexpr const char[] yo_yo = "🪀"; + constexpr const char[] ping_pong = "🏓"; + constexpr const char[] table_tennis = "🏓"; + constexpr const char[] badminton = "🏸"; + constexpr const char[] hockey = "🏒"; + constexpr const char[] field_hockey = "🏑"; + constexpr const char[] lacrosse = "🥍"; + constexpr const char[] cricket_game = "🏏"; + constexpr const char[] cricket_bat_ball = "🏏"; + constexpr const char[] boomerang = "🪃"; + constexpr const char[] goal = "🥅"; + constexpr const char[] goal_net = "🥅"; + constexpr const char[] golf = "⛳"; + constexpr const char[] kite = "🪁"; + constexpr const char[] playground_slide = "🛝"; + constexpr const char[] bow_and_arrow = "🏹"; + constexpr const char[] archery = "🏹"; + constexpr const char[] fishing_pole_and_fish = "🎣"; + constexpr const char[] diving_mask = "🤿"; + constexpr const char[] boxing_glove = "🥊"; + constexpr const char[] boxing_gloves = "🥊"; + constexpr const char[] martial_arts_uniform = "🥋"; + constexpr const char[] karate_uniform = "🥋"; + constexpr const char[] running_shirt_with_sash = "🎽"; + constexpr const char[] skateboard = "🛹"; + constexpr const char[] roller_skate = "🛼"; + constexpr const char[] sled = "🛷"; + constexpr const char[] ice_skate = "⛸️"; + constexpr const char[] curling_stone = "🥌"; + constexpr const char[] ski = "🎿"; + constexpr const char[] skier = "⛷️"; + constexpr const char[] snowboarder = "🏂"; + constexpr const char[] snowboarder_tone1 = "🏂🏻"; + constexpr const char[] snowboarder_light_skin_tone = "🏂🏻"; + constexpr const char[] snowboarder_tone2 = "🏂🏼"; + constexpr const char[] snowboarder_medium_light_skin_tone = "🏂🏼"; + constexpr const char[] snowboarder_tone3 = "🏂🏽"; + constexpr const char[] snowboarder_medium_skin_tone = "🏂🏽"; + constexpr const char[] snowboarder_tone4 = "🏂🏾"; + constexpr const char[] snowboarder_medium_dark_skin_tone = "🏂🏾"; + constexpr const char[] snowboarder_tone5 = "🏂🏿"; + constexpr const char[] snowboarder_dark_skin_tone = "🏂🏿"; + constexpr const char[] parachute = "🪂"; + constexpr const char[] person_lifting_weights = "🏋️"; + constexpr const char[] lifter = "🏋️"; + constexpr const char[] weight_lifter = "🏋️"; + constexpr const char[] person_lifting_weights_tone1 = "🏋🏻"; + constexpr const char[] lifter_tone1 = "🏋🏻"; + constexpr const char[] weight_lifter_tone1 = "🏋🏻"; + constexpr const char[] person_lifting_weights_tone2 = "🏋🏼"; + constexpr const char[] lifter_tone2 = "🏋🏼"; + constexpr const char[] weight_lifter_tone2 = "🏋🏼"; + constexpr const char[] person_lifting_weights_tone3 = "🏋🏽"; + constexpr const char[] lifter_tone3 = "🏋🏽"; + constexpr const char[] weight_lifter_tone3 = "🏋🏽"; + constexpr const char[] person_lifting_weights_tone4 = "🏋🏾"; + constexpr const char[] lifter_tone4 = "🏋🏾"; + constexpr const char[] weight_lifter_tone4 = "🏋🏾"; + constexpr const char[] person_lifting_weights_tone5 = "🏋🏿"; + constexpr const char[] lifter_tone5 = "🏋🏿"; + constexpr const char[] weight_lifter_tone5 = "🏋🏿"; + constexpr const char[] woman_lifting_weights = "🏋️‍♀️"; + constexpr const char[] woman_lifting_weights_tone1 = "🏋🏻‍♀️"; + constexpr const char[] woman_lifting_weights_light_skin_tone = "🏋🏻‍♀️"; + constexpr const char[] woman_lifting_weights_tone2 = "🏋🏼‍♀️"; + constexpr const char[] woman_lifting_weights_medium_light_skin_tone = "🏋🏼‍♀️"; + constexpr const char[] woman_lifting_weights_tone3 = "🏋🏽‍♀️"; + constexpr const char[] woman_lifting_weights_medium_skin_tone = "🏋🏽‍♀️"; + constexpr const char[] woman_lifting_weights_tone4 = "🏋🏾‍♀️"; + constexpr const char[] woman_lifting_weights_medium_dark_skin_tone = "🏋🏾‍♀️"; + constexpr const char[] woman_lifting_weights_tone5 = "🏋🏿‍♀️"; + constexpr const char[] woman_lifting_weights_dark_skin_tone = "🏋🏿‍♀️"; + constexpr const char[] man_lifting_weights = "🏋️‍♂️"; + constexpr const char[] man_lifting_weights_tone1 = "🏋🏻‍♂️"; + constexpr const char[] man_lifting_weights_light_skin_tone = "🏋🏻‍♂️"; + constexpr const char[] man_lifting_weights_tone2 = "🏋🏼‍♂️"; + constexpr const char[] man_lifting_weights_medium_light_skin_tone = "🏋🏼‍♂️"; + constexpr const char[] man_lifting_weights_tone3 = "🏋🏽‍♂️"; + constexpr const char[] man_lifting_weights_medium_skin_tone = "🏋🏽‍♂️"; + constexpr const char[] man_lifting_weights_tone4 = "🏋🏾‍♂️"; + constexpr const char[] man_lifting_weights_medium_dark_skin_tone = "🏋🏾‍♂️"; + constexpr const char[] man_lifting_weights_tone5 = "🏋🏿‍♂️"; + constexpr const char[] man_lifting_weights_dark_skin_tone = "🏋🏿‍♂️"; + constexpr const char[] people_wrestling = "🤼"; + constexpr const char[] wrestlers = "🤼"; + constexpr const char[] wrestling = "🤼"; + constexpr const char[] women_wrestling = "🤼‍♀️"; + constexpr const char[] men_wrestling = "🤼‍♂️"; + constexpr const char[] person_doing_cartwheel = "🤸"; + constexpr const char[] cartwheel = "🤸"; + constexpr const char[] person_doing_cartwheel_tone1 = "🤸🏻"; + constexpr const char[] cartwheel_tone1 = "🤸🏻"; + constexpr const char[] person_doing_cartwheel_tone2 = "🤸🏼"; + constexpr const char[] cartwheel_tone2 = "🤸🏼"; + constexpr const char[] person_doing_cartwheel_tone3 = "🤸🏽"; + constexpr const char[] cartwheel_tone3 = "🤸🏽"; + constexpr const char[] person_doing_cartwheel_tone4 = "🤸🏾"; + constexpr const char[] cartwheel_tone4 = "🤸🏾"; + constexpr const char[] person_doing_cartwheel_tone5 = "🤸🏿"; + constexpr const char[] cartwheel_tone5 = "🤸🏿"; + constexpr const char[] woman_cartwheeling = "🤸‍♀️"; + constexpr const char[] woman_cartwheeling_tone1 = "🤸🏻‍♀️"; + constexpr const char[] woman_cartwheeling_light_skin_tone = "🤸🏻‍♀️"; + constexpr const char[] woman_cartwheeling_tone2 = "🤸🏼‍♀️"; + constexpr const char[] woman_cartwheeling_medium_light_skin_tone = "🤸🏼‍♀️"; + constexpr const char[] woman_cartwheeling_tone3 = "🤸🏽‍♀️"; + constexpr const char[] woman_cartwheeling_medium_skin_tone = "🤸🏽‍♀️"; + constexpr const char[] woman_cartwheeling_tone4 = "🤸🏾‍♀️"; + constexpr const char[] woman_cartwheeling_medium_dark_skin_tone = "🤸🏾‍♀️"; + constexpr const char[] woman_cartwheeling_tone5 = "🤸🏿‍♀️"; + constexpr const char[] woman_cartwheeling_dark_skin_tone = "🤸🏿‍♀️"; + constexpr const char[] man_cartwheeling = "🤸‍♂️"; + constexpr const char[] man_cartwheeling_tone1 = "🤸🏻‍♂️"; + constexpr const char[] man_cartwheeling_light_skin_tone = "🤸🏻‍♂️"; + constexpr const char[] man_cartwheeling_tone2 = "🤸🏼‍♂️"; + constexpr const char[] man_cartwheeling_medium_light_skin_tone = "🤸🏼‍♂️"; + constexpr const char[] man_cartwheeling_tone3 = "🤸🏽‍♂️"; + constexpr const char[] man_cartwheeling_medium_skin_tone = "🤸🏽‍♂️"; + constexpr const char[] man_cartwheeling_tone4 = "🤸🏾‍♂️"; + constexpr const char[] man_cartwheeling_medium_dark_skin_tone = "🤸🏾‍♂️"; + constexpr const char[] man_cartwheeling_tone5 = "🤸🏿‍♂️"; + constexpr const char[] man_cartwheeling_dark_skin_tone = "🤸🏿‍♂️"; + constexpr const char[] person_bouncing_ball = "⛹️"; + constexpr const char[] basketball_player = "⛹️"; + constexpr const char[] person_with_ball = "⛹️"; + constexpr const char[] person_bouncing_ball_tone1 = "⛹🏻"; + constexpr const char[] basketball_player_tone1 = "⛹🏻"; + constexpr const char[] person_with_ball_tone1 = "⛹🏻"; + constexpr const char[] person_bouncing_ball_tone2 = "⛹🏼"; + constexpr const char[] basketball_player_tone2 = "⛹🏼"; + constexpr const char[] person_with_ball_tone2 = "⛹🏼"; + constexpr const char[] person_bouncing_ball_tone3 = "⛹🏽"; + constexpr const char[] basketball_player_tone3 = "⛹🏽"; + constexpr const char[] person_with_ball_tone3 = "⛹🏽"; + constexpr const char[] person_bouncing_ball_tone4 = "⛹🏾"; + constexpr const char[] basketball_player_tone4 = "⛹🏾"; + constexpr const char[] person_with_ball_tone4 = "⛹🏾"; + constexpr const char[] person_bouncing_ball_tone5 = "⛹🏿"; + constexpr const char[] basketball_player_tone5 = "⛹🏿"; + constexpr const char[] person_with_ball_tone5 = "⛹🏿"; + constexpr const char[] woman_bouncing_ball = "⛹️‍♀️"; + constexpr const char[] woman_bouncing_ball_tone1 = "⛹🏻‍♀️"; + constexpr const char[] woman_bouncing_ball_light_skin_tone = "⛹🏻‍♀️"; + constexpr const char[] woman_bouncing_ball_tone2 = "⛹🏼‍♀️"; + constexpr const char[] woman_bouncing_ball_medium_light_skin_tone = "⛹🏼‍♀️"; + constexpr const char[] woman_bouncing_ball_tone3 = "⛹🏽‍♀️"; + constexpr const char[] woman_bouncing_ball_medium_skin_tone = "⛹🏽‍♀️"; + constexpr const char[] woman_bouncing_ball_tone4 = "⛹🏾‍♀️"; + constexpr const char[] woman_bouncing_ball_medium_dark_skin_tone = "⛹🏾‍♀️"; + constexpr const char[] woman_bouncing_ball_tone5 = "⛹🏿‍♀️"; + constexpr const char[] woman_bouncing_ball_dark_skin_tone = "⛹🏿‍♀️"; + constexpr const char[] man_bouncing_ball = "⛹️‍♂️"; + constexpr const char[] man_bouncing_ball_tone1 = "⛹🏻‍♂️"; + constexpr const char[] man_bouncing_ball_light_skin_tone = "⛹🏻‍♂️"; + constexpr const char[] man_bouncing_ball_tone2 = "⛹🏼‍♂️"; + constexpr const char[] man_bouncing_ball_medium_light_skin_tone = "⛹🏼‍♂️"; + constexpr const char[] man_bouncing_ball_tone3 = "⛹🏽‍♂️"; + constexpr const char[] man_bouncing_ball_medium_skin_tone = "⛹🏽‍♂️"; + constexpr const char[] man_bouncing_ball_tone4 = "⛹🏾‍♂️"; + constexpr const char[] man_bouncing_ball_medium_dark_skin_tone = "⛹🏾‍♂️"; + constexpr const char[] man_bouncing_ball_tone5 = "⛹🏿‍♂️"; + constexpr const char[] man_bouncing_ball_dark_skin_tone = "⛹🏿‍♂️"; + constexpr const char[] person_fencing = "🤺"; + constexpr const char[] fencer = "🤺"; + constexpr const char[] fencing = "🤺"; + constexpr const char[] person_playing_handball = "🤾"; + constexpr const char[] handball = "🤾"; + constexpr const char[] person_playing_handball_tone1 = "🤾🏻"; + constexpr const char[] handball_tone1 = "🤾🏻"; + constexpr const char[] person_playing_handball_tone2 = "🤾🏼"; + constexpr const char[] handball_tone2 = "🤾🏼"; + constexpr const char[] person_playing_handball_tone3 = "🤾🏽"; + constexpr const char[] handball_tone3 = "🤾🏽"; + constexpr const char[] person_playing_handball_tone4 = "🤾🏾"; + constexpr const char[] handball_tone4 = "🤾🏾"; + constexpr const char[] person_playing_handball_tone5 = "🤾🏿"; + constexpr const char[] handball_tone5 = "🤾🏿"; + constexpr const char[] woman_playing_handball = "🤾‍♀️"; + constexpr const char[] woman_playing_handball_tone1 = "🤾🏻‍♀️"; + constexpr const char[] woman_playing_handball_light_skin_tone = "🤾🏻‍♀️"; + constexpr const char[] woman_playing_handball_tone2 = "🤾🏼‍♀️"; + constexpr const char[] woman_playing_handball_medium_light_skin_tone = "🤾🏼‍♀️"; + constexpr const char[] woman_playing_handball_tone3 = "🤾🏽‍♀️"; + constexpr const char[] woman_playing_handball_medium_skin_tone = "🤾🏽‍♀️"; + constexpr const char[] woman_playing_handball_tone4 = "🤾🏾‍♀️"; + constexpr const char[] woman_playing_handball_medium_dark_skin_tone = "🤾🏾‍♀️"; + constexpr const char[] woman_playing_handball_tone5 = "🤾🏿‍♀️"; + constexpr const char[] woman_playing_handball_dark_skin_tone = "🤾🏿‍♀️"; + constexpr const char[] man_playing_handball = "🤾‍♂️"; + constexpr const char[] man_playing_handball_tone1 = "🤾🏻‍♂️"; + constexpr const char[] man_playing_handball_light_skin_tone = "🤾🏻‍♂️"; + constexpr const char[] man_playing_handball_tone2 = "🤾🏼‍♂️"; + constexpr const char[] man_playing_handball_medium_light_skin_tone = "🤾🏼‍♂️"; + constexpr const char[] man_playing_handball_tone3 = "🤾🏽‍♂️"; + constexpr const char[] man_playing_handball_medium_skin_tone = "🤾🏽‍♂️"; + constexpr const char[] man_playing_handball_tone4 = "🤾🏾‍♂️"; + constexpr const char[] man_playing_handball_medium_dark_skin_tone = "🤾🏾‍♂️"; + constexpr const char[] man_playing_handball_tone5 = "🤾🏿‍♂️"; + constexpr const char[] man_playing_handball_dark_skin_tone = "🤾🏿‍♂️"; + constexpr const char[] person_golfing = "🏌️"; + constexpr const char[] golfer = "🏌️"; + constexpr const char[] person_golfing_tone1 = "🏌🏻"; + constexpr const char[] person_golfing_light_skin_tone = "🏌🏻"; + constexpr const char[] person_golfing_tone2 = "🏌🏼"; + constexpr const char[] person_golfing_medium_light_skin_tone = "🏌🏼"; + constexpr const char[] person_golfing_tone3 = "🏌🏽"; + constexpr const char[] person_golfing_medium_skin_tone = "🏌🏽"; + constexpr const char[] person_golfing_tone4 = "🏌🏾"; + constexpr const char[] person_golfing_medium_dark_skin_tone = "🏌🏾"; + constexpr const char[] person_golfing_tone5 = "🏌🏿"; + constexpr const char[] person_golfing_dark_skin_tone = "🏌🏿"; + constexpr const char[] woman_golfing = "🏌️‍♀️"; + constexpr const char[] woman_golfing_tone1 = "🏌🏻‍♀️"; + constexpr const char[] woman_golfing_light_skin_tone = "🏌🏻‍♀️"; + constexpr const char[] woman_golfing_tone2 = "🏌🏼‍♀️"; + constexpr const char[] woman_golfing_medium_light_skin_tone = "🏌🏼‍♀️"; + constexpr const char[] woman_golfing_tone3 = "🏌🏽‍♀️"; + constexpr const char[] woman_golfing_medium_skin_tone = "🏌🏽‍♀️"; + constexpr const char[] woman_golfing_tone4 = "🏌🏾‍♀️"; + constexpr const char[] woman_golfing_medium_dark_skin_tone = "🏌🏾‍♀️"; + constexpr const char[] woman_golfing_tone5 = "🏌🏿‍♀️"; + constexpr const char[] woman_golfing_dark_skin_tone = "🏌🏿‍♀️"; + constexpr const char[] man_golfing = "🏌️‍♂️"; + constexpr const char[] man_golfing_tone1 = "🏌🏻‍♂️"; + constexpr const char[] man_golfing_light_skin_tone = "🏌🏻‍♂️"; + constexpr const char[] man_golfing_tone2 = "🏌🏼‍♂️"; + constexpr const char[] man_golfing_medium_light_skin_tone = "🏌🏼‍♂️"; + constexpr const char[] man_golfing_tone3 = "🏌🏽‍♂️"; + constexpr const char[] man_golfing_medium_skin_tone = "🏌🏽‍♂️"; + constexpr const char[] man_golfing_tone4 = "🏌🏾‍♂️"; + constexpr const char[] man_golfing_medium_dark_skin_tone = "🏌🏾‍♂️"; + constexpr const char[] man_golfing_tone5 = "🏌🏿‍♂️"; + constexpr const char[] man_golfing_dark_skin_tone = "🏌🏿‍♂️"; + constexpr const char[] horse_racing = "🏇"; + constexpr const char[] horse_racing_tone1 = "🏇🏻"; + constexpr const char[] horse_racing_tone2 = "🏇🏼"; + constexpr const char[] horse_racing_tone3 = "🏇🏽"; + constexpr const char[] horse_racing_tone4 = "🏇🏾"; + constexpr const char[] horse_racing_tone5 = "🏇🏿"; + constexpr const char[] person_in_lotus_position = "🧘"; + constexpr const char[] person_in_lotus_position_tone1 = "🧘🏻"; + constexpr const char[] person_in_lotus_position_light_skin_tone = "🧘🏻"; + constexpr const char[] person_in_lotus_position_tone2 = "🧘🏼"; + constexpr const char[] person_in_lotus_position_medium_light_skin_tone = "🧘🏼"; + constexpr const char[] person_in_lotus_position_tone3 = "🧘🏽"; + constexpr const char[] person_in_lotus_position_medium_skin_tone = "🧘🏽"; + constexpr const char[] person_in_lotus_position_tone4 = "🧘🏾"; + constexpr const char[] person_in_lotus_position_medium_dark_skin_tone = "🧘🏾"; + constexpr const char[] person_in_lotus_position_tone5 = "🧘🏿"; + constexpr const char[] person_in_lotus_position_dark_skin_tone = "🧘🏿"; + constexpr const char[] woman_in_lotus_position = "🧘‍♀️"; + constexpr const char[] woman_in_lotus_position_tone1 = "🧘🏻‍♀️"; + constexpr const char[] woman_in_lotus_position_light_skin_tone = "🧘🏻‍♀️"; + constexpr const char[] woman_in_lotus_position_tone2 = "🧘🏼‍♀️"; + constexpr const char[] woman_in_lotus_position_medium_light_skin_tone = "🧘🏼‍♀️"; + constexpr const char[] woman_in_lotus_position_tone3 = "🧘🏽‍♀️"; + constexpr const char[] woman_in_lotus_position_medium_skin_tone = "🧘🏽‍♀️"; + constexpr const char[] woman_in_lotus_position_tone4 = "🧘🏾‍♀️"; + constexpr const char[] woman_in_lotus_position_medium_dark_skin_tone = "🧘🏾‍♀️"; + constexpr const char[] woman_in_lotus_position_tone5 = "🧘🏿‍♀️"; + constexpr const char[] woman_in_lotus_position_dark_skin_tone = "🧘🏿‍♀️"; + constexpr const char[] man_in_lotus_position = "🧘‍♂️"; + constexpr const char[] man_in_lotus_position_tone1 = "🧘🏻‍♂️"; + constexpr const char[] man_in_lotus_position_light_skin_tone = "🧘🏻‍♂️"; + constexpr const char[] man_in_lotus_position_tone2 = "🧘🏼‍♂️"; + constexpr const char[] man_in_lotus_position_medium_light_skin_tone = "🧘🏼‍♂️"; + constexpr const char[] man_in_lotus_position_tone3 = "🧘🏽‍♂️"; + constexpr const char[] man_in_lotus_position_medium_skin_tone = "🧘🏽‍♂️"; + constexpr const char[] man_in_lotus_position_tone4 = "🧘🏾‍♂️"; + constexpr const char[] man_in_lotus_position_medium_dark_skin_tone = "🧘🏾‍♂️"; + constexpr const char[] man_in_lotus_position_tone5 = "🧘🏿‍♂️"; + constexpr const char[] man_in_lotus_position_dark_skin_tone = "🧘🏿‍♂️"; + constexpr const char[] person_surfing = "🏄"; + constexpr const char[] surfer = "🏄"; + constexpr const char[] person_surfing_tone1 = "🏄🏻"; + constexpr const char[] surfer_tone1 = "🏄🏻"; + constexpr const char[] person_surfing_tone2 = "🏄🏼"; + constexpr const char[] surfer_tone2 = "🏄🏼"; + constexpr const char[] person_surfing_tone3 = "🏄🏽"; + constexpr const char[] surfer_tone3 = "🏄🏽"; + constexpr const char[] person_surfing_tone4 = "🏄🏾"; + constexpr const char[] surfer_tone4 = "🏄🏾"; + constexpr const char[] person_surfing_tone5 = "🏄🏿"; + constexpr const char[] surfer_tone5 = "🏄🏿"; + constexpr const char[] woman_surfing = "🏄‍♀️"; + constexpr const char[] woman_surfing_tone1 = "🏄🏻‍♀️"; + constexpr const char[] woman_surfing_light_skin_tone = "🏄🏻‍♀️"; + constexpr const char[] woman_surfing_tone2 = "🏄🏼‍♀️"; + constexpr const char[] woman_surfing_medium_light_skin_tone = "🏄🏼‍♀️"; + constexpr const char[] woman_surfing_tone3 = "🏄🏽‍♀️"; + constexpr const char[] woman_surfing_medium_skin_tone = "🏄🏽‍♀️"; + constexpr const char[] woman_surfing_tone4 = "🏄🏾‍♀️"; + constexpr const char[] woman_surfing_medium_dark_skin_tone = "🏄🏾‍♀️"; + constexpr const char[] woman_surfing_tone5 = "🏄🏿‍♀️"; + constexpr const char[] woman_surfing_dark_skin_tone = "🏄🏿‍♀️"; + constexpr const char[] man_surfing = "🏄‍♂️"; + constexpr const char[] man_surfing_tone1 = "🏄🏻‍♂️"; + constexpr const char[] man_surfing_light_skin_tone = "🏄🏻‍♂️"; + constexpr const char[] man_surfing_tone2 = "🏄🏼‍♂️"; + constexpr const char[] man_surfing_medium_light_skin_tone = "🏄🏼‍♂️"; + constexpr const char[] man_surfing_tone3 = "🏄🏽‍♂️"; + constexpr const char[] man_surfing_medium_skin_tone = "🏄🏽‍♂️"; + constexpr const char[] man_surfing_tone4 = "🏄🏾‍♂️"; + constexpr const char[] man_surfing_medium_dark_skin_tone = "🏄🏾‍♂️"; + constexpr const char[] man_surfing_tone5 = "🏄🏿‍♂️"; + constexpr const char[] man_surfing_dark_skin_tone = "🏄🏿‍♂️"; + constexpr const char[] person_swimming = "🏊"; + constexpr const char[] swimmer = "🏊"; + constexpr const char[] person_swimming_tone1 = "🏊🏻"; + constexpr const char[] swimmer_tone1 = "🏊🏻"; + constexpr const char[] person_swimming_tone2 = "🏊🏼"; + constexpr const char[] swimmer_tone2 = "🏊🏼"; + constexpr const char[] person_swimming_tone3 = "🏊🏽"; + constexpr const char[] swimmer_tone3 = "🏊🏽"; + constexpr const char[] person_swimming_tone4 = "🏊🏾"; + constexpr const char[] swimmer_tone4 = "🏊🏾"; + constexpr const char[] person_swimming_tone5 = "🏊🏿"; + constexpr const char[] swimmer_tone5 = "🏊🏿"; + constexpr const char[] woman_swimming = "🏊‍♀️"; + constexpr const char[] woman_swimming_tone1 = "🏊🏻‍♀️"; + constexpr const char[] woman_swimming_light_skin_tone = "🏊🏻‍♀️"; + constexpr const char[] woman_swimming_tone2 = "🏊🏼‍♀️"; + constexpr const char[] woman_swimming_medium_light_skin_tone = "🏊🏼‍♀️"; + constexpr const char[] woman_swimming_tone3 = "🏊🏽‍♀️"; + constexpr const char[] woman_swimming_medium_skin_tone = "🏊🏽‍♀️"; + constexpr const char[] woman_swimming_tone4 = "🏊🏾‍♀️"; + constexpr const char[] woman_swimming_medium_dark_skin_tone = "🏊🏾‍♀️"; + constexpr const char[] woman_swimming_tone5 = "🏊🏿‍♀️"; + constexpr const char[] woman_swimming_dark_skin_tone = "🏊🏿‍♀️"; + constexpr const char[] man_swimming = "🏊‍♂️"; + constexpr const char[] man_swimming_tone1 = "🏊🏻‍♂️"; + constexpr const char[] man_swimming_light_skin_tone = "🏊🏻‍♂️"; + constexpr const char[] man_swimming_tone2 = "🏊🏼‍♂️"; + constexpr const char[] man_swimming_medium_light_skin_tone = "🏊🏼‍♂️"; + constexpr const char[] man_swimming_tone3 = "🏊🏽‍♂️"; + constexpr const char[] man_swimming_medium_skin_tone = "🏊🏽‍♂️"; + constexpr const char[] man_swimming_tone4 = "🏊🏾‍♂️"; + constexpr const char[] man_swimming_medium_dark_skin_tone = "🏊🏾‍♂️"; + constexpr const char[] man_swimming_tone5 = "🏊🏿‍♂️"; + constexpr const char[] man_swimming_dark_skin_tone = "🏊🏿‍♂️"; + constexpr const char[] person_playing_water_polo = "🤽"; + constexpr const char[] water_polo = "🤽"; + constexpr const char[] person_playing_water_polo_tone1 = "🤽🏻"; + constexpr const char[] water_polo_tone1 = "🤽🏻"; + constexpr const char[] person_playing_water_polo_tone2 = "🤽🏼"; + constexpr const char[] water_polo_tone2 = "🤽🏼"; + constexpr const char[] person_playing_water_polo_tone3 = "🤽🏽"; + constexpr const char[] water_polo_tone3 = "🤽🏽"; + constexpr const char[] person_playing_water_polo_tone4 = "🤽🏾"; + constexpr const char[] water_polo_tone4 = "🤽🏾"; + constexpr const char[] person_playing_water_polo_tone5 = "🤽🏿"; + constexpr const char[] water_polo_tone5 = "🤽🏿"; + constexpr const char[] woman_playing_water_polo = "🤽‍♀️"; + constexpr const char[] woman_playing_water_polo_tone1 = "🤽🏻‍♀️"; + constexpr const char[] woman_playing_water_polo_light_skin_tone = "🤽🏻‍♀️"; + constexpr const char[] woman_playing_water_polo_tone2 = "🤽🏼‍♀️"; + constexpr const char[] woman_playing_water_polo_medium_light_skin_tone = "🤽🏼‍♀️"; + constexpr const char[] woman_playing_water_polo_tone3 = "🤽🏽‍♀️"; + constexpr const char[] woman_playing_water_polo_medium_skin_tone = "🤽🏽‍♀️"; + constexpr const char[] woman_playing_water_polo_tone4 = "🤽🏾‍♀️"; + constexpr const char[] woman_playing_water_polo_medium_dark_skin_tone = "🤽🏾‍♀️"; + constexpr const char[] woman_playing_water_polo_tone5 = "🤽🏿‍♀️"; + constexpr const char[] woman_playing_water_polo_dark_skin_tone = "🤽🏿‍♀️"; + constexpr const char[] man_playing_water_polo = "🤽‍♂️"; + constexpr const char[] man_playing_water_polo_tone1 = "🤽🏻‍♂️"; + constexpr const char[] man_playing_water_polo_light_skin_tone = "🤽🏻‍♂️"; + constexpr const char[] man_playing_water_polo_tone2 = "🤽🏼‍♂️"; + constexpr const char[] man_playing_water_polo_medium_light_skin_tone = "🤽🏼‍♂️"; + constexpr const char[] man_playing_water_polo_tone3 = "🤽🏽‍♂️"; + constexpr const char[] man_playing_water_polo_medium_skin_tone = "🤽🏽‍♂️"; + constexpr const char[] man_playing_water_polo_tone4 = "🤽🏾‍♂️"; + constexpr const char[] man_playing_water_polo_medium_dark_skin_tone = "🤽🏾‍♂️"; + constexpr const char[] man_playing_water_polo_tone5 = "🤽🏿‍♂️"; + constexpr const char[] man_playing_water_polo_dark_skin_tone = "🤽🏿‍♂️"; + constexpr const char[] person_rowing_boat = "🚣"; + constexpr const char[] rowboat = "🚣"; + constexpr const char[] person_rowing_boat_tone1 = "🚣🏻"; + constexpr const char[] rowboat_tone1 = "🚣🏻"; + constexpr const char[] person_rowing_boat_tone2 = "🚣🏼"; + constexpr const char[] rowboat_tone2 = "🚣🏼"; + constexpr const char[] person_rowing_boat_tone3 = "🚣🏽"; + constexpr const char[] rowboat_tone3 = "🚣🏽"; + constexpr const char[] person_rowing_boat_tone4 = "🚣🏾"; + constexpr const char[] rowboat_tone4 = "🚣🏾"; + constexpr const char[] person_rowing_boat_tone5 = "🚣🏿"; + constexpr const char[] rowboat_tone5 = "🚣🏿"; + constexpr const char[] woman_rowing_boat = "🚣‍♀️"; + constexpr const char[] woman_rowing_boat_tone1 = "🚣🏻‍♀️"; + constexpr const char[] woman_rowing_boat_light_skin_tone = "🚣🏻‍♀️"; + constexpr const char[] woman_rowing_boat_tone2 = "🚣🏼‍♀️"; + constexpr const char[] woman_rowing_boat_medium_light_skin_tone = "🚣🏼‍♀️"; + constexpr const char[] woman_rowing_boat_tone3 = "🚣🏽‍♀️"; + constexpr const char[] woman_rowing_boat_medium_skin_tone = "🚣🏽‍♀️"; + constexpr const char[] woman_rowing_boat_tone4 = "🚣🏾‍♀️"; + constexpr const char[] woman_rowing_boat_medium_dark_skin_tone = "🚣🏾‍♀️"; + constexpr const char[] woman_rowing_boat_tone5 = "🚣🏿‍♀️"; + constexpr const char[] woman_rowing_boat_dark_skin_tone = "🚣🏿‍♀️"; + constexpr const char[] man_rowing_boat = "🚣‍♂️"; + constexpr const char[] man_rowing_boat_tone1 = "🚣🏻‍♂️"; + constexpr const char[] man_rowing_boat_light_skin_tone = "🚣🏻‍♂️"; + constexpr const char[] man_rowing_boat_tone2 = "🚣🏼‍♂️"; + constexpr const char[] man_rowing_boat_medium_light_skin_tone = "🚣🏼‍♂️"; + constexpr const char[] man_rowing_boat_tone3 = "🚣🏽‍♂️"; + constexpr const char[] man_rowing_boat_medium_skin_tone = "🚣🏽‍♂️"; + constexpr const char[] man_rowing_boat_tone4 = "🚣🏾‍♂️"; + constexpr const char[] man_rowing_boat_medium_dark_skin_tone = "🚣🏾‍♂️"; + constexpr const char[] man_rowing_boat_tone5 = "🚣🏿‍♂️"; + constexpr const char[] man_rowing_boat_dark_skin_tone = "🚣🏿‍♂️"; + constexpr const char[] person_climbing = "🧗"; + constexpr const char[] person_climbing_tone1 = "🧗🏻"; + constexpr const char[] person_climbing_light_skin_tone = "🧗🏻"; + constexpr const char[] person_climbing_tone2 = "🧗🏼"; + constexpr const char[] person_climbing_medium_light_skin_tone = "🧗🏼"; + constexpr const char[] person_climbing_tone3 = "🧗🏽"; + constexpr const char[] person_climbing_medium_skin_tone = "🧗🏽"; + constexpr const char[] person_climbing_tone4 = "🧗🏾"; + constexpr const char[] person_climbing_medium_dark_skin_tone = "🧗🏾"; + constexpr const char[] person_climbing_tone5 = "🧗🏿"; + constexpr const char[] person_climbing_dark_skin_tone = "🧗🏿"; + constexpr const char[] woman_climbing = "🧗‍♀️"; + constexpr const char[] woman_climbing_tone1 = "🧗🏻‍♀️"; + constexpr const char[] woman_climbing_light_skin_tone = "🧗🏻‍♀️"; + constexpr const char[] woman_climbing_tone2 = "🧗🏼‍♀️"; + constexpr const char[] woman_climbing_medium_light_skin_tone = "🧗🏼‍♀️"; + constexpr const char[] woman_climbing_tone3 = "🧗🏽‍♀️"; + constexpr const char[] woman_climbing_medium_skin_tone = "🧗🏽‍♀️"; + constexpr const char[] woman_climbing_tone4 = "🧗🏾‍♀️"; + constexpr const char[] woman_climbing_medium_dark_skin_tone = "🧗🏾‍♀️"; + constexpr const char[] woman_climbing_tone5 = "🧗🏿‍♀️"; + constexpr const char[] woman_climbing_dark_skin_tone = "🧗🏿‍♀️"; + constexpr const char[] man_climbing = "🧗‍♂️"; + constexpr const char[] man_climbing_tone1 = "🧗🏻‍♂️"; + constexpr const char[] man_climbing_light_skin_tone = "🧗🏻‍♂️"; + constexpr const char[] man_climbing_tone2 = "🧗🏼‍♂️"; + constexpr const char[] man_climbing_medium_light_skin_tone = "🧗🏼‍♂️"; + constexpr const char[] man_climbing_tone3 = "🧗🏽‍♂️"; + constexpr const char[] man_climbing_medium_skin_tone = "🧗🏽‍♂️"; + constexpr const char[] man_climbing_tone4 = "🧗🏾‍♂️"; + constexpr const char[] man_climbing_medium_dark_skin_tone = "🧗🏾‍♂️"; + constexpr const char[] man_climbing_tone5 = "🧗🏿‍♂️"; + constexpr const char[] man_climbing_dark_skin_tone = "🧗🏿‍♂️"; + constexpr const char[] person_mountain_biking = "🚵"; + constexpr const char[] mountain_bicyclist = "🚵"; + constexpr const char[] person_mountain_biking_tone1 = "🚵🏻"; + constexpr const char[] mountain_bicyclist_tone1 = "🚵🏻"; + constexpr const char[] person_mountain_biking_tone2 = "🚵🏼"; + constexpr const char[] mountain_bicyclist_tone2 = "🚵🏼"; + constexpr const char[] person_mountain_biking_tone3 = "🚵🏽"; + constexpr const char[] mountain_bicyclist_tone3 = "🚵🏽"; + constexpr const char[] person_mountain_biking_tone4 = "🚵🏾"; + constexpr const char[] mountain_bicyclist_tone4 = "🚵🏾"; + constexpr const char[] person_mountain_biking_tone5 = "🚵🏿"; + constexpr const char[] mountain_bicyclist_tone5 = "🚵🏿"; + constexpr const char[] woman_mountain_biking = "🚵‍♀️"; + constexpr const char[] woman_mountain_biking_tone1 = "🚵🏻‍♀️"; + constexpr const char[] woman_mountain_biking_light_skin_tone = "🚵🏻‍♀️"; + constexpr const char[] woman_mountain_biking_tone2 = "🚵🏼‍♀️"; + constexpr const char[] woman_mountain_biking_medium_light_skin_tone = "🚵🏼‍♀️"; + constexpr const char[] woman_mountain_biking_tone3 = "🚵🏽‍♀️"; + constexpr const char[] woman_mountain_biking_medium_skin_tone = "🚵🏽‍♀️"; + constexpr const char[] woman_mountain_biking_tone4 = "🚵🏾‍♀️"; + constexpr const char[] woman_mountain_biking_medium_dark_skin_tone = "🚵🏾‍♀️"; + constexpr const char[] woman_mountain_biking_tone5 = "🚵🏿‍♀️"; + constexpr const char[] woman_mountain_biking_dark_skin_tone = "🚵🏿‍♀️"; + constexpr const char[] man_mountain_biking = "🚵‍♂️"; + constexpr const char[] man_mountain_biking_tone1 = "🚵🏻‍♂️"; + constexpr const char[] man_mountain_biking_light_skin_tone = "🚵🏻‍♂️"; + constexpr const char[] man_mountain_biking_tone2 = "🚵🏼‍♂️"; + constexpr const char[] man_mountain_biking_medium_light_skin_tone = "🚵🏼‍♂️"; + constexpr const char[] man_mountain_biking_tone3 = "🚵🏽‍♂️"; + constexpr const char[] man_mountain_biking_medium_skin_tone = "🚵🏽‍♂️"; + constexpr const char[] man_mountain_biking_tone4 = "🚵🏾‍♂️"; + constexpr const char[] man_mountain_biking_medium_dark_skin_tone = "🚵🏾‍♂️"; + constexpr const char[] man_mountain_biking_tone5 = "🚵🏿‍♂️"; + constexpr const char[] man_mountain_biking_dark_skin_tone = "🚵🏿‍♂️"; + constexpr const char[] person_biking = "🚴"; + constexpr const char[] bicyclist = "🚴"; + constexpr const char[] person_biking_tone1 = "🚴🏻"; + constexpr const char[] bicyclist_tone1 = "🚴🏻"; + constexpr const char[] person_biking_tone2 = "🚴🏼"; + constexpr const char[] bicyclist_tone2 = "🚴🏼"; + constexpr const char[] person_biking_tone3 = "🚴🏽"; + constexpr const char[] bicyclist_tone3 = "🚴🏽"; + constexpr const char[] person_biking_tone4 = "🚴🏾"; + constexpr const char[] bicyclist_tone4 = "🚴🏾"; + constexpr const char[] person_biking_tone5 = "🚴🏿"; + constexpr const char[] bicyclist_tone5 = "🚴🏿"; + constexpr const char[] woman_biking = "🚴‍♀️"; + constexpr const char[] woman_biking_tone1 = "🚴🏻‍♀️"; + constexpr const char[] woman_biking_light_skin_tone = "🚴🏻‍♀️"; + constexpr const char[] woman_biking_tone2 = "🚴🏼‍♀️"; + constexpr const char[] woman_biking_medium_light_skin_tone = "🚴🏼‍♀️"; + constexpr const char[] woman_biking_tone3 = "🚴🏽‍♀️"; + constexpr const char[] woman_biking_medium_skin_tone = "🚴🏽‍♀️"; + constexpr const char[] woman_biking_tone4 = "🚴🏾‍♀️"; + constexpr const char[] woman_biking_medium_dark_skin_tone = "🚴🏾‍♀️"; + constexpr const char[] woman_biking_tone5 = "🚴🏿‍♀️"; + constexpr const char[] woman_biking_dark_skin_tone = "🚴🏿‍♀️"; + constexpr const char[] man_biking = "🚴‍♂️"; + constexpr const char[] man_biking_tone1 = "🚴🏻‍♂️"; + constexpr const char[] man_biking_light_skin_tone = "🚴🏻‍♂️"; + constexpr const char[] man_biking_tone2 = "🚴🏼‍♂️"; + constexpr const char[] man_biking_medium_light_skin_tone = "🚴🏼‍♂️"; + constexpr const char[] man_biking_tone3 = "🚴🏽‍♂️"; + constexpr const char[] man_biking_medium_skin_tone = "🚴🏽‍♂️"; + constexpr const char[] man_biking_tone4 = "🚴🏾‍♂️"; + constexpr const char[] man_biking_medium_dark_skin_tone = "🚴🏾‍♂️"; + constexpr const char[] man_biking_tone5 = "🚴🏿‍♂️"; + constexpr const char[] man_biking_dark_skin_tone = "🚴🏿‍♂️"; + constexpr const char[] trophy = "🏆"; + constexpr const char[] first_place = "🥇"; + constexpr const char[] first_place_medal = "🥇"; + constexpr const char[] second_place = "🥈"; + constexpr const char[] second_place_medal = "🥈"; + constexpr const char[] third_place = "🥉"; + constexpr const char[] third_place_medal = "🥉"; + constexpr const char[] medal = "🏅"; + constexpr const char[] sports_medal = "🏅"; + constexpr const char[] military_medal = "🎖️"; + constexpr const char[] rosette = "🏵️"; + constexpr const char[] reminder_ribbon = "🎗️"; + constexpr const char[] ticket = "🎫"; + constexpr const char[] tickets = "🎟️"; + constexpr const char[] admission_tickets = "🎟️"; + constexpr const char[] circus_tent = "🎪"; + constexpr const char[] person_juggling = "🤹"; + constexpr const char[] juggling = "🤹"; + constexpr const char[] juggler = "🤹"; + constexpr const char[] person_juggling_tone1 = "🤹🏻"; + constexpr const char[] juggling_tone1 = "🤹🏻"; + constexpr const char[] juggler_tone1 = "🤹🏻"; + constexpr const char[] person_juggling_tone2 = "🤹🏼"; + constexpr const char[] juggling_tone2 = "🤹🏼"; + constexpr const char[] juggler_tone2 = "🤹🏼"; + constexpr const char[] person_juggling_tone3 = "🤹🏽"; + constexpr const char[] juggling_tone3 = "🤹🏽"; + constexpr const char[] juggler_tone3 = "🤹🏽"; + constexpr const char[] person_juggling_tone4 = "🤹🏾"; + constexpr const char[] juggling_tone4 = "🤹🏾"; + constexpr const char[] juggler_tone4 = "🤹🏾"; + constexpr const char[] person_juggling_tone5 = "🤹🏿"; + constexpr const char[] juggling_tone5 = "🤹🏿"; + constexpr const char[] juggler_tone5 = "🤹🏿"; + constexpr const char[] woman_juggling = "🤹‍♀️"; + constexpr const char[] woman_juggling_tone1 = "🤹🏻‍♀️"; + constexpr const char[] woman_juggling_light_skin_tone = "🤹🏻‍♀️"; + constexpr const char[] woman_juggling_tone2 = "🤹🏼‍♀️"; + constexpr const char[] woman_juggling_medium_light_skin_tone = "🤹🏼‍♀️"; + constexpr const char[] woman_juggling_tone3 = "🤹🏽‍♀️"; + constexpr const char[] woman_juggling_medium_skin_tone = "🤹🏽‍♀️"; + constexpr const char[] woman_juggling_tone4 = "🤹🏾‍♀️"; + constexpr const char[] woman_juggling_medium_dark_skin_tone = "🤹🏾‍♀️"; + constexpr const char[] woman_juggling_tone5 = "🤹🏿‍♀️"; + constexpr const char[] woman_juggling_dark_skin_tone = "🤹🏿‍♀️"; + constexpr const char[] man_juggling = "🤹‍♂️"; + constexpr const char[] man_juggling_tone1 = "🤹🏻‍♂️"; + constexpr const char[] man_juggling_light_skin_tone = "🤹🏻‍♂️"; + constexpr const char[] man_juggling_tone2 = "🤹🏼‍♂️"; + constexpr const char[] man_juggling_medium_light_skin_tone = "🤹🏼‍♂️"; + constexpr const char[] man_juggling_tone3 = "🤹🏽‍♂️"; + constexpr const char[] man_juggling_medium_skin_tone = "🤹🏽‍♂️"; + constexpr const char[] man_juggling_tone4 = "🤹🏾‍♂️"; + constexpr const char[] man_juggling_medium_dark_skin_tone = "🤹🏾‍♂️"; + constexpr const char[] man_juggling_tone5 = "🤹🏿‍♂️"; + constexpr const char[] man_juggling_dark_skin_tone = "🤹🏿‍♂️"; + constexpr const char[] performing_arts = "🎭"; + constexpr const char[] ballet_shoes = "🩰"; + constexpr const char[] art = "🎨"; + constexpr const char[] clapper = "🎬"; + constexpr const char[] microphone = "🎤"; + constexpr const char[] headphones = "🎧"; + constexpr const char[] musical_score = "🎼"; + constexpr const char[] musical_keyboard = "🎹"; + constexpr const char[] drum = "🥁"; + constexpr const char[] drum_with_drumsticks = "🥁"; + constexpr const char[] long_drum = "🪘"; + constexpr const char[] saxophone = "🎷"; + constexpr const char[] trumpet = "🎺"; + constexpr const char[] accordion = "🪗"; + constexpr const char[] guitar = "🎸"; + constexpr const char[] banjo = "🪕"; + constexpr const char[] violin = "🎻"; + constexpr const char[] game_die = "🎲"; + constexpr const char[] chess_pawn = "♟️"; + constexpr const char[] dart = "🎯"; + constexpr const char[] bowling = "🎳"; + constexpr const char[] video_game = "🎮"; + constexpr const char[] slot_machine = "🎰"; + constexpr const char[] jigsaw = "🧩"; + constexpr const char[] flag_white = "🏳️"; + constexpr const char[] flag_black = "🏴"; + constexpr const char[] checkered_flag = "🏁"; + constexpr const char[] triangular_flag_on_post = "🚩"; + constexpr const char[] rainbow_flag = "🏳️‍🌈"; + constexpr const char[] gay_pride_flag = "🏳️‍🌈"; + constexpr const char[] transgender_flag = "🏳️‍⚧️"; + constexpr const char[] pirate_flag = "🏴‍☠️"; + constexpr const char[] flag_af = "🇦🇫"; + constexpr const char[] flag_ax = "🇦🇽"; + constexpr const char[] flag_al = "🇦🇱"; + constexpr const char[] flag_dz = "🇩🇿"; + constexpr const char[] flag_as = "🇦🇸"; + constexpr const char[] flag_ad = "🇦🇩"; + constexpr const char[] flag_ao = "🇦🇴"; + constexpr const char[] flag_ai = "🇦🇮"; + constexpr const char[] flag_aq = "🇦🇶"; + constexpr const char[] flag_ag = "🇦🇬"; + constexpr const char[] flag_ar = "🇦🇷"; + constexpr const char[] flag_am = "🇦🇲"; + constexpr const char[] flag_aw = "🇦🇼"; + constexpr const char[] flag_au = "🇦🇺"; + constexpr const char[] flag_at = "🇦🇹"; + constexpr const char[] flag_az = "🇦🇿"; + constexpr const char[] flag_bs = "🇧🇸"; + constexpr const char[] flag_bh = "🇧🇭"; + constexpr const char[] flag_bd = "🇧🇩"; + constexpr const char[] flag_bb = "🇧🇧"; + constexpr const char[] flag_by = "🇧🇾"; + constexpr const char[] flag_be = "🇧🇪"; + constexpr const char[] flag_bz = "🇧🇿"; + constexpr const char[] flag_bj = "🇧🇯"; + constexpr const char[] flag_bm = "🇧🇲"; + constexpr const char[] flag_bt = "🇧🇹"; + constexpr const char[] flag_bo = "🇧🇴"; + constexpr const char[] flag_ba = "🇧🇦"; + constexpr const char[] flag_bw = "🇧🇼"; + constexpr const char[] flag_br = "🇧🇷"; + constexpr const char[] flag_io = "🇮🇴"; + constexpr const char[] flag_vg = "🇻🇬"; + constexpr const char[] flag_bn = "🇧🇳"; + constexpr const char[] flag_bg = "🇧🇬"; + constexpr const char[] flag_bf = "🇧🇫"; + constexpr const char[] flag_bi = "🇧🇮"; + constexpr const char[] flag_kh = "🇰🇭"; + constexpr const char[] flag_cm = "🇨🇲"; + constexpr const char[] flag_ca = "🇨🇦"; + constexpr const char[] flag_ic = "🇮🇨"; + constexpr const char[] flag_cv = "🇨🇻"; + constexpr const char[] flag_bq = "🇧🇶"; + constexpr const char[] flag_ky = "🇰🇾"; + constexpr const char[] flag_cf = "🇨🇫"; + constexpr const char[] flag_td = "🇹🇩"; + constexpr const char[] flag_cl = "🇨🇱"; + constexpr const char[] flag_cn = "🇨🇳"; + constexpr const char[] flag_cx = "🇨🇽"; + constexpr const char[] flag_cc = "🇨🇨"; + constexpr const char[] flag_co = "🇨🇴"; + constexpr const char[] flag_km = "🇰🇲"; + constexpr const char[] flag_cg = "🇨🇬"; + constexpr const char[] flag_cd = "🇨🇩"; + constexpr const char[] flag_ck = "🇨🇰"; + constexpr const char[] flag_cr = "🇨🇷"; + constexpr const char[] flag_ci = "🇨🇮"; + constexpr const char[] flag_hr = "🇭🇷"; + constexpr const char[] flag_cu = "🇨🇺"; + constexpr const char[] flag_cw = "🇨🇼"; + constexpr const char[] flag_cy = "🇨🇾"; + constexpr const char[] flag_cz = "🇨🇿"; + constexpr const char[] flag_dk = "🇩🇰"; + constexpr const char[] flag_dj = "🇩🇯"; + constexpr const char[] flag_dm = "🇩🇲"; + constexpr const char[] flag_do = "🇩🇴"; + constexpr const char[] flag_ec = "🇪🇨"; + constexpr const char[] flag_eg = "🇪🇬"; + constexpr const char[] flag_sv = "🇸🇻"; + constexpr const char[] flag_gq = "🇬🇶"; + constexpr const char[] flag_er = "🇪🇷"; + constexpr const char[] flag_ee = "🇪🇪"; + constexpr const char[] flag_et = "🇪🇹"; + constexpr const char[] flag_eu = "🇪🇺"; + constexpr const char[] flag_fk = "🇫🇰"; + constexpr const char[] flag_fo = "🇫🇴"; + constexpr const char[] flag_fj = "🇫🇯"; + constexpr const char[] flag_fi = "🇫🇮"; + constexpr const char[] flag_fr = "🇫🇷"; + constexpr const char[] flag_gf = "🇬🇫"; + constexpr const char[] flag_pf = "🇵🇫"; + constexpr const char[] flag_tf = "🇹🇫"; + constexpr const char[] flag_ga = "🇬🇦"; + constexpr const char[] flag_gm = "🇬🇲"; + constexpr const char[] flag_ge = "🇬🇪"; + constexpr const char[] flag_de = "🇩🇪"; + constexpr const char[] flag_gh = "🇬🇭"; + constexpr const char[] flag_gi = "🇬🇮"; + constexpr const char[] flag_gr = "🇬🇷"; + constexpr const char[] flag_gl = "🇬🇱"; + constexpr const char[] flag_gd = "🇬🇩"; + constexpr const char[] flag_gp = "🇬🇵"; + constexpr const char[] flag_gu = "🇬🇺"; + constexpr const char[] flag_gt = "🇬🇹"; + constexpr const char[] flag_gg = "🇬🇬"; + constexpr const char[] flag_gn = "🇬🇳"; + constexpr const char[] flag_gw = "🇬🇼"; + constexpr const char[] flag_gy = "🇬🇾"; + constexpr const char[] flag_ht = "🇭🇹"; + constexpr const char[] flag_hn = "🇭🇳"; + constexpr const char[] flag_hk = "🇭🇰"; + constexpr const char[] flag_hu = "🇭🇺"; + constexpr const char[] flag_is = "🇮🇸"; + constexpr const char[] flag_in = "🇮🇳"; + constexpr const char[] flag_id = "🇮🇩"; + constexpr const char[] flag_ir = "🇮🇷"; + constexpr const char[] flag_iq = "🇮🇶"; + constexpr const char[] flag_ie = "🇮🇪"; + constexpr const char[] flag_im = "🇮🇲"; + constexpr const char[] flag_il = "🇮🇱"; + constexpr const char[] flag_it = "🇮🇹"; + constexpr const char[] flag_jm = "🇯🇲"; + constexpr const char[] flag_jp = "🇯🇵"; + constexpr const char[] crossed_flags = "🎌"; + constexpr const char[] flag_je = "🇯🇪"; + constexpr const char[] flag_jo = "🇯🇴"; + constexpr const char[] flag_kz = "🇰🇿"; + constexpr const char[] flag_ke = "🇰🇪"; + constexpr const char[] flag_ki = "🇰🇮"; + constexpr const char[] flag_xk = "🇽🇰"; + constexpr const char[] flag_kw = "🇰🇼"; + constexpr const char[] flag_kg = "🇰🇬"; + constexpr const char[] flag_la = "🇱🇦"; + constexpr const char[] flag_lv = "🇱🇻"; + constexpr const char[] flag_lb = "🇱🇧"; + constexpr const char[] flag_ls = "🇱🇸"; + constexpr const char[] flag_lr = "🇱🇷"; + constexpr const char[] flag_ly = "🇱🇾"; + constexpr const char[] flag_li = "🇱🇮"; + constexpr const char[] flag_lt = "🇱🇹"; + constexpr const char[] flag_lu = "🇱🇺"; + constexpr const char[] flag_mo = "🇲🇴"; + constexpr const char[] flag_mk = "🇲🇰"; + constexpr const char[] flag_mg = "🇲🇬"; + constexpr const char[] flag_mw = "🇲🇼"; + constexpr const char[] flag_my = "🇲🇾"; + constexpr const char[] flag_mv = "🇲🇻"; + constexpr const char[] flag_ml = "🇲🇱"; + constexpr const char[] flag_mt = "🇲🇹"; + constexpr const char[] flag_mh = "🇲🇭"; + constexpr const char[] flag_mq = "🇲🇶"; + constexpr const char[] flag_mr = "🇲🇷"; + constexpr const char[] flag_mu = "🇲🇺"; + constexpr const char[] flag_yt = "🇾🇹"; + constexpr const char[] flag_mx = "🇲🇽"; + constexpr const char[] flag_fm = "🇫🇲"; + constexpr const char[] flag_md = "🇲🇩"; + constexpr const char[] flag_mc = "🇲🇨"; + constexpr const char[] flag_mn = "🇲🇳"; + constexpr const char[] flag_me = "🇲🇪"; + constexpr const char[] flag_ms = "🇲🇸"; + constexpr const char[] flag_ma = "🇲🇦"; + constexpr const char[] flag_mz = "🇲🇿"; + constexpr const char[] flag_mm = "🇲🇲"; + constexpr const char[] flag_na = "🇳🇦"; + constexpr const char[] flag_nr = "🇳🇷"; + constexpr const char[] flag_np = "🇳🇵"; + constexpr const char[] flag_nl = "🇳🇱"; + constexpr const char[] flag_nc = "🇳🇨"; + constexpr const char[] flag_nz = "🇳🇿"; + constexpr const char[] flag_ni = "🇳🇮"; + constexpr const char[] flag_ne = "🇳🇪"; + constexpr const char[] flag_ng = "🇳🇬"; + constexpr const char[] flag_nu = "🇳🇺"; + constexpr const char[] flag_nf = "🇳🇫"; + constexpr const char[] flag_kp = "🇰🇵"; + constexpr const char[] flag_mp = "🇲🇵"; + constexpr const char[] flag_no = "🇳🇴"; + constexpr const char[] flag_om = "🇴🇲"; + constexpr const char[] flag_pk = "🇵🇰"; + constexpr const char[] flag_pw = "🇵🇼"; + constexpr const char[] flag_ps = "🇵🇸"; + constexpr const char[] flag_pa = "🇵🇦"; + constexpr const char[] flag_pg = "🇵🇬"; + constexpr const char[] flag_py = "🇵🇾"; + constexpr const char[] flag_pe = "🇵🇪"; + constexpr const char[] flag_ph = "🇵🇭"; + constexpr const char[] flag_pn = "🇵🇳"; + constexpr const char[] flag_pl = "🇵🇱"; + constexpr const char[] flag_pt = "🇵🇹"; + constexpr const char[] flag_pr = "🇵🇷"; + constexpr const char[] flag_qa = "🇶🇦"; + constexpr const char[] flag_re = "🇷🇪"; + constexpr const char[] flag_ro = "🇷🇴"; + constexpr const char[] flag_ru = "🇷🇺"; + constexpr const char[] flag_rw = "🇷🇼"; + constexpr const char[] flag_ws = "🇼🇸"; + constexpr const char[] flag_sm = "🇸🇲"; + constexpr const char[] flag_st = "🇸🇹"; + constexpr const char[] flag_sa = "🇸🇦"; + constexpr const char[] flag_sn = "🇸🇳"; + constexpr const char[] flag_rs = "🇷🇸"; + constexpr const char[] flag_sc = "🇸🇨"; + constexpr const char[] flag_sl = "🇸🇱"; + constexpr const char[] flag_sg = "🇸🇬"; + constexpr const char[] flag_sx = "🇸🇽"; + constexpr const char[] flag_sk = "🇸🇰"; + constexpr const char[] flag_si = "🇸🇮"; + constexpr const char[] flag_gs = "🇬🇸"; + constexpr const char[] flag_sb = "🇸🇧"; + constexpr const char[] flag_so = "🇸🇴"; + constexpr const char[] flag_za = "🇿🇦"; + constexpr const char[] flag_kr = "🇰🇷"; + constexpr const char[] flag_ss = "🇸🇸"; + constexpr const char[] flag_es = "🇪🇸"; + constexpr const char[] flag_lk = "🇱🇰"; + constexpr const char[] flag_bl = "🇧🇱"; + constexpr const char[] flag_sh = "🇸🇭"; + constexpr const char[] flag_kn = "🇰🇳"; + constexpr const char[] flag_lc = "🇱🇨"; + constexpr const char[] flag_pm = "🇵🇲"; + constexpr const char[] flag_vc = "🇻🇨"; + constexpr const char[] flag_sd = "🇸🇩"; + constexpr const char[] flag_sr = "🇸🇷"; + constexpr const char[] flag_sz = "🇸🇿"; + constexpr const char[] flag_se = "🇸🇪"; + constexpr const char[] flag_ch = "🇨🇭"; + constexpr const char[] flag_sy = "🇸🇾"; + constexpr const char[] flag_tw = "🇹🇼"; + constexpr const char[] flag_tj = "🇹🇯"; + constexpr const char[] flag_tz = "🇹🇿"; + constexpr const char[] flag_th = "🇹🇭"; + constexpr const char[] flag_tl = "🇹🇱"; + constexpr const char[] flag_tg = "🇹🇬"; + constexpr const char[] flag_tk = "🇹🇰"; + constexpr const char[] flag_to = "🇹🇴"; + constexpr const char[] flag_tt = "🇹🇹"; + constexpr const char[] flag_tn = "🇹🇳"; + constexpr const char[] flag_tr = "🇹🇷"; + constexpr const char[] flag_tm = "🇹🇲"; + constexpr const char[] flag_tc = "🇹🇨"; + constexpr const char[] flag_vi = "🇻🇮"; + constexpr const char[] flag_tv = "🇹🇻"; + constexpr const char[] flag_ug = "🇺🇬"; + constexpr const char[] flag_ua = "🇺🇦"; + constexpr const char[] flag_ae = "🇦🇪"; + constexpr const char[] flag_gb = "🇬🇧"; + constexpr const char[] england = "🏴󠁧󠁢󠁥󠁮󠁧󠁿"; + constexpr const char[] scotland = "🏴󠁧󠁢󠁳󠁣󠁴󠁿"; + constexpr const char[] wales = "🏴󠁧󠁢󠁷󠁬󠁳󠁿"; + constexpr const char[] flag_us = "🇺🇸"; + constexpr const char[] flag_uy = "🇺🇾"; + constexpr const char[] flag_uz = "🇺🇿"; + constexpr const char[] flag_vu = "🇻🇺"; + constexpr const char[] flag_va = "🇻🇦"; + constexpr const char[] flag_ve = "🇻🇪"; + constexpr const char[] flag_vn = "🇻🇳"; + constexpr const char[] flag_wf = "🇼🇫"; + constexpr const char[] flag_eh = "🇪🇭"; + constexpr const char[] flag_ye = "🇾🇪"; + constexpr const char[] flag_zm = "🇿🇲"; + constexpr const char[] flag_zw = "🇿🇼"; + constexpr const char[] flag_ac = "🇦🇨"; + constexpr const char[] flag_bv = "🇧🇻"; + constexpr const char[] flag_cp = "🇨🇵"; + constexpr const char[] flag_ea = "🇪🇦"; + constexpr const char[] flag_dg = "🇩🇬"; + constexpr const char[] flag_hm = "🇭🇲"; + constexpr const char[] flag_mf = "🇲🇫"; + constexpr const char[] flag_sj = "🇸🇯"; + constexpr const char[] flag_ta = "🇹🇦"; + constexpr const char[] flag_um = "🇺🇲"; + constexpr const char[] united_nations = "🇺🇳"; + constexpr const char[] green_apple = "🍏"; + constexpr const char[] apple = "🍎"; + constexpr const char[] pear = "🍐"; + constexpr const char[] tangerine = "🍊"; + constexpr const char[] lemon = "🍋"; + constexpr const char[] banana = "🍌"; + constexpr const char[] watermelon = "🍉"; + constexpr const char[] grapes = "🍇"; + constexpr const char[] blueberries = "🫐"; + constexpr const char[] strawberry = "🍓"; + constexpr const char[] melon = "🍈"; + constexpr const char[] cherries = "🍒"; + constexpr const char[] peach = "🍑"; + constexpr const char[] mango = "🥭"; + constexpr const char[] pineapple = "🍍"; + constexpr const char[] coconut = "🥥"; + constexpr const char[] kiwi = "🥝"; + constexpr const char[] kiwifruit = "🥝"; + constexpr const char[] tomato = "🍅"; + constexpr const char[] eggplant = "🍆"; + constexpr const char[] avocado = "🥑"; + constexpr const char[] olive = "🫒"; + constexpr const char[] broccoli = "🥦"; + constexpr const char[] leafy_green = "🥬"; + constexpr const char[] bell_pepper = "🫑"; + constexpr const char[] cucumber = "🥒"; + constexpr const char[] hot_pepper = "🌶️"; + constexpr const char[] corn = "🌽"; + constexpr const char[] carrot = "🥕"; + constexpr const char[] garlic = "🧄"; + constexpr const char[] onion = "🧅"; + constexpr const char[] potato = "🥔"; + constexpr const char[] sweet_potato = "🍠"; + constexpr const char[] croissant = "🥐"; + constexpr const char[] bagel = "🥯"; + constexpr const char[] bread = "🍞"; + constexpr const char[] french_bread = "🥖"; + constexpr const char[] baguette_bread = "🥖"; + constexpr const char[] flatbread = "🫓"; + constexpr const char[] pretzel = "🥨"; + constexpr const char[] cheese = "🧀"; + constexpr const char[] cheese_wedge = "🧀"; + constexpr const char[] egg = "🥚"; + constexpr const char[] cooking = "🍳"; + constexpr const char[] butter = "🧈"; + constexpr const char[] pancakes = "🥞"; + constexpr const char[] waffle = "🧇"; + constexpr const char[] bacon = "🥓"; + constexpr const char[] cut_of_meat = "🥩"; + constexpr const char[] poultry_leg = "🍗"; + constexpr const char[] meat_on_bone = "🍖"; + constexpr const char[] bone = "🦴"; + constexpr const char[] hotdog = "🌭"; + constexpr const char[] hot_dog = "🌭"; + constexpr const char[] hamburger = "🍔"; + constexpr const char[] fries = "🍟"; + constexpr const char[] pizza = "🍕"; + constexpr const char[] sandwich = "🥪"; + constexpr const char[] stuffed_flatbread = "🥙"; + constexpr const char[] stuffed_pita = "🥙"; + constexpr const char[] falafel = "🧆"; + constexpr const char[] taco = "🌮"; + constexpr const char[] burrito = "🌯"; + constexpr const char[] tamale = "🫔"; + constexpr const char[] salad = "🥗"; + constexpr const char[] green_salad = "🥗"; + constexpr const char[] shallow_pan_of_food = "🥘"; + constexpr const char[] paella = "🥘"; + constexpr const char[] fondue = "🫕"; + constexpr const char[] canned_food = "🥫"; + constexpr const char[] jar = "🫙"; + constexpr const char[] spaghetti = "🍝"; + constexpr const char[] ramen = "🍜"; + constexpr const char[] stew = "🍲"; + constexpr const char[] curry = "🍛"; + constexpr const char[] sushi = "🍣"; + constexpr const char[] bento = "🍱"; + constexpr const char[] dumpling = "🥟"; + constexpr const char[] oyster = "🦪"; + constexpr const char[] fried_shrimp = "🍤"; + constexpr const char[] rice_ball = "🍙"; + constexpr const char[] rice = "🍚"; + constexpr const char[] rice_cracker = "🍘"; + constexpr const char[] fish_cake = "🍥"; + constexpr const char[] fortune_cookie = "🥠"; + constexpr const char[] moon_cake = "🥮"; + constexpr const char[] oden = "🍢"; + constexpr const char[] dango = "🍡"; + constexpr const char[] shaved_ice = "🍧"; + constexpr const char[] ice_cream = "🍨"; + constexpr const char[] icecream = "🍦"; + constexpr const char[] pie = "🥧"; + constexpr const char[] cupcake = "🧁"; + constexpr const char[] cake = "🍰"; + constexpr const char[] birthday = "🎂"; + constexpr const char[] custard = "🍮"; + constexpr const char[] pudding = "🍮"; + constexpr const char[] flan = "🍮"; + constexpr const char[] lollipop = "🍭"; + constexpr const char[] candy = "🍬"; + constexpr const char[] chocolate_bar = "🍫"; + constexpr const char[] popcorn = "🍿"; + constexpr const char[] doughnut = "🍩"; + constexpr const char[] cookie = "🍪"; + constexpr const char[] chestnut = "🌰"; + constexpr const char[] peanuts = "🥜"; + constexpr const char[] shelled_peanut = "🥜"; + constexpr const char[] beans = "🫘"; + constexpr const char[] honey_pot = "🍯"; + constexpr const char[] milk = "🥛"; + constexpr const char[] glass_of_milk = "🥛"; + constexpr const char[] pouring_liquid = "🫗"; + constexpr const char[] baby_bottle = "🍼"; + constexpr const char[] teapot = "🫖"; + constexpr const char[] coffee = "☕"; + constexpr const char[] tea = "🍵"; + constexpr const char[] mate = "🧉"; + constexpr const char[] beverage_box = "🧃"; + constexpr const char[] cup_with_straw = "🥤"; + constexpr const char[] bubble_tea = "🧋"; + constexpr const char[] sake = "🍶"; + constexpr const char[] beer = "🍺"; + constexpr const char[] beers = "🍻"; + constexpr const char[] champagne_glass = "🥂"; + constexpr const char[] clinking_glass = "🥂"; + constexpr const char[] wine_glass = "🍷"; + constexpr const char[] tumbler_glass = "🥃"; + constexpr const char[] whisky = "🥃"; + constexpr const char[] cocktail = "🍸"; + constexpr const char[] tropical_drink = "🍹"; + constexpr const char[] champagne = "🍾"; + constexpr const char[] bottle_with_popping_cork = "🍾"; + constexpr const char[] ice_cube = "🧊"; + constexpr const char[] spoon = "🥄"; + constexpr const char[] fork_and_knife = "🍴"; + constexpr const char[] fork_knife_plate = "🍽️"; + constexpr const char[] fork_and_knife_with_plate = "🍽️"; + constexpr const char[] bowl_with_spoon = "🥣"; + constexpr const char[] takeout_box = "🥡"; + constexpr const char[] chopsticks = "🥢"; + constexpr const char[] salt = "🧂"; + constexpr const char[] dog = "🐶"; + constexpr const char[] cat = "🐱"; + constexpr const char[] mouse = "🐭"; + constexpr const char[] hamster = "🐹"; + constexpr const char[] rabbit = "🐰"; + constexpr const char[] fox = "🦊"; + constexpr const char[] fox_face = "🦊"; + constexpr const char[] bear = "🐻"; + constexpr const char[] panda_face = "🐼"; + constexpr const char[] polar_bear = "🐻‍❄️"; + constexpr const char[] koala = "🐨"; + constexpr const char[] tiger = "🐯"; + constexpr const char[] lion_face = "🦁"; + constexpr const char[] lion = "🦁"; + constexpr const char[] cow = "🐮"; + constexpr const char[] pig = "🐷"; + constexpr const char[] pig_nose = "🐽"; + constexpr const char[] frog = "🐸"; + constexpr const char[] monkey_face = "🐵"; + constexpr const char[] see_no_evil = "🙈"; + constexpr const char[] hear_no_evil = "🙉"; + constexpr const char[] speak_no_evil = "🙊"; + constexpr const char[] monkey = "🐒"; + constexpr const char[] chicken = "🐔"; + constexpr const char[] penguin = "🐧"; + constexpr const char[] bird = "🐦"; + constexpr const char[] baby_chick = "🐤"; + constexpr const char[] hatching_chick = "🐣"; + constexpr const char[] hatched_chick = "🐥"; + constexpr const char[] duck = "🦆"; + constexpr const char[] eagle = "🦅"; + constexpr const char[] owl = "🦉"; + constexpr const char[] bat = "🦇"; + constexpr const char[] wolf = "🐺"; + constexpr const char[] boar = "🐗"; + constexpr const char[] horse = "🐴"; + constexpr const char[] unicorn = "🦄"; + constexpr const char[] unicorn_face = "🦄"; + constexpr const char[] bee = "🐝"; + constexpr const char[] bug = "🐛"; + constexpr const char[] butterfly = "🦋"; + constexpr const char[] snail = "🐌"; + constexpr const char[] worm = "🪱"; + constexpr const char[] lady_beetle = "🐞"; + constexpr const char[] ant = "🐜"; + constexpr const char[] fly = "🪰"; + constexpr const char[] mosquito = "🦟"; + constexpr const char[] cockroach = "🪳"; + constexpr const char[] beetle = "🪲"; + constexpr const char[] cricket = "🦗"; + constexpr const char[] spider = "🕷️"; + constexpr const char[] spider_web = "🕸️"; + constexpr const char[] scorpion = "🦂"; + constexpr const char[] turtle = "🐢"; + constexpr const char[] snake = "🐍"; + constexpr const char[] lizard = "🦎"; + constexpr const char[] t_rex = "🦖"; + constexpr const char[] sauropod = "🦕"; + constexpr const char[] octopus = "🐙"; + constexpr const char[] squid = "🦑"; + constexpr const char[] shrimp = "🦐"; + constexpr const char[] lobster = "🦞"; + constexpr const char[] crab = "🦀"; + constexpr const char[] blowfish = "🐡"; + constexpr const char[] tropical_fish = "🐠"; + constexpr const char[] fish = "🐟"; + constexpr const char[] seal = "🦭"; + constexpr const char[] dolphin = "🐬"; + constexpr const char[] whale = "🐳"; + constexpr const char[] whale2 = "🐋"; + constexpr const char[] shark = "🦈"; + constexpr const char[] crocodile = "🐊"; + constexpr const char[] tiger2 = "🐅"; + constexpr const char[] leopard = "🐆"; + constexpr const char[] zebra = "🦓"; + constexpr const char[] gorilla = "🦍"; + constexpr const char[] orangutan = "🦧"; + constexpr const char[] elephant = "🐘"; + constexpr const char[] mammoth = "🦣"; + constexpr const char[] bison = "🦬"; + constexpr const char[] hippopotamus = "🦛"; + constexpr const char[] rhino = "🦏"; + constexpr const char[] rhinoceros = "🦏"; + constexpr const char[] dromedary_camel = "🐪"; + constexpr const char[] camel = "🐫"; + constexpr const char[] giraffe = "🦒"; + constexpr const char[] kangaroo = "🦘"; + constexpr const char[] water_buffalo = "🐃"; + constexpr const char[] ox = "🐂"; + constexpr const char[] cow2 = "🐄"; + constexpr const char[] racehorse = "🐎"; + constexpr const char[] pig2 = "🐖"; + constexpr const char[] ram = "🐏"; + constexpr const char[] sheep = "🐑"; + constexpr const char[] llama = "🦙"; + constexpr const char[] goat = "🐐"; + constexpr const char[] deer = "🦌"; + constexpr const char[] dog2 = "🐕"; + constexpr const char[] poodle = "🐩"; + constexpr const char[] guide_dog = "🦮"; + constexpr const char[] service_dog = "🐕‍🦺"; + constexpr const char[] cat2 = "🐈"; + constexpr const char[] black_cat = "🐈‍⬛"; + constexpr const char[] feather = "🪶"; + constexpr const char[] rooster = "🐓"; + constexpr const char[] turkey = "🦃"; + constexpr const char[] dodo = "🦤"; + constexpr const char[] peacock = "🦚"; + constexpr const char[] parrot = "🦜"; + constexpr const char[] swan = "🦢"; + constexpr const char[] flamingo = "🦩"; + constexpr const char[] dove = "🕊️"; + constexpr const char[] dove_of_peace = "🕊️"; + constexpr const char[] rabbit2 = "🐇"; + constexpr const char[] raccoon = "🦝"; + constexpr const char[] skunk = "🦨"; + constexpr const char[] badger = "🦡"; + constexpr const char[] beaver = "🦫"; + constexpr const char[] otter = "🦦"; + constexpr const char[] sloth = "🦥"; + constexpr const char[] mouse2 = "🐁"; + constexpr const char[] rat = "🐀"; + constexpr const char[] chipmunk = "🐿️"; + constexpr const char[] hedgehog = "🦔"; + constexpr const char[] feet = "🐾"; + constexpr const char[] paw_prints = "🐾"; + constexpr const char[] dragon = "🐉"; + constexpr const char[] dragon_face = "🐲"; + constexpr const char[] cactus = "🌵"; + constexpr const char[] christmas_tree = "🎄"; + constexpr const char[] evergreen_tree = "🌲"; + constexpr const char[] deciduous_tree = "🌳"; + constexpr const char[] palm_tree = "🌴"; + constexpr const char[] seedling = "🌱"; + constexpr const char[] herb = "🌿"; + constexpr const char[] shamrock = "☘️"; + constexpr const char[] four_leaf_clover = "🍀"; + constexpr const char[] bamboo = "🎍"; + constexpr const char[] tanabata_tree = "🎋"; + constexpr const char[] leaves = "🍃"; + constexpr const char[] fallen_leaf = "🍂"; + constexpr const char[] maple_leaf = "🍁"; + constexpr const char[] empty_nest = "🪹"; + constexpr const char[] nest_with_eggs = "🪺"; + constexpr const char[] mushroom = "🍄"; + constexpr const char[] shell = "🐚"; + constexpr const char[] coral = "🪸"; + constexpr const char[] rock = "🪨"; + constexpr const char[] wood = "🪵"; + constexpr const char[] ear_of_rice = "🌾"; + constexpr const char[] potted_plant = "🪴"; + constexpr const char[] bouquet = "💐"; + constexpr const char[] tulip = "🌷"; + constexpr const char[] rose = "🌹"; + constexpr const char[] wilted_rose = "🥀"; + constexpr const char[] wilted_flower = "🥀"; + constexpr const char[] lotus = "🪷"; + constexpr const char[] hibiscus = "🌺"; + constexpr const char[] cherry_blossom = "🌸"; + constexpr const char[] blossom = "🌼"; + constexpr const char[] sunflower = "🌻"; + constexpr const char[] sun_with_face = "🌞"; + constexpr const char[] full_moon_with_face = "🌝"; + constexpr const char[] first_quarter_moon_with_face = "🌛"; + constexpr const char[] last_quarter_moon_with_face = "🌜"; + constexpr const char[] new_moon_with_face = "🌚"; + constexpr const char[] full_moon = "🌕"; + constexpr const char[] waning_gibbous_moon = "🌖"; + constexpr const char[] last_quarter_moon = "🌗"; + constexpr const char[] waning_crescent_moon = "🌘"; + constexpr const char[] new_moon = "🌑"; + constexpr const char[] waxing_crescent_moon = "🌒"; + constexpr const char[] first_quarter_moon = "🌓"; + constexpr const char[] waxing_gibbous_moon = "🌔"; + constexpr const char[] crescent_moon = "🌙"; + constexpr const char[] earth_americas = "🌎"; + constexpr const char[] earth_africa = "🌍"; + constexpr const char[] earth_asia = "🌏"; + constexpr const char[] ringed_planet = "🪐"; + constexpr const char[] dizzy = "💫"; + constexpr const char[] star = "⭐"; + constexpr const char[] star2 = "🌟"; + constexpr const char[] sparkles = "✨"; + constexpr const char[] zap = "⚡"; + constexpr const char[] comet = "☄️"; + constexpr const char[] boom = "💥"; + constexpr const char[] fire = "🔥"; + constexpr const char[] flame = "🔥"; + constexpr const char[] cloud_tornado = "🌪️"; + constexpr const char[] cloud_with_tornado = "🌪️"; + constexpr const char[] rainbow = "🌈"; + constexpr const char[] sunny = "☀️"; + constexpr const char[] white_sun_small_cloud = "🌤️"; + constexpr const char[] white_sun_with_small_cloud = "🌤️"; + constexpr const char[] partly_sunny = "⛅"; + constexpr const char[] white_sun_cloud = "🌥️"; + constexpr const char[] white_sun_behind_cloud = "🌥️"; + constexpr const char[] cloud = "☁️"; + constexpr const char[] white_sun_rain_cloud = "🌦️"; + constexpr const char[] white_sun_behind_cloud_with_rain = "🌦️"; + constexpr const char[] cloud_rain = "🌧️"; + constexpr const char[] cloud_with_rain = "🌧️"; + constexpr const char[] thunder_cloud_rain = "⛈️"; + constexpr const char[] thunder_cloud_and_rain = "⛈️"; + constexpr const char[] cloud_lightning = "🌩️"; + constexpr const char[] cloud_with_lightning = "🌩️"; + constexpr const char[] cloud_snow = "🌨️"; + constexpr const char[] cloud_with_snow = "🌨️"; + constexpr const char[] snowflake = "❄️"; + constexpr const char[] snowman2 = "☃️"; + constexpr const char[] snowman = "⛄"; + constexpr const char[] wind_blowing_face = "🌬️"; + constexpr const char[] dash = "💨"; + constexpr const char[] droplet = "💧"; + constexpr const char[] sweat_drops = "💦"; + constexpr const char[] bubbles = "🫧"; + constexpr const char[] umbrella = "☔"; + constexpr const char[] umbrella2 = "☂️"; + constexpr const char[] ocean = "🌊"; + constexpr const char[] fog = "🌫️"; + constexpr const char[] watch = "⌚"; + constexpr const char[] mobile_phone = "📱"; + constexpr const char[] iphone = "📱"; + constexpr const char[] calling = "📲"; + constexpr const char[] computer = "💻"; + constexpr const char[] keyboard = "⌨️"; + constexpr const char[] desktop = "🖥️"; + constexpr const char[] desktop_computer = "🖥️"; + constexpr const char[] printer = "🖨️"; + constexpr const char[] mouse_three_button = "🖱️"; + constexpr const char[] three_button_mouse = "🖱️"; + constexpr const char[] trackball = "🖲️"; + constexpr const char[] joystick = "🕹️"; + constexpr const char[] compression = "🗜️"; + constexpr const char[] minidisc = "💽"; + constexpr const char[] floppy_disk = "💾"; + constexpr const char[] cd = "💿"; + constexpr const char[] dvd = "📀"; + constexpr const char[] vhs = "📼"; + constexpr const char[] camera = "📷"; + constexpr const char[] camera_with_flash = "📸"; + constexpr const char[] video_camera = "📹"; + constexpr const char[] movie_camera = "🎥"; + constexpr const char[] projector = "📽️"; + constexpr const char[] film_projector = "📽️"; + constexpr const char[] film_frames = "🎞️"; + constexpr const char[] telephone_receiver = "📞"; + constexpr const char[] telephone = "☎️"; + constexpr const char[] pager = "📟"; + constexpr const char[] fax = "📠"; + constexpr const char[] tv = "📺"; + constexpr const char[] radio = "📻"; + constexpr const char[] microphone2 = "🎙️"; + constexpr const char[] studio_microphone = "🎙️"; + constexpr const char[] level_slider = "🎚️"; + constexpr const char[] control_knobs = "🎛️"; + constexpr const char[] compass = "🧭"; + constexpr const char[] stopwatch = "⏱️"; + constexpr const char[] timer = "⏲️"; + constexpr const char[] timer_clock = "⏲️"; + constexpr const char[] alarm_clock = "⏰"; + constexpr const char[] clock = "🕰️"; + constexpr const char[] mantlepiece_clock = "🕰️"; + constexpr const char[] hourglass = "⌛"; + constexpr const char[] hourglass_flowing_sand = "⏳"; + constexpr const char[] satellite = "📡"; + constexpr const char[] battery = "🔋"; + constexpr const char[] low_battery = "🪫"; + constexpr const char[] electric_plug = "🔌"; + constexpr const char[] bulb = "💡"; + constexpr const char[] flashlight = "🔦"; + constexpr const char[] candle = "🕯️"; + constexpr const char[] diya_lamp = "🪔"; + constexpr const char[] fire_extinguisher = "🧯"; + constexpr const char[] oil = "🛢️"; + constexpr const char[] oil_drum = "🛢️"; + constexpr const char[] money_with_wings = "💸"; + constexpr const char[] dollar = "💵"; + constexpr const char[] yen = "💴"; + constexpr const char[] euro = "💶"; + constexpr const char[] pound = "💷"; + constexpr const char[] coin = "🪙"; + constexpr const char[] moneybag = "💰"; + constexpr const char[] credit_card = "💳"; + constexpr const char[] identification_card = "🪪"; + constexpr const char[] gem = "💎"; + constexpr const char[] scales = "⚖️"; + constexpr const char[] ladder = "🪜"; + constexpr const char[] toolbox = "🧰"; + constexpr const char[] screwdriver = "🪛"; + constexpr const char[] wrench = "🔧"; + constexpr const char[] hammer = "🔨"; + constexpr const char[] hammer_pick = "⚒️"; + constexpr const char[] hammer_and_pick = "⚒️"; + constexpr const char[] tools = "🛠️"; + constexpr const char[] hammer_and_wrench = "🛠️"; + constexpr const char[] pick = "⛏️"; + constexpr const char[] carpentry_saw = "🪚"; + constexpr const char[] nut_and_bolt = "🔩"; + constexpr const char[] gear = "⚙️"; + constexpr const char[] mouse_trap = "🪤"; + constexpr const char[] bricks = "🧱"; + constexpr const char[] chains = "⛓️"; + constexpr const char[] magnet = "🧲"; + constexpr const char[] gun = "🔫"; + constexpr const char[] bomb = "💣"; + constexpr const char[] firecracker = "🧨"; + constexpr const char[] axe = "🪓"; + constexpr const char[] knife = "🔪"; + constexpr const char[] dagger = "🗡️"; + constexpr const char[] dagger_knife = "🗡️"; + constexpr const char[] crossed_swords = "⚔️"; + constexpr const char[] shield = "🛡️"; + constexpr const char[] smoking = "🚬"; + constexpr const char[] coffin = "⚰️"; + constexpr const char[] headstone = "🪦"; + constexpr const char[] urn = "⚱️"; + constexpr const char[] funeral_urn = "⚱️"; + constexpr const char[] amphora = "🏺"; + constexpr const char[] crystal_ball = "🔮"; + constexpr const char[] prayer_beads = "📿"; + constexpr const char[] nazar_amulet = "🧿"; + constexpr const char[] hamsa = "🪬"; + constexpr const char[] barber = "💈"; + constexpr const char[] alembic = "⚗️"; + constexpr const char[] telescope = "🔭"; + constexpr const char[] microscope = "🔬"; + constexpr const char[] hole = "🕳️"; + constexpr const char[] x_ray = "🩻"; + constexpr const char[] adhesive_bandage = "🩹"; + constexpr const char[] stethoscope = "🩺"; + constexpr const char[] pill = "💊"; + constexpr const char[] syringe = "💉"; + constexpr const char[] drop_of_blood = "🩸"; + constexpr const char[] dna = "🧬"; + constexpr const char[] microbe = "🦠"; + constexpr const char[] petri_dish = "🧫"; + constexpr const char[] test_tube = "🧪"; + constexpr const char[] thermometer = "🌡️"; + constexpr const char[] broom = "🧹"; + constexpr const char[] plunger = "🪠"; + constexpr const char[] basket = "🧺"; + constexpr const char[] roll_of_paper = "🧻"; + constexpr const char[] toilet = "🚽"; + constexpr const char[] potable_water = "🚰"; + constexpr const char[] shower = "🚿"; + constexpr const char[] bathtub = "🛁"; + constexpr const char[] bath = "🛀"; + constexpr const char[] bath_tone1 = "🛀🏻"; + constexpr const char[] bath_tone2 = "🛀🏼"; + constexpr const char[] bath_tone3 = "🛀🏽"; + constexpr const char[] bath_tone4 = "🛀🏾"; + constexpr const char[] bath_tone5 = "🛀🏿"; + constexpr const char[] soap = "🧼"; + constexpr const char[] toothbrush = "🪥"; + constexpr const char[] razor = "🪒"; + constexpr const char[] sponge = "🧽"; + constexpr const char[] bucket = "🪣"; + constexpr const char[] squeeze_bottle = "🧴"; + constexpr const char[] bellhop = "🛎️"; + constexpr const char[] bellhop_bell = "🛎️"; + constexpr const char[] key = "🔑"; + constexpr const char[] key2 = "🗝️"; + constexpr const char[] old_key = "🗝️"; + constexpr const char[] door = "🚪"; + constexpr const char[] chair = "🪑"; + constexpr const char[] couch = "🛋️"; + constexpr const char[] couch_and_lamp = "🛋️"; + constexpr const char[] bed = "🛏️"; + constexpr const char[] sleeping_accommodation = "🛌"; + constexpr const char[] person_in_bed_tone1 = "🛌🏻"; + constexpr const char[] person_in_bed_light_skin_tone = "🛌🏻"; + constexpr const char[] person_in_bed_tone2 = "🛌🏼"; + constexpr const char[] person_in_bed_medium_light_skin_tone = "🛌🏼"; + constexpr const char[] person_in_bed_tone3 = "🛌🏽"; + constexpr const char[] person_in_bed_medium_skin_tone = "🛌🏽"; + constexpr const char[] person_in_bed_tone4 = "🛌🏾"; + constexpr const char[] person_in_bed_medium_dark_skin_tone = "🛌🏾"; + constexpr const char[] person_in_bed_tone5 = "🛌🏿"; + constexpr const char[] person_in_bed_dark_skin_tone = "🛌🏿"; + constexpr const char[] teddy_bear = "🧸"; + constexpr const char[] nesting_dolls = "🪆"; + constexpr const char[] frame_photo = "🖼️"; + constexpr const char[] frame_with_picture = "🖼️"; + constexpr const char[] mirror = "🪞"; + constexpr const char[] window = "🪟"; + constexpr const char[] shopping_bags = "🛍️"; + constexpr const char[] shopping_cart = "🛒"; + constexpr const char[] shopping_trolley = "🛒"; + constexpr const char[] gift = "🎁"; + constexpr const char[] balloon = "🎈"; + constexpr const char[] flags = "🎏"; + constexpr const char[] ribbon = "🎀"; + constexpr const char[] magic_wand = "🪄"; + constexpr const char[] piñata = "🪅"; + constexpr const char[] confetti_ball = "🎊"; + constexpr const char[] tada = "🎉"; + constexpr const char[] dolls = "🎎"; + constexpr const char[] izakaya_lantern = "🏮"; + constexpr const char[] wind_chime = "🎐"; + constexpr const char[] mirror_ball = "🪩"; + constexpr const char[] red_envelope = "🧧"; + constexpr const char[] envelope = "✉️"; + constexpr const char[] envelope_with_arrow = "📩"; + constexpr const char[] incoming_envelope = "📨"; + constexpr const char[] e_mail = "📧"; + constexpr const char[] email = "📧"; + constexpr const char[] love_letter = "💌"; + constexpr const char[] inbox_tray = "📥"; + constexpr const char[] outbox_tray = "📤"; + constexpr const char[] package = "📦"; + constexpr const char[] label = "🏷️"; + constexpr const char[] placard = "🪧"; + constexpr const char[] mailbox_closed = "📪"; + constexpr const char[] mailbox = "📫"; + constexpr const char[] mailbox_with_mail = "📬"; + constexpr const char[] mailbox_with_no_mail = "📭"; + constexpr const char[] postbox = "📮"; + constexpr const char[] postal_horn = "📯"; + constexpr const char[] scroll = "📜"; + constexpr const char[] page_with_curl = "📃"; + constexpr const char[] page_facing_up = "📄"; + constexpr const char[] bookmark_tabs = "📑"; + constexpr const char[] receipt = "🧾"; + constexpr const char[] bar_chart = "📊"; + constexpr const char[] chart_with_upwards_trend = "📈"; + constexpr const char[] chart_with_downwards_trend = "📉"; + constexpr const char[] notepad_spiral = "🗒️"; + constexpr const char[] spiral_note_pad = "🗒️"; + constexpr const char[] calendar_spiral = "🗓️"; + constexpr const char[] spiral_calendar_pad = "🗓️"; + constexpr const char[] calendar = "📆"; + constexpr const char[] date = "📅"; + constexpr const char[] wastebasket = "🗑️"; + constexpr const char[] card_index = "📇"; + constexpr const char[] card_box = "🗃️"; + constexpr const char[] card_file_box = "🗃️"; + constexpr const char[] ballot_box = "🗳️"; + constexpr const char[] ballot_box_with_ballot = "🗳️"; + constexpr const char[] file_cabinet = "🗄️"; + constexpr const char[] clipboard = "📋"; + constexpr const char[] file_folder = "📁"; + constexpr const char[] open_file_folder = "📂"; + constexpr const char[] dividers = "🗂️"; + constexpr const char[] card_index_dividers = "🗂️"; + constexpr const char[] newspaper2 = "🗞️"; + constexpr const char[] rolled_up_newspaper = "🗞️"; + constexpr const char[] newspaper = "📰"; + constexpr const char[] notebook = "📓"; + constexpr const char[] notebook_with_decorative_cover = "📔"; + constexpr const char[] ledger = "📒"; + constexpr const char[] closed_book = "📕"; + constexpr const char[] green_book = "📗"; + constexpr const char[] blue_book = "📘"; + constexpr const char[] orange_book = "📙"; + constexpr const char[] books = "📚"; + constexpr const char[] book = "📖"; + constexpr const char[] bookmark = "🔖"; + constexpr const char[] safety_pin = "🧷"; + constexpr const char[] link = "🔗"; + constexpr const char[] paperclip = "📎"; + constexpr const char[] paperclips = "🖇️"; + constexpr const char[] linked_paperclips = "🖇️"; + constexpr const char[] triangular_ruler = "📐"; + constexpr const char[] straight_ruler = "📏"; + constexpr const char[] abacus = "🧮"; + constexpr const char[] pushpin = "📌"; + constexpr const char[] round_pushpin = "📍"; + constexpr const char[] scissors = "✂️"; + constexpr const char[] pen_ballpoint = "🖊️"; + constexpr const char[] lower_left_ballpoint_pen = "🖊️"; + constexpr const char[] pen_fountain = "🖋️"; + constexpr const char[] lower_left_fountain_pen = "🖋️"; + constexpr const char[] black_nib = "✒️"; + constexpr const char[] paintbrush = "🖌️"; + constexpr const char[] lower_left_paintbrush = "🖌️"; + constexpr const char[] crayon = "🖍️"; + constexpr const char[] lower_left_crayon = "🖍️"; + constexpr const char[] pencil = "📝"; + constexpr const char[] memo = "📝"; + constexpr const char[] pencil2 = "✏️"; + constexpr const char[] mag = "🔍"; + constexpr const char[] mag_right = "🔎"; + constexpr const char[] lock_with_ink_pen = "🔏"; + constexpr const char[] closed_lock_with_key = "🔐"; + constexpr const char[] lock = "🔒"; + constexpr const char[] unlock = "🔓"; + constexpr const char[] grinning = "😀"; + constexpr const char[] smiley = "😃"; + constexpr const char[] smile = "😄"; + constexpr const char[] grin = "😁"; + constexpr const char[] laughing = "😆"; + constexpr const char[] satisfied = "😆"; + constexpr const char[] face_holding_back_tears = "🥹"; + constexpr const char[] sweat_smile = "😅"; + constexpr const char[] joy = "😂"; + constexpr const char[] rofl = "🤣"; + constexpr const char[] rolling_on_the_floor_laughing = "🤣"; + constexpr const char[] smiling_face_with_tear = "🥲"; + constexpr const char[] relaxed = "☺️"; + constexpr const char[] blush = "😊"; + constexpr const char[] innocent = "😇"; + constexpr const char[] slight_smile = "🙂"; + constexpr const char[] slightly_smiling_face = "🙂"; + constexpr const char[] upside_down = "🙃"; + constexpr const char[] upside_down_face = "🙃"; + constexpr const char[] wink = "😉"; + constexpr const char[] relieved = "😌"; + constexpr const char[] heart_eyes = "😍"; + constexpr const char[] smiling_face_with_3_hearts = "🥰"; + constexpr const char[] kissing_heart = "😘"; + constexpr const char[] kissing = "😗"; + constexpr const char[] kissing_smiling_eyes = "😙"; + constexpr const char[] kissing_closed_eyes = "😚"; + constexpr const char[] yum = "😋"; + constexpr const char[] stuck_out_tongue = "😛"; + constexpr const char[] stuck_out_tongue_closed_eyes = "😝"; + constexpr const char[] stuck_out_tongue_winking_eye = "😜"; + constexpr const char[] zany_face = "🤪"; + constexpr const char[] face_with_raised_eyebrow = "🤨"; + constexpr const char[] face_with_monocle = "🧐"; + constexpr const char[] nerd = "🤓"; + constexpr const char[] nerd_face = "🤓"; + constexpr const char[] sunglasses = "😎"; + constexpr const char[] disguised_face = "🥸"; + constexpr const char[] star_struck = "🤩"; + constexpr const char[] partying_face = "🥳"; + constexpr const char[] smirk = "😏"; + constexpr const char[] unamused = "😒"; + constexpr const char[] disappointed = "😞"; + constexpr const char[] pensive = "😔"; + constexpr const char[] worried = "😟"; + constexpr const char[] confused = "😕"; + constexpr const char[] slight_frown = "🙁"; + constexpr const char[] slightly_frowning_face = "🙁"; + constexpr const char[] frowning2 = "☹️"; + constexpr const char[] white_frowning_face = "☹️"; + constexpr const char[] persevere = "😣"; + constexpr const char[] confounded = "😖"; + constexpr const char[] tired_face = "😫"; + constexpr const char[] weary = "😩"; + constexpr const char[] pleading_face = "🥺"; + constexpr const char[] cry = "😢"; + constexpr const char[] sob = "😭"; + constexpr const char[] triumph = "😤"; + constexpr const char[] angry = "😠"; + constexpr const char[] rage = "😡"; + constexpr const char[] face_with_symbols_over_mouth = "🤬"; + constexpr const char[] exploding_head = "🤯"; + constexpr const char[] flushed = "😳"; + constexpr const char[] hot_face = "🥵"; + constexpr const char[] cold_face = "🥶"; + constexpr const char[] face_in_clouds = "😶‍🌫️"; + constexpr const char[] scream = "😱"; + constexpr const char[] fearful = "😨"; + constexpr const char[] cold_sweat = "😰"; + constexpr const char[] disappointed_relieved = "😥"; + constexpr const char[] sweat = "😓"; + constexpr const char[] hugging = "🤗"; + constexpr const char[] hugging_face = "🤗"; + constexpr const char[] thinking = "🤔"; + constexpr const char[] thinking_face = "🤔"; + constexpr const char[] face_with_peeking_eye = "🫣"; + constexpr const char[] face_with_hand_over_mouth = "🤭"; + constexpr const char[] face_with_open_eyes_and_hand_over_mouth = "🫢"; + constexpr const char[] saluting_face = "🫡"; + constexpr const char[] shushing_face = "🤫"; + constexpr const char[] melting_face = "🫠"; + constexpr const char[] lying_face = "🤥"; + constexpr const char[] liar = "🤥"; + constexpr const char[] no_mouth = "😶"; + constexpr const char[] dotted_line_face = "🫥"; + constexpr const char[] neutral_face = "😐"; + constexpr const char[] face_with_diagonal_mouth = "🫤"; + constexpr const char[] expressionless = "😑"; + constexpr const char[] grimacing = "😬"; + constexpr const char[] rolling_eyes = "🙄"; + constexpr const char[] face_with_rolling_eyes = "🙄"; + constexpr const char[] hushed = "😯"; + constexpr const char[] frowning = "😦"; + constexpr const char[] anguished = "😧"; + constexpr const char[] open_mouth = "😮"; + constexpr const char[] astonished = "😲"; + constexpr const char[] yawning_face = "🥱"; + constexpr const char[] sleeping = "😴"; + constexpr const char[] drooling_face = "🤤"; + constexpr const char[] drool = "🤤"; + constexpr const char[] sleepy = "😪"; + constexpr const char[] face_exhaling = "😮‍💨"; + constexpr const char[] dizzy_face = "😵"; + constexpr const char[] face_with_spiral_eyes = "😵‍💫"; + constexpr const char[] zipper_mouth = "🤐"; + constexpr const char[] zipper_mouth_face = "🤐"; + constexpr const char[] woozy_face = "🥴"; + constexpr const char[] nauseated_face = "🤢"; + constexpr const char[] sick = "🤢"; + constexpr const char[] face_vomiting = "🤮"; + constexpr const char[] sneezing_face = "🤧"; + constexpr const char[] sneeze = "🤧"; + constexpr const char[] mask = "😷"; + constexpr const char[] thermometer_face = "🤒"; + constexpr const char[] face_with_thermometer = "🤒"; + constexpr const char[] head_bandage = "🤕"; + constexpr const char[] face_with_head_bandage = "🤕"; + constexpr const char[] money_mouth = "🤑"; + constexpr const char[] money_mouth_face = "🤑"; + constexpr const char[] cowboy = "🤠"; + constexpr const char[] face_with_cowboy_hat = "🤠"; + constexpr const char[] smiling_imp = "😈"; + constexpr const char[] imp = "👿"; + constexpr const char[] japanese_ogre = "👹"; + constexpr const char[] japanese_goblin = "👺"; + constexpr const char[] clown = "🤡"; + constexpr const char[] clown_face = "🤡"; + constexpr const char[] poop = "💩"; + constexpr const char[] shit = "💩"; + constexpr const char[] hankey = "💩"; + constexpr const char[] poo = "💩"; + constexpr const char[] ghost = "👻"; + constexpr const char[] skull = "💀"; + constexpr const char[] skeleton = "💀"; + constexpr const char[] skull_crossbones = "☠️"; + constexpr const char[] skull_and_crossbones = "☠️"; + constexpr const char[] alien = "👽"; + constexpr const char[] space_invader = "👾"; + constexpr const char[] robot = "🤖"; + constexpr const char[] robot_face = "🤖"; + constexpr const char[] jack_o_lantern = "🎃"; + constexpr const char[] smiley_cat = "😺"; + constexpr const char[] smile_cat = "😸"; + constexpr const char[] joy_cat = "😹"; + constexpr const char[] heart_eyes_cat = "😻"; + constexpr const char[] smirk_cat = "😼"; + constexpr const char[] kissing_cat = "😽"; + constexpr const char[] scream_cat = "🙀"; + constexpr const char[] crying_cat_face = "😿"; + constexpr const char[] pouting_cat = "😾"; + constexpr const char[] heart_hands = "🫶"; + constexpr const char[] heart_hands_tone1 = "🫶🏻"; + constexpr const char[] heart_hands_light_skin_tone = "🫶🏻"; + constexpr const char[] heart_hands_tone2 = "🫶🏼"; + constexpr const char[] heart_hands_medium_light_skin_tone = "🫶🏼"; + constexpr const char[] heart_hands_tone3 = "🫶🏽"; + constexpr const char[] heart_hands_medium_skin_tone = "🫶🏽"; + constexpr const char[] heart_hands_tone4 = "🫶🏾"; + constexpr const char[] heart_hands_medium_dark_skin_tone = "🫶🏾"; + constexpr const char[] heart_hands_tone5 = "🫶🏿"; + constexpr const char[] heart_hands_dark_skin_tone = "🫶🏿"; + constexpr const char[] palms_up_together = "🤲"; + constexpr const char[] palms_up_together_tone1 = "🤲🏻"; + constexpr const char[] palms_up_together_light_skin_tone = "🤲🏻"; + constexpr const char[] palms_up_together_tone2 = "🤲🏼"; + constexpr const char[] palms_up_together_medium_light_skin_tone = "🤲🏼"; + constexpr const char[] palms_up_together_tone3 = "🤲🏽"; + constexpr const char[] palms_up_together_medium_skin_tone = "🤲🏽"; + constexpr const char[] palms_up_together_tone4 = "🤲🏾"; + constexpr const char[] palms_up_together_medium_dark_skin_tone = "🤲🏾"; + constexpr const char[] palms_up_together_tone5 = "🤲🏿"; + constexpr const char[] palms_up_together_dark_skin_tone = "🤲🏿"; + constexpr const char[] open_hands = "👐"; + constexpr const char[] open_hands_tone1 = "👐🏻"; + constexpr const char[] open_hands_tone2 = "👐🏼"; + constexpr const char[] open_hands_tone3 = "👐🏽"; + constexpr const char[] open_hands_tone4 = "👐🏾"; + constexpr const char[] open_hands_tone5 = "👐🏿"; + constexpr const char[] raised_hands = "🙌"; + constexpr const char[] raised_hands_tone1 = "🙌🏻"; + constexpr const char[] raised_hands_tone2 = "🙌🏼"; + constexpr const char[] raised_hands_tone3 = "🙌🏽"; + constexpr const char[] raised_hands_tone4 = "🙌🏾"; + constexpr const char[] raised_hands_tone5 = "🙌🏿"; + constexpr const char[] clap = "👏"; + constexpr const char[] clap_tone1 = "👏🏻"; + constexpr const char[] clap_tone2 = "👏🏼"; + constexpr const char[] clap_tone3 = "👏🏽"; + constexpr const char[] clap_tone4 = "👏🏾"; + constexpr const char[] clap_tone5 = "👏🏿"; + constexpr const char[] handshake = "🤝"; + constexpr const char[] shaking_hands = "🤝"; + constexpr const char[] handshake_light_skin_tone = "🤝🏻"; + constexpr const char[] handshake_tone1_tone2 = "🫱🏻‍🫲🏼"; + constexpr const char[] handshake_light_skin_tone_medium_light_skin_tone = "🫱🏻‍🫲🏼"; + constexpr const char[] handshake_tone1_tone3 = "🫱🏻‍🫲🏽"; + constexpr const char[] handshake_light_skin_tone_medium_skin_tone = "🫱🏻‍🫲🏽"; + constexpr const char[] handshake_tone1_tone4 = "🫱🏻‍🫲🏾"; + constexpr const char[] handshake_light_skin_tone_medium_dark_skin_tone = "🫱🏻‍🫲🏾"; + constexpr const char[] handshake_tone1_tone5 = "🫱🏻‍🫲🏿"; + constexpr const char[] handshake_light_skin_tone_dark_skin_tone = "🫱🏻‍🫲🏿"; + constexpr const char[] handshake_tone2_tone1 = "🫱🏼‍🫲🏻"; + constexpr const char[] handshake_medium_light_skin_tone_light_skin_tone = "🫱🏼‍🫲🏻"; + constexpr const char[] handshake_medium_light_skin_tone = "🤝🏼"; + constexpr const char[] handshake_tone2_tone3 = "🫱🏼‍🫲🏽"; + constexpr const char[] handshake_medium_light_skin_tone_medium_skin_tone = "🫱🏼‍🫲🏽"; + constexpr const char[] handshake_tone2_tone4 = "🫱🏼‍🫲🏾"; + constexpr const char[] handshake_medium_light_skin_tone_medium_dark_skin_tone = "🫱🏼‍🫲🏾"; + constexpr const char[] handshake_tone2_tone5 = "🫱🏼‍🫲🏿"; + constexpr const char[] handshake_medium_light_skin_tone_dark_skin_tone = "🫱🏼‍🫲🏿"; + constexpr const char[] handshake_tone3_tone1 = "🫱🏽‍🫲🏻"; + constexpr const char[] handshake_medium_skin_tone_light_skin_tone = "🫱🏽‍🫲🏻"; + constexpr const char[] handshake_tone3_tone2 = "🫱🏽‍🫲🏼"; + constexpr const char[] handshake_medium_skin_tone_medium_light_skin_tone = "🫱🏽‍🫲🏼"; + constexpr const char[] handshake_medium_skin_tone = "🤝🏽"; + constexpr const char[] handshake_tone3_tone4 = "🫱🏽‍🫲🏾"; + constexpr const char[] handshake_medium_skin_tone_medium_dark_skin_tone = "🫱🏽‍🫲🏾"; + constexpr const char[] handshake_tone3_tone5 = "🫱🏽‍🫲🏿"; + constexpr const char[] handshake_medium_skin_tone_dark_skin_tone = "🫱🏽‍🫲🏿"; + constexpr const char[] handshake_tone4_tone1 = "🫱🏾‍🫲🏻"; + constexpr const char[] handshake_medium_dark_skin_tone_light_skin_tone = "🫱🏾‍🫲🏻"; + constexpr const char[] handshake_tone4_tone2 = "🫱🏾‍🫲🏼"; + constexpr const char[] handshake_medium_dark_skin_tone_medium_light_skin_tone = "🫱🏾‍🫲🏼"; + constexpr const char[] handshake_tone4_tone3 = "🫱🏾‍🫲🏽"; + constexpr const char[] handshake_medium_dark_skin_tone_medium_skin_tone = "🫱🏾‍🫲🏽"; + constexpr const char[] handshake_medium_dark_skin_tone = "🤝🏾"; + constexpr const char[] handshake_tone4_tone5 = "🫱🏾‍🫲🏿"; + constexpr const char[] handshake_medium_dark_skin_tone_dark_skin_tone = "🫱🏾‍🫲🏿"; + constexpr const char[] handshake_tone5_tone1 = "🫱🏿‍🫲🏻"; + constexpr const char[] handshake_dark_skin_tone_light_skin_tone = "🫱🏿‍🫲🏻"; + constexpr const char[] handshake_tone5_tone2 = "🫱🏿‍🫲🏼"; + constexpr const char[] handshake_dark_skin_tone_medium_light_skin_tone = "🫱🏿‍🫲🏼"; + constexpr const char[] handshake_tone5_tone3 = "🫱🏿‍🫲🏽"; + constexpr const char[] handshake_dark_skin_tone_medium_skin_tone = "🫱🏿‍🫲🏽"; + constexpr const char[] handshake_tone5_tone4 = "🫱🏿‍🫲🏾"; + constexpr const char[] handshake_dark_skin_tone_medium_dark_skin_tone = "🫱🏿‍🫲🏾"; + constexpr const char[] handshake_dark_skin_tone = "🤝🏿"; + constexpr const char[] thumbsup = "👍"; + constexpr const char[] +1 = "👍"; + constexpr const char[] thumbup = "👍"; + constexpr const char[] thumbsup_tone1 = "👍🏻"; + constexpr const char[] +1_tone1 = "👍🏻"; + constexpr const char[] thumbup_tone1 = "👍🏻"; + constexpr const char[] thumbsup_tone2 = "👍🏼"; + constexpr const char[] +1_tone2 = "👍🏼"; + constexpr const char[] thumbup_tone2 = "👍🏼"; + constexpr const char[] thumbsup_tone3 = "👍🏽"; + constexpr const char[] +1_tone3 = "👍🏽"; + constexpr const char[] thumbup_tone3 = "👍🏽"; + constexpr const char[] thumbsup_tone4 = "👍🏾"; + constexpr const char[] +1_tone4 = "👍🏾"; + constexpr const char[] thumbup_tone4 = "👍🏾"; + constexpr const char[] thumbsup_tone5 = "👍🏿"; + constexpr const char[] +1_tone5 = "👍🏿"; + constexpr const char[] thumbup_tone5 = "👍🏿"; + constexpr const char[] thumbsdown = "👎"; + constexpr const char[] -1 = "👎"; + constexpr const char[] thumbdown = "👎"; + constexpr const char[] thumbsdown_tone1 = "👎🏻"; + constexpr const char[] _1_tone1 = "👎🏻"; + constexpr const char[] thumbdown_tone1 = "👎🏻"; + constexpr const char[] thumbsdown_tone2 = "👎🏼"; + constexpr const char[] _1_tone2 = "👎🏼"; + constexpr const char[] thumbdown_tone2 = "👎🏼"; + constexpr const char[] thumbsdown_tone3 = "👎🏽"; + constexpr const char[] _1_tone3 = "👎🏽"; + constexpr const char[] thumbdown_tone3 = "👎🏽"; + constexpr const char[] thumbsdown_tone4 = "👎🏾"; + constexpr const char[] _1_tone4 = "👎🏾"; + constexpr const char[] thumbdown_tone4 = "👎🏾"; + constexpr const char[] thumbsdown_tone5 = "👎🏿"; + constexpr const char[] _1_tone5 = "👎🏿"; + constexpr const char[] thumbdown_tone5 = "👎🏿"; + constexpr const char[] punch = "👊"; + constexpr const char[] punch_tone1 = "👊🏻"; + constexpr const char[] punch_tone2 = "👊🏼"; + constexpr const char[] punch_tone3 = "👊🏽"; + constexpr const char[] punch_tone4 = "👊🏾"; + constexpr const char[] punch_tone5 = "👊🏿"; + constexpr const char[] fist = "✊"; + constexpr const char[] fist_tone1 = "✊🏻"; + constexpr const char[] fist_tone2 = "✊🏼"; + constexpr const char[] fist_tone3 = "✊🏽"; + constexpr const char[] fist_tone4 = "✊🏾"; + constexpr const char[] fist_tone5 = "✊🏿"; + constexpr const char[] left_facing_fist = "🤛"; + constexpr const char[] left_fist = "🤛"; + constexpr const char[] left_facing_fist_tone1 = "🤛🏻"; + constexpr const char[] left_fist_tone1 = "🤛🏻"; + constexpr const char[] left_facing_fist_tone2 = "🤛🏼"; + constexpr const char[] left_fist_tone2 = "🤛🏼"; + constexpr const char[] left_facing_fist_tone3 = "🤛🏽"; + constexpr const char[] left_fist_tone3 = "🤛🏽"; + constexpr const char[] left_facing_fist_tone4 = "🤛🏾"; + constexpr const char[] left_fist_tone4 = "🤛🏾"; + constexpr const char[] left_facing_fist_tone5 = "🤛🏿"; + constexpr const char[] left_fist_tone5 = "🤛🏿"; + constexpr const char[] right_facing_fist = "🤜"; + constexpr const char[] right_fist = "🤜"; + constexpr const char[] right_facing_fist_tone1 = "🤜🏻"; + constexpr const char[] right_fist_tone1 = "🤜🏻"; + constexpr const char[] right_facing_fist_tone2 = "🤜🏼"; + constexpr const char[] right_fist_tone2 = "🤜🏼"; + constexpr const char[] right_facing_fist_tone3 = "🤜🏽"; + constexpr const char[] right_fist_tone3 = "🤜🏽"; + constexpr const char[] right_facing_fist_tone4 = "🤜🏾"; + constexpr const char[] right_fist_tone4 = "🤜🏾"; + constexpr const char[] right_facing_fist_tone5 = "🤜🏿"; + constexpr const char[] right_fist_tone5 = "🤜🏿"; + constexpr const char[] fingers_crossed = "🤞"; + constexpr const char[] hand_with_index_and_middle_finger_crossed = "🤞"; + constexpr const char[] fingers_crossed_tone1 = "🤞🏻"; + constexpr const char[] hand_with_index_and_middle_fingers_crossed_tone1 = "🤞🏻"; + constexpr const char[] fingers_crossed_tone2 = "🤞🏼"; + constexpr const char[] hand_with_index_and_middle_fingers_crossed_tone2 = "🤞🏼"; + constexpr const char[] fingers_crossed_tone3 = "🤞🏽"; + constexpr const char[] hand_with_index_and_middle_fingers_crossed_tone3 = "🤞🏽"; + constexpr const char[] fingers_crossed_tone4 = "🤞🏾"; + constexpr const char[] hand_with_index_and_middle_fingers_crossed_tone4 = "🤞🏾"; + constexpr const char[] fingers_crossed_tone5 = "🤞🏿"; + constexpr const char[] hand_with_index_and_middle_fingers_crossed_tone5 = "🤞🏿"; + constexpr const char[] v = "✌️"; + constexpr const char[] v_tone1 = "✌🏻"; + constexpr const char[] v_tone2 = "✌🏼"; + constexpr const char[] v_tone3 = "✌🏽"; + constexpr const char[] v_tone4 = "✌🏾"; + constexpr const char[] v_tone5 = "✌🏿"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed = "🫰"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_tone1 = "🫰🏻"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_light_skin_tone = "🫰🏻"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_tone2 = "🫰🏼"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_medium_light_skin_tone = "🫰🏼"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_tone3 = "🫰🏽"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_medium_skin_tone = "🫰🏽"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_tone4 = "🫰🏾"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_medium_dark_skin_tone = "🫰🏾"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_tone5 = "🫰🏿"; + constexpr const char[] hand_with_index_finger_and_thumb_crossed_dark_skin_tone = "🫰🏿"; + constexpr const char[] love_you_gesture = "🤟"; + constexpr const char[] love_you_gesture_tone1 = "🤟🏻"; + constexpr const char[] love_you_gesture_light_skin_tone = "🤟🏻"; + constexpr const char[] love_you_gesture_tone2 = "🤟🏼"; + constexpr const char[] love_you_gesture_medium_light_skin_tone = "🤟🏼"; + constexpr const char[] love_you_gesture_tone3 = "🤟🏽"; + constexpr const char[] love_you_gesture_medium_skin_tone = "🤟🏽"; + constexpr const char[] love_you_gesture_tone4 = "🤟🏾"; + constexpr const char[] love_you_gesture_medium_dark_skin_tone = "🤟🏾"; + constexpr const char[] love_you_gesture_tone5 = "🤟🏿"; + constexpr const char[] love_you_gesture_dark_skin_tone = "🤟🏿"; + constexpr const char[] metal = "🤘"; + constexpr const char[] sign_of_the_horns = "🤘"; + constexpr const char[] metal_tone1 = "🤘🏻"; + constexpr const char[] sign_of_the_horns_tone1 = "🤘🏻"; + constexpr const char[] metal_tone2 = "🤘🏼"; + constexpr const char[] sign_of_the_horns_tone2 = "🤘🏼"; + constexpr const char[] metal_tone3 = "🤘🏽"; + constexpr const char[] sign_of_the_horns_tone3 = "🤘🏽"; + constexpr const char[] metal_tone4 = "🤘🏾"; + constexpr const char[] sign_of_the_horns_tone4 = "🤘🏾"; + constexpr const char[] metal_tone5 = "🤘🏿"; + constexpr const char[] sign_of_the_horns_tone5 = "🤘🏿"; + constexpr const char[] ok_hand = "👌"; + constexpr const char[] ok_hand_tone1 = "👌🏻"; + constexpr const char[] ok_hand_tone2 = "👌🏼"; + constexpr const char[] ok_hand_tone3 = "👌🏽"; + constexpr const char[] ok_hand_tone4 = "👌🏾"; + constexpr const char[] ok_hand_tone5 = "👌🏿"; + constexpr const char[] pinched_fingers = "🤌"; + constexpr const char[] pinched_fingers_tone2 = "🤌🏼"; + constexpr const char[] pinched_fingers_medium_light_skin_tone = "🤌🏼"; + constexpr const char[] pinched_fingers_tone1 = "🤌🏻"; + constexpr const char[] pinched_fingers_light_skin_tone = "🤌🏻"; + constexpr const char[] pinched_fingers_tone3 = "🤌🏽"; + constexpr const char[] pinched_fingers_medium_skin_tone = "🤌🏽"; + constexpr const char[] pinched_fingers_tone4 = "🤌🏾"; + constexpr const char[] pinched_fingers_medium_dark_skin_tone = "🤌🏾"; + constexpr const char[] pinched_fingers_tone5 = "🤌🏿"; + constexpr const char[] pinched_fingers_dark_skin_tone = "🤌🏿"; + constexpr const char[] pinching_hand = "🤏"; + constexpr const char[] pinching_hand_tone1 = "🤏🏻"; + constexpr const char[] pinching_hand_light_skin_tone = "🤏🏻"; + constexpr const char[] pinching_hand_tone2 = "🤏🏼"; + constexpr const char[] pinching_hand_medium_light_skin_tone = "🤏🏼"; + constexpr const char[] pinching_hand_tone3 = "🤏🏽"; + constexpr const char[] pinching_hand_medium_skin_tone = "🤏🏽"; + constexpr const char[] pinching_hand_tone4 = "🤏🏾"; + constexpr const char[] pinching_hand_medium_dark_skin_tone = "🤏🏾"; + constexpr const char[] pinching_hand_tone5 = "🤏🏿"; + constexpr const char[] pinching_hand_dark_skin_tone = "🤏🏿"; + constexpr const char[] palm_down_hand = "🫳"; + constexpr const char[] palm_down_hand_tone1 = "🫳🏻"; + constexpr const char[] palm_down_hand_light_skin_tone = "🫳🏻"; + constexpr const char[] palm_down_hand_tone2 = "🫳🏼"; + constexpr const char[] palm_down_hand_medium_light_skin_tone = "🫳🏼"; + constexpr const char[] palm_down_hand_tone3 = "🫳🏽"; + constexpr const char[] palm_down_hand_medium_skin_tone = "🫳🏽"; + constexpr const char[] palm_down_hand_tone4 = "🫳🏾"; + constexpr const char[] palm_down_hand_medium_dark_skin_tone = "🫳🏾"; + constexpr const char[] palm_down_hand_tone5 = "🫳🏿"; + constexpr const char[] palm_down_hand_dark_skin_tone = "🫳🏿"; + constexpr const char[] palm_up_hand = "🫴"; + constexpr const char[] palm_up_hand_tone1 = "🫴🏻"; + constexpr const char[] palm_up_hand_light_skin_tone = "🫴🏻"; + constexpr const char[] palm_up_hand_tone2 = "🫴🏼"; + constexpr const char[] palm_up_hand_medium_light_skin_tone = "🫴🏼"; + constexpr const char[] palm_up_hand_tone3 = "🫴🏽"; + constexpr const char[] palm_up_hand_medium_skin_tone = "🫴🏽"; + constexpr const char[] palm_up_hand_tone4 = "🫴🏾"; + constexpr const char[] palm_up_hand_medium_dark_skin_tone = "🫴🏾"; + constexpr const char[] palm_up_hand_tone5 = "🫴🏿"; + constexpr const char[] palm_up_hand_dark_skin_tone = "🫴🏿"; + constexpr const char[] point_left = "👈"; + constexpr const char[] point_left_tone1 = "👈🏻"; + constexpr const char[] point_left_tone2 = "👈🏼"; + constexpr const char[] point_left_tone3 = "👈🏽"; + constexpr const char[] point_left_tone4 = "👈🏾"; + constexpr const char[] point_left_tone5 = "👈🏿"; + constexpr const char[] point_right = "👉"; + constexpr const char[] point_right_tone1 = "👉🏻"; + constexpr const char[] point_right_tone2 = "👉🏼"; + constexpr const char[] point_right_tone3 = "👉🏽"; + constexpr const char[] point_right_tone4 = "👉🏾"; + constexpr const char[] point_right_tone5 = "👉🏿"; + constexpr const char[] point_up_2 = "👆"; + constexpr const char[] point_up_2_tone1 = "👆🏻"; + constexpr const char[] point_up_2_tone2 = "👆🏼"; + constexpr const char[] point_up_2_tone3 = "👆🏽"; + constexpr const char[] point_up_2_tone4 = "👆🏾"; + constexpr const char[] point_up_2_tone5 = "👆🏿"; + constexpr const char[] point_down = "👇"; + constexpr const char[] point_down_tone1 = "👇🏻"; + constexpr const char[] point_down_tone2 = "👇🏼"; + constexpr const char[] point_down_tone3 = "👇🏽"; + constexpr const char[] point_down_tone4 = "👇🏾"; + constexpr const char[] point_down_tone5 = "👇🏿"; + constexpr const char[] point_up = "☝️"; + constexpr const char[] point_up_tone1 = "☝🏻"; + constexpr const char[] point_up_tone2 = "☝🏼"; + constexpr const char[] point_up_tone3 = "☝🏽"; + constexpr const char[] point_up_tone4 = "☝🏾"; + constexpr const char[] point_up_tone5 = "☝🏿"; + constexpr const char[] raised_hand = "✋"; + constexpr const char[] raised_hand_tone1 = "✋🏻"; + constexpr const char[] raised_hand_tone2 = "✋🏼"; + constexpr const char[] raised_hand_tone3 = "✋🏽"; + constexpr const char[] raised_hand_tone4 = "✋🏾"; + constexpr const char[] raised_hand_tone5 = "✋🏿"; + constexpr const char[] raised_back_of_hand = "🤚"; + constexpr const char[] back_of_hand = "🤚"; + constexpr const char[] raised_back_of_hand_tone1 = "🤚🏻"; + constexpr const char[] back_of_hand_tone1 = "🤚🏻"; + constexpr const char[] raised_back_of_hand_tone2 = "🤚🏼"; + constexpr const char[] back_of_hand_tone2 = "🤚🏼"; + constexpr const char[] raised_back_of_hand_tone3 = "🤚🏽"; + constexpr const char[] back_of_hand_tone3 = "🤚🏽"; + constexpr const char[] raised_back_of_hand_tone4 = "🤚🏾"; + constexpr const char[] back_of_hand_tone4 = "🤚🏾"; + constexpr const char[] raised_back_of_hand_tone5 = "🤚🏿"; + constexpr const char[] back_of_hand_tone5 = "🤚🏿"; + constexpr const char[] hand_splayed = "🖐️"; + constexpr const char[] raised_hand_with_fingers_splayed = "🖐️"; + constexpr const char[] hand_splayed_tone1 = "🖐🏻"; + constexpr const char[] raised_hand_with_fingers_splayed_tone1 = "🖐🏻"; + constexpr const char[] hand_splayed_tone2 = "🖐🏼"; + constexpr const char[] raised_hand_with_fingers_splayed_tone2 = "🖐🏼"; + constexpr const char[] hand_splayed_tone3 = "🖐🏽"; + constexpr const char[] raised_hand_with_fingers_splayed_tone3 = "🖐🏽"; + constexpr const char[] hand_splayed_tone4 = "🖐🏾"; + constexpr const char[] raised_hand_with_fingers_splayed_tone4 = "🖐🏾"; + constexpr const char[] hand_splayed_tone5 = "🖐🏿"; + constexpr const char[] raised_hand_with_fingers_splayed_tone5 = "🖐🏿"; + constexpr const char[] vulcan = "🖖"; + constexpr const char[] raised_hand_with_part_between_middle_and_ring_fingers = "🖖"; + constexpr const char[] vulcan_tone1 = "🖖🏻"; + constexpr const char[] raised_hand_with_part_between_middle_and_ring_fingers_tone1 = "🖖🏻"; + constexpr const char[] vulcan_tone2 = "🖖🏼"; + constexpr const char[] raised_hand_with_part_between_middle_and_ring_fingers_tone2 = "🖖🏼"; + constexpr const char[] vulcan_tone3 = "🖖🏽"; + constexpr const char[] raised_hand_with_part_between_middle_and_ring_fingers_tone3 = "🖖🏽"; + constexpr const char[] vulcan_tone4 = "🖖🏾"; + constexpr const char[] raised_hand_with_part_between_middle_and_ring_fingers_tone4 = "🖖🏾"; + constexpr const char[] vulcan_tone5 = "🖖🏿"; + constexpr const char[] raised_hand_with_part_between_middle_and_ring_fingers_tone5 = "🖖🏿"; + constexpr const char[] wave = "👋"; + constexpr const char[] wave_tone1 = "👋🏻"; + constexpr const char[] wave_tone2 = "👋🏼"; + constexpr const char[] wave_tone3 = "👋🏽"; + constexpr const char[] wave_tone4 = "👋🏾"; + constexpr const char[] wave_tone5 = "👋🏿"; + constexpr const char[] call_me = "🤙"; + constexpr const char[] call_me_hand = "🤙"; + constexpr const char[] call_me_tone1 = "🤙🏻"; + constexpr const char[] call_me_hand_tone1 = "🤙🏻"; + constexpr const char[] call_me_tone2 = "🤙🏼"; + constexpr const char[] call_me_hand_tone2 = "🤙🏼"; + constexpr const char[] call_me_tone3 = "🤙🏽"; + constexpr const char[] call_me_hand_tone3 = "🤙🏽"; + constexpr const char[] call_me_tone4 = "🤙🏾"; + constexpr const char[] call_me_hand_tone4 = "🤙🏾"; + constexpr const char[] call_me_tone5 = "🤙🏿"; + constexpr const char[] call_me_hand_tone5 = "🤙🏿"; + constexpr const char[] leftwards_hand = "🫲"; + constexpr const char[] leftwards_hand_tone1 = "🫲🏻"; + constexpr const char[] leftwards_hand_light_skin_tone = "🫲🏻"; + constexpr const char[] leftwards_hand_tone2 = "🫲🏼"; + constexpr const char[] leftwards_hand_medium_light_skin_tone = "🫲🏼"; + constexpr const char[] leftwards_hand_tone3 = "🫲🏽"; + constexpr const char[] leftwards_hand_medium_skin_tone = "🫲🏽"; + constexpr const char[] leftwards_hand_tone4 = "🫲🏾"; + constexpr const char[] leftwards_hand_medium_dark_skin_tone = "🫲🏾"; + constexpr const char[] leftwards_hand_tone5 = "🫲🏿"; + constexpr const char[] leftwards_hand_dark_skin_tone = "🫲🏿"; + constexpr const char[] rightwards_hand = "🫱"; + constexpr const char[] rightwards_hand_tone1 = "🫱🏻"; + constexpr const char[] rightwards_hand_light_skin_tone = "🫱🏻"; + constexpr const char[] rightwards_hand_tone2 = "🫱🏼"; + constexpr const char[] rightwards_hand_medium_light_skin_tone = "🫱🏼"; + constexpr const char[] rightwards_hand_tone3 = "🫱🏽"; + constexpr const char[] rightwards_hand_medium_skin_tone = "🫱🏽"; + constexpr const char[] rightwards_hand_tone4 = "🫱🏾"; + constexpr const char[] rightwards_hand_medium_dark_skin_tone = "🫱🏾"; + constexpr const char[] rightwards_hand_tone5 = "🫱🏿"; + constexpr const char[] rightwards_hand_dark_skin_tone = "🫱🏿"; + constexpr const char[] muscle = "💪"; + constexpr const char[] muscle_tone1 = "💪🏻"; + constexpr const char[] muscle_tone2 = "💪🏼"; + constexpr const char[] muscle_tone3 = "💪🏽"; + constexpr const char[] muscle_tone4 = "💪🏾"; + constexpr const char[] muscle_tone5 = "💪🏿"; + constexpr const char[] mechanical_arm = "🦾"; + constexpr const char[] middle_finger = "🖕"; + constexpr const char[] reversed_hand_with_middle_finger_extended = "🖕"; + constexpr const char[] middle_finger_tone1 = "🖕🏻"; + constexpr const char[] reversed_hand_with_middle_finger_extended_tone1 = "🖕🏻"; + constexpr const char[] middle_finger_tone2 = "🖕🏼"; + constexpr const char[] reversed_hand_with_middle_finger_extended_tone2 = "🖕🏼"; + constexpr const char[] middle_finger_tone3 = "🖕🏽"; + constexpr const char[] reversed_hand_with_middle_finger_extended_tone3 = "🖕🏽"; + constexpr const char[] middle_finger_tone4 = "🖕🏾"; + constexpr const char[] reversed_hand_with_middle_finger_extended_tone4 = "🖕🏾"; + constexpr const char[] middle_finger_tone5 = "🖕🏿"; + constexpr const char[] reversed_hand_with_middle_finger_extended_tone5 = "🖕🏿"; + constexpr const char[] writing_hand = "✍️"; + constexpr const char[] writing_hand_tone1 = "✍🏻"; + constexpr const char[] writing_hand_tone2 = "✍🏼"; + constexpr const char[] writing_hand_tone3 = "✍🏽"; + constexpr const char[] writing_hand_tone4 = "✍🏾"; + constexpr const char[] writing_hand_tone5 = "✍🏿"; + constexpr const char[] pray = "🙏"; + constexpr const char[] pray_tone1 = "🙏🏻"; + constexpr const char[] pray_tone2 = "🙏🏼"; + constexpr const char[] pray_tone3 = "🙏🏽"; + constexpr const char[] pray_tone4 = "🙏🏾"; + constexpr const char[] pray_tone5 = "🙏🏿"; + constexpr const char[] index_pointing_at_the_viewer = "🫵"; + constexpr const char[] index_pointing_at_the_viewer_tone1 = "🫵🏻"; + constexpr const char[] index_pointing_at_the_viewer_light_skin_tone = "🫵🏻"; + constexpr const char[] index_pointing_at_the_viewer_tone2 = "🫵🏼"; + constexpr const char[] index_pointing_at_the_viewer_medium_light_skin_tone = "🫵🏼"; + constexpr const char[] index_pointing_at_the_viewer_tone3 = "🫵🏽"; + constexpr const char[] index_pointing_at_the_viewer_medium_skin_tone = "🫵🏽"; + constexpr const char[] index_pointing_at_the_viewer_tone4 = "🫵🏾"; + constexpr const char[] index_pointing_at_the_viewer_medium_dark_skin_tone = "🫵🏾"; + constexpr const char[] index_pointing_at_the_viewer_tone5 = "🫵🏿"; + constexpr const char[] index_pointing_at_the_viewer_dark_skin_tone = "🫵🏿"; + constexpr const char[] foot = "🦶"; + constexpr const char[] foot_tone1 = "🦶🏻"; + constexpr const char[] foot_light_skin_tone = "🦶🏻"; + constexpr const char[] foot_tone2 = "🦶🏼"; + constexpr const char[] foot_medium_light_skin_tone = "🦶🏼"; + constexpr const char[] foot_tone3 = "🦶🏽"; + constexpr const char[] foot_medium_skin_tone = "🦶🏽"; + constexpr const char[] foot_tone4 = "🦶🏾"; + constexpr const char[] foot_medium_dark_skin_tone = "🦶🏾"; + constexpr const char[] foot_tone5 = "🦶🏿"; + constexpr const char[] foot_dark_skin_tone = "🦶🏿"; + constexpr const char[] leg = "🦵"; + constexpr const char[] leg_tone1 = "🦵🏻"; + constexpr const char[] leg_light_skin_tone = "🦵🏻"; + constexpr const char[] leg_tone2 = "🦵🏼"; + constexpr const char[] leg_medium_light_skin_tone = "🦵🏼"; + constexpr const char[] leg_tone3 = "🦵🏽"; + constexpr const char[] leg_medium_skin_tone = "🦵🏽"; + constexpr const char[] leg_tone4 = "🦵🏾"; + constexpr const char[] leg_medium_dark_skin_tone = "🦵🏾"; + constexpr const char[] leg_tone5 = "🦵🏿"; + constexpr const char[] leg_dark_skin_tone = "🦵🏿"; + constexpr const char[] mechanical_leg = "🦿"; + constexpr const char[] lipstick = "💄"; + constexpr const char[] kiss = "💋"; + constexpr const char[] lips = "👄"; + constexpr const char[] biting_lip = "🫦"; + constexpr const char[] tooth = "🦷"; + constexpr const char[] tongue = "👅"; + constexpr const char[] ear = "👂"; + constexpr const char[] ear_tone1 = "👂🏻"; + constexpr const char[] ear_tone2 = "👂🏼"; + constexpr const char[] ear_tone3 = "👂🏽"; + constexpr const char[] ear_tone4 = "👂🏾"; + constexpr const char[] ear_tone5 = "👂🏿"; + constexpr const char[] ear_with_hearing_aid = "🦻"; + constexpr const char[] ear_with_hearing_aid_tone1 = "🦻🏻"; + constexpr const char[] ear_with_hearing_aid_light_skin_tone = "🦻🏻"; + constexpr const char[] ear_with_hearing_aid_tone2 = "🦻🏼"; + constexpr const char[] ear_with_hearing_aid_medium_light_skin_tone = "🦻🏼"; + constexpr const char[] ear_with_hearing_aid_tone3 = "🦻🏽"; + constexpr const char[] ear_with_hearing_aid_medium_skin_tone = "🦻🏽"; + constexpr const char[] ear_with_hearing_aid_tone4 = "🦻🏾"; + constexpr const char[] ear_with_hearing_aid_medium_dark_skin_tone = "🦻🏾"; + constexpr const char[] ear_with_hearing_aid_tone5 = "🦻🏿"; + constexpr const char[] ear_with_hearing_aid_dark_skin_tone = "🦻🏿"; + constexpr const char[] nose = "👃"; + constexpr const char[] nose_tone1 = "👃🏻"; + constexpr const char[] nose_tone2 = "👃🏼"; + constexpr const char[] nose_tone3 = "👃🏽"; + constexpr const char[] nose_tone4 = "👃🏾"; + constexpr const char[] nose_tone5 = "👃🏿"; + constexpr const char[] footprints = "👣"; + constexpr const char[] eye = "👁️"; + constexpr const char[] eyes = "👀"; + constexpr const char[] anatomical_heart = "🫀"; + constexpr const char[] lungs = "🫁"; + constexpr const char[] brain = "🧠"; + constexpr const char[] speaking_head = "🗣️"; + constexpr const char[] speaking_head_in_silhouette = "🗣️"; + constexpr const char[] bust_in_silhouette = "👤"; + constexpr const char[] busts_in_silhouette = "👥"; + constexpr const char[] people_hugging = "🫂"; + constexpr const char[] baby = "👶"; + constexpr const char[] baby_tone1 = "👶🏻"; + constexpr const char[] baby_tone2 = "👶🏼"; + constexpr const char[] baby_tone3 = "👶🏽"; + constexpr const char[] baby_tone4 = "👶🏾"; + constexpr const char[] baby_tone5 = "👶🏿"; + constexpr const char[] child = "🧒"; + constexpr const char[] child_tone1 = "🧒🏻"; + constexpr const char[] child_light_skin_tone = "🧒🏻"; + constexpr const char[] child_tone2 = "🧒🏼"; + constexpr const char[] child_medium_light_skin_tone = "🧒🏼"; + constexpr const char[] child_tone3 = "🧒🏽"; + constexpr const char[] child_medium_skin_tone = "🧒🏽"; + constexpr const char[] child_tone4 = "🧒🏾"; + constexpr const char[] child_medium_dark_skin_tone = "🧒🏾"; + constexpr const char[] child_tone5 = "🧒🏿"; + constexpr const char[] child_dark_skin_tone = "🧒🏿"; + constexpr const char[] girl = "👧"; + constexpr const char[] girl_tone1 = "👧🏻"; + constexpr const char[] girl_tone2 = "👧🏼"; + constexpr const char[] girl_tone3 = "👧🏽"; + constexpr const char[] girl_tone4 = "👧🏾"; + constexpr const char[] girl_tone5 = "👧🏿"; + constexpr const char[] boy = "👦"; + constexpr const char[] boy_tone1 = "👦🏻"; + constexpr const char[] boy_tone2 = "👦🏼"; + constexpr const char[] boy_tone3 = "👦🏽"; + constexpr const char[] boy_tone4 = "👦🏾"; + constexpr const char[] boy_tone5 = "👦🏿"; + constexpr const char[] adult = "🧑"; + constexpr const char[] adult_tone1 = "🧑🏻"; + constexpr const char[] adult_light_skin_tone = "🧑🏻"; + constexpr const char[] adult_tone2 = "🧑🏼"; + constexpr const char[] adult_medium_light_skin_tone = "🧑🏼"; + constexpr const char[] adult_tone3 = "🧑🏽"; + constexpr const char[] adult_medium_skin_tone = "🧑🏽"; + constexpr const char[] adult_tone4 = "🧑🏾"; + constexpr const char[] adult_medium_dark_skin_tone = "🧑🏾"; + constexpr const char[] adult_tone5 = "🧑🏿"; + constexpr const char[] adult_dark_skin_tone = "🧑🏿"; + constexpr const char[] woman = "👩"; + constexpr const char[] woman_tone1 = "👩🏻"; + constexpr const char[] woman_tone2 = "👩🏼"; + constexpr const char[] woman_tone3 = "👩🏽"; + constexpr const char[] woman_tone4 = "👩🏾"; + constexpr const char[] woman_tone5 = "👩🏿"; + constexpr const char[] man = "👨"; + constexpr const char[] man_tone1 = "👨🏻"; + constexpr const char[] man_tone2 = "👨🏼"; + constexpr const char[] man_tone3 = "👨🏽"; + constexpr const char[] man_tone4 = "👨🏾"; + constexpr const char[] man_tone5 = "👨🏿"; + constexpr const char[] person_curly_hair = "🧑‍🦱"; + constexpr const char[] person_tone1_curly_hair = "🧑🏻‍🦱"; + constexpr const char[] person_light_skin_tone_curly_hair = "🧑🏻‍🦱"; + constexpr const char[] person_tone2_curly_hair = "🧑🏼‍🦱"; + constexpr const char[] person_medium_light_skin_tone_curly_hair = "🧑🏼‍🦱"; + constexpr const char[] person_tone3_curly_hair = "🧑🏽‍🦱"; + constexpr const char[] person_medium_skin_tone_curly_hair = "🧑🏽‍🦱"; + constexpr const char[] person_tone4_curly_hair = "🧑🏾‍🦱"; + constexpr const char[] person_medium_dark_skin_tone_curly_hair = "🧑🏾‍🦱"; + constexpr const char[] person_tone5_curly_hair = "🧑🏿‍🦱"; + constexpr const char[] person_dark_skin_tone_curly_hair = "🧑🏿‍🦱"; + constexpr const char[] woman_curly_haired = "👩‍🦱"; + constexpr const char[] woman_curly_haired_tone1 = "👩🏻‍🦱"; + constexpr const char[] woman_curly_haired_light_skin_tone = "👩🏻‍🦱"; + constexpr const char[] woman_curly_haired_tone2 = "👩🏼‍🦱"; + constexpr const char[] woman_curly_haired_medium_light_skin_tone = "👩🏼‍🦱"; + constexpr const char[] woman_curly_haired_tone3 = "👩🏽‍🦱"; + constexpr const char[] woman_curly_haired_medium_skin_tone = "👩🏽‍🦱"; + constexpr const char[] woman_curly_haired_tone4 = "👩🏾‍🦱"; + constexpr const char[] woman_curly_haired_medium_dark_skin_tone = "👩🏾‍🦱"; + constexpr const char[] woman_curly_haired_tone5 = "👩🏿‍🦱"; + constexpr const char[] woman_curly_haired_dark_skin_tone = "👩🏿‍🦱"; + constexpr const char[] man_curly_haired = "👨‍🦱"; + constexpr const char[] man_curly_haired_tone1 = "👨🏻‍🦱"; + constexpr const char[] man_curly_haired_light_skin_tone = "👨🏻‍🦱"; + constexpr const char[] man_curly_haired_tone2 = "👨🏼‍🦱"; + constexpr const char[] man_curly_haired_medium_light_skin_tone = "👨🏼‍🦱"; + constexpr const char[] man_curly_haired_tone3 = "👨🏽‍🦱"; + constexpr const char[] man_curly_haired_medium_skin_tone = "👨🏽‍🦱"; + constexpr const char[] man_curly_haired_tone4 = "👨🏾‍🦱"; + constexpr const char[] man_curly_haired_medium_dark_skin_tone = "👨🏾‍🦱"; + constexpr const char[] man_curly_haired_tone5 = "👨🏿‍🦱"; + constexpr const char[] man_curly_haired_dark_skin_tone = "👨🏿‍🦱"; + constexpr const char[] person_red_hair = "🧑‍🦰"; + constexpr const char[] person_tone1_red_hair = "🧑🏻‍🦰"; + constexpr const char[] person_light_skin_tone_red_hair = "🧑🏻‍🦰"; + constexpr const char[] person_tone2_red_hair = "🧑🏼‍🦰"; + constexpr const char[] person_medium_light_skin_tone_red_hair = "🧑🏼‍🦰"; + constexpr const char[] person_tone3_red_hair = "🧑🏽‍🦰"; + constexpr const char[] person_medium_skin_tone_red_hair = "🧑🏽‍🦰"; + constexpr const char[] person_tone4_red_hair = "🧑🏾‍🦰"; + constexpr const char[] person_medium_dark_skin_tone_red_hair = "🧑🏾‍🦰"; + constexpr const char[] person_tone5_red_hair = "🧑🏿‍🦰"; + constexpr const char[] person_dark_skin_tone_red_hair = "🧑🏿‍🦰"; + constexpr const char[] woman_red_haired = "👩‍🦰"; + constexpr const char[] woman_red_haired_tone1 = "👩🏻‍🦰"; + constexpr const char[] woman_red_haired_light_skin_tone = "👩🏻‍🦰"; + constexpr const char[] woman_red_haired_tone2 = "👩🏼‍🦰"; + constexpr const char[] woman_red_haired_medium_light_skin_tone = "👩🏼‍🦰"; + constexpr const char[] woman_red_haired_tone3 = "👩🏽‍🦰"; + constexpr const char[] woman_red_haired_medium_skin_tone = "👩🏽‍🦰"; + constexpr const char[] woman_red_haired_tone4 = "👩🏾‍🦰"; + constexpr const char[] woman_red_haired_medium_dark_skin_tone = "👩🏾‍🦰"; + constexpr const char[] woman_red_haired_tone5 = "👩🏿‍🦰"; + constexpr const char[] woman_red_haired_dark_skin_tone = "👩🏿‍🦰"; + constexpr const char[] man_red_haired = "👨‍🦰"; + constexpr const char[] man_red_haired_tone1 = "👨🏻‍🦰"; + constexpr const char[] man_red_haired_light_skin_tone = "👨🏻‍🦰"; + constexpr const char[] man_red_haired_tone2 = "👨🏼‍🦰"; + constexpr const char[] man_red_haired_medium_light_skin_tone = "👨🏼‍🦰"; + constexpr const char[] man_red_haired_tone3 = "👨🏽‍🦰"; + constexpr const char[] man_red_haired_medium_skin_tone = "👨🏽‍🦰"; + constexpr const char[] man_red_haired_tone4 = "👨🏾‍🦰"; + constexpr const char[] man_red_haired_medium_dark_skin_tone = "👨🏾‍🦰"; + constexpr const char[] man_red_haired_tone5 = "👨🏿‍🦰"; + constexpr const char[] man_red_haired_dark_skin_tone = "👨🏿‍🦰"; + constexpr const char[] blond_haired_person = "👱"; + constexpr const char[] person_with_blond_hair = "👱"; + constexpr const char[] blond_haired_person_tone1 = "👱🏻"; + constexpr const char[] person_with_blond_hair_tone1 = "👱🏻"; + constexpr const char[] blond_haired_person_tone2 = "👱🏼"; + constexpr const char[] person_with_blond_hair_tone2 = "👱🏼"; + constexpr const char[] blond_haired_person_tone3 = "👱🏽"; + constexpr const char[] person_with_blond_hair_tone3 = "👱🏽"; + constexpr const char[] blond_haired_person_tone4 = "👱🏾"; + constexpr const char[] person_with_blond_hair_tone4 = "👱🏾"; + constexpr const char[] blond_haired_person_tone5 = "👱🏿"; + constexpr const char[] person_with_blond_hair_tone5 = "👱🏿"; + constexpr const char[] blond_haired_woman = "👱‍♀️"; + constexpr const char[] blond_haired_woman_tone1 = "👱🏻‍♀️"; + constexpr const char[] blond_haired_woman_light_skin_tone = "👱🏻‍♀️"; + constexpr const char[] blond_haired_woman_tone2 = "👱🏼‍♀️"; + constexpr const char[] blond_haired_woman_medium_light_skin_tone = "👱🏼‍♀️"; + constexpr const char[] blond_haired_woman_tone3 = "👱🏽‍♀️"; + constexpr const char[] blond_haired_woman_medium_skin_tone = "👱🏽‍♀️"; + constexpr const char[] blond_haired_woman_tone4 = "👱🏾‍♀️"; + constexpr const char[] blond_haired_woman_medium_dark_skin_tone = "👱🏾‍♀️"; + constexpr const char[] blond_haired_woman_tone5 = "👱🏿‍♀️"; + constexpr const char[] blond_haired_woman_dark_skin_tone = "👱🏿‍♀️"; + constexpr const char[] blond_haired_man = "👱‍♂️"; + constexpr const char[] blond_haired_man_tone1 = "👱🏻‍♂️"; + constexpr const char[] blond_haired_man_light_skin_tone = "👱🏻‍♂️"; + constexpr const char[] blond_haired_man_tone2 = "👱🏼‍♂️"; + constexpr const char[] blond_haired_man_medium_light_skin_tone = "👱🏼‍♂️"; + constexpr const char[] blond_haired_man_tone3 = "👱🏽‍♂️"; + constexpr const char[] blond_haired_man_medium_skin_tone = "👱🏽‍♂️"; + constexpr const char[] blond_haired_man_tone4 = "👱🏾‍♂️"; + constexpr const char[] blond_haired_man_medium_dark_skin_tone = "👱🏾‍♂️"; + constexpr const char[] blond_haired_man_tone5 = "👱🏿‍♂️"; + constexpr const char[] blond_haired_man_dark_skin_tone = "👱🏿‍♂️"; + constexpr const char[] person_white_hair = "🧑‍🦳"; + constexpr const char[] person_tone1_white_hair = "🧑🏻‍🦳"; + constexpr const char[] person_light_skin_tone_white_hair = "🧑🏻‍🦳"; + constexpr const char[] person_tone2_white_hair = "🧑🏼‍🦳"; + constexpr const char[] person_medium_light_skin_tone_white_hair = "🧑🏼‍🦳"; + constexpr const char[] person_tone3_white_hair = "🧑🏽‍🦳"; + constexpr const char[] person_medium_skin_tone_white_hair = "🧑🏽‍🦳"; + constexpr const char[] person_tone4_white_hair = "🧑🏾‍🦳"; + constexpr const char[] person_medium_dark_skin_tone_white_hair = "🧑🏾‍🦳"; + constexpr const char[] person_tone5_white_hair = "🧑🏿‍🦳"; + constexpr const char[] person_dark_skin_tone_white_hair = "🧑🏿‍🦳"; + constexpr const char[] woman_white_haired = "👩‍🦳"; + constexpr const char[] woman_white_haired_tone1 = "👩🏻‍🦳"; + constexpr const char[] woman_white_haired_light_skin_tone = "👩🏻‍🦳"; + constexpr const char[] woman_white_haired_tone2 = "👩🏼‍🦳"; + constexpr const char[] woman_white_haired_medium_light_skin_tone = "👩🏼‍🦳"; + constexpr const char[] woman_white_haired_tone3 = "👩🏽‍🦳"; + constexpr const char[] woman_white_haired_medium_skin_tone = "👩🏽‍🦳"; + constexpr const char[] woman_white_haired_tone4 = "👩🏾‍🦳"; + constexpr const char[] woman_white_haired_medium_dark_skin_tone = "👩🏾‍🦳"; + constexpr const char[] woman_white_haired_tone5 = "👩🏿‍🦳"; + constexpr const char[] woman_white_haired_dark_skin_tone = "👩🏿‍🦳"; + constexpr const char[] man_white_haired = "👨‍🦳"; + constexpr const char[] man_white_haired_tone1 = "👨🏻‍🦳"; + constexpr const char[] man_white_haired_light_skin_tone = "👨🏻‍🦳"; + constexpr const char[] man_white_haired_tone2 = "👨🏼‍🦳"; + constexpr const char[] man_white_haired_medium_light_skin_tone = "👨🏼‍🦳"; + constexpr const char[] man_white_haired_tone3 = "👨🏽‍🦳"; + constexpr const char[] man_white_haired_medium_skin_tone = "👨🏽‍🦳"; + constexpr const char[] man_white_haired_tone4 = "👨🏾‍🦳"; + constexpr const char[] man_white_haired_medium_dark_skin_tone = "👨🏾‍🦳"; + constexpr const char[] man_white_haired_tone5 = "👨🏿‍🦳"; + constexpr const char[] man_white_haired_dark_skin_tone = "👨🏿‍🦳"; + constexpr const char[] person_bald = "🧑‍🦲"; + constexpr const char[] person_tone1_bald = "🧑🏻‍🦲"; + constexpr const char[] person_light_skin_tone_bald = "🧑🏻‍🦲"; + constexpr const char[] person_tone2_bald = "🧑🏼‍🦲"; + constexpr const char[] person_medium_light_skin_tone_bald = "🧑🏼‍🦲"; + constexpr const char[] person_tone3_bald = "🧑🏽‍🦲"; + constexpr const char[] person_medium_skin_tone_bald = "🧑🏽‍🦲"; + constexpr const char[] person_tone4_bald = "🧑🏾‍🦲"; + constexpr const char[] person_medium_dark_skin_tone_bald = "🧑🏾‍🦲"; + constexpr const char[] person_tone5_bald = "🧑🏿‍🦲"; + constexpr const char[] person_dark_skin_tone_bald = "🧑🏿‍🦲"; + constexpr const char[] woman_bald = "👩‍🦲"; + constexpr const char[] woman_bald_tone1 = "👩🏻‍🦲"; + constexpr const char[] woman_bald_light_skin_tone = "👩🏻‍🦲"; + constexpr const char[] woman_bald_tone2 = "👩🏼‍🦲"; + constexpr const char[] woman_bald_medium_light_skin_tone = "👩🏼‍🦲"; + constexpr const char[] woman_bald_tone3 = "👩🏽‍🦲"; + constexpr const char[] woman_bald_medium_skin_tone = "👩🏽‍🦲"; + constexpr const char[] woman_bald_tone4 = "👩🏾‍🦲"; + constexpr const char[] woman_bald_medium_dark_skin_tone = "👩🏾‍🦲"; + constexpr const char[] woman_bald_tone5 = "👩🏿‍🦲"; + constexpr const char[] woman_bald_dark_skin_tone = "👩🏿‍🦲"; + constexpr const char[] man_bald = "👨‍🦲"; + constexpr const char[] man_bald_tone1 = "👨🏻‍🦲"; + constexpr const char[] man_bald_light_skin_tone = "👨🏻‍🦲"; + constexpr const char[] man_bald_tone2 = "👨🏼‍🦲"; + constexpr const char[] man_bald_medium_light_skin_tone = "👨🏼‍🦲"; + constexpr const char[] man_bald_tone3 = "👨🏽‍🦲"; + constexpr const char[] man_bald_medium_skin_tone = "👨🏽‍🦲"; + constexpr const char[] man_bald_tone4 = "👨🏾‍🦲"; + constexpr const char[] man_bald_medium_dark_skin_tone = "👨🏾‍🦲"; + constexpr const char[] man_bald_tone5 = "👨🏿‍🦲"; + constexpr const char[] man_bald_dark_skin_tone = "👨🏿‍🦲"; + constexpr const char[] bearded_person = "🧔"; + constexpr const char[] bearded_person_tone1 = "🧔🏻"; + constexpr const char[] bearded_person_light_skin_tone = "🧔🏻"; + constexpr const char[] bearded_person_tone2 = "🧔🏼"; + constexpr const char[] bearded_person_medium_light_skin_tone = "🧔🏼"; + constexpr const char[] bearded_person_tone3 = "🧔🏽"; + constexpr const char[] bearded_person_medium_skin_tone = "🧔🏽"; + constexpr const char[] bearded_person_tone4 = "🧔🏾"; + constexpr const char[] bearded_person_medium_dark_skin_tone = "🧔🏾"; + constexpr const char[] bearded_person_tone5 = "🧔🏿"; + constexpr const char[] bearded_person_dark_skin_tone = "🧔🏿"; + constexpr const char[] woman_beard = "🧔‍♀️"; + constexpr const char[] woman_tone1_beard = "🧔🏻‍♀️"; + constexpr const char[] woman_light_skin_tone_beard = "🧔🏻‍♀️"; + constexpr const char[] woman_tone2_beard = "🧔🏼‍♀️"; + constexpr const char[] woman_medium_light_skin_tone_beard = "🧔🏼‍♀️"; + constexpr const char[] woman_tone3_beard = "🧔🏽‍♀️"; + constexpr const char[] woman_medium_skin_tone_beard = "🧔🏽‍♀️"; + constexpr const char[] woman_tone4_beard = "🧔🏾‍♀️"; + constexpr const char[] woman_medium_dark_skin_tone_beard = "🧔🏾‍♀️"; + constexpr const char[] woman_tone5_beard = "🧔🏿‍♀️"; + constexpr const char[] woman_dark_skin_tone_beard = "🧔🏿‍♀️"; + constexpr const char[] man_beard = "🧔‍♂️"; + constexpr const char[] man_tone1_beard = "🧔🏻‍♂️"; + constexpr const char[] man_light_skin_tone_beard = "🧔🏻‍♂️"; + constexpr const char[] man_tone2_beard = "🧔🏼‍♂️"; + constexpr const char[] man_medium_light_skin_tone_beard = "🧔🏼‍♂️"; + constexpr const char[] man_tone3_beard = "🧔🏽‍♂️"; + constexpr const char[] man_medium_skin_tone_beard = "🧔🏽‍♂️"; + constexpr const char[] man_tone4_beard = "🧔🏾‍♂️"; + constexpr const char[] man_medium_dark_skin_tone_beard = "🧔🏾‍♂️"; + constexpr const char[] man_tone5_beard = "🧔🏿‍♂️"; + constexpr const char[] man_dark_skin_tone_beard = "🧔🏿‍♂️"; + constexpr const char[] older_adult = "🧓"; + constexpr const char[] older_adult_tone1 = "🧓🏻"; + constexpr const char[] older_adult_light_skin_tone = "🧓🏻"; + constexpr const char[] older_adult_tone2 = "🧓🏼"; + constexpr const char[] older_adult_medium_light_skin_tone = "🧓🏼"; + constexpr const char[] older_adult_tone3 = "🧓🏽"; + constexpr const char[] older_adult_medium_skin_tone = "🧓🏽"; + constexpr const char[] older_adult_tone4 = "🧓🏾"; + constexpr const char[] older_adult_medium_dark_skin_tone = "🧓🏾"; + constexpr const char[] older_adult_tone5 = "🧓🏿"; + constexpr const char[] older_adult_dark_skin_tone = "🧓🏿"; + constexpr const char[] older_woman = "👵"; + constexpr const char[] grandma = "👵"; + constexpr const char[] older_woman_tone1 = "👵🏻"; + constexpr const char[] grandma_tone1 = "👵🏻"; + constexpr const char[] older_woman_tone2 = "👵🏼"; + constexpr const char[] grandma_tone2 = "👵🏼"; + constexpr const char[] older_woman_tone3 = "👵🏽"; + constexpr const char[] grandma_tone3 = "👵🏽"; + constexpr const char[] older_woman_tone4 = "👵🏾"; + constexpr const char[] grandma_tone4 = "👵🏾"; + constexpr const char[] older_woman_tone5 = "👵🏿"; + constexpr const char[] grandma_tone5 = "👵🏿"; + constexpr const char[] older_man = "👴"; + constexpr const char[] older_man_tone1 = "👴🏻"; + constexpr const char[] older_man_tone2 = "👴🏼"; + constexpr const char[] older_man_tone3 = "👴🏽"; + constexpr const char[] older_man_tone4 = "👴🏾"; + constexpr const char[] older_man_tone5 = "👴🏿"; + constexpr const char[] man_with_chinese_cap = "👲"; + constexpr const char[] man_with_gua_pi_mao = "👲"; + constexpr const char[] man_with_chinese_cap_tone1 = "👲🏻"; + constexpr const char[] man_with_gua_pi_mao_tone1 = "👲🏻"; + constexpr const char[] man_with_chinese_cap_tone2 = "👲🏼"; + constexpr const char[] man_with_gua_pi_mao_tone2 = "👲🏼"; + constexpr const char[] man_with_chinese_cap_tone3 = "👲🏽"; + constexpr const char[] man_with_gua_pi_mao_tone3 = "👲🏽"; + constexpr const char[] man_with_chinese_cap_tone4 = "👲🏾"; + constexpr const char[] man_with_gua_pi_mao_tone4 = "👲🏾"; + constexpr const char[] man_with_chinese_cap_tone5 = "👲🏿"; + constexpr const char[] man_with_gua_pi_mao_tone5 = "👲🏿"; + constexpr const char[] person_wearing_turban = "👳"; + constexpr const char[] man_with_turban = "👳"; + constexpr const char[] person_wearing_turban_tone1 = "👳🏻"; + constexpr const char[] man_with_turban_tone1 = "👳🏻"; + constexpr const char[] person_wearing_turban_tone2 = "👳🏼"; + constexpr const char[] man_with_turban_tone2 = "👳🏼"; + constexpr const char[] person_wearing_turban_tone3 = "👳🏽"; + constexpr const char[] man_with_turban_tone3 = "👳🏽"; + constexpr const char[] person_wearing_turban_tone4 = "👳🏾"; + constexpr const char[] man_with_turban_tone4 = "👳🏾"; + constexpr const char[] person_wearing_turban_tone5 = "👳🏿"; + constexpr const char[] man_with_turban_tone5 = "👳🏿"; + constexpr const char[] woman_wearing_turban = "👳‍♀️"; + constexpr const char[] woman_wearing_turban_tone1 = "👳🏻‍♀️"; + constexpr const char[] woman_wearing_turban_light_skin_tone = "👳🏻‍♀️"; + constexpr const char[] woman_wearing_turban_tone2 = "👳🏼‍♀️"; + constexpr const char[] woman_wearing_turban_medium_light_skin_tone = "👳🏼‍♀️"; + constexpr const char[] woman_wearing_turban_tone3 = "👳🏽‍♀️"; + constexpr const char[] woman_wearing_turban_medium_skin_tone = "👳🏽‍♀️"; + constexpr const char[] woman_wearing_turban_tone4 = "👳🏾‍♀️"; + constexpr const char[] woman_wearing_turban_medium_dark_skin_tone = "👳🏾‍♀️"; + constexpr const char[] woman_wearing_turban_tone5 = "👳🏿‍♀️"; + constexpr const char[] woman_wearing_turban_dark_skin_tone = "👳🏿‍♀️"; + constexpr const char[] man_wearing_turban = "👳‍♂️"; + constexpr const char[] man_wearing_turban_tone1 = "👳🏻‍♂️"; + constexpr const char[] man_wearing_turban_light_skin_tone = "👳🏻‍♂️"; + constexpr const char[] man_wearing_turban_tone2 = "👳🏼‍♂️"; + constexpr const char[] man_wearing_turban_medium_light_skin_tone = "👳🏼‍♂️"; + constexpr const char[] man_wearing_turban_tone3 = "👳🏽‍♂️"; + constexpr const char[] man_wearing_turban_medium_skin_tone = "👳🏽‍♂️"; + constexpr const char[] man_wearing_turban_tone4 = "👳🏾‍♂️"; + constexpr const char[] man_wearing_turban_medium_dark_skin_tone = "👳🏾‍♂️"; + constexpr const char[] man_wearing_turban_tone5 = "👳🏿‍♂️"; + constexpr const char[] man_wearing_turban_dark_skin_tone = "👳🏿‍♂️"; + constexpr const char[] woman_with_headscarf = "🧕"; + constexpr const char[] woman_with_headscarf_tone1 = "🧕🏻"; + constexpr const char[] woman_with_headscarf_light_skin_tone = "🧕🏻"; + constexpr const char[] woman_with_headscarf_tone2 = "🧕🏼"; + constexpr const char[] woman_with_headscarf_medium_light_skin_tone = "🧕🏼"; + constexpr const char[] woman_with_headscarf_tone3 = "🧕🏽"; + constexpr const char[] woman_with_headscarf_medium_skin_tone = "🧕🏽"; + constexpr const char[] woman_with_headscarf_tone4 = "🧕🏾"; + constexpr const char[] woman_with_headscarf_medium_dark_skin_tone = "🧕🏾"; + constexpr const char[] woman_with_headscarf_tone5 = "🧕🏿"; + constexpr const char[] woman_with_headscarf_dark_skin_tone = "🧕🏿"; + constexpr const char[] police_officer = "👮"; + constexpr const char[] cop = "👮"; + constexpr const char[] police_officer_tone1 = "👮🏻"; + constexpr const char[] cop_tone1 = "👮🏻"; + constexpr const char[] police_officer_tone2 = "👮🏼"; + constexpr const char[] cop_tone2 = "👮🏼"; + constexpr const char[] police_officer_tone3 = "👮🏽"; + constexpr const char[] cop_tone3 = "👮🏽"; + constexpr const char[] police_officer_tone4 = "👮🏾"; + constexpr const char[] cop_tone4 = "👮🏾"; + constexpr const char[] police_officer_tone5 = "👮🏿"; + constexpr const char[] cop_tone5 = "👮🏿"; + constexpr const char[] woman_police_officer = "👮‍♀️"; + constexpr const char[] woman_police_officer_tone1 = "👮🏻‍♀️"; + constexpr const char[] woman_police_officer_light_skin_tone = "👮🏻‍♀️"; + constexpr const char[] woman_police_officer_tone2 = "👮🏼‍♀️"; + constexpr const char[] woman_police_officer_medium_light_skin_tone = "👮🏼‍♀️"; + constexpr const char[] woman_police_officer_tone3 = "👮🏽‍♀️"; + constexpr const char[] woman_police_officer_medium_skin_tone = "👮🏽‍♀️"; + constexpr const char[] woman_police_officer_tone4 = "👮🏾‍♀️"; + constexpr const char[] woman_police_officer_medium_dark_skin_tone = "👮🏾‍♀️"; + constexpr const char[] woman_police_officer_tone5 = "👮🏿‍♀️"; + constexpr const char[] woman_police_officer_dark_skin_tone = "👮🏿‍♀️"; + constexpr const char[] man_police_officer = "👮‍♂️"; + constexpr const char[] man_police_officer_tone1 = "👮🏻‍♂️"; + constexpr const char[] man_police_officer_light_skin_tone = "👮🏻‍♂️"; + constexpr const char[] man_police_officer_tone2 = "👮🏼‍♂️"; + constexpr const char[] man_police_officer_medium_light_skin_tone = "👮🏼‍♂️"; + constexpr const char[] man_police_officer_tone3 = "👮🏽‍♂️"; + constexpr const char[] man_police_officer_medium_skin_tone = "👮🏽‍♂️"; + constexpr const char[] man_police_officer_tone4 = "👮🏾‍♂️"; + constexpr const char[] man_police_officer_medium_dark_skin_tone = "👮🏾‍♂️"; + constexpr const char[] man_police_officer_tone5 = "👮🏿‍♂️"; + constexpr const char[] man_police_officer_dark_skin_tone = "👮🏿‍♂️"; + constexpr const char[] construction_worker = "👷"; + constexpr const char[] construction_worker_tone1 = "👷🏻"; + constexpr const char[] construction_worker_tone2 = "👷🏼"; + constexpr const char[] construction_worker_tone3 = "👷🏽"; + constexpr const char[] construction_worker_tone4 = "👷🏾"; + constexpr const char[] construction_worker_tone5 = "👷🏿"; + constexpr const char[] woman_construction_worker = "👷‍♀️"; + constexpr const char[] woman_construction_worker_tone1 = "👷🏻‍♀️"; + constexpr const char[] woman_construction_worker_light_skin_tone = "👷🏻‍♀️"; + constexpr const char[] woman_construction_worker_tone2 = "👷🏼‍♀️"; + constexpr const char[] woman_construction_worker_medium_light_skin_tone = "👷🏼‍♀️"; + constexpr const char[] woman_construction_worker_tone3 = "👷🏽‍♀️"; + constexpr const char[] woman_construction_worker_medium_skin_tone = "👷🏽‍♀️"; + constexpr const char[] woman_construction_worker_tone4 = "👷🏾‍♀️"; + constexpr const char[] woman_construction_worker_medium_dark_skin_tone = "👷🏾‍♀️"; + constexpr const char[] woman_construction_worker_tone5 = "👷🏿‍♀️"; + constexpr const char[] woman_construction_worker_dark_skin_tone = "👷🏿‍♀️"; + constexpr const char[] man_construction_worker = "👷‍♂️"; + constexpr const char[] man_construction_worker_tone1 = "👷🏻‍♂️"; + constexpr const char[] man_construction_worker_light_skin_tone = "👷🏻‍♂️"; + constexpr const char[] man_construction_worker_tone2 = "👷🏼‍♂️"; + constexpr const char[] man_construction_worker_medium_light_skin_tone = "👷🏼‍♂️"; + constexpr const char[] man_construction_worker_tone3 = "👷🏽‍♂️"; + constexpr const char[] man_construction_worker_medium_skin_tone = "👷🏽‍♂️"; + constexpr const char[] man_construction_worker_tone4 = "👷🏾‍♂️"; + constexpr const char[] man_construction_worker_medium_dark_skin_tone = "👷🏾‍♂️"; + constexpr const char[] man_construction_worker_tone5 = "👷🏿‍♂️"; + constexpr const char[] man_construction_worker_dark_skin_tone = "👷🏿‍♂️"; + constexpr const char[] guard = "💂"; + constexpr const char[] guardsman = "💂"; + constexpr const char[] guard_tone1 = "💂🏻"; + constexpr const char[] guardsman_tone1 = "💂🏻"; + constexpr const char[] guard_tone2 = "💂🏼"; + constexpr const char[] guardsman_tone2 = "💂🏼"; + constexpr const char[] guard_tone3 = "💂🏽"; + constexpr const char[] guardsman_tone3 = "💂🏽"; + constexpr const char[] guard_tone4 = "💂🏾"; + constexpr const char[] guardsman_tone4 = "💂🏾"; + constexpr const char[] guard_tone5 = "💂🏿"; + constexpr const char[] guardsman_tone5 = "💂🏿"; + constexpr const char[] woman_guard = "💂‍♀️"; + constexpr const char[] woman_guard_tone1 = "💂🏻‍♀️"; + constexpr const char[] woman_guard_light_skin_tone = "💂🏻‍♀️"; + constexpr const char[] woman_guard_tone2 = "💂🏼‍♀️"; + constexpr const char[] woman_guard_medium_light_skin_tone = "💂🏼‍♀️"; + constexpr const char[] woman_guard_tone3 = "💂🏽‍♀️"; + constexpr const char[] woman_guard_medium_skin_tone = "💂🏽‍♀️"; + constexpr const char[] woman_guard_tone4 = "💂🏾‍♀️"; + constexpr const char[] woman_guard_medium_dark_skin_tone = "💂🏾‍♀️"; + constexpr const char[] woman_guard_tone5 = "💂🏿‍♀️"; + constexpr const char[] woman_guard_dark_skin_tone = "💂🏿‍♀️"; + constexpr const char[] man_guard = "💂‍♂️"; + constexpr const char[] man_guard_tone1 = "💂🏻‍♂️"; + constexpr const char[] man_guard_light_skin_tone = "💂🏻‍♂️"; + constexpr const char[] man_guard_tone2 = "💂🏼‍♂️"; + constexpr const char[] man_guard_medium_light_skin_tone = "💂🏼‍♂️"; + constexpr const char[] man_guard_tone3 = "💂🏽‍♂️"; + constexpr const char[] man_guard_medium_skin_tone = "💂🏽‍♂️"; + constexpr const char[] man_guard_tone4 = "💂🏾‍♂️"; + constexpr const char[] man_guard_medium_dark_skin_tone = "💂🏾‍♂️"; + constexpr const char[] man_guard_tone5 = "💂🏿‍♂️"; + constexpr const char[] man_guard_dark_skin_tone = "💂🏿‍♂️"; + constexpr const char[] detective = "🕵️"; + constexpr const char[] spy = "🕵️"; + constexpr const char[] sleuth_or_spy = "🕵️"; + constexpr const char[] detective_tone1 = "🕵🏻"; + constexpr const char[] spy_tone1 = "🕵🏻"; + constexpr const char[] sleuth_or_spy_tone1 = "🕵🏻"; + constexpr const char[] detective_tone2 = "🕵🏼"; + constexpr const char[] spy_tone2 = "🕵🏼"; + constexpr const char[] sleuth_or_spy_tone2 = "🕵🏼"; + constexpr const char[] detective_tone3 = "🕵🏽"; + constexpr const char[] spy_tone3 = "🕵🏽"; + constexpr const char[] sleuth_or_spy_tone3 = "🕵🏽"; + constexpr const char[] detective_tone4 = "🕵🏾"; + constexpr const char[] spy_tone4 = "🕵🏾"; + constexpr const char[] sleuth_or_spy_tone4 = "🕵🏾"; + constexpr const char[] detective_tone5 = "🕵🏿"; + constexpr const char[] spy_tone5 = "🕵🏿"; + constexpr const char[] sleuth_or_spy_tone5 = "🕵🏿"; + constexpr const char[] woman_detective = "🕵️‍♀️"; + constexpr const char[] woman_detective_tone1 = "🕵🏻‍♀️"; + constexpr const char[] woman_detective_light_skin_tone = "🕵🏻‍♀️"; + constexpr const char[] woman_detective_tone2 = "🕵🏼‍♀️"; + constexpr const char[] woman_detective_medium_light_skin_tone = "🕵🏼‍♀️"; + constexpr const char[] woman_detective_tone3 = "🕵🏽‍♀️"; + constexpr const char[] woman_detective_medium_skin_tone = "🕵🏽‍♀️"; + constexpr const char[] woman_detective_tone4 = "🕵🏾‍♀️"; + constexpr const char[] woman_detective_medium_dark_skin_tone = "🕵🏾‍♀️"; + constexpr const char[] woman_detective_tone5 = "🕵🏿‍♀️"; + constexpr const char[] woman_detective_dark_skin_tone = "🕵🏿‍♀️"; + constexpr const char[] man_detective = "🕵️‍♂️"; + constexpr const char[] man_detective_tone1 = "🕵🏻‍♂️"; + constexpr const char[] man_detective_light_skin_tone = "🕵🏻‍♂️"; + constexpr const char[] man_detective_tone2 = "🕵🏼‍♂️"; + constexpr const char[] man_detective_medium_light_skin_tone = "🕵🏼‍♂️"; + constexpr const char[] man_detective_tone3 = "🕵🏽‍♂️"; + constexpr const char[] man_detective_medium_skin_tone = "🕵🏽‍♂️"; + constexpr const char[] man_detective_tone4 = "🕵🏾‍♂️"; + constexpr const char[] man_detective_medium_dark_skin_tone = "🕵🏾‍♂️"; + constexpr const char[] man_detective_tone5 = "🕵🏿‍♂️"; + constexpr const char[] man_detective_dark_skin_tone = "🕵🏿‍♂️"; + constexpr const char[] health_worker = "🧑‍⚕️"; + constexpr const char[] health_worker_tone1 = "🧑🏻‍⚕️"; + constexpr const char[] health_worker_light_skin_tone = "🧑🏻‍⚕️"; + constexpr const char[] health_worker_tone2 = "🧑🏼‍⚕️"; + constexpr const char[] health_worker_medium_light_skin_tone = "🧑🏼‍⚕️"; + constexpr const char[] health_worker_tone3 = "🧑🏽‍⚕️"; + constexpr const char[] health_worker_medium_skin_tone = "🧑🏽‍⚕️"; + constexpr const char[] health_worker_tone4 = "🧑🏾‍⚕️"; + constexpr const char[] health_worker_medium_dark_skin_tone = "🧑🏾‍⚕️"; + constexpr const char[] health_worker_tone5 = "🧑🏿‍⚕️"; + constexpr const char[] health_worker_dark_skin_tone = "🧑🏿‍⚕️"; + constexpr const char[] woman_health_worker = "👩‍⚕️"; + constexpr const char[] woman_health_worker_tone1 = "👩🏻‍⚕️"; + constexpr const char[] woman_health_worker_light_skin_tone = "👩🏻‍⚕️"; + constexpr const char[] woman_health_worker_tone2 = "👩🏼‍⚕️"; + constexpr const char[] woman_health_worker_medium_light_skin_tone = "👩🏼‍⚕️"; + constexpr const char[] woman_health_worker_tone3 = "👩🏽‍⚕️"; + constexpr const char[] woman_health_worker_medium_skin_tone = "👩🏽‍⚕️"; + constexpr const char[] woman_health_worker_tone4 = "👩🏾‍⚕️"; + constexpr const char[] woman_health_worker_medium_dark_skin_tone = "👩🏾‍⚕️"; + constexpr const char[] woman_health_worker_tone5 = "👩🏿‍⚕️"; + constexpr const char[] woman_health_worker_dark_skin_tone = "👩🏿‍⚕️"; + constexpr const char[] man_health_worker = "👨‍⚕️"; + constexpr const char[] man_health_worker_tone1 = "👨🏻‍⚕️"; + constexpr const char[] man_health_worker_light_skin_tone = "👨🏻‍⚕️"; + constexpr const char[] man_health_worker_tone2 = "👨🏼‍⚕️"; + constexpr const char[] man_health_worker_medium_light_skin_tone = "👨🏼‍⚕️"; + constexpr const char[] man_health_worker_tone3 = "👨🏽‍⚕️"; + constexpr const char[] man_health_worker_medium_skin_tone = "👨🏽‍⚕️"; + constexpr const char[] man_health_worker_tone4 = "👨🏾‍⚕️"; + constexpr const char[] man_health_worker_medium_dark_skin_tone = "👨🏾‍⚕️"; + constexpr const char[] man_health_worker_tone5 = "👨🏿‍⚕️"; + constexpr const char[] man_health_worker_dark_skin_tone = "👨🏿‍⚕️"; + constexpr const char[] farmer = "🧑‍🌾"; + constexpr const char[] farmer_tone1 = "🧑🏻‍🌾"; + constexpr const char[] farmer_light_skin_tone = "🧑🏻‍🌾"; + constexpr const char[] farmer_tone2 = "🧑🏼‍🌾"; + constexpr const char[] farmer_medium_light_skin_tone = "🧑🏼‍🌾"; + constexpr const char[] farmer_tone3 = "🧑🏽‍🌾"; + constexpr const char[] farmer_medium_skin_tone = "🧑🏽‍🌾"; + constexpr const char[] farmer_tone4 = "🧑🏾‍🌾"; + constexpr const char[] farmer_medium_dark_skin_tone = "🧑🏾‍🌾"; + constexpr const char[] farmer_tone5 = "🧑🏿‍🌾"; + constexpr const char[] farmer_dark_skin_tone = "🧑🏿‍🌾"; + constexpr const char[] woman_farmer = "👩‍🌾"; + constexpr const char[] woman_farmer_tone1 = "👩🏻‍🌾"; + constexpr const char[] woman_farmer_light_skin_tone = "👩🏻‍🌾"; + constexpr const char[] woman_farmer_tone2 = "👩🏼‍🌾"; + constexpr const char[] woman_farmer_medium_light_skin_tone = "👩🏼‍🌾"; + constexpr const char[] woman_farmer_tone3 = "👩🏽‍🌾"; + constexpr const char[] woman_farmer_medium_skin_tone = "👩🏽‍🌾"; + constexpr const char[] woman_farmer_tone4 = "👩🏾‍🌾"; + constexpr const char[] woman_farmer_medium_dark_skin_tone = "👩🏾‍🌾"; + constexpr const char[] woman_farmer_tone5 = "👩🏿‍🌾"; + constexpr const char[] woman_farmer_dark_skin_tone = "👩🏿‍🌾"; + constexpr const char[] man_farmer = "👨‍🌾"; + constexpr const char[] man_farmer_tone1 = "👨🏻‍🌾"; + constexpr const char[] man_farmer_light_skin_tone = "👨🏻‍🌾"; + constexpr const char[] man_farmer_tone2 = "👨🏼‍🌾"; + constexpr const char[] man_farmer_medium_light_skin_tone = "👨🏼‍🌾"; + constexpr const char[] man_farmer_tone3 = "👨🏽‍🌾"; + constexpr const char[] man_farmer_medium_skin_tone = "👨🏽‍🌾"; + constexpr const char[] man_farmer_tone4 = "👨🏾‍🌾"; + constexpr const char[] man_farmer_medium_dark_skin_tone = "👨🏾‍🌾"; + constexpr const char[] man_farmer_tone5 = "👨🏿‍🌾"; + constexpr const char[] man_farmer_dark_skin_tone = "👨🏿‍🌾"; + constexpr const char[] cook = "🧑‍🍳"; + constexpr const char[] cook_tone1 = "🧑🏻‍🍳"; + constexpr const char[] cook_light_skin_tone = "🧑🏻‍🍳"; + constexpr const char[] cook_tone2 = "🧑🏼‍🍳"; + constexpr const char[] cook_medium_light_skin_tone = "🧑🏼‍🍳"; + constexpr const char[] cook_tone3 = "🧑🏽‍🍳"; + constexpr const char[] cook_medium_skin_tone = "🧑🏽‍🍳"; + constexpr const char[] cook_tone4 = "🧑🏾‍🍳"; + constexpr const char[] cook_medium_dark_skin_tone = "🧑🏾‍🍳"; + constexpr const char[] cook_tone5 = "🧑🏿‍🍳"; + constexpr const char[] cook_dark_skin_tone = "🧑🏿‍🍳"; + constexpr const char[] woman_cook = "👩‍🍳"; + constexpr const char[] woman_cook_tone1 = "👩🏻‍🍳"; + constexpr const char[] woman_cook_light_skin_tone = "👩🏻‍🍳"; + constexpr const char[] woman_cook_tone2 = "👩🏼‍🍳"; + constexpr const char[] woman_cook_medium_light_skin_tone = "👩🏼‍🍳"; + constexpr const char[] woman_cook_tone3 = "👩🏽‍🍳"; + constexpr const char[] woman_cook_medium_skin_tone = "👩🏽‍🍳"; + constexpr const char[] woman_cook_tone4 = "👩🏾‍🍳"; + constexpr const char[] woman_cook_medium_dark_skin_tone = "👩🏾‍🍳"; + constexpr const char[] woman_cook_tone5 = "👩🏿‍🍳"; + constexpr const char[] woman_cook_dark_skin_tone = "👩🏿‍🍳"; + constexpr const char[] man_cook = "👨‍🍳"; + constexpr const char[] man_cook_tone1 = "👨🏻‍🍳"; + constexpr const char[] man_cook_light_skin_tone = "👨🏻‍🍳"; + constexpr const char[] man_cook_tone2 = "👨🏼‍🍳"; + constexpr const char[] man_cook_medium_light_skin_tone = "👨🏼‍🍳"; + constexpr const char[] man_cook_tone3 = "👨🏽‍🍳"; + constexpr const char[] man_cook_medium_skin_tone = "👨🏽‍🍳"; + constexpr const char[] man_cook_tone4 = "👨🏾‍🍳"; + constexpr const char[] man_cook_medium_dark_skin_tone = "👨🏾‍🍳"; + constexpr const char[] man_cook_tone5 = "👨🏿‍🍳"; + constexpr const char[] man_cook_dark_skin_tone = "👨🏿‍🍳"; + constexpr const char[] student = "🧑‍🎓"; + constexpr const char[] student_tone1 = "🧑🏻‍🎓"; + constexpr const char[] student_light_skin_tone = "🧑🏻‍🎓"; + constexpr const char[] student_tone2 = "🧑🏼‍🎓"; + constexpr const char[] student_medium_light_skin_tone = "🧑🏼‍🎓"; + constexpr const char[] student_tone3 = "🧑🏽‍🎓"; + constexpr const char[] student_medium_skin_tone = "🧑🏽‍🎓"; + constexpr const char[] student_tone4 = "🧑🏾‍🎓"; + constexpr const char[] student_medium_dark_skin_tone = "🧑🏾‍🎓"; + constexpr const char[] student_tone5 = "🧑🏿‍🎓"; + constexpr const char[] student_dark_skin_tone = "🧑🏿‍🎓"; + constexpr const char[] woman_student = "👩‍🎓"; + constexpr const char[] woman_student_tone1 = "👩🏻‍🎓"; + constexpr const char[] woman_student_light_skin_tone = "👩🏻‍🎓"; + constexpr const char[] woman_student_tone2 = "👩🏼‍🎓"; + constexpr const char[] woman_student_medium_light_skin_tone = "👩🏼‍🎓"; + constexpr const char[] woman_student_tone3 = "👩🏽‍🎓"; + constexpr const char[] woman_student_medium_skin_tone = "👩🏽‍🎓"; + constexpr const char[] woman_student_tone4 = "👩🏾‍🎓"; + constexpr const char[] woman_student_medium_dark_skin_tone = "👩🏾‍🎓"; + constexpr const char[] woman_student_tone5 = "👩🏿‍🎓"; + constexpr const char[] woman_student_dark_skin_tone = "👩🏿‍🎓"; + constexpr const char[] man_student = "👨‍🎓"; + constexpr const char[] man_student_tone1 = "👨🏻‍🎓"; + constexpr const char[] man_student_light_skin_tone = "👨🏻‍🎓"; + constexpr const char[] man_student_tone2 = "👨🏼‍🎓"; + constexpr const char[] man_student_medium_light_skin_tone = "👨🏼‍🎓"; + constexpr const char[] man_student_tone3 = "👨🏽‍🎓"; + constexpr const char[] man_student_medium_skin_tone = "👨🏽‍🎓"; + constexpr const char[] man_student_tone4 = "👨🏾‍🎓"; + constexpr const char[] man_student_medium_dark_skin_tone = "👨🏾‍🎓"; + constexpr const char[] man_student_tone5 = "👨🏿‍🎓"; + constexpr const char[] man_student_dark_skin_tone = "👨🏿‍🎓"; + constexpr const char[] singer = "🧑‍🎤"; + constexpr const char[] singer_tone1 = "🧑🏻‍🎤"; + constexpr const char[] singer_light_skin_tone = "🧑🏻‍🎤"; + constexpr const char[] singer_tone2 = "🧑🏼‍🎤"; + constexpr const char[] singer_medium_light_skin_tone = "🧑🏼‍🎤"; + constexpr const char[] singer_tone3 = "🧑🏽‍🎤"; + constexpr const char[] singer_medium_skin_tone = "🧑🏽‍🎤"; + constexpr const char[] singer_tone4 = "🧑🏾‍🎤"; + constexpr const char[] singer_medium_dark_skin_tone = "🧑🏾‍🎤"; + constexpr const char[] singer_tone5 = "🧑🏿‍🎤"; + constexpr const char[] singer_dark_skin_tone = "🧑🏿‍🎤"; + constexpr const char[] woman_singer = "👩‍🎤"; + constexpr const char[] woman_singer_tone1 = "👩🏻‍🎤"; + constexpr const char[] woman_singer_light_skin_tone = "👩🏻‍🎤"; + constexpr const char[] woman_singer_tone2 = "👩🏼‍🎤"; + constexpr const char[] woman_singer_medium_light_skin_tone = "👩🏼‍🎤"; + constexpr const char[] woman_singer_tone3 = "👩🏽‍🎤"; + constexpr const char[] woman_singer_medium_skin_tone = "👩🏽‍🎤"; + constexpr const char[] woman_singer_tone4 = "👩🏾‍🎤"; + constexpr const char[] woman_singer_medium_dark_skin_tone = "👩🏾‍🎤"; + constexpr const char[] woman_singer_tone5 = "👩🏿‍🎤"; + constexpr const char[] woman_singer_dark_skin_tone = "👩🏿‍🎤"; + constexpr const char[] man_singer = "👨‍🎤"; + constexpr const char[] man_singer_tone1 = "👨🏻‍🎤"; + constexpr const char[] man_singer_light_skin_tone = "👨🏻‍🎤"; + constexpr const char[] man_singer_tone2 = "👨🏼‍🎤"; + constexpr const char[] man_singer_medium_light_skin_tone = "👨🏼‍🎤"; + constexpr const char[] man_singer_tone3 = "👨🏽‍🎤"; + constexpr const char[] man_singer_medium_skin_tone = "👨🏽‍🎤"; + constexpr const char[] man_singer_tone4 = "👨🏾‍🎤"; + constexpr const char[] man_singer_medium_dark_skin_tone = "👨🏾‍🎤"; + constexpr const char[] man_singer_tone5 = "👨🏿‍🎤"; + constexpr const char[] man_singer_dark_skin_tone = "👨🏿‍🎤"; + constexpr const char[] teacher = "🧑‍🏫"; + constexpr const char[] teacher_tone1 = "🧑🏻‍🏫"; + constexpr const char[] teacher_light_skin_tone = "🧑🏻‍🏫"; + constexpr const char[] teacher_tone2 = "🧑🏼‍🏫"; + constexpr const char[] teacher_medium_light_skin_tone = "🧑🏼‍🏫"; + constexpr const char[] teacher_tone3 = "🧑🏽‍🏫"; + constexpr const char[] teacher_medium_skin_tone = "🧑🏽‍🏫"; + constexpr const char[] teacher_tone4 = "🧑🏾‍🏫"; + constexpr const char[] teacher_medium_dark_skin_tone = "🧑🏾‍🏫"; + constexpr const char[] teacher_tone5 = "🧑🏿‍🏫"; + constexpr const char[] teacher_dark_skin_tone = "🧑🏿‍🏫"; + constexpr const char[] woman_teacher = "👩‍🏫"; + constexpr const char[] woman_teacher_tone1 = "👩🏻‍🏫"; + constexpr const char[] woman_teacher_light_skin_tone = "👩🏻‍🏫"; + constexpr const char[] woman_teacher_tone2 = "👩🏼‍🏫"; + constexpr const char[] woman_teacher_medium_light_skin_tone = "👩🏼‍🏫"; + constexpr const char[] woman_teacher_tone3 = "👩🏽‍🏫"; + constexpr const char[] woman_teacher_medium_skin_tone = "👩🏽‍🏫"; + constexpr const char[] woman_teacher_tone4 = "👩🏾‍🏫"; + constexpr const char[] woman_teacher_medium_dark_skin_tone = "👩🏾‍🏫"; + constexpr const char[] woman_teacher_tone5 = "👩🏿‍🏫"; + constexpr const char[] woman_teacher_dark_skin_tone = "👩🏿‍🏫"; + constexpr const char[] man_teacher = "👨‍🏫"; + constexpr const char[] man_teacher_tone1 = "👨🏻‍🏫"; + constexpr const char[] man_teacher_light_skin_tone = "👨🏻‍🏫"; + constexpr const char[] man_teacher_tone2 = "👨🏼‍🏫"; + constexpr const char[] man_teacher_medium_light_skin_tone = "👨🏼‍🏫"; + constexpr const char[] man_teacher_tone3 = "👨🏽‍🏫"; + constexpr const char[] man_teacher_medium_skin_tone = "👨🏽‍🏫"; + constexpr const char[] man_teacher_tone4 = "👨🏾‍🏫"; + constexpr const char[] man_teacher_medium_dark_skin_tone = "👨🏾‍🏫"; + constexpr const char[] man_teacher_tone5 = "👨🏿‍🏫"; + constexpr const char[] man_teacher_dark_skin_tone = "👨🏿‍🏫"; + constexpr const char[] factory_worker = "🧑‍🏭"; + constexpr const char[] factory_worker_tone1 = "🧑🏻‍🏭"; + constexpr const char[] factory_worker_light_skin_tone = "🧑🏻‍🏭"; + constexpr const char[] factory_worker_tone2 = "🧑🏼‍🏭"; + constexpr const char[] factory_worker_medium_light_skin_tone = "🧑🏼‍🏭"; + constexpr const char[] factory_worker_tone3 = "🧑🏽‍🏭"; + constexpr const char[] factory_worker_medium_skin_tone = "🧑🏽‍🏭"; + constexpr const char[] factory_worker_tone4 = "🧑🏾‍🏭"; + constexpr const char[] factory_worker_medium_dark_skin_tone = "🧑🏾‍🏭"; + constexpr const char[] factory_worker_tone5 = "🧑🏿‍🏭"; + constexpr const char[] factory_worker_dark_skin_tone = "🧑🏿‍🏭"; + constexpr const char[] woman_factory_worker = "👩‍🏭"; + constexpr const char[] woman_factory_worker_tone1 = "👩🏻‍🏭"; + constexpr const char[] woman_factory_worker_light_skin_tone = "👩🏻‍🏭"; + constexpr const char[] woman_factory_worker_tone2 = "👩🏼‍🏭"; + constexpr const char[] woman_factory_worker_medium_light_skin_tone = "👩🏼‍🏭"; + constexpr const char[] woman_factory_worker_tone3 = "👩🏽‍🏭"; + constexpr const char[] woman_factory_worker_medium_skin_tone = "👩🏽‍🏭"; + constexpr const char[] woman_factory_worker_tone4 = "👩🏾‍🏭"; + constexpr const char[] woman_factory_worker_medium_dark_skin_tone = "👩🏾‍🏭"; + constexpr const char[] woman_factory_worker_tone5 = "👩🏿‍🏭"; + constexpr const char[] woman_factory_worker_dark_skin_tone = "👩🏿‍🏭"; + constexpr const char[] man_factory_worker = "👨‍🏭"; + constexpr const char[] man_factory_worker_tone1 = "👨🏻‍🏭"; + constexpr const char[] man_factory_worker_light_skin_tone = "👨🏻‍🏭"; + constexpr const char[] man_factory_worker_tone2 = "👨🏼‍🏭"; + constexpr const char[] man_factory_worker_medium_light_skin_tone = "👨🏼‍🏭"; + constexpr const char[] man_factory_worker_tone3 = "👨🏽‍🏭"; + constexpr const char[] man_factory_worker_medium_skin_tone = "👨🏽‍🏭"; + constexpr const char[] man_factory_worker_tone4 = "👨🏾‍🏭"; + constexpr const char[] man_factory_worker_medium_dark_skin_tone = "👨🏾‍🏭"; + constexpr const char[] man_factory_worker_tone5 = "👨🏿‍🏭"; + constexpr const char[] man_factory_worker_dark_skin_tone = "👨🏿‍🏭"; + constexpr const char[] technologist = "🧑‍💻"; + constexpr const char[] technologist_tone1 = "🧑🏻‍💻"; + constexpr const char[] technologist_light_skin_tone = "🧑🏻‍💻"; + constexpr const char[] technologist_tone2 = "🧑🏼‍💻"; + constexpr const char[] technologist_medium_light_skin_tone = "🧑🏼‍💻"; + constexpr const char[] technologist_tone3 = "🧑🏽‍💻"; + constexpr const char[] technologist_medium_skin_tone = "🧑🏽‍💻"; + constexpr const char[] technologist_tone4 = "🧑🏾‍💻"; + constexpr const char[] technologist_medium_dark_skin_tone = "🧑🏾‍💻"; + constexpr const char[] technologist_tone5 = "🧑🏿‍💻"; + constexpr const char[] technologist_dark_skin_tone = "🧑🏿‍💻"; + constexpr const char[] woman_technologist = "👩‍💻"; + constexpr const char[] woman_technologist_tone1 = "👩🏻‍💻"; + constexpr const char[] woman_technologist_light_skin_tone = "👩🏻‍💻"; + constexpr const char[] woman_technologist_tone2 = "👩🏼‍💻"; + constexpr const char[] woman_technologist_medium_light_skin_tone = "👩🏼‍💻"; + constexpr const char[] woman_technologist_tone3 = "👩🏽‍💻"; + constexpr const char[] woman_technologist_medium_skin_tone = "👩🏽‍💻"; + constexpr const char[] woman_technologist_tone4 = "👩🏾‍💻"; + constexpr const char[] woman_technologist_medium_dark_skin_tone = "👩🏾‍💻"; + constexpr const char[] woman_technologist_tone5 = "👩🏿‍💻"; + constexpr const char[] woman_technologist_dark_skin_tone = "👩🏿‍💻"; + constexpr const char[] man_technologist = "👨‍💻"; + constexpr const char[] man_technologist_tone1 = "👨🏻‍💻"; + constexpr const char[] man_technologist_light_skin_tone = "👨🏻‍💻"; + constexpr const char[] man_technologist_tone2 = "👨🏼‍💻"; + constexpr const char[] man_technologist_medium_light_skin_tone = "👨🏼‍💻"; + constexpr const char[] man_technologist_tone3 = "👨🏽‍💻"; + constexpr const char[] man_technologist_medium_skin_tone = "👨🏽‍💻"; + constexpr const char[] man_technologist_tone4 = "👨🏾‍💻"; + constexpr const char[] man_technologist_medium_dark_skin_tone = "👨🏾‍💻"; + constexpr const char[] man_technologist_tone5 = "👨🏿‍💻"; + constexpr const char[] man_technologist_dark_skin_tone = "👨🏿‍💻"; + constexpr const char[] office_worker = "🧑‍💼"; + constexpr const char[] office_worker_tone1 = "🧑🏻‍💼"; + constexpr const char[] office_worker_light_skin_tone = "🧑🏻‍💼"; + constexpr const char[] office_worker_tone2 = "🧑🏼‍💼"; + constexpr const char[] office_worker_medium_light_skin_tone = "🧑🏼‍💼"; + constexpr const char[] office_worker_tone3 = "🧑🏽‍💼"; + constexpr const char[] office_worker_medium_skin_tone = "🧑🏽‍💼"; + constexpr const char[] office_worker_tone4 = "🧑🏾‍💼"; + constexpr const char[] office_worker_medium_dark_skin_tone = "🧑🏾‍💼"; + constexpr const char[] office_worker_tone5 = "🧑🏿‍💼"; + constexpr const char[] office_worker_dark_skin_tone = "🧑🏿‍💼"; + constexpr const char[] woman_office_worker = "👩‍💼"; + constexpr const char[] woman_office_worker_tone1 = "👩🏻‍💼"; + constexpr const char[] woman_office_worker_light_skin_tone = "👩🏻‍💼"; + constexpr const char[] woman_office_worker_tone2 = "👩🏼‍💼"; + constexpr const char[] woman_office_worker_medium_light_skin_tone = "👩🏼‍💼"; + constexpr const char[] woman_office_worker_tone3 = "👩🏽‍💼"; + constexpr const char[] woman_office_worker_medium_skin_tone = "👩🏽‍💼"; + constexpr const char[] woman_office_worker_tone4 = "👩🏾‍💼"; + constexpr const char[] woman_office_worker_medium_dark_skin_tone = "👩🏾‍💼"; + constexpr const char[] woman_office_worker_tone5 = "👩🏿‍💼"; + constexpr const char[] woman_office_worker_dark_skin_tone = "👩🏿‍💼"; + constexpr const char[] man_office_worker = "👨‍💼"; + constexpr const char[] man_office_worker_tone1 = "👨🏻‍💼"; + constexpr const char[] man_office_worker_light_skin_tone = "👨🏻‍💼"; + constexpr const char[] man_office_worker_tone2 = "👨🏼‍💼"; + constexpr const char[] man_office_worker_medium_light_skin_tone = "👨🏼‍💼"; + constexpr const char[] man_office_worker_tone3 = "👨🏽‍💼"; + constexpr const char[] man_office_worker_medium_skin_tone = "👨🏽‍💼"; + constexpr const char[] man_office_worker_tone4 = "👨🏾‍💼"; + constexpr const char[] man_office_worker_medium_dark_skin_tone = "👨🏾‍💼"; + constexpr const char[] man_office_worker_tone5 = "👨🏿‍💼"; + constexpr const char[] man_office_worker_dark_skin_tone = "👨🏿‍💼"; + constexpr const char[] mechanic = "🧑‍🔧"; + constexpr const char[] mechanic_tone1 = "🧑🏻‍🔧"; + constexpr const char[] mechanic_light_skin_tone = "🧑🏻‍🔧"; + constexpr const char[] mechanic_tone2 = "🧑🏼‍🔧"; + constexpr const char[] mechanic_medium_light_skin_tone = "🧑🏼‍🔧"; + constexpr const char[] mechanic_tone3 = "🧑🏽‍🔧"; + constexpr const char[] mechanic_medium_skin_tone = "🧑🏽‍🔧"; + constexpr const char[] mechanic_tone4 = "🧑🏾‍🔧"; + constexpr const char[] mechanic_medium_dark_skin_tone = "🧑🏾‍🔧"; + constexpr const char[] mechanic_tone5 = "🧑🏿‍🔧"; + constexpr const char[] mechanic_dark_skin_tone = "🧑🏿‍🔧"; + constexpr const char[] woman_mechanic = "👩‍🔧"; + constexpr const char[] woman_mechanic_tone1 = "👩🏻‍🔧"; + constexpr const char[] woman_mechanic_light_skin_tone = "👩🏻‍🔧"; + constexpr const char[] woman_mechanic_tone2 = "👩🏼‍🔧"; + constexpr const char[] woman_mechanic_medium_light_skin_tone = "👩🏼‍🔧"; + constexpr const char[] woman_mechanic_tone3 = "👩🏽‍🔧"; + constexpr const char[] woman_mechanic_medium_skin_tone = "👩🏽‍🔧"; + constexpr const char[] woman_mechanic_tone4 = "👩🏾‍🔧"; + constexpr const char[] woman_mechanic_medium_dark_skin_tone = "👩🏾‍🔧"; + constexpr const char[] woman_mechanic_tone5 = "👩🏿‍🔧"; + constexpr const char[] woman_mechanic_dark_skin_tone = "👩🏿‍🔧"; + constexpr const char[] man_mechanic = "👨‍🔧"; + constexpr const char[] man_mechanic_tone1 = "👨🏻‍🔧"; + constexpr const char[] man_mechanic_light_skin_tone = "👨🏻‍🔧"; + constexpr const char[] man_mechanic_tone2 = "👨🏼‍🔧"; + constexpr const char[] man_mechanic_medium_light_skin_tone = "👨🏼‍🔧"; + constexpr const char[] man_mechanic_tone3 = "👨🏽‍🔧"; + constexpr const char[] man_mechanic_medium_skin_tone = "👨🏽‍🔧"; + constexpr const char[] man_mechanic_tone4 = "👨🏾‍🔧"; + constexpr const char[] man_mechanic_medium_dark_skin_tone = "👨🏾‍🔧"; + constexpr const char[] man_mechanic_tone5 = "👨🏿‍🔧"; + constexpr const char[] man_mechanic_dark_skin_tone = "👨🏿‍🔧"; + constexpr const char[] scientist = "🧑‍🔬"; + constexpr const char[] scientist_tone1 = "🧑🏻‍🔬"; + constexpr const char[] scientist_light_skin_tone = "🧑🏻‍🔬"; + constexpr const char[] scientist_tone2 = "🧑🏼‍🔬"; + constexpr const char[] scientist_medium_light_skin_tone = "🧑🏼‍🔬"; + constexpr const char[] scientist_tone3 = "🧑🏽‍🔬"; + constexpr const char[] scientist_medium_skin_tone = "🧑🏽‍🔬"; + constexpr const char[] scientist_tone4 = "🧑🏾‍🔬"; + constexpr const char[] scientist_medium_dark_skin_tone = "🧑🏾‍🔬"; + constexpr const char[] scientist_tone5 = "🧑🏿‍🔬"; + constexpr const char[] scientist_dark_skin_tone = "🧑🏿‍🔬"; + constexpr const char[] woman_scientist = "👩‍🔬"; + constexpr const char[] woman_scientist_tone1 = "👩🏻‍🔬"; + constexpr const char[] woman_scientist_light_skin_tone = "👩🏻‍🔬"; + constexpr const char[] woman_scientist_tone2 = "👩🏼‍🔬"; + constexpr const char[] woman_scientist_medium_light_skin_tone = "👩🏼‍🔬"; + constexpr const char[] woman_scientist_tone3 = "👩🏽‍🔬"; + constexpr const char[] woman_scientist_medium_skin_tone = "👩🏽‍🔬"; + constexpr const char[] woman_scientist_tone4 = "👩🏾‍🔬"; + constexpr const char[] woman_scientist_medium_dark_skin_tone = "👩🏾‍🔬"; + constexpr const char[] woman_scientist_tone5 = "👩🏿‍🔬"; + constexpr const char[] woman_scientist_dark_skin_tone = "👩🏿‍🔬"; + constexpr const char[] man_scientist = "👨‍🔬"; + constexpr const char[] man_scientist_tone1 = "👨🏻‍🔬"; + constexpr const char[] man_scientist_light_skin_tone = "👨🏻‍🔬"; + constexpr const char[] man_scientist_tone2 = "👨🏼‍🔬"; + constexpr const char[] man_scientist_medium_light_skin_tone = "👨🏼‍🔬"; + constexpr const char[] man_scientist_tone3 = "👨🏽‍🔬"; + constexpr const char[] man_scientist_medium_skin_tone = "👨🏽‍🔬"; + constexpr const char[] man_scientist_tone4 = "👨🏾‍🔬"; + constexpr const char[] man_scientist_medium_dark_skin_tone = "👨🏾‍🔬"; + constexpr const char[] man_scientist_tone5 = "👨🏿‍🔬"; + constexpr const char[] man_scientist_dark_skin_tone = "👨🏿‍🔬"; + constexpr const char[] artist = "🧑‍🎨"; + constexpr const char[] artist_tone1 = "🧑🏻‍🎨"; + constexpr const char[] artist_light_skin_tone = "🧑🏻‍🎨"; + constexpr const char[] artist_tone2 = "🧑🏼‍🎨"; + constexpr const char[] artist_medium_light_skin_tone = "🧑🏼‍🎨"; + constexpr const char[] artist_tone3 = "🧑🏽‍🎨"; + constexpr const char[] artist_medium_skin_tone = "🧑🏽‍🎨"; + constexpr const char[] artist_tone4 = "🧑🏾‍🎨"; + constexpr const char[] artist_medium_dark_skin_tone = "🧑🏾‍🎨"; + constexpr const char[] artist_tone5 = "🧑🏿‍🎨"; + constexpr const char[] artist_dark_skin_tone = "🧑🏿‍🎨"; + constexpr const char[] woman_artist = "👩‍🎨"; + constexpr const char[] woman_artist_tone1 = "👩🏻‍🎨"; + constexpr const char[] woman_artist_light_skin_tone = "👩🏻‍🎨"; + constexpr const char[] woman_artist_tone2 = "👩🏼‍🎨"; + constexpr const char[] woman_artist_medium_light_skin_tone = "👩🏼‍🎨"; + constexpr const char[] woman_artist_tone3 = "👩🏽‍🎨"; + constexpr const char[] woman_artist_medium_skin_tone = "👩🏽‍🎨"; + constexpr const char[] woman_artist_tone4 = "👩🏾‍🎨"; + constexpr const char[] woman_artist_medium_dark_skin_tone = "👩🏾‍🎨"; + constexpr const char[] woman_artist_tone5 = "👩🏿‍🎨"; + constexpr const char[] woman_artist_dark_skin_tone = "👩🏿‍🎨"; + constexpr const char[] man_artist = "👨‍🎨"; + constexpr const char[] man_artist_tone1 = "👨🏻‍🎨"; + constexpr const char[] man_artist_light_skin_tone = "👨🏻‍🎨"; + constexpr const char[] man_artist_tone2 = "👨🏼‍🎨"; + constexpr const char[] man_artist_medium_light_skin_tone = "👨🏼‍🎨"; + constexpr const char[] man_artist_tone3 = "👨🏽‍🎨"; + constexpr const char[] man_artist_medium_skin_tone = "👨🏽‍🎨"; + constexpr const char[] man_artist_tone4 = "👨🏾‍🎨"; + constexpr const char[] man_artist_medium_dark_skin_tone = "👨🏾‍🎨"; + constexpr const char[] man_artist_tone5 = "👨🏿‍🎨"; + constexpr const char[] man_artist_dark_skin_tone = "👨🏿‍🎨"; + constexpr const char[] firefighter = "🧑‍🚒"; + constexpr const char[] firefighter_tone1 = "🧑🏻‍🚒"; + constexpr const char[] firefighter_light_skin_tone = "🧑🏻‍🚒"; + constexpr const char[] firefighter_tone2 = "🧑🏼‍🚒"; + constexpr const char[] firefighter_medium_light_skin_tone = "🧑🏼‍🚒"; + constexpr const char[] firefighter_tone3 = "🧑🏽‍🚒"; + constexpr const char[] firefighter_medium_skin_tone = "🧑🏽‍🚒"; + constexpr const char[] firefighter_tone4 = "🧑🏾‍🚒"; + constexpr const char[] firefighter_medium_dark_skin_tone = "🧑🏾‍🚒"; + constexpr const char[] firefighter_tone5 = "🧑🏿‍🚒"; + constexpr const char[] firefighter_dark_skin_tone = "🧑🏿‍🚒"; + constexpr const char[] woman_firefighter = "👩‍🚒"; + constexpr const char[] woman_firefighter_tone1 = "👩🏻‍🚒"; + constexpr const char[] woman_firefighter_light_skin_tone = "👩🏻‍🚒"; + constexpr const char[] woman_firefighter_tone2 = "👩🏼‍🚒"; + constexpr const char[] woman_firefighter_medium_light_skin_tone = "👩🏼‍🚒"; + constexpr const char[] woman_firefighter_tone3 = "👩🏽‍🚒"; + constexpr const char[] woman_firefighter_medium_skin_tone = "👩🏽‍🚒"; + constexpr const char[] woman_firefighter_tone4 = "👩🏾‍🚒"; + constexpr const char[] woman_firefighter_medium_dark_skin_tone = "👩🏾‍🚒"; + constexpr const char[] woman_firefighter_tone5 = "👩🏿‍🚒"; + constexpr const char[] woman_firefighter_dark_skin_tone = "👩🏿‍🚒"; + constexpr const char[] man_firefighter = "👨‍🚒"; + constexpr const char[] man_firefighter_tone1 = "👨🏻‍🚒"; + constexpr const char[] man_firefighter_light_skin_tone = "👨🏻‍🚒"; + constexpr const char[] man_firefighter_tone2 = "👨🏼‍🚒"; + constexpr const char[] man_firefighter_medium_light_skin_tone = "👨🏼‍🚒"; + constexpr const char[] man_firefighter_tone3 = "👨🏽‍🚒"; + constexpr const char[] man_firefighter_medium_skin_tone = "👨🏽‍🚒"; + constexpr const char[] man_firefighter_tone4 = "👨🏾‍🚒"; + constexpr const char[] man_firefighter_medium_dark_skin_tone = "👨🏾‍🚒"; + constexpr const char[] man_firefighter_tone5 = "👨🏿‍🚒"; + constexpr const char[] man_firefighter_dark_skin_tone = "👨🏿‍🚒"; + constexpr const char[] pilot = "🧑‍✈️"; + constexpr const char[] pilot_tone1 = "🧑🏻‍✈️"; + constexpr const char[] pilot_light_skin_tone = "🧑🏻‍✈️"; + constexpr const char[] pilot_tone2 = "🧑🏼‍✈️"; + constexpr const char[] pilot_medium_light_skin_tone = "🧑🏼‍✈️"; + constexpr const char[] pilot_tone3 = "🧑🏽‍✈️"; + constexpr const char[] pilot_medium_skin_tone = "🧑🏽‍✈️"; + constexpr const char[] pilot_tone4 = "🧑🏾‍✈️"; + constexpr const char[] pilot_medium_dark_skin_tone = "🧑🏾‍✈️"; + constexpr const char[] pilot_tone5 = "🧑🏿‍✈️"; + constexpr const char[] pilot_dark_skin_tone = "🧑🏿‍✈️"; + constexpr const char[] woman_pilot = "👩‍✈️"; + constexpr const char[] woman_pilot_tone1 = "👩🏻‍✈️"; + constexpr const char[] woman_pilot_light_skin_tone = "👩🏻‍✈️"; + constexpr const char[] woman_pilot_tone2 = "👩🏼‍✈️"; + constexpr const char[] woman_pilot_medium_light_skin_tone = "👩🏼‍✈️"; + constexpr const char[] woman_pilot_tone3 = "👩🏽‍✈️"; + constexpr const char[] woman_pilot_medium_skin_tone = "👩🏽‍✈️"; + constexpr const char[] woman_pilot_tone4 = "👩🏾‍✈️"; + constexpr const char[] woman_pilot_medium_dark_skin_tone = "👩🏾‍✈️"; + constexpr const char[] woman_pilot_tone5 = "👩🏿‍✈️"; + constexpr const char[] woman_pilot_dark_skin_tone = "👩🏿‍✈️"; + constexpr const char[] man_pilot = "👨‍✈️"; + constexpr const char[] man_pilot_tone1 = "👨🏻‍✈️"; + constexpr const char[] man_pilot_light_skin_tone = "👨🏻‍✈️"; + constexpr const char[] man_pilot_tone2 = "👨🏼‍✈️"; + constexpr const char[] man_pilot_medium_light_skin_tone = "👨🏼‍✈️"; + constexpr const char[] man_pilot_tone3 = "👨🏽‍✈️"; + constexpr const char[] man_pilot_medium_skin_tone = "👨🏽‍✈️"; + constexpr const char[] man_pilot_tone4 = "👨🏾‍✈️"; + constexpr const char[] man_pilot_medium_dark_skin_tone = "👨🏾‍✈️"; + constexpr const char[] man_pilot_tone5 = "👨🏿‍✈️"; + constexpr const char[] man_pilot_dark_skin_tone = "👨🏿‍✈️"; + constexpr const char[] astronaut = "🧑‍🚀"; + constexpr const char[] astronaut_tone1 = "🧑🏻‍🚀"; + constexpr const char[] astronaut_light_skin_tone = "🧑🏻‍🚀"; + constexpr const char[] astronaut_tone2 = "🧑🏼‍🚀"; + constexpr const char[] astronaut_medium_light_skin_tone = "🧑🏼‍🚀"; + constexpr const char[] astronaut_tone3 = "🧑🏽‍🚀"; + constexpr const char[] astronaut_medium_skin_tone = "🧑🏽‍🚀"; + constexpr const char[] astronaut_tone4 = "🧑🏾‍🚀"; + constexpr const char[] astronaut_medium_dark_skin_tone = "🧑🏾‍🚀"; + constexpr const char[] astronaut_tone5 = "🧑🏿‍🚀"; + constexpr const char[] astronaut_dark_skin_tone = "🧑🏿‍🚀"; + constexpr const char[] woman_astronaut = "👩‍🚀"; + constexpr const char[] woman_astronaut_tone1 = "👩🏻‍🚀"; + constexpr const char[] woman_astronaut_light_skin_tone = "👩🏻‍🚀"; + constexpr const char[] woman_astronaut_tone2 = "👩🏼‍🚀"; + constexpr const char[] woman_astronaut_medium_light_skin_tone = "👩🏼‍🚀"; + constexpr const char[] woman_astronaut_tone3 = "👩🏽‍🚀"; + constexpr const char[] woman_astronaut_medium_skin_tone = "👩🏽‍🚀"; + constexpr const char[] woman_astronaut_tone4 = "👩🏾‍🚀"; + constexpr const char[] woman_astronaut_medium_dark_skin_tone = "👩🏾‍🚀"; + constexpr const char[] woman_astronaut_tone5 = "👩🏿‍🚀"; + constexpr const char[] woman_astronaut_dark_skin_tone = "👩🏿‍🚀"; + constexpr const char[] man_astronaut = "👨‍🚀"; + constexpr const char[] man_astronaut_tone1 = "👨🏻‍🚀"; + constexpr const char[] man_astronaut_light_skin_tone = "👨🏻‍🚀"; + constexpr const char[] man_astronaut_tone2 = "👨🏼‍🚀"; + constexpr const char[] man_astronaut_medium_light_skin_tone = "👨🏼‍🚀"; + constexpr const char[] man_astronaut_tone3 = "👨🏽‍🚀"; + constexpr const char[] man_astronaut_medium_skin_tone = "👨🏽‍🚀"; + constexpr const char[] man_astronaut_tone4 = "👨🏾‍🚀"; + constexpr const char[] man_astronaut_medium_dark_skin_tone = "👨🏾‍🚀"; + constexpr const char[] man_astronaut_tone5 = "👨🏿‍🚀"; + constexpr const char[] man_astronaut_dark_skin_tone = "👨🏿‍🚀"; + constexpr const char[] judge = "🧑‍⚖️"; + constexpr const char[] judge_tone1 = "🧑🏻‍⚖️"; + constexpr const char[] judge_light_skin_tone = "🧑🏻‍⚖️"; + constexpr const char[] judge_tone2 = "🧑🏼‍⚖️"; + constexpr const char[] judge_medium_light_skin_tone = "🧑🏼‍⚖️"; + constexpr const char[] judge_tone3 = "🧑🏽‍⚖️"; + constexpr const char[] judge_medium_skin_tone = "🧑🏽‍⚖️"; + constexpr const char[] judge_tone4 = "🧑🏾‍⚖️"; + constexpr const char[] judge_medium_dark_skin_tone = "🧑🏾‍⚖️"; + constexpr const char[] judge_tone5 = "🧑🏿‍⚖️"; + constexpr const char[] judge_dark_skin_tone = "🧑🏿‍⚖️"; + constexpr const char[] woman_judge = "👩‍⚖️"; + constexpr const char[] woman_judge_tone1 = "👩🏻‍⚖️"; + constexpr const char[] woman_judge_light_skin_tone = "👩🏻‍⚖️"; + constexpr const char[] woman_judge_tone2 = "👩🏼‍⚖️"; + constexpr const char[] woman_judge_medium_light_skin_tone = "👩🏼‍⚖️"; + constexpr const char[] woman_judge_tone3 = "👩🏽‍⚖️"; + constexpr const char[] woman_judge_medium_skin_tone = "👩🏽‍⚖️"; + constexpr const char[] woman_judge_tone4 = "👩🏾‍⚖️"; + constexpr const char[] woman_judge_medium_dark_skin_tone = "👩🏾‍⚖️"; + constexpr const char[] woman_judge_tone5 = "👩🏿‍⚖️"; + constexpr const char[] woman_judge_dark_skin_tone = "👩🏿‍⚖️"; + constexpr const char[] man_judge = "👨‍⚖️"; + constexpr const char[] man_judge_tone1 = "👨🏻‍⚖️"; + constexpr const char[] man_judge_light_skin_tone = "👨🏻‍⚖️"; + constexpr const char[] man_judge_tone2 = "👨🏼‍⚖️"; + constexpr const char[] man_judge_medium_light_skin_tone = "👨🏼‍⚖️"; + constexpr const char[] man_judge_tone3 = "👨🏽‍⚖️"; + constexpr const char[] man_judge_medium_skin_tone = "👨🏽‍⚖️"; + constexpr const char[] man_judge_tone4 = "👨🏾‍⚖️"; + constexpr const char[] man_judge_medium_dark_skin_tone = "👨🏾‍⚖️"; + constexpr const char[] man_judge_tone5 = "👨🏿‍⚖️"; + constexpr const char[] man_judge_dark_skin_tone = "👨🏿‍⚖️"; + constexpr const char[] person_with_veil = "👰"; + constexpr const char[] person_with_veil_tone1 = "👰🏻"; + constexpr const char[] person_with_veil_tone2 = "👰🏼"; + constexpr const char[] person_with_veil_tone3 = "👰🏽"; + constexpr const char[] person_with_veil_tone4 = "👰🏾"; + constexpr const char[] person_with_veil_tone5 = "👰🏿"; + constexpr const char[] woman_with_veil = "👰‍♀️"; + constexpr const char[] bride_with_veil = "👰‍♀️"; + constexpr const char[] woman_with_veil_tone1 = "👰🏻‍♀️"; + constexpr const char[] woman_with_veil_light_skin_tone = "👰🏻‍♀️"; + constexpr const char[] woman_with_veil_tone2 = "👰🏼‍♀️"; + constexpr const char[] woman_with_veil_medium_light_skin_tone = "👰🏼‍♀️"; + constexpr const char[] woman_with_veil_tone3 = "👰🏽‍♀️"; + constexpr const char[] woman_with_veil_medium_skin_tone = "👰🏽‍♀️"; + constexpr const char[] woman_with_veil_tone4 = "👰🏾‍♀️"; + constexpr const char[] woman_with_veil_medium_dark_skin_tone = "👰🏾‍♀️"; + constexpr const char[] woman_with_veil_tone5 = "👰🏿‍♀️"; + constexpr const char[] woman_with_veil_dark_skin_tone = "👰🏿‍♀️"; + constexpr const char[] man_with_veil = "👰‍♂️"; + constexpr const char[] man_with_veil_tone1 = "👰🏻‍♂️"; + constexpr const char[] man_with_veil_light_skin_tone = "👰🏻‍♂️"; + constexpr const char[] man_with_veil_tone2 = "👰🏼‍♂️"; + constexpr const char[] man_with_veil_medium_light_skin_tone = "👰🏼‍♂️"; + constexpr const char[] man_with_veil_tone3 = "👰🏽‍♂️"; + constexpr const char[] man_with_veil_medium_skin_tone = "👰🏽‍♂️"; + constexpr const char[] man_with_veil_tone4 = "👰🏾‍♂️"; + constexpr const char[] man_with_veil_medium_dark_skin_tone = "👰🏾‍♂️"; + constexpr const char[] man_with_veil_tone5 = "👰🏿‍♂️"; + constexpr const char[] man_with_veil_dark_skin_tone = "👰🏿‍♂️"; + constexpr const char[] person_in_tuxedo = "🤵"; + constexpr const char[] person_in_tuxedo_tone1 = "🤵🏻"; + constexpr const char[] tuxedo_tone1 = "🤵🏻"; + constexpr const char[] person_in_tuxedo_tone2 = "🤵🏼"; + constexpr const char[] tuxedo_tone2 = "🤵🏼"; + constexpr const char[] person_in_tuxedo_tone3 = "🤵🏽"; + constexpr const char[] tuxedo_tone3 = "🤵🏽"; + constexpr const char[] person_in_tuxedo_tone4 = "🤵🏾"; + constexpr const char[] tuxedo_tone4 = "🤵🏾"; + constexpr const char[] person_in_tuxedo_tone5 = "🤵🏿"; + constexpr const char[] tuxedo_tone5 = "🤵🏿"; + constexpr const char[] woman_in_tuxedo = "🤵‍♀️"; + constexpr const char[] woman_in_tuxedo_tone1 = "🤵🏻‍♀️"; + constexpr const char[] woman_in_tuxedo_light_skin_tone = "🤵🏻‍♀️"; + constexpr const char[] woman_in_tuxedo_tone2 = "🤵🏼‍♀️"; + constexpr const char[] woman_in_tuxedo_medium_light_skin_tone = "🤵🏼‍♀️"; + constexpr const char[] woman_in_tuxedo_tone3 = "🤵🏽‍♀️"; + constexpr const char[] woman_in_tuxedo_medium_skin_tone = "🤵🏽‍♀️"; + constexpr const char[] woman_in_tuxedo_tone4 = "🤵🏾‍♀️"; + constexpr const char[] woman_in_tuxedo_medium_dark_skin_tone = "🤵🏾‍♀️"; + constexpr const char[] woman_in_tuxedo_tone5 = "🤵🏿‍♀️"; + constexpr const char[] woman_in_tuxedo_dark_skin_tone = "🤵🏿‍♀️"; + constexpr const char[] man_in_tuxedo = "🤵‍♂️"; + constexpr const char[] man_in_tuxedo_tone1 = "🤵🏻‍♂️"; + constexpr const char[] man_in_tuxedo_light_skin_tone = "🤵🏻‍♂️"; + constexpr const char[] man_in_tuxedo_tone2 = "🤵🏼‍♂️"; + constexpr const char[] man_in_tuxedo_medium_light_skin_tone = "🤵🏼‍♂️"; + constexpr const char[] man_in_tuxedo_tone3 = "🤵🏽‍♂️"; + constexpr const char[] man_in_tuxedo_medium_skin_tone = "🤵🏽‍♂️"; + constexpr const char[] man_in_tuxedo_tone4 = "🤵🏾‍♂️"; + constexpr const char[] man_in_tuxedo_medium_dark_skin_tone = "🤵🏾‍♂️"; + constexpr const char[] man_in_tuxedo_tone5 = "🤵🏿‍♂️"; + constexpr const char[] man_in_tuxedo_dark_skin_tone = "🤵🏿‍♂️"; + constexpr const char[] person_with_crown = "🫅"; + constexpr const char[] person_with_crown_tone1 = "🫅🏻"; + constexpr const char[] person_with_crown_light_skin_tone = "🫅🏻"; + constexpr const char[] person_with_crown_tone2 = "🫅🏼"; + constexpr const char[] person_with_crown_medium_light_skin_tone = "🫅🏼"; + constexpr const char[] person_with_crown_tone3 = "🫅🏽"; + constexpr const char[] person_with_crown_medium_skin_tone = "🫅🏽"; + constexpr const char[] person_with_crown_tone4 = "🫅🏾"; + constexpr const char[] person_with_crown_medium_dark_skin_tone = "🫅🏾"; + constexpr const char[] person_with_crown_tone5 = "🫅🏿"; + constexpr const char[] person_with_crown_dark_skin_tone = "🫅🏿"; + constexpr const char[] princess = "👸"; + constexpr const char[] princess_tone1 = "👸🏻"; + constexpr const char[] princess_tone2 = "👸🏼"; + constexpr const char[] princess_tone3 = "👸🏽"; + constexpr const char[] princess_tone4 = "👸🏾"; + constexpr const char[] princess_tone5 = "👸🏿"; + constexpr const char[] prince = "🤴"; + constexpr const char[] prince_tone1 = "🤴🏻"; + constexpr const char[] prince_tone2 = "🤴🏼"; + constexpr const char[] prince_tone3 = "🤴🏽"; + constexpr const char[] prince_tone4 = "🤴🏾"; + constexpr const char[] prince_tone5 = "🤴🏿"; + constexpr const char[] superhero = "🦸"; + constexpr const char[] superhero_tone1 = "🦸🏻"; + constexpr const char[] superhero_light_skin_tone = "🦸🏻"; + constexpr const char[] superhero_tone2 = "🦸🏼"; + constexpr const char[] superhero_medium_light_skin_tone = "🦸🏼"; + constexpr const char[] superhero_tone3 = "🦸🏽"; + constexpr const char[] superhero_medium_skin_tone = "🦸🏽"; + constexpr const char[] superhero_tone4 = "🦸🏾"; + constexpr const char[] superhero_medium_dark_skin_tone = "🦸🏾"; + constexpr const char[] superhero_tone5 = "🦸🏿"; + constexpr const char[] superhero_dark_skin_tone = "🦸🏿"; + constexpr const char[] woman_superhero = "🦸‍♀️"; + constexpr const char[] woman_superhero_tone1 = "🦸🏻‍♀️"; + constexpr const char[] woman_superhero_light_skin_tone = "🦸🏻‍♀️"; + constexpr const char[] woman_superhero_tone2 = "🦸🏼‍♀️"; + constexpr const char[] woman_superhero_medium_light_skin_tone = "🦸🏼‍♀️"; + constexpr const char[] woman_superhero_tone3 = "🦸🏽‍♀️"; + constexpr const char[] woman_superhero_medium_skin_tone = "🦸🏽‍♀️"; + constexpr const char[] woman_superhero_tone4 = "🦸🏾‍♀️"; + constexpr const char[] woman_superhero_medium_dark_skin_tone = "🦸🏾‍♀️"; + constexpr const char[] woman_superhero_tone5 = "🦸🏿‍♀️"; + constexpr const char[] woman_superhero_dark_skin_tone = "🦸🏿‍♀️"; + constexpr const char[] man_superhero = "🦸‍♂️"; + constexpr const char[] man_superhero_tone1 = "🦸🏻‍♂️"; + constexpr const char[] man_superhero_light_skin_tone = "🦸🏻‍♂️"; + constexpr const char[] man_superhero_tone2 = "🦸🏼‍♂️"; + constexpr const char[] man_superhero_medium_light_skin_tone = "🦸🏼‍♂️"; + constexpr const char[] man_superhero_tone3 = "🦸🏽‍♂️"; + constexpr const char[] man_superhero_medium_skin_tone = "🦸🏽‍♂️"; + constexpr const char[] man_superhero_tone4 = "🦸🏾‍♂️"; + constexpr const char[] man_superhero_medium_dark_skin_tone = "🦸🏾‍♂️"; + constexpr const char[] man_superhero_tone5 = "🦸🏿‍♂️"; + constexpr const char[] man_superhero_dark_skin_tone = "🦸🏿‍♂️"; + constexpr const char[] supervillain = "🦹"; + constexpr const char[] supervillain_tone1 = "🦹🏻"; + constexpr const char[] supervillain_light_skin_tone = "🦹🏻"; + constexpr const char[] supervillain_tone2 = "🦹🏼"; + constexpr const char[] supervillain_medium_light_skin_tone = "🦹🏼"; + constexpr const char[] supervillain_tone3 = "🦹🏽"; + constexpr const char[] supervillain_medium_skin_tone = "🦹🏽"; + constexpr const char[] supervillain_tone4 = "🦹🏾"; + constexpr const char[] supervillain_medium_dark_skin_tone = "🦹🏾"; + constexpr const char[] supervillain_tone5 = "🦹🏿"; + constexpr const char[] supervillain_dark_skin_tone = "🦹🏿"; + constexpr const char[] woman_supervillain = "🦹‍♀️"; + constexpr const char[] woman_supervillain_tone1 = "🦹🏻‍♀️"; + constexpr const char[] woman_supervillain_light_skin_tone = "🦹🏻‍♀️"; + constexpr const char[] woman_supervillain_tone2 = "🦹🏼‍♀️"; + constexpr const char[] woman_supervillain_medium_light_skin_tone = "🦹🏼‍♀️"; + constexpr const char[] woman_supervillain_tone3 = "🦹🏽‍♀️"; + constexpr const char[] woman_supervillain_medium_skin_tone = "🦹🏽‍♀️"; + constexpr const char[] woman_supervillain_tone4 = "🦹🏾‍♀️"; + constexpr const char[] woman_supervillain_medium_dark_skin_tone = "🦹🏾‍♀️"; + constexpr const char[] woman_supervillain_tone5 = "🦹🏿‍♀️"; + constexpr const char[] woman_supervillain_dark_skin_tone = "🦹🏿‍♀️"; + constexpr const char[] man_supervillain = "🦹‍♂️"; + constexpr const char[] man_supervillain_tone1 = "🦹🏻‍♂️"; + constexpr const char[] man_supervillain_light_skin_tone = "🦹🏻‍♂️"; + constexpr const char[] man_supervillain_tone2 = "🦹🏼‍♂️"; + constexpr const char[] man_supervillain_medium_light_skin_tone = "🦹🏼‍♂️"; + constexpr const char[] man_supervillain_tone3 = "🦹🏽‍♂️"; + constexpr const char[] man_supervillain_medium_skin_tone = "🦹🏽‍♂️"; + constexpr const char[] man_supervillain_tone4 = "🦹🏾‍♂️"; + constexpr const char[] man_supervillain_medium_dark_skin_tone = "🦹🏾‍♂️"; + constexpr const char[] man_supervillain_tone5 = "🦹🏿‍♂️"; + constexpr const char[] man_supervillain_dark_skin_tone = "🦹🏿‍♂️"; + constexpr const char[] ninja = "🥷"; + constexpr const char[] ninja_tone1 = "🥷🏻"; + constexpr const char[] ninja_light_skin_tone = "🥷🏻"; + constexpr const char[] ninja_tone2 = "🥷🏼"; + constexpr const char[] ninja_medium_light_skin_tone = "🥷🏼"; + constexpr const char[] ninja_tone3 = "🥷🏽"; + constexpr const char[] ninja_medium_skin_tone = "🥷🏽"; + constexpr const char[] ninja_tone4 = "🥷🏾"; + constexpr const char[] ninja_medium_dark_skin_tone = "🥷🏾"; + constexpr const char[] ninja_tone5 = "🥷🏿"; + constexpr const char[] ninja_dark_skin_tone = "🥷🏿"; + constexpr const char[] mx_claus = "🧑‍🎄"; + constexpr const char[] mx_claus_tone1 = "🧑🏻‍🎄"; + constexpr const char[] mx_claus_light_skin_tone = "🧑🏻‍🎄"; + constexpr const char[] mx_claus_tone2 = "🧑🏼‍🎄"; + constexpr const char[] mx_claus_medium_light_skin_tone = "🧑🏼‍🎄"; + constexpr const char[] mx_claus_tone3 = "🧑🏽‍🎄"; + constexpr const char[] mx_claus_medium_skin_tone = "🧑🏽‍🎄"; + constexpr const char[] mx_claus_tone4 = "🧑🏾‍🎄"; + constexpr const char[] mx_claus_medium_dark_skin_tone = "🧑🏾‍🎄"; + constexpr const char[] mx_claus_tone5 = "🧑🏿‍🎄"; + constexpr const char[] mx_claus_dark_skin_tone = "🧑🏿‍🎄"; + constexpr const char[] mrs_claus = "🤶"; + constexpr const char[] mother_christmas = "🤶"; + constexpr const char[] mrs_claus_tone1 = "🤶🏻"; + constexpr const char[] mother_christmas_tone1 = "🤶🏻"; + constexpr const char[] mrs_claus_tone2 = "🤶🏼"; + constexpr const char[] mother_christmas_tone2 = "🤶🏼"; + constexpr const char[] mrs_claus_tone3 = "🤶🏽"; + constexpr const char[] mother_christmas_tone3 = "🤶🏽"; + constexpr const char[] mrs_claus_tone4 = "🤶🏾"; + constexpr const char[] mother_christmas_tone4 = "🤶🏾"; + constexpr const char[] mrs_claus_tone5 = "🤶🏿"; + constexpr const char[] mother_christmas_tone5 = "🤶🏿"; + constexpr const char[] santa = "🎅"; + constexpr const char[] santa_tone1 = "🎅🏻"; + constexpr const char[] santa_tone2 = "🎅🏼"; + constexpr const char[] santa_tone3 = "🎅🏽"; + constexpr const char[] santa_tone4 = "🎅🏾"; + constexpr const char[] santa_tone5 = "🎅🏿"; + constexpr const char[] mage = "🧙"; + constexpr const char[] mage_tone1 = "🧙🏻"; + constexpr const char[] mage_light_skin_tone = "🧙🏻"; + constexpr const char[] mage_tone2 = "🧙🏼"; + constexpr const char[] mage_medium_light_skin_tone = "🧙🏼"; + constexpr const char[] mage_tone3 = "🧙🏽"; + constexpr const char[] mage_medium_skin_tone = "🧙🏽"; + constexpr const char[] mage_tone4 = "🧙🏾"; + constexpr const char[] mage_medium_dark_skin_tone = "🧙🏾"; + constexpr const char[] mage_tone5 = "🧙🏿"; + constexpr const char[] mage_dark_skin_tone = "🧙🏿"; + constexpr const char[] woman_mage = "🧙‍♀️"; + constexpr const char[] woman_mage_tone1 = "🧙🏻‍♀️"; + constexpr const char[] woman_mage_light_skin_tone = "🧙🏻‍♀️"; + constexpr const char[] woman_mage_tone2 = "🧙🏼‍♀️"; + constexpr const char[] woman_mage_medium_light_skin_tone = "🧙🏼‍♀️"; + constexpr const char[] woman_mage_tone3 = "🧙🏽‍♀️"; + constexpr const char[] woman_mage_medium_skin_tone = "🧙🏽‍♀️"; + constexpr const char[] woman_mage_tone4 = "🧙🏾‍♀️"; + constexpr const char[] woman_mage_medium_dark_skin_tone = "🧙🏾‍♀️"; + constexpr const char[] woman_mage_tone5 = "🧙🏿‍♀️"; + constexpr const char[] woman_mage_dark_skin_tone = "🧙🏿‍♀️"; + constexpr const char[] man_mage = "🧙‍♂️"; + constexpr const char[] man_mage_tone1 = "🧙🏻‍♂️"; + constexpr const char[] man_mage_light_skin_tone = "🧙🏻‍♂️"; + constexpr const char[] man_mage_tone2 = "🧙🏼‍♂️"; + constexpr const char[] man_mage_medium_light_skin_tone = "🧙🏼‍♂️"; + constexpr const char[] man_mage_tone3 = "🧙🏽‍♂️"; + constexpr const char[] man_mage_medium_skin_tone = "🧙🏽‍♂️"; + constexpr const char[] man_mage_tone4 = "🧙🏾‍♂️"; + constexpr const char[] man_mage_medium_dark_skin_tone = "🧙🏾‍♂️"; + constexpr const char[] man_mage_tone5 = "🧙🏿‍♂️"; + constexpr const char[] man_mage_dark_skin_tone = "🧙🏿‍♂️"; + constexpr const char[] elf = "🧝"; + constexpr const char[] elf_tone1 = "🧝🏻"; + constexpr const char[] elf_light_skin_tone = "🧝🏻"; + constexpr const char[] elf_tone2 = "🧝🏼"; + constexpr const char[] elf_medium_light_skin_tone = "🧝🏼"; + constexpr const char[] elf_tone3 = "🧝🏽"; + constexpr const char[] elf_medium_skin_tone = "🧝🏽"; + constexpr const char[] elf_tone4 = "🧝🏾"; + constexpr const char[] elf_medium_dark_skin_tone = "🧝🏾"; + constexpr const char[] elf_tone5 = "🧝🏿"; + constexpr const char[] elf_dark_skin_tone = "🧝🏿"; + constexpr const char[] woman_elf = "🧝‍♀️"; + constexpr const char[] woman_elf_tone1 = "🧝🏻‍♀️"; + constexpr const char[] woman_elf_light_skin_tone = "🧝🏻‍♀️"; + constexpr const char[] woman_elf_tone2 = "🧝🏼‍♀️"; + constexpr const char[] woman_elf_medium_light_skin_tone = "🧝🏼‍♀️"; + constexpr const char[] woman_elf_tone3 = "🧝🏽‍♀️"; + constexpr const char[] woman_elf_medium_skin_tone = "🧝🏽‍♀️"; + constexpr const char[] woman_elf_tone4 = "🧝🏾‍♀️"; + constexpr const char[] woman_elf_medium_dark_skin_tone = "🧝🏾‍♀️"; + constexpr const char[] woman_elf_tone5 = "🧝🏿‍♀️"; + constexpr const char[] woman_elf_dark_skin_tone = "🧝🏿‍♀️"; + constexpr const char[] man_elf = "🧝‍♂️"; + constexpr const char[] man_elf_tone1 = "🧝🏻‍♂️"; + constexpr const char[] man_elf_light_skin_tone = "🧝🏻‍♂️"; + constexpr const char[] man_elf_tone2 = "🧝🏼‍♂️"; + constexpr const char[] man_elf_medium_light_skin_tone = "🧝🏼‍♂️"; + constexpr const char[] man_elf_tone3 = "🧝🏽‍♂️"; + constexpr const char[] man_elf_medium_skin_tone = "🧝🏽‍♂️"; + constexpr const char[] man_elf_tone4 = "🧝🏾‍♂️"; + constexpr const char[] man_elf_medium_dark_skin_tone = "🧝🏾‍♂️"; + constexpr const char[] man_elf_tone5 = "🧝🏿‍♂️"; + constexpr const char[] man_elf_dark_skin_tone = "🧝🏿‍♂️"; + constexpr const char[] troll = "🧌"; + constexpr const char[] vampire = "🧛"; + constexpr const char[] vampire_tone1 = "🧛🏻"; + constexpr const char[] vampire_light_skin_tone = "🧛🏻"; + constexpr const char[] vampire_tone2 = "🧛🏼"; + constexpr const char[] vampire_medium_light_skin_tone = "🧛🏼"; + constexpr const char[] vampire_tone3 = "🧛🏽"; + constexpr const char[] vampire_medium_skin_tone = "🧛🏽"; + constexpr const char[] vampire_tone4 = "🧛🏾"; + constexpr const char[] vampire_medium_dark_skin_tone = "🧛🏾"; + constexpr const char[] vampire_tone5 = "🧛🏿"; + constexpr const char[] vampire_dark_skin_tone = "🧛🏿"; + constexpr const char[] woman_vampire = "🧛‍♀️"; + constexpr const char[] woman_vampire_tone1 = "🧛🏻‍♀️"; + constexpr const char[] woman_vampire_light_skin_tone = "🧛🏻‍♀️"; + constexpr const char[] woman_vampire_tone2 = "🧛🏼‍♀️"; + constexpr const char[] woman_vampire_medium_light_skin_tone = "🧛🏼‍♀️"; + constexpr const char[] woman_vampire_tone3 = "🧛🏽‍♀️"; + constexpr const char[] woman_vampire_medium_skin_tone = "🧛🏽‍♀️"; + constexpr const char[] woman_vampire_tone4 = "🧛🏾‍♀️"; + constexpr const char[] woman_vampire_medium_dark_skin_tone = "🧛🏾‍♀️"; + constexpr const char[] woman_vampire_tone5 = "🧛🏿‍♀️"; + constexpr const char[] woman_vampire_dark_skin_tone = "🧛🏿‍♀️"; + constexpr const char[] man_vampire = "🧛‍♂️"; + constexpr const char[] man_vampire_tone1 = "🧛🏻‍♂️"; + constexpr const char[] man_vampire_light_skin_tone = "🧛🏻‍♂️"; + constexpr const char[] man_vampire_tone2 = "🧛🏼‍♂️"; + constexpr const char[] man_vampire_medium_light_skin_tone = "🧛🏼‍♂️"; + constexpr const char[] man_vampire_tone3 = "🧛🏽‍♂️"; + constexpr const char[] man_vampire_medium_skin_tone = "🧛🏽‍♂️"; + constexpr const char[] man_vampire_tone4 = "🧛🏾‍♂️"; + constexpr const char[] man_vampire_medium_dark_skin_tone = "🧛🏾‍♂️"; + constexpr const char[] man_vampire_tone5 = "🧛🏿‍♂️"; + constexpr const char[] man_vampire_dark_skin_tone = "🧛🏿‍♂️"; + constexpr const char[] zombie = "🧟"; + constexpr const char[] woman_zombie = "🧟‍♀️"; + constexpr const char[] man_zombie = "🧟‍♂️"; + constexpr const char[] genie = "🧞"; + constexpr const char[] woman_genie = "🧞‍♀️"; + constexpr const char[] man_genie = "🧞‍♂️"; + constexpr const char[] merperson = "🧜"; + constexpr const char[] merperson_tone1 = "🧜🏻"; + constexpr const char[] merperson_light_skin_tone = "🧜🏻"; + constexpr const char[] merperson_tone2 = "🧜🏼"; + constexpr const char[] merperson_medium_light_skin_tone = "🧜🏼"; + constexpr const char[] merperson_tone3 = "🧜🏽"; + constexpr const char[] merperson_medium_skin_tone = "🧜🏽"; + constexpr const char[] merperson_tone4 = "🧜🏾"; + constexpr const char[] merperson_medium_dark_skin_tone = "🧜🏾"; + constexpr const char[] merperson_tone5 = "🧜🏿"; + constexpr const char[] merperson_dark_skin_tone = "🧜🏿"; + constexpr const char[] mermaid = "🧜‍♀️"; + constexpr const char[] mermaid_tone1 = "🧜🏻‍♀️"; + constexpr const char[] mermaid_light_skin_tone = "🧜🏻‍♀️"; + constexpr const char[] mermaid_tone2 = "🧜🏼‍♀️"; + constexpr const char[] mermaid_medium_light_skin_tone = "🧜🏼‍♀️"; + constexpr const char[] mermaid_tone3 = "🧜🏽‍♀️"; + constexpr const char[] mermaid_medium_skin_tone = "🧜🏽‍♀️"; + constexpr const char[] mermaid_tone4 = "🧜🏾‍♀️"; + constexpr const char[] mermaid_medium_dark_skin_tone = "🧜🏾‍♀️"; + constexpr const char[] mermaid_tone5 = "🧜🏿‍♀️"; + constexpr const char[] mermaid_dark_skin_tone = "🧜🏿‍♀️"; + constexpr const char[] merman = "🧜‍♂️"; + constexpr const char[] merman_tone1 = "🧜🏻‍♂️"; + constexpr const char[] merman_light_skin_tone = "🧜🏻‍♂️"; + constexpr const char[] merman_tone2 = "🧜🏼‍♂️"; + constexpr const char[] merman_medium_light_skin_tone = "🧜🏼‍♂️"; + constexpr const char[] merman_tone3 = "🧜🏽‍♂️"; + constexpr const char[] merman_medium_skin_tone = "🧜🏽‍♂️"; + constexpr const char[] merman_tone4 = "🧜🏾‍♂️"; + constexpr const char[] merman_medium_dark_skin_tone = "🧜🏾‍♂️"; + constexpr const char[] merman_tone5 = "🧜🏿‍♂️"; + constexpr const char[] merman_dark_skin_tone = "🧜🏿‍♂️"; + constexpr const char[] fairy = "🧚"; + constexpr const char[] fairy_tone1 = "🧚🏻"; + constexpr const char[] fairy_light_skin_tone = "🧚🏻"; + constexpr const char[] fairy_tone2 = "🧚🏼"; + constexpr const char[] fairy_medium_light_skin_tone = "🧚🏼"; + constexpr const char[] fairy_tone3 = "🧚🏽"; + constexpr const char[] fairy_medium_skin_tone = "🧚🏽"; + constexpr const char[] fairy_tone4 = "🧚🏾"; + constexpr const char[] fairy_medium_dark_skin_tone = "🧚🏾"; + constexpr const char[] fairy_tone5 = "🧚🏿"; + constexpr const char[] fairy_dark_skin_tone = "🧚🏿"; + constexpr const char[] woman_fairy = "🧚‍♀️"; + constexpr const char[] woman_fairy_tone1 = "🧚🏻‍♀️"; + constexpr const char[] woman_fairy_light_skin_tone = "🧚🏻‍♀️"; + constexpr const char[] woman_fairy_tone2 = "🧚🏼‍♀️"; + constexpr const char[] woman_fairy_medium_light_skin_tone = "🧚🏼‍♀️"; + constexpr const char[] woman_fairy_tone3 = "🧚🏽‍♀️"; + constexpr const char[] woman_fairy_medium_skin_tone = "🧚🏽‍♀️"; + constexpr const char[] woman_fairy_tone4 = "🧚🏾‍♀️"; + constexpr const char[] woman_fairy_medium_dark_skin_tone = "🧚🏾‍♀️"; + constexpr const char[] woman_fairy_tone5 = "🧚🏿‍♀️"; + constexpr const char[] woman_fairy_dark_skin_tone = "🧚🏿‍♀️"; + constexpr const char[] man_fairy = "🧚‍♂️"; + constexpr const char[] man_fairy_tone1 = "🧚🏻‍♂️"; + constexpr const char[] man_fairy_light_skin_tone = "🧚🏻‍♂️"; + constexpr const char[] man_fairy_tone2 = "🧚🏼‍♂️"; + constexpr const char[] man_fairy_medium_light_skin_tone = "🧚🏼‍♂️"; + constexpr const char[] man_fairy_tone3 = "🧚🏽‍♂️"; + constexpr const char[] man_fairy_medium_skin_tone = "🧚🏽‍♂️"; + constexpr const char[] man_fairy_tone4 = "🧚🏾‍♂️"; + constexpr const char[] man_fairy_medium_dark_skin_tone = "🧚🏾‍♂️"; + constexpr const char[] man_fairy_tone5 = "🧚🏿‍♂️"; + constexpr const char[] man_fairy_dark_skin_tone = "🧚🏿‍♂️"; + constexpr const char[] angel = "👼"; + constexpr const char[] angel_tone1 = "👼🏻"; + constexpr const char[] angel_tone2 = "👼🏼"; + constexpr const char[] angel_tone3 = "👼🏽"; + constexpr const char[] angel_tone4 = "👼🏾"; + constexpr const char[] angel_tone5 = "👼🏿"; + constexpr const char[] pregnant_person = "🫄"; + constexpr const char[] pregnant_person_tone1 = "🫄🏻"; + constexpr const char[] pregnant_person_light_skin_tone = "🫄🏻"; + constexpr const char[] pregnant_person_tone2 = "🫄🏼"; + constexpr const char[] pregnant_person_medium_light_skin_tone = "🫄🏼"; + constexpr const char[] pregnant_person_tone3 = "🫄🏽"; + constexpr const char[] pregnant_person_medium_skin_tone = "🫄🏽"; + constexpr const char[] pregnant_person_tone4 = "🫄🏾"; + constexpr const char[] pregnant_person_medium_dark_skin_tone = "🫄🏾"; + constexpr const char[] pregnant_person_tone5 = "🫄🏿"; + constexpr const char[] pregnant_person_dark_skin_tone = "🫄🏿"; + constexpr const char[] pregnant_woman = "🤰"; + constexpr const char[] expecting_woman = "🤰"; + constexpr const char[] pregnant_woman_tone1 = "🤰🏻"; + constexpr const char[] expecting_woman_tone1 = "🤰🏻"; + constexpr const char[] pregnant_woman_tone2 = "🤰🏼"; + constexpr const char[] expecting_woman_tone2 = "🤰🏼"; + constexpr const char[] pregnant_woman_tone3 = "🤰🏽"; + constexpr const char[] expecting_woman_tone3 = "🤰🏽"; + constexpr const char[] pregnant_woman_tone4 = "🤰🏾"; + constexpr const char[] expecting_woman_tone4 = "🤰🏾"; + constexpr const char[] pregnant_woman_tone5 = "🤰🏿"; + constexpr const char[] expecting_woman_tone5 = "🤰🏿"; + constexpr const char[] pregnant_man = "🫃"; + constexpr const char[] pregnant_man_tone1 = "🫃🏻"; + constexpr const char[] pregnant_man_light_skin_tone = "🫃🏻"; + constexpr const char[] pregnant_man_tone2 = "🫃🏼"; + constexpr const char[] pregnant_man_medium_light_skin_tone = "🫃🏼"; + constexpr const char[] pregnant_man_tone3 = "🫃🏽"; + constexpr const char[] pregnant_man_medium_skin_tone = "🫃🏽"; + constexpr const char[] pregnant_man_tone4 = "🫃🏾"; + constexpr const char[] pregnant_man_medium_dark_skin_tone = "🫃🏾"; + constexpr const char[] pregnant_man_tone5 = "🫃🏿"; + constexpr const char[] pregnant_man_dark_skin_tone = "🫃🏿"; + constexpr const char[] breast_feeding = "🤱"; + constexpr const char[] breast_feeding_tone1 = "🤱🏻"; + constexpr const char[] breast_feeding_light_skin_tone = "🤱🏻"; + constexpr const char[] breast_feeding_tone2 = "🤱🏼"; + constexpr const char[] breast_feeding_medium_light_skin_tone = "🤱🏼"; + constexpr const char[] breast_feeding_tone3 = "🤱🏽"; + constexpr const char[] breast_feeding_medium_skin_tone = "🤱🏽"; + constexpr const char[] breast_feeding_tone4 = "🤱🏾"; + constexpr const char[] breast_feeding_medium_dark_skin_tone = "🤱🏾"; + constexpr const char[] breast_feeding_tone5 = "🤱🏿"; + constexpr const char[] breast_feeding_dark_skin_tone = "🤱🏿"; + constexpr const char[] person_feeding_baby = "🧑‍🍼"; + constexpr const char[] person_feeding_baby_tone1 = "🧑🏻‍🍼"; + constexpr const char[] person_feeding_baby_light_skin_tone = "🧑🏻‍🍼"; + constexpr const char[] person_feeding_baby_tone2 = "🧑🏼‍🍼"; + constexpr const char[] person_feeding_baby_medium_light_skin_tone = "🧑🏼‍🍼"; + constexpr const char[] person_feeding_baby_tone3 = "🧑🏽‍🍼"; + constexpr const char[] person_feeding_baby_medium_skin_tone = "🧑🏽‍🍼"; + constexpr const char[] person_feeding_baby_tone4 = "🧑🏾‍🍼"; + constexpr const char[] person_feeding_baby_medium_dark_skin_tone = "🧑🏾‍🍼"; + constexpr const char[] person_feeding_baby_tone5 = "🧑🏿‍🍼"; + constexpr const char[] person_feeding_baby_dark_skin_tone = "🧑🏿‍🍼"; + constexpr const char[] woman_feeding_baby = "👩‍🍼"; + constexpr const char[] woman_feeding_baby_tone1 = "👩🏻‍🍼"; + constexpr const char[] woman_feeding_baby_light_skin_tone = "👩🏻‍🍼"; + constexpr const char[] woman_feeding_baby_tone2 = "👩🏼‍🍼"; + constexpr const char[] woman_feeding_baby_medium_light_skin_tone = "👩🏼‍🍼"; + constexpr const char[] woman_feeding_baby_tone3 = "👩🏽‍🍼"; + constexpr const char[] woman_feeding_baby_medium_skin_tone = "👩🏽‍🍼"; + constexpr const char[] woman_feeding_baby_tone4 = "👩🏾‍🍼"; + constexpr const char[] woman_feeding_baby_medium_dark_skin_tone = "👩🏾‍🍼"; + constexpr const char[] woman_feeding_baby_tone5 = "👩🏿‍🍼"; + constexpr const char[] woman_feeding_baby_dark_skin_tone = "👩🏿‍🍼"; + constexpr const char[] man_feeding_baby = "👨‍🍼"; + constexpr const char[] man_feeding_baby_tone1 = "👨🏻‍🍼"; + constexpr const char[] man_feeding_baby_light_skin_tone = "👨🏻‍🍼"; + constexpr const char[] man_feeding_baby_tone2 = "👨🏼‍🍼"; + constexpr const char[] man_feeding_baby_medium_light_skin_tone = "👨🏼‍🍼"; + constexpr const char[] man_feeding_baby_tone3 = "👨🏽‍🍼"; + constexpr const char[] man_feeding_baby_medium_skin_tone = "👨🏽‍🍼"; + constexpr const char[] man_feeding_baby_tone4 = "👨🏾‍🍼"; + constexpr const char[] man_feeding_baby_medium_dark_skin_tone = "👨🏾‍🍼"; + constexpr const char[] man_feeding_baby_tone5 = "👨🏿‍🍼"; + constexpr const char[] man_feeding_baby_dark_skin_tone = "👨🏿‍🍼"; + constexpr const char[] person_bowing = "🙇"; + constexpr const char[] bow = "🙇"; + constexpr const char[] person_bowing_tone1 = "🙇🏻"; + constexpr const char[] bow_tone1 = "🙇🏻"; + constexpr const char[] person_bowing_tone2 = "🙇🏼"; + constexpr const char[] bow_tone2 = "🙇🏼"; + constexpr const char[] person_bowing_tone3 = "🙇🏽"; + constexpr const char[] bow_tone3 = "🙇🏽"; + constexpr const char[] person_bowing_tone4 = "🙇🏾"; + constexpr const char[] bow_tone4 = "🙇🏾"; + constexpr const char[] person_bowing_tone5 = "🙇🏿"; + constexpr const char[] bow_tone5 = "🙇🏿"; + constexpr const char[] woman_bowing = "🙇‍♀️"; + constexpr const char[] woman_bowing_tone1 = "🙇🏻‍♀️"; + constexpr const char[] woman_bowing_light_skin_tone = "🙇🏻‍♀️"; + constexpr const char[] woman_bowing_tone2 = "🙇🏼‍♀️"; + constexpr const char[] woman_bowing_medium_light_skin_tone = "🙇🏼‍♀️"; + constexpr const char[] woman_bowing_tone3 = "🙇🏽‍♀️"; + constexpr const char[] woman_bowing_medium_skin_tone = "🙇🏽‍♀️"; + constexpr const char[] woman_bowing_tone4 = "🙇🏾‍♀️"; + constexpr const char[] woman_bowing_medium_dark_skin_tone = "🙇🏾‍♀️"; + constexpr const char[] woman_bowing_tone5 = "🙇🏿‍♀️"; + constexpr const char[] woman_bowing_dark_skin_tone = "🙇🏿‍♀️"; + constexpr const char[] man_bowing = "🙇‍♂️"; + constexpr const char[] man_bowing_tone1 = "🙇🏻‍♂️"; + constexpr const char[] man_bowing_light_skin_tone = "🙇🏻‍♂️"; + constexpr const char[] man_bowing_tone2 = "🙇🏼‍♂️"; + constexpr const char[] man_bowing_medium_light_skin_tone = "🙇🏼‍♂️"; + constexpr const char[] man_bowing_tone3 = "🙇🏽‍♂️"; + constexpr const char[] man_bowing_medium_skin_tone = "🙇🏽‍♂️"; + constexpr const char[] man_bowing_tone4 = "🙇🏾‍♂️"; + constexpr const char[] man_bowing_medium_dark_skin_tone = "🙇🏾‍♂️"; + constexpr const char[] man_bowing_tone5 = "🙇🏿‍♂️"; + constexpr const char[] man_bowing_dark_skin_tone = "🙇🏿‍♂️"; + constexpr const char[] person_tipping_hand = "💁"; + constexpr const char[] information_desk_person = "💁"; + constexpr const char[] person_tipping_hand_tone1 = "💁🏻"; + constexpr const char[] information_desk_person_tone1 = "💁🏻"; + constexpr const char[] person_tipping_hand_tone2 = "💁🏼"; + constexpr const char[] information_desk_person_tone2 = "💁🏼"; + constexpr const char[] person_tipping_hand_tone3 = "💁🏽"; + constexpr const char[] information_desk_person_tone3 = "💁🏽"; + constexpr const char[] person_tipping_hand_tone4 = "💁🏾"; + constexpr const char[] information_desk_person_tone4 = "💁🏾"; + constexpr const char[] person_tipping_hand_tone5 = "💁🏿"; + constexpr const char[] information_desk_person_tone5 = "💁🏿"; + constexpr const char[] woman_tipping_hand = "💁‍♀️"; + constexpr const char[] woman_tipping_hand_tone1 = "💁🏻‍♀️"; + constexpr const char[] woman_tipping_hand_light_skin_tone = "💁🏻‍♀️"; + constexpr const char[] woman_tipping_hand_tone2 = "💁🏼‍♀️"; + constexpr const char[] woman_tipping_hand_medium_light_skin_tone = "💁🏼‍♀️"; + constexpr const char[] woman_tipping_hand_tone3 = "💁🏽‍♀️"; + constexpr const char[] woman_tipping_hand_medium_skin_tone = "💁🏽‍♀️"; + constexpr const char[] woman_tipping_hand_tone4 = "💁🏾‍♀️"; + constexpr const char[] woman_tipping_hand_medium_dark_skin_tone = "💁🏾‍♀️"; + constexpr const char[] woman_tipping_hand_tone5 = "💁🏿‍♀️"; + constexpr const char[] woman_tipping_hand_dark_skin_tone = "💁🏿‍♀️"; + constexpr const char[] man_tipping_hand = "💁‍♂️"; + constexpr const char[] man_tipping_hand_tone1 = "💁🏻‍♂️"; + constexpr const char[] man_tipping_hand_light_skin_tone = "💁🏻‍♂️"; + constexpr const char[] man_tipping_hand_tone2 = "💁🏼‍♂️"; + constexpr const char[] man_tipping_hand_medium_light_skin_tone = "💁🏼‍♂️"; + constexpr const char[] man_tipping_hand_tone3 = "💁🏽‍♂️"; + constexpr const char[] man_tipping_hand_medium_skin_tone = "💁🏽‍♂️"; + constexpr const char[] man_tipping_hand_tone4 = "💁🏾‍♂️"; + constexpr const char[] man_tipping_hand_medium_dark_skin_tone = "💁🏾‍♂️"; + constexpr const char[] man_tipping_hand_tone5 = "💁🏿‍♂️"; + constexpr const char[] man_tipping_hand_dark_skin_tone = "💁🏿‍♂️"; + constexpr const char[] person_gesturing_no = "🙅"; + constexpr const char[] no_good = "🙅"; + constexpr const char[] person_gesturing_no_tone1 = "🙅🏻"; + constexpr const char[] no_good_tone1 = "🙅🏻"; + constexpr const char[] person_gesturing_no_tone2 = "🙅🏼"; + constexpr const char[] no_good_tone2 = "🙅🏼"; + constexpr const char[] person_gesturing_no_tone3 = "🙅🏽"; + constexpr const char[] no_good_tone3 = "🙅🏽"; + constexpr const char[] person_gesturing_no_tone4 = "🙅🏾"; + constexpr const char[] no_good_tone4 = "🙅🏾"; + constexpr const char[] person_gesturing_no_tone5 = "🙅🏿"; + constexpr const char[] no_good_tone5 = "🙅🏿"; + constexpr const char[] woman_gesturing_no = "🙅‍♀️"; + constexpr const char[] woman_gesturing_no_tone1 = "🙅🏻‍♀️"; + constexpr const char[] woman_gesturing_no_light_skin_tone = "🙅🏻‍♀️"; + constexpr const char[] woman_gesturing_no_tone2 = "🙅🏼‍♀️"; + constexpr const char[] woman_gesturing_no_medium_light_skin_tone = "🙅🏼‍♀️"; + constexpr const char[] woman_gesturing_no_tone3 = "🙅🏽‍♀️"; + constexpr const char[] woman_gesturing_no_medium_skin_tone = "🙅🏽‍♀️"; + constexpr const char[] woman_gesturing_no_tone4 = "🙅🏾‍♀️"; + constexpr const char[] woman_gesturing_no_medium_dark_skin_tone = "🙅🏾‍♀️"; + constexpr const char[] woman_gesturing_no_tone5 = "🙅🏿‍♀️"; + constexpr const char[] woman_gesturing_no_dark_skin_tone = "🙅🏿‍♀️"; + constexpr const char[] man_gesturing_no = "🙅‍♂️"; + constexpr const char[] man_gesturing_no_tone1 = "🙅🏻‍♂️"; + constexpr const char[] man_gesturing_no_light_skin_tone = "🙅🏻‍♂️"; + constexpr const char[] man_gesturing_no_tone2 = "🙅🏼‍♂️"; + constexpr const char[] man_gesturing_no_medium_light_skin_tone = "🙅🏼‍♂️"; + constexpr const char[] man_gesturing_no_tone3 = "🙅🏽‍♂️"; + constexpr const char[] man_gesturing_no_medium_skin_tone = "🙅🏽‍♂️"; + constexpr const char[] man_gesturing_no_tone4 = "🙅🏾‍♂️"; + constexpr const char[] man_gesturing_no_medium_dark_skin_tone = "🙅🏾‍♂️"; + constexpr const char[] man_gesturing_no_tone5 = "🙅🏿‍♂️"; + constexpr const char[] man_gesturing_no_dark_skin_tone = "🙅🏿‍♂️"; + constexpr const char[] person_gesturing_ok = "🙆"; + constexpr const char[] person_gesturing_ok_tone1 = "🙆🏻"; + constexpr const char[] person_gesturing_ok_tone2 = "🙆🏼"; + constexpr const char[] person_gesturing_ok_tone3 = "🙆🏽"; + constexpr const char[] person_gesturing_ok_tone4 = "🙆🏾"; + constexpr const char[] person_gesturing_ok_tone5 = "🙆🏿"; + constexpr const char[] woman_gesturing_ok = "🙆‍♀️"; + constexpr const char[] woman_gesturing_ok_tone1 = "🙆🏻‍♀️"; + constexpr const char[] woman_gesturing_ok_light_skin_tone = "🙆🏻‍♀️"; + constexpr const char[] woman_gesturing_ok_tone2 = "🙆🏼‍♀️"; + constexpr const char[] woman_gesturing_ok_medium_light_skin_tone = "🙆🏼‍♀️"; + constexpr const char[] woman_gesturing_ok_tone3 = "🙆🏽‍♀️"; + constexpr const char[] woman_gesturing_ok_medium_skin_tone = "🙆🏽‍♀️"; + constexpr const char[] woman_gesturing_ok_tone4 = "🙆🏾‍♀️"; + constexpr const char[] woman_gesturing_ok_medium_dark_skin_tone = "🙆🏾‍♀️"; + constexpr const char[] woman_gesturing_ok_tone5 = "🙆🏿‍♀️"; + constexpr const char[] woman_gesturing_ok_dark_skin_tone = "🙆🏿‍♀️"; + constexpr const char[] man_gesturing_ok = "🙆‍♂️"; + constexpr const char[] man_gesturing_ok_tone1 = "🙆🏻‍♂️"; + constexpr const char[] man_gesturing_ok_light_skin_tone = "🙆🏻‍♂️"; + constexpr const char[] man_gesturing_ok_tone2 = "🙆🏼‍♂️"; + constexpr const char[] man_gesturing_ok_medium_light_skin_tone = "🙆🏼‍♂️"; + constexpr const char[] man_gesturing_ok_tone3 = "🙆🏽‍♂️"; + constexpr const char[] man_gesturing_ok_medium_skin_tone = "🙆🏽‍♂️"; + constexpr const char[] man_gesturing_ok_tone4 = "🙆🏾‍♂️"; + constexpr const char[] man_gesturing_ok_medium_dark_skin_tone = "🙆🏾‍♂️"; + constexpr const char[] man_gesturing_ok_tone5 = "🙆🏿‍♂️"; + constexpr const char[] man_gesturing_ok_dark_skin_tone = "🙆🏿‍♂️"; + constexpr const char[] person_raising_hand = "🙋"; + constexpr const char[] raising_hand = "🙋"; + constexpr const char[] person_raising_hand_tone1 = "🙋🏻"; + constexpr const char[] raising_hand_tone1 = "🙋🏻"; + constexpr const char[] person_raising_hand_tone2 = "🙋🏼"; + constexpr const char[] raising_hand_tone2 = "🙋🏼"; + constexpr const char[] person_raising_hand_tone3 = "🙋🏽"; + constexpr const char[] raising_hand_tone3 = "🙋🏽"; + constexpr const char[] person_raising_hand_tone4 = "🙋🏾"; + constexpr const char[] raising_hand_tone4 = "🙋🏾"; + constexpr const char[] person_raising_hand_tone5 = "🙋🏿"; + constexpr const char[] raising_hand_tone5 = "🙋🏿"; + constexpr const char[] woman_raising_hand = "🙋‍♀️"; + constexpr const char[] woman_raising_hand_tone1 = "🙋🏻‍♀️"; + constexpr const char[] woman_raising_hand_light_skin_tone = "🙋🏻‍♀️"; + constexpr const char[] woman_raising_hand_tone2 = "🙋🏼‍♀️"; + constexpr const char[] woman_raising_hand_medium_light_skin_tone = "🙋🏼‍♀️"; + constexpr const char[] woman_raising_hand_tone3 = "🙋🏽‍♀️"; + constexpr const char[] woman_raising_hand_medium_skin_tone = "🙋🏽‍♀️"; + constexpr const char[] woman_raising_hand_tone4 = "🙋🏾‍♀️"; + constexpr const char[] woman_raising_hand_medium_dark_skin_tone = "🙋🏾‍♀️"; + constexpr const char[] woman_raising_hand_tone5 = "🙋🏿‍♀️"; + constexpr const char[] woman_raising_hand_dark_skin_tone = "🙋🏿‍♀️"; + constexpr const char[] man_raising_hand = "🙋‍♂️"; + constexpr const char[] man_raising_hand_tone1 = "🙋🏻‍♂️"; + constexpr const char[] man_raising_hand_light_skin_tone = "🙋🏻‍♂️"; + constexpr const char[] man_raising_hand_tone2 = "🙋🏼‍♂️"; + constexpr const char[] man_raising_hand_medium_light_skin_tone = "🙋🏼‍♂️"; + constexpr const char[] man_raising_hand_tone3 = "🙋🏽‍♂️"; + constexpr const char[] man_raising_hand_medium_skin_tone = "🙋🏽‍♂️"; + constexpr const char[] man_raising_hand_tone4 = "🙋🏾‍♂️"; + constexpr const char[] man_raising_hand_medium_dark_skin_tone = "🙋🏾‍♂️"; + constexpr const char[] man_raising_hand_tone5 = "🙋🏿‍♂️"; + constexpr const char[] man_raising_hand_dark_skin_tone = "🙋🏿‍♂️"; + constexpr const char[] deaf_person = "🧏"; + constexpr const char[] deaf_person_tone1 = "🧏🏻"; + constexpr const char[] deaf_person_light_skin_tone = "🧏🏻"; + constexpr const char[] deaf_person_tone2 = "🧏🏼"; + constexpr const char[] deaf_person_medium_light_skin_tone = "🧏🏼"; + constexpr const char[] deaf_person_tone3 = "🧏🏽"; + constexpr const char[] deaf_person_medium_skin_tone = "🧏🏽"; + constexpr const char[] deaf_person_tone4 = "🧏🏾"; + constexpr const char[] deaf_person_medium_dark_skin_tone = "🧏🏾"; + constexpr const char[] deaf_person_tone5 = "🧏🏿"; + constexpr const char[] deaf_person_dark_skin_tone = "🧏🏿"; + constexpr const char[] deaf_woman = "🧏‍♀️"; + constexpr const char[] deaf_woman_tone1 = "🧏🏻‍♀️"; + constexpr const char[] deaf_woman_light_skin_tone = "🧏🏻‍♀️"; + constexpr const char[] deaf_woman_tone2 = "🧏🏼‍♀️"; + constexpr const char[] deaf_woman_medium_light_skin_tone = "🧏🏼‍♀️"; + constexpr const char[] deaf_woman_tone3 = "🧏🏽‍♀️"; + constexpr const char[] deaf_woman_medium_skin_tone = "🧏🏽‍♀️"; + constexpr const char[] deaf_woman_tone4 = "🧏🏾‍♀️"; + constexpr const char[] deaf_woman_medium_dark_skin_tone = "🧏🏾‍♀️"; + constexpr const char[] deaf_woman_tone5 = "🧏🏿‍♀️"; + constexpr const char[] deaf_woman_dark_skin_tone = "🧏🏿‍♀️"; + constexpr const char[] deaf_man = "🧏‍♂️"; + constexpr const char[] deaf_man_tone1 = "🧏🏻‍♂️"; + constexpr const char[] deaf_man_light_skin_tone = "🧏🏻‍♂️"; + constexpr const char[] deaf_man_tone2 = "🧏🏼‍♂️"; + constexpr const char[] deaf_man_medium_light_skin_tone = "🧏🏼‍♂️"; + constexpr const char[] deaf_man_tone3 = "🧏🏽‍♂️"; + constexpr const char[] deaf_man_medium_skin_tone = "🧏🏽‍♂️"; + constexpr const char[] deaf_man_tone4 = "🧏🏾‍♂️"; + constexpr const char[] deaf_man_medium_dark_skin_tone = "🧏🏾‍♂️"; + constexpr const char[] deaf_man_tone5 = "🧏🏿‍♂️"; + constexpr const char[] deaf_man_dark_skin_tone = "🧏🏿‍♂️"; + constexpr const char[] person_facepalming = "🤦"; + constexpr const char[] face_palm = "🤦"; + constexpr const char[] facepalm = "🤦"; + constexpr const char[] person_facepalming_tone1 = "🤦🏻"; + constexpr const char[] face_palm_tone1 = "🤦🏻"; + constexpr const char[] facepalm_tone1 = "🤦🏻"; + constexpr const char[] person_facepalming_tone2 = "🤦🏼"; + constexpr const char[] face_palm_tone2 = "🤦🏼"; + constexpr const char[] facepalm_tone2 = "🤦🏼"; + constexpr const char[] person_facepalming_tone3 = "🤦🏽"; + constexpr const char[] face_palm_tone3 = "🤦🏽"; + constexpr const char[] facepalm_tone3 = "🤦🏽"; + constexpr const char[] person_facepalming_tone4 = "🤦🏾"; + constexpr const char[] face_palm_tone4 = "🤦🏾"; + constexpr const char[] facepalm_tone4 = "🤦🏾"; + constexpr const char[] person_facepalming_tone5 = "🤦🏿"; + constexpr const char[] face_palm_tone5 = "🤦🏿"; + constexpr const char[] facepalm_tone5 = "🤦🏿"; + constexpr const char[] woman_facepalming = "🤦‍♀️"; + constexpr const char[] woman_facepalming_tone1 = "🤦🏻‍♀️"; + constexpr const char[] woman_facepalming_light_skin_tone = "🤦🏻‍♀️"; + constexpr const char[] woman_facepalming_tone2 = "🤦🏼‍♀️"; + constexpr const char[] woman_facepalming_medium_light_skin_tone = "🤦🏼‍♀️"; + constexpr const char[] woman_facepalming_tone3 = "🤦🏽‍♀️"; + constexpr const char[] woman_facepalming_medium_skin_tone = "🤦🏽‍♀️"; + constexpr const char[] woman_facepalming_tone4 = "🤦🏾‍♀️"; + constexpr const char[] woman_facepalming_medium_dark_skin_tone = "🤦🏾‍♀️"; + constexpr const char[] woman_facepalming_tone5 = "🤦🏿‍♀️"; + constexpr const char[] woman_facepalming_dark_skin_tone = "🤦🏿‍♀️"; + constexpr const char[] man_facepalming = "🤦‍♂️"; + constexpr const char[] man_facepalming_tone1 = "🤦🏻‍♂️"; + constexpr const char[] man_facepalming_light_skin_tone = "🤦🏻‍♂️"; + constexpr const char[] man_facepalming_tone2 = "🤦🏼‍♂️"; + constexpr const char[] man_facepalming_medium_light_skin_tone = "🤦🏼‍♂️"; + constexpr const char[] man_facepalming_tone3 = "🤦🏽‍♂️"; + constexpr const char[] man_facepalming_medium_skin_tone = "🤦🏽‍♂️"; + constexpr const char[] man_facepalming_tone4 = "🤦🏾‍♂️"; + constexpr const char[] man_facepalming_medium_dark_skin_tone = "🤦🏾‍♂️"; + constexpr const char[] man_facepalming_tone5 = "🤦🏿‍♂️"; + constexpr const char[] man_facepalming_dark_skin_tone = "🤦🏿‍♂️"; + constexpr const char[] person_shrugging = "🤷"; + constexpr const char[] shrug = "🤷"; + constexpr const char[] person_shrugging_tone1 = "🤷🏻"; + constexpr const char[] shrug_tone1 = "🤷🏻"; + constexpr const char[] person_shrugging_tone2 = "🤷🏼"; + constexpr const char[] shrug_tone2 = "🤷🏼"; + constexpr const char[] person_shrugging_tone3 = "🤷🏽"; + constexpr const char[] shrug_tone3 = "🤷🏽"; + constexpr const char[] person_shrugging_tone4 = "🤷🏾"; + constexpr const char[] shrug_tone4 = "🤷🏾"; + constexpr const char[] person_shrugging_tone5 = "🤷🏿"; + constexpr const char[] shrug_tone5 = "🤷🏿"; + constexpr const char[] woman_shrugging = "🤷‍♀️"; + constexpr const char[] woman_shrugging_tone1 = "🤷🏻‍♀️"; + constexpr const char[] woman_shrugging_light_skin_tone = "🤷🏻‍♀️"; + constexpr const char[] woman_shrugging_tone2 = "🤷🏼‍♀️"; + constexpr const char[] woman_shrugging_medium_light_skin_tone = "🤷🏼‍♀️"; + constexpr const char[] woman_shrugging_tone3 = "🤷🏽‍♀️"; + constexpr const char[] woman_shrugging_medium_skin_tone = "🤷🏽‍♀️"; + constexpr const char[] woman_shrugging_tone4 = "🤷🏾‍♀️"; + constexpr const char[] woman_shrugging_medium_dark_skin_tone = "🤷🏾‍♀️"; + constexpr const char[] woman_shrugging_tone5 = "🤷🏿‍♀️"; + constexpr const char[] woman_shrugging_dark_skin_tone = "🤷🏿‍♀️"; + constexpr const char[] man_shrugging = "🤷‍♂️"; + constexpr const char[] man_shrugging_tone1 = "🤷🏻‍♂️"; + constexpr const char[] man_shrugging_light_skin_tone = "🤷🏻‍♂️"; + constexpr const char[] man_shrugging_tone2 = "🤷🏼‍♂️"; + constexpr const char[] man_shrugging_medium_light_skin_tone = "🤷🏼‍♂️"; + constexpr const char[] man_shrugging_tone3 = "🤷🏽‍♂️"; + constexpr const char[] man_shrugging_medium_skin_tone = "🤷🏽‍♂️"; + constexpr const char[] man_shrugging_tone4 = "🤷🏾‍♂️"; + constexpr const char[] man_shrugging_medium_dark_skin_tone = "🤷🏾‍♂️"; + constexpr const char[] man_shrugging_tone5 = "🤷🏿‍♂️"; + constexpr const char[] man_shrugging_dark_skin_tone = "🤷🏿‍♂️"; + constexpr const char[] person_pouting = "🙎"; + constexpr const char[] person_with_pouting_face = "🙎"; + constexpr const char[] person_pouting_tone1 = "🙎🏻"; + constexpr const char[] person_with_pouting_face_tone1 = "🙎🏻"; + constexpr const char[] person_pouting_tone2 = "🙎🏼"; + constexpr const char[] person_with_pouting_face_tone2 = "🙎🏼"; + constexpr const char[] person_pouting_tone3 = "🙎🏽"; + constexpr const char[] person_with_pouting_face_tone3 = "🙎🏽"; + constexpr const char[] person_pouting_tone4 = "🙎🏾"; + constexpr const char[] person_with_pouting_face_tone4 = "🙎🏾"; + constexpr const char[] person_pouting_tone5 = "🙎🏿"; + constexpr const char[] person_with_pouting_face_tone5 = "🙎🏿"; + constexpr const char[] woman_pouting = "🙎‍♀️"; + constexpr const char[] woman_pouting_tone1 = "🙎🏻‍♀️"; + constexpr const char[] woman_pouting_light_skin_tone = "🙎🏻‍♀️"; + constexpr const char[] woman_pouting_tone2 = "🙎🏼‍♀️"; + constexpr const char[] woman_pouting_medium_light_skin_tone = "🙎🏼‍♀️"; + constexpr const char[] woman_pouting_tone3 = "🙎🏽‍♀️"; + constexpr const char[] woman_pouting_medium_skin_tone = "🙎🏽‍♀️"; + constexpr const char[] woman_pouting_tone4 = "🙎🏾‍♀️"; + constexpr const char[] woman_pouting_medium_dark_skin_tone = "🙎🏾‍♀️"; + constexpr const char[] woman_pouting_tone5 = "🙎🏿‍♀️"; + constexpr const char[] woman_pouting_dark_skin_tone = "🙎🏿‍♀️"; + constexpr const char[] man_pouting = "🙎‍♂️"; + constexpr const char[] man_pouting_tone1 = "🙎🏻‍♂️"; + constexpr const char[] man_pouting_light_skin_tone = "🙎🏻‍♂️"; + constexpr const char[] man_pouting_tone2 = "🙎🏼‍♂️"; + constexpr const char[] man_pouting_medium_light_skin_tone = "🙎🏼‍♂️"; + constexpr const char[] man_pouting_tone3 = "🙎🏽‍♂️"; + constexpr const char[] man_pouting_medium_skin_tone = "🙎🏽‍♂️"; + constexpr const char[] man_pouting_tone4 = "🙎🏾‍♂️"; + constexpr const char[] man_pouting_medium_dark_skin_tone = "🙎🏾‍♂️"; + constexpr const char[] man_pouting_tone5 = "🙎🏿‍♂️"; + constexpr const char[] man_pouting_dark_skin_tone = "🙎🏿‍♂️"; + constexpr const char[] person_frowning = "🙍"; + constexpr const char[] person_frowning_tone1 = "🙍🏻"; + constexpr const char[] person_frowning_tone2 = "🙍🏼"; + constexpr const char[] person_frowning_tone3 = "🙍🏽"; + constexpr const char[] person_frowning_tone4 = "🙍🏾"; + constexpr const char[] person_frowning_tone5 = "🙍🏿"; + constexpr const char[] woman_frowning = "🙍‍♀️"; + constexpr const char[] woman_frowning_tone1 = "🙍🏻‍♀️"; + constexpr const char[] woman_frowning_light_skin_tone = "🙍🏻‍♀️"; + constexpr const char[] woman_frowning_tone2 = "🙍🏼‍♀️"; + constexpr const char[] woman_frowning_medium_light_skin_tone = "🙍🏼‍♀️"; + constexpr const char[] woman_frowning_tone3 = "🙍🏽‍♀️"; + constexpr const char[] woman_frowning_medium_skin_tone = "🙍🏽‍♀️"; + constexpr const char[] woman_frowning_tone4 = "🙍🏾‍♀️"; + constexpr const char[] woman_frowning_medium_dark_skin_tone = "🙍🏾‍♀️"; + constexpr const char[] woman_frowning_tone5 = "🙍🏿‍♀️"; + constexpr const char[] woman_frowning_dark_skin_tone = "🙍🏿‍♀️"; + constexpr const char[] man_frowning = "🙍‍♂️"; + constexpr const char[] man_frowning_tone1 = "🙍🏻‍♂️"; + constexpr const char[] man_frowning_light_skin_tone = "🙍🏻‍♂️"; + constexpr const char[] man_frowning_tone2 = "🙍🏼‍♂️"; + constexpr const char[] man_frowning_medium_light_skin_tone = "🙍🏼‍♂️"; + constexpr const char[] man_frowning_tone3 = "🙍🏽‍♂️"; + constexpr const char[] man_frowning_medium_skin_tone = "🙍🏽‍♂️"; + constexpr const char[] man_frowning_tone4 = "🙍🏾‍♂️"; + constexpr const char[] man_frowning_medium_dark_skin_tone = "🙍🏾‍♂️"; + constexpr const char[] man_frowning_tone5 = "🙍🏿‍♂️"; + constexpr const char[] man_frowning_dark_skin_tone = "🙍🏿‍♂️"; + constexpr const char[] person_getting_haircut = "💇"; + constexpr const char[] haircut = "💇"; + constexpr const char[] person_getting_haircut_tone1 = "💇🏻"; + constexpr const char[] haircut_tone1 = "💇🏻"; + constexpr const char[] person_getting_haircut_tone2 = "💇🏼"; + constexpr const char[] haircut_tone2 = "💇🏼"; + constexpr const char[] person_getting_haircut_tone3 = "💇🏽"; + constexpr const char[] haircut_tone3 = "💇🏽"; + constexpr const char[] person_getting_haircut_tone4 = "💇🏾"; + constexpr const char[] haircut_tone4 = "💇🏾"; + constexpr const char[] person_getting_haircut_tone5 = "💇🏿"; + constexpr const char[] haircut_tone5 = "💇🏿"; + constexpr const char[] woman_getting_haircut = "💇‍♀️"; + constexpr const char[] woman_getting_haircut_tone1 = "💇🏻‍♀️"; + constexpr const char[] woman_getting_haircut_light_skin_tone = "💇🏻‍♀️"; + constexpr const char[] woman_getting_haircut_tone2 = "💇🏼‍♀️"; + constexpr const char[] woman_getting_haircut_medium_light_skin_tone = "💇🏼‍♀️"; + constexpr const char[] woman_getting_haircut_tone3 = "💇🏽‍♀️"; + constexpr const char[] woman_getting_haircut_medium_skin_tone = "💇🏽‍♀️"; + constexpr const char[] woman_getting_haircut_tone4 = "💇🏾‍♀️"; + constexpr const char[] woman_getting_haircut_medium_dark_skin_tone = "💇🏾‍♀️"; + constexpr const char[] woman_getting_haircut_tone5 = "💇🏿‍♀️"; + constexpr const char[] woman_getting_haircut_dark_skin_tone = "💇🏿‍♀️"; + constexpr const char[] man_getting_haircut = "💇‍♂️"; + constexpr const char[] man_getting_haircut_tone1 = "💇🏻‍♂️"; + constexpr const char[] man_getting_haircut_light_skin_tone = "💇🏻‍♂️"; + constexpr const char[] man_getting_haircut_tone2 = "💇🏼‍♂️"; + constexpr const char[] man_getting_haircut_medium_light_skin_tone = "💇🏼‍♂️"; + constexpr const char[] man_getting_haircut_tone3 = "💇🏽‍♂️"; + constexpr const char[] man_getting_haircut_medium_skin_tone = "💇🏽‍♂️"; + constexpr const char[] man_getting_haircut_tone4 = "💇🏾‍♂️"; + constexpr const char[] man_getting_haircut_medium_dark_skin_tone = "💇🏾‍♂️"; + constexpr const char[] man_getting_haircut_tone5 = "💇🏿‍♂️"; + constexpr const char[] man_getting_haircut_dark_skin_tone = "💇🏿‍♂️"; + constexpr const char[] person_getting_massage = "💆"; + constexpr const char[] massage = "💆"; + constexpr const char[] person_getting_massage_tone1 = "💆🏻"; + constexpr const char[] massage_tone1 = "💆🏻"; + constexpr const char[] person_getting_massage_tone2 = "💆🏼"; + constexpr const char[] massage_tone2 = "💆🏼"; + constexpr const char[] person_getting_massage_tone3 = "💆🏽"; + constexpr const char[] massage_tone3 = "💆🏽"; + constexpr const char[] person_getting_massage_tone4 = "💆🏾"; + constexpr const char[] massage_tone4 = "💆🏾"; + constexpr const char[] person_getting_massage_tone5 = "💆🏿"; + constexpr const char[] massage_tone5 = "💆🏿"; + constexpr const char[] woman_getting_face_massage = "💆‍♀️"; + constexpr const char[] woman_getting_face_massage_tone1 = "💆🏻‍♀️"; + constexpr const char[] woman_getting_face_massage_light_skin_tone = "💆🏻‍♀️"; + constexpr const char[] woman_getting_face_massage_tone2 = "💆🏼‍♀️"; + constexpr const char[] woman_getting_face_massage_medium_light_skin_tone = "💆🏼‍♀️"; + constexpr const char[] woman_getting_face_massage_tone3 = "💆🏽‍♀️"; + constexpr const char[] woman_getting_face_massage_medium_skin_tone = "💆🏽‍♀️"; + constexpr const char[] woman_getting_face_massage_tone4 = "💆🏾‍♀️"; + constexpr const char[] woman_getting_face_massage_medium_dark_skin_tone = "💆🏾‍♀️"; + constexpr const char[] woman_getting_face_massage_tone5 = "💆🏿‍♀️"; + constexpr const char[] woman_getting_face_massage_dark_skin_tone = "💆🏿‍♀️"; + constexpr const char[] man_getting_face_massage = "💆‍♂️"; + constexpr const char[] man_getting_face_massage_tone1 = "💆🏻‍♂️"; + constexpr const char[] man_getting_face_massage_light_skin_tone = "💆🏻‍♂️"; + constexpr const char[] man_getting_face_massage_tone2 = "💆🏼‍♂️"; + constexpr const char[] man_getting_face_massage_medium_light_skin_tone = "💆🏼‍♂️"; + constexpr const char[] man_getting_face_massage_tone3 = "💆🏽‍♂️"; + constexpr const char[] man_getting_face_massage_medium_skin_tone = "💆🏽‍♂️"; + constexpr const char[] man_getting_face_massage_tone4 = "💆🏾‍♂️"; + constexpr const char[] man_getting_face_massage_medium_dark_skin_tone = "💆🏾‍♂️"; + constexpr const char[] man_getting_face_massage_tone5 = "💆🏿‍♂️"; + constexpr const char[] man_getting_face_massage_dark_skin_tone = "💆🏿‍♂️"; + constexpr const char[] person_in_steamy_room = "🧖"; + constexpr const char[] person_in_steamy_room_tone1 = "🧖🏻"; + constexpr const char[] person_in_steamy_room_light_skin_tone = "🧖🏻"; + constexpr const char[] person_in_steamy_room_tone2 = "🧖🏼"; + constexpr const char[] person_in_steamy_room_medium_light_skin_tone = "🧖🏼"; + constexpr const char[] person_in_steamy_room_tone3 = "🧖🏽"; + constexpr const char[] person_in_steamy_room_medium_skin_tone = "🧖🏽"; + constexpr const char[] person_in_steamy_room_tone4 = "🧖🏾"; + constexpr const char[] person_in_steamy_room_medium_dark_skin_tone = "🧖🏾"; + constexpr const char[] person_in_steamy_room_tone5 = "🧖🏿"; + constexpr const char[] person_in_steamy_room_dark_skin_tone = "🧖🏿"; + constexpr const char[] woman_in_steamy_room = "🧖‍♀️"; + constexpr const char[] woman_in_steamy_room_tone1 = "🧖🏻‍♀️"; + constexpr const char[] woman_in_steamy_room_light_skin_tone = "🧖🏻‍♀️"; + constexpr const char[] woman_in_steamy_room_tone2 = "🧖🏼‍♀️"; + constexpr const char[] woman_in_steamy_room_medium_light_skin_tone = "🧖🏼‍♀️"; + constexpr const char[] woman_in_steamy_room_tone3 = "🧖🏽‍♀️"; + constexpr const char[] woman_in_steamy_room_medium_skin_tone = "🧖🏽‍♀️"; + constexpr const char[] woman_in_steamy_room_tone4 = "🧖🏾‍♀️"; + constexpr const char[] woman_in_steamy_room_medium_dark_skin_tone = "🧖🏾‍♀️"; + constexpr const char[] woman_in_steamy_room_tone5 = "🧖🏿‍♀️"; + constexpr const char[] woman_in_steamy_room_dark_skin_tone = "🧖🏿‍♀️"; + constexpr const char[] man_in_steamy_room = "🧖‍♂️"; + constexpr const char[] man_in_steamy_room_tone1 = "🧖🏻‍♂️"; + constexpr const char[] man_in_steamy_room_light_skin_tone = "🧖🏻‍♂️"; + constexpr const char[] man_in_steamy_room_tone2 = "🧖🏼‍♂️"; + constexpr const char[] man_in_steamy_room_medium_light_skin_tone = "🧖🏼‍♂️"; + constexpr const char[] man_in_steamy_room_tone3 = "🧖🏽‍♂️"; + constexpr const char[] man_in_steamy_room_medium_skin_tone = "🧖🏽‍♂️"; + constexpr const char[] man_in_steamy_room_tone4 = "🧖🏾‍♂️"; + constexpr const char[] man_in_steamy_room_medium_dark_skin_tone = "🧖🏾‍♂️"; + constexpr const char[] man_in_steamy_room_tone5 = "🧖🏿‍♂️"; + constexpr const char[] man_in_steamy_room_dark_skin_tone = "🧖🏿‍♂️"; + constexpr const char[] nail_care = "💅"; + constexpr const char[] nail_care_tone1 = "💅🏻"; + constexpr const char[] nail_care_tone2 = "💅🏼"; + constexpr const char[] nail_care_tone3 = "💅🏽"; + constexpr const char[] nail_care_tone4 = "💅🏾"; + constexpr const char[] nail_care_tone5 = "💅🏿"; + constexpr const char[] selfie = "🤳"; + constexpr const char[] selfie_tone1 = "🤳🏻"; + constexpr const char[] selfie_tone2 = "🤳🏼"; + constexpr const char[] selfie_tone3 = "🤳🏽"; + constexpr const char[] selfie_tone4 = "🤳🏾"; + constexpr const char[] selfie_tone5 = "🤳🏿"; + constexpr const char[] dancer = "💃"; + constexpr const char[] dancer_tone1 = "💃🏻"; + constexpr const char[] dancer_tone2 = "💃🏼"; + constexpr const char[] dancer_tone3 = "💃🏽"; + constexpr const char[] dancer_tone4 = "💃🏾"; + constexpr const char[] dancer_tone5 = "💃🏿"; + constexpr const char[] man_dancing = "🕺"; + constexpr const char[] male_dancer = "🕺"; + constexpr const char[] man_dancing_tone1 = "🕺🏻"; + constexpr const char[] male_dancer_tone1 = "🕺🏻"; + constexpr const char[] man_dancing_tone2 = "🕺🏼"; + constexpr const char[] male_dancer_tone2 = "🕺🏼"; + constexpr const char[] man_dancing_tone3 = "🕺🏽"; + constexpr const char[] male_dancer_tone3 = "🕺🏽"; + constexpr const char[] man_dancing_tone5 = "🕺🏿"; + constexpr const char[] male_dancer_tone5 = "🕺🏿"; + constexpr const char[] man_dancing_tone4 = "🕺🏾"; + constexpr const char[] male_dancer_tone4 = "🕺🏾"; + constexpr const char[] people_with_bunny_ears_partying = "👯"; + constexpr const char[] dancers = "👯"; + constexpr const char[] women_with_bunny_ears_partying = "👯‍♀️"; + constexpr const char[] men_with_bunny_ears_partying = "👯‍♂️"; + constexpr const char[] levitate = "🕴️"; + constexpr const char[] man_in_business_suit_levitating = "🕴️"; + constexpr const char[] levitate_tone1 = "🕴🏻"; + constexpr const char[] man_in_business_suit_levitating_tone1 = "🕴🏻"; + constexpr const char[] man_in_business_suit_levitating_light_skin_tone = "🕴🏻"; + constexpr const char[] levitate_tone2 = "🕴🏼"; + constexpr const char[] man_in_business_suit_levitating_tone2 = "🕴🏼"; + constexpr const char[] man_in_business_suit_levitating_medium_light_skin_tone = "🕴🏼"; + constexpr const char[] levitate_tone3 = "🕴🏽"; + constexpr const char[] man_in_business_suit_levitating_tone3 = "🕴🏽"; + constexpr const char[] man_in_business_suit_levitating_medium_skin_tone = "🕴🏽"; + constexpr const char[] levitate_tone4 = "🕴🏾"; + constexpr const char[] man_in_business_suit_levitating_tone4 = "🕴🏾"; + constexpr const char[] man_in_business_suit_levitating_medium_dark_skin_tone = "🕴🏾"; + constexpr const char[] levitate_tone5 = "🕴🏿"; + constexpr const char[] man_in_business_suit_levitating_tone5 = "🕴🏿"; + constexpr const char[] man_in_business_suit_levitating_dark_skin_tone = "🕴🏿"; + constexpr const char[] person_in_manual_wheelchair = "🧑‍🦽"; + constexpr const char[] person_in_manual_wheelchair_tone1 = "🧑🏻‍🦽"; + constexpr const char[] person_in_manual_wheelchair_light_skin_tone = "🧑🏻‍🦽"; + constexpr const char[] person_in_manual_wheelchair_tone2 = "🧑🏼‍🦽"; + constexpr const char[] person_in_manual_wheelchair_medium_light_skin_tone = "🧑🏼‍🦽"; + constexpr const char[] person_in_manual_wheelchair_tone3 = "🧑🏽‍🦽"; + constexpr const char[] person_in_manual_wheelchair_medium_skin_tone = "🧑🏽‍🦽"; + constexpr const char[] person_in_manual_wheelchair_tone4 = "🧑🏾‍🦽"; + constexpr const char[] person_in_manual_wheelchair_medium_dark_skin_tone = "🧑🏾‍🦽"; + constexpr const char[] person_in_manual_wheelchair_tone5 = "🧑🏿‍🦽"; + constexpr const char[] person_in_manual_wheelchair_dark_skin_tone = "🧑🏿‍🦽"; + constexpr const char[] woman_in_manual_wheelchair = "👩‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_tone1 = "👩🏻‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_light_skin_tone = "👩🏻‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_tone2 = "👩🏼‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_medium_light_skin_tone = "👩🏼‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_tone3 = "👩🏽‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_medium_skin_tone = "👩🏽‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_tone4 = "👩🏾‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_medium_dark_skin_tone = "👩🏾‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_tone5 = "👩🏿‍🦽"; + constexpr const char[] woman_in_manual_wheelchair_dark_skin_tone = "👩🏿‍🦽"; + constexpr const char[] man_in_manual_wheelchair = "👨‍🦽"; + constexpr const char[] man_in_manual_wheelchair_tone1 = "👨🏻‍🦽"; + constexpr const char[] man_in_manual_wheelchair_light_skin_tone = "👨🏻‍🦽"; + constexpr const char[] man_in_manual_wheelchair_tone2 = "👨🏼‍🦽"; + constexpr const char[] man_in_manual_wheelchair_medium_light_skin_tone = "👨🏼‍🦽"; + constexpr const char[] man_in_manual_wheelchair_tone3 = "👨🏽‍🦽"; + constexpr const char[] man_in_manual_wheelchair_medium_skin_tone = "👨🏽‍🦽"; + constexpr const char[] man_in_manual_wheelchair_tone4 = "👨🏾‍🦽"; + constexpr const char[] man_in_manual_wheelchair_medium_dark_skin_tone = "👨🏾‍🦽"; + constexpr const char[] man_in_manual_wheelchair_tone5 = "👨🏿‍🦽"; + constexpr const char[] man_in_manual_wheelchair_dark_skin_tone = "👨🏿‍🦽"; + constexpr const char[] person_in_motorized_wheelchair = "🧑‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_tone1 = "🧑🏻‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_light_skin_tone = "🧑🏻‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_tone2 = "🧑🏼‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_medium_light_skin_tone = "🧑🏼‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_tone3 = "🧑🏽‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_medium_skin_tone = "🧑🏽‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_tone4 = "🧑🏾‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_medium_dark_skin_tone = "🧑🏾‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_tone5 = "🧑🏿‍🦼"; + constexpr const char[] person_in_motorized_wheelchair_dark_skin_tone = "🧑🏿‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair = "👩‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_tone1 = "👩🏻‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_light_skin_tone = "👩🏻‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_tone2 = "👩🏼‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_medium_light_skin_tone = "👩🏼‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_tone3 = "👩🏽‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_medium_skin_tone = "👩🏽‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_tone4 = "👩🏾‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_medium_dark_skin_tone = "👩🏾‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_tone5 = "👩🏿‍🦼"; + constexpr const char[] woman_in_motorized_wheelchair_dark_skin_tone = "👩🏿‍🦼"; + constexpr const char[] man_in_motorized_wheelchair = "👨‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_tone1 = "👨🏻‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_light_skin_tone = "👨🏻‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_tone2 = "👨🏼‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_medium_light_skin_tone = "👨🏼‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_tone3 = "👨🏽‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_medium_skin_tone = "👨🏽‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_tone4 = "👨🏾‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_medium_dark_skin_tone = "👨🏾‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_tone5 = "👨🏿‍🦼"; + constexpr const char[] man_in_motorized_wheelchair_dark_skin_tone = "👨🏿‍🦼"; + constexpr const char[] person_walking = "🚶"; + constexpr const char[] walking = "🚶"; + constexpr const char[] person_walking_tone1 = "🚶🏻"; + constexpr const char[] walking_tone1 = "🚶🏻"; + constexpr const char[] person_walking_tone2 = "🚶🏼"; + constexpr const char[] walking_tone2 = "🚶🏼"; + constexpr const char[] person_walking_tone3 = "🚶🏽"; + constexpr const char[] walking_tone3 = "🚶🏽"; + constexpr const char[] person_walking_tone4 = "🚶🏾"; + constexpr const char[] walking_tone4 = "🚶🏾"; + constexpr const char[] person_walking_tone5 = "🚶🏿"; + constexpr const char[] walking_tone5 = "🚶🏿"; + constexpr const char[] woman_walking = "🚶‍♀️"; + constexpr const char[] woman_walking_tone1 = "🚶🏻‍♀️"; + constexpr const char[] woman_walking_light_skin_tone = "🚶🏻‍♀️"; + constexpr const char[] woman_walking_tone2 = "🚶🏼‍♀️"; + constexpr const char[] woman_walking_medium_light_skin_tone = "🚶🏼‍♀️"; + constexpr const char[] woman_walking_tone3 = "🚶🏽‍♀️"; + constexpr const char[] woman_walking_medium_skin_tone = "🚶🏽‍♀️"; + constexpr const char[] woman_walking_tone4 = "🚶🏾‍♀️"; + constexpr const char[] woman_walking_medium_dark_skin_tone = "🚶🏾‍♀️"; + constexpr const char[] woman_walking_tone5 = "🚶🏿‍♀️"; + constexpr const char[] woman_walking_dark_skin_tone = "🚶🏿‍♀️"; + constexpr const char[] man_walking = "🚶‍♂️"; + constexpr const char[] man_walking_tone1 = "🚶🏻‍♂️"; + constexpr const char[] man_walking_light_skin_tone = "🚶🏻‍♂️"; + constexpr const char[] man_walking_tone2 = "🚶🏼‍♂️"; + constexpr const char[] man_walking_medium_light_skin_tone = "🚶🏼‍♂️"; + constexpr const char[] man_walking_tone3 = "🚶🏽‍♂️"; + constexpr const char[] man_walking_medium_skin_tone = "🚶🏽‍♂️"; + constexpr const char[] man_walking_tone4 = "🚶🏾‍♂️"; + constexpr const char[] man_walking_medium_dark_skin_tone = "🚶🏾‍♂️"; + constexpr const char[] man_walking_tone5 = "🚶🏿‍♂️"; + constexpr const char[] man_walking_dark_skin_tone = "🚶🏿‍♂️"; + constexpr const char[] person_with_probing_cane = "🧑‍🦯"; + constexpr const char[] person_with_probing_cane_tone1 = "🧑🏻‍🦯"; + constexpr const char[] person_with_probing_cane_light_skin_tone = "🧑🏻‍🦯"; + constexpr const char[] person_with_probing_cane_tone2 = "🧑🏼‍🦯"; + constexpr const char[] person_with_probing_cane_medium_light_skin_tone = "🧑🏼‍🦯"; + constexpr const char[] person_with_probing_cane_tone3 = "🧑🏽‍🦯"; + constexpr const char[] person_with_probing_cane_medium_skin_tone = "🧑🏽‍🦯"; + constexpr const char[] person_with_probing_cane_tone4 = "🧑🏾‍🦯"; + constexpr const char[] person_with_probing_cane_medium_dark_skin_tone = "🧑🏾‍🦯"; + constexpr const char[] person_with_probing_cane_tone5 = "🧑🏿‍🦯"; + constexpr const char[] person_with_probing_cane_dark_skin_tone = "🧑🏿‍🦯"; + constexpr const char[] woman_with_probing_cane = "👩‍🦯"; + constexpr const char[] woman_with_probing_cane_tone1 = "👩🏻‍🦯"; + constexpr const char[] woman_with_probing_cane_light_skin_tone = "👩🏻‍🦯"; + constexpr const char[] woman_with_probing_cane_tone2 = "👩🏼‍🦯"; + constexpr const char[] woman_with_probing_cane_medium_light_skin_tone = "👩🏼‍🦯"; + constexpr const char[] woman_with_probing_cane_tone3 = "👩🏽‍🦯"; + constexpr const char[] woman_with_probing_cane_medium_skin_tone = "👩🏽‍🦯"; + constexpr const char[] woman_with_probing_cane_tone4 = "👩🏾‍🦯"; + constexpr const char[] woman_with_probing_cane_medium_dark_skin_tone = "👩🏾‍🦯"; + constexpr const char[] woman_with_probing_cane_tone5 = "👩🏿‍🦯"; + constexpr const char[] woman_with_probing_cane_dark_skin_tone = "👩🏿‍🦯"; + constexpr const char[] man_with_probing_cane = "👨‍🦯"; + constexpr const char[] man_with_probing_cane_tone1 = "👨🏻‍🦯"; + constexpr const char[] man_with_probing_cane_light_skin_tone = "👨🏻‍🦯"; + constexpr const char[] man_with_probing_cane_tone2 = "👨🏼‍🦯"; + constexpr const char[] man_with_probing_cane_medium_light_skin_tone = "👨🏼‍🦯"; + constexpr const char[] man_with_probing_cane_tone3 = "👨🏽‍🦯"; + constexpr const char[] man_with_probing_cane_medium_skin_tone = "👨🏽‍🦯"; + constexpr const char[] man_with_probing_cane_tone4 = "👨🏾‍🦯"; + constexpr const char[] man_with_probing_cane_medium_dark_skin_tone = "👨🏾‍🦯"; + constexpr const char[] man_with_probing_cane_tone5 = "👨🏿‍🦯"; + constexpr const char[] man_with_probing_cane_dark_skin_tone = "👨🏿‍🦯"; + constexpr const char[] person_kneeling = "🧎"; + constexpr const char[] person_kneeling_tone1 = "🧎🏻"; + constexpr const char[] person_kneeling_light_skin_tone = "🧎🏻"; + constexpr const char[] person_kneeling_tone2 = "🧎🏼"; + constexpr const char[] person_kneeling_medium_light_skin_tone = "🧎🏼"; + constexpr const char[] person_kneeling_tone3 = "🧎🏽"; + constexpr const char[] person_kneeling_medium_skin_tone = "🧎🏽"; + constexpr const char[] person_kneeling_tone4 = "🧎🏾"; + constexpr const char[] person_kneeling_medium_dark_skin_tone = "🧎🏾"; + constexpr const char[] person_kneeling_tone5 = "🧎🏿"; + constexpr const char[] person_kneeling_dark_skin_tone = "🧎🏿"; + constexpr const char[] woman_kneeling = "🧎‍♀️"; + constexpr const char[] woman_kneeling_tone1 = "🧎🏻‍♀️"; + constexpr const char[] woman_kneeling_light_skin_tone = "🧎🏻‍♀️"; + constexpr const char[] woman_kneeling_tone2 = "🧎🏼‍♀️"; + constexpr const char[] woman_kneeling_medium_light_skin_tone = "🧎🏼‍♀️"; + constexpr const char[] woman_kneeling_tone3 = "🧎🏽‍♀️"; + constexpr const char[] woman_kneeling_medium_skin_tone = "🧎🏽‍♀️"; + constexpr const char[] woman_kneeling_tone4 = "🧎🏾‍♀️"; + constexpr const char[] woman_kneeling_medium_dark_skin_tone = "🧎🏾‍♀️"; + constexpr const char[] woman_kneeling_tone5 = "🧎🏿‍♀️"; + constexpr const char[] woman_kneeling_dark_skin_tone = "🧎🏿‍♀️"; + constexpr const char[] man_kneeling = "🧎‍♂️"; + constexpr const char[] man_kneeling_tone1 = "🧎🏻‍♂️"; + constexpr const char[] man_kneeling_light_skin_tone = "🧎🏻‍♂️"; + constexpr const char[] man_kneeling_tone2 = "🧎🏼‍♂️"; + constexpr const char[] man_kneeling_medium_light_skin_tone = "🧎🏼‍♂️"; + constexpr const char[] man_kneeling_tone3 = "🧎🏽‍♂️"; + constexpr const char[] man_kneeling_medium_skin_tone = "🧎🏽‍♂️"; + constexpr const char[] man_kneeling_tone4 = "🧎🏾‍♂️"; + constexpr const char[] man_kneeling_medium_dark_skin_tone = "🧎🏾‍♂️"; + constexpr const char[] man_kneeling_tone5 = "🧎🏿‍♂️"; + constexpr const char[] man_kneeling_dark_skin_tone = "🧎🏿‍♂️"; + constexpr const char[] person_running = "🏃"; + constexpr const char[] runner = "🏃"; + constexpr const char[] person_running_tone1 = "🏃🏻"; + constexpr const char[] runner_tone1 = "🏃🏻"; + constexpr const char[] person_running_tone2 = "🏃🏼"; + constexpr const char[] runner_tone2 = "🏃🏼"; + constexpr const char[] person_running_tone3 = "🏃🏽"; + constexpr const char[] runner_tone3 = "🏃🏽"; + constexpr const char[] person_running_tone4 = "🏃🏾"; + constexpr const char[] runner_tone4 = "🏃🏾"; + constexpr const char[] person_running_tone5 = "🏃🏿"; + constexpr const char[] runner_tone5 = "🏃🏿"; + constexpr const char[] woman_running = "🏃‍♀️"; + constexpr const char[] woman_running_tone1 = "🏃🏻‍♀️"; + constexpr const char[] woman_running_light_skin_tone = "🏃🏻‍♀️"; + constexpr const char[] woman_running_tone2 = "🏃🏼‍♀️"; + constexpr const char[] woman_running_medium_light_skin_tone = "🏃🏼‍♀️"; + constexpr const char[] woman_running_tone3 = "🏃🏽‍♀️"; + constexpr const char[] woman_running_medium_skin_tone = "🏃🏽‍♀️"; + constexpr const char[] woman_running_tone4 = "🏃🏾‍♀️"; + constexpr const char[] woman_running_medium_dark_skin_tone = "🏃🏾‍♀️"; + constexpr const char[] woman_running_tone5 = "🏃🏿‍♀️"; + constexpr const char[] woman_running_dark_skin_tone = "🏃🏿‍♀️"; + constexpr const char[] man_running = "🏃‍♂️"; + constexpr const char[] man_running_tone1 = "🏃🏻‍♂️"; + constexpr const char[] man_running_light_skin_tone = "🏃🏻‍♂️"; + constexpr const char[] man_running_tone2 = "🏃🏼‍♂️"; + constexpr const char[] man_running_medium_light_skin_tone = "🏃🏼‍♂️"; + constexpr const char[] man_running_tone3 = "🏃🏽‍♂️"; + constexpr const char[] man_running_medium_skin_tone = "🏃🏽‍♂️"; + constexpr const char[] man_running_tone4 = "🏃🏾‍♂️"; + constexpr const char[] man_running_medium_dark_skin_tone = "🏃🏾‍♂️"; + constexpr const char[] man_running_tone5 = "🏃🏿‍♂️"; + constexpr const char[] man_running_dark_skin_tone = "🏃🏿‍♂️"; + constexpr const char[] person_standing = "🧍"; + constexpr const char[] person_standing_tone1 = "🧍🏻"; + constexpr const char[] person_standing_light_skin_tone = "🧍🏻"; + constexpr const char[] person_standing_tone2 = "🧍🏼"; + constexpr const char[] person_standing_medium_light_skin_tone = "🧍🏼"; + constexpr const char[] person_standing_tone3 = "🧍🏽"; + constexpr const char[] person_standing_medium_skin_tone = "🧍🏽"; + constexpr const char[] person_standing_tone4 = "🧍🏾"; + constexpr const char[] person_standing_medium_dark_skin_tone = "🧍🏾"; + constexpr const char[] person_standing_tone5 = "🧍🏿"; + constexpr const char[] person_standing_dark_skin_tone = "🧍🏿"; + constexpr const char[] woman_standing = "🧍‍♀️"; + constexpr const char[] woman_standing_tone1 = "🧍🏻‍♀️"; + constexpr const char[] woman_standing_light_skin_tone = "🧍🏻‍♀️"; + constexpr const char[] woman_standing_tone2 = "🧍🏼‍♀️"; + constexpr const char[] woman_standing_medium_light_skin_tone = "🧍🏼‍♀️"; + constexpr const char[] woman_standing_tone3 = "🧍🏽‍♀️"; + constexpr const char[] woman_standing_medium_skin_tone = "🧍🏽‍♀️"; + constexpr const char[] woman_standing_tone4 = "🧍🏾‍♀️"; + constexpr const char[] woman_standing_medium_dark_skin_tone = "🧍🏾‍♀️"; + constexpr const char[] woman_standing_tone5 = "🧍🏿‍♀️"; + constexpr const char[] woman_standing_dark_skin_tone = "🧍🏿‍♀️"; + constexpr const char[] man_standing = "🧍‍♂️"; + constexpr const char[] man_standing_tone1 = "🧍🏻‍♂️"; + constexpr const char[] man_standing_light_skin_tone = "🧍🏻‍♂️"; + constexpr const char[] man_standing_tone2 = "🧍🏼‍♂️"; + constexpr const char[] man_standing_medium_light_skin_tone = "🧍🏼‍♂️"; + constexpr const char[] man_standing_tone3 = "🧍🏽‍♂️"; + constexpr const char[] man_standing_medium_skin_tone = "🧍🏽‍♂️"; + constexpr const char[] man_standing_tone4 = "🧍🏾‍♂️"; + constexpr const char[] man_standing_medium_dark_skin_tone = "🧍🏾‍♂️"; + constexpr const char[] man_standing_tone5 = "🧍🏿‍♂️"; + constexpr const char[] man_standing_dark_skin_tone = "🧍🏿‍♂️"; + constexpr const char[] people_holding_hands = "🧑‍🤝‍🧑"; + constexpr const char[] people_holding_hands_tone1 = "🧑🏻‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_light_skin_tone = "🧑🏻‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_tone1_tone2 = "🧑🏻‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_light_skin_tone_medium_light_skin_tone = "🧑🏻‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_tone1_tone3 = "🧑🏻‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_light_skin_tone_medium_skin_tone = "🧑🏻‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_tone1_tone4 = "🧑🏻‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_light_skin_tone_medium_dark_skin_tone = "🧑🏻‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_tone1_tone5 = "🧑🏻‍🤝‍🧑🏿"; + constexpr const char[] people_holding_hands_light_skin_tone_dark_skin_tone = "🧑🏻‍🤝‍🧑🏿"; + constexpr const char[] people_holding_hands_tone2_tone1 = "🧑🏼‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_medium_light_skin_tone_light_skin_tone = "🧑🏼‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_tone2 = "🧑🏼‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_medium_light_skin_tone = "🧑🏼‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_tone2_tone3 = "🧑🏼‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_medium_light_skin_tone_medium_skin_tone = "🧑🏼‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_tone2_tone4 = "🧑🏼‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone = "🧑🏼‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_tone2_tone5 = "🧑🏼‍🤝‍🧑🏿"; + constexpr const char[] people_holding_hands_medium_light_skin_tone_dark_skin_tone = "🧑🏼‍🤝‍🧑🏿"; + constexpr const char[] people_holding_hands_tone3_tone1 = "🧑🏽‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_medium_skin_tone_light_skin_tone = "🧑🏽‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_tone3_tone2 = "🧑🏽‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_medium_skin_tone_medium_light_skin_tone = "🧑🏽‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_tone3 = "🧑🏽‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_medium_skin_tone = "🧑🏽‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_tone3_tone4 = "🧑🏽‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_medium_skin_tone_medium_dark_skin_tone = "🧑🏽‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_tone3_tone5 = "🧑🏽‍🤝‍🧑🏿"; + constexpr const char[] people_holding_hands_medium_skin_tone_dark_skin_tone = "🧑🏽‍🤝‍🧑🏿"; + constexpr const char[] people_holding_hands_tone4_tone1 = "🧑🏾‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_medium_dark_skin_tone_light_skin_tone = "🧑🏾‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_tone4_tone2 = "🧑🏾‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone = "🧑🏾‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_tone4_tone3 = "🧑🏾‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_medium_dark_skin_tone_medium_skin_tone = "🧑🏾‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_tone4 = "🧑🏾‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_medium_dark_skin_tone = "🧑🏾‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_tone4_tone5 = "🧑🏾‍🤝‍🧑🏿"; + constexpr const char[] people_holding_hands_medium_dark_skin_tone_dark_skin_tone = "🧑🏾‍🤝‍🧑🏿"; + constexpr const char[] people_holding_hands_tone5_tone1 = "🧑🏿‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_dark_skin_tone_light_skin_tone = "🧑🏿‍🤝‍🧑🏻"; + constexpr const char[] people_holding_hands_tone5_tone2 = "🧑🏿‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_dark_skin_tone_medium_light_skin_tone = "🧑🏿‍🤝‍🧑🏼"; + constexpr const char[] people_holding_hands_tone5_tone3 = "🧑🏿‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_dark_skin_tone_medium_skin_tone = "🧑🏿‍🤝‍🧑🏽"; + constexpr const char[] people_holding_hands_tone5_tone4 = "🧑🏿‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_dark_skin_tone_medium_dark_skin_tone = "🧑🏿‍🤝‍🧑🏾"; + constexpr const char[] people_holding_hands_tone5 = "🧑🏿‍🤝‍🧑🏿"; + constexpr const char[] people_holding_hands_dark_skin_tone = "🧑🏿‍🤝‍🧑🏿"; + constexpr const char[] couple = "👫"; + constexpr const char[] woman_and_man_holding_hands_tone1 = "👫🏻"; + constexpr const char[] woman_and_man_holding_hands_light_skin_tone = "👫🏻"; + constexpr const char[] woman_and_man_holding_hands_tone1_tone2 = "👩🏻‍🤝‍👨🏼"; + constexpr const char[] woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone = "👩🏻‍🤝‍👨🏼"; + constexpr const char[] woman_and_man_holding_hands_tone1_tone3 = "👩🏻‍🤝‍👨🏽"; + constexpr const char[] woman_and_man_holding_hands_light_skin_tone_medium_skin_tone = "👩🏻‍🤝‍👨🏽"; + constexpr const char[] woman_and_man_holding_hands_tone1_tone4 = "👩🏻‍🤝‍👨🏾"; + constexpr const char[] woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone = "👩🏻‍🤝‍👨🏾"; + constexpr const char[] woman_and_man_holding_hands_tone1_tone5 = "👩🏻‍🤝‍👨🏿"; + constexpr const char[] woman_and_man_holding_hands_light_skin_tone_dark_skin_tone = "👩🏻‍🤝‍👨🏿"; + constexpr const char[] woman_and_man_holding_hands_tone2_tone1 = "👩🏼‍🤝‍👨🏻"; + constexpr const char[] woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone = "👩🏼‍🤝‍👨🏻"; + constexpr const char[] woman_and_man_holding_hands_tone2 = "👫🏼"; + constexpr const char[] woman_and_man_holding_hands_medium_light_skin_tone = "👫🏼"; + constexpr const char[] woman_and_man_holding_hands_tone2_tone3 = "👩🏼‍🤝‍👨🏽"; + constexpr const char[] woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone = "👩🏼‍🤝‍👨🏽"; + constexpr const char[] woman_and_man_holding_hands_tone2_tone4 = "👩🏼‍🤝‍👨🏾"; + constexpr const char[] woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone = "👩🏼‍🤝‍👨🏾"; + constexpr const char[] woman_and_man_holding_hands_tone2_tone5 = "👩🏼‍🤝‍👨🏿"; + constexpr const char[] woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone = "👩🏼‍🤝‍👨🏿"; + constexpr const char[] woman_and_man_holding_hands_tone3_tone1 = "👩🏽‍🤝‍👨🏻"; + constexpr const char[] woman_and_man_holding_hands_medium_skin_tone_light_skin_tone = "👩🏽‍🤝‍👨🏻"; + constexpr const char[] woman_and_man_holding_hands_tone3_tone2 = "👩🏽‍🤝‍👨🏼"; + constexpr const char[] woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone = "👩🏽‍🤝‍👨🏼"; + constexpr const char[] woman_and_man_holding_hands_tone3 = "👫🏽"; + constexpr const char[] woman_and_man_holding_hands_medium_skin_tone = "👫🏽"; + constexpr const char[] woman_and_man_holding_hands_tone3_tone4 = "👩🏽‍🤝‍👨🏾"; + constexpr const char[] woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone = "👩🏽‍🤝‍👨🏾"; + constexpr const char[] woman_and_man_holding_hands_tone3_tone5 = "👩🏽‍🤝‍👨🏿"; + constexpr const char[] woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone = "👩🏽‍🤝‍👨🏿"; + constexpr const char[] woman_and_man_holding_hands_tone4_tone1 = "👩🏾‍🤝‍👨🏻"; + constexpr const char[] woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone = "👩🏾‍🤝‍👨🏻"; + constexpr const char[] woman_and_man_holding_hands_tone4_tone2 = "👩🏾‍🤝‍👨🏼"; + constexpr const char[] woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone = "👩🏾‍🤝‍👨🏼"; + constexpr const char[] woman_and_man_holding_hands_tone4_tone3 = "👩🏾‍🤝‍👨🏽"; + constexpr const char[] woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone = "👩🏾‍🤝‍👨🏽"; + constexpr const char[] woman_and_man_holding_hands_tone4 = "👫🏾"; + constexpr const char[] woman_and_man_holding_hands_medium_dark_skin_tone = "👫🏾"; + constexpr const char[] woman_and_man_holding_hands_tone4_tone5 = "👩🏾‍🤝‍👨🏿"; + constexpr const char[] woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone = "👩🏾‍🤝‍👨🏿"; + constexpr const char[] woman_and_man_holding_hands_tone5_tone1 = "👩🏿‍🤝‍👨🏻"; + constexpr const char[] woman_and_man_holding_hands_dark_skin_tone_light_skin_tone = "👩🏿‍🤝‍👨🏻"; + constexpr const char[] woman_and_man_holding_hands_tone5_tone2 = "👩🏿‍🤝‍👨🏼"; + constexpr const char[] woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone = "👩🏿‍🤝‍👨🏼"; + constexpr const char[] woman_and_man_holding_hands_tone5_tone3 = "👩🏿‍🤝‍👨🏽"; + constexpr const char[] woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone = "👩🏿‍🤝‍👨🏽"; + constexpr const char[] woman_and_man_holding_hands_tone5_tone4 = "👩🏿‍🤝‍👨🏾"; + constexpr const char[] woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone = "👩🏿‍🤝‍👨🏾"; + constexpr const char[] woman_and_man_holding_hands_tone5 = "👫🏿"; + constexpr const char[] woman_and_man_holding_hands_dark_skin_tone = "👫🏿"; + constexpr const char[] two_women_holding_hands = "👭"; + constexpr const char[] women_holding_hands_tone1 = "👭🏻"; + constexpr const char[] women_holding_hands_light_skin_tone = "👭🏻"; + constexpr const char[] women_holding_hands_tone1_tone2 = "👩🏻‍🤝‍👩🏼"; + constexpr const char[] women_holding_hands_light_skin_tone_medium_light_skin_tone = "👩🏻‍🤝‍👩🏼"; + constexpr const char[] women_holding_hands_tone1_tone3 = "👩🏻‍🤝‍👩🏽"; + constexpr const char[] women_holding_hands_light_skin_tone_medium_skin_tone = "👩🏻‍🤝‍👩🏽"; + constexpr const char[] women_holding_hands_tone1_tone4 = "👩🏻‍🤝‍👩🏾"; + constexpr const char[] women_holding_hands_light_skin_tone_medium_dark_skin_tone = "👩🏻‍🤝‍👩🏾"; + constexpr const char[] women_holding_hands_tone1_tone5 = "👩🏻‍🤝‍👩🏿"; + constexpr const char[] women_holding_hands_light_skin_tone_dark_skin_tone = "👩🏻‍🤝‍👩🏿"; + constexpr const char[] women_holding_hands_tone2_tone1 = "👩🏼‍🤝‍👩🏻"; + constexpr const char[] women_holding_hands_medium_light_skin_tone_light_skin_tone = "👩🏼‍🤝‍👩🏻"; + constexpr const char[] women_holding_hands_tone2 = "👭🏼"; + constexpr const char[] women_holding_hands_medium_light_skin_tone = "👭🏼"; + constexpr const char[] women_holding_hands_tone2_tone3 = "👩🏼‍🤝‍👩🏽"; + constexpr const char[] women_holding_hands_medium_light_skin_tone_medium_skin_tone = "👩🏼‍🤝‍👩🏽"; + constexpr const char[] women_holding_hands_tone2_tone4 = "👩🏼‍🤝‍👩🏾"; + constexpr const char[] women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone = "👩🏼‍🤝‍👩🏾"; + constexpr const char[] women_holding_hands_tone2_tone5 = "👩🏼‍🤝‍👩🏿"; + constexpr const char[] women_holding_hands_medium_light_skin_tone_dark_skin_tone = "👩🏼‍🤝‍👩🏿"; + constexpr const char[] women_holding_hands_tone3_tone1 = "👩🏽‍🤝‍👩🏻"; + constexpr const char[] women_holding_hands_medium_skin_tone_light_skin_tone = "👩🏽‍🤝‍👩🏻"; + constexpr const char[] women_holding_hands_tone3_tone2 = "👩🏽‍🤝‍👩🏼"; + constexpr const char[] women_holding_hands_medium_skin_tone_medium_light_skin_tone = "👩🏽‍🤝‍👩🏼"; + constexpr const char[] women_holding_hands_tone3 = "👭🏽"; + constexpr const char[] women_holding_hands_medium_skin_tone = "👭🏽"; + constexpr const char[] women_holding_hands_tone3_tone4 = "👩🏽‍🤝‍👩🏾"; + constexpr const char[] women_holding_hands_medium_skin_tone_medium_dark_skin_tone = "👩🏽‍🤝‍👩🏾"; + constexpr const char[] women_holding_hands_tone3_tone5 = "👩🏽‍🤝‍👩🏿"; + constexpr const char[] women_holding_hands_medium_skin_tone_dark_skin_tone = "👩🏽‍🤝‍👩🏿"; + constexpr const char[] women_holding_hands_tone4_tone1 = "👩🏾‍🤝‍👩🏻"; + constexpr const char[] women_holding_hands_medium_dark_skin_tone_light_skin_tone = "👩🏾‍🤝‍👩🏻"; + constexpr const char[] women_holding_hands_tone4_tone2 = "👩🏾‍🤝‍👩🏼"; + constexpr const char[] women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone = "👩🏾‍🤝‍👩🏼"; + constexpr const char[] women_holding_hands_tone4_tone3 = "👩🏾‍🤝‍👩🏽"; + constexpr const char[] women_holding_hands_medium_dark_skin_tone_medium_skin_tone = "👩🏾‍🤝‍👩🏽"; + constexpr const char[] women_holding_hands_tone4 = "👭🏾"; + constexpr const char[] women_holding_hands_medium_dark_skin_tone = "👭🏾"; + constexpr const char[] women_holding_hands_tone4_tone5 = "👩🏾‍🤝‍👩🏿"; + constexpr const char[] women_holding_hands_medium_dark_skin_tone_dark_skin_tone = "👩🏾‍🤝‍👩🏿"; + constexpr const char[] women_holding_hands_tone5_tone1 = "👩🏿‍🤝‍👩🏻"; + constexpr const char[] women_holding_hands_dark_skin_tone_light_skin_tone = "👩🏿‍🤝‍👩🏻"; + constexpr const char[] women_holding_hands_tone5_tone2 = "👩🏿‍🤝‍👩🏼"; + constexpr const char[] women_holding_hands_dark_skin_tone_medium_light_skin_tone = "👩🏿‍🤝‍👩🏼"; + constexpr const char[] women_holding_hands_tone5_tone3 = "👩🏿‍🤝‍👩🏽"; + constexpr const char[] women_holding_hands_dark_skin_tone_medium_skin_tone = "👩🏿‍🤝‍👩🏽"; + constexpr const char[] women_holding_hands_tone5_tone4 = "👩🏿‍🤝‍👩🏾"; + constexpr const char[] women_holding_hands_dark_skin_tone_medium_dark_skin_tone = "👩🏿‍🤝‍👩🏾"; + constexpr const char[] women_holding_hands_tone5 = "👭🏿"; + constexpr const char[] women_holding_hands_dark_skin_tone = "👭🏿"; + constexpr const char[] two_men_holding_hands = "👬"; + constexpr const char[] men_holding_hands_tone1 = "👬🏻"; + constexpr const char[] men_holding_hands_light_skin_tone = "👬🏻"; + constexpr const char[] men_holding_hands_tone1_tone2 = "👨🏻‍🤝‍👨🏼"; + constexpr const char[] men_holding_hands_light_skin_tone_medium_light_skin_tone = "👨🏻‍🤝‍👨🏼"; + constexpr const char[] men_holding_hands_tone1_tone3 = "👨🏻‍🤝‍👨🏽"; + constexpr const char[] men_holding_hands_light_skin_tone_medium_skin_tone = "👨🏻‍🤝‍👨🏽"; + constexpr const char[] men_holding_hands_tone1_tone4 = "👨🏻‍🤝‍👨🏾"; + constexpr const char[] men_holding_hands_light_skin_tone_medium_dark_skin_tone = "👨🏻‍🤝‍👨🏾"; + constexpr const char[] men_holding_hands_tone1_tone5 = "👨🏻‍🤝‍👨🏿"; + constexpr const char[] men_holding_hands_light_skin_tone_dark_skin_tone = "👨🏻‍🤝‍👨🏿"; + constexpr const char[] men_holding_hands_tone2_tone1 = "👨🏼‍🤝‍👨🏻"; + constexpr const char[] men_holding_hands_medium_light_skin_tone_light_skin_tone = "👨🏼‍🤝‍👨🏻"; + constexpr const char[] men_holding_hands_tone2 = "👬🏼"; + constexpr const char[] men_holding_hands_medium_light_skin_tone = "👬🏼"; + constexpr const char[] men_holding_hands_tone2_tone3 = "👨🏼‍🤝‍👨🏽"; + constexpr const char[] men_holding_hands_medium_light_skin_tone_medium_skin_tone = "👨🏼‍🤝‍👨🏽"; + constexpr const char[] men_holding_hands_tone2_tone4 = "👨🏼‍🤝‍👨🏾"; + constexpr const char[] men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone = "👨🏼‍🤝‍👨🏾"; + constexpr const char[] men_holding_hands_tone2_tone5 = "👨🏼‍🤝‍👨🏿"; + constexpr const char[] men_holding_hands_medium_light_skin_tone_dark_skin_tone = "👨🏼‍🤝‍👨🏿"; + constexpr const char[] men_holding_hands_tone3_tone1 = "👨🏽‍🤝‍👨🏻"; + constexpr const char[] men_holding_hands_medium_skin_tone_light_skin_tone = "👨🏽‍🤝‍👨🏻"; + constexpr const char[] men_holding_hands_tone3_tone2 = "👨🏽‍🤝‍👨🏼"; + constexpr const char[] men_holding_hands_medium_skin_tone_medium_light_skin_tone = "👨🏽‍🤝‍👨🏼"; + constexpr const char[] men_holding_hands_tone3 = "👬🏽"; + constexpr const char[] men_holding_hands_medium_skin_tone = "👬🏽"; + constexpr const char[] men_holding_hands_tone3_tone4 = "👨🏽‍🤝‍👨🏾"; + constexpr const char[] men_holding_hands_medium_skin_tone_medium_dark_skin_tone = "👨🏽‍🤝‍👨🏾"; + constexpr const char[] men_holding_hands_tone3_tone5 = "👨🏽‍🤝‍👨🏿"; + constexpr const char[] men_holding_hands_medium_skin_tone_dark_skin_tone = "👨🏽‍🤝‍👨🏿"; + constexpr const char[] men_holding_hands_tone4_tone1 = "👨🏾‍🤝‍👨🏻"; + constexpr const char[] men_holding_hands_medium_dark_skin_tone_light_skin_tone = "👨🏾‍🤝‍👨🏻"; + constexpr const char[] men_holding_hands_tone4_tone2 = "👨🏾‍🤝‍👨🏼"; + constexpr const char[] men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone = "👨🏾‍🤝‍👨🏼"; + constexpr const char[] men_holding_hands_tone4_tone3 = "👨🏾‍🤝‍👨🏽"; + constexpr const char[] men_holding_hands_medium_dark_skin_tone_medium_skin_tone = "👨🏾‍🤝‍👨🏽"; + constexpr const char[] men_holding_hands_tone4 = "👬🏾"; + constexpr const char[] men_holding_hands_medium_dark_skin_tone = "👬🏾"; + constexpr const char[] men_holding_hands_tone4_tone5 = "👨🏾‍🤝‍👨🏿"; + constexpr const char[] men_holding_hands_medium_dark_skin_tone_dark_skin_tone = "👨🏾‍🤝‍👨🏿"; + constexpr const char[] men_holding_hands_tone5_tone1 = "👨🏿‍🤝‍👨🏻"; + constexpr const char[] men_holding_hands_dark_skin_tone_light_skin_tone = "👨🏿‍🤝‍👨🏻"; + constexpr const char[] men_holding_hands_tone5_tone2 = "👨🏿‍🤝‍👨🏼"; + constexpr const char[] men_holding_hands_dark_skin_tone_medium_light_skin_tone = "👨🏿‍🤝‍👨🏼"; + constexpr const char[] men_holding_hands_tone5_tone3 = "👨🏿‍🤝‍👨🏽"; + constexpr const char[] men_holding_hands_dark_skin_tone_medium_skin_tone = "👨🏿‍🤝‍👨🏽"; + constexpr const char[] men_holding_hands_tone5_tone4 = "👨🏿‍🤝‍👨🏾"; + constexpr const char[] men_holding_hands_dark_skin_tone_medium_dark_skin_tone = "👨🏿‍🤝‍👨🏾"; + constexpr const char[] men_holding_hands_tone5 = "👬🏿"; + constexpr const char[] men_holding_hands_dark_skin_tone = "👬🏿"; + constexpr const char[] couple_with_heart = "💑"; + constexpr const char[] couple_with_heart_tone1 = "💑🏻"; + constexpr const char[] couple_with_heart_light_skin_tone = "💑🏻"; + constexpr const char[] couple_with_heart_person_person_tone1_tone2 = "🧑🏻‍❤️‍🧑🏼"; + constexpr const char[] couple_with_heart_person_person_light_skin_tone_medium_light_skin_tone = "🧑🏻‍❤️‍🧑🏼"; + constexpr const char[] couple_with_heart_person_person_tone1_tone3 = "🧑🏻‍❤️‍🧑🏽"; + constexpr const char[] couple_with_heart_person_person_light_skin_tone_medium_skin_tone = "🧑🏻‍❤️‍🧑🏽"; + constexpr const char[] couple_with_heart_person_person_tone1_tone4 = "🧑🏻‍❤️‍🧑🏾"; + constexpr const char[] couple_with_heart_person_person_light_skin_tone_medium_dark_skin_tone = "🧑🏻‍❤️‍🧑🏾"; + constexpr const char[] couple_with_heart_person_person_tone1_tone5 = "🧑🏻‍❤️‍🧑🏿"; + constexpr const char[] couple_with_heart_person_person_light_skin_tone_dark_skin_tone = "🧑🏻‍❤️‍🧑🏿"; + constexpr const char[] couple_with_heart_person_person_tone2_tone1 = "🧑🏼‍❤️‍🧑🏻"; + constexpr const char[] couple_with_heart_person_person_medium_light_skin_tone_light_skin_tone = "🧑🏼‍❤️‍🧑🏻"; + constexpr const char[] couple_with_heart_tone2 = "💑🏼"; + constexpr const char[] couple_with_heart_medium_light_skin_tone = "💑🏼"; + constexpr const char[] couple_with_heart_person_person_tone2_tone3 = "🧑🏼‍❤️‍🧑🏽"; + constexpr const char[] couple_with_heart_person_person_medium_light_skin_tone_medium_skin_tone = "🧑🏼‍❤️‍🧑🏽"; + constexpr const char[] couple_with_heart_person_person_tone2_tone4 = "🧑🏼‍❤️‍🧑🏾"; + constexpr const char[] couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone = "🧑🏼‍❤️‍🧑🏾"; + constexpr const char[] couple_with_heart_person_person_tone2_tone5 = "🧑🏼‍❤️‍🧑🏿"; + constexpr const char[] couple_with_heart_person_person_medium_light_skin_tone_dark_skin_tone = "🧑🏼‍❤️‍🧑🏿"; + constexpr const char[] couple_with_heart_person_person_tone3_tone1 = "🧑🏽‍❤️‍🧑🏻"; + constexpr const char[] couple_with_heart_person_person_medium_skin_tone_light_skin_tone = "🧑🏽‍❤️‍🧑🏻"; + constexpr const char[] couple_with_heart_person_person_tone3_tone2 = "🧑🏽‍❤️‍🧑🏼"; + constexpr const char[] couple_with_heart_person_person_medium_skin_tone_medium_light_skin_tone = "🧑🏽‍❤️‍🧑🏼"; + constexpr const char[] couple_with_heart_tone3 = "💑🏽"; + constexpr const char[] couple_with_heart_medium_skin_tone = "💑🏽"; + constexpr const char[] couple_with_heart_person_person_tone3_tone4 = "🧑🏽‍❤️‍🧑🏾"; + constexpr const char[] couple_with_heart_person_person_medium_skin_tone_medium_dark_skin_tone = "🧑🏽‍❤️‍🧑🏾"; + constexpr const char[] couple_with_heart_person_person_tone3_tone5 = "🧑🏽‍❤️‍🧑🏿"; + constexpr const char[] couple_with_heart_person_person_medium_skin_tone_dark_skin_tone = "🧑🏽‍❤️‍🧑🏿"; + constexpr const char[] couple_with_heart_person_person_tone4_tone1 = "🧑🏾‍❤️‍🧑🏻"; + constexpr const char[] couple_with_heart_person_person_medium_dark_skin_tone_light_skin_tone = "🧑🏾‍❤️‍🧑🏻"; + constexpr const char[] couple_with_heart_person_person_tone4_tone2 = "🧑🏾‍❤️‍🧑🏼"; + constexpr const char[] couple_with_heart_person_person_medium_dark_skin_tone_medium_light_skin_tone = "🧑🏾‍❤️‍🧑🏼"; + constexpr const char[] couple_with_heart_person_person_tone4_tone3 = "🧑🏾‍❤️‍🧑🏽"; + constexpr const char[] couple_with_heart_person_person_medium_dark_skin_tone_medium_skin_tone = "🧑🏾‍❤️‍🧑🏽"; + constexpr const char[] couple_with_heart_tone4 = "💑🏾"; + constexpr const char[] couple_with_heart_medium_dark_skin_tone = "💑🏾"; + constexpr const char[] couple_with_heart_person_person_tone4_tone5 = "🧑🏾‍❤️‍🧑🏿"; + constexpr const char[] couple_with_heart_person_person_medium_dark_skin_tone_dark_skin_tone = "🧑🏾‍❤️‍🧑🏿"; + constexpr const char[] couple_with_heart_person_person_tone5_tone1 = "🧑🏿‍❤️‍🧑🏻"; + constexpr const char[] couple_with_heart_person_person_dark_skin_tone_light_skin_tone = "🧑🏿‍❤️‍🧑🏻"; + constexpr const char[] couple_with_heart_person_person_tone5_tone2 = "🧑🏿‍❤️‍🧑🏼"; + constexpr const char[] couple_with_heart_person_person_dark_skin_tone_medium_light_skin_tone = "🧑🏿‍❤️‍🧑🏼"; + constexpr const char[] couple_with_heart_person_person_tone5_tone3 = "🧑🏿‍❤️‍🧑🏽"; + constexpr const char[] couple_with_heart_person_person_dark_skin_tone_medium_skin_tone = "🧑🏿‍❤️‍🧑🏽"; + constexpr const char[] couple_with_heart_person_person_tone5_tone4 = "🧑🏿‍❤️‍🧑🏾"; + constexpr const char[] couple_with_heart_person_person_dark_skin_tone_medium_dark_skin_tone = "🧑🏿‍❤️‍🧑🏾"; + constexpr const char[] couple_with_heart_tone5 = "💑🏿"; + constexpr const char[] couple_with_heart_dark_skin_tone = "💑🏿"; + constexpr const char[] couple_with_heart_woman_man = "👩‍❤️‍👨"; + constexpr const char[] couple_with_heart_woman_man_tone1 = "👩🏻‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_light_skin_tone = "👩🏻‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_tone1_tone2 = "👩🏻‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_light_skin_tone_medium_light_skin_tone = "👩🏻‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_tone1_tone3 = "👩🏻‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_light_skin_tone_medium_skin_tone = "👩🏻‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_tone1_tone4 = "👩🏻‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_light_skin_tone_medium_dark_skin_tone = "👩🏻‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_tone1_tone5 = "👩🏻‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_woman_man_light_skin_tone_dark_skin_tone = "👩🏻‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_woman_man_tone2_tone1 = "👩🏼‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_medium_light_skin_tone_light_skin_tone = "👩🏼‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_tone2 = "👩🏼‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_medium_light_skin_tone = "👩🏼‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_tone2_tone3 = "👩🏼‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_medium_light_skin_tone_medium_skin_tone = "👩🏼‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_tone2_tone4 = "👩🏼‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_medium_light_skin_tone_medium_dark_skin_tone = "👩🏼‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_tone2_tone5 = "👩🏼‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_woman_man_medium_light_skin_tone_dark_skin_tone = "👩🏼‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_woman_man_tone3_tone1 = "👩🏽‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_medium_skin_tone_light_skin_tone = "👩🏽‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_tone3_tone2 = "👩🏽‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_medium_skin_tone_medium_light_skin_tone = "👩🏽‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_tone3 = "👩🏽‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_medium_skin_tone = "👩🏽‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_tone3_tone4 = "👩🏽‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_medium_skin_tone_medium_dark_skin_tone = "👩🏽‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_tone3_tone5 = "👩🏽‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone = "👩🏽‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_woman_man_tone4_tone1 = "👩🏾‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_medium_dark_skin_tone_light_skin_tone = "👩🏾‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_tone4_tone2 = "👩🏾‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_medium_dark_skin_tone_medium_light_skin_tone = "👩🏾‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_tone4_tone3 = "👩🏾‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_medium_dark_skin_tone_medium_skin_tone = "👩🏾‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_tone4 = "👩🏾‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_medium_dark_skin_tone = "👩🏾‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_tone4_tone5 = "👩🏾‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_woman_man_medium_dark_skin_tone_dark_skin_tone = "👩🏾‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_woman_man_tone5_tone1 = "👩🏿‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_dark_skin_tone_light_skin_tone = "👩🏿‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_woman_man_tone5_tone2 = "👩🏿‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_dark_skin_tone_medium_light_skin_tone = "👩🏿‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_woman_man_tone5_tone3 = "👩🏿‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone = "👩🏿‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_woman_man_tone5_tone4 = "👩🏿‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_dark_skin_tone_medium_dark_skin_tone = "👩🏿‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_woman_man_tone5 = "👩🏿‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_woman_man_dark_skin_tone = "👩🏿‍❤️‍👨🏿"; + constexpr const char[] couple_ww = "👩‍❤️‍👩"; + constexpr const char[] couple_with_heart_ww = "👩‍❤️‍👩"; + constexpr const char[] couple_with_heart_woman_woman_tone1 = "👩🏻‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_light_skin_tone = "👩🏻‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_tone1_tone2 = "👩🏻‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_light_skin_tone_medium_light_skin_tone = "👩🏻‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_tone1_tone3 = "👩🏻‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone = "👩🏻‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_tone1_tone4 = "👩🏻‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_light_skin_tone_medium_dark_skin_tone = "👩🏻‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_tone1_tone5 = "👩🏻‍❤️‍👩🏿"; + constexpr const char[] couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone = "👩🏻‍❤️‍👩🏿"; + constexpr const char[] couple_with_heart_woman_woman_tone2_tone1 = "👩🏼‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_medium_light_skin_tone_light_skin_tone = "👩🏼‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_tone2 = "👩🏼‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_medium_light_skin_tone = "👩🏼‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_tone2_tone3 = "👩🏼‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_medium_light_skin_tone_medium_skin_tone = "👩🏼‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_tone2_tone4 = "👩🏼‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_medium_light_skin_tone_medium_dark_skin_tone = "👩🏼‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_tone2_tone5 = "👩🏼‍❤️‍👩🏿"; + constexpr const char[] couple_with_heart_woman_woman_medium_light_skin_tone_dark_skin_tone = "👩🏼‍❤️‍👩🏿"; + constexpr const char[] couple_with_heart_woman_woman_tone3_tone1 = "👩🏽‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone = "👩🏽‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_tone3_tone2 = "👩🏽‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_medium_skin_tone_medium_light_skin_tone = "👩🏽‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_tone3 = "👩🏽‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_medium_skin_tone = "👩🏽‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_tone3_tone4 = "👩🏽‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_medium_skin_tone_medium_dark_skin_tone = "👩🏽‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_tone3_tone5 = "👩🏽‍❤️‍👩🏿"; + constexpr const char[] couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone = "👩🏽‍❤️‍👩🏿"; + constexpr const char[] couple_with_heart_woman_woman_tone4_tone1 = "👩🏾‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_medium_dark_skin_tone_light_skin_tone = "👩🏾‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_tone4_tone2 = "👩🏾‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_medium_dark_skin_tone_medium_light_skin_tone = "👩🏾‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_tone4_tone3 = "👩🏾‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_medium_dark_skin_tone_medium_skin_tone = "👩🏾‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_tone4 = "👩🏾‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_medium_dark_skin_tone = "👩🏾‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_tone4_tone5 = "👩🏾‍❤️‍👩🏿"; + constexpr const char[] couple_with_heart_woman_woman_medium_dark_skin_tone_dark_skin_tone = "👩🏾‍❤️‍👩🏿"; + constexpr const char[] couple_with_heart_woman_woman_tone5_tone1 = "👩🏿‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone = "👩🏿‍❤️‍👩🏻"; + constexpr const char[] couple_with_heart_woman_woman_tone5_tone2 = "👩🏿‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_dark_skin_tone_medium_light_skin_tone = "👩🏿‍❤️‍👩🏼"; + constexpr const char[] couple_with_heart_woman_woman_tone5_tone3 = "👩🏿‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone = "👩🏿‍❤️‍👩🏽"; + constexpr const char[] couple_with_heart_woman_woman_tone5_tone4 = "👩🏿‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_dark_skin_tone_medium_dark_skin_tone = "👩🏿‍❤️‍👩🏾"; + constexpr const char[] couple_with_heart_woman_woman_tone5 = "👩🏿‍❤️‍👩🏿"; + constexpr const char[] couple_with_heart_woman_woman_dark_skin_tone = "👩🏿‍❤️‍👩🏿"; + constexpr const char[] couple_mm = "👨‍❤️‍👨"; + constexpr const char[] couple_with_heart_mm = "👨‍❤️‍👨"; + constexpr const char[] couple_with_heart_man_man_tone1 = "👨🏻‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_light_skin_tone = "👨🏻‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_tone1_tone2 = "👨🏻‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_light_skin_tone_medium_light_skin_tone = "👨🏻‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_tone1_tone3 = "👨🏻‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_light_skin_tone_medium_skin_tone = "👨🏻‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_tone1_tone4 = "👨🏻‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_light_skin_tone_medium_dark_skin_tone = "👨🏻‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_tone1_tone5 = "👨🏻‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_man_man_light_skin_tone_dark_skin_tone = "👨🏻‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_man_man_tone2_tone1 = "👨🏼‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_medium_light_skin_tone_light_skin_tone = "👨🏼‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_tone2 = "👨🏼‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_medium_light_skin_tone = "👨🏼‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_tone2_tone3 = "👨🏼‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_medium_light_skin_tone_medium_skin_tone = "👨🏼‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_tone2_tone4 = "👨🏼‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_medium_light_skin_tone_medium_dark_skin_tone = "👨🏼‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_tone2_tone5 = "👨🏼‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_man_man_medium_light_skin_tone_dark_skin_tone = "👨🏼‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_man_man_tone3_tone1 = "👨🏽‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_medium_skin_tone_light_skin_tone = "👨🏽‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_tone3_tone2 = "👨🏽‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_medium_skin_tone_medium_light_skin_tone = "👨🏽‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_tone3 = "👨🏽‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_medium_skin_tone = "👨🏽‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_tone3_tone4 = "👨🏽‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_medium_skin_tone_medium_dark_skin_tone = "👨🏽‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_tone3_tone5 = "👨🏽‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_man_man_medium_skin_tone_dark_skin_tone = "👨🏽‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_man_man_tone4_tone1 = "👨🏾‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_medium_dark_skin_tone_light_skin_tone = "👨🏾‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_tone4_tone2 = "👨🏾‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_medium_dark_skin_tone_medium_light_skin_tone = "👨🏾‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_tone4_tone3 = "👨🏾‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_medium_dark_skin_tone_medium_skin_tone = "👨🏾‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_tone4 = "👨🏾‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_medium_dark_skin_tone = "👨🏾‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_tone4_tone5 = "👨🏾‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_man_man_medium_dark_skin_tone_dark_skin_tone = "👨🏾‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_man_man_tone5_tone1 = "👨🏿‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_dark_skin_tone_light_skin_tone = "👨🏿‍❤️‍👨🏻"; + constexpr const char[] couple_with_heart_man_man_tone5_tone2 = "👨🏿‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_dark_skin_tone_medium_light_skin_tone = "👨🏿‍❤️‍👨🏼"; + constexpr const char[] couple_with_heart_man_man_tone5_tone3 = "👨🏿‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_dark_skin_tone_medium_skin_tone = "👨🏿‍❤️‍👨🏽"; + constexpr const char[] couple_with_heart_man_man_tone5_tone4 = "👨🏿‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_dark_skin_tone_medium_dark_skin_tone = "👨🏿‍❤️‍👨🏾"; + constexpr const char[] couple_with_heart_man_man_tone5 = "👨🏿‍❤️‍👨🏿"; + constexpr const char[] couple_with_heart_man_man_dark_skin_tone = "👨🏿‍❤️‍👨🏿"; + constexpr const char[] couplekiss = "💏"; + constexpr const char[] kiss_tone1 = "💏🏻"; + constexpr const char[] kiss_light_skin_tone = "💏🏻"; + constexpr const char[] kiss_person_person_tone1_tone2 = "🧑🏻‍❤️‍💋‍🧑🏼"; + constexpr const char[] kiss_person_person_light_skin_tone_medium_light_skin_tone = "🧑🏻‍❤️‍💋‍🧑🏼"; + constexpr const char[] kiss_person_person_tone1_tone3 = "🧑🏻‍❤️‍💋‍🧑🏽"; + constexpr const char[] kiss_person_person_light_skin_tone_medium_skin_tone = "🧑🏻‍❤️‍💋‍🧑🏽"; + constexpr const char[] kiss_person_person_tone1_tone4 = "🧑🏻‍❤️‍💋‍🧑🏾"; + constexpr const char[] kiss_person_person_light_skin_tone_medium_dark_skin_tone = "🧑🏻‍❤️‍💋‍🧑🏾"; + constexpr const char[] kiss_person_person_tone1_tone5 = "🧑🏻‍❤️‍💋‍🧑🏿"; + constexpr const char[] kiss_person_person_light_skin_tone_dark_skin_tone = "🧑🏻‍❤️‍💋‍🧑🏿"; + constexpr const char[] kiss_person_person_tone2_tone1 = "🧑🏼‍❤️‍💋‍🧑🏻"; + constexpr const char[] kiss_person_person_medium_light_skin_tone_light_skin_tone = "🧑🏼‍❤️‍💋‍🧑🏻"; + constexpr const char[] kiss_tone2 = "💏🏼"; + constexpr const char[] kiss_medium_light_skin_tone = "💏🏼"; + constexpr const char[] kiss_person_person_tone2_tone3 = "🧑🏼‍❤️‍💋‍🧑🏽"; + constexpr const char[] kiss_person_person_medium_light_skin_tone_medium_skin_tone = "🧑🏼‍❤️‍💋‍🧑🏽"; + constexpr const char[] kiss_person_person_tone2_tone4 = "🧑🏼‍❤️‍💋‍🧑🏾"; + constexpr const char[] kiss_person_person_medium_light_skin_tone_medium_dark_skin_tone = "🧑🏼‍❤️‍💋‍🧑🏾"; + constexpr const char[] kiss_person_person_tone2_tone5 = "🧑🏼‍❤️‍💋‍🧑🏿"; + constexpr const char[] kiss_person_person_medium_light_skin_tone_dark_skin_tone = "🧑🏼‍❤️‍💋‍🧑🏿"; + constexpr const char[] kiss_person_person_tone3_tone1 = "🧑🏽‍❤️‍💋‍🧑🏻"; + constexpr const char[] kiss_person_person_medium_skin_tone_light_skin_tone = "🧑🏽‍❤️‍💋‍🧑🏻"; + constexpr const char[] kiss_person_person_tone3_tone2 = "🧑🏽‍❤️‍💋‍🧑🏼"; + constexpr const char[] kiss_person_person_medium_skin_tone_medium_light_skin_tone = "🧑🏽‍❤️‍💋‍🧑🏼"; + constexpr const char[] kiss_tone3 = "💏🏽"; + constexpr const char[] kiss_medium_skin_tone = "💏🏽"; + constexpr const char[] kiss_person_person_tone3_tone4 = "🧑🏽‍❤️‍💋‍🧑🏾"; + constexpr const char[] kiss_person_person_medium_skin_tone_medium_dark_skin_tone = "🧑🏽‍❤️‍💋‍🧑🏾"; + constexpr const char[] kiss_person_person_tone3_tone5 = "🧑🏽‍❤️‍💋‍🧑🏿"; + constexpr const char[] kiss_person_person_medium_skin_tone_dark_skin_tone = "🧑🏽‍❤️‍💋‍🧑🏿"; + constexpr const char[] kiss_person_person_tone4_tone1 = "🧑🏾‍❤️‍💋‍🧑🏻"; + constexpr const char[] kiss_person_person_medium_dark_skin_tone_light_skin_tone = "🧑🏾‍❤️‍💋‍🧑🏻"; + constexpr const char[] kiss_person_person_tone4_tone2 = "🧑🏾‍❤️‍💋‍🧑🏼"; + constexpr const char[] kiss_person_person_medium_dark_skin_tone_medium_light_skin_tone = "🧑🏾‍❤️‍💋‍🧑🏼"; + constexpr const char[] kiss_person_person_tone4_tone3 = "🧑🏾‍❤️‍💋‍🧑🏽"; + constexpr const char[] kiss_person_person_medium_dark_skin_tone_medium_skin_tone = "🧑🏾‍❤️‍💋‍🧑🏽"; + constexpr const char[] kiss_tone4 = "💏🏾"; + constexpr const char[] kiss_medium_dark_skin_tone = "💏🏾"; + constexpr const char[] kiss_person_person_tone4_tone5 = "🧑🏾‍❤️‍💋‍🧑🏿"; + constexpr const char[] kiss_person_person_medium_dark_skin_tone_dark_skin_tone = "🧑🏾‍❤️‍💋‍🧑🏿"; + constexpr const char[] kiss_person_person_tone5_tone1 = "🧑🏿‍❤️‍💋‍🧑🏻"; + constexpr const char[] kiss_person_person_dark_skin_tone_light_skin_tone = "🧑🏿‍❤️‍💋‍🧑🏻"; + constexpr const char[] kiss_person_person_tone5_tone2 = "🧑🏿‍❤️‍💋‍🧑🏼"; + constexpr const char[] kiss_person_person_dark_skin_tone_medium_light_skin_tone = "🧑🏿‍❤️‍💋‍🧑🏼"; + constexpr const char[] kiss_person_person_tone5_tone3 = "🧑🏿‍❤️‍💋‍🧑🏽"; + constexpr const char[] kiss_person_person_dark_skin_tone_medium_skin_tone = "🧑🏿‍❤️‍💋‍🧑🏽"; + constexpr const char[] kiss_person_person_tone5_tone4 = "🧑🏿‍❤️‍💋‍🧑🏾"; + constexpr const char[] kiss_person_person_dark_skin_tone_medium_dark_skin_tone = "🧑🏿‍❤️‍💋‍🧑🏾"; + constexpr const char[] kiss_tone5 = "💏🏿"; + constexpr const char[] kiss_dark_skin_tone = "💏🏿"; + constexpr const char[] kiss_woman_man = "👩‍❤️‍💋‍👨"; + constexpr const char[] kiss_woman_man_tone1 = "👩🏻‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_light_skin_tone = "👩🏻‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_tone1_tone2 = "👩🏻‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_light_skin_tone_medium_light_skin_tone = "👩🏻‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_tone1_tone3 = "👩🏻‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_light_skin_tone_medium_skin_tone = "👩🏻‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_tone1_tone4 = "👩🏻‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_light_skin_tone_medium_dark_skin_tone = "👩🏻‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_tone1_tone5 = "👩🏻‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_woman_man_light_skin_tone_dark_skin_tone = "👩🏻‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_woman_man_tone2_tone1 = "👩🏼‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_medium_light_skin_tone_light_skin_tone = "👩🏼‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_tone2 = "👩🏼‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_medium_light_skin_tone = "👩🏼‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_tone2_tone3 = "👩🏼‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_medium_light_skin_tone_medium_skin_tone = "👩🏼‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_tone2_tone4 = "👩🏼‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_medium_light_skin_tone_medium_dark_skin_tone = "👩🏼‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_tone2_tone5 = "👩🏼‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_woman_man_medium_light_skin_tone_dark_skin_tone = "👩🏼‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_woman_man_tone3_tone1 = "👩🏽‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_medium_skin_tone_light_skin_tone = "👩🏽‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_tone3_tone2 = "👩🏽‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_medium_skin_tone_medium_light_skin_tone = "👩🏽‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_tone3 = "👩🏽‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_medium_skin_tone = "👩🏽‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_tone3_tone4 = "👩🏽‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_medium_skin_tone_medium_dark_skin_tone = "👩🏽‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_tone3_tone5 = "👩🏽‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_woman_man_medium_skin_tone_dark_skin_tone = "👩🏽‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_woman_man_tone4_tone1 = "👩🏾‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_medium_dark_skin_tone_light_skin_tone = "👩🏾‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_tone4_tone2 = "👩🏾‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_medium_dark_skin_tone_medium_light_skin_tone = "👩🏾‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_tone4_tone3 = "👩🏾‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_medium_dark_skin_tone_medium_skin_tone = "👩🏾‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_tone4 = "👩🏾‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_medium_dark_skin_tone = "👩🏾‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_tone4_tone5 = "👩🏾‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_woman_man_medium_dark_skin_tone_dark_skin_tone = "👩🏾‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_woman_man_tone5_tone1 = "👩🏿‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_dark_skin_tone_light_skin_tone = "👩🏿‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_woman_man_tone5_tone2 = "👩🏿‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_dark_skin_tone_medium_light_skin_tone = "👩🏿‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_woman_man_tone5_tone3 = "👩🏿‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_dark_skin_tone_medium_skin_tone = "👩🏿‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_woman_man_tone5_tone4 = "👩🏿‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_dark_skin_tone_medium_dark_skin_tone = "👩🏿‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_woman_man_tone5 = "👩🏿‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_woman_man_dark_skin_tone = "👩🏿‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_ww = "👩‍❤️‍💋‍👩"; + constexpr const char[] couplekiss_ww = "👩‍❤️‍💋‍👩"; + constexpr const char[] kiss_woman_woman_tone1 = "👩🏻‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_light_skin_tone = "👩🏻‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_tone1_tone2 = "👩🏻‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_light_skin_tone_medium_light_skin_tone = "👩🏻‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_tone1_tone3 = "👩🏻‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_light_skin_tone_medium_skin_tone = "👩🏻‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_tone1_tone4 = "👩🏻‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_light_skin_tone_medium_dark_skin_tone = "👩🏻‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_tone1_tone5 = "👩🏻‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_woman_woman_light_skin_tone_dark_skin_tone = "👩🏻‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_woman_woman_tone2_tone1 = "👩🏼‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_medium_light_skin_tone_light_skin_tone = "👩🏼‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_tone2 = "👩🏼‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_medium_light_skin_tone = "👩🏼‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_tone2_tone3 = "👩🏼‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_medium_light_skin_tone_medium_skin_tone = "👩🏼‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_tone2_tone4 = "👩🏼‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_medium_light_skin_tone_medium_dark_skin_tone = "👩🏼‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_tone2_tone5 = "👩🏼‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_woman_woman_medium_light_skin_tone_dark_skin_tone = "👩🏼‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_woman_woman_tone3_tone1 = "👩🏽‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_medium_skin_tone_light_skin_tone = "👩🏽‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_tone3_tone2 = "👩🏽‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_medium_skin_tone_medium_light_skin_tone = "👩🏽‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_tone3 = "👩🏽‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_medium_skin_tone = "👩🏽‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_tone3_tone4 = "👩🏽‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_medium_skin_tone_medium_dark_skin_tone = "👩🏽‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_tone3_tone5 = "👩🏽‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_woman_woman_medium_skin_tone_dark_skin_tone = "👩🏽‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_woman_woman_tone4_tone1 = "👩🏾‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_medium_dark_skin_tone_light_skin_tone = "👩🏾‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_tone4_tone2 = "👩🏾‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_medium_dark_skin_tone_medium_light_skin_tone = "👩🏾‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_tone4_tone3 = "👩🏾‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_medium_dark_skin_tone_medium_skin_tone = "👩🏾‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_tone4 = "👩🏾‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_medium_dark_skin_tone = "👩🏾‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_tone4_tone5 = "👩🏾‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_woman_woman_medium_dark_skin_tone_dark_skin_tone = "👩🏾‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_woman_woman_tone5_tone1 = "👩🏿‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_dark_skin_tone_light_skin_tone = "👩🏿‍❤️‍💋‍👩🏻"; + constexpr const char[] kiss_woman_woman_tone5_tone2 = "👩🏿‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_dark_skin_tone_medium_light_skin_tone = "👩🏿‍❤️‍💋‍👩🏼"; + constexpr const char[] kiss_woman_woman_tone5_tone3 = "👩🏿‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_dark_skin_tone_medium_skin_tone = "👩🏿‍❤️‍💋‍👩🏽"; + constexpr const char[] kiss_woman_woman_tone5_tone4 = "👩🏿‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_dark_skin_tone_medium_dark_skin_tone = "👩🏿‍❤️‍💋‍👩🏾"; + constexpr const char[] kiss_woman_woman_tone5 = "👩🏿‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_woman_woman_dark_skin_tone = "👩🏿‍❤️‍💋‍👩🏿"; + constexpr const char[] kiss_mm = "👨‍❤️‍💋‍👨"; + constexpr const char[] couplekiss_mm = "👨‍❤️‍💋‍👨"; + constexpr const char[] kiss_man_man_tone1 = "👨🏻‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_light_skin_tone = "👨🏻‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_tone1_tone2 = "👨🏻‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_light_skin_tone_medium_light_skin_tone = "👨🏻‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_tone1_tone3 = "👨🏻‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_light_skin_tone_medium_skin_tone = "👨🏻‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_tone1_tone4 = "👨🏻‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_light_skin_tone_medium_dark_skin_tone = "👨🏻‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_tone1_tone5 = "👨🏻‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_man_man_light_skin_tone_dark_skin_tone = "👨🏻‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_man_man_tone2_tone1 = "👨🏼‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_medium_light_skin_tone_light_skin_tone = "👨🏼‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_tone2 = "👨🏼‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_medium_light_skin_tone = "👨🏼‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_tone2_tone3 = "👨🏼‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_medium_light_skin_tone_medium_skin_tone = "👨🏼‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_tone2_tone4 = "👨🏼‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_medium_light_skin_tone_medium_dark_skin_tone = "👨🏼‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_tone2_tone5 = "👨🏼‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_man_man_medium_light_skin_tone_dark_skin_tone = "👨🏼‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_man_man_tone3_tone1 = "👨🏽‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_medium_skin_tone_light_skin_tone = "👨🏽‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_tone3_tone2 = "👨🏽‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_medium_skin_tone_medium_light_skin_tone = "👨🏽‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_tone3 = "👨🏽‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_medium_skin_tone = "👨🏽‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_tone3_tone4 = "👨🏽‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_medium_skin_tone_medium_dark_skin_tone = "👨🏽‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_tone3_tone5 = "👨🏽‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_man_man_medium_skin_tone_dark_skin_tone = "👨🏽‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_man_man_tone4_tone1 = "👨🏾‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_medium_dark_skin_tone_light_skin_tone = "👨🏾‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_tone4_tone2 = "👨🏾‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_medium_dark_skin_tone_medium_light_skin_tone = "👨🏾‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_tone4_tone3 = "👨🏾‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_medium_dark_skin_tone_medium_skin_tone = "👨🏾‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_tone4 = "👨🏾‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_medium_dark_skin_tone = "👨🏾‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_tone4_tone5 = "👨🏾‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_man_man_medium_dark_skin_tone_dark_skin_tone = "👨🏾‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_man_man_tone5_tone1 = "👨🏿‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_dark_skin_tone_light_skin_tone = "👨🏿‍❤️‍💋‍👨🏻"; + constexpr const char[] kiss_man_man_tone5_tone2 = "👨🏿‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_dark_skin_tone_medium_light_skin_tone = "👨🏿‍❤️‍💋‍👨🏼"; + constexpr const char[] kiss_man_man_tone5_tone3 = "👨🏿‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_dark_skin_tone_medium_skin_tone = "👨🏿‍❤️‍💋‍👨🏽"; + constexpr const char[] kiss_man_man_tone5_tone4 = "👨🏿‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_dark_skin_tone_medium_dark_skin_tone = "👨🏿‍❤️‍💋‍👨🏾"; + constexpr const char[] kiss_man_man_tone5 = "👨🏿‍❤️‍💋‍👨🏿"; + constexpr const char[] kiss_man_man_dark_skin_tone = "👨🏿‍❤️‍💋‍👨🏿"; + constexpr const char[] family = "👪"; + constexpr const char[] family_man_woman_boy = "👨‍👩‍👦"; + constexpr const char[] family_mwg = "👨‍👩‍👧"; + constexpr const char[] family_mwgb = "👨‍👩‍👧‍👦"; + constexpr const char[] family_mwbb = "👨‍👩‍👦‍👦"; + constexpr const char[] family_mwgg = "👨‍👩‍👧‍👧"; + constexpr const char[] family_wwb = "👩‍👩‍👦"; + constexpr const char[] family_wwg = "👩‍👩‍👧"; + constexpr const char[] family_wwgb = "👩‍👩‍👧‍👦"; + constexpr const char[] family_wwbb = "👩‍👩‍👦‍👦"; + constexpr const char[] family_wwgg = "👩‍👩‍👧‍👧"; + constexpr const char[] family_mmb = "👨‍👨‍👦"; + constexpr const char[] family_mmg = "👨‍👨‍👧"; + constexpr const char[] family_mmgb = "👨‍👨‍👧‍👦"; + constexpr const char[] family_mmbb = "👨‍👨‍👦‍👦"; + constexpr const char[] family_mmgg = "👨‍👨‍👧‍👧"; + constexpr const char[] family_woman_boy = "👩‍👦"; + constexpr const char[] family_woman_girl = "👩‍👧"; + constexpr const char[] family_woman_girl_boy = "👩‍👧‍👦"; + constexpr const char[] family_woman_boy_boy = "👩‍👦‍👦"; + constexpr const char[] family_woman_girl_girl = "👩‍👧‍👧"; + constexpr const char[] family_man_boy = "👨‍👦"; + constexpr const char[] family_man_girl = "👨‍👧"; + constexpr const char[] family_man_girl_boy = "👨‍👧‍👦"; + constexpr const char[] family_man_boy_boy = "👨‍👦‍👦"; + constexpr const char[] family_man_girl_girl = "👨‍👧‍👧"; + constexpr const char[] knot = "🪢"; + constexpr const char[] yarn = "🧶"; + constexpr const char[] thread = "🧵"; + constexpr const char[] sewing_needle = "🪡"; + constexpr const char[] coat = "🧥"; + constexpr const char[] lab_coat = "🥼"; + constexpr const char[] safety_vest = "🦺"; + constexpr const char[] womans_clothes = "👚"; + constexpr const char[] shirt = "👕"; + constexpr const char[] jeans = "👖"; + constexpr const char[] briefs = "🩲"; + constexpr const char[] shorts = "🩳"; + constexpr const char[] necktie = "👔"; + constexpr const char[] dress = "👗"; + constexpr const char[] bikini = "👙"; + constexpr const char[] one_piece_swimsuit = "🩱"; + constexpr const char[] kimono = "👘"; + constexpr const char[] sari = "🥻"; + constexpr const char[] thong_sandal = "🩴"; + constexpr const char[] womans_flat_shoe = "🥿"; + constexpr const char[] high_heel = "👠"; + constexpr const char[] sandal = "👡"; + constexpr const char[] boot = "👢"; + constexpr const char[] mans_shoe = "👞"; + constexpr const char[] athletic_shoe = "👟"; + constexpr const char[] hiking_boot = "🥾"; + constexpr const char[] socks = "🧦"; + constexpr const char[] gloves = "🧤"; + constexpr const char[] scarf = "🧣"; + constexpr const char[] tophat = "🎩"; + constexpr const char[] billed_cap = "🧢"; + constexpr const char[] womans_hat = "👒"; + constexpr const char[] mortar_board = "🎓"; + constexpr const char[] helmet_with_cross = "⛑️"; + constexpr const char[] helmet_with_white_cross = "⛑️"; + constexpr const char[] military_helmet = "🪖"; + constexpr const char[] crown = "👑"; + constexpr const char[] ring = "💍"; + constexpr const char[] pouch = "👝"; + constexpr const char[] purse = "👛"; + constexpr const char[] handbag = "👜"; + constexpr const char[] briefcase = "💼"; + constexpr const char[] school_satchel = "🎒"; + constexpr const char[] luggage = "🧳"; + constexpr const char[] eyeglasses = "👓"; + constexpr const char[] dark_sunglasses = "🕶️"; + constexpr const char[] goggles = "🥽"; + constexpr const char[] closed_umbrella = "🌂"; + constexpr const char[] heart = "❤️"; + constexpr const char[] orange_heart = "🧡"; + constexpr const char[] yellow_heart = "💛"; + constexpr const char[] green_heart = "💚"; + constexpr const char[] blue_heart = "💙"; + constexpr const char[] purple_heart = "💜"; + constexpr const char[] black_heart = "🖤"; + constexpr const char[] brown_heart = "🤎"; + constexpr const char[] white_heart = "🤍"; + constexpr const char[] broken_heart = "💔"; + constexpr const char[] heart_exclamation = "❣️"; + constexpr const char[] heavy_heart_exclamation_mark_ornament = "❣️"; + constexpr const char[] two_hearts = "💕"; + constexpr const char[] revolving_hearts = "💞"; + constexpr const char[] heartbeat = "💓"; + constexpr const char[] heartpulse = "💗"; + constexpr const char[] sparkling_heart = "💖"; + constexpr const char[] cupid = "💘"; + constexpr const char[] gift_heart = "💝"; + constexpr const char[] mending_heart = "❤️‍🩹"; + constexpr const char[] heart_on_fire = "❤️‍🔥"; + constexpr const char[] heart_decoration = "💟"; + constexpr const char[] peace = "☮️"; + constexpr const char[] peace_symbol = "☮️"; + constexpr const char[] cross = "✝️"; + constexpr const char[] latin_cross = "✝️"; + constexpr const char[] star_and_crescent = "☪️"; + constexpr const char[] om_symbol = "🕉️"; + constexpr const char[] wheel_of_dharma = "☸️"; + constexpr const char[] star_of_david = "✡️"; + constexpr const char[] six_pointed_star = "🔯"; + constexpr const char[] menorah = "🕎"; + constexpr const char[] yin_yang = "☯️"; + constexpr const char[] orthodox_cross = "☦️"; + constexpr const char[] place_of_worship = "🛐"; + constexpr const char[] worship_symbol = "🛐"; + constexpr const char[] ophiuchus = "⛎"; + constexpr const char[] aries = "♈"; + constexpr const char[] taurus = "♉"; + constexpr const char[] gemini = "♊"; + constexpr const char[] cancer = "♋"; + constexpr const char[] leo = "♌"; + constexpr const char[] virgo = "♍"; + constexpr const char[] libra = "♎"; + constexpr const char[] scorpius = "♏"; + constexpr const char[] sagittarius = "♐"; + constexpr const char[] capricorn = "♑"; + constexpr const char[] aquarius = "♒"; + constexpr const char[] pisces = "♓"; + constexpr const char[] id = "🆔"; + constexpr const char[] atom = "⚛️"; + constexpr const char[] atom_symbol = "⚛️"; + constexpr const char[] accept = "🉑"; + constexpr const char[] radioactive = "☢️"; + constexpr const char[] radioactive_sign = "☢️"; + constexpr const char[] biohazard = "☣️"; + constexpr const char[] biohazard_sign = "☣️"; + constexpr const char[] mobile_phone_off = "📴"; + constexpr const char[] vibration_mode = "📳"; + constexpr const char[] u6709 = "🈶"; + constexpr const char[] u7121 = "🈚"; + constexpr const char[] u7533 = "🈸"; + constexpr const char[] u55b6 = "🈺"; + constexpr const char[] u6708 = "🈷️"; + constexpr const char[] eight_pointed_black_star = "✴️"; + constexpr const char[] vs = "🆚"; + constexpr const char[] white_flower = "💮"; + constexpr const char[] ideograph_advantage = "🉐"; + constexpr const char[] secret = "㊙️"; + constexpr const char[] congratulations = "㊗️"; + constexpr const char[] u5408 = "🈴"; + constexpr const char[] u6e80 = "🈵"; + constexpr const char[] u5272 = "🈹"; + constexpr const char[] u7981 = "🈲"; + constexpr const char[] a = "🅰️"; + constexpr const char[] b = "🅱️"; + constexpr const char[] ab = "🆎"; + constexpr const char[] cl = "🆑"; + constexpr const char[] o2 = "🅾️"; + constexpr const char[] sos = "🆘"; + constexpr const char[] x = "❌"; + constexpr const char[] o = "⭕"; + constexpr const char[] octagonal_sign = "🛑"; + constexpr const char[] stop_sign = "🛑"; + constexpr const char[] no_entry = "⛔"; + constexpr const char[] name_badge = "📛"; + constexpr const char[] no_entry_sign = "🚫"; + constexpr const char[] anger = "💢"; + constexpr const char[] hotsprings = "♨️"; + constexpr const char[] no_pedestrians = "🚷"; + constexpr const char[] do_not_litter = "🚯"; + constexpr const char[] no_bicycles = "🚳"; + constexpr const char[] non_potable_water = "🚱"; + constexpr const char[] underage = "🔞"; + constexpr const char[] no_mobile_phones = "📵"; + constexpr const char[] no_smoking = "🚭"; + constexpr const char[] exclamation = "❗"; + constexpr const char[] grey_exclamation = "❕"; + constexpr const char[] question = "❓"; + constexpr const char[] grey_question = "❔"; + constexpr const char[] bangbang = "‼️"; + constexpr const char[] interrobang = "⁉️"; + constexpr const char[] low_brightness = "🔅"; + constexpr const char[] high_brightness = "🔆"; + constexpr const char[] part_alternation_mark = "〽️"; + constexpr const char[] warning = "⚠️"; + constexpr const char[] children_crossing = "🚸"; + constexpr const char[] trident = "🔱"; + constexpr const char[] fleur_de_lis = "⚜️"; + constexpr const char[] beginner = "🔰"; + constexpr const char[] recycle = "♻️"; + constexpr const char[] white_check_mark = "✅"; + constexpr const char[] u6307 = "🈯"; + constexpr const char[] chart = "💹"; + constexpr const char[] sparkle = "❇️"; + constexpr const char[] eight_spoked_asterisk = "✳️"; + constexpr const char[] negative_squared_cross_mark = "❎"; + constexpr const char[] globe_with_meridians = "🌐"; + constexpr const char[] diamond_shape_with_a_dot_inside = "💠"; + constexpr const char[] m = "Ⓜ️"; + constexpr const char[] cyclone = "🌀"; + constexpr const char[] zzz = "💤"; + constexpr const char[] atm = "🏧"; + constexpr const char[] wc = "🚾"; + constexpr const char[] wheelchair = "♿"; + constexpr const char[] parking = "🅿️"; + constexpr const char[] u7a7a = "🈳"; + constexpr const char[] sa = "🈂️"; + constexpr const char[] passport_control = "🛂"; + constexpr const char[] customs = "🛃"; + constexpr const char[] baggage_claim = "🛄"; + constexpr const char[] left_luggage = "🛅"; + constexpr const char[] elevator = "🛗"; + constexpr const char[] mens = "🚹"; + constexpr const char[] womens = "🚺"; + constexpr const char[] baby_symbol = "🚼"; + constexpr const char[] restroom = "🚻"; + constexpr const char[] put_litter_in_its_place = "🚮"; + constexpr const char[] cinema = "🎦"; + constexpr const char[] signal_strength = "📶"; + constexpr const char[] koko = "🈁"; + constexpr const char[] symbols = "🔣"; + constexpr const char[] information_source = "ℹ️"; + constexpr const char[] abc = "🔤"; + constexpr const char[] abcd = "🔡"; + constexpr const char[] capital_abcd = "🔠"; + constexpr const char[] ng = "🆖"; + constexpr const char[] ok = "🆗"; + constexpr const char[] up = "🆙"; + constexpr const char[] cool = "🆒"; + constexpr const char[] new = "🆕"; + constexpr const char[] free = "🆓"; + constexpr const char[] zero = "0️⃣"; + constexpr const char[] one = "1️⃣"; + constexpr const char[] two = "2️⃣"; + constexpr const char[] three = "3️⃣"; + constexpr const char[] four = "4️⃣"; + constexpr const char[] five = "5️⃣"; + constexpr const char[] six = "6️⃣"; + constexpr const char[] seven = "7️⃣"; + constexpr const char[] eight = "8️⃣"; + constexpr const char[] nine = "9️⃣"; + constexpr const char[] keycap_ten = "🔟"; + constexpr const char[] hash = "#️⃣"; + constexpr const char[] asterisk = "*️⃣"; + constexpr const char[] keycap_asterisk = "*️⃣"; + constexpr const char[] eject = "⏏️"; + constexpr const char[] eject_symbol = "⏏️"; + constexpr const char[] arrow_forward = "▶️"; + constexpr const char[] pause_button = "⏸️"; + constexpr const char[] double_vertical_bar = "⏸️"; + constexpr const char[] play_pause = "⏯️"; + constexpr const char[] stop_button = "⏹️"; + constexpr const char[] record_button = "⏺️"; + constexpr const char[] track_next = "⏭️"; + constexpr const char[] next_track = "⏭️"; + constexpr const char[] track_previous = "⏮️"; + constexpr const char[] previous_track = "⏮️"; + constexpr const char[] fast_forward = "⏩"; + constexpr const char[] rewind = "⏪"; + constexpr const char[] arrow_double_up = "⏫"; + constexpr const char[] arrow_double_down = "⏬"; + constexpr const char[] arrow_backward = "◀️"; + constexpr const char[] arrow_up_small = "🔼"; + constexpr const char[] arrow_down_small = "🔽"; + constexpr const char[] arrow_right = "➡️"; + constexpr const char[] arrow_left = "⬅️"; + constexpr const char[] arrow_up = "⬆️"; + constexpr const char[] arrow_down = "⬇️"; + constexpr const char[] arrow_upper_right = "↗️"; + constexpr const char[] arrow_lower_right = "↘️"; + constexpr const char[] arrow_lower_left = "↙️"; + constexpr const char[] arrow_upper_left = "↖️"; + constexpr const char[] arrow_up_down = "↕️"; + constexpr const char[] left_right_arrow = "↔️"; + constexpr const char[] arrow_right_hook = "↪️"; + constexpr const char[] leftwards_arrow_with_hook = "↩️"; + constexpr const char[] arrow_heading_up = "⤴️"; + constexpr const char[] arrow_heading_down = "⤵️"; + constexpr const char[] twisted_rightwards_arrows = "🔀"; + constexpr const char[] repeat = "🔁"; + constexpr const char[] repeat_one = "🔂"; + constexpr const char[] arrows_counterclockwise = "🔄"; + constexpr const char[] arrows_clockwise = "🔃"; + constexpr const char[] musical_note = "🎵"; + constexpr const char[] notes = "🎶"; + constexpr const char[] heavy_plus_sign = "➕"; + constexpr const char[] heavy_minus_sign = "➖"; + constexpr const char[] heavy_division_sign = "➗"; + constexpr const char[] heavy_multiplication_x = "✖️"; + constexpr const char[] heavy_equals_sign = "🟰"; + constexpr const char[] infinity = "♾️"; + constexpr const char[] heavy_dollar_sign = "💲"; + constexpr const char[] currency_exchange = "💱"; + constexpr const char[] tm = "™️"; + constexpr const char[] copyright = "©️"; + constexpr const char[] registered = "®️"; + constexpr const char[] wavy_dash = "〰️"; + constexpr const char[] curly_loop = "➰"; + constexpr const char[] loop = "➿"; + constexpr const char[] end = "🔚"; + constexpr const char[] back = "🔙"; + constexpr const char[] on = "🔛"; + constexpr const char[] top = "🔝"; + constexpr const char[] soon = "🔜"; + constexpr const char[] heavy_check_mark = "✔️"; + constexpr const char[] ballot_box_with_check = "☑️"; + constexpr const char[] radio_button = "🔘"; + constexpr const char[] white_circle = "⚪"; + constexpr const char[] black_circle = "⚫"; + constexpr const char[] red_circle = "🔴"; + constexpr const char[] blue_circle = "🔵"; + constexpr const char[] brown_circle = "🟤"; + constexpr const char[] purple_circle = "🟣"; + constexpr const char[] green_circle = "🟢"; + constexpr const char[] yellow_circle = "🟡"; + constexpr const char[] orange_circle = "🟠"; + constexpr const char[] small_red_triangle = "🔺"; + constexpr const char[] small_red_triangle_down = "🔻"; + constexpr const char[] small_orange_diamond = "🔸"; + constexpr const char[] small_blue_diamond = "🔹"; + constexpr const char[] large_orange_diamond = "🔶"; + constexpr const char[] large_blue_diamond = "🔷"; + constexpr const char[] white_square_button = "🔳"; + constexpr const char[] black_square_button = "🔲"; + constexpr const char[] black_small_square = "▪️"; + constexpr const char[] white_small_square = "▫️"; + constexpr const char[] black_medium_small_square = "◾"; + constexpr const char[] white_medium_small_square = "◽"; + constexpr const char[] black_medium_square = "◼️"; + constexpr const char[] white_medium_square = "◻️"; + constexpr const char[] black_large_square = "⬛"; + constexpr const char[] white_large_square = "⬜"; + constexpr const char[] orange_square = "🟧"; + constexpr const char[] blue_square = "🟦"; + constexpr const char[] red_square = "🟥"; + constexpr const char[] brown_square = "🟫"; + constexpr const char[] purple_square = "🟪"; + constexpr const char[] green_square = "🟩"; + constexpr const char[] yellow_square = "🟨"; + constexpr const char[] speaker = "🔈"; + constexpr const char[] mute = "🔇"; + constexpr const char[] sound = "🔉"; + constexpr const char[] loud_sound = "🔊"; + constexpr const char[] bell = "🔔"; + constexpr const char[] no_bell = "🔕"; + constexpr const char[] mega = "📣"; + constexpr const char[] loudspeaker = "📢"; + constexpr const char[] speech_left = "🗨️"; + constexpr const char[] left_speech_bubble = "🗨️"; + constexpr const char[] eye_in_speech_bubble = "👁‍🗨"; + constexpr const char[] speech_balloon = "💬"; + constexpr const char[] thought_balloon = "💭"; + constexpr const char[] anger_right = "🗯️"; + constexpr const char[] right_anger_bubble = "🗯️"; + constexpr const char[] spades = "♠️"; + constexpr const char[] clubs = "♣️"; + constexpr const char[] hearts = "♥️"; + constexpr const char[] diamonds = "♦️"; + constexpr const char[] black_joker = "🃏"; + constexpr const char[] flower_playing_cards = "🎴"; + constexpr const char[] mahjong = "🀄"; + constexpr const char[] clock1 = "🕐"; + constexpr const char[] clock2 = "🕑"; + constexpr const char[] clock3 = "🕒"; + constexpr const char[] clock4 = "🕓"; + constexpr const char[] clock5 = "🕔"; + constexpr const char[] clock6 = "🕕"; + constexpr const char[] clock7 = "🕖"; + constexpr const char[] clock8 = "🕗"; + constexpr const char[] clock9 = "🕘"; + constexpr const char[] clock10 = "🕙"; + constexpr const char[] clock11 = "🕚"; + constexpr const char[] clock12 = "🕛"; + constexpr const char[] clock130 = "🕜"; + constexpr const char[] clock230 = "🕝"; + constexpr const char[] clock330 = "🕞"; + constexpr const char[] clock430 = "🕟"; + constexpr const char[] clock530 = "🕠"; + constexpr const char[] clock630 = "🕡"; + constexpr const char[] clock730 = "🕢"; + constexpr const char[] clock830 = "🕣"; + constexpr const char[] clock930 = "🕤"; + constexpr const char[] clock1030 = "🕥"; + constexpr const char[] clock1130 = "🕦"; + constexpr const char[] clock1230 = "🕧"; + constexpr const char[] female_sign = "♀️"; + constexpr const char[] male_sign = "♂️"; + constexpr const char[] transgender_symbol = "⚧"; + constexpr const char[] medical_symbol = "⚕️"; + constexpr const char[] regional_indicator_z = "🇿"; + constexpr const char[] regional_indicator_y = "🇾"; + constexpr const char[] regional_indicator_x = "🇽"; + constexpr const char[] regional_indicator_w = "🇼"; + constexpr const char[] regional_indicator_v = "🇻"; + constexpr const char[] regional_indicator_u = "🇺"; + constexpr const char[] regional_indicator_t = "🇹"; + constexpr const char[] regional_indicator_s = "🇸"; + constexpr const char[] regional_indicator_r = "🇷"; + constexpr const char[] regional_indicator_q = "🇶"; + constexpr const char[] regional_indicator_p = "🇵"; + constexpr const char[] regional_indicator_o = "🇴"; + constexpr const char[] regional_indicator_n = "🇳"; + constexpr const char[] regional_indicator_m = "🇲"; + constexpr const char[] regional_indicator_l = "🇱"; + constexpr const char[] regional_indicator_k = "🇰"; + constexpr const char[] regional_indicator_j = "🇯"; + constexpr const char[] regional_indicator_i = "🇮"; + constexpr const char[] regional_indicator_h = "🇭"; + constexpr const char[] regional_indicator_g = "🇬"; + constexpr const char[] regional_indicator_f = "🇫"; + constexpr const char[] regional_indicator_e = "🇪"; + constexpr const char[] regional_indicator_d = "🇩"; + constexpr const char[] regional_indicator_c = "🇨"; + constexpr const char[] regional_indicator_b = "🇧"; + constexpr const char[] regional_indicator_a = "🇦"; + constexpr const char[] red_car = "🚗"; + constexpr const char[] taxi = "🚕"; + constexpr const char[] blue_car = "🚙"; + constexpr const char[] pickup_truck = "🛻"; + constexpr const char[] bus = "🚌"; + constexpr const char[] trolleybus = "🚎"; + constexpr const char[] race_car = "🏎️"; + constexpr const char[] racing_car = "🏎️"; + constexpr const char[] police_car = "🚓"; + constexpr const char[] ambulance = "🚑"; + constexpr const char[] fire_engine = "🚒"; + constexpr const char[] minibus = "🚐"; + constexpr const char[] truck = "🚚"; + constexpr const char[] articulated_lorry = "🚛"; + constexpr const char[] tractor = "🚜"; + constexpr const char[] probing_cane = "🦯"; + constexpr const char[] crutch = "🩼"; + constexpr const char[] manual_wheelchair = "🦽"; + constexpr const char[] motorized_wheelchair = "🦼"; + constexpr const char[] scooter = "🛴"; + constexpr const char[] bike = "🚲"; + constexpr const char[] motor_scooter = "🛵"; + constexpr const char[] motorbike = "🛵"; + constexpr const char[] motorcycle = "🏍️"; + constexpr const char[] racing_motorcycle = "🏍️"; + constexpr const char[] auto_rickshaw = "🛺"; + constexpr const char[] wheel = "🛞"; + constexpr const char[] rotating_light = "🚨"; + constexpr const char[] oncoming_police_car = "🚔"; + constexpr const char[] oncoming_bus = "🚍"; + constexpr const char[] oncoming_automobile = "🚘"; + constexpr const char[] oncoming_taxi = "🚖"; + constexpr const char[] aerial_tramway = "🚡"; + constexpr const char[] mountain_cableway = "🚠"; + constexpr const char[] suspension_railway = "🚟"; + constexpr const char[] railway_car = "🚃"; + constexpr const char[] train = "🚋"; + constexpr const char[] mountain_railway = "🚞"; + constexpr const char[] monorail = "🚝"; + constexpr const char[] bullettrain_side = "🚄"; + constexpr const char[] bullettrain_front = "🚅"; + constexpr const char[] light_rail = "🚈"; + constexpr const char[] steam_locomotive = "🚂"; + constexpr const char[] train2 = "🚆"; + constexpr const char[] metro = "🚇"; + constexpr const char[] tram = "🚊"; + constexpr const char[] station = "🚉"; + constexpr const char[] airplane = "✈️"; + constexpr const char[] airplane_departure = "🛫"; + constexpr const char[] airplane_arriving = "🛬"; + constexpr const char[] airplane_small = "🛩️"; + constexpr const char[] small_airplane = "🛩️"; + constexpr const char[] seat = "💺"; + constexpr const char[] satellite_orbital = "🛰️"; + constexpr const char[] rocket = "🚀"; + constexpr const char[] flying_saucer = "🛸"; + constexpr const char[] helicopter = "🚁"; + constexpr const char[] canoe = "🛶"; + constexpr const char[] kayak = "🛶"; + constexpr const char[] sailboat = "⛵"; + constexpr const char[] speedboat = "🚤"; + constexpr const char[] motorboat = "🛥️"; + constexpr const char[] cruise_ship = "🛳️"; + constexpr const char[] passenger_ship = "🛳️"; + constexpr const char[] ferry = "⛴️"; + constexpr const char[] ship = "🚢"; + constexpr const char[] ring_buoy = "🛟"; + constexpr const char[] anchor = "⚓"; + constexpr const char[] hook = "🪝"; + constexpr const char[] fuelpump = "⛽"; + constexpr const char[] construction = "🚧"; + constexpr const char[] vertical_traffic_light = "🚦"; + constexpr const char[] traffic_light = "🚥"; + constexpr const char[] busstop = "🚏"; + constexpr const char[] map = "🗺️"; + constexpr const char[] world_map = "🗺️"; + constexpr const char[] moyai = "🗿"; + constexpr const char[] statue_of_liberty = "🗽"; + constexpr const char[] tokyo_tower = "🗼"; + constexpr const char[] european_castle = "🏰"; + constexpr const char[] japanese_castle = "🏯"; + constexpr const char[] stadium = "🏟️"; + constexpr const char[] ferris_wheel = "🎡"; + constexpr const char[] roller_coaster = "🎢"; + constexpr const char[] carousel_horse = "🎠"; + constexpr const char[] fountain = "⛲"; + constexpr const char[] beach_umbrella = "⛱️"; + constexpr const char[] umbrella_on_ground = "⛱️"; + constexpr const char[] beach = "🏖️"; + constexpr const char[] beach_with_umbrella = "🏖️"; + constexpr const char[] island = "🏝️"; + constexpr const char[] desert_island = "🏝️"; + constexpr const char[] desert = "🏜️"; + constexpr const char[] volcano = "🌋"; + constexpr const char[] mountain = "⛰️"; + constexpr const char[] mountain_snow = "🏔️"; + constexpr const char[] snow_capped_mountain = "🏔️"; + constexpr const char[] mount_fuji = "🗻"; + constexpr const char[] camping = "🏕️"; + constexpr const char[] tent = "⛺"; + constexpr const char[] house = "🏠"; + constexpr const char[] house_with_garden = "🏡"; + constexpr const char[] homes = "🏘️"; + constexpr const char[] house_buildings = "🏘️"; + constexpr const char[] house_abandoned = "🏚️"; + constexpr const char[] derelict_house_building = "🏚️"; + constexpr const char[] hut = "🛖"; + constexpr const char[] construction_site = "🏗️"; + constexpr const char[] building_construction = "🏗️"; + constexpr const char[] factory = "🏭"; + constexpr const char[] office = "🏢"; + constexpr const char[] department_store = "🏬"; + constexpr const char[] post_office = "🏣"; + constexpr const char[] european_post_office = "🏤"; + constexpr const char[] hospital = "🏥"; + constexpr const char[] bank = "🏦"; + constexpr const char[] hotel = "🏨"; + constexpr const char[] convenience_store = "🏪"; + constexpr const char[] school = "🏫"; + constexpr const char[] love_hotel = "🏩"; + constexpr const char[] wedding = "💒"; + constexpr const char[] classical_building = "🏛️"; + constexpr const char[] church = "⛪"; + constexpr const char[] mosque = "🕌"; + constexpr const char[] synagogue = "🕍"; + constexpr const char[] hindu_temple = "🛕"; + constexpr const char[] kaaba = "🕋"; + constexpr const char[] shinto_shrine = "⛩️"; + constexpr const char[] railway_track = "🛤️"; + constexpr const char[] railroad_track = "🛤️"; + constexpr const char[] motorway = "🛣️"; + constexpr const char[] japan = "🗾"; + constexpr const char[] rice_scene = "🎑"; + constexpr const char[] park = "🏞️"; + constexpr const char[] national_park = "🏞️"; + constexpr const char[] sunrise = "🌅"; + constexpr const char[] sunrise_over_mountains = "🌄"; + constexpr const char[] stars = "🌠"; + constexpr const char[] sparkler = "🎇"; + constexpr const char[] fireworks = "🎆"; + constexpr const char[] city_sunset = "🌇"; + constexpr const char[] city_sunrise = "🌇"; + constexpr const char[] city_dusk = "🌆"; + constexpr const char[] cityscape = "🏙️"; + constexpr const char[] night_with_stars = "🌃"; + constexpr const char[] milky_way = "🌌"; + constexpr const char[] bridge_at_night = "🌉"; + constexpr const char[] foggy = "🌁"; } }; From 266020332904c47814bb8d5bbdd62314f53d8f1b Mon Sep 17 00:00:00 2001 From: Miuna <809711+Mishura4@users.noreply.github.com> Date: Thu, 13 Jul 2023 04:13:07 -0400 Subject: [PATCH 078/101] feat: cluster::interaction_followup_get_original (#723) --- include/dpp/cluster.h | 21 +++++++++++++++++++++ include/dpp/cluster_coro_calls.h | 27 +++++++++++++++++++++++++++ include/dpp/cluster_sync_calls.h | 29 +++++++++++++++++++++++++++++ src/dpp/cluster/appcommand.cpp | 8 ++++++++ src/dpp/cluster_sync_calls.cpp | 8 ++++++++ 5 files changed, 93 insertions(+) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 1e74b500c0..ce5601aacc 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -1289,6 +1289,16 @@ class DPP_EXPORT cluster { */ void interaction_response_edit(const std::string &token, const message &m, command_completion_event_t callback = utility::log_error()); + /** + * @brief Get the original response to a slash command + * + * @see https://discord.com/developers/docs/interactions/receiving-and-responding#get-original-interaction-response + * @param token Token for the interaction webhook + * @param callback Function to call when the API call completes. + * On success the callback will contain a dpp::message object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void interaction_response_get_original(const std::string &token, command_completion_event_t callback = utility::log_error()); + /** * @brief Create a followup message to a slash command * @@ -1344,6 +1354,17 @@ class DPP_EXPORT cluster { * On success the callback will contain a dpp::message object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). */ void interaction_followup_get(const std::string &token, snowflake message_id, command_completion_event_t callback); + + /** + * @brief Get the original followup message to a slash command + * This is an alias for cluster::interaction_response_get_original + * @see cluster::interaction_response_get_original + * + * @param token Token for the interaction webhook + * @param callback Function to call when the API call completes. + * On success the callback will contain a dpp::message object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void interaction_followup_get_original(const std::string &token, command_completion_event_t callback = utility::log_error()); /** * @brief Create a global slash command (a bot can have a maximum of 100 of these). diff --git a/include/dpp/cluster_coro_calls.h b/include/dpp/cluster_coro_calls.h index d7ed89b80a..a49cb3cc66 100644 --- a/include/dpp/cluster_coro_calls.h +++ b/include/dpp/cluster_coro_calls.h @@ -283,6 +283,19 @@ auto inline co_interaction_response_edit(const std::string &token, const message return dpp::awaitable(this, [&] (auto cc) { this->interaction_response_edit(token, m, cc); }); } +/** + * @brief Get the original response to a slash command + * + * @see dpp::cluster::interaction_response_get_original + * @see https://discord.com/developers/docs/interactions/receiving-and-responding#get-original-interaction-response + * @param token Token for the interaction webhook + * @return message returned object on completion + * \memberof dpp::cluster + */ +auto inline co_interaction_response_get_original(const std::string &token) { + return dpp::awaitable(this, [&] (auto cc) { this->interaction_response_get_original(token, cc); }); +} + /** * @brief Create a followup message to a slash command * @@ -354,6 +367,20 @@ auto inline co_interaction_followup_get(const std::string &token, snowflake mess return dpp::awaitable(this, [&] (auto cc) { this->interaction_followup_get(token, message_id, cc); }); } +/** + * @brief Get the original followup message to a slash command + * This is an alias for cluster::interaction_response_get_original + * @see dpp::cluster::interaction_followup_get_original + * @see cluster::interaction_response_get_original + * + * @param token Token for the interaction webhook + * @return message returned object on completion + * \memberof dpp::cluster + */ +auto inline co_interaction_followup_get_original(const std::string &token) { + return dpp::awaitable(this, [&] (auto cc) { this->interaction_followup_get_original(token, cc); }); +} + /** * @brief Get all auto moderation rules for a guild * diff --git a/include/dpp/cluster_sync_calls.h b/include/dpp/cluster_sync_calls.h index 756026c517..25c89f9fd9 100644 --- a/include/dpp/cluster_sync_calls.h +++ b/include/dpp/cluster_sync_calls.h @@ -301,6 +301,20 @@ confirmation interaction_response_create_sync(snowflake interaction_id, const st */ confirmation interaction_response_edit_sync(const std::string &token, const message &m); +/** + * @brief Get the original response to a slash command + * + * @see dpp::cluster::interaction_response_get_original + * @see https://discord.com/developers/docs/interactions/receiving-and-responding#get-original-interaction-response + * @param token Token for the interaction webhook + * @return message returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +message interaction_response_get_original_sync(const std::string &token); + /** * @brief Create a followup message to a slash command * @@ -377,6 +391,21 @@ confirmation interaction_followup_edit_sync(const std::string &token, const mess */ message interaction_followup_get_sync(const std::string &token, snowflake message_id); +/** + * @brief Get the original followup message to a slash command + * This is an alias for cluster::interaction_response_get_original + * @see dpp::cluster::interaction_followup_get_original + * @see cluster::interaction_response_get_original + * + * @param token Token for the interaction webhook + * @return message returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +message interaction_followup_get_original_sync(const std::string &token); + /** * @brief Get all auto moderation rules for a guild * diff --git a/src/dpp/cluster/appcommand.cpp b/src/dpp/cluster/appcommand.cpp index 8b411d6294..76998dbd0d 100644 --- a/src/dpp/cluster/appcommand.cpp +++ b/src/dpp/cluster/appcommand.cpp @@ -143,6 +143,10 @@ void cluster::interaction_response_edit(const std::string &token, const message }, m.filename, m.filecontent, m.filemimetype); } +void cluster::interaction_response_get_original(const std::string &token, command_completion_event_t callback) { + rest_request(this, API_PATH "/webhooks",std::to_string(me.id), utility::url_encode(token) + "/messages/@original", m_get, "", callback); +} + void cluster::interaction_followup_create(const std::string &token, const message &m, command_completion_event_t callback) { this->post_rest_multipart(API_PATH "/webhooks", std::to_string(me.id), utility::url_encode(token), m_post, m.build_json(), [this, callback](json &j, const http_request_completion_t& http) { if (callback) { @@ -175,4 +179,8 @@ void cluster::interaction_followup_get(const std::string &token, snowflake messa rest_request(this, API_PATH "/webhooks",std::to_string(me.id), utility::url_encode(token) + "/messages/" + std::to_string(message_id), m_get, "", callback); } +void cluster::interaction_followup_get_original(const std::string &token, command_completion_event_t callback) { + rest_request(this, API_PATH "/webhooks",std::to_string(me.id), utility::url_encode(token) + "/messages/@original", m_get, "", callback); +} + }; diff --git a/src/dpp/cluster_sync_calls.cpp b/src/dpp/cluster_sync_calls.cpp index 207a6500d2..1ff073cb7a 100644 --- a/src/dpp/cluster_sync_calls.cpp +++ b/src/dpp/cluster_sync_calls.cpp @@ -105,6 +105,10 @@ confirmation cluster::interaction_response_edit_sync(const std::string &token, c return dpp::sync(this, static_cast(&cluster::interaction_response_edit), token, m); } +message cluster::interaction_response_get_original_sync(const std::string &token) { + return dpp::sync(this, static_cast(&cluster::interaction_response_get_original), token); +} + confirmation cluster::interaction_followup_create_sync(const std::string &token, const message &m) { return dpp::sync(this, static_cast(&cluster::interaction_followup_create), token, m); } @@ -125,6 +129,10 @@ message cluster::interaction_followup_get_sync(const std::string &token, snowfla return dpp::sync(this, static_cast(&cluster::interaction_followup_get), token, message_id); } +message cluster::interaction_followup_get_original_sync(const std::string &token) { + return dpp::sync(this, static_cast(&cluster::interaction_followup_get_original), token); +} + automod_rule_map cluster::automod_rules_get_sync(snowflake guild_id) { return dpp::sync(this, static_cast(&cluster::automod_rules_get), guild_id); } From 116fb986ea58f2af933924b2ff12bd73e7f17974 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Thu, 13 Jul 2023 08:18:21 +0000 Subject: [PATCH 079/101] spellcheck words for emoji names --- .cspell.json | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/.cspell.json b/.cspell.json index 69cc4249aa..61ffc9863e 100644 --- a/.cspell.json +++ b/.cspell.json @@ -96,6 +96,32 @@ "CORO", "cback", "mentionables", + "awaiter", + "checkered", + "ramen", + "dango", + "tanabata", + "diya", + "nazar", + "hamsa", + "tada", + "izakaya", + "rofl", + "thumbup", + "mwgb", + "mwbb", + "wwgb", + "mwgg", + "wwbb", + "wwgg", + "mmgb", + "mmgg", + "womans", + "mans", + "fleur", + "koko", + "moyai", + "kaaba", "stringified" ], "flagWords": [ @@ -104,4 +130,3 @@ "allowCompoundWords": true, "useCompounds": true } - From 6558527e7246c3fa439fa46683118a5ceb63c898 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Thu, 13 Jul 2023 08:27:01 +0000 Subject: [PATCH 080/101] more spellcheck words --- .cspell.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.cspell.json b/.cspell.json index 61ffc9863e..123d3a890f 100644 --- a/.cspell.json +++ b/.cspell.json @@ -118,6 +118,9 @@ "mmgg", "womans", "mans", + "mens", + "womens", + "mmbb", "fleur", "koko", "moyai", From 318a476e0fc2e79c3cb3bdef1e77b5e872ca2c27 Mon Sep 17 00:00:00 2001 From: Phil B Date: Sat, 15 Jul 2023 13:47:35 +0200 Subject: [PATCH 081/101] feat: add missing audit log events: CREATOR_MONETIZATION_REQUEST_CREATED, CREATOR_MONETIZATION_TERMS_ACCEPTED --- include/dpp/auditlog.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/dpp/auditlog.h b/include/dpp/auditlog.h index c9f0a09a42..8b83c16820 100644 --- a/include/dpp/auditlog.h +++ b/include/dpp/auditlog.h @@ -140,6 +140,10 @@ enum audit_type { aut_automod_flag_to_channel = 144, /// Member was timed out by Auto Moderation aut_automod_user_communication_disabled = 145, + /// Creator monetization request was created + aut_creator_monetization_request_created = 150, + /// Creator monetization terms were accepted + aut_creator_monetization_terms_accepted = 151, }; /** From 7433586df3e74794d5362b10fa3b56f5ec0c1783 Mon Sep 17 00:00:00 2001 From: Phil Date: Sat, 15 Jul 2023 18:08:55 +0200 Subject: [PATCH 082/101] feat: added message_author_id field to message_reaction_add_t event (#730) --- include/dpp/collector.h | 3 +++ include/dpp/dispatcher.h | 4 ++++ src/dpp/events/message_reaction_add.cpp | 1 + 3 files changed, 8 insertions(+) diff --git a/include/dpp/collector.h b/include/dpp/collector.h index 0bdb930758..a512287a5f 100644 --- a/include/dpp/collector.h +++ b/include/dpp/collector.h @@ -163,6 +163,8 @@ class collected_reaction : public managed { channel* react_channel{}; /// Reacted emoji emoji react_emoji; + /// ID of the user who authored the message which was reacted to (Optional) + snowflake message_author_id{}; }; /** @@ -273,6 +275,7 @@ class reaction_collector : public reaction_collector_t { react.react_member = element.reacting_member; react.react_channel = element.reacting_channel; react.react_emoji = element.reacting_emoji; + react.message_author_id = element.message_author_id; return &react; } else { return nullptr; diff --git a/include/dpp/dispatcher.h b/include/dpp/dispatcher.h index 8119b62160..330466a47d 100644 --- a/include/dpp/dispatcher.h +++ b/include/dpp/dispatcher.h @@ -932,6 +932,10 @@ struct DPP_EXPORT message_reaction_add_t : public event_dispatch_t { * @brief message id of the message reacted upon */ snowflake message_id; + /** + * @brief ID of the user who authored the message which was reacted to (Optional) + */ + snowflake message_author_id; }; /** @brief Guild members chunk */ diff --git a/src/dpp/events/message_reaction_add.cpp b/src/dpp/events/message_reaction_add.cpp index 6c4c5ae184..979a6cc698 100644 --- a/src/dpp/events/message_reaction_add.cpp +++ b/src/dpp/events/message_reaction_add.cpp @@ -48,6 +48,7 @@ void message_reaction_add::handle(discord_client* client, json &j, const std::st mra.channel_id = snowflake_not_null(&d, "channel_id"); mra.reacting_channel = dpp::find_channel(mra.channel_id); mra.message_id = snowflake_not_null(&d, "message_id"); + mra.message_author_id = snowflake_not_null(&d, "message_author_id"); mra.reacting_emoji = dpp::emoji().fill_from_json(&(d["emoji"])); if (mra.channel_id && mra.message_id) { client->creator->on_message_reaction_add.call(mra); From a33ecb5c7f41718396a3e32435e1174f7eff495d Mon Sep 17 00:00:00 2001 From: Miuna <809711+Mishura4@users.noreply.github.com> Date: Wed, 19 Jul 2023 03:28:53 -0400 Subject: [PATCH 083/101] feat: coroutines, still experimental but useable (#724) --- .../classes/Generator/CoroGenerator.php | 18 +- docpages/04_advanced_reference.md | 1 + docpages/advanced_reference/coroutines.md | 228 +++++ include/dpp/cluster.h | 10 + include/dpp/cluster_coro_calls.h | 740 +++++------------ include/dpp/coro.h | 699 ++++++++++++++-- include/dpp/dispatcher.h | 104 +++ include/dpp/event_router.h | 59 +- library/CMakeLists.txt | 13 +- src/dpp/cluster/timer.cpp | 11 + src/dpp/cluster_coro_calls.cpp | 782 ++++++++++++++++++ src/dpp/dispatcher.cpp | 51 ++ 12 files changed, 2054 insertions(+), 662 deletions(-) create mode 100644 docpages/advanced_reference/coroutines.md create mode 100644 src/dpp/cluster_coro_calls.cpp diff --git a/buildtools/classes/Generator/CoroGenerator.php b/buildtools/classes/Generator/CoroGenerator.php index e3ce67bb8a..faf0d41c72 100644 --- a/buildtools/classes/Generator/CoroGenerator.php +++ b/buildtools/classes/Generator/CoroGenerator.php @@ -54,6 +54,7 @@ public function generateHeaderStart(): string public function generateCppStart(): string { return $this->generateHeaderStart() . << #include @@ -80,6 +81,7 @@ public function checkForChanges(): bool } echo "-- Autogenerating include/dpp/cluster_coro_calls.h\n"; + echo "-- Autogenerating src/dpp/cluster_coro_calls.cpp\n"; return true; } @@ -88,11 +90,7 @@ public function checkForChanges(): bool */ public function generateHeaderDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterTypes, string $parameterNames): string { - $parameterNames = preg_replace('/^, /', '', $parameterNames); - if (!empty($parameterNames)) { - $parameterNames .= ', '; - } - return "auto inline co_{$currentFunction}($noDefaults) {\n\treturn dpp::awaitable(this, [&] (auto cc) { this->$currentFunction({$parameterNames}cc); }); \n}\n\n"; + return "awaitable co_{$currentFunction}($parameters);\n\n"; } /** @@ -100,7 +98,7 @@ public function generateHeaderDef(string $returnType, string $currentFunction, s */ public function generateCppDef(string $returnType, string $currentFunction, string $parameters, string $noDefaults, string $parameterTypes, string $parameterNames): string { - return ''; + return "awaitable cluster::co_${currentFunction}($noDefaults) {\n\treturn {this, static_cast(&cluster::$currentFunction)$parameterNames};\n}\n\n"; } /** @@ -116,7 +114,7 @@ public function getCommentArray(): array */ public function saveHeader(string $content): void { - $content .= "auto inline co_request(const std::string &url, http_method method, const std::string &postdata = \"\", const std::string &mimetype = \"text/plain\", const std::multimap &headers = {}) {\n\treturn dpp::awaitable(this, [&] (auto cc) { this->request(url, method, cc, mimetype, headers); }); \n}\n\n"; + $content .= "awaitable co_request(const std::string &url, http_method method, const std::string &postdata = \"\", const std::string &mimetype = \"text/plain\", const std::multimap &headers = {});\n\n"; file_put_contents('include/dpp/cluster_coro_calls.h', $content); } @@ -125,7 +123,11 @@ public function saveHeader(string $content): void */ public function saveCpp(string $cppcontent): void { - /* No cpp file to save, code is all inline */ + $cppcontent .= "dpp::awaitable dpp::cluster::co_request(const std::string &url, http_method method, const std::string &postdata, const std::string &mimetype, const std::multimap &headers) {\n\treturn awaitable{[&](auto &&cc) { this->request(url, method, cc, postdata, mimetype, headers); }};\n} + +#endif +"; + file_put_contents('src/dpp/cluster_coro_calls.cpp', $cppcontent); } } diff --git a/docpages/04_advanced_reference.md b/docpages/04_advanced_reference.md index 1ad0dea434..dfb8f08383 100644 --- a/docpages/04_advanced_reference.md +++ b/docpages/04_advanced_reference.md @@ -5,3 +5,4 @@ * \subpage coding-standards "Coding Style Standards" * \subpage unit-tests "Unit Tests" * \subpage lambdas-and-locals "Ownership of local variables and safely transferring into a lambda" +* \subpage coroutines "Advanced commands with coroutines" diff --git a/docpages/advanced_reference/coroutines.md b/docpages/advanced_reference/coroutines.md new file mode 100644 index 0000000000..23b1950277 --- /dev/null +++ b/docpages/advanced_reference/coroutines.md @@ -0,0 +1,228 @@ +\page coroutines Advanced commands with coroutines + +\warning D++ Coroutines are a very new feature and are currently only supported by D++ on g++ 13.1 and MSVC 19.37, and the CMake option DPP_CORO must be enabled. They are experimental and may have bugs or even crashes, pease report any to [GitHub Issues](https://github.com/brainboxdotcc/DPP/issues) or to our [Discord Server](https://discord.gg/dpp). + +### What is a coroutine? + +Introduced in C++20, coroutines are the solution to the impracticality of callbacks. In short, a coroutine is a function that can be paused and resumed later : they are an extremely powerful alternative to callbacks for asynchronous APIs in particular, as the function can be paused when waiting for an API response, and resumed when it is received. + +Let's revisit [attaching a downloaded file](/attach-file.html), but this time with a coroutine : + + +~~~~~~~~~~~~~~~{.cpp} +#include + +int main() { + dpp::cluster bot("token", dpp::i_default_intents | dpp::i_message_content); + + bot.on_log(dpp::utility::cout_logger()); + + /* Message handler to look for a command called !file */ + /* Make note of passing the event by value, this is important (explained below) */ + bot.on_message_create.co_attach([](dpp::message_create_t event) -> dpp::task { + dpp::cluster *cluster = event.from->creator; + + if (event.msg.content == "!file") { + // request an image and co_await the response + dpp::http_request_completion_t result = co_await cluster->co_request("https://dpp.dev/DPP-Logo.png", dpp::m_get); + + // create a message + dpp::message msg(event.msg.channel_id, "This is my new attachment:"); + + // attach the image on success + if (result.status == 200) { + msg.add_file("logo.png", result.body); + } + + // send the message + cluster->message_create(msg); + } + }); + + bot.start(dpp::st_wait); + return 0; +} +~~~~~~~~~~~~~~~ + + +Coroutines can make commands simpler by eliminating callbacks, which can be very handy in the case of complex commands that rely on a lot of different data or steps. + +In order to be a coroutine, a function has to return a special type with special functions; D++ offers `dpp::task` which is designed to work seamlessly with asynchronous calls through `dpp::awaitable`, which all the functions starting with `co_` such as `dpp::cluster::co_message_create` return. To turn a function into a coroutine, simply make it return `dpp::task` as seen in the example at line 10. + +When an awaitable is `co_await`-ed, the coroutine suspends (pauses) and returns back to its caller : in other words, the program is free to go and do other things while the data is being retrieved, D++ will resume your coroutine when it has the data you need which will be returned from the `co_await` expression. + +Inside of a `dpp::task`, someone can use `co_return` in place of `return`. + +\attention As a rule of thumb when making dpp::task objects and in general coroutines, always prefer taking parameters by value and avoid capture : this may be confusing but a coroutine is *not* the lambda creating it, the captures are not bound to it and the code isn't ran inside the lambda. The lambda that returns a dpp::task simply returns a task object containing the code, which goes on to live on its own, separate from the lambda. +Similarly, with reference parameters, the object they reference to might be destroyed while the coroutine is suspended and resumed in another thread, which is why you want to pass by value. See also [lambdas and locals](/lambdas-and-locals.html) except this also applies to parameters in the case of coroutines. + +### Several steps in one + +\note The next example assumes you are already familiar with how to use [slash commands](/firstbot.html), [parameters](/slashcommands.html), and [sending files through a command](/discord-application-command-file-upload.html). + +Coroutines allow to write asynchronous functions almost as if they were executed synchronously, without the need for callbacks, which can save a lot of pain with keeping track of different data. Here is another example of what is made easier with coroutines : an "addemoji" command taking a file and a name as a parameter. This means downloading the emoji, submitting it to Discord, and finally replying, with some error handling along the way. + +~~~~~~~~~~{.cpp} +#include + +int main() { + dpp::cluster bot("token", dpp::i_default_intents | dpp::i_message_content); + + bot.on_log(dpp::utility::cout_logger()); + + bot.on_slashcommand.co_attach([](dpp::slashcommand_t event) -> dpp::task { + if (event.command.get_command_name() == "addemoji") { + dpp::cluster *cluster = event.from->creator; + // Retrieve parameter values + dpp::snowflake file_id = std::get(event.get_parameter("file")); + std::string emoji_name = std::get(event.get_parameter("name")); + + // Get the attachment from the resolved list + const dpp::attachment &attachment = event.command.get_resolved_attachment(file_id); + + // For simplicity for this example we only support PNG + if (attachment.content_type != "image/png") { + // While event.co_reply is available, we can just use event.reply, as we will exit the command anyway and don't need to wait on the result + event.reply("Error: type " + attachment.content_type + " not supported"); + co_return; + } + // Send a " is thinking..." message, to wait on later so we can edit + dpp::awaitable thinking = event.co_thinking(false); + + // Download and co_await the result + dpp::http_request_completion_t response = co_await cluster->co_request(attachment.url, dpp::m_get); + + if (response.status != 200) { // Page didn't send the image + co_await thinking; // Wait for the thinking response to arrive so we can edit + event.edit_response("Error: could not download the attachment"); + } + else { + // Load the image data in a dpp::emoji + dpp::emoji emoji(emoji_name); + emoji.load_image(response.body, dpp::image_type::i_png); + + // Create the emoji and co_await the response + dpp::confirmation_callback_t confirmation = co_await cluster->co_guild_emoji_create(event.command.guild_id, emoji); + + co_await thinking; // Wait for the thinking response to arrive so we can edit + if (confirmation.is_error()) + event.edit_response("Error: could not add emoji: " + confirmation.get_error().message); + else // Success + event.edit_response("Successfully added " + confirmation.get().get_mention()); // Show the new emoji + } + } + }); + + bot.on_ready([&bot](const dpp::ready_t & event) { + if (dpp::run_once()) { + dpp::slashcommand command("addemoji", "Add an emoji", bot.me.id); + + // Add file and name as required parameters + command.add_option(dpp::command_option(dpp::co_attachment, "file", "Select an image", true)); + command.add_option(dpp::command_option(dpp::co_string, "name", "Name of the emoji to add", true)); + + bot.global_command_create(command); + } + }); + + bot.start(dpp::st_wait); +} +~~~~~~~~~~ + +### I heard you liked tasks + +\note This next example is fairly advanced and makes uses of many of both C++ and D++'s advanced features. + +Lastly, `dpp::task` takes its return type as a template parameter, which allows you to use tasks inside tasks and return a result from them. + +Here is an example of a command making use of that to retrieve the avatar of a specified user, or if missing, the sender : + +~~~~~~~~~~{.cpp} +#include + +int main() { + dpp::cluster bot("token", dpp::i_default_intents | dpp::i_message_content); + + bot.on_log(dpp::utility::cout_logger()); + + bot.on_slashcommand.co_attach([](dpp::slashcommand_t event) -> dpp::task{ + if (event.command.get_command_name() == "avatar") { + // Make a nested coroutine to fetch the guild member requested, that returns it as an optional + constexpr auto resolve_member = [](const dpp::slashcommand_t &event) -> dpp::task> { + const dpp::command_value &user_param = event.get_parameter("user"); + dpp::snowflake user_id; + + if (std::holds_alternative(user_param)) + user_id = event.command.usr.id; // Parameter is empty so user is sender + else if (std::holds_alternative(user_param)) + user_id = std::get(user_param); // Parameter has a user + + // If we have the guild member in the command's resolved data, return it + const auto &member_map = event.command.resolved.members; + if (auto member = member_map.find(user_id); member != member_map.end()) + co_return member->second; + + // Try looking in guild cache + dpp::guild *guild = dpp::find_guild(event.command.guild_id); + if (guild) { + // Look in guild's member cache + if (auto member = guild->members.find(user_id); member != guild->members.end()) { + co_return member->second; + } + } + + // Finally if everything else failed, request API + dpp::confirmation_callback_t confirmation = co_await event.from->creator->co_guild_get_member(event.command.guild_id, user_id); + if (confirmation.is_error()) + co_return std::nullopt; // Member not found, return empty + else + co_return confirmation.get(); + }; + + // Send a " is thinking..." message, to wait on later so we can edit + dpp::awaitable thinking = event.co_thinking(false); + + // Call our coroutine defined above to retrieve the member requested + std::optional member = co_await resolve_member(event); + + if (!member.has_value()) { + // Wait for the thinking response to arrive to make sure we can edit + co_await thinking; + event.edit_original_response(dpp::message{"User not found in this server!"}); + co_return; + } + + std::string avatar_url = member->get_avatar_url(512); + if (avatar_url.empty()) { // Member does not have a custom avatar for this server, get their user avatar + dpp::confirmation_callback_t confirmation = co_await event.from->creator->co_user_get_cached(member->user_id); + + if (confirmation.is_error()) + { + // Wait for the thinking response to arrive to make sure we can edit + co_await thinking; + event.edit_original_response(dpp::message{"User not found!"}); + co_return; + } + avatar_url = confirmation.get().get_avatar_url(512); + } + + // Wait for the thinking response to arrive to make sure we can edit + co_await thinking; + event.edit_original_response(dpp::message{avatar_url}); + } + }); + + + bot.on_ready([&bot](const dpp::ready_t & event) { + if (dpp::run_once()) { + dpp::slashcommand command("avatar", "Get your or another user's avatar image", bot.me.id); + + command.add_option(dpp::command_option(dpp::co_user, "user", "User to fetch the avatar from")); + + bot.global_command_create(command); + } + }); + + bot.start(dpp::st_wait); +} +~~~~~~~~~~ \ No newline at end of file diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index ce5601aacc..b9c64bcd8c 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -348,6 +348,16 @@ class DPP_EXPORT cluster { */ bool stop_timer(timer t); +#ifdef DPP_CORO + /** + * @brief Start a one-time timer. Use the co_await keyword on its return value to suspend the coroutine until the timer ends + * + * @param seconds How long to run the timer for + * @return awaitable co_await-able object holding the timer_handle + */ + awaitable co_timer(uint64_t seconds); +#endif + /** * @brief Get the dm channel for a user id * diff --git a/include/dpp/cluster_coro_calls.h b/include/dpp/cluster_coro_calls.h index a49cb3cc66..0083de91f3 100644 --- a/include/dpp/cluster_coro_calls.h +++ b/include/dpp/cluster_coro_calls.h @@ -38,9 +38,7 @@ * @return slashcommand_map returned object on completion * \memberof dpp::cluster */ -auto inline co_global_bulk_command_create(const std::vector &commands) { - return dpp::awaitable(this, [&] (auto cc) { this->global_bulk_command_create(commands, cc); }); -} +awaitable co_global_bulk_command_create(const std::vector &commands); /** * @brief Create a global slash command (a bot can have a maximum of 100 of these). @@ -51,9 +49,7 @@ auto inline co_global_bulk_command_create(const std::vector &comma * @return slashcommand returned object on completion * \memberof dpp::cluster */ -auto inline co_global_command_create(const slashcommand &s) { - return dpp::awaitable(this, [&] (auto cc) { this->global_command_create(s, cc); }); -} +awaitable co_global_command_create(const slashcommand &s); /** * @brief Get a global slash command @@ -64,9 +60,7 @@ auto inline co_global_command_create(const slashcommand &s) { * @return slashcommand returned object on completion * \memberof dpp::cluster */ -auto inline co_global_command_get(snowflake id) { - return dpp::awaitable(this, [&] (auto cc) { this->global_command_get(id, cc); }); -} +awaitable co_global_command_get(snowflake id); /** * @brief Delete a global slash command (a bot can have a maximum of 100 of these) @@ -77,9 +71,7 @@ auto inline co_global_command_get(snowflake id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_global_command_delete(snowflake id) { - return dpp::awaitable(this, [&] (auto cc) { this->global_command_delete(id, cc); }); -} +awaitable co_global_command_delete(snowflake id); /** * @brief Edit a global slash command (a bot can have a maximum of 100 of these) @@ -90,9 +82,7 @@ auto inline co_global_command_delete(snowflake id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_global_command_edit(const slashcommand &s) { - return dpp::awaitable(this, [&] (auto cc) { this->global_command_edit(s, cc); }); -} +awaitable co_global_command_edit(const slashcommand &s); /** * @brief Get the application's global slash commands @@ -102,9 +92,7 @@ auto inline co_global_command_edit(const slashcommand &s) { * @return slashcommand_map returned object on completion * \memberof dpp::cluster */ -auto inline co_global_commands_get() { - return dpp::awaitable(this, [&] (auto cc) { this->global_commands_get(cc); }); -} +awaitable co_global_commands_get(); /** * @brief Create/overwrite guild slash commands. @@ -118,9 +106,7 @@ auto inline co_global_commands_get() { * @return slashcommand_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_bulk_command_create(const std::vector &commands, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_bulk_command_create(commands, guild_id, cc); }); -} +awaitable co_guild_bulk_command_create(const std::vector &commands, snowflake guild_id); /** * @brief Get all slash command permissions of a guild @@ -131,9 +117,7 @@ auto inline co_guild_bulk_command_create(const std::vector &comman * @return guild_command_permissions_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_commands_get_permissions(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_commands_get_permissions(guild_id, cc); }); -} +awaitable co_guild_commands_get_permissions(snowflake guild_id); /** * @brief Edit/Overwrite the permissions of all existing slash commands in a guild @@ -149,9 +133,7 @@ auto inline co_guild_commands_get_permissions(snowflake guild_id) { * @deprecated This has been disabled with updates to Permissions v2. You can use guild_command_edit_permissions instead * \memberof dpp::cluster */ -auto inline co_guild_bulk_command_edit_permissions(const std::vector &commands, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_bulk_command_edit_permissions(commands, guild_id, cc); }); -} +awaitable co_guild_bulk_command_edit_permissions(const std::vector &commands, snowflake guild_id); /** * @brief Create a slash command local to a guild @@ -164,9 +146,7 @@ auto inline co_guild_bulk_command_edit_permissions(const std::vectorguild_command_create(s, guild_id, cc); }); -} +awaitable co_guild_command_create(const slashcommand &s, snowflake guild_id); /** * @brief Delete a slash command local to a guild @@ -178,9 +158,7 @@ auto inline co_guild_command_create(const slashcommand &s, snowflake guild_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_command_delete(snowflake id, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_command_delete(id, guild_id, cc); }); -} +awaitable co_guild_command_delete(snowflake id, snowflake guild_id); /** * @brief Edit slash command permissions of a guild @@ -193,9 +171,7 @@ auto inline co_guild_command_delete(snowflake id, snowflake guild_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_command_edit_permissions(const slashcommand &s, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_command_edit_permissions(s, guild_id, cc); }); -} +awaitable co_guild_command_edit_permissions(const slashcommand &s, snowflake guild_id); /** * @brief Get a slash command of a guild @@ -208,9 +184,7 @@ auto inline co_guild_command_edit_permissions(const slashcommand &s, snowflake g * @return slashcommand returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_command_get(snowflake id, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_command_get(id, guild_id, cc); }); -} +awaitable co_guild_command_get(snowflake id, snowflake guild_id); /** * @brief Get the permissions for a slash command of a guild @@ -222,9 +196,7 @@ auto inline co_guild_command_get(snowflake id, snowflake guild_id) { * @return guild_command_permissions returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_command_get_permissions(snowflake id, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_command_get_permissions(id, guild_id, cc); }); -} +awaitable co_guild_command_get_permissions(snowflake id, snowflake guild_id); /** * @brief Edit a slash command local to a guild @@ -236,9 +208,7 @@ auto inline co_guild_command_get_permissions(snowflake id, snowflake guild_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_command_edit(const slashcommand &s, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_command_edit(s, guild_id, cc); }); -} +awaitable co_guild_command_edit(const slashcommand &s, snowflake guild_id); /** * @brief Get the application's slash commands for a guild @@ -250,9 +220,7 @@ auto inline co_guild_command_edit(const slashcommand &s, snowflake guild_id) { * @return slashcommand_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_commands_get(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_commands_get(guild_id, cc); }); -} +awaitable co_guild_commands_get(snowflake guild_id); /** * @brief Respond to a slash command @@ -265,9 +233,7 @@ auto inline co_guild_commands_get(snowflake guild_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_interaction_response_create(snowflake interaction_id, const std::string &token, const interaction_response &r) { - return dpp::awaitable(this, [&] (auto cc) { this->interaction_response_create(interaction_id, token, r, cc); }); -} +awaitable co_interaction_response_create(snowflake interaction_id, const std::string &token, const interaction_response &r); /** * @brief Edit response to a slash command @@ -279,9 +245,7 @@ auto inline co_interaction_response_create(snowflake interaction_id, const std:: * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_interaction_response_edit(const std::string &token, const message &m) { - return dpp::awaitable(this, [&] (auto cc) { this->interaction_response_edit(token, m, cc); }); -} +awaitable co_interaction_response_edit(const std::string &token, const message &m); /** * @brief Get the original response to a slash command @@ -292,9 +256,7 @@ auto inline co_interaction_response_edit(const std::string &token, const message * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_interaction_response_get_original(const std::string &token) { - return dpp::awaitable(this, [&] (auto cc) { this->interaction_response_get_original(token, cc); }); -} +awaitable co_interaction_response_get_original(const std::string &token); /** * @brief Create a followup message to a slash command @@ -306,9 +268,7 @@ auto inline co_interaction_response_get_original(const std::string &token) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_interaction_followup_create(const std::string &token, const message &m) { - return dpp::awaitable(this, [&] (auto cc) { this->interaction_followup_create(token, m, cc); }); -} +awaitable co_interaction_followup_create(const std::string &token, const message &m); /** * @brief Edit original followup message to a slash command @@ -321,9 +281,7 @@ auto inline co_interaction_followup_create(const std::string &token, const messa * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_interaction_followup_edit_original(const std::string &token, const message &m) { - return dpp::awaitable(this, [&] (auto cc) { this->interaction_followup_edit_original(token, m, cc); }); -} +awaitable co_interaction_followup_edit_original(const std::string &token, const message &m); /** * @brief Delete the initial interaction response @@ -334,9 +292,7 @@ auto inline co_interaction_followup_edit_original(const std::string &token, cons * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_interaction_followup_delete(const std::string &token) { - return dpp::awaitable(this, [&] (auto cc) { this->interaction_followup_delete(token, cc); }); -} +awaitable co_interaction_followup_delete(const std::string &token); /** * @brief Edit followup message to a slash command @@ -349,9 +305,7 @@ auto inline co_interaction_followup_delete(const std::string &token) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_interaction_followup_edit(const std::string &token, const message &m) { - return dpp::awaitable(this, [&] (auto cc) { this->interaction_followup_edit(token, m, cc); }); -} +awaitable co_interaction_followup_edit(const std::string &token, const message &m); /** * @brief Get the followup message to a slash command @@ -363,9 +317,7 @@ auto inline co_interaction_followup_edit(const std::string &token, const message * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_interaction_followup_get(const std::string &token, snowflake message_id) { - return dpp::awaitable(this, [&] (auto cc) { this->interaction_followup_get(token, message_id, cc); }); -} +awaitable co_interaction_followup_get(const std::string &token, snowflake message_id); /** * @brief Get the original followup message to a slash command @@ -377,9 +329,7 @@ auto inline co_interaction_followup_get(const std::string &token, snowflake mess * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_interaction_followup_get_original(const std::string &token) { - return dpp::awaitable(this, [&] (auto cc) { this->interaction_followup_get_original(token, cc); }); -} +awaitable co_interaction_followup_get_original(const std::string &token); /** * @brief Get all auto moderation rules for a guild @@ -388,9 +338,7 @@ auto inline co_interaction_followup_get_original(const std::string &token) { * @return automod_rule_map returned object on completion * \memberof dpp::cluster */ -auto inline co_automod_rules_get(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->automod_rules_get(guild_id, cc); }); -} +awaitable co_automod_rules_get(snowflake guild_id); /** * @brief Get a single auto moderation rule @@ -400,9 +348,7 @@ auto inline co_automod_rules_get(snowflake guild_id) { * @return automod_rule returned object on completion * \memberof dpp::cluster */ -auto inline co_automod_rule_get(snowflake guild_id, snowflake rule_id) { - return dpp::awaitable(this, [&] (auto cc) { this->automod_rule_get(guild_id, rule_id, cc); }); -} +awaitable co_automod_rule_get(snowflake guild_id, snowflake rule_id); /** * @brief Create an auto moderation rule @@ -412,9 +358,7 @@ auto inline co_automod_rule_get(snowflake guild_id, snowflake rule_id) { * @return automod_rule returned object on completion * \memberof dpp::cluster */ -auto inline co_automod_rule_create(snowflake guild_id, const automod_rule& r) { - return dpp::awaitable(this, [&] (auto cc) { this->automod_rule_create(guild_id, r, cc); }); -} +awaitable co_automod_rule_create(snowflake guild_id, const automod_rule& r); /** * @brief Edit an auto moderation rule @@ -424,9 +368,7 @@ auto inline co_automod_rule_create(snowflake guild_id, const automod_rule& r) { * @return automod_rule returned object on completion * \memberof dpp::cluster */ -auto inline co_automod_rule_edit(snowflake guild_id, const automod_rule& r) { - return dpp::awaitable(this, [&] (auto cc) { this->automod_rule_edit(guild_id, r, cc); }); -} +awaitable co_automod_rule_edit(snowflake guild_id, const automod_rule& r); /** * @brief Delete an auto moderation rule @@ -436,9 +378,7 @@ auto inline co_automod_rule_edit(snowflake guild_id, const automod_rule& r) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_automod_rule_delete(snowflake guild_id, snowflake rule_id) { - return dpp::awaitable(this, [&] (auto cc) { this->automod_rule_delete(guild_id, rule_id, cc); }); -} +awaitable co_automod_rule_delete(snowflake guild_id, snowflake rule_id); /** * @brief Create a channel @@ -456,9 +396,7 @@ auto inline co_automod_rule_delete(snowflake guild_id, snowflake rule_id) { * @return channel returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_create(const class channel &c) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_create(c, cc); }); -} +awaitable co_channel_create(const class channel &c); /** * @brief Remove a permission from a channel @@ -470,9 +408,7 @@ auto inline co_channel_create(const class channel &c) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_delete_permission(const class channel &c, snowflake overwrite_id) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_delete_permission(c, overwrite_id, cc); }); -} +awaitable co_channel_delete_permission(const class channel &c, snowflake overwrite_id); /** * @brief Delete a channel @@ -483,9 +419,7 @@ auto inline co_channel_delete_permission(const class channel &c, snowflake overw * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_delete(snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_delete(channel_id, cc); }); -} +awaitable co_channel_delete(snowflake channel_id); /** * @brief Edit a channel's permissions @@ -501,9 +435,7 @@ auto inline co_channel_delete(snowflake channel_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_edit_permissions(const class channel &c, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_edit_permissions(c, overwrite_id, allow, deny, member, cc); }); -} +awaitable co_channel_edit_permissions(const class channel &c, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member); /** * @brief Edit a channel's permissions @@ -519,9 +451,7 @@ auto inline co_channel_edit_permissions(const class channel &c, const snowflake * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_edit_permissions(const snowflake channel_id, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_edit_permissions(channel_id, overwrite_id, allow, deny, member, cc); }); -} +awaitable co_channel_edit_permissions(const snowflake channel_id, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member); /** * @brief Edit multiple channels positions @@ -536,9 +466,7 @@ auto inline co_channel_edit_permissions(const snowflake channel_id, const snowfl * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_edit_positions(const std::vector &c) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_edit_positions(c, cc); }); -} +awaitable co_channel_edit_positions(const std::vector &c); /** * @brief Edit a channel @@ -549,9 +477,7 @@ auto inline co_channel_edit_positions(const std::vector &c) { * @return channel returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_edit(const class channel &c) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_edit(c, cc); }); -} +awaitable co_channel_edit(const class channel &c); /** * @brief Follow an announcement (news) channel @@ -562,9 +488,7 @@ auto inline co_channel_edit(const class channel &c) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_follow_news(const class channel &c, snowflake target_channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_follow_news(c, target_channel_id, cc); }); -} +awaitable co_channel_follow_news(const class channel &c, snowflake target_channel_id); /** * @brief Get a channel @@ -575,9 +499,7 @@ auto inline co_channel_follow_news(const class channel &c, snowflake target_chan * @return channel returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_get(snowflake c) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_get(c, cc); }); -} +awaitable co_channel_get(snowflake c); /** * @brief Create invite for a channel @@ -589,9 +511,7 @@ auto inline co_channel_get(snowflake c) { * @return invite returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_invite_create(const class channel &c, const class invite &i) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_invite_create(c, i, cc); }); -} +awaitable co_channel_invite_create(const class channel &c, const class invite &i); /** * @brief Get invites for a channel @@ -602,9 +522,7 @@ auto inline co_channel_invite_create(const class channel &c, const class invite * @return invite_map returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_invites_get(const class channel &c) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_invites_get(c, cc); }); -} +awaitable co_channel_invites_get(const class channel &c); /** * @brief Trigger channel typing indicator @@ -614,9 +532,7 @@ auto inline co_channel_invites_get(const class channel &c) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_typing(const class channel &c) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_typing(c, cc); }); -} +awaitable co_channel_typing(const class channel &c); /** * @brief Trigger channel typing indicator @@ -626,9 +542,7 @@ auto inline co_channel_typing(const class channel &c) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_typing(snowflake cid) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_typing(cid, cc); }); -} +awaitable co_channel_typing(snowflake cid); /** * @brief Get all channels for a guild @@ -639,9 +553,7 @@ auto inline co_channel_typing(snowflake cid) { * @return channel_map returned object on completion * \memberof dpp::cluster */ -auto inline co_channels_get(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->channels_get(guild_id, cc); }); -} +awaitable co_channels_get(snowflake guild_id); /** * @brief Create a dm channel @@ -651,9 +563,7 @@ auto inline co_channels_get(snowflake guild_id) { * @return channel returned object on completion * \memberof dpp::cluster */ -auto inline co_create_dm_channel(snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->create_dm_channel(user_id, cc); }); -} +awaitable co_create_dm_channel(snowflake user_id); /** * @brief Get current user DM channels @@ -661,9 +571,7 @@ auto inline co_create_dm_channel(snowflake user_id) { * @return channel_map returned object on completion * \memberof dpp::cluster */ -auto inline co_current_user_get_dms() { - return dpp::awaitable(this, [&] (auto cc) { this->current_user_get_dms(cc); }); -} +awaitable co_current_user_get_dms(); /** * @brief Create a direct message, also create the channel for the direct message if needed @@ -677,9 +585,7 @@ auto inline co_current_user_get_dms() { * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_direct_message_create(snowflake user_id, const message &m) { - return dpp::awaitable(this, [&] (auto cc) { this->direct_message_create(user_id, m, cc); }); -} +awaitable co_direct_message_create(snowflake user_id, const message &m); /** * @brief Adds a recipient to a Group DM using their access token @@ -692,9 +598,7 @@ auto inline co_direct_message_create(snowflake user_id, const message &m) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_gdm_add(snowflake channel_id, snowflake user_id, const std::string &access_token, const std::string &nick) { - return dpp::awaitable(this, [&] (auto cc) { this->gdm_add(channel_id, user_id, access_token, nick, cc); }); -} +awaitable co_gdm_add(snowflake channel_id, snowflake user_id, const std::string &access_token, const std::string &nick); /** * @brief Removes a recipient from a Group DM @@ -705,9 +609,7 @@ auto inline co_gdm_add(snowflake channel_id, snowflake user_id, const std::strin * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_gdm_remove(snowflake channel_id, snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->gdm_remove(channel_id, user_id, cc); }); -} +awaitable co_gdm_remove(snowflake channel_id, snowflake user_id); /** * @brief Create single emoji. @@ -721,9 +623,7 @@ auto inline co_gdm_remove(snowflake channel_id, snowflake user_id) { * @return emoji returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_emoji_create(snowflake guild_id, const class emoji& newemoji) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_emoji_create(guild_id, newemoji, cc); }); -} +awaitable co_guild_emoji_create(snowflake guild_id, const class emoji& newemoji); /** * @brief Delete a guild emoji @@ -736,9 +636,7 @@ auto inline co_guild_emoji_create(snowflake guild_id, const class emoji& newemoj * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_emoji_delete(snowflake guild_id, snowflake emoji_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_emoji_delete(guild_id, emoji_id, cc); }); -} +awaitable co_guild_emoji_delete(snowflake guild_id, snowflake emoji_id); /** * @brief Edit a single emoji. @@ -752,9 +650,7 @@ auto inline co_guild_emoji_delete(snowflake guild_id, snowflake emoji_id) { * @return emoji returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_emoji_edit(snowflake guild_id, const class emoji& newemoji) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_emoji_edit(guild_id, newemoji, cc); }); -} +awaitable co_guild_emoji_edit(snowflake guild_id, const class emoji& newemoji); /** * @brief Get a single emoji @@ -766,9 +662,7 @@ auto inline co_guild_emoji_edit(snowflake guild_id, const class emoji& newemoji) * @return emoji returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_emoji_get(snowflake guild_id, snowflake emoji_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_emoji_get(guild_id, emoji_id, cc); }); -} +awaitable co_guild_emoji_get(snowflake guild_id, snowflake emoji_id); /** * @brief Get all emojis for a guild @@ -779,9 +673,7 @@ auto inline co_guild_emoji_get(snowflake guild_id, snowflake emoji_id) { * @return emoji_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_emojis_get(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_emojis_get(guild_id, cc); }); -} +awaitable co_guild_emojis_get(snowflake guild_id); /** * @brief Get the gateway information for the bot using the token @@ -790,9 +682,7 @@ auto inline co_guild_emojis_get(snowflake guild_id) { * @return gateway returned object on completion * \memberof dpp::cluster */ -auto inline co_get_gateway_bot() { - return dpp::awaitable(this, [&] (auto cc) { this->get_gateway_bot(cc); }); -} +awaitable co_get_gateway_bot(); /** * @brief Modify current member @@ -808,9 +698,7 @@ auto inline co_get_gateway_bot() { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_current_member_edit(snowflake guild_id, const std::string &nickname) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_current_member_edit(guild_id, nickname, cc); }); -} +awaitable co_guild_current_member_edit(snowflake guild_id, const std::string &nickname); /** * @brief Get the audit log for a guild @@ -826,9 +714,7 @@ auto inline co_guild_current_member_edit(snowflake guild_id, const std::string & * @return auditlog returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_auditlog_get(snowflake guild_id, snowflake user_id, uint32_t action_type, snowflake before, snowflake after, uint32_t limit) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_auditlog_get(guild_id, user_id, action_type, before, after, limit, cc); }); -} +awaitable co_guild_auditlog_get(snowflake guild_id, snowflake user_id, uint32_t action_type, snowflake before, snowflake after, uint32_t limit); /** * @brief Add guild ban @@ -844,9 +730,7 @@ auto inline co_guild_auditlog_get(snowflake guild_id, snowflake user_id, uint32_ * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_ban_add(snowflake guild_id, snowflake user_id, uint32_t delete_message_seconds) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_ban_add(guild_id, user_id, delete_message_seconds, cc); }); -} +awaitable co_guild_ban_add(snowflake guild_id, snowflake user_id, uint32_t delete_message_seconds = 0); /** * @brief Delete guild ban @@ -861,9 +745,7 @@ auto inline co_guild_ban_add(snowflake guild_id, snowflake user_id, uint32_t del * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_ban_delete(snowflake guild_id, snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_ban_delete(guild_id, user_id, cc); }); -} +awaitable co_guild_ban_delete(snowflake guild_id, snowflake user_id); /** * @brief Create a guild @@ -886,9 +768,7 @@ auto inline co_guild_ban_delete(snowflake guild_id, snowflake user_id) { * @return guild returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_create(const class guild &g) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_create(g, cc); }); -} +awaitable co_guild_create(const class guild &g); /** * @brief Delete a guild @@ -901,9 +781,7 @@ auto inline co_guild_create(const class guild &g) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_delete(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_delete(guild_id, cc); }); -} +awaitable co_guild_delete(snowflake guild_id); /** * @brief Delete guild integration @@ -919,9 +797,7 @@ auto inline co_guild_delete(snowflake guild_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_delete_integration(snowflake guild_id, snowflake integration_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_delete_integration(guild_id, integration_id, cc); }); -} +awaitable co_guild_delete_integration(snowflake guild_id, snowflake integration_id); /** * @brief Edit a guild @@ -936,9 +812,7 @@ auto inline co_guild_delete_integration(snowflake guild_id, snowflake integratio * @return guild returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_edit(const class guild &g) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_edit(g, cc); }); -} +awaitable co_guild_edit(const class guild &g); /** * @brief Edit guild widget @@ -953,9 +827,7 @@ auto inline co_guild_edit(const class guild &g) { * @return guild_widget returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_edit_widget(snowflake guild_id, const class guild_widget &gw) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_edit_widget(guild_id, gw, cc); }); -} +awaitable co_guild_edit_widget(snowflake guild_id, const class guild_widget &gw); /** * @brief Get single guild ban @@ -968,9 +840,7 @@ auto inline co_guild_edit_widget(snowflake guild_id, const class guild_widget &g * @return ban returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_get_ban(snowflake guild_id, snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_ban(guild_id, user_id, cc); }); -} +awaitable co_guild_get_ban(snowflake guild_id, snowflake user_id); /** * @brief Get guild ban list @@ -986,14 +856,10 @@ auto inline co_guild_get_ban(snowflake guild_id, snowflake user_id) { * @return ban_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_get_bans(snowflake guild_id, snowflake before, snowflake after, snowflake limit) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_bans(guild_id, before, after, limit, cc); }); -} +awaitable co_guild_get_bans(snowflake guild_id, snowflake before, snowflake after, snowflake limit); -auto inline co_guild_get(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get(guild_id, cc); }); -} +awaitable co_guild_get(snowflake guild_id); /** * @brief Get guild integrations @@ -1008,14 +874,10 @@ auto inline co_guild_get(snowflake guild_id) { * @note This endpoint returns a maximum of 50 integrations. If a guild has more integrations, they cannot be accessed. * \memberof dpp::cluster */ -auto inline co_guild_get_integrations(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_integrations(guild_id, cc); }); -} +awaitable co_guild_get_integrations(snowflake guild_id); -auto inline co_guild_get_preview(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_preview(guild_id, cc); }); -} +awaitable co_guild_get_preview(snowflake guild_id); /** * @brief Get guild vanity url, if enabled @@ -1027,9 +889,7 @@ auto inline co_guild_get_preview(snowflake guild_id) { * @return invite returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_get_vanity(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_vanity(guild_id, cc); }); -} +awaitable co_guild_get_vanity(snowflake guild_id); /** * @brief Get guild widget @@ -1042,9 +902,7 @@ auto inline co_guild_get_vanity(snowflake guild_id) { * @return guild_widget returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_get_widget(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_widget(guild_id, cc); }); -} +awaitable co_guild_get_widget(snowflake guild_id); /** * @brief Modify guild integration @@ -1057,9 +915,7 @@ auto inline co_guild_get_widget(snowflake guild_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_modify_integration(snowflake guild_id, const class integration &i) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_modify_integration(guild_id, i, cc); }); -} +awaitable co_guild_modify_integration(snowflake guild_id, const class integration &i); /** * @brief Get prune counts @@ -1076,9 +932,7 @@ auto inline co_guild_modify_integration(snowflake guild_id, const class integrat * @return prune returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_get_prune_counts(snowflake guild_id, const struct prune& pruneinfo) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_prune_counts(guild_id, pruneinfo, cc); }); -} +awaitable co_guild_get_prune_counts(snowflake guild_id, const struct prune& pruneinfo); /** * @brief Begin guild prune @@ -1097,9 +951,7 @@ auto inline co_guild_get_prune_counts(snowflake guild_id, const struct prune& pr * @return prune returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_begin_prune(snowflake guild_id, const struct prune& pruneinfo) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_begin_prune(guild_id, pruneinfo, cc); }); -} +awaitable co_guild_begin_prune(snowflake guild_id, const struct prune& pruneinfo); /** * @brief Change current user nickname @@ -1116,9 +968,7 @@ auto inline co_guild_begin_prune(snowflake guild_id, const struct prune& prunein * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_set_nickname(snowflake guild_id, const std::string &nickname) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_set_nickname(guild_id, nickname, cc); }); -} +awaitable co_guild_set_nickname(snowflake guild_id, const std::string &nickname); /** * @brief Sync guild integration @@ -1130,9 +980,7 @@ auto inline co_guild_set_nickname(snowflake guild_id, const std::string &nicknam * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_sync_integration(snowflake guild_id, snowflake integration_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_sync_integration(guild_id, integration_id, cc); }); -} +awaitable co_guild_sync_integration(snowflake guild_id, snowflake integration_id); /** * @brief Add guild member. Needs a specific oauth2 scope, from which you get the access_token. @@ -1152,9 +1000,7 @@ auto inline co_guild_sync_integration(snowflake guild_id, snowflake integration_ * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_add_member(const guild_member& gm, const std::string &access_token) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_add_member(gm, access_token, cc); }); -} +awaitable co_guild_add_member(const guild_member& gm, const std::string &access_token); /** * @brief Edit the properties of an existing guild member @@ -1170,9 +1016,7 @@ auto inline co_guild_add_member(const guild_member& gm, const std::string &acces * @return guild_member returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_edit_member(const guild_member& gm) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_edit_member(gm, cc); }); -} +awaitable co_guild_edit_member(const guild_member& gm); /** * @brief Get a guild member @@ -1183,9 +1027,7 @@ auto inline co_guild_edit_member(const guild_member& gm) { * @return guild_member returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_get_member(snowflake guild_id, snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_member(guild_id, user_id, cc); }); -} +awaitable co_guild_get_member(snowflake guild_id, snowflake user_id); /** * @brief Get all guild members @@ -1199,9 +1041,7 @@ auto inline co_guild_get_member(snowflake guild_id, snowflake user_id) { * @return guild_member_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_get_members(snowflake guild_id, uint16_t limit, snowflake after) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_members(guild_id, limit, after, cc); }); -} +awaitable co_guild_get_members(snowflake guild_id, uint16_t limit, snowflake after); /** * @brief Add role to guild member @@ -1217,9 +1057,7 @@ auto inline co_guild_get_members(snowflake guild_id, uint16_t limit, snowflake a * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_member_add_role(snowflake guild_id, snowflake user_id, snowflake role_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_member_add_role(guild_id, user_id, role_id, cc); }); -} +awaitable co_guild_member_add_role(snowflake guild_id, snowflake user_id, snowflake role_id); /** * @brief Remove (kick) a guild member @@ -1235,9 +1073,7 @@ auto inline co_guild_member_add_role(snowflake guild_id, snowflake user_id, snow * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_member_delete(snowflake guild_id, snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_member_delete(guild_id, user_id, cc); }); -} +awaitable co_guild_member_delete(snowflake guild_id, snowflake user_id); /** * @brief Remove (kick) a guild member @@ -1252,9 +1088,7 @@ auto inline co_guild_member_delete(snowflake guild_id, snowflake user_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_member_kick(snowflake guild_id, snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_member_kick(guild_id, user_id, cc); }); -} +awaitable co_guild_member_kick(snowflake guild_id, snowflake user_id); /** * @brief Set the timeout of a guild member @@ -1269,9 +1103,7 @@ auto inline co_guild_member_kick(snowflake guild_id, snowflake user_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_member_timeout(snowflake guild_id, snowflake user_id, time_t communication_disabled_until) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_member_timeout(guild_id, user_id, communication_disabled_until, cc); }); -} +awaitable co_guild_member_timeout(snowflake guild_id, snowflake user_id, time_t communication_disabled_until); /** * @brief Remove role from guild member @@ -1288,9 +1120,7 @@ auto inline co_guild_member_timeout(snowflake guild_id, snowflake user_id, time_ * @deprecated Use dpp::cluster::guild_member_remove_role instead * \memberof dpp::cluster */ -auto inline co_guild_member_delete_role(snowflake guild_id, snowflake user_id, snowflake role_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_member_delete_role(guild_id, user_id, role_id, cc); }); -} +awaitable co_guild_member_delete_role(snowflake guild_id, snowflake user_id, snowflake role_id); /** * @brief Remove role from guild member @@ -1306,9 +1136,7 @@ auto inline co_guild_member_delete_role(snowflake guild_id, snowflake user_id, s * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_member_remove_role(snowflake guild_id, snowflake user_id, snowflake role_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_member_remove_role(guild_id, user_id, role_id, cc); }); -} +awaitable co_guild_member_remove_role(snowflake guild_id, snowflake user_id, snowflake role_id); /** * @brief Moves the guild member to a other voice channel, if member is connected to one. @@ -1325,9 +1153,7 @@ auto inline co_guild_member_remove_role(snowflake guild_id, snowflake user_id, s * @return guild_member returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_member_move(const snowflake channel_id, const snowflake guild_id, const snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_member_move(channel_id, guild_id, user_id, cc); }); -} +awaitable co_guild_member_move(const snowflake channel_id, const snowflake guild_id, const snowflake user_id); /** * @brief Search for guild members based on whether their username or nickname starts with the given string. @@ -1341,9 +1167,7 @@ auto inline co_guild_member_move(const snowflake channel_id, const snowflake gui * @return guild_member_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_search_members(snowflake guild_id, const std::string& query, uint16_t limit) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_search_members(guild_id, query, limit, cc); }); -} +awaitable co_guild_search_members(snowflake guild_id, const std::string& query, uint16_t limit); /** * @brief Get guild invites @@ -1356,14 +1180,10 @@ auto inline co_guild_search_members(snowflake guild_id, const std::string& query * @return invite_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_get_invites(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_invites(guild_id, cc); }); -} +awaitable co_guild_get_invites(snowflake guild_id); -auto inline co_invite_delete(const std::string &invitecode) { - return dpp::awaitable(this, [&] (auto cc) { this->invite_delete(invitecode, cc); }); -} +awaitable co_invite_delete(const std::string &invitecode); /** * @brief Get details about an invite @@ -1374,9 +1194,7 @@ auto inline co_invite_delete(const std::string &invitecode) { * @return invite returned object on completion * \memberof dpp::cluster */ -auto inline co_invite_get(const std::string &invite_code) { - return dpp::awaitable(this, [&] (auto cc) { this->invite_get(invite_code, cc); }); -} +awaitable co_invite_get(const std::string &invite_code); /** * @brief Add a reaction to a message. The reaction string must be either an `emojiname:id` or a unicode character. @@ -1388,9 +1206,7 @@ auto inline co_invite_get(const std::string &invite_code) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_add_reaction(const struct message &m, const std::string &reaction) { - return dpp::awaitable(this, [&] (auto cc) { this->message_add_reaction(m, reaction, cc); }); -} +awaitable co_message_add_reaction(const struct message &m, const std::string &reaction); /** * @brief Add a reaction to a message by id. The reaction string must be either an `emojiname:id` or a unicode character. @@ -1403,9 +1219,7 @@ auto inline co_message_add_reaction(const struct message &m, const std::string & * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_add_reaction(snowflake message_id, snowflake channel_id, const std::string &reaction) { - return dpp::awaitable(this, [&] (auto cc) { this->message_add_reaction(message_id, channel_id, reaction, cc); }); -} +awaitable co_message_add_reaction(snowflake message_id, snowflake channel_id, const std::string &reaction); /** * @brief Send a message to a channel. The callback function is called when the message has been sent @@ -1416,9 +1230,7 @@ auto inline co_message_add_reaction(snowflake message_id, snowflake channel_id, * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_message_create(const message &m) { - return dpp::awaitable(this, [&] (auto cc) { this->message_create(m, cc); }); -} +awaitable co_message_create(const struct message &m); /** * @brief Crosspost a message. The callback function is called when the message has been sent @@ -1430,9 +1242,7 @@ auto inline co_message_create(const message &m) { * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_message_crosspost(snowflake message_id, snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->message_crosspost(message_id, channel_id, cc); }); -} +awaitable co_message_crosspost(snowflake message_id, snowflake channel_id); /** * @brief Delete all reactions on a message @@ -1443,9 +1253,7 @@ auto inline co_message_crosspost(snowflake message_id, snowflake channel_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete_all_reactions(const struct message &m) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete_all_reactions(m, cc); }); -} +awaitable co_message_delete_all_reactions(const struct message &m); /** * @brief Delete all reactions on a message by id @@ -1457,9 +1265,7 @@ auto inline co_message_delete_all_reactions(const struct message &m) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete_all_reactions(snowflake message_id, snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete_all_reactions(message_id, channel_id, cc); }); -} +awaitable co_message_delete_all_reactions(snowflake message_id, snowflake channel_id); /** * @brief Bulk delete messages from a channel. The callback function is called when the message has been edited @@ -1474,9 +1280,7 @@ auto inline co_message_delete_all_reactions(snowflake message_id, snowflake chan * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete_bulk(const std::vector& message_ids, snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete_bulk(message_ids, channel_id, cc); }); -} +awaitable co_message_delete_bulk(const std::vector &message_ids, snowflake channel_id); /** * @brief Delete a message from a channel. The callback function is called when the message has been edited @@ -1489,9 +1293,7 @@ auto inline co_message_delete_bulk(const std::vector& message_ids, sn * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete(snowflake message_id, snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete(message_id, channel_id, cc); }); -} +awaitable co_message_delete(snowflake message_id, snowflake channel_id); /** * @brief Delete own reaction from a message. The reaction string must be either an `emojiname:id` or a unicode character. @@ -1503,9 +1305,7 @@ auto inline co_message_delete(snowflake message_id, snowflake channel_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete_own_reaction(const struct message &m, const std::string &reaction) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete_own_reaction(m, reaction, cc); }); -} +awaitable co_message_delete_own_reaction(const struct message &m, const std::string &reaction); /** * @brief Delete own reaction from a message by id. The reaction string must be either an `emojiname:id` or a unicode character. @@ -1518,9 +1318,7 @@ auto inline co_message_delete_own_reaction(const struct message &m, const std::s * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete_own_reaction(snowflake message_id, snowflake channel_id, const std::string &reaction) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete_own_reaction(message_id, channel_id, reaction, cc); }); -} +awaitable co_message_delete_own_reaction(snowflake message_id, snowflake channel_id, const std::string &reaction); /** * @brief Delete a user's reaction from a message. The reaction string must be either an `emojiname:id` or a unicode character @@ -1533,9 +1331,7 @@ auto inline co_message_delete_own_reaction(snowflake message_id, snowflake chann * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete_reaction(const struct message &m, snowflake user_id, const std::string &reaction) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete_reaction(m, user_id, reaction, cc); }); -} +awaitable co_message_delete_reaction(const struct message &m, snowflake user_id, const std::string &reaction); /** * @brief Delete a user's reaction from a message by id. The reaction string must be either an `emojiname:id` or a unicode character @@ -1549,9 +1345,7 @@ auto inline co_message_delete_reaction(const struct message &m, snowflake user_i * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete_reaction(snowflake message_id, snowflake channel_id, snowflake user_id, const std::string &reaction) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete_reaction(message_id, channel_id, user_id, reaction, cc); }); -} +awaitable co_message_delete_reaction(snowflake message_id, snowflake channel_id, snowflake user_id, const std::string &reaction); /** * @brief Delete all reactions on a message using a particular emoji. The reaction string must be either an `emojiname:id` or a unicode character @@ -1563,9 +1357,7 @@ auto inline co_message_delete_reaction(snowflake message_id, snowflake channel_i * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete_reaction_emoji(const struct message &m, const std::string &reaction) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete_reaction_emoji(m, reaction, cc); }); -} +awaitable co_message_delete_reaction_emoji(const struct message &m, const std::string &reaction); /** * @brief Delete all reactions on a message using a particular emoji by id. The reaction string must be either an `emojiname:id` or a unicode character @@ -1578,9 +1370,7 @@ auto inline co_message_delete_reaction_emoji(const struct message &m, const std: * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_delete_reaction_emoji(snowflake message_id, snowflake channel_id, const std::string &reaction) { - return dpp::awaitable(this, [&] (auto cc) { this->message_delete_reaction_emoji(message_id, channel_id, reaction, cc); }); -} +awaitable co_message_delete_reaction_emoji(snowflake message_id, snowflake channel_id, const std::string &reaction); /** * @brief Edit a message on a channel. The callback function is called when the message has been edited @@ -1591,9 +1381,7 @@ auto inline co_message_delete_reaction_emoji(snowflake message_id, snowflake cha * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_message_edit(const message &m) { - return dpp::awaitable(this, [&] (auto cc) { this->message_edit(m, cc); }); -} +awaitable co_message_edit(const struct message &m); /** * @brief Get a message @@ -1605,9 +1393,7 @@ auto inline co_message_edit(const message &m) { * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_message_get(snowflake message_id, snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->message_get(message_id, channel_id, cc); }); -} +awaitable co_message_get(snowflake message_id, snowflake channel_id); /** * @brief Get reactions on a message for a particular emoji. The reaction string must be either an `emojiname:id` or a unicode character @@ -1622,9 +1408,7 @@ auto inline co_message_get(snowflake message_id, snowflake channel_id) { * @return user_map returned object on completion * \memberof dpp::cluster */ -auto inline co_message_get_reactions(const struct message &m, const std::string &reaction, snowflake before, snowflake after, snowflake limit) { - return dpp::awaitable(this, [&] (auto cc) { this->message_get_reactions(m, reaction, before, after, limit, cc); }); -} +awaitable co_message_get_reactions(const struct message &m, const std::string &reaction, snowflake before, snowflake after, snowflake limit); /** * @brief Get reactions on a message for a particular emoji by id. The reaction string must be either an `emojiname:id` or a unicode character @@ -1640,9 +1424,7 @@ auto inline co_message_get_reactions(const struct message &m, const std::string * @return emoji_map returned object on completion * \memberof dpp::cluster */ -auto inline co_message_get_reactions(snowflake message_id, snowflake channel_id, const std::string &reaction, snowflake before, snowflake after, snowflake limit) { - return dpp::awaitable(this, [&] (auto cc) { this->message_get_reactions(message_id, channel_id, reaction, before, after, limit, cc); }); -} +awaitable co_message_get_reactions(snowflake message_id, snowflake channel_id, const std::string &reaction, snowflake before, snowflake after, snowflake limit); /** * @brief Pin a message @@ -1654,9 +1436,7 @@ auto inline co_message_get_reactions(snowflake message_id, snowflake channel_id, * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_pin(snowflake channel_id, snowflake message_id) { - return dpp::awaitable(this, [&] (auto cc) { this->message_pin(channel_id, message_id, cc); }); -} +awaitable co_message_pin(snowflake channel_id, snowflake message_id); /** * @brief Get multiple messages. @@ -1673,9 +1453,7 @@ auto inline co_message_pin(snowflake channel_id, snowflake message_id) { * @return message_map returned object on completion * \memberof dpp::cluster */ -auto inline co_messages_get(snowflake channel_id, snowflake around, snowflake before, snowflake after, uint64_t limit) { - return dpp::awaitable(this, [&] (auto cc) { this->messages_get(channel_id, around, before, after, limit, cc); }); -} +awaitable co_messages_get(snowflake channel_id, snowflake around, snowflake before, snowflake after, uint64_t limit); /** * @brief Unpin a message @@ -1687,9 +1465,7 @@ auto inline co_messages_get(snowflake channel_id, snowflake around, snowflake be * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_message_unpin(snowflake channel_id, snowflake message_id) { - return dpp::awaitable(this, [&] (auto cc) { this->message_unpin(channel_id, message_id, cc); }); -} +awaitable co_message_unpin(snowflake channel_id, snowflake message_id); /** * @brief Get a channel's pins @@ -1699,9 +1475,7 @@ auto inline co_message_unpin(snowflake channel_id, snowflake message_id) { * @return message_map returned object on completion * \memberof dpp::cluster */ -auto inline co_channel_pins_get(snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->channel_pins_get(channel_id, cc); }); -} +awaitable co_channel_pins_get(snowflake channel_id); /** * @brief Create a role on a guild @@ -1716,9 +1490,7 @@ auto inline co_channel_pins_get(snowflake channel_id) { * @return role returned object on completion * \memberof dpp::cluster */ -auto inline co_role_create(const class role &r) { - return dpp::awaitable(this, [&] (auto cc) { this->role_create(r, cc); }); -} +awaitable co_role_create(const class role &r); /** * @brief Delete a role @@ -1733,9 +1505,7 @@ auto inline co_role_create(const class role &r) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_role_delete(snowflake guild_id, snowflake role_id) { - return dpp::awaitable(this, [&] (auto cc) { this->role_delete(guild_id, role_id, cc); }); -} +awaitable co_role_delete(snowflake guild_id, snowflake role_id); /** * @brief Edit a role on a guild @@ -1749,9 +1519,7 @@ auto inline co_role_delete(snowflake guild_id, snowflake role_id) { * @return role returned object on completion * \memberof dpp::cluster */ -auto inline co_role_edit(const class role &r) { - return dpp::awaitable(this, [&] (auto cc) { this->role_edit(r, cc); }); -} +awaitable co_role_edit(const class role &r); /** * @brief Edit multiple role's position in a guild. Returns a list of all roles of the guild on success. @@ -1767,9 +1535,7 @@ auto inline co_role_edit(const class role &r) { * @return role_map returned object on completion * \memberof dpp::cluster */ -auto inline co_roles_edit_position(snowflake guild_id, const std::vector &roles) { - return dpp::awaitable(this, [&] (auto cc) { this->roles_edit_position(guild_id, roles, cc); }); -} +awaitable co_roles_edit_position(snowflake guild_id, const std::vector &roles); /** * @brief Get a role for a guild @@ -1780,9 +1546,7 @@ auto inline co_roles_edit_position(snowflake guild_id, const std::vector & * @return role_map returned object on completion * \memberof dpp::cluster */ -auto inline co_roles_get(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->roles_get(guild_id, cc); }); -} +awaitable co_roles_get(snowflake guild_id); /** * @brief Get the application's role connection metadata records @@ -1793,9 +1557,7 @@ auto inline co_roles_get(snowflake guild_id) { * @return application_role_connection returned object on completion * \memberof dpp::cluster */ -auto inline co_application_role_connection_get(snowflake application_id) { - return dpp::awaitable(this, [&] (auto cc) { this->application_role_connection_get(application_id, cc); }); -} +awaitable co_application_role_connection_get(snowflake application_id); /** * @brief Update the application's role connection metadata records @@ -1808,9 +1570,7 @@ auto inline co_application_role_connection_get(snowflake application_id) { * @note An application can have a maximum of 5 metadata records. * \memberof dpp::cluster */ -auto inline co_application_role_connection_update(snowflake application_id, const std::vector &connection_metadata) { - return dpp::awaitable(this, [&] (auto cc) { this->application_role_connection_update(application_id, connection_metadata, cc); }); -} +awaitable co_application_role_connection_update(snowflake application_id, const std::vector &connection_metadata); /** * @brief Get user application role connection @@ -1821,9 +1581,7 @@ auto inline co_application_role_connection_update(snowflake application_id, cons * @return application_role_connection returned object on completion * \memberof dpp::cluster */ -auto inline co_user_application_role_connection_get(snowflake application_id) { - return dpp::awaitable(this, [&] (auto cc) { this->user_application_role_connection_get(application_id, cc); }); -} +awaitable co_user_application_role_connection_get(snowflake application_id); /** * @brief Update user application role connection @@ -1835,9 +1593,7 @@ auto inline co_user_application_role_connection_get(snowflake application_id) { * @return application_role_connection returned object on completion * \memberof dpp::cluster */ -auto inline co_user_application_role_connection_update(snowflake application_id, const application_role_connection &connection) { - return dpp::awaitable(this, [&] (auto cc) { this->user_application_role_connection_update(application_id, connection, cc); }); -} +awaitable co_user_application_role_connection_update(snowflake application_id, const application_role_connection &connection); /** * @brief Get all scheduled events for a guild @@ -1847,9 +1603,7 @@ auto inline co_user_application_role_connection_update(snowflake application_id, * @return scheduled_event_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_events_get(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_events_get(guild_id, cc); }); -} +awaitable co_guild_events_get(snowflake guild_id); /** * @brief Create a scheduled event on a guild @@ -1860,9 +1614,7 @@ auto inline co_guild_events_get(snowflake guild_id) { * @return scheduled_event returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_event_create(const scheduled_event& event) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_event_create(event, cc); }); -} +awaitable co_guild_event_create(const scheduled_event& event); /** * @brief Delete a scheduled event from a guild @@ -1874,9 +1626,7 @@ auto inline co_guild_event_create(const scheduled_event& event) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_event_delete(snowflake event_id, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_event_delete(event_id, guild_id, cc); }); -} +awaitable co_guild_event_delete(snowflake event_id, snowflake guild_id); /** * @brief Edit/modify a scheduled event on a guild @@ -1887,9 +1637,7 @@ auto inline co_guild_event_delete(snowflake event_id, snowflake guild_id) { * @return scheduled_event returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_event_edit(const scheduled_event& event) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_event_edit(event, cc); }); -} +awaitable co_guild_event_edit(const scheduled_event& event); /** * @brief Get a scheduled event for a guild @@ -1901,14 +1649,10 @@ auto inline co_guild_event_edit(const scheduled_event& event) { * @return scheduled_event returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_event_get(snowflake guild_id, snowflake event_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_event_get(guild_id, event_id, cc); }); -} +awaitable co_guild_event_get(snowflake guild_id, snowflake event_id); -auto inline co_stage_instance_create(const stage_instance& si) { - return dpp::awaitable(this, [&] (auto cc) { this->stage_instance_create(si, cc); }); -} +awaitable co_stage_instance_create(const stage_instance& si); /** * @brief Get the stage instance associated with the channel id, if it exists. @@ -1918,14 +1662,10 @@ auto inline co_stage_instance_create(const stage_instance& si) { * @return stage_instance returned object on completion * \memberof dpp::cluster */ -auto inline co_stage_instance_get(const snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->stage_instance_get(channel_id, cc); }); -} +awaitable co_stage_instance_get(const snowflake channel_id); -auto inline co_stage_instance_edit(const stage_instance& si) { - return dpp::awaitable(this, [&] (auto cc) { this->stage_instance_edit(si, cc); }); -} +awaitable co_stage_instance_edit(const stage_instance& si); /** * @brief Delete a stage instance. @@ -1936,9 +1676,7 @@ auto inline co_stage_instance_edit(const stage_instance& si) { * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. * \memberof dpp::cluster */ -auto inline co_stage_instance_delete(const snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->stage_instance_delete(channel_id, cc); }); -} +awaitable co_stage_instance_delete(const snowflake channel_id); /** * @brief Create a sticker in a guild @@ -1949,9 +1687,7 @@ auto inline co_stage_instance_delete(const snowflake channel_id) { * @return sticker returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_sticker_create(sticker &s) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_sticker_create(s, cc); }); -} +awaitable co_guild_sticker_create(sticker &s); /** * @brief Delete a sticker from a guild @@ -1963,9 +1699,7 @@ auto inline co_guild_sticker_create(sticker &s) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_sticker_delete(snowflake sticker_id, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_sticker_delete(sticker_id, guild_id, cc); }); -} +awaitable co_guild_sticker_delete(snowflake sticker_id, snowflake guild_id); /** * @brief Get a guild sticker @@ -1976,9 +1710,7 @@ auto inline co_guild_sticker_delete(snowflake sticker_id, snowflake guild_id) { * @return sticker returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_sticker_get(snowflake id, snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_sticker_get(id, guild_id, cc); }); -} +awaitable co_guild_sticker_get(snowflake id, snowflake guild_id); /** * @brief Modify a sticker in a guild @@ -1989,9 +1721,7 @@ auto inline co_guild_sticker_get(snowflake id, snowflake guild_id) { * @return sticker returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_sticker_modify(sticker &s) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_sticker_modify(s, cc); }); -} +awaitable co_guild_sticker_modify(sticker &s); /** * @brief Get all guild stickers @@ -2001,9 +1731,7 @@ auto inline co_guild_sticker_modify(sticker &s) { * @return sticker_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_stickers_get(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_stickers_get(guild_id, cc); }); -} +awaitable co_guild_stickers_get(snowflake guild_id); /** * @brief Get a nitro sticker @@ -2013,9 +1741,7 @@ auto inline co_guild_stickers_get(snowflake guild_id) { * @return sticker returned object on completion * \memberof dpp::cluster */ -auto inline co_nitro_sticker_get(snowflake id) { - return dpp::awaitable(this, [&] (auto cc) { this->nitro_sticker_get(id, cc); }); -} +awaitable co_nitro_sticker_get(snowflake id); /** * @brief Get sticker packs @@ -2024,9 +1750,7 @@ auto inline co_nitro_sticker_get(snowflake id) { * @return sticker_pack_map returned object on completion * \memberof dpp::cluster */ -auto inline co_sticker_packs_get() { - return dpp::awaitable(this, [&] (auto cc) { this->sticker_packs_get(cc); }); -} +awaitable co_sticker_packs_get(); /** * @brief Create a new guild based on a template. @@ -2038,9 +1762,7 @@ auto inline co_sticker_packs_get() { * @return guild returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_create_from_template(const std::string &code, const std::string &name) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_create_from_template(code, name, cc); }); -} +awaitable co_guild_create_from_template(const std::string &code, const std::string &name); /** * @brief Creates a template for the guild @@ -2053,9 +1775,7 @@ auto inline co_guild_create_from_template(const std::string &code, const std::st * @return dtemplate returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_template_create(snowflake guild_id, const std::string &name, const std::string &description) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_template_create(guild_id, name, description, cc); }); -} +awaitable co_guild_template_create(snowflake guild_id, const std::string &name, const std::string &description); /** * @brief Deletes the template @@ -2067,9 +1787,7 @@ auto inline co_guild_template_create(snowflake guild_id, const std::string &name * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_template_delete(snowflake guild_id, const std::string &code) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_template_delete(guild_id, code, cc); }); -} +awaitable co_guild_template_delete(snowflake guild_id, const std::string &code); /** * @brief Modifies the template's metadata. @@ -2083,9 +1801,7 @@ auto inline co_guild_template_delete(snowflake guild_id, const std::string &code * @return dtemplate returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_template_modify(snowflake guild_id, const std::string &code, const std::string &name, const std::string &description) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_template_modify(guild_id, code, name, description, cc); }); -} +awaitable co_guild_template_modify(snowflake guild_id, const std::string &code, const std::string &name, const std::string &description); /** * @brief Get guild templates @@ -2096,9 +1812,7 @@ auto inline co_guild_template_modify(snowflake guild_id, const std::string &code * @return dtemplate_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_templates_get(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_templates_get(guild_id, cc); }); -} +awaitable co_guild_templates_get(snowflake guild_id); /** * @brief Syncs the template to the guild's current state. @@ -2110,9 +1824,7 @@ auto inline co_guild_templates_get(snowflake guild_id) { * @return dtemplate returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_template_sync(snowflake guild_id, const std::string &code) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_template_sync(guild_id, code, cc); }); -} +awaitable co_guild_template_sync(snowflake guild_id, const std::string &code); /** * @brief Get a template @@ -2122,9 +1834,7 @@ auto inline co_guild_template_sync(snowflake guild_id, const std::string &code) * @return dtemplate returned object on completion * \memberof dpp::cluster */ -auto inline co_template_get(const std::string &code) { - return dpp::awaitable(this, [&] (auto cc) { this->template_get(code, cc); }); -} +awaitable co_template_get(const std::string &code); /** * @brief Join a thread @@ -2134,9 +1844,7 @@ auto inline co_template_get(const std::string &code) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_current_user_join_thread(snowflake thread_id) { - return dpp::awaitable(this, [&] (auto cc) { this->current_user_join_thread(thread_id, cc); }); -} +awaitable co_current_user_join_thread(snowflake thread_id); /** * @brief Leave a thread @@ -2146,9 +1854,7 @@ auto inline co_current_user_join_thread(snowflake thread_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_current_user_leave_thread(snowflake thread_id) { - return dpp::awaitable(this, [&] (auto cc) { this->current_user_leave_thread(thread_id, cc); }); -} +awaitable co_current_user_leave_thread(snowflake thread_id); /** * @brief Get all active threads in the guild, including public and private threads. Threads are ordered by their id, in descending order. @@ -2158,9 +1864,7 @@ auto inline co_current_user_leave_thread(snowflake thread_id) { * @return active_threads returned object on completion * \memberof dpp::cluster */ -auto inline co_threads_get_active(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->threads_get_active(guild_id, cc); }); -} +awaitable co_threads_get_active(snowflake guild_id); /** * @brief Get private archived threads in a channel which current user has joined (Sorted by ID in descending order) @@ -2172,9 +1876,7 @@ auto inline co_threads_get_active(snowflake guild_id) { * @return thread_map returned object on completion * \memberof dpp::cluster */ -auto inline co_threads_get_joined_private_archived(snowflake channel_id, snowflake before_id, uint16_t limit) { - return dpp::awaitable(this, [&] (auto cc) { this->threads_get_joined_private_archived(channel_id, before_id, limit, cc); }); -} +awaitable co_threads_get_joined_private_archived(snowflake channel_id, snowflake before_id, uint16_t limit); /** * @brief Get private archived threads in a channel (Sorted by archive_timestamp in descending order) @@ -2186,9 +1888,7 @@ auto inline co_threads_get_joined_private_archived(snowflake channel_id, snowfla * @return thread_map returned object on completion * \memberof dpp::cluster */ -auto inline co_threads_get_private_archived(snowflake channel_id, time_t before_timestamp, uint16_t limit) { - return dpp::awaitable(this, [&] (auto cc) { this->threads_get_private_archived(channel_id, before_timestamp, limit, cc); }); -} +awaitable co_threads_get_private_archived(snowflake channel_id, time_t before_timestamp, uint16_t limit); /** * @brief Get public archived threads in a channel (Sorted by archive_timestamp in descending order) @@ -2200,9 +1900,7 @@ auto inline co_threads_get_private_archived(snowflake channel_id, time_t before_ * @return thread_map returned object on completion * \memberof dpp::cluster */ -auto inline co_threads_get_public_archived(snowflake channel_id, time_t before_timestamp, uint16_t limit) { - return dpp::awaitable(this, [&] (auto cc) { this->threads_get_public_archived(channel_id, before_timestamp, limit, cc); }); -} +awaitable co_threads_get_public_archived(snowflake channel_id, time_t before_timestamp, uint16_t limit); /** * @brief Get a thread member @@ -2213,9 +1911,7 @@ auto inline co_threads_get_public_archived(snowflake channel_id, time_t before_t * @return thread_member returned object on completion * \memberof dpp::cluster */ -auto inline co_thread_member_get(const snowflake thread_id, const snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->thread_member_get(thread_id, user_id, cc); }); -} +awaitable co_thread_member_get(const snowflake thread_id, const snowflake user_id); /** * @brief Get members of a thread @@ -2225,9 +1921,7 @@ auto inline co_thread_member_get(const snowflake thread_id, const snowflake user * @return thread_member_map returned object on completion * \memberof dpp::cluster */ -auto inline co_thread_members_get(snowflake thread_id) { - return dpp::awaitable(this, [&] (auto cc) { this->thread_members_get(thread_id, cc); }); -} +awaitable co_thread_members_get(snowflake thread_id); /** * @brief Create a thread in forum channel @@ -2244,9 +1938,7 @@ auto inline co_thread_members_get(snowflake thread_id) { * @return thread returned object on completion * \memberof dpp::cluster */ -auto inline co_thread_create_in_forum(const std::string& thread_name, snowflake channel_id, const message& msg, auto_archive_duration_t auto_archive_duration, uint16_t rate_limit_per_user, std::vector applied_tags) { - return dpp::awaitable(this, [&] (auto cc) { this->thread_create_in_forum(thread_name, channel_id, msg, auto_archive_duration, rate_limit_per_user, applied_tags, cc); }); -} +awaitable co_thread_create_in_forum(const std::string& thread_name, snowflake channel_id, const message& msg, auto_archive_duration_t auto_archive_duration, uint16_t rate_limit_per_user, std::vector applied_tags = {}); /** * @brief Create a thread @@ -2263,9 +1955,7 @@ auto inline co_thread_create_in_forum(const std::string& thread_name, snowflake * @return thread returned object on completion * \memberof dpp::cluster */ -auto inline co_thread_create(const std::string& thread_name, snowflake channel_id, uint16_t auto_archive_duration, channel_type thread_type, bool invitable, uint16_t rate_limit_per_user) { - return dpp::awaitable(this, [&] (auto cc) { this->thread_create(thread_name, channel_id, auto_archive_duration, thread_type, invitable, rate_limit_per_user, cc); }); -} +awaitable co_thread_create(const std::string& thread_name, snowflake channel_id, uint16_t auto_archive_duration, channel_type thread_type, bool invitable, uint16_t rate_limit_per_user); /** * @brief Edit a thread @@ -2277,9 +1967,7 @@ auto inline co_thread_create(const std::string& thread_name, snowflake channel_i * @return thread returned object on completion * \memberof dpp::cluster */ -auto inline co_thread_edit(const thread &t) { - return dpp::awaitable(this, [&] (auto cc) { this->thread_edit(t, cc); }); -} +awaitable co_thread_edit(const thread &t); /** * @brief Create a thread with a message (Discord: ID of a thread is same as message ID) @@ -2294,9 +1982,7 @@ auto inline co_thread_edit(const thread &t) { * @return thread returned object on completion * \memberof dpp::cluster */ -auto inline co_thread_create_with_message(const std::string& thread_name, snowflake channel_id, snowflake message_id, uint16_t auto_archive_duration, uint16_t rate_limit_per_user) { - return dpp::awaitable(this, [&] (auto cc) { this->thread_create_with_message(thread_name, channel_id, message_id, auto_archive_duration, rate_limit_per_user, cc); }); -} +awaitable co_thread_create_with_message(const std::string& thread_name, snowflake channel_id, snowflake message_id, uint16_t auto_archive_duration, uint16_t rate_limit_per_user); /** * @brief Add a member to a thread @@ -2307,9 +1993,7 @@ auto inline co_thread_create_with_message(const std::string& thread_name, snowfl * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_thread_member_add(snowflake thread_id, snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->thread_member_add(thread_id, user_id, cc); }); -} +awaitable co_thread_member_add(snowflake thread_id, snowflake user_id); /** * @brief Remove a member from a thread @@ -2320,9 +2004,7 @@ auto inline co_thread_member_add(snowflake thread_id, snowflake user_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_thread_member_remove(snowflake thread_id, snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->thread_member_remove(thread_id, user_id, cc); }); -} +awaitable co_thread_member_remove(snowflake thread_id, snowflake user_id); /** * @brief Edit current (bot) user @@ -2338,9 +2020,7 @@ auto inline co_thread_member_remove(snowflake thread_id, snowflake user_id) { * @throw dpp::length_exception Image data is larger than the maximum size of 256 kilobytes * \memberof dpp::cluster */ -auto inline co_current_user_edit(const std::string &nickname, const std::string& image_blob, const image_type type) { - return dpp::awaitable(this, [&] (auto cc) { this->current_user_edit(nickname, image_blob, type, cc); }); -} +awaitable co_current_user_edit(const std::string &nickname, const std::string& image_blob = "", const image_type type = i_png); /** * @brief Get current (bot) application @@ -2350,9 +2030,7 @@ auto inline co_current_user_edit(const std::string &nickname, const std::string& * @return application returned object on completion * \memberof dpp::cluster */ -auto inline co_current_application_get() { - return dpp::awaitable(this, [&] (auto cc) { this->current_application_get(cc); }); -} +awaitable co_current_application_get(); /** * @brief Get current (bot) user @@ -2364,9 +2042,7 @@ auto inline co_current_application_get() { * If you do not have these scopes, these fields are empty. You can safely convert a user_identified to user with `dynamic_cast`. * \memberof dpp::cluster */ -auto inline co_current_user_get() { - return dpp::awaitable(this, [&] (auto cc) { this->current_user_get(cc); }); -} +awaitable co_current_user_get(); /** * @brief Set the bot's voice state on a stage channel @@ -2391,9 +2067,7 @@ auto inline co_current_user_get() { * @throw std::logic_exception You attempted to set a request_to_speak_timestamp in the past which is not the value of 0. * \memberof dpp::cluster */ -auto inline co_current_user_set_voice_state(snowflake guild_id, snowflake channel_id, bool suppress, time_t request_to_speak_timestamp) { - return dpp::awaitable(this, [&] (auto cc) { this->current_user_set_voice_state(guild_id, channel_id, suppress, request_to_speak_timestamp, cc); }); -} +awaitable co_current_user_set_voice_state(snowflake guild_id, snowflake channel_id, bool suppress = false, time_t request_to_speak_timestamp = 0); /** * @brief Set a user's voice state on a stage channel @@ -2417,9 +2091,7 @@ auto inline co_current_user_set_voice_state(snowflake guild_id, snowflake channe * @param suppress True if the user's audio should be suppressed, false if it should not * \memberof dpp::cluster */ -auto inline co_user_set_voice_state(snowflake user_id, snowflake guild_id, snowflake channel_id, bool suppress) { - return dpp::awaitable(this, [&] (auto cc) { this->user_set_voice_state(user_id, guild_id, channel_id, suppress, cc); }); -} +awaitable co_user_set_voice_state(snowflake user_id, snowflake guild_id, snowflake channel_id, bool suppress = false); /** * @brief Get current user's connections (linked accounts, e.g. steam, xbox). @@ -2430,9 +2102,7 @@ auto inline co_user_set_voice_state(snowflake user_id, snowflake guild_id, snowf * @return connection_map returned object on completion * \memberof dpp::cluster */ -auto inline co_current_user_connections_get() { - return dpp::awaitable(this, [&] (auto cc) { this->current_user_connections_get(cc); }); -} +awaitable co_current_user_connections_get(); /** * @brief Get current (bot) user guilds @@ -2441,9 +2111,7 @@ auto inline co_current_user_connections_get() { * @return guild_map returned object on completion * \memberof dpp::cluster */ -auto inline co_current_user_get_guilds() { - return dpp::awaitable(this, [&] (auto cc) { this->current_user_get_guilds(cc); }); -} +awaitable co_current_user_get_guilds(); /** * @brief Leave a guild @@ -2453,9 +2121,7 @@ auto inline co_current_user_get_guilds() { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_current_user_leave_guild(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->current_user_leave_guild(guild_id, cc); }); -} +awaitable co_current_user_leave_guild(snowflake guild_id); /** * @brief Get a user by id, without using the cache @@ -2470,9 +2136,7 @@ auto inline co_current_user_leave_guild(snowflake guild_id) { * Call `dpp::find_user` instead that looks up the user in the cache rather than a REST call. * \memberof dpp::cluster */ -auto inline co_user_get(snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->user_get(user_id, cc); }); -} +awaitable co_user_get(snowflake user_id); /** * @brief Get a user by id, checking in the cache first @@ -2487,9 +2151,7 @@ auto inline co_user_get(snowflake user_id) { * where you want to for example resolve a user who may no longer be in the bot's guilds, for something like a ban log message. * \memberof dpp::cluster */ -auto inline co_user_get_cached(snowflake user_id) { - return dpp::awaitable(this, [&] (auto cc) { this->user_get_cached(user_id, cc); }); -} +awaitable co_user_get_cached(snowflake user_id); /** * @brief Get all voice regions @@ -2498,9 +2160,7 @@ auto inline co_user_get_cached(snowflake user_id) { * @return voiceregion_map returned object on completion * \memberof dpp::cluster */ -auto inline co_get_voice_regions() { - return dpp::awaitable(this, [&] (auto cc) { this->get_voice_regions(cc); }); -} +awaitable co_get_voice_regions(); /** * @brief Get guild voice regions. @@ -2515,9 +2175,7 @@ auto inline co_get_voice_regions() { * @return voiceregion_map returned object on completion * \memberof dpp::cluster */ -auto inline co_guild_get_voice_regions(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->guild_get_voice_regions(guild_id, cc); }); -} +awaitable co_guild_get_voice_regions(snowflake guild_id); /** * @brief Create a webhook @@ -2528,9 +2186,7 @@ auto inline co_guild_get_voice_regions(snowflake guild_id) { * @return webhook returned object on completion * \memberof dpp::cluster */ -auto inline co_create_webhook(const class webhook &w) { - return dpp::awaitable(this, [&] (auto cc) { this->create_webhook(w, cc); }); -} +awaitable co_create_webhook(const class webhook &w); /** * @brief Delete a webhook @@ -2541,9 +2197,7 @@ auto inline co_create_webhook(const class webhook &w) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_delete_webhook(snowflake webhook_id) { - return dpp::awaitable(this, [&] (auto cc) { this->delete_webhook(webhook_id, cc); }); -} +awaitable co_delete_webhook(snowflake webhook_id); /** * @brief Delete webhook message @@ -2556,9 +2210,7 @@ auto inline co_delete_webhook(snowflake webhook_id) { * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_delete_webhook_message(const class webhook &wh, snowflake message_id, snowflake thread_id) { - return dpp::awaitable(this, [&] (auto cc) { this->delete_webhook_message(wh, message_id, thread_id, cc); }); -} +awaitable co_delete_webhook_message(const class webhook &wh, snowflake message_id, snowflake thread_id = 0); /** * @brief Delete webhook with token @@ -2569,9 +2221,7 @@ auto inline co_delete_webhook_message(const class webhook &wh, snowflake message * @return confirmation returned object on completion * \memberof dpp::cluster */ -auto inline co_delete_webhook_with_token(snowflake webhook_id, const std::string &token) { - return dpp::awaitable(this, [&] (auto cc) { this->delete_webhook_with_token(webhook_id, token, cc); }); -} +awaitable co_delete_webhook_with_token(snowflake webhook_id, const std::string &token); /** * @brief Edit webhook @@ -2582,9 +2232,7 @@ auto inline co_delete_webhook_with_token(snowflake webhook_id, const std::string * @return webhook returned object on completion * \memberof dpp::cluster */ -auto inline co_edit_webhook(const class webhook& wh) { - return dpp::awaitable(this, [&] (auto cc) { this->edit_webhook(wh, cc); }); -} +awaitable co_edit_webhook(const class webhook& wh); /** * @brief Edit webhook message @@ -2603,9 +2251,7 @@ auto inline co_edit_webhook(const class webhook& wh) { * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_edit_webhook_message(const class webhook &wh, const struct message& m, snowflake thread_id) { - return dpp::awaitable(this, [&] (auto cc) { this->edit_webhook_message(wh, m, thread_id, cc); }); -} +awaitable co_edit_webhook_message(const class webhook &wh, const struct message &m, snowflake thread_id = 0); /** * @brief Edit webhook with token (token is encapsulated in the webhook object) @@ -2615,9 +2261,7 @@ auto inline co_edit_webhook_message(const class webhook &wh, const struct messag * @return webhook returned object on completion * \memberof dpp::cluster */ -auto inline co_edit_webhook_with_token(const class webhook& wh) { - return dpp::awaitable(this, [&] (auto cc) { this->edit_webhook_with_token(wh, cc); }); -} +awaitable co_edit_webhook_with_token(const class webhook& wh); /** * @brief Execute webhook @@ -2633,9 +2277,7 @@ auto inline co_edit_webhook_with_token(const class webhook& wh) { * @note If the webhook channel is a forum channel, you must provide either `thread_id` or `thread_name`. If `thread_id` is provided, the message will send in that thread. If `thread_name` is provided, a thread with that name will be created in the forum channel. * \memberof dpp::cluster */ -auto inline co_execute_webhook(const class webhook &wh, const struct message& m, bool wait, snowflake thread_id, const std::string& thread_name) { - return dpp::awaitable(this, [&] (auto cc) { this->execute_webhook(wh, m, wait, thread_id, thread_name, cc); }); -} +awaitable co_execute_webhook(const class webhook &wh, const struct message &m, bool wait = false, snowflake thread_id = 0, const std::string& thread_name = ""); /** * @brief Get channel webhooks @@ -2645,9 +2287,7 @@ auto inline co_execute_webhook(const class webhook &wh, const struct message& m, * @return webhook_map returned object on completion * \memberof dpp::cluster */ -auto inline co_get_channel_webhooks(snowflake channel_id) { - return dpp::awaitable(this, [&] (auto cc) { this->get_channel_webhooks(channel_id, cc); }); -} +awaitable co_get_channel_webhooks(snowflake channel_id); /** * @brief Get guild webhooks @@ -2657,9 +2297,7 @@ auto inline co_get_channel_webhooks(snowflake channel_id) { * @return webhook_map returned object on completion * \memberof dpp::cluster */ -auto inline co_get_guild_webhooks(snowflake guild_id) { - return dpp::awaitable(this, [&] (auto cc) { this->get_guild_webhooks(guild_id, cc); }); -} +awaitable co_get_guild_webhooks(snowflake guild_id); /** * @brief Get webhook @@ -2669,9 +2307,7 @@ auto inline co_get_guild_webhooks(snowflake guild_id) { * @return webhook returned object on completion * \memberof dpp::cluster */ -auto inline co_get_webhook(snowflake webhook_id) { - return dpp::awaitable(this, [&] (auto cc) { this->get_webhook(webhook_id, cc); }); -} +awaitable co_get_webhook(snowflake webhook_id); /** * @brief Get webhook message @@ -2684,9 +2320,7 @@ auto inline co_get_webhook(snowflake webhook_id) { * @return message returned object on completion * \memberof dpp::cluster */ -auto inline co_get_webhook_message(const class webhook &wh, snowflake message_id, snowflake thread_id) { - return dpp::awaitable(this, [&] (auto cc) { this->get_webhook_message(wh, message_id, thread_id, cc); }); -} +awaitable co_get_webhook_message(const class webhook &wh, snowflake message_id, snowflake thread_id = 0); /** * @brief Get webhook using token @@ -2697,13 +2331,9 @@ auto inline co_get_webhook_message(const class webhook &wh, snowflake message_id * @return webhook returned object on completion * \memberof dpp::cluster */ -auto inline co_get_webhook_with_token(snowflake webhook_id, const std::string &token) { - return dpp::awaitable(this, [&] (auto cc) { this->get_webhook_with_token(webhook_id, token, cc); }); -} +awaitable co_get_webhook_with_token(snowflake webhook_id, const std::string &token); /* End of auto-generated definitions */ -auto inline co_request(const std::string &url, http_method method, const std::string &postdata = "", const std::string &mimetype = "text/plain", const std::multimap &headers = {}) { - return dpp::awaitable(this, [&] (auto cc) { this->request(url, method, cc, mimetype, headers); }); -} +awaitable co_request(const std::string &url, http_method method, const std::string &postdata = "", const std::string &mimetype = "text/plain", const std::multimap &headers = {}); diff --git a/include/dpp/coro.h b/include/dpp/coro.h index 900a67e43b..53ea155b9f 100644 --- a/include/dpp/coro.h +++ b/include/dpp/coro.h @@ -1,158 +1,693 @@ #ifdef DPP_CORO #pragma once -#include -#include -namespace dpp { - - /** - * @brief Shorthand for the coroutine handle's type - */ - using handle_type = std::coroutine_handle; +#if !(defined( _MSC_VER ) || defined( _CONSOLE ) || defined( __GNUC__ )) // if libc++ +# define EXPERIMENTAL_COROUTINE +#endif +#ifdef EXPERIMENTAL_COROUTINE +# include +#else +# include +#endif + +#include +#include +#include + +namespace dpp { class cluster; + struct confirmation_callback_t; /** - * @brief Return type for coroutines + * @brief Implementation details for internal use only. + * + * @attention This is only meant to be used by D++ internally. Support will not be given regarding the facilities in this namespace. */ - struct task { + namespace detail { +#ifdef _DOXYGEN_ /** - * @brief Required nested promise_type for coroutines + * @brief Alias for either std or std::experimental depending on compiler and library. Used by coroutine implementation. + * + * @todo Remove and use std when all supported libraries have coroutines in it */ - using promise_type = dpp::promise; - }; + namespace std_coroutine {} +#else +# ifdef EXPERIMENTAL_COROUTINE + namespace std_coroutine = std::experimental; +# else + namespace std_coroutine = std; +# endif +#endif + + /** + * @brief A task's promise type, with special logic for handling nested tasks. + */ + template + struct task_promise; + + /** + * @brief The object automatically co_await-ed at the end of a task. Ensures nested task chains are resolved, and the promise cleans up if it needs to. + */ + template + struct task_chain_final_awaiter; + + /** + * @brief Alias for std::coroutine_handle for a task_promise. + */ + template + using task_handle = detail::std_coroutine::coroutine_handle>; + } /** - * @brief Implementation of promise_type for dpp's coroutines + * @brief A coroutine task. It can be co_awaited to make nested coroutines. + * + * Can be used in conjunction with coroutine events via dpp::event_router_t::co_attach, or on its own. + * + * @warning This feature is EXPERIMENTAL. The API may change at any time and there may be bugs. Please report any to GitHub issues or to the D++ Discord server. + * @tparam ReturnType Return type of the coroutine. Can be void, or a complete object that supports move construction and move assignment. */ - struct promise { + template +#ifndef _DOXYGEN_ + requires std::is_same_v || (!std::is_reference_v && std::is_move_constructible_v && std::is_move_assignable_v) +#endif + class task { /** - * @brief A pointer to the cluster making the requests in the coroutine + * @brief The coroutine handle of this task. */ - cluster* bot = nullptr; + detail::task_handle handle; /** - * @brief The result of the last co_await-ed function + * @brief Promise type of this coroutine. For internal use only, do not use. */ - confirmation_callback_t callback; + friend struct detail::task_promise; /** - * @brief Construct a new promise object + * @brief Construct from a coroutine handle. Internal use only */ - promise() = default; + explicit task(detail::task_handle handle_) : handle(handle_) {} + public: /** - * @brief Construct a new promise object - * - * @param ev Base type of all events, only used to get the dpp::cluster pointer + * @brief Default constructor, creates a task not bound to a coroutine. */ - promise(const dpp::event_dispatch_t& ev) : bot(ev.from->creator) { } + task() = default; /** - * @brief Get the return object - * - * @return task dpp::task type + * @brief Copy constructor is disabled */ - task get_return_object() { - return {}; + task(const task &) = delete; + + /** + * @brief Move constructor, grabs another task's coroutine handle + * + * @param other Task to move the handle from + */ + task(task &&other) noexcept : handle(std::exchange(other.handle, nullptr)) {} + + + /** + * @brief Destructor. + * + * Destroys the handle if coroutine is done, otherwise detaches it from this thread. + * In detached mode, the handle will destroy itself at the end of the coroutine. + */ + ~task() { + if (handle) { + auto &promise = handle.promise(); + + if (!promise.is_sync) { + std::unique_lock lock{promise.mutex}; + + if (promise.destroy) // promise in async thread checked first and skipped clean up, we do it + { + if (promise.exception && promise.exception_handler) + promise.exception_handler(promise.exception); + lock.unlock(); + handle.destroy(); + } + else + handle.promise().destroy = true; + } + else { + if (promise.exception && promise.exception_handler) + promise.exception_handler(promise.exception); + handle.destroy(); + } + } } /** - * @brief Function called when the coroutine is first suspended, never suspends - * - * @return std::suspend_never Never suspend this coroutine at the first suspend point + * @brief Copy assignment is disabled + */ + task &operator=(const task &) = delete; + + /** + * @brief Move assignment, grabs another task's coroutine handle + * + * @param other Task to move the handle from */ - std::suspend_never initial_suspend() noexcept { - return {}; + task &operator=(task &&other) noexcept { + handle = std::exchange(other.handle, nullptr); + return (*this); } /** - * @brief Function called when the coroutine reaches its last suspension point - * - * @return std::suspend_never Never suspend this coroutine at the final suspend point + * @brief First function called by the standard library when the task is co_await-ed. + * + * @remark Do not call this manually, use the co_await keyword instead. + * @return bool Whether not to suspend the caller or not + */ + bool await_ready() { + return handle.done(); + } + + /** + * @brief Second function called by the standard library when the task is co_await-ed, if await_ready returned false. + * + * Stores the calling coroutine in the promise to resume when this task suspends. + * + * @remark Do not call this manually, use the co_await keyword instead. + * @param caller The calling coroutine, now suspended + * @return bool Whether to suspend the caller or not */ - std::suspend_never final_suspend() noexcept { - return {}; + template + bool await_suspend(detail::task_handle caller) noexcept { + auto &my_promise = handle.promise(); + + if (my_promise.is_sync) + return false; + my_promise.parent = caller; + caller.promise().is_sync = false; + return true; } /** - * @brief Function called when the coroutine returns nothing + * @brief Function called by the standard library when the coroutine is resumed. + * + * @remark Do not call this manually, use the co_await keyword instead. + * @throw Throws any exception thrown or uncaught by the coroutine + * @return ReturnType The result of the coroutine. It is the value the whole co-await expression evaluates to */ - void return_void() noexcept {} + ReturnType await_resume(); /** - * @brief Function called when coroutine throws a un-catch-ed exception. Does nothing + * @brief Function to check if the coroutine has finished its execution entirely + * + * @return bool Whether the coroutine is done. + * @see https://en.cppreference.com/w/cpp/coroutine/coroutine_handle/done */ - void unhandled_exception() { - /* try { std::rethrow_exception(std::current_exception()); } */ - /* catch (const std::exception& e) { std::cout << e.what() << '\n'; } */ + bool done() const noexcept { + return handle.done(); + } + + /** + * @brief Set the exception handling function. Called when an exception is thrown but not caught + * + * @warning The exception handler must not throw. If an exception that is not caught is thrown in a detached task, the program will terminate. + */ + task &on_exception(std::function func) { + handle.promise().exception_handler = std::move(func); + if (handle.promise().exception) + func(handle.promise().exception); + return *this; } }; + namespace detail { + /** + * @brief Awaitable returned from task_promise's final_suspend. Resumes the parent and cleans up its handle if needed + */ + template + struct task_chain_final_awaiter { + /** + * @brief Always suspend at the end of the task. This allows us to clean up and resume the parent + */ + bool await_ready() noexcept { + return (false); + } + + /* + * @brief The suspension logic of the coroutine when it finishes. Always suspend the caller, meaning cleaning up the handle is on us + * + * @param handle The handle of this coroutine + */ + void await_suspend(detail::task_handle handle) noexcept; + + /* + * @brief Function called when this object is co_awaited by the standard library at the end of final_suspend. Do nothing, return nothing + */ + void await_resume() noexcept {} + }; + /** + * @brief Base implementation of task_promise, without the logic that would depend on the return type. Meant to be inherited from + */ + struct task_promise_base { + /** + * @brief Mutex for async task destruction. + */ + std::mutex mutex{}; + + /** + * @brief Parent coroutine to return to for nested coroutines. + */ + detail::std_coroutine::coroutine_handle<> parent = nullptr; + + /** + * @brief Exception ptr if any was thrown during the coroutine + * + * @see std::exception_ptr + */ + std::exception_ptr exception = nullptr; + + /** + * @brief Whether the coroutine has async calls or not + * + * Will only ever change on the calling thread while callback mutex guards the async thread + */ + bool is_sync = true; + + /** + * @brief Whether either the task object or the promise is gone and the next one to end will clean up + */ + bool destroy = false; + + /** + * @brief Function object called when an exception is thrown from a coroutine + */ + std::function exception_handler = nullptr; + + /** + * @brief Function called by the standard library when the coroutine is created. + * + * @return std::suspend_never Don't suspend, the coroutine starts immediately. + */ + std::suspend_never initial_suspend() noexcept { + return {}; + } + + /** + * @brief Function called by the standard library when an exception is thrown and not caught in the coroutine. + * + * Stores the exception pointer to rethrow later + */ + void unhandled_exception() { + exception = std::current_exception(); + } + }; + + /** + * @brief Implementation of task_promise for non-void return type + */ + template + struct task_promise : task_promise_base { + /** + * @brief Stored return value of the coroutine. + * + * @details The main reason we use std::optional here and not ReturnType is to avoid default construction of the value so we only require ReturnType to have a move constructor, instead of both a default constructor and move assignment operator + */ + std::optional value = std::nullopt; + + /** + * @brief Function called by the standard library when the coroutine co_returns a value. + * + * Stores the value internally to hand to the caller when it resumes. + * + * @param expr The value given to co_return + */ + void return_value(ReturnType expr) { + value = std::move(expr); + } + + /** + * @brief Function called by the standard library when the coroutine is created. + * + * @return task The coroutine object + */ + task get_return_object() { + return task{task_handle::from_promise(*this)}; + } + + /** + * @brief Function called by the standard library when the coroutine reaches its last suspension point + * + * @return task_chain_final_awaiter Special object containing the chain resolution and clean-up logic. + */ + task_chain_final_awaiter final_suspend() noexcept { + return {}; + } + }; + + /** + * @brief Implementation of task_promise for void return type + */ + template <> + struct task_promise : task_promise_base { + /** + * @brief Function called by the standard library when the coroutine co_returns + * + * Does nothing but is required by the standard library. + */ + void return_void() {} + + /** + * @brief Function called by the standard library when the coroutine is created. + * + * @return task The coroutine object + */ + task get_return_object() { + return task{task_handle::from_promise(*this)}; + } + + /** + * @brief Function called by the standard library when the coroutine reaches its last suspension point + * + * @return task_chain_final_awaiter Special object containing the chain resolution and clean-up logic. + */ + task_chain_final_awaiter final_suspend() noexcept { + return {}; + } + }; + + template + void detail::task_chain_final_awaiter::await_suspend(detail::task_handle handle) noexcept { + task_promise &promise = handle.promise(); + std_coroutine::coroutine_handle<> parent = promise.parent; + + if (!promise.is_sync) { + std::unique_lock lock{promise.mutex}; + + if (promise.destroy) { + if (promise.exception && promise.exception_handler) + promise.exception_handler(promise.exception); + lock.unlock(); + handle.destroy(); + } + else + promise.destroy = true; // Send the destruction back to the task + } + if (parent) + parent.resume(); + } + } + + template +#ifndef _DOXYGEN_ + requires std::is_same_v || (!std::is_reference_v && std::is_move_constructible_v && std::is_move_assignable_v) +#endif + ReturnType task::await_resume() { + if (handle.promise().exception) // If we have an exception, rethrow + std::rethrow_exception(handle.promise().exception); + if constexpr (!std::is_same_v) // If we have a return type, return it and clean up our stored value + return std::forward(*std::exchange(handle.promise().value, std::nullopt)); + } + /** - * @brief A co_await-able struct which returns the result of stored api call when co_await-ed. Meant to be opaque to the user - * - * @tparam T The type of the function (lambda if auto-generated by the php script) handling the making of api call + * @brief A co_await-able object handling an API call. + * + * This class is the return type of the dpp::cluster::co_* methods, but it can also be created manually to wrap any async call. + * + * @remark - This object's methods, other than constructors and operators, should not be called directly. It is designed to be used with coroutine keywords such as co_await. + * @remark - This object must not be co_await-ed more than once. + * @remark - The coroutine may be resumed in another thread, do not rely on thread_local variables. + * @warning This feature is EXPERIMENTAL. The API may change at any time and there may be bugs. Please report any to GitHub issues or to the D++ Discord server. + * @tparam ReturnType The return type of the API call. Defaults to confirmation_callback_t */ - template - struct awaitable { + template + class awaitable { /** - * @brief Pointer to the nested promise object of the coroutine, used for storing and retrieving the result of an api call + * @brief Ref-counted callback, contains the callback logic and manages the lifetime of the callback data over multiple threads. */ - promise* p; - + struct shared_callback { + /** + * @brief State of the awaitable and its callback. + */ + struct callback_state { + enum state_t { + waiting, + done, + dangling + }; + + /** + * @brief Mutex to ensure the API result isn't set at the same time the coroutine is awaited and its value is checked, or the awaitable is destroyed + */ + std::mutex mutex{}; + + /** + * @brief Number of references to this callback state. + */ + int ref_count; + + /** + * @brief State of the awaitable and the API callback + */ + state_t state = waiting; + + /** + * @brief The stored result of the API call + */ + std::optional result = std::nullopt; + + /** + * @brief Handle to the coroutine co_await-ing on this API call + * + * @see std::coroutine_handle + */ + std::coroutine_handle<> coro_handle = nullptr; + }; + + /** + * @brief Callback function. + * + * @param cback The result of the API call. + */ + void operator()(const ReturnType &cback) const { + std::unique_lock lock{get_mutex()}; + + if (state->state == callback_state::dangling) // Awaitable is gone - likely an exception killed it or it was never co_await-ed + return; + state->result = cback; + state->state = callback_state::done; + if (state->coro_handle) { + auto handle = state->coro_handle; + state->coro_handle = nullptr; + lock.unlock(); + handle.resume(); + } + } + + /** + * @brief Main constructor, allocates a new callback_state object. + */ + shared_callback() : state{new callback_state{.ref_count = 1}} {} + + /** + * @brief Copy constructor. Takes shared ownership of the callback state, increasing the reference count. + */ + shared_callback(const shared_callback &other) { + this->operator=(other); + } + + /** + * @brief Move constructor. Transfers ownership from another object, leaving intact the reference count. The other object releases the callback state. + */ + shared_callback(shared_callback &&other) noexcept { + this->operator=(std::move(other)); + } + + /** + * @brief Copy assignment. Takes shared ownership of the callback state, increasing the reference count. + */ + shared_callback &operator=(const shared_callback &other) noexcept { + std::lock_guard lock{other.get_mutex()}; + + state = other.state; + ++state->ref_count; + return *this; + } + + /** + * @brief Move assignment. Transfers ownership from another object, leaving intact the reference count. The other object releases the callback state. + */ + shared_callback &operator=(shared_callback &&other) noexcept { + std::lock_guard lock{other.get_mutex()}; + + state = std::exchange(other.state, nullptr); + return *this; + } + + /** + * @brief Function called by the awaitable when it is destroyed when it was never co_awaited, signals to the callback to abort. + */ + void set_dangling() { + if (!state) // moved-from object + return; + std::lock_guard lock{get_mutex()}; + + if (state->state == callback_state::waiting) + state->state = callback_state::dangling; + } + + /** + * @brief Convenience function to get the shared callback state's mutex. + */ + std::mutex &get_mutex() const { + return (state->mutex); + } + + /** + * @brief Convenience function to get the shared callback state's result. + */ + std::optional &get_result() const { + return (state->result); + } + + /** + * @brief Destructor. Releases the held reference and destroys if no other references exist. + */ + ~shared_callback() { + if (!state) // Moved-from object + return; + + std::unique_lock lock{state->mutex}; + + if (state->ref_count) { + --(state->ref_count); + if (state->ref_count <= 0) {; + lock.unlock(); + delete state; + } + } + } + + callback_state *state; + }; + /** - * @brief Pointer to the cluster making the api request + * @brief Shared state of the awaitable and its callback, to be used across threads. */ - cluster* bot; + shared_callback api_callback; + public: /** - * @brief The function handling the making of request, using the cluster pointer + * @brief Construct an awaitable wrapping an object method, the call is made immediately by forwarding to std::invoke and can be awaited later to retrieve the result. + * + * @param obj The object to call the method on + * @param fun The method of the object to call. Its last parameter must be a callback taking a parameter of type ReturnType + * @param args Parameters to pass to the method, excluding the callback */ - T api_req; + template +#ifndef _DOXYGEN_ + requires std::invocable> +#endif + awaitable(Obj &&obj, Fun &&fun, Args&&... args) : api_callback{} { + std::invoke(std::forward(fun), std::forward(obj), std::forward(args)..., api_callback); + } /** - * @brief Construct a new awaitable object - * - * @param cl pointer to the cluster making the api request - * @param api_call a function to invoke with the cluster pointer, handles the making of request + * @brief Construct an awaitable wrapping an invokeable object, the call is made immediately by forwarding to std::invoke and can be awaited later to retrieve the result. + * + * @param fun The object to call using std::invoke. Its last parameter must be a callable taking a parameter of type ReturnType + * @param args Parameters to pass to the object, excluding the callback + */ + template +#ifndef _DOXYGEN_ + requires std::invocable> +#endif + awaitable(Fun &&fun, Args&&... args) : api_callback{} { + std::invoke(std::forward(fun), std::forward(args)..., api_callback); + } + + /** + * @brief Destructor. If any callback is pending it will be aborted. + * + */ + ~awaitable() { + api_callback.set_dangling(); + } + + /** + * @brief Copy constructor is disabled + */ + awaitable(const awaitable &) = delete; + + /** + * @brief Move constructor + * + * NOTE: Despite being marked noexcept, this function uses std::lock_guard which may throw. The implementation assumes this can never happen, hence noexcept. Report it if it does, as that would be a bug. + * + * @remark Using the moved-from awaitable after this function is undefined behavior. + * @param other The awaitable object to move the data from. */ - awaitable(cluster* cl, T api_call) : bot{cl}, api_req{api_call} {} + awaitable(awaitable &&other) noexcept = default; /** - * @brief First function called when this object is co_await-ed, its return type tells if the coroutine should be immediately suspended + * @brief Copy assignment is disabled + */ + awaitable &operator=(const awaitable &) = delete; + + /** + * @brief Move assignment operator. + * + * NOTE: Despite being marked noexcept, this function uses std::lock_guard which may throw. The implementation assumes this can never happen, hence noexcept. Report it if it does, as that would be a bug. + * + * @remark Using the moved-from awaitable after this function is undefined behavior. + * @param other The awaitable object to move the data from + */ + awaitable &operator=(awaitable &&other) noexcept = default; + + /** + * @brief First function called by the standard library when the object is co-awaited. * - * @return bool false, signifying immediate suspension + * Returns whether we already have the result of the API call and don't need to suspend the caller. + * + * @remark Do not call this manually, use the co_await keyword instead. + * @return bool Whether we already have the result of the API call or not */ bool await_ready() noexcept { - return false; + std::lock_guard lock{api_callback.get_mutex()}; + + return api_callback.get_result().has_value(); } /** - * @brief Function called when the coroutine is suspended, makes the api request and queues the resumption of the suspended coroutine, storing the result in promise object - * - * @param handle the handle to the suspended coroutine + * @brief Second function called by the standard library when the object is co-awaited, if await_ready returned false. + * + * Checks again for the presence of the result, if absent, signals to suspend and keep track of the calling coroutine for the callback to resume. + * + * @remark Do not call this manually, use the co_await keyword instead. + * @param handle The handle to the coroutine co_await-ing and being suspended */ - void await_suspend(handle_type handle) { - /* p = &handle.promise(); */ - /* if (!p->bot) p->bot = bot; */ - api_req([handle](const confirmation_callback_t& cback) { handle.promise().callback = cback; handle.resume(); }); + template + bool await_suspend(detail::task_handle handle) { + std::lock_guard lock{api_callback.get_mutex()}; + + if (api_callback.get_result().has_value()) + return false; // immediately resume the coroutine as we already have the result of the api call + handle.promise().is_sync = false; + api_callback.state->coro_handle = handle; + return true; // suspend the caller, the callback will resume it } /** - * @brief Function called when the coroutine is resumed by its handle, handles the retrieval and return of result from promise object - * - * @return confirmation_callback_t the result of the api call + * @brief Function called by the standard library when the awaitable is resumed. Its return value is what the whole co_await expression evaluates to + * + * @remark Do not call this manually, use the co_await keyword instead. + * @return ReturnType The result of the API call. */ - confirmation_callback_t await_resume() { - return p->callback; + ReturnType await_resume() { + return std::move(*api_callback.get_result()); } }; +}; +/** + * @brief Specialization of std::coroutine_traits, helps the standard library figure out a promise type from a coroutine function. + */ +template +struct dpp::detail::std_coroutine::coroutine_traits, Args...> { + using promise_type = dpp::detail::task_promise; }; -/* template<> */ -/* struct std::coroutine_traits { */ -/* using promise_type = dpp::promise; */ -/* }; */ #endif diff --git a/include/dpp/dispatcher.h b/include/dpp/dispatcher.h index 330466a47d..58c0643393 100644 --- a/include/dpp/dispatcher.h +++ b/include/dpp/dispatcher.h @@ -47,6 +47,10 @@ #include #include +#ifdef DPP_CORO +#include +#endif /* DPP_CORO */ + namespace dpp { /* Forward declaration */ @@ -474,6 +478,106 @@ struct DPP_EXPORT interaction_create_t : public event_dispatch_t { */ void delete_original_response(command_completion_event_t callback = utility::log_error()) const; +#ifdef DPP_CORO + /** + * @brief Acknowledge interaction without displaying a message to the user, + * for use with button and select menu components. + * + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_reply() const; + + /** + * @brief Send a reply for this interaction + * + * @param t Type of reply to send + * @param m Message object to send. Not all fields are supported by Discord. + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_reply(interaction_response_type t, const message & m) const; + + /** + * @brief Send a reply for this interaction + * + * @param t Type of reply to send + * @param mt The string value to send, for simple text only messages + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_reply(interaction_response_type t, const std::string & mt) const; + + /** + * @brief Send a reply for this interaction. + * Uses the default type of dpp::ir_channel_message_with_source, a simple message reply. + * + * @param m Message object to send. Not all fields are supported by Discord. + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_reply(const message & m) const; + + /** + * @brief Send a reply for this interaction. + * Uses the default type of dpp::ir_channel_message_with_source, a simple message reply. + * + * @param mt The string value to send, for simple text only messages + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_reply(const std::string & mt) const; + + /** + * @brief Reply to interaction with a dialog box + * + * @param mr Dialog box response to send + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_dialog(const interaction_modal_response& mr) const; + + /** + * @brief Edit the response for this interaction + * + * @param m Message object to send. Not all fields are supported by Discord. + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_edit_response(const message & m) const; + + /** + * @brief Edit the response for this interaction + * + * @param mt The string value to send, for simple text only messages + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_edit_response(const std::string & mt) const; + + /** + * @brief Set the bot to 'thinking' state where you have up to 15 minutes to respond + * + * @param ephemeral True if the thinking state should be ephemeral + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_thinking(bool ephemeral = false) const; + + /** + * @brief Get original response message for this interaction + * + * On success the result will contain a dpp::message object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_get_original_response() const; + + /** + * @brief Edit original response message for this interaction + * + * @param m Message object to send. Not all fields are supported by Discord. + * On success the result will contain a dpp::message object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_edit_original_response(const message & m) const; + + /** + * @brief Delete original response message for this interaction. This cannot be used on an ephemeral interaction response. + * + * On success the result will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + dpp::awaitable co_delete_original_response() const; +#endif /* DPP_CORO */ + /** * @brief command interaction */ diff --git a/include/dpp/event_router.h b/include/dpp/event_router.h index 4f901fd394..6e2b2208b7 100644 --- a/include/dpp/event_router.h +++ b/include/dpp/event_router.h @@ -105,14 +105,18 @@ template class event_router_t { #ifdef DPP_CORO /** * @brief Container for event listeners (coroutines only) + * + * Note: keep a listener's parameter as a value type, the event passed can die while a coroutine is suspended */ - std::map> coroutine_container; + std::map(T)>> coroutine_container; #else - /** - * @brief Dummy container to keep the struct size same - */ - std::map> dummy_container; -#endif +#ifndef _DOXYGEN_ + /** + * @brief Dummy container to keep the struct size same + */ + std::map> dummy_container; +#endif /* _DOXYGEN_ */ +#endif /* DPP_CORO */ /** @@ -160,12 +164,23 @@ template class event_router_t { } }); #ifdef DPP_CORO + auto coro_exception_handler = [from = event.from](std::exception_ptr ptr) { + try { + std::rethrow_exception(ptr); + } + catch (const std::exception &exception) { + if (from && from->creator) + from->creator->log(dpp::loglevel::ll_error, std::string{"Uncaught exception in event coroutine: "} + exception.what()); + } + }; std::for_each(coroutine_container.begin(), coroutine_container.end(), [&](auto &ev) { if (!event.is_cancelled()) { - ev.second(event); + dpp::task task = ev.second(event); + + task.on_exception(coro_exception_handler); } }); -#endif +#endif /* DPP_CORO */ }; /** @@ -177,7 +192,11 @@ template class event_router_t { */ bool empty() const { std::shared_lock l(lock); +#ifdef DPP_CORO + return dispatch_container.empty() && coroutine_container.empty(); +#else return dispatch_container.empty(); +#endif /* DPP_CORO */ } /** @@ -210,7 +229,7 @@ template class event_router_t { * The lambda should follow the signature specified when declaring * the event object and should take exactly one parameter derived * from event_dispatch_t. - * + * * @param func Function lambda to attach to event * @return event_handle An event handle unique to this event, used to * detach the listener from the event later if necessary. @@ -219,17 +238,27 @@ template class event_router_t { std::unique_lock l(lock); event_handle h = next_handle++; dispatch_container.emplace(h, func); - return h; + return h; } #ifdef DPP_CORO - event_handle co_attach(std::function func) { + /** + * @brief Attach a coroutine task to the event, adding a listener. + * The coroutine should follow the signature specified when declaring + * the event object and should take exactly one parameter derived + * from event_dispatch_t. + * + * @param func Coroutine task to attack to the event + * @return event_handle An event handle unique to this event, used to + * detach the listener from the event later if necessary. + */ + event_handle co_attach(std::function(T)> func) { std::unique_lock l(lock); event_handle h = next_handle++; coroutine_container.emplace(h, func); - return h; + return h; } -#endif +#endif /* DPP_CORO */ /** * @brief Detach a listener from the event using a previously obtained ID. * @@ -239,7 +268,11 @@ template class event_router_t { */ bool detach(const event_handle& handle) { std::unique_lock l(lock); +#ifdef DPP_CORO + return this->dispatch_container.erase(handle) || this->coroutine_container.erase(handle); +#else return this->dispatch_container.erase(handle); +#endif /* DPP_CORO */ } }; diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index dc1f7f2955..c98c575786 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -176,9 +176,9 @@ endif() if(MSVC) if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /Od /DEBUG /Zi /sdl /DFD_SETSIZE=1024") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Od /DEBUG /Zi /sdl /DFD_SETSIZE=1024") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /O2 /Oi /Oy /Gy /sdl /DFD_SETSIZE=1024") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /Oi /Oy /Gy /sdl /DFD_SETSIZE=1024") endif() if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /Zc:preprocessor") @@ -294,11 +294,16 @@ endif() if(DPP_CORO) message("-- ${Yellow}Enabled experimental coroutine support${ColourReset}") set(CMAKE_CXX_STANDARD 20) - target_compile_features(dpp PRIVATE cxx_std_20) + target_compile_features(dpp PUBLIC cxx_std_20) if(WIN32 AND NOT MINGW) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /await:strict") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines") + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") + target_link_libraries(dpp PUBLIC "c++abi") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines") + endif() endif() target_compile_definitions(dpp PUBLIC DPP_CORO) execute_process(WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.." diff --git a/src/dpp/cluster/timer.cpp b/src/dpp/cluster/timer.cpp index 816af14923..c843c04ad0 100644 --- a/src/dpp/cluster/timer.cpp +++ b/src/dpp/cluster/timer.cpp @@ -104,6 +104,17 @@ void cluster::tick_timers() { } } +#ifdef DPP_CORO +awaitable cluster::co_timer(uint64_t seconds) { + return {[this, seconds] (auto &&cb) { + start_timer([this, cb](dpp::timer handle) { + cb(handle); + stop_timer(handle); + }, seconds); + }}; +} +#endif + oneshot_timer::oneshot_timer(class cluster* cl, uint64_t duration, timer_callback_t callback) : owner(cl) { /* Create timer */ th = cl->start_timer([callback, this](dpp::timer timer_handle) { diff --git a/src/dpp/cluster_coro_calls.cpp b/src/dpp/cluster_coro_calls.cpp new file mode 100644 index 0000000000..5eea1a0bc4 --- /dev/null +++ b/src/dpp/cluster_coro_calls.cpp @@ -0,0 +1,782 @@ +/************************************************************************************ + * + * D++, A Lightweight C++ library for Discord + * + * Copyright 2022 Craig Edwards and D++ contributors + * (https://github.com/brainboxdotcc/DPP/graphs/contributors) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ************************************************************************************/ + + +/* Auto @generated by buildtools/make_coro_struct.php. + * + * DO NOT EDIT BY HAND! + * + * To re-generate this header file re-run the script! + */ +#ifdef DPP_CORO + +#include +#include +#include +#include + +namespace dpp { + +awaitable cluster::co_global_bulk_command_create(const std::vector &commands) { + return {this, static_cast &, command_completion_event_t)>(&cluster::global_bulk_command_create), commands}; +} + +awaitable cluster::co_global_command_create(const slashcommand &s) { + return {this, static_cast(&cluster::global_command_create), s}; +} + +awaitable cluster::co_global_command_get(snowflake id) { + return {this, static_cast(&cluster::global_command_get), id}; +} + +awaitable cluster::co_global_command_delete(snowflake id) { + return {this, static_cast(&cluster::global_command_delete), id}; +} + +awaitable cluster::co_global_command_edit(const slashcommand &s) { + return {this, static_cast(&cluster::global_command_edit), s}; +} + +awaitable cluster::co_global_commands_get() { + return {this, static_cast(&cluster::global_commands_get)}; +} + +awaitable cluster::co_guild_bulk_command_create(const std::vector &commands, snowflake guild_id) { + return {this, static_cast &, snowflake, command_completion_event_t)>(&cluster::guild_bulk_command_create), commands, guild_id}; +} + +awaitable cluster::co_guild_commands_get_permissions(snowflake guild_id) { + return {this, static_cast(&cluster::guild_commands_get_permissions), guild_id}; +} + +awaitable cluster::co_guild_bulk_command_edit_permissions(const std::vector &commands, snowflake guild_id) { + return {this, static_cast &, snowflake, command_completion_event_t)>(&cluster::guild_bulk_command_edit_permissions), commands, guild_id}; +} + +awaitable cluster::co_guild_command_create(const slashcommand &s, snowflake guild_id) { + return {this, static_cast(&cluster::guild_command_create), s, guild_id}; +} + +awaitable cluster::co_guild_command_delete(snowflake id, snowflake guild_id) { + return {this, static_cast(&cluster::guild_command_delete), id, guild_id}; +} + +awaitable cluster::co_guild_command_edit_permissions(const slashcommand &s, snowflake guild_id) { + return {this, static_cast(&cluster::guild_command_edit_permissions), s, guild_id}; +} + +awaitable cluster::co_guild_command_get(snowflake id, snowflake guild_id) { + return {this, static_cast(&cluster::guild_command_get), id, guild_id}; +} + +awaitable cluster::co_guild_command_get_permissions(snowflake id, snowflake guild_id) { + return {this, static_cast(&cluster::guild_command_get_permissions), id, guild_id}; +} + +awaitable cluster::co_guild_command_edit(const slashcommand &s, snowflake guild_id) { + return {this, static_cast(&cluster::guild_command_edit), s, guild_id}; +} + +awaitable cluster::co_guild_commands_get(snowflake guild_id) { + return {this, static_cast(&cluster::guild_commands_get), guild_id}; +} + +awaitable cluster::co_interaction_response_create(snowflake interaction_id, const std::string &token, const interaction_response &r) { + return {this, static_cast(&cluster::interaction_response_create), interaction_id, token, r}; +} + +awaitable cluster::co_interaction_response_edit(const std::string &token, const message &m) { + return {this, static_cast(&cluster::interaction_response_edit), token, m}; +} + +awaitable cluster::co_interaction_response_get_original(const std::string &token) { + return {this, static_cast(&cluster::interaction_response_get_original), token}; +} + +awaitable cluster::co_interaction_followup_create(const std::string &token, const message &m) { + return {this, static_cast(&cluster::interaction_followup_create), token, m}; +} + +awaitable cluster::co_interaction_followup_edit_original(const std::string &token, const message &m) { + return {this, static_cast(&cluster::interaction_followup_edit_original), token, m}; +} + +awaitable cluster::co_interaction_followup_delete(const std::string &token) { + return {this, static_cast(&cluster::interaction_followup_delete), token}; +} + +awaitable cluster::co_interaction_followup_edit(const std::string &token, const message &m) { + return {this, static_cast(&cluster::interaction_followup_edit), token, m}; +} + +awaitable cluster::co_interaction_followup_get(const std::string &token, snowflake message_id) { + return {this, static_cast(&cluster::interaction_followup_get), token, message_id}; +} + +awaitable cluster::co_interaction_followup_get_original(const std::string &token) { + return {this, static_cast(&cluster::interaction_followup_get_original), token}; +} + +awaitable cluster::co_automod_rules_get(snowflake guild_id) { + return {this, static_cast(&cluster::automod_rules_get), guild_id}; +} + +awaitable cluster::co_automod_rule_get(snowflake guild_id, snowflake rule_id) { + return {this, static_cast(&cluster::automod_rule_get), guild_id, rule_id}; +} + +awaitable cluster::co_automod_rule_create(snowflake guild_id, const automod_rule& r) { + return {this, static_cast(&cluster::automod_rule_create), guild_id, r}; +} + +awaitable cluster::co_automod_rule_edit(snowflake guild_id, const automod_rule& r) { + return {this, static_cast(&cluster::automod_rule_edit), guild_id, r}; +} + +awaitable cluster::co_automod_rule_delete(snowflake guild_id, snowflake rule_id) { + return {this, static_cast(&cluster::automod_rule_delete), guild_id, rule_id}; +} + +awaitable cluster::co_channel_create(const class channel &c) { + return {this, static_cast(&cluster::channel_create), c}; +} + +awaitable cluster::co_channel_delete_permission(const class channel &c, snowflake overwrite_id) { + return {this, static_cast(&cluster::channel_delete_permission), c, overwrite_id}; +} + +awaitable cluster::co_channel_delete(snowflake channel_id) { + return {this, static_cast(&cluster::channel_delete), channel_id}; +} + +awaitable cluster::co_channel_edit_permissions(const class channel &c, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member) { + return {this, static_cast(&cluster::channel_edit_permissions), c, overwrite_id, allow, deny, member}; +} + +awaitable cluster::co_channel_edit_permissions(const snowflake channel_id, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member) { + return {this, static_cast(&cluster::channel_edit_permissions), channel_id, overwrite_id, allow, deny, member}; +} + +awaitable cluster::co_channel_edit_positions(const std::vector &c) { + return {this, static_cast &, command_completion_event_t)>(&cluster::channel_edit_positions), c}; +} + +awaitable cluster::co_channel_edit(const class channel &c) { + return {this, static_cast(&cluster::channel_edit), c}; +} + +awaitable cluster::co_channel_follow_news(const class channel &c, snowflake target_channel_id) { + return {this, static_cast(&cluster::channel_follow_news), c, target_channel_id}; +} + +awaitable cluster::co_channel_get(snowflake c) { + return {this, static_cast(&cluster::channel_get), c}; +} + +awaitable cluster::co_channel_invite_create(const class channel &c, const class invite &i) { + return {this, static_cast(&cluster::channel_invite_create), c, i}; +} + +awaitable cluster::co_channel_invites_get(const class channel &c) { + return {this, static_cast(&cluster::channel_invites_get), c}; +} + +awaitable cluster::co_channel_typing(const class channel &c) { + return {this, static_cast(&cluster::channel_typing), c}; +} + +awaitable cluster::co_channel_typing(snowflake cid) { + return {this, static_cast(&cluster::channel_typing), cid}; +} + +awaitable cluster::co_channels_get(snowflake guild_id) { + return {this, static_cast(&cluster::channels_get), guild_id}; +} + +awaitable cluster::co_create_dm_channel(snowflake user_id) { + return {this, static_cast(&cluster::create_dm_channel), user_id}; +} + +awaitable cluster::co_current_user_get_dms() { + return {this, static_cast(&cluster::current_user_get_dms)}; +} + +awaitable cluster::co_direct_message_create(snowflake user_id, const message &m) { + return {this, static_cast(&cluster::direct_message_create), user_id, m}; +} + +awaitable cluster::co_gdm_add(snowflake channel_id, snowflake user_id, const std::string &access_token, const std::string &nick) { + return {this, static_cast(&cluster::gdm_add), channel_id, user_id, access_token, nick}; +} + +awaitable cluster::co_gdm_remove(snowflake channel_id, snowflake user_id) { + return {this, static_cast(&cluster::gdm_remove), channel_id, user_id}; +} + +awaitable cluster::co_guild_emoji_create(snowflake guild_id, const class emoji& newemoji) { + return {this, static_cast(&cluster::guild_emoji_create), guild_id, newemoji}; +} + +awaitable cluster::co_guild_emoji_delete(snowflake guild_id, snowflake emoji_id) { + return {this, static_cast(&cluster::guild_emoji_delete), guild_id, emoji_id}; +} + +awaitable cluster::co_guild_emoji_edit(snowflake guild_id, const class emoji& newemoji) { + return {this, static_cast(&cluster::guild_emoji_edit), guild_id, newemoji}; +} + +awaitable cluster::co_guild_emoji_get(snowflake guild_id, snowflake emoji_id) { + return {this, static_cast(&cluster::guild_emoji_get), guild_id, emoji_id}; +} + +awaitable cluster::co_guild_emojis_get(snowflake guild_id) { + return {this, static_cast(&cluster::guild_emojis_get), guild_id}; +} + +awaitable cluster::co_get_gateway_bot() { + return {this, static_cast(&cluster::get_gateway_bot)}; +} + +awaitable cluster::co_guild_current_member_edit(snowflake guild_id, const std::string &nickname) { + return {this, static_cast(&cluster::guild_current_member_edit), guild_id, nickname}; +} + +awaitable cluster::co_guild_auditlog_get(snowflake guild_id, snowflake user_id, uint32_t action_type, snowflake before, snowflake after, uint32_t limit) { + return {this, static_cast(&cluster::guild_auditlog_get), guild_id, user_id, action_type, before, after, limit}; +} + +awaitable cluster::co_guild_ban_add(snowflake guild_id, snowflake user_id, uint32_t delete_message_seconds) { + return {this, static_cast(&cluster::guild_ban_add), guild_id, user_id, delete_message_seconds}; +} + +awaitable cluster::co_guild_ban_delete(snowflake guild_id, snowflake user_id) { + return {this, static_cast(&cluster::guild_ban_delete), guild_id, user_id}; +} + +awaitable cluster::co_guild_create(const class guild &g) { + return {this, static_cast(&cluster::guild_create), g}; +} + +awaitable cluster::co_guild_delete(snowflake guild_id) { + return {this, static_cast(&cluster::guild_delete), guild_id}; +} + +awaitable cluster::co_guild_delete_integration(snowflake guild_id, snowflake integration_id) { + return {this, static_cast(&cluster::guild_delete_integration), guild_id, integration_id}; +} + +awaitable cluster::co_guild_edit(const class guild &g) { + return {this, static_cast(&cluster::guild_edit), g}; +} + +awaitable cluster::co_guild_edit_widget(snowflake guild_id, const class guild_widget &gw) { + return {this, static_cast(&cluster::guild_edit_widget), guild_id, gw}; +} + +awaitable cluster::co_guild_get_ban(snowflake guild_id, snowflake user_id) { + return {this, static_cast(&cluster::guild_get_ban), guild_id, user_id}; +} + +awaitable cluster::co_guild_get_bans(snowflake guild_id, snowflake before, snowflake after, snowflake limit) { + return {this, static_cast(&cluster::guild_get_bans), guild_id, before, after, limit}; +} + +awaitable cluster::co_guild_get(snowflake guild_id) { + return {this, static_cast(&cluster::guild_get), guild_id}; +} + +awaitable cluster::co_guild_get_integrations(snowflake guild_id) { + return {this, static_cast(&cluster::guild_get_integrations), guild_id}; +} + +awaitable cluster::co_guild_get_preview(snowflake guild_id) { + return {this, static_cast(&cluster::guild_get_preview), guild_id}; +} + +awaitable cluster::co_guild_get_vanity(snowflake guild_id) { + return {this, static_cast(&cluster::guild_get_vanity), guild_id}; +} + +awaitable cluster::co_guild_get_widget(snowflake guild_id) { + return {this, static_cast(&cluster::guild_get_widget), guild_id}; +} + +awaitable cluster::co_guild_modify_integration(snowflake guild_id, const class integration &i) { + return {this, static_cast(&cluster::guild_modify_integration), guild_id, i}; +} + +awaitable cluster::co_guild_get_prune_counts(snowflake guild_id, const struct prune& pruneinfo) { + return {this, static_cast(&cluster::guild_get_prune_counts), guild_id, pruneinfo}; +} + +awaitable cluster::co_guild_begin_prune(snowflake guild_id, const struct prune& pruneinfo) { + return {this, static_cast(&cluster::guild_begin_prune), guild_id, pruneinfo}; +} + +awaitable cluster::co_guild_set_nickname(snowflake guild_id, const std::string &nickname) { + return {this, static_cast(&cluster::guild_set_nickname), guild_id, nickname}; +} + +awaitable cluster::co_guild_sync_integration(snowflake guild_id, snowflake integration_id) { + return {this, static_cast(&cluster::guild_sync_integration), guild_id, integration_id}; +} + +awaitable cluster::co_guild_add_member(const guild_member& gm, const std::string &access_token) { + return {this, static_cast(&cluster::guild_add_member), gm, access_token}; +} + +awaitable cluster::co_guild_edit_member(const guild_member& gm) { + return {this, static_cast(&cluster::guild_edit_member), gm}; +} + +awaitable cluster::co_guild_get_member(snowflake guild_id, snowflake user_id) { + return {this, static_cast(&cluster::guild_get_member), guild_id, user_id}; +} + +awaitable cluster::co_guild_get_members(snowflake guild_id, uint16_t limit, snowflake after) { + return {this, static_cast(&cluster::guild_get_members), guild_id, limit, after}; +} + +awaitable cluster::co_guild_member_add_role(snowflake guild_id, snowflake user_id, snowflake role_id) { + return {this, static_cast(&cluster::guild_member_add_role), guild_id, user_id, role_id}; +} + +awaitable cluster::co_guild_member_delete(snowflake guild_id, snowflake user_id) { + return {this, static_cast(&cluster::guild_member_delete), guild_id, user_id}; +} + +awaitable cluster::co_guild_member_kick(snowflake guild_id, snowflake user_id) { + return {this, static_cast(&cluster::guild_member_kick), guild_id, user_id}; +} + +awaitable cluster::co_guild_member_timeout(snowflake guild_id, snowflake user_id, time_t communication_disabled_until) { + return {this, static_cast(&cluster::guild_member_timeout), guild_id, user_id, communication_disabled_until}; +} + +awaitable cluster::co_guild_member_delete_role(snowflake guild_id, snowflake user_id, snowflake role_id) { + return {this, static_cast(&cluster::guild_member_delete_role), guild_id, user_id, role_id}; +} + +awaitable cluster::co_guild_member_remove_role(snowflake guild_id, snowflake user_id, snowflake role_id) { + return {this, static_cast(&cluster::guild_member_remove_role), guild_id, user_id, role_id}; +} + +awaitable cluster::co_guild_member_move(const snowflake channel_id, const snowflake guild_id, const snowflake user_id) { + return {this, static_cast(&cluster::guild_member_move), channel_id, guild_id, user_id}; +} + +awaitable cluster::co_guild_search_members(snowflake guild_id, const std::string& query, uint16_t limit) { + return {this, static_cast(&cluster::guild_search_members), guild_id, query, limit}; +} + +awaitable cluster::co_guild_get_invites(snowflake guild_id) { + return {this, static_cast(&cluster::guild_get_invites), guild_id}; +} + +awaitable cluster::co_invite_delete(const std::string &invitecode) { + return {this, static_cast(&cluster::invite_delete), invitecode}; +} + +awaitable cluster::co_invite_get(const std::string &invite_code) { + return {this, static_cast(&cluster::invite_get), invite_code}; +} + +awaitable cluster::co_message_add_reaction(const struct message &m, const std::string &reaction) { + return {this, static_cast(&cluster::message_add_reaction), m, reaction}; +} + +awaitable cluster::co_message_add_reaction(snowflake message_id, snowflake channel_id, const std::string &reaction) { + return {this, static_cast(&cluster::message_add_reaction), message_id, channel_id, reaction}; +} + +awaitable cluster::co_message_create(const message &m) { + return {this, static_cast(&cluster::message_create), m}; +} + +awaitable cluster::co_message_crosspost(snowflake message_id, snowflake channel_id) { + return {this, static_cast(&cluster::message_crosspost), message_id, channel_id}; +} + +awaitable cluster::co_message_delete_all_reactions(const struct message &m) { + return {this, static_cast(&cluster::message_delete_all_reactions), m}; +} + +awaitable cluster::co_message_delete_all_reactions(snowflake message_id, snowflake channel_id) { + return {this, static_cast(&cluster::message_delete_all_reactions), message_id, channel_id}; +} + +awaitable cluster::co_message_delete_bulk(const std::vector& message_ids, snowflake channel_id) { + return {this, static_cast&, snowflake, command_completion_event_t)>(&cluster::message_delete_bulk), message_ids, channel_id}; +} + +awaitable cluster::co_message_delete(snowflake message_id, snowflake channel_id) { + return {this, static_cast(&cluster::message_delete), message_id, channel_id}; +} + +awaitable cluster::co_message_delete_own_reaction(const struct message &m, const std::string &reaction) { + return {this, static_cast(&cluster::message_delete_own_reaction), m, reaction}; +} + +awaitable cluster::co_message_delete_own_reaction(snowflake message_id, snowflake channel_id, const std::string &reaction) { + return {this, static_cast(&cluster::message_delete_own_reaction), message_id, channel_id, reaction}; +} + +awaitable cluster::co_message_delete_reaction(const struct message &m, snowflake user_id, const std::string &reaction) { + return {this, static_cast(&cluster::message_delete_reaction), m, user_id, reaction}; +} + +awaitable cluster::co_message_delete_reaction(snowflake message_id, snowflake channel_id, snowflake user_id, const std::string &reaction) { + return {this, static_cast(&cluster::message_delete_reaction), message_id, channel_id, user_id, reaction}; +} + +awaitable cluster::co_message_delete_reaction_emoji(const struct message &m, const std::string &reaction) { + return {this, static_cast(&cluster::message_delete_reaction_emoji), m, reaction}; +} + +awaitable cluster::co_message_delete_reaction_emoji(snowflake message_id, snowflake channel_id, const std::string &reaction) { + return {this, static_cast(&cluster::message_delete_reaction_emoji), message_id, channel_id, reaction}; +} + +awaitable cluster::co_message_edit(const message &m) { + return {this, static_cast(&cluster::message_edit), m}; +} + +awaitable cluster::co_message_get(snowflake message_id, snowflake channel_id) { + return {this, static_cast(&cluster::message_get), message_id, channel_id}; +} + +awaitable cluster::co_message_get_reactions(const struct message &m, const std::string &reaction, snowflake before, snowflake after, snowflake limit) { + return {this, static_cast(&cluster::message_get_reactions), m, reaction, before, after, limit}; +} + +awaitable cluster::co_message_get_reactions(snowflake message_id, snowflake channel_id, const std::string &reaction, snowflake before, snowflake after, snowflake limit) { + return {this, static_cast(&cluster::message_get_reactions), message_id, channel_id, reaction, before, after, limit}; +} + +awaitable cluster::co_message_pin(snowflake channel_id, snowflake message_id) { + return {this, static_cast(&cluster::message_pin), channel_id, message_id}; +} + +awaitable cluster::co_messages_get(snowflake channel_id, snowflake around, snowflake before, snowflake after, uint64_t limit) { + return {this, static_cast(&cluster::messages_get), channel_id, around, before, after, limit}; +} + +awaitable cluster::co_message_unpin(snowflake channel_id, snowflake message_id) { + return {this, static_cast(&cluster::message_unpin), channel_id, message_id}; +} + +awaitable cluster::co_channel_pins_get(snowflake channel_id) { + return {this, static_cast(&cluster::channel_pins_get), channel_id}; +} + +awaitable cluster::co_role_create(const class role &r) { + return {this, static_cast(&cluster::role_create), r}; +} + +awaitable cluster::co_role_delete(snowflake guild_id, snowflake role_id) { + return {this, static_cast(&cluster::role_delete), guild_id, role_id}; +} + +awaitable cluster::co_role_edit(const class role &r) { + return {this, static_cast(&cluster::role_edit), r}; +} + +awaitable cluster::co_roles_edit_position(snowflake guild_id, const std::vector &roles) { + return {this, static_cast &, command_completion_event_t)>(&cluster::roles_edit_position), guild_id, roles}; +} + +awaitable cluster::co_roles_get(snowflake guild_id) { + return {this, static_cast(&cluster::roles_get), guild_id}; +} + +awaitable cluster::co_application_role_connection_get(snowflake application_id) { + return {this, static_cast(&cluster::application_role_connection_get), application_id}; +} + +awaitable cluster::co_application_role_connection_update(snowflake application_id, const std::vector &connection_metadata) { + return {this, static_cast &, command_completion_event_t)>(&cluster::application_role_connection_update), application_id, connection_metadata}; +} + +awaitable cluster::co_user_application_role_connection_get(snowflake application_id) { + return {this, static_cast(&cluster::user_application_role_connection_get), application_id}; +} + +awaitable cluster::co_user_application_role_connection_update(snowflake application_id, const application_role_connection &connection) { + return {this, static_cast(&cluster::user_application_role_connection_update), application_id, connection}; +} + +awaitable cluster::co_guild_events_get(snowflake guild_id) { + return {this, static_cast(&cluster::guild_events_get), guild_id}; +} + +awaitable cluster::co_guild_event_create(const scheduled_event& event) { + return {this, static_cast(&cluster::guild_event_create), event}; +} + +awaitable cluster::co_guild_event_delete(snowflake event_id, snowflake guild_id) { + return {this, static_cast(&cluster::guild_event_delete), event_id, guild_id}; +} + +awaitable cluster::co_guild_event_edit(const scheduled_event& event) { + return {this, static_cast(&cluster::guild_event_edit), event}; +} + +awaitable cluster::co_guild_event_get(snowflake guild_id, snowflake event_id) { + return {this, static_cast(&cluster::guild_event_get), guild_id, event_id}; +} + +awaitable cluster::co_stage_instance_create(const stage_instance& si) { + return {this, static_cast(&cluster::stage_instance_create), si}; +} + +awaitable cluster::co_stage_instance_get(const snowflake channel_id) { + return {this, static_cast(&cluster::stage_instance_get), channel_id}; +} + +awaitable cluster::co_stage_instance_edit(const stage_instance& si) { + return {this, static_cast(&cluster::stage_instance_edit), si}; +} + +awaitable cluster::co_stage_instance_delete(const snowflake channel_id) { + return {this, static_cast(&cluster::stage_instance_delete), channel_id}; +} + +awaitable cluster::co_guild_sticker_create(sticker &s) { + return {this, static_cast(&cluster::guild_sticker_create), s}; +} + +awaitable cluster::co_guild_sticker_delete(snowflake sticker_id, snowflake guild_id) { + return {this, static_cast(&cluster::guild_sticker_delete), sticker_id, guild_id}; +} + +awaitable cluster::co_guild_sticker_get(snowflake id, snowflake guild_id) { + return {this, static_cast(&cluster::guild_sticker_get), id, guild_id}; +} + +awaitable cluster::co_guild_sticker_modify(sticker &s) { + return {this, static_cast(&cluster::guild_sticker_modify), s}; +} + +awaitable cluster::co_guild_stickers_get(snowflake guild_id) { + return {this, static_cast(&cluster::guild_stickers_get), guild_id}; +} + +awaitable cluster::co_nitro_sticker_get(snowflake id) { + return {this, static_cast(&cluster::nitro_sticker_get), id}; +} + +awaitable cluster::co_sticker_packs_get() { + return {this, static_cast(&cluster::sticker_packs_get)}; +} + +awaitable cluster::co_guild_create_from_template(const std::string &code, const std::string &name) { + return {this, static_cast(&cluster::guild_create_from_template), code, name}; +} + +awaitable cluster::co_guild_template_create(snowflake guild_id, const std::string &name, const std::string &description) { + return {this, static_cast(&cluster::guild_template_create), guild_id, name, description}; +} + +awaitable cluster::co_guild_template_delete(snowflake guild_id, const std::string &code) { + return {this, static_cast(&cluster::guild_template_delete), guild_id, code}; +} + +awaitable cluster::co_guild_template_modify(snowflake guild_id, const std::string &code, const std::string &name, const std::string &description) { + return {this, static_cast(&cluster::guild_template_modify), guild_id, code, name, description}; +} + +awaitable cluster::co_guild_templates_get(snowflake guild_id) { + return {this, static_cast(&cluster::guild_templates_get), guild_id}; +} + +awaitable cluster::co_guild_template_sync(snowflake guild_id, const std::string &code) { + return {this, static_cast(&cluster::guild_template_sync), guild_id, code}; +} + +awaitable cluster::co_template_get(const std::string &code) { + return {this, static_cast(&cluster::template_get), code}; +} + +awaitable cluster::co_current_user_join_thread(snowflake thread_id) { + return {this, static_cast(&cluster::current_user_join_thread), thread_id}; +} + +awaitable cluster::co_current_user_leave_thread(snowflake thread_id) { + return {this, static_cast(&cluster::current_user_leave_thread), thread_id}; +} + +awaitable cluster::co_threads_get_active(snowflake guild_id) { + return {this, static_cast(&cluster::threads_get_active), guild_id}; +} + +awaitable cluster::co_threads_get_joined_private_archived(snowflake channel_id, snowflake before_id, uint16_t limit) { + return {this, static_cast(&cluster::threads_get_joined_private_archived), channel_id, before_id, limit}; +} + +awaitable cluster::co_threads_get_private_archived(snowflake channel_id, time_t before_timestamp, uint16_t limit) { + return {this, static_cast(&cluster::threads_get_private_archived), channel_id, before_timestamp, limit}; +} + +awaitable cluster::co_threads_get_public_archived(snowflake channel_id, time_t before_timestamp, uint16_t limit) { + return {this, static_cast(&cluster::threads_get_public_archived), channel_id, before_timestamp, limit}; +} + +awaitable cluster::co_thread_member_get(const snowflake thread_id, const snowflake user_id) { + return {this, static_cast(&cluster::thread_member_get), thread_id, user_id}; +} + +awaitable cluster::co_thread_members_get(snowflake thread_id) { + return {this, static_cast(&cluster::thread_members_get), thread_id}; +} + +awaitable cluster::co_thread_create_in_forum(const std::string& thread_name, snowflake channel_id, const message& msg, auto_archive_duration_t auto_archive_duration, uint16_t rate_limit_per_user, std::vector applied_tags) { + return {this, static_cast, command_completion_event_t)>(&cluster::thread_create_in_forum), thread_name, channel_id, msg, auto_archive_duration, rate_limit_per_user, applied_tags}; +} + +awaitable cluster::co_thread_create(const std::string& thread_name, snowflake channel_id, uint16_t auto_archive_duration, channel_type thread_type, bool invitable, uint16_t rate_limit_per_user) { + return {this, static_cast(&cluster::thread_create), thread_name, channel_id, auto_archive_duration, thread_type, invitable, rate_limit_per_user}; +} + +awaitable cluster::co_thread_edit(const thread &t) { + return {this, static_cast(&cluster::thread_edit), t}; +} + +awaitable cluster::co_thread_create_with_message(const std::string& thread_name, snowflake channel_id, snowflake message_id, uint16_t auto_archive_duration, uint16_t rate_limit_per_user) { + return {this, static_cast(&cluster::thread_create_with_message), thread_name, channel_id, message_id, auto_archive_duration, rate_limit_per_user}; +} + +awaitable cluster::co_thread_member_add(snowflake thread_id, snowflake user_id) { + return {this, static_cast(&cluster::thread_member_add), thread_id, user_id}; +} + +awaitable cluster::co_thread_member_remove(snowflake thread_id, snowflake user_id) { + return {this, static_cast(&cluster::thread_member_remove), thread_id, user_id}; +} + +awaitable cluster::co_current_user_edit(const std::string &nickname, const std::string& image_blob, const image_type type) { + return {this, static_cast(&cluster::current_user_edit), nickname, image_blob, type}; +} + +awaitable cluster::co_current_application_get() { + return {this, static_cast(&cluster::current_application_get)}; +} + +awaitable cluster::co_current_user_get() { + return {this, static_cast(&cluster::current_user_get)}; +} + +awaitable cluster::co_current_user_set_voice_state(snowflake guild_id, snowflake channel_id, bool suppress, time_t request_to_speak_timestamp) { + return {this, static_cast(&cluster::current_user_set_voice_state), guild_id, channel_id, suppress, request_to_speak_timestamp}; +} + +awaitable cluster::co_user_set_voice_state(snowflake user_id, snowflake guild_id, snowflake channel_id, bool suppress) { + return {this, static_cast(&cluster::user_set_voice_state), user_id, guild_id, channel_id, suppress}; +} + +awaitable cluster::co_current_user_connections_get() { + return {this, static_cast(&cluster::current_user_connections_get)}; +} + +awaitable cluster::co_current_user_get_guilds() { + return {this, static_cast(&cluster::current_user_get_guilds)}; +} + +awaitable cluster::co_current_user_leave_guild(snowflake guild_id) { + return {this, static_cast(&cluster::current_user_leave_guild), guild_id}; +} + +awaitable cluster::co_user_get(snowflake user_id) { + return {this, static_cast(&cluster::user_get), user_id}; +} + +awaitable cluster::co_user_get_cached(snowflake user_id) { + return {this, static_cast(&cluster::user_get_cached), user_id}; +} + +awaitable cluster::co_get_voice_regions() { + return {this, static_cast(&cluster::get_voice_regions)}; +} + +awaitable cluster::co_guild_get_voice_regions(snowflake guild_id) { + return {this, static_cast(&cluster::guild_get_voice_regions), guild_id}; +} + +awaitable cluster::co_create_webhook(const class webhook &w) { + return {this, static_cast(&cluster::create_webhook), w}; +} + +awaitable cluster::co_delete_webhook(snowflake webhook_id) { + return {this, static_cast(&cluster::delete_webhook), webhook_id}; +} + +awaitable cluster::co_delete_webhook_message(const class webhook &wh, snowflake message_id, snowflake thread_id) { + return {this, static_cast(&cluster::delete_webhook_message), wh, message_id, thread_id}; +} + +awaitable cluster::co_delete_webhook_with_token(snowflake webhook_id, const std::string &token) { + return {this, static_cast(&cluster::delete_webhook_with_token), webhook_id, token}; +} + +awaitable cluster::co_edit_webhook(const class webhook& wh) { + return {this, static_cast(&cluster::edit_webhook), wh}; +} + +awaitable cluster::co_edit_webhook_message(const class webhook &wh, const struct message& m, snowflake thread_id) { + return {this, static_cast(&cluster::edit_webhook_message), wh, m, thread_id}; +} + +awaitable cluster::co_edit_webhook_with_token(const class webhook& wh) { + return {this, static_cast(&cluster::edit_webhook_with_token), wh}; +} + +awaitable cluster::co_execute_webhook(const class webhook &wh, const struct message& m, bool wait, snowflake thread_id, const std::string& thread_name) { + return {this, static_cast(&cluster::execute_webhook), wh, m, wait, thread_id, thread_name}; +} + +awaitable cluster::co_get_channel_webhooks(snowflake channel_id) { + return {this, static_cast(&cluster::get_channel_webhooks), channel_id}; +} + +awaitable cluster::co_get_guild_webhooks(snowflake guild_id) { + return {this, static_cast(&cluster::get_guild_webhooks), guild_id}; +} + +awaitable cluster::co_get_webhook(snowflake webhook_id) { + return {this, static_cast(&cluster::get_webhook), webhook_id}; +} + +awaitable cluster::co_get_webhook_message(const class webhook &wh, snowflake message_id, snowflake thread_id) { + return {this, static_cast(&cluster::get_webhook_message), wh, message_id, thread_id}; +} + +awaitable cluster::co_get_webhook_with_token(snowflake webhook_id, const std::string &token) { + return {this, static_cast(&cluster::get_webhook_with_token), webhook_id, token}; +} + + +}; + +/* End of auto-generated definitions */ +dpp::awaitable dpp::cluster::co_request(const std::string &url, http_method method, const std::string &postdata, const std::string &mimetype, const std::multimap &headers) { + return awaitable{[&](auto &&cc) { this->request(url, method, cc, postdata, mimetype, headers); }}; +} + +#endif diff --git a/src/dpp/dispatcher.cpp b/src/dpp/dispatcher.cpp index 7ab6b68385..cecdce02fd 100644 --- a/src/dpp/dispatcher.cpp +++ b/src/dpp/dispatcher.cpp @@ -208,6 +208,57 @@ void interaction_create_t::delete_original_response(command_completion_event_t c }); } + +#ifdef DPP_CORO +awaitable interaction_create_t::co_reply() const { + return dpp::awaitable{[this](auto &&cb) { this->reply(cb); }}; +} + +awaitable interaction_create_t::co_reply(interaction_response_type t, const message & m) const { + return dpp::awaitable{[&, this](auto &&cb) { this->reply(t, m, cb); }}; +} + +awaitable interaction_create_t::co_reply(interaction_response_type t, const std::string & mt) const { + return dpp::awaitable{[&, this](auto &&cb) { this->reply(t, mt, cb); }}; +} + +awaitable interaction_create_t::co_reply(const message & m) const { + return dpp::awaitable{[&, this](auto &&cb) { this->reply(m, cb); }}; +} + +awaitable interaction_create_t::co_reply(const std::string & mt) const { + return dpp::awaitable{[&, this](auto &&cb) { this->reply(mt, cb); }}; +} + +awaitable interaction_create_t::co_dialog(const interaction_modal_response& mr) const { + return dpp::awaitable{[&, this](auto &&cb) { this->dialog(mr, cb); }}; +} + +awaitable interaction_create_t::co_edit_response(const message & m) const { + return dpp::awaitable{[&, this](auto &&cb) { this->edit_response(m, cb); }}; +} + +awaitable interaction_create_t::co_edit_response(const std::string & mt) const { + return dpp::awaitable{[&, this](auto &&cb) { this->edit_response(mt, cb); }}; +} + +awaitable interaction_create_t::co_thinking(bool ephemeral) const { + return dpp::awaitable{[&, this](auto &&cb) { this->thinking(ephemeral, cb); }}; +} + +awaitable interaction_create_t::co_get_original_response() const { + return dpp::awaitable{[&, this](auto &&cb) { this->get_original_response(cb); }}; +} + +awaitable interaction_create_t::co_edit_original_response(const message & m) const { + return dpp::awaitable{[&, this](auto &&cb) { this->edit_original_response(m, cb); }}; +} + +awaitable interaction_create_t::co_delete_original_response() const { + return dpp::awaitable{[&, this](auto &&cb) { this->delete_original_response(cb); }}; +} +#endif /* DPP_CORO */ + command_value interaction_create_t::get_parameter(const std::string& name) const { const command_interaction ci = command.get_command_interaction(); From bb5af55a84dc27fed08593cb6b5ae82a80836a80 Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 19 Jul 2023 11:21:56 +0200 Subject: [PATCH 084/101] feat: added role flag `IN_PROMPT` (#728) --- include/dpp/cluster.h | 4 ++-- include/dpp/role.h | 6 ++++++ src/dpp/role.cpp | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index b9c64bcd8c..a3f157e20b 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -3153,7 +3153,7 @@ class DPP_EXPORT cluster { * @brief Get public archived threads in a channel (Sorted by archive_timestamp in descending order) * @see https://discord.com/developers/docs/resources/channel#list-public-archived-threads * @param channel_id Channel to get public archived threads for - * @param before_timestamp Get threads before this timestamp + * @param before_timestamp Get threads archived before this timestamp * @param limit Number of threads to get * @param callback Function to call when the API call completes * On success the callback will contain a dpp::thread_map object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). @@ -3164,7 +3164,7 @@ class DPP_EXPORT cluster { * @brief Get private archived threads in a channel (Sorted by archive_timestamp in descending order) * @see https://discord.com/developers/docs/resources/channel#list-private-archived-threads * @param channel_id Channel to get public archived threads for - * @param before_timestamp Get threads before this timestamp + * @param before_timestamp Get threads archived before this timestamp * @param limit Number of threads to get * @param callback Function to call when the API call completes * On success the callback will contain a dpp::thread_map object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). diff --git a/include/dpp/role.h b/include/dpp/role.h index fd16b39122..3a313ccc62 100644 --- a/include/dpp/role.h +++ b/include/dpp/role.h @@ -37,6 +37,7 @@ enum role_flags : uint8_t { r_premium_subscriber = 0b00001000, //!< Whether this is the guild's booster role r_available_for_purchase = 0b00010000, //!< Whether the role is available for purchase r_guild_connections = 0b00100000, //!< Whether the role is a guild's linked role + r_in_prompt = 0b01000000, //!< Whether the role can be selected by members in an onboarding prompt }; /** @@ -287,6 +288,11 @@ class DPP_EXPORT role : public managed, public json_interface { * @return bool True if the role is a linked role */ bool is_linked() const; + /** + * @brief True if the role can be selected by members in an onboarding prompt + * @return bool True if the role can be selected by members in an onboarding prompt + */ + bool is_selectable_in_prompt() const; /** * @brief True if has create instant invite permission * @note Having the administrator permission causes this method to always return true diff --git a/src/dpp/role.cpp b/src/dpp/role.cpp index dc11b7772c..7739a3ef19 100644 --- a/src/dpp/role.cpp +++ b/src/dpp/role.cpp @@ -32,6 +32,11 @@ namespace dpp { using json = nlohmann::json; +/* A mapping of discord's flag values to our bitmap (they're different bit positions to fit other stuff in) */ +std::map rolemap = { + { 1 << 0, dpp::r_in_prompt }, +}; + role::role() : managed(), guild_id(0), @@ -70,6 +75,14 @@ role& role::fill_from_json(snowflake _guild_id, nlohmann::json* j) this->colour = int32_not_null(j, "color"); this->position = int8_not_null(j, "position"); this->permissions = snowflake_not_null(j, "permissions"); + + uint8_t f = int8_not_null(j, "flags"); + for (auto & flag : rolemap) { + if (f & flag.first) { + this->flags |= flag.second; + } + } + this->flags |= bool_not_null(j, "hoist") ? dpp::r_hoist : 0; this->flags |= bool_not_null(j, "managed") ? dpp::r_managed : 0; this->flags |= bool_not_null(j, "mentionable") ? dpp::r_mentionable : 0; @@ -167,6 +180,10 @@ bool role::is_linked() const { return this->flags & dpp::r_guild_connections; } +bool role::is_selectable_in_prompt() const { + return this->flags & dpp::r_in_prompt; +} + bool role::has_create_instant_invite() const { return has_administrator() || permissions.has(p_create_instant_invite); } From 5895803a0c2ebe169c19df789c821e3ee384b613 Mon Sep 17 00:00:00 2001 From: Miuna <809711+Mishura4@users.noreply.github.com> Date: Wed, 19 Jul 2023 05:53:52 -0400 Subject: [PATCH 085/101] test: add extended unit tests mode (#731) --- src/unittest/test.cpp | 127 +++++++++++++++++++++++++------------- src/unittest/test.h | 8 +-- src/unittest/unittest.cpp | 65 ++++++++++++------- 3 files changed, 130 insertions(+), 70 deletions(-) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index d4393cf9c7..bd391f2bae 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -23,9 +23,15 @@ #include #include +namespace { + /** + * @brief Thread emoji - https://www.compart.com/en/unicode/U+1F9F5 + */ + inline const std::string THREAD_EMOJI = "\xF0\x9F\xA7\xB5"; +} /* Unit tests go here */ -int main() +int main(int argc, char *argv[]) { std::string token(get_token()); @@ -33,7 +39,9 @@ int main() if (offline) { std::cout << "Running offline unit tests only.\n"; } else { - std::cout << "Running offline and online unit tests. Guild ID: " << TEST_GUILD_ID << " Text Channel ID: " << TEST_TEXT_CHANNEL_ID << " VC ID: " << TEST_VC_ID << " User ID: " << TEST_USER_ID << " Event ID: " << TEST_EVENT_ID << "\n"; + if (argc > 1 && std::find_if(argv + 1, argv + argc, [](const char *a){ return (std::strcmp(a, "full") == 0); }) != argv + argc) + extended = true; + std::cout << "Running offline and " << (extended ? "extended" : "limited") << " online unit tests. Guild ID: " << TEST_GUILD_ID << " Text Channel ID: " << TEST_TEXT_CHANNEL_ID << " VC ID: " << TEST_VC_ID << " User ID: " << TEST_USER_ID << " Event ID: " << TEST_EVENT_ID << "\n"; } std::string test_to_escape = "*** _This is a test_ ***\n```cpp\n\ @@ -800,6 +808,10 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } void test_pin() { + if (!extended) { + set_pin_tested(); + return; + } set_test("MESSAGEPIN", false); set_test("MESSAGEUNPIN", false); bot.message_pin(channel_id, message_id, [=](const dpp::confirmation_callback_t &callback) { @@ -859,12 +871,13 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b bool members_tested = false; bool messages_tested = false; bool events_tested = false; + bool get_active_tested = false; uint32_t events_tested_mask = 0; uint32_t events_to_test_mask = 0; void delete_if_done() { - if (edit_tested && members_tested && messages_tested && events_tested) { + if (edit_tested && members_tested && messages_tested && events_tested && get_active_tested) { bot.channel_delete(thread_id); } } @@ -896,6 +909,15 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b delete_if_done(); } + void set_get_active_tested() + { + if (get_active_tested) { + return; + } + get_active_tested = true; + delete_if_done(); + } + void set_messages_tested() { if (messages_tested) { @@ -912,7 +934,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } events_tested_mask |= flag; for (uint32_t i = 1; i < EVENT_END; i <<= 1) { - if ((events_tested_mask & i) != i) + if ((events_to_test_mask & i) && (events_tested_mask & i) != i) return; } set_events_tested(); @@ -961,17 +983,42 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } } - void test_members(const dpp::thread &thread) - { + void test_get_active(const dpp::thread &thread) + { std::lock_guard lock{mutex}; - set_test("THREAD_MEMBER_ADD", false); - set_test("THREAD_MEMBER_GET", false); - set_test("THREAD_MEMBERS_GET", false); - set_test("THREAD_MEMBER_REMOVE", false); - set_test("THREAD_MEMBERS_ADD_EVENT", false); - set_test("THREAD_MEMBERS_REMOVE_EVENT", false); + set_test("THREAD_GET_ACTIVE", false); + bot.threads_get_active(TEST_GUILD_ID, [this](const dpp::confirmation_callback_t &callback) { + std::lock_guard lock{mutex}; + if (!callback.is_error()) { + const auto &threads = callback.get(); + if (auto thread_it = threads.find(thread_id); thread_it != threads.end()) { + const auto &thread = thread_it->second.active_thread; + const auto &member = thread_it->second.bot_member; + if (thread.id == thread_id && member.has_value() && member->user_id == bot.me.id) { + set_test("THREAD_GET_ACTIVE", true); + } + } + } + set_get_active_tested(); + }); + } + + void test_members(const dpp::thread &thread) + { + std::lock_guard lock{mutex}; + if (!members_tested) { + if (!extended) { + set_members_tested(); + return; + } + set_test("THREAD_MEMBER_ADD", false); + set_test("THREAD_MEMBER_GET", false); + set_test("THREAD_MEMBERS_GET", false); + set_test("THREAD_MEMBER_REMOVE", false); + set_test("THREAD_MEMBERS_ADD_EVENT", false); + set_test("THREAD_MEMBERS_REMOVE_EVENT", false); bot.thread_member_add(thread_id, TEST_USER_ID, [this](const dpp::confirmation_callback_t &callback) { std::lock_guard lock{mutex}; if (callback.is_error()) { @@ -998,34 +1045,27 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b return; } set_test("THREAD_MEMBERS_GET", true); - bot.threads_get_active(TEST_GUILD_ID, [this](const dpp::confirmation_callback_t &callback) { + bot.thread_member_remove(thread_id, TEST_USER_ID, [this](const dpp::confirmation_callback_t &callback) { std::lock_guard lock{mutex}; if (!callback.is_error()) { - const auto &threads = callback.get(); - if (auto thread_it = threads.find(thread_id); thread_it != threads.end()) { - const auto &thread = thread_it->second.active_thread; - const auto &member = thread_it->second.bot_member; - if (thread.id == thread_id && member.has_value() && member->user_id == bot.me.id) { - set_test("THREAD_GET_ACTIVE", true); - } - } + set_test("THREAD_MEMBER_REMOVE", true); } - bot.thread_member_remove(thread_id, TEST_USER_ID, [this](const dpp::confirmation_callback_t &callback) { - std::lock_guard lock{mutex}; - if (!callback.is_error()) { - set_test("THREAD_MEMBER_REMOVE", true); - } - set_members_tested(); - }); + set_members_tested(); }); }); }); }); } - } + } void test_messages(const dpp::thread &thread) { + if (!extended) { + set_messages_tested(); + set_events_tested(); + return; + } + std::lock_guard lock{mutex}; set_test("THREAD_MESSAGE", false); set_test("THREAD_MESSAGE_CREATE_EVENT", false); @@ -1083,14 +1123,10 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b }); } - void confirm_message_receive() - { - std::lock_guard lock{mutex}; - } - void run(const dpp::thread &thread) { thread_id = thread.id; + test_get_active(thread); test_edit(thread); test_members(thread); test_messages(thread); @@ -1357,18 +1393,25 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } bot.invite_get(created.code, [&bot, created](const dpp::confirmation_callback_t &event) { - if (event.is_error()) return; + if (!event.is_error()) { + auto retrieved = event.get(); + if (retrieved.code == created.code && retrieved.guild_id == created.guild_id && retrieved.channel_id == created.channel_id && retrieved.inviter.id == created.inviter.id) { + if (retrieved.destination_guild.flags & dpp::g_community) + set_test("INVITE_GET", retrieved.expires_at == 0); + else + set_test("INVITE_GET", true); - auto retrieved = event.get(); - if (retrieved.code == created.code && retrieved.expires_at == 0 && retrieved.guild_id == created.guild_id && retrieved.channel_id == created.channel_id && retrieved.inviter.id == created.inviter.id) { - set_test("INVITE_GET", true); + } + else { + set_test("INVITE_GET", false); + } + } else { + set_test("INVITE_GET", false); } set_test("INVITE_DELETE_EVENT", false); - bot.invite_delete(retrieved.code, [](const dpp::confirmation_callback_t &event) { - if (!event.is_error()) { - set_test("INVITE_DELETE", true); - } + bot.invite_delete(created.code, [](const dpp::confirmation_callback_t &event) { + set_test("INVITE_DELETE", !event.is_error()); }); }); }); diff --git a/src/unittest/test.h b/src/unittest/test.h index 331002a997..317996a938 100644 --- a/src/unittest/test.h +++ b/src/unittest/test.h @@ -40,6 +40,8 @@ enum test_type_t { tt_offline, /* A test that requires discord connectivity */ tt_online, + /* A test that requires both online and full tests to be enabled */ + tt_extended }; /* Represents a test case */ @@ -75,6 +77,7 @@ extern dpp::snowflake TEST_EVENT_ID; /* True if we skip tt_online tests */ extern bool offline; +extern bool extended; /** * @brief Perform a test of a REST base API call with one parameter @@ -314,8 +317,3 @@ inline constexpr user_project_id_t get_user_snowflake; inline constexpr auto is_owner = [](auto &&user) noexcept { return get_user_snowflake(user) == TEST_USER_ID; }; - -/** - * @brief Thread emoji - https://www.compart.com/en/unicode/U+1F9F5 - */ -inline const std::string THREAD_EMOJI = "\xF0\x9F\xA7\xB5"; diff --git a/src/unittest/unittest.cpp b/src/unittest/unittest.cpp index 70c9b53788..6c909c9f77 100644 --- a/src/unittest/unittest.cpp +++ b/src/unittest/unittest.cpp @@ -33,8 +33,6 @@ std::map tests = { {"MESSAGECREATE", {tt_online, "Creation of a channel message", false, false}}, {"MESSAGEEDIT", {tt_online, "Editing a channel message", false, false}}, {"EDITEVENT", {tt_online, "Message edit event", false, false}}, - {"MESSAGEPIN", {tt_online, "Pinning a channel message", false, false}}, - {"MESSAGEUNPIN", {tt_online, "Unpinning a channel message", false, false}}, {"MESSAGEDELETE", {tt_online, "Deletion of a channel message", false, false}}, {"MESSAGERECEIVE", {tt_online, "Receipt of a created message", false, false}}, {"MESSAGEFILE", {tt_online, "Message attachment send and check", false, false}}, @@ -103,22 +101,8 @@ std::map tests = { {"THREAD_DELETE_EVENT", {tt_online, "cluster::on_thread_delete event", false, false}}, {"THREAD_EDIT", {tt_online, "cluster::thread_edit", false, false}}, {"THREAD_UPDATE_EVENT", {tt_online, "cluster::on_thread_update event", false, false}}, - {"THREAD_MEMBER_ADD", {tt_online, "cluster::thread_member_add", false, false}}, - {"THREAD_MEMBER_GET", {tt_online, "cluster::thread_member_get", false, false}}, - {"THREAD_MEMBERS_GET", {tt_online, "cluster::thread_members_get", false, false}}, - {"THREAD_MEMBER_REMOVE", {tt_online, "cluster::thread_member_remove", false, false}}, - {"THREAD_MEMBERS_ADD_EVENT", {tt_online, "cluster::on_thread_members_update event with member addition", false, false}}, - {"THREAD_MEMBERS_REMOVE_EVENT", {tt_online, "cluster::on_thread_members_update event with member removal", false, false}}, - {"THREAD_CREATE_MESSAGE", {tt_online, "cluster::thread_create_with_message", false, false}}, {"THREAD_GET_ACTIVE", {tt_online, "cluster::threads_get_active", false, false}}, - {"THREAD_MESSAGE", {tt_online, "message manipulation in thread", false, false}}, - {"THREAD_MESSAGE_CREATE_EVENT", {tt_online, "cluster::on_message_create in thread", false, false}}, - {"THREAD_MESSAGE_EDIT_EVENT", {tt_online, "cluster::on_message_edit in thread", false, false}}, - {"THREAD_MESSAGE_DELETE_EVENT", {tt_online, "cluster::on_message_delete in thread", false, false}}, - {"THREAD_MESSAGE_REACT_ADD_EVENT", {tt_online, "cluster::on_reaction_add in thread", false, false}}, - {"THREAD_MESSAGE_REACT_REMOVE_EVENT", {tt_online, "cluster::on_reaction_remove in thread", false, false}}, - {"VOICE_CHANNEL_CREATE", {tt_online, "creating a voice channel", false, false}}, {"VOICE_CHANNEL_EDIT", {tt_online, "editing the created voice channel", false, false}}, {"VOICE_CHANNEL_DELETE", {tt_online, "deleting the created voice channel", false, false}}, @@ -169,10 +153,31 @@ std::map tests = { {"INVITE_CREATE", {tt_online, "cluster::channel_invite_create", false, false}}, {"INVITE_GET", {tt_online, "cluster::invite_get", false, false}}, {"INVITE_DELETE", {tt_online, "cluster::invite_delete", false, false}}, + + /* Extended set -- Less important, skipped on the master branch due to rate limits and GitHub actions limitations*/ + /* To execute, run unittests with "full" command line argument */ + {"MESSAGEPIN", {tt_extended, "Pinning a channel message", false, false}}, + {"MESSAGEUNPIN", {tt_extended, "Unpinning a channel message", false, false}}, + + {"THREAD_MEMBER_ADD", {tt_extended, "cluster::thread_member_add", false, false}}, + {"THREAD_MEMBER_GET", {tt_extended, "cluster::thread_member_get", false, false}}, + {"THREAD_MEMBERS_GET", {tt_extended, "cluster::thread_members_get", false, false}}, + {"THREAD_MEMBER_REMOVE", {tt_extended, "cluster::thread_member_remove", false, false}}, + {"THREAD_MEMBERS_ADD_EVENT", {tt_extended, "cluster::on_thread_members_update event with member addition", false, false}}, + {"THREAD_MEMBERS_REMOVE_EVENT", {tt_extended, "cluster::on_thread_members_update event with member removal", false, false}}, + {"THREAD_CREATE_MESSAGE", {tt_extended, "cluster::thread_create_with_message", false, false}}, + + {"THREAD_MESSAGE", {tt_extended, "message manipulation in thread", false, false}}, + {"THREAD_MESSAGE_CREATE_EVENT", {tt_extended, "cluster::on_message_create in thread", false, false}}, + {"THREAD_MESSAGE_EDIT_EVENT", {tt_extended, "cluster::on_message_edit in thread", false, false}}, + {"THREAD_MESSAGE_DELETE_EVENT", {tt_extended, "cluster::on_message_delete in thread", false, false}}, + {"THREAD_MESSAGE_REACT_ADD_EVENT", {tt_extended, "cluster::on_reaction_add in thread", false, false}}, + {"THREAD_MESSAGE_REACT_REMOVE_EVENT", {tt_extended, "cluster::on_reaction_remove in thread", false, false}}, }; double start = dpp::utility::time_f(); bool offline = false; +bool extended = false; dpp::snowflake TEST_GUILD_ID = std::stoull(SAFE_GETENV("TEST_GUILD_ID")); dpp::snowflake TEST_TEXT_CHANNEL_ID = std::stoull(SAFE_GETENV("TEST_TEXT_CHANNEL_ID")); @@ -216,7 +221,7 @@ int test_summary() { std::cout << "\u001b[37;1m\n\nUNIT TEST SUMMARY\n==================\n\u001b[0m"; for (auto & t : tests) { bool test_skipped = false; - if (t.second.type == tt_online && offline) { + if ((t.second.type == tt_online && offline) || (t.second.type == tt_extended && !extended)) { skipped++; test_skipped = true; } else { @@ -232,9 +237,18 @@ int test_summary() { return failed; } +namespace { + std::string get_testdata_dir() { + char *env_var = getenv("TEST_DATA_DIR"); + + return (env_var ? env_var : "../../testdata/"); + } +} + std::vector load_test_audio() { std::vector testaudio; - std::ifstream input ("../../testdata/Robot.pcm", std::ios::in|std::ios::binary|std::ios::ate); + std::string dir = get_testdata_dir(); + std::ifstream input (dir + "Robot.pcm", std::ios::in|std::ios::binary|std::ios::ate); if (input.is_open()) { size_t testaudio_size = input.tellg(); testaudio.resize(testaudio_size); @@ -243,7 +257,7 @@ std::vector load_test_audio() { input.close(); } else { - std::cout << "ERROR: Can't load ../../testdata/Robot.pcm\n"; + std::cout << "ERROR: Can't load " + dir + "Robot.pcm\n"; exit(1); } return testaudio; @@ -251,7 +265,8 @@ std::vector load_test_audio() { std::vector load_test_image() { std::vector testimage; - std::ifstream input ("../../testdata/DPP-Logo.png", std::ios::in|std::ios::binary|std::ios::ate); + std::string dir = get_testdata_dir(); + std::ifstream input (dir + "DPP-Logo.png", std::ios::in|std::ios::binary|std::ios::ate); if (input.is_open()) { size_t testimage_size = input.tellg(); testimage.resize(testimage_size); @@ -260,7 +275,7 @@ std::vector load_test_image() { input.close(); } else { - std::cout << "ERROR: Can't load ../../testdata/DPP-Logo.png\n"; + std::cout << "ERROR: Can't load " + dir + "DPP-Logo.png\n"; exit(1); } return testimage; @@ -287,9 +302,9 @@ void wait_for_tests() { for (auto & t : tests) { if (t.second.executed == true) { executed++; - } else if (offline && t.second.type == tt_online && !t.second.executed) { + } else if (!t.second.executed && ((offline && t.second.type == tt_online) || (!extended && t.second.type == tt_extended))) { executed++; - t.second.success = true; + t.second.executed = true; std::cout << "[" << std::fixed << std::setprecision(3) << get_time() << "]: " << "[\u001b[33mSKIPPED\u001b[0m] " << t.second.description << "\n"; } } @@ -300,4 +315,8 @@ void wait_for_tests() { std::this_thread::sleep_for(std::chrono::seconds(1)); ticks++; } + for (auto &t : tests) { + if (!t.second.executed) + std::cout << "[" << std::fixed << std::setprecision(3) << get_time() << "]: " << "[\u001b[31mTIMEOUT\u001b[0m] " << t.second.description << "\n"; + } } From 8f2e61a3abb218b1a089ea2888abc6039f19f46b Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 19 Jul 2023 12:11:34 +0200 Subject: [PATCH 086/101] fix: user::format_username now returns the global_name if it's set (#733) --- src/dpp/user.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dpp/user.cpp b/src/dpp/user.cpp index b9faa8767d..75f3c24bfa 100644 --- a/src/dpp/user.cpp +++ b/src/dpp/user.cpp @@ -127,6 +127,9 @@ std::string user::get_default_avatar_url() const { } std::string user::format_username() const { + if (!global_name.empty()) { + return global_name; + } return username + '#' + leading_zeroes(discriminator, 4); } From 61affb0a9aba405cd454765342fb7048d04b7f61 Mon Sep 17 00:00:00 2001 From: Anton <101461652+MCausc78@users.noreply.github.com> Date: Wed, 19 Jul 2023 13:50:13 +0300 Subject: [PATCH 087/101] feat: Add flags and `is_remix()` to `dpp::attachment` (#727) Co-authored-by: MCausc78 --- include/dpp/message.h | 24 ++++++++++++++++++++++++ include/dpp/permissions.h | 19 +++++++++++++++++++ src/dpp/discordclient.cpp | 2 +- src/dpp/message.cpp | 16 ++++++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/include/dpp/message.h b/include/dpp/message.h index 5f11536f98..22fb5c7146 100644 --- a/include/dpp/message.h +++ b/include/dpp/message.h @@ -766,6 +766,14 @@ struct DPP_EXPORT reaction { ~reaction() = default; }; +/** + * @brief Bitmask flags for a dpp::attachment + */ +enum attachment_flags : uint8_t { + /// this attachment has been edited using the remix feature on mobile + a_is_remix = 1 << 2, +}; + /** * @brief Represents an attachment in a dpp::message */ @@ -794,6 +802,8 @@ struct DPP_EXPORT attachment { double duration_secs; /** base64 encoded bytearray representing a sampled waveform (currently for voice messages) */ std::string waveform; + /** Flags. Made of bits in dpp::attachment_flags */ + uint8_t flags; /** Owning message */ struct message* owner; @@ -824,6 +834,13 @@ struct DPP_EXPORT attachment { * itself has an owning cluster, this method will throw a dpp::logic_exception when called. */ void download(http_completion_event callback) const; + + /** + * @brief Returns true if remixed + * + * @return true if remixed + */ + bool is_remix() const; }; /** @@ -1523,6 +1540,13 @@ struct DPP_EXPORT message : public managed { * @return true if message is a DM */ bool is_dm() const; + + /** + * @brief Returns true if message has remixed attachment + * + * @return true if message has remixed attachment + */ + bool has_remix_attachment() const; }; /** A group of messages */ diff --git a/include/dpp/permissions.h b/include/dpp/permissions.h index 7e027ccf18..f1d1865cdd 100644 --- a/include/dpp/permissions.h +++ b/include/dpp/permissions.h @@ -146,6 +146,25 @@ class DPP_EXPORT permission { return (value & (0 | ... | values)) == (0 | ... | values); } + /** + * @brief Check for permission flags set. It uses the Bitwise AND operator + * @tparam T one or more uint64_t permission bits + * @param values The permissions (from dpp::permissions) to check for + * + * **Example:** + * + * ```cpp + * bool is_mod = permission.has_any(dpp::p_administrator, dpp::p_ban_members); + * // Returns true if the permission bitmask contains p_administrator or p_ban_members + * ``` + * + * @return bool True if it has any the given permissions + */ + template + constexpr bool has_any(T... values) const noexcept { + return (value & (0 | ... | values)) != 0; + } + /** * @brief Add a permission with the Bitwise OR operation * @tparam T one or more uint64_t permission bits diff --git a/src/dpp/discordclient.cpp b/src/dpp/discordclient.cpp index f0742b5dd3..77399eaf99 100644 --- a/src/dpp/discordclient.cpp +++ b/src/dpp/discordclient.cpp @@ -645,7 +645,7 @@ void discord_client::disconnect_voice_internal(snowflake guild_id, bool emit_jso std::unique_lock lock(voice_mutex); auto v = connecting_voice_channels.find(guild_id); if (v != connecting_voice_channels.end()) { - log(ll_debug, "Disconnecting voice, guild: {}" + std::to_string(guild_id)); + log(ll_debug, "Disconnecting voice, guild: " + std::to_string(guild_id)); if (emit_json) { queue_message(jsonobj_to_string(json({ { "op", 4 }, diff --git a/src/dpp/message.cpp b/src/dpp/message.cpp index 3f4331ad05..ec6a36fa1b 100644 --- a/src/dpp/message.cpp +++ b/src/dpp/message.cpp @@ -18,6 +18,7 @@ * limitations under the License. * ************************************************************************************/ +#include #include #include #include @@ -768,6 +769,7 @@ attachment::attachment(struct message* o) , width(0) , height(0) , ephemeral(false) + , flags(0) , owner(o) { } @@ -785,6 +787,7 @@ attachment::attachment(struct message* o, json *j) : attachment(o) { this->ephemeral = bool_not_null(j, "ephemeral"); this->duration_secs = double_not_null(j, "duration_secs"); this->waveform = string_not_null(j, "waveform"); + this->flags = int8_not_null(j, "flags"); } void attachment::download(http_completion_event callback) const { @@ -797,6 +800,10 @@ void attachment::download(http_completion_event callback) const { } } +bool attachment::is_remix() const { + return flags & a_is_remix; +} + std::string message::build_json(bool with_id, bool is_interaction_response) const { /* This is the basics. once it works, expand on it. */ json j({ @@ -1117,6 +1124,15 @@ message& message::fill_from_json(json* d, cache_policy_t cp) { return *this; } +bool message::has_remix_attachment() const { + return std::any_of( + attachments.begin(), + attachments.end(), + [](const auto& a) -> bool { + return a.is_remix(); + }); +} + sticker::sticker() : managed(0), pack_id(0), type(st_standard), format_type(sf_png), available(true), guild_id(0), sort_value(0) { } From a377f78a507e0bc253154b71844c18f2f58d4358 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 11:51:43 +0100 Subject: [PATCH 088/101] docs: bump doxygen-awesome-css from `df83fbf` to `00a52f6` (#735) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- doxygen-awesome-css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doxygen-awesome-css b/doxygen-awesome-css index df83fbf22c..00a52f6c74 160000 --- a/doxygen-awesome-css +++ b/doxygen-awesome-css @@ -1 +1 @@ -Subproject commit df83fbf22cfff76b875c13d324baf584c74e96d0 +Subproject commit 00a52f6c74065ffbd836cbd791ddfe8edf2836b8 From 55e676fed4c95aa0cef689ce846979900adddf85 Mon Sep 17 00:00:00 2001 From: Anton <101461652+MCausc78@users.noreply.github.com> Date: Wed, 19 Jul 2023 14:29:40 +0300 Subject: [PATCH 089/101] feat: Add `bool is_coro_enabled()` function to `dpp::utility` namespace (#737) Co-authored-by: MCausc78 Co-authored-by: Brain --- include/dpp/utility.h | 7 +++++++ src/dpp/utility.cpp | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/include/dpp/utility.h b/include/dpp/utility.h index 3b978c58de..45eeb5d89d 100644 --- a/include/dpp/utility.h +++ b/include/dpp/utility.h @@ -253,6 +253,13 @@ namespace dpp { */ bool DPP_EXPORT has_voice(); + /** + * @brief Returns true if D++ was built with coroutine support + * + * @return bool True if coroutines are supported + */ + bool DPP_EXPORT is_coro_enabled(); + /** * @brief Convert a byte count to display value * diff --git a/src/dpp/utility.cpp b/src/dpp/utility.cpp index 8ffe07905c..3ea688099a 100644 --- a/src/dpp/utility.cpp +++ b/src/dpp/utility.cpp @@ -115,6 +115,14 @@ namespace dpp { #endif } + bool is_coro_enabled() { +#ifdef DPP_CORO + return true; +#else + return false; +#endif + } + std::string current_date_time() { #ifdef _WIN32 std::time_t curr_time = time(nullptr); From a29192a8c0caf5a7db3d84244f7c6d3effe28b81 Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 19 Jul 2023 15:19:47 +0200 Subject: [PATCH 090/101] docs: documented deprecation policy (#738) --- docpages/05_deprecated_list.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 docpages/05_deprecated_list.md diff --git a/docpages/05_deprecated_list.md b/docpages/05_deprecated_list.md new file mode 100644 index 0000000000..0beefb210d --- /dev/null +++ b/docpages/05_deprecated_list.md @@ -0,0 +1,7 @@ +\page deprecated Deprecated List + +### Deprecation policy + +We keep things marked as depreciated until next major API version. +If discord removes the function, we may remove the method from the library or replace it with a thrown exception depending on the type of function and at our discretion. +Such functions which are made to throw will then be removed at the next major API version. \ No newline at end of file From bca166648b3280f77670b8ddbd9301d535dfbf0b Mon Sep 17 00:00:00 2001 From: Phil Date: Thu, 20 Jul 2023 21:31:04 +0200 Subject: [PATCH 091/101] docs: documentation for unicode_emoji namespace (#739) --- buildtools/emojis.php | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/buildtools/emojis.php b/buildtools/emojis.php index 65bcb2175b..0bc412847c 100644 --- a/buildtools/emojis.php +++ b/buildtools/emojis.php @@ -2,10 +2,28 @@ echo "-- Autogenrating include/dpp/unicode_emoji.h\n"; -$header = "#pragma once\n\nnamespace dpp { namespace unicode_emoji {\n"; +$url = "https://raw.githubusercontent.com/ArkinSolomon/discord-emoji-converter/master/emojis.json"; + +$header = << + * #include + * ``` + */ +namespace unicode_emoji { + +END; /* This JSON is generated originally via the NPM package maintained by Discord themselves at https://www.npmjs.com/package/discord-emoji */ -$emojis = json_decode(file_get_contents("https://raw.githubusercontent.com/ArkinSolomon/discord-emoji-converter/master/emojis.json")); +$emojis = json_decode(file_get_contents($url)); if ($emojis) { foreach ($emojis as $name=>$code) { if (preg_match("/^\d+/", $name)) { From 32d12f0290d71a777f59bb0a1d07b46af04e524c Mon Sep 17 00:00:00 2001 From: Brain Date: Sat, 22 Jul 2023 09:29:37 +0100 Subject: [PATCH 092/101] Update CONTRIBUTING.md - add rules about not just using automated tools to generate bad prs --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 24ab40d357..d9c1945675 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,4 +17,4 @@ When contributing to this repository, please do not feel intimidated! We welcome build will compile on various platforms before release and makes precompiled versions of the library. 8. If you are on the discord server for the project and your PR is accepted, let a moderator know and we will grant you the 'Contributors' role. - +9. Automated changes e.g. via grammarly or a static analysis tool will not usually be accepted into the code without proper thought out justification (by a human being, not an AI or an App) as to why the changes are required. Generally a PR should do more than fix a single spelling error for example as this just takes precious time for something which could be resolved a direct commit to the dev branch. From d50cb195a26a9913ce7d1a28bd528b0b2a9e5d30 Mon Sep 17 00:00:00 2001 From: Brain Date: Sat, 22 Jul 2023 09:31:30 +0100 Subject: [PATCH 093/101] Update CONTRIBUTING.md remove reference to contrib role --- CONTRIBUTING.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d9c1945675..e0dc64c4d8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,6 +15,4 @@ When contributing to this repository, please do not feel intimidated! We welcome including indent style etc). 7. Your PR must pass the CI actions before being allowed to be merged. Our PR actions check that the build will compile on various platforms before release and makes precompiled versions of the library. -8. If you are on the discord server for the project and your PR is accepted, let a moderator know and we - will grant you the 'Contributors' role. -9. Automated changes e.g. via grammarly or a static analysis tool will not usually be accepted into the code without proper thought out justification (by a human being, not an AI or an App) as to why the changes are required. Generally a PR should do more than fix a single spelling error for example as this just takes precious time for something which could be resolved a direct commit to the dev branch. +8. Automated changes e.g. via grammarly or a static analysis tool will not usually be accepted into the code without proper thought out justification (by a human being, not an AI or an App) as to why the changes are required. Generally a PR should do more than fix a single spelling error for example as this just takes precious time for something which could be resolved a direct commit to the dev branch. From 70f68d8ee41391201b1ef151f5835f01c66e0b7e Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 24 Jul 2023 13:07:56 +0200 Subject: [PATCH 094/101] docs: some tweaks in code examples (#742) --- .../context_menus.md | 2 +- .../upload_parameter.md | 43 ++++++++----------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/docpages/example_programs/interactions_and_components/context_menus.md b/docpages/example_programs/interactions_and_components/context_menus.md index 5da0ed8807..08f206fa37 100644 --- a/docpages/example_programs/interactions_and_components/context_menus.md +++ b/docpages/example_programs/interactions_and_components/context_menus.md @@ -20,7 +20,7 @@ int main() if (dpp::run_once()) { /* Register the command */ bot.guild_command_create( - dpp::slashcommand() + dpp::slashcommand() .set_type(dpp::ctxm_user) .set_name("High Five") .set_application_id(bot.me.id), diff --git a/docpages/example_programs/interactions_and_components/upload_parameter.md b/docpages/example_programs/interactions_and_components/upload_parameter.md index 27b107cfe1..8b8f2656b5 100644 --- a/docpages/example_programs/interactions_and_components/upload_parameter.md +++ b/docpages/example_programs/interactions_and_components/upload_parameter.md @@ -12,37 +12,32 @@ something like `dpp::cluster::request()`. int main() { - dpp::cluster bot("token"); + dpp::cluster bot("token"); - bot.on_log(dpp::utility::cout_logger()); + bot.on_log(dpp::utility::cout_logger()); - bot.on_slashcommand([&bot](const dpp::slashcommand_t & event) { - if (event.command.type == dpp::it_application_command) { - dpp::command_interaction cmd_data = std::get(event.command.data); - if (cmd_data.name == "show") { - dpp::snowflake file_id = std::get(event.get_parameter("file")); - auto iter = event.command.resolved.attachments.find(file_id); - if (iter != event.command.resolved.attachments.end()) { - const dpp::attachment& att = iter->second; - event.reply(att.url); - } - } - } - }); + bot.on_slashcommand([&bot](const dpp::slashcommand_t & event) { + dpp::command_interaction cmd_data = std::get(event.command.data); + if (cmd_data.name == "show") { + dpp::snowflake file_id = std::get(event.get_parameter("file")); + dpp::attachment att = event.command.get_resolved_attachment(file_id); + event.reply(att.url); + } + }); - bot.on_ready([&bot](const dpp::ready_t & event) { + bot.on_ready([&bot](const dpp::ready_t & event) { - if (dpp::run_once()) { - dpp::slashcommand newcommand("show", "Show an uploaded file", bot.me.id); + if (dpp::run_once()) { + dpp::slashcommand newcommand("show", "Show an uploaded file", bot.me.id); - newcommand.add_option(dpp::command_option(dpp::co_attachment, "file", "Select an image")); + newcommand.add_option(dpp::command_option(dpp::co_attachment, "file", "Select an image")); - bot.global_command_create(newcommand); - } - }); + bot.global_command_create(newcommand); + } + }); - bot.start(dpp::st_wait); + bot.start(dpp::st_wait); - return 0; + return 0; } ~~~~~~~~~~~~~~~~ From b3cd6327ad65c1822bfadb79b0618f1a71d65aa5 Mon Sep 17 00:00:00 2001 From: Miuna <809711+Mishura4@users.noreply.github.com> Date: Mon, 24 Jul 2023 07:10:30 -0400 Subject: [PATCH 095/101] fix: add /bigobj to non-VCPKG MSVC CMake flags, fixing ninja build, and fix CMakeSettings.json (#740) --- CMakeSettings.json | 33 +++++++++++++++++++++++++++++++++ library/CMakeLists.txt | 5 +++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index ee1d09858c..ac2e6cbea0 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -3,6 +3,17 @@ { "name": "x64-Debug", "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "" + }, + { + "name": "x64-Release", + "generator": "Ninja", "configurationType": "Release", "inheritEnvironments": [ "msvc_x64_x64" ], "buildRoot": "${projectDir}\\out\\build\\${name}", @@ -10,6 +21,28 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "" + }, + { + "name": "x64-Debug-Coro", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "-DDPP_CORO=on", + "buildCommandArgs": "", + "ctestCommandArgs": "" + }, + { + "name": "x64-Release-Coro", + "generator": "Ninja", + "configurationType": "Release", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "-DDPP_CORO=on", + "buildCommandArgs": "", + "ctestCommandArgs": "" } ] } \ No newline at end of file diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index c98c575786..4bf20455bf 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -175,10 +175,11 @@ if(UNIX OR MSYS) endif() if(MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /sdl /DFD_SETSIZE=1024") if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Od /DEBUG /Zi /sdl /DFD_SETSIZE=1024") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj /Od /DEBUG /Zi") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /Oi /Oy /Gy /sdl /DFD_SETSIZE=1024") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /Oi /Oy /Gy") endif() if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /Zc:preprocessor") From 9b2e5cd62c8999185b41c1dac909c924ebf85863 Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 24 Jul 2023 13:15:36 +0200 Subject: [PATCH 096/101] feat: added functionality for guild onboarding and welcome screen (#734) --- include/dpp/appcommand.h | 4 +- include/dpp/cluster.h | 51 ++++++ include/dpp/guild.h | 318 ++++++++++++++++++++++++++++++++++++-- include/dpp/restresults.h | 4 +- src/dpp/cluster/guild.cpp | 19 +++ src/dpp/guild.cpp | 277 +++++++++++++++++++++++++++++++-- 6 files changed, 647 insertions(+), 26 deletions(-) diff --git a/include/dpp/appcommand.h b/include/dpp/appcommand.h index 1177edf1be..f50499ad3a 100644 --- a/include/dpp/appcommand.h +++ b/include/dpp/appcommand.h @@ -474,7 +474,7 @@ struct DPP_EXPORT interaction_modal_response : public interaction_response, publ }; /** - * @brief Resolved snowflake ids to users, guild members, roles and channels. + * @brief Resolved snowflake ids to users, guild members, roles and channels. You can use the `interaction::get_resolved_*` methods to easily get a resolved set */ struct DPP_EXPORT command_resolved { /** @@ -695,7 +695,7 @@ class DPP_EXPORT interaction : public managed, public json_interface #include +#include #include #include #include @@ -382,26 +383,102 @@ class DPP_EXPORT guild_member { /** * @brief Defines a channel on a server's welcome screen */ -struct welcome_channel_t { - /// the description shown for the channel +struct DPP_EXPORT welcome_channel: public json_interface { + /// The description shown for the channel std::string description; - /// the emoji name if custom, the unicode character if standard, or null if no emoji is set + /// The emoji name if custom, the unicode character if standard, or null if no emoji is set std::string emoji_name; - /// the channel's id - snowflake channel_id = 0; - /// the emoji id, if the emoji is custom - snowflake emoji_id = 0; + /// The channel's id + snowflake channel_id; + /// The emoji id, if the emoji is custom + snowflake emoji_id; + + /** + * @brief Construct a new welcome channel object + */ + welcome_channel(); + + /** + * @brief Destroy the welcome channel object + */ + virtual ~welcome_channel() = default; + + /** + * @brief Read class values from json object + * + * @param j A json object to read from + * @return A reference to self + */ + welcome_channel& fill_from_json(nlohmann::json* j); + + /** + * @brief Build the json for this object + * + * @param with_id include the id in the JSON + * @return std::string json data + */ + std::string build_json(bool with_id = false) const; + + /** + * @brief Set the channel ID of this welcome channel object + * + * @param _channel_id The channel ID to set + * @return Reference to self, so these method calls may be chained + */ + welcome_channel& set_channel_id(const snowflake _channel_id); + + /** + * @brief Set the description of this welcome channel object + * + * @param _description The description to set + * @return Reference to self, so these method calls may be chained + */ + welcome_channel& set_description(const std::string& _description); }; /** * @brief Defines a server's welcome screen */ -struct welcome_screen_t { - /// the server description shown in the welcome screen +struct DPP_EXPORT welcome_screen: public json_interface { + /// The server description shown in the welcome screen std::string description; - /// the channels shown in the welcome screen, up to 5 - std::vector welcome_channels; + /// The channels shown in the welcome screen (max 5) + std::vector welcome_channels; + + /** + * @brief Construct a new welcome screen object + */ + welcome_screen() = default; + + /** + * @brief Destroy the welcome screen object + */ + virtual ~welcome_screen() = default; + + /** + * @brief Read class values from json object + * + * @param j A json object to read from + * @return A reference to self + */ + welcome_screen& fill_from_json(nlohmann::json* j); + + /** + * @brief Build the json for this object + * + * @param with_id include the id in the JSON + * @return std::string json data + */ + std::string build_json(bool with_id = false) const; + + /** + * @brief Set the server description for this welcome screen object shown in the welcome screen + * + * @param s string The server description + * @return Reference to self, so these method calls may be chained + */ + welcome_screen& set_description(const std::string& s); }; /** @@ -552,7 +629,7 @@ class DPP_EXPORT guild : public managed, public json_interface { /** Welcome screen */ - welcome_screen_t welcome_screen; + dpp::welcome_screen welcome_screen; /** Guild icon hash */ utility::iconhash icon; @@ -1053,6 +1130,223 @@ class DPP_EXPORT guild_widget { std::string build_json(bool with_id = false) const; }; +/** + * @brief The onboarding mode for the dpp::onboarding object. Defines the criteria used to satisfy Onboarding constraints that are required for enabling. + */ +enum onboarding_mode: uint8_t { + gom_default = 0, //!< Counts only Default Channels towards constraints + gom_advanced = 1, //!< Counts Default Channels and Questions towards constraints +}; + +/** + * @brief The various types of dpp::onboarding_prompt + */ +enum onboarding_prompt_type: uint8_t { + opt_multiple_choice = 0, //!< Multiple choice + opt_dropdown = 1, //!< Dropdown +}; + +/** + * @brief Various flags for dpp::onboarding_prompt + */ +enum onboarding_prompt_flags: uint8_t { + opf_single_select = 1 << 0, //!< Indicates whether users are limited to selecting one option for the prompt + opf_required = 1 << 1, //!< Indicates whether the prompt is required before a user completes the onboarding flow + opf_in_onboarding = 1 << 2, //!< Indicates whether the prompt is present in the onboarding flow. If set, the prompt will only appear in the Channels & Roles tab +}; + +/** + * @brief Represents an onboarding prompt option + */ +struct DPP_EXPORT onboarding_prompt_option: public managed, public json_interface { + std::vector channel_ids; //!< IDs for channels a member is added to when the option is selected + std::vector role_ids; //!< IDs for roles assigned to a member when the option is selected + dpp::emoji emoji; //!< Emoji of the option + std::string title; //!< Title of the option + std::string description; //!< Description of the option + + /** + * @brief Construct a new onboarding prompt option object + */ + onboarding_prompt_option(); + + /** + * @brief Destroy the onboarding prompt option object + */ + virtual ~onboarding_prompt_option() = default; + + /** + * @brief Read class values from json object + * + * @param j A json object to read from + * @return A reference to self + */ + onboarding_prompt_option& fill_from_json(nlohmann::json* j); + + /** + * @brief Build the json for this object + * + * @param with_id include the id in the JSON + * @return std::string json data + */ + std::string build_json(bool with_id = false) const; + + /** + * @brief Set the emoji of this onboarding prompt option object + * + * @param _emoji The emoji to set + * @return Reference to self, so these method calls may be chained + */ + onboarding_prompt_option& set_emoji(const dpp::emoji& _emoji); + + /** + * @brief Set the title of this onboarding prompt option object + * + * @param _title The title to set + * @return Reference to self, so these method calls may be chained + */ + onboarding_prompt_option& set_title(const std::string& _title); + + /** + * @brief Set the description of this onboarding prompt option object + * + * @param _description The description to set + * @return Reference to self, so these method calls may be chained + */ + onboarding_prompt_option& set_description(const std::string& _description); +}; + +/** + * @brief Represents an onboarding prompt + */ +struct DPP_EXPORT onboarding_prompt: public managed, public json_interface { + onboarding_prompt_type type; //!< Type of prompt (defaults to dpp::opt_multiple_choice) + std::vector options; //!< Options available within the prompt + std::string title; //!< Title of the prompt + uint8_t flags; //!< A set of flags built from the bitmask defined by dpp::onboarding_prompt_flags + + /** + * @brief Construct a new onboarding prompt object + */ + onboarding_prompt(); + + /** + * @brief Destroy the onboarding prompt object + */ + virtual ~onboarding_prompt() = default; + + /** + * @brief Read class values from json object + * + * @param j A json object to read from + * @return A reference to self + */ + onboarding_prompt& fill_from_json(nlohmann::json* j); + + /** + * @brief Build the json for this object + * + * @param with_id include the id in the JSON + * @return std::string json data + */ + std::string build_json(bool with_id = false) const; + + /** + * @brief Set the type of this onboarding prompt object + * + * @param _type The prompt type to set + * @return Reference to self, so these method calls may be chained + */ + onboarding_prompt& set_type(const onboarding_prompt_type _type); + + /** + * @brief Set the title of this onboarding prompt object + * + * @param _title The title to set + * @return Reference to self, so these method calls may be chained + */ + onboarding_prompt& set_title(const std::string& _title); + + /** + * @brief Indicates whether users are limited to selecting one option for the prompt + * @return bool True if the users are limited to selecting one option for the prompt + */ + bool is_single_select() const; + + /** + * @brief Indicates whether the prompt is required before a user completes the onboarding flow + * @return bool True if the prompt is required before a user completes the onboarding flow + */ + bool is_required() const; + + /** + * @brief Indicates whether the prompt is present in the onboarding flow + * @return bool True if the prompt is present in the onboarding flow. False if the prompt will only appear in the Channels & Roles tab + */ + bool is_in_onboarding() const; +}; + +/** + * @brief Represents a guild's onboarding flow + */ +struct DPP_EXPORT onboarding: public json_interface { + snowflake guild_id; //!< ID of the guild this onboarding is part of + std::vector prompts; //!< Prompts shown during onboarding and in customize community + std::vector default_channel_ids; //!< Channel IDs that members get opted into automatically + onboarding_mode mode; //!< Current mode of onboarding (defaults to dpp::gom_default) + bool enabled; //!< Whether onboarding is enabled in the guild + + /** + * @brief Construct a new onboarding object + */ + onboarding(); + + /** + * @brief Destroy the onboarding object + */ + virtual ~onboarding() = default; + + /** + * @brief Read class values from json object + * + * @param j A json object to read from + * @return A reference to self + */ + onboarding& fill_from_json(nlohmann::json* j); + + /** + * @brief Build the json for this object + * + * @param with_id include the id in the JSON + * @return std::string json data + */ + std::string build_json(bool with_id = false) const; + + /** + * @brief Set guild_id of this onboarding object + * + * @param guild_id Guild ID to set + * @return Reference to self, so these method calls may be chained + */ + onboarding& set_guild_id(const snowflake id); + + /** + * @brief Set the mode of this onboarding object + * + * @param m onboarding_mode Mode to set + * @return Reference to self, so these method calls may be chained + */ + onboarding& set_mode(const onboarding_mode m); + + /** + * @brief Set the enabling of this onboarding object + * + * @param is_enabled bool Whether onboarding is enabled in the guild + * @return Reference to self, so these method calls may be chained + */ + onboarding& set_enabled(const bool is_enabled); +}; + /** * @brief helper function to deserialize a guild_member from json * diff --git a/include/dpp/restresults.h b/include/dpp/restresults.h index 1d3640d76b..1d2d88beff 100644 --- a/include/dpp/restresults.h +++ b/include/dpp/restresults.h @@ -191,7 +191,9 @@ typedef std::variant< event_member, event_member_map, automod_rule, - automod_rule_map + automod_rule_map, + onboarding, + welcome_screen > confirmable_t; /** diff --git a/src/dpp/cluster/guild.cpp b/src/dpp/cluster/guild.cpp index f4bc8d31fd..6020a96270 100644 --- a/src/dpp/cluster/guild.cpp +++ b/src/dpp/cluster/guild.cpp @@ -150,4 +150,23 @@ void cluster::guild_sync_integration(snowflake guild_id, snowflake integration_i } +void cluster::guild_get_onboarding(snowflake guild_id, command_completion_event_t callback) { + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "onboarding", m_get, "", callback); +} + +void cluster::guild_edit_onboarding(const struct onboarding& o, command_completion_event_t callback) { + rest_request(this, API_PATH "/guilds", std::to_string(o.guild_id), "onboarding", m_put, o.build_json(), callback); +} + +void cluster::guild_get_welcome_screen(snowflake guild_id, command_completion_event_t callback) { + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "welcome-screen", m_get, "", callback); +} + +void cluster::guild_edit_welcome_screen(snowflake guild_id, const struct welcome_screen& welcome_screen, bool enabled, command_completion_event_t callback) { + json j = json::parse(welcome_screen.build_json()); + j["enabled"] = enabled; + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "welcome-screen", m_patch, j.dump(), callback); +} + + }; diff --git a/src/dpp/guild.cpp b/src/dpp/guild.cpp index f557bb4841..772bb53551 100644 --- a/src/dpp/guild.cpp +++ b/src/dpp/guild.cpp @@ -160,6 +160,9 @@ void from_json(const nlohmann::json& j, guild_member& gm) { set_ts_not_null(&j, "joined_at", gm.joined_at); set_ts_not_null(&j, "premium_since", gm.premium_since); set_ts_not_null(&j, "communication_disabled_until", gm.communication_disabled_until); + /* Note: The permissions of the guild member are stored in the resolved set in the interaction event to + * reduce storage as they would be mostly empty anyway and only retrieved from interaction events + */ uint16_t flags = int16_not_null(&j, "flags"); for (auto & flag : membermap) { @@ -282,6 +285,75 @@ bool guild_member::has_bypasses_verification() const { return flags & dpp::gm_bypasses_verification; } + +welcome_channel::welcome_channel(): channel_id(0), emoji_id(0) { +} + +welcome_channel &welcome_channel::fill_from_json(nlohmann::json *j) { + channel_id = snowflake_not_null(j, "channel_id"); + description = string_not_null(j, "channel_id"); + emoji_id = snowflake_not_null(j, "emoji_id"); + emoji_name = string_not_null(j, "emoji_name"); + return *this; +} + +std::string welcome_channel::build_json(bool with_id) const { + json j; + j["channel_id"] = std::to_string(channel_id); + j["description"] = description; + if (!emoji_id.empty()) { + j["emoji_id"] = std::to_string(emoji_id); + } + if (!emoji_name.empty()) { + j["emoji_name"] = emoji_name; + } + return j.dump(); +} + +welcome_channel &welcome_channel::set_channel_id(const snowflake _channel_id) { + this->channel_id = _channel_id; + return *this; +} + +welcome_channel &welcome_channel::set_description(const std::string &_description) { + this->description = _description; + return *this; +} + +welcome_screen &welcome_screen::fill_from_json(nlohmann::json *j) { + description = string_not_null(j, "description"); + + welcome_channels.clear(); + if (j->contains("welcome_channels")) { + welcome_channels.reserve(j->at("welcome_channels").size()); + for (auto &c : j->at("welcome_channels")) { + welcome_channels.emplace_back(welcome_channel().fill_from_json(&c)); + } + } + return *this; +} + +std::string welcome_screen::build_json(bool with_id) const { + json j; + if (!description.empty()) { + j["description"] = description; + } + + if (!welcome_channels.empty()) { + j["welcome_channels"] = json::array(); + for (const auto &welcome_channel : welcome_channels) { + j["welcome_channels"].push_back(json::parse(welcome_channel.build_json())); + } + } + + return j.dump(); +} + +welcome_screen &welcome_screen::set_description(const std::string &s){ + this->description = s; + return *this; +} + bool guild::is_large() const { return this->flags & g_large; } @@ -603,17 +675,7 @@ guild& guild::fill_from_json(discord_client* shard, nlohmann::json* d) { this->nsfw_level = (guild_nsfw_level_t)int8_not_null(d, "nsfw_level"); if (d->find("welcome_screen") != d->end()) { - json& w = (*d)["welcome_screen"]; - set_string_not_null(&w, "description", welcome_screen.description); - welcome_screen.welcome_channels.reserve(w["welcome_channels"].size()); - for (auto& wc : w["welcome_channels"]) { - welcome_channel_t wchan; - set_string_not_null(&wc, "description", wchan.description); - set_snowflake_not_null(&wc, "channel_id", wchan.channel_id); - set_snowflake_not_null(&wc, "emoji_id", wchan.emoji_id); - set_string_not_null(&wc, "emoji_name", wchan.emoji_name); - welcome_screen.welcome_channels.emplace_back(wchan); - } + this->welcome_screen = dpp::welcome_screen().fill_from_json(&d->at("welcome_screen")); } set_snowflake_not_null(d, "safety_alerts_channel_id", this->safety_alerts_channel_id); @@ -865,4 +927,197 @@ guild_member find_guild_member(const snowflake guild_id, const snowflake user_id } +onboarding_prompt_option::onboarding_prompt_option(): managed(0) { +} + +onboarding_prompt::onboarding_prompt(): managed(0), type(opt_multiple_choice), flags(0) { +} + +onboarding::onboarding(): guild_id(0), mode(gom_default), enabled(false) { +} + +onboarding_prompt_option &onboarding_prompt_option::fill_from_json(nlohmann::json *j) { + this->id = snowflake_not_null(j, "id"); + if (j->contains("emoji")) { + this->emoji = dpp::emoji().fill_from_json(&j->at("emoji")); + } + this->title = string_not_null(j, "title"); + this->description = string_not_null(j, "description"); + + channel_ids.clear(); + if (j->contains("channel_ids")) { + channel_ids.reserve(j->at("channel_ids").size()); + for (auto &channel_id : j->at("channel_ids")) { + channel_ids.push_back(std::stoull(channel_id.get())); + } + } + role_ids.clear(); + if (j->contains("role_ids")) { + role_ids.reserve(j->at("role_ids").size()); + for (auto &role_id : j->at("role_ids")) { + role_ids.push_back(std::stoull(role_id.get())); + } + } + return *this; +} + +std::string onboarding_prompt_option::build_json(bool with_id) const { + json j; + j["emoji"] = json::parse(emoji.build_json()); + j["title"] = title; + if (!description.empty()) { + j["description"] = description; + } + + if (!channel_ids.empty()) { + j["channel_ids"] = json::array(); + for (const auto &channel_id : channel_ids) { + j["channel_ids"].push_back(std::to_string(channel_id)); + } + } + + if (!role_ids.empty()) { + j["role_ids"] = json::array(); + for (const auto &role_id : role_ids) { + j["role_ids"].push_back(std::to_string(role_id)); + } + } + + return j.dump(); +} + +onboarding_prompt_option &onboarding_prompt_option::set_emoji(const dpp::emoji &_emoji) { + this->emoji = _emoji; + return *this; +} + +onboarding_prompt_option &onboarding_prompt_option::set_title(const std::string &_title) { + this->title = _title; + return *this; +} + +onboarding_prompt_option &onboarding_prompt_option::set_description(const std::string &_description) { + this->description = _description; + return *this; +} + +onboarding_prompt &onboarding_prompt::fill_from_json(nlohmann::json *j) { + id = snowflake_not_null(j, "id"); + type = static_cast(int8_not_null(j, "type")); + title = string_not_null(j, "title"); + + options.clear(); + if (j->contains("options")) { + for (auto &option : j->at("options")) { + options.push_back(onboarding_prompt_option().fill_from_json(&option)); + } + } + + flags |= bool_not_null(j, "single_select") ? opf_single_select : 0; + flags |= bool_not_null(j, "required") ? opf_required : 0; + flags |= bool_not_null(j, "in_onboarding") ? opf_in_onboarding : 0; + return *this; +} + +std::string onboarding_prompt::build_json(bool with_id) const { + json j; + j["type"] = type; + j["title"] = title; + + if (!options.empty()) { + j["options"] = json::array(); + for (auto const &option : options) { + j["options"].push_back(json::parse(option.build_json())); + } + } + + j["single_select"] = is_single_select(); + j["required"] = is_required(); + j["in_onboarding"] = is_in_onboarding(); + return j.dump(); +} + +bool onboarding_prompt::is_single_select() const { + return flags & dpp::opf_single_select; +} + +bool onboarding_prompt::is_required() const { + return flags & dpp::opf_required; +} + +bool onboarding_prompt::is_in_onboarding() const { + return flags & dpp::opf_in_onboarding; +} + +onboarding_prompt &onboarding_prompt::set_type(const onboarding_prompt_type _type) { + this->type = _type; + return *this; +} + +onboarding_prompt &onboarding_prompt::set_title(const std::string& _title) { + this->title = _title; + return *this; +} + +onboarding& onboarding::fill_from_json(nlohmann::json* j) { + guild_id = snowflake_not_null(j, "guild_id"); + enabled = bool_not_null(j, "enabled"); + mode = static_cast(int8_not_null(j, "mode")); + + prompts.clear(); + if (j->contains("prompts")) { + for (auto &prompt : j->at("prompts")) { + prompts.push_back(onboarding_prompt().fill_from_json(&prompt)); + } + } + + default_channel_ids.clear(); + if (j->contains("default_channel_ids")) { + default_channel_ids.reserve(j->at("default_channel_ids").size()); + for (auto &default_channel_id : j->at("default_channel_ids")) { + default_channel_ids.push_back(std::stoull(default_channel_id.get())); + } + } + + return *this; +} + +std::string onboarding::build_json(bool with_id) const { + json j; + + if (!prompts.empty()) { + j["prompts"] = json::array(); + for (auto const &prompt : prompts) { + j["prompts"].push_back(json::parse(prompt.build_json())); + } + } + + if (!default_channel_ids.empty()) { + j["default_channel_ids"] = json::array(); + for (auto &default_channel_id : default_channel_ids) { + j["default_channel_ids"].push_back(std::to_string(default_channel_id)); + } + } + + j["enabled"] = enabled; + j["mode"] = mode; + return j.dump(); +} + +onboarding &onboarding::set_guild_id(const snowflake id) { + this->guild_id = id; + return *this; +} + +onboarding &onboarding::set_mode(const onboarding_mode m) { + this->mode = m; + return *this; +} + +onboarding &onboarding::set_enabled(const bool is_enabled) { + this->enabled = is_enabled; + return *this; +} + + }; From b2cb848c35c71d0905b07b7a10bdf19caf65195b Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Wed, 26 Jul 2023 08:24:59 +0000 Subject: [PATCH 097/101] fix: warning for [=] copy without explkit , rerun coro builder for onboarding --- include/dpp/cluster_coro_calls.h | 59 +++++++++++++++++++++++++- include/dpp/cluster_sync_calls.h | 71 +++++++++++++++++++++++++++++++- include/dpp/unicode_emoji.h | 13 +++++- src/dpp/cluster_coro_calls.cpp | 16 +++++++ src/dpp/cluster_sync_calls.cpp | 16 +++++++ src/unittest/test.cpp | 6 +-- 6 files changed, 173 insertions(+), 8 deletions(-) diff --git a/include/dpp/cluster_coro_calls.h b/include/dpp/cluster_coro_calls.h index 0083de91f3..b09d1a979c 100644 --- a/include/dpp/cluster_coro_calls.h +++ b/include/dpp/cluster_coro_calls.h @@ -982,6 +982,61 @@ awaitable co_guild_set_nickname(snowflake guild_id, con */ awaitable co_guild_sync_integration(snowflake guild_id, snowflake integration_id); +/** + * @brief Get the guild's onboarding configuration + * + * @see dpp::cluster::guild_get_onboarding + * @see https://discord.com/developers/docs/resources/guild#get-guild-onboarding + * @param o The onboarding object + * @return onboarding returned object on completion + * \memberof dpp::cluster + */ +awaitable co_guild_get_onboarding(snowflake guild_id); + +/** + * @brief Edit the guild's onboarding configuration + * + * Requires the `MANAGE_GUILD` and `MANAGE_ROLES` permissions. + * + * @note Onboarding enforces constraints when enabled. These constraints are that there must be at least 7 Default Channels and at least 5 of them must allow sending messages to the \@everyone role. The `onboarding::mode` field modifies what is considered when enforcing these constraints. + * + * @see dpp::cluster::guild_edit_onboarding + * @see https://discord.com/developers/docs/resources/guild#modify-guild-onboarding + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * @param o The onboarding object + * @return onboarding returned object on completion + * \memberof dpp::cluster + */ +awaitable co_guild_edit_onboarding(const struct onboarding& o); + +/** + * @brief Get the guild's welcome screen + * + * If the welcome screen is not enabled, the `MANAGE_GUILD` permission is required. + * + * @see dpp::cluster::guild_get_welcome_screen + * @see https://discord.com/developers/docs/resources/guild#get-guild-welcome-screen + * @param guild_id The guild ID to get the welcome screen from + * @return dpp::welcome_screen returned object on completion + * \memberof dpp::cluster + */ +awaitable co_guild_get_welcome_screen(snowflake guild_id); + +/** + * @brief Edit the guild's welcome screen + * + * Requires the `MANAGE_GUILD` permission. May fire a `Guild Update` Gateway event. + * + * @see dpp::cluster::guild_edit_welcome_screen + * @see https://discord.com/developers/docs/resources/guild#modify-guild-welcome-screen + * @param guild_id The guild ID to edit the welcome screen for + * @param welcome_screen The welcome screen + * @param enabled Whether the welcome screen should be enabled or disabled + * @return dpp::welcome_screen returned object on completion + * \memberof dpp::cluster + */ +awaitable co_guild_edit_welcome_screen(snowflake guild_id, const struct welcome_screen& welcome_screen, bool enabled); + /** * @brief Add guild member. Needs a specific oauth2 scope, from which you get the access_token. * @@ -1883,7 +1938,7 @@ awaitable co_threads_get_joined_private_archived(snowfl * @see dpp::cluster::threads_get_private_archived * @see https://discord.com/developers/docs/resources/channel#list-private-archived-threads * @param channel_id Channel to get public archived threads for - * @param before_timestamp Get threads before this timestamp + * @param before_timestamp Get threads archived before this timestamp * @param limit Number of threads to get * @return thread_map returned object on completion * \memberof dpp::cluster @@ -1895,7 +1950,7 @@ awaitable co_threads_get_private_archived(snowflake cha * @see dpp::cluster::threads_get_public_archived * @see https://discord.com/developers/docs/resources/channel#list-public-archived-threads * @param channel_id Channel to get public archived threads for - * @param before_timestamp Get threads before this timestamp + * @param before_timestamp Get threads archived before this timestamp * @param limit Number of threads to get * @return thread_map returned object on completion * \memberof dpp::cluster diff --git a/include/dpp/cluster_sync_calls.h b/include/dpp/cluster_sync_calls.h index 25c89f9fd9..7a61f38d5f 100644 --- a/include/dpp/cluster_sync_calls.h +++ b/include/dpp/cluster_sync_calls.h @@ -1204,6 +1204,73 @@ confirmation guild_set_nickname_sync(snowflake guild_id, const std::string &nick */ confirmation guild_sync_integration_sync(snowflake guild_id, snowflake integration_id); +/** + * @brief Get the guild's onboarding configuration + * + * @see dpp::cluster::guild_get_onboarding + * @see https://discord.com/developers/docs/resources/guild#get-guild-onboarding + * @param o The onboarding object + * @return onboarding returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +onboarding guild_get_onboarding_sync(snowflake guild_id); + +/** + * @brief Edit the guild's onboarding configuration + * + * Requires the `MANAGE_GUILD` and `MANAGE_ROLES` permissions. + * + * @note Onboarding enforces constraints when enabled. These constraints are that there must be at least 7 Default Channels and at least 5 of them must allow sending messages to the \@everyone role. The `onboarding::mode` field modifies what is considered when enforcing these constraints. + * + * @see dpp::cluster::guild_edit_onboarding + * @see https://discord.com/developers/docs/resources/guild#modify-guild-onboarding + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * @param o The onboarding object + * @return onboarding returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +onboarding guild_edit_onboarding_sync(const struct onboarding& o); + +/** + * @brief Get the guild's welcome screen + * + * If the welcome screen is not enabled, the `MANAGE_GUILD` permission is required. + * + * @see dpp::cluster::guild_get_welcome_screen + * @see https://discord.com/developers/docs/resources/guild#get-guild-welcome-screen + * @param guild_id The guild ID to get the welcome screen from + * @return dpp::welcome_screen returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +dpp::welcome_screen guild_get_welcome_screen_sync(snowflake guild_id); + +/** + * @brief Edit the guild's welcome screen + * + * Requires the `MANAGE_GUILD` permission. May fire a `Guild Update` Gateway event. + * + * @see dpp::cluster::guild_edit_welcome_screen + * @see https://discord.com/developers/docs/resources/guild#modify-guild-welcome-screen + * @param guild_id The guild ID to edit the welcome screen for + * @param welcome_screen The welcome screen + * @param enabled Whether the welcome screen should be enabled or disabled + * @return dpp::welcome_screen returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +dpp::welcome_screen guild_edit_welcome_screen_sync(snowflake guild_id, const struct welcome_screen& welcome_screen, bool enabled); + /** * @brief Add guild member. Needs a specific oauth2 scope, from which you get the access_token. * @@ -2315,7 +2382,7 @@ thread_map threads_get_joined_private_archived_sync(snowflake channel_id, snowfl * @see dpp::cluster::threads_get_private_archived * @see https://discord.com/developers/docs/resources/channel#list-private-archived-threads * @param channel_id Channel to get public archived threads for - * @param before_timestamp Get threads before this timestamp + * @param before_timestamp Get threads archived before this timestamp * @param limit Number of threads to get * @return thread_map returned object on completion * \memberof dpp::cluster @@ -2330,7 +2397,7 @@ thread_map threads_get_private_archived_sync(snowflake channel_id, time_t befor * @see dpp::cluster::threads_get_public_archived * @see https://discord.com/developers/docs/resources/channel#list-public-archived-threads * @param channel_id Channel to get public archived threads for - * @param before_timestamp Get threads before this timestamp + * @param before_timestamp Get threads archived before this timestamp * @param limit Number of threads to get * @return thread_map returned object on completion * \memberof dpp::cluster diff --git a/include/dpp/unicode_emoji.h b/include/dpp/unicode_emoji.h index b09a5bfb30..2785f8cd53 100644 --- a/include/dpp/unicode_emoji.h +++ b/include/dpp/unicode_emoji.h @@ -1,6 +1,17 @@ #pragma once -namespace dpp { namespace unicode_emoji { +namespace dpp { + +/** + * The unicode emojis in this namespace are auto-generated from https://raw.githubusercontent.com/ArkinSolomon/discord-emoji-converter/master/emojis.json + * + * If you want to use this, you have to pull the header in separately. e.g. + * ```cpp + * #include + * #include + * ``` + */ +namespace unicode_emoji { constexpr const char[] _100 = "💯"; constexpr const char[] _1234 = "🔢"; constexpr const char[] soccer = "⚽"; diff --git a/src/dpp/cluster_coro_calls.cpp b/src/dpp/cluster_coro_calls.cpp index 5eea1a0bc4..9b0d46816a 100644 --- a/src/dpp/cluster_coro_calls.cpp +++ b/src/dpp/cluster_coro_calls.cpp @@ -339,6 +339,22 @@ awaitable cluster::co_guild_sync_integration(snowflake return {this, static_cast(&cluster::guild_sync_integration), guild_id, integration_id}; } +awaitable cluster::co_guild_get_onboarding(snowflake guild_id) { + return {this, static_cast(&cluster::guild_get_onboarding), guild_id}; +} + +awaitable cluster::co_guild_edit_onboarding(const struct onboarding& o) { + return {this, static_cast(&cluster::guild_edit_onboarding), o}; +} + +awaitable cluster::co_guild_get_welcome_screen(snowflake guild_id) { + return {this, static_cast(&cluster::guild_get_welcome_screen), guild_id}; +} + +awaitable cluster::co_guild_edit_welcome_screen(snowflake guild_id, const struct welcome_screen& welcome_screen, bool enabled) { + return {this, static_cast(&cluster::guild_edit_welcome_screen), guild_id, welcome_screen, enabled}; +} + awaitable cluster::co_guild_add_member(const guild_member& gm, const std::string &access_token) { return {this, static_cast(&cluster::guild_add_member), gm, access_token}; } diff --git a/src/dpp/cluster_sync_calls.cpp b/src/dpp/cluster_sync_calls.cpp index 1ff073cb7a..2b9be8b862 100644 --- a/src/dpp/cluster_sync_calls.cpp +++ b/src/dpp/cluster_sync_calls.cpp @@ -337,6 +337,22 @@ confirmation cluster::guild_sync_integration_sync(snowflake guild_id, snowflake return dpp::sync(this, static_cast(&cluster::guild_sync_integration), guild_id, integration_id); } +onboarding cluster::guild_get_onboarding_sync(snowflake guild_id) { + return dpp::sync(this, static_cast(&cluster::guild_get_onboarding), guild_id); +} + +onboarding cluster::guild_edit_onboarding_sync(const struct onboarding& o) { + return dpp::sync(this, static_cast(&cluster::guild_edit_onboarding), o); +} + +dpp::welcome_screen cluster::guild_get_welcome_screen_sync(snowflake guild_id) { + return dpp::sync(this, static_cast(&cluster::guild_get_welcome_screen), guild_id); +} + +dpp::welcome_screen cluster::guild_edit_welcome_screen_sync(snowflake guild_id, const struct welcome_screen& welcome_screen, bool enabled) { + return dpp::sync(this, static_cast(&cluster::guild_edit_welcome_screen), guild_id, welcome_screen, enabled); +} + confirmation cluster::guild_add_member_sync(const guild_member& gm, const std::string &access_token) { return dpp::sync(this, static_cast(&cluster::guild_add_member), gm, access_token); } diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index bd391f2bae..14bd314ea0 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -814,11 +814,11 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } set_test("MESSAGEPIN", false); set_test("MESSAGEUNPIN", false); - bot.message_pin(channel_id, message_id, [=](const dpp::confirmation_callback_t &callback) { + bot.message_pin(channel_id, message_id, [this](const dpp::confirmation_callback_t &callback) { std::lock_guard lock(mutex); if (!callback.is_error()) { set_test("MESSAGEPIN", true); - bot.message_unpin(TEST_TEXT_CHANNEL_ID, message_id, [=](const dpp::confirmation_callback_t &callback) { + bot.message_unpin(TEST_TEXT_CHANNEL_ID, message_id, [this](const dpp::confirmation_callback_t &callback) { std::lock_guard lock(mutex); if (!callback.is_error()) { set_test("MESSAGEUNPIN", true); @@ -973,7 +973,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b set_test("THREAD_UPDATE_EVENT", false); edit.name = "edited"; edit.metadata.locked = true; - bot.thread_edit(edit, [this, id = edit.id](const dpp::confirmation_callback_t &callback) { + bot.thread_edit(edit, [this](const dpp::confirmation_callback_t &callback) { std::lock_guard lock(mutex); if (!callback.is_error()) { set_test("THREAD_EDIT", true); From f9d7a9121098c1948581b314bb55ed95ead7cc2f Mon Sep 17 00:00:00 2001 From: Miuna Date: Wed, 26 Jul 2023 14:25:35 -0400 Subject: [PATCH 098/101] fix: coroutines: better support for clang, remove experimental if unneeded, add missing headers --- include/dpp/coro.h | 27 ++++++++++++++++++++------ library/CMakeLists.txt | 44 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/include/dpp/coro.h b/include/dpp/coro.h index 53ea155b9f..4f912d823d 100644 --- a/include/dpp/coro.h +++ b/include/dpp/coro.h @@ -1,11 +1,21 @@ #ifdef DPP_CORO #pragma once -#if !(defined( _MSC_VER ) || defined( _CONSOLE ) || defined( __GNUC__ )) // if libc++ -# define EXPERIMENTAL_COROUTINE +#if (defined(_LIBCPP_VERSION) and !defined(__cpp_impl_coroutine)) // if libc++ experimental implementation (LLVM < 14) +# define STDCORO_EXPERIMENTAL_HEADER +# define STDCORO_EXPERIMENTAL_NAMESPACE #endif -#ifdef EXPERIMENTAL_COROUTINE +#ifdef STDCORO_GLIBCXX_COMPAT +# define __cpp_impl_coroutine 1 +namespace std { + namespace experimental { + using namespace std; + } +} +#endif + +#ifdef STDCORO_EXPERIMENTAL_HEADER # include #else # include @@ -14,6 +24,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace dpp { class cluster; @@ -33,7 +48,7 @@ namespace dpp { */ namespace std_coroutine {} #else -# ifdef EXPERIMENTAL_COROUTINE +# ifdef STDCORO_EXPERIMENTAL_NAMESPACE namespace std_coroutine = std::experimental; # else namespace std_coroutine = std; @@ -282,7 +297,7 @@ namespace dpp { * * @return std::suspend_never Don't suspend, the coroutine starts immediately. */ - std::suspend_never initial_suspend() noexcept { + std_coroutine::suspend_never initial_suspend() noexcept { return {}; } @@ -454,7 +469,7 @@ namespace dpp { * * @see std::coroutine_handle */ - std::coroutine_handle<> coro_handle = nullptr; + detail::std_coroutine::coroutine_handle<> coro_handle = nullptr; }; /** diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 4bf20455bf..e74c4e33bb 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -293,17 +293,51 @@ if(HAVE_PTHREAD_SETNAME_NP) endif() if(DPP_CORO) - message("-- ${Yellow}Enabled experimental coroutine support${ColourReset}") + message("-- ${Yellow}Enabled experimental coroutine feature${ColourReset}") set(CMAKE_CXX_STANDARD 20) target_compile_features(dpp PUBLIC cxx_std_20) if(WIN32 AND NOT MINGW) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /await:strict") else() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") - target_link_libraries(dpp PUBLIC "c++abi") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 14.0.0) # clang >= 14 has native support + message("-- ${Yellow}Clang < 14 - attempting to detect if using libc++ or stdc++${ColourReset}") + check_cxx_source_compiles(" + #include + + int a = + #ifdef __GLIBCXX__ + 1; + #else + fgsfds; + #endif + + int main(int argc, char* argv[]) + { + return 0; + } + " IS_GLIBCXX) + if(IS_GLIBCXX) + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.0.0) + message(FATAL_ERROR "Clang with stdc++ and coroutines requires version 12.0.0 or above") + endif() + message("-- ${Yellow}Detected stdc++ - enabling mock std::experimental namespace${ColourReset}") + target_compile_definitions(dpp PUBLIC "STDCORO_GLIBCXX_COMPAT") + else() + message("-- ${Yellow}Detected libc++ - using ") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0.0) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines-ts") + endif() + endif() + message("-- ${Yellow}Note - coroutines in clang < 14 are experimental, upgrading is recommended") + endif() + elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0) + message(FATAL_ERROR "Coroutines with g++ require version 10 or above") + elseif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11.0) + message("-- ${Yellow}Note - coroutines in g++10 are experimental, upgrading to g++11 or above is recommended") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines") + endif() endif() endif() target_compile_definitions(dpp PUBLIC DPP_CORO) From b2724fdb563e92dc95053b2c4809732219345f31 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Mon, 31 Jul 2023 13:17:56 +0000 Subject: [PATCH 099/101] feat: add dpp::snowflake::str() that returns string form of snowflake value --- include/dpp/snowflake.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/dpp/snowflake.h b/include/dpp/snowflake.h index 47e333dd1b..8f7cbad7b3 100644 --- a/include/dpp/snowflake.h +++ b/include/dpp/snowflake.h @@ -92,6 +92,16 @@ class DPP_EXPORT snowflake final { return value == 0; } + /** + * @brief Returns the stringified version of the snowflake value + * + * @return std::string string form of snowflake value + */ + inline std::string str() const + { + return std::to_string(value); + } + /** * @brief Operator less than, used for maps/unordered maps * when the snowflake is a key value. From 67c4fa1a7bb31ec0277983fabfeadb9bb8203d5e Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Tue, 1 Aug 2023 12:11:11 +0000 Subject: [PATCH 100/101] add STDCORO to cspell --- .cspell.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.cspell.json b/.cspell.json index 123d3a890f..75593c32fc 100644 --- a/.cspell.json +++ b/.cspell.json @@ -125,7 +125,8 @@ "koko", "moyai", "kaaba", - "stringified" + "stringified", + "STDCORO" ], "flagWords": [ "hte" From f5bcb01d6b2ec41f786eba6f461c87cfe32edf48 Mon Sep 17 00:00:00 2001 From: harshfeudal <87577447+harshfeudal@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:46:00 +0700 Subject: [PATCH 101/101] docs: fix typo (#741) Co-authored-by: Brain --- docpages/advanced_reference/coroutines.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docpages/advanced_reference/coroutines.md b/docpages/advanced_reference/coroutines.md index 23b1950277..6f4551a8ba 100644 --- a/docpages/advanced_reference/coroutines.md +++ b/docpages/advanced_reference/coroutines.md @@ -1,6 +1,6 @@ \page coroutines Advanced commands with coroutines -\warning D++ Coroutines are a very new feature and are currently only supported by D++ on g++ 13.1 and MSVC 19.37, and the CMake option DPP_CORO must be enabled. They are experimental and may have bugs or even crashes, pease report any to [GitHub Issues](https://github.com/brainboxdotcc/DPP/issues) or to our [Discord Server](https://discord.gg/dpp). +\warning D++ Coroutines are a very new feature and are currently only supported by D++ on g++ 13.1 and MSVC 19.37, and the CMake option DPP_CORO must be enabled. They are experimental and may have bugs or even crashes, please report any to [GitHub Issues](https://github.com/brainboxdotcc/DPP/issues) or to our [Discord Server](https://discord.gg/dpp). ### What is a coroutine? @@ -131,7 +131,7 @@ int main() { ### I heard you liked tasks -\note This next example is fairly advanced and makes uses of many of both C++ and D++'s advanced features. +\note This next example is fairly advanced and makes use of many of both C++ and D++'s advanced features. Lastly, `dpp::task` takes its return type as a template parameter, which allows you to use tasks inside tasks and return a result from them. @@ -225,4 +225,4 @@ int main() { bot.start(dpp::st_wait); } -~~~~~~~~~~ \ No newline at end of file +~~~~~~~~~~