diff --git a/application/composer.lock b/application/composer.lock index 6ac7dd6..a1211b1 100644 --- a/application/composer.lock +++ b/application/composer.lock @@ -72,16 +72,16 @@ }, { "name": "gregwar/captcha", - "version": "v1.1.9", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/Gregwar/Captcha.git", - "reference": "4bb668e6b40e3205a020ca5ee4ca8cff8b8780c5" + "reference": "6e5b61b66ac89885b505153f4ef9a74ffa5b3074" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Gregwar/Captcha/zipball/4bb668e6b40e3205a020ca5ee4ca8cff8b8780c5", - "reference": "4bb668e6b40e3205a020ca5ee4ca8cff8b8780c5", + "url": "https://api.github.com/repos/Gregwar/Captcha/zipball/6e5b61b66ac89885b505153f4ef9a74ffa5b3074", + "reference": "6e5b61b66ac89885b505153f4ef9a74ffa5b3074", "shasum": "" }, "require": { @@ -93,7 +93,7 @@ "require-dev": { "phpunit/phpunit": "^6.4" }, - "type": "captcha", + "type": "library", "autoload": { "psr-4": { "Gregwar\\": "src/Gregwar" @@ -123,9 +123,9 @@ ], "support": { "issues": "https://github.com/Gregwar/Captcha/issues", - "source": "https://github.com/Gregwar/Captcha/tree/master" + "source": "https://github.com/Gregwar/Captcha/tree/v1.2.0" }, - "time": "2020-03-24T14:39:05+00:00" + "time": "2023-03-24T22:12:41+00:00" }, { "name": "phpgangsta/googleauthenticator", @@ -177,16 +177,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.5.1", + "version": "v6.8.0", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355" + "reference": "df16b615e371d81fb79e506277faea67a1be18f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dd803df5ad7492e1b40637f7ebd258fee5ca7355", - "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/df16b615e371d81fb79e506277faea67a1be18f1", + "reference": "df16b615e371d81fb79e506277faea67a1be18f1", "shasum": "" }, "require": { @@ -196,22 +196,24 @@ "php": ">=5.5.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.2", - "php-parallel-lint/php-console-highlighter": "^0.5.0", - "php-parallel-lint/php-parallel-lint": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.2", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", "phpcompatibility/php-compatibility": "^9.3.5", "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.6.0", - "yoast/phpunit-polyfills": "^1.0.0" + "squizlabs/php_codesniffer": "^3.7.1", + "yoast/phpunit-polyfills": "^1.0.4" }, "suggest": { "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", "league/oauth2-google": "Needed for Google XOAUTH2 authentication", "psr/log": "For optional PSR-3 debug logging", - "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" }, "type": "library", "autoload": { @@ -243,7 +245,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.5.1" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.0" }, "funding": [ { @@ -251,7 +253,7 @@ "type": "github" } ], - "time": "2021-08-18T09:14:16+00:00" + "time": "2023-03-06T14:43:22+00:00" }, { "name": "phpunit/php-timer", @@ -373,21 +375,89 @@ "time": "2021-06-04T09:56:25+00:00" }, { - "name": "symfony/finder", - "version": "v5.3.7", + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -416,7 +486,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.21" }, "funding": [ { @@ -432,32 +502,35 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2023-02-16T09:33:00+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.23.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" + "reference": "927013f3aac555983a5059aada98e1907d842695" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695", + "reference": "927013f3aac555983a5059aada98e1907d842695", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-iconv": "*" + }, "suggest": { "ext-iconv": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -465,12 +538,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -496,7 +569,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.0" }, "funding": [ { @@ -512,20 +585,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.1", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -537,7 +610,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -545,12 +618,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -577,7 +650,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -593,20 +666,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -618,7 +691,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -626,12 +699,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -661,7 +734,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -677,32 +750,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -710,12 +786,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -741,7 +817,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -757,20 +833,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.23.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { @@ -779,7 +855,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -787,12 +863,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -817,7 +893,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -833,20 +909,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -855,7 +931,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -863,12 +939,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -900,7 +976,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -916,25 +992,25 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "voku/anti-xss", - "version": "4.1.33", + "version": "4.1.41", "source": { "type": "git", "url": "https://github.com/voku/anti-xss.git", - "reference": "dcd44ad3726e97e3ea924e4c7257cb33976b71a5" + "reference": "55a403436494e44a2547a8d42de68e6cad4bca1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/anti-xss/zipball/dcd44ad3726e97e3ea924e4c7257cb33976b71a5", - "reference": "dcd44ad3726e97e3ea924e4c7257cb33976b71a5", + "url": "https://api.github.com/repos/voku/anti-xss/zipball/55a403436494e44a2547a8d42de68e6cad4bca1d", + "reference": "55a403436494e44a2547a8d42de68e6cad4bca1d", "shasum": "" }, "require": { "php": ">=7.0.0", - "voku/portable-utf8": "~5.4.51" + "voku/portable-utf8": "~6.0.2" }, "require-dev": { "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" @@ -975,7 +1051,7 @@ ], "support": { "issues": "https://github.com/voku/anti-xss/issues", - "source": "https://github.com/voku/anti-xss/tree/4.1.33" + "source": "https://github.com/voku/anti-xss/tree/4.1.41" }, "funding": [ { @@ -999,20 +1075,20 @@ "type": "tidelift" } ], - "time": "2021-10-03T21:37:05+00:00" + "time": "2023-02-12T15:56:55+00:00" }, { "name": "voku/portable-ascii", - "version": "1.5.6", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "80953678b19901e5165c56752d087fc11526017c" + "reference": "b56450eed252f6801410d810c8e1727224ae0743" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", - "reference": "80953678b19901e5165c56752d087fc11526017c", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", "shasum": "" }, "require": { @@ -1049,7 +1125,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" }, "funding": [ { @@ -1073,20 +1149,20 @@ "type": "tidelift" } ], - "time": "2020-11-12T00:07:28+00:00" + "time": "2022-03-08T17:03:00+00:00" }, { "name": "voku/portable-utf8", - "version": "5.4.51", + "version": "6.0.13", "source": { "type": "git", "url": "https://github.com/voku/portable-utf8.git", - "reference": "578f5266725dc9880483d24ad0cfb39f8ce170f7" + "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-utf8/zipball/578f5266725dc9880483d24ad0cfb39f8ce170f7", - "reference": "578f5266725dc9880483d24ad0cfb39f8ce170f7", + "url": "https://api.github.com/repos/voku/portable-utf8/zipball/b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", + "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", "shasum": "" }, "require": { @@ -1096,10 +1172,14 @@ "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php72": "~1.0", - "voku/portable-ascii": "~1.5.6" + "voku/portable-ascii": "~2.0.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "phpstan/phpstan": "1.9.*@dev", + "phpstan/phpstan-strict-rules": "1.4.*@dev", + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0", + "thecodingmachine/phpstan-strict-rules": "1.0.*@dev", + "voku/phpstan-rules": "3.1.*@dev" }, "suggest": { "ext-ctype": "Use Ctype for e.g. hexadecimal digit detection", @@ -1111,12 +1191,12 @@ }, "type": "library", "autoload": { - "psr-4": { - "voku\\": "src/voku/" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "voku\\": "src/voku/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1148,7 +1228,7 @@ ], "support": { "issues": "https://github.com/voku/portable-utf8/issues", - "source": "https://github.com/voku/portable-utf8/tree/5.4.51" + "source": "https://github.com/voku/portable-utf8/tree/6.0.13" }, "funding": [ { @@ -1172,7 +1252,7 @@ "type": "tidelift" } ], - "time": "2020-12-02T01:58:49+00:00" + "time": "2023-03-08T08:35:38+00:00" } ], "packages-dev": [], @@ -1185,5 +1265,5 @@ "prefer-lowest": false, "platform": [], "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.3.0" } diff --git a/application/vendor/autoload.php b/application/vendor/autoload.php index 4f17781..40d20b8 100644 --- a/application/vendor/autoload.php +++ b/application/vendor/autoload.php @@ -2,6 +2,11 @@ // autoload.php @generated by Composer +if (PHP_VERSION_ID < 50600) { + echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + exit(1); +} + require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInitde424ad7860a40a14ec11f109060d25d::getLoader(); diff --git a/application/vendor/composer/ClassLoader.php b/application/vendor/composer/ClassLoader.php index 4d989a2..afef3fa 100644 --- a/application/vendor/composer/ClassLoader.php +++ b/application/vendor/composer/ClassLoader.php @@ -42,30 +42,75 @@ namespace Composer\Autoload; */ class ClassLoader { + /** @var ?string */ private $vendorDir; // PSR-4 + /** + * @var array[] + * @psalm-var array> + */ private $prefixLengthsPsr4 = array(); + /** + * @var array[] + * @psalm-var array> + */ private $prefixDirsPsr4 = array(); + /** + * @var array[] + * @psalm-var array + */ private $fallbackDirsPsr4 = array(); // PSR-0 + /** + * @var array[] + * @psalm-var array> + */ private $prefixesPsr0 = array(); + /** + * @var array[] + * @psalm-var array + */ private $fallbackDirsPsr0 = array(); + /** @var bool */ private $useIncludePath = false; + + /** + * @var string[] + * @psalm-var array + */ private $classMap = array(); + + /** @var bool */ private $classMapAuthoritative = false; + + /** + * @var bool[] + * @psalm-var array + */ private $missingClasses = array(); + + /** @var ?string */ private $apcuPrefix; + /** + * @var self[] + */ private static $registeredLoaders = array(); + /** + * @param ?string $vendorDir + */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } + /** + * @return string[] + */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { @@ -75,28 +120,47 @@ class ClassLoader return array(); } + /** + * @return array[] + * @psalm-return array> + */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } + /** + * @return array[] + * @psalm-return array + */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } + /** + * @return array[] + * @psalm-return array + */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } + /** + * @return string[] Array of classname => path + * @psalm-return array + */ public function getClassMap() { return $this->classMap; } /** - * @param array $classMap Class to filename map + * @param string[] $classMap Class to filename map + * @psalm-param array $classMap + * + * @return void */ public function addClassMap(array $classMap) { @@ -111,9 +175,11 @@ class ClassLoader * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void */ public function add($prefix, $paths, $prepend = false) { @@ -156,11 +222,13 @@ class ClassLoader * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException + * + * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { @@ -204,8 +272,10 @@ class ClassLoader * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 base directories + * + * @return void */ public function set($prefix, $paths) { @@ -220,10 +290,12 @@ class ClassLoader * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException + * + * @return void */ public function setPsr4($prefix, $paths) { @@ -243,6 +315,8 @@ class ClassLoader * Turns on searching the include path for class files. * * @param bool $useIncludePath + * + * @return void */ public function setUseIncludePath($useIncludePath) { @@ -265,6 +339,8 @@ class ClassLoader * that have not been registered with the class map. * * @param bool $classMapAuthoritative + * + * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { @@ -285,6 +361,8 @@ class ClassLoader * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix + * + * @return void */ public function setApcuPrefix($apcuPrefix) { @@ -305,14 +383,18 @@ class ClassLoader * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { - //no-op - } elseif ($prepend) { + return; + } + + if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); @@ -322,6 +404,8 @@ class ClassLoader /** * Unregisters this instance as an autoloader. + * + * @return void */ public function unregister() { @@ -336,7 +420,7 @@ class ClassLoader * Loads the given class or interface. * * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise + * @return true|null True if loaded, null otherwise */ public function loadClass($class) { @@ -345,6 +429,8 @@ class ClassLoader return true; } + + return null; } /** @@ -399,6 +485,11 @@ class ClassLoader return self::$registeredLoaders; } + /** + * @param string $class + * @param string $ext + * @return string|false + */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup @@ -470,6 +561,10 @@ class ClassLoader * Scope isolated include. * * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + * @private */ function includeFile($file) { diff --git a/application/vendor/composer/InstalledVersions.php b/application/vendor/composer/InstalledVersions.php index 98a2a16..c6b54af 100644 --- a/application/vendor/composer/InstalledVersions.php +++ b/application/vendor/composer/InstalledVersions.php @@ -1,429 +1,352 @@ + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; - - - - - +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ class InstalledVersions { -private static $installed = array ( - 'root' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '7034c221dff1ac4fdae43db9db67ce3bf9a28ca1', - 'name' => '__root__', - ), - 'versions' => - array ( - '__root__' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '7034c221dff1ac4fdae43db9db67ce3bf9a28ca1', - ), - 'catfan/medoo' => - array ( - 'pretty_version' => 'v1.7.10', - 'version' => '1.7.10.0', - 'aliases' => - array ( - ), - 'reference' => '2d675f73e23f63bbaeb9a8aa33318659a3d3c32f', - ), - 'gregwar/captcha' => - array ( - 'pretty_version' => 'v1.1.9', - 'version' => '1.1.9.0', - 'aliases' => - array ( - ), - 'reference' => '4bb668e6b40e3205a020ca5ee4ca8cff8b8780c5', - ), - 'phpgangsta/googleauthenticator' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - 0 => '9999999-dev', - ), - 'reference' => '505c2af8337b559b33557f37cda38e5f843f3768', - ), - 'phpmailer/phpmailer' => - array ( - 'pretty_version' => 'v6.5.1', - 'version' => '6.5.1.0', - 'aliases' => - array ( - ), - 'reference' => 'dd803df5ad7492e1b40637f7ebd258fee5ca7355', - ), - 'phpunit/php-timer' => - array ( - 'pretty_version' => '2.1.3', - 'version' => '2.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '2454ae1765516d20c4ffe103d85a58a9a3bd5662', - ), - 'rmccue/requests' => - array ( - 'pretty_version' => 'v1.8.1', - 'version' => '1.8.1.0', - 'aliases' => - array ( - ), - 'reference' => '82e6936366eac3af4d836c18b9d8c31028fe4cd5', - ), - 'symfony/finder' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => 'a10000ada1e600d109a6c7632e9ac42e8bf2fb93', - ), - 'symfony/polyfill-iconv' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '63b5bb7db83e5673936d6e3b8b3e022ff6474933', - ), - 'symfony/polyfill-intl-grapheme' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '16880ba9c5ebe3642d1995ab866db29270b36535', - ), - 'symfony/polyfill-intl-normalizer' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8', - ), - 'symfony/polyfill-mbstring' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '9174a3d80210dca8daa7f31fec659150bbeabfc6', - ), - 'symfony/polyfill-php72' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976', - ), - 'symfony/polyfill-php80' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '1100343ed1a92e3a38f9ae122fc0eb21602547be', - ), - 'voku/anti-xss' => - array ( - 'pretty_version' => '4.1.33', - 'version' => '4.1.33.0', - 'aliases' => - array ( - ), - 'reference' => 'dcd44ad3726e97e3ea924e4c7257cb33976b71a5', - ), - 'voku/portable-ascii' => - array ( - 'pretty_version' => '1.5.6', - 'version' => '1.5.6.0', - 'aliases' => - array ( - ), - 'reference' => '80953678b19901e5165c56752d087fc11526017c', - ), - 'voku/portable-utf8' => - array ( - 'pretty_version' => '5.4.51', - 'version' => '5.4.51.0', - 'aliases' => - array ( - ), - 'reference' => '578f5266725dc9880483d24ad0cfb39f8ce170f7', - ), - ), -); -private static $canGetVendors; -private static $installedByVendor = array(); + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + /** + * @var bool|null + */ + private static $canGetVendors; + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + if (1 === \count($packages)) { + return $packages[0]; + } + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); -public static function getInstalledPackages() -{ -$packages = array(); -foreach (self::getInstalled() as $installed) { -$packages[] = array_keys($installed['versions']); -} - - -if (1 === \count($packages)) { -return $packages[0]; -} - -return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); -} - - - - - - - - - -public static function isInstalled($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (isset($installed['versions'][$packageName])) { -return true; -} -} - -return false; -} - - - - - - - - - - - - - - -public static function satisfies(VersionParser $parser, $packageName, $constraint) -{ -$constraint = $parser->parseConstraints($constraint); -$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - -return $provided->matches($constraint); -} - - - - - - - - - - -public static function getVersionRanges($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -$ranges = array(); -if (isset($installed['versions'][$packageName]['pretty_version'])) { -$ranges[] = $installed['versions'][$packageName]['pretty_version']; -} -if (array_key_exists('aliases', $installed['versions'][$packageName])) { -$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); -} -if (array_key_exists('replaced', $installed['versions'][$packageName])) { -$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); -} -if (array_key_exists('provided', $installed['versions'][$packageName])) { -$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); -} - -return implode(' || ', $ranges); -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getVersion($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -if (!isset($installed['versions'][$packageName]['version'])) { -return null; -} - -return $installed['versions'][$packageName]['version']; -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getPrettyVersion($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -if (!isset($installed['versions'][$packageName]['pretty_version'])) { -return null; -} - -return $installed['versions'][$packageName]['pretty_version']; -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getReference($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -if (!isset($installed['versions'][$packageName]['reference'])) { -return null; -} - -return $installed['versions'][$packageName]['reference']; -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getRootPackage() -{ -$installed = self::getInstalled(); - -return $installed[0]['root']; -} - - - - - - - -public static function getRawData() -{ -return self::$installed; -} - - - - - - - - - - - - - - - - - - - -public static function reload($data) -{ -self::$installed = $data; -self::$installedByVendor = array(); -} - - - - -private static function getInstalled() -{ -if (null === self::$canGetVendors) { -self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); -} - -$installed = array(); - -if (self::$canGetVendors) { - -foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { -if (isset(self::$installedByVendor[$vendorDir])) { -$installed[] = self::$installedByVendor[$vendorDir]; -} elseif (is_file($vendorDir.'/composer/installed.php')) { -$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; -} -} -} - -$installed[] = self::$installed; - -return $installed; -} + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints($constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = require __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + $installed[] = self::$installed; + + return $installed; + } } diff --git a/application/vendor/composer/autoload_classmap.php b/application/vendor/composer/autoload_classmap.php index 02bc0ed..6193e36 100644 --- a/application/vendor/composer/autoload_classmap.php +++ b/application/vendor/composer/autoload_classmap.php @@ -2,7 +2,7 @@ // autoload_classmap.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( @@ -10,6 +10,7 @@ return array( 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PHPGangsta_GoogleAuthenticator' => $vendorDir . '/phpgangsta/googleauthenticator/PHPGangsta/GoogleAuthenticator.php', + 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/Exception.php', 'SebastianBergmann\\Timer\\RuntimeException' => $vendorDir . '/phpunit/php-timer/src/RuntimeException.php', 'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', diff --git a/application/vendor/composer/autoload_files.php b/application/vendor/composer/autoload_files.php index 783b759..cc635e4 100644 --- a/application/vendor/composer/autoload_files.php +++ b/application/vendor/composer/autoload_files.php @@ -2,15 +2,16 @@ // autoload_files.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( + '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php', + '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', - '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'b46ad4fe52f4d1899a2951c7e6ea56b0' => $vendorDir . '/voku/portable-utf8/bootstrap.php', ); diff --git a/application/vendor/composer/autoload_namespaces.php b/application/vendor/composer/autoload_namespaces.php index 3df92f2..86f68ff 100644 --- a/application/vendor/composer/autoload_namespaces.php +++ b/application/vendor/composer/autoload_namespaces.php @@ -2,7 +2,7 @@ // autoload_namespaces.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( diff --git a/application/vendor/composer/autoload_psr4.php b/application/vendor/composer/autoload_psr4.php index ee02ed3..880bd66 100644 --- a/application/vendor/composer/autoload_psr4.php +++ b/application/vendor/composer/autoload_psr4.php @@ -2,7 +2,7 @@ // autoload_psr4.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( diff --git a/application/vendor/composer/autoload_real.php b/application/vendor/composer/autoload_real.php index be8361b..ef70d40 100644 --- a/application/vendor/composer/autoload_real.php +++ b/application/vendor/composer/autoload_real.php @@ -25,38 +25,15 @@ class ComposerAutoloaderInitde424ad7860a40a14ec11f109060d25d require __DIR__ . '/platform_check.php'; spl_autoload_register(array('ComposerAutoloaderInitde424ad7860a40a14ec11f109060d25d', 'loadClassLoader'), true, true); - self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); spl_autoload_unregister(array('ComposerAutoloaderInitde424ad7860a40a14ec11f109060d25d', 'loadClassLoader')); - $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInitde424ad7860a40a14ec11f109060d25d::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } + require __DIR__ . '/autoload_static.php'; + call_user_func(\Composer\Autoload\ComposerStaticInitde424ad7860a40a14ec11f109060d25d::getInitializer($loader)); $loader->register(true); - if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInitde424ad7860a40a14ec11f109060d25d::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } + $includeFiles = \Composer\Autoload\ComposerStaticInitde424ad7860a40a14ec11f109060d25d::$files; foreach ($includeFiles as $fileIdentifier => $file) { composerRequirede424ad7860a40a14ec11f109060d25d($fileIdentifier, $file); } @@ -65,11 +42,16 @@ class ComposerAutoloaderInitde424ad7860a40a14ec11f109060d25d } } +/** + * @param string $fileIdentifier + * @param string $file + * @return void + */ function composerRequirede424ad7860a40a14ec11f109060d25d($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; } } diff --git a/application/vendor/composer/autoload_static.php b/application/vendor/composer/autoload_static.php index bd83d2a..508bec7 100644 --- a/application/vendor/composer/autoload_static.php +++ b/application/vendor/composer/autoload_static.php @@ -7,12 +7,13 @@ namespace Composer\Autoload; class ComposerStaticInitde424ad7860a40a14ec11f109060d25d { public static $files = array ( + '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php', + '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', - '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'b46ad4fe52f4d1899a2951c7e6ea56b0' => __DIR__ . '/..' . '/voku/portable-utf8/bootstrap.php', ); @@ -113,6 +114,7 @@ class ComposerStaticInitde424ad7860a40a14ec11f109060d25d 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PHPGangsta_GoogleAuthenticator' => __DIR__ . '/..' . '/phpgangsta/googleauthenticator/PHPGangsta/GoogleAuthenticator.php', + 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/Exception.php', 'SebastianBergmann\\Timer\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-timer/src/RuntimeException.php', 'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', diff --git a/application/vendor/composer/installed.json b/application/vendor/composer/installed.json index 5db7bd9..469cd98 100644 --- a/application/vendor/composer/installed.json +++ b/application/vendor/composer/installed.json @@ -65,17 +65,17 @@ }, { "name": "gregwar/captcha", - "version": "v1.1.9", - "version_normalized": "1.1.9.0", + "version": "v1.2.0", + "version_normalized": "1.2.0.0", "source": { "type": "git", "url": "https://github.com/Gregwar/Captcha.git", - "reference": "4bb668e6b40e3205a020ca5ee4ca8cff8b8780c5" + "reference": "6e5b61b66ac89885b505153f4ef9a74ffa5b3074" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Gregwar/Captcha/zipball/4bb668e6b40e3205a020ca5ee4ca8cff8b8780c5", - "reference": "4bb668e6b40e3205a020ca5ee4ca8cff8b8780c5", + "url": "https://api.github.com/repos/Gregwar/Captcha/zipball/6e5b61b66ac89885b505153f4ef9a74ffa5b3074", + "reference": "6e5b61b66ac89885b505153f4ef9a74ffa5b3074", "shasum": "" }, "require": { @@ -87,8 +87,8 @@ "require-dev": { "phpunit/phpunit": "^6.4" }, - "time": "2020-03-24T14:39:05+00:00", - "type": "captcha", + "time": "2023-03-24T22:12:41+00:00", + "type": "library", "installation-source": "dist", "autoload": { "psr-4": { @@ -119,7 +119,7 @@ ], "support": { "issues": "https://github.com/Gregwar/Captcha/issues", - "source": "https://github.com/Gregwar/Captcha/tree/master" + "source": "https://github.com/Gregwar/Captcha/tree/v1.2.0" }, "install-path": "../gregwar/captcha" }, @@ -171,17 +171,17 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.5.1", - "version_normalized": "6.5.1.0", + "version": "v6.8.0", + "version_normalized": "6.8.0.0", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355" + "reference": "df16b615e371d81fb79e506277faea67a1be18f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dd803df5ad7492e1b40637f7ebd258fee5ca7355", - "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/df16b615e371d81fb79e506277faea67a1be18f1", + "reference": "df16b615e371d81fb79e506277faea67a1be18f1", "shasum": "" }, "require": { @@ -191,24 +191,26 @@ "php": ">=5.5.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.2", - "php-parallel-lint/php-console-highlighter": "^0.5.0", - "php-parallel-lint/php-parallel-lint": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.2", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", "phpcompatibility/php-compatibility": "^9.3.5", "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.6.0", - "yoast/phpunit-polyfills": "^1.0.0" + "squizlabs/php_codesniffer": "^3.7.1", + "yoast/phpunit-polyfills": "^1.0.4" }, "suggest": { "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", "league/oauth2-google": "Needed for Google XOAUTH2 authentication", "psr/log": "For optional PSR-3 debug logging", - "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" }, - "time": "2021-08-18T09:14:16+00:00", + "time": "2023-03-06T14:43:22+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -240,7 +242,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.5.1" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.0" }, "funding": [ { @@ -376,25 +378,96 @@ "install-path": "../rmccue/requests" }, { - "name": "symfony/finder", - "version": "v5.3.7", - "version_normalized": "5.3.7.0", + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2022-01-02T09:53:40+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/deprecation-contracts" + }, + { + "name": "symfony/finder", + "version": "v5.4.21", + "version_normalized": "5.4.21.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, - "time": "2021-08-04T21:20:46+00:00", + "time": "2023-02-16T09:33:00+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -422,7 +495,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.21" }, "funding": [ { @@ -442,30 +515,33 @@ }, { "name": "symfony/polyfill-iconv", - "version": "v1.23.0", - "version_normalized": "1.23.0.0", + "version": "v1.27.0", + "version_normalized": "1.27.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" + "reference": "927013f3aac555983a5059aada98e1907d842695" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695", + "reference": "927013f3aac555983a5059aada98e1907d842695", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-iconv": "*" + }, "suggest": { "ext-iconv": "For best performance" }, - "time": "2021-05-27T09:27:20+00:00", + "time": "2022-11-03T14:55:06+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -474,12 +550,12 @@ }, "installation-source": "dist", "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -505,7 +581,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.0" }, "funding": [ { @@ -525,17 +601,17 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.1", - "version_normalized": "1.23.1.0", + "version": "v1.27.0", + "version_normalized": "1.27.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -544,11 +620,11 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2021-05-27T12:26:48+00:00", + "time": "2022-11-03T14:55:06+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -557,12 +633,12 @@ }, "installation-source": "dist", "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -589,7 +665,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -609,17 +685,17 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", - "version_normalized": "1.23.0.0", + "version": "v1.27.0", + "version_normalized": "1.27.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -628,11 +704,11 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2021-02-19T12:13:01+00:00", + "time": "2022-11-03T14:55:06+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -641,12 +717,12 @@ }, "installation-source": "dist", "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -676,7 +752,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -696,30 +772,33 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", - "version_normalized": "1.23.1.0", + "version": "v1.27.0", + "version_normalized": "1.27.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, - "time": "2021-05-27T12:26:48+00:00", + "time": "2022-11-03T14:55:06+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -728,12 +807,12 @@ }, "installation-source": "dist", "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -759,7 +838,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -779,27 +858,27 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.23.0", - "version_normalized": "1.23.0.0", + "version": "v1.27.0", + "version_normalized": "1.27.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2021-05-27T09:17:38+00:00", + "time": "2022-11-03T14:55:06+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -808,12 +887,12 @@ }, "installation-source": "dist", "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -838,7 +917,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -858,27 +937,27 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", - "version_normalized": "1.23.1.0", + "version": "v1.27.0", + "version_normalized": "1.27.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2021-07-28T13:41:28+00:00", + "time": "2022-11-03T14:55:06+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -887,12 +966,12 @@ }, "installation-source": "dist", "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -924,7 +1003,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -944,27 +1023,27 @@ }, { "name": "voku/anti-xss", - "version": "4.1.33", - "version_normalized": "4.1.33.0", + "version": "4.1.41", + "version_normalized": "4.1.41.0", "source": { "type": "git", "url": "https://github.com/voku/anti-xss.git", - "reference": "dcd44ad3726e97e3ea924e4c7257cb33976b71a5" + "reference": "55a403436494e44a2547a8d42de68e6cad4bca1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/anti-xss/zipball/dcd44ad3726e97e3ea924e4c7257cb33976b71a5", - "reference": "dcd44ad3726e97e3ea924e4c7257cb33976b71a5", + "url": "https://api.github.com/repos/voku/anti-xss/zipball/55a403436494e44a2547a8d42de68e6cad4bca1d", + "reference": "55a403436494e44a2547a8d42de68e6cad4bca1d", "shasum": "" }, "require": { "php": ">=7.0.0", - "voku/portable-utf8": "~5.4.51" + "voku/portable-utf8": "~6.0.2" }, "require-dev": { "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" }, - "time": "2021-10-03T21:37:05+00:00", + "time": "2023-02-12T15:56:55+00:00", "type": "library", "extra": { "branch-alias": { @@ -1002,7 +1081,7 @@ ], "support": { "issues": "https://github.com/voku/anti-xss/issues", - "source": "https://github.com/voku/anti-xss/tree/4.1.33" + "source": "https://github.com/voku/anti-xss/tree/4.1.41" }, "funding": [ { @@ -1030,17 +1109,17 @@ }, { "name": "voku/portable-ascii", - "version": "1.5.6", - "version_normalized": "1.5.6.0", + "version": "2.0.1", + "version_normalized": "2.0.1.0", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "80953678b19901e5165c56752d087fc11526017c" + "reference": "b56450eed252f6801410d810c8e1727224ae0743" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", - "reference": "80953678b19901e5165c56752d087fc11526017c", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", "shasum": "" }, "require": { @@ -1052,7 +1131,7 @@ "suggest": { "ext-intl": "Use Intl for transliterator_transliterate() support" }, - "time": "2020-11-12T00:07:28+00:00", + "time": "2022-03-08T17:03:00+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1079,7 +1158,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" }, "funding": [ { @@ -1107,17 +1186,17 @@ }, { "name": "voku/portable-utf8", - "version": "5.4.51", - "version_normalized": "5.4.51.0", + "version": "6.0.13", + "version_normalized": "6.0.13.0", "source": { "type": "git", "url": "https://github.com/voku/portable-utf8.git", - "reference": "578f5266725dc9880483d24ad0cfb39f8ce170f7" + "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-utf8/zipball/578f5266725dc9880483d24ad0cfb39f8ce170f7", - "reference": "578f5266725dc9880483d24ad0cfb39f8ce170f7", + "url": "https://api.github.com/repos/voku/portable-utf8/zipball/b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", + "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", "shasum": "" }, "require": { @@ -1127,10 +1206,14 @@ "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php72": "~1.0", - "voku/portable-ascii": "~1.5.6" + "voku/portable-ascii": "~2.0.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "phpstan/phpstan": "1.9.*@dev", + "phpstan/phpstan-strict-rules": "1.4.*@dev", + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0", + "thecodingmachine/phpstan-strict-rules": "1.0.*@dev", + "voku/phpstan-rules": "3.1.*@dev" }, "suggest": { "ext-ctype": "Use Ctype for e.g. hexadecimal digit detection", @@ -1140,16 +1223,16 @@ "ext-json": "Use JSON for string detection", "ext-mbstring": "Use Mbstring for best performance" }, - "time": "2020-12-02T01:58:49+00:00", + "time": "2023-03-08T08:35:38+00:00", "type": "library", "installation-source": "dist", "autoload": { - "psr-4": { - "voku\\": "src/voku/" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "voku\\": "src/voku/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1181,7 +1264,7 @@ ], "support": { "issues": "https://github.com/voku/portable-utf8/issues", - "source": "https://github.com/voku/portable-utf8/tree/5.4.51" + "source": "https://github.com/voku/portable-utf8/tree/6.0.13" }, "funding": [ { diff --git a/application/vendor/composer/installed.php b/application/vendor/composer/installed.php index 892ee15..bcab328 100644 --- a/application/vendor/composer/installed.php +++ b/application/vendor/composer/installed.php @@ -1,169 +1,178 @@ - - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( + array( + 'name' => '__root__', + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'd6445ec578443bf3e24fb14161a5f9a8d36edfbe', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, ), - 'reference' => '7034c221dff1ac4fdae43db9db67ce3bf9a28ca1', - 'name' => '__root__', - ), - 'versions' => - array ( - '__root__' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '7034c221dff1ac4fdae43db9db67ce3bf9a28ca1', + 'versions' => array( + '__root__' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'd6445ec578443bf3e24fb14161a5f9a8d36edfbe', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'catfan/medoo' => array( + 'pretty_version' => 'v1.7.10', + 'version' => '1.7.10.0', + 'reference' => '2d675f73e23f63bbaeb9a8aa33318659a3d3c32f', + 'type' => 'framework', + 'install_path' => __DIR__ . '/../catfan/medoo', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'gregwar/captcha' => array( + 'pretty_version' => 'v1.2.0', + 'version' => '1.2.0.0', + 'reference' => '6e5b61b66ac89885b505153f4ef9a74ffa5b3074', + 'type' => 'library', + 'install_path' => __DIR__ . '/../gregwar/captcha', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phpgangsta/googleauthenticator' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => '505c2af8337b559b33557f37cda38e5f843f3768', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpgangsta/googleauthenticator', + 'aliases' => array( + 0 => '9999999-dev', + ), + 'dev_requirement' => false, + ), + 'phpmailer/phpmailer' => array( + 'pretty_version' => 'v6.8.0', + 'version' => '6.8.0.0', + 'reference' => 'df16b615e371d81fb79e506277faea67a1be18f1', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpmailer/phpmailer', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phpunit/php-timer' => array( + 'pretty_version' => '2.1.3', + 'version' => '2.1.3.0', + 'reference' => '2454ae1765516d20c4ffe103d85a58a9a3bd5662', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpunit/php-timer', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'rmccue/requests' => array( + 'pretty_version' => 'v1.8.1', + 'version' => '1.8.1.0', + 'reference' => '82e6936366eac3af4d836c18b9d8c31028fe4cd5', + 'type' => 'library', + 'install_path' => __DIR__ . '/../rmccue/requests', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/deprecation-contracts' => array( + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', + 'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/finder' => array( + 'pretty_version' => 'v5.4.21', + 'version' => '5.4.21.0', + 'reference' => '078e9a5e1871fcfe6a5ce421b539344c21afef19', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/finder', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-iconv' => array( + 'pretty_version' => 'v1.27.0', + 'version' => '1.27.0.0', + 'reference' => '927013f3aac555983a5059aada98e1907d842695', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-iconv', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-intl-grapheme' => array( + 'pretty_version' => 'v1.27.0', + 'version' => '1.27.0.0', + 'reference' => '511a08c03c1960e08a883f4cffcacd219b758354', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-intl-normalizer' => array( + 'pretty_version' => 'v1.27.0', + 'version' => '1.27.0.0', + 'reference' => '19bd1e4fcd5b91116f14d8533c57831ed00571b6', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-mbstring' => array( + 'pretty_version' => 'v1.27.0', + 'version' => '1.27.0.0', + 'reference' => '8ad114f6b39e2c98a8b0e3bd907732c207c2b534', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-php72' => array( + 'pretty_version' => 'v1.27.0', + 'version' => '1.27.0.0', + 'reference' => '869329b1e9894268a8a61dabb69153029b7a8c97', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-php72', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-php80' => array( + 'pretty_version' => 'v1.27.0', + 'version' => '1.27.0.0', + 'reference' => '7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-php80', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'voku/anti-xss' => array( + 'pretty_version' => '4.1.41', + 'version' => '4.1.41.0', + 'reference' => '55a403436494e44a2547a8d42de68e6cad4bca1d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../voku/anti-xss', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'voku/portable-ascii' => array( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'reference' => 'b56450eed252f6801410d810c8e1727224ae0743', + 'type' => 'library', + 'install_path' => __DIR__ . '/../voku/portable-ascii', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'voku/portable-utf8' => array( + 'pretty_version' => '6.0.13', + 'version' => '6.0.13.0', + 'reference' => 'b8ce36bf26593e5c2e81b1850ef0ffb299d2043f', + 'type' => 'library', + 'install_path' => __DIR__ . '/../voku/portable-utf8', + 'aliases' => array(), + 'dev_requirement' => false, + ), ), - 'catfan/medoo' => - array ( - 'pretty_version' => 'v1.7.10', - 'version' => '1.7.10.0', - 'aliases' => - array ( - ), - 'reference' => '2d675f73e23f63bbaeb9a8aa33318659a3d3c32f', - ), - 'gregwar/captcha' => - array ( - 'pretty_version' => 'v1.1.9', - 'version' => '1.1.9.0', - 'aliases' => - array ( - ), - 'reference' => '4bb668e6b40e3205a020ca5ee4ca8cff8b8780c5', - ), - 'phpgangsta/googleauthenticator' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - 0 => '9999999-dev', - ), - 'reference' => '505c2af8337b559b33557f37cda38e5f843f3768', - ), - 'phpmailer/phpmailer' => - array ( - 'pretty_version' => 'v6.5.1', - 'version' => '6.5.1.0', - 'aliases' => - array ( - ), - 'reference' => 'dd803df5ad7492e1b40637f7ebd258fee5ca7355', - ), - 'phpunit/php-timer' => - array ( - 'pretty_version' => '2.1.3', - 'version' => '2.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '2454ae1765516d20c4ffe103d85a58a9a3bd5662', - ), - 'rmccue/requests' => - array ( - 'pretty_version' => 'v1.8.1', - 'version' => '1.8.1.0', - 'aliases' => - array ( - ), - 'reference' => '82e6936366eac3af4d836c18b9d8c31028fe4cd5', - ), - 'symfony/finder' => - array ( - 'pretty_version' => 'v5.3.7', - 'version' => '5.3.7.0', - 'aliases' => - array ( - ), - 'reference' => 'a10000ada1e600d109a6c7632e9ac42e8bf2fb93', - ), - 'symfony/polyfill-iconv' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '63b5bb7db83e5673936d6e3b8b3e022ff6474933', - ), - 'symfony/polyfill-intl-grapheme' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '16880ba9c5ebe3642d1995ab866db29270b36535', - ), - 'symfony/polyfill-intl-normalizer' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8', - ), - 'symfony/polyfill-mbstring' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '9174a3d80210dca8daa7f31fec659150bbeabfc6', - ), - 'symfony/polyfill-php72' => - array ( - 'pretty_version' => 'v1.23.0', - 'version' => '1.23.0.0', - 'aliases' => - array ( - ), - 'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976', - ), - 'symfony/polyfill-php80' => - array ( - 'pretty_version' => 'v1.23.1', - 'version' => '1.23.1.0', - 'aliases' => - array ( - ), - 'reference' => '1100343ed1a92e3a38f9ae122fc0eb21602547be', - ), - 'voku/anti-xss' => - array ( - 'pretty_version' => '4.1.33', - 'version' => '4.1.33.0', - 'aliases' => - array ( - ), - 'reference' => 'dcd44ad3726e97e3ea924e4c7257cb33976b71a5', - ), - 'voku/portable-ascii' => - array ( - 'pretty_version' => '1.5.6', - 'version' => '1.5.6.0', - 'aliases' => - array ( - ), - 'reference' => '80953678b19901e5165c56752d087fc11526017c', - ), - 'voku/portable-utf8' => - array ( - 'pretty_version' => '5.4.51', - 'version' => '5.4.51.0', - 'aliases' => - array ( - ), - 'reference' => '578f5266725dc9880483d24ad0cfb39f8ce170f7', - ), - ), ); diff --git a/application/vendor/gregwar/captcha/README.md b/application/vendor/gregwar/captcha/README.md index e7dd65f..aaeff98 100644 --- a/application/vendor/gregwar/captcha/README.md +++ b/application/vendor/gregwar/captcha/README.md @@ -105,7 +105,7 @@ use Gregwar\Captcha\CaptchaBuilder; use Gregwar\Captcha\PhraseBuilder; // Will build phrases of 3 characters -$phraseBuilder = new PhraseBuilder(4) +$phraseBuilder = new PhraseBuilder(4); // Will build phrases of 5 characters, only digits $phraseBuilder = new PhraseBuilder(5, '0123456789'); @@ -125,7 +125,7 @@ $captcha = new CaptchaBuilder('hello'); Complete example ================ -If you want to see an example you can have a look at he ``demo/form.php``, which uses ``demo/session.php`` to +If you want to see an example you can have a look at the ``demo/form.php``, which uses ``demo/session.php`` to render a captcha and check it after the submission Symfony Bundle diff --git a/application/vendor/gregwar/captcha/composer.json b/application/vendor/gregwar/captcha/composer.json index 2d0752d..4b1ad58 100644 --- a/application/vendor/gregwar/captcha/composer.json +++ b/application/vendor/gregwar/captcha/composer.json @@ -1,6 +1,6 @@ { "name": "gregwar/captcha", - "type": "captcha", + "type": "library", "description": "Captcha generator", "keywords": ["captcha", "spam", "bot"], "homepage": "https://github.com/Gregwar/Captcha", diff --git a/application/vendor/gregwar/captcha/src/Gregwar/Captcha/CaptchaBuilder.php b/application/vendor/gregwar/captcha/src/Gregwar/Captcha/CaptchaBuilder.php index 4d53639..349e8ec 100644 --- a/application/vendor/gregwar/captcha/src/Gregwar/Captcha/CaptchaBuilder.php +++ b/application/vendor/gregwar/captcha/src/Gregwar/Captcha/CaptchaBuilder.php @@ -140,7 +140,7 @@ class CaptchaBuilder implements CaptchaBuilderInterface } else { $this->builder = $builder; } - + $this->phrase = is_string($phrase) ? $phrase : $this->builder->build($phrase); } @@ -427,7 +427,6 @@ class CaptchaBuilder implements CaptchaBuilderInterface $color = $this->backgroundColor; $bg = imagecolorallocate($image, $color[0], $color[1], $color[2]); } - $this->background = $bg; imagefill($image, 0, 0, $bg); } else { // use a random background image @@ -605,7 +604,7 @@ class CaptchaBuilder implements CaptchaBuilderInterface $value = current($this->fingerprint); next($this->fingerprint); } else { - $value = mt_rand($min, $max); + $value = mt_rand((int)$min, (int)$max); $this->fingerprint[] = $value; } diff --git a/application/vendor/phpmailer/phpmailer/README.md b/application/vendor/phpmailer/phpmailer/README.md index 81b0897..53e66f1 100644 --- a/application/vendor/phpmailer/phpmailer/README.md +++ b/application/vendor/phpmailer/phpmailer/README.md @@ -1,3 +1,5 @@ +[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://supportukrainenow.org/) + ![PHPMailer](https://raw.github.com/PHPMailer/PHPMailer/master/examples/images/phpmailer.png) # PHPMailer – A full-featured email creation and transfer class for PHP @@ -8,12 +10,13 @@ [![Total Downloads](https://poser.pugx.org/phpmailer/phpmailer/downloads)](https://packagist.org/packages/phpmailer/phpmailer) [![License](https://poser.pugx.org/phpmailer/phpmailer/license.svg)](https://packagist.org/packages/phpmailer/phpmailer) [![API Docs](https://github.com/phpmailer/phpmailer/workflows/Docs/badge.svg)](https://phpmailer.github.io/PHPMailer/) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer/badge)](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer) ## Features - Probably the world's most popular code for sending email from PHP! - Used by many open-source projects: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more - Integrated SMTP support – send without a local mail server -- Send emails with multiple To, CC, BCC and Reply-to addresses +- Send emails with multiple To, CC, BCC, and Reply-to addresses - Multipart/alternative emails for mail clients that do not read HTML email - Add attachments, including inline - Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings @@ -22,7 +25,7 @@ - Protects against header injection attacks - Error messages in over 50 languages! - DKIM and S/MIME signing support -- Compatible with PHP 5.5 and later, including PHP 8.1 +- Compatible with PHP 5.5 and later, including PHP 8.2 - Namespaced to prevent name clashes - Much more! @@ -35,7 +38,7 @@ The PHP `mail()` function usually sends via a local mail server, typically front *Please* don't be tempted to do it yourself – if you don't use PHPMailer, there are many other excellent libraries that you should look at before rolling your own. Try [SwiftMailer](https://swiftmailer.symfony.com/) -, [Laminas/Mail](https://docs.laminas.dev/laminas-mail/), [ZetaComponents](https://github.com/zetacomponents/Mail) etc. +, [Laminas/Mail](https://docs.laminas.dev/laminas-mail/), [ZetaComponents](https://github.com/zetacomponents/Mail), etc. ## License This software is distributed under the [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html) license, along with the [GPL Cooperation Commitment](https://gplcc.github.io/gplcc/). Please read [LICENSE](https://github.com/PHPMailer/PHPMailer/blob/master/LICENSE) for information on the software availability and distribution. @@ -44,7 +47,7 @@ This software is distributed under the [LGPL 2.1](http://www.gnu.org/licenses/lg PHPMailer is available on [Packagist](https://packagist.org/packages/phpmailer/phpmailer) (using semantic versioning), and installation via [Composer](https://getcomposer.org) is the recommended way to install PHPMailer. Just add this line to your `composer.json` file: ```json -"phpmailer/phpmailer": "^6.5" +"phpmailer/phpmailer": "^6.8.0" ``` or run @@ -133,14 +136,14 @@ try { } ``` -You'll find plenty to play with in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder, which covers many common scenarios including sending through gmail, building contact forms, sending to mailing lists, and more. +You'll find plenty to play with in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder, which covers many common scenarios including sending through Gmail, building contact forms, sending to mailing lists, and more. If you are re-using the instance (e.g. when sending to a mailing list), you may need to clear the recipient list to avoid sending duplicate messages. See [the mailing list example](https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps) for further guidance. That's it. You should now be ready to use PHPMailer! ## Localization -PHPMailer defaults to English, but in the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/) folder you'll find many translations for PHPMailer error messages that you may encounter. Their filenames contain [ISO 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code for the translations, for example `fr` for French. To specify a language, you need to tell PHPMailer which one to use, like this: +PHPMailer defaults to English, but in the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/) folder, you'll find many translations for PHPMailer error messages that you may encounter. Their filenames contain [ISO 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code for the translations, for example `fr` for French. To specify a language, you need to tell PHPMailer which one to use, like this: ```php //To load the French version @@ -175,9 +178,9 @@ Please disclose any vulnerabilities found responsibly – report security issues See [SECURITY](https://github.com/PHPMailer/PHPMailer/tree/master/SECURITY.md) and [PHPMailer's security advisories on GitHub](https://github.com/PHPMailer/PHPMailer/security). ## Contributing -Please submit bug reports, suggestions and pull requests to the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues). +Please submit bug reports, suggestions, and pull requests to the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues). -We're particularly interested in fixing edge-cases, expanding test coverage and updating translations. +We're particularly interested in fixing edge cases, expanding test coverage, and updating translations. If you found a mistake in the docs, or want to add something, go ahead and amend the wiki – anyone can edit it. @@ -201,7 +204,7 @@ Donations are very welcome, whether in beer 🍺, T-shirts 👕, or cold, hard c Available as part of the Tidelift Subscription. The maintainers of PHPMailer and thousands of other packages are working with Tidelift to deliver commercial -support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and +support and maintenance for the open-source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-phpmailer-phpmailer?utm_source=packagist-phpmailer-phpmailer&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) @@ -219,9 +222,9 @@ See [changelog](changelog.md). ### What's changed since moving from SourceForge? - Official successor to the SourceForge and Google Code projects. - Test suite. -- Continuous integration with Github Actions. +- Continuous integration with GitHub Actions. - Composer support. - Public development. - Additional languages and language strings. - CRAM-MD5 authentication support. -- Preserves full repo history of authors, commits and branches from the original SourceForge project. +- Preserves full repo history of authors, commits, and branches from the original SourceForge project. diff --git a/application/vendor/phpmailer/phpmailer/VERSION b/application/vendor/phpmailer/phpmailer/VERSION index 3d5762e..8a1c5c7 100644 --- a/application/vendor/phpmailer/phpmailer/VERSION +++ b/application/vendor/phpmailer/phpmailer/VERSION @@ -1 +1 @@ -6.5.1 \ No newline at end of file +6.8.0 \ No newline at end of file diff --git a/application/vendor/phpmailer/phpmailer/composer.json b/application/vendor/phpmailer/phpmailer/composer.json index 28557f5..37e3d6e 100644 --- a/application/vendor/phpmailer/phpmailer/composer.json +++ b/application/vendor/phpmailer/phpmailer/composer.json @@ -25,6 +25,11 @@ "type": "github" } ], + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, "require": { "php": ">=5.5.0", "ext-ctype": "*", @@ -32,21 +37,23 @@ "ext-hash": "*" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.2", - "php-parallel-lint/php-console-highlighter": "^0.5.0", - "php-parallel-lint/php-parallel-lint": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.2", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", "phpcompatibility/php-compatibility": "^9.3.5", "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.6.0", - "yoast/phpunit-polyfills": "^1.0.0" + "squizlabs/php_codesniffer": "^3.7.1", + "yoast/phpunit-polyfills": "^1.0.4" }, "suggest": { "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", "league/oauth2-google": "Needed for Google XOAUTH2 authentication", "psr/log": "For optional PSR-3 debug logging", - "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication", "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" }, "autoload": { @@ -65,7 +72,7 @@ "test": "./vendor/bin/phpunit --no-coverage", "coverage": "./vendor/bin/phpunit", "lint": [ - "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . -e php,phps --exclude vendor --exclude .git --exclude build" + "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . --show-deprecated -e php,phps --exclude vendor --exclude .git --exclude build" ] } } diff --git a/application/vendor/phpmailer/phpmailer/get_oauth_token.php b/application/vendor/phpmailer/phpmailer/get_oauth_token.php index befdc34..cda0445 100644 --- a/application/vendor/phpmailer/phpmailer/get_oauth_token.php +++ b/application/vendor/phpmailer/phpmailer/get_oauth_token.php @@ -44,14 +44,31 @@ use League\OAuth2\Client\Provider\Google; use Hayageek\OAuth2\Client\Provider\Yahoo; //@see https://github.com/stevenmaguire/oauth2-microsoft use Stevenmaguire\OAuth2\Client\Provider\Microsoft; +//@see https://github.com/greew/oauth2-azure-provider +use Greew\OAuth2\Client\Provider\Azure; -if (!isset($_GET['code']) && !isset($_GET['provider'])) { +if (!isset($_GET['code']) && !isset($_POST['provider'])) { ?> -Select Provider:
-Google
-Yahoo
-Microsoft/Outlook/Hotmail/Live/Office365
+ +
+

Select Provider

+ +
+ +
+ +
+ +
+

Enter id and secret

+

These details are obtained by setting up an app in your provider's developer console. +

+

ClientId:

+

ClientSecret:

+

TenantID (only relevant for Azure):

+ +
[ + 'https://outlook.office.com/SMTP.Send', + 'offline_access' + ] + ]; + break; } if (null === $provider) { diff --git a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-ch.php b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-ch.php deleted file mode 100644 index 500c952..0000000 --- a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-ch.php +++ /dev/null @@ -1,27 +0,0 @@ - - */ - -$PHPMAILER_LANG['authenticate'] = 'SMTP 错误:身份验证失败。'; -$PHPMAILER_LANG['connect_host'] = 'SMTP 错误: 不能连接SMTP主机。'; -$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 错误: 数据不可接受。'; -//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; -$PHPMAILER_LANG['encoding'] = '未知编码:'; -$PHPMAILER_LANG['execute'] = '不能执行: '; -$PHPMAILER_LANG['file_access'] = '不能访问文件:'; -$PHPMAILER_LANG['file_open'] = '文件错误:不能打开文件:'; -$PHPMAILER_LANG['from_failed'] = '下面的发送地址邮件发送失败了: '; -$PHPMAILER_LANG['instantiate'] = '不能实现mail方法。'; -//$PHPMAILER_LANG['invalid_address'] = 'Invalid address: '; -$PHPMAILER_LANG['mailer_not_supported'] = ' 您所选择的发送邮件的方法并不支持。'; -$PHPMAILER_LANG['provide_address'] = '您必须提供至少一个 收信人的email地址。'; -$PHPMAILER_LANG['recipients_failed'] = 'SMTP 错误: 下面的 收件人失败了: '; -//$PHPMAILER_LANG['signing'] = 'Signing Error: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-da.php b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-da.php index 1edba1d..8b7b38a 100644 --- a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-da.php +++ b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-da.php @@ -14,16 +14,22 @@ $PHPMAILER_LANG['data_not_accepted'] = 'SMTP fejl: Data blev ikke accepteret. $PHPMAILER_LANG['empty_message'] = 'Meddelelsen er uden indhold'; $PHPMAILER_LANG['encoding'] = 'Ukendt encode-format: '; $PHPMAILER_LANG['execute'] = 'Kunne ikke afvikle: '; +$PHPMAILER_LANG['extension_missing'] = 'Udvidelse mangler: '; $PHPMAILER_LANG['file_access'] = 'Kunne ikke tilgå filen: '; $PHPMAILER_LANG['file_open'] = 'Fil fejl: Kunne ikke åbne filen: '; $PHPMAILER_LANG['from_failed'] = 'Følgende afsenderadresse er forkert: '; $PHPMAILER_LANG['instantiate'] = 'Email funktionen kunne ikke initialiseres.'; $PHPMAILER_LANG['invalid_address'] = 'Udgyldig adresse: '; +$PHPMAILER_LANG['invalid_header'] = 'Ugyldig header navn eller værdi'; +$PHPMAILER_LANG['invalid_hostentry'] = 'Ugyldig hostentry: '; +$PHPMAILER_LANG['invalid_host'] = 'Ugyldig vært: '; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer understøttes ikke.'; $PHPMAILER_LANG['provide_address'] = 'Indtast mindst en modtagers email adresse.'; -$PHPMAILER_LANG['recipients_failed'] = 'SMTP fejl: Følgende modtagere er forkerte: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP fejl: Følgende modtagere fejlede: '; $PHPMAILER_LANG['signing'] = 'Signeringsfejl: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP kode: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Yderligere SMTP info: '; $PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fejlede.'; +$PHPMAILER_LANG['smtp_detail'] = 'Detalje: '; $PHPMAILER_LANG['smtp_error'] = 'SMTP server fejl: '; $PHPMAILER_LANG['variable_set'] = 'Kunne ikke definere eller nulstille variablen: '; -$PHPMAILER_LANG['extension_missing'] = 'Udvidelse mangler: '; diff --git a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-el.php b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-el.php index b3d5ca9..339ee57 100644 --- a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-el.php +++ b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-el.php @@ -5,22 +5,29 @@ * @package PHPMailer */ -$PHPMAILER_LANG['authenticate'] = 'SMTP Σφάλμα: Αδυναμία πιστοποίησης (authentication).'; -$PHPMAILER_LANG['connect_host'] = 'SMTP Σφάλμα: Αδυναμία σύνδεσης στον SMTP-Host.'; -$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Σφάλμα: Τα δεδομένα δεν έγιναν αποδεκτά.'; -$PHPMAILER_LANG['empty_message'] = 'Το E-Mail δεν έχει περιεχόμενο .'; -$PHPMAILER_LANG['encoding'] = 'Αγνωστο Encoding-Format: '; -$PHPMAILER_LANG['execute'] = 'Αδυναμία εκτέλεσης ακόλουθης εντολής: '; -$PHPMAILER_LANG['file_access'] = 'Αδυναμία προσπέλασης του αρχείου: '; -$PHPMAILER_LANG['file_open'] = 'Σφάλμα Αρχείου: Δεν είναι δυνατό το άνοιγμα του ακόλουθου αρχείου: '; -$PHPMAILER_LANG['from_failed'] = 'Η παρακάτω διεύθυνση αποστολέα δεν είναι σωστή: '; -$PHPMAILER_LANG['instantiate'] = 'Αδυναμία εκκίνησης Mail function.'; -$PHPMAILER_LANG['invalid_address'] = 'Το μήνυμα δεν εστάλη, η διεύθυνση δεν είναι έγκυρη: '; +$PHPMAILER_LANG['authenticate'] = 'Σφάλμα SMTP: Αδυναμία πιστοποίησης.'; +$PHPMAILER_LANG['buggy_php'] = 'Η έκδοση PHP που χρησιμοποιείτε παρουσιάζει σφάλμα που μπορεί να έχει ως αποτέλεσμα κατεστραμένα μηνύματα. Για να το διορθώσετε, αλλάξτε τον τρόπο αποστολής σε SMTP, απενεργοποιήστε την επιλογή mail.add_x_header στο αρχείο php.ini, αλλάξτε λειτουργικό σε MacOS ή Linux ή αναβαθμίστε την PHP σε έκδοση 7.0.17+ ή 7.1.3+.'; +$PHPMAILER_LANG['connect_host'] = 'Σφάλμα SMTP: Αδυναμία σύνδεσης με τον φιλοξενητή SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Σφάλμα SMTP: Μη αποδεκτά δεδομένα.'; +$PHPMAILER_LANG['empty_message'] = 'Η ηλεκτρονική επιστολή δεν έχει περιεχόμενο.'; +$PHPMAILER_LANG['encoding'] = 'Άγνωστη μορφή κωδικοποίησης: '; +$PHPMAILER_LANG['execute'] = 'Αδυναμία εκτέλεσης: '; +$PHPMAILER_LANG['extension_missing'] = 'Απουσία επέκτασης: '; +$PHPMAILER_LANG['file_access'] = 'Αδυναμία πρόσβασης στο αρχείο: '; +$PHPMAILER_LANG['file_open'] = 'Σφάλμα Αρχείου: Αδυναμία ανοίγματος αρχείου: '; +$PHPMAILER_LANG['from_failed'] = 'Η ακόλουθη διεύθυνση αποστολέα δεν είναι σωστή: '; +$PHPMAILER_LANG['instantiate'] = 'Αδυναμία εκκίνησης συνάρτησης Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Μη έγκυρη διεύθυνση: '; +$PHPMAILER_LANG['invalid_header'] = 'Μη έγκυρο όνομα κεφαλίδας ή τιμή'; +$PHPMAILER_LANG['invalid_hostentry'] = 'Μη έγκυρη εισαγωγή φιλοξενητή: '; +$PHPMAILER_LANG['invalid_host'] = 'Μη έγκυρος φιλοξενητής: '; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer δεν υποστηρίζεται.'; -$PHPMAILER_LANG['provide_address'] = 'Παρακαλούμε δώστε τουλάχιστον μια e-mail διεύθυνση παραλήπτη.'; -$PHPMAILER_LANG['recipients_failed'] = 'SMTP Σφάλμα: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: '; +$PHPMAILER_LANG['provide_address'] = 'Δώστε τουλάχιστον μια ηλεκτρονική διεύθυνση παραλήπτη.'; +$PHPMAILER_LANG['recipients_failed'] = 'Σφάλμα SMTP: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: '; $PHPMAILER_LANG['signing'] = 'Σφάλμα υπογραφής: '; -$PHPMAILER_LANG['smtp_connect_failed'] = 'Αποτυχία σύνδεσης στον SMTP Server.'; -$PHPMAILER_LANG['smtp_error'] = 'Σφάλμα από τον SMTP Server: '; -$PHPMAILER_LANG['variable_set'] = 'Αδυναμία ορισμού ή αρχικοποίησης μεταβλητής: '; -//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; +$PHPMAILER_LANG['smtp_code'] = 'Κώδικάς SMTP: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Πρόσθετες πληροφορίες SMTP: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Αποτυχία σύνδεσης SMTP.'; +$PHPMAILER_LANG['smtp_detail'] = 'Λεπτομέρεια: '; +$PHPMAILER_LANG['smtp_error'] = 'Σφάλμα με τον διακομιστή SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Αδυναμία ορισμού ή επαναφοράς μεταβλητής: '; diff --git a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-es.php b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-es.php index 6ba7462..6992041 100644 --- a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-es.php +++ b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-es.php @@ -4,6 +4,7 @@ * Spanish PHPMailer language file: refer to English translation for definitive list * @package PHPMailer * @author Matt Sturdy + * @author Crystopher Glodzienski Cardoso */ $PHPMAILER_LANG['authenticate'] = 'Error SMTP: Imposible autentificar.'; @@ -25,3 +26,6 @@ $PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falló.'; $PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: '; $PHPMAILER_LANG['variable_set'] = 'No se pudo configurar la variable: '; $PHPMAILER_LANG['extension_missing'] = 'Extensión faltante: '; +$PHPMAILER_LANG['smtp_code'] = 'Código del servidor SMTP: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Información adicional del servidor SMTP: '; +$PHPMAILER_LANG['invalid_header'] = 'Nombre o valor de encabezado no válido'; diff --git a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php index b57f0ec..38a7a8e 100644 --- a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php +++ b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php @@ -9,24 +9,30 @@ * @see http://unicode.org/udhr/n/notes_fra.html */ -$PHPMAILER_LANG['authenticate'] = 'Erreur SMTP : échec de l\'authentification.'; +$PHPMAILER_LANG['authenticate'] = 'Erreur SMTP : échec de l’authentification.'; +$PHPMAILER_LANG['buggy_php'] = 'Votre version de PHP est affectée par un bug qui peut entraîner des messages corrompus. Pour résoudre ce problème, passez à l’envoi par SMTP, désactivez l’option mail.add_x_header dans le fichier php.ini, passez à MacOS ou Linux, ou passez PHP à la version 7.0.17+ ou 7.1.3+.'; $PHPMAILER_LANG['connect_host'] = 'Erreur SMTP : impossible de se connecter au serveur SMTP.'; $PHPMAILER_LANG['data_not_accepted'] = 'Erreur SMTP : données incorrectes.'; $PHPMAILER_LANG['empty_message'] = 'Corps du message vide.'; $PHPMAILER_LANG['encoding'] = 'Encodage inconnu : '; -$PHPMAILER_LANG['execute'] = 'Impossible de lancer l\'exécution : '; -$PHPMAILER_LANG['file_access'] = 'Impossible d\'accéder au fichier : '; +$PHPMAILER_LANG['execute'] = 'Impossible de lancer l’exécution : '; +$PHPMAILER_LANG['extension_missing'] = 'Extension manquante : '; +$PHPMAILER_LANG['file_access'] = 'Impossible d’accéder au fichier : '; $PHPMAILER_LANG['file_open'] = 'Ouverture du fichier impossible : '; -$PHPMAILER_LANG['from_failed'] = 'L\'adresse d\'expéditeur suivante a échoué : '; -$PHPMAILER_LANG['instantiate'] = 'Impossible d\'instancier la fonction mail.'; -$PHPMAILER_LANG['invalid_address'] = 'L\'adresse courriel n\'est pas valide : '; -$PHPMAILER_LANG['invalid_hostentry'] = 'L\'entrée hôte n\'est pas valide : '; -$PHPMAILER_LANG['invalid_host'] = 'L\'hôte n\'est pas valide : '; +$PHPMAILER_LANG['from_failed'] = 'L’adresse d’expéditeur suivante a échoué : '; +$PHPMAILER_LANG['instantiate'] = 'Impossible d’instancier la fonction mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Adresse courriel non valide : '; +$PHPMAILER_LANG['invalid_header'] = 'Nom ou valeur de l’en-tête non valide'; +$PHPMAILER_LANG['invalid_hostentry'] = 'Entrée d’hôte non valide : '; +$PHPMAILER_LANG['invalid_host'] = 'Hôte non valide : '; $PHPMAILER_LANG['mailer_not_supported'] = ' client de messagerie non supporté.'; $PHPMAILER_LANG['provide_address'] = 'Vous devez fournir au moins une adresse de destinataire.'; -$PHPMAILER_LANG['recipients_failed'] = 'Erreur SMTP : les destinataires suivants sont en erreur : '; +$PHPMAILER_LANG['recipients_failed'] = 'Erreur SMTP : les destinataires suivants ont échoué : '; $PHPMAILER_LANG['signing'] = 'Erreur de signature : '; -$PHPMAILER_LANG['smtp_connect_failed'] = 'Échec de la connexion SMTP.'; +$PHPMAILER_LANG['smtp_code'] = 'Code SMTP : '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Informations supplémentaires SMTP : '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'La fonction SMTP connect() a échouée.'; +$PHPMAILER_LANG['smtp_detail'] = 'Détails : '; $PHPMAILER_LANG['smtp_error'] = 'Erreur du serveur SMTP : '; -$PHPMAILER_LANG['variable_set'] = 'Impossible d\'initialiser ou de réinitialiser une variable : '; +$PHPMAILER_LANG['variable_set'] = 'Impossible d’initialiser ou de réinitialiser une variable : '; $PHPMAILER_LANG['extension_missing'] = 'Extension manquante : '; diff --git a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php index d973a35..d2856e0 100644 --- a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php +++ b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php @@ -4,24 +4,32 @@ * Hindi PHPMailer language file: refer to English translation for definitive list * @package PHPMailer * @author Yash Karanke + * Rewrite and extension of the work by Jayanti Suthar */ $PHPMAILER_LANG['authenticate'] = 'SMTP त्रुटि: प्रामाणिकता की जांच नहीं हो सका। '; +$PHPMAILER_LANG['buggy_php'] = 'PHP का आपका संस्करण एक बग से प्रभावित है जिसके परिणामस्वरूप संदेश दूषित हो सकते हैं. इसे ठीक करने हेतु, भेजने के लिए SMTP का उपयोग करे, अपने php.ini में mail.add_x_header विकल्प को अक्षम करें, MacOS या Linux पर जाए, या अपने PHP संस्करण को 7.0.17+ या 7.1.3+ बदले.'; $PHPMAILER_LANG['connect_host'] = 'SMTP त्रुटि: SMTP सर्वर से कनेक्ट नहीं हो सका। '; $PHPMAILER_LANG['data_not_accepted'] = 'SMTP त्रुटि: डेटा स्वीकार नहीं किया जाता है। '; $PHPMAILER_LANG['empty_message'] = 'संदेश खाली है। '; $PHPMAILER_LANG['encoding'] = 'अज्ञात एन्कोडिंग प्रकार। '; $PHPMAILER_LANG['execute'] = 'आदेश को निष्पादित करने में विफल। '; +$PHPMAILER_LANG['extension_missing'] = 'एक्सटेन्षन गायब है: '; $PHPMAILER_LANG['file_access'] = 'फ़ाइल उपलब्ध नहीं है। '; $PHPMAILER_LANG['file_open'] = 'फ़ाइल त्रुटि: फाइल को खोला नहीं जा सका। '; $PHPMAILER_LANG['from_failed'] = 'प्रेषक का पता गलत है। '; $PHPMAILER_LANG['instantiate'] = 'मेल फ़ंक्शन कॉल नहीं कर सकता है।'; $PHPMAILER_LANG['invalid_address'] = 'पता गलत है। '; +$PHPMAILER_LANG['invalid_header'] = 'अमान्य हेडर नाम या मान'; +$PHPMAILER_LANG['invalid_hostentry'] = 'अमान्य hostentry: '; +$PHPMAILER_LANG['invalid_host'] = 'अमान्य होस्ट: '; $PHPMAILER_LANG['mailer_not_supported'] = 'मेल सर्वर के साथ काम नहीं करता है। '; $PHPMAILER_LANG['provide_address'] = 'आपको कम से कम एक प्राप्तकर्ता का ई-मेल पता प्रदान करना होगा।'; $PHPMAILER_LANG['recipients_failed'] = 'SMTP त्रुटि: निम्न प्राप्तकर्ताओं को पते भेजने में विफल। '; -$PHPMAILER_LANG['signing'] = 'साइनअप त्रुटि:। '; +$PHPMAILER_LANG['signing'] = 'साइनअप त्रुटि: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP कोड: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'अतिरिक्त SMTP जानकारी: '; $PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP का connect () फ़ंक्शन विफल हुआ। '; +$PHPMAILER_LANG['smtp_detail'] = 'विवरण: '; $PHPMAILER_LANG['smtp_error'] = 'SMTP सर्वर त्रुटि। '; $PHPMAILER_LANG['variable_set'] = 'चर को बना या संशोधित नहीं किया जा सकता। '; -$PHPMAILER_LANG['extension_missing'] = 'एक्सटेन्षन गायब है: '; diff --git a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php new file mode 100644 index 0000000..04d262c --- /dev/null +++ b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php @@ -0,0 +1,27 @@ + * @author Phelipe Alves * @author Fabio Beneditto + * @author Geidson Benício Coelho */ $PHPMAILER_LANG['authenticate'] = 'Erro de SMTP: Não foi possível autenticar.'; +$PHPMAILER_LANG['buggy_php'] = 'Sua versão do PHP é afetada por um bug que por resultar em messagens corrompidas. Para corrigir, mude para enviar usando SMTP, desative a opção mail.add_x_header em seu php.ini, mude para MacOS ou Linux, ou atualize seu PHP para versão 7.0.17+ ou 7.1.3+ '; $PHPMAILER_LANG['connect_host'] = 'Erro de SMTP: Não foi possível conectar ao servidor SMTP.'; $PHPMAILER_LANG['data_not_accepted'] = 'Erro de SMTP: Dados rejeitados.'; $PHPMAILER_LANG['empty_message'] = 'Mensagem vazia'; $PHPMAILER_LANG['encoding'] = 'Codificação desconhecida: '; $PHPMAILER_LANG['execute'] = 'Não foi possível executar: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensão não existe: '; $PHPMAILER_LANG['file_access'] = 'Não foi possível acessar o arquivo: '; $PHPMAILER_LANG['file_open'] = 'Erro de Arquivo: Não foi possível abrir o arquivo: '; $PHPMAILER_LANG['from_failed'] = 'Os seguintes remetentes falharam: '; $PHPMAILER_LANG['instantiate'] = 'Não foi possível instanciar a função mail.'; $PHPMAILER_LANG['invalid_address'] = 'Endereço de e-mail inválido: '; +$PHPMAILER_LANG['invalid_header'] = 'Nome ou valor de cabeçalho inválido'; +$PHPMAILER_LANG['invalid_hostentry'] = 'hostentry inválido: '; +$PHPMAILER_LANG['invalid_host'] = 'host inválido: '; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.'; $PHPMAILER_LANG['provide_address'] = 'Você deve informar pelo menos um destinatário.'; $PHPMAILER_LANG['recipients_failed'] = 'Erro de SMTP: Os seguintes destinatários falharam: '; $PHPMAILER_LANG['signing'] = 'Erro de Assinatura: '; $PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falhou.'; +$PHPMAILER_LANG['smtp_code'] = 'Código do servidor SMTP: '; $PHPMAILER_LANG['smtp_error'] = 'Erro de servidor SMTP: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Informações adicionais do servidor SMTP: '; +$PHPMAILER_LANG['smtp_detail'] = 'Detalhes do servidor SMTP: '; $PHPMAILER_LANG['variable_set'] = 'Não foi possível definir ou redefinir a variável: '; -$PHPMAILER_LANG['extension_missing'] = 'Extensão não existe: '; diff --git a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php index 292ec1e..45bef91 100644 --- a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php +++ b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php @@ -3,25 +3,31 @@ /** * Romanian PHPMailer language file: refer to English translation for definitive list * @package PHPMailer - * @author Alex Florea */ $PHPMAILER_LANG['authenticate'] = 'Eroare SMTP: Autentificarea a eșuat.'; +$PHPMAILER_LANG['buggy_php'] = 'Versiunea instalată de PHP este afectată de o problemă care poate duce la coruperea mesajelor Pentru a preveni această problemă, folosiți SMTP, dezactivați opțiunea mail.add_x_header din php.ini, folosiți MacOS/Linux sau actualizați versiunea de PHP la 7.0.17+ sau 7.1.3+.'; $PHPMAILER_LANG['connect_host'] = 'Eroare SMTP: Conectarea la serverul SMTP a eșuat.'; $PHPMAILER_LANG['data_not_accepted'] = 'Eroare SMTP: Datele nu au fost acceptate.'; $PHPMAILER_LANG['empty_message'] = 'Mesajul este gol.'; $PHPMAILER_LANG['encoding'] = 'Encodare necunoscută: '; $PHPMAILER_LANG['execute'] = 'Nu se poate executa următoarea comandă: '; +$PHPMAILER_LANG['extension_missing'] = 'Lipsește extensia: '; $PHPMAILER_LANG['file_access'] = 'Nu se poate accesa următorul fișier: '; $PHPMAILER_LANG['file_open'] = 'Eroare fișier: Nu se poate deschide următorul fișier: '; $PHPMAILER_LANG['from_failed'] = 'Următoarele adrese From au dat eroare: '; $PHPMAILER_LANG['instantiate'] = 'Funcția mail nu a putut fi inițializată.'; $PHPMAILER_LANG['invalid_address'] = 'Adresa de email nu este validă: '; +$PHPMAILER_LANG['invalid_header'] = 'Numele sau valoarea header-ului nu este validă: '; +$PHPMAILER_LANG['invalid_hostentry'] = 'Hostentry invalid: '; +$PHPMAILER_LANG['invalid_host'] = 'Host invalid: '; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer nu este suportat.'; $PHPMAILER_LANG['provide_address'] = 'Trebuie să adăugați cel puțin o adresă de email.'; $PHPMAILER_LANG['recipients_failed'] = 'Eroare SMTP: Următoarele adrese de email au eșuat: '; $PHPMAILER_LANG['signing'] = 'A aparut o problemă la semnarea emailului. '; +$PHPMAILER_LANG['smtp_code'] = 'Cod SMTP: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Informații SMTP adiționale: '; $PHPMAILER_LANG['smtp_connect_failed'] = 'Conectarea la serverul SMTP a eșuat.'; +$PHPMAILER_LANG['smtp_detail'] = 'Detalii SMTP: '; $PHPMAILER_LANG['smtp_error'] = 'Eroare server SMTP: '; $PHPMAILER_LANG['variable_set'] = 'Nu se poate seta/reseta variabila. '; -$PHPMAILER_LANG['extension_missing'] = 'Lipsește extensia: '; diff --git a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php index c437a88..3e00c25 100644 --- a/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php +++ b/application/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php @@ -9,23 +9,28 @@ */ $PHPMAILER_LANG['authenticate'] = 'SMTP napaka: Avtentikacija ni uspela.'; +$PHPMAILER_LANG['buggy_php'] = 'Na vašo PHP različico vpliva napaka, ki lahko povzroči poškodovana sporočila. Če želite težavo odpraviti, preklopite na pošiljanje prek SMTP, onemogočite možnost mail.add_x_header v vaši php.ini datoteki, preklopite na MacOS ali Linux, ali nadgradite vašo PHP zaličico na 7.0.17+ ali 7.1.3+.'; $PHPMAILER_LANG['connect_host'] = 'SMTP napaka: Vzpostavljanje povezave s SMTP gostiteljem ni uspelo.'; $PHPMAILER_LANG['data_not_accepted'] = 'SMTP napaka: Strežnik zavrača podatke.'; $PHPMAILER_LANG['empty_message'] = 'E-poštno sporočilo nima vsebine.'; $PHPMAILER_LANG['encoding'] = 'Nepoznan tip kodiranja: '; $PHPMAILER_LANG['execute'] = 'Operacija ni uspela: '; +$PHPMAILER_LANG['extension_missing'] = 'Manjkajoča razširitev: '; $PHPMAILER_LANG['file_access'] = 'Nimam dostopa do datoteke: '; $PHPMAILER_LANG['file_open'] = 'Ne morem odpreti datoteke: '; $PHPMAILER_LANG['from_failed'] = 'Neveljaven e-naslov pošiljatelja: '; $PHPMAILER_LANG['instantiate'] = 'Ne morem inicializirati mail funkcije.'; $PHPMAILER_LANG['invalid_address'] = 'E-poštno sporočilo ni bilo poslano. E-naslov je neveljaven: '; +$PHPMAILER_LANG['invalid_header'] = 'Neveljavno ime ali vrednost glave'; $PHPMAILER_LANG['invalid_hostentry'] = 'Neveljaven vnos gostitelja: '; $PHPMAILER_LANG['invalid_host'] = 'Neveljaven gostitelj: '; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer ni podprt.'; $PHPMAILER_LANG['provide_address'] = 'Prosimo, vnesite vsaj enega naslovnika.'; $PHPMAILER_LANG['recipients_failed'] = 'SMTP napaka: Sledeči naslovniki so neveljavni: '; $PHPMAILER_LANG['signing'] = 'Napaka pri podpisovanju: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP koda: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Dodatne informacije o SMTP: '; $PHPMAILER_LANG['smtp_connect_failed'] = 'Ne morem vzpostaviti povezave s SMTP strežnikom.'; +$PHPMAILER_LANG['smtp_detail'] = 'Podrobnosti: '; $PHPMAILER_LANG['smtp_error'] = 'Napaka SMTP strežnika: '; $PHPMAILER_LANG['variable_set'] = 'Ne morem nastaviti oz. ponastaviti spremenljivke: '; -$PHPMAILER_LANG['extension_missing'] = 'Manjkajoča razširitev: '; diff --git a/application/vendor/phpmailer/phpmailer/src/DSNConfigurator.php b/application/vendor/phpmailer/phpmailer/src/DSNConfigurator.php new file mode 100644 index 0000000..ab707d2 --- /dev/null +++ b/application/vendor/phpmailer/phpmailer/src/DSNConfigurator.php @@ -0,0 +1,247 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2023 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * Configure PHPMailer with DSN string. + * + * @see https://en.wikipedia.org/wiki/Data_source_name + * + * @author Oleg Voronkovich + */ +class DSNConfigurator +{ + /** + * Create new PHPMailer instance configured by DSN. + * + * @param string $dsn DSN + * @param bool $exceptions Should we throw external exceptions? + * + * @return PHPMailer + */ + public static function mailer($dsn, $exceptions = null) + { + static $configurator = null; + + if (null === $configurator) { + $configurator = new DSNConfigurator(); + } + + return $configurator->configure(new PHPMailer($exceptions), $dsn); + } + + /** + * Configure PHPMailer instance with DSN string. + * + * @param PHPMailer $mailer PHPMailer instance + * @param string $dsn DSN + * + * @return PHPMailer + */ + public function configure(PHPMailer $mailer, $dsn) + { + $config = $this->parseDSN($dsn); + + $this->applyConfig($mailer, $config); + + return $mailer; + } + + /** + * Parse DSN string. + * + * @param string $dsn DSN + * + * @throws Exception If DSN is malformed + * + * @return array Configuration + */ + private function parseDSN($dsn) + { + $config = $this->parseUrl($dsn); + + if (false === $config || !isset($config['scheme']) || !isset($config['host'])) { + throw new Exception( + sprintf('Malformed DSN: "%s".', $dsn) + ); + } + + if (isset($config['query'])) { + parse_str($config['query'], $config['query']); + } + + return $config; + } + + /** + * Apply configuration to mailer. + * + * @param PHPMailer $mailer PHPMailer instance + * @param array $config Configuration + * + * @throws Exception If scheme is invalid + */ + private function applyConfig(PHPMailer $mailer, $config) + { + switch ($config['scheme']) { + case 'mail': + $mailer->isMail(); + break; + case 'sendmail': + $mailer->isSendmail(); + break; + case 'qmail': + $mailer->isQmail(); + break; + case 'smtp': + case 'smtps': + $mailer->isSMTP(); + $this->configureSMTP($mailer, $config); + break; + default: + throw new Exception( + sprintf( + 'Invalid scheme: "%s". Allowed values: "mail", "sendmail", "qmail", "smtp", "smtps".', + $config['scheme'] + ) + ); + } + + if (isset($config['query'])) { + $this->configureOptions($mailer, $config['query']); + } + } + + /** + * Configure SMTP. + * + * @param PHPMailer $mailer PHPMailer instance + * @param array $config Configuration + */ + private function configureSMTP($mailer, $config) + { + $isSMTPS = 'smtps' === $config['scheme']; + + if ($isSMTPS) { + $mailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + } + + $mailer->Host = $config['host']; + + if (isset($config['port'])) { + $mailer->Port = $config['port']; + } elseif ($isSMTPS) { + $mailer->Port = SMTP::DEFAULT_SECURE_PORT; + } + + $mailer->SMTPAuth = isset($config['user']) || isset($config['pass']); + + if (isset($config['user'])) { + $mailer->Username = $config['user']; + } + + if (isset($config['pass'])) { + $mailer->Password = $config['pass']; + } + } + + /** + * Configure options. + * + * @param PHPMailer $mailer PHPMailer instance + * @param array $options Options + * + * @throws Exception If option is unknown + */ + private function configureOptions(PHPMailer $mailer, $options) + { + $allowedOptions = get_object_vars($mailer); + + unset($allowedOptions['Mailer']); + unset($allowedOptions['SMTPAuth']); + unset($allowedOptions['Username']); + unset($allowedOptions['Password']); + unset($allowedOptions['Hostname']); + unset($allowedOptions['Port']); + unset($allowedOptions['ErrorInfo']); + + $allowedOptions = \array_keys($allowedOptions); + + foreach ($options as $key => $value) { + if (!in_array($key, $allowedOptions)) { + throw new Exception( + sprintf( + 'Unknown option: "%s". Allowed values: "%s"', + $key, + implode('", "', $allowedOptions) + ) + ); + } + + switch ($key) { + case 'AllowEmpty': + case 'SMTPAutoTLS': + case 'SMTPKeepAlive': + case 'SingleTo': + case 'UseSendmailOptions': + case 'do_verp': + case 'DKIM_copyHeaderFields': + $mailer->$key = (bool) $value; + break; + case 'Priority': + case 'SMTPDebug': + case 'WordWrap': + $mailer->$key = (int) $value; + break; + default: + $mailer->$key = $value; + break; + } + } + } + + /** + * Parse a URL. + * Wrapper for the built-in parse_url function to work around a bug in PHP 5.5. + * + * @param string $url URL + * + * @return array|false + */ + protected function parseUrl($url) + { + if (\PHP_VERSION_ID >= 50600 || false === strpos($url, '?')) { + return parse_url($url); + } + + $chunks = explode('?', $url); + if (is_array($chunks)) { + $result = parse_url($chunks[0]); + if (is_array($result)) { + $result['query'] = $chunks[1]; + } + return $result; + } + + return false; + } +} diff --git a/application/vendor/phpmailer/phpmailer/src/OAuth.php b/application/vendor/phpmailer/phpmailer/src/OAuth.php index c93d0be..c1d5b77 100644 --- a/application/vendor/phpmailer/phpmailer/src/OAuth.php +++ b/application/vendor/phpmailer/phpmailer/src/OAuth.php @@ -33,7 +33,7 @@ use League\OAuth2\Client\Token\AccessToken; * * @author Marcus Bointon (Synchro/coolbru) */ -class OAuth +class OAuth implements OAuthTokenProvider { /** * An instance of the League OAuth Client Provider. diff --git a/application/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php b/application/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php new file mode 100644 index 0000000..1155507 --- /dev/null +++ b/application/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php @@ -0,0 +1,44 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * OAuthTokenProvider - OAuth2 token provider interface. + * Provides base64 encoded OAuth2 auth strings for SMTP authentication. + * + * @see OAuth + * @see SMTP::authenticate() + * + * @author Peter Scopes (pdscopes) + * @author Marcus Bointon (Synchro/coolbru) + */ +interface OAuthTokenProvider +{ + /** + * Generate a base64-encoded OAuth token ensuring that the access token has not expired. + * The string to be base 64 encoded should be in the form: + * "user=\001auth=Bearer \001\001" + * + * @return string + */ + public function getOauth64(); +} diff --git a/application/vendor/phpmailer/phpmailer/src/PHPMailer.php b/application/vendor/phpmailer/phpmailer/src/PHPMailer.php index 5b6dcfa..a644d2c 100644 --- a/application/vendor/phpmailer/phpmailer/src/PHPMailer.php +++ b/application/vendor/phpmailer/phpmailer/src/PHPMailer.php @@ -350,17 +350,17 @@ class PHPMailer public $Password = ''; /** - * SMTP auth type. - * Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2, attempted in that order if not specified. + * SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2. + * If not specified, the first one from that list that the server supports will be selected. * * @var string */ public $AuthType = ''; /** - * An instance of the PHPMailer OAuth class. + * An implementation of the PHPMailer OAuthTokenProvider interface. * - * @var OAuth + * @var OAuthTokenProvider */ protected $oauth; @@ -750,7 +750,7 @@ class PHPMailer * * @var string */ - const VERSION = '6.5.1'; + const VERSION = '6.8.0'; /** * Error severity: message only, continue processing. @@ -858,7 +858,7 @@ class PHPMailer private function mailPassthru($to, $subject, $body, $header, $params) { //Check overloading of mail function to avoid double-encoding - if (ini_get('mbstring.func_overload') & 1) { + if ((int)ini_get('mbstring.func_overload') & 1) { $subject = $this->secureHeader($subject); } else { $subject = $this->encodeHeader($this->secureHeader($subject)); @@ -1066,8 +1066,8 @@ class PHPMailer * Addresses that have been added already return false, but do not throw exceptions. * * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' - * @param string $address The email address to send, resp. to reply to - * @param string $name + * @param string $address The email address + * @param string $name An optional username associated with the address * * @throws Exception * @@ -1075,9 +1075,11 @@ class PHPMailer */ protected function addOrEnqueueAnAddress($kind, $address, $name) { - $address = trim($address); - $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim - $pos = strrpos($address, '@'); + $pos = false; + if ($address !== null) { + $address = trim($address); + $pos = strrpos($address, '@'); + } if (false === $pos) { //At-sign is missing. $error_message = sprintf( @@ -1094,8 +1096,14 @@ class PHPMailer return false; } + if ($name !== null && is_string($name)) { + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + } else { + $name = ''; + } $params = [$kind, $address, $name]; //Enqueue addresses with IDN until we know the PHPMailer::$CharSet. + //Domain is assumed to be whatever is after the last @ symbol in the address if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) { if ('Reply-To' !== $kind) { if (!array_key_exists($address, $this->RecipientsQueue)) { @@ -1116,6 +1124,22 @@ class PHPMailer return call_user_func_array([$this, 'addAnAddress'], $params); } + /** + * Set the boundaries to use for delimiting MIME parts. + * If you override this, ensure you set all 3 boundaries to unique values. + * The default boundaries include a "=_" sequence which cannot occur in quoted-printable bodies, + * as suggested by https://www.rfc-editor.org/rfc/rfc2045#section-6.7 + * + * @return void + */ + public function setBoundaries() + { + $this->uniqueid = $this->generateId(); + $this->boundary[1] = 'b1=_' . $this->uniqueid; + $this->boundary[2] = 'b2=_' . $this->uniqueid; + $this->boundary[3] = 'b3=_' . $this->uniqueid; + } + /** * Add an address to one of the recipient arrays or to the ReplyTo array. * Addresses that have been added already return false, but do not throw exceptions. @@ -1185,6 +1209,7 @@ class PHPMailer * * @param string $addrstr The address list string * @param bool $useimap Whether to use the IMAP extension to parse the list + * @param string $charset The charset to use when decoding the address list string. * * @return array */ @@ -1279,7 +1304,7 @@ class PHPMailer */ public function setFrom($address, $name = '', $auto = true) { - $address = trim($address); + $address = trim((string)$address); $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim //Don't validate now addresses with IDN. Will be done in send(). $pos = strrpos($address, '@'); @@ -1451,7 +1476,12 @@ class PHPMailer $errorcode = 0; if (defined('INTL_IDNA_VARIANT_UTS46')) { //Use the current punycode standard (appeared in PHP 7.2) - $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_UTS46); + $punycode = idn_to_ascii( + $domain, + \IDNA_DEFAULT | \IDNA_USE_STD3_RULES | \IDNA_CHECK_BIDI | + \IDNA_CHECK_CONTEXTJ | \IDNA_NONTRANSITIONAL_TO_ASCII, + \INTL_IDNA_VARIANT_UTS46 + ); } elseif (defined('INTL_IDNA_VARIANT_2003')) { //Fall back to this old, deprecated/removed encoding $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003); @@ -1541,17 +1571,17 @@ class PHPMailer //Validate From, Sender, and ConfirmReadingTo addresses foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) { - $this->$address_kind = trim($this->$address_kind); - if (empty($this->$address_kind)) { + $this->{$address_kind} = trim($this->{$address_kind}); + if (empty($this->{$address_kind})) { continue; } - $this->$address_kind = $this->punyencodeAddress($this->$address_kind); - if (!static::validateAddress($this->$address_kind)) { + $this->{$address_kind} = $this->punyencodeAddress($this->{$address_kind}); + if (!static::validateAddress($this->{$address_kind})) { $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $address_kind, - $this->$address_kind + $this->{$address_kind} ); $this->setError($error_message); $this->edebug($error_message); @@ -1651,17 +1681,17 @@ class PHPMailer default: $sendMethod = $this->Mailer . 'Send'; if (method_exists($this, $sendMethod)) { - return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody); + return $this->{$sendMethod}($this->MIMEHeader, $this->MIMEBody); } return $this->mailSend($this->MIMEHeader, $this->MIMEBody); } } catch (Exception $exc) { - if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true) { - $this->smtp->reset(); - } $this->setError($exc->getMessage()); $this->edebug($exc->getMessage()); + if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true && $this->smtp->connected()) { + $this->smtp->reset(); + } if ($this->exceptions) { throw $exc; } @@ -1697,7 +1727,10 @@ class PHPMailer //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html //Example problem: https://www.drupal.org/node/1057954 - if (empty($this->Sender) && !empty(ini_get('sendmail_from'))) { + + //PHP 5.6 workaround + $sendmail_from_value = ini_get('sendmail_from'); + if (empty($this->Sender) && !empty($sendmail_from_value)) { //PHP config has a sender address we can use $this->Sender = ini_get('sendmail_from'); } @@ -1734,7 +1767,7 @@ class PHPMailer fwrite($mail, $header); fwrite($mail, $body); $result = pclose($mail); - $addrinfo = static::parseAddresses($toAddr, true, $this->charSet); + $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); $this->doCallback( ($result === 0), [[$addrinfo['address'], $addrinfo['name']]], @@ -1789,7 +1822,13 @@ class PHPMailer */ protected static function isShellSafe($string) { - //Future-proof + //It's not possible to use shell commands safely (which includes the mail() function) without escapeshellarg, + //but some hosting providers disable it, creating a security problem that we don't want to have to deal with, + //so we don't. + if (!function_exists('escapeshellarg') || !function_exists('escapeshellcmd')) { + return false; + } + if ( escapeshellcmd($string) !== $string || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) @@ -1840,7 +1879,7 @@ class PHPMailer if (!static::isPermittedPath($path)) { return false; } - $readable = file_exists($path); + $readable = is_file($path); //If not a UNC path (expected to start with \\), check read permission, see #2069 if (strpos($path, '\\\\') !== 0) { $readable = $readable && is_readable($path); @@ -1868,7 +1907,14 @@ class PHPMailer foreach ($this->to as $toaddr) { $toArr[] = $this->addrFormat($toaddr); } - $to = implode(', ', $toArr); + $to = trim(implode(', ', $toArr)); + + //If there are no To-addresses (e.g. when sending only to BCC-addresses) + //the following should be added to get a correct DKIM-signature. + //Compare with $this->preSend() + if ($to === '') { + $to = 'undisclosed-recipients:;'; + } $params = null; //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver @@ -1879,7 +1925,10 @@ class PHPMailer //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html //Example problem: https://www.drupal.org/node/1057954 //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. - if (empty($this->Sender) && !empty(ini_get('sendmail_from'))) { + + //PHP 5.6 workaround + $sendmail_from_value = ini_get('sendmail_from'); + if (empty($this->Sender) && !empty($sendmail_from_value)) { //PHP config has a sender address we can use $this->Sender = ini_get('sendmail_from'); } @@ -1894,7 +1943,7 @@ class PHPMailer if ($this->SingleTo && count($toArr) > 1) { foreach ($toArr as $toAddr) { $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); - $addrinfo = static::parseAddresses($toAddr, true, $this->charSet); + $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); $this->doCallback( $result, [[$addrinfo['address'], $addrinfo['name']]], @@ -2068,6 +2117,9 @@ class PHPMailer $this->smtp->setDebugLevel($this->SMTPDebug); $this->smtp->setDebugOutput($this->Debugoutput); $this->smtp->setVerp($this->do_verp); + if ($this->Host === null) { + $this->Host = 'localhost'; + } $hosts = explode(';', $this->Host); $lastexception = null; @@ -2143,7 +2195,8 @@ class PHPMailer } if ($tls) { if (!$this->smtp->startTLS()) { - throw new Exception($this->lang('connect_host')); + $message = $this->getSmtpErrorMessage('connect_host'); + throw new Exception($message); } //We must resend EHLO after TLS negotiation $this->smtp->hello($hello); @@ -2174,6 +2227,11 @@ class PHPMailer if ($this->exceptions && null !== $lastexception) { throw $lastexception; } + if ($this->exceptions) { + // no exception was thrown, likely $this->smtp->connect() failed + $message = $this->getSmtpErrorMessage('connect_host'); + throw new Exception($message); + } return false; } @@ -2196,7 +2254,7 @@ class PHPMailer * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") * Optionally, the language code can be enhanced with a 4-character * script annotation and/or a 2-character country annotation. - * @param string $lang_path Path to the language file directory, with trailing separator (slash).D + * @param string $lang_path Path to the language file directory, with trailing separator (slash) * Do not set this from user input! * * @return bool Returns true if the requested language was loaded, false otherwise. @@ -2365,7 +2423,7 @@ class PHPMailer */ public function addrFormat($addr) { - if (empty($addr[1])) { //No name provided + if (!isset($addr[1]) || ($addr[1] === '')) { //No name provided return $this->secureHeader($addr[0]); } @@ -2619,16 +2677,15 @@ class PHPMailer $result .= $this->headerLine('X-Priority', $this->Priority); } if ('' === $this->XMailer) { + //Empty string for default X-Mailer header $result .= $this->headerLine( 'X-Mailer', 'PHPMailer ' . self::VERSION . ' (https://github.com/PHPMailer/PHPMailer)' ); - } else { - $myXmailer = trim($this->XMailer); - if ($myXmailer) { - $result .= $this->headerLine('X-Mailer', $myXmailer); - } - } + } elseif (is_string($this->XMailer) && trim($this->XMailer) !== '') { + //Some string + $result .= $this->headerLine('X-Mailer', trim($this->XMailer)); + } //Other values result in no X-Mailer header if ('' !== $this->ConfirmReadingTo) { $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>'); @@ -2753,10 +2810,7 @@ class PHPMailer { $body = ''; //Create unique IDs and preset boundaries - $this->uniqueid = $this->generateId(); - $this->boundary[1] = 'b1_' . $this->uniqueid; - $this->boundary[2] = 'b2_' . $this->uniqueid; - $this->boundary[3] = 'b3_' . $this->uniqueid; + $this->setBoundaries(); if ($this->sign_key_file) { $body .= $this->getMailMIME() . static::$LE; @@ -2792,7 +2846,7 @@ class PHPMailer $altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE; } //Use this as a preamble in all multipart message types - $mimepre = 'This is a multi-part message in MIME format.' . static::$LE . static::$LE; + $mimepre = ''; switch ($this->message_type) { case 'inline': $body .= $mimepre; @@ -3028,6 +3082,18 @@ class PHPMailer return $body; } + /** + * Get the boundaries that this message will use + * @return array + */ + public function getBoundaries() + { + if (empty($this->boundary)) { + $this->setBoundaries(); + } + return $this->boundary; + } + /** * Return the start of a message boundary. * @@ -3683,20 +3749,21 @@ class PHPMailer * These differ from 'regular' attachments in that they are intended to be * displayed inline with the message, not just attached for download. * This is used in HTML messages that embed the images - * the HTML refers to using the $cid value. + * the HTML refers to using the `$cid` value in `img` tags, for example ``. * Never use a user-supplied path to a file! * * @param string $path Path to the attachment * @param string $cid Content ID of the attachment; Use this to reference * the content when using an embedded image in HTML - * @param string $name Overrides the attachment name - * @param string $encoding File encoding (see $Encoding) - * @param string $type File MIME type - * @param string $disposition Disposition to use - * - * @throws Exception + * @param string $name Overrides the attachment filename + * @param string $encoding File encoding (see $Encoding) defaults to `base64` + * @param string $type File MIME type (by default mapped from the `$path` filename's extension) + * @param string $disposition Disposition to use: `inline` (default) or `attachment` + * (unlikely you want this – {@see `addAttachment()`} instead) * * @return bool True on successfully adding an attachment + * @throws Exception + * */ public function addEmbeddedImage( $path, @@ -4074,12 +4141,8 @@ class PHPMailer //Is it a valid IPv4 address? return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false; } - if (filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false) { - //Is it a syntactically valid hostname? - return true; - } - - return false; + //Is it a syntactically valid hostname (when embeded in a URL)? + return filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false; } /** @@ -4110,6 +4173,26 @@ class PHPMailer return $key; } + /** + * Build an error message starting with a generic one and adding details if possible. + * + * @param string $base_key + * @return string + */ + private function getSmtpErrorMessage($base_key) + { + $message = $this->lang($base_key); + $error = $this->smtp->getError(); + if (!empty($error['error'])) { + $message .= ' ' . $error['error']; + if (!empty($error['detail'])) { + $message .= ' ' . $error['detail']; + } + } + + return $message; + } + /** * Check if an error occurred. * @@ -4128,6 +4211,7 @@ class PHPMailer * @param string $name Custom header name * @param string|null $value Header value * + * @return bool True if a header was set successfully * @throws Exception */ public function addCustomHeader($name, $value = null) @@ -4422,6 +4506,7 @@ class PHPMailer 'ics' => 'text/calendar', 'xml' => 'text/xml', 'xsl' => 'text/xml', + 'csv' => 'text/csv', 'wmv' => 'video/x-ms-wmv', 'mpeg' => 'video/mpeg', 'mpe' => 'video/mpeg', @@ -4529,7 +4614,7 @@ class PHPMailer public function set($name, $value = '') { if (property_exists($this, $name)) { - $this->$name = $value; + $this->{$name} = $value; return true; } @@ -4576,15 +4661,27 @@ class PHPMailer } /** - * Remove trailing breaks from a string. + * Remove trailing whitespace from a string. + * + * @param string $text + * + * @return string The text to remove whitespace from + */ + public static function stripTrailingWSP($text) + { + return rtrim($text, " \r\n\t"); + } + + /** + * Strip trailing line breaks from a string. * * @param string $text * * @return string The text to remove breaks from */ - public static function stripTrailingWSP($text) + public static function stripTrailingBreaks($text) { - return rtrim($text, " \r\n\t"); + return rtrim($text, "\r\n"); } /** @@ -4750,7 +4847,7 @@ class PHPMailer $body = static::normalizeBreaks($body, self::CRLF); //Reduce multiple trailing line breaks to a single one - return static::stripTrailingWSP($body) . self::CRLF; + return static::stripTrailingBreaks($body) . self::CRLF; } /** @@ -5010,9 +5107,9 @@ class PHPMailer } /** - * Get the OAuth instance. + * Get the OAuthTokenProvider instance. * - * @return OAuth + * @return OAuthTokenProvider */ public function getOAuth() { @@ -5020,9 +5117,9 @@ class PHPMailer } /** - * Set an OAuth instance. + * Set an OAuthTokenProvider instance. */ - public function setOAuth(OAuth $oauth) + public function setOAuth(OAuthTokenProvider $oauth) { $this->oauth = $oauth; } diff --git a/application/vendor/phpmailer/phpmailer/src/POP3.php b/application/vendor/phpmailer/phpmailer/src/POP3.php index 87d9873..d025689 100644 --- a/application/vendor/phpmailer/phpmailer/src/POP3.php +++ b/application/vendor/phpmailer/phpmailer/src/POP3.php @@ -46,7 +46,7 @@ class POP3 * * @var string */ - const VERSION = '6.5.1'; + const VERSION = '6.8.0'; /** * Default POP3 port number. @@ -308,6 +308,7 @@ class POP3 { if (!$this->connected) { $this->setError('Not connected to POP3 server'); + return false; } if (empty($username)) { $username = $this->username; @@ -336,7 +337,21 @@ class POP3 */ public function disconnect() { - $this->sendString('QUIT'); + // If could not connect at all, no need to disconnect + if ($this->pop_conn === false) { + return; + } + + $this->sendString('QUIT' . static::LE); + + // RFC 1939 shows POP3 server sending a +OK response to the QUIT command. + // Try to get it. Ignore any failures here. + try { + $this->getResponse(); + } catch (Exception $e) { + //Do nothing + } + //The QUIT command may cause the daemon to exit, which will kill our connection //So ignore errors here try { @@ -344,6 +359,10 @@ class POP3 } catch (Exception $e) { //Do nothing } + + // Clean up attributes. + $this->connected = false; + $this->pop_conn = false; } /** diff --git a/application/vendor/phpmailer/phpmailer/src/SMTP.php b/application/vendor/phpmailer/phpmailer/src/SMTP.php index 0cea1e8..fc4b781 100644 --- a/application/vendor/phpmailer/phpmailer/src/SMTP.php +++ b/application/vendor/phpmailer/phpmailer/src/SMTP.php @@ -35,7 +35,7 @@ class SMTP * * @var string */ - const VERSION = '6.5.1'; + const VERSION = '6.8.0'; /** * SMTP line break constant. @@ -51,6 +51,13 @@ class SMTP */ const DEFAULT_PORT = 25; + /** + * The SMTPs port to use if one is not specified. + * + * @var int + */ + const DEFAULT_SECURE_PORT = 465; + /** * The maximum line length allowed by RFC 5321 section 4.5.3.1.6, * *excluding* a trailing CRLF break. @@ -187,6 +194,8 @@ class SMTP 'SendGrid' => '/[\d]{3} Ok: queued as (.*)/', 'CampaignMonitor' => '/[\d]{3} 2.0.0 OK:([a-zA-Z\d]{48})/', 'Haraka' => '/[\d]{3} Message Queued \((.*)\)/', + 'ZoneMTA' => '/[\d]{3} Message queued as (.*)/', + 'Mailjet' => '/[\d]{3} OK queued as (.*)/', ]; /** @@ -392,7 +401,6 @@ class SMTP STREAM_CLIENT_CONNECT, $socket_context ); - restore_error_handler(); } else { //Fall back to fsockopen which should work in more places, but is missing some features $this->edebug( @@ -407,8 +415,8 @@ class SMTP $errstr, $timeout ); - restore_error_handler(); } + restore_error_handler(); //Verify we connected properly if (!is_resource($connection)) { @@ -483,7 +491,7 @@ class SMTP * @param string $username The user name * @param string $password The password * @param string $authtype The auth type (CRAM-MD5, PLAIN, LOGIN, XOAUTH2) - * @param OAuth $OAuth An optional OAuth instance for XOAUTH2 authentication + * @param OAuthTokenProvider $OAuth An optional OAuthTokenProvider instance for XOAUTH2 authentication * * @return bool True if successfully authenticated */ @@ -682,7 +690,6 @@ class SMTP */ public function close() { - $this->setError(''); $this->server_caps = null; $this->helo_rply = null; if (is_resource($this->smtp_conn)) { @@ -696,7 +703,7 @@ class SMTP /** * Send an SMTP DATA command. * Issues a data command and sends the msg_data to the server, - * finializing the mail transaction. $msg_data is the message + * finalizing the mail transaction. $msg_data is the message * that is to be send with the headers. Each header needs to be * on a single line followed by a with the message headers * and the message body being separated by an additional . @@ -1037,7 +1044,10 @@ class SMTP return false; } - $this->setError(''); + //Don't clear the error store when using keepalive + if ($command !== 'RSET') { + $this->setError(''); + } return true; } @@ -1170,7 +1180,7 @@ class SMTP if (!$this->server_caps) { $this->setError('No HELO/EHLO was sent'); - return; + return null; } if (!array_key_exists($name, $this->server_caps)) { @@ -1182,7 +1192,7 @@ class SMTP } $this->setError('HELO handshake was used; No information about server extensions available'); - return; + return null; } return $this->server_caps[$name]; diff --git a/application/vendor/symfony/deprecation-contracts/.gitignore b/application/vendor/symfony/deprecation-contracts/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/application/vendor/symfony/deprecation-contracts/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/application/vendor/symfony/deprecation-contracts/CHANGELOG.md b/application/vendor/symfony/deprecation-contracts/CHANGELOG.md new file mode 100644 index 0000000..7932e26 --- /dev/null +++ b/application/vendor/symfony/deprecation-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/application/vendor/symfony/deprecation-contracts/LICENSE b/application/vendor/symfony/deprecation-contracts/LICENSE new file mode 100644 index 0000000..406242f --- /dev/null +++ b/application/vendor/symfony/deprecation-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020-2022 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/application/vendor/symfony/deprecation-contracts/README.md b/application/vendor/symfony/deprecation-contracts/README.md new file mode 100644 index 0000000..4957933 --- /dev/null +++ b/application/vendor/symfony/deprecation-contracts/README.md @@ -0,0 +1,26 @@ +Symfony Deprecation Contracts +============================= + +A generic function and convention to trigger deprecation notices. + +This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices. + +By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component, +the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments. + +The function requires at least 3 arguments: + - the name of the Composer package that is triggering the deprecation + - the version of the package that introduced the deprecation + - the message of the deprecation + - more arguments can be provided: they will be inserted in the message using `printf()` formatting + +Example: +```php +trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin'); +``` + +This will generate the following message: +`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.` + +While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty +`function trigger_deprecation() {}` in your application. diff --git a/application/vendor/symfony/deprecation-contracts/composer.json b/application/vendor/symfony/deprecation-contracts/composer.json new file mode 100644 index 0000000..cc7cc12 --- /dev/null +++ b/application/vendor/symfony/deprecation-contracts/composer.json @@ -0,0 +1,35 @@ +{ + "name": "symfony/deprecation-contracts", + "type": "library", + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + } +} diff --git a/application/vendor/symfony/deprecation-contracts/function.php b/application/vendor/symfony/deprecation-contracts/function.php new file mode 100644 index 0000000..d437150 --- /dev/null +++ b/application/vendor/symfony/deprecation-contracts/function.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (!function_exists('trigger_deprecation')) { + /** + * Triggers a silenced deprecation notice. + * + * @param string $package The name of the Composer package that is triggering the deprecation + * @param string $version The version of the package that introduced the deprecation + * @param string $message The message of the deprecation + * @param mixed ...$args Values to insert in the message using printf() formatting + * + * @author Nicolas Grekas + */ + function trigger_deprecation(string $package, string $version, string $message, ...$args): void + { + @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED); + } +} diff --git a/application/vendor/symfony/finder/CHANGELOG.md b/application/vendor/symfony/finder/CHANGELOG.md index 33f5bd5..6a44e87 100644 --- a/application/vendor/symfony/finder/CHANGELOG.md +++ b/application/vendor/symfony/finder/CHANGELOG.md @@ -1,6 +1,14 @@ CHANGELOG ========= +5.4.0 +----- + + * Deprecate `Comparator::setTarget()` and `Comparator::setOperator()` + * Add a constructor to `Comparator` that allows setting target and operator + * Finder's iterator has now `Symfony\Component\Finder\SplFileInfo` inner type specified + * Add recursive .gitignore files support + 5.0.0 ----- diff --git a/application/vendor/symfony/finder/Comparator/Comparator.php b/application/vendor/symfony/finder/Comparator/Comparator.php index cfe3965..3af551f 100644 --- a/application/vendor/symfony/finder/Comparator/Comparator.php +++ b/application/vendor/symfony/finder/Comparator/Comparator.php @@ -12,8 +12,6 @@ namespace Symfony\Component\Finder\Comparator; /** - * Comparator. - * * @author Fabien Potencier */ class Comparator @@ -21,25 +19,44 @@ class Comparator private $target; private $operator = '=='; + public function __construct(string $target = null, string $operator = '==') + { + if (null === $target) { + trigger_deprecation('symfony/finder', '5.4', 'Constructing a "%s" without setting "$target" is deprecated.', __CLASS__); + } + + $this->target = $target; + $this->doSetOperator($operator); + } + /** * Gets the target value. * - * @return string The target value + * @return string */ public function getTarget() { + if (null === $this->target) { + trigger_deprecation('symfony/finder', '5.4', 'Calling "%s" without initializing the target is deprecated.', __METHOD__); + } + return $this->target; } + /** + * @deprecated set the target via the constructor instead + */ public function setTarget(string $target) { + trigger_deprecation('symfony/finder', '5.4', '"%s" is deprecated. Set the target via the constructor instead.', __METHOD__); + $this->target = $target; } /** * Gets the comparison operator. * - * @return string The operator + * @return string */ public function getOperator() { @@ -50,18 +67,14 @@ class Comparator * Sets the comparison operator. * * @throws \InvalidArgumentException + * + * @deprecated set the operator via the constructor instead */ public function setOperator(string $operator) { - if ('' === $operator) { - $operator = '=='; - } + trigger_deprecation('symfony/finder', '5.4', '"%s" is deprecated. Set the operator via the constructor instead.', __METHOD__); - if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) { - throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator)); - } - - $this->operator = $operator; + $this->doSetOperator('' === $operator ? '==' : $operator); } /** @@ -73,6 +86,10 @@ class Comparator */ public function test($test) { + if (null === $this->target) { + trigger_deprecation('symfony/finder', '5.4', 'Calling "%s" without initializing the target is deprecated.', __METHOD__); + } + switch ($this->operator) { case '>': return $test > $this->target; @@ -88,4 +105,13 @@ class Comparator return $test == $this->target; } + + private function doSetOperator(string $operator): void + { + if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) { + throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator)); + } + + $this->operator = $operator; + } } diff --git a/application/vendor/symfony/finder/Comparator/DateComparator.php b/application/vendor/symfony/finder/Comparator/DateComparator.php index ae22c6c..8f651e1 100644 --- a/application/vendor/symfony/finder/Comparator/DateComparator.php +++ b/application/vendor/symfony/finder/Comparator/DateComparator.php @@ -45,7 +45,6 @@ class DateComparator extends Comparator $operator = '<'; } - $this->setOperator($operator); - $this->setTarget($target); + parent::__construct($target, $operator); } } diff --git a/application/vendor/symfony/finder/Comparator/NumberComparator.php b/application/vendor/symfony/finder/Comparator/NumberComparator.php index 657118f..dd30820 100644 --- a/application/vendor/symfony/finder/Comparator/NumberComparator.php +++ b/application/vendor/symfony/finder/Comparator/NumberComparator.php @@ -35,7 +35,7 @@ namespace Symfony\Component\Finder\Comparator; class NumberComparator extends Comparator { /** - * @param string|int $test A comparison string or an integer + * @param string|null $test A comparison string or null * * @throws \InvalidArgumentException If the test is not understood */ @@ -73,7 +73,6 @@ class NumberComparator extends Comparator } } - $this->setTarget($target); - $this->setOperator($matches[1] ?? '=='); + parent::__construct($target, $matches[1] ?: '=='); } } diff --git a/application/vendor/symfony/finder/Finder.php b/application/vendor/symfony/finder/Finder.php index c9bd21f..8cc564c 100644 --- a/application/vendor/symfony/finder/Finder.php +++ b/application/vendor/symfony/finder/Finder.php @@ -36,6 +36,8 @@ use Symfony\Component\Finder\Iterator\SortableIterator; * $finder = Finder::create()->files()->name('*.php')->in(__DIR__); * * @author Fabien Potencier + * + * @implements \IteratorAggregate */ class Finder implements \IteratorAggregate, \Countable { @@ -582,16 +584,16 @@ class Finder implements \IteratorAggregate, \Countable foreach ((array) $dirs as $dir) { if (is_dir($dir)) { - $resolvedDirs[] = $this->normalizeDir($dir); + $resolvedDirs[] = [$this->normalizeDir($dir)]; } elseif ($glob = glob($dir, (\defined('GLOB_BRACE') ? \GLOB_BRACE : 0) | \GLOB_ONLYDIR | \GLOB_NOSORT)) { sort($glob); - $resolvedDirs = array_merge($resolvedDirs, array_map([$this, 'normalizeDir'], $glob)); + $resolvedDirs[] = array_map([$this, 'normalizeDir'], $glob); } else { throw new DirectoryNotFoundException(sprintf('The "%s" directory does not exist.', $dir)); } } - $this->dirs = array_merge($this->dirs, $resolvedDirs); + $this->dirs = array_merge($this->dirs, ...$resolvedDirs); return $this; } @@ -601,7 +603,7 @@ class Finder implements \IteratorAggregate, \Countable * * This method implements the IteratorAggregate interface. * - * @return \Iterator|SplFileInfo[] An iterator + * @return \Iterator * * @throws \LogicException if the in() method has not been called */ @@ -707,14 +709,6 @@ class Finder implements \IteratorAggregate, \Countable $notPaths[] = '#(^|/)\..+(/|$)#'; } - if (static::IGNORE_VCS_IGNORED_FILES === (static::IGNORE_VCS_IGNORED_FILES & $this->ignore)) { - $gitignoreFilePath = sprintf('%s/.gitignore', $dir); - if (!is_readable($gitignoreFilePath)) { - throw new \RuntimeException(sprintf('The "ignoreVCSIgnored" option cannot be used by the Finder as the "%s" file is not readable.', $gitignoreFilePath)); - } - $notPaths = array_merge($notPaths, [Gitignore::toRegex(file_get_contents($gitignoreFilePath))]); - } - $minDepth = 0; $maxDepth = \PHP_INT_MAX; @@ -783,6 +777,10 @@ class Finder implements \IteratorAggregate, \Countable $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths); } + if (static::IGNORE_VCS_IGNORED_FILES === (static::IGNORE_VCS_IGNORED_FILES & $this->ignore)) { + $iterator = new Iterator\VcsIgnoredFilterIterator($iterator, $dir); + } + return $iterator; } diff --git a/application/vendor/symfony/finder/Gitignore.php b/application/vendor/symfony/finder/Gitignore.php index 491f588..d42cca1 100644 --- a/application/vendor/symfony/finder/Gitignore.php +++ b/application/vendor/symfony/finder/Gitignore.php @@ -25,12 +25,22 @@ class Gitignore * Format specification: https://git-scm.com/docs/gitignore#_pattern_format */ public static function toRegex(string $gitignoreFileContent): string + { + return self::buildRegex($gitignoreFileContent, false); + } + + public static function toRegexMatchingNegatedPatterns(string $gitignoreFileContent): string + { + return self::buildRegex($gitignoreFileContent, true); + } + + private static function buildRegex(string $gitignoreFileContent, bool $inverted): string { $gitignoreFileContent = preg_replace('~(? $line) { + foreach ($gitignoreLines as $line) { $line = preg_replace('~(? + * + * @extends \FilterIterator */ class CustomFilterIterator extends \FilterIterator { private $filters = []; /** - * @param \Iterator $iterator The Iterator to filter - * @param callable[] $filters An array of PHP callbacks + * @param \Iterator $iterator The Iterator to filter + * @param callable[] $filters An array of PHP callbacks * * @throws \InvalidArgumentException */ @@ -44,7 +46,7 @@ class CustomFilterIterator extends \FilterIterator /** * Filters the iterator values. * - * @return bool true if the value should be kept, false otherwise + * @return bool */ #[\ReturnTypeWillChange] public function accept() diff --git a/application/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php b/application/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php index 90616f4..f592e19 100644 --- a/application/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php +++ b/application/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php @@ -17,14 +17,16 @@ use Symfony\Component\Finder\Comparator\DateComparator; * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates). * * @author Fabien Potencier + * + * @extends \FilterIterator */ class DateRangeFilterIterator extends \FilterIterator { private $comparators = []; /** - * @param \Iterator $iterator The Iterator to filter - * @param DateComparator[] $comparators An array of DateComparator instances + * @param \Iterator $iterator + * @param DateComparator[] $comparators */ public function __construct(\Iterator $iterator, array $comparators) { @@ -36,7 +38,7 @@ class DateRangeFilterIterator extends \FilterIterator /** * Filters the iterator values. * - * @return bool true if the value should be kept, false otherwise + * @return bool */ #[\ReturnTypeWillChange] public function accept() diff --git a/application/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php b/application/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php index e96fefd..f593a3f 100644 --- a/application/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php +++ b/application/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php @@ -15,15 +15,20 @@ namespace Symfony\Component\Finder\Iterator; * DepthRangeFilterIterator limits the directory depth. * * @author Fabien Potencier + * + * @template-covariant TKey + * @template-covariant TValue + * + * @extends \FilterIterator */ class DepthRangeFilterIterator extends \FilterIterator { private $minDepth = 0; /** - * @param \RecursiveIteratorIterator $iterator The Iterator to filter - * @param int $minDepth The min depth - * @param int $maxDepth The max depth + * @param \RecursiveIteratorIterator<\RecursiveIterator> $iterator The Iterator to filter + * @param int $minDepth The min depth + * @param int $maxDepth The max depth */ public function __construct(\RecursiveIteratorIterator $iterator, int $minDepth = 0, int $maxDepth = \PHP_INT_MAX) { @@ -36,7 +41,7 @@ class DepthRangeFilterIterator extends \FilterIterator /** * Filters the iterator values. * - * @return bool true if the value should be kept, false otherwise + * @return bool */ #[\ReturnTypeWillChange] public function accept() diff --git a/application/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/application/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php index cf9e678..39797c8 100644 --- a/application/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php +++ b/application/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php @@ -15,6 +15,10 @@ namespace Symfony\Component\Finder\Iterator; * ExcludeDirectoryFilterIterator filters out directories. * * @author Fabien Potencier + * + * @extends \FilterIterator + * + * @implements \RecursiveIterator */ class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator { @@ -50,7 +54,7 @@ class ExcludeDirectoryFilterIterator extends \FilterIterator implements \Recursi /** * Filters the iterator values. * - * @return bool True if the value should be kept, false otherwise + * @return bool */ #[\ReturnTypeWillChange] public function accept() diff --git a/application/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php b/application/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php index d054cef..793ae35 100644 --- a/application/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php +++ b/application/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php @@ -15,6 +15,8 @@ namespace Symfony\Component\Finder\Iterator; * FileTypeFilterIterator only keeps files, directories, or both. * * @author Fabien Potencier + * + * @extends \FilterIterator */ class FileTypeFilterIterator extends \FilterIterator { @@ -37,7 +39,7 @@ class FileTypeFilterIterator extends \FilterIterator /** * Filters the iterator values. * - * @return bool true if the value should be kept, false otherwise + * @return bool */ #[\ReturnTypeWillChange] public function accept() diff --git a/application/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php b/application/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php index 9493b5e..79f8c29 100644 --- a/application/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php +++ b/application/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php @@ -16,13 +16,15 @@ namespace Symfony\Component\Finder\Iterator; * * @author Fabien Potencier * @author Włodzimierz Gajda + * + * @extends MultiplePcreFilterIterator */ class FilecontentFilterIterator extends MultiplePcreFilterIterator { /** * Filters the iterator values. * - * @return bool true if the value should be kept, false otherwise + * @return bool */ #[\ReturnTypeWillChange] public function accept() @@ -50,7 +52,7 @@ class FilecontentFilterIterator extends MultiplePcreFilterIterator * * @param string $str Pattern: string or regexp * - * @return string regexp corresponding to a given string or regexp + * @return string */ protected function toRegex(string $str) { diff --git a/application/vendor/symfony/finder/Iterator/FilenameFilterIterator.php b/application/vendor/symfony/finder/Iterator/FilenameFilterIterator.php index 137c2c4..77b3b24 100644 --- a/application/vendor/symfony/finder/Iterator/FilenameFilterIterator.php +++ b/application/vendor/symfony/finder/Iterator/FilenameFilterIterator.php @@ -17,13 +17,15 @@ use Symfony\Component\Finder\Glob; * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string). * * @author Fabien Potencier + * + * @extends MultiplePcreFilterIterator */ class FilenameFilterIterator extends MultiplePcreFilterIterator { /** * Filters the iterator values. * - * @return bool true if the value should be kept, false otherwise + * @return bool */ #[\ReturnTypeWillChange] public function accept() @@ -39,7 +41,7 @@ class FilenameFilterIterator extends MultiplePcreFilterIterator * * @param string $str Pattern: glob or regexp * - * @return string regexp corresponding to a given glob or regexp + * @return string */ protected function toRegex(string $str) { diff --git a/application/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/application/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php index 78a34ab..564765d 100644 --- a/application/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php +++ b/application/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php @@ -15,6 +15,11 @@ namespace Symfony\Component\Finder\Iterator; * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings). * * @author Fabien Potencier + * + * @template-covariant TKey + * @template-covariant TValue + * + * @extends \FilterIterator */ abstract class MultiplePcreFilterIterator extends \FilterIterator { @@ -79,7 +84,13 @@ abstract class MultiplePcreFilterIterator extends \FilterIterator */ protected function isRegex(string $str) { - if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) { + $availableModifiers = 'imsxuADU'; + + if (\PHP_VERSION_ID >= 80200) { + $availableModifiers .= 'n'; + } + + if (preg_match('/^(.{3,}?)['.$availableModifiers.']*$/', $str, $m)) { $start = substr($m[1], 0, 1); $end = substr($m[1], -1); diff --git a/application/vendor/symfony/finder/Iterator/PathFilterIterator.php b/application/vendor/symfony/finder/Iterator/PathFilterIterator.php index 1d09c26..7974c4e 100644 --- a/application/vendor/symfony/finder/Iterator/PathFilterIterator.php +++ b/application/vendor/symfony/finder/Iterator/PathFilterIterator.php @@ -16,13 +16,15 @@ namespace Symfony\Component\Finder\Iterator; * * @author Fabien Potencier * @author Włodzimierz Gajda + * + * @extends MultiplePcreFilterIterator */ class PathFilterIterator extends MultiplePcreFilterIterator { /** * Filters the iterator values. * - * @return bool true if the value should be kept, false otherwise + * @return bool */ #[\ReturnTypeWillChange] public function accept() @@ -48,7 +50,7 @@ class PathFilterIterator extends MultiplePcreFilterIterator * * @param string $str Pattern: regexp or dirname * - * @return string regexp corresponding to a given string or regexp + * @return string */ protected function toRegex(string $str) { diff --git a/application/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/application/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php index a18e618..27589cd 100644 --- a/application/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php +++ b/application/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php @@ -56,7 +56,7 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator /** * Return an instance of SplFileInfo with support for relative paths. * - * @return SplFileInfo File information + * @return SplFileInfo */ #[\ReturnTypeWillChange] public function current() @@ -64,7 +64,7 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator // the logic here avoids redoing the same work in all iterations if (null === $subPathname = $this->subPath) { - $subPathname = $this->subPath = (string) $this->getSubPath(); + $subPathname = $this->subPath = $this->getSubPath(); } if ('' !== $subPathname) { $subPathname .= $this->directorySeparator; @@ -79,7 +79,31 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator } /** - * @return \RecursiveIterator + * @param bool $allowLinks + * + * @return bool + */ + #[\ReturnTypeWillChange] + public function hasChildren($allowLinks = false) + { + $hasChildren = parent::hasChildren($allowLinks); + + if (!$hasChildren || !$this->ignoreUnreadableDirs) { + return $hasChildren; + } + + try { + parent::getChildren(); + + return true; + } catch (\UnexpectedValueException $e) { + // If directory is unreadable and finder is set to ignore it, skip children + return false; + } + } + + /** + * @return \RecursiveDirectoryIterator * * @throws AccessDeniedException */ @@ -100,12 +124,7 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator return $children; } catch (\UnexpectedValueException $e) { - if ($this->ignoreUnreadableDirs) { - // If directory is unreadable and finder is set to ignore it, a fake empty content is returned. - return new \RecursiveArrayIterator([]); - } else { - throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e); - } + throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e); } } @@ -127,7 +146,7 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator /** * Checks if the stream is rewindable. * - * @return bool true when the stream is rewindable, false otherwise + * @return bool */ public function isRewindable() { diff --git a/application/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php b/application/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php index 4078f36..575bf29 100644 --- a/application/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php +++ b/application/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php @@ -17,14 +17,16 @@ use Symfony\Component\Finder\Comparator\NumberComparator; * SizeRangeFilterIterator filters out files that are not in the given size range. * * @author Fabien Potencier + * + * @extends \FilterIterator */ class SizeRangeFilterIterator extends \FilterIterator { private $comparators = []; /** - * @param \Iterator $iterator The Iterator to filter - * @param NumberComparator[] $comparators An array of NumberComparator instances + * @param \Iterator $iterator + * @param NumberComparator[] $comparators */ public function __construct(\Iterator $iterator, array $comparators) { @@ -36,7 +38,7 @@ class SizeRangeFilterIterator extends \FilterIterator /** * Filters the iterator values. * - * @return bool true if the value should be kept, false otherwise + * @return bool */ #[\ReturnTypeWillChange] public function accept() diff --git a/application/vendor/symfony/finder/Iterator/SortableIterator.php b/application/vendor/symfony/finder/Iterator/SortableIterator.php index 04ca8eb..9afde5c 100644 --- a/application/vendor/symfony/finder/Iterator/SortableIterator.php +++ b/application/vendor/symfony/finder/Iterator/SortableIterator.php @@ -15,6 +15,8 @@ namespace Symfony\Component\Finder\Iterator; * SortableIterator applies a sort on a given Iterator. * * @author Fabien Potencier + * + * @implements \IteratorAggregate */ class SortableIterator implements \IteratorAggregate { @@ -30,7 +32,8 @@ class SortableIterator implements \IteratorAggregate private $sort; /** - * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) + * @param \Traversable $iterator + * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) * * @throws \InvalidArgumentException */ @@ -79,7 +82,7 @@ class SortableIterator implements \IteratorAggregate } /** - * @return \Traversable + * @return \Traversable */ #[\ReturnTypeWillChange] public function getIterator() diff --git a/application/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php b/application/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php new file mode 100644 index 0000000..e27158c --- /dev/null +++ b/application/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php @@ -0,0 +1,151 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +use Symfony\Component\Finder\Gitignore; + +final class VcsIgnoredFilterIterator extends \FilterIterator +{ + /** + * @var string + */ + private $baseDir; + + /** + * @var array + */ + private $gitignoreFilesCache = []; + + /** + * @var array + */ + private $ignoredPathsCache = []; + + public function __construct(\Iterator $iterator, string $baseDir) + { + $this->baseDir = $this->normalizePath($baseDir); + + parent::__construct($iterator); + } + + public function accept(): bool + { + $file = $this->current(); + + $fileRealPath = $this->normalizePath($file->getRealPath()); + + return !$this->isIgnored($fileRealPath); + } + + private function isIgnored(string $fileRealPath): bool + { + if (is_dir($fileRealPath) && !str_ends_with($fileRealPath, '/')) { + $fileRealPath .= '/'; + } + + if (isset($this->ignoredPathsCache[$fileRealPath])) { + return $this->ignoredPathsCache[$fileRealPath]; + } + + $ignored = false; + + foreach ($this->parentsDirectoryDownward($fileRealPath) as $parentDirectory) { + if ($this->isIgnored($parentDirectory)) { + // rules in ignored directories are ignored, no need to check further. + break; + } + + $fileRelativePath = substr($fileRealPath, \strlen($parentDirectory) + 1); + + if (null === $regexps = $this->readGitignoreFile("{$parentDirectory}/.gitignore")) { + continue; + } + + [$exclusionRegex, $inclusionRegex] = $regexps; + + if (preg_match($exclusionRegex, $fileRelativePath)) { + $ignored = true; + + continue; + } + + if (preg_match($inclusionRegex, $fileRelativePath)) { + $ignored = false; + } + } + + return $this->ignoredPathsCache[$fileRealPath] = $ignored; + } + + /** + * @return list + */ + private function parentsDirectoryDownward(string $fileRealPath): array + { + $parentDirectories = []; + + $parentDirectory = $fileRealPath; + + while (true) { + $newParentDirectory = \dirname($parentDirectory); + + // dirname('/') = '/' + if ($newParentDirectory === $parentDirectory) { + break; + } + + $parentDirectory = $newParentDirectory; + + if (0 !== strpos($parentDirectory, $this->baseDir)) { + break; + } + + $parentDirectories[] = $parentDirectory; + } + + return array_reverse($parentDirectories); + } + + /** + * @return array{0: string, 1: string}|null + */ + private function readGitignoreFile(string $path): ?array + { + if (\array_key_exists($path, $this->gitignoreFilesCache)) { + return $this->gitignoreFilesCache[$path]; + } + + if (!file_exists($path)) { + return $this->gitignoreFilesCache[$path] = null; + } + + if (!is_file($path) || !is_readable($path)) { + throw new \RuntimeException("The \"ignoreVCSIgnored\" option cannot be used by the Finder as the \"{$path}\" file is not readable."); + } + + $gitignoreFileContent = file_get_contents($path); + + return $this->gitignoreFilesCache[$path] = [ + Gitignore::toRegex($gitignoreFileContent), + Gitignore::toRegexMatchingNegatedPatterns($gitignoreFileContent), + ]; + } + + private function normalizePath(string $path): string + { + if ('\\' === \DIRECTORY_SEPARATOR) { + return str_replace('\\', '/', $path); + } + + return $path; + } +} diff --git a/application/vendor/symfony/finder/LICENSE b/application/vendor/symfony/finder/LICENSE index 9ff2d0d..0138f8f 100644 --- a/application/vendor/symfony/finder/LICENSE +++ b/application/vendor/symfony/finder/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2004-2021 Fabien Potencier +Copyright (c) 2004-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/application/vendor/symfony/finder/SplFileInfo.php b/application/vendor/symfony/finder/SplFileInfo.php index 62c9faa..11604a2 100644 --- a/application/vendor/symfony/finder/SplFileInfo.php +++ b/application/vendor/symfony/finder/SplFileInfo.php @@ -38,7 +38,7 @@ class SplFileInfo extends \SplFileInfo * * This path does not contain the file name. * - * @return string the relative path + * @return string */ public function getRelativePath() { @@ -50,7 +50,7 @@ class SplFileInfo extends \SplFileInfo * * This path contains the file name. * - * @return string the relative path name + * @return string */ public function getRelativePathname() { @@ -67,15 +67,18 @@ class SplFileInfo extends \SplFileInfo /** * Returns the contents of the file. * - * @return string the contents of the file + * @return string * * @throws \RuntimeException */ public function getContents() { set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); - $content = file_get_contents($this->getPathname()); - restore_error_handler(); + try { + $content = file_get_contents($this->getPathname()); + } finally { + restore_error_handler(); + } if (false === $content) { throw new \RuntimeException($error); } diff --git a/application/vendor/symfony/finder/composer.json b/application/vendor/symfony/finder/composer.json index deccde8..ef19911 100644 --- a/application/vendor/symfony/finder/composer.json +++ b/application/vendor/symfony/finder/composer.json @@ -17,6 +17,7 @@ ], "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "autoload": { diff --git a/application/vendor/symfony/polyfill-iconv/README.md b/application/vendor/symfony/polyfill-iconv/README.md index b0c8984..b089088 100644 --- a/application/vendor/symfony/polyfill-iconv/README.md +++ b/application/vendor/symfony/polyfill-iconv/README.md @@ -6,7 +6,7 @@ This component provides a native PHP implementation of the (short of [`ob_iconv_handler`](https://php.net/ob-iconv-handler)). More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/application/vendor/symfony/polyfill-iconv/bootstrap.php b/application/vendor/symfony/polyfill-iconv/bootstrap.php index 91fdba0..c11df3b 100644 --- a/application/vendor/symfony/polyfill-iconv/bootstrap.php +++ b/application/vendor/symfony/polyfill-iconv/bootstrap.php @@ -62,7 +62,7 @@ if (extension_loaded('mbstring')) { function iconv_substr($string, $offset, $length = 2147483647, $encoding = null) { null === $encoding && $encoding = p\Iconv::$internalEncoding; return mb_substr($string, $offset, $length, $encoding); } } if (!function_exists('iconv_mime_decode')) { - function iconv_mime_decode($string, $mode = 0, $encoding = null) { null === $encoding && $encoding = p\Iconv::$internalEncoding; return mb_decode_mimeheader($string, $mode, $encoding); } + function iconv_mime_decode($string, $mode = 0, $encoding = null) { $currentMbEncoding = mb_internal_encoding(); null === $encoding && $encoding = p\Iconv::$internalEncoding; mb_internal_encoding($encoding); $decoded = mb_decode_mimeheader($string); mb_internal_encoding($currentMbEncoding); return $decoded; } } } else { if (!function_exists('iconv_strlen')) { diff --git a/application/vendor/symfony/polyfill-iconv/bootstrap80.php b/application/vendor/symfony/polyfill-iconv/bootstrap80.php index cf89557..04b1473 100644 --- a/application/vendor/symfony/polyfill-iconv/bootstrap80.php +++ b/application/vendor/symfony/polyfill-iconv/bootstrap80.php @@ -54,7 +54,7 @@ if (extension_loaded('mbstring')) { function iconv_substr(?string $string, ?int $offset, ?int $length = null, ?string $encoding = null): string|false { null === $encoding && $encoding = p\Iconv::$internalEncoding; return mb_substr((string) $string, (int) $offset, $length, $encoding); } } if (!function_exists('iconv_mime_decode')) { - function iconv_mime_decode($string, $mode = 0, $encoding = null) { null === $encoding && $encoding = p\Iconv::$internalEncoding; return mb_decode_mimeheader($string, $mode, $encoding); } + function iconv_mime_decode($string, $mode = 0, $encoding = null) { $currentMbEncoding = mb_internal_encoding(); null === $encoding && $encoding = p\Iconv::$internalEncoding; mb_internal_encoding($encoding); $decoded = mb_decode_mimeheader($string); mb_internal_encoding($currentMbEncoding); return $decoded; } } } else { if (!function_exists('iconv_strlen')) { diff --git a/application/vendor/symfony/polyfill-iconv/composer.json b/application/vendor/symfony/polyfill-iconv/composer.json index 17483e0..361f555 100644 --- a/application/vendor/symfony/polyfill-iconv/composer.json +++ b/application/vendor/symfony/polyfill-iconv/composer.json @@ -18,6 +18,9 @@ "require": { "php": ">=7.1" }, + "provide": { + "ext-iconv": "*" + }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Iconv\\": "" }, "files": [ "bootstrap.php" ] @@ -28,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/application/vendor/symfony/polyfill-intl-grapheme/Grapheme.php b/application/vendor/symfony/polyfill-intl-grapheme/Grapheme.php index 572da5d..5373f16 100644 --- a/application/vendor/symfony/polyfill-intl-grapheme/Grapheme.php +++ b/application/vendor/symfony/polyfill-intl-grapheme/Grapheme.php @@ -11,7 +11,7 @@ namespace Symfony\Polyfill\Intl\Grapheme; -\define('SYMFONY_GRAPHEME_CLUSTER_RX', \PCRE_VERSION >= '8.32' ? '\X' : Grapheme::GRAPHEME_CLUSTER_RX); +\define('SYMFONY_GRAPHEME_CLUSTER_RX', ((float) \PCRE_VERSION < 10 ? (float) \PCRE_VERSION >= 8.32 : (float) \PCRE_VERSION >= 10.39) ? '\X' : Grapheme::GRAPHEME_CLUSTER_RX); /** * Partial intl implementation in pure PHP. @@ -48,7 +48,7 @@ final class Grapheme $start = \strlen($s) + $start; } - if (!is_scalar($s)) { + if (!\is_scalar($s)) { $hasError = false; set_error_handler(function () use (&$hasError) { $hasError = true; }); $next = substr($s, $start); diff --git a/application/vendor/symfony/polyfill-intl-grapheme/README.md b/application/vendor/symfony/polyfill-intl-grapheme/README.md index 77523ea..f55d92c 100644 --- a/application/vendor/symfony/polyfill-intl-grapheme/README.md +++ b/application/vendor/symfony/polyfill-intl-grapheme/README.md @@ -23,7 +23,7 @@ This component provides a partial, native PHP implementation of the - [`grapheme_substr`](https://php.net/grapheme_substr): Return part of a string More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/application/vendor/symfony/polyfill-intl-grapheme/composer.json b/application/vendor/symfony/polyfill-intl-grapheme/composer.json index 02c98ee..fde5537 100644 --- a/application/vendor/symfony/polyfill-intl-grapheme/composer.json +++ b/application/vendor/symfony/polyfill-intl-grapheme/composer.json @@ -28,7 +28,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/application/vendor/symfony/polyfill-intl-normalizer/Normalizer.php b/application/vendor/symfony/polyfill-intl-normalizer/Normalizer.php index 4443c23..81704ab 100644 --- a/application/vendor/symfony/polyfill-intl-normalizer/Normalizer.php +++ b/application/vendor/symfony/polyfill-intl-normalizer/Normalizer.php @@ -90,7 +90,7 @@ class Normalizer self::$cC = self::getData('combiningClass'); } - if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) { + if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) \ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) { mb_internal_encoding('8bit'); } diff --git a/application/vendor/symfony/polyfill-intl-normalizer/README.md b/application/vendor/symfony/polyfill-intl-normalizer/README.md index 15060c5..b9b762e 100644 --- a/application/vendor/symfony/polyfill-intl-normalizer/README.md +++ b/application/vendor/symfony/polyfill-intl-normalizer/README.md @@ -6,7 +6,7 @@ This component provides a fallback implementation for the by the [Intl](https://php.net/intl) extension. More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/application/vendor/symfony/polyfill-intl-normalizer/composer.json b/application/vendor/symfony/polyfill-intl-normalizer/composer.json index 393edf7..65f72d6 100644 --- a/application/vendor/symfony/polyfill-intl-normalizer/composer.json +++ b/application/vendor/symfony/polyfill-intl-normalizer/composer.json @@ -29,7 +29,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/application/vendor/symfony/polyfill-mbstring/Mbstring.php b/application/vendor/symfony/polyfill-mbstring/Mbstring.php index b599095..bce5c4a 100644 --- a/application/vendor/symfony/polyfill-mbstring/Mbstring.php +++ b/application/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -80,7 +80,7 @@ final class Mbstring public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) { - if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) { + if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) { $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); } else { $fromEncoding = self::getEncoding($fromEncoding); @@ -102,7 +102,7 @@ final class Mbstring $fromEncoding = 'Windows-1252'; } if ('UTF-8' !== $fromEncoding) { - $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s); + $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); } return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); @@ -113,7 +113,7 @@ final class Mbstring $fromEncoding = 'UTF-8'; } - return \iconv($fromEncoding, $toEncoding.'//IGNORE', $s); + return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); } public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) @@ -130,7 +130,7 @@ final class Mbstring public static function mb_decode_mimeheader($s) { - return \iconv_mime_decode($s, 2, self::$internalEncoding); + return iconv_mime_decode($s, 2, self::$internalEncoding); } public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) @@ -140,7 +140,7 @@ final class Mbstring public static function mb_decode_numericentity($s, $convmap, $encoding = null) { - if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; @@ -150,7 +150,7 @@ final class Mbstring return false; } - if (null !== $encoding && !is_scalar($encoding)) { + if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); return ''; // Instead of null (cf. mb_encode_numericentity). @@ -166,10 +166,10 @@ final class Mbstring if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + $s = iconv($encoding, 'UTF-8//IGNORE', $s); } $cnt = floor(\count($convmap) / 4) * 4; @@ -195,12 +195,12 @@ final class Mbstring return $s; } - return \iconv('UTF-8', $encoding.'//IGNORE', $s); + return iconv('UTF-8', $encoding.'//IGNORE', $s); } public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) { - if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; @@ -210,13 +210,13 @@ final class Mbstring return false; } - if (null !== $encoding && !is_scalar($encoding)) { + if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; // Instead of '' (cf. mb_decode_numericentity). } - if (null !== $is_hex && !is_scalar($is_hex)) { + if (null !== $is_hex && !\is_scalar($is_hex)) { trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); return null; @@ -232,10 +232,10 @@ final class Mbstring if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + $s = iconv($encoding, 'UTF-8//IGNORE', $s); } static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; @@ -265,7 +265,7 @@ final class Mbstring return $result; } - return \iconv('UTF-8', $encoding.'//IGNORE', $result); + return iconv('UTF-8', $encoding.'//IGNORE', $result); } public static function mb_convert_case($s, $mode, $encoding = null) @@ -280,10 +280,10 @@ final class Mbstring if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + $s = iconv($encoding, 'UTF-8//IGNORE', $s); } if (\MB_CASE_TITLE == $mode) { @@ -343,7 +343,7 @@ final class Mbstring return $s; } - return \iconv('UTF-8', $encoding.'//IGNORE', $s); + return iconv('UTF-8', $encoding.'//IGNORE', $s); } public static function mb_internal_encoding($encoding = null) @@ -354,7 +354,7 @@ final class Mbstring $normalizedEncoding = self::getEncoding($encoding); - if ('UTF-8' === $normalizedEncoding || false !== @\iconv($normalizedEncoding, $normalizedEncoding, ' ')) { + if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) { self::$internalEncoding = $normalizedEncoding; return true; @@ -413,7 +413,7 @@ final class Mbstring $encoding = self::$internalEncoding; } - return self::mb_detect_encoding($var, [$encoding]) || false !== @\iconv($encoding, $encoding, $var); + return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); } public static function mb_detect_encoding($str, $encodingList = null, $strict = false) @@ -488,7 +488,7 @@ final class Mbstring return \strlen($s); } - return @\iconv_strlen($s, $encoding); + return @iconv_strlen($s, $encoding); } public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) @@ -509,7 +509,7 @@ final class Mbstring return 0; } - return \iconv_strpos($haystack, $needle, $offset, $encoding); + return iconv_strpos($haystack, $needle, $offset, $encoding); } public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) @@ -533,7 +533,7 @@ final class Mbstring } $pos = '' !== $needle || 80000 > \PHP_VERSION_ID - ? \iconv_strrpos($haystack, $needle, $encoding) + ? iconv_strrpos($haystack, $needle, $encoding) : self::mb_strlen($haystack, $encoding); return false !== $pos ? $offset + $pos : false; @@ -541,7 +541,7 @@ final class Mbstring public static function mb_str_split($string, $split_length = 1, $encoding = null) { - if (null !== $string && !is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { + if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); return null; @@ -550,6 +550,7 @@ final class Mbstring if (1 > $split_length = (int) $split_length) { if (80000 > \PHP_VERSION_ID) { trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); + return false; } @@ -568,7 +569,7 @@ final class Mbstring } $rx .= '.{'.$split_length.'})/us'; - return preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); } $result = []; @@ -602,6 +603,9 @@ final class Mbstring if (80000 > \PHP_VERSION_ID) { return false; } + if (\is_int($c) || 'long' === $c || 'entity' === $c) { + return false; + } throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); } @@ -614,7 +618,7 @@ final class Mbstring } if ($start < 0) { - $start = \iconv_strlen($s, $encoding) + $start; + $start = iconv_strlen($s, $encoding) + $start; if ($start < 0) { $start = 0; } @@ -623,13 +627,13 @@ final class Mbstring if (null === $length) { $length = 2147483647; } elseif ($length < 0) { - $length = \iconv_strlen($s, $encoding) + $length - $start; + $length = iconv_strlen($s, $encoding) + $length - $start; if ($length < 0) { return ''; } } - return (string) \iconv_substr($s, $start, $length, $encoding); + return (string) iconv_substr($s, $start, $length, $encoding); } public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) @@ -654,7 +658,7 @@ final class Mbstring $pos = strrpos($haystack, $needle); } else { $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = \iconv_strrpos($haystack, $needle, $encoding); + $pos = iconv_strrpos($haystack, $needle, $encoding); } return self::getSubpart($pos, $part, $haystack, $encoding); @@ -733,12 +737,12 @@ final class Mbstring $encoding = self::getEncoding($encoding); if ('UTF-8' !== $encoding) { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + $s = iconv($encoding, 'UTF-8//IGNORE', $s); } $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); - return ($wide << 1) + \iconv_strlen($s, 'UTF-8'); + return ($wide << 1) + iconv_strlen($s, 'UTF-8'); } public static function mb_substr_count($haystack, $needle, $encoding = null) diff --git a/application/vendor/symfony/polyfill-mbstring/README.md b/application/vendor/symfony/polyfill-mbstring/README.md index 4efb599..478b40d 100644 --- a/application/vendor/symfony/polyfill-mbstring/README.md +++ b/application/vendor/symfony/polyfill-mbstring/README.md @@ -5,7 +5,7 @@ This component provides a partial, native PHP implementation for the [Mbstring](https://php.net/mbstring) extension. More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/application/vendor/symfony/polyfill-mbstring/composer.json b/application/vendor/symfony/polyfill-mbstring/composer.json index 2ed7a74..4489553 100644 --- a/application/vendor/symfony/polyfill-mbstring/composer.json +++ b/application/vendor/symfony/polyfill-mbstring/composer.json @@ -18,6 +18,9 @@ "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" ] @@ -28,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/application/vendor/symfony/polyfill-php72/Php72.php b/application/vendor/symfony/polyfill-php72/Php72.php index 5e20d5b..7bf96c9 100644 --- a/application/vendor/symfony/polyfill-php72/Php72.php +++ b/application/vendor/symfony/polyfill-php72/Php72.php @@ -83,7 +83,7 @@ final class Php72 'SunOS' => 'Solaris', ]; - return isset($map[\PHP_OS]) ? $map[\PHP_OS] : 'Unknown'; + return $map[\PHP_OS] ?? 'Unknown'; } public static function spl_object_id($object) @@ -96,7 +96,7 @@ final class Php72 } // On 32-bit systems, PHP_INT_SIZE is 4, - return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); + return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1)); } public static function sapi_windows_vt100_support($stream, $enable = null) @@ -167,7 +167,7 @@ final class Php72 self::$hashMask = (int) substr(ob_get_clean(), 17); } - self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); + self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1)); } public static function mb_chr($code, $encoding = null) diff --git a/application/vendor/symfony/polyfill-php72/README.md b/application/vendor/symfony/polyfill-php72/README.md index 59dec8a..ed19050 100644 --- a/application/vendor/symfony/polyfill-php72/README.md +++ b/application/vendor/symfony/polyfill-php72/README.md @@ -6,6 +6,12 @@ This component provides functions added to PHP 7.2 core: - [`spl_object_id`](https://php.net/spl_object_id) - [`stream_isatty`](https://php.net/stream_isatty) +And also functions added to PHP 7.2 mbstring: + +- [`mb_ord`](https://php.net/mb_ord) +- [`mb_chr`](https://php.net/mb_chr) +- [`mb_scrub`](https://php.net/mb_scrub) + On Windows only: - [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support) @@ -16,11 +22,12 @@ Moved to core since 7.2 (was in the optional XML extension earlier): - [`utf8_decode`](https://php.net/utf8_decode) Also, it provides constants added to PHP 7.2: + - [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) - [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/application/vendor/symfony/polyfill-php72/composer.json b/application/vendor/symfony/polyfill-php72/composer.json index c96c844..5f17af3 100644 --- a/application/vendor/symfony/polyfill-php72/composer.json +++ b/application/vendor/symfony/polyfill-php72/composer.json @@ -25,7 +25,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/application/vendor/symfony/polyfill-php80/Php80.php b/application/vendor/symfony/polyfill-php80/Php80.php index 5fef511..362dd1a 100644 --- a/application/vendor/symfony/polyfill-php80/Php80.php +++ b/application/vendor/symfony/polyfill-php80/Php80.php @@ -100,6 +100,16 @@ final class Php80 public static function str_ends_with(string $haystack, string $needle): bool { - return '' === $needle || ('' !== $haystack && 0 === substr_compare($haystack, $needle, -\strlen($needle))); + if ('' === $needle || $needle === $haystack) { + return true; + } + + if ('' === $haystack) { + return false; + } + + $needleLength = \strlen($needle); + + return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength); } } diff --git a/application/vendor/symfony/polyfill-php80/PhpToken.php b/application/vendor/symfony/polyfill-php80/PhpToken.php new file mode 100644 index 0000000..fe6e691 --- /dev/null +++ b/application/vendor/symfony/polyfill-php80/PhpToken.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Fedonyuk Anton + * + * @internal + */ +class PhpToken implements \Stringable +{ + /** + * @var int + */ + public $id; + + /** + * @var string + */ + public $text; + + /** + * @var int + */ + public $line; + + /** + * @var int + */ + public $pos; + + public function __construct(int $id, string $text, int $line = -1, int $position = -1) + { + $this->id = $id; + $this->text = $text; + $this->line = $line; + $this->pos = $position; + } + + public function getTokenName(): ?string + { + if ('UNKNOWN' === $name = token_name($this->id)) { + $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; + } + + return $name; + } + + /** + * @param int|string|array $kind + */ + public function is($kind): bool + { + foreach ((array) $kind as $value) { + if (\in_array($value, [$this->id, $this->text], true)) { + return true; + } + } + + return false; + } + + public function isIgnorable(): bool + { + return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true); + } + + public function __toString(): string + { + return (string) $this->text; + } + + /** + * @return static[] + */ + public static function tokenize(string $code, int $flags = 0): array + { + $line = 1; + $position = 0; + $tokens = token_get_all($code, $flags); + foreach ($tokens as $index => $token) { + if (\is_string($token)) { + $id = \ord($token); + $text = $token; + } else { + [$id, $text, $line] = $token; + } + $tokens[$index] = new static($id, $text, $line, $position); + $position += \strlen($text); + } + + return $tokens; + } +} diff --git a/application/vendor/symfony/polyfill-php80/README.md b/application/vendor/symfony/polyfill-php80/README.md index 10b8ee4..3816c55 100644 --- a/application/vendor/symfony/polyfill-php80/README.md +++ b/application/vendor/symfony/polyfill-php80/README.md @@ -3,12 +3,13 @@ Symfony Polyfill / Php80 This component provides features added to PHP 8.0 core: -- `Stringable` interface +- [`Stringable`](https://php.net/stringable) interface - [`fdiv`](https://php.net/fdiv) -- `ValueError` class -- `UnhandledMatchError` class +- [`ValueError`](https://php.net/valueerror) class +- [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class - `FILTER_VALIDATE_BOOL` constant - [`get_debug_type`](https://php.net/get_debug_type) +- [`PhpToken`](https://php.net/phptoken) class - [`preg_last_error_msg`](https://php.net/preg_last_error_msg) - [`str_contains`](https://php.net/str_contains) - [`str_starts_with`](https://php.net/str_starts_with) diff --git a/application/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/application/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php index 7ea6d27..2b95542 100644 --- a/application/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php +++ b/application/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + #[Attribute(Attribute::TARGET_CLASS)] final class Attribute { diff --git a/application/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/application/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php new file mode 100644 index 0000000..bd1212f --- /dev/null +++ b/application/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) { + class PhpToken extends Symfony\Polyfill\Php80\PhpToken + { + } +} diff --git a/application/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/application/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php index 77e037c..7c62d75 100644 --- a/application/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php +++ b/application/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + if (\PHP_VERSION_ID < 80000) { interface Stringable { diff --git a/application/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php b/application/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php index 7fb2000..01c6c6c 100644 --- a/application/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php +++ b/application/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php @@ -1,5 +1,16 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class UnhandledMatchError extends Error + { + } } diff --git a/application/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php b/application/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php index 99843ca..783dbc2 100644 --- a/application/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php +++ b/application/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php @@ -1,5 +1,16 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class ValueError extends Error + { + } } diff --git a/application/vendor/symfony/polyfill-php80/composer.json b/application/vendor/symfony/polyfill-php80/composer.json index 5fe679d..bd9a326 100644 --- a/application/vendor/symfony/polyfill-php80/composer.json +++ b/application/vendor/symfony/polyfill-php80/composer.json @@ -30,7 +30,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/application/vendor/voku/anti-xss/CHANGELOG.md b/application/vendor/voku/anti-xss/CHANGELOG.md index 8dea82b..2d8b7dd 100644 --- a/application/vendor/voku/anti-xss/CHANGELOG.md +++ b/application/vendor/voku/anti-xss/CHANGELOG.md @@ -1,5 +1,48 @@ # Changelog +### 4.1.41 (2023-02-12) + +- remove debug call (thx @gharlan [Gregor Harlan] + +### 4.1.40 (2023-02-11) + +- fix xss bypass (issue 115 | thx @thanosgn [Thanos Giannopoulos]) +- add more blacklisted js calls (thx @peter-mw [Peter Ivanov]) +- fix false positive on self-close tags (issue 111 | thx @genetus [Maxim Antonov]) + +### 4.1.39 (2022-03-08) + +- "To people of Russia": There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilians. + +### 4.1.38 (2022-03-07) + +- optimize "_sanitize_naughty_javascript" (issue 99 | thx @Fahl-Design) +- optimize "_do_never_allowed_afterwards", at least for strings in tags + +### 4.1.37 (2022-02-15) + +- move more static data into the object + - allow to modify the "_never_allowed_call_strings"-data" + - allow to modify the "_never_allowed_js_callback_regex"-data" + +### 4.1.36 (2022-01-27) + +- update "portable-utf8" + +### 4.1.35 (2021-12-08) + +- update "portable-utf8" + +### 4.1.34 (2021-11-29) + +- allow e.g. "< 1 year" (issue 83) +- fix false-positive issue (issue 85 | thx @gharlan) + +### 4.1.33 (2021-10-04) + +- fix errors in large strings +- fix "_xss_found" if xss string was found in array value + ### 4.1.32 (2021-03-29) - micro-optimize performance diff --git a/application/vendor/voku/anti-xss/README.md b/application/vendor/voku/anti-xss/README.md index 1cd6303..dc62e42 100644 --- a/application/vendor/voku/anti-xss/README.md +++ b/application/vendor/voku/anti-xss/README.md @@ -1,4 +1,6 @@ [//]: # (AUTO-GENERATED BY "PHP README Helper": base file -> docs/base.md) +[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) + [![Build Status](https://github.com/voku/anti-xss/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/voku/anti-xss/actions) [![codecov.io](http://codecov.io/github/voku/anti-xss/coverage.svg?branch=master)](http://codecov.io/github/voku/anti-xss?branch=master) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/8e3c9da417124971b8d8e0c1046c24c7)](https://www.codacy.com/app/voku/anti-xss) @@ -147,13 +149,17 @@ composer install

addDoNotCloseHtmlTags addEvilAttributes addEvilHtmlTags +addNeverAllowedCallStrings +
addNeverAllowedJsCallbackRegex addNeverAllowedOnEventsAfterwards -
addNeverAllowedRegex +addNeverAllowedRegex addNeverAllowedStrAfterwards -isXssFound +
isXssFound removeDoNotCloseHtmlTags -
removeEvilAttributes +removeEvilAttributes removeEvilHtmlTags +
removeNeverAllowedCallStrings +removeNeverAllowedJsCallbackRegex removeNeverAllowedOnEventsAfterwards removeNeverAllowedRegex
removeNeverAllowedStrAfterwards @@ -198,6 +204,30 @@ Add some strings to the "_evil_html_tags"-array. -------- +## addNeverAllowedCallStrings(string[] $strings): $this + +Add some strings to the "_never_allowed_call_strings"-array. + +**Parameters:** +- `string[] $strings` + +**Return:** +- `$this` + +-------- + +## addNeverAllowedJsCallbackRegex(string[] $strings): $this + +Add some strings to the "_never_allowed_js_callback_regex"-array. + +**Parameters:** +- `string[] $strings` + +**Return:** +- `$this` + +-------- + ## addNeverAllowedOnEventsAfterwards(string[] $strings): $this Add some strings to the "_never_allowed_on_events_afterwards"-array. @@ -297,6 +327,40 @@ WARNING: Use this method only if you have a really good reason. -------- +## removeNeverAllowedCallStrings(string[] $strings): $this + +Remove some strings from the "_never_allowed_call_strings"-array. + +

+
+WARNING: Use this method only if you have a really good reason. +

+ +**Parameters:** +- `string[] $strings` + +**Return:** +- `$this` + +-------- + +## removeNeverAllowedJsCallbackRegex(string[] $strings): $this + +Remove some strings from the "_never_allowed_js_callback_regex"-array. + +

+
+WARNING: Use this method only if you have a really good reason. +

+ +**Parameters:** +- `string[] $strings` + +**Return:** +- `$this` + +-------- + ## removeNeverAllowedOnEventsAfterwards(string[] $strings): $this Remove some strings from the "_never_allowed_on_events_afterwards"-array. diff --git a/application/vendor/voku/anti-xss/build/composer.json b/application/vendor/voku/anti-xss/build/composer.json deleted file mode 100644 index 30f30c3..0000000 --- a/application/vendor/voku/anti-xss/build/composer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "require-dev": { - "voku/php-readme-helper": "~0.6" - } -} diff --git a/application/vendor/voku/anti-xss/build/docs/base.md b/application/vendor/voku/anti-xss/build/docs/base.md deleted file mode 100644 index 8485b00..0000000 --- a/application/vendor/voku/anti-xss/build/docs/base.md +++ /dev/null @@ -1,167 +0,0 @@ -[![Build Status](https://github.com/voku/anti-xss/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/voku/anti-xss/actions) -[![codecov.io](http://codecov.io/github/voku/anti-xss/coverage.svg?branch=master)](http://codecov.io/github/voku/anti-xss?branch=master) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/8e3c9da417124971b8d8e0c1046c24c7)](https://www.codacy.com/app/voku/anti-xss) -[![Latest Stable Version](https://poser.pugx.org/voku/anti-xss/v/stable)](https://packagist.org/packages/voku/anti-xss) -[![Total Downloads](https://poser.pugx.org/voku/anti-xss/downloads)](https://packagist.org/packages/voku/anti-xss) -[![License](https://poser.pugx.org/voku/anti-xss/license)](https://packagist.org/packages/voku/anti-xss) -[![Donate to this project using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.me/moelleken) -[![Donate to this project using Patreon](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://www.patreon.com/voku) - -# :secret: AntiXSS - -"Cross-site scripting (XSS) is a type of computer security vulnerability typically found in Web applications. XSS enables -attackers to inject client-side script into Web pages viewed by other users. A cross-site scripting vulnerability may be -used by attackers to bypass access controls such as the same origin policy. Cross-site scripting carried out on websites -accounted for roughly 84% of all security vulnerabilities documented by Symantec as of 2007." - http://en.wikipedia.org/wiki/Cross-site_scripting - -### DEMO: -[http://anti-xss-demo.suckup.de/](http://anti-xss-demo.suckup.de/) - -### NOTES: -1) Use [filter_input()](http://php.net/manual/de/function.filter-input.php) - don't use GLOBAL-Array (e.g. $_SESSION, $_GET, $_POST, $_SERVER) directly - -2) Use [html-sanitizer](https://github.com/tgalopin/html-sanitizer) or [HTML Purifier](http://htmlpurifier.org/) if you need a more configurable solution - -3) Add "Content Security Policy's" -> [Introduction to Content Security Policy](http://www.html5rocks.com/en/tutorials/security/content-security-policy/) - -4) DO NOT WRITE YOUR OWN REGEX TO PARSE HTML! - -5) READ THIS TEXT -> [XSS (Cross Site Scripting) Prevention Cheat Sheet](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md) - -6) TEST THIS TOOL -> [Zed Attack Proxy (ZAP)](https://github.com/zaproxy/zaproxy) - -### Install via "composer require" -```shell -composer require voku/anti-xss -``` - -### Usage: - -```php - -use voku\helper\AntiXSS; - -require_once __DIR__ . '/vendor/autoload.php'; // example path - -$antiXss = new AntiXSS(); -``` - -Example 1: (HTML Character) - -```php -$harm_string = "Hello, i try to your site"; -$harmless_string = $antiXss->xss_clean($harm_string); - -// Hello, i try to alert('Hack'); your site -``` - -Example 2: (Hexadecimal HTML Character) - -```php -$harm_string = ""; -$harmless_string = $antiXss->xss_clean($harm_string); - -// -``` - -Example 3: (Unicode Hex Character) - -```php -$harm_string = "CLICK"; -$harmless_string = $antiXss->xss_clean($harm_string); - -// CLICK -``` - -Example 4: (Unicode Character) - -```php -$harm_string = "CLICK"; -$harmless_string = $antiXss->xss_clean($harm_string); - -// CLICK -``` - -Example 5.1: (non Inline CSS) - -```php -$harm_string = '
  • '; -$harmless_string = $antiXss->xss_clean($harm_string); - -//
  • -``` - -Example 5.2: (with Inline CSS) - -```php -$harm_string = '
  • '; -$antiXss->removeEvilAttributes(array('style')); // allow style-attributes -$harmless_string = $antiXss->xss_clean($harm_string); - -//
  • -``` - -Example 6: (check if an string contains a XSS attack) - -```php -$harm_string = "\x3cscript src=http://www.example.com/malicious-code.js\x3e\x3c/script\x3e"; -$harmless_string = $antiXss->xss_clean($harm_string); - -// - -$antiXss->isXssFound(); - -// true -``` - -Example 7: (allow e.g. iframes) - -```php -$harm_string = ""; - -$antiXss->removeEvilHtmlTags(array('iframe')); - -$harmless_string = $antiXss->xss_clean($harm_string); - -// -``` - - -### Unit Test: - -1) [Composer](https://getcomposer.org) is a prerequisite for running the tests. - -``` -composer install -``` - -2) The tests can be executed by running this command from the root directory: - -```bash -./vendor/bin/phpunit -``` - -## AntiXss methods - -%__functions_index__voku\helper\AntiXSS__% - -%__functions_list__voku\helper\AntiXSS__% - -### Support - -For support and donations please visit [Github](https://github.com/voku/anti-xss/) | [Issues](https://github.com/voku/anti-xss/issues) | [PayPal](https://paypal.me/moelleken) | [Patreon](https://www.patreon.com/voku). - -For status updates and release announcements please visit [Releases](https://github.com/voku/anti-xss/releases) | [Twitter](https://twitter.com/suckup_de) | [Patreon](https://www.patreon.com/voku/posts). - -For professional support please contact [me](https://about.me/voku). - -### Thanks - -- Thanks to [GitHub](https://github.com) (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc. -- Thanks to [IntelliJ](https://www.jetbrains.com) as they make the best IDEs for PHP and they gave me an open source license for PhpStorm! -- Thanks to [Travis CI](https://travis-ci.com/) for being the most awesome, easiest continous integration tool out there! -- Thanks to [StyleCI](https://styleci.io/) for the simple but powerfull code style check. -- Thanks to [PHPStan](https://github.com/phpstan/phpstan) && [Psalm](https://github.com/vimeo/psalm) for relly great Static analysis tools and for discover bugs in the code! - -### License -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fvoku%2Fanti-xss.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fvoku%2Fanti-xss?ref=badge_large) diff --git a/application/vendor/voku/anti-xss/build/generate_docs.php b/application/vendor/voku/anti-xss/build/generate_docs.php deleted file mode 100644 index 2bb3f7f..0000000 --- a/application/vendor/voku/anti-xss/build/generate_docs.php +++ /dev/null @@ -1,11 +0,0 @@ -generate( - __DIR__ . '/../src/voku/helper/AntiXSS.php', - __DIR__ . '/docs/base.md' -); - -file_put_contents(__DIR__ . '/../README.md', $readmeText); diff --git a/application/vendor/voku/anti-xss/composer.json b/application/vendor/voku/anti-xss/composer.json index ab6ac63..98608d1 100644 --- a/application/vendor/voku/anti-xss/composer.json +++ b/application/vendor/voku/anti-xss/composer.json @@ -23,7 +23,7 @@ ], "require": { "php": ">=7.0.0", - "voku/portable-utf8": "~5.4.51" + "voku/portable-utf8": "~6.0.2" }, "require-dev": { "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" diff --git a/application/vendor/voku/anti-xss/src/voku/helper/AntiXSS.php b/application/vendor/voku/anti-xss/src/voku/helper/AntiXSS.php index a076330..d9441a5 100644 --- a/application/vendor/voku/anti-xss/src/voku/helper/AntiXSS.php +++ b/application/vendor/voku/anti-xss/src/voku/helper/AntiXSS.php @@ -13,9 +13,23 @@ use const ENT_SUBSTITUTE; use const HTML_ENTITIES; /** - * AntiXSS + * AntiXSS - ported from "CodeIgniter" * - * ported from "CodeIgniter" + * ## 🇷🇺 Русским гражданам + * В Украине сейчас идет война. Силами РФ наносятся удары по гражданской инфраструктуре в [Харькове][1], [Киеве][2], [Чернигове][3], [Сумах][4], [Ирпене][5] и десятках других городов. Гибнут люди - и гражданское население, и военные, в том числе российские призывники, которых бросили воевать. Чтобы лишить собственный народ доступа к информации, правительство РФ запретило называть войну войной, закрыло независимые СМИ и принимает сейчас ряд диктаторских законов. Эти законы призваны заткнуть рот всем, кто против войны. За обычный призыв к миру сейчас можно получить несколько лет тюрьмы. + * Не молчите! Молчание - знак вашего согласия с политикой российского правительства. + * **Вы можете сделать выбор НЕ МОЛЧАТЬ.** + * --- + * ## 🇺🇸 To people of Russia + * There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilian infrastructure in [Kharkiv][1], [Kyiv][2], [Chernihiv][3], [Sumy][4], [Irpin][5] and dozens of other cities. People are dying – both civilians and military servicemen, including Russian conscripts who were thrown into the fighting. In order to deprive its own people of access to information, the government of the Russian Federation has forbidden calling a war a war, shut down independent media and is passing a number of dictatorial laws. These laws are meant to silence all those who are against war. You can be jailed for multiple years for simply calling for peace. + * Do not be silent! Silence is a sign that you accept the Russian government's policy. + * **You can choose NOT TO BE SILENT.** + * --- + * - [1] https://cloudfront-us-east-2.images.arcpublishing.com/reuters/P7K2MSZDGFMIJPDD7CI2GIROJI.jpg "Kharkiv under attack" + * - [2] https://gdb.voanews.com/01bd0000-0aff-0242-fad0-08d9fc92c5b3_cx0_cy5_cw0_w1023_r1_s.jpg "Kyiv under attack" + * - [3] https://ichef.bbci.co.uk/news/976/cpsprodpb/163DD/production/_123510119_hi074310744.jpg "Chernihiv under attack" + * - [4] https://www.youtube.com/watch?v=8K-bkqKKf2A "Sumy under attack" + * - [5] https://cloudfront-us-east-2.images.arcpublishing.com/reuters/K4MTMLEHTRKGFK3GSKAT4GR3NE.jpg "Irpin under attack" * * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) @@ -38,7 +52,7 @@ final class AntiXSS private $_never_allowed_regex = []; /** - * List of html tags that will not closed automatically. + * List of html tags that will not close automatically. * * @var string[] */ @@ -49,7 +63,22 @@ final class AntiXSS * * @var string[] */ - private static $_never_allowed_call = [ + private $_never_allowed_js_callback_regex = [ + '\(?window\)?\.', + '\(?history\)?\.', + '\(?location\)?\.', + '\(?document\)?\.', + '\(?cookie\)?\.', + '\(?ScriptElement\)?\.', + 'd\s*a\s*t\s*a\s*:', + ]; + + /** + * List of simple never allowed call statements. + * + * @var string[] + */ + private $_never_allowed_call_strings = [ // default javascript 'javascript', // Java: jar-protocol is an XSS hazard @@ -140,6 +169,7 @@ final class AntiXSS 'onDrag', 'onDragDrop', 'onDragEnd', + 'onDragExit', 'onDragEnter', 'onDragLeave', 'onDragOver', @@ -172,6 +202,7 @@ final class AntiXSS 'onLanguageChange', 'onLayoutComplete', 'onLoad', + 'onLoadEnd', 'onLoadedData', 'onLoadedMetaData', 'onLoadStart', @@ -237,6 +268,7 @@ final class AntiXSS 'onPointerMove', 'onPointerOut', 'onPointerOver', + 'onPointerRawUpdate', 'onPointerUp', 'onPopState', 'onProgress', @@ -283,6 +315,8 @@ final class AntiXSS 'onTimer', 'onTrackChange', 'onTransitionEnd', + 'onTransitionRun', + 'onTransitionStart', 'onToggle', 'onTouchCancel', 'onTouchEnd', @@ -292,6 +326,7 @@ final class AntiXSS 'onTransitionCancel', 'onTransitionEnd', 'onUnload', + 'onUnhandledRejection', 'onURLFlip', 'onUserProximity', 'onVolumeChange', @@ -487,7 +522,7 @@ final class AntiXSS ['#', '.'], ['\#', '\.'], $WORDS_CACHE['chunk'][$word] - ) . ')(?[^\p{L}@.!? ]|$)#ius', + ) . ')(?[^\p{L}@.!?\' ]|$)#ius', function ($matches) { return $this->_compact_exploded_words_callback($matches); }, @@ -536,7 +571,7 @@ final class AntiXSS if (\strpos($str, '=') !== false) { $strCopy = $str; $matchesTmp = []; - while (\preg_match("/[?|&]?[\p{L}0-9_\-\[\]]+\s*=\s*([\"'])(?[^\1]*?)\\1/u", $strCopy, $matches)) { + while (\preg_match("/[?|&]?[\p{L}\d_\-\[\]]+\s*=\s*([\"'])(?[^\1]*?)\\1/u", $strCopy, $matches)) { $matchesTmp[] = $matches; $strCopy = \str_replace($matches[0], '', $strCopy); @@ -545,9 +580,7 @@ final class AntiXSS } } - if ($strCopy === $str) { - $needProtection = true; - } else { + if ($strCopy !== $str) { $needProtection = false; foreach ($matchesTmp as $matches) { if (isset($matches['attr'])) { @@ -588,7 +621,7 @@ final class AntiXSS private function _decode_string($str) { // init - $regExForHtmlTags = '/<\p{L}+.*+/us'; + $regExForHtmlTags = '/<\p{L}+(?:[^>"\']|(["\']).*\1)*>/usU'; if ( \strpos($str, '<') !== false @@ -657,35 +690,42 @@ final class AntiXSS // backup the string (for later comparison) $str_backup = $str; + + // process + do { + // backup the string (for the loop) + $str_backup_loop = $str; - // correct words before the browser will do it - $str = $this->_compact_exploded_javascript($str); - - // remove disallowed javascript calls in links, images etc. - $str = $this->_remove_disallowed_javascript($str); - - // remove strings that are never allowed - $str = $this->_do_never_allowed($str); - - // remove evil attributes such as style, onclick and xmlns - $str = $this->_remove_evil_attributes($str); - - // sanitize naughty JavaScript elements - $str = $this->_sanitize_naughty_javascript($str); - - // sanitize naughty HTML elements - $str = $this->_sanitize_naughty_html($str); - - // final clean up - // - // -> This adds a bit of extra precaution in case something got through the above filters. - $str = $this->_do_never_allowed_afterwards($str); + // correct words before the browser will do it + $str = $this->_compact_exploded_javascript($str); + + // remove disallowed javascript calls in links, images etc. + $str = $this->_remove_disallowed_javascript($str); + + // remove strings that are never allowed + $str = $this->_do_never_allowed($str); + + // remove evil attributes such as style, onclick and xmlns + $str = $this->_remove_evil_attributes($str); + + // sanitize naughty JavaScript elements + $str = $this->_sanitize_naughty_javascript($str); + + // sanitize naughty HTML elements + $str = $this->_sanitize_naughty_html($str); + + // final clean up + // + // -> This adds a bit of extra precaution in case something got through the above filters. + $str = $this->_do_never_allowed_afterwards($str); + + } while ($str_backup_loop !== $str); // check for xss if ($this->_xss_found !== true) { $this->_xss_found = !($str_backup === $str); } - + return $str; } @@ -715,7 +755,7 @@ final class AntiXSS // --- $replaceNeverAllowedCall = []; - foreach (self::$_never_allowed_call as $call) { + foreach ($this->_never_allowed_call_strings as $call) { if (\stripos($str, $call) !== false) { $replaceNeverAllowedCall[] = $call; } @@ -802,7 +842,7 @@ final class AntiXSS continue; } - $regex = '(?[^\p{L}]|^)(?:' . \implode('|', $events) . ')(?\(.*?\)|.*?>|(?:\s|\[.*?\])*?=(?:\s|\[.*?\])*?|(?:\s|\[.*?\])*?=(?:\s|\[.*?\])*?|[^\p{L}]*?=[^\p{L}]*?|[^\p{L}]*?=[^\p{L}]*?|$|\s*?>*?$)'; + $regex = '(?[^\p{L}@.!?>]|^)(?:' . \implode('|', $events) . ')(?\(.*?\)|.*?>|(?:\s|\[.*?\])*?=(?:\s|\[.*?\])*?|(?:\s|\[.*?\])*?=(?:\s|\[.*?\])*?|[^\p{L}]*?=[^\p{L}]*?|[^\p{L}]*?=[^\p{L}]*?|$|\s*?>*?$)'; do { $count = $temp_count = 0; @@ -846,7 +886,7 @@ final class AntiXSS if ( \strpos($str, '&') !== false && - \preg_match_all('/(?&[A-Za-z]{2,}[;]{0})/', $str, $matches) + \preg_match_all('/(?&[A-Za-z]{2,};{0})/', $str, $matches) ) { if ($HTML_ENTITIES_CACHE === null) { @@ -952,7 +992,7 @@ final class AntiXSS if (\strpos($str, '=') !== false) { $matchesTmp = []; - while (\preg_match('#\s*[\p{L}0-9_\-\[\]]+\s*=\s*(["\'])(?:[^\1]*?)\\1#u', $str, $matches)) { + while (\preg_match('#\s*[\p{L}\d_\-\[\]]+\s*=\s*(["\'])(?:[^\1]*?)\\1#u', $str, $matches)) { $matchesTmp[] = $matches[0]; $str = \str_replace($matches[0], '', $str); @@ -1081,7 +1121,6 @@ final class AntiXSS $needProtection = true; $matchInner['link'] = \str_replace(' ', '%20', $matchInner['link']); - /** @noinspection BypassedUrlValidationInspection */ if ( \strpos($matchInner[0], 'script') === false && @@ -1099,7 +1138,6 @@ final class AntiXSS if ($needProtection) { $tmpAntiXss = clone $this; - /** @noinspection UnusedFunctionResultInspection */ $tmpAntiXss->xss_clean((string) $matchInner[0]); if ($tmpAntiXss->isXssFound() === true) { @@ -1118,12 +1156,12 @@ final class AntiXSS if (!$foundSomethingBad) { // filter for javascript $patternTmp = ''; - foreach (self::$_never_allowed_call as $callTmp) { + foreach ($this->_never_allowed_call_strings as $callTmp) { if (\stripos($match[0], $callTmp) !== false) { $patternTmp .= $callTmp . ':|'; } } - $pattern = '#' . $search . '=.*(?:' . $patternTmp . '\(?window\)?\.|\(?history\)?\.|\(?location\)?\.|\(?document\)?\.|\(?cookie\)?\.|\(?ScriptElement\)?\.|d\s*a\s*t\s*a\s*:)#ius'; + $pattern = '#' . $search . '=.*(?:' . $patternTmp . \implode('|', $this->_never_allowed_js_callback_regex) . ')#ius'; $matchInner = []; if (\preg_match($pattern, $match[1], $matchInner)) { $replacer = (string) \preg_replace( @@ -1134,7 +1172,26 @@ final class AntiXSS } } } - + + if ( + \substr($match[0], -3) === ' />' + && + \substr($match[1], -2) === ' /' + && + \substr($replacer, -2) !== ' /' + ) { + $replacer .= ' /'; + } elseif ( + \substr($match[0], -2) === '/>' + && + \substr($match[1], -1) === '/' + && + \substr($replacer, -1) !== '/' + ) { + $replacer .= '/'; + } + + return \str_ireplace($match[1], $replacer, (string) $match[0]); } @@ -1426,7 +1483,7 @@ final class AntiXSS } return (string) \preg_replace_callback( - '#\+([\p{L}0-9]+)-#iu', + '#\+([\p{L}\d]+)-#iu', function ($matches) { return $this->_repack_utf7_callback($matches); }, @@ -1576,8 +1633,8 @@ final class AntiXSS private function _close_html_callback($matches) { if (empty($matches['closeTag'])) { - // allow e.g. "< $2.20" - if (\preg_match('/^[ .,\d=%€$₢₣£₤₶ℳ₥₦₧₨රුரூ௹रू₹૱₩₪₸₫֏₭₺₼₮₯₰₷₱﷼₲₾₳₴₽₵₡¢¥円৳元៛₠¤฿؋]*$/u', $matches[1])) { + // allow e.g. "< $2.20" and e.g. "< 1 year" + if (\preg_match('/^[ .,\d=%€$₢₣£₤₶ℳ₥₦₧₨රුரூ௹रू₹૱₩₪₸₫֏₭₺₼₮₯₰₷₱﷼₲₾₳₴₽₵₡¢¥円৳元៛₠¤฿؋]*$|^[ .,\d=%€$₢₣£₤₶ℳ₥₦₧₨රුரூ௹रू₹૱₩₪₸₫֏₭₺₼₮₯₰₷₱﷼₲₾₳₴₽₵₡¢¥円৳元៛₠¤฿؋]+\p{L}*\s*$/u', $matches[1])) { return '<' . \str_replace(['>', '<'], ['>', '<'], $matches[1]); } @@ -1624,7 +1681,7 @@ final class AntiXSS \stripos($fullMatch, '<' . $matches['tagName'] . '<') !== 0 ) || - \preg_match('/<[\/]?' . $matches['tagName'] . '\p{L}+>/ius', $fullMatch) === 1 + \preg_match('/<\/?' . $matches['tagName'] . '\p{L}+>/ius', $fullMatch) === 1 ) { return $fullMatch; } @@ -1701,7 +1758,7 @@ final class AntiXSS if ($found === true) { $str = (string) \preg_replace( - '#(' . \implode('|', $patterns) . ')(\s*)\((.*)\)#uisU', + '#(?_never_allowed_js_callback_regex = \array_merge( + $strings, + $this->_never_allowed_js_callback_regex + ); + + return $this; + } + + /** + * Add some strings to the "_never_allowed_call_strings"-array. + * + * @param string[] $strings + * + * @return $this + */ + public function addNeverAllowedCallStrings(array $strings): self + { + if ($strings === []) { + return $this; + } + + $this->_never_allowed_call_strings = \array_merge( + $strings, + $this->_never_allowed_call_strings + ); + + return $this; + } + /** * Remove some strings from the "_do_not_close_html_tags"-array. * @@ -2028,6 +2127,58 @@ final class AntiXSS return $this; } + /** + * Remove some strings from the "_never_allowed_call_strings"-array. + * + *

    + *
    + * WARNING: Use this method only if you have a really good reason. + *

    + * + * @param string[] $strings + * + * @return $this + */ + public function removeNeverAllowedCallStrings(array $strings): self + { + if ($strings === []) { + return $this; + } + + $this->_never_allowed_call_strings = \array_diff( + $this->_never_allowed_call_strings, + \array_intersect($strings, $this->_never_allowed_call_strings) + ); + + return $this; + } + + /** + * Remove some strings from the "_never_allowed_js_callback_regex"-array. + * + *

    + *
    + * WARNING: Use this method only if you have a really good reason. + *

    + * + * @param string[] $strings + * + * @return $this + */ + public function removeNeverAllowedJsCallbackRegex(array $strings): self + { + if ($strings === []) { + return $this; + } + + $this->_never_allowed_js_callback_regex = \array_diff( + $this->_never_allowed_js_callback_regex, + \array_intersect($strings, $this->_never_allowed_js_callback_regex) + ); + + return $this; + } + /** * Set the replacement-string for not allowed strings. * @@ -2095,7 +2246,7 @@ final class AntiXSS * * @return string|string[] * - * @template TXssCleanInput + * @template TXssCleanInput as string|string[] * @phpstan-param TXssCleanInput $str * @phpstan-return TXssCleanInput */ @@ -2107,6 +2258,7 @@ final class AntiXSS // check for an array of strings if (\is_array($str)) { foreach ($str as &$value) { + /* @phpstan-ignore-next-line | _xss_found is maybe changed via "xss_clean" */ if ($this->_xss_found === true) { $alreadyFoundXss = true; } else { @@ -2114,7 +2266,8 @@ final class AntiXSS } $value = $this->xss_clean($value); - + + /* @phpstan-ignore-next-line | _xss_found is maybe changed via "xss_clean" */ if ($alreadyFoundXss === true) { $this->_xss_found = true; } diff --git a/application/vendor/voku/portable-ascii/CHANGELOG.md b/application/vendor/voku/portable-ascii/CHANGELOG.md index 6e5357d..12fc393 100644 --- a/application/vendor/voku/portable-ascii/CHANGELOG.md +++ b/application/vendor/voku/portable-ascii/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +### 2.0.1 (2022-03-08) + +- "To people of Russia": There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilians. +- optimize some phpdocs + +### 2.0.0 (2022-01-24) + +- prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" +- fix "Ukrainian" char-mapping (thanks to @Andr1yk0) +- fix "Persian" char-mapping (thanks to @frost-cyber) + +### 1.6.1 (2022-01-24) + +- revert: prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" +- revert: fix "Ukrainian" char-mapping (thanks to @Andr1yk0) +- revert: fix "Persian" char-mapping (thanks to @frost-cyber) + +### 1.6.0 (2022-01-24) + +- prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" +- fix "Ukrainian" char-mapping (thanks to @Andr1yk0) +- fix "Persian" char-mapping (thanks to @frost-cyber) +- fix "ASCII::normalize_whitespace()" -> "CARRIAGE RETURN" is more like "
    " and no "\n" +- add "ASCII::to_ascii_remap()" -> this method will return broken characters and is only for special cases + ### 1.5.6 (2020-11-12) - "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed v2 diff --git a/application/vendor/voku/portable-ascii/README.md b/application/vendor/voku/portable-ascii/README.md index 9dd7cec..3ce36d6 100644 --- a/application/vendor/voku/portable-ascii/README.md +++ b/application/vendor/voku/portable-ascii/README.md @@ -1,7 +1,9 @@ [//]: # (AUTO-GENERATED BY "PHP README Helper": base file -> docs/base.md) -[![Build Status](https://travis-ci.com/voku/portable-ascii.svg?branch=master)](https://travis-ci.com/voku/portable-ascii) +[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) + +[![Build Status](https://github.com/voku/portable-ascii/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/voku/portable-ascii/actions) [![Build status](https://ci.appveyor.com/api/projects/status/gnejjnk7qplr7f5t/branch/master?svg=true)](https://ci.appveyor.com/project/voku/portable-ascii/branch/master) -[![Coverage Status](https://coveralls.io/repos/voku/portable-ascii/badge.svg?branch=master&service=github)](https://coveralls.io/github/voku/portable-ascii?branch=master) +[![codecov.io](https://codecov.io/github/voku/portable-ascii/coverage.svg?branch=master)](https://codecov.io/github/voku/portable-ascii?branch=master) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/997c9bb10d1c4791967bdf2e42013e8e)](https://www.codacy.com/app/voku/portable-ascii) [![Latest Stable Version](https://poser.pugx.org/voku/portable-ascii/v/stable)](https://packagist.org/packages/voku/portable-ascii) [![Total Downloads](https://poser.pugx.org/voku/portable-ascii/downloads)](https://packagist.org/packages/voku/portable-ascii) @@ -96,11 +98,12 @@ The API from the "ASCII"-Class is written as small static methods.
  • getAllLanguages is_ascii normalize_msword -
    normalize_whitespace -remove_invisible_characters +
    normalize_whitespace +remove_invisible_characters to_ascii -to_filename -
    to_slugify +to_ascii_remap +
    to_filename +to_slugify to_transliterate
    @@ -152,7 +155,7 @@ echo $array['orig'][$tmpKey]; // 'ё' **Parameters:** -- `string $language [optional]

    Language of the source string e.g.: en, de_at, or de-ch. +- `ASCII::* $language [optional]

    Language of the source string e.g.: en, de_at, or de-ch. (default is 'en') | ASCII::*_LANGUAGE_CODE

    ` - `bool $replace_extra_symbols [optional]

    Add some more replacements e.g. "£" with " pound ".

    ` - `bool $asOrigReplaceArray [optional]

    TRUE === return {orig: string[], replace: string[]} @@ -254,7 +257,7 @@ ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' -------- -#### normalize_whitespace(string $str, bool $keepNonBreakingSpace, bool $keepBidiUnicodeControls, bool $replaceSeparatorsWithNewline): string +#### normalize_whitespace(string $str, bool $keepNonBreakingSpace, bool $keepBidiUnicodeControls, bool $normalize_control_characters): string Normalize the whitespace. @@ -267,14 +270,14 @@ ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", tru - `bool $keepNonBreakingSpace [optional]

    Set to true, to keep non-breaking-spaces.

    ` - `bool $keepBidiUnicodeControls [optional]

    Set to true, to keep non-printable (for the web) bidirectional text chars.

    ` -- `bool $replaceSeparatorsWithNewline [optional]

    Set to true, to convert LINE and PARAGRAPH SEPARATOR with "\n".

    ` +- `bool $normalize_control_characters [optional]

    Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

    ` **Return:** - `string

    A string with normalized whitespace.

    ` -------- -#### remove_invisible_characters(string $str, bool $url_encoded, string $replacement, bool $keep_control_characters): string +#### remove_invisible_characters(string $str, bool $url_encoded, string $replacement, bool $keep_basic_control_characters): string Remove invisible characters from a string. @@ -286,7 +289,7 @@ copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/C - `string $str` - `bool $url_encoded` - `string $replacement` -- `bool $keep_control_characters` +- `bool $keep_basic_control_characters` **Return:** - `string` @@ -308,7 +311,7 @@ ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf **Parameters:** - `string $str

    The input string.

    ` -- `string $language [optional]

    Language of the source string. +- `ASCII::* $language [optional]

    Language of the source string. (default is 'en') | ASCII::*_LANGUAGE_CODE

    ` - `bool $remove_unsupported_chars [optional]

    Whether or not to remove the unsupported characters.

    ` @@ -325,6 +328,26 @@ language

    ` -------- +#### to_ascii_remap(string $str1, string $str2): string[] + +WARNING: This method will return broken characters and is only for special cases. + +Convert two UTF-8 encoded string to a single-byte strings suitable for +functions that need the same string length after the conversion. + +The function simply uses (and updates) a tailored dynamic encoding +(in/out map parameter) where non-ascii characters are remapped to +the range [128-255] in order of appearance. + +**Parameters:** +- `string $str1` +- `string $str2` + +**Return:** +- `string[]` + +-------- + #### to_filename(string $str, bool $use_transliterate, string $fallback_char): string Convert given string to safe filename (and keep string case). @@ -356,7 +379,7 @@ also be supplied for language-specific transliteration. **Parameters:** - `string $str` - `string $separator [optional]

    The string used to replace whitespace.

    ` -- `string $language [optional]

    Language of the source string. +- `ASCII::* $language [optional]

    Language of the source string. (default is 'en') | ASCII::*_LANGUAGE_CODE

    ` - `array $replacements [optional]

    A map of replaceable strings.

    ` - `bool $replace_extra_symbols [optional]

    Add some more replacements e.g. "£" with " diff --git a/application/vendor/voku/portable-ascii/build/composer.json b/application/vendor/voku/portable-ascii/build/composer.json deleted file mode 100644 index 30f30c3..0000000 --- a/application/vendor/voku/portable-ascii/build/composer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "require-dev": { - "voku/php-readme-helper": "~0.6" - } -} diff --git a/application/vendor/voku/portable-ascii/build/docs/base.md b/application/vendor/voku/portable-ascii/build/docs/base.md deleted file mode 100644 index e21e731..0000000 --- a/application/vendor/voku/portable-ascii/build/docs/base.md +++ /dev/null @@ -1,127 +0,0 @@ -[![Build Status](https://travis-ci.com/voku/portable-ascii.svg?branch=master)](https://travis-ci.com/voku/portable-ascii) -[![Build status](https://ci.appveyor.com/api/projects/status/gnejjnk7qplr7f5t/branch/master?svg=true)](https://ci.appveyor.com/project/voku/portable-ascii/branch/master) -[![Coverage Status](https://coveralls.io/repos/voku/portable-ascii/badge.svg?branch=master&service=github)](https://coveralls.io/github/voku/portable-ascii?branch=master) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/997c9bb10d1c4791967bdf2e42013e8e)](https://www.codacy.com/app/voku/portable-ascii) -[![Latest Stable Version](https://poser.pugx.org/voku/portable-ascii/v/stable)](https://packagist.org/packages/voku/portable-ascii) -[![Total Downloads](https://poser.pugx.org/voku/portable-ascii/downloads)](https://packagist.org/packages/voku/portable-ascii) -[![License](https://poser.pugx.org/voku/portable-ascii/license)](https://packagist.org/packages/voku/portable-ascii) -[![Donate to this project using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.me/moelleken) -[![Donate to this project using Patreon](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://www.patreon.com/voku) - -# 🔡 Portable ASCII - -## Description - -It is written in PHP (PHP 7+) and can work without "mbstring", "iconv" or any other extra encoding php-extension on your server. - -The benefit of Portable ASCII is that it is easy to use, easy to bundle. - -The project based on ... -+ Sean M. Burke's work (https://metacpan.org/pod/Text::Unidecode) -+ Tomaz Solc's work (https://pypi.org/project/Unidecode/) -+ Portable UTF-8 work (https://github.com/voku/portable-utf8) -+ Daniel St. Jules's work (https://github.com/danielstjules/Stringy) -+ Johnny Broadway's work (https://github.com/jbroadway/urlify) -+ and many cherry-picks from "github"-gists and "Stack Overflow"-snippets ... - -## Index - -* [Alternative](#alternative) -* [Install](#install-portable-ascii-via-composer-require) -* [Why Portable ASCII?](#why-portable-ascii) -* [Requirements and Recommendations](#requirements-and-recommendations) -* [Usage](#usage) -* [Class methods](#class-methods) -* [Unit Test](#unit-test) -* [License and Copyright](#license-and-copyright) - -## Alternative - -If you like a more Object Oriented Way to edit strings, then you can take a look at [voku/Stringy](https://github.com/voku/Stringy), it's a fork of "danielstjules/Stringy" but it used the "Portable ASCII"-Class and some extra methods. - -```php -// Portable ASCII -use voku\helper\ASCII; -ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' - -// voku/Stringy -use Stringy\Stringy as S; -$stringy = S::create('déjà σσς iıii'); -$stringy->toTransliterate(); // 'deja sss iiii' -``` - -## Install "Portable ASCII" via "composer require" -```shell -composer require voku/portable-ascii -``` - -## Why Portable ASCII?[]() -I need ASCII char handling in different classes and before I added this functions into "Portable UTF-8", -but this repo is more modular and portable, because it has no dependencies. - -## Requirements and Recommendations - -* No extensions are required to run this library. Portable ASCII only needs PCRE library that is available by default since PHP 4.2.0 and cannot be disabled since PHP 5.3.0. "\u" modifier support in PCRE for ASCII handling is not a must. -* PHP 7.0 is the minimum requirement -* PHP 8.0 is also supported - -## Usage - -Example: ASCII::to_ascii() -```php - echo ASCII::to_ascii('�Düsseldorf�', 'de'); - - // will output - // Duesseldorf - - echo ASCII::to_ascii('�Düsseldorf�', 'en'); - - // will output - // Dusseldorf -``` - -# Portable ASCII | API - -The API from the "ASCII"-Class is written as small static methods. - - -## Class methods - -%__functions_index__voku\helper\ASCII__% - -%__functions_list__voku\helper\ASCII__% - - -## Unit Test - -1) [Composer](https://getcomposer.org) is a prerequisite for running the tests. - -``` -composer install -``` - -2) The tests can be executed by running this command from the root directory: - -```bash -./vendor/bin/phpunit -``` - -### Support - -For support and donations please visit [Github](https://github.com/voku/portable-ascii/) | [Issues](https://github.com/voku/portable-ascii/issues) | [PayPal](https://paypal.me/moelleken) | [Patreon](https://www.patreon.com/voku). - -For status updates and release announcements please visit [Releases](https://github.com/voku/portable-ascii/releases) | [Twitter](https://twitter.com/suckup_de) | [Patreon](https://www.patreon.com/voku/posts). - -For professional support please contact [me](https://about.me/voku). - -### Thanks - -- Thanks to [GitHub](https://github.com) (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc. -- Thanks to [IntelliJ](https://www.jetbrains.com) as they make the best IDEs for PHP and they gave me an open source license for PhpStorm! -- Thanks to [Travis CI](https://travis-ci.com/) for being the most awesome, easiest continous integration tool out there! -- Thanks to [StyleCI](https://styleci.io/) for the simple but powerful code style check. -- Thanks to [PHPStan](https://github.com/phpstan/phpstan) && [Psalm](https://github.com/vimeo/psalm) for really great Static analysis tools and for discover bugs in the code! - -### License and Copyright - -Released under the MIT License - see `LICENSE.txt` for details. diff --git a/application/vendor/voku/portable-ascii/build/generate_docs.php b/application/vendor/voku/portable-ascii/build/generate_docs.php deleted file mode 100644 index c86f1f1..0000000 --- a/application/vendor/voku/portable-ascii/build/generate_docs.php +++ /dev/null @@ -1,26 +0,0 @@ -templateMethod = <<↑ -%description% - -**Parameters:** -%params% - -**Return:** -%return% - --------- - -RAW; -$readmeText = ($readmeGenerator)->generate( - __DIR__ . '/../src/voku/helper/ASCII.php', - __DIR__ . '/docs/base.md' -); - -file_put_contents(__DIR__ . '/../README.md', $readmeText); diff --git a/application/vendor/voku/portable-ascii/build/generate_max_key_length.php b/application/vendor/voku/portable-ascii/build/generate_max_key_length.php deleted file mode 100644 index 743d389..0000000 --- a/application/vendor/voku/portable-ascii/build/generate_max_key_length.php +++ /dev/null @@ -1,20 +0,0 @@ - + * @phpstan-return array */ public static function getAllLanguages(): array { @@ -238,7 +254,7 @@ final class ASCII * * @return array * - * @psalm-return array> + * @phpstan-return array> */ public static function charsArray(bool $replace_extra_symbols = false): array { @@ -268,13 +284,11 @@ final class ASCII * @return array *

    An array of replacements.

    * - * @psalm-return array> + * @phpstan-return array> */ public static function charsArrayWithMultiLanguageValues(bool $replace_extra_symbols = false): array { - /** - * @var array - */ + /** @var array>> */ static $CHARS_ARRAY = []; $cacheKey = '' . $replace_extra_symbols; @@ -300,10 +314,7 @@ final class ASCII $CHARS_ARRAY[$cacheKey] = $return; - /** @noinspection PhpSillyAssignmentInspection - hack for phpstan */ - /** @var array> $return */ - $return = $return; - + /** @var array> $return - hack for phpstan */ return $return; } @@ -332,7 +343,8 @@ final class ASCII * @return array *

    An array of replacements.

    * - * @psalm-return array{orig: string[], replace: string[]}|array + * @phpstan-param ASCII::*_LANGUAGE_CODE $language + * @phpstan-return array{orig: string[], replace: string[]}|array */ public static function charsArrayWithOneLanguage( string $language = self::ENGLISH_LANGUAGE_CODE, @@ -342,9 +354,7 @@ final class ASCII $language = self::get_language($language); // init - /** - * @var array - */ + /** @var array|array{orig: string[], replace: string[]}>> */ static $CHARS_ARRAY = []; $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; @@ -428,16 +438,14 @@ final class ASCII * @return array *

    An array of replacements.

    * - * @psalm-return array{orig: string[], replace: string[]}|array + * @phpstan-return array{orig: string[], replace: string[]}|array */ public static function charsArrayWithSingleLanguageValues( bool $replace_extra_symbols = false, bool $asOrigReplaceArray = true ): array { // init - /** - * @var array - */ + /** @var array|array{orig: string[], replace: string[]}> */ static $CHARS_ARRAY = []; $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; @@ -463,6 +471,7 @@ final class ASCII } } + /** @phpstan-ignore-next-line - ... error? */ $CHARS_ARRAY[$cacheKey] = \array_merge([], ...$CHARS_ARRAY[$cacheKey]); if ($asOrigReplaceArray) { @@ -581,19 +590,13 @@ final class ASCII return ''; } - /** - * @var array{orig: string[], replace: string[]} - */ + /** @var array{orig: string[], replace: string[]} */ static $MSWORD_CACHE = ['orig' => [], 'replace' => []]; if (empty($MSWORD_CACHE['orig'])) { self::prepareAsciiMaps(); - /** - * @psalm-suppress PossiblyNullArrayAccess - we use the prepare* methods here, so we don't get NULL here - * - * @var array - */ + /** @var array */ $map = self::$ASCII_MAPS[self::EXTRA_MSWORD_CHARS_LANGUAGE_CODE] ?? []; $MSWORD_CACHE = [ @@ -616,7 +619,7 @@ final class ASCII * @param bool $keepNonBreakingSpace [optional]

    Set to true, to keep non-breaking-spaces.

    * @param bool $keepBidiUnicodeControls [optional]

    Set to true, to keep non-printable (for the web) * bidirectional text chars.

    - * @param bool $normalize_control_characters [optional]

    Set to true, to convert LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

    + * @param bool $normalize_control_characters [optional]

    Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

    * * @psalm-pure * @@ -633,9 +636,7 @@ final class ASCII return ''; } - /** - * @var array> - */ + /** @var array> */ static $WHITESPACE_CACHE = []; $cacheKey = (int) $keepNonBreakingSpace; @@ -645,16 +646,14 @@ final class ASCII "\x0d\x0c", // 'END OF LINE' "\xe2\x80\xa8", // 'LINE SEPARATOR' "\xe2\x80\xa9", // 'PARAGRAPH SEPARATOR' - "\x0c", // 'FORM FEED' - "\x0d", // 'CARRIAGE RETURN' - "\x0b", // 'VERTICAL TAB' + "\x0c", // 'FORM FEED' // "\f" + "\x0b", // 'VERTICAL TAB' // "\v" ], [ "\n", "\n", "\n", "\n", - "\n", "\t", ], $str @@ -670,13 +669,11 @@ final class ASCII unset($WHITESPACE_CACHE[$cacheKey]["\xc2\xa0"]); } - $WHITESPACE_CACHE[$cacheKey] = \array_keys($WHITESPACE_CACHE[$cacheKey]); + $WHITESPACE_CACHE[$cacheKey] = array_keys($WHITESPACE_CACHE[$cacheKey]); } if (!$keepBidiUnicodeControls) { - /** - * @var array|null - */ + /** @var array|null */ static $BIDI_UNICODE_CONTROLS_CACHE = null; if ($BIDI_UNICODE_CONTROLS_CACHE === null) { @@ -737,6 +734,32 @@ final class ASCII return $str; } + /** + * WARNING: This method will return broken characters and is only for special cases. + * + * Convert two UTF-8 encoded string to a single-byte strings suitable for + * functions that need the same string length after the conversion. + * + * The function simply uses (and updates) a tailored dynamic encoding + * (in/out map parameter) where non-ascii characters are remapped to + * the range [128-255] in order of appearance. + * + * @param string $str1 + * @param string $str2 + * + * @return string[] + * + * @phpstan-return array{0: string, 1: string} + */ + public static function to_ascii_remap(string $str1, string $str2): array + { + $charMap = []; + $str1 = self::to_ascii_remap_intern($str1, $charMap); + $str2 = self::to_ascii_remap_intern($str2, $charMap); + + return [$str1, $str2]; + } + /** * Returns an ASCII version of the string. A set of non-ASCII characters are * replaced with their closest ASCII counterparts, and the rest are removed @@ -766,6 +789,8 @@ final class ASCII * * @return string *

    A string that contains only ASCII characters.

    + * + * @phpstan-param ASCII::*_LANGUAGE_CODE $language */ public static function to_ascii( string $str, @@ -779,13 +804,12 @@ final class ASCII return ''; } + /** @phpstan-var ASCII::*_LANGUAGE_CODE - hack for phpstan */ $language = self::get_language($language); static $EXTRA_SYMBOLS_CACHE = null; - /** - * @var array> - */ + /** @var array> */ static $REPLACE_HELPER_CACHE = []; $cacheKey = $language . '-' . $replace_extra_symbols; @@ -807,7 +831,7 @@ final class ASCII $EXTRA_SYMBOLS_CACHE === null ) { $EXTRA_SYMBOLS_CACHE = []; - foreach (self::$ASCII_EXTRAS ?? [] as $extrasLanguageTmp => $extrasDataTmp) { + foreach (self::$ASCII_EXTRAS ?? [] as $extrasDataTmp) { foreach ($extrasDataTmp as $extrasDataKeyTmp => $extrasDataValueTmp) { $EXTRA_SYMBOLS_CACHE[$extrasDataKeyTmp] = $extrasDataKeyTmp; } @@ -933,7 +957,7 @@ final class ASCII } } - foreach ($matches[0] as $keyTmp => $char) { + foreach ($matches[0] as $char) { if ( !isset($charDone[$char]) && @@ -959,7 +983,6 @@ final class ASCII } if ($use_transliterate) { - /** @noinspection ArgumentEqualsDefaultValueInspection */ $str = self::to_transliterate($str, null, false); } @@ -1001,9 +1024,9 @@ final class ASCII $str = (string) \preg_replace( [ - '/[^' . $fallback_char_escaped . '.\\-a-zA-Z0-9\\s]/', // 1) remove un-needed chars - '/[\\s]+/u', // 2) convert spaces to $fallback_char - '/[' . $fallback_char_escaped . ']+/u', // 3) remove double $fallback_char's + '/[^' . $fallback_char_escaped . '.\\-a-zA-Z\d\\s]/', // 1) remove un-needed chars + '/\s+/u', // 2) convert spaces to $fallback_char + '/[' . $fallback_char_escaped . ']+/u', // 3) remove double $fallback_char's ], [ '', @@ -1038,6 +1061,8 @@ final class ASCII * * @return string *

    A string that has been converted to an URL slug.

    + * + * @phpstan-param ASCII::*_LANGUAGE_CODE $language */ public static function to_slugify( string $str, @@ -1118,19 +1143,13 @@ final class ASCII $unknown = '?', bool $strict = false ): string { - /** - * @var array|null - */ + /** @var array|null */ static $UTF8_TO_TRANSLIT = null; - /** - * null|\Transliterator - */ + /** null|\Transliterator */ static $TRANSLITERATOR = null; - /** - * @var bool|null - */ + /** @var bool|null */ static $SUPPORT_INTL = null; if ($str === '') { @@ -1165,9 +1184,7 @@ final class ASCII ) { if (!isset($TRANSLITERATOR)) { // INFO: see "*-Latin" rules via "transliterator_list_ids()" - /** - * @var \Transliterator - */ + /** @var \Transliterator */ $TRANSLITERATOR = \transliterator_create('NFKC; [:Nonspacing Mark:] Remove; NFKC; Any-Latin; Latin-ASCII;'); } @@ -1316,6 +1333,50 @@ final class ASCII return $str_tmp; } + /** + * WARNING: This method will return broken characters and is only for special cases. + * + * Convert a UTF-8 encoded string to a single-byte string suitable for + * functions that need the same string length after the conversion. + * + * The function simply uses (and updates) a tailored dynamic encoding + * (in/out map parameter) where non-ascii characters are remapped to + * the range [128-255] in order of appearance. + * + * Thus, it supports up to 128 different multibyte code points max over + * the whole set of strings sharing this encoding. + * + * Source: https://github.com/KEINOS/mb_levenshtein + * + * @param string $str

    UTF-8 string to be converted to extended ASCII.

    + * @param array $map

    Internal-Map of code points to ASCII characters.

    + * + * @return string + *

    Mapped borken string.

    + * + * @phpstan-param array $map + */ + private static function to_ascii_remap_intern(string $str, array &$map): string + { + // find all utf-8 characters + $matches = []; + if (!\preg_match_all('/[\xC0-\xF7][\x80-\xBF]+/', $str, $matches)) { + return $str; // plain ascii string + } + + // update the encoding map with the characters not already met + $mapCount = \count($map); + foreach ($matches[0] as $mbc) { + if (!isset($map[$mbc])) { + $map[$mbc] = \chr(128 + $mapCount); + ++$mapCount; + } + } + + // finally, remap non-ascii characters + return \strtr($str, $map); + } + /** * Get the language from a string. * diff --git a/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php b/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php index d51f557..68c3f9d 100644 --- a/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php +++ b/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php @@ -1060,108 +1060,6 @@ return [ 'Я' => 'Ya', 'я' => 'ya', ], - // Russian - Passport (2013), ICAO - // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 - 'ru__passport_2013' => [ - 'А' => 'A', - 'а' => 'a', - 'Б' => 'B', - 'б' => 'b', - 'В' => 'V', - 'в' => 'v', - 'Г' => 'G', - 'г' => 'g', - 'Д' => 'D', - 'д' => 'd', - 'Е' => 'E', - 'е' => 'e', - 'Ё' => 'E', - 'ё' => 'e', - 'Ж' => 'Zh', - 'ж' => 'zh', - 'З' => 'Z', - 'з' => 'z', - 'И' => 'i', - 'и' => 'i', - 'Й' => 'i', - 'й' => 'i', - 'К' => 'K', - 'к' => 'k', - 'Л' => 'L', - 'л' => 'l', - 'М' => 'M', - 'м' => 'm', - 'Н' => 'N', - 'н' => 'n', - 'О' => 'O', - 'о' => 'o', - 'П' => 'P', - 'п' => 'p', - 'Р' => 'R', - 'р' => 'r', - 'С' => 'S', - 'с' => 's', - 'Т' => 'T', - 'т' => 't', - 'У' => 'U', - 'у' => 'u', - 'Ф' => 'F', - 'ф' => 'f', - 'Х' => 'Kh', - 'х' => 'kh', - 'Ц' => 'Ts', - 'ц' => 'ts', - 'Ч' => 'Ch', - 'ч' => 'ch', - 'ш' => 'sh', - 'Ш' => 'Sh', - 'Щ' => 'Shch', - 'щ' => 'shch', - 'Ъ' => 'Ie', - 'ъ' => 'ie', - 'Ы' => 'Y', - 'ы' => 'y', - 'Ь' => '', - 'ь' => '', - 'Э' => 'E', - 'э' => 'e', - 'Ю' => 'Iu', - 'ю' => 'iu', - 'Я' => 'Ia', - 'я' => 'ia', - 'І' => '', - 'і' => '', - 'Ѳ' => '', - 'ѳ' => '', - 'Ѣ' => '', - 'ѣ' => '', - 'Ѵ' => '', - 'ѵ' => '', - 'Є' => '', - 'є' => '', - 'Ѥ' => '', - 'ѥ' => '', - 'Ѕ' => '', - 'ѕ' => '', - 'Ꙋ' => '', - 'ꙋ' => '', - 'Ѡ' => '', - 'ѡ' => '', - 'Ѿ' => '', - 'ѿ' => '', - 'Ѫ' => '', - 'ѫ' => '', - 'Ѧ' => '', - 'ѧ' => '', - 'Ѭ' => '', - 'ѭ' => '', - 'Ѩ' => '', - 'ѩ' => '', - 'Ѯ' => '', - 'ѯ' => '', - 'Ѱ' => '', - 'ѱ' => '', - ], // Russian - GOST 7.79-2000(B) // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 'ru__gost_2000_b' => [ @@ -1264,16 +1162,135 @@ return [ 'Ѱ' => '', 'ѱ' => '', ], + // Russian - Passport (2013), ICAO + // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 + 'ru__passport_2013' => [ + 'А' => 'A', + 'а' => 'a', + 'Б' => 'B', + 'б' => 'b', + 'В' => 'V', + 'в' => 'v', + 'Г' => 'G', + 'г' => 'g', + 'Д' => 'D', + 'д' => 'd', + 'Е' => 'E', + 'е' => 'e', + 'Ё' => 'E', + 'ё' => 'e', + 'Ж' => 'Zh', + 'ж' => 'zh', + 'З' => 'Z', + 'з' => 'z', + 'И' => 'i', + 'и' => 'i', + 'Й' => 'i', + 'й' => 'i', + 'К' => 'K', + 'к' => 'k', + 'Л' => 'L', + 'л' => 'l', + 'М' => 'M', + 'м' => 'm', + 'Н' => 'N', + 'н' => 'n', + 'О' => 'O', + 'о' => 'o', + 'П' => 'P', + 'п' => 'p', + 'Р' => 'R', + 'р' => 'r', + 'С' => 'S', + 'с' => 's', + 'Т' => 'T', + 'т' => 't', + 'У' => 'U', + 'у' => 'u', + 'Ф' => 'F', + 'ф' => 'f', + 'Х' => 'Kh', + 'х' => 'kh', + 'Ц' => 'Ts', + 'ц' => 'ts', + 'Ч' => 'Ch', + 'ч' => 'ch', + 'ш' => 'sh', + 'Ш' => 'Sh', + 'Щ' => 'Shch', + 'щ' => 'shch', + 'Ъ' => 'Ie', + 'ъ' => 'ie', + 'Ы' => 'Y', + 'ы' => 'y', + 'Ь' => '', + 'ь' => '', + 'Э' => 'E', + 'э' => 'e', + 'Ю' => 'Iu', + 'ю' => 'iu', + 'Я' => 'Ia', + 'я' => 'ia', + 'І' => '', + 'і' => '', + 'Ѳ' => '', + 'ѳ' => '', + 'Ѣ' => '', + 'ѣ' => '', + 'Ѵ' => '', + 'ѵ' => '', + 'Є' => '', + 'є' => '', + 'Ѥ' => '', + 'ѥ' => '', + 'Ѕ' => '', + 'ѕ' => '', + 'Ꙋ' => '', + 'ꙋ' => '', + 'Ѡ' => '', + 'ѡ' => '', + 'Ѿ' => '', + 'ѿ' => '', + 'Ѫ' => '', + 'ѫ' => '', + 'Ѧ' => '', + 'ѧ' => '', + 'Ѭ' => '', + 'ѭ' => '', + 'Ѩ' => '', + 'ѩ' => '', + 'Ѯ' => '', + 'ѯ' => '', + 'Ѱ' => '', + 'ѱ' => '', + ], // Ukrainian + // -> https://zakon.rada.gov.ua/laws/show/55-2010-%D0%BF?lang=en 'uk' => [ + 'Г' => 'H', + 'г' => 'h', + 'Ґ' => 'G', + 'ґ' => 'g', 'Є' => 'Ye', 'є' => 'ye', + 'И' => 'Y', + 'и' => 'y', 'І' => 'I', 'і' => 'i', 'Ї' => 'Yi', 'ї' => 'yi', - 'Ґ' => 'G', - 'ґ' => 'g', + 'Й' => 'Y', + 'й' => 'y', + 'Х' => 'Kh', + 'х' => 'kh', + 'Ц' => 'Ts', + 'ц' => 'ts', + 'Ч' => 'Ch', + 'ч' => 'ch', + 'Ш' => 'Sh', + 'ш' => 'sh', + 'Щ' => 'Shch', + 'щ' => 'shch', ], // Kazakh 'kk' => [ @@ -1602,10 +1619,10 @@ return [ 'fa' => [ 'ا' => 'a', 'ب' => 'b', - 'پ' => 'b', + 'پ' => 'p', 'ت' => 't', 'ث' => 's', - 'ج' => 'g', + 'ج' => 'j', 'چ' => 'ch', 'ح' => 'h', 'خ' => 'kh', @@ -2555,6 +2572,8 @@ return [ 'j̄' => 'j', 'J̃' => 'J', 'j̃' => 'j', + 'Й' => 'i', + 'й' => 'i', 'ĸ' => 'k', 'Ĺ' => 'L', 'Ľ' => 'L', @@ -2810,6 +2829,8 @@ return [ 'ȳ' => 'y', 'Ỹ' => 'Y', 'ỹ' => 'y', + 'Щ' => 'Shh', + 'щ' => 'shh', 'Ź' => 'Z', 'ź' => 'z', 'Z̀' => 'Z', diff --git a/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php b/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php index 426d84a..afe31ae 100644 --- a/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php +++ b/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php @@ -199,8 +199,8 @@ return [ '&' => ' i ', '+' => ' plus ', ], - // Russian - Passport (2013), ICAO - 'ru__passport_2013' => [ + // Russian - GOST 7.79-2000(B) + 'ru__gost_2000_b' => [ '=' => ' ravnyj ', '%' => ' procent ', '∑' => ' summa ', @@ -210,8 +210,8 @@ return [ '&' => ' i ', '+' => ' plus ', ], - // Russian - GOST 7.79-2000(B) - 'ru__gost_2000_b' => [ + // Russian - Passport (2013), ICAO + 'ru__passport_2013' => [ '=' => ' ravnyj ', '%' => ' procent ', '∑' => ' summa ', diff --git a/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php b/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php index a6345f2..da81ae2 100644 --- a/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php +++ b/application/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php @@ -31,8 +31,8 @@ return [ 'fi' => 1, 'ka' => 1, 'ru' => 1, - 'ru__passport_2013' => 1, 'ru__gost_2000_b' => 1, + 'ru__passport_2013' => 1, 'uk' => 1, 'kk' => 1, 'cs' => 1, diff --git a/application/vendor/voku/portable-utf8/CHANGELOG.md b/application/vendor/voku/portable-utf8/CHANGELOG.md index 92bae7f..b096867 100644 --- a/application/vendor/voku/portable-utf8/CHANGELOG.md +++ b/application/vendor/voku/portable-utf8/CHANGELOG.md @@ -1,5 +1,111 @@ # Changelog +### 6.0.13 (2023-03-08) + +- added "UTF8::str_limit_in_byte()" + +### 6.0.12 (2023-01-11) + +- added "UTF8::remove_iright()" +- added "UTF8::remove_ileft()" + +### 6.0.11 (2022-12-16) + +- test with PHP 8.2 +- added "UTF8::getUrlParamFromArray()": Get data from an array via array like string. + +### 6.0.10 (2022-10-06) + +- optimize phpdocs (use positive-int) + +### 6.0.9 (2022-09-01) + +- optimize phpdocs (use int-range) + +### 6.0.8 (2022-09-01) + +- optimize phpdocs (use Conditional Return Types) v2 + +### 6.0.7 (2022-09-01) + +- optimize phpdocs (use Conditional Return Types) + +### 6.0.6 (2022-08-31) + +- optimize phpdocs +- optimize "from"-encoding in "UTF8::encode()" +- fix error handling in "UTF8::str_split()" for PHP >= 8.0 +- fix error handling in "UTF8::str_capitalize_name_helper()" for PHP >= 8.0 + +### 6.0.5 (2022-08-10) + +- PHP 8.2: Fix ${var} string interpolation deprecation | thanks @Ayesh + +### 6.0.4 (2022-03-08) + +- "To people of Russia": There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilians. + +### 6.0.3 (2022-01-30) + +- optimize phpdocs + +### 6.0.2 (2022-01-24) + +- update vendor (ASCII) lib + +### 6.0.1 (2022-01-24) + +- add "UTF8::levenshtein()" | thanks @NewEXE +- update vendor (ASCII) lib + +### 6.0.0 (2021-12-08) + +Removed: +- Bootup::filterRequestInputs(); +- Bootup::filterRequestUri(); +- UTF8::GRAPHEME_CLUSTER_RX +- UTF8::chr_to_int() (please use UTF8::chr_to_decimal()) +- UTF8::hasBom() (please use UTF8::string_has_bom()) +- UTF8::html_decode() (please use UTF8::html_entity_decode()) +- UTF8::int_to_chr() (please use UTF8::decimal_to_chr()) +- UTF8::isAscii() (please use UTF8::is_ascii()) +- UTF8::isBase64() (please use UTF8::is_base64()) +- UTF8::isBinary() (please use UTF8::is_binary()) +- UTF8::isBom() (please use UTF8::is_bom()) +- UTF8::isHtml() (please use UTF8::is_html()) +- UTF8::isJson() (please use UTF8::is_json()) +- UTF8::isUtf16() (please use UTF8::is_utf16()) +- UTF8::isUtf32() (please use UTF8::is_utf32()) +- UTF8::isUtf8() (please use UTF8::is_utf8()) +- UTF8::lcword() (please use UTF8::lcfirst()) +- UTF8::lowerCaseFirst() (please use UTF8::lcfirst()) +- UTF8::normalizeEncoding() (please use UTF8::normalize_encoding()) +- UTF8::removeBOM() (please use UTF8::remove_bom()) +- UTF8::split() (please use UTF8::str_split()) +- UTF8::str_begins() (please use UTF8::str_starts_with()) +- UTF8::str_ends() (please use UTF8::str_ends_with()) +- UTF8::str_ibegins() (please use UTF8::str_istarts_with()) +- UTF8::str_iends() (please use UTF8::str_iends_with()) +- UTF8::str_iindex_first() (please use UTF8::stripos()) +- UTF8::str_iindex_last() (please use UTF8::strripos()) +- UTF8::str_index_first() (please use UTF8::strpos()) +- UTF8::str_index_last() (please use UTF8::strrpos()) +- UTF8::str_transliterate() (please use UTF8::to_ascii()) +- UTF8::str_upper_first() (please use UTF8::ucfirst()) +- UTF8::strchr() (please use UTF8::strstr()) +- UTF8::strichr() (please use UTF8::stristr()) +- UTF8::toAscii() (please use UTF8::to_ascii()) +- UTF8::toIso8859() (please use UTF8::to_iso8859()) +- UTF8::toLatin1() (please use UTF8::to_iso8859()) +- UTF8::to_latin1() (please use UTF8::to_iso8859()) +- UTF8::toUTF8() (please use UTF8::to_utf8()) +- UTF8::ucword() (please use UTF8::ucfirst()) +- UTF8::urldecode_fix_win1252_chars() (please use UTF8::urldecode()) +- UTF8::utf8_fix_win1252_chars() (please use UTF8::fix_simple_utf8()) + +Fixed: +- "UTF8::is_binary()" -> fix for strict usage + ### 5.4.51 (2020-12-02) - "UTF8::rawurldecode()" -> optimize performance diff --git a/application/vendor/voku/portable-utf8/README.md b/application/vendor/voku/portable-utf8/README.md index 361fc1f..c8880e5 100644 --- a/application/vendor/voku/portable-utf8/README.md +++ b/application/vendor/voku/portable-utf8/README.md @@ -1,8 +1,10 @@ [//]: # (AUTO-GENERATED BY "PHP README Helper": base file -> docs/base.md) -[![Build Status](https://travis-ci.com/voku/portable-utf8.svg?branch=master)](https://travis-ci.com/voku/portable-utf8) +[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) + +[![Build Status](https://github.com/voku/portable-utf8/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/voku/portable-utf8/actions) [![Build status](https://ci.appveyor.com/api/projects/status/gnejjnk7qplr7f5t/branch/master?svg=true)](https://ci.appveyor.com/project/voku/portable-utf8/branch/master) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fvoku%2Fportable-utf8.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fvoku%2Fportable-utf8?ref=badge_shield) -[![Coverage Status](https://coveralls.io/repos/voku/portable-utf8/badge.svg?branch=master&service=github)](https://coveralls.io/github/voku/portable-utf8?branch=master) +[![codecov.io](https://codecov.io/github/voku/portable-utf8/coverage.svg?branch=master)](https://codecov.io/github/voku/portable-utf8?branch=master) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/997c9bb10d1c4791967bdf2e42013e8e)](https://www.codacy.com/app/voku/portable-utf8) [![Latest Stable Version](https://poser.pugx.org/voku/portable-utf8/v/stable)](https://packagist.org/packages/voku/portable-utf8) [![Total Downloads](https://poser.pugx.org/voku/portable-utf8/downloads)](https://packagist.org/packages/voku/portable-utf8) @@ -109,19 +111,6 @@ The problem with "mbstring" and others is that most of the time you cannot ensur * Although Portable UTF-8 is easy to use; moving from native API to Portable UTF-8 may not be straight-forward for everyone. It is highly recommended that you do not update your scripts to include Portable UTF-8 or replace or change anything before you first know the reason and consequences. Most of the time, some native function may be all what you need. * There is also a shim for "mbstring", "iconv" and "intl", so you can use it also on shared webspace. -## Info - -Since version 5.4.26 this library will NOT force "UTF-8" by "bootstrap.php" anymore. -If you need to enable this behavior you can define "PORTABLE_UTF8__ENABLE_AUTO_FILTER", before requiring the autoloader. - -```php -define('PORTABLE_UTF8__ENABLE_AUTO_FILTER', 1); -``` - -Before version 5.4.26 this behavior was enabled by default and you could disable it via "PORTABLE_UTF8__DISABLE_AUTO_FILTER", -but the code had potential security vulnerabilities via injecting code while redirecting via ```header('Location ...```. -This is the reason I decided to add this BC in a bug fix release, so that everybody using the current version will receive the security-fix. - ## Usage Example 1: UTF8::cleanup() @@ -173,21 +162,21 @@ The API from the "UTF8"-Class is written as small static methods that will match ## Class methods

    access -add_bom_to_string +add_bom_to_string array_change_key_case between
    binary_to_str -bom -callback +bom +callback char_at
    chars checkForSupport chr -chr_map +chr_map
    chr_size_list chr_to_decimal chr_to_hex -chunk_split +chunk_split
    clean cleanup codepoints @@ -208,9 +197,9 @@ The API from the "UTF8"-Class is written as small static methods that will match file_has_bom filter filter_input -
    filter_input_array -filter_var -filter_var_array +
    filter_input_array +filter_var +filter_var_array finfo_loaded
    first_char fits_inside @@ -218,74 +207,78 @@ The API from the "UTF8"-Class is written as small static methods that will match fix_utf8
    getCharDirection getSupportInfo -get_file_type -get_random_string -
    get_unique_string +getUrlParamFromArray +get_file_type +
    get_random_string +get_unique_string has_lowercase has_uppercase -has_whitespace -
    hex_to_chr +
    has_whitespace +hex_to_chr hex_to_int html_encode -html_entity_decode -
    html_escape +
    html_entity_decode +html_escape html_stripe_empty_tags htmlentities -htmlspecialchars -
    iconv_loaded +
    htmlspecialchars +iconv_loaded int_to_hex intlChar_loaded -intl_loaded -
    is_alpha +
    intl_loaded +is_alpha is_alphanumeric is_ascii -is_base64 -
    is_binary +
    is_base64 +is_binary is_binary_file is_blank -is_bom -
    is_empty +
    is_bom +is_empty is_hexadecimal is_html -is_json -
    is_lowercase -is_printable +
    is_json +is_lowercase +is_printable is_punctuation -is_serialized -
    is_uppercase +
    is_serialized +is_uppercase is_url is_utf8 -is_utf16 -
    is_utf32 +
    is_utf16 +is_utf32 json_decode json_encode -json_loaded -
    lcfirst +
    json_loaded +lcfirst lcwords -ltrim +levenshtein +
    ltrim max -
    max_chr_width +max_chr_width mbstring_loaded -min +
    min normalize_encoding -
    normalize_line_ending +normalize_line_ending normalize_msword -normalize_whitespace +
    normalize_whitespace ord -
    parse_str +parse_str pcre_utf8_support -range +
    range rawurldecode -
    regex_replace +regex_replace remove_bom -remove_duplicates +
    remove_duplicates remove_html -
    remove_html_breaks -remove_invisible_characters +remove_html_breaks +remove_ileft +
    remove_invisible_characters +remove_iright remove_left remove_right
    replace -replace_all +replace_all replace_diamond_question_mark rtrim
    showSupport @@ -294,14 +287,14 @@ The API from the "UTF8"-Class is written as small static methods that will match str_camelize
    str_capitalize_name str_contains -str_contains_all -str_contains_any +str_contains_all +str_contains_any
    str_dasherize str_delimit str_detect_encoding str_ends_with
    str_ends_with_any -str_ensure_left +str_ensure_left str_ensure_right str_humanize
    str_iends_with @@ -311,7 +304,7 @@ The API from the "UTF8"-Class is written as small static methods that will match
    str_ireplace_beginning str_ireplace_ending str_istarts_with -str_istarts_with_any +str_istarts_with_any
    str_isubstr_after_first_separator str_isubstr_after_last_separator str_isubstr_before_first_separator @@ -341,11 +334,11 @@ The API from the "UTF8"-Class is written as small static methods that will match str_slice str_snakeize
    str_sort -str_split -str_split_array +str_split +str_split_array str_split_pattern
    str_starts_with -str_starts_with_any +str_starts_with_any str_substr_after_first_separator str_substr_after_last_separator
    str_substr_before_first_separator @@ -353,11 +346,11 @@ The API from the "UTF8"-Class is written as small static methods that will match str_substr_first str_substr_last
    str_surround -str_titleize -str_titleize_for_humans +str_titleize +str_titleize_for_humans str_to_binary
    str_to_lines -str_to_words +str_to_words str_truncate str_truncate_safe
    str_underscored @@ -413,7 +406,7 @@ The API from the "UTF8"-Class is written as small static methods that will match tabs_to_spaces titlecase
    to_ascii -to_boolean +to_boolean to_filename to_int
    to_iso8859 @@ -449,7 +442,7 @@ EXAMPLE: UTF8::access('fòô', 1); // 'ò' -------- -## add_bom_to_string(string $str): string +## add_bom_to_string(string $str): non-empty-string Prepends UTF-8 BOM character to the string and returns the whole string. @@ -461,7 +454,7 @@ EXAMPLE: UTF8::add_bom_to_string('fòô'); // "\xEF\xBB\xBF" . 'fòô'The input string.

    ` **Return:** -- `string

    The output string that contains BOM.

    ` +- `non-empty-string

    The output string that contains BOM.

    ` -------- @@ -514,7 +507,7 @@ EXAMPLE: UTF8::binary_to_str('11110000100111111001100010000011'); // '😃 -------- -## bom(): string +## bom(): non-empty-string Returns the UTF-8 Byte Order Mark Character. @@ -526,16 +519,16 @@ EXAMPLE: UTF8::bom(); // "\xEF\xBB\xBF" __nothing__ **Return:** -- `string

    UTF-8 Byte Order Mark.

    ` +- `non-empty-string

    UTF-8 Byte Order Mark.

    ` -------- -## callback(callable $callback, string $str): string[] +## callback(callable(string): string $callback, string $str): string[] **Parameters:** -- `callable $callback` +- `callable(string): string $callback` - `string $str` **Return:** @@ -549,7 +542,7 @@ Returns the character at $index, with indexes starting at 0. **Parameters:** - `string $str

    The input string.

    ` -- `int $index

    Position of the character.

    ` +- `int<1, max> $index

    Position of the character.

    ` - `string $encoding [optional]

    Default is UTF-8

    ` **Return:** @@ -562,7 +555,7 @@ Returns the character at $index, with indexes starting at 0. Returns an array consisting of the characters in the string. **Parameters:** -- `string $str

    The input string.

    ` +- `T $str

    The input string.

    ` **Return:** - `string[]

    An array of chars.

    ` @@ -598,14 +591,14 @@ EXAMPLE: UTF8::chr(0x2603); // '☃' -------- -## chr_map(callable $callback, string $str): string[] +## chr_map(callable(string): string $callback, string $str): string[] Applies callback to all characters of a string. EXAMPLE: UTF8::chr_map([UTF8::class, 'strtolower'], 'Κόσμε'); // ['κ','ό', 'σ', 'μ', 'ε'] **Parameters:** -- `callable $callback

    The callback function.

    ` +- `callable(string): string $callback` - `string $str

    UTF-8 string to run callback on.

    ` **Return:** @@ -625,7 +618,7 @@ Generates an array of byte length of each character of a Unicode string. EXAMPLE: UTF8::chr_size_list('中文空白-test'); // [3, 3, 3, 3, 1, 1, 1, 1, 1] **Parameters:** -- `string $str

    The original unicode string.

    ` +- `T $str

    The original unicode string.

    ` **Return:** - `int[]

    An array of byte lengths of each character.

    ` @@ -663,15 +656,15 @@ EXAMPLE: UTF8::chr_to_hex('§'); // U+00a7 -------- -## chunk_split(string $body, int $chunk_length, string $end): string +## chunk_split(string $str, int $chunk_length, string $end): string Splits a string into smaller chunks and multiple lines, using the specified line ending character. EXAMPLE: UTF8::chunk_split('ABC-ÖÄÜ-中文空白-κόσμε', 3); // "ABC\r\n-ÖÄ\r\nÜ-中\r\n文空白\r\n-κό\r\nσμε" **Parameters:** -- `string $body

    The original string to be split.

    ` -- `int $chunk_length [optional]

    The maximum character length of a chunk.

    ` +- `T $str

    The original string to be split.

    ` +- `int<1, max> $chunk_length [optional]

    The maximum character length of a chunk.

    ` - `string $end [optional]

    The character(s) to be inserted at the end of each chunk.

    ` **Return:** @@ -728,7 +721,7 @@ EXAMPLE: UTF8::cleanup("\xEF\xBB\xBF„Abcdef\xc2\xa0\x20…” — 😃 - ## codepoints(string|string[] $arg, bool $use_u_style): int[]|string[] -Accepts a string or a array of strings and returns an array of Unicode code points. +Accepts a string or an array of chars and returns an array of Unicode code points. INFO: opposite to UTF8::string() @@ -739,7 +732,7 @@ UTF8::codepoints('κöñ', true); // array('U+03ba', 'U+00f6', 'U+00f1') **Parameters:** -- `string|string[] $arg

    A UTF-8 encoded string or an array of such strings.

    ` +- `T $arg

    A UTF-8 encoded string or an array of such chars.

    ` - `bool $use_u_style

    If True, will return code points in U+xxxx format, default, code points will be returned as integers.

    ` @@ -773,7 +766,7 @@ Returns count of characters used in a string. EXAMPLE: UTF8::count_chars('κaκbκc'); // array('κ' => 3, 'a' => 1, 'b' => 1, 'c' => 1) **Parameters:** -- `string $str

    The input string.

    ` +- `T $str

    The input string.

    ` - `bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the string.

    ` - `bool $try_to_use_mb_functions [optional]

    Set to false, if you don't want to use` @@ -835,7 +828,7 @@ INFO: opposite to UTF8::string() EXAMPLE: UTF8::decimal_to_chr(931); // 'Σ' **Parameters:** -- `int|numeric-string $int` +- `int|string $int` **Return:** - `string` @@ -955,7 +948,7 @@ A empty string will trigger the autodetect anyway.

    ` - `string $to_charset [optional]

    Set the output charset.

    ` - `string $transfer_encoding [optional]

    Set the transfer encoding.

    ` - `string $linefeed [optional]

    Set the used linefeed.

    ` -- `int $indent [optional]

    Set the max length indent.

    ` +- `int<1, max> $indent [optional]

    Set the max length indent.

    ` **Return:** - `false|string

    An encoded MIME field on success, @@ -965,7 +958,7 @@ or false if an error occurs during the encoding.

    ` ## extract_text(string $str, string $search, int|null $length, string $replacer_for_skipped_text, string $encoding): string -Create an extract from a sentence, so if the search-string was found, it try to centered in the output. +Create an extract from a sentence, so if the search-string was found, it tries to center in the output. **Parameters:** - `string $str

    The input string.

    ` @@ -1006,7 +999,7 @@ custom context, you can skip this parameter by &null;. - `int|null $offset [optional]

    The offset where the reading starts.

    ` -- `int|null $max_length [optional]

    +- `int<0, max>|null $max_length [optional]

    Maximum length of data read. The default is to read until end of file is reached.

    ` @@ -1060,7 +1053,7 @@ Gets a specific external variable by name and optionally filters it. EXAMPLE: // _GET['foo'] = 'bar'; -UTF8::filter_input(INPUT_GET, 'foo', FILTER_SANITIZE_STRING)); // 'bar' +UTF8::filter_input(INPUT_GET, 'foo', FILTER_UNSAFE_RAW)); // 'bar' **Parameters:** @@ -1090,7 +1083,7 @@ returns FALSE if the variable is not set and NULL if the filter fa -------- -## filter_input_array(int $type, array|null $definition, bool $add_empty): mixed +## filter_input_array(int $type, array|null $definition, bool $add_empty): array|false|null "filter_input_array()"-wrapper with normalizes to UTF-8 NFC, converting from WINDOWS-1252 when needed. @@ -1098,7 +1091,7 @@ Gets external variables and optionally filters them. EXAMPLE: // _GET['foo'] = 'bar'; -UTF8::filter_input_array(INPUT_GET, array('foo' => 'FILTER_SANITIZE_STRING')); // array('bar') +UTF8::filter_input_array(INPUT_GET, array('foo' => 'FILTER_UNSAFE_RAW')); // array('bar') **Parameters:** @@ -1107,7 +1100,7 @@ One of INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV.

    ` -- `array|null $definition [optional]

    +- `array|null $definition [optional]

    An array defining the arguments. A valid key is a string containing a variable name and a valid value is either a filter type, or an array optionally specifying the filter, flags and options. If the value is an @@ -1126,7 +1119,7 @@ Add missing keys as NULL to the return value.

    ` **Return:** -- `mixed

    +- `array|false|null

    An array containing the values of the requested variables on success, or FALSE on failure. An array value will be FALSE if the filter fails, or NULL if the variable is not set. Or if the flag FILTER_NULL_ON_FAILURE is used, it returns FALSE if the variable @@ -1135,7 +1128,7 @@ is not set and NULL if the filter fails. -------- -## filter_var(float|int|string|null $variable, int $filter, int|int[]|null $options): mixed +## filter_var(float|int|string|null $variable, int $filter, int|int[] $options): mixed "filter_var()"-wrapper with normalizes to UTF-8 NFC, converting from WINDOWS-1252 when needed. @@ -1151,7 +1144,7 @@ Value to filter. The ID of the filter to apply. The manual page lists the available filters.

    ` -- `int|int[]|null $options [optional]

    +- `int|int[] $options [optional]

    Associative array of options or bitwise disjunction of flags. If filter accepts options, flags can be provided in "flags" field of array. For the "callback" filter, callable type should be passed. The @@ -1198,7 +1191,7 @@ $var = filter_var('Doe, Jane Sue', FILTER_CALLBACK, array('options' => 'foo')); -------- -## filter_var_array(array $data, array|int|null $definition, bool $add_empty): mixed +## filter_var_array(array $data, array|int $definition, bool $add_empty): array|false|null "filter_var_array()"-wrapper with normalizes to UTF-8 NFC, converting from WINDOWS-1252 when needed. @@ -1221,10 +1214,10 @@ UTF8::filter_var_array($data, $filters, true); // ['name' => 'Κόσμε', 'age' **Parameters:** -- `array $data

    +- `array $data

    An array with string keys containing the data to filter.

    ` -- `array|int|null $definition [optional]

    +- `array|int $definition [optional]

    An array defining the arguments. A valid key is a string containing a variable name and a valid value is either a filter type, or an @@ -1244,7 +1237,7 @@ Add missing keys as NULL to the return value.

    ` **Return:** -- `mixed

    +- `array|false|null

    An array containing the values of the requested variables on success, or FALSE on failure. An array value will be FALSE if the filter fails, or NULL if the variable is not set. @@ -1269,8 +1262,8 @@ __nothing__ Returns the first $n characters of the string. **Parameters:** -- `string $str

    The input string.

    ` -- `int $n

    Number of characters to retrieve from the start.

    ` +- `T $str

    The input string.

    ` +- `int<1, max> $n

    Number of characters to retrieve from the start.

    ` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` **Return:** @@ -1320,11 +1313,11 @@ Fix a double (or multiple) encoded UTF8 string. EXAMPLE: UTF8::fix_utf8('Fédération'); // 'Fédération' **Parameters:** -- `string|string[] $str you can use a string or an array of strings` +- `TFixUtf8 $str you can use a string or an array of strings` **Return:** -- `string|string[] Will return the fixed input-"array" or -the fixed input-"string"` +- `string|string[]

    Will return the fixed input-"array" or +the fixed input-"string".

    ` -------- @@ -1356,17 +1349,32 @@ otherwise return null` -------- -## get_file_type(string $str, array $fallback): null[]|string[] +## getUrlParamFromArray(string $param, array $data): mixed + +Get data from an array via array like string. + +EXAMPLE: $array['foo'][123] = 'lall'; UTF8::getUrlParamFromArray('foo[123]', $array); // 'lall' + +**Parameters:** +- `string $param` +- `array $data` + +**Return:** +- `mixed` + +-------- + +## get_file_type(string $str, array $fallback): Warning: this method only works for some file-types (png, jpg) if you need more supported types, please use e.g. "finfo" **Parameters:** - `string $str` -- `array{ext: (null|string), mime: (null|string), type: (null|string)} $fallback

    with this keys: 'ext', 'mime', 'type'` +- `array{ext: (null|string), mime: (null|string), type: (null|string)} $fallback` **Return:** -- `null[]|string[]

    with this keys: 'ext', 'mime', 'type'

    ` +- `array{ext: (null|string), mime: (null|string), type: (null|string)}` -------- @@ -1375,8 +1383,8 @@ Warning: this method only works for some file-types (png, jpg) **Parameters:** -- `int $length

    Length of the random string.

    ` -- `string $possible_chars [optional]

    Characters string for the random selection.

    ` +- `int<1, max> $length

    Length of the random string.

    ` +- `T $possible_chars [optional]

    Characters string for the random selection.

    ` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` **Return:** @@ -1384,7 +1392,7 @@ Warning: this method only works for some file-types (png, jpg) -------- -## get_unique_string(int|string $extra_entropy, bool $use_md5): string +## get_unique_string(int|string $extra_entropy, bool $use_md5): non-empty-string @@ -1393,7 +1401,7 @@ Warning: this method only works for some file-types (png, jpg) - `bool $use_md5 [optional]

    Return the unique identifier as md5-hash? Default: true

    ` **Return:** -- `string` +- `non-empty-string` -------- @@ -1433,7 +1441,7 @@ Returns true if the string contains whitespace, false otherwise. -------- -## hex_to_chr(string $hexdec): false|string +## hex_to_chr(string $hexdec): string Converts a hexadecimal value into a UTF-8 character. @@ -1445,7 +1453,7 @@ EXAMPLE: UTF8::hex_to_chr('U+00a7'); // '§' - `string $hexdec

    The hexadecimal value.

    ` **Return:** -- `false|string one single UTF-8 character` +- `string

    One single UTF-8 character.

    ` -------- @@ -1474,12 +1482,12 @@ INFO: opposite to UTF8::html_decode() EXAMPLE: UTF8::html_encode('中文空白'); // '中文空白' **Parameters:** -- `string $str

    The Unicode string to be encoded as numbered entities.

    ` +- `T $str

    The Unicode string to be encoded as numbered entities.

    ` - `bool $keep_ascii_chars [optional]

    Keep ASCII chars.

    ` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` **Return:** -- `string HTML numbered entities` +- `string

    HTML numbered entities.

    ` -------- @@ -1500,7 +1508,7 @@ INFO: opposite to UTF8::html_encode() EXAMPLE: UTF8::html_entity_decode('中文空白'); // '中文空白' **Parameters:** -- `string $str

    +- `T $str

    The input string.

    ` - `int|null $flags [optional]

    @@ -1553,7 +1561,7 @@ Handle code as HTML 5. - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` **Return:** -- `string the decoded string` +- `string

    The decoded string.

    ` -------- @@ -1702,7 +1710,7 @@ INFO: Take a look at "UTF8::htmlentities()" EXAMPLE: UTF8::htmlspecialchars('<白-öäü>'); // '<白-öäü>' **Parameters:** -- `string $str

    +- `T $str

    The string being converted.

    ` - `int $flags [optional]

    @@ -1798,13 +1806,12 @@ encode existing html entities, the default is to convert everything.

    ` **Return:** -- `string the converted string. -

    +- `string

    The converted string.

    If the input string contains an invalid code unit sequence within the given encoding an empty string will be returned, unless either the ENT_IGNORE or -ENT_SUBSTITUTE flags are set` +ENT_SUBSTITUTE flags are set.

    ` -------- @@ -1919,9 +1926,7 @@ EXAMPLE: UTF8::is_base64('4KSu4KWL4KSo4KS/4KSa'); // true ## is_binary(int|string $input, bool $strict): bool -Check if the input is binary. - -.. (is look like a hack). +Check if the input is binary... (is look like a hack). EXAMPLE: UTF8::is_binary(01); // true @@ -1984,7 +1989,7 @@ A variable is considered empty if it does not exist or if its value equals FALSE empty() does not generate a warning if the variable does not exist. **Parameters:** -- `array|float|int|string $str` +- `array|float|int|string $str` **Return:** - `bool

    Whether or not $str is empty().

    ` @@ -2045,12 +2050,13 @@ results.

    ` -------- -## is_printable(string $str): bool +## is_printable(string $str, bool $ignore_control_characters): bool Returns true if the string contains only printable (non-invisible) chars, false otherwise. **Parameters:** - `string $str

    The input string.

    ` +- `bool $ignore_control_characters [optional]

    Ignore control characters like [LRM] or [LSEP].

    ` **Return:** - `bool

    Whether or not $str contains only printable (non-invisible) chars.

    ` @@ -2216,7 +2222,7 @@ is deeper than the recursion limit.

    ` (PHP 5 >= 5.2.0, PECL json >= 1.2.0)
    Returns the JSON representation of a value. -EXAMPLE: UTF8::json_enocde(array(1, '¥', 'ä')); // '[1,"\u00a5","\u00e4"]' +EXAMPLE: UTF8::json_encode(array(1, '¥', 'ä')); // '[1,"\u00a5","\u00e4"]' **Parameters:** - `mixed $value

    @@ -2248,8 +2254,8 @@ Set the maximum depth. Must be greater than zero.

    ` **Return:** -- `false|string A JSON encoded string on success or
    -FALSE on failure` +- `false|string

    A JSON encoded string on success or
    +FALSE on failure.

    ` -------- @@ -2281,7 +2287,7 @@ tr

    ` -> ß

    ` **Return:** -- `string the resulting string` +- `string

    The resulting string.

    ` -------- @@ -2306,6 +2312,28 @@ tr

    ` -------- +## levenshtein(string $str1, string $str2, int $insertionCost, int $replacementCost, int $deletionCost): int + +Calculate Levenshtein distance between two strings. + +For better performance, in a real application with a single input string +matched against many strings from a database, you will probably want to pre- +encode the input only once and use \levenshtein(). + +Source: https://github.com/KEINOS/mb_levenshtein + +**Parameters:** +- `string $str1

    One of the strings being evaluated for Levenshtein distance.

    ` +- `string $str2

    One of the strings being evaluated for Levenshtein distance.

    ` +- `int $insertionCost [optional]

    Defines the cost of insertion.

    ` +- `int $replacementCost [optional]

    Defines the cost of replacement.

    ` +- `int $deletionCost [optional]

    Defines the cost of deletion.

    ` + +**Return:** +- `int` + +-------- + ## ltrim(string $str, string|null $chars): string Strip whitespace or other characters from the beginning of a UTF-8 string. @@ -2321,14 +2349,14 @@ EXAMPLE: UTF8::ltrim(' 中文空白  '); // '中文空白  ' -------- -## max(string[]|string $arg): string|null +## max(string|string[] $arg): string|null Returns the UTF-8 character with the maximum code point in the given data. EXAMPLE: UTF8::max('abc-äöü-中文空白'); // 'ø' **Parameters:** -- `string[]|string $arg

    A UTF-8 encoded string or an array of such strings.

    ` +- `string|string[] $arg

    A UTF-8 encoded string or an array of such strings.

    ` **Return:** - `string|null the character with the highest code point than others, returns null on failure or empty input` @@ -2419,7 +2447,7 @@ EXAMPLE: UTF8::normalize_msword('„Abcdef…”'); // '"Abcdef..."'↑ Normalize the whitespace. @@ -2430,6 +2458,7 @@ EXAMPLE: UTF8::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2 - `bool $keep_non_breaking_space [optional]

    Set to true, to keep non-breaking-spaces.

    ` - `bool $keep_bidi_unicode_controls [optional]

    Set to true, to keep non-printable (for the web) bidirectional text chars.

    ` +- `bool $normalize_control_characters [optional]

    Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

    ` **Return:** - `string

    A string with normalized whitespace.

    ` @@ -2468,7 +2497,7 @@ echo $array['Iñtërnâtiônéàlizætiøn']; // '測試' **Parameters:** - `string $str

    The input string.

    ` -- `array $result

    The result will be returned into this reference parameter.

    ` +- `array $result

    The result will be returned into this reference parameter.

    ` - `bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the string.

    ` **Return:** @@ -2491,7 +2520,7 @@ __nothing__ -------- -## range(int|string $var1, int|string $var2, bool $use_ctype, string $encoding, float|int $step): string[] +## range(int|string $var1, int|string $var2, bool $use_ctype, string $encoding, float|int $step): list Create an array containing a range of UTF-8 characters. @@ -2511,7 +2540,7 @@ step will default to 1.

    ` **Return:** -- `string[]` +- `list` -------- @@ -2533,7 +2562,7 @@ e.g: 'D%25C3%2583%25C2%25BCsseldorf' => 'Düsseldorf' **Parameters:** -- `string $str

    The input string.

    ` +- `T $str

    The input string.

    ` - `bool $multi_decode

    Decode as often as possible.

    ` **Return:** @@ -2603,9 +2632,7 @@ should not be stripped. Default: null ## remove_html_breaks(string $str, string $replacement): string -Remove all breaks [
    | \r\n | \r | \n | . - -..] from the string. +Remove all breaks [
    | \r\n | \r | \n | ...] from the string. **Parameters:** - `string $str

    The input string.

    ` @@ -2616,7 +2643,21 @@ Remove all breaks [
    | \r\n | \r | \n | . -------- -## remove_invisible_characters(string $str, bool $url_encoded, string $replacement): string +## remove_ileft(string $str, string $substring, string $encoding): string + +Returns a new string with the prefix $substring removed, if present and case-insensitive. + +**Parameters:** +- `string $str

    The input string.

    ` +- `string $substring

    The prefix to remove.

    ` +- `string $encoding [optional]

    Default: 'UTF-8'

    ` + +**Return:** +- `string

    A string without the prefix $substring.

    ` + +-------- + +## remove_invisible_characters(string $str, bool $url_encoded, string $replacement, bool $keep_basic_control_characters): string Remove invisible characters from a string. @@ -2635,12 +2676,27 @@ WARNING: maybe contains false-positives e.g. aa%0Baa -> aaaa. Default: false

    ` - `string $replacement [optional]

    The replacement character.

    ` +- `bool $keep_basic_control_characters [optional]

    Keep control characters like [LRM] or [LSEP].

    ` **Return:** - `string

    A string without invisible chars.

    ` -------- +## remove_iright(string $str, string $substring, string $encoding): string + +Returns a new string with the suffix $substring removed, if present and case-insensitive. + +**Parameters:** +- `string $str` +- `string $substring

    The suffix to remove.

    ` +- `string $encoding [optional]

    Default: 'UTF-8'

    ` + +**Return:** +- `string

    A string having a $str without the suffix $substring.

    ` + +-------- + ## remove_left(string $str, string $substring, string $encoding): string Returns a new string with the prefix $substring removed, if present. @@ -2684,14 +2740,14 @@ Replaces all occurrences of $search in $str by $replacement. -------- -## replace_all(string $str, array $search, array|string $replacement, bool $case_sensitive): string +## replace_all(string $str, string[] $search, string|string[] $replacement, bool $case_sensitive): string Replaces all occurrences of $search in $str by $replacement. **Parameters:** - `string $str

    The input string.

    ` -- `array $search

    The elements to search for.

    ` -- `array|string $replacement

    The string to replace with.

    ` +- `string[] $search

    The elements to search for.

    ` +- `string|string[] $replacement

    The string to replace with.

    ` - `bool $case_sensitive [optional]

    Whether or not to enforce case-sensitivity. Default: true

    ` **Return:** @@ -2749,7 +2805,7 @@ Converts a UTF-8 character to HTML Numbered Entity like "{". EXAMPLE: UTF8::single_chr_html_encode('κ'); // 'κ' **Parameters:** -- `string $char

    The Unicode character to be encoded as numbered entity.

    ` +- `T $char

    The Unicode character to be encoded as numbered entity.

    ` - `bool $keep_ascii_chars

    Set to true to keep ASCII chars.` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` @@ -2763,8 +2819,8 @@ EXAMPLE: UTF8::single_chr_html_encode('κ'); // 'κ' **Parameters:** -- `string $str` -- `int $tab_length` +- `T $str` +- `int<1, max> $tab_length` **Return:** - `string` @@ -2820,15 +2876,15 @@ $case_sensitive to false. -------- -## str_contains_all(string $haystack, array $needles, bool $case_sensitive): bool +## str_contains_all(string $haystack, scalar[] $needles, bool $case_sensitive): bool Returns true if the string contains all $needles, false otherwise. By -default the comparison is case-sensitive, but can be made insensitive by +default, the comparison is case-sensitive, but can be made insensitive by setting $case_sensitive to false. **Parameters:** - `string $haystack

    The input string.

    ` -- `array $needles

    SubStrings to look for.

    ` +- `scalar[] $needles

    SubStrings to look for.

    ` - `bool $case_sensitive [optional]

    Whether or not to enforce case-sensitivity. Default: true

    ` **Return:** @@ -2836,7 +2892,7 @@ setting $case_sensitive to false. -------- -## str_contains_any(string $haystack, array $needles, bool $case_sensitive): bool +## str_contains_any(string $haystack, scalar[] $needles, bool $case_sensitive): bool Returns true if the string contains any $needles, false otherwise. By default the comparison is case-sensitive, but can be made insensitive by @@ -2844,7 +2900,7 @@ setting $case_sensitive to false. **Parameters:** - `string $haystack

    The input string.

    ` -- `array $needles

    SubStrings to look for.

    ` +- `scalar[] $needles

    SubStrings to look for.

    ` - `bool $case_sensitive [optional]

    Whether or not to enforce case-sensitivity. Default: true

    ` **Return:** @@ -2875,8 +2931,13 @@ Delimiters are inserted before uppercase characters (with the exception of the first character of the string), and in place of spaces, dashes, and underscores. Alpha delimiters are not converted to lowercase. +EXAMPLE: +UTF8::str_delimit('test case, '#'); // 'test#case' +UTF8::str_delimit('test -case', '**'); // 'test**case' + + **Parameters:** -- `string $str

    The input string.

    ` +- `T $str

    The input string.

    ` - `string $delimiter

    Sequence used to separate parts of the string.

    ` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` - `bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the string.

    ` @@ -2943,17 +3004,17 @@ Returns true if the string ends with any of $substrings, false otherwise. -------- -## str_ensure_left(string $str, string $substring): string +## str_ensure_left(string $str, string $substring): Ensures that the string begins with $substring. If it doesn't, it's prepended. **Parameters:** -- `string $str

    The input string.

    ` -- `string $substring

    The substring to add if not present.

    ` +- `T $str

    The input string.

    ` +- `TSub $substring

    The substring to add if not present.

    ` **Return:** -- `string` +- `TSub is non-empty-string ? non-empty-string : (T is non-empty-string ? non-empty-string : string` -------- @@ -2962,8 +3023,8 @@ prepended. Ensures that the string ends with $substring. If it doesn't, it's appended. **Parameters:** -- `string $str

    The input string.

    ` -- `string $substring

    The substring to add if not present.

    ` +- `T $str

    The input string.

    ` +- `TSub $substring

    The substring to add if not present.

    ` **Return:** - `string` @@ -3108,7 +3169,7 @@ UTF8::str_istarts_with('ΚόσμεMiddleEnd', 'κόσμε'); // true -------- -## str_istarts_with_any(string $str, array $substrings): bool +## str_istarts_with_any(string $str, scalar[] $substrings): bool Returns true if the string begins with any of $substrings, false otherwise. @@ -3116,7 +3177,7 @@ Returns true if the string begins with any of $substrings, false otherwise. **Parameters:** - `string $str

    The input string.

    ` -- `array $substrings

    Substrings to look for.

    ` +- `scalar[] $substrings

    Substrings to look for.

    ` **Return:** - `bool

    Whether or not $str starts with $substring.

    ` @@ -3228,8 +3289,8 @@ Returns the last $n characters of the string. Limit the number of characters in a string. **Parameters:** -- `string $str

    The input string.

    ` -- `int $length [optional]

    Default: 100

    ` +- `T $str

    The input string.

    ` +- `int<1, max> $length [optional]

    Default: 100

    ` - `string $str_add_on [optional]

    Default: …

    ` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` @@ -3245,8 +3306,8 @@ Limit the number of characters in a string, but also after the next word. EXAMPLE: UTF8::str_limit_after_word('fòô bàř fòô', 8, ''); // 'fòô bàř' **Parameters:** -- `string $str

    The input string.

    ` -- `int $length [optional]

    Default: 100

    ` +- `T $str

    The input string.

    ` +- `int<1, max> $length [optional]

    Default: 100

    ` - `string $str_add_on [optional]

    Default: …

    ` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` @@ -3357,7 +3418,7 @@ does not exist. **Parameters:** - `string $str

    The input string.

    ` -- `int $index

    The index from which to retrieve the char.

    ` +- `int<1, max> $index

    The index from which to retrieve the char.

    ` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` **Return:** @@ -3442,10 +3503,10 @@ Repeat a string. EXAMPLE: UTF8::str_repeat("°~\xf0\x90\x28\xbc", 2); // '°~ð(¼°~ð(¼' **Parameters:** -- `string $str

    +- `T $str

    The string to be repeated.

    ` -- `int $multiplier

    +- `int<1, max> $multiplier

    Number of time the input string should be repeated.

    @@ -3525,7 +3586,7 @@ INFO: uses random algorithm which is weak for cryptography purposes EXAMPLE: UTF8::str_shuffle('fòô bàř fòô'); // 'àòôřb ffòô ' **Parameters:** -- `string $str

    The input string

    ` +- `T $str

    The input string

    ` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` **Return:** @@ -3581,15 +3642,15 @@ EXAMPLE: UTF8::str_sort(' -ABC-中文空白- '); // ' ---ABC中文白 -------- -## str_split(int|string $input, int $length, bool $clean_utf8, bool $try_to_use_mb_functions): string[] +## str_split(int|string $str, int $length, bool $clean_utf8, bool $try_to_use_mb_functions): list Convert a string to an array of unicode characters. EXAMPLE: UTF8::str_split('中文空白'); // array('中', '文', '空', '白') **Parameters:** -- `int|string $input

    The string or int to split into array.

    ` -- `int $length [optional]

    Max character length of each array +- `int|string $str

    The string or int to split into array.

    ` +- `int<1, max> $length [optional]

    Max character length of each array element.

    ` - `bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the string.

    ` @@ -3597,11 +3658,11 @@ string.

    ` "mb_substr"

    ` **Return:** -- `string[]

    An array containing chunks of chars from the input.

    ` +- `list

    An array containing chunks of chars from the input.

    ` -------- -## str_split_array(int[]|string[] $input, int $length, bool $clean_utf8, bool $try_to_use_mb_functions): string[][] +## str_split_array(int[]|string[] $input, int $length, bool $clean_utf8, bool $try_to_use_mb_functions): list> Convert a string to an array of Unicode characters. @@ -3611,15 +3672,15 @@ UTF8::str_split_array(['中文空白', 'test'], 2); // [['中文', '空白'], [' **Parameters:** - `int[]|string[] $input

    The string[] or int[] to split into array.

    ` -- `int $length [optional]

    Max character length of each array -lement.

    ` +- `int<1, max> $length [optional]

    Max character length of each array +element.

    ` - `bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the string.

    ` - `bool $try_to_use_mb_functions [optional]

    Set to false, if you don't want to use "mb_substr"

    ` **Return:** -- `string[][]

    An array containing chunks of the input.

    ` +- `list>

    An array containing chunks of the input.

    ` -------- @@ -3657,7 +3718,7 @@ UTF8::str_starts_with('ΚόσμεMiddleEnd', 'κόσμε'); // false -------- -## str_starts_with_any(string $str, array $substrings): bool +## str_starts_with_any(string $str, scalar[] $substrings): bool Returns true if the string begins with any of $substrings, false otherwise. @@ -3665,7 +3726,7 @@ Returns true if the string begins with any of $substrings, false otherwise. **Parameters:** - `string $str

    The input string.

    ` -- `array $substrings

    Substrings to look for.

    ` +- `scalar[] $substrings

    Substrings to look for.

    ` **Return:** - `bool

    Whether or not $str starts with $substring.

    ` @@ -3763,15 +3824,15 @@ Gets the substring after (or before via "$before_needle") the last occurrence of Surrounds $str with the given substring. **Parameters:** -- `string $str` -- `string $substring

    The substring to add to both sides.

    ` +- `T $str` +- `TSub $substring

    The substring to add to both sides.

    ` **Return:** - `string

    A string with the substring both prepended and appended.

    ` -------- -## str_titleize(string $str, array|string[]|null $ignore, string $encoding, bool $clean_utf8, string|null $lang, bool $try_to_keep_the_string_length, bool $use_trim_first, string|null $word_define_chars): string +## str_titleize(string $str, string[]|null $ignore, string $encoding, bool $clean_utf8, string|null $lang, bool $try_to_keep_the_string_length, bool $use_trim_first, string|null $word_define_chars): string Returns a trimmed string with the first letter of each word capitalized. @@ -3780,7 +3841,7 @@ capitalized. **Parameters:** - `string $str` -- `array|string[]|null $ignore [optional]

    An array of words not to capitalize or +- `string[]|null $ignore [optional]

    An array of words not to capitalize or null. Default: null

    ` - `string $encoding [optional]

    Default: 'UTF-8'

    ` - `bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the @@ -3799,7 +3860,7 @@ whitespace separator === words.

    ` -------- -## str_titleize_for_humans(string $str, array $ignore, string $encoding): string +## str_titleize_for_humans(string $str, string[] $ignore, string $encoding): string Returns a trimmed string in proper title case. @@ -3810,7 +3871,7 @@ Adapted from John Gruber's script. **Parameters:** - `string $str` -- `array $ignore

    An array of words not to capitalize.

    ` +- `string[] $ignore

    An array of words not to capitalize.

    ` - `string $encoding [optional]

    Set the charset for e.g. "mb_" function

    ` **Return:** @@ -3846,7 +3907,7 @@ EXAPLE: UTF8::str_to_binary('😃'); // '11110000100111111001100010000011' -------- -## str_to_words(string $str, string $char_list, bool $remove_empty_values, int|null $remove_short_values): string[] +## str_to_words(string $str, string $char_list, bool $remove_empty_values, int|null $remove_short_values): list Convert a string into an array of words. @@ -3859,7 +3920,7 @@ EXAMPLE: UTF8::str_to_words('中文空白 oöäü#s', '#') // array('', ' - `int|null $remove_short_values

    The min. string length or null to disable

    ` **Return:** -- `string[]` +- `list` -------- @@ -3960,7 +4021,7 @@ UTF8::str_word_count('中文空白 öäü ab#c', 2, '#'); // array(0 => '中文 **Parameters:** - `string $str

    The input string.

    ` -- `int $format [optional]

    +- `0|1|2 $format [optional]

    0 => return a number of words (default)
    1 => return an array of words
    2 => return an array of words with word-offset as key @@ -4830,9 +4891,9 @@ Get part of a string process in bytes. - `int|null $length [optional]

    The maximum length of the returned string.

    ` **Return:** -- `false|string The portion of str specified by the offset and +- `false|string

    The portion of str specified by the offset and length parameters.

    If str is shorter than offset -characters long, FALSE will be returned.` +characters long, FALSE will be returned.

    ` -------- @@ -4881,7 +4942,7 @@ EXAMPLE: UTF8::substr_replace(array('Iñtërnâtiônàlizætiøn', 'foo'), source: https://gist.github.com/stemar/8287074 **Parameters:** -- `string|string[] $str

    The input string or an array of stings.

    ` +- `TSubReplace $str

    The input string or an array of stings.

    ` - `string|string[] $replacement

    The replacement string or an array of stings.

    ` - `int|int[] $offset

    If start is positive, the replacing will begin at the start'th offset @@ -5000,12 +5061,12 @@ performance

    ` -------- -## to_boolean(bool|int|string $str): bool +## to_boolean(bool|float|int|string $str): bool **Parameters:** -- `bool|int|numeric-string $str` +- `bool|float|int|string $str` **Return:** - `bool` @@ -5046,7 +5107,7 @@ Convert a string into "ISO-8859"-encoding (Latin-1). EXAMPLE: UTF8::to_utf8(UTF8::to_iso8859(' -ABC-中文空白- ')); // ' -ABC-????- ' **Parameters:** -- `string|string[] $str` +- `TToIso8859 $str` **Return:** - `string|string[]` @@ -5102,7 +5163,7 @@ case. EXAMPLE: UTF8::to_utf8_string("\u0063\u0061\u0074"); // 'cat' **Parameters:** -- `string $str

    Any string.

    ` +- `T $str

    Any string.

    ` - `bool $decode_html_entity_to_utf8

    Set to true, if you need to decode html-entities.

    ` **Return:** @@ -5187,7 +5248,7 @@ e.g: 'D%25C3%2583%25C2%25BCsseldorf' => 'Düsseldorf' **Parameters:** -- `string $str

    The input string.

    ` +- `T $str

    The input string.

    ` - `bool $multi_decode

    Decode as often as possible.

    ` **Return:** @@ -5245,7 +5306,7 @@ EXAMPLE: UTF8::words_limit('fòô bàř fòô', 2, ''); // 'fòô bàř'The input string.

    ` -- `int $limit

    The limit of words as integer.

    ` +- `int<1, max> $limit

    The limit of words as integer.

    ` - `string $str_add_on

    Replacement for the striped string.

    ` **Return:** @@ -5261,7 +5322,7 @@ EXAMPLE: UTF8::wordwrap('Iñtërnâtiônàlizætiøn', 2, '
    ', true)); **Parameters:** - `string $str

    The input string.

    ` -- `int $width [optional]

    The column width.

    ` +- `int<1, max> $width [optional]

    The column width.

    ` - `string $break [optional]

    The line is broken using the optional break parameter.

    ` - `bool $cut [optional]

    If the cut is set to true, the string is @@ -5276,14 +5337,12 @@ a word that is larger than the given width, it is broken apart. ## wordwrap_per_line(string $str, int $width, string $break, bool $cut, bool $add_final_break, string|null $delimiter): string -Line-Wrap the string after $limit, but split the string by "$delimiter" before . - -.. -... so that we wrap the per line. +Line-Wrap the string after $limit, but split the string by "$delimiter" before ... + ... so that we wrap the per line. **Parameters:** - `string $str

    The input string.

    ` -- `int $width [optional]

    The column width.

    ` +- `int<1, max> $width [optional]

    The column width.

    ` - `string $break [optional]

    The line is broken using the optional break parameter.

    ` - `bool $cut [optional]

    If the cut is set to true, the string is @@ -5294,7 +5353,7 @@ a word that is larger than the given width, it is broken apart. If this flag is true, then the method will add a $break at the end of the result string.

    ` -- `string|null $delimiter [optional]

    +- `non-empty-string|null $delimiter [optional]

    You can change the default behavior, where we split the string by newline.

    ` diff --git a/application/vendor/voku/portable-utf8/bootstrap.php b/application/vendor/voku/portable-utf8/bootstrap.php index 8d3be73..ac8d262 100644 --- a/application/vendor/voku/portable-utf8/bootstrap.php +++ b/application/vendor/voku/portable-utf8/bootstrap.php @@ -5,8 +5,3 @@ use voku\helper\UTF8; Bootup::initAll(); // Enables UTF-8 for PHP UTF8::checkForSupport(); // Check UTF-8 support for PHP - -if (defined('PORTABLE_UTF8__ENABLE_AUTO_FILTER') === true) { - Bootup::filterRequestUri(); // Redirects to an UTF-8 encoded URL if it's not already the case - Bootup::filterRequestInputs(); // Normalizes HTTP inputs to UTF-8 NFC -} diff --git a/application/vendor/voku/portable-utf8/composer.json b/application/vendor/voku/portable-utf8/composer.json index f7b6515..650d5cc 100644 --- a/application/vendor/voku/portable-utf8/composer.json +++ b/application/vendor/voku/portable-utf8/composer.json @@ -33,10 +33,14 @@ "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0", - "voku/portable-ascii": "~1.5.6" + "voku/portable-ascii": "~2.0.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0", + "phpstan/phpstan": "1.9.*@dev", + "phpstan/phpstan-strict-rules": "1.4.*@dev", + "thecodingmachine/phpstan-strict-rules": "1.0.*@dev", + "voku/phpstan-rules": "3.1.*@dev" }, "suggest": { "ext-json": "Use JSON for string detection", diff --git a/application/vendor/voku/portable-utf8/src/voku/helper/Bootup.php b/application/vendor/voku/portable-utf8/src/voku/helper/Bootup.php index 50a8ae8..243ac20 100644 --- a/application/vendor/voku/portable-utf8/src/voku/helper/Bootup.php +++ b/application/vendor/voku/portable-utf8/src/voku/helper/Bootup.php @@ -9,149 +9,6 @@ namespace voku\helper; */ class Bootup { - /** - * filter request inputs - * - * Ensures inputs are well formed UTF-8 - * When not, assumes Windows-1252 and converts to UTF-8 - * Tests only values, not keys - * - * @param int $normalization_form - * @param string $leading_combining - * - * @return bool - * - * @deprecated

    This method will be removed in future releases, so please don't use it anymore.

    - */ - public static function filterRequestInputs( - int $normalization_form = \Normalizer::NFC, - string $leading_combining = '◌' - ): bool { - $a = [ - &$_FILES, - &$_ENV, - &$_GET, - &$_POST, - &$_COOKIE, - &$_SERVER, - &$_REQUEST, - ]; - - /** @noinspection ReferenceMismatchInspection */ - /** @noinspection ForeachSourceInspection */ - foreach ($a[0] as &$r) { - $a[] = [ - &$r['name'], - &$r['type'], - ]; - } - unset($r, $a[0]); - - $len = \count($a) + 1; - for ($i = 1; $i < $len; ++$i) { - /** @noinspection ReferenceMismatchInspection */ - /** @noinspection ForeachSourceInspection */ - foreach ($a[$i] as &$r) { - /** @noinspection ReferenceMismatchInspection */ - $s = $r; // $r is a reference, $s a copy - if (\is_array($s)) { - $a[$len++] = &$r; - } else { - $r = self::filterString($s, $normalization_form, $leading_combining); - } - } - unset($r, $a[$i]); - } - - return $len > 1; - } - - /** - * Filter current REQUEST_URI . - * - * @param string|null $uri

    If null is set, then the server REQUEST_URI will be used.

    - * @param bool $exit - * - * @return mixed - * - * @deprecated

    This method will be removed in future releases, so please don't use it anymore.

    - */ - public static function filterRequestUri($uri = null, bool $exit = true) - { - if ($uri === null) { - if (!isset($_SERVER['REQUEST_URI'])) { - return false; - } - - $uri = (string) $_SERVER['REQUEST_URI']; - } - - $uriOrig = $uri; - - // - // Ensures the URL is well formed UTF-8 - // - - if (UTF8::is_utf8(\rawurldecode($uri)) === true) { - return $uri; - } - - // - // When not, assumes Windows-1252 and redirects to the corresponding UTF-8 encoded URL - // - - $uri = (string) \preg_replace_callback( - '/[\x80-\xFF]+/', - /** - * @param array $m - * - * @return string - */ - static function (array $m): string { - return \rawurlencode($m[0]); - }, - $uri - ); - - $uri = (string) \preg_replace_callback( - '/(?:%[89A-F][0-9A-F])+/i', - /** - * @param array $m - * - * @return string - */ - static function (array $m): string { - return \rawurlencode(UTF8::rawurldecode($m[0])); - }, - $uri - ); - - if ( - $uri !== $uriOrig - && - $exit === true - && - \headers_sent() === false - ) { - $severProtocol = ($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1'); - \header($severProtocol . ' 301 Moved Permanently'); - - if (\strncmp($uri, '/', 1) === 0) { - \header('Location: /' . \ltrim($uri, '/')); - } else { - \header('Location: ' . $uri); - } - - exit(); - } - - if (\strncmp($uri, '/', 1) === 0) { - $uri = '/' . \ltrim($uri, '/'); - } - - return $uri; - } - /** * Normalizes to UTF-8 NFC, converting from WINDOWS-1252 when needed. * @@ -198,6 +55,25 @@ class Bootup return \random_bytes($length); } + /** + * Constant FILTER_SANITIZE_STRING polyfill for PHP > 8.1 + * + * INFO: https://stackoverflow.com/a/69207369/1155858 + * + * @param string $str + * + * @return false|string + */ + public static function filter_sanitize_string_polyfill(string $str) + { + $str = \preg_replace('/\x00|<[^>]*>?/', '', $str); + if ($str === null) { + return false; + } + + return \str_replace(["'", '"'], [''', '"'], $str); + } + /** * @return bool */ diff --git a/application/vendor/voku/portable-utf8/src/voku/helper/UTF8.php b/application/vendor/voku/portable-utf8/src/voku/helper/UTF8.php index 5bc0bac..837f053 100644 --- a/application/vendor/voku/portable-utf8/src/voku/helper/UTF8.php +++ b/application/vendor/voku/portable-utf8/src/voku/helper/UTF8.php @@ -5,18 +5,26 @@ declare(strict_types=1); namespace voku\helper; /** - * @psalm-immutable + * ## 🇷🇺 Русским гражданам + * В Украине сейчас идет война. Силами РФ наносятся удары по гражданской инфраструктуре в [Харькове][1], [Киеве][2], [Чернигове][3], [Сумах][4], [Ирпене][5] и десятках других городов. Гибнут люди - и гражданское население, и военные, в том числе российские призывники, которых бросили воевать. Чтобы лишить собственный народ доступа к информации, правительство РФ запретило называть войну войной, закрыло независимые СМИ и принимает сейчас ряд диктаторских законов. Эти законы призваны заткнуть рот всем, кто против войны. За обычный призыв к миру сейчас можно получить несколько лет тюрьмы. + * Не молчите! Молчание - знак вашего согласия с политикой российского правительства. + * **Вы можете сделать выбор НЕ МОЛЧАТЬ.** + * --- + * ## 🇺🇸 To people of Russia + * There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilian infrastructure in [Kharkiv][1], [Kyiv][2], [Chernihiv][3], [Sumy][4], [Irpin][5] and dozens of other cities. People are dying – both civilians and military servicemen, including Russian conscripts who were thrown into the fighting. In order to deprive its own people of access to information, the government of the Russian Federation has forbidden calling a war a war, shut down independent media and is passing a number of dictatorial laws. These laws are meant to silence all those who are against war. You can be jailed for multiple years for simply calling for peace. + * Do not be silent! Silence is a sign that you accept the Russian government's policy. + * **You can choose NOT TO BE SILENT.** + * --- + * - [1] https://cloudfront-us-east-2.images.arcpublishing.com/reuters/P7K2MSZDGFMIJPDD7CI2GIROJI.jpg "Kharkiv under attack" + * - [2] https://gdb.voanews.com/01bd0000-0aff-0242-fad0-08d9fc92c5b3_cx0_cy5_cw0_w1023_r1_s.jpg "Kyiv under attack" + * - [3] https://ichef.bbci.co.uk/news/976/cpsprodpb/163DD/production/_123510119_hi074310744.jpg "Chernihiv under attack" + * - [4] https://www.youtube.com/watch?v=8K-bkqKKf2A "Sumy under attack" + * - [5] https://cloudfront-us-east-2.images.arcpublishing.com/reuters/K4MTMLEHTRKGFK3GSKAT4GR3NE.jpg "Irpin under attack" + * + * @immutable */ final class UTF8 { - /** - * (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control]) - * This regular expression is a work around for http://bugs.exim.org/1279 - * - * @deprecated

    please don't use it anymore

    - */ - const GRAPHEME_CLUSTER_RX = "(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])"; - /** * Bom => Byte-Length * @@ -288,8 +296,8 @@ final class UTF8 * * @psalm-pure * - * @return string - *

    The output string that contains BOM.

    + * @return non-empty-string + *

    The output string that contains BOM.

    */ public static function add_bom_to_string(string $str): string { @@ -297,6 +305,8 @@ final class UTF8 $str = self::bom() . $str; } + \assert($str !== ''); + return $str; } @@ -329,8 +339,8 @@ final class UTF8 $return = []; foreach ($array as $key => &$value) { $key = $case === \CASE_LOWER - ? self::strtolower((string) $key, $encoding) - : self::strtoupper((string) $key, $encoding); + ? self::strtolower($key, $encoding) + : self::strtoupper($key, $encoding); $return[$key] = $value; } @@ -440,8 +450,8 @@ final class UTF8 * * @psalm-pure * - * @return string - *

    UTF-8 Byte Order Mark.

    + * @return non-empty-string + *

    UTF-8 Byte Order Mark.

    */ public static function bom(): string { @@ -451,7 +461,7 @@ final class UTF8 /** * @alias of UTF8::chr_map() * - * @param callable $callback + * @param callable(string): string $callback * @param string $str * * @psalm-pure @@ -468,9 +478,9 @@ final class UTF8 /** * Returns the character at $index, with indexes starting at 0. * - * @param string $str

    The input string.

    - * @param int $index

    Position of the character.

    - * @param string $encoding [optional]

    Default is UTF-8

    + * @param string $str

    The input string.

    + * @param int<1, max> $index

    Position of the character.

    + * @param string $encoding [optional]

    Default is UTF-8

    * * @psalm-pure * @@ -495,10 +505,13 @@ final class UTF8 * * @return string[] *

    An array of chars.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-list : list) */ public static function chars(string $str): array { - /** @var string[] */ return self::str_split($str); } @@ -520,8 +533,6 @@ final class UTF8 self::$SUPPORT['mbstring_func_overload'] = self::mbstring_overloaded(); if (self::$SUPPORT['mbstring'] === true) { \mb_internal_encoding('UTF-8'); - /** @noinspection UnusedFunctionResultInspection */ - /** @noinspection PhpComposerExtensionStubsInspection */ \mb_regex_encoding('UTF-8'); self::$SUPPORT['mbstring_internal_encoding'] = 'UTF-8'; } @@ -588,7 +599,6 @@ final class UTF8 $encoding = self::normalize_encoding($encoding, 'UTF-8'); } - /** @noinspection InArrayCanBeUsedInspection */ if ( $encoding !== 'UTF-8' && @@ -599,12 +609,16 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::chr() without mbstring cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } - if (!\is_int($code_point) || $code_point <= 0) { + if ( + !\is_int($code_point) /* @phpstan-ignore-line | hack for bad inputs */ + || + $code_point <= 0 + ) { return null; } @@ -636,7 +650,6 @@ final class UTF8 // if (self::$SUPPORT['intlChar'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ $chr = \IntlChar::chr($code_point); if ($encoding !== 'UTF-8') { @@ -690,7 +703,7 @@ final class UTF8 * * EXAMPLE: UTF8::chr_map([UTF8::class, 'strtolower'], 'Κόσμε'); // ['κ','ό', 'σ', 'μ', 'ε'] * - * @param callable $callback

    The callback function.

    + * @param callable(string): string $callback

    The callback function.

    * @param string $str

    UTF-8 string to run callback on.

    * * @psalm-pure @@ -722,6 +735,10 @@ final class UTF8 * * @return int[] *

    An array of byte lengths of each character.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-list<1|2|3|4> : list<1|2|3|4>) */ public static function chr_size_list(string $str): array { @@ -730,6 +747,7 @@ final class UTF8 } if (self::$SUPPORT['mbstring_func_overload'] === true) { + /* @phpstan-ignore-next-line | str_split only give one char, so that we only got int<1,4> */ return \array_map( static function (string $data): int { // "mb_" is available if overload is used, so use it ... @@ -739,6 +757,7 @@ final class UTF8 ); } + /* @phpstan-ignore-next-line | str_split only give one char, so that we only got int<1,4> */ return \array_map('\strlen', self::str_split($str)); } @@ -760,7 +779,7 @@ final class UTF8 if (self::$SUPPORT['iconv'] === true) { $chr_tmp = \iconv('UTF-8', 'UCS-4LE', $char); if ($chr_tmp !== false) { - /** @noinspection OffsetOperationsInspection */ + /** @phpstan-ignore-next-line - "unpack": only false if the format string contains errors */ return \unpack('V', $chr_tmp)[1]; } } @@ -821,40 +840,27 @@ final class UTF8 return self::int_to_hex(self::ord((string) $char), $prefix); } - /** - * alias for "UTF8::chr_to_decimal()" - * - * @param string $chr - * - * @psalm-pure - * - * @return int - * - * @see UTF8::chr_to_decimal() - * @deprecated

    please use "UTF8::chr_to_decimal()"

    - */ - public static function chr_to_int(string $chr): int - { - return self::chr_to_decimal($chr); - } - /** * Splits a string into smaller chunks and multiple lines, using the specified line ending character. * * EXAMPLE: UTF8::chunk_split('ABC-ÖÄÜ-中文空白-κόσμε', 3); // "ABC\r\n-ÖÄ\r\nÜ-中\r\n文空白\r\n-κό\r\nσμε" * - * @param string $body

    The original string to be split.

    - * @param int $chunk_length [optional]

    The maximum character length of a chunk.

    - * @param string $end [optional]

    The character(s) to be inserted at the end of each chunk.

    + * @param string $str

    The original string to be split.

    + * @param int<1, max> $chunk_length [optional]

    The maximum character length of a chunk.

    + * @param string $end [optional]

    The character(s) to be inserted at the end of each chunk.

    * * @psalm-pure * * @return string *

    The chunked string.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ - public static function chunk_split(string $body, int $chunk_length = 76, string $end = "\r\n"): string + public static function chunk_split(string $str, int $chunk_length = 76, string $end = "\r\n"): string { - return \implode($end, self::str_split($body, $chunk_length)); + return \implode($end, self::str_split($str, $chunk_length)); } /** @@ -887,8 +893,6 @@ final class UTF8 * * @return string *

    An clean UTF-8 encoded string.

    - * - * @noinspection PhpTooManyParametersInspection */ public static function clean( string $str, @@ -914,7 +918,6 @@ final class UTF8 | ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111 | ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111 /x'; - /** @noinspection NotOptimalRegularExpressionsInspection */ $str = (string) \preg_replace($regex, '$1', $str); if ($replace_diamond_question_mark) { @@ -979,7 +982,7 @@ final class UTF8 } /** - * Accepts a string or a array of strings and returns an array of Unicode code points. + * Accepts a string or an array of chars and returns an array of Unicode code points. * * INFO: opposite to UTF8::string() * @@ -989,7 +992,7 @@ final class UTF8 * UTF8::codepoints('κöñ', true); // array('U+03ba', 'U+00f6', 'U+00f1') *
    * - * @param string|string[] $arg

    A UTF-8 encoded string or an array of such strings.

    + * @param string|string[] $arg

    A UTF-8 encoded string or an array of such chars.

    * @param bool $use_u_style

    If True, will return code points in U+xxxx format, * default, code points will be returned as integers.

    * @@ -1001,6 +1004,10 @@ final class UTF8 * int[] for $u_style === false
    * string[] for $u_style === true
    *

    + * + * @template T as string|string[] + * @phpstan-param T $arg + * @phpstan-return (T is non-empty-string ? ($use_u_style is true ? non-empty-list : non-empty-list) : ($use_u_style is true ? list : list)) */ public static function codepoints($arg, bool $use_u_style = false): array { @@ -1010,6 +1017,7 @@ final class UTF8 /** * @psalm-suppress DocblockTypeContradiction + * @phpstan-ignore-next-line hack for bad inputs */ if (!\is_array($arg)) { return []; @@ -1037,6 +1045,7 @@ final class UTF8 ); } + /* @phpstan-ignore-next-line | FP? */ return $arg; } @@ -1055,7 +1064,6 @@ final class UTF8 public static function collapse_whitespace(string $str): string { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \trim((string) \mb_ereg_replace('[[:space:]]+', ' ', $str)); } @@ -1076,6 +1084,10 @@ final class UTF8 * @return int[] *

    An associative array of Character as keys and * their count as values.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-array : array) */ public static function count_chars( string $str, @@ -1126,17 +1138,21 @@ final class UTF8 // placeholder after checking that it is not defined as a filter. $double_underscore_replacements = 0; - // Fallback ... - if (\trim($str) === '') { - $str = \uniqid('auto-generated-css-class', true); - } else { - $str = self::clean($str); + $str = \trim($str); + if ($str) { + $str = self::clean($str, true); } if ($strip_tags) { $str = \strip_tags($str); } + $str = \trim($str); + // fallback (1) + if (!$str) { + $str = \uniqid('auto-generated-css-class', true); + } + if ($strtolower) { $str = \strtolower($str); } @@ -1145,7 +1161,6 @@ final class UTF8 $str = \str_replace('__', '##', $str, $double_underscore_replacements); } - /* @noinspection ArrayValuesMissUseInspection */ $str = \str_replace(\array_keys($filter), \array_values($filter), $str); // Replace temporary placeholder '##' with '__' only if the original // $identifier contained '__'. @@ -1218,7 +1233,9 @@ final class UTF8 */ public static function decimal_to_chr($int): string { - return self::html_entity_decode('&#' . $int . ';', \ENT_QUOTES | \ENT_HTML5); + // We cannot use html_entity_decode() here, as it will not return + // characters for many values < 160. + return \mb_convert_encoding('&#' . $int . ';', 'UTF-8', 'HTML-ENTITIES'); } /** @@ -1296,7 +1313,10 @@ final class UTF8 string $str, bool $use_reversible_string_mappings = false ): string { - self::initEmojiData(); + if (self::$EMOJI_KEYS_CACHE === null) { + /** @phpstan-ignore-next-line - we need to load the data first */ + self::initEmojiData(); + } if ($use_reversible_string_mappings) { return (string) \str_replace( @@ -1337,7 +1357,10 @@ final class UTF8 string $str, bool $use_reversible_string_mappings = false ): string { - self::initEmojiData(); + if (self::$EMOJI_KEYS_CACHE === null) { + /** @phpstan-ignore-next-line - we need to load the data first */ + self::initEmojiData(); + } if ($use_reversible_string_mappings) { return (string) \str_replace( @@ -1412,6 +1435,22 @@ final class UTF8 return $str; } + if ($from_encoding === 'JSON') { + $str = self::json_decode($str); + $from_encoding = ''; + } + + if ($from_encoding === 'BASE64') { + $str = \base64_decode($str, true); + $from_encoding = ''; + } + + if ($from_encoding === 'HTML-ENTITIES') { + /* @phpstan-ignore-next-line | $str has manybe changed */ + $str = self::html_entity_decode($str, \ENT_COMPAT); + $from_encoding = ''; + } + if ($to_encoding === 'JSON') { $return = self::json_encode($str); if ($return === false) { @@ -1420,44 +1459,34 @@ final class UTF8 return $return; } - if ($from_encoding === 'JSON') { - $str = self::json_decode($str); - $from_encoding = ''; - } if ($to_encoding === 'BASE64') { return \base64_encode($str); } - if ($from_encoding === 'BASE64') { - $str = \base64_decode($str, true); - $from_encoding = ''; - } if ($to_encoding === 'HTML-ENTITIES') { + /* @phpstan-ignore-next-line | $str has manybe changed */ return self::html_encode($str, true); } - if ($from_encoding === 'HTML-ENTITIES') { - $str = self::html_entity_decode($str, \ENT_COMPAT); - $from_encoding = ''; - } - $from_encoding_auto_detected = false; if ( $auto_detect_the_from_encoding || !$from_encoding ) { $from_encoding_auto_detected = self::str_detect_encoding($str); + } else { + $from_encoding_auto_detected = false; } // DEBUG //var_dump($to_encoding, $from_encoding, $from_encoding_auto_detected, $str, "\n\n"); if ($from_encoding_auto_detected !== false) { - /** @noinspection CallableParameterUseCaseInTypeContextInspection - FP */ $from_encoding = $from_encoding_auto_detected; } elseif ($auto_detect_the_from_encoding) { // fallback for the "autodetect"-mode + /* @phpstan-ignore-next-line | $str has manybe changed */ return self::to_utf8($str); } @@ -1478,6 +1507,7 @@ final class UTF8 $from_encoding === 'ISO-8859-1' ) ) { + /* @phpstan-ignore-next-line | $str has manybe changed */ return self::to_utf8($str); } @@ -1490,10 +1520,10 @@ final class UTF8 $from_encoding === 'UTF-8' ) ) { + /* @phpstan-ignore-next-line | $str has manybe changed */ return self::to_iso8859($str); } - /** @noinspection InArrayCanBeUsedInspection */ if ( $to_encoding !== 'UTF-8' && @@ -1504,13 +1534,12 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::encode() without mbstring cannot handle "' . $to_encoding . '" encoding', \E_USER_WARNING); } if (self::$SUPPORT['mbstring'] === true) { - // warning: do not use the symfony polyfill here $str_encoded = \mb_convert_encoding( $str, $to_encoding, @@ -1534,12 +1563,12 @@ final class UTF8 } /** - * @param string $str - * @param string $from_charset [optional]

    Set the input charset.

    - * @param string $to_charset [optional]

    Set the output charset.

    - * @param string $transfer_encoding [optional]

    Set the transfer encoding.

    - * @param string $linefeed [optional]

    Set the used linefeed.

    - * @param int $indent [optional]

    Set the max length indent.

    + * @param string $str + * @param string $from_charset [optional]

    Set the input charset.

    + * @param string $to_charset [optional]

    Set the output charset.

    + * @param string $transfer_encoding [optional]

    Set the transfer encoding.

    + * @param string $linefeed [optional]

    Set the used linefeed.

    + * @param int<1, max> $indent [optional]

    Set the max length indent.

    * * @psalm-pure * @@ -1578,7 +1607,7 @@ final class UTF8 } /** - * Create an extract from a sentence, so if the search-string was found, it try to centered in the output. + * Create an extract from a sentence, so if the search-string was found, it tries to center in the output. * * @param string $str

    The input string.

    * @param string $search

    The searched string.

    @@ -1794,7 +1823,7 @@ final class UTF8 * @param int|null $offset [optional]

    * The offset where the reading starts. *

    - * @param int|null $max_length [optional]

    + * @param int<0, max>|null $max_length [optional]

    * Maximum length of data read. The default is to read until end * of file is reached. *

    @@ -1809,8 +1838,6 @@ final class UTF8 * * @return false|string *

    The function returns the read data as string or false on failure.

    - * - * @noinspection PhpTooManyParametersInspection */ public static function file_get_contents( string $filename, @@ -1823,8 +1850,8 @@ final class UTF8 string $from_encoding = '' ) { // init - $filename = \filter_var($filename, \FILTER_SANITIZE_STRING); - /** @noinspection CallableParameterUseCaseInTypeContextInspection - FP */ + /** @noinspection CallableParameterUseCaseInTypeContextInspection - is ok here */ + $filename = Bootup::filter_sanitize_string_polyfill($filename); if ($filename === false) { return false; } @@ -1844,6 +1871,11 @@ final class UTF8 } if (\is_int($max_length)) { + /* @phpstan-ignore-next-line | we do not trust the phpdoc check */ + if ($max_length < 0) { + $max_length = 0; + } + $data = \file_get_contents($filename, $use_include_path, $context, $offset, $max_length); } else { $data = \file_get_contents($filename, $use_include_path, $context, $offset); @@ -1854,17 +1886,19 @@ final class UTF8 return false; } - if ($convert_to_utf8) { - if ( + if ( + $convert_to_utf8 + && + ( !self::is_binary($data, true) || self::is_utf16($data, false) !== false || self::is_utf32($data, false) !== false - ) { - $data = self::encode('UTF-8', $data, false, $from_encoding); - $data = self::cleanup($data); - } + ) + ) { + $data = self::encode('UTF-8', $data, false, $from_encoding); + $data = self::cleanup($data); } return $data; @@ -1919,7 +1953,8 @@ final class UTF8 switch (\gettype($var)) { case 'object': case 'array': - foreach ($var as $k => &$v) { + /* @phpstan-ignore-next-line | object & array are both iterable */ + foreach ($var as &$v) { $v = self::filter($v, $normalization_form, $leading_combining); } unset($v); @@ -1937,7 +1972,7 @@ final class UTF8 } else { $n = \Normalizer::normalize($var, $normalization_form); - if (isset($n[0])) { + if ($n && isset($n[0])) { $var = $n; } else { $var = self::encode('UTF-8', $var); @@ -1946,6 +1981,8 @@ final class UTF8 \assert(\is_string($var)); if ( + $n + && $var[0] >= "\x80" && isset($n[0], $leading_combining[0]) @@ -1977,7 +2014,7 @@ final class UTF8 * * EXAMPLE: * // _GET['foo'] = 'bar'; - * UTF8::filter_input(INPUT_GET, 'foo', FILTER_SANITIZE_STRING)); // 'bar' + * UTF8::filter_input(INPUT_GET, 'foo', FILTER_UNSAFE_RAW)); // 'bar' * * * @see http://php.net/manual/en/function.filter-input.php @@ -2033,43 +2070,43 @@ final class UTF8 * * EXAMPLE: * // _GET['foo'] = 'bar'; - * UTF8::filter_input_array(INPUT_GET, array('foo' => 'FILTER_SANITIZE_STRING')); // array('bar') + * UTF8::filter_input_array(INPUT_GET, array('foo' => 'FILTER_UNSAFE_RAW')); // array('bar') * * * @see http://php.net/manual/en/function.filter-input-array.php * - * @param int $type

    - * One of INPUT_GET, INPUT_POST, - * INPUT_COOKIE, INPUT_SERVER, or - * INPUT_ENV. - *

    - * @param array|null $definition [optional]

    - * An array defining the arguments. A valid key is a string - * containing a variable name and a valid value is either a filter type, or an array - * optionally specifying the filter, flags and options. If the value is an - * array, valid keys are filter which specifies the - * filter type, - * flags which specifies any flags that apply to the - * filter, and options which specifies any options that - * apply to the filter. See the example below for a better understanding. - *

    - *

    - * This parameter can be also an integer holding a filter constant. Then all values in the - * input array are filtered by this filter. - *

    - * @param bool $add_empty [optional]

    - * Add missing keys as NULL to the return value. - *

    + * @param int $type

    + * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, or + * INPUT_ENV. + *

    + * @param array|null $definition [optional]

    + * An array defining the arguments. A valid key is a string + * containing a variable name and a valid value is either a filter type, or an array + * optionally specifying the filter, flags and options. If the value is an + * array, valid keys are filter which specifies the + * filter type, + * flags which specifies any flags that apply to the + * filter, and options which specifies any options that + * apply to the filter. See the example below for a better understanding. + *

    + *

    + * This parameter can be also an integer holding a filter constant. Then all values in the + * input array are filtered by this filter. + *

    + * @param bool $add_empty [optional]

    + * Add missing keys as NULL to the return value. + *

    * * @psalm-pure * - * @return mixed - *

    - * An array containing the values of the requested variables on success, or FALSE on failure. - * An array value will be FALSE if the filter fails, or NULL if the variable is not - * set. Or if the flag FILTER_NULL_ON_FAILURE is used, it returns FALSE if the variable - * is not set and NULL if the filter fails. - *

    + * @return array|false|null + *

    + * An array containing the values of the requested variables on success, or FALSE on failure. + * An array value will be FALSE if the filter fails, or NULL if the variable is not + * set. Or if the flag FILTER_NULL_ON_FAILURE is used, it returns FALSE if the variable + * is not set and NULL if the filter fails. + *

    */ public static function filter_input_array( int $type, @@ -2085,6 +2122,7 @@ final class UTF8 $a = \filter_input_array($type, $definition, $add_empty); } + /* @phpstan-ignore-next-line | magic frm self::filter :/ */ return self::filter($a); } @@ -2104,7 +2142,7 @@ final class UTF8 * The ID of the filter to apply. The * manual page lists the available filters. *

    - * @param int|int[]|null $options [optional]

    + * @param int|int[] $options [optional]

    * Associative array of options or bitwise disjunction of flags. If filter * accepts options, flags can be provided in "flags" field of array. For * the "callback" filter, callable type should be passed. The @@ -2154,7 +2192,7 @@ final class UTF8 public static function filter_var( $variable, int $filter = \FILTER_DEFAULT, - $options = null + $options = 0 ) { /** * @psalm-suppress ImpureFunctionCall - we use func_num_args only for args count matching here @@ -2191,40 +2229,40 @@ final class UTF8 * * @see http://php.net/manual/en/function.filter-var-array.php * - * @param array $data

    - * An array with string keys containing the data to filter. - *

    - * @param array|int|null $definition [optional]

    - * An array defining the arguments. A valid key is a string - * containing a variable name and a valid value is either a - * filter type, or an - * array optionally specifying the filter, flags and options. - * If the value is an array, valid keys are filter - * which specifies the filter type, - * flags which specifies any flags that apply to the - * filter, and options which specifies any options that - * apply to the filter. See the example below for a better understanding. - *

    - *

    - * This parameter can be also an integer holding a filter constant. Then all values - * in the input array are filtered by this filter. - *

    - * @param bool $add_empty [optional]

    - * Add missing keys as NULL to the return value. - *

    + * @param array $data

    + * An array with string keys containing the data to filter. + *

    + * @param array|int $definition [optional]

    + * An array defining the arguments. A valid key is a string + * containing a variable name and a valid value is either a + * filter type, or an + * array optionally specifying the filter, flags and options. + * If the value is an array, valid keys are filter + * which specifies the filter type, + * flags which specifies any flags that apply to the + * filter, and options which specifies any options that + * apply to the filter. See the example below for a better understanding. + *

    + *

    + * This parameter can be also an integer holding a filter constant. Then all values + * in the input array are filtered by this filter. + *

    + * @param bool $add_empty [optional]

    + * Add missing keys as NULL to the return value. + *

    * * @psalm-pure * - * @return mixed - *

    - * An array containing the values of the requested variables on success, or FALSE on failure. - * An array value will be FALSE if the filter fails, or NULL if the variable is not - * set. - *

    + * @return array|false|null + *

    + * An array containing the values of the requested variables on success, or FALSE on failure. + * An array value will be FALSE if the filter fails, or NULL if the variable is not + * set. + *

    */ public static function filter_var_array( array $data, - $definition = null, + $definition = 0, bool $add_empty = true ) { /** @@ -2236,6 +2274,7 @@ final class UTF8 $a = \filter_var_array($data, $definition, $add_empty); } + /* @phpstan-ignore-next-line | magic frm self::filter :/ */ return self::filter($a); } @@ -2257,20 +2296,29 @@ final class UTF8 /** * Returns the first $n characters of the string. * - * @param string $str

    The input string.

    - * @param int $n

    Number of characters to retrieve from the start.

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    + * @param string $str

    The input string.

    + * @param int<1, max> $n

    Number of characters to retrieve from the start.

    + * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    * * @psalm-pure * * @return string + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function first_char( string $str, int $n = 1, string $encoding = 'UTF-8' ): string { - if ($str === '' || $n <= 0) { + if ( + $str === '' + || + /* @phpstan-ignore-next-line | we do not trust the phpdoc check */ + $n <= 0 + ) { return ''; } @@ -2341,7 +2389,7 @@ final class UTF8 self::$BROKEN_UTF8_FIX = self::getData('utf8_fix'); } - $BROKEN_UTF8_TO_UTF8_KEYS_CACHE = \array_keys(self::$BROKEN_UTF8_FIX); + $BROKEN_UTF8_TO_UTF8_KEYS_CACHE = \array_keys(self::$BROKEN_UTF8_FIX ?: []); $BROKEN_UTF8_TO_UTF8_VALUES_CACHE = self::$BROKEN_UTF8_FIX; } @@ -2360,15 +2408,17 @@ final class UTF8 * @psalm-pure * * @return string|string[] - * Will return the fixed input-"array" or - * the fixed input-"string" + *

    Will return the fixed input-"array" or + * the fixed input-"string".

    * - * @psalm-suppress InvalidReturnType + * @template TFixUtf8 as string|string[] + * @phpstan-param TFixUtf8 $str + * @phpstan-return TFixUtf8 */ public static function fix_utf8($str) { if (\is_array($str)) { - foreach ($str as $k => &$v) { + foreach ($str as &$v) { $v = self::fix_utf8($v); } unset($v); @@ -2379,7 +2429,7 @@ final class UTF8 return $str; } - $str = (string) $str; + $str = (string) $str; /* @phpstan-ignore-line | TFixUtf8 is string here */ $last = ''; while ($last !== $str) { $last = $str; @@ -2412,7 +2462,6 @@ final class UTF8 public static function getCharDirection(string $char): string { if (self::$SUPPORT['intlChar'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ $tmp_return = \IntlChar::charDirection($char); // from "IntlChar"-Class @@ -2507,7 +2556,7 @@ final class UTF8 ($c >= 0x10b00 && $c <= 0x10b35) || ($c >= 0x10b40 && $c <= 0x10b55) || ($c >= 0x10b58 && $c <= 0x10b72) || - ($c >= 0x10b78 && $c <= 0x10b7f) + ($c >= 0x10b78) ) { return 'RTL'; } @@ -2547,15 +2596,12 @@ final class UTF8 * Warning: this method only works for some file-types (png, jpg) * if you need more supported types, please use e.g. "finfo" * - * @param string $str - * @param array $fallback

    with this keys: 'ext', 'mime', 'type' + * @param string $str + * @param array{ext: null|string, mime: null|string, type: null|string} $fallback + * + * @return array{ext: null|string, mime: null|string, type: null|string} * * @psalm-pure - * - * @return null[]|string[] - *

    with this keys: 'ext', 'mime', 'type'

    - * - * @phpstan-param array{ext: null|string, mime: null|string, type: null|string} $fallback */ public static function get_file_type( string $str, @@ -2580,14 +2626,9 @@ final class UTF8 $str_info = \unpack('C2chars', $str_info); - /** @noinspection PhpSillyAssignmentInspection */ - /** @var array|false $str_info - needed for PhpStan (stubs error) */ - $str_info = $str_info; - if ($str_info === false) { return $fallback; } - /** @noinspection OffsetOperationsInspection */ $type_code = (int) ($str_info['chars1'] . $str_info['chars2']); // DEBUG @@ -2626,11 +2667,15 @@ final class UTF8 } /** - * @param int $length

    Length of the random string.

    - * @param string $possible_chars [optional]

    Characters string for the random selection.

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    + * @param int<1, max> $length

    Length of the random string.

    + * @param string $possible_chars [optional]

    Characters string for the random selection.

    + * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    * * @return string + * + * @template T as string + * @phpstan-param T $possible_chars + * @phpstan-return (T is non-empty-string ? non-empty-string : '') */ public static function get_random_string( int $length, @@ -2655,10 +2700,10 @@ final class UTF8 try { $rand_int = \random_int(0, $max_length - 1); } catch (\Exception $e) { - /** @noinspection RandomApiMigrationInspection */ $rand_int = \mt_rand(0, $max_length - 1); } $char = \mb_substr($possible_chars, $rand_int, 1); + /* @phpstan-ignore-next-line | "false" was at least the return type in the past, or? */ if ($char !== false) { $str .= $char; ++$i; @@ -2676,7 +2721,6 @@ final class UTF8 try { $rand_int = \random_int(0, $max_length - 1); } catch (\Exception $e) { - /** @noinspection RandomApiMigrationInspection */ $rand_int = \mt_rand(0, $max_length - 1); } $char = self::substr($possible_chars, $rand_int, 1, $encoding); @@ -2694,14 +2738,13 @@ final class UTF8 * @param int|string $extra_entropy [optional]

    Extra entropy via a string or int value.

    * @param bool $use_md5 [optional]

    Return the unique identifier as md5-hash? Default: true

    * - * @return string + * @return non-empty-string */ public static function get_unique_string($extra_entropy = '', bool $use_md5 = true): string { try { $rand_int = \random_int(0, \mt_getrandmax()); } catch (\Exception $e) { - /** @noinspection RandomApiMigrationInspection */ $rand_int = \mt_rand(0, \mt_getrandmax()); } @@ -2720,23 +2763,6 @@ final class UTF8 return $unique_string; } - /** - * alias for "UTF8::string_has_bom()" - * - * @param string $str - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::string_has_bom() - * @deprecated

    please use "UTF8::string_has_bom()"

    - */ - public static function hasBom(string $str): bool - { - return self::string_has_bom($str); - } - /** * Returns true if the string contains a lower case char, false otherwise. * @@ -2750,7 +2776,6 @@ final class UTF8 public static function has_lowercase(string $str): bool { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \mb_ereg_match('.*[[:lower:]]', $str); } @@ -2770,7 +2795,6 @@ final class UTF8 public static function has_whitespace(string $str): bool { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \mb_ereg_match('.*[[:space:]]', $str); } @@ -2790,7 +2814,6 @@ final class UTF8 public static function has_uppercase(string $str): bool { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \mb_ereg_match('.*[[:upper:]]', $str); } @@ -2808,7 +2831,8 @@ final class UTF8 * * @psalm-pure * - * @return false|string one single UTF-8 character + * @return string + *

    One single UTF-8 character.

    */ public static function hex_to_chr(string $hexdec) { @@ -2846,28 +2870,6 @@ final class UTF8 return false; } - /** - * alias for "UTF8::html_entity_decode()" - * - * @param string $str - * @param int|null $flags - * @param string $encoding - * - * @psalm-pure - * - * @return string - * - * @see UTF8::html_entity_decode() - * @deprecated

    please use "UTF8::html_entity_decode()"

    - */ - public static function html_decode( - string $str, - int $flags = null, - string $encoding = 'UTF-8' - ): string { - return self::html_entity_decode($str, $flags, $encoding); - } - /** * Converts a UTF-8 string to a series of HTML numbered entities. * @@ -2881,7 +2883,12 @@ final class UTF8 * * @psalm-pure * - * @return string HTML numbered entities + * @return string + *

    HTML numbered entities.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function html_encode( string $str, @@ -3012,7 +3019,12 @@ final class UTF8 * * @psalm-pure * - * @return string the decoded string + * @return string + *

    The decoded string.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function html_entity_decode( string $str, @@ -3035,7 +3047,6 @@ final class UTF8 $flags = \ENT_QUOTES | \ENT_HTML5; } - /** @noinspection InArrayCanBeUsedInspection */ if ( $encoding !== 'UTF-8' && @@ -3046,7 +3057,7 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::html_entity_decode() without mbstring cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -3359,13 +3370,17 @@ final class UTF8 * * @psalm-pure * - * @return string the converted string. - *

    + * @return string + *

    The converted string.

    *

    * If the input string contains an invalid code unit * sequence within the given encoding an empty string * will be returned, unless either the ENT_IGNORE or - * ENT_SUBSTITUTE flags are set + * ENT_SUBSTITUTE flags are set.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function htmlspecialchars( string $str, @@ -3400,25 +3415,6 @@ final class UTF8 return \extension_loaded('iconv'); } - /** - * alias for "UTF8::decimal_to_chr()" - * - * @param int|string $int - * - * @phpstan-param int|numeric-string $int - * - * @psalm-pure - * - * @return string - * - * @see UTF8::decimal_to_chr() - * @deprecated

    please use "UTF8::decimal_to_chr()"

    - */ - public static function int_to_chr($int): string - { - return self::decimal_to_chr($int); - } - /** * Converts Integer to hexadecimal U+xxxx code point representation. * @@ -3472,165 +3468,6 @@ final class UTF8 return \extension_loaded('intl'); } - /** - * alias for "UTF8::is_ascii()" - * - * @param string $str - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::is_ascii() - * @deprecated

    please use "UTF8::is_ascii()"

    - */ - public static function isAscii(string $str): bool - { - return ASCII::is_ascii($str); - } - - /** - * alias for "UTF8::is_base64()" - * - * @param string $str - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::is_base64() - * @deprecated

    please use "UTF8::is_base64()"

    - */ - public static function isBase64($str): bool - { - return self::is_base64($str); - } - - /** - * alias for "UTF8::is_binary()" - * - * @param int|string $str - * @param bool $strict - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::is_binary() - * @deprecated

    please use "UTF8::is_binary()"

    - */ - public static function isBinary($str, bool $strict = false): bool - { - return self::is_binary($str, $strict); - } - - /** - * alias for "UTF8::is_bom()" - * - * @param string $utf8_chr - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::is_bom() - * @deprecated

    please use "UTF8::is_bom()"

    - */ - public static function isBom(string $utf8_chr): bool - { - return self::is_bom($utf8_chr); - } - - /** - * alias for "UTF8::is_html()" - * - * @param string $str - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::is_html() - * @deprecated

    please use "UTF8::is_html()"

    - */ - public static function isHtml(string $str): bool - { - return self::is_html($str); - } - - /** - * alias for "UTF8::is_json()" - * - * @param string $str - * - * @return bool - * - * @see UTF8::is_json() - * @deprecated

    please use "UTF8::is_json()"

    - */ - public static function isJson(string $str): bool - { - return self::is_json($str); - } - - /** - * alias for "UTF8::is_utf16()" - * - * @param string $str - * - * @psalm-pure - * - * @return false|int - * false if is't not UTF16,
    - * 1 for UTF-16LE,
    - * 2 for UTF-16BE - * - * @see UTF8::is_utf16() - * @deprecated

    please use "UTF8::is_utf16()"

    - */ - public static function isUtf16($str) - { - return self::is_utf16($str); - } - - /** - * alias for "UTF8::is_utf32()" - * - * @param string $str - * - * @psalm-pure - * - * @return false|int - * false if is't not UTF16, - * 1 for UTF-32LE, - * 2 for UTF-32BE - * - * @see UTF8::is_utf32() - * @deprecated

    please use "UTF8::is_utf32()"

    - */ - public static function isUtf32($str) - { - return self::is_utf32($str); - } - - /** - * alias for "UTF8::is_utf8()" - * - * @param string $str - * @param bool $strict - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::is_utf8() - * @deprecated

    please use "UTF8::is_utf8()"

    - */ - public static function isUtf8($str, bool $strict = false): bool - { - return self::is_utf8($str, $strict); - } - /** * Returns true if the string contains only alphabetic chars, false otherwise. * @@ -3644,7 +3481,6 @@ final class UTF8 public static function is_alpha(string $str): bool { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \mb_ereg_match('^[[:alpha:]]*$', $str); } @@ -3664,7 +3500,6 @@ final class UTF8 public static function is_alphanumeric(string $str): bool { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \mb_ereg_match('^[[:alnum:]]*$', $str); } @@ -3782,10 +3617,12 @@ final class UTF8 return true; } - $test_length = \strlen($input); - $test_null_counting = \substr_count($input, "\x0", 0, $test_length); - if (($test_null_counting / $test_length) > 0.25) { - return true; + if (!$strict) { + $test_length = \strlen($input); + $test_null_counting = \substr_count($input, "\x0", 0, $test_length); + if (($test_null_counting / $test_length) > 0.25) { + return true; + } } if ($strict) { @@ -3794,7 +3631,6 @@ final class UTF8 } /** - * @noinspection PhpComposerExtensionStubsInspection * @psalm-suppress ImpureMethodCall - it will return the same result for the same file ... */ $finfo_encoding = (new \finfo(\FILEINFO_MIME_ENCODING))->buffer($input); @@ -3846,7 +3682,6 @@ final class UTF8 public static function is_blank(string $str): bool { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \mb_ereg_match('^[[:space:]]*$', $str); } @@ -3885,7 +3720,7 @@ final class UTF8 * A variable is considered empty if it does not exist or if its value equals FALSE. * empty() does not generate a warning if the variable does not exist. * - * @param array|float|int|string $str + * @param array|float|int|string $str * * @psalm-pure * @@ -3910,7 +3745,6 @@ final class UTF8 public static function is_hexadecimal(string $str): bool { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \mb_ereg_match('^[[:xdigit:]]*$', $str); } @@ -3983,21 +3817,17 @@ final class UTF8 } $regex = '/^(?:http(?:s)?:\/\/).*?(?:\.localhost)/iu'; - /** @noinspection BypassedUrlValidationInspection */ if (\preg_match($regex, $url)) { return false; } } // INFO: this is needed for e.g. "http://müller.de/" (internationalized domain names) and non ASCII-parameters - /** @noinspection SuspiciousAssignmentsInspection - false-positive - https://github.com/kalessil/phpinspectionsea/issues/1500 */ $regex = '/^(?:http(?:s)?:\\/\\/)(?:[\p{L}0-9][\p{L}0-9_-]*(?:\\.[\p{L}0-9][\p{L}0-9_-]*))(?:\\d+)?(?:\\/\\.*)?/iu'; - /** @noinspection BypassedUrlValidationInspection */ if (\preg_match($regex, $url)) { return true; } - /** @noinspection BypassedUrlValidationInspection */ return \filter_var($url, \FILTER_VALIDATE_URL) !== false; } @@ -4038,7 +3868,6 @@ final class UTF8 return false; } - /** @noinspection PhpComposerExtensionStubsInspection */ return \json_last_error() === \JSON_ERROR_NONE; } @@ -4053,7 +3882,6 @@ final class UTF8 public static function is_lowercase(string $str): bool { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \mb_ereg_match('^[[:lower:]]*$', $str); } @@ -4080,7 +3908,7 @@ final class UTF8 /** @noinspection UnserializeExploitsInspection */ return $str === 'b:0;' || - @\unserialize($str) !== false; + @\unserialize($str, []) !== false; } /** @@ -4097,7 +3925,6 @@ final class UTF8 public static function is_uppercase(string $str): bool { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ return \mb_ereg_match('^[[:upper:]]*$', $str); } @@ -4131,6 +3958,11 @@ final class UTF8 $str = (string) $str; $str_chars = []; + // fix for the "binary"-check + if ($check_if_string_is_binary !== false && self::string_has_bom($str)) { + $check_if_string_is_binary = false; + } + if ( $check_if_string_is_binary && @@ -4141,7 +3973,7 @@ final class UTF8 if (self::$SUPPORT['mbstring'] === false) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::is_utf16() without mbstring may did not work correctly', \E_USER_WARNING); } @@ -4154,12 +3986,7 @@ final class UTF8 $test2 = \mb_convert_encoding($test, 'UTF-16LE', 'UTF-8'); $test3 = \mb_convert_encoding($test2, 'UTF-8', 'UTF-16LE'); if ($test3 === $test) { - /** - * @psalm-suppress RedundantCondition - */ - if ($str_chars === []) { - $str_chars = self::count_chars($str, true, false); - } + $str_chars = self::count_chars($str, true, false); foreach (self::count_chars($test3) as $test3char => &$test3charEmpty) { if (\in_array($test3char, $str_chars, true)) { ++$maybe_utf16le; @@ -4225,6 +4052,11 @@ final class UTF8 $str = (string) $str; $str_chars = []; + // fix for the "binary"-check + if ($check_if_string_is_binary !== false && self::string_has_bom($str)) { + $check_if_string_is_binary = false; + } + if ( $check_if_string_is_binary && @@ -4235,7 +4067,7 @@ final class UTF8 if (self::$SUPPORT['mbstring'] === false) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::is_utf32() without mbstring may did not work correctly', \E_USER_WARNING); } @@ -4248,12 +4080,7 @@ final class UTF8 $test2 = \mb_convert_encoding($test, 'UTF-32LE', 'UTF-8'); $test3 = \mb_convert_encoding($test2, 'UTF-8', 'UTF-32LE'); if ($test3 === $test) { - /** - * @psalm-suppress RedundantCondition - */ - if ($str_chars === []) { - $str_chars = self::count_chars($str, true, false); - } + $str_chars = self::count_chars($str, true, false); foreach (self::count_chars($test3) as $test3char => &$test3charEmpty) { if (\in_array($test3char, $str_chars, true)) { ++$maybe_utf32le; @@ -4374,7 +4201,10 @@ final class UTF8 throw new \RuntimeException('ext-json: is not installed'); } - /** @noinspection PhpComposerExtensionStubsInspection */ + if ($depth < 1) { + $depth = 1; + } + return \json_decode($json, $assoc, $depth, $options); } @@ -4382,7 +4212,7 @@ final class UTF8 * (PHP 5 >= 5.2.0, PECL json >= 1.2.0)
    * Returns the JSON representation of a value. * - * EXAMPLE: UTF8::json_enocde(array(1, '¥', 'ä')); // '[1,"\u00a5","\u00e4"]' + * EXAMPLE: UTF8::json_encode(array(1, '¥', 'ä')); // '[1,"\u00a5","\u00e4"]' * * @see http://php.net/manual/en/function.json-encode.php * @@ -4417,8 +4247,8 @@ final class UTF8 * @psalm-pure * * @return false|string - * A JSON encoded string on success or
    - * FALSE on failure + *

    A JSON encoded string on success or
    + * FALSE on failure.

    */ public static function json_encode($value, int $options = 0, int $depth = 512) { @@ -4428,7 +4258,10 @@ final class UTF8 throw new \RuntimeException('ext-json: is not installed'); } - /** @noinspection PhpComposerExtensionStubsInspection */ + if ($depth < 1) { + $depth = 1; + } + return \json_encode($value, $options, $depth); } @@ -4462,7 +4295,8 @@ final class UTF8 * * @psalm-pure * - * @return string the resulting string + * @return string + *

    The resulting string.

    */ public static function lcfirst( string $str, @@ -4510,38 +4344,6 @@ final class UTF8 return $str_part_one . $str_part_two; } - /** - * alias for "UTF8::lcfirst()" - * - * @param string $str - * @param string $encoding - * @param bool $clean_utf8 - * @param string|null $lang - * @param bool $try_to_keep_the_string_length - * - * @psalm-pure - * - * @return string - * - * @see UTF8::lcfirst() - * @deprecated

    please use "UTF8::lcfirst()"

    - */ - public static function lcword( - string $str, - string $encoding = 'UTF-8', - bool $clean_utf8 = false, - string $lang = null, - bool $try_to_keep_the_string_length = false - ): string { - return self::lcfirst( - $str, - $encoding, - $clean_utf8, - $lang, - $try_to_keep_the_string_length - ); - } - /** * Lowercase for all words in the string. * @@ -4597,35 +4399,34 @@ final class UTF8 } /** - * alias for "UTF8::lcfirst()" + * Calculate Levenshtein distance between two strings. * - * @param string $str - * @param string $encoding - * @param bool $clean_utf8 - * @param string|null $lang - * @param bool $try_to_keep_the_string_length + * For better performance, in a real application with a single input string + * matched against many strings from a database, you will probably want to pre- + * encode the input only once and use \levenshtein(). * - * @psalm-pure + * Source: https://github.com/KEINOS/mb_levenshtein * - * @return string + * @see https://www.php.net/manual/en/function.levenshtein * - * @see UTF8::lcfirst() - * @deprecated

    please use "UTF8::lcfirst()"

    + * @param string $str1

    One of the strings being evaluated for Levenshtein distance.

    + * @param string $str2

    One of the strings being evaluated for Levenshtein distance.

    + * @param int $insertionCost [optional]

    Defines the cost of insertion.

    + * @param int $replacementCost [optional]

    Defines the cost of replacement.

    + * @param int $deletionCost [optional]

    Defines the cost of deletion.

    + * + * @return int */ - public static function lowerCaseFirst( - string $str, - string $encoding = 'UTF-8', - bool $clean_utf8 = false, - string $lang = null, - bool $try_to_keep_the_string_length = false - ): string { - return self::lcfirst( - $str, - $encoding, - $clean_utf8, - $lang, - $try_to_keep_the_string_length - ); + public static function levenshtein( + string $str1, + string $str2, + int $insertionCost = 1, + int $replacementCost = 1, + int $deletionCost = 1 + ): int { + $result = ASCII::to_ascii_remap($str1, $str2); + + return \levenshtein($result[0], $result[1], $insertionCost, $replacementCost, $deletionCost); } /** @@ -4650,18 +4451,17 @@ final class UTF8 if ($chars !== null) { /** @noinspection PregQuoteUsageInspection */ $chars = \preg_quote($chars); - $pattern = "^[${chars}]+"; + $pattern = "^[{$chars}]+"; } else { $pattern = '^[\\s]+'; } - /** @noinspection PhpComposerExtensionStubsInspection */ return (string) \mb_ereg_replace($pattern, '', $str); } if ($chars !== null) { $chars = \preg_quote($chars, '/'); - $pattern = "^[${chars}]+"; + $pattern = "^[{$chars}]+"; } else { $pattern = '^[\\s]+'; } @@ -4674,7 +4474,7 @@ final class UTF8 * * EXAMPLE: UTF8::max('abc-äöü-中文空白'); // 'ø' * - * @param array|string $arg

    A UTF-8 encoded string or an array of such strings.

    + * @param string|string[] $arg

    A UTF-8 encoded string or an array of such strings.

    * * @psalm-pure * @@ -4708,6 +4508,8 @@ final class UTF8 * * @return int *

    Max byte lengths of the given chars.

    + * + * @phpstan-return 0|1|2|3|4 */ public static function max_chr_width(string $str): int { @@ -4762,24 +4564,6 @@ final class UTF8 return self::chr((int) $codepoint_min); } - /** - * alias for "UTF8::normalize_encoding()" - * - * @param mixed $encoding - * @param mixed $fallback - * - * @psalm-pure - * - * @return mixed - * - * @see UTF8::normalize_encoding() - * @deprecated

    please use "UTF8::normalize_encoding()"

    - */ - public static function normalizeEncoding($encoding, $fallback = '') - { - return self::normalize_encoding($encoding, $fallback); - } - /** * Normalize the encoding-"name" input. * @@ -4845,11 +4629,8 @@ final class UTF8 return 'ISO-8859-1'; } - if ( - $encoding === '1' // only a fallback, for non "strict_types" usage ... - || - $encoding === '0' // only a fallback, for non "strict_types" usage ... - ) { + // only a fallback, for non "strict_types" usage ... + if ($encoding === '1') { return $fallback; } @@ -5065,7 +4846,6 @@ final class UTF8 // if (self::$SUPPORT['intlChar'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ $code = \IntlChar::ord($chr); if ($code) { return $CHAR_CACHE[$cache_key] = $code; @@ -5076,30 +4856,22 @@ final class UTF8 // fallback via vanilla php // - /** @noinspection CallableParameterUseCaseInTypeContextInspection - FP */ $chr = \unpack('C*', (string) \substr($chr, 0, 4)); - /** @noinspection OffsetOperationsInspection */ + /** @noinspection PhpSillyAssignmentInspection - hack for phpstan */ + /** @var int[] $chr - "unpack": only false if the format string contains errors */ + $chr = $chr; $code = $chr ? $chr[1] : 0; - /** @noinspection OffsetOperationsInspection */ if ($code >= 0xF0 && isset($chr[4])) { - /** @noinspection UnnecessaryCastingInspection */ - /** @noinspection OffsetOperationsInspection */ - return $CHAR_CACHE[$cache_key] = (int) ((($code - 0xF0) << 18) + (($chr[2] - 0x80) << 12) + (($chr[3] - 0x80) << 6) + $chr[4] - 0x80); + return $CHAR_CACHE[$cache_key] = ((($code - 0xF0) << 18) + (($chr[2] - 0x80) << 12) + (($chr[3] - 0x80) << 6) + $chr[4] - 0x80); } - /** @noinspection OffsetOperationsInspection */ if ($code >= 0xE0 && isset($chr[3])) { - /** @noinspection UnnecessaryCastingInspection */ - /** @noinspection OffsetOperationsInspection */ - return $CHAR_CACHE[$cache_key] = (int) ((($code - 0xE0) << 12) + (($chr[2] - 0x80) << 6) + $chr[3] - 0x80); + return $CHAR_CACHE[$cache_key] = ((($code - 0xE0) << 12) + (($chr[2] - 0x80) << 6) + $chr[3] - 0x80); } - /** @noinspection OffsetOperationsInspection */ if ($code >= 0xC0 && isset($chr[2])) { - /** @noinspection UnnecessaryCastingInspection */ - /** @noinspection OffsetOperationsInspection */ - return $CHAR_CACHE[$cache_key] = (int) ((($code - 0xC0) << 6) + $chr[2] - 0x80); + return $CHAR_CACHE[$cache_key] = ((($code - 0xC0) << 6) + $chr[2] - 0x80); } return $CHAR_CACHE[$cache_key] = $code; @@ -5118,9 +4890,9 @@ final class UTF8 * * @see http://php.net/manual/en/function.parse-str.php * - * @param string $str

    The input string.

    - * @param array $result

    The result will be returned into this reference parameter.

    - * @param bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the string.

    + * @param string $str

    The input string.

    + * @param array $result

    The result will be returned into this reference parameter.

    + * @param bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the string.

    * * @psalm-pure * @@ -5183,7 +4955,7 @@ final class UTF8 * * @psalm-pure * - * @return string[] + * @return list */ public static function range( $var1, @@ -5200,6 +4972,7 @@ final class UTF8 /** * @psalm-suppress RedundantConditionGivenDocblockType * @psalm-suppress DocblockTypeContradiction + * @phpstan-ignore-next-line | ignore wrong inputs */ if (!\is_numeric($step)) { throw new \InvalidArgumentException('$step need to be a number, type given: ' . \gettype($step)); @@ -5220,11 +4993,10 @@ final class UTF8 $is_digit = false; $is_xdigit = false; - /** @noinspection PhpComposerExtensionStubsInspection */ if ($use_ctype && \ctype_digit((string) $var1) && \ctype_digit((string) $var2)) { $is_digit = true; $start = (int) $var1; - } /** @noinspection PhpComposerExtensionStubsInspection */ elseif ($use_ctype && \ctype_xdigit($var1) && \ctype_xdigit($var2)) { + } elseif ($use_ctype && \ctype_xdigit($var1) && \ctype_xdigit($var2)) { $is_xdigit = true; $start = (int) self::hex_to_int((string) $var1); } elseif (!$use_ctype && \is_numeric($var1)) { @@ -5259,6 +5031,69 @@ final class UTF8 return $array; } + /** + * Get data from an array via array like string. + * + * EXAMPLE: $array['foo'][123] = 'lall'; UTF8::getUrlParamFromArray('foo[123]', $array); // 'lall' + * + * @param array $data + * + * @return mixed + */ + public static function getUrlParamFromArray(string $param, array $data) + { + /** + * @param array $searchArray + * @param array $array + * + * @return mixed + */ + $getUrlArgFromArrayHelper = static function (array $searchArray, array $array) use (&$getUrlArgFromArrayHelper) { + foreach ($searchArray as $key => $value) { + if (isset($array[$key])) { + if (\is_array($value) && \is_array($array[$key])) { + return $getUrlArgFromArrayHelper($value, $array[$key]); + } + + return $array[$key]; + } + } + + return null; + }; + + /** + * @param string $string + * @return array|null + */ + $getUrlKeyArgsFromString = static function (string $string) { + if (!self::str_contains($string, '?')) { + $string = '?' . $string; + } + + $args = parse_url($string, PHP_URL_QUERY); + if ($args) { + $query = []; + parse_str($args, $query); + + return $query; + } + + return null; + }; + + if (isset($data[$param])) { + return $data[$param]; + } + + $paramKeys = $getUrlKeyArgsFromString($param); + if ($paramKeys !== null) { + return $getUrlArgFromArrayHelper($paramKeys, $data); + } + + return null; + } + /** * Multi decode HTML entity + fix urlencoded-win1252-chars. * @@ -5282,6 +5117,10 @@ final class UTF8 * * @return string *

    The decoded URL, as a string.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function rawurldecode(string $str, bool $multi_decode = true): string { @@ -5356,23 +5195,6 @@ final class UTF8 ); } - /** - * alias for "UTF8::remove_bom()" - * - * @param string $str - * - * @psalm-pure - * - * @return string - * - * @see UTF8::remove_bom() - * @deprecated

    please use "UTF8::remove_bom()"

    - */ - public static function removeBOM(string $str): string - { - return self::remove_bom($str); - } - /** * Remove the BOM from UTF-8 / UTF-16 / UTF-32 strings. * @@ -5400,7 +5222,7 @@ final class UTF8 return ''; } - $str_length -= (int) $bom_byte_length; + $str_length -= $bom_byte_length; $str = (string) $str_tmp; } @@ -5430,6 +5252,7 @@ final class UTF8 /** * @psalm-suppress RedundantConditionGivenDocblockType + * @phpstan-ignore-next-line | ignore wrong inputs */ if (\is_array($what)) { foreach ($what as $item) { @@ -5593,6 +5416,87 @@ final class UTF8 return $str; } + /** + * Returns a new string with the suffix $substring removed, if present and case-insensitive. + * + * @param string $str + * @param string $substring

    The suffix to remove.

    + * @param string $encoding [optional]

    Default: 'UTF-8'

    + * + * @psalm-pure + * + * @return string + *

    A string having a $str without the suffix $substring.

    + */ + public static function remove_iright( + string $str, + string $substring, + string $encoding = 'UTF-8' + ): string { + if ($substring && self::strtoupper(\substr($str, -\strlen($substring)), $encoding) === self::strtoupper($substring, $encoding)) { + if ($encoding === 'UTF-8') { + return (string) \mb_substr( + $str, + 0, + (int) \mb_strlen($str) - (int) \mb_strlen($substring) + ); + } + + $encoding = self::normalize_encoding($encoding, 'UTF-8'); + + return (string) self::substr( + $str, + 0, + (int) self::strlen($str, $encoding) - (int) self::strlen($substring, $encoding), + $encoding + ); + } + + return $str; + } + + /** + * Returns a new string with the prefix $substring removed, if present and case-insensitive. + * + * @param string $str

    The input string.

    + * @param string $substring

    The prefix to remove.

    + * @param string $encoding [optional]

    Default: 'UTF-8'

    + * + * @psalm-pure + * + * @return string + *

    A string without the prefix $substring.

    + */ + public static function remove_ileft( + string $str, + string $substring, + string $encoding = 'UTF-8' + ): string { + if ( + $substring + && + \strpos(self::strtoupper($str, $encoding), self::strtoupper($substring, $encoding)) === 0 + ) { + if ($encoding === 'UTF-8') { + return (string) \mb_substr( + $str, + (int) \mb_strlen($substring) + ); + } + + $encoding = self::normalize_encoding($encoding, 'UTF-8'); + + return (string) self::substr( + $str, + (int) self::strlen($substring, $encoding), + null, + $encoding + ); + } + + return $str; + } + /** * Replaces all occurrences of $search in $str by $replacement. * @@ -5622,10 +5526,10 @@ final class UTF8 /** * Replaces all occurrences of $search in $str by $replacement. * - * @param string $str

    The input string.

    - * @param array $search

    The elements to search for.

    - * @param array|string $replacement

    The string to replace with.

    - * @param bool $case_sensitive [optional]

    Whether or not to enforce case-sensitivity. Default: true

    + * @param string $str

    The input string.

    + * @param string[] $search

    The elements to search for.

    + * @param string|string[] $replacement

    The string to replace with.

    + * @param bool $case_sensitive [optional]

    Whether or not to enforce case-sensitivity. Default: true

    * * @psalm-pure * @@ -5728,18 +5632,17 @@ final class UTF8 if ($chars !== null) { /** @noinspection PregQuoteUsageInspection */ $chars = \preg_quote($chars); - $pattern = "[${chars}]+$"; + $pattern = "[{$chars}]+$"; } else { $pattern = '[\\s]+$'; } - /** @noinspection PhpComposerExtensionStubsInspection */ return (string) \mb_ereg_replace($pattern, '', $str); } if ($chars !== null) { $chars = \preg_quote($chars, '/'); - $pattern = "[${chars}]+$"; + $pattern = "[{$chars}]+$"; } else { $pattern = '[\\s]+$'; } @@ -5755,6 +5658,8 @@ final class UTF8 * @psalm-pure * * @return string|void + * + * @phpstan-return ($useEcho is true ? void : string) */ public static function showSupport(bool $useEcho = true) { @@ -5762,7 +5667,6 @@ final class UTF8 $html = ''; $html .= '
    ';
    -        /** @noinspection AlterInForeachInspection */
             foreach (self::$SUPPORT as $key => &$value) {
                 $html .= $key . ' - ' . \print_r($value, true) . "\n
    "; } @@ -5788,6 +5692,10 @@ final class UTF8 * * @return string *

    The HTML numbered entity for the given character.

    + * + * @template T as string + * @phpstan-param T $char + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function single_chr_html_encode( string $char, @@ -5810,12 +5718,16 @@ final class UTF8 } /** - * @param string $str - * @param int $tab_length + * @param string $str + * @param int<1, max> $tab_length * * @psalm-pure * * @return string + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function spaces_to_tabs(string $str, int $tab_length = 4): string { @@ -5830,47 +5742,6 @@ final class UTF8 return \str_replace($tab, "\t", $str); } - /** - * alias for "UTF8::str_split()" - * - * @param int|string $str - * @param int $length - * @param bool $clean_utf8 - * - * @psalm-pure - * - * @return string[] - * - * @see UTF8::str_split() - * @deprecated

    please use "UTF8::str_split()"

    - */ - public static function split( - $str, - int $length = 1, - bool $clean_utf8 = false - ): array { - /** @var string[] */ - return self::str_split($str, $length, $clean_utf8); - } - - /** - * alias for "UTF8::str_starts_with()" - * - * @param string $haystack - * @param string $needle - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::str_starts_with() - * @deprecated

    please use "UTF8::str_starts_with()"

    - */ - public static function str_begins(string $haystack, string $needle): bool - { - return self::str_starts_with($haystack, $needle); - } - /** * Returns a camelCase version of the string. Trims surrounding spaces, * capitalizes letters following digits, spaces, dashes and underscores, @@ -6020,12 +5891,12 @@ final class UTF8 /** * Returns true if the string contains all $needles, false otherwise. By - * default the comparison is case-sensitive, but can be made insensitive by + * default, the comparison is case-sensitive, but can be made insensitive by * setting $case_sensitive to false. * - * @param string $haystack

    The input string.

    - * @param array $needles

    SubStrings to look for.

    - * @param bool $case_sensitive [optional]

    Whether or not to enforce case-sensitivity. Default: true

    + * @param string $haystack

    The input string.

    + * @param scalar[] $needles

    SubStrings to look for.

    + * @param bool $case_sensitive [optional]

    Whether or not to enforce case-sensitivity. Default: true

    * * @psalm-pure * @@ -6041,16 +5912,16 @@ final class UTF8 return false; } - /** @noinspection LoopWhichDoesNotLoopInspection */ foreach ($needles as &$needle) { - if ($case_sensitive) { - /** @noinspection NestedPositiveIfStatementsInspection */ - if (!$needle || \strpos($haystack, $needle) === false) { - return false; - } + if ( + $case_sensitive + && + (!$needle || \strpos($haystack, (string)$needle) === false) + ) { + return false; } - if (!$needle || \mb_stripos($haystack, $needle) === false) { + if (!$needle || \mb_stripos($haystack, (string) $needle) === false) { return false; } } @@ -6063,9 +5934,9 @@ final class UTF8 * default the comparison is case-sensitive, but can be made insensitive by * setting $case_sensitive to false. * - * @param string $haystack

    The input string.

    - * @param array $needles

    SubStrings to look for.

    - * @param bool $case_sensitive [optional]

    Whether or not to enforce case-sensitivity. Default: true

    + * @param string $haystack

    The input string.

    + * @param scalar[] $needles

    SubStrings to look for.

    + * @param bool $case_sensitive [optional]

    Whether or not to enforce case-sensitivity. Default: true

    * * @psalm-pure * @@ -6081,21 +5952,20 @@ final class UTF8 return false; } - /** @noinspection LoopWhichDoesNotLoopInspection */ foreach ($needles as &$needle) { if (!$needle) { continue; } if ($case_sensitive) { - if (\strpos($haystack, $needle) !== false) { + if (\strpos($haystack, (string) $needle) !== false) { return true; } continue; } - if (\mb_stripos($haystack, $needle) !== false) { + if (\mb_stripos($haystack, (string) $needle) !== false) { return true; } } @@ -6122,10 +5992,16 @@ final class UTF8 /** * Returns a lowercase and trimmed string separated by the given delimiter. + * * Delimiters are inserted before uppercase characters (with the exception * of the first character of the string), and in place of spaces, dashes, * and underscores. Alpha delimiters are not converted to lowercase. * + * EXAMPLE: + * UTF8::str_delimit('test case, '#'); // 'test#case' + * UTF8::str_delimit('test -case', '**'); // 'test**case' + * + * * @param string $str

    The input string.

    * @param string $delimiter

    Sequence used to separate parts of the string.

    * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    @@ -6138,6 +6014,10 @@ final class UTF8 * @psalm-pure * * @return string + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function str_delimit( string $str, @@ -6148,7 +6028,6 @@ final class UTF8 bool $try_to_keep_the_string_length = false ): string { if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ $str = (string) \mb_ereg_replace('\\B(\\p{Lu})', '-\1', \trim($str)); $use_mb_functions = $lang === null && !$try_to_keep_the_string_length; @@ -6158,7 +6037,6 @@ final class UTF8 $str = self::strtolower($str, $encoding, $clean_utf8, $lang, $try_to_keep_the_string_length); } - /** @noinspection PhpComposerExtensionStubsInspection */ return (string) \mb_ereg_replace('[\\-_\\s]+', $delimiter, $str); } @@ -6201,7 +6079,7 @@ final class UTF8 // 1.) check binary strings (010001001...) like UTF-16 / UTF-32 / PDF / Images / ... // - if (self::is_binary($str, true)) { + if (self::is_binary($str, self::string_has_bom($str) ? false : true)) { $is_utf32 = self::is_utf32($str, false); if ($is_utf32 === 1) { return 'UTF-32LE'; @@ -6305,24 +6183,6 @@ final class UTF8 return false; } - /** - * alias for "UTF8::str_ends_with()" - * - * @param string $haystack - * @param string $needle - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::str_ends_with() - * @deprecated

    please use "UTF8::str_ends_with()"

    - */ - public static function str_ends(string $haystack, string $needle): bool - { - return self::str_ends_with($haystack, $needle); - } - /** * Check if the string ends with the given substring. * @@ -6393,7 +6253,11 @@ final class UTF8 * * @psalm-pure * - * @return string + * @template T as string + * @template TSub as string + * @phpstan-param T $str + * @phpstan-param TSub $substring + * @phpstan-return (TSub is non-empty-string ? non-empty-string : (T is non-empty-string ? non-empty-string : string)) */ public static function str_ensure_left(string $str, string $substring): string { @@ -6417,6 +6281,12 @@ final class UTF8 * @psalm-pure * * @return string + * + * @template T as string + * @template TSub as string + * @phpstan-param T $str + * @phpstan-param TSub $substring + * @phpstan-return (TSub is non-empty-string ? non-empty-string : (T is non-empty-string ? non-empty-string : string)) */ public static function str_ensure_right(string $str, string $substring): string { @@ -6460,42 +6330,6 @@ final class UTF8 return self::ucfirst(\trim($str)); } - /** - * alias for "UTF8::str_istarts_with()" - * - * @param string $haystack - * @param string $needle - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::str_istarts_with() - * @deprecated

    please use "UTF8::str_istarts_with()"

    - */ - public static function str_ibegins(string $haystack, string $needle): bool - { - return self::str_istarts_with($haystack, $needle); - } - - /** - * alias for "UTF8::str_iends_with()" - * - * @param string $haystack - * @param string $needle - * - * @psalm-pure - * - * @return bool - * - * @see UTF8::str_iends_with() - * @deprecated

    please use "UTF8::str_iends_with()"

    - */ - public static function str_iends(string $haystack, string $needle): bool - { - return self::str_iends_with($haystack, $needle); - } - /** * Check if the string ends with the given substring, case-insensitive. * @@ -6552,136 +6386,6 @@ final class UTF8 return false; } - /** - * Returns the index of the first occurrence of $needle in the string, - * and false if not found. Accepts an optional offset from which to begin - * the search. - * - * @param string $str

    The input string.

    - * @param string $needle

    Substring to look for.

    - * @param int $offset [optional]

    Offset from which to search. Default: 0

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    - * - * @psalm-pure - * - * @return false|int - *

    The occurrence's index if found, otherwise false.

    - * - * @see UTF8::stripos() - * @deprecated

    please use "UTF8::stripos()"

    - */ - public static function str_iindex_first( - string $str, - string $needle, - int $offset = 0, - string $encoding = 'UTF-8' - ) { - return self::stripos( - $str, - $needle, - $offset, - $encoding - ); - } - - /** - * Returns the index of the last occurrence of $needle in the string, - * and false if not found. Accepts an optional offset from which to begin - * the search. Offsets may be negative to count from the last character - * in the string. - * - * @param string $str

    The input string.

    - * @param string $needle

    Substring to look for.

    - * @param int $offset [optional]

    Offset from which to search. Default: 0

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    - * - * @psalm-pure - * - * @return false|int - *

    The last occurrence's index if found, otherwise false.

    - * - * @see UTF8::strripos() - * @deprecated

    please use "UTF8::strripos()"

    - */ - public static function str_iindex_last( - string $str, - string $needle, - int $offset = 0, - string $encoding = 'UTF-8' - ) { - return self::strripos( - $str, - $needle, - $offset, - $encoding - ); - } - - /** - * Returns the index of the first occurrence of $needle in the string, - * and false if not found. Accepts an optional offset from which to begin - * the search. - * - * @param string $str

    The input string.

    - * @param string $needle

    Substring to look for.

    - * @param int $offset [optional]

    Offset from which to search. Default: 0

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    - * - * @psalm-pure - * - * @return false|int - *

    The occurrence's index if found, otherwise false.

    - * - * @see UTF8::strpos() - * @deprecated

    please use "UTF8::strpos()"

    - */ - public static function str_index_first( - string $str, - string $needle, - int $offset = 0, - string $encoding = 'UTF-8' - ) { - return self::strpos( - $str, - $needle, - $offset, - $encoding - ); - } - - /** - * Returns the index of the last occurrence of $needle in the string, - * and false if not found. Accepts an optional offset from which to begin - * the search. Offsets may be negative to count from the last character - * in the string. - * - * @param string $str

    The input string.

    - * @param string $needle

    Substring to look for.

    - * @param int $offset [optional]

    Offset from which to search. Default: 0

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    - * - * @psalm-pure - * - * @return false|int - *

    The last occurrence's index if found, otherwise false.

    - * - * @see UTF8::strrpos() - * @deprecated

    please use "UTF8::strrpos()"

    - */ - public static function str_index_last( - string $str, - string $needle, - int $offset = 0, - string $encoding = 'UTF-8' - ) { - return self::strrpos( - $str, - $needle, - $offset, - $encoding - ); - } - /** * Inserts $substring into the string at the $index provided. * @@ -6896,8 +6600,8 @@ final class UTF8 * * - case-insensitive * - * @param string $str

    The input string.

    - * @param array $substrings

    Substrings to look for.

    + * @param string $str

    The input string.

    + * @param scalar[] $substrings

    Substrings to look for.

    * * @psalm-pure * @@ -6915,7 +6619,7 @@ final class UTF8 } foreach ($substrings as &$substring) { - if (self::str_istarts_with($str, $substring)) { + if (self::str_istarts_with($str, (string) $substring)) { return true; } } @@ -7182,14 +6886,18 @@ final class UTF8 /** * Limit the number of characters in a string. * - * @param string $str

    The input string.

    - * @param int $length [optional]

    Default: 100

    - * @param string $str_add_on [optional]

    Default: …

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    + * @param string $str

    The input string.

    + * @param int<1, max> $length [optional]

    Default: 100

    + * @param string $str_add_on [optional]

    Default: …

    + * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    * * @psalm-pure * * @return string + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function str_limit( string $str, @@ -7197,7 +6905,12 @@ final class UTF8 string $str_add_on = '…', string $encoding = 'UTF-8' ): string { - if ($str === '' || $length <= 0) { + if ( + $str === '' + || + /* @phpstan-ignore-next-line | we do not trust the phpdoc check */ + $length <= 0 + ) { return ''; } @@ -7220,18 +6933,62 @@ final class UTF8 } /** - * Limit the number of characters in a string, but also after the next word. + * Limit the number of characters in a string in bytes. * - * EXAMPLE: UTF8::str_limit_after_word('fòô bàř fòô', 8, ''); // 'fòô bàř' - * - * @param string $str

    The input string.

    - * @param int $length [optional]

    Default: 100

    - * @param string $str_add_on [optional]

    Default: …

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    + * @param string $str

    The input string.

    + * @param int<1, max> $length [optional]

    Default: 100

    + * @param string $str_add_on [optional]

    Default: ...

    + * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    * * @psalm-pure * * @return string + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) + */ + public static function str_limit_in_byte( + string $str, + int $length = 100, + string $str_add_on = '...', + string $encoding = 'UTF-8' + ): string { + if ( + $str === '' + || + /* @phpstan-ignore-next-line | we do not trust the phpdoc check */ + $length <= 0 + ) { + return ''; + } + + $encoding = self::normalize_encoding($encoding, 'UTF-8'); + + if ((int) self::strlen_in_byte($str, $encoding) <= $length) { + return $str; + } + + return ((string) self::substr_in_byte($str, 0, $length - (int) self::strlen_in_byte($str_add_on), $encoding)) . $str_add_on; + } + + /** + * Limit the number of characters in a string, but also after the next word. + * + * EXAMPLE: UTF8::str_limit_after_word('fòô bàř fòô', 8, ''); // 'fòô bàř' + * + * @param string $str

    The input string.

    + * @param int<1, max> $length [optional]

    Default: 100

    + * @param string $str_add_on [optional]

    Default: …

    + * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    + * + * @psalm-pure + * + * @return string + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function str_limit_after_word( string $str, @@ -7239,12 +6996,16 @@ final class UTF8 string $str_add_on = '…', string $encoding = 'UTF-8' ): string { - if ($str === '' || $length <= 0) { + if ( + $str === '' + || + /* @phpstan-ignore-next-line | we do not trust the phpdoc check */ + $length <= 0 + ) { return ''; } if ($encoding === 'UTF-8') { - /** @noinspection UnnecessaryCastingInspection */ if ((int) \mb_strlen($str) <= $length) { return $str; } @@ -7272,7 +7033,6 @@ final class UTF8 /** @noinspection CallableParameterUseCaseInTypeContextInspection - FP */ $str = self::substr($str, 0, $length, $encoding); - /** @noinspection CallableParameterUseCaseInTypeContextInspection - FP */ if ($str === false) { return '' . $str_add_on; } @@ -7317,7 +7077,7 @@ final class UTF8 $char = \mb_substr($str1, $i, 1); if ( - $char !== false + $char !== false /* @phpstan-ignore-line | old polyfill will return false, or? */ && $char === \mb_substr($str2, $i, 1) ) { @@ -7474,7 +7234,7 @@ final class UTF8 $char = \mb_substr($str1, -$i, 1); if ( - $char !== false + $char !== false /* @phpstan-ignore-line | old polyfill will return false, or? */ && $char === \mb_substr($str2, -$i, 1) ) { @@ -7558,9 +7318,9 @@ final class UTF8 * ArrayAccess interface, and throws an OutOfBoundsException if the index * does not exist. * - * @param string $str

    The input string.

    - * @param int $index

    The index from which to retrieve the char.

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    + * @param string $str

    The input string.

    + * @param int<1, max> $index

    The index from which to retrieve the char.

    + * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    * * @throws \OutOfBoundsException if the positive or negative offset does not exist * @@ -7575,6 +7335,7 @@ final class UTF8 $length = (int) self::strlen($str); if ( + /* @phpstan-ignore-next-line | we do not trust the phpdoc check */ ($index >= 0 && $length <= $index) || $length < \abs($index) @@ -7845,10 +7606,10 @@ final class UTF8 * * EXAMPLE: UTF8::str_repeat("°~\xf0\x90\x28\xbc", 2); // '°~ð(¼°~ð(¼' * - * @param string $str

    + * @param string $str

    * The string to be repeated. *

    - * @param int $multiplier

    + * @param int<1, max> $multiplier

    * Number of time the input string should be * repeated. *

    @@ -7862,6 +7623,10 @@ final class UTF8 * * @return string *

    The repeated string.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function str_repeat(string $str, int $multiplier): string { @@ -8088,12 +7853,15 @@ final class UTF8 * * @return string *

    The shuffled string.

    + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function str_shuffle(string $str, string $encoding = 'UTF-8'): string { if ($encoding === 'UTF-8') { $indexes = \range(0, (int) \mb_strlen($str) - 1); - /** @noinspection NonSecureShuffleUsageInspection */ \shuffle($indexes); // init @@ -8101,7 +7869,7 @@ final class UTF8 foreach ($indexes as &$i) { $tmp_sub_str = \mb_substr($str, $i, 1); - if ($tmp_sub_str !== false) { + if ($tmp_sub_str !== false) { /* @phpstan-ignore-line | old polyfill will return false, or? */ $shuffled_str .= $tmp_sub_str; } } @@ -8109,7 +7877,6 @@ final class UTF8 $encoding = self::normalize_encoding($encoding, 'UTF-8'); $indexes = \range(0, (int) self::strlen($str, $encoding) - 1); - /** @noinspection NonSecureShuffleUsageInspection */ \shuffle($indexes); // init @@ -8233,9 +8000,9 @@ final class UTF8 $str = (string) \preg_replace( [ - '/\\s+/u', // convert spaces to "_" + '/\\s+/u', // convert spaces to "_" '/^\\s+|\\s+$/u', // trim leading & trailing spaces - '/_+/', // remove double "_" + '/_+/', // remove double "_" ], [ '_', @@ -8264,6 +8031,7 @@ final class UTF8 */ public static function str_sort(string $str, bool $unique = false, bool $desc = false): string { + /** @var int[] $array */ $array = self::codepoints($str); if ($unique) { @@ -8287,8 +8055,8 @@ final class UTF8 *
    * * @param int[]|string[] $input

    The string[] or int[] to split into array.

    - * @param int $length [optional]

    Max character length of each array - * lement.

    + * @param int<1, max> $length [optional]

    Max character length of each array + * element.

    * @param bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the * string.

    * @param bool $try_to_use_mb_functions [optional]

    Set to false, if you don't want to use @@ -8296,8 +8064,8 @@ final class UTF8 * * @psalm-pure * - * @return string[][] - *

    An array containing chunks of the input.

    + * @return list> + *

    An array containing chunks of the input.

    */ public static function str_split_array( array $input, @@ -8305,7 +8073,7 @@ final class UTF8 bool $clean_utf8 = false, bool $try_to_use_mb_functions = true ): array { - foreach ($input as $k => &$v) { + foreach ($input as &$v) { $v = self::str_split( $v, $length, @@ -8314,7 +8082,7 @@ final class UTF8 ); } - /** @var string[][] $input */ + /** @var list> $input */ return $input; } @@ -8323,42 +8091,39 @@ final class UTF8 * * EXAMPLE: UTF8::str_split('中文空白'); // array('中', '文', '空', '白') * - * @param int|string $input

    The string or int to split into array.

    - * @param int $length [optional]

    Max character length of each array + * @param int|string $str

    The string or int to split into array.

    + * @param int<1, max> $length [optional]

    Max character length of each array * element.

    - * @param bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the + * @param bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the * string.

    - * @param bool $try_to_use_mb_functions [optional]

    Set to false, if you don't want to use + * @param bool $try_to_use_mb_functions [optional]

    Set to false, if you don't want to use * "mb_substr"

    * * @psalm-pure * - * @return string[] - *

    An array containing chunks of chars from the input.

    - * - * @noinspection SuspiciousBinaryOperationInspection - * @noinspection OffsetOperationsInspection + * @return list + *

    An array containing chunks of chars from the input.

    */ public static function str_split( - $input, + $str, int $length = 1, bool $clean_utf8 = false, bool $try_to_use_mb_functions = true ): array { + /* @phpstan-ignore-next-line | we do not trust the phpdoc check */ if ($length <= 0) { return []; } // this is only an old fallback /** @noinspection PhpSillyAssignmentInspection - hack for phpstan */ - /** @var int|int[]|string|string[] $input */ - $input = $input; - if (\is_array($input)) { - /** - * @psalm-suppress InvalidReturnStatement - */ + /** @var int|int[]|string|string[] $str */ + $str = $str; + if (\is_array($str)) { + /** @psalm-suppress InvalidReturnStatement */ + /** @phpstan-ignore-next-line - old code :/ */ return self::str_split_array( - $input, + $str, $length, $clean_utf8, $try_to_use_mb_functions @@ -8366,14 +8131,14 @@ final class UTF8 } // init - $input = (string) $input; + $str = (string) $str; - if ($input === '') { + if ($str === '') { return []; } if ($clean_utf8) { - $input = self::clean($input); + $str = self::clean($str); } if ( @@ -8382,78 +8147,82 @@ final class UTF8 self::$SUPPORT['mbstring'] === true ) { if (\function_exists('mb_str_split')) { - /** - * @psalm-suppress ImpureFunctionCall - why? - */ - $return = \mb_str_split($input, $length); + try { + /** + * @psalm-suppress ImpureFunctionCall - why? + */ + $return = \mb_str_split($str, $length); + } catch (\Error $e) { + // PHP >= 8.0 : mb_str_split() will now throw ValueError on error. Previously, mb_str_split() returned false instead. + $return = false; + } if ($return !== false) { return $return; } } - $i_max = \mb_strlen($input); + $i_max = \mb_strlen($str); if ($i_max <= 127) { $ret = []; for ($i = 0; $i < $i_max; ++$i) { - $ret[] = \mb_substr($input, $i, 1); + $ret[] = \mb_substr($str, $i, 1); } } else { $return_array = []; - \preg_match_all('/./us', $input, $return_array); + \preg_match_all('/./us', $str, $return_array); $ret = $return_array[0] ?? []; } } elseif (self::$SUPPORT['pcre_utf8'] === true) { $return_array = []; - \preg_match_all('/./us', $input, $return_array); + \preg_match_all('/./us', $str, $return_array); $ret = $return_array[0] ?? []; } else { // fallback $ret = []; - $len = \strlen($input); + $len = \strlen($str); - /** @noinspection ForeachInvariantsInspection */ for ($i = 0; $i < $len; ++$i) { - if (($input[$i] & "\x80") === "\x00") { - $ret[] = $input[$i]; + if (($str[$i] & "\x80") === "\x00") { + $ret[] = $str[$i]; } elseif ( - isset($input[$i + 1]) + isset($str[$i + 1]) && - ($input[$i] & "\xE0") === "\xC0" + ($str[$i] & "\xE0") === "\xC0" ) { - if (($input[$i + 1] & "\xC0") === "\x80") { - $ret[] = $input[$i] . $input[$i + 1]; + if (($str[$i + 1] & "\xC0") === "\x80") { + $ret[] = $str[$i] . $str[$i + 1]; ++$i; } } elseif ( - isset($input[$i + 2]) + isset($str[$i + 2]) && - ($input[$i] & "\xF0") === "\xE0" + ($str[$i] & "\xF0") === "\xE0" ) { if ( - ($input[$i + 1] & "\xC0") === "\x80" + ($str[$i + 1] & "\xC0") === "\x80" && - ($input[$i + 2] & "\xC0") === "\x80" + ($str[$i + 2] & "\xC0") === "\x80" ) { - $ret[] = $input[$i] . $input[$i + 1] . $input[$i + 2]; + $ret[] = $str[$i] . $str[$i + 1] . $str[$i + 2]; $i += 2; } } elseif ( - isset($input[$i + 3]) + isset($str[$i + 3]) && - ($input[$i] & "\xF8") === "\xF0" + ($str[$i] & "\xF8") === "\xF0" ) { if ( - ($input[$i + 1] & "\xC0") === "\x80" + ($str[$i + 1] & "\xC0") === "\x80" && - ($input[$i + 2] & "\xC0") === "\x80" + ($str[$i + 2] & "\xC0") === "\x80" && - ($input[$i + 3] & "\xC0") === "\x80" + ($str[$i + 3] & "\xC0") === "\x80" ) { - $ret[] = $input[$i] . $input[$i + 1] . $input[$i + 2] . $input[$i + 3]; + $ret[] = $str[$i] . $str[$i + 1] . $str[$i + 2] . $str[$i + 3]; $i += 3; } @@ -8462,13 +8231,12 @@ final class UTF8 } if ($length > 1) { - $ret = \array_chunk($ret, $length); - return \array_map( static function (array $item): string { + /* @phpstan-ignore-next-line | "array_map + array_chunk" is not supported by phpstan?! */ return \implode('', $item); }, - $ret + \array_chunk($ret, $length) ); } @@ -8505,8 +8273,10 @@ final class UTF8 if (self::$SUPPORT['mbstring'] === true) { if ($limit >= 0) { - /** @noinspection PhpComposerExtensionStubsInspection */ $result_tmp = \mb_split($pattern, $str); + if ($result_tmp === false) { + return []; + } $result = []; foreach ($result_tmp as $item_tmp) { @@ -8521,8 +8291,12 @@ final class UTF8 return $result; } - /** @noinspection PhpComposerExtensionStubsInspection */ - return \mb_split($pattern, $str); + $result = \mb_split($pattern, $str); + if ($result === false) { + return []; + } + + return $result; } if ($limit > 0) { @@ -8532,7 +8306,6 @@ final class UTF8 } $array = \preg_split('/' . \preg_quote($pattern, '/') . '/u', $str, $limit); - if ($array === false) { return []; } @@ -8582,8 +8355,8 @@ final class UTF8 * * - case-sensitive * - * @param string $str

    The input string.

    - * @param array $substrings

    Substrings to look for.

    + * @param string $str

    The input string.

    + * @param scalar[] $substrings

    Substrings to look for.

    * * @psalm-pure * @@ -8601,7 +8374,7 @@ final class UTF8 } foreach ($substrings as &$substring) { - if (self::str_starts_with($str, $substring)) { + if (self::str_starts_with($str, (string) $substring)) { return true; } } @@ -8891,6 +8664,12 @@ final class UTF8 * * @return string *

    A string with the substring both prepended and appended.

    + * + * @template T as string + * @template TSub as string + * @phpstan-param T $str + * @phpstan-param TSub $substring + * @phpstan-return (T is non-empty-string ? non-empty-string : (TSub is non-empty-string ? non-empty-string : string)) */ public static function str_surround(string $str, string $substring): string { @@ -8902,27 +8681,25 @@ final class UTF8 * Also accepts an array, $ignore, allowing you to list words not to be * capitalized. * - * @param string $str - * @param array|string[]|null $ignore [optional]

    An array of words not to capitalize or - * null. Default: null

    - * @param string $encoding [optional]

    Default: 'UTF-8'

    - * @param bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the - * string.

    - * @param string|null $lang [optional]

    Set the language for special cases: az, - * el, lt, tr

    - * @param bool $try_to_keep_the_string_length [optional]

    true === try to keep the string length: - * e.g. ẞ -> ß

    - * @param bool $use_trim_first [optional]

    true === trim the input string, - * first

    - * @param string|null $word_define_chars [optional]

    An string of chars that will be used as - * whitespace separator === words.

    + * @param string $str + * @param string[]|null $ignore [optional]

    An array of words not to capitalize or + * null. Default: null

    + * @param string $encoding [optional]

    Default: 'UTF-8'

    + * @param bool $clean_utf8 [optional]

    Remove non UTF-8 chars from the + * string.

    + * @param string|null $lang [optional]

    Set the language for special cases: az, + * el, lt, tr

    + * @param bool $try_to_keep_the_string_length [optional]

    true === try to keep the string length: + * e.g. ẞ -> ß

    + * @param bool $use_trim_first [optional]

    true === trim the input string, + * first

    + * @param string|null $word_define_chars [optional]

    An string of chars that will be used as + * whitespace separator === words.

    * * @psalm-pure * * @return string *

    The titleized string.

    - * - * @noinspection PhpTooManyParametersInspection */ public static function str_titleize( string $str, @@ -9072,9 +8849,9 @@ final class UTF8 * * @see https://gist.github.com/gruber/9f9e8650d68b13ce4d78 * - * @param string $str - * @param array $ignore

    An array of words not to capitalize.

    - * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    + * @param string $str + * @param string[] $ignore

    An array of words not to capitalize.

    + * @param string $encoding [optional]

    Set the charset for e.g. "mb_" function

    * * @psalm-pure * @@ -9126,18 +8903,17 @@ final class UTF8 } // the main substitutions - /** @noinspection RegExpDuplicateAlternationBranch - false-positive - https://youtrack.jetbrains.com/issue/WI-51002 */ $str = (string) \preg_replace_callback( - '~\\b (_*) (?: # 1. Leading underscore and - ( (?<=[ ][/\\\\]) [[:alpha:]]+ [-_[:alpha:]/\\\\]+ | # 2. file path or + '~\\b (_*) (?: # 1. Leading underscore and + ( (?<=[ ][/\\\\]) [[:alpha:]]+ [-_[:alpha:]/\\\\]+ | # 2. file path or [-_[:alpha:]]+ [@.:] [-_[:alpha:]@.:/]+ ' . $apostrophe_rx . ' ) # URL, domain, or email - | + | # ( (?i: ' . $small_words_rx . ' ) ' . $apostrophe_rx . ' ) # 3. or small word (case-insensitive) - | - ( [[:alpha:]] [[:lower:]\'’()\[\]{}]* ' . $apostrophe_rx . ' ) # 4. or word w/o internal caps - | - ( [[:alpha:]] [[:alpha:]\'’()\[\]{}]* ' . $apostrophe_rx . ' ) # 5. or some other word - ) (_*) \\b # 6. With trailing underscore + | # + ( [[:alpha:]] [[:lower:]\'’()\[\]{}]* ' . $apostrophe_rx . ' ) # 4. or word w/o internal caps + | # + ( [[:alpha:]] [[:alpha:]\'’()\[\]{}]* ' . $apostrophe_rx . ' ) # 5. or some other word + ) (_*) \\b # 6. With trailing underscore ~ux', /** * @param string[] $matches @@ -9268,13 +9044,11 @@ final class UTF8 */ public static function str_to_binary(string $str) { - /** @var array|false $value - needed for PhpStan (stubs error) */ $value = \unpack('H*', $str); if ($value === false) { return false; } - /** @noinspection OffsetOperationsInspection */ return \base_convert($value[1], 16, 2); } @@ -9294,7 +9068,6 @@ final class UTF8 } if (self::$SUPPORT['mbstring'] === true) { - /** @noinspection PhpComposerExtensionStubsInspection */ $return = \mb_split("[\r\n]{1,2}", $str); } else { $return = \preg_split("/[\r\n]{1,2}/u", $str); @@ -9331,7 +9104,9 @@ final class UTF8 * * @psalm-pure * - * @return string[] + * @return list + * + * @phpstan-return ($remove_empty_values is true ? list : non-empty-list) */ public static function str_to_words( string $str, @@ -9371,28 +9146,6 @@ final class UTF8 return $tmp_return; } - /** - * alias for "UTF8::to_ascii()" - * - * @param string $str - * @param string $unknown - * @param bool $strict - * - * @psalm-pure - * - * @return string - * - * @see UTF8::to_ascii() - * @deprecated

    please use "UTF8::to_ascii()"

    - */ - public static function str_transliterate( - string $str, - string $unknown = '?', - bool $strict = false - ): string { - return self::to_ascii($str, $unknown, $strict); - } - /** * Truncates the string to a given length. If $substring is provided, and * truncating occurs, the string is further truncated so that the substring @@ -9430,7 +9183,6 @@ final class UTF8 return (string) \mb_substr($str, 0, $length) . $substring; } - /** @noinspection UnnecessaryCastingInspection */ return (string) \mb_substr($str, 0, $length); } @@ -9607,38 +9359,6 @@ final class UTF8 return self::ucfirst(self::str_camelize($str, $encoding), $encoding, $clean_utf8, $lang, $try_to_keep_the_string_length); } - /** - * alias for "UTF8::ucfirst()" - * - * @param string $str - * @param string $encoding - * @param bool $clean_utf8 - * @param string|null $lang - * @param bool $try_to_keep_the_string_length - * - * @psalm-pure - * - * @return string - * - * @see UTF8::ucfirst() - * @deprecated

    please use "UTF8::ucfirst()"

    - */ - public static function str_upper_first( - string $str, - string $encoding = 'UTF-8', - bool $clean_utf8 = false, - string $lang = null, - bool $try_to_keep_the_string_length = false - ): string { - return self::ucfirst( - $str, - $encoding, - $clean_utf8, - $lang, - $try_to_keep_the_string_length - ); - } - /** * Get the number of words in a specific string. * @@ -9671,6 +9391,9 @@ final class UTF8 * * @return int|string[] *

    The number of words in the string.

    + * + * @phpstan-param 0|1|2 $format + * @phpstan-return ($format is 2 ? array : ($format is 1 ? list : 0|positive-int)) */ public static function str_word_count(string $str, int $format = 0, string $char_list = '') { @@ -9683,17 +9406,24 @@ final class UTF8 for ($i = 1; $i < $len; $i += 2) { $number_of_words[] = $str_parts[$i]; } - } elseif ($format === 2) { + + return $number_of_words; + } + + if ($format === 2) { $number_of_words = []; $offset = (int) self::strlen($str_parts[0]); for ($i = 1; $i < $len; $i += 2) { $number_of_words[$offset] = $str_parts[$i]; $offset += (int) self::strlen($str_parts[$i]) + (int) self::strlen($str_parts[$i + 1]); } - } else { - $number_of_words = (int) (($len - 1) / 2); + + return $number_of_words; } + $number_of_words = (int) (($len - 1) / 2); + + /* @phpstan-ignore-next-line | it should be 0|positive-int, maybe nested "phpstan-return" is not working? */ return $number_of_words; } @@ -9740,38 +9470,6 @@ final class UTF8 ); } - /** - * alias for "UTF8::strstr()" - * - * @param string $haystack - * @param string $needle - * @param bool $before_needle - * @param string $encoding - * @param bool $clean_utf8 - * - * @psalm-pure - * - * @return false|string - * - * @see UTF8::strstr() - * @deprecated

    please use "UTF8::strstr()"

    - */ - public static function strchr( - string $haystack, - string $needle, - bool $before_needle = false, - string $encoding = 'UTF-8', - bool $clean_utf8 = false - ) { - return self::strstr( - $haystack, - $needle, - $before_needle, - $encoding, - $clean_utf8 - ); - } - /** * Case-sensitive string comparison. * @@ -9811,6 +9509,8 @@ final class UTF8 * @psalm-pure * * @return int + * + * @phpstan-return 0|positive-int */ public static function strcspn( string $str, @@ -9842,7 +9542,6 @@ final class UTF8 return 0; } - /** @noinspection CallableParameterUseCaseInTypeContextInspection - FP */ $str = $str_tmp; } @@ -9863,38 +9562,6 @@ final class UTF8 return (int) self::strlen($str, $encoding); } - /** - * alias for "UTF8::stristr()" - * - * @param string $haystack - * @param string $needle - * @param bool $before_needle - * @param string $encoding - * @param bool $clean_utf8 - * - * @psalm-pure - * - * @return false|string - * - * @see UTF8::stristr() - * @deprecated

    please use "UTF8::stristr()"

    - */ - public static function strichr( - string $haystack, - string $needle, - bool $before_needle = false, - string $encoding = 'UTF-8', - bool $clean_utf8 = false - ) { - return self::stristr( - $haystack, - $needle, - $before_needle, - $encoding, - $clean_utf8 - ); - } - /** * Create a UTF-8 string from code points. * @@ -9926,7 +9593,9 @@ final class UTF8 $str .= '&#' . (int) $strPart . ';'; } - return self::html_entity_decode($str, \ENT_QUOTES | \ENT_HTML5); + // We cannot use html_entity_decode() here, as it will not return + // characters for many values < 160. + return mb_convert_encoding($str, 'UTF-8', 'HTML-ENTITIES'); } /** @@ -9946,7 +9615,6 @@ final class UTF8 */ public static function string_has_bom(string $str): bool { - /** @noinspection PhpUnusedLocalVariableInspection */ foreach (self::$BOM as $bom_string => &$bom_byte_length) { if (\strncmp($str, $bom_string, $bom_byte_length) === 0) { return true; @@ -10043,6 +9711,8 @@ final class UTF8 * @return false|int * Return the (int) numeric position of the first occurrence of needle in the * haystack string,
    or false if needle is not found + * + * @phpstan-return false|0|positive-int */ public static function stripos( string $haystack, @@ -10186,7 +9856,7 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::stristr() without mbstring cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -10243,6 +9913,8 @@ final class UTF8 * Can return false, if e.g. mbstring is not installed and we process invalid * chars. *

    + * + * @phpstan-return false|0|positive-int */ public static function strlen( string $str, @@ -10297,7 +9969,7 @@ final class UTF8 self::$SUPPORT['iconv'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strlen() without mbstring / iconv cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -10323,7 +9995,8 @@ final class UTF8 self::$SUPPORT['intl'] === true ) { $return_tmp = \grapheme_strlen($str); - if ($return_tmp !== null) { + /* @phpstan-ignore-next-line | "grapheme_strlen" will maybe return "null" for empty-strings and "false" on error */ + if ($return_tmp !== false && $return_tmp !== null) { return $return_tmp; } } @@ -10358,6 +10031,8 @@ final class UTF8 * @psalm-pure * * @return int + * + * @phpstan-return 0|positive-int */ public static function strlen_in_byte(string $str): int { @@ -10566,6 +10241,8 @@ final class UTF8 * @return false|int * The (int) numeric position of the first occurrence of needle in the haystack * string.
    If needle is not found it returns false. + * + * @phpstan-return false|0|positive-int */ public static function strpos( string $haystack, @@ -10646,7 +10323,7 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strpos() without mbstring / iconv cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -10738,6 +10415,8 @@ final class UTF8 * @return false|int *

    The numeric position of the first occurrence of needle in the * haystack string. If needle is not found, it returns false.

    + * + * @phpstan-return false|0|positive-int */ public static function strpos_in_byte(string $haystack, string $needle, int $offset = 0) { @@ -10771,6 +10450,8 @@ final class UTF8 * @return false|int *

    The numeric position of the first occurrence of needle in the * haystack string. If needle is not found, it returns false.

    + * + * @phpstan-return false|0|positive-int */ public static function stripos_in_byte(string $haystack, string $needle, int $offset = 0) { @@ -10867,7 +10548,7 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strrchr() without mbstring cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -10881,7 +10562,7 @@ final class UTF8 if ($needle_tmp === false) { return false; } - $needle = (string) $needle_tmp; + $needle = $needle_tmp; $pos = \iconv_strrpos($haystack, $needle, $encoding); if ($pos === false) { @@ -10903,7 +10584,7 @@ final class UTF8 if ($needle_tmp === false) { return false; } - $needle = (string) $needle_tmp; + $needle = $needle_tmp; $pos = self::strrpos($haystack, $needle, 0, $encoding); if ($pos === false) { @@ -10955,7 +10636,7 @@ final class UTF8 $i = (int) \mb_strlen($str); while ($i--) { $reversed_tmp = \mb_substr($str, $i, 1); - if ($reversed_tmp !== false) { + if ($reversed_tmp !== false) { /* @phpstan-ignore-line | old polyfill will return false, or? */ $reversed .= $reversed_tmp; } } @@ -11042,7 +10723,7 @@ final class UTF8 if ($needle_tmp === false) { return false; } - $needle = (string) $needle_tmp; + $needle = $needle_tmp; $pos = self::strripos($haystack, $needle, 0, $encoding); if ($pos === false) { @@ -11148,7 +10829,7 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strripos() without mbstring cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -11320,7 +11001,7 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strrpos() without mbstring cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -11555,7 +11236,7 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strstr() without mbstring cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -11759,20 +11440,18 @@ final class UTF8 $language_code = $lang . '-Lower'; if (!\in_array($language_code, self::$INTL_TRANSLITERATOR_LIST, true)) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strtolower() cannot handle special language: ' . $lang . ' | supported: ' . \print_r(self::$INTL_TRANSLITERATOR_LIST, true), \E_USER_WARNING); $language_code = 'Any-Lower'; } - /** @noinspection PhpComposerExtensionStubsInspection */ - /** @noinspection UnnecessaryCastingInspection */ return (string) \transliterator_transliterate($language_code, $str); } /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strtolower() without intl cannot handle the "lang" parameter: ' . $lang, \E_USER_WARNING); } @@ -11841,20 +11520,18 @@ final class UTF8 $language_code = $lang . '-Upper'; if (!\in_array($language_code, self::$INTL_TRANSLITERATOR_LIST, true)) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strtoupper() without intl for special language: ' . $lang, \E_USER_WARNING); $language_code = 'Any-Upper'; } - /** @noinspection PhpComposerExtensionStubsInspection */ - /** @noinspection UnnecessaryCastingInspection */ return (string) \transliterator_transliterate($language_code, $str); } /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::strtolower() without intl cannot handle the "lang"-parameter: ' . $lang, \E_USER_WARNING); } @@ -11917,8 +11594,12 @@ final class UTF8 } } - $from = \array_combine($from, $to); - /** @noinspection CallableParameterUseCaseInTypeContextInspection - FP */ + try { + $from = \array_combine($from, $to); + } catch (\Error $e) { + // PHP >= 8.0 : array_combine() will now throw a ValueError if the number of elements for each array is not equal; previously this function returned false instead. + $from = false; + } if ($from === false) { throw new \InvalidArgumentException('The number of elements for each array isn\'t equal or the arrays are empty: (from: ' . \print_r($from, true) . ' | to: ' . \print_r($to, true) . ')'); } @@ -11945,6 +11626,8 @@ final class UTF8 * @psalm-pure * * @return int + * + * @phpstan-return 0|positive-int */ public static function strwidth( string $str, @@ -11988,6 +11671,7 @@ final class UTF8 $wide = 0; $str = (string) \preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $str, -1, $wide); + /* @phpstan-ignore-next-line | should return 0|positive-int */ return ($wide << 1) + (int) self::strlen($str); } @@ -12068,7 +11752,11 @@ final class UTF8 // otherwise we need the string-length $str_length = 0; - if ($offset || $length === null) { + if ( + $offset + || + $length === null /* @phpstan-ignore-line | can be NULL here?! */ + ) { $str_length = self::strlen($str, $encoding); } @@ -12087,7 +11775,7 @@ final class UTF8 return ''; } - $length = $length ?? (int) $str_length; + $length = $length ?? $str_length; if ( $encoding !== 'UTF-8' @@ -12095,7 +11783,7 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::substr() without mbstring cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -12145,10 +11833,9 @@ final class UTF8 // // split to array, and remove invalid characters - $array = self::str_split($str); - + // && // extract relevant part, and join to make sting again - return \implode('', \array_slice($array, $offset, $length)); + return \implode('', \array_slice(self::str_split($str), $offset, $length)); } /** @@ -12248,15 +11935,7 @@ final class UTF8 return false; } - if ($haystack === '') { - if (\PHP_VERSION_ID >= 80000) { - return 0; - } - - return 0; - } - - if ($length === 0) { + if ($haystack === '' || $length === 0) { return 0; } @@ -12277,7 +11956,7 @@ final class UTF8 if ($length_tmp === false) { return false; } - $length = (int) $length_tmp; + $length = $length_tmp; } if ($encoding === 'UTF-8') { @@ -12293,7 +11972,7 @@ final class UTF8 self::$SUPPORT['mbstring'] === false ) { /** - * @psalm-suppress ImpureFunctionCall - is is only a warning + * @psalm-suppress ImpureFunctionCall - this is only a warning */ \trigger_error('UTF8::substr_count() without mbstring cannot handle "' . $encoding . '" encoding', \E_USER_WARNING); } @@ -12356,7 +12035,7 @@ final class UTF8 if ($length_tmp === false) { return false; } - $length = (int) $length_tmp; + $length = $length_tmp; } if ( @@ -12406,6 +12085,8 @@ final class UTF8 * @psalm-pure * * @return int + * + * @phpstan-return 0|positive-int */ public static function substr_count_simple( string $str, @@ -12484,9 +12165,9 @@ final class UTF8 * @psalm-pure * * @return false|string - * The portion of str specified by the offset and + *

    The portion of str specified by the offset and * length parameters.

    If str is shorter than offset - * characters long, FALSE will be returned. + * characters long, FALSE will be returned.

    */ public static function substr_in_byte(string $str, int $offset = 0, int $length = null) { @@ -12603,6 +12284,10 @@ final class UTF8 * * @return string|string[] *

    The result string is returned. If string is an array then array is returned.

    + * + * @template TSubstrReplace string|string[] + * @phpstan-param TSubstrReplace $str + * @phpstan-return TSubstrReplace */ public static function substr_replace( $str, @@ -12646,6 +12331,7 @@ final class UTF8 } // recursive call + /** @phpstan-ignore-next-line - phpstan currently can't handle recursive calls */ return \array_map([self::class, 'substr_replace'], $str, $replacement, $offset, $length); } @@ -12688,12 +12374,10 @@ final class UTF8 $length = $string_length; } - /** @noinspection AdditionOperationOnArraysInspection */ if (($offset + $length) > $string_length) { $length = $string_length - $offset; } - /** @noinspection AdditionOperationOnArraysInspection */ return ((string) \mb_substr($str, 0, $offset, $encoding)) . $replacement . ((string) \mb_substr($str, $offset + $length, $string_length - $offset - $length, $encoding)); @@ -12722,7 +12406,7 @@ final class UTF8 // e.g.: non mbstring support + invalid chars return ''; } - $length = (int) $length_tmp; + $length = $length_tmp; } \array_splice($str_matches[0], $offset, $length, $replacement_matches[0]); @@ -12917,79 +12601,6 @@ final class UTF8 ); } - /** - * alias for "UTF8::to_ascii()" - * - * @param string $str - * @param string $subst_chr - * @param bool $strict - * - * @psalm-pure - * - * @return string - * - * @see UTF8::to_ascii() - * @deprecated

    please use "UTF8::to_ascii()"

    - */ - public static function toAscii( - string $str, - string $subst_chr = '?', - bool $strict = false - ): string { - return self::to_ascii($str, $subst_chr, $strict); - } - - /** - * alias for "UTF8::to_iso8859()" - * - * @param string|string[] $str - * - * @psalm-pure - * - * @return string|string[] - * - * @see UTF8::to_iso8859() - * @deprecated

    please use "UTF8::to_iso8859()"

    - */ - public static function toIso8859($str) - { - return self::to_iso8859($str); - } - - /** - * alias for "UTF8::to_latin1()" - * - * @param string|string[] $str - * - * @psalm-pure - * - * @return string|string[] - * - * @see UTF8::to_iso8859() - * @deprecated

    please use "UTF8::to_iso8859()"

    - */ - public static function toLatin1($str) - { - return self::to_iso8859($str); - } - - /** - * alias for "UTF8::to_utf8()" - * - * @param string|string[] $str - * - * @psalm-pure - * - * @return string|string[] - * - * @see UTF8::to_utf8() - * @deprecated

    please use "UTF8::to_utf8()"

    - */ - public static function toUTF8($str) - { - return self::to_utf8($str); - } - /** * Convert a string into ASCII. * @@ -13013,7 +12624,7 @@ final class UTF8 } /** - * @param bool|int|float|string $str + * @param bool|float|int|string $str * * @psalm-pure * @@ -13050,7 +12661,7 @@ final class UTF8 } if (\is_numeric($str)) { - return ((float) $str + 0) > 0; + return ((float) $str) > 0; } return (bool) \trim($str); @@ -13090,17 +12701,22 @@ final class UTF8 * @psalm-pure * * @return string|string[] + * + * @template TToIso8859 as string|string[] + * @phpstan-param TToIso8859 $str + * @phpstan-return (TToIso8859 is string ? string : string[]) */ public static function to_iso8859($str) { if (\is_array($str)) { - foreach ($str as $k => &$v) { + foreach ($str as &$v) { $v = self::to_iso8859($v); } return $str; } + /* @phpstan-ignore-next-line | FP? -> "Cannot cast TToIso8859 of array|string to string." it's a string here */ $str = (string) $str; if ($str === '') { return ''; @@ -13109,23 +12725,6 @@ final class UTF8 return self::utf8_decode($str); } - /** - * alias for "UTF8::to_iso8859()" - * - * @param string|string[] $str - * - * @psalm-pure - * - * @return string|string[] - * - * @see UTF8::to_iso8859() - * @deprecated

    please use "UTF8::to_iso8859()"

    - */ - public static function to_latin1($str) - { - return self::to_iso8859($str); - } - /** * This function leaves UTF-8 characters alone, while converting almost all non-UTF8 to UTF8. * @@ -13146,25 +12745,26 @@ final class UTF8 * @return string|string[] *

    The UTF-8 encoded string

    * - * @template TToUtf8 + * @template TToUtf8 as string|string[] * @phpstan-param TToUtf8 $str - * @phpstan-return TToUtf8 - * - * @noinspection SuspiciousBinaryOperationInspection + * @phpstan-return (TToUtf8 is string ? string : string[]) */ public static function to_utf8($str, bool $decode_html_entity_to_utf8 = false) { if (\is_array($str)) { - foreach ($str as $k => &$v) { + foreach ($str as &$v) { $v = self::to_utf8_string($v, $decode_html_entity_to_utf8); } + /** @phpstan-var TToUtf8 $str */ return $str; } - /** @phpstan-var TToUtf8 $str */ + \assert(\is_string($str)); + $str = self::to_utf8_string($str, $decode_html_entity_to_utf8); + /** @phpstan-var TToUtf8 $str */ return $str; } @@ -13188,7 +12788,9 @@ final class UTF8 * @return string *

    The UTF-8 encoded string

    * - * @noinspection SuspiciousBinaryOperationInspection + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function to_utf8_string(string $str, bool $decode_html_entity_to_utf8 = false): string { @@ -13338,7 +12940,6 @@ final class UTF8 return null; } - /** @var string $input_type - hack for psalm */ $input_type = \gettype($input); if ( @@ -13350,18 +12951,13 @@ final class UTF8 || $input_type === 'double' ) { + /* @phpstan-ignore-next-line | "gettype" is not supported by phpstan?! */ return (string) $input; } - if ($input_type === 'object') { - /** @noinspection PhpSillyAssignmentInspection */ - /** @var object $input - hack for psalm / phpstan */ - $input = $input; - /** @noinspection NestedPositiveIfStatementsInspection */ - /** @noinspection MissingOrEmptyGroupStatementInspection */ - if (\method_exists($input, '__toString')) { - return (string) $input; - } + /** @phpstan-ignore-next-line - "gettype": FP? */ + if ($input_type === 'object' && \method_exists($input, '__toString')) { + return (string) $input; } return null; @@ -13395,18 +12991,17 @@ final class UTF8 if ($chars !== null) { /** @noinspection PregQuoteUsageInspection */ $chars = \preg_quote($chars); - $pattern = "^[${chars}]+|[${chars}]+\$"; + $pattern = "^[{$chars}]+|[{$chars}]+\$"; } else { $pattern = '^[\\s]+|[\\s]+$'; } - /** @noinspection PhpComposerExtensionStubsInspection */ return (string) \mb_ereg_replace($pattern, '', $str); } if ($chars !== null) { $chars = \preg_quote($chars, '/'); - $pattern = "^[${chars}]+|[${chars}]+\$"; + $pattern = "^[{$chars}]+|[{$chars}]+\$"; } else { $pattern = '^[\\s]+|[\\s]+$'; } @@ -13491,28 +13086,6 @@ final class UTF8 return $str_part_one . $str_part_two; } - /** - * alias for "UTF8::ucfirst()" - * - * @param string $str - * @param string $encoding - * @param bool $clean_utf8 - * - * @psalm-pure - * - * @return string - * - * @see UTF8::ucfirst() - * @deprecated

    please use "UTF8::ucfirst()"

    - */ - public static function ucword( - string $str, - string $encoding = 'UTF-8', - bool $clean_utf8 = false - ): string { - return self::ucfirst($str, $encoding, $clean_utf8); - } - /** * Uppercase for all words in the string. * @@ -13604,6 +13177,10 @@ final class UTF8 * @psalm-pure * * @return string + * + * @template T as string + * @phpstan-param T $str + * @phpstan-return (T is non-empty-string ? non-empty-string : string) */ public static function urldecode(string $str, bool $multi_decode = true): string { @@ -13642,245 +13219,6 @@ final class UTF8 return self::fix_simple_utf8($str); } - /** - * Return a array with "urlencoded"-win1252 -> UTF-8 - * - * @psalm-pure - * - * @return string[] - * - * @deprecated

    please use the "UTF8::urldecode()" function to decode a string

    - */ - public static function urldecode_fix_win1252_chars(): array - { - return [ - '%20' => ' ', - '%21' => '!', - '%22' => '"', - '%23' => '#', - '%24' => '$', - '%25' => '%', - '%26' => '&', - '%27' => "'", - '%28' => '(', - '%29' => ')', - '%2A' => '*', - '%2B' => '+', - '%2C' => ',', - '%2D' => '-', - '%2E' => '.', - '%2F' => '/', - '%30' => '0', - '%31' => '1', - '%32' => '2', - '%33' => '3', - '%34' => '4', - '%35' => '5', - '%36' => '6', - '%37' => '7', - '%38' => '8', - '%39' => '9', - '%3A' => ':', - '%3B' => ';', - '%3C' => '<', - '%3D' => '=', - '%3E' => '>', - '%3F' => '?', - '%40' => '@', - '%41' => 'A', - '%42' => 'B', - '%43' => 'C', - '%44' => 'D', - '%45' => 'E', - '%46' => 'F', - '%47' => 'G', - '%48' => 'H', - '%49' => 'I', - '%4A' => 'J', - '%4B' => 'K', - '%4C' => 'L', - '%4D' => 'M', - '%4E' => 'N', - '%4F' => 'O', - '%50' => 'P', - '%51' => 'Q', - '%52' => 'R', - '%53' => 'S', - '%54' => 'T', - '%55' => 'U', - '%56' => 'V', - '%57' => 'W', - '%58' => 'X', - '%59' => 'Y', - '%5A' => 'Z', - '%5B' => '[', - '%5C' => '\\', - '%5D' => ']', - '%5E' => '^', - '%5F' => '_', - '%60' => '`', - '%61' => 'a', - '%62' => 'b', - '%63' => 'c', - '%64' => 'd', - '%65' => 'e', - '%66' => 'f', - '%67' => 'g', - '%68' => 'h', - '%69' => 'i', - '%6A' => 'j', - '%6B' => 'k', - '%6C' => 'l', - '%6D' => 'm', - '%6E' => 'n', - '%6F' => 'o', - '%70' => 'p', - '%71' => 'q', - '%72' => 'r', - '%73' => 's', - '%74' => 't', - '%75' => 'u', - '%76' => 'v', - '%77' => 'w', - '%78' => 'x', - '%79' => 'y', - '%7A' => 'z', - '%7B' => '{', - '%7C' => '|', - '%7D' => '}', - '%7E' => '~', - '%7F' => '', - '%80' => '`', - '%81' => '', - '%82' => '‚', - '%83' => 'ƒ', - '%84' => '„', - '%85' => '…', - '%86' => '†', - '%87' => '‡', - '%88' => 'ˆ', - '%89' => '‰', - '%8A' => 'Š', - '%8B' => '‹', - '%8C' => 'Œ', - '%8D' => '', - '%8E' => 'Ž', - '%8F' => '', - '%90' => '', - '%91' => '‘', - '%92' => '’', - '%93' => '“', - '%94' => '”', - '%95' => '•', - '%96' => '–', - '%97' => '—', - '%98' => '˜', - '%99' => '™', - '%9A' => 'š', - '%9B' => '›', - '%9C' => 'œ', - '%9D' => '', - '%9E' => 'ž', - '%9F' => 'Ÿ', - '%A0' => '', - '%A1' => '¡', - '%A2' => '¢', - '%A3' => '£', - '%A4' => '¤', - '%A5' => '¥', - '%A6' => '¦', - '%A7' => '§', - '%A8' => '¨', - '%A9' => '©', - '%AA' => 'ª', - '%AB' => '«', - '%AC' => '¬', - '%AD' => '', - '%AE' => '®', - '%AF' => '¯', - '%B0' => '°', - '%B1' => '±', - '%B2' => '²', - '%B3' => '³', - '%B4' => '´', - '%B5' => 'µ', - '%B6' => '¶', - '%B7' => '·', - '%B8' => '¸', - '%B9' => '¹', - '%BA' => 'º', - '%BB' => '»', - '%BC' => '¼', - '%BD' => '½', - '%BE' => '¾', - '%BF' => '¿', - '%C0' => 'À', - '%C1' => 'Á', - '%C2' => 'Â', - '%C3' => 'Ã', - '%C4' => 'Ä', - '%C5' => 'Å', - '%C6' => 'Æ', - '%C7' => 'Ç', - '%C8' => 'È', - '%C9' => 'É', - '%CA' => 'Ê', - '%CB' => 'Ë', - '%CC' => 'Ì', - '%CD' => 'Í', - '%CE' => 'Î', - '%CF' => 'Ï', - '%D0' => 'Ð', - '%D1' => 'Ñ', - '%D2' => 'Ò', - '%D3' => 'Ó', - '%D4' => 'Ô', - '%D5' => 'Õ', - '%D6' => 'Ö', - '%D7' => '×', - '%D8' => 'Ø', - '%D9' => 'Ù', - '%DA' => 'Ú', - '%DB' => 'Û', - '%DC' => 'Ü', - '%DD' => 'Ý', - '%DE' => 'Þ', - '%DF' => 'ß', - '%E0' => 'à', - '%E1' => 'á', - '%E2' => 'â', - '%E3' => 'ã', - '%E4' => 'ä', - '%E5' => 'å', - '%E6' => 'æ', - '%E7' => 'ç', - '%E8' => 'è', - '%E9' => 'é', - '%EA' => 'ê', - '%EB' => 'ë', - '%EC' => 'ì', - '%ED' => 'í', - '%EE' => 'î', - '%EF' => 'ï', - '%F0' => 'ð', - '%F1' => 'ñ', - '%F2' => 'ò', - '%F3' => 'ó', - '%F4' => 'ô', - '%F5' => 'õ', - '%F6' => 'ö', - '%F7' => '÷', - '%F8' => 'ø', - '%F9' => 'ù', - '%FA' => 'ú', - '%FB' => 'û', - '%FC' => 'ü', - '%FD' => 'ý', - '%FE' => 'þ', - '%FF' => 'ÿ', - ]; - } - /** * Decodes a UTF-8 string to ISO-8859-1. * @@ -13892,8 +13230,6 @@ final class UTF8 * @psalm-pure * * @return string - * - * @noinspection SuspiciousBinaryOperationInspection */ public static function utf8_decode(string $str, bool $keep_utf8_chars = false): string { @@ -13914,7 +13250,6 @@ final class UTF8 } $no_char_found = '?'; - /** @noinspection ForeachInvariantsInspection */ for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { switch ($str[$i] & "\xF0") { case "\xC0": @@ -13924,7 +13259,6 @@ final class UTF8 break; - /** @noinspection PhpMissingBreakStatementInspection */ case "\xF0": ++$i; @@ -13975,11 +13309,10 @@ final class UTF8 return ''; } + /** @noinspection PhpUsageOfSilenceOperatorInspection | TODO for PHP > 8.2: find a replacement for this */ /** @var false|string $str - the polyfill maybe return false */ - $str = \utf8_encode($str); + $str = @\utf8_encode($str); - /** @noinspection CallableParameterUseCaseInTypeContextInspection */ - /** @psalm-suppress TypeDoesNotContainType */ if ($str === false) { return ''; } @@ -13987,22 +13320,6 @@ final class UTF8 return $str; } - /** - * fix -> utf8-win1252 chars - * - * @param string $str

    The input string.

    - * - * @psalm-pure - * - * @return string - * - * @deprecated

    please use "UTF8::fix_simple_utf8()"

    - */ - public static function utf8_fix_win1252_chars(string $str): string - { - return self::fix_simple_utf8($str); - } - /** * Returns an array with all utf8 whitespace characters. * @@ -14024,9 +13341,9 @@ final class UTF8 * * EXAMPLE: UTF8::words_limit('fòô bàř fòô', 2, ''); // 'fòô bàř' * - * @param string $str

    The input string.

    - * @param int $limit

    The limit of words as integer.

    - * @param string $str_add_on

    Replacement for the striped string.

    + * @param string $str

    The input string.

    + * @param int<1, max> $limit

    The limit of words as integer.

    + * @param string $str_add_on

    Replacement for the striped string.

    * * @psalm-pure * @@ -14037,7 +13354,12 @@ final class UTF8 int $limit = 100, string $str_add_on = '…' ): string { - if ($str === '' || $limit < 1) { + if ( + $str === '' + || + /* @phpstan-ignore-next-line | we do not trust the phpdoc check */ + $limit <= 0 + ) { return ''; } @@ -14061,10 +13383,10 @@ final class UTF8 * * @see http://php.net/manual/en/function.wordwrap.php * - * @param string $str

    The input string.

    - * @param int $width [optional]

    The column width.

    - * @param string $break [optional]

    The line is broken using the optional break parameter.

    - * @param bool $cut [optional]

    + * @param string $str

    The input string.

    + * @param int<1, max> $width [optional]

    The column width.

    + * @param string $break [optional]

    The line is broken using the optional break parameter.

    + * @param bool $cut [optional]

    * If the cut is set to true, the string is * always wrapped at or before the specified width. So if you have * a word that is larger than the given width, it is broken apart. @@ -14086,9 +13408,6 @@ final class UTF8 } $str_split = \explode($break, $str); - if ($str_split === false) { - return ''; - } /** @var string[] $charsArray */ $charsArray = []; @@ -14116,6 +13435,7 @@ final class UTF8 $word_split = \wordwrap($word_split, $width, '#', $cut); $max = \mb_strlen($word_split); + /** @noinspection PhpAssignmentInConditionInspection - is ok here */ while (($b = \mb_strpos($word_split, '#', $b + 1)) !== false) { for (++$i; $i < $b; ++$i) { if (isset($charsArray[$j])) { @@ -14154,7 +13474,7 @@ final class UTF8 * ... so that we wrap the per line. * * @param string $str

    The input string.

    - * @param int $width [optional]

    The column width.

    + * @param int<1, max> $width [optional]

    The column width.

    * @param string $break [optional]

    The line is broken using the optional break parameter.

    * @param bool $cut [optional]

    * If the cut is set to true, the string is @@ -14165,7 +13485,7 @@ final class UTF8 * If this flag is true, then the method will add a $break at the end * of the result string. *

    - * @param string|null $delimiter [optional]

    + * @param non-empty-string|null $delimiter [optional]

    * You can change the default behavior, where we split the string by newline. *

    * @@ -14233,8 +13553,6 @@ final class UTF8 * @psalm-pure * * @return bool - * - * @noinspection ReturnTypeCanBeDeclaredInspection */ private static function is_utf8_string(string $str, bool $strict = false) { @@ -14272,7 +13590,6 @@ final class UTF8 } $len = \strlen($str); - /** @noinspection ForeachInvariantsInspection */ for ($i = 0; $i < $len; ++$i) { $in = self::$ORD[$str[$i]]; @@ -14380,8 +13697,6 @@ final class UTF8 * @psalm-pure * * @return string - * - * @noinspection ReturnTypeCanBeDeclaredInspection */ private static function fixStrCaseHelper( string $str, @@ -14433,9 +13748,7 @@ final class UTF8 * * @psalm-pure * - * @return array - * - * @noinspection ReturnTypeCanBeDeclaredInspection + * @return array */ private static function getData(string $file) { @@ -14487,10 +13800,8 @@ final class UTF8 * @psalm-pure * * @return bool - * - * @noinspection ReturnTypeCanBeDeclaredInspection */ - private static function mbstring_overloaded() + private static function mbstring_overloaded(): bool { /** * INI directive 'mbstring.func_overload' is deprecated since PHP 7.2 @@ -14498,21 +13809,20 @@ final class UTF8 /** @noinspection PhpComposerExtensionStubsInspection */ /** @noinspection PhpUsageOfSilenceOperatorInspection */ + /** @noinspection DeprecatedIniOptionsInspection */ return \defined('MB_OVERLOAD_STRING') && ((int) @\ini_get('mbstring.func_overload') & \MB_OVERLOAD_STRING); } /** - * @param array $strings + * @param string[] $strings * @param bool $remove_empty_values * @param int|null $remove_short_values * * @psalm-pure * - * @return array - * - * @noinspection ReturnTypeCanBeDeclaredInspection + * @return list */ private static function reduce_string_array( array $strings, @@ -14551,11 +13861,9 @@ final class UTF8 * @param string $s * @param string $class * - * @psalm-pure - * * @return string * - * @noinspection ReturnTypeCanBeDeclaredInspection + * @psalm-pure */ private static function rxClass(string $s, string $class = '') { @@ -14572,7 +13880,7 @@ final class UTF8 return $RX_CLASS_CACHE[$cache_key]; } - /** @var string[] $class_array */ + $class_array = []; $class_array[] = $class; /** @noinspection SuspiciousLoopInspection */ @@ -14611,11 +13919,11 @@ final class UTF8 * @param string $delimiter * @param string $encoding * + * @phpstan-param non-empty-string $delimiter + * * @psalm-pure * * @return string - * - * @noinspection ReturnTypeCanBeDeclaredInspection */ private static function str_capitalize_name_helper( string $names, @@ -14623,7 +13931,12 @@ final class UTF8 string $encoding = 'UTF-8' ) { // init - $name_helper_array = \explode($delimiter, $names); + try { + $name_helper_array = \explode($delimiter, $names); + } catch (\Error $e) { + // PHP >= 8.0 : explode() will now throw ValueError when separator parameter is given an empty string (""). Previously, explode() returned false instead. + $name_helper_array = false; + } if ($name_helper_array === false) { return ''; } @@ -14676,7 +13989,6 @@ final class UTF8 $continue = false; if ($delimiter === '-') { - /** @noinspection AlterInForeachInspection */ foreach ((array) $special_cases['names'] as &$beginning) { if (\strncmp($name, $beginning, \strlen($beginning)) === 0) { $continue = true; @@ -14684,9 +13996,9 @@ final class UTF8 break; } } + unset($beginning); } - /** @noinspection AlterInForeachInspection */ foreach ((array) $special_cases['prefixes'] as &$beginning) { if (\strncmp($name, $beginning, \strlen($beginning)) === 0) { $continue = true; @@ -14694,12 +14006,13 @@ final class UTF8 break; } } + unset($beginning); if ($continue) { continue; } - $name = self::ucfirst($name); + $name = self::ucfirst($name, $encoding); } return \implode($delimiter, $name_helper_array); @@ -14717,12 +14030,10 @@ final class UTF8 private static function strtonatfold(string $str) { $str = \Normalizer::normalize($str, \Normalizer::NFD); - /** @phpstan-ignore-next-line - https://github.com/JetBrains/phpstorm-stubs/pull/949 */ if ($str === false) { return ''; } - /** @noinspection PhpUndefinedClassInspection */ return \preg_replace( '/\p{Mn}+/u', '', @@ -14736,9 +14047,6 @@ final class UTF8 * @psalm-pure * * @return string - * - * @noinspection ReturnTypeCanBeDeclaredInspection - * @noinspection SuspiciousBinaryOperationInspection */ private static function to_utf8_convert_helper($input) { @@ -14761,7 +14069,6 @@ final class UTF8 if (isset(self::$WIN1252_TO_UTF8[$ordC1])) { // found in Windows-1252 special cases $buf .= self::$WIN1252_TO_UTF8[$ordC1]; } else { - /** @noinspection OffsetOperationsInspection */ $cc1 = self::$CHR[$ordC1 / 64] | "\xC0"; $cc2 = ((string) $input & "\x3F") | "\x80"; $buf .= $cc1 . $cc2; @@ -14776,8 +14083,6 @@ final class UTF8 * @psalm-pure * * @return string - * - * @noinspection ReturnTypeCanBeDeclaredInspection */ private static function urldecode_unicode_helper(string $str) { diff --git a/application/vendor/voku/portable-utf8/src/voku/helper/data/chr.php b/application/vendor/voku/portable-utf8/src/voku/helper/data/chr.php index 42863c5..e20ffa6 100644 --- a/application/vendor/voku/portable-utf8/src/voku/helper/data/chr.php +++ b/application/vendor/voku/portable-utf8/src/voku/helper/data/chr.php @@ -1,260 +1 @@ - "\x00", - 1 => "\x01", - 2 => "\x02", - 3 => "\x03", - 4 => "\x04", - 5 => "\x05", - 6 => "\x06", - 7 => "\x07", - 8 => "\x08", - 9 => "\x09", - 10 => "\x0A", - 11 => "\x0B", - 12 => "\x0C", - 13 => "\x0D", - 14 => "\x0E", - 15 => "\x0F", - 16 => "\x10", - 17 => "\x11", - 18 => "\x12", - 19 => "\x13", - 20 => "\x14", - 21 => "\x15", - 22 => "\x16", - 23 => "\x17", - 24 => "\x18", - 25 => "\x19", - 26 => "\x1A", - 27 => "\x1B", - 28 => "\x1C", - 29 => "\x1D", - 30 => "\x1E", - 31 => "\x1F", - 32 => "\x20", - 33 => "\x21", - 34 => "\x22", - 35 => "\x23", - 36 => "\x24", - 37 => "\x25", - 38 => "\x26", - 39 => "\x27", - 40 => "\x28", - 41 => "\x29", - 42 => "\x2A", - 43 => "\x2B", - 44 => "\x2C", - 45 => "\x2D", - 46 => "\x2E", - 47 => "\x2F", - 48 => "\x30", - 49 => "\x31", - 50 => "\x32", - 51 => "\x33", - 52 => "\x34", - 53 => "\x35", - 54 => "\x36", - 55 => "\x37", - 56 => "\x38", - 57 => "\x39", - 58 => "\x3A", - 59 => "\x3B", - 60 => "\x3C", - 61 => "\x3D", - 62 => "\x3E", - 63 => "\x3F", - 64 => "\x40", - 65 => "\x41", - 66 => "\x42", - 67 => "\x43", - 68 => "\x44", - 69 => "\x45", - 70 => "\x46", - 71 => "\x47", - 72 => "\x48", - 73 => "\x49", - 74 => "\x4A", - 75 => "\x4B", - 76 => "\x4C", - 77 => "\x4D", - 78 => "\x4E", - 79 => "\x4F", - 80 => "\x50", - 81 => "\x51", - 82 => "\x52", - 83 => "\x53", - 84 => "\x54", - 85 => "\x55", - 86 => "\x56", - 87 => "\x57", - 88 => "\x58", - 89 => "\x59", - 90 => "\x5A", - 91 => "\x5B", - 92 => "\x5C", - 93 => "\x5D", - 94 => "\x5E", - 95 => "\x5F", - 96 => "\x60", - 97 => "\x61", - 98 => "\x62", - 99 => "\x63", - 100 => "\x64", - 101 => "\x65", - 102 => "\x66", - 103 => "\x67", - 104 => "\x68", - 105 => "\x69", - 106 => "\x6A", - 107 => "\x6B", - 108 => "\x6C", - 109 => "\x6D", - 110 => "\x6E", - 111 => "\x6F", - 112 => "\x70", - 113 => "\x71", - 114 => "\x72", - 115 => "\x73", - 116 => "\x74", - 117 => "\x75", - 118 => "\x76", - 119 => "\x77", - 120 => "\x78", - 121 => "\x79", - 122 => "\x7A", - 123 => "\x7B", - 124 => "\x7C", - 125 => "\x7D", - 126 => "\x7E", - 127 => "\x7F", - 128 => "\x80", - 129 => "\x81", - 130 => "\x82", - 131 => "\x83", - 132 => "\x84", - 133 => "\x85", - 134 => "\x86", - 135 => "\x87", - 136 => "\x88", - 137 => "\x89", - 138 => "\x8A", - 139 => "\x8B", - 140 => "\x8C", - 141 => "\x8D", - 142 => "\x8E", - 143 => "\x8F", - 144 => "\x90", - 145 => "\x91", - 146 => "\x92", - 147 => "\x93", - 148 => "\x94", - 149 => "\x95", - 150 => "\x96", - 151 => "\x97", - 152 => "\x98", - 153 => "\x99", - 154 => "\x9A", - 155 => "\x9B", - 156 => "\x9C", - 157 => "\x9D", - 158 => "\x9E", - 159 => "\x9F", - 160 => "\xA0", - 161 => "\xA1", - 162 => "\xA2", - 163 => "\xA3", - 164 => "\xA4", - 165 => "\xA5", - 166 => "\xA6", - 167 => "\xA7", - 168 => "\xA8", - 169 => "\xA9", - 170 => "\xAA", - 171 => "\xAB", - 172 => "\xAC", - 173 => "\xAD", - 174 => "\xAE", - 175 => "\xAF", - 176 => "\xB0", - 177 => "\xB1", - 178 => "\xB2", - 179 => "\xB3", - 180 => "\xB4", - 181 => "\xB5", - 182 => "\xB6", - 183 => "\xB7", - 184 => "\xB8", - 185 => "\xB9", - 186 => "\xBA", - 187 => "\xBB", - 188 => "\xBC", - 189 => "\xBD", - 190 => "\xBE", - 191 => "\xBF", - 192 => "\xC0", - 193 => "\xC1", - 194 => "\xC2", - 195 => "\xC3", - 196 => "\xC4", - 197 => "\xC5", - 198 => "\xC6", - 199 => "\xC7", - 200 => "\xC8", - 201 => "\xC9", - 202 => "\xCA", - 203 => "\xCB", - 204 => "\xCC", - 205 => "\xCD", - 206 => "\xCE", - 207 => "\xCF", - 208 => "\xD0", - 209 => "\xD1", - 210 => "\xD2", - 211 => "\xD3", - 212 => "\xD4", - 213 => "\xD5", - 214 => "\xD6", - 215 => "\xD7", - 216 => "\xD8", - 217 => "\xD9", - 218 => "\xDA", - 219 => "\xDB", - 220 => "\xDC", - 221 => "\xDD", - 222 => "\xDE", - 223 => "\xDF", - 224 => "\xE0", - 225 => "\xE1", - 226 => "\xE2", - 227 => "\xE3", - 228 => "\xE4", - 229 => "\xE5", - 230 => "\xE6", - 231 => "\xE7", - 232 => "\xE8", - 233 => "\xE9", - 234 => "\xEA", - 235 => "\xEB", - 236 => "\xEC", - 237 => "\xED", - 238 => "\xEE", - 239 => "\xEF", - 240 => "\xF0", - 241 => "\xF1", - 242 => "\xF2", - 243 => "\xF3", - 244 => "\xF4", - 245 => "\xF5", - 246 => "\xF6", - 247 => "\xF7", - 248 => "\xF8", - 249 => "\xF9", - 250 => "\xFA", - 251 => "\xFB", - 252 => "\xFC", - 253 => "\xFD", - 254 => "\xFE", - 255 => "\xFF", -]; + "\x00", 1 => "\x01", 2 => "\x02", 3 => "\x03", 4 => "\x04", 5 => "\x05", 6 => "\x06", 7 => "\x07", 8 => "\x08", 9 => "\x09", 10 => "\x0A", 11 => "\x0B", 12 => "\x0C", 13 => "\x0D", 14 => "\x0E", 15 => "\x0F", 16 => "\x10", 17 => "\x11", 18 => "\x12", 19 => "\x13", 20 => "\x14", 21 => "\x15", 22 => "\x16", 23 => "\x17", 24 => "\x18", 25 => "\x19", 26 => "\x1A", 27 => "\x1B", 28 => "\x1C", 29 => "\x1D", 30 => "\x1E", 31 => "\x1F", 32 => "\x20", 33 => "\x21", 34 => "\x22", 35 => "\x23", 36 => "\x24", 37 => "\x25", 38 => "\x26", 39 => "\x27", 40 => "\x28", 41 => "\x29", 42 => "\x2A", 43 => "\x2B", 44 => "\x2C", 45 => "\x2D", 46 => "\x2E", 47 => "\x2F", 48 => "\x30", 49 => "\x31", 50 => "\x32", 51 => "\x33", 52 => "\x34", 53 => "\x35", 54 => "\x36", 55 => "\x37", 56 => "\x38", 57 => "\x39", 58 => "\x3A", 59 => "\x3B", 60 => "\x3C", 61 => "\x3D", 62 => "\x3E", 63 => "\x3F", 64 => "\x40", 65 => "\x41", 66 => "\x42", 67 => "\x43", 68 => "\x44", 69 => "\x45", 70 => "\x46", 71 => "\x47", 72 => "\x48", 73 => "\x49", 74 => "\x4A", 75 => "\x4B", 76 => "\x4C", 77 => "\x4D", 78 => "\x4E", 79 => "\x4F", 80 => "\x50", 81 => "\x51", 82 => "\x52", 83 => "\x53", 84 => "\x54", 85 => "\x55", 86 => "\x56", 87 => "\x57", 88 => "\x58", 89 => "\x59", 90 => "\x5A", 91 => "\x5B", 92 => "\x5C", 93 => "\x5D", 94 => "\x5E", 95 => "\x5F", 96 => "\x60", 97 => "\x61", 98 => "\x62", 99 => "\x63", 100 => "\x64", 101 => "\x65", 102 => "\x66", 103 => "\x67", 104 => "\x68", 105 => "\x69", 106 => "\x6A", 107 => "\x6B", 108 => "\x6C", 109 => "\x6D", 110 => "\x6E", 111 => "\x6F", 112 => "\x70", 113 => "\x71", 114 => "\x72", 115 => "\x73", 116 => "\x74", 117 => "\x75", 118 => "\x76", 119 => "\x77", 120 => "\x78", 121 => "\x79", 122 => "\x7A", 123 => "\x7B", 124 => "\x7C", 125 => "\x7D", 126 => "\x7E", 127 => "\x7F", 128 => "\x80", 129 => "\x81", 130 => "\x82", 131 => "\x83", 132 => "\x84", 133 => "\x85", 134 => "\x86", 135 => "\x87", 136 => "\x88", 137 => "\x89", 138 => "\x8A", 139 => "\x8B", 140 => "\x8C", 141 => "\x8D", 142 => "\x8E", 143 => "\x8F", 144 => "\x90", 145 => "\x91", 146 => "\x92", 147 => "\x93", 148 => "\x94", 149 => "\x95", 150 => "\x96", 151 => "\x97", 152 => "\x98", 153 => "\x99", 154 => "\x9A", 155 => "\x9B", 156 => "\x9C", 157 => "\x9D", 158 => "\x9E", 159 => "\x9F", 160 => "\xA0", 161 => "\xA1", 162 => "\xA2", 163 => "\xA3", 164 => "\xA4", 165 => "\xA5", 166 => "\xA6", 167 => "\xA7", 168 => "\xA8", 169 => "\xA9", 170 => "\xAA", 171 => "\xAB", 172 => "\xAC", 173 => "\xAD", 174 => "\xAE", 175 => "\xAF", 176 => "\xB0", 177 => "\xB1", 178 => "\xB2", 179 => "\xB3", 180 => "\xB4", 181 => "\xB5", 182 => "\xB6", 183 => "\xB7", 184 => "\xB8", 185 => "\xB9", 186 => "\xBA", 187 => "\xBB", 188 => "\xBC", 189 => "\xBD", 190 => "\xBE", 191 => "\xBF", 192 => "\xC0", 193 => "\xC1", 194 => "\xC2", 195 => "\xC3", 196 => "\xC4", 197 => "\xC5", 198 => "\xC6", 199 => "\xC7", 200 => "\xC8", 201 => "\xC9", 202 => "\xCA", 203 => "\xCB", 204 => "\xCC", 205 => "\xCD", 206 => "\xCE", 207 => "\xCF", 208 => "\xD0", 209 => "\xD1", 210 => "\xD2", 211 => "\xD3", 212 => "\xD4", 213 => "\xD5", 214 => "\xD6", 215 => "\xD7", 216 => "\xD8", 217 => "\xD9", 218 => "\xDA", 219 => "\xDB", 220 => "\xDC", 221 => "\xDD", 222 => "\xDE", 223 => "\xDF", 224 => "\xE0", 225 => "\xE1", 226 => "\xE2", 227 => "\xE3", 228 => "\xE4", 229 => "\xE5", 230 => "\xE6", 231 => "\xE7", 232 => "\xE8", 233 => "\xE9", 234 => "\xEA", 235 => "\xEB", 236 => "\xEC", 237 => "\xED", 238 => "\xEE", 239 => "\xEF", 240 => "\xF0", 241 => "\xF1", 242 => "\xF2", 243 => "\xF3", 244 => "\xF4", 245 => "\xF5", 246 => "\xF6", 247 => "\xF7", 248 => "\xF8", 249 => "\xF9", 250 => "\xFA", 251 => "\xFB", 252 => "\xFC", 253 => "\xFD", 254 => "\xFE", 255 => "\xFF"]; diff --git a/application/vendor/voku/portable-utf8/src/voku/helper/data/emoji.php b/application/vendor/voku/portable-utf8/src/voku/helper/data/emoji.php index 11d8ebb..ae10b33 100644 --- a/application/vendor/voku/portable-utf8/src/voku/helper/data/emoji.php +++ b/application/vendor/voku/portable-utf8/src/voku/helper/data/emoji.php @@ -1,2882 +1,7 @@ "\u{1F600}", - 'CHARACTER_BEAMING_FACE_WITH_SMILING_EYES' => "\u{1F601}", - 'CHARACTER_FACE_WITH_TEARS_OF_JOY' => "\u{1F602}", - 'CHARACTER_ROLLING_ON_THE_FLOOR_LAUGHING' => "\u{1F923}", - 'CHARACTER_GRINNING_FACE_WITH_BIG_EYES' => "\u{1F603}", - 'CHARACTER_GRINNING_FACE_WITH_SMILING_EYES' => "\u{1F604}", - 'CHARACTER_GRINNING_FACE_WITH_SWEAT' => "\u{1F605}", - 'CHARACTER_GRINNING_SQUINTING_FACE' => "\u{1F606}", - 'CHARACTER_WINKING_FACE' => "\u{1F609}", - 'CHARACTER_SMILING_FACE_WITH_SMILING_EYES' => "\u{1F60A}", - 'CHARACTER_FACE_SAVORING_FOOD' => "\u{1F60B}", - 'CHARACTER_SMILING_FACE_WITH_SUNGLASSES' => "\u{1F60E}", - 'CHARACTER_SMILING_FACE_WITH_HEART_EYES' => "\u{1F60D}", - 'CHARACTER_FACE_BLOWING_A_KISS' => "\u{1F618}", - 'CHARACTER_SMILING_FACE_WITH_3_HEARTS' => "\u{1F970}", - 'CHARACTER_KISSING_FACE' => "\u{1F617}", - 'CHARACTER_KISSING_FACE_WITH_SMILING_EYES' => "\u{1F619}", - 'CHARACTER_KISSING_FACE_WITH_CLOSED_EYES' => "\u{1F61A}", - 'CHARACTER_SMILING_FACE' => "\u{263A}\u{FE0F}", - 'CHARACTER_SLIGHTLY_SMILING_FACE' => "\u{1F642}", - 'CHARACTER_HUGGING_FACE' => "\u{1F917}", - 'CHARACTER_STAR_STRUCK' => "\u{1F929}", - // ##### Emoji subgroup: Face-neutral ##### - 'CHARACTER_THINKING_FACE' => "\u{1F914}", - 'CHARACTER_FACE_WITH_RAISED_EYEBROW' => "\u{1F928}", - 'CHARACTER_NEUTRAL_FACE' => "\u{1F610}", - 'CHARACTER_EXPRESSIONLESS_FACE' => "\u{1F611}", - 'CHARACTER_FACE_WITHOUT_MOUTH' => "\u{1F636}", - 'CHARACTER_FACE_WITH_ROLLING_EYES' => "\u{1F644}", - 'CHARACTER_SMIRKING_FACE' => "\u{1F60F}", - 'CHARACTER_PERSEVERING_FACE' => "\u{1F623}", - 'CHARACTER_SAD_BUT_RELIEVED_FACE' => "\u{1F625}", - 'CHARACTER_FACE_WITH_OPEN_MOUTH' => "\u{1F62E}", - 'CHARACTER_ZIPPER_MOUTH_FACE' => "\u{1F910}", - 'CHARACTER_HUSHED_FACE' => "\u{1F62F}", - 'CHARACTER_SLEEPY_FACE' => "\u{1F62A}", - 'CHARACTER_TIRED_FACE' => "\u{1F62B}", - 'CHARACTER_SLEEPING_FACE' => "\u{1F634}", - 'CHARACTER_RELIEVED_FACE' => "\u{1F60C}", - 'CHARACTER_FACE_WITH_TONGUE' => "\u{1F61B}", - 'CHARACTER_WINKING_FACE_WITH_TONGUE' => "\u{1F61C}", - 'CHARACTER_SQUINTING_FACE_WITH_TONGUE' => "\u{1F61D}", - 'CHARACTER_DROOLING_FACE' => "\u{1F924}", - 'CHARACTER_UNAMUSED_FACE' => "\u{1F612}", - 'CHARACTER_DOWNCAST_FACE_WITH_SWEAT' => "\u{1F613}", - 'CHARACTER_PENSIVE_FACE' => "\u{1F614}", - 'CHARACTER_CONFUSED_FACE' => "\u{1F615}", - 'CHARACTER_UPSIDE_DOWN_FACE' => "\u{1F643}", - 'CHARACTER_MONEY_MOUTH_FACE' => "\u{1F911}", - 'CHARACTER_ASTONISHED_FACE' => "\u{1F632}", - // ##### Emoji subgroup: Face-negative ##### - 'CHARACTER_FROWNING_FACE' => "\u{2639}\u{FE0F}", - 'CHARACTER_SLIGHTLY_FROWNING_FACE' => "\u{1F641}", - 'CHARACTER_CONFOUNDED_FACE' => "\u{1F616}", - 'CHARACTER_DISAPPOINTED_FACE' => "\u{1F61E}", - 'CHARACTER_WORRIED_FACE' => "\u{1F61F}", - 'CHARACTER_FACE_WITH_STEAM_FROM_NOSE' => "\u{1F624}", - 'CHARACTER_CRYING_FACE' => "\u{1F622}", - 'CHARACTER_LOUDLY_CRYING_FACE' => "\u{1F62D}", - 'CHARACTER_FROWNING_FACE_WITH_OPEN_MOUTH' => "\u{1F626}", - 'CHARACTER_ANGUISHED_FACE' => "\u{1F627}", - 'CHARACTER_FEARFUL_FACE' => "\u{1F628}", - 'CHARACTER_WEARY_FACE' => "\u{1F629}", - 'CHARACTER_EXPLODING_HEAD' => "\u{1F92F}", - 'CHARACTER_GRIMACING_FACE' => "\u{1F62C}", - 'CHARACTER_ANXIOUS_FACE_WITH_SWEAT' => "\u{1F630}", - 'CHARACTER_FACE_SCREAMING_IN_FEAR' => "\u{1F631}", - 'CHARACTER_HOT_FACE' => "\u{1F975}", - 'CHARACTER_COLD_FACE' => "\u{1F976}", - 'CHARACTER_FLUSHED_FACE' => "\u{1F633}", - 'CHARACTER_ZANY_FACE' => "\u{1F92A}", - 'CHARACTER_DIZZY_FACE' => "\u{1F635}", - 'CHARACTER_POUTING_FACE' => "\u{1F621}", - 'CHARACTER_ANGRY_FACE' => "\u{1F620}", - 'CHARACTER_FACE_WITH_SYMBOLS_ON_MOUTH' => "\u{1F92C}", - // ##### Emoji subgroup: Face-sick ##### - 'CHARACTER_FACE_WITH_MEDICAL_MASK' => "\u{1F637}", - 'CHARACTER_FACE_WITH_THERMOMETER' => "\u{1F912}", - 'CHARACTER_FACE_WITH_HEAD_BANDAGE' => "\u{1F915}", - 'CHARACTER_NAUSEATED_FACE' => "\u{1F922}", - 'CHARACTER_FACE_VOMITING' => "\u{1F92E}", - 'CHARACTER_SNEEZING_FACE' => "\u{1F927}", - // ##### Emoji subgroup: Face-role ##### - 'CHARACTER_SMILING_FACE_WITH_HALO' => "\u{1F607}", - 'CHARACTER_COWBOY_HAT_FACE' => "\u{1F920}", - 'CHARACTER_PARTYING_FACE' => "\u{1F973}", - 'CHARACTER_WOOZY_FACE' => "\u{1F974}", - 'CHARACTER_PLEADING_FACE' => "\u{1F97A}", - 'CHARACTER_LYING_FACE' => "\u{1F925}", - 'CHARACTER_SHUSHING_FACE' => "\u{1F92B}", - 'CHARACTER_FACE_WITH_HAND_OVER_MOUTH' => "\u{1F92D}", - 'CHARACTER_FACE_WITH_MONOCLE' => "\u{1F9D0}", - 'CHARACTER_NERD_FACE' => "\u{1F913}", - // ##### Emoji subgroup: Face-fantasy ##### - 'CHARACTER_SMILING_FACE_WITH_HORNS' => "\u{1F608}", - 'CHARACTER_ANGRY_FACE_WITH_HORNS' => "\u{1F47F}", - 'CHARACTER_CLOWN_FACE' => "\u{1F921}", - 'CHARACTER_OGRE' => "\u{1F479}", - 'CHARACTER_GOBLIN' => "\u{1F47A}", - 'CHARACTER_SKULL' => "\u{1F480}", - 'CHARACTER_SKULL_AND_CROSSBONES' => "\u{2620}\u{FE0F}", - 'CHARACTER_GHOST' => "\u{1F47B}", - 'CHARACTER_ALIEN' => "\u{1F47D}", - 'CHARACTER_ALIEN_MONSTER' => "\u{1F47E}", - 'CHARACTER_ROBOT_FACE' => "\u{1F916}", - 'CHARACTER_PILE_OF_POO' => "\u{1F4A9}", - // ##### Emoji subgroup: Cat-face ##### - 'CHARACTER_GRINNING_CAT_FACE' => "\u{1F63A}", - 'CHARACTER_GRINNING_CAT_FACE_WITH_SMILING_EYES' => "\u{1F638}", - 'CHARACTER_CAT_FACE_WITH_TEARS_OF_JOY' => "\u{1F639}", - 'CHARACTER_SMILING_CAT_FACE_WITH_HEART_EYES' => "\u{1F63B}", - 'CHARACTER_CAT_FACE_WITH_WRY_SMILE' => "\u{1F63C}", - 'CHARACTER_KISSING_CAT_FACE' => "\u{1F63D}", - 'CHARACTER_WEARY_CAT_FACE' => "\u{1F640}", - 'CHARACTER_CRYING_CAT_FACE' => "\u{1F63F}", - 'CHARACTER_POUTING_CAT_FACE' => "\u{1F63E}", - // ##### Emoji subgroup: Monkey-face ##### - 'CHARACTER_SEE_NO_EVIL_MONKEY' => "\u{1F648}", - 'CHARACTER_HEAR_NO_EVIL_MONKEY' => "\u{1F649}", - 'CHARACTER_SPEAK_NO_EVIL_MONKEY' => "\u{1F64A}", - // ##### Emoji subgroup: Skin-tone ##### - 'CHARACTER_LIGHT_SKIN_TONE' => "\u{1F3FB}", - 'CHARACTER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3FC}", - 'CHARACTER_MEDIUM_SKIN_TONE' => "\u{1F3FD}", - 'CHARACTER_MEDIUM_DARK_SKIN_TONE' => "\u{1F3FE}", - 'CHARACTER_DARK_SKIN_TONE' => "\u{1F3FF}", - // ##### Emoji subgroup: Person ##### - 'CHARACTER_BABY' => "\u{1F476}", - 'CHARACTER_BABY_LIGHT_SKIN_TONE' => "\u{1F476}\u{1F3FB}", - 'CHARACTER_BABY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F476}\u{1F3FC}", - 'CHARACTER_BABY_MEDIUM_SKIN_TONE' => "\u{1F476}\u{1F3FD}", - 'CHARACTER_BABY_MEDIUM_DARK_SKIN_TONE' => "\u{1F476}\u{1F3FE}", - 'CHARACTER_BABY_DARK_SKIN_TONE' => "\u{1F476}\u{1F3FF}", - 'CHARACTER_CHILD' => "\u{1F9D2}", - 'CHARACTER_CHILD_LIGHT_SKIN_TONE' => "\u{1F9D2}\u{1F3FB}", - 'CHARACTER_CHILD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D2}\u{1F3FC}", - 'CHARACTER_CHILD_MEDIUM_SKIN_TONE' => "\u{1F9D2}\u{1F3FD}", - 'CHARACTER_CHILD_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D2}\u{1F3FE}", - 'CHARACTER_CHILD_DARK_SKIN_TONE' => "\u{1F9D2}\u{1F3FF}", - 'CHARACTER_BOY' => "\u{1F466}", - 'CHARACTER_BOY_LIGHT_SKIN_TONE' => "\u{1F466}\u{1F3FB}", - 'CHARACTER_BOY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F466}\u{1F3FC}", - 'CHARACTER_BOY_MEDIUM_SKIN_TONE' => "\u{1F466}\u{1F3FD}", - 'CHARACTER_BOY_MEDIUM_DARK_SKIN_TONE' => "\u{1F466}\u{1F3FE}", - 'CHARACTER_BOY_DARK_SKIN_TONE' => "\u{1F466}\u{1F3FF}", - 'CHARACTER_GIRL' => "\u{1F467}", - 'CHARACTER_GIRL_LIGHT_SKIN_TONE' => "\u{1F467}\u{1F3FB}", - 'CHARACTER_GIRL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F467}\u{1F3FC}", - 'CHARACTER_GIRL_MEDIUM_SKIN_TONE' => "\u{1F467}\u{1F3FD}", - 'CHARACTER_GIRL_MEDIUM_DARK_SKIN_TONE' => "\u{1F467}\u{1F3FE}", - 'CHARACTER_GIRL_DARK_SKIN_TONE' => "\u{1F467}\u{1F3FF}", - 'CHARACTER_ADULT' => "\u{1F9D1}", - 'CHARACTER_ADULT_LIGHT_SKIN_TONE' => "\u{1F9D1}\u{1F3FB}", - 'CHARACTER_ADULT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D1}\u{1F3FC}", - 'CHARACTER_ADULT_MEDIUM_SKIN_TONE' => "\u{1F9D1}\u{1F3FD}", - 'CHARACTER_ADULT_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D1}\u{1F3FE}", - 'CHARACTER_ADULT_DARK_SKIN_TONE' => "\u{1F9D1}\u{1F3FF}", - 'CHARACTER_MAN' => "\u{1F468}", - 'CHARACTER_MAN_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}", - 'CHARACTER_MAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}", - 'CHARACTER_MAN_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}", - 'CHARACTER_MAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}", - 'CHARACTER_MAN_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}", - 'CHARACTER_WOMAN' => "\u{1F469}", - 'CHARACTER_WOMAN_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}", - 'CHARACTER_WOMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}", - 'CHARACTER_WOMAN_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}", - 'CHARACTER_WOMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}", - 'CHARACTER_WOMAN_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}", - 'CHARACTER_OLDER_ADULT' => "\u{1F9D3}", - 'CHARACTER_OLDER_ADULT_LIGHT_SKIN_TONE' => "\u{1F9D3}\u{1F3FB}", - 'CHARACTER_OLDER_ADULT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D3}\u{1F3FC}", - 'CHARACTER_OLDER_ADULT_MEDIUM_SKIN_TONE' => "\u{1F9D3}\u{1F3FD}", - 'CHARACTER_OLDER_ADULT_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D3}\u{1F3FE}", - 'CHARACTER_OLDER_ADULT_DARK_SKIN_TONE' => "\u{1F9D3}\u{1F3FF}", - 'CHARACTER_OLD_MAN' => "\u{1F474}", - 'CHARACTER_OLD_MAN_LIGHT_SKIN_TONE' => "\u{1F474}\u{1F3FB}", - 'CHARACTER_OLD_MAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F474}\u{1F3FC}", - 'CHARACTER_OLD_MAN_MEDIUM_SKIN_TONE' => "\u{1F474}\u{1F3FD}", - 'CHARACTER_OLD_MAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F474}\u{1F3FE}", - 'CHARACTER_OLD_MAN_DARK_SKIN_TONE' => "\u{1F474}\u{1F3FF}", - 'CHARACTER_OLD_WOMAN' => "\u{1F475}", - 'CHARACTER_OLD_WOMAN_LIGHT_SKIN_TONE' => "\u{1F475}\u{1F3FB}", - 'CHARACTER_OLD_WOMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F475}\u{1F3FC}", - 'CHARACTER_OLD_WOMAN_MEDIUM_SKIN_TONE' => "\u{1F475}\u{1F3FD}", - 'CHARACTER_OLD_WOMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F475}\u{1F3FE}", - 'CHARACTER_OLD_WOMAN_DARK_SKIN_TONE' => "\u{1F475}\u{1F3FF}", - // ##### Emoji subgroup: Person-role ##### - 'CHARACTER_MAN_HEALTH_WORKER' => "\u{1F468}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_MAN_HEALTH_WORKER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_MAN_HEALTH_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_MAN_HEALTH_WORKER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_MAN_HEALTH_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_MAN_HEALTH_WORKER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_WOMAN_HEALTH_WORKER' => "\u{1F469}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_WOMAN_HEALTH_WORKER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_WOMAN_HEALTH_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_WOMAN_HEALTH_WORKER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_WOMAN_HEALTH_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_WOMAN_HEALTH_WORKER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{2695}\u{FE0F}", - 'CHARACTER_MAN_STUDENT' => "\u{1F468}\u{200D}\u{1F393}", - 'CHARACTER_MAN_STUDENT_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F393}", - 'CHARACTER_MAN_STUDENT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F393}", - 'CHARACTER_MAN_STUDENT_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F393}", - 'CHARACTER_MAN_STUDENT_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F393}", - 'CHARACTER_MAN_STUDENT_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F393}", - 'CHARACTER_WOMAN_STUDENT' => "\u{1F469}\u{200D}\u{1F393}", - 'CHARACTER_WOMAN_STUDENT_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F393}", - 'CHARACTER_WOMAN_STUDENT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F393}", - 'CHARACTER_WOMAN_STUDENT_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F393}", - 'CHARACTER_WOMAN_STUDENT_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F393}", - 'CHARACTER_WOMAN_STUDENT_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F393}", - 'CHARACTER_MAN_TEACHER' => "\u{1F468}\u{200D}\u{1F3EB}", - 'CHARACTER_MAN_TEACHER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F3EB}", - 'CHARACTER_MAN_TEACHER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F3EB}", - 'CHARACTER_MAN_TEACHER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F3EB}", - 'CHARACTER_MAN_TEACHER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F3EB}", - 'CHARACTER_MAN_TEACHER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F3EB}", - 'CHARACTER_WOMAN_TEACHER' => "\u{1F469}\u{200D}\u{1F3EB}", - 'CHARACTER_WOMAN_TEACHER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F3EB}", - 'CHARACTER_WOMAN_TEACHER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F3EB}", - 'CHARACTER_WOMAN_TEACHER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F3EB}", - 'CHARACTER_WOMAN_TEACHER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F3EB}", - 'CHARACTER_WOMAN_TEACHER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F3EB}", - 'CHARACTER_MAN_JUDGE' => "\u{1F468}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_MAN_JUDGE_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_MAN_JUDGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_MAN_JUDGE_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_MAN_JUDGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_MAN_JUDGE_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_WOMAN_JUDGE' => "\u{1F469}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_WOMAN_JUDGE_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_WOMAN_JUDGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_WOMAN_JUDGE_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_WOMAN_JUDGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_WOMAN_JUDGE_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{2696}\u{FE0F}", - 'CHARACTER_MAN_FARMER' => "\u{1F468}\u{200D}\u{1F33E}", - 'CHARACTER_MAN_FARMER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F33E}", - 'CHARACTER_MAN_FARMER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F33E}", - 'CHARACTER_MAN_FARMER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F33E}", - 'CHARACTER_MAN_FARMER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F33E}", - 'CHARACTER_MAN_FARMER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F33E}", - 'CHARACTER_WOMAN_FARMER' => "\u{1F469}\u{200D}\u{1F33E}", - 'CHARACTER_WOMAN_FARMER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F33E}", - 'CHARACTER_WOMAN_FARMER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F33E}", - 'CHARACTER_WOMAN_FARMER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F33E}", - 'CHARACTER_WOMAN_FARMER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F33E}", - 'CHARACTER_WOMAN_FARMER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F33E}", - 'CHARACTER_MAN_COOK' => "\u{1F468}\u{200D}\u{1F373}", - 'CHARACTER_MAN_COOK_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F373}", - 'CHARACTER_MAN_COOK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F373}", - 'CHARACTER_MAN_COOK_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F373}", - 'CHARACTER_MAN_COOK_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F373}", - 'CHARACTER_MAN_COOK_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F373}", - 'CHARACTER_WOMAN_COOK' => "\u{1F469}\u{200D}\u{1F373}", - 'CHARACTER_WOMAN_COOK_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F373}", - 'CHARACTER_WOMAN_COOK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F373}", - 'CHARACTER_WOMAN_COOK_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F373}", - 'CHARACTER_WOMAN_COOK_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F373}", - 'CHARACTER_WOMAN_COOK_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F373}", - 'CHARACTER_MAN_MECHANIC' => "\u{1F468}\u{200D}\u{1F527}", - 'CHARACTER_MAN_MECHANIC_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F527}", - 'CHARACTER_MAN_MECHANIC_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F527}", - 'CHARACTER_MAN_MECHANIC_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F527}", - 'CHARACTER_MAN_MECHANIC_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F527}", - 'CHARACTER_MAN_MECHANIC_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F527}", - 'CHARACTER_WOMAN_MECHANIC' => "\u{1F469}\u{200D}\u{1F527}", - 'CHARACTER_WOMAN_MECHANIC_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F527}", - 'CHARACTER_WOMAN_MECHANIC_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F527}", - 'CHARACTER_WOMAN_MECHANIC_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F527}", - 'CHARACTER_WOMAN_MECHANIC_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F527}", - 'CHARACTER_WOMAN_MECHANIC_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F527}", - 'CHARACTER_MAN_FACTORY_WORKER' => "\u{1F468}\u{200D}\u{1F3ED}", - 'CHARACTER_MAN_FACTORY_WORKER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F3ED}", - 'CHARACTER_MAN_FACTORY_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F3ED}", - 'CHARACTER_MAN_FACTORY_WORKER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F3ED}", - 'CHARACTER_MAN_FACTORY_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F3ED}", - 'CHARACTER_MAN_FACTORY_WORKER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F3ED}", - 'CHARACTER_WOMAN_FACTORY_WORKER' => "\u{1F469}\u{200D}\u{1F3ED}", - 'CHARACTER_WOMAN_FACTORY_WORKER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F3ED}", - 'CHARACTER_WOMAN_FACTORY_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F3ED}", - 'CHARACTER_WOMAN_FACTORY_WORKER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F3ED}", - 'CHARACTER_WOMAN_FACTORY_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F3ED}", - 'CHARACTER_WOMAN_FACTORY_WORKER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F3ED}", - 'CHARACTER_MAN_OFFICE_WORKER' => "\u{1F468}\u{200D}\u{1F4BC}", - 'CHARACTER_MAN_OFFICE_WORKER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F4BC}", - 'CHARACTER_MAN_OFFICE_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F4BC}", - 'CHARACTER_MAN_OFFICE_WORKER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F4BC}", - 'CHARACTER_MAN_OFFICE_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F4BC}", - 'CHARACTER_MAN_OFFICE_WORKER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F4BC}", - 'CHARACTER_WOMAN_OFFICE_WORKER' => "\u{1F469}\u{200D}\u{1F4BC}", - 'CHARACTER_WOMAN_OFFICE_WORKER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F4BC}", - 'CHARACTER_WOMAN_OFFICE_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F4BC}", - 'CHARACTER_WOMAN_OFFICE_WORKER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F4BC}", - 'CHARACTER_WOMAN_OFFICE_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F4BC}", - 'CHARACTER_WOMAN_OFFICE_WORKER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F4BC}", - 'CHARACTER_MAN_SCIENTIST' => "\u{1F468}\u{200D}\u{1F52C}", - 'CHARACTER_MAN_SCIENTIST_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F52C}", - 'CHARACTER_MAN_SCIENTIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F52C}", - 'CHARACTER_MAN_SCIENTIST_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F52C}", - 'CHARACTER_MAN_SCIENTIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F52C}", - 'CHARACTER_MAN_SCIENTIST_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F52C}", - 'CHARACTER_WOMAN_SCIENTIST' => "\u{1F469}\u{200D}\u{1F52C}", - 'CHARACTER_WOMAN_SCIENTIST_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F52C}", - 'CHARACTER_WOMAN_SCIENTIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F52C}", - 'CHARACTER_WOMAN_SCIENTIST_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F52C}", - 'CHARACTER_WOMAN_SCIENTIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F52C}", - 'CHARACTER_WOMAN_SCIENTIST_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F52C}", - 'CHARACTER_MAN_TECHNOLOGIST' => "\u{1F468}\u{200D}\u{1F4BB}", - 'CHARACTER_MAN_TECHNOLOGIST_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F4BB}", - 'CHARACTER_MAN_TECHNOLOGIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F4BB}", - 'CHARACTER_MAN_TECHNOLOGIST_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F4BB}", - 'CHARACTER_MAN_TECHNOLOGIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F4BB}", - 'CHARACTER_MAN_TECHNOLOGIST_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F4BB}", - 'CHARACTER_WOMAN_TECHNOLOGIST' => "\u{1F469}\u{200D}\u{1F4BB}", - 'CHARACTER_WOMAN_TECHNOLOGIST_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F4BB}", - 'CHARACTER_WOMAN_TECHNOLOGIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F4BB}", - 'CHARACTER_WOMAN_TECHNOLOGIST_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F4BB}", - 'CHARACTER_WOMAN_TECHNOLOGIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F4BB}", - 'CHARACTER_WOMAN_TECHNOLOGIST_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F4BB}", - 'CHARACTER_MAN_SINGER' => "\u{1F468}\u{200D}\u{1F3A4}", - 'CHARACTER_MAN_SINGER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F3A4}", - 'CHARACTER_MAN_SINGER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F3A4}", - 'CHARACTER_MAN_SINGER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F3A4}", - 'CHARACTER_MAN_SINGER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F3A4}", - 'CHARACTER_MAN_SINGER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F3A4}", - 'CHARACTER_WOMAN_SINGER' => "\u{1F469}\u{200D}\u{1F3A4}", - 'CHARACTER_WOMAN_SINGER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F3A4}", - 'CHARACTER_WOMAN_SINGER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F3A4}", - 'CHARACTER_WOMAN_SINGER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F3A4}", - 'CHARACTER_WOMAN_SINGER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F3A4}", - 'CHARACTER_WOMAN_SINGER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F3A4}", - 'CHARACTER_MAN_ARTIST' => "\u{1F468}\u{200D}\u{1F3A8}", - 'CHARACTER_MAN_ARTIST_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F3A8}", - 'CHARACTER_MAN_ARTIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F3A8}", - 'CHARACTER_MAN_ARTIST_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F3A8}", - 'CHARACTER_MAN_ARTIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F3A8}", - 'CHARACTER_MAN_ARTIST_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F3A8}", - 'CHARACTER_WOMAN_ARTIST' => "\u{1F469}\u{200D}\u{1F3A8}", - 'CHARACTER_WOMAN_ARTIST_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F3A8}", - 'CHARACTER_WOMAN_ARTIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F3A8}", - 'CHARACTER_WOMAN_ARTIST_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F3A8}", - 'CHARACTER_WOMAN_ARTIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F3A8}", - 'CHARACTER_WOMAN_ARTIST_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F3A8}", - 'CHARACTER_MAN_PILOT' => "\u{1F468}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_MAN_PILOT_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_MAN_PILOT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_MAN_PILOT_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_MAN_PILOT_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_MAN_PILOT_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_WOMAN_PILOT' => "\u{1F469}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_WOMAN_PILOT_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_WOMAN_PILOT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_WOMAN_PILOT_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_WOMAN_PILOT_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_WOMAN_PILOT_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{2708}\u{FE0F}", - 'CHARACTER_MAN_ASTRONAUT' => "\u{1F468}\u{200D}\u{1F680}", - 'CHARACTER_MAN_ASTRONAUT_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F680}", - 'CHARACTER_MAN_ASTRONAUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F680}", - 'CHARACTER_MAN_ASTRONAUT_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F680}", - 'CHARACTER_MAN_ASTRONAUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F680}", - 'CHARACTER_MAN_ASTRONAUT_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F680}", - 'CHARACTER_WOMAN_ASTRONAUT' => "\u{1F469}\u{200D}\u{1F680}", - 'CHARACTER_WOMAN_ASTRONAUT_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F680}", - 'CHARACTER_WOMAN_ASTRONAUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F680}", - 'CHARACTER_WOMAN_ASTRONAUT_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F680}", - 'CHARACTER_WOMAN_ASTRONAUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F680}", - 'CHARACTER_WOMAN_ASTRONAUT_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F680}", - 'CHARACTER_MAN_FIREFIGHTER' => "\u{1F468}\u{200D}\u{1F692}", - 'CHARACTER_MAN_FIREFIGHTER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F692}", - 'CHARACTER_MAN_FIREFIGHTER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F692}", - 'CHARACTER_MAN_FIREFIGHTER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F692}", - 'CHARACTER_MAN_FIREFIGHTER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F692}", - 'CHARACTER_MAN_FIREFIGHTER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F692}", - 'CHARACTER_WOMAN_FIREFIGHTER' => "\u{1F469}\u{200D}\u{1F692}", - 'CHARACTER_WOMAN_FIREFIGHTER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F692}", - 'CHARACTER_WOMAN_FIREFIGHTER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F692}", - 'CHARACTER_WOMAN_FIREFIGHTER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F692}", - 'CHARACTER_WOMAN_FIREFIGHTER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F692}", - 'CHARACTER_WOMAN_FIREFIGHTER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F692}", - 'CHARACTER_POLICE_OFFICER' => "\u{1F46E}", - 'CHARACTER_POLICE_OFFICER_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FB}", - 'CHARACTER_POLICE_OFFICER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FC}", - 'CHARACTER_POLICE_OFFICER_MEDIUM_SKIN_TONE' => "\u{1F46E}\u{1F3FD}", - 'CHARACTER_POLICE_OFFICER_MEDIUM_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FE}", - 'CHARACTER_POLICE_OFFICER_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FF}", - 'CHARACTER_MAN_POLICE_OFFICER' => "\u{1F46E}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POLICE_OFFICER_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POLICE_OFFICER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POLICE_OFFICER_MEDIUM_SKIN_TONE' => "\u{1F46E}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POLICE_OFFICER_MEDIUM_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POLICE_OFFICER_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_POLICE_OFFICER' => "\u{1F46E}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POLICE_OFFICER_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POLICE_OFFICER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POLICE_OFFICER_MEDIUM_SKIN_TONE' => "\u{1F46E}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POLICE_OFFICER_MEDIUM_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POLICE_OFFICER_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_DETECTIVE' => "\u{1F575}\u{FE0F}", - 'CHARACTER_DETECTIVE_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FB}", - 'CHARACTER_DETECTIVE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FC}", - 'CHARACTER_DETECTIVE_MEDIUM_SKIN_TONE' => "\u{1F575}\u{1F3FD}", - 'CHARACTER_DETECTIVE_MEDIUM_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FE}", - 'CHARACTER_DETECTIVE_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FF}", - 'CHARACTER_MAN_DETECTIVE' => "\u{1F575}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_DETECTIVE_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_DETECTIVE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_DETECTIVE_MEDIUM_SKIN_TONE' => "\u{1F575}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_DETECTIVE_MEDIUM_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_DETECTIVE_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_DETECTIVE' => "\u{1F575}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_DETECTIVE_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_DETECTIVE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_DETECTIVE_MEDIUM_SKIN_TONE' => "\u{1F575}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_DETECTIVE_MEDIUM_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_DETECTIVE_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_GUARD' => "\u{1F482}", - 'CHARACTER_GUARD_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FB}", - 'CHARACTER_GUARD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FC}", - 'CHARACTER_GUARD_MEDIUM_SKIN_TONE' => "\u{1F482}\u{1F3FD}", - 'CHARACTER_GUARD_MEDIUM_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FE}", - 'CHARACTER_GUARD_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FF}", - 'CHARACTER_MAN_GUARD' => "\u{1F482}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GUARD_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GUARD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GUARD_MEDIUM_SKIN_TONE' => "\u{1F482}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GUARD_MEDIUM_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GUARD_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_GUARD' => "\u{1F482}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GUARD_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GUARD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GUARD_MEDIUM_SKIN_TONE' => "\u{1F482}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GUARD_MEDIUM_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GUARD_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_CONSTRUCTION_WORKER' => "\u{1F477}", - 'CHARACTER_CONSTRUCTION_WORKER_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FB}", - 'CHARACTER_CONSTRUCTION_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FC}", - 'CHARACTER_CONSTRUCTION_WORKER_MEDIUM_SKIN_TONE' => "\u{1F477}\u{1F3FD}", - 'CHARACTER_CONSTRUCTION_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FE}", - 'CHARACTER_CONSTRUCTION_WORKER_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FF}", - 'CHARACTER_MAN_CONSTRUCTION_WORKER' => "\u{1F477}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CONSTRUCTION_WORKER_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CONSTRUCTION_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CONSTRUCTION_WORKER_MEDIUM_SKIN_TONE' => "\u{1F477}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CONSTRUCTION_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CONSTRUCTION_WORKER_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_CONSTRUCTION_WORKER' => "\u{1F477}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_MEDIUM_SKIN_TONE' => "\u{1F477}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PRINCE' => "\u{1F934}", - 'CHARACTER_PRINCE_LIGHT_SKIN_TONE' => "\u{1F934}\u{1F3FB}", - 'CHARACTER_PRINCE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F934}\u{1F3FC}", - 'CHARACTER_PRINCE_MEDIUM_SKIN_TONE' => "\u{1F934}\u{1F3FD}", - 'CHARACTER_PRINCE_MEDIUM_DARK_SKIN_TONE' => "\u{1F934}\u{1F3FE}", - 'CHARACTER_PRINCE_DARK_SKIN_TONE' => "\u{1F934}\u{1F3FF}", - 'CHARACTER_PRINCESS' => "\u{1F478}", - 'CHARACTER_PRINCESS_LIGHT_SKIN_TONE' => "\u{1F478}\u{1F3FB}", - 'CHARACTER_PRINCESS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F478}\u{1F3FC}", - 'CHARACTER_PRINCESS_MEDIUM_SKIN_TONE' => "\u{1F478}\u{1F3FD}", - 'CHARACTER_PRINCESS_MEDIUM_DARK_SKIN_TONE' => "\u{1F478}\u{1F3FE}", - 'CHARACTER_PRINCESS_DARK_SKIN_TONE' => "\u{1F478}\u{1F3FF}", - 'CHARACTER_PERSON_WEARING_TURBAN' => "\u{1F473}", - 'CHARACTER_PERSON_WEARING_TURBAN_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FB}", - 'CHARACTER_PERSON_WEARING_TURBAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FC}", - 'CHARACTER_PERSON_WEARING_TURBAN_MEDIUM_SKIN_TONE' => "\u{1F473}\u{1F3FD}", - 'CHARACTER_PERSON_WEARING_TURBAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FE}", - 'CHARACTER_PERSON_WEARING_TURBAN_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FF}", - 'CHARACTER_MAN_WEARING_TURBAN' => "\u{1F473}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WEARING_TURBAN_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WEARING_TURBAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WEARING_TURBAN_MEDIUM_SKIN_TONE' => "\u{1F473}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WEARING_TURBAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WEARING_TURBAN_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_WEARING_TURBAN' => "\u{1F473}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WEARING_TURBAN_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WEARING_TURBAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WEARING_TURBAN_MEDIUM_SKIN_TONE' => "\u{1F473}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WEARING_TURBAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WEARING_TURBAN_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_WITH_CHINESE_CAP' => "\u{1F472}", - 'CHARACTER_MAN_WITH_CHINESE_CAP_LIGHT_SKIN_TONE' => "\u{1F472}\u{1F3FB}", - 'CHARACTER_MAN_WITH_CHINESE_CAP_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F472}\u{1F3FC}", - 'CHARACTER_MAN_WITH_CHINESE_CAP_MEDIUM_SKIN_TONE' => "\u{1F472}\u{1F3FD}", - 'CHARACTER_MAN_WITH_CHINESE_CAP_MEDIUM_DARK_SKIN_TONE' => "\u{1F472}\u{1F3FE}", - 'CHARACTER_MAN_WITH_CHINESE_CAP_DARK_SKIN_TONE' => "\u{1F472}\u{1F3FF}", - 'CHARACTER_WOMAN_WITH_HEADSCARF' => "\u{1F9D5}", - 'CHARACTER_WOMAN_WITH_HEADSCARF_LIGHT_SKIN_TONE' => "\u{1F9D5}\u{1F3FB}", - 'CHARACTER_WOMAN_WITH_HEADSCARF_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D5}\u{1F3FC}", - 'CHARACTER_WOMAN_WITH_HEADSCARF_MEDIUM_SKIN_TONE' => "\u{1F9D5}\u{1F3FD}", - 'CHARACTER_WOMAN_WITH_HEADSCARF_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D5}\u{1F3FE}", - 'CHARACTER_WOMAN_WITH_HEADSCARF_DARK_SKIN_TONE' => "\u{1F9D5}\u{1F3FF}", - 'CHARACTER_BEARDED_PERSON' => "\u{1F9D4}", - 'CHARACTER_BEARDED_PERSON_LIGHT_SKIN_TONE' => "\u{1F9D4}\u{1F3FB}", - 'CHARACTER_BEARDED_PERSON_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D4}\u{1F3FC}", - 'CHARACTER_BEARDED_PERSON_MEDIUM_SKIN_TONE' => "\u{1F9D4}\u{1F3FD}", - 'CHARACTER_BEARDED_PERSON_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D4}\u{1F3FE}", - 'CHARACTER_BEARDED_PERSON_DARK_SKIN_TONE' => "\u{1F9D4}\u{1F3FF}", - 'CHARACTER_BLOND_HAIRED_PERSON' => "\u{1F471}", - 'CHARACTER_BLOND_HAIRED_PERSON_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FB}", - 'CHARACTER_BLOND_HAIRED_PERSON_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FC}", - 'CHARACTER_BLOND_HAIRED_PERSON_MEDIUM_SKIN_TONE' => "\u{1F471}\u{1F3FD}", - 'CHARACTER_BLOND_HAIRED_PERSON_MEDIUM_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FE}", - 'CHARACTER_BLOND_HAIRED_PERSON_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FF}", - 'CHARACTER_BLOND_HAIRED_MAN' => "\u{1F471}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_MAN_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_MAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_MAN_MEDIUM_SKIN_TONE' => "\u{1F471}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_MAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_MAN_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_WOMAN' => "\u{1F471}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_WOMAN_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_WOMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_WOMAN_MEDIUM_SKIN_TONE' => "\u{1F471}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_WOMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_BLOND_HAIRED_WOMAN_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_RED_HAIRED' => "\u{1F468}\u{200D}\u{1F9B0}", - 'CHARACTER_MAN_RED_HAIRED_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F9B0}", - 'CHARACTER_MAN_RED_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F9B0}", - 'CHARACTER_MAN_RED_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F9B0}", - 'CHARACTER_MAN_RED_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F9B0}", - 'CHARACTER_MAN_RED_HAIRED_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F9B0}", - 'CHARACTER_WOMAN_RED_HAIRED' => "\u{1F469}\u{200D}\u{1F9B0}", - 'CHARACTER_WOMAN_RED_HAIRED_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F9B0}", - 'CHARACTER_WOMAN_RED_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F9B0}", - 'CHARACTER_WOMAN_RED_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F9B0}", - 'CHARACTER_WOMAN_RED_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F9B0}", - 'CHARACTER_WOMAN_RED_HAIRED_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F9B0}", - 'CHARACTER_MAN_CURLY_HAIRED' => "\u{1F468}\u{200D}\u{1F9B1}", - 'CHARACTER_MAN_CURLY_HAIRED_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F9B1}", - 'CHARACTER_MAN_CURLY_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F9B1}", - 'CHARACTER_MAN_CURLY_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F9B1}", - 'CHARACTER_MAN_CURLY_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F9B1}", - 'CHARACTER_MAN_CURLY_HAIRED_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F9B1}", - 'CHARACTER_WOMAN_CURLY_HAIRED' => "\u{1F469}\u{200D}\u{1F9B1}", - 'CHARACTER_WOMAN_CURLY_HAIRED_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F9B1}", - 'CHARACTER_WOMAN_CURLY_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F9B1}", - 'CHARACTER_WOMAN_CURLY_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F9B1}", - 'CHARACTER_WOMAN_CURLY_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F9B1}", - 'CHARACTER_WOMAN_CURLY_HAIRED_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F9B1}", - 'CHARACTER_MAN_BALD' => "\u{1F468}\u{200D}\u{1F9B2}", - 'CHARACTER_MAN_BALD_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F9B2}", - 'CHARACTER_MAN_BALD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F9B2}", - 'CHARACTER_MAN_BALD_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F9B2}", - 'CHARACTER_MAN_BALD_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F9B2}", - 'CHARACTER_MAN_BALD_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F9B2}", - 'CHARACTER_WOMAN_BALD' => "\u{1F469}\u{200D}\u{1F9B2}", - 'CHARACTER_WOMAN_BALD_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F9B2}", - 'CHARACTER_WOMAN_BALD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F9B2}", - 'CHARACTER_WOMAN_BALD_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F9B2}", - 'CHARACTER_WOMAN_BALD_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F9B2}", - 'CHARACTER_WOMAN_BALD_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F9B2}", - 'CHARACTER_MAN_WHITE_HAIRED' => "\u{1F468}\u{200D}\u{1F9B3}", - 'CHARACTER_MAN_WHITE_HAIRED_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F9B3}", - 'CHARACTER_MAN_WHITE_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F9B3}", - 'CHARACTER_MAN_WHITE_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F9B3}", - 'CHARACTER_MAN_WHITE_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F9B3}", - 'CHARACTER_MAN_WHITE_HAIRED_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F9B3}", - 'CHARACTER_WOMAN_WHITE_HAIRED' => "\u{1F469}\u{200D}\u{1F9B3}", - 'CHARACTER_WOMAN_WHITE_HAIRED_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F9B3}", - 'CHARACTER_WOMAN_WHITE_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F9B3}", - 'CHARACTER_WOMAN_WHITE_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F9B3}", - 'CHARACTER_WOMAN_WHITE_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F9B3}", - 'CHARACTER_WOMAN_WHITE_HAIRED_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F9B3}", - 'CHARACTER_MAN_IN_TUXEDO' => "\u{1F935}", - 'CHARACTER_MAN_IN_TUXEDO_LIGHT_SKIN_TONE' => "\u{1F935}\u{1F3FB}", - 'CHARACTER_MAN_IN_TUXEDO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F935}\u{1F3FC}", - 'CHARACTER_MAN_IN_TUXEDO_MEDIUM_SKIN_TONE' => "\u{1F935}\u{1F3FD}", - 'CHARACTER_MAN_IN_TUXEDO_MEDIUM_DARK_SKIN_TONE' => "\u{1F935}\u{1F3FE}", - 'CHARACTER_MAN_IN_TUXEDO_DARK_SKIN_TONE' => "\u{1F935}\u{1F3FF}", - 'CHARACTER_BRIDE_WITH_VEIL' => "\u{1F470}", - 'CHARACTER_BRIDE_WITH_VEIL_LIGHT_SKIN_TONE' => "\u{1F470}\u{1F3FB}", - 'CHARACTER_BRIDE_WITH_VEIL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F470}\u{1F3FC}", - 'CHARACTER_BRIDE_WITH_VEIL_MEDIUM_SKIN_TONE' => "\u{1F470}\u{1F3FD}", - 'CHARACTER_BRIDE_WITH_VEIL_MEDIUM_DARK_SKIN_TONE' => "\u{1F470}\u{1F3FE}", - 'CHARACTER_BRIDE_WITH_VEIL_DARK_SKIN_TONE' => "\u{1F470}\u{1F3FF}", - 'CHARACTER_PREGNANT_WOMAN' => "\u{1F930}", - 'CHARACTER_PREGNANT_WOMAN_LIGHT_SKIN_TONE' => "\u{1F930}\u{1F3FB}", - 'CHARACTER_PREGNANT_WOMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F930}\u{1F3FC}", - 'CHARACTER_PREGNANT_WOMAN_MEDIUM_SKIN_TONE' => "\u{1F930}\u{1F3FD}", - 'CHARACTER_PREGNANT_WOMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F930}\u{1F3FE}", - 'CHARACTER_PREGNANT_WOMAN_DARK_SKIN_TONE' => "\u{1F930}\u{1F3FF}", - 'CHARACTER_BREAST_FEEDING' => "\u{1F931}", - 'CHARACTER_BREAST_FEEDING_LIGHT_SKIN_TONE' => "\u{1F931}\u{1F3FB}", - 'CHARACTER_BREAST_FEEDING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F931}\u{1F3FC}", - 'CHARACTER_BREAST_FEEDING_MEDIUM_SKIN_TONE' => "\u{1F931}\u{1F3FD}", - 'CHARACTER_BREAST_FEEDING_MEDIUM_DARK_SKIN_TONE' => "\u{1F931}\u{1F3FE}", - 'CHARACTER_BREAST_FEEDING_DARK_SKIN_TONE' => "\u{1F931}\u{1F3FF}", - // ##### Emoji subgroup: Person-fantasy ##### - 'CHARACTER_BABY_ANGEL' => "\u{1F47C}", - 'CHARACTER_BABY_ANGEL_LIGHT_SKIN_TONE' => "\u{1F47C}\u{1F3FB}", - 'CHARACTER_BABY_ANGEL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F47C}\u{1F3FC}", - 'CHARACTER_BABY_ANGEL_MEDIUM_SKIN_TONE' => "\u{1F47C}\u{1F3FD}", - 'CHARACTER_BABY_ANGEL_MEDIUM_DARK_SKIN_TONE' => "\u{1F47C}\u{1F3FE}", - 'CHARACTER_BABY_ANGEL_DARK_SKIN_TONE' => "\u{1F47C}\u{1F3FF}", - 'CHARACTER_SANTA_CLAUS' => "\u{1F385}", - 'CHARACTER_SANTA_CLAUS_LIGHT_SKIN_TONE' => "\u{1F385}\u{1F3FB}", - 'CHARACTER_SANTA_CLAUS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F385}\u{1F3FC}", - 'CHARACTER_SANTA_CLAUS_MEDIUM_SKIN_TONE' => "\u{1F385}\u{1F3FD}", - 'CHARACTER_SANTA_CLAUS_MEDIUM_DARK_SKIN_TONE' => "\u{1F385}\u{1F3FE}", - 'CHARACTER_SANTA_CLAUS_DARK_SKIN_TONE' => "\u{1F385}\u{1F3FF}", - 'CHARACTER_MRS_CLAUS' => "\u{1F936}", - 'CHARACTER_MRS_CLAUS_LIGHT_SKIN_TONE' => "\u{1F936}\u{1F3FB}", - 'CHARACTER_MRS_CLAUS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F936}\u{1F3FC}", - 'CHARACTER_MRS_CLAUS_MEDIUM_SKIN_TONE' => "\u{1F936}\u{1F3FD}", - 'CHARACTER_MRS_CLAUS_MEDIUM_DARK_SKIN_TONE' => "\u{1F936}\u{1F3FE}", - 'CHARACTER_MRS_CLAUS_DARK_SKIN_TONE' => "\u{1F936}\u{1F3FF}", - 'CHARACTER_SUPERHERO' => "\u{1F9B8}", - 'CHARACTER_SUPERHERO_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FB}", - 'CHARACTER_SUPERHERO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FC}", - 'CHARACTER_SUPERHERO_MEDIUM_SKIN_TONE' => "\u{1F9B8}\u{1F3FD}", - 'CHARACTER_SUPERHERO_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FE}", - 'CHARACTER_SUPERHERO_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FF}", - 'CHARACTER_WOMAN_SUPERHERO' => "\u{1F9B8}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERHERO_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERHERO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERHERO_MEDIUM_SKIN_TONE' => "\u{1F9B8}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERHERO_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERHERO_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_SUPERHERO' => "\u{1F9B8}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERHERO_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERHERO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERHERO_MEDIUM_SKIN_TONE' => "\u{1F9B8}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERHERO_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERHERO_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_SUPERVILLAIN' => "\u{1F9B9}", - 'CHARACTER_SUPERVILLAIN_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FB}", - 'CHARACTER_SUPERVILLAIN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FC}", - 'CHARACTER_SUPERVILLAIN_MEDIUM_SKIN_TONE' => "\u{1F9B9}\u{1F3FD}", - 'CHARACTER_SUPERVILLAIN_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FE}", - 'CHARACTER_SUPERVILLAIN_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FF}", - 'CHARACTER_WOMAN_SUPERVILLAIN' => "\u{1F9B9}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERVILLAIN_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERVILLAIN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERVILLAIN_MEDIUM_SKIN_TONE' => "\u{1F9B9}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERVILLAIN_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SUPERVILLAIN_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_SUPERVILLAIN' => "\u{1F9B9}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERVILLAIN_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERVILLAIN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERVILLAIN_MEDIUM_SKIN_TONE' => "\u{1F9B9}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERVILLAIN_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SUPERVILLAIN_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAGE' => "\u{1F9D9}", - 'CHARACTER_MAGE_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FB}", - 'CHARACTER_MAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FC}", - 'CHARACTER_MAGE_MEDIUM_SKIN_TONE' => "\u{1F9D9}\u{1F3FD}", - 'CHARACTER_MAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FE}", - 'CHARACTER_MAGE_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FF}", - 'CHARACTER_WOMAN_MAGE' => "\u{1F9D9}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MAGE_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MAGE_MEDIUM_SKIN_TONE' => "\u{1F9D9}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MAGE_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_MAGE' => "\u{1F9D9}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MAGE_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MAGE_MEDIUM_SKIN_TONE' => "\u{1F9D9}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MAGE_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_FAIRY' => "\u{1F9DA}", - 'CHARACTER_FAIRY_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FB}", - 'CHARACTER_FAIRY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FC}", - 'CHARACTER_FAIRY_MEDIUM_SKIN_TONE' => "\u{1F9DA}\u{1F3FD}", - 'CHARACTER_FAIRY_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FE}", - 'CHARACTER_FAIRY_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FF}", - 'CHARACTER_WOMAN_FAIRY' => "\u{1F9DA}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FAIRY_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FAIRY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FAIRY_MEDIUM_SKIN_TONE' => "\u{1F9DA}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FAIRY_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FAIRY_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_FAIRY' => "\u{1F9DA}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FAIRY_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FAIRY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FAIRY_MEDIUM_SKIN_TONE' => "\u{1F9DA}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FAIRY_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FAIRY_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_VAMPIRE' => "\u{1F9DB}", - 'CHARACTER_VAMPIRE_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FB}", - 'CHARACTER_VAMPIRE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FC}", - 'CHARACTER_VAMPIRE_MEDIUM_SKIN_TONE' => "\u{1F9DB}\u{1F3FD}", - 'CHARACTER_VAMPIRE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FE}", - 'CHARACTER_VAMPIRE_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FF}", - 'CHARACTER_WOMAN_VAMPIRE' => "\u{1F9DB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_VAMPIRE_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_VAMPIRE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_VAMPIRE_MEDIUM_SKIN_TONE' => "\u{1F9DB}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_VAMPIRE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_VAMPIRE_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_VAMPIRE' => "\u{1F9DB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_VAMPIRE_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_VAMPIRE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_VAMPIRE_MEDIUM_SKIN_TONE' => "\u{1F9DB}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_VAMPIRE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_VAMPIRE_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MERPERSON' => "\u{1F9DC}", - 'CHARACTER_MERPERSON_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FB}", - 'CHARACTER_MERPERSON_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FC}", - 'CHARACTER_MERPERSON_MEDIUM_SKIN_TONE' => "\u{1F9DC}\u{1F3FD}", - 'CHARACTER_MERPERSON_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FE}", - 'CHARACTER_MERPERSON_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FF}", - 'CHARACTER_MERMAID' => "\u{1F9DC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MERMAID_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MERMAID_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MERMAID_MEDIUM_SKIN_TONE' => "\u{1F9DC}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MERMAID_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MERMAID_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MERMAN' => "\u{1F9DC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MERMAN_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MERMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MERMAN_MEDIUM_SKIN_TONE' => "\u{1F9DC}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MERMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MERMAN_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_ELF' => "\u{1F9DD}", - 'CHARACTER_ELF_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FB}", - 'CHARACTER_ELF_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FC}", - 'CHARACTER_ELF_MEDIUM_SKIN_TONE' => "\u{1F9DD}\u{1F3FD}", - 'CHARACTER_ELF_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FE}", - 'CHARACTER_ELF_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FF}", - 'CHARACTER_WOMAN_ELF' => "\u{1F9DD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ELF_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ELF_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ELF_MEDIUM_SKIN_TONE' => "\u{1F9DD}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ELF_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ELF_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_ELF' => "\u{1F9DD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ELF_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ELF_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ELF_MEDIUM_SKIN_TONE' => "\u{1F9DD}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ELF_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ELF_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_GENIE' => "\u{1F9DE}", - 'CHARACTER_WOMAN_GENIE' => "\u{1F9DE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_GENIE' => "\u{1F9DE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_ZOMBIE' => "\u{1F9DF}", - 'CHARACTER_WOMAN_ZOMBIE' => "\u{1F9DF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_ZOMBIE' => "\u{1F9DF}\u{200D}\u{2642}\u{FE0F}", - // ##### Emoji subgroup: Person-gesture ##### - 'CHARACTER_PERSON_FROWNING' => "\u{1F64D}", - 'CHARACTER_PERSON_FROWNING_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FB}", - 'CHARACTER_PERSON_FROWNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FC}", - 'CHARACTER_PERSON_FROWNING_MEDIUM_SKIN_TONE' => "\u{1F64D}\u{1F3FD}", - 'CHARACTER_PERSON_FROWNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FE}", - 'CHARACTER_PERSON_FROWNING_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FF}", - 'CHARACTER_MAN_FROWNING' => "\u{1F64D}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FROWNING_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FROWNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FROWNING_MEDIUM_SKIN_TONE' => "\u{1F64D}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FROWNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FROWNING_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_FROWNING' => "\u{1F64D}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FROWNING_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FROWNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FROWNING_MEDIUM_SKIN_TONE' => "\u{1F64D}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FROWNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FROWNING_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_POUTING' => "\u{1F64E}", - 'CHARACTER_PERSON_POUTING_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FB}", - 'CHARACTER_PERSON_POUTING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FC}", - 'CHARACTER_PERSON_POUTING_MEDIUM_SKIN_TONE' => "\u{1F64E}\u{1F3FD}", - 'CHARACTER_PERSON_POUTING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FE}", - 'CHARACTER_PERSON_POUTING_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FF}", - 'CHARACTER_MAN_POUTING' => "\u{1F64E}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POUTING_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POUTING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POUTING_MEDIUM_SKIN_TONE' => "\u{1F64E}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POUTING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_POUTING_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_POUTING' => "\u{1F64E}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POUTING_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POUTING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POUTING_MEDIUM_SKIN_TONE' => "\u{1F64E}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POUTING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_POUTING_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_GESTURING_NO' => "\u{1F645}", - 'CHARACTER_PERSON_GESTURING_NO_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FB}", - 'CHARACTER_PERSON_GESTURING_NO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FC}", - 'CHARACTER_PERSON_GESTURING_NO_MEDIUM_SKIN_TONE' => "\u{1F645}\u{1F3FD}", - 'CHARACTER_PERSON_GESTURING_NO_MEDIUM_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FE}", - 'CHARACTER_PERSON_GESTURING_NO_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FF}", - 'CHARACTER_MAN_GESTURING_NO' => "\u{1F645}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_NO_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_NO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_NO_MEDIUM_SKIN_TONE' => "\u{1F645}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_NO_MEDIUM_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_NO_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_NO' => "\u{1F645}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_NO_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_NO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_NO_MEDIUM_SKIN_TONE' => "\u{1F645}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_NO_MEDIUM_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_NO_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_GESTURING_OK' => "\u{1F646}", - 'CHARACTER_PERSON_GESTURING_OK_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FB}", - 'CHARACTER_PERSON_GESTURING_OK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FC}", - 'CHARACTER_PERSON_GESTURING_OK_MEDIUM_SKIN_TONE' => "\u{1F646}\u{1F3FD}", - 'CHARACTER_PERSON_GESTURING_OK_MEDIUM_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FE}", - 'CHARACTER_PERSON_GESTURING_OK_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FF}", - 'CHARACTER_MAN_GESTURING_OK' => "\u{1F646}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_OK_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_OK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_OK_MEDIUM_SKIN_TONE' => "\u{1F646}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_OK_MEDIUM_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GESTURING_OK_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_OK' => "\u{1F646}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_OK_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_OK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_OK_MEDIUM_SKIN_TONE' => "\u{1F646}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_OK_MEDIUM_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GESTURING_OK_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_TIPPING_HAND' => "\u{1F481}", - 'CHARACTER_PERSON_TIPPING_HAND_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FB}", - 'CHARACTER_PERSON_TIPPING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FC}", - 'CHARACTER_PERSON_TIPPING_HAND_MEDIUM_SKIN_TONE' => "\u{1F481}\u{1F3FD}", - 'CHARACTER_PERSON_TIPPING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FE}", - 'CHARACTER_PERSON_TIPPING_HAND_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FF}", - 'CHARACTER_MAN_TIPPING_HAND' => "\u{1F481}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_TIPPING_HAND_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_TIPPING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_TIPPING_HAND_MEDIUM_SKIN_TONE' => "\u{1F481}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_TIPPING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_TIPPING_HAND_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_TIPPING_HAND' => "\u{1F481}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_TIPPING_HAND_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_TIPPING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_TIPPING_HAND_MEDIUM_SKIN_TONE' => "\u{1F481}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_TIPPING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_TIPPING_HAND_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_RAISING_HAND' => "\u{1F64B}", - 'CHARACTER_PERSON_RAISING_HAND_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FB}", - 'CHARACTER_PERSON_RAISING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FC}", - 'CHARACTER_PERSON_RAISING_HAND_MEDIUM_SKIN_TONE' => "\u{1F64B}\u{1F3FD}", - 'CHARACTER_PERSON_RAISING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FE}", - 'CHARACTER_PERSON_RAISING_HAND_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FF}", - 'CHARACTER_MAN_RAISING_HAND' => "\u{1F64B}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RAISING_HAND_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RAISING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RAISING_HAND_MEDIUM_SKIN_TONE' => "\u{1F64B}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RAISING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RAISING_HAND_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_RAISING_HAND' => "\u{1F64B}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RAISING_HAND_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RAISING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RAISING_HAND_MEDIUM_SKIN_TONE' => "\u{1F64B}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RAISING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RAISING_HAND_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_BOWING' => "\u{1F647}", - 'CHARACTER_PERSON_BOWING_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FB}", - 'CHARACTER_PERSON_BOWING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FC}", - 'CHARACTER_PERSON_BOWING_MEDIUM_SKIN_TONE' => "\u{1F647}\u{1F3FD}", - 'CHARACTER_PERSON_BOWING_MEDIUM_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FE}", - 'CHARACTER_PERSON_BOWING_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FF}", - 'CHARACTER_MAN_BOWING' => "\u{1F647}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOWING_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOWING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOWING_MEDIUM_SKIN_TONE' => "\u{1F647}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOWING_MEDIUM_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOWING_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_BOWING' => "\u{1F647}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOWING_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOWING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOWING_MEDIUM_SKIN_TONE' => "\u{1F647}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOWING_MEDIUM_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOWING_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_FACEPALMING' => "\u{1F926}", - 'CHARACTER_PERSON_FACEPALMING_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FB}", - 'CHARACTER_PERSON_FACEPALMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FC}", - 'CHARACTER_PERSON_FACEPALMING_MEDIUM_SKIN_TONE' => "\u{1F926}\u{1F3FD}", - 'CHARACTER_PERSON_FACEPALMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FE}", - 'CHARACTER_PERSON_FACEPALMING_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FF}", - 'CHARACTER_MAN_FACEPALMING' => "\u{1F926}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FACEPALMING_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FACEPALMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FACEPALMING_MEDIUM_SKIN_TONE' => "\u{1F926}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FACEPALMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_FACEPALMING_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_FACEPALMING' => "\u{1F926}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FACEPALMING_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FACEPALMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FACEPALMING_MEDIUM_SKIN_TONE' => "\u{1F926}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FACEPALMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_FACEPALMING_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_SHRUGGING' => "\u{1F937}", - 'CHARACTER_PERSON_SHRUGGING_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FB}", - 'CHARACTER_PERSON_SHRUGGING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FC}", - 'CHARACTER_PERSON_SHRUGGING_MEDIUM_SKIN_TONE' => "\u{1F937}\u{1F3FD}", - 'CHARACTER_PERSON_SHRUGGING_MEDIUM_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FE}", - 'CHARACTER_PERSON_SHRUGGING_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FF}", - 'CHARACTER_MAN_SHRUGGING' => "\u{1F937}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SHRUGGING_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SHRUGGING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SHRUGGING_MEDIUM_SKIN_TONE' => "\u{1F937}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SHRUGGING_MEDIUM_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SHRUGGING_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_SHRUGGING' => "\u{1F937}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SHRUGGING_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SHRUGGING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SHRUGGING_MEDIUM_SKIN_TONE' => "\u{1F937}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SHRUGGING_MEDIUM_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SHRUGGING_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - // ##### Emoji subgroup: Person-activity ##### - 'CHARACTER_PERSON_GETTING_MASSAGE' => "\u{1F486}", - 'CHARACTER_PERSON_GETTING_MASSAGE_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FB}", - 'CHARACTER_PERSON_GETTING_MASSAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FC}", - 'CHARACTER_PERSON_GETTING_MASSAGE_MEDIUM_SKIN_TONE' => "\u{1F486}\u{1F3FD}", - 'CHARACTER_PERSON_GETTING_MASSAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FE}", - 'CHARACTER_PERSON_GETTING_MASSAGE_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FF}", - 'CHARACTER_MAN_GETTING_MASSAGE' => "\u{1F486}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_MASSAGE_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_MASSAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_MASSAGE_MEDIUM_SKIN_TONE' => "\u{1F486}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_MASSAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_MASSAGE_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_MASSAGE' => "\u{1F486}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_MASSAGE_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_MASSAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_MASSAGE_MEDIUM_SKIN_TONE' => "\u{1F486}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_MASSAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_MASSAGE_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_GETTING_HAIRCUT' => "\u{1F487}", - 'CHARACTER_PERSON_GETTING_HAIRCUT_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FB}", - 'CHARACTER_PERSON_GETTING_HAIRCUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FC}", - 'CHARACTER_PERSON_GETTING_HAIRCUT_MEDIUM_SKIN_TONE' => "\u{1F487}\u{1F3FD}", - 'CHARACTER_PERSON_GETTING_HAIRCUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FE}", - 'CHARACTER_PERSON_GETTING_HAIRCUT_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FF}", - 'CHARACTER_MAN_GETTING_HAIRCUT' => "\u{1F487}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_HAIRCUT_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_HAIRCUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_HAIRCUT_MEDIUM_SKIN_TONE' => "\u{1F487}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_HAIRCUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GETTING_HAIRCUT_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_HAIRCUT' => "\u{1F487}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_HAIRCUT_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_HAIRCUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_HAIRCUT_MEDIUM_SKIN_TONE' => "\u{1F487}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_HAIRCUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GETTING_HAIRCUT_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_WALKING' => "\u{1F6B6}", - 'CHARACTER_PERSON_WALKING_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FB}", - 'CHARACTER_PERSON_WALKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FC}", - 'CHARACTER_PERSON_WALKING_MEDIUM_SKIN_TONE' => "\u{1F6B6}\u{1F3FD}", - 'CHARACTER_PERSON_WALKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FE}", - 'CHARACTER_PERSON_WALKING_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FF}", - 'CHARACTER_MAN_WALKING' => "\u{1F6B6}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WALKING_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WALKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WALKING_MEDIUM_SKIN_TONE' => "\u{1F6B6}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WALKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_WALKING_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_WALKING' => "\u{1F6B6}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WALKING_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WALKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WALKING_MEDIUM_SKIN_TONE' => "\u{1F6B6}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WALKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_WALKING_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_RUNNING' => "\u{1F3C3}", - 'CHARACTER_PERSON_RUNNING_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FB}", - 'CHARACTER_PERSON_RUNNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FC}", - 'CHARACTER_PERSON_RUNNING_MEDIUM_SKIN_TONE' => "\u{1F3C3}\u{1F3FD}", - 'CHARACTER_PERSON_RUNNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FE}", - 'CHARACTER_PERSON_RUNNING_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FF}", - 'CHARACTER_MAN_RUNNING' => "\u{1F3C3}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RUNNING_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RUNNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RUNNING_MEDIUM_SKIN_TONE' => "\u{1F3C3}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RUNNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_RUNNING_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_RUNNING' => "\u{1F3C3}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RUNNING_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RUNNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RUNNING_MEDIUM_SKIN_TONE' => "\u{1F3C3}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RUNNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_RUNNING_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_DANCING' => "\u{1F483}", - 'CHARACTER_WOMAN_DANCING_LIGHT_SKIN_TONE' => "\u{1F483}\u{1F3FB}", - 'CHARACTER_WOMAN_DANCING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F483}\u{1F3FC}", - 'CHARACTER_WOMAN_DANCING_MEDIUM_SKIN_TONE' => "\u{1F483}\u{1F3FD}", - 'CHARACTER_WOMAN_DANCING_MEDIUM_DARK_SKIN_TONE' => "\u{1F483}\u{1F3FE}", - 'CHARACTER_WOMAN_DANCING_DARK_SKIN_TONE' => "\u{1F483}\u{1F3FF}", - 'CHARACTER_MAN_DANCING' => "\u{1F57A}", - 'CHARACTER_MAN_DANCING_LIGHT_SKIN_TONE' => "\u{1F57A}\u{1F3FB}", - 'CHARACTER_MAN_DANCING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F57A}\u{1F3FC}", - 'CHARACTER_MAN_DANCING_MEDIUM_SKIN_TONE' => "\u{1F57A}\u{1F3FD}", - 'CHARACTER_MAN_DANCING_MEDIUM_DARK_SKIN_TONE' => "\u{1F57A}\u{1F3FE}", - 'CHARACTER_MAN_DANCING_DARK_SKIN_TONE' => "\u{1F57A}\u{1F3FF}", - 'CHARACTER_PEOPLE_WITH_BUNNY_EARS' => "\u{1F46F}", - 'CHARACTER_MEN_WITH_BUNNY_EARS' => "\u{1F46F}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMEN_WITH_BUNNY_EARS' => "\u{1F46F}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_IN_STEAMY_ROOM' => "\u{1F9D6}", - 'CHARACTER_PERSON_IN_STEAMY_ROOM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FB}", - 'CHARACTER_PERSON_IN_STEAMY_ROOM_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FC}", - 'CHARACTER_PERSON_IN_STEAMY_ROOM_MEDIUM_SKIN_TONE' => "\u{1F9D6}\u{1F3FD}", - 'CHARACTER_PERSON_IN_STEAMY_ROOM_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FE}", - 'CHARACTER_PERSON_IN_STEAMY_ROOM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FF}", - 'CHARACTER_WOMAN_IN_STEAMY_ROOM' => "\u{1F9D6}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_STEAMY_ROOM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_STEAMY_ROOM_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_STEAMY_ROOM_MEDIUM_SKIN_TONE' => "\u{1F9D6}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_STEAMY_ROOM_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_STEAMY_ROOM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_IN_STEAMY_ROOM' => "\u{1F9D6}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_STEAMY_ROOM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_STEAMY_ROOM_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_STEAMY_ROOM_MEDIUM_SKIN_TONE' => "\u{1F9D6}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_STEAMY_ROOM_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_STEAMY_ROOM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_PERSON_CLIMBING' => "\u{1F9D7}", - 'CHARACTER_PERSON_CLIMBING_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FB}", - 'CHARACTER_PERSON_CLIMBING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FC}", - 'CHARACTER_PERSON_CLIMBING_MEDIUM_SKIN_TONE' => "\u{1F9D7}\u{1F3FD}", - 'CHARACTER_PERSON_CLIMBING_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FE}", - 'CHARACTER_PERSON_CLIMBING_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FF}", - 'CHARACTER_WOMAN_CLIMBING' => "\u{1F9D7}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CLIMBING_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CLIMBING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CLIMBING_MEDIUM_SKIN_TONE' => "\u{1F9D7}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CLIMBING_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CLIMBING_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_CLIMBING' => "\u{1F9D7}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CLIMBING_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CLIMBING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CLIMBING_MEDIUM_SKIN_TONE' => "\u{1F9D7}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CLIMBING_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CLIMBING_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_PERSON_IN_LOTUS_POSITION' => "\u{1F9D8}", - 'CHARACTER_PERSON_IN_LOTUS_POSITION_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FB}", - 'CHARACTER_PERSON_IN_LOTUS_POSITION_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FC}", - 'CHARACTER_PERSON_IN_LOTUS_POSITION_MEDIUM_SKIN_TONE' => "\u{1F9D8}\u{1F3FD}", - 'CHARACTER_PERSON_IN_LOTUS_POSITION_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FE}", - 'CHARACTER_PERSON_IN_LOTUS_POSITION_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FF}", - 'CHARACTER_WOMAN_IN_LOTUS_POSITION' => "\u{1F9D8}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_LOTUS_POSITION_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_LOTUS_POSITION_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_LOTUS_POSITION_MEDIUM_SKIN_TONE' => "\u{1F9D8}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_LOTUS_POSITION_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_IN_LOTUS_POSITION_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_MAN_IN_LOTUS_POSITION' => "\u{1F9D8}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_LOTUS_POSITION_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_LOTUS_POSITION_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_LOTUS_POSITION_MEDIUM_SKIN_TONE' => "\u{1F9D8}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_LOTUS_POSITION_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_IN_LOTUS_POSITION_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_PERSON_TAKING_BATH' => "\u{1F6C0}", - 'CHARACTER_PERSON_TAKING_BATH_LIGHT_SKIN_TONE' => "\u{1F6C0}\u{1F3FB}", - 'CHARACTER_PERSON_TAKING_BATH_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6C0}\u{1F3FC}", - 'CHARACTER_PERSON_TAKING_BATH_MEDIUM_SKIN_TONE' => "\u{1F6C0}\u{1F3FD}", - 'CHARACTER_PERSON_TAKING_BATH_MEDIUM_DARK_SKIN_TONE' => "\u{1F6C0}\u{1F3FE}", - 'CHARACTER_PERSON_TAKING_BATH_DARK_SKIN_TONE' => "\u{1F6C0}\u{1F3FF}", - 'CHARACTER_PERSON_IN_BED' => "\u{1F6CC}", - 'CHARACTER_PERSON_IN_BED_LIGHT_SKIN_TONE' => "\u{1F6CC}\u{1F3FB}", - 'CHARACTER_PERSON_IN_BED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6CC}\u{1F3FC}", - 'CHARACTER_PERSON_IN_BED_MEDIUM_SKIN_TONE' => "\u{1F6CC}\u{1F3FD}", - 'CHARACTER_PERSON_IN_BED_MEDIUM_DARK_SKIN_TONE' => "\u{1F6CC}\u{1F3FE}", - 'CHARACTER_PERSON_IN_BED_DARK_SKIN_TONE' => "\u{1F6CC}\u{1F3FF}", - 'CHARACTER_MAN_IN_SUIT_LEVITATING' => "\u{1F574}\u{FE0F}", - 'CHARACTER_MAN_IN_SUIT_LEVITATING_LIGHT_SKIN_TONE' => "\u{1F574}\u{1F3FB}", - 'CHARACTER_MAN_IN_SUIT_LEVITATING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F574}\u{1F3FC}", - 'CHARACTER_MAN_IN_SUIT_LEVITATING_MEDIUM_SKIN_TONE' => "\u{1F574}\u{1F3FD}", - 'CHARACTER_MAN_IN_SUIT_LEVITATING_MEDIUM_DARK_SKIN_TONE' => "\u{1F574}\u{1F3FE}", - 'CHARACTER_MAN_IN_SUIT_LEVITATING_DARK_SKIN_TONE' => "\u{1F574}\u{1F3FF}", - 'CHARACTER_SPEAKING_HEAD' => "\u{1F5E3}\u{FE0F}", - 'CHARACTER_BUST_IN_SILHOUETTE' => "\u{1F464}", - 'CHARACTER_BUSTS_IN_SILHOUETTE' => "\u{1F465}", - // ##### Emoji subgroup: Person-sport ##### - 'CHARACTER_PERSON_FENCING' => "\u{1F93A}", - 'CHARACTER_HORSE_RACING' => "\u{1F3C7}", - 'CHARACTER_HORSE_RACING_LIGHT_SKIN_TONE' => "\u{1F3C7}\u{1F3FB}", - 'CHARACTER_HORSE_RACING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C7}\u{1F3FC}", - 'CHARACTER_HORSE_RACING_MEDIUM_SKIN_TONE' => "\u{1F3C7}\u{1F3FD}", - 'CHARACTER_HORSE_RACING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C7}\u{1F3FE}", - 'CHARACTER_HORSE_RACING_DARK_SKIN_TONE' => "\u{1F3C7}\u{1F3FF}", - 'CHARACTER_SKIER' => "\u{26F7}\u{FE0F}", - 'CHARACTER_SNOWBOARDER' => "\u{1F3C2}", - 'CHARACTER_SNOWBOARDER_LIGHT_SKIN_TONE' => "\u{1F3C2}\u{1F3FB}", - 'CHARACTER_SNOWBOARDER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C2}\u{1F3FC}", - 'CHARACTER_SNOWBOARDER_MEDIUM_SKIN_TONE' => "\u{1F3C2}\u{1F3FD}", - 'CHARACTER_SNOWBOARDER_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C2}\u{1F3FE}", - 'CHARACTER_SNOWBOARDER_DARK_SKIN_TONE' => "\u{1F3C2}\u{1F3FF}", - 'CHARACTER_PERSON_GOLFING' => "\u{1F3CC}\u{FE0F}", - 'CHARACTER_PERSON_GOLFING_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FB}", - 'CHARACTER_PERSON_GOLFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FC}", - 'CHARACTER_PERSON_GOLFING_MEDIUM_SKIN_TONE' => "\u{1F3CC}\u{1F3FD}", - 'CHARACTER_PERSON_GOLFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FE}", - 'CHARACTER_PERSON_GOLFING_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FF}", - 'CHARACTER_MAN_GOLFING' => "\u{1F3CC}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GOLFING_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GOLFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GOLFING_MEDIUM_SKIN_TONE' => "\u{1F3CC}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GOLFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_GOLFING_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_GOLFING' => "\u{1F3CC}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GOLFING_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GOLFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GOLFING_MEDIUM_SKIN_TONE' => "\u{1F3CC}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GOLFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_GOLFING_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_SURFING' => "\u{1F3C4}", - 'CHARACTER_PERSON_SURFING_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FB}", - 'CHARACTER_PERSON_SURFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FC}", - 'CHARACTER_PERSON_SURFING_MEDIUM_SKIN_TONE' => "\u{1F3C4}\u{1F3FD}", - 'CHARACTER_PERSON_SURFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FE}", - 'CHARACTER_PERSON_SURFING_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FF}", - 'CHARACTER_MAN_SURFING' => "\u{1F3C4}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SURFING_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SURFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SURFING_MEDIUM_SKIN_TONE' => "\u{1F3C4}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SURFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SURFING_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_SURFING' => "\u{1F3C4}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SURFING_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SURFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SURFING_MEDIUM_SKIN_TONE' => "\u{1F3C4}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SURFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SURFING_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_ROWING_BOAT' => "\u{1F6A3}", - 'CHARACTER_PERSON_ROWING_BOAT_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FB}", - 'CHARACTER_PERSON_ROWING_BOAT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FC}", - 'CHARACTER_PERSON_ROWING_BOAT_MEDIUM_SKIN_TONE' => "\u{1F6A3}\u{1F3FD}", - 'CHARACTER_PERSON_ROWING_BOAT_MEDIUM_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FE}", - 'CHARACTER_PERSON_ROWING_BOAT_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FF}", - 'CHARACTER_MAN_ROWING_BOAT' => "\u{1F6A3}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ROWING_BOAT_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ROWING_BOAT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ROWING_BOAT_MEDIUM_SKIN_TONE' => "\u{1F6A3}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ROWING_BOAT_MEDIUM_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_ROWING_BOAT_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_ROWING_BOAT' => "\u{1F6A3}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ROWING_BOAT_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ROWING_BOAT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ROWING_BOAT_MEDIUM_SKIN_TONE' => "\u{1F6A3}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ROWING_BOAT_MEDIUM_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_ROWING_BOAT_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_SWIMMING' => "\u{1F3CA}", - 'CHARACTER_PERSON_SWIMMING_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FB}", - 'CHARACTER_PERSON_SWIMMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FC}", - 'CHARACTER_PERSON_SWIMMING_MEDIUM_SKIN_TONE' => "\u{1F3CA}\u{1F3FD}", - 'CHARACTER_PERSON_SWIMMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FE}", - 'CHARACTER_PERSON_SWIMMING_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FF}", - 'CHARACTER_MAN_SWIMMING' => "\u{1F3CA}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SWIMMING_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SWIMMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SWIMMING_MEDIUM_SKIN_TONE' => "\u{1F3CA}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SWIMMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_SWIMMING_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_SWIMMING' => "\u{1F3CA}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SWIMMING_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SWIMMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SWIMMING_MEDIUM_SKIN_TONE' => "\u{1F3CA}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SWIMMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_SWIMMING_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_BOUNCING_BALL' => "\u{26F9}\u{FE0F}", - 'CHARACTER_PERSON_BOUNCING_BALL_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FB}", - 'CHARACTER_PERSON_BOUNCING_BALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FC}", - 'CHARACTER_PERSON_BOUNCING_BALL_MEDIUM_SKIN_TONE' => "\u{26F9}\u{1F3FD}", - 'CHARACTER_PERSON_BOUNCING_BALL_MEDIUM_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FE}", - 'CHARACTER_PERSON_BOUNCING_BALL_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FF}", - 'CHARACTER_MAN_BOUNCING_BALL' => "\u{26F9}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOUNCING_BALL_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOUNCING_BALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOUNCING_BALL_MEDIUM_SKIN_TONE' => "\u{26F9}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOUNCING_BALL_MEDIUM_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BOUNCING_BALL_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_BOUNCING_BALL' => "\u{26F9}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOUNCING_BALL_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOUNCING_BALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOUNCING_BALL_MEDIUM_SKIN_TONE' => "\u{26F9}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOUNCING_BALL_MEDIUM_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BOUNCING_BALL_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_LIFTING_WEIGHTS' => "\u{1F3CB}\u{FE0F}", - 'CHARACTER_PERSON_LIFTING_WEIGHTS_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FB}", - 'CHARACTER_PERSON_LIFTING_WEIGHTS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FC}", - 'CHARACTER_PERSON_LIFTING_WEIGHTS_MEDIUM_SKIN_TONE' => "\u{1F3CB}\u{1F3FD}", - 'CHARACTER_PERSON_LIFTING_WEIGHTS_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FE}", - 'CHARACTER_PERSON_LIFTING_WEIGHTS_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FF}", - 'CHARACTER_MAN_LIFTING_WEIGHTS' => "\u{1F3CB}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_LIFTING_WEIGHTS_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_LIFTING_WEIGHTS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_LIFTING_WEIGHTS_MEDIUM_SKIN_TONE' => "\u{1F3CB}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_LIFTING_WEIGHTS_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_LIFTING_WEIGHTS_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_LIFTING_WEIGHTS' => "\u{1F3CB}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_LIFTING_WEIGHTS_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_LIFTING_WEIGHTS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_LIFTING_WEIGHTS_MEDIUM_SKIN_TONE' => "\u{1F3CB}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_LIFTING_WEIGHTS_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_LIFTING_WEIGHTS_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_BIKING' => "\u{1F6B4}", - 'CHARACTER_PERSON_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FB}", - 'CHARACTER_PERSON_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FC}", - 'CHARACTER_PERSON_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B4}\u{1F3FD}", - 'CHARACTER_PERSON_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FE}", - 'CHARACTER_PERSON_BIKING_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FF}", - 'CHARACTER_MAN_BIKING' => "\u{1F6B4}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B4}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_BIKING_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_BIKING' => "\u{1F6B4}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B4}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_BIKING_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_MOUNTAIN_BIKING' => "\u{1F6B5}", - 'CHARACTER_PERSON_MOUNTAIN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FB}", - 'CHARACTER_PERSON_MOUNTAIN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FC}", - 'CHARACTER_PERSON_MOUNTAIN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B5}\u{1F3FD}", - 'CHARACTER_PERSON_MOUNTAIN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FE}", - 'CHARACTER_PERSON_MOUNTAIN_BIKING_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FF}", - 'CHARACTER_MAN_MOUNTAIN_BIKING' => "\u{1F6B5}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MOUNTAIN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MOUNTAIN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MOUNTAIN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B5}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MOUNTAIN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_MOUNTAIN_BIKING_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_MOUNTAIN_BIKING' => "\u{1F6B5}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MOUNTAIN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MOUNTAIN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MOUNTAIN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B5}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MOUNTAIN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_MOUNTAIN_BIKING_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_RACING_CAR' => "\u{1F3CE}\u{FE0F}", - 'CHARACTER_MOTORCYCLE' => "\u{1F3CD}\u{FE0F}", - 'CHARACTER_PERSON_CARTWHEELING' => "\u{1F938}", - 'CHARACTER_PERSON_CARTWHEELING_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FB}", - 'CHARACTER_PERSON_CARTWHEELING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FC}", - 'CHARACTER_PERSON_CARTWHEELING_MEDIUM_SKIN_TONE' => "\u{1F938}\u{1F3FD}", - 'CHARACTER_PERSON_CARTWHEELING_MEDIUM_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FE}", - 'CHARACTER_PERSON_CARTWHEELING_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FF}", - 'CHARACTER_MAN_CARTWHEELING' => "\u{1F938}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CARTWHEELING_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CARTWHEELING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CARTWHEELING_MEDIUM_SKIN_TONE' => "\u{1F938}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CARTWHEELING_MEDIUM_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_CARTWHEELING_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_CARTWHEELING' => "\u{1F938}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CARTWHEELING_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CARTWHEELING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CARTWHEELING_MEDIUM_SKIN_TONE' => "\u{1F938}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CARTWHEELING_MEDIUM_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_CARTWHEELING_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PEOPLE_WRESTLING' => "\u{1F93C}", - 'CHARACTER_MEN_WRESTLING' => "\u{1F93C}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMEN_WRESTLING' => "\u{1F93C}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_PLAYING_WATER_POLO' => "\u{1F93D}", - 'CHARACTER_PERSON_PLAYING_WATER_POLO_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FB}", - 'CHARACTER_PERSON_PLAYING_WATER_POLO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FC}", - 'CHARACTER_PERSON_PLAYING_WATER_POLO_MEDIUM_SKIN_TONE' => "\u{1F93D}\u{1F3FD}", - 'CHARACTER_PERSON_PLAYING_WATER_POLO_MEDIUM_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FE}", - 'CHARACTER_PERSON_PLAYING_WATER_POLO_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FF}", - 'CHARACTER_MAN_PLAYING_WATER_POLO' => "\u{1F93D}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_WATER_POLO_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_WATER_POLO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_WATER_POLO_MEDIUM_SKIN_TONE' => "\u{1F93D}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_WATER_POLO_MEDIUM_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_WATER_POLO_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_WATER_POLO' => "\u{1F93D}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_WATER_POLO_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_WATER_POLO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_WATER_POLO_MEDIUM_SKIN_TONE' => "\u{1F93D}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_WATER_POLO_MEDIUM_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_WATER_POLO_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_PLAYING_HANDBALL' => "\u{1F93E}", - 'CHARACTER_PERSON_PLAYING_HANDBALL_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FB}", - 'CHARACTER_PERSON_PLAYING_HANDBALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FC}", - 'CHARACTER_PERSON_PLAYING_HANDBALL_MEDIUM_SKIN_TONE' => "\u{1F93E}\u{1F3FD}", - 'CHARACTER_PERSON_PLAYING_HANDBALL_MEDIUM_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FE}", - 'CHARACTER_PERSON_PLAYING_HANDBALL_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FF}", - 'CHARACTER_MAN_PLAYING_HANDBALL' => "\u{1F93E}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_HANDBALL_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_HANDBALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_HANDBALL_MEDIUM_SKIN_TONE' => "\u{1F93E}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_HANDBALL_MEDIUM_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_PLAYING_HANDBALL_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_HANDBALL' => "\u{1F93E}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_HANDBALL_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_HANDBALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_HANDBALL_MEDIUM_SKIN_TONE' => "\u{1F93E}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_HANDBALL_MEDIUM_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_PLAYING_HANDBALL_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_PERSON_JUGGLING' => "\u{1F939}", - 'CHARACTER_PERSON_JUGGLING_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FB}", - 'CHARACTER_PERSON_JUGGLING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FC}", - 'CHARACTER_PERSON_JUGGLING_MEDIUM_SKIN_TONE' => "\u{1F939}\u{1F3FD}", - 'CHARACTER_PERSON_JUGGLING_MEDIUM_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FE}", - 'CHARACTER_PERSON_JUGGLING_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FF}", - 'CHARACTER_MAN_JUGGLING' => "\u{1F939}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_JUGGLING_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_JUGGLING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_JUGGLING_MEDIUM_SKIN_TONE' => "\u{1F939}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_JUGGLING_MEDIUM_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_MAN_JUGGLING_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", - 'CHARACTER_WOMAN_JUGGLING' => "\u{1F939}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_JUGGLING_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_JUGGLING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_JUGGLING_MEDIUM_SKIN_TONE' => "\u{1F939}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_JUGGLING_MEDIUM_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", - 'CHARACTER_WOMAN_JUGGLING_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", - // ##### Emoji subgroup: Family ##### - 'CHARACTER_MAN_AND_WOMAN_HOLDING_HANDS' => "\u{1F46B}", - 'CHARACTER_TWO_MEN_HOLDING_HANDS' => "\u{1F46C}", - 'CHARACTER_TWO_WOMEN_HOLDING_HANDS' => "\u{1F46D}", - 'CHARACTER_KISS' => "\u{1F48F}", - 'CHARACTER_KISS_WOMAN_MAN' => "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}", - 'CHARACTER_KISS_MAN_MAN' => "\u{1F468}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}", - 'CHARACTER_KISS_WOMAN_WOMAN' => "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}", - 'CHARACTER_COUPLE_WITH_HEART' => "\u{1F491}", - 'CHARACTER_COUPLE_WITH_HEART_WOMAN_MAN' => "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}", - 'CHARACTER_COUPLE_WITH_HEART_MAN_MAN' => "\u{1F468}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}", - 'CHARACTER_COUPLE_WITH_HEART_WOMAN_WOMAN' => "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}", - 'CHARACTER_FAMILY' => "\u{1F46A}", - 'CHARACTER_FAMILY_MAN_WOMAN_BOY' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_MAN_WOMAN_GIRL' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}", - 'CHARACTER_FAMILY_MAN_WOMAN_GIRL_BOY' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_MAN_WOMAN_BOY_BOY' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F466}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_MAN_WOMAN_GIRL_GIRL' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F467}", - 'CHARACTER_FAMILY_MAN_MAN_BOY' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_MAN_MAN_GIRL' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F467}", - 'CHARACTER_FAMILY_MAN_MAN_GIRL_BOY' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_MAN_MAN_BOY_BOY' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F466}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_MAN_MAN_GIRL_GIRL' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F467}", - 'CHARACTER_FAMILY_WOMAN_WOMAN_BOY' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_WOMAN_WOMAN_GIRL' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}", - 'CHARACTER_FAMILY_WOMAN_WOMAN_GIRL_BOY' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_WOMAN_WOMAN_BOY_BOY' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F466}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_WOMAN_WOMAN_GIRL_GIRL' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F467}", - 'CHARACTER_FAMILY_MAN_BOY' => "\u{1F468}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_MAN_BOY_BOY' => "\u{1F468}\u{200D}\u{1F466}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_MAN_GIRL' => "\u{1F468}\u{200D}\u{1F467}", - 'CHARACTER_FAMILY_MAN_GIRL_BOY' => "\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_MAN_GIRL_GIRL' => "\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F467}", - 'CHARACTER_FAMILY_WOMAN_BOY' => "\u{1F469}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_WOMAN_BOY_BOY' => "\u{1F469}\u{200D}\u{1F466}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_WOMAN_GIRL' => "\u{1F469}\u{200D}\u{1F467}", - 'CHARACTER_FAMILY_WOMAN_GIRL_BOY' => "\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}", - 'CHARACTER_FAMILY_WOMAN_GIRL_GIRL' => "\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F467}", - // ##### Emoji subgroup: Body ##### - 'CHARACTER_SELFIE' => "\u{1F933}", - 'CHARACTER_SELFIE_LIGHT_SKIN_TONE' => "\u{1F933}\u{1F3FB}", - 'CHARACTER_SELFIE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F933}\u{1F3FC}", - 'CHARACTER_SELFIE_MEDIUM_SKIN_TONE' => "\u{1F933}\u{1F3FD}", - 'CHARACTER_SELFIE_MEDIUM_DARK_SKIN_TONE' => "\u{1F933}\u{1F3FE}", - 'CHARACTER_SELFIE_DARK_SKIN_TONE' => "\u{1F933}\u{1F3FF}", - 'CHARACTER_FLEXED_BICEPS' => "\u{1F4AA}", - 'CHARACTER_FLEXED_BICEPS_LIGHT_SKIN_TONE' => "\u{1F4AA}\u{1F3FB}", - 'CHARACTER_FLEXED_BICEPS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F4AA}\u{1F3FC}", - 'CHARACTER_FLEXED_BICEPS_MEDIUM_SKIN_TONE' => "\u{1F4AA}\u{1F3FD}", - 'CHARACTER_FLEXED_BICEPS_MEDIUM_DARK_SKIN_TONE' => "\u{1F4AA}\u{1F3FE}", - 'CHARACTER_FLEXED_BICEPS_DARK_SKIN_TONE' => "\u{1F4AA}\u{1F3FF}", - 'CHARACTER_LEG' => "\u{1F9B5}", - 'CHARACTER_LEG_LIGHT_SKIN_TONE' => "\u{1F9B5}\u{1F3FB}", - 'CHARACTER_LEG_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B5}\u{1F3FC}", - 'CHARACTER_LEG_MEDIUM_SKIN_TONE' => "\u{1F9B5}\u{1F3FD}", - 'CHARACTER_LEG_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B5}\u{1F3FE}", - 'CHARACTER_LEG_DARK_SKIN_TONE' => "\u{1F9B5}\u{1F3FF}", - 'CHARACTER_FOOT' => "\u{1F9B6}", - 'CHARACTER_FOOT_LIGHT_SKIN_TONE' => "\u{1F9B6}\u{1F3FB}", - 'CHARACTER_FOOT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B6}\u{1F3FC}", - 'CHARACTER_FOOT_MEDIUM_SKIN_TONE' => "\u{1F9B6}\u{1F3FD}", - 'CHARACTER_FOOT_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B6}\u{1F3FE}", - 'CHARACTER_FOOT_DARK_SKIN_TONE' => "\u{1F9B6}\u{1F3FF}", - 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT' => "\u{1F448}", - 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_LIGHT_SKIN_TONE' => "\u{1F448}\u{1F3FB}", - 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F448}\u{1F3FC}", - 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_MEDIUM_SKIN_TONE' => "\u{1F448}\u{1F3FD}", - 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_MEDIUM_DARK_SKIN_TONE' => "\u{1F448}\u{1F3FE}", - 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_DARK_SKIN_TONE' => "\u{1F448}\u{1F3FF}", - 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT' => "\u{1F449}", - 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_LIGHT_SKIN_TONE' => "\u{1F449}\u{1F3FB}", - 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F449}\u{1F3FC}", - 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_MEDIUM_SKIN_TONE' => "\u{1F449}\u{1F3FD}", - 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_MEDIUM_DARK_SKIN_TONE' => "\u{1F449}\u{1F3FE}", - 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_DARK_SKIN_TONE' => "\u{1F449}\u{1F3FF}", - 'CHARACTER_INDEX_POINTING_UP' => "\u{261D}\u{FE0F}", - 'CHARACTER_INDEX_POINTING_UP_LIGHT_SKIN_TONE' => "\u{261D}\u{1F3FB}", - 'CHARACTER_INDEX_POINTING_UP_MEDIUM_LIGHT_SKIN_TONE' => "\u{261D}\u{1F3FC}", - 'CHARACTER_INDEX_POINTING_UP_MEDIUM_SKIN_TONE' => "\u{261D}\u{1F3FD}", - 'CHARACTER_INDEX_POINTING_UP_MEDIUM_DARK_SKIN_TONE' => "\u{261D}\u{1F3FE}", - 'CHARACTER_INDEX_POINTING_UP_DARK_SKIN_TONE' => "\u{261D}\u{1F3FF}", - 'CHARACTER_BACKHAND_INDEX_POINTING_UP' => "\u{1F446}", - 'CHARACTER_BACKHAND_INDEX_POINTING_UP_LIGHT_SKIN_TONE' => "\u{1F446}\u{1F3FB}", - 'CHARACTER_BACKHAND_INDEX_POINTING_UP_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F446}\u{1F3FC}", - 'CHARACTER_BACKHAND_INDEX_POINTING_UP_MEDIUM_SKIN_TONE' => "\u{1F446}\u{1F3FD}", - 'CHARACTER_BACKHAND_INDEX_POINTING_UP_MEDIUM_DARK_SKIN_TONE' => "\u{1F446}\u{1F3FE}", - 'CHARACTER_BACKHAND_INDEX_POINTING_UP_DARK_SKIN_TONE' => "\u{1F446}\u{1F3FF}", - 'CHARACTER_MIDDLE_FINGER' => "\u{1F595}", - 'CHARACTER_MIDDLE_FINGER_LIGHT_SKIN_TONE' => "\u{1F595}\u{1F3FB}", - 'CHARACTER_MIDDLE_FINGER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F595}\u{1F3FC}", - 'CHARACTER_MIDDLE_FINGER_MEDIUM_SKIN_TONE' => "\u{1F595}\u{1F3FD}", - 'CHARACTER_MIDDLE_FINGER_MEDIUM_DARK_SKIN_TONE' => "\u{1F595}\u{1F3FE}", - 'CHARACTER_MIDDLE_FINGER_DARK_SKIN_TONE' => "\u{1F595}\u{1F3FF}", - 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN' => "\u{1F447}", - 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_LIGHT_SKIN_TONE' => "\u{1F447}\u{1F3FB}", - 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F447}\u{1F3FC}", - 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_MEDIUM_SKIN_TONE' => "\u{1F447}\u{1F3FD}", - 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_MEDIUM_DARK_SKIN_TONE' => "\u{1F447}\u{1F3FE}", - 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_DARK_SKIN_TONE' => "\u{1F447}\u{1F3FF}", - 'CHARACTER_VICTORY_HAND' => "\u{270C}\u{FE0F}", - 'CHARACTER_VICTORY_HAND_LIGHT_SKIN_TONE' => "\u{270C}\u{1F3FB}", - 'CHARACTER_VICTORY_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{270C}\u{1F3FC}", - 'CHARACTER_VICTORY_HAND_MEDIUM_SKIN_TONE' => "\u{270C}\u{1F3FD}", - 'CHARACTER_VICTORY_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{270C}\u{1F3FE}", - 'CHARACTER_VICTORY_HAND_DARK_SKIN_TONE' => "\u{270C}\u{1F3FF}", - 'CHARACTER_CROSSED_FINGERS' => "\u{1F91E}", - 'CHARACTER_CROSSED_FINGERS_LIGHT_SKIN_TONE' => "\u{1F91E}\u{1F3FB}", - 'CHARACTER_CROSSED_FINGERS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91E}\u{1F3FC}", - 'CHARACTER_CROSSED_FINGERS_MEDIUM_SKIN_TONE' => "\u{1F91E}\u{1F3FD}", - 'CHARACTER_CROSSED_FINGERS_MEDIUM_DARK_SKIN_TONE' => "\u{1F91E}\u{1F3FE}", - 'CHARACTER_CROSSED_FINGERS_DARK_SKIN_TONE' => "\u{1F91E}\u{1F3FF}", - 'CHARACTER_VULCAN_SALUTE' => "\u{1F596}", - 'CHARACTER_VULCAN_SALUTE_LIGHT_SKIN_TONE' => "\u{1F596}\u{1F3FB}", - 'CHARACTER_VULCAN_SALUTE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F596}\u{1F3FC}", - 'CHARACTER_VULCAN_SALUTE_MEDIUM_SKIN_TONE' => "\u{1F596}\u{1F3FD}", - 'CHARACTER_VULCAN_SALUTE_MEDIUM_DARK_SKIN_TONE' => "\u{1F596}\u{1F3FE}", - 'CHARACTER_VULCAN_SALUTE_DARK_SKIN_TONE' => "\u{1F596}\u{1F3FF}", - 'CHARACTER_SIGN_OF_THE_HORNS' => "\u{1F918}", - 'CHARACTER_SIGN_OF_THE_HORNS_LIGHT_SKIN_TONE' => "\u{1F918}\u{1F3FB}", - 'CHARACTER_SIGN_OF_THE_HORNS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F918}\u{1F3FC}", - 'CHARACTER_SIGN_OF_THE_HORNS_MEDIUM_SKIN_TONE' => "\u{1F918}\u{1F3FD}", - 'CHARACTER_SIGN_OF_THE_HORNS_MEDIUM_DARK_SKIN_TONE' => "\u{1F918}\u{1F3FE}", - 'CHARACTER_SIGN_OF_THE_HORNS_DARK_SKIN_TONE' => "\u{1F918}\u{1F3FF}", - 'CHARACTER_CALL_ME_HAND' => "\u{1F919}", - 'CHARACTER_CALL_ME_HAND_LIGHT_SKIN_TONE' => "\u{1F919}\u{1F3FB}", - 'CHARACTER_CALL_ME_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F919}\u{1F3FC}", - 'CHARACTER_CALL_ME_HAND_MEDIUM_SKIN_TONE' => "\u{1F919}\u{1F3FD}", - 'CHARACTER_CALL_ME_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F919}\u{1F3FE}", - 'CHARACTER_CALL_ME_HAND_DARK_SKIN_TONE' => "\u{1F919}\u{1F3FF}", - 'CHARACTER_HAND_WITH_FINGERS_SPLAYED' => "\u{1F590}\u{FE0F}", - 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_LIGHT_SKIN_TONE' => "\u{1F590}\u{1F3FB}", - 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F590}\u{1F3FC}", - 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_MEDIUM_SKIN_TONE' => "\u{1F590}\u{1F3FD}", - 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_MEDIUM_DARK_SKIN_TONE' => "\u{1F590}\u{1F3FE}", - 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_DARK_SKIN_TONE' => "\u{1F590}\u{1F3FF}", - 'CHARACTER_RAISED_HAND' => "\u{270B}", - 'CHARACTER_RAISED_HAND_LIGHT_SKIN_TONE' => "\u{270B}\u{1F3FB}", - 'CHARACTER_RAISED_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{270B}\u{1F3FC}", - 'CHARACTER_RAISED_HAND_MEDIUM_SKIN_TONE' => "\u{270B}\u{1F3FD}", - 'CHARACTER_RAISED_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{270B}\u{1F3FE}", - 'CHARACTER_RAISED_HAND_DARK_SKIN_TONE' => "\u{270B}\u{1F3FF}", - 'CHARACTER_OK_HAND' => "\u{1F44C}", - 'CHARACTER_OK_HAND_LIGHT_SKIN_TONE' => "\u{1F44C}\u{1F3FB}", - 'CHARACTER_OK_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44C}\u{1F3FC}", - 'CHARACTER_OK_HAND_MEDIUM_SKIN_TONE' => "\u{1F44C}\u{1F3FD}", - 'CHARACTER_OK_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F44C}\u{1F3FE}", - 'CHARACTER_OK_HAND_DARK_SKIN_TONE' => "\u{1F44C}\u{1F3FF}", - 'CHARACTER_THUMBS_UP' => "\u{1F44D}", - 'CHARACTER_THUMBS_UP_LIGHT_SKIN_TONE' => "\u{1F44D}\u{1F3FB}", - 'CHARACTER_THUMBS_UP_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44D}\u{1F3FC}", - 'CHARACTER_THUMBS_UP_MEDIUM_SKIN_TONE' => "\u{1F44D}\u{1F3FD}", - 'CHARACTER_THUMBS_UP_MEDIUM_DARK_SKIN_TONE' => "\u{1F44D}\u{1F3FE}", - 'CHARACTER_THUMBS_UP_DARK_SKIN_TONE' => "\u{1F44D}\u{1F3FF}", - 'CHARACTER_THUMBS_DOWN' => "\u{1F44E}", - 'CHARACTER_THUMBS_DOWN_LIGHT_SKIN_TONE' => "\u{1F44E}\u{1F3FB}", - 'CHARACTER_THUMBS_DOWN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44E}\u{1F3FC}", - 'CHARACTER_THUMBS_DOWN_MEDIUM_SKIN_TONE' => "\u{1F44E}\u{1F3FD}", - 'CHARACTER_THUMBS_DOWN_MEDIUM_DARK_SKIN_TONE' => "\u{1F44E}\u{1F3FE}", - 'CHARACTER_THUMBS_DOWN_DARK_SKIN_TONE' => "\u{1F44E}\u{1F3FF}", - 'CHARACTER_RAISED_FIST' => "\u{270A}", - 'CHARACTER_RAISED_FIST_LIGHT_SKIN_TONE' => "\u{270A}\u{1F3FB}", - 'CHARACTER_RAISED_FIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{270A}\u{1F3FC}", - 'CHARACTER_RAISED_FIST_MEDIUM_SKIN_TONE' => "\u{270A}\u{1F3FD}", - 'CHARACTER_RAISED_FIST_MEDIUM_DARK_SKIN_TONE' => "\u{270A}\u{1F3FE}", - 'CHARACTER_RAISED_FIST_DARK_SKIN_TONE' => "\u{270A}\u{1F3FF}", - 'CHARACTER_ONCOMING_FIST' => "\u{1F44A}", - 'CHARACTER_ONCOMING_FIST_LIGHT_SKIN_TONE' => "\u{1F44A}\u{1F3FB}", - 'CHARACTER_ONCOMING_FIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44A}\u{1F3FC}", - 'CHARACTER_ONCOMING_FIST_MEDIUM_SKIN_TONE' => "\u{1F44A}\u{1F3FD}", - 'CHARACTER_ONCOMING_FIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F44A}\u{1F3FE}", - 'CHARACTER_ONCOMING_FIST_DARK_SKIN_TONE' => "\u{1F44A}\u{1F3FF}", - 'CHARACTER_LEFT_FACING_FIST' => "\u{1F91B}", - 'CHARACTER_LEFT_FACING_FIST_LIGHT_SKIN_TONE' => "\u{1F91B}\u{1F3FB}", - 'CHARACTER_LEFT_FACING_FIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91B}\u{1F3FC}", - 'CHARACTER_LEFT_FACING_FIST_MEDIUM_SKIN_TONE' => "\u{1F91B}\u{1F3FD}", - 'CHARACTER_LEFT_FACING_FIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F91B}\u{1F3FE}", - 'CHARACTER_LEFT_FACING_FIST_DARK_SKIN_TONE' => "\u{1F91B}\u{1F3FF}", - 'CHARACTER_RIGHT_FACING_FIST' => "\u{1F91C}", - 'CHARACTER_RIGHT_FACING_FIST_LIGHT_SKIN_TONE' => "\u{1F91C}\u{1F3FB}", - 'CHARACTER_RIGHT_FACING_FIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91C}\u{1F3FC}", - 'CHARACTER_RIGHT_FACING_FIST_MEDIUM_SKIN_TONE' => "\u{1F91C}\u{1F3FD}", - 'CHARACTER_RIGHT_FACING_FIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F91C}\u{1F3FE}", - 'CHARACTER_RIGHT_FACING_FIST_DARK_SKIN_TONE' => "\u{1F91C}\u{1F3FF}", - 'CHARACTER_RAISED_BACK_OF_HAND' => "\u{1F91A}", - 'CHARACTER_RAISED_BACK_OF_HAND_LIGHT_SKIN_TONE' => "\u{1F91A}\u{1F3FB}", - 'CHARACTER_RAISED_BACK_OF_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91A}\u{1F3FC}", - 'CHARACTER_RAISED_BACK_OF_HAND_MEDIUM_SKIN_TONE' => "\u{1F91A}\u{1F3FD}", - 'CHARACTER_RAISED_BACK_OF_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F91A}\u{1F3FE}", - 'CHARACTER_RAISED_BACK_OF_HAND_DARK_SKIN_TONE' => "\u{1F91A}\u{1F3FF}", - 'CHARACTER_WAVING_HAND' => "\u{1F44B}", - 'CHARACTER_WAVING_HAND_LIGHT_SKIN_TONE' => "\u{1F44B}\u{1F3FB}", - 'CHARACTER_WAVING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44B}\u{1F3FC}", - 'CHARACTER_WAVING_HAND_MEDIUM_SKIN_TONE' => "\u{1F44B}\u{1F3FD}", - 'CHARACTER_WAVING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F44B}\u{1F3FE}", - 'CHARACTER_WAVING_HAND_DARK_SKIN_TONE' => "\u{1F44B}\u{1F3FF}", - 'CHARACTER_LOVE_YOU_GESTURE' => "\u{1F91F}", - 'CHARACTER_LOVE_YOU_GESTURE_LIGHT_SKIN_TONE' => "\u{1F91F}\u{1F3FB}", - 'CHARACTER_LOVE_YOU_GESTURE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91F}\u{1F3FC}", - 'CHARACTER_LOVE_YOU_GESTURE_MEDIUM_SKIN_TONE' => "\u{1F91F}\u{1F3FD}", - 'CHARACTER_LOVE_YOU_GESTURE_MEDIUM_DARK_SKIN_TONE' => "\u{1F91F}\u{1F3FE}", - 'CHARACTER_LOVE_YOU_GESTURE_DARK_SKIN_TONE' => "\u{1F91F}\u{1F3FF}", - 'CHARACTER_WRITING_HAND' => "\u{270D}\u{FE0F}", - 'CHARACTER_WRITING_HAND_LIGHT_SKIN_TONE' => "\u{270D}\u{1F3FB}", - 'CHARACTER_WRITING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{270D}\u{1F3FC}", - 'CHARACTER_WRITING_HAND_MEDIUM_SKIN_TONE' => "\u{270D}\u{1F3FD}", - 'CHARACTER_WRITING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{270D}\u{1F3FE}", - 'CHARACTER_WRITING_HAND_DARK_SKIN_TONE' => "\u{270D}\u{1F3FF}", - 'CHARACTER_CLAPPING_HANDS' => "\u{1F44F}", - 'CHARACTER_CLAPPING_HANDS_LIGHT_SKIN_TONE' => "\u{1F44F}\u{1F3FB}", - 'CHARACTER_CLAPPING_HANDS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44F}\u{1F3FC}", - 'CHARACTER_CLAPPING_HANDS_MEDIUM_SKIN_TONE' => "\u{1F44F}\u{1F3FD}", - 'CHARACTER_CLAPPING_HANDS_MEDIUM_DARK_SKIN_TONE' => "\u{1F44F}\u{1F3FE}", - 'CHARACTER_CLAPPING_HANDS_DARK_SKIN_TONE' => "\u{1F44F}\u{1F3FF}", - 'CHARACTER_OPEN_HANDS' => "\u{1F450}", - 'CHARACTER_OPEN_HANDS_LIGHT_SKIN_TONE' => "\u{1F450}\u{1F3FB}", - 'CHARACTER_OPEN_HANDS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F450}\u{1F3FC}", - 'CHARACTER_OPEN_HANDS_MEDIUM_SKIN_TONE' => "\u{1F450}\u{1F3FD}", - 'CHARACTER_OPEN_HANDS_MEDIUM_DARK_SKIN_TONE' => "\u{1F450}\u{1F3FE}", - 'CHARACTER_OPEN_HANDS_DARK_SKIN_TONE' => "\u{1F450}\u{1F3FF}", - 'CHARACTER_RAISING_HANDS' => "\u{1F64C}", - 'CHARACTER_RAISING_HANDS_LIGHT_SKIN_TONE' => "\u{1F64C}\u{1F3FB}", - 'CHARACTER_RAISING_HANDS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64C}\u{1F3FC}", - 'CHARACTER_RAISING_HANDS_MEDIUM_SKIN_TONE' => "\u{1F64C}\u{1F3FD}", - 'CHARACTER_RAISING_HANDS_MEDIUM_DARK_SKIN_TONE' => "\u{1F64C}\u{1F3FE}", - 'CHARACTER_RAISING_HANDS_DARK_SKIN_TONE' => "\u{1F64C}\u{1F3FF}", - 'CHARACTER_PALMS_UP_TOGETHER' => "\u{1F932}", - 'CHARACTER_PALMS_UP_TOGETHER_LIGHT_SKIN_TONE' => "\u{1F932}\u{1F3FB}", - 'CHARACTER_PALMS_UP_TOGETHER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F932}\u{1F3FC}", - 'CHARACTER_PALMS_UP_TOGETHER_MEDIUM_SKIN_TONE' => "\u{1F932}\u{1F3FD}", - 'CHARACTER_PALMS_UP_TOGETHER_MEDIUM_DARK_SKIN_TONE' => "\u{1F932}\u{1F3FE}", - 'CHARACTER_PALMS_UP_TOGETHER_DARK_SKIN_TONE' => "\u{1F932}\u{1F3FF}", - 'CHARACTER_FOLDED_HANDS' => "\u{1F64F}", - 'CHARACTER_FOLDED_HANDS_LIGHT_SKIN_TONE' => "\u{1F64F}\u{1F3FB}", - 'CHARACTER_FOLDED_HANDS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64F}\u{1F3FC}", - 'CHARACTER_FOLDED_HANDS_MEDIUM_SKIN_TONE' => "\u{1F64F}\u{1F3FD}", - 'CHARACTER_FOLDED_HANDS_MEDIUM_DARK_SKIN_TONE' => "\u{1F64F}\u{1F3FE}", - 'CHARACTER_FOLDED_HANDS_DARK_SKIN_TONE' => "\u{1F64F}\u{1F3FF}", - 'CHARACTER_HANDSHAKE' => "\u{1F91D}", - 'CHARACTER_NAIL_POLISH' => "\u{1F485}", - 'CHARACTER_NAIL_POLISH_LIGHT_SKIN_TONE' => "\u{1F485}\u{1F3FB}", - 'CHARACTER_NAIL_POLISH_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F485}\u{1F3FC}", - 'CHARACTER_NAIL_POLISH_MEDIUM_SKIN_TONE' => "\u{1F485}\u{1F3FD}", - 'CHARACTER_NAIL_POLISH_MEDIUM_DARK_SKIN_TONE' => "\u{1F485}\u{1F3FE}", - 'CHARACTER_NAIL_POLISH_DARK_SKIN_TONE' => "\u{1F485}\u{1F3FF}", - 'CHARACTER_EAR' => "\u{1F442}", - 'CHARACTER_EAR_LIGHT_SKIN_TONE' => "\u{1F442}\u{1F3FB}", - 'CHARACTER_EAR_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F442}\u{1F3FC}", - 'CHARACTER_EAR_MEDIUM_SKIN_TONE' => "\u{1F442}\u{1F3FD}", - 'CHARACTER_EAR_MEDIUM_DARK_SKIN_TONE' => "\u{1F442}\u{1F3FE}", - 'CHARACTER_EAR_DARK_SKIN_TONE' => "\u{1F442}\u{1F3FF}", - 'CHARACTER_NOSE' => "\u{1F443}", - 'CHARACTER_NOSE_LIGHT_SKIN_TONE' => "\u{1F443}\u{1F3FB}", - 'CHARACTER_NOSE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F443}\u{1F3FC}", - 'CHARACTER_NOSE_MEDIUM_SKIN_TONE' => "\u{1F443}\u{1F3FD}", - 'CHARACTER_NOSE_MEDIUM_DARK_SKIN_TONE' => "\u{1F443}\u{1F3FE}", - 'CHARACTER_NOSE_DARK_SKIN_TONE' => "\u{1F443}\u{1F3FF}", - 'CHARACTER_RED_HAIRED' => "\u{1F9B0}", - 'CHARACTER_CURLY_HAIRED' => "\u{1F9B1}", - 'CHARACTER_BALD' => "\u{1F9B2}", - 'CHARACTER_WHITE_HAIRED' => "\u{1F9B3}", - 'CHARACTER_FOOTPRINTS' => "\u{1F463}", - 'CHARACTER_EYES' => "\u{1F440}", - 'CHARACTER_EYE' => "\u{1F441}\u{FE0F}", - 'CHARACTER_EYE_IN_SPEECH_BUBBLE' => "\u{1F441}\u{FE0F}\u{200D}\u{1F5E8}\u{FE0F}", - 'CHARACTER_BRAIN' => "\u{1F9E0}", - 'CHARACTER_BONE' => "\u{1F9B4}", - 'CHARACTER_TOOTH' => "\u{1F9B7}", - 'CHARACTER_TONGUE' => "\u{1F445}", - 'CHARACTER_MOUTH' => "\u{1F444}", - // ##### Emoji subgroup: Emotion ##### - 'CHARACTER_KISS_MARK' => "\u{1F48B}", - 'CHARACTER_HEART_WITH_ARROW' => "\u{1F498}", - 'CHARACTER_RED_HEART' => "\u{2764}\u{FE0F}", - 'CHARACTER_BEATING_HEART' => "\u{1F493}", - 'CHARACTER_BROKEN_HEART' => "\u{1F494}", - 'CHARACTER_TWO_HEARTS' => "\u{1F495}", - 'CHARACTER_SPARKLING_HEART' => "\u{1F496}", - 'CHARACTER_GROWING_HEART' => "\u{1F497}", - 'CHARACTER_BLUE_HEART' => "\u{1F499}", - 'CHARACTER_GREEN_HEART' => "\u{1F49A}", - 'CHARACTER_YELLOW_HEART' => "\u{1F49B}", - 'CHARACTER_ORANGE_HEART' => "\u{1F9E1}", - 'CHARACTER_PURPLE_HEART' => "\u{1F49C}", - 'CHARACTER_BLACK_HEART' => "\u{1F5A4}", - 'CHARACTER_HEART_WITH_RIBBON' => "\u{1F49D}", - 'CHARACTER_REVOLVING_HEARTS' => "\u{1F49E}", - 'CHARACTER_HEART_DECORATION' => "\u{1F49F}", - 'CHARACTER_HEAVY_HEART_EXCLAMATION' => "\u{2763}\u{FE0F}", - 'CHARACTER_LOVE_LETTER' => "\u{1F48C}", - 'CHARACTER_ZZZ' => "\u{1F4A4}", - 'CHARACTER_ANGER_SYMBOL' => "\u{1F4A2}", - 'CHARACTER_BOMB' => "\u{1F4A3}", - 'CHARACTER_COLLISION' => "\u{1F4A5}", - 'CHARACTER_SWEAT_DROPLETS' => "\u{1F4A6}", - 'CHARACTER_DASHING_AWAY' => "\u{1F4A8}", - 'CHARACTER_DIZZY' => "\u{1F4AB}", - 'CHARACTER_SPEECH_BALLOON' => "\u{1F4AC}", - 'CHARACTER_LEFT_SPEECH_BUBBLE' => "\u{1F5E8}\u{FE0F}", - 'CHARACTER_RIGHT_ANGER_BUBBLE' => "\u{1F5EF}\u{FE0F}", - 'CHARACTER_THOUGHT_BALLOON' => "\u{1F4AD}", - 'CHARACTER_HOLE' => "\u{1F573}\u{FE0F}", - // ##### Emoji subgroup: Clothing ##### - 'CHARACTER_GLASSES' => "\u{1F453}", - 'CHARACTER_SUNGLASSES' => "\u{1F576}\u{FE0F}", - 'CHARACTER_GOGGLES' => "\u{1F97D}", - 'CHARACTER_LAB_COAT' => "\u{1F97C}", - 'CHARACTER_NECKTIE' => "\u{1F454}", - 'CHARACTER_T_SHIRT' => "\u{1F455}", - 'CHARACTER_JEANS' => "\u{1F456}", - 'CHARACTER_SCARF' => "\u{1F9E3}", - 'CHARACTER_GLOVES' => "\u{1F9E4}", - 'CHARACTER_COAT' => "\u{1F9E5}", - 'CHARACTER_SOCKS' => "\u{1F9E6}", - 'CHARACTER_DRESS' => "\u{1F457}", - 'CHARACTER_KIMONO' => "\u{1F458}", - 'CHARACTER_BIKINI' => "\u{1F459}", - 'CHARACTER_WOMAN_S_CLOTHES' => "\u{1F45A}", - 'CHARACTER_PURSE' => "\u{1F45B}", - 'CHARACTER_HANDBAG' => "\u{1F45C}", - 'CHARACTER_CLUTCH_BAG' => "\u{1F45D}", - 'CHARACTER_SHOPPING_BAGS' => "\u{1F6CD}\u{FE0F}", - 'CHARACTER_SCHOOL_BACKPACK' => "\u{1F392}", - 'CHARACTER_MAN_S_SHOE' => "\u{1F45E}", - 'CHARACTER_RUNNING_SHOE' => "\u{1F45F}", - 'CHARACTER_HIKING_BOOT' => "\u{1F97E}", - 'CHARACTER_WOMAN_S_FLAT_SHOE' => "\u{1F97F}", - 'CHARACTER_HIGH_HEELED_SHOE' => "\u{1F460}", - 'CHARACTER_WOMAN_S_SANDAL' => "\u{1F461}", - 'CHARACTER_WOMAN_S_BOOT' => "\u{1F462}", - 'CHARACTER_CROWN' => "\u{1F451}", - 'CHARACTER_WOMAN_S_HAT' => "\u{1F452}", - 'CHARACTER_TOP_HAT' => "\u{1F3A9}", - 'CHARACTER_GRADUATION_CAP' => "\u{1F393}", - 'CHARACTER_BILLED_CAP' => "\u{1F9E2}", - 'CHARACTER_RESCUE_WORKER_S_HELMET' => "\u{26D1}\u{FE0F}", - 'CHARACTER_PRAYER_BEADS' => "\u{1F4FF}", - 'CHARACTER_LIPSTICK' => "\u{1F484}", - 'CHARACTER_RING' => "\u{1F48D}", - 'CHARACTER_GEM_STONE' => "\u{1F48E}", - // ##### Emoji group: Animals & Nature ##### - // ##### Emoji subgroup: Animal-mammal ##### - 'CHARACTER_MONKEY_FACE' => "\u{1F435}", - 'CHARACTER_MONKEY' => "\u{1F412}", - 'CHARACTER_GORILLA' => "\u{1F98D}", - 'CHARACTER_DOG_FACE' => "\u{1F436}", - 'CHARACTER_DOG' => "\u{1F415}", - 'CHARACTER_POODLE' => "\u{1F429}", - 'CHARACTER_WOLF_FACE' => "\u{1F43A}", - 'CHARACTER_FOX_FACE' => "\u{1F98A}", - 'CHARACTER_RACCOON' => "\u{1F99D}", - 'CHARACTER_CAT_FACE' => "\u{1F431}", - 'CHARACTER_CAT' => "\u{1F408}", - 'CHARACTER_LION_FACE' => "\u{1F981}", - 'CHARACTER_TIGER_FACE' => "\u{1F42F}", - 'CHARACTER_TIGER' => "\u{1F405}", - 'CHARACTER_LEOPARD' => "\u{1F406}", - 'CHARACTER_HORSE_FACE' => "\u{1F434}", - 'CHARACTER_HORSE' => "\u{1F40E}", - 'CHARACTER_UNICORN_FACE' => "\u{1F984}", - 'CHARACTER_ZEBRA' => "\u{1F993}", - 'CHARACTER_DEER' => "\u{1F98C}", - 'CHARACTER_COW_FACE' => "\u{1F42E}", - 'CHARACTER_OX' => "\u{1F402}", - 'CHARACTER_WATER_BUFFALO' => "\u{1F403}", - 'CHARACTER_COW' => "\u{1F404}", - 'CHARACTER_PIG_FACE' => "\u{1F437}", - 'CHARACTER_PIG' => "\u{1F416}", - 'CHARACTER_BOAR' => "\u{1F417}", - 'CHARACTER_PIG_NOSE' => "\u{1F43D}", - 'CHARACTER_RAM' => "\u{1F40F}", - 'CHARACTER_EWE' => "\u{1F411}", - 'CHARACTER_GOAT' => "\u{1F410}", - 'CHARACTER_CAMEL' => "\u{1F42A}", - 'CHARACTER_TWO_HUMP_CAMEL' => "\u{1F42B}", - 'CHARACTER_LLAMA' => "\u{1F999}", - 'CHARACTER_GIRAFFE' => "\u{1F992}", - 'CHARACTER_ELEPHANT' => "\u{1F418}", - 'CHARACTER_RHINOCEROS' => "\u{1F98F}", - 'CHARACTER_HIPPOPOTAMUS' => "\u{1F99B}", - 'CHARACTER_MOUSE_FACE' => "\u{1F42D}", - 'CHARACTER_MOUSE' => "\u{1F401}", - 'CHARACTER_RAT' => "\u{1F400}", - 'CHARACTER_HAMSTER_FACE' => "\u{1F439}", - 'CHARACTER_RABBIT_FACE' => "\u{1F430}", - 'CHARACTER_RABBIT' => "\u{1F407}", - 'CHARACTER_CHIPMUNK' => "\u{1F43F}\u{FE0F}", - 'CHARACTER_HEDGEHOG' => "\u{1F994}", - 'CHARACTER_BAT' => "\u{1F987}", - 'CHARACTER_BEAR_FACE' => "\u{1F43B}", - 'CHARACTER_KOALA' => "\u{1F428}", - 'CHARACTER_PANDA_FACE' => "\u{1F43C}", - 'CHARACTER_KANGAROO' => "\u{1F998}", - 'CHARACTER_BADGER' => "\u{1F9A1}", - 'CHARACTER_PAW_PRINTS' => "\u{1F43E}", - // ##### Emoji subgroup: Animal-bird ##### - 'CHARACTER_TURKEY' => "\u{1F983}", - 'CHARACTER_CHICKEN' => "\u{1F414}", - 'CHARACTER_ROOSTER' => "\u{1F413}", - 'CHARACTER_HATCHING_CHICK' => "\u{1F423}", - 'CHARACTER_BABY_CHICK' => "\u{1F424}", - 'CHARACTER_FRONT_FACING_BABY_CHICK' => "\u{1F425}", - 'CHARACTER_BIRD' => "\u{1F426}", - 'CHARACTER_PENGUIN' => "\u{1F427}", - 'CHARACTER_DOVE' => "\u{1F54A}\u{FE0F}", - 'CHARACTER_EAGLE' => "\u{1F985}", - 'CHARACTER_DUCK' => "\u{1F986}", - 'CHARACTER_SWAN' => "\u{1F9A2}", - 'CHARACTER_OWL' => "\u{1F989}", - 'CHARACTER_PEACOCK' => "\u{1F99A}", - 'CHARACTER_PARROT' => "\u{1F99C}", - // ##### Emoji subgroup: Animal-amphibian ##### - 'CHARACTER_FROG_FACE' => "\u{1F438}", - // ##### Emoji subgroup: Animal-reptile ##### - 'CHARACTER_CROCODILE' => "\u{1F40A}", - 'CHARACTER_TURTLE' => "\u{1F422}", - 'CHARACTER_LIZARD' => "\u{1F98E}", - 'CHARACTER_SNAKE' => "\u{1F40D}", - 'CHARACTER_DRAGON_FACE' => "\u{1F432}", - 'CHARACTER_DRAGON' => "\u{1F409}", - 'CHARACTER_SAUROPOD' => "\u{1F995}", - 'CHARACTER_T_REX' => "\u{1F996}", - // ##### Emoji subgroup: Animal-marine ##### - 'CHARACTER_SPOUTING_WHALE' => "\u{1F433}", - 'CHARACTER_WHALE' => "\u{1F40B}", - 'CHARACTER_DOLPHIN' => "\u{1F42C}", - 'CHARACTER_FISH' => "\u{1F41F}", - 'CHARACTER_TROPICAL_FISH' => "\u{1F420}", - 'CHARACTER_BLOWFISH' => "\u{1F421}", - 'CHARACTER_SHARK' => "\u{1F988}", - 'CHARACTER_OCTOPUS' => "\u{1F419}", - 'CHARACTER_SPIRAL_SHELL' => "\u{1F41A}", - 'CHARACTER_CRAB' => "\u{1F980}", - 'CHARACTER_LOBSTER' => "\u{1F99E}", - 'CHARACTER_SHRIMP' => "\u{1F990}", - 'CHARACTER_SQUID' => "\u{1F991}", - // ##### Emoji subgroup: Animal-bug ##### - 'CHARACTER_SNAIL' => "\u{1F40C}", - 'CHARACTER_BUTTERFLY' => "\u{1F98B}", - 'CHARACTER_BUG' => "\u{1F41B}", - 'CHARACTER_ANT' => "\u{1F41C}", - 'CHARACTER_HONEYBEE' => "\u{1F41D}", - 'CHARACTER_LADY_BEETLE' => "\u{1F41E}", - 'CHARACTER_CRICKET' => "\u{1F997}", - 'CHARACTER_SPIDER' => "\u{1F577}\u{FE0F}", - 'CHARACTER_SPIDER_WEB' => "\u{1F578}\u{FE0F}", - 'CHARACTER_SCORPION' => "\u{1F982}", - 'CHARACTER_MOSQUITO' => "\u{1F99F}", - 'CHARACTER_MICROBE' => "\u{1F9A0}", - // ##### Emoji subgroup: Plant-flower ##### - 'CHARACTER_BOUQUET' => "\u{1F490}", - 'CHARACTER_CHERRY_BLOSSOM' => "\u{1F338}", - 'CHARACTER_WHITE_FLOWER' => "\u{1F4AE}", - 'CHARACTER_ROSETTE' => "\u{1F3F5}\u{FE0F}", - 'CHARACTER_ROSE' => "\u{1F339}", - 'CHARACTER_WILTED_FLOWER' => "\u{1F940}", - 'CHARACTER_HIBISCUS' => "\u{1F33A}", - 'CHARACTER_SUNFLOWER' => "\u{1F33B}", - 'CHARACTER_BLOSSOM' => "\u{1F33C}", - 'CHARACTER_TULIP' => "\u{1F337}", - // ##### Emoji subgroup: Plant-other ##### - 'CHARACTER_SEEDLING' => "\u{1F331}", - 'CHARACTER_EVERGREEN_TREE' => "\u{1F332}", - 'CHARACTER_DECIDUOUS_TREE' => "\u{1F333}", - 'CHARACTER_PALM_TREE' => "\u{1F334}", - 'CHARACTER_CACTUS' => "\u{1F335}", - 'CHARACTER_SHEAF_OF_RICE' => "\u{1F33E}", - 'CHARACTER_HERB' => "\u{1F33F}", - 'CHARACTER_SHAMROCK' => "\u{2618}\u{FE0F}", - 'CHARACTER_FOUR_LEAF_CLOVER' => "\u{1F340}", - 'CHARACTER_MAPLE_LEAF' => "\u{1F341}", - 'CHARACTER_FALLEN_LEAF' => "\u{1F342}", - 'CHARACTER_LEAF_FLUTTERING_IN_WIND' => "\u{1F343}", - // ##### Emoji group: Food & Drink ##### - // ##### Emoji subgroup: Food-fruit ##### - 'CHARACTER_GRAPES' => "\u{1F347}", - 'CHARACTER_MELON' => "\u{1F348}", - 'CHARACTER_WATERMELON' => "\u{1F349}", - 'CHARACTER_TANGERINE' => "\u{1F34A}", - 'CHARACTER_LEMON' => "\u{1F34B}", - 'CHARACTER_BANANA' => "\u{1F34C}", - 'CHARACTER_PINEAPPLE' => "\u{1F34D}", - 'CHARACTER_MANGO' => "\u{1F96D}", - 'CHARACTER_RED_APPLE' => "\u{1F34E}", - 'CHARACTER_GREEN_APPLE' => "\u{1F34F}", - 'CHARACTER_PEAR' => "\u{1F350}", - 'CHARACTER_PEACH' => "\u{1F351}", - 'CHARACTER_CHERRIES' => "\u{1F352}", - 'CHARACTER_STRAWBERRY' => "\u{1F353}", - 'CHARACTER_KIWI_FRUIT' => "\u{1F95D}", - 'CHARACTER_TOMATO' => "\u{1F345}", - 'CHARACTER_COCONUT' => "\u{1F965}", - // ##### Emoji subgroup: Food-vegetable ##### - 'CHARACTER_AVOCADO' => "\u{1F951}", - 'CHARACTER_EGGPLANT' => "\u{1F346}", - 'CHARACTER_POTATO' => "\u{1F954}", - 'CHARACTER_CARROT' => "\u{1F955}", - 'CHARACTER_EAR_OF_CORN' => "\u{1F33D}", - 'CHARACTER_HOT_PEPPER' => "\u{1F336}\u{FE0F}", - 'CHARACTER_CUCUMBER' => "\u{1F952}", - 'CHARACTER_LEAFY_GREEN' => "\u{1F96C}", - 'CHARACTER_BROCCOLI' => "\u{1F966}", - 'CHARACTER_MUSHROOM' => "\u{1F344}", - 'CHARACTER_PEANUTS' => "\u{1F95C}", - 'CHARACTER_CHESTNUT' => "\u{1F330}", - // ##### Emoji subgroup: Food-prepared ##### - 'CHARACTER_BREAD' => "\u{1F35E}", - 'CHARACTER_CROISSANT' => "\u{1F950}", - 'CHARACTER_BAGUETTE_BREAD' => "\u{1F956}", - 'CHARACTER_PRETZEL' => "\u{1F968}", - 'CHARACTER_BAGEL' => "\u{1F96F}", - 'CHARACTER_PANCAKES' => "\u{1F95E}", - 'CHARACTER_CHEESE_WEDGE' => "\u{1F9C0}", - 'CHARACTER_MEAT_ON_BONE' => "\u{1F356}", - 'CHARACTER_POULTRY_LEG' => "\u{1F357}", - 'CHARACTER_CUT_OF_MEAT' => "\u{1F969}", - 'CHARACTER_BACON' => "\u{1F953}", - 'CHARACTER_HAMBURGER' => "\u{1F354}", - 'CHARACTER_FRENCH_FRIES' => "\u{1F35F}", - 'CHARACTER_PIZZA' => "\u{1F355}", - 'CHARACTER_HOT_DOG' => "\u{1F32D}", - 'CHARACTER_SANDWICH' => "\u{1F96A}", - 'CHARACTER_TACO' => "\u{1F32E}", - 'CHARACTER_BURRITO' => "\u{1F32F}", - 'CHARACTER_STUFFED_FLATBREAD' => "\u{1F959}", - 'CHARACTER_EGG' => "\u{1F95A}", - 'CHARACTER_COOKING' => "\u{1F373}", - 'CHARACTER_SHALLOW_PAN_OF_FOOD' => "\u{1F958}", - 'CHARACTER_POT_OF_FOOD' => "\u{1F372}", - 'CHARACTER_BOWL_WITH_SPOON' => "\u{1F963}", - 'CHARACTER_GREEN_SALAD' => "\u{1F957}", - 'CHARACTER_POPCORN' => "\u{1F37F}", - 'CHARACTER_SALT' => "\u{1F9C2}", - 'CHARACTER_CANNED_FOOD' => "\u{1F96B}", - // ##### Emoji subgroup: Food-asian ##### - 'CHARACTER_BENTO_BOX' => "\u{1F371}", - 'CHARACTER_RICE_CRACKER' => "\u{1F358}", - 'CHARACTER_RICE_BALL' => "\u{1F359}", - 'CHARACTER_COOKED_RICE' => "\u{1F35A}", - 'CHARACTER_CURRY_RICE' => "\u{1F35B}", - 'CHARACTER_STEAMING_BOWL' => "\u{1F35C}", - 'CHARACTER_SPAGHETTI' => "\u{1F35D}", - 'CHARACTER_ROASTED_SWEET_POTATO' => "\u{1F360}", - 'CHARACTER_ODEN' => "\u{1F362}", - 'CHARACTER_SUSHI' => "\u{1F363}", - 'CHARACTER_FRIED_SHRIMP' => "\u{1F364}", - 'CHARACTER_FISH_CAKE_WITH_SWIRL' => "\u{1F365}", - 'CHARACTER_MOON_CAKE' => "\u{1F96E}", - 'CHARACTER_DANGO' => "\u{1F361}", - 'CHARACTER_DUMPLING' => "\u{1F95F}", - 'CHARACTER_FORTUNE_COOKIE' => "\u{1F960}", - 'CHARACTER_TAKEOUT_BOX' => "\u{1F961}", - // ##### Emoji subgroup: Food-sweet ##### - 'CHARACTER_SOFT_ICE_CREAM' => "\u{1F366}", - 'CHARACTER_SHAVED_ICE' => "\u{1F367}", - 'CHARACTER_ICE_CREAM' => "\u{1F368}", - 'CHARACTER_DOUGHNUT' => "\u{1F369}", - 'CHARACTER_COOKIE' => "\u{1F36A}", - 'CHARACTER_BIRTHDAY_CAKE' => "\u{1F382}", - 'CHARACTER_SHORTCAKE' => "\u{1F370}", - 'CHARACTER_CUPCAKE' => "\u{1F9C1}", - 'CHARACTER_PIE' => "\u{1F967}", - 'CHARACTER_CHOCOLATE_BAR' => "\u{1F36B}", - 'CHARACTER_CANDY' => "\u{1F36C}", - 'CHARACTER_LOLLIPOP' => "\u{1F36D}", - 'CHARACTER_CUSTARD' => "\u{1F36E}", - 'CHARACTER_HONEY_POT' => "\u{1F36F}", - // ##### Emoji subgroup: Drink ##### - 'CHARACTER_BABY_BOTTLE' => "\u{1F37C}", - 'CHARACTER_GLASS_OF_MILK' => "\u{1F95B}", - 'CHARACTER_HOT_BEVERAGE' => "\u{2615}", - 'CHARACTER_TEACUP_WITHOUT_HANDLE' => "\u{1F375}", - 'CHARACTER_SAKE' => "\u{1F376}", - 'CHARACTER_BOTTLE_WITH_POPPING_CORK' => "\u{1F37E}", - 'CHARACTER_WINE_GLASS' => "\u{1F377}", - 'CHARACTER_COCKTAIL_GLASS' => "\u{1F378}", - 'CHARACTER_TROPICAL_DRINK' => "\u{1F379}", - 'CHARACTER_BEER_MUG' => "\u{1F37A}", - 'CHARACTER_CLINKING_BEER_MUGS' => "\u{1F37B}", - 'CHARACTER_CLINKING_GLASSES' => "\u{1F942}", - 'CHARACTER_TUMBLER_GLASS' => "\u{1F943}", - 'CHARACTER_CUP_WITH_STRAW' => "\u{1F964}", - // ##### Emoji subgroup: Dishware ##### - 'CHARACTER_CHOPSTICKS' => "\u{1F962}", - 'CHARACTER_FORK_AND_KNIFE_WITH_PLATE' => "\u{1F37D}\u{FE0F}", - 'CHARACTER_FORK_AND_KNIFE' => "\u{1F374}", - 'CHARACTER_SPOON' => "\u{1F944}", - 'CHARACTER_KITCHEN_KNIFE' => "\u{1F52A}", - 'CHARACTER_AMPHORA' => "\u{1F3FA}", - // ##### Emoji group: Travel & Places ##### - // ##### Emoji subgroup: Place-map ##### - 'CHARACTER_GLOBE_SHOWING_EUROPE_AFRICA' => "\u{1F30D}", - 'CHARACTER_GLOBE_SHOWING_AMERICAS' => "\u{1F30E}", - 'CHARACTER_GLOBE_SHOWING_ASIA_AUSTRALIA' => "\u{1F30F}", - 'CHARACTER_GLOBE_WITH_MERIDIANS' => "\u{1F310}", - 'CHARACTER_WORLD_MAP' => "\u{1F5FA}\u{FE0F}", - 'CHARACTER_MAP_OF_JAPAN' => "\u{1F5FE}", - 'CHARACTER_COMPASS' => "\u{1F9ED}", - // ##### Emoji subgroup: Place-geographic ##### - 'CHARACTER_SNOW_CAPPED_MOUNTAIN' => "\u{1F3D4}\u{FE0F}", - 'CHARACTER_MOUNTAIN' => "\u{26F0}\u{FE0F}", - 'CHARACTER_VOLCANO' => "\u{1F30B}", - 'CHARACTER_MOUNT_FUJI' => "\u{1F5FB}", - 'CHARACTER_CAMPING' => "\u{1F3D5}\u{FE0F}", - 'CHARACTER_BEACH_WITH_UMBRELLA' => "\u{1F3D6}\u{FE0F}", - 'CHARACTER_DESERT' => "\u{1F3DC}\u{FE0F}", - 'CHARACTER_DESERT_ISLAND' => "\u{1F3DD}\u{FE0F}", - 'CHARACTER_NATIONAL_PARK' => "\u{1F3DE}\u{FE0F}", - // ##### Emoji subgroup: Place-building ##### - 'CHARACTER_STADIUM' => "\u{1F3DF}\u{FE0F}", - 'CHARACTER_CLASSICAL_BUILDING' => "\u{1F3DB}\u{FE0F}", - 'CHARACTER_BUILDING_CONSTRUCTION' => "\u{1F3D7}\u{FE0F}", - 'CHARACTER_BRICKS' => "\u{1F9F1}", - 'CHARACTER_HOUSES' => "\u{1F3D8}\u{FE0F}", - 'CHARACTER_DERELICT_HOUSE' => "\u{1F3DA}\u{FE0F}", - 'CHARACTER_HOUSE' => "\u{1F3E0}", - 'CHARACTER_HOUSE_WITH_GARDEN' => "\u{1F3E1}", - 'CHARACTER_OFFICE_BUILDING' => "\u{1F3E2}", - 'CHARACTER_JAPANESE_POST_OFFICE' => "\u{1F3E3}", - 'CHARACTER_POST_OFFICE' => "\u{1F3E4}", - 'CHARACTER_HOSPITAL' => "\u{1F3E5}", - 'CHARACTER_BANK' => "\u{1F3E6}", - 'CHARACTER_HOTEL' => "\u{1F3E8}", - 'CHARACTER_LOVE_HOTEL' => "\u{1F3E9}", - 'CHARACTER_CONVENIENCE_STORE' => "\u{1F3EA}", - 'CHARACTER_SCHOOL' => "\u{1F3EB}", - 'CHARACTER_DEPARTMENT_STORE' => "\u{1F3EC}", - 'CHARACTER_FACTORY' => "\u{1F3ED}", - 'CHARACTER_JAPANESE_CASTLE' => "\u{1F3EF}", - 'CHARACTER_CASTLE' => "\u{1F3F0}", - 'CHARACTER_WEDDING' => "\u{1F492}", - 'CHARACTER_TOKYO_TOWER' => "\u{1F5FC}", - 'CHARACTER_STATUE_OF_LIBERTY' => "\u{1F5FD}", - // ##### Emoji subgroup: Place-religious ##### - 'CHARACTER_CHURCH' => "\u{26EA}", - 'CHARACTER_MOSQUE' => "\u{1F54C}", - 'CHARACTER_SYNAGOGUE' => "\u{1F54D}", - 'CHARACTER_SHINTO_SHRINE' => "\u{26E9}\u{FE0F}", - 'CHARACTER_KAABA' => "\u{1F54B}", - // ##### Emoji subgroup: Place-other ##### - 'CHARACTER_FOUNTAIN' => "\u{26F2}", - 'CHARACTER_TENT' => "\u{26FA}", - 'CHARACTER_FOGGY' => "\u{1F301}", - 'CHARACTER_NIGHT_WITH_STARS' => "\u{1F303}", - 'CHARACTER_CITYSCAPE' => "\u{1F3D9}\u{FE0F}", - 'CHARACTER_SUNRISE_OVER_MOUNTAINS' => "\u{1F304}", - 'CHARACTER_SUNRISE' => "\u{1F305}", - 'CHARACTER_CITYSCAPE_AT_DUSK' => "\u{1F306}", - 'CHARACTER_SUNSET' => "\u{1F307}", - 'CHARACTER_BRIDGE_AT_NIGHT' => "\u{1F309}", - 'CHARACTER_HOT_SPRINGS' => "\u{2668}\u{FE0F}", - 'CHARACTER_MILKY_WAY' => "\u{1F30C}", - 'CHARACTER_CAROUSEL_HORSE' => "\u{1F3A0}", - 'CHARACTER_FERRIS_WHEEL' => "\u{1F3A1}", - 'CHARACTER_ROLLER_COASTER' => "\u{1F3A2}", - 'CHARACTER_BARBER_POLE' => "\u{1F488}", - 'CHARACTER_CIRCUS_TENT' => "\u{1F3AA}", - // ##### Emoji subgroup: Transport-ground ##### - 'CHARACTER_LOCOMOTIVE' => "\u{1F682}", - 'CHARACTER_RAILWAY_CAR' => "\u{1F683}", - 'CHARACTER_HIGH_SPEED_TRAIN' => "\u{1F684}", - 'CHARACTER_BULLET_TRAIN' => "\u{1F685}", - 'CHARACTER_TRAIN' => "\u{1F686}", - 'CHARACTER_METRO' => "\u{1F687}", - 'CHARACTER_LIGHT_RAIL' => "\u{1F688}", - 'CHARACTER_STATION' => "\u{1F689}", - 'CHARACTER_TRAM' => "\u{1F68A}", - 'CHARACTER_MONORAIL' => "\u{1F69D}", - 'CHARACTER_MOUNTAIN_RAILWAY' => "\u{1F69E}", - 'CHARACTER_TRAM_CAR' => "\u{1F68B}", - 'CHARACTER_BUS' => "\u{1F68C}", - 'CHARACTER_ONCOMING_BUS' => "\u{1F68D}", - 'CHARACTER_TROLLEYBUS' => "\u{1F68E}", - 'CHARACTER_MINIBUS' => "\u{1F690}", - 'CHARACTER_AMBULANCE' => "\u{1F691}", - 'CHARACTER_FIRE_ENGINE' => "\u{1F692}", - 'CHARACTER_POLICE_CAR' => "\u{1F693}", - 'CHARACTER_ONCOMING_POLICE_CAR' => "\u{1F694}", - 'CHARACTER_TAXI' => "\u{1F695}", - 'CHARACTER_ONCOMING_TAXI' => "\u{1F696}", - 'CHARACTER_AUTOMOBILE' => "\u{1F697}", - 'CHARACTER_ONCOMING_AUTOMOBILE' => "\u{1F698}", - 'CHARACTER_SPORT_UTILITY_VEHICLE' => "\u{1F699}", - 'CHARACTER_DELIVERY_TRUCK' => "\u{1F69A}", - 'CHARACTER_ARTICULATED_LORRY' => "\u{1F69B}", - 'CHARACTER_TRACTOR' => "\u{1F69C}", - 'CHARACTER_BICYCLE' => "\u{1F6B2}", - 'CHARACTER_KICK_SCOOTER' => "\u{1F6F4}", - 'CHARACTER_SKATEBOARD' => "\u{1F6F9}", - 'CHARACTER_MOTOR_SCOOTER' => "\u{1F6F5}", - 'CHARACTER_BUS_STOP' => "\u{1F68F}", - 'CHARACTER_MOTORWAY' => "\u{1F6E3}\u{FE0F}", - 'CHARACTER_RAILWAY_TRACK' => "\u{1F6E4}\u{FE0F}", - 'CHARACTER_OIL_DRUM' => "\u{1F6E2}\u{FE0F}", - 'CHARACTER_FUEL_PUMP' => "\u{26FD}", - 'CHARACTER_POLICE_CAR_LIGHT' => "\u{1F6A8}", - 'CHARACTER_HORIZONTAL_TRAFFIC_LIGHT' => "\u{1F6A5}", - 'CHARACTER_VERTICAL_TRAFFIC_LIGHT' => "\u{1F6A6}", - 'CHARACTER_STOP_SIGN' => "\u{1F6D1}", - 'CHARACTER_CONSTRUCTION' => "\u{1F6A7}", - // ##### Emoji subgroup: Transport-water ##### - 'CHARACTER_ANCHOR' => "\u{2693}", - 'CHARACTER_SAILBOAT' => "\u{26F5}", - 'CHARACTER_CANOE' => "\u{1F6F6}", - 'CHARACTER_SPEEDBOAT' => "\u{1F6A4}", - 'CHARACTER_PASSENGER_SHIP' => "\u{1F6F3}\u{FE0F}", - 'CHARACTER_FERRY' => "\u{26F4}\u{FE0F}", - 'CHARACTER_MOTOR_BOAT' => "\u{1F6E5}\u{FE0F}", - 'CHARACTER_SHIP' => "\u{1F6A2}", - // ##### Emoji subgroup: Transport-air ##### - 'CHARACTER_AIRPLANE' => "\u{2708}\u{FE0F}", - 'CHARACTER_SMALL_AIRPLANE' => "\u{1F6E9}\u{FE0F}", - 'CHARACTER_AIRPLANE_DEPARTURE' => "\u{1F6EB}", - 'CHARACTER_AIRPLANE_ARRIVAL' => "\u{1F6EC}", - 'CHARACTER_SEAT' => "\u{1F4BA}", - 'CHARACTER_HELICOPTER' => "\u{1F681}", - 'CHARACTER_SUSPENSION_RAILWAY' => "\u{1F69F}", - 'CHARACTER_MOUNTAIN_CABLEWAY' => "\u{1F6A0}", - 'CHARACTER_AERIAL_TRAMWAY' => "\u{1F6A1}", - 'CHARACTER_SATELLITE' => "\u{1F6F0}\u{FE0F}", - 'CHARACTER_ROCKET' => "\u{1F680}", - 'CHARACTER_FLYING_SAUCER' => "\u{1F6F8}", - // ##### Emoji subgroup: Hotel ##### - 'CHARACTER_BELLHOP_BELL' => "\u{1F6CE}\u{FE0F}", - 'CHARACTER_LUGGAGE' => "\u{1F9F3}", - // ##### Emoji subgroup: Time ##### - 'CHARACTER_HOURGLASS_DONE' => "\u{231B}", - 'CHARACTER_HOURGLASS_NOT_DONE' => "\u{23F3}", - 'CHARACTER_WATCH' => "\u{231A}", - 'CHARACTER_ALARM_CLOCK' => "\u{23F0}", - 'CHARACTER_STOPWATCH' => "\u{23F1}\u{FE0F}", - 'CHARACTER_TIMER_CLOCK' => "\u{23F2}\u{FE0F}", - 'CHARACTER_MANTELPIECE_CLOCK' => "\u{1F570}\u{FE0F}", - 'CHARACTER_TWELVE_O_CLOCK' => "\u{1F55B}", - 'CHARACTER_TWELVE_THIRTY' => "\u{1F567}", - 'CHARACTER_ONE_O_CLOCK' => "\u{1F550}", - 'CHARACTER_ONE_THIRTY' => "\u{1F55C}", - 'CHARACTER_TWO_O_CLOCK' => "\u{1F551}", - 'CHARACTER_TWO_THIRTY' => "\u{1F55D}", - 'CHARACTER_THREE_O_CLOCK' => "\u{1F552}", - 'CHARACTER_THREE_THIRTY' => "\u{1F55E}", - 'CHARACTER_FOUR_O_CLOCK' => "\u{1F553}", - 'CHARACTER_FOUR_THIRTY' => "\u{1F55F}", - 'CHARACTER_FIVE_O_CLOCK' => "\u{1F554}", - 'CHARACTER_FIVE_THIRTY' => "\u{1F560}", - 'CHARACTER_SIX_O_CLOCK' => "\u{1F555}", - 'CHARACTER_SIX_THIRTY' => "\u{1F561}", - 'CHARACTER_SEVEN_O_CLOCK' => "\u{1F556}", - 'CHARACTER_SEVEN_THIRTY' => "\u{1F562}", - 'CHARACTER_EIGHT_O_CLOCK' => "\u{1F557}", - 'CHARACTER_EIGHT_THIRTY' => "\u{1F563}", - 'CHARACTER_NINE_O_CLOCK' => "\u{1F558}", - 'CHARACTER_NINE_THIRTY' => "\u{1F564}", - 'CHARACTER_TEN_O_CLOCK' => "\u{1F559}", - 'CHARACTER_TEN_THIRTY' => "\u{1F565}", - 'CHARACTER_ELEVEN_O_CLOCK' => "\u{1F55A}", - 'CHARACTER_ELEVEN_THIRTY' => "\u{1F566}", - // ##### Emoji subgroup: Sky & weather ##### - 'CHARACTER_NEW_MOON' => "\u{1F311}", - 'CHARACTER_WAXING_CRESCENT_MOON' => "\u{1F312}", - 'CHARACTER_FIRST_QUARTER_MOON' => "\u{1F313}", - 'CHARACTER_WAXING_GIBBOUS_MOON' => "\u{1F314}", - 'CHARACTER_FULL_MOON' => "\u{1F315}", - 'CHARACTER_WANING_GIBBOUS_MOON' => "\u{1F316}", - 'CHARACTER_LAST_QUARTER_MOON' => "\u{1F317}", - 'CHARACTER_WANING_CRESCENT_MOON' => "\u{1F318}", - 'CHARACTER_CRESCENT_MOON' => "\u{1F319}", - 'CHARACTER_NEW_MOON_FACE' => "\u{1F31A}", - 'CHARACTER_FIRST_QUARTER_MOON_FACE' => "\u{1F31B}", - 'CHARACTER_LAST_QUARTER_MOON_FACE' => "\u{1F31C}", - 'CHARACTER_THERMOMETER' => "\u{1F321}\u{FE0F}", - 'CHARACTER_SUN' => "\u{2600}\u{FE0F}", - 'CHARACTER_FULL_MOON_FACE' => "\u{1F31D}", - 'CHARACTER_SUN_WITH_FACE' => "\u{1F31E}", - 'CHARACTER_STAR' => "\u{2B50}", - 'CHARACTER_GLOWING_STAR' => "\u{1F31F}", - 'CHARACTER_SHOOTING_STAR' => "\u{1F320}", - 'CHARACTER_CLOUD' => "\u{2601}\u{FE0F}", - 'CHARACTER_SUN_BEHIND_CLOUD' => "\u{26C5}", - 'CHARACTER_CLOUD_WITH_LIGHTNING_AND_RAIN' => "\u{26C8}\u{FE0F}", - 'CHARACTER_SUN_BEHIND_SMALL_CLOUD' => "\u{1F324}\u{FE0F}", - 'CHARACTER_SUN_BEHIND_LARGE_CLOUD' => "\u{1F325}\u{FE0F}", - 'CHARACTER_SUN_BEHIND_RAIN_CLOUD' => "\u{1F326}\u{FE0F}", - 'CHARACTER_CLOUD_WITH_RAIN' => "\u{1F327}\u{FE0F}", - 'CHARACTER_CLOUD_WITH_SNOW' => "\u{1F328}\u{FE0F}", - 'CHARACTER_CLOUD_WITH_LIGHTNING' => "\u{1F329}\u{FE0F}", - 'CHARACTER_TORNADO' => "\u{1F32A}\u{FE0F}", - 'CHARACTER_FOG' => "\u{1F32B}\u{FE0F}", - 'CHARACTER_WIND_FACE' => "\u{1F32C}\u{FE0F}", - 'CHARACTER_CYCLONE' => "\u{1F300}", - 'CHARACTER_RAINBOW' => "\u{1F308}", - 'CHARACTER_CLOSED_UMBRELLA' => "\u{1F302}", - 'CHARACTER_UMBRELLA' => "\u{2602}\u{FE0F}", - 'CHARACTER_UMBRELLA_WITH_RAIN_DROPS' => "\u{2614}", - 'CHARACTER_UMBRELLA_ON_GROUND' => "\u{26F1}\u{FE0F}", - 'CHARACTER_HIGH_VOLTAGE' => "\u{26A1}", - 'CHARACTER_SNOWFLAKE' => "\u{2744}\u{FE0F}", - 'CHARACTER_SNOWMAN' => "\u{2603}\u{FE0F}", - 'CHARACTER_SNOWMAN_WITHOUT_SNOW' => "\u{26C4}", - 'CHARACTER_COMET' => "\u{2604}\u{FE0F}", - 'CHARACTER_FIRE' => "\u{1F525}", - 'CHARACTER_DROPLET' => "\u{1F4A7}", - 'CHARACTER_WATER_WAVE' => "\u{1F30A}", - // ##### Emoji group: Activities ##### - // ##### Emoji subgroup: Event ##### - 'CHARACTER_JACK_O_LANTERN' => "\u{1F383}", - 'CHARACTER_CHRISTMAS_TREE' => "\u{1F384}", - 'CHARACTER_FIREWORKS' => "\u{1F386}", - 'CHARACTER_SPARKLER' => "\u{1F387}", - 'CHARACTER_FIRECRACKER' => "\u{1F9E8}", - 'CHARACTER_SPARKLES' => "\u{2728}", - 'CHARACTER_BALLOON' => "\u{1F388}", - 'CHARACTER_PARTY_POPPER' => "\u{1F389}", - 'CHARACTER_CONFETTI_BALL' => "\u{1F38A}", - 'CHARACTER_TANABATA_TREE' => "\u{1F38B}", - 'CHARACTER_PINE_DECORATION' => "\u{1F38D}", - 'CHARACTER_JAPANESE_DOLLS' => "\u{1F38E}", - 'CHARACTER_CARP_STREAMER' => "\u{1F38F}", - 'CHARACTER_WIND_CHIME' => "\u{1F390}", - 'CHARACTER_MOON_VIEWING_CEREMONY' => "\u{1F391}", - 'CHARACTER_RED_ENVELOPE' => "\u{1F9E7}", - 'CHARACTER_RIBBON' => "\u{1F380}", - 'CHARACTER_WRAPPED_GIFT' => "\u{1F381}", - 'CHARACTER_REMINDER_RIBBON' => "\u{1F397}\u{FE0F}", - 'CHARACTER_ADMISSION_TICKETS' => "\u{1F39F}\u{FE0F}", - 'CHARACTER_TICKET' => "\u{1F3AB}", - // ##### Emoji subgroup: Award-medal ##### - 'CHARACTER_MILITARY_MEDAL' => "\u{1F396}\u{FE0F}", - 'CHARACTER_TROPHY' => "\u{1F3C6}", - 'CHARACTER_SPORTS_MEDAL' => "\u{1F3C5}", - 'CHARACTER_1ST_PLACE_MEDAL' => "\u{1F947}", - 'CHARACTER_2ND_PLACE_MEDAL' => "\u{1F948}", - 'CHARACTER_3RD_PLACE_MEDAL' => "\u{1F949}", - // ##### Emoji subgroup: Sport ##### - 'CHARACTER_SOCCER_BALL' => "\u{26BD}", - 'CHARACTER_BASEBALL' => "\u{26BE}", - 'CHARACTER_SOFTBALL' => "\u{1F94E}", - 'CHARACTER_BASKETBALL' => "\u{1F3C0}", - 'CHARACTER_VOLLEYBALL' => "\u{1F3D0}", - 'CHARACTER_AMERICAN_FOOTBALL' => "\u{1F3C8}", - 'CHARACTER_RUGBY_FOOTBALL' => "\u{1F3C9}", - 'CHARACTER_TENNIS' => "\u{1F3BE}", - 'CHARACTER_FLYING_DISC' => "\u{1F94F}", - 'CHARACTER_BOWLING' => "\u{1F3B3}", - 'CHARACTER_CRICKET_GAME' => "\u{1F3CF}", - 'CHARACTER_FIELD_HOCKEY' => "\u{1F3D1}", - 'CHARACTER_ICE_HOCKEY' => "\u{1F3D2}", - 'CHARACTER_LACROSSE' => "\u{1F94D}", - 'CHARACTER_PING_PONG' => "\u{1F3D3}", - 'CHARACTER_BADMINTON' => "\u{1F3F8}", - 'CHARACTER_BOXING_GLOVE' => "\u{1F94A}", - 'CHARACTER_MARTIAL_ARTS_UNIFORM' => "\u{1F94B}", - 'CHARACTER_GOAL_NET' => "\u{1F945}", - 'CHARACTER_FLAG_IN_HOLE' => "\u{26F3}", - 'CHARACTER_ICE_SKATE' => "\u{26F8}\u{FE0F}", - 'CHARACTER_FISHING_POLE' => "\u{1F3A3}", - 'CHARACTER_RUNNING_SHIRT' => "\u{1F3BD}", - 'CHARACTER_SKIS' => "\u{1F3BF}", - 'CHARACTER_SLED' => "\u{1F6F7}", - 'CHARACTER_CURLING_STONE' => "\u{1F94C}", - // ##### Emoji subgroup: Game ##### - 'CHARACTER_DIRECT_HIT' => "\u{1F3AF}", - 'CHARACTER_POOL_8_BALL' => "\u{1F3B1}", - 'CHARACTER_CRYSTAL_BALL' => "\u{1F52E}", - 'CHARACTER_NAZAR_AMULET' => "\u{1F9FF}", - 'CHARACTER_VIDEO_GAME' => "\u{1F3AE}", - 'CHARACTER_JOYSTICK' => "\u{1F579}\u{FE0F}", - 'CHARACTER_SLOT_MACHINE' => "\u{1F3B0}", - 'CHARACTER_GAME_DIE' => "\u{1F3B2}", - 'CHARACTER_JIGSAW' => "\u{1F9E9}", - 'CHARACTER_TEDDY_BEAR' => "\u{1F9F8}", - 'CHARACTER_SPADE_SUIT' => "\u{2660}\u{FE0F}", - 'CHARACTER_HEART_SUIT' => "\u{2665}\u{FE0F}", - 'CHARACTER_DIAMOND_SUIT' => "\u{2666}\u{FE0F}", - 'CHARACTER_CLUB_SUIT' => "\u{2663}\u{FE0F}", - 'CHARACTER_CHESS_PAWN' => "\u{265F}\u{FE0F}", - 'CHARACTER_JOKER' => "\u{1F0CF}", - 'CHARACTER_MAHJONG_RED_DRAGON' => "\u{1F004}", - 'CHARACTER_FLOWER_PLAYING_CARDS' => "\u{1F3B4}", - // ##### Emoji subgroup: Arts & crafts ##### - 'CHARACTER_PERFORMING_ARTS' => "\u{1F3AD}", - 'CHARACTER_FRAMED_PICTURE' => "\u{1F5BC}\u{FE0F}", - 'CHARACTER_ARTIST_PALETTE' => "\u{1F3A8}", - 'CHARACTER_THREAD' => "\u{1F9F5}", - 'CHARACTER_YARN' => "\u{1F9F6}", - // ##### Emoji group: Objects ##### - // ##### Emoji subgroup: Sound ##### - 'CHARACTER_MUTED_SPEAKER' => "\u{1F507}", - 'CHARACTER_SPEAKER_LOW_VOLUME' => "\u{1F508}", - 'CHARACTER_SPEAKER_MEDIUM_VOLUME' => "\u{1F509}", - 'CHARACTER_SPEAKER_HIGH_VOLUME' => "\u{1F50A}", - 'CHARACTER_LOUDSPEAKER' => "\u{1F4E2}", - 'CHARACTER_MEGAPHONE' => "\u{1F4E3}", - 'CHARACTER_POSTAL_HORN' => "\u{1F4EF}", - 'CHARACTER_BELL' => "\u{1F514}", - 'CHARACTER_BELL_WITH_SLASH' => "\u{1F515}", - // ##### Emoji subgroup: Music ##### - 'CHARACTER_MUSICAL_SCORE' => "\u{1F3BC}", - 'CHARACTER_MUSICAL_NOTE' => "\u{1F3B5}", - 'CHARACTER_MUSICAL_NOTES' => "\u{1F3B6}", - 'CHARACTER_STUDIO_MICROPHONE' => "\u{1F399}\u{FE0F}", - 'CHARACTER_LEVEL_SLIDER' => "\u{1F39A}\u{FE0F}", - 'CHARACTER_CONTROL_KNOBS' => "\u{1F39B}\u{FE0F}", - 'CHARACTER_MICROPHONE' => "\u{1F3A4}", - 'CHARACTER_HEADPHONE' => "\u{1F3A7}", - 'CHARACTER_RADIO' => "\u{1F4FB}", - // ##### Emoji subgroup: Musical-instrument ##### - 'CHARACTER_SAXOPHONE' => "\u{1F3B7}", - 'CHARACTER_GUITAR' => "\u{1F3B8}", - 'CHARACTER_MUSICAL_KEYBOARD' => "\u{1F3B9}", - 'CHARACTER_TRUMPET' => "\u{1F3BA}", - 'CHARACTER_VIOLIN' => "\u{1F3BB}", - 'CHARACTER_DRUM' => "\u{1F941}", - // ##### Emoji subgroup: Phone ##### - 'CHARACTER_MOBILE_PHONE' => "\u{1F4F1}", - 'CHARACTER_MOBILE_PHONE_WITH_ARROW' => "\u{1F4F2}", - 'CHARACTER_TELEPHONE' => "\u{260E}\u{FE0F}", - 'CHARACTER_TELEPHONE_RECEIVER' => "\u{1F4DE}", - 'CHARACTER_PAGER' => "\u{1F4DF}", - 'CHARACTER_FAX_MACHINE' => "\u{1F4E0}", - // ##### Emoji subgroup: Computer ##### - 'CHARACTER_BATTERY' => "\u{1F50B}", - 'CHARACTER_ELECTRIC_PLUG' => "\u{1F50C}", - 'CHARACTER_LAPTOP_COMPUTER' => "\u{1F4BB}", - 'CHARACTER_DESKTOP_COMPUTER' => "\u{1F5A5}\u{FE0F}", - 'CHARACTER_PRINTER' => "\u{1F5A8}\u{FE0F}", - 'CHARACTER_KEYBOARD' => "\u{2328}\u{FE0F}", - 'CHARACTER_COMPUTER_MOUSE' => "\u{1F5B1}\u{FE0F}", - 'CHARACTER_TRACKBALL' => "\u{1F5B2}\u{FE0F}", - 'CHARACTER_COMPUTER_DISK' => "\u{1F4BD}", - 'CHARACTER_FLOPPY_DISK' => "\u{1F4BE}", - 'CHARACTER_OPTICAL_DISK' => "\u{1F4BF}", - 'CHARACTER_DVD' => "\u{1F4C0}", - 'CHARACTER_ABACUS' => "\u{1F9EE}", - // ##### Emoji subgroup: Light & video ##### - 'CHARACTER_MOVIE_CAMERA' => "\u{1F3A5}", - 'CHARACTER_FILM_FRAMES' => "\u{1F39E}\u{FE0F}", - 'CHARACTER_FILM_PROJECTOR' => "\u{1F4FD}\u{FE0F}", - 'CHARACTER_CLAPPER_BOARD' => "\u{1F3AC}", - 'CHARACTER_TELEVISION' => "\u{1F4FA}", - 'CHARACTER_CAMERA' => "\u{1F4F7}", - 'CHARACTER_CAMERA_WITH_FLASH' => "\u{1F4F8}", - 'CHARACTER_VIDEO_CAMERA' => "\u{1F4F9}", - 'CHARACTER_VIDEOCASSETTE' => "\u{1F4FC}", - 'CHARACTER_MAGNIFYING_GLASS_TILTED_LEFT' => "\u{1F50D}", - 'CHARACTER_MAGNIFYING_GLASS_TILTED_RIGHT' => "\u{1F50E}", - 'CHARACTER_CANDLE' => "\u{1F56F}\u{FE0F}", - 'CHARACTER_LIGHT_BULB' => "\u{1F4A1}", - 'CHARACTER_FLASHLIGHT' => "\u{1F526}", - 'CHARACTER_RED_PAPER_LANTERN' => "\u{1F3EE}", - // ##### Emoji subgroup: Book-paper ##### - 'CHARACTER_NOTEBOOK_WITH_DECORATIVE_COVER' => "\u{1F4D4}", - 'CHARACTER_CLOSED_BOOK' => "\u{1F4D5}", - 'CHARACTER_OPEN_BOOK' => "\u{1F4D6}", - 'CHARACTER_GREEN_BOOK' => "\u{1F4D7}", - 'CHARACTER_BLUE_BOOK' => "\u{1F4D8}", - 'CHARACTER_ORANGE_BOOK' => "\u{1F4D9}", - 'CHARACTER_BOOKS' => "\u{1F4DA}", - 'CHARACTER_NOTEBOOK' => "\u{1F4D3}", - 'CHARACTER_LEDGER' => "\u{1F4D2}", - 'CHARACTER_PAGE_WITH_CURL' => "\u{1F4C3}", - 'CHARACTER_SCROLL' => "\u{1F4DC}", - 'CHARACTER_PAGE_FACING_UP' => "\u{1F4C4}", - 'CHARACTER_NEWSPAPER' => "\u{1F4F0}", - 'CHARACTER_ROLLED_UP_NEWSPAPER' => "\u{1F5DE}\u{FE0F}", - 'CHARACTER_BOOKMARK_TABS' => "\u{1F4D1}", - 'CHARACTER_BOOKMARK' => "\u{1F516}", - 'CHARACTER_LABEL' => "\u{1F3F7}\u{FE0F}", - // ##### Emoji subgroup: Money ##### - 'CHARACTER_MONEY_BAG' => "\u{1F4B0}", - 'CHARACTER_YEN_BANKNOTE' => "\u{1F4B4}", - 'CHARACTER_DOLLAR_BANKNOTE' => "\u{1F4B5}", - 'CHARACTER_EURO_BANKNOTE' => "\u{1F4B6}", - 'CHARACTER_POUND_BANKNOTE' => "\u{1F4B7}", - 'CHARACTER_MONEY_WITH_WINGS' => "\u{1F4B8}", - 'CHARACTER_CREDIT_CARD' => "\u{1F4B3}", - 'CHARACTER_RECEIPT' => "\u{1F9FE}", - 'CHARACTER_CHART_INCREASING_WITH_YEN' => "\u{1F4B9}", - 'CHARACTER_CURRENCY_EXCHANGE' => "\u{1F4B1}", - 'CHARACTER_HEAVY_DOLLAR_SIGN' => "\u{1F4B2}", - // ##### Emoji subgroup: Mail ##### - 'CHARACTER_ENVELOPE' => "\u{2709}\u{FE0F}", - 'CHARACTER_E_MAIL' => "\u{1F4E7}", - 'CHARACTER_INCOMING_ENVELOPE' => "\u{1F4E8}", - 'CHARACTER_ENVELOPE_WITH_ARROW' => "\u{1F4E9}", - 'CHARACTER_OUTBOX_TRAY' => "\u{1F4E4}", - 'CHARACTER_INBOX_TRAY' => "\u{1F4E5}", - 'CHARACTER_PACKAGE' => "\u{1F4E6}", - 'CHARACTER_CLOSED_MAILBOX_WITH_RAISED_FLAG' => "\u{1F4EB}", - 'CHARACTER_CLOSED_MAILBOX_WITH_LOWERED_FLAG' => "\u{1F4EA}", - 'CHARACTER_OPEN_MAILBOX_WITH_RAISED_FLAG' => "\u{1F4EC}", - 'CHARACTER_OPEN_MAILBOX_WITH_LOWERED_FLAG' => "\u{1F4ED}", - 'CHARACTER_POSTBOX' => "\u{1F4EE}", - 'CHARACTER_BALLOT_BOX_WITH_BALLOT' => "\u{1F5F3}\u{FE0F}", - // ##### Emoji subgroup: Writing ##### - 'CHARACTER_PENCIL' => "\u{270F}\u{FE0F}", - 'CHARACTER_BLACK_NIB' => "\u{2712}\u{FE0F}", - 'CHARACTER_FOUNTAIN_PEN' => "\u{1F58B}\u{FE0F}", - 'CHARACTER_PEN' => "\u{1F58A}\u{FE0F}", - 'CHARACTER_PAINTBRUSH' => "\u{1F58C}\u{FE0F}", - 'CHARACTER_CRAYON' => "\u{1F58D}\u{FE0F}", - 'CHARACTER_MEMO' => "\u{1F4DD}", - // ##### Emoji subgroup: Office ##### - 'CHARACTER_BRIEFCASE' => "\u{1F4BC}", - 'CHARACTER_FILE_FOLDER' => "\u{1F4C1}", - 'CHARACTER_OPEN_FILE_FOLDER' => "\u{1F4C2}", - 'CHARACTER_CARD_INDEX_DIVIDERS' => "\u{1F5C2}\u{FE0F}", - 'CHARACTER_CALENDAR' => "\u{1F4C5}", - 'CHARACTER_TEAR_OFF_CALENDAR' => "\u{1F4C6}", - 'CHARACTER_SPIRAL_NOTEPAD' => "\u{1F5D2}\u{FE0F}", - 'CHARACTER_SPIRAL_CALENDAR' => "\u{1F5D3}\u{FE0F}", - 'CHARACTER_CARD_INDEX' => "\u{1F4C7}", - 'CHARACTER_CHART_INCREASING' => "\u{1F4C8}", - 'CHARACTER_CHART_DECREASING' => "\u{1F4C9}", - 'CHARACTER_BAR_CHART' => "\u{1F4CA}", - 'CHARACTER_CLIPBOARD' => "\u{1F4CB}", - 'CHARACTER_PUSHPIN' => "\u{1F4CC}", - 'CHARACTER_ROUND_PUSHPIN' => "\u{1F4CD}", - 'CHARACTER_PAPERCLIP' => "\u{1F4CE}", - 'CHARACTER_LINKED_PAPERCLIPS' => "\u{1F587}\u{FE0F}", - 'CHARACTER_STRAIGHT_RULER' => "\u{1F4CF}", - 'CHARACTER_TRIANGULAR_RULER' => "\u{1F4D0}", - 'CHARACTER_SCISSORS' => "\u{2702}\u{FE0F}", - 'CHARACTER_CARD_FILE_BOX' => "\u{1F5C3}\u{FE0F}", - 'CHARACTER_FILE_CABINET' => "\u{1F5C4}\u{FE0F}", - 'CHARACTER_WASTEBASKET' => "\u{1F5D1}\u{FE0F}", - // ##### Emoji subgroup: Lock ##### - 'CHARACTER_LOCKED' => "\u{1F512}", - 'CHARACTER_UNLOCKED' => "\u{1F513}", - 'CHARACTER_LOCKED_WITH_PEN' => "\u{1F50F}", - 'CHARACTER_LOCKED_WITH_KEY' => "\u{1F510}", - 'CHARACTER_KEY' => "\u{1F511}", - 'CHARACTER_OLD_KEY' => "\u{1F5DD}\u{FE0F}", - // ##### Emoji subgroup: Tool ##### - 'CHARACTER_HAMMER' => "\u{1F528}", - 'CHARACTER_PICK' => "\u{26CF}\u{FE0F}", - 'CHARACTER_HAMMER_AND_PICK' => "\u{2692}\u{FE0F}", - 'CHARACTER_HAMMER_AND_WRENCH' => "\u{1F6E0}\u{FE0F}", - 'CHARACTER_DAGGER' => "\u{1F5E1}\u{FE0F}", - 'CHARACTER_CROSSED_SWORDS' => "\u{2694}\u{FE0F}", - 'CHARACTER_PISTOL' => "\u{1F52B}", - 'CHARACTER_BOW_AND_ARROW' => "\u{1F3F9}", - 'CHARACTER_SHIELD' => "\u{1F6E1}\u{FE0F}", - 'CHARACTER_WRENCH' => "\u{1F527}", - 'CHARACTER_NUT_AND_BOLT' => "\u{1F529}", - 'CHARACTER_GEAR' => "\u{2699}\u{FE0F}", - 'CHARACTER_CLAMP' => "\u{1F5DC}\u{FE0F}", - 'CHARACTER_BALANCE_SCALE' => "\u{2696}\u{FE0F}", - 'CHARACTER_LINK' => "\u{1F517}", - 'CHARACTER_CHAINS' => "\u{26D3}\u{FE0F}", - 'CHARACTER_TOOLBOX' => "\u{1F9F0}", - 'CHARACTER_MAGNET' => "\u{1F9F2}", - // ##### Emoji subgroup: Science ##### - 'CHARACTER_ALEMBIC' => "\u{2697}\u{FE0F}", - 'CHARACTER_TEST_TUBE' => "\u{1F9EA}", - 'CHARACTER_PETRI_DISH' => "\u{1F9EB}", - 'CHARACTER_DNA' => "\u{1F9EC}", - 'CHARACTER_MICROSCOPE' => "\u{1F52C}", - 'CHARACTER_TELESCOPE' => "\u{1F52D}", - 'CHARACTER_SATELLITE_ANTENNA' => "\u{1F4E1}", - // ##### Emoji subgroup: Medical ##### - 'CHARACTER_SYRINGE' => "\u{1F489}", - 'CHARACTER_PILL' => "\u{1F48A}", - // ##### Emoji subgroup: Household ##### - 'CHARACTER_DOOR' => "\u{1F6AA}", - 'CHARACTER_BED' => "\u{1F6CF}\u{FE0F}", - 'CHARACTER_COUCH_AND_LAMP' => "\u{1F6CB}\u{FE0F}", - 'CHARACTER_TOILET' => "\u{1F6BD}", - 'CHARACTER_SHOWER' => "\u{1F6BF}", - 'CHARACTER_BATHTUB' => "\u{1F6C1}", - 'CHARACTER_LOTION_BOTTLE' => "\u{1F9F4}", - 'CHARACTER_SAFETY_PIN' => "\u{1F9F7}", - 'CHARACTER_BROOM' => "\u{1F9F9}", - 'CHARACTER_BASKET' => "\u{1F9FA}", - 'CHARACTER_ROLL_OF_PAPER' => "\u{1F9FB}", - 'CHARACTER_SOAP' => "\u{1F9FC}", - 'CHARACTER_SPONGE' => "\u{1F9FD}", - 'CHARACTER_FIRE_EXTINGUISHER' => "\u{1F9EF}", - 'CHARACTER_SHOPPING_CART' => "\u{1F6D2}", - // ##### Emoji subgroup: Other-object ##### - 'CHARACTER_CIGARETTE' => "\u{1F6AC}", - 'CHARACTER_COFFIN' => "\u{26B0}\u{FE0F}", - 'CHARACTER_FUNERAL_URN' => "\u{26B1}\u{FE0F}", - 'CHARACTER_MOAI' => "\u{1F5FF}", - // ##### Emoji group: Symbols ##### - // ##### Emoji subgroup: Transport-sign ##### - 'CHARACTER_ATM_SIGN' => "\u{1F3E7}", - 'CHARACTER_LITTER_IN_BIN_SIGN' => "\u{1F6AE}", - 'CHARACTER_POTABLE_WATER' => "\u{1F6B0}", - 'CHARACTER_WHEELCHAIR_SYMBOL' => "\u{267F}", - 'CHARACTER_MEN_S_ROOM' => "\u{1F6B9}", - 'CHARACTER_WOMEN_S_ROOM' => "\u{1F6BA}", - 'CHARACTER_RESTROOM' => "\u{1F6BB}", - 'CHARACTER_BABY_SYMBOL' => "\u{1F6BC}", - 'CHARACTER_WATER_CLOSET' => "\u{1F6BE}", - 'CHARACTER_PASSPORT_CONTROL' => "\u{1F6C2}", - 'CHARACTER_CUSTOMS' => "\u{1F6C3}", - 'CHARACTER_BAGGAGE_CLAIM' => "\u{1F6C4}", - 'CHARACTER_LEFT_LUGGAGE' => "\u{1F6C5}", - // ##### Emoji subgroup: Warning ##### - 'CHARACTER_WARNING' => "\u{26A0}\u{FE0F}", - 'CHARACTER_CHILDREN_CROSSING' => "\u{1F6B8}", - 'CHARACTER_NO_ENTRY' => "\u{26D4}", - 'CHARACTER_PROHIBITED' => "\u{1F6AB}", - 'CHARACTER_NO_BICYCLES' => "\u{1F6B3}", - 'CHARACTER_NO_SMOKING' => "\u{1F6AD}", - 'CHARACTER_NO_LITTERING' => "\u{1F6AF}", - 'CHARACTER_NON_POTABLE_WATER' => "\u{1F6B1}", - 'CHARACTER_NO_PEDESTRIANS' => "\u{1F6B7}", - 'CHARACTER_NO_MOBILE_PHONES' => "\u{1F4F5}", - 'CHARACTER_NO_ONE_UNDER_EIGHTEEN' => "\u{1F51E}", - 'CHARACTER_RADIOACTIVE' => "\u{2622}\u{FE0F}", - 'CHARACTER_BIOHAZARD' => "\u{2623}\u{FE0F}", - // ##### Emoji subgroup: Arrow ##### - 'CHARACTER_UP_ARROW' => "\u{2B06}\u{FE0F}", - 'CHARACTER_UP_RIGHT_ARROW' => "\u{2197}\u{FE0F}", - 'CHARACTER_RIGHT_ARROW' => "\u{27A1}\u{FE0F}", - 'CHARACTER_DOWN_RIGHT_ARROW' => "\u{2198}\u{FE0F}", - 'CHARACTER_DOWN_ARROW' => "\u{2B07}\u{FE0F}", - 'CHARACTER_DOWN_LEFT_ARROW' => "\u{2199}\u{FE0F}", - 'CHARACTER_LEFT_ARROW' => "\u{2B05}\u{FE0F}", - 'CHARACTER_UP_LEFT_ARROW' => "\u{2196}\u{FE0F}", - 'CHARACTER_UP_DOWN_ARROW' => "\u{2195}\u{FE0F}", - 'CHARACTER_LEFT_RIGHT_ARROW' => "\u{2194}\u{FE0F}", - 'CHARACTER_RIGHT_ARROW_CURVING_LEFT' => "\u{21A9}\u{FE0F}", - 'CHARACTER_LEFT_ARROW_CURVING_RIGHT' => "\u{21AA}\u{FE0F}", - 'CHARACTER_RIGHT_ARROW_CURVING_UP' => "\u{2934}\u{FE0F}", - 'CHARACTER_RIGHT_ARROW_CURVING_DOWN' => "\u{2935}\u{FE0F}", - 'CHARACTER_CLOCKWISE_VERTICAL_ARROWS' => "\u{1F503}", - 'CHARACTER_COUNTERCLOCKWISE_ARROWS_BUTTON' => "\u{1F504}", - 'CHARACTER_BACK_ARROW' => "\u{1F519}", - 'CHARACTER_END_ARROW' => "\u{1F51A}", - 'CHARACTER_ON_ARROW' => "\u{1F51B}", - 'CHARACTER_SOON_ARROW' => "\u{1F51C}", - 'CHARACTER_TOP_ARROW' => "\u{1F51D}", - // ##### Emoji subgroup: Religion ##### - 'CHARACTER_PLACE_OF_WORSHIP' => "\u{1F6D0}", - 'CHARACTER_ATOM_SYMBOL' => "\u{269B}\u{FE0F}", - 'CHARACTER_OM' => "\u{1F549}\u{FE0F}", - 'CHARACTER_STAR_OF_DAVID' => "\u{2721}\u{FE0F}", - 'CHARACTER_WHEEL_OF_DHARMA' => "\u{2638}\u{FE0F}", - 'CHARACTER_YIN_YANG' => "\u{262F}\u{FE0F}", - 'CHARACTER_LATIN_CROSS' => "\u{271D}\u{FE0F}", - 'CHARACTER_ORTHODOX_CROSS' => "\u{2626}\u{FE0F}", - 'CHARACTER_STAR_AND_CRESCENT' => "\u{262A}\u{FE0F}", - 'CHARACTER_PEACE_SYMBOL' => "\u{262E}\u{FE0F}", - 'CHARACTER_MENORAH' => "\u{1F54E}", - 'CHARACTER_DOTTED_SIX_POINTED_STAR' => "\u{1F52F}", - // ##### Emoji subgroup: Zodiac ##### - 'CHARACTER_ARIES' => "\u{2648}", - 'CHARACTER_TAURUS' => "\u{2649}", - 'CHARACTER_GEMINI' => "\u{264A}", - 'CHARACTER_CANCER' => "\u{264B}", - 'CHARACTER_LEO' => "\u{264C}", - 'CHARACTER_VIRGO' => "\u{264D}", - 'CHARACTER_LIBRA' => "\u{264E}", - 'CHARACTER_SCORPIO' => "\u{264F}", - 'CHARACTER_SAGITTARIUS' => "\u{2650}", - 'CHARACTER_CAPRICORN' => "\u{2651}", - 'CHARACTER_AQUARIUS' => "\u{2652}", - 'CHARACTER_PISCES' => "\u{2653}", - 'CHARACTER_OPHIUCHUS' => "\u{26CE}", - // ##### Emoji subgroup: Av-symbol ##### - 'CHARACTER_SHUFFLE_TRACKS_BUTTON' => "\u{1F500}", - 'CHARACTER_REPEAT_BUTTON' => "\u{1F501}", - 'CHARACTER_REPEAT_SINGLE_BUTTON' => "\u{1F502}", - 'CHARACTER_PLAY_BUTTON' => "\u{25B6}\u{FE0F}", - 'CHARACTER_FAST_FORWARD_BUTTON' => "\u{23E9}", - 'CHARACTER_NEXT_TRACK_BUTTON' => "\u{23ED}\u{FE0F}", - 'CHARACTER_PLAY_OR_PAUSE_BUTTON' => "\u{23EF}\u{FE0F}", - 'CHARACTER_REVERSE_BUTTON' => "\u{25C0}\u{FE0F}", - 'CHARACTER_FAST_REVERSE_BUTTON' => "\u{23EA}", - 'CHARACTER_LAST_TRACK_BUTTON' => "\u{23EE}\u{FE0F}", - 'CHARACTER_UPWARDS_BUTTON' => "\u{1F53C}", - 'CHARACTER_FAST_UP_BUTTON' => "\u{23EB}", - 'CHARACTER_DOWNWARDS_BUTTON' => "\u{1F53D}", - 'CHARACTER_FAST_DOWN_BUTTON' => "\u{23EC}", - 'CHARACTER_PAUSE_BUTTON' => "\u{23F8}\u{FE0F}", - 'CHARACTER_STOP_BUTTON' => "\u{23F9}\u{FE0F}", - 'CHARACTER_RECORD_BUTTON' => "\u{23FA}\u{FE0F}", - 'CHARACTER_EJECT_BUTTON' => "\u{23CF}\u{FE0F}", - 'CHARACTER_CINEMA' => "\u{1F3A6}", - 'CHARACTER_DIM_BUTTON' => "\u{1F505}", - 'CHARACTER_BRIGHT_BUTTON' => "\u{1F506}", - 'CHARACTER_ANTENNA_BARS' => "\u{1F4F6}", - 'CHARACTER_VIBRATION_MODE' => "\u{1F4F3}", - 'CHARACTER_MOBILE_PHONE_OFF' => "\u{1F4F4}", - // ##### Emoji subgroup: Other-symbol ##### - 'CHARACTER_FEMALE_SIGN' => "\u{2640}\u{FE0F}", - 'CHARACTER_MALE_SIGN' => "\u{2642}\u{FE0F}", - 'CHARACTER_MEDICAL_SYMBOL' => "\u{2695}\u{FE0F}", - 'CHARACTER_INFINITY' => "\u{267E}\u{FE0F}", - 'CHARACTER_RECYCLING_SYMBOL' => "\u{267B}\u{FE0F}", - 'CHARACTER_FLEUR_DE_LIS' => "\u{269C}\u{FE0F}", - 'CHARACTER_TRIDENT_EMBLEM' => "\u{1F531}", - 'CHARACTER_NAME_BADGE' => "\u{1F4DB}", - 'CHARACTER_JAPANESE_SYMBOL_FOR_BEGINNER' => "\u{1F530}", - 'CHARACTER_HEAVY_LARGE_CIRCLE' => "\u{2B55}", - 'CHARACTER_WHITE_HEAVY_CHECK_MARK' => "\u{2705}", - 'CHARACTER_BALLOT_BOX_WITH_CHECK' => "\u{2611}\u{FE0F}", - 'CHARACTER_HEAVY_CHECK_MARK' => "\u{2714}\u{FE0F}", - 'CHARACTER_HEAVY_MULTIPLICATION_X' => "\u{2716}\u{FE0F}", - 'CHARACTER_CROSS_MARK' => "\u{274C}", - 'CHARACTER_CROSS_MARK_BUTTON' => "\u{274E}", - 'CHARACTER_HEAVY_PLUS_SIGN' => "\u{2795}", - 'CHARACTER_HEAVY_MINUS_SIGN' => "\u{2796}", - 'CHARACTER_HEAVY_DIVISION_SIGN' => "\u{2797}", - 'CHARACTER_CURLY_LOOP' => "\u{27B0}", - 'CHARACTER_DOUBLE_CURLY_LOOP' => "\u{27BF}", - 'CHARACTER_PART_ALTERNATION_MARK' => "\u{303D}\u{FE0F}", - 'CHARACTER_EIGHT_SPOKED_ASTERISK' => "\u{2733}\u{FE0F}", - 'CHARACTER_EIGHT_POINTED_STAR' => "\u{2734}\u{FE0F}", - 'CHARACTER_SPARKLE' => "\u{2747}\u{FE0F}", - 'CHARACTER_DOUBLE_EXCLAMATION_MARK' => "\u{203C}\u{FE0F}", - 'CHARACTER_EXCLAMATION_QUESTION_MARK' => "\u{2049}\u{FE0F}", - 'CHARACTER_QUESTION_MARK' => "\u{2753}", - 'CHARACTER_WHITE_QUESTION_MARK' => "\u{2754}", - 'CHARACTER_WHITE_EXCLAMATION_MARK' => "\u{2755}", - 'CHARACTER_EXCLAMATION_MARK' => "\u{2757}", - 'CHARACTER_WAVY_DASH' => "\u{3030}\u{FE0F}", - 'CHARACTER_COPYRIGHT' => "\u{00A9}\u{FE0F}", - 'CHARACTER_REGISTERED' => "\u{00AE}\u{FE0F}", - 'CHARACTER_TRADE_MARK' => "\u{2122}\u{FE0F}", - // ##### Emoji subgroup: Keycap ##### - 'CHARACTER_KEYCAP_HASH' => "\u{0023}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_ASTERISK' => "\u{002A}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_0' => "\u{0030}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_1' => "\u{0031}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_2' => "\u{0032}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_3' => "\u{0033}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_4' => "\u{0034}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_5' => "\u{0035}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_6' => "\u{0036}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_7' => "\u{0037}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_8' => "\u{0038}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_9' => "\u{0039}\u{FE0F}\u{20E3}", - 'CHARACTER_KEYCAP_10' => "\u{1F51F}", - // ##### Emoji subgroup: Alphanum ##### - 'CHARACTER_HUNDRED_POINTS' => "\u{1F4AF}", - 'CHARACTER_INPUT_LATIN_UPPERCASE' => "\u{1F520}", - 'CHARACTER_INPUT_LATIN_LOWERCASE' => "\u{1F521}", - 'CHARACTER_INPUT_NUMBERS' => "\u{1F522}", - 'CHARACTER_INPUT_SYMBOLS' => "\u{1F523}", - 'CHARACTER_INPUT_LATIN_LETTERS' => "\u{1F524}", - 'CHARACTER_A_BUTTON_BLOOD_TYPE' => "\u{1F170}\u{FE0F}", - 'CHARACTER_AB_BUTTON_BLOOD_TYPE' => "\u{1F18E}", - 'CHARACTER_B_BUTTON_BLOOD_TYPE' => "\u{1F171}\u{FE0F}", - 'CHARACTER_CL_BUTTON' => "\u{1F191}", - 'CHARACTER_COOL_BUTTON' => "\u{1F192}", - 'CHARACTER_FREE_BUTTON' => "\u{1F193}", - 'CHARACTER_INFORMATION' => "\u{2139}\u{FE0F}", - 'CHARACTER_ID_BUTTON' => "\u{1F194}", - 'CHARACTER_CIRCLED_M' => "\u{24C2}\u{FE0F}", - 'CHARACTER_NEW_BUTTON' => "\u{1F195}", - 'CHARACTER_NG_BUTTON' => "\u{1F196}", - 'CHARACTER_O_BUTTON_BLOOD_TYPE' => "\u{1F17E}\u{FE0F}", - 'CHARACTER_OK_BUTTON' => "\u{1F197}", - 'CHARACTER_P_BUTTON' => "\u{1F17F}\u{FE0F}", - 'CHARACTER_SOS_BUTTON' => "\u{1F198}", - 'CHARACTER_UP_BUTTON' => "\u{1F199}", - 'CHARACTER_VS_BUTTON' => "\u{1F19A}", - 'CHARACTER_JAPANESE_HERE_BUTTON' => "\u{1F201}", - 'CHARACTER_JAPANESE_SERVICE_CHARGE_BUTTON' => "\u{1F202}\u{FE0F}", - 'CHARACTER_JAPANESE_MONTHLY_AMOUNT_BUTTON' => "\u{1F237}\u{FE0F}", - 'CHARACTER_JAPANESE_NOT_FREE_OF_CHARGE_BUTTON' => "\u{1F236}", - 'CHARACTER_JAPANESE_RESERVED_BUTTON' => "\u{1F22F}", - 'CHARACTER_JAPANESE_BARGAIN_BUTTON' => "\u{1F250}", - 'CHARACTER_JAPANESE_DISCOUNT_BUTTON' => "\u{1F239}", - 'CHARACTER_JAPANESE_FREE_OF_CHARGE_BUTTON' => "\u{1F21A}", - 'CHARACTER_JAPANESE_PROHIBITED_BUTTON' => "\u{1F232}", - 'CHARACTER_JAPANESE_ACCEPTABLE_BUTTON' => "\u{1F251}", - 'CHARACTER_JAPANESE_APPLICATION_BUTTON' => "\u{1F238}", - 'CHARACTER_JAPANESE_PASSING_GRADE_BUTTON' => "\u{1F234}", - 'CHARACTER_JAPANESE_VACANCY_BUTTON' => "\u{1F233}", - 'CHARACTER_JAPANESE_CONGRATULATIONS_BUTTON' => "\u{3297}\u{FE0F}", - 'CHARACTER_JAPANESE_SECRET_BUTTON' => "\u{3299}\u{FE0F}", - 'CHARACTER_JAPANESE_OPEN_FOR_BUSINESS_BUTTON' => "\u{1F23A}", - 'CHARACTER_JAPANESE_NO_VACANCY_BUTTON' => "\u{1F235}", - // ##### Emoji subgroup: Geometric ##### - 'CHARACTER_BLACK_SMALL_SQUARE' => "\u{25AA}\u{FE0F}", - 'CHARACTER_WHITE_SMALL_SQUARE' => "\u{25AB}\u{FE0F}", - 'CHARACTER_WHITE_MEDIUM_SQUARE' => "\u{25FB}\u{FE0F}", - 'CHARACTER_BLACK_MEDIUM_SQUARE' => "\u{25FC}\u{FE0F}", - 'CHARACTER_WHITE_MEDIUM_SMALL_SQUARE' => "\u{25FD}", - 'CHARACTER_BLACK_MEDIUM_SMALL_SQUARE' => "\u{25FE}", - 'CHARACTER_BLACK_LARGE_SQUARE' => "\u{2B1B}", - 'CHARACTER_WHITE_LARGE_SQUARE' => "\u{2B1C}", - 'CHARACTER_LARGE_ORANGE_DIAMOND' => "\u{1F536}", - 'CHARACTER_LARGE_BLUE_DIAMOND' => "\u{1F537}", - 'CHARACTER_SMALL_ORANGE_DIAMOND' => "\u{1F538}", - 'CHARACTER_SMALL_BLUE_DIAMOND' => "\u{1F539}", - 'CHARACTER_RED_TRIANGLE_POINTED_UP' => "\u{1F53A}", - 'CHARACTER_RED_TRIANGLE_POINTED_DOWN' => "\u{1F53B}", - 'CHARACTER_DIAMOND_WITH_A_DOT' => "\u{1F4A0}", - 'CHARACTER_RADIO_BUTTON' => "\u{1F518}", - 'CHARACTER_BLACK_SQUARE_BUTTON' => "\u{1F532}", - 'CHARACTER_WHITE_SQUARE_BUTTON' => "\u{1F533}", - 'CHARACTER_WHITE_CIRCLE' => "\u{26AA}", - 'CHARACTER_BLACK_CIRCLE' => "\u{26AB}", - 'CHARACTER_RED_CIRCLE' => "\u{1F534}", - 'CHARACTER_BLUE_CIRCLE' => "\u{1F535}", - // ##### Emoji group: Flags ##### - // ##### Emoji subgroup: Flag ##### - 'CHARACTER_CHEQUERED_FLAG' => "\u{1F3C1}", - 'CHARACTER_TRIANGULAR_FLAG' => "\u{1F6A9}", - 'CHARACTER_CROSSED_FLAGS' => "\u{1F38C}", - 'CHARACTER_BLACK_FLAG' => "\u{1F3F4}", - 'CHARACTER_WHITE_FLAG' => "\u{1F3F3}\u{FE0F}", - 'CHARACTER_RAINBOW_FLAG' => "\u{1F3F3}\u{FE0F}\u{200D}\u{1F308}", - 'CHARACTER_PIRATE_FLAG' => "\u{1F3F4}\u{200D}\u{2620}\u{FE0F}", - // ##### Emoji subgroup: Country-flag ##### - 'CHARACTER_FLAGS_FOR_ASCENSION_ISLAND' => "\u{1F1E6}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_ANDORRA' => "\u{1F1E6}\u{1F1E9}", - 'CHARACTER_FLAGS_FOR_UNITED_ARAB_EMIRATES' => "\u{1F1E6}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_AFGHANISTAN' => "\u{1F1E6}\u{1F1EB}", - 'CHARACTER_FLAGS_FOR_ANTIGUA_AND_BARBUDA' => "\u{1F1E6}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_ANGUILLA' => "\u{1F1E6}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_ALBANIA' => "\u{1F1E6}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_ARMENIA' => "\u{1F1E6}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_ANGOLA' => "\u{1F1E6}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_ANTARCTICA' => "\u{1F1E6}\u{1F1F6}", - 'CHARACTER_FLAGS_FOR_ARGENTINA' => "\u{1F1E6}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_AMERICAN_SAMOA' => "\u{1F1E6}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_AUSTRIA' => "\u{1F1E6}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_AUSTRALIA' => "\u{1F1E6}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_ARUBA' => "\u{1F1E6}\u{1F1FC}", - 'CHARACTER_FLAGS_FOR_ALAND_ISLANDS' => "\u{1F1E6}\u{1F1FD}", - 'CHARACTER_FLAGS_FOR_AZERBAIJAN' => "\u{1F1E6}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_BOSNIA_AND_HERZEGOVINA' => "\u{1F1E7}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_BARBADOS' => "\u{1F1E7}\u{1F1E7}", - 'CHARACTER_FLAGS_FOR_BANGLADESH' => "\u{1F1E7}\u{1F1E9}", - 'CHARACTER_FLAGS_FOR_BELGIUM' => "\u{1F1E7}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_BURKINA_FASO' => "\u{1F1E7}\u{1F1EB}", - 'CHARACTER_FLAGS_FOR_BULGARIA' => "\u{1F1E7}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_BAHRAIN' => "\u{1F1E7}\u{1F1ED}", - 'CHARACTER_FLAGS_FOR_BURUNDI' => "\u{1F1E7}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_BENIN' => "\u{1F1E7}\u{1F1EF}", - 'CHARACTER_FLAGS_FOR_ST_BARTHELEMY' => "\u{1F1E7}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_BERMUDA' => "\u{1F1E7}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_BRUNEI' => "\u{1F1E7}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_BOLIVIA' => "\u{1F1E7}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_CARIBBEAN_NETHERLANDS' => "\u{1F1E7}\u{1F1F6}", - 'CHARACTER_FLAGS_FOR_BRAZIL' => "\u{1F1E7}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_BAHAMAS' => "\u{1F1E7}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_BHUTAN' => "\u{1F1E7}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_BOUVET_ISLAND' => "\u{1F1E7}\u{1F1FB}", - 'CHARACTER_FLAGS_FOR_BOTSWANA' => "\u{1F1E7}\u{1F1FC}", - 'CHARACTER_FLAGS_FOR_BELARUS' => "\u{1F1E7}\u{1F1FE}", - 'CHARACTER_FLAGS_FOR_BELIZE' => "\u{1F1E7}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_CANADA' => "\u{1F1E8}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_COCOS_KEELING_ISLANDS' => "\u{1F1E8}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_CONGO_KINSHASA' => "\u{1F1E8}\u{1F1E9}", - 'CHARACTER_FLAGS_FOR_CENTRAL_AFRICAN_REPUBLIC' => "\u{1F1E8}\u{1F1EB}", - 'CHARACTER_FLAGS_FOR_CONGO_BRAZZAVILLE' => "\u{1F1E8}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_SWITZERLAND' => "\u{1F1E8}\u{1F1ED}", - 'CHARACTER_FLAGS_FOR_COTE_D_IVOIRE' => "\u{1F1E8}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_COOK_ISLANDS' => "\u{1F1E8}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_CHILE' => "\u{1F1E8}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_CAMEROON' => "\u{1F1E8}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_CHINA' => "\u{1F1E8}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_COLOMBIA' => "\u{1F1E8}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_CLIPPERTON_ISLAND' => "\u{1F1E8}\u{1F1F5}", - 'CHARACTER_FLAGS_FOR_COSTA_RICA' => "\u{1F1E8}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_CUBA' => "\u{1F1E8}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_CAPE_VERDE' => "\u{1F1E8}\u{1F1FB}", - 'CHARACTER_FLAGS_FOR_CURACAO' => "\u{1F1E8}\u{1F1FC}", - 'CHARACTER_FLAGS_FOR_CHRISTMAS_ISLAND' => "\u{1F1E8}\u{1F1FD}", - 'CHARACTER_FLAGS_FOR_CYPRUS' => "\u{1F1E8}\u{1F1FE}", - 'CHARACTER_FLAGS_FOR_CZECHIA' => "\u{1F1E8}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_GERMANY' => "\u{1F1E9}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_DIEGO_GARCIA' => "\u{1F1E9}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_DJIBOUTI' => "\u{1F1E9}\u{1F1EF}", - 'CHARACTER_FLAGS_FOR_DENMARK' => "\u{1F1E9}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_DOMINICA' => "\u{1F1E9}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_DOMINICAN_REPUBLIC' => "\u{1F1E9}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_ALGERIA' => "\u{1F1E9}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_CEUTA_AND_MELILLA' => "\u{1F1EA}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_ECUADOR' => "\u{1F1EA}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_ESTONIA' => "\u{1F1EA}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_EGYPT' => "\u{1F1EA}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_WESTERN_SAHARA' => "\u{1F1EA}\u{1F1ED}", - 'CHARACTER_FLAGS_FOR_ERITREA' => "\u{1F1EA}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_SPAIN' => "\u{1F1EA}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_ETHIOPIA' => "\u{1F1EA}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_EUROPEAN_UNION' => "\u{1F1EA}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_FINLAND' => "\u{1F1EB}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_FIJI' => "\u{1F1EB}\u{1F1EF}", - 'CHARACTER_FLAGS_FOR_FALKLAND_ISLANDS' => "\u{1F1EB}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_MICRONESIA' => "\u{1F1EB}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_FAROE_ISLANDS' => "\u{1F1EB}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_FRANCE' => "\u{1F1EB}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_GABON' => "\u{1F1EC}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_UNITED_KINGDOM' => "\u{1F1EC}\u{1F1E7}", - 'CHARACTER_FLAGS_FOR_GRENADA' => "\u{1F1EC}\u{1F1E9}", - 'CHARACTER_FLAGS_FOR_GEORGIA' => "\u{1F1EC}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_FRENCH_GUIANA' => "\u{1F1EC}\u{1F1EB}", - 'CHARACTER_FLAGS_FOR_GUERNSEY' => "\u{1F1EC}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_GHANA' => "\u{1F1EC}\u{1F1ED}", - 'CHARACTER_FLAGS_FOR_GIBRALTAR' => "\u{1F1EC}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_GREENLAND' => "\u{1F1EC}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_GAMBIA' => "\u{1F1EC}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_GUINEA' => "\u{1F1EC}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_GUADELOUPE' => "\u{1F1EC}\u{1F1F5}", - 'CHARACTER_FLAGS_FOR_EQUATORIAL_GUINEA' => "\u{1F1EC}\u{1F1F6}", - 'CHARACTER_FLAGS_FOR_GREECE' => "\u{1F1EC}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_SOUTH_GEORGIA_AND_SOUTH_SANDWICH_ISLANDS' => "\u{1F1EC}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_GUATEMALA' => "\u{1F1EC}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_GUAM' => "\u{1F1EC}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_GUINEA_BISSAU' => "\u{1F1EC}\u{1F1FC}", - 'CHARACTER_FLAGS_FOR_GUYANA' => "\u{1F1EC}\u{1F1FE}", - 'CHARACTER_FLAGS_FOR_HONG_KONG_SAR_CHINA' => "\u{1F1ED}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_HEARD_AND_MCDONALD_ISLANDS' => "\u{1F1ED}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_HONDURAS' => "\u{1F1ED}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_CROATIA' => "\u{1F1ED}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_HAITI' => "\u{1F1ED}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_HUNGARY' => "\u{1F1ED}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_CANARY_ISLANDS' => "\u{1F1EE}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_INDONESIA' => "\u{1F1EE}\u{1F1E9}", - 'CHARACTER_FLAGS_FOR_IRELAND' => "\u{1F1EE}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_ISRAEL' => "\u{1F1EE}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_ISLE_OF_MAN' => "\u{1F1EE}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_INDIA' => "\u{1F1EE}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_BRITISH_INDIAN_OCEAN_TERRITORY' => "\u{1F1EE}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_IRAQ' => "\u{1F1EE}\u{1F1F6}", - 'CHARACTER_FLAGS_FOR_IRAN' => "\u{1F1EE}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_ICELAND' => "\u{1F1EE}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_ITALY' => "\u{1F1EE}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_JERSEY' => "\u{1F1EF}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_JAMAICA' => "\u{1F1EF}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_JORDAN' => "\u{1F1EF}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_JAPAN' => "\u{1F1EF}\u{1F1F5}", - 'CHARACTER_FLAGS_FOR_KENYA' => "\u{1F1F0}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_KYRGYZSTAN' => "\u{1F1F0}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_CAMBODIA' => "\u{1F1F0}\u{1F1ED}", - 'CHARACTER_FLAGS_FOR_KIRIBATI' => "\u{1F1F0}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_COMOROS' => "\u{1F1F0}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_ST_KITTS_AND_NEVIS' => "\u{1F1F0}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_NORTH_KOREA' => "\u{1F1F0}\u{1F1F5}", - 'CHARACTER_FLAGS_FOR_SOUTH_KOREA' => "\u{1F1F0}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_KUWAIT' => "\u{1F1F0}\u{1F1FC}", - 'CHARACTER_FLAGS_FOR_CAYMAN_ISLANDS' => "\u{1F1F0}\u{1F1FE}", - 'CHARACTER_FLAGS_FOR_KAZAKHSTAN' => "\u{1F1F0}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_LAOS' => "\u{1F1F1}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_LEBANON' => "\u{1F1F1}\u{1F1E7}", - 'CHARACTER_FLAGS_FOR_ST_LUCIA' => "\u{1F1F1}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_LIECHTENSTEIN' => "\u{1F1F1}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_SRI_LANKA' => "\u{1F1F1}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_LIBERIA' => "\u{1F1F1}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_LESOTHO' => "\u{1F1F1}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_LITHUANIA' => "\u{1F1F1}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_LUXEMBOURG' => "\u{1F1F1}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_LATVIA' => "\u{1F1F1}\u{1F1FB}", - 'CHARACTER_FLAGS_FOR_LIBYA' => "\u{1F1F1}\u{1F1FE}", - 'CHARACTER_FLAGS_FOR_MOROCCO' => "\u{1F1F2}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_MONACO' => "\u{1F1F2}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_MOLDOVA' => "\u{1F1F2}\u{1F1E9}", - 'CHARACTER_FLAGS_FOR_MONTENEGRO' => "\u{1F1F2}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_ST_MARTIN' => "\u{1F1F2}\u{1F1EB}", - 'CHARACTER_FLAGS_FOR_MADAGASCAR' => "\u{1F1F2}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_MARSHALL_ISLANDS' => "\u{1F1F2}\u{1F1ED}", - 'CHARACTER_FLAGS_FOR_MACEDONIA' => "\u{1F1F2}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_MALI' => "\u{1F1F2}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_MYANMAR_BURMA' => "\u{1F1F2}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_MONGOLIA' => "\u{1F1F2}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_MACAU_SAR_CHINA' => "\u{1F1F2}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_NORTHERN_MARIANA_ISLANDS' => "\u{1F1F2}\u{1F1F5}", - 'CHARACTER_FLAGS_FOR_MARTINIQUE' => "\u{1F1F2}\u{1F1F6}", - 'CHARACTER_FLAGS_FOR_MAURITANIA' => "\u{1F1F2}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_MONTSERRAT' => "\u{1F1F2}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_MALTA' => "\u{1F1F2}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_MAURITIUS' => "\u{1F1F2}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_MALDIVES' => "\u{1F1F2}\u{1F1FB}", - 'CHARACTER_FLAGS_FOR_MALAWI' => "\u{1F1F2}\u{1F1FC}", - 'CHARACTER_FLAGS_FOR_MEXICO' => "\u{1F1F2}\u{1F1FD}", - 'CHARACTER_FLAGS_FOR_MALAYSIA' => "\u{1F1F2}\u{1F1FE}", - 'CHARACTER_FLAGS_FOR_MOZAMBIQUE' => "\u{1F1F2}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_NAMIBIA' => "\u{1F1F3}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_NEW_CALEDONIA' => "\u{1F1F3}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_NIGER' => "\u{1F1F3}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_NORFOLK_ISLAND' => "\u{1F1F3}\u{1F1EB}", - 'CHARACTER_FLAGS_FOR_NIGERIA' => "\u{1F1F3}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_NICARAGUA' => "\u{1F1F3}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_NETHERLANDS' => "\u{1F1F3}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_NORWAY' => "\u{1F1F3}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_NEPAL' => "\u{1F1F3}\u{1F1F5}", - 'CHARACTER_FLAGS_FOR_NAURU' => "\u{1F1F3}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_NIUE' => "\u{1F1F3}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_NEW_ZEALAND' => "\u{1F1F3}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_OMAN' => "\u{1F1F4}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_PANAMA' => "\u{1F1F5}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_PERU' => "\u{1F1F5}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_FRENCH_POLYNESIA' => "\u{1F1F5}\u{1F1EB}", - 'CHARACTER_FLAGS_FOR_PAPUA_NEW_GUINEA' => "\u{1F1F5}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_PHILIPPINES' => "\u{1F1F5}\u{1F1ED}", - 'CHARACTER_FLAGS_FOR_PAKISTAN' => "\u{1F1F5}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_POLAND' => "\u{1F1F5}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_ST_PIERRE_AND_MIQUELON' => "\u{1F1F5}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_PITCAIRN_ISLANDS' => "\u{1F1F5}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_PUERTO_RICO' => "\u{1F1F5}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_PALESTINIAN_TERRITORIES' => "\u{1F1F5}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_PORTUGAL' => "\u{1F1F5}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_PALAU' => "\u{1F1F5}\u{1F1FC}", - 'CHARACTER_FLAGS_FOR_PARAGUAY' => "\u{1F1F5}\u{1F1FE}", - 'CHARACTER_FLAGS_FOR_QATAR' => "\u{1F1F6}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_REUNION' => "\u{1F1F7}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_ROMANIA' => "\u{1F1F7}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_SERBIA' => "\u{1F1F7}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_RUSSIA' => "\u{1F1F7}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_RWANDA' => "\u{1F1F7}\u{1F1FC}", - 'CHARACTER_FLAGS_FOR_SAUDI_ARABIA' => "\u{1F1F8}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_SOLOMON_ISLANDS' => "\u{1F1F8}\u{1F1E7}", - 'CHARACTER_FLAGS_FOR_SEYCHELLES' => "\u{1F1F8}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_SUDAN' => "\u{1F1F8}\u{1F1E9}", - 'CHARACTER_FLAGS_FOR_SWEDEN' => "\u{1F1F8}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_SINGAPORE' => "\u{1F1F8}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_ST_HELENA' => "\u{1F1F8}\u{1F1ED}", - 'CHARACTER_FLAGS_FOR_SLOVENIA' => "\u{1F1F8}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_SVALBARD_AND_JAN_MAYEN' => "\u{1F1F8}\u{1F1EF}", - 'CHARACTER_FLAGS_FOR_SLOVAKIA' => "\u{1F1F8}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_SIERRA_LEONE' => "\u{1F1F8}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_SAN_MARINO' => "\u{1F1F8}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_SENEGAL' => "\u{1F1F8}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_SOMALIA' => "\u{1F1F8}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_SURINAME' => "\u{1F1F8}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_SOUTH_SUDAN' => "\u{1F1F8}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_SAO_TOME_AND_PRINCIPE' => "\u{1F1F8}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_EL_SALVADOR' => "\u{1F1F8}\u{1F1FB}", - 'CHARACTER_FLAGS_FOR_SINT_MAARTEN' => "\u{1F1F8}\u{1F1FD}", - 'CHARACTER_FLAGS_FOR_SYRIA' => "\u{1F1F8}\u{1F1FE}", - 'CHARACTER_FLAGS_FOR_SWAZILAND' => "\u{1F1F8}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_TRISTAN_DA_CUNHA' => "\u{1F1F9}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_TURKS_AND_CAICOS_ISLANDS' => "\u{1F1F9}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_CHAD' => "\u{1F1F9}\u{1F1E9}", - 'CHARACTER_FLAGS_FOR_FRENCH_SOUTHERN_TERRITORIES' => "\u{1F1F9}\u{1F1EB}", - 'CHARACTER_FLAGS_FOR_TOGO' => "\u{1F1F9}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_THAILAND' => "\u{1F1F9}\u{1F1ED}", - 'CHARACTER_FLAGS_FOR_TAJIKISTAN' => "\u{1F1F9}\u{1F1EF}", - 'CHARACTER_FLAGS_FOR_TOKELAU' => "\u{1F1F9}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_TIMOR_LESTE' => "\u{1F1F9}\u{1F1F1}", - 'CHARACTER_FLAGS_FOR_TURKMENISTAN' => "\u{1F1F9}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_TUNISIA' => "\u{1F1F9}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_TONGA' => "\u{1F1F9}\u{1F1F4}", - 'CHARACTER_FLAGS_FOR_TURKEY' => "\u{1F1F9}\u{1F1F7}", - 'CHARACTER_FLAGS_FOR_TRINIDAD_AND_TOBAGO' => "\u{1F1F9}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_TUVALU' => "\u{1F1F9}\u{1F1FB}", - 'CHARACTER_FLAGS_FOR_TAIWAN' => "\u{1F1F9}\u{1F1FC}", - 'CHARACTER_FLAGS_FOR_TANZANIA' => "\u{1F1F9}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_UKRAINE' => "\u{1F1FA}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_UGANDA' => "\u{1F1FA}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_US_OUTLYING_ISLANDS' => "\u{1F1FA}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_UNITED_NATIONS' => "\u{1F1FA}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_UNITED_STATES' => "\u{1F1FA}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_URUGUAY' => "\u{1F1FA}\u{1F1FE}", - 'CHARACTER_FLAGS_FOR_UZBEKISTAN' => "\u{1F1FA}\u{1F1FF}", - 'CHARACTER_FLAGS_FOR_VATICAN_CITY' => "\u{1F1FB}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_ST_VINCENT_AND_GRENADINES' => "\u{1F1FB}\u{1F1E8}", - 'CHARACTER_FLAGS_FOR_VENEZUELA' => "\u{1F1FB}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_BRITISH_VIRGIN_ISLANDS' => "\u{1F1FB}\u{1F1EC}", - 'CHARACTER_FLAGS_FOR_US_VIRGIN_ISLANDS' => "\u{1F1FB}\u{1F1EE}", - 'CHARACTER_FLAGS_FOR_VIETNAM' => "\u{1F1FB}\u{1F1F3}", - 'CHARACTER_FLAGS_FOR_VANUATU' => "\u{1F1FB}\u{1F1FA}", - 'CHARACTER_FLAGS_FOR_WALLIS_AND_FUTUNA' => "\u{1F1FC}\u{1F1EB}", - 'CHARACTER_FLAGS_FOR_SAMOA' => "\u{1F1FC}\u{1F1F8}", - 'CHARACTER_FLAGS_FOR_KOSOVO' => "\u{1F1FD}\u{1F1F0}", - 'CHARACTER_FLAGS_FOR_YEMEN' => "\u{1F1FE}\u{1F1EA}", - 'CHARACTER_FLAGS_FOR_MAYOTTE' => "\u{1F1FE}\u{1F1F9}", - 'CHARACTER_FLAGS_FOR_SOUTH_AFRICA' => "\u{1F1FF}\u{1F1E6}", - 'CHARACTER_FLAGS_FOR_ZAMBIA' => "\u{1F1FF}\u{1F1F2}", - 'CHARACTER_FLAGS_FOR_ZIMBABWE' => "\u{1F1FF}\u{1F1FC}", - // ##### Emoji subgroup: Subdivision-flag ##### - 'CHARACTER_FLAGS_FOR_ENGLAND' => "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}", - 'CHARACTER_FLAGS_FOR_SCOTLAND' => "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}", - 'CHARACTER_FLAGS_FOR_WALES' => "\u{1F3F4}\u{E0067}\u{E0062}\u{E0077}\u{E006C}\u{E0073}\u{E007F}", -]; +// ########## Unicode Emoji v11.0 ########## +// ##### Emoji group: Smileys & People ##### +// ##### Emoji subgroup: Face-positive ##### + +return ['CHARACTER_GRINNING_FACE' => "\u{1F600}", 'CHARACTER_BEAMING_FACE_WITH_SMILING_EYES' => "\u{1F601}", 'CHARACTER_FACE_WITH_TEARS_OF_JOY' => "\u{1F602}", 'CHARACTER_ROLLING_ON_THE_FLOOR_LAUGHING' => "\u{1F923}", 'CHARACTER_GRINNING_FACE_WITH_BIG_EYES' => "\u{1F603}", 'CHARACTER_GRINNING_FACE_WITH_SMILING_EYES' => "\u{1F604}", 'CHARACTER_GRINNING_FACE_WITH_SWEAT' => "\u{1F605}", 'CHARACTER_GRINNING_SQUINTING_FACE' => "\u{1F606}", 'CHARACTER_WINKING_FACE' => "\u{1F609}", 'CHARACTER_SMILING_FACE_WITH_SMILING_EYES' => "\u{1F60A}", 'CHARACTER_FACE_SAVORING_FOOD' => "\u{1F60B}", 'CHARACTER_SMILING_FACE_WITH_SUNGLASSES' => "\u{1F60E}", 'CHARACTER_SMILING_FACE_WITH_HEART_EYES' => "\u{1F60D}", 'CHARACTER_FACE_BLOWING_A_KISS' => "\u{1F618}", 'CHARACTER_SMILING_FACE_WITH_3_HEARTS' => "\u{1F970}", 'CHARACTER_KISSING_FACE' => "\u{1F617}", 'CHARACTER_KISSING_FACE_WITH_SMILING_EYES' => "\u{1F619}", 'CHARACTER_KISSING_FACE_WITH_CLOSED_EYES' => "\u{1F61A}", 'CHARACTER_SMILING_FACE' => "\u{263A}\u{FE0F}", 'CHARACTER_SLIGHTLY_SMILING_FACE' => "\u{1F642}", 'CHARACTER_HUGGING_FACE' => "\u{1F917}", 'CHARACTER_STAR_STRUCK' => "\u{1F929}", 'CHARACTER_THINKING_FACE' => "\u{1F914}", 'CHARACTER_FACE_WITH_RAISED_EYEBROW' => "\u{1F928}", 'CHARACTER_NEUTRAL_FACE' => "\u{1F610}", 'CHARACTER_EXPRESSIONLESS_FACE' => "\u{1F611}", 'CHARACTER_FACE_WITHOUT_MOUTH' => "\u{1F636}", 'CHARACTER_FACE_WITH_ROLLING_EYES' => "\u{1F644}", 'CHARACTER_SMIRKING_FACE' => "\u{1F60F}", 'CHARACTER_PERSEVERING_FACE' => "\u{1F623}", 'CHARACTER_SAD_BUT_RELIEVED_FACE' => "\u{1F625}", 'CHARACTER_FACE_WITH_OPEN_MOUTH' => "\u{1F62E}", 'CHARACTER_ZIPPER_MOUTH_FACE' => "\u{1F910}", 'CHARACTER_HUSHED_FACE' => "\u{1F62F}", 'CHARACTER_SLEEPY_FACE' => "\u{1F62A}", 'CHARACTER_TIRED_FACE' => "\u{1F62B}", 'CHARACTER_SLEEPING_FACE' => "\u{1F634}", 'CHARACTER_RELIEVED_FACE' => "\u{1F60C}", 'CHARACTER_FACE_WITH_TONGUE' => "\u{1F61B}", 'CHARACTER_WINKING_FACE_WITH_TONGUE' => "\u{1F61C}", 'CHARACTER_SQUINTING_FACE_WITH_TONGUE' => "\u{1F61D}", 'CHARACTER_DROOLING_FACE' => "\u{1F924}", 'CHARACTER_UNAMUSED_FACE' => "\u{1F612}", 'CHARACTER_DOWNCAST_FACE_WITH_SWEAT' => "\u{1F613}", 'CHARACTER_PENSIVE_FACE' => "\u{1F614}", 'CHARACTER_CONFUSED_FACE' => "\u{1F615}", 'CHARACTER_UPSIDE_DOWN_FACE' => "\u{1F643}", 'CHARACTER_MONEY_MOUTH_FACE' => "\u{1F911}", 'CHARACTER_ASTONISHED_FACE' => "\u{1F632}", 'CHARACTER_FROWNING_FACE' => "\u{2639}\u{FE0F}", 'CHARACTER_SLIGHTLY_FROWNING_FACE' => "\u{1F641}", 'CHARACTER_CONFOUNDED_FACE' => "\u{1F616}", 'CHARACTER_DISAPPOINTED_FACE' => "\u{1F61E}", 'CHARACTER_WORRIED_FACE' => "\u{1F61F}", 'CHARACTER_FACE_WITH_STEAM_FROM_NOSE' => "\u{1F624}", 'CHARACTER_CRYING_FACE' => "\u{1F622}", 'CHARACTER_LOUDLY_CRYING_FACE' => "\u{1F62D}", 'CHARACTER_FROWNING_FACE_WITH_OPEN_MOUTH' => "\u{1F626}", 'CHARACTER_ANGUISHED_FACE' => "\u{1F627}", 'CHARACTER_FEARFUL_FACE' => "\u{1F628}", 'CHARACTER_WEARY_FACE' => "\u{1F629}", 'CHARACTER_EXPLODING_HEAD' => "\u{1F92F}", 'CHARACTER_GRIMACING_FACE' => "\u{1F62C}", 'CHARACTER_ANXIOUS_FACE_WITH_SWEAT' => "\u{1F630}", 'CHARACTER_FACE_SCREAMING_IN_FEAR' => "\u{1F631}", 'CHARACTER_HOT_FACE' => "\u{1F975}", 'CHARACTER_COLD_FACE' => "\u{1F976}", 'CHARACTER_FLUSHED_FACE' => "\u{1F633}", 'CHARACTER_ZANY_FACE' => "\u{1F92A}", 'CHARACTER_DIZZY_FACE' => "\u{1F635}", 'CHARACTER_POUTING_FACE' => "\u{1F621}", 'CHARACTER_ANGRY_FACE' => "\u{1F620}", 'CHARACTER_FACE_WITH_SYMBOLS_ON_MOUTH' => "\u{1F92C}", 'CHARACTER_FACE_WITH_MEDICAL_MASK' => "\u{1F637}", 'CHARACTER_FACE_WITH_THERMOMETER' => "\u{1F912}", 'CHARACTER_FACE_WITH_HEAD_BANDAGE' => "\u{1F915}", 'CHARACTER_NAUSEATED_FACE' => "\u{1F922}", 'CHARACTER_FACE_VOMITING' => "\u{1F92E}", 'CHARACTER_SNEEZING_FACE' => "\u{1F927}", 'CHARACTER_SMILING_FACE_WITH_HALO' => "\u{1F607}", 'CHARACTER_COWBOY_HAT_FACE' => "\u{1F920}", 'CHARACTER_PARTYING_FACE' => "\u{1F973}", 'CHARACTER_WOOZY_FACE' => "\u{1F974}", 'CHARACTER_PLEADING_FACE' => "\u{1F97A}", 'CHARACTER_LYING_FACE' => "\u{1F925}", 'CHARACTER_SHUSHING_FACE' => "\u{1F92B}", 'CHARACTER_FACE_WITH_HAND_OVER_MOUTH' => "\u{1F92D}", 'CHARACTER_FACE_WITH_MONOCLE' => "\u{1F9D0}", 'CHARACTER_NERD_FACE' => "\u{1F913}", 'CHARACTER_SMILING_FACE_WITH_HORNS' => "\u{1F608}", 'CHARACTER_ANGRY_FACE_WITH_HORNS' => "\u{1F47F}", 'CHARACTER_CLOWN_FACE' => "\u{1F921}", 'CHARACTER_OGRE' => "\u{1F479}", 'CHARACTER_GOBLIN' => "\u{1F47A}", 'CHARACTER_SKULL' => "\u{1F480}", 'CHARACTER_SKULL_AND_CROSSBONES' => "\u{2620}\u{FE0F}", 'CHARACTER_GHOST' => "\u{1F47B}", 'CHARACTER_ALIEN' => "\u{1F47D}", 'CHARACTER_ALIEN_MONSTER' => "\u{1F47E}", 'CHARACTER_ROBOT_FACE' => "\u{1F916}", 'CHARACTER_PILE_OF_POO' => "\u{1F4A9}", 'CHARACTER_GRINNING_CAT_FACE' => "\u{1F63A}", 'CHARACTER_GRINNING_CAT_FACE_WITH_SMILING_EYES' => "\u{1F638}", 'CHARACTER_CAT_FACE_WITH_TEARS_OF_JOY' => "\u{1F639}", 'CHARACTER_SMILING_CAT_FACE_WITH_HEART_EYES' => "\u{1F63B}", 'CHARACTER_CAT_FACE_WITH_WRY_SMILE' => "\u{1F63C}", 'CHARACTER_KISSING_CAT_FACE' => "\u{1F63D}", 'CHARACTER_WEARY_CAT_FACE' => "\u{1F640}", 'CHARACTER_CRYING_CAT_FACE' => "\u{1F63F}", 'CHARACTER_POUTING_CAT_FACE' => "\u{1F63E}", 'CHARACTER_SEE_NO_EVIL_MONKEY' => "\u{1F648}", 'CHARACTER_HEAR_NO_EVIL_MONKEY' => "\u{1F649}", 'CHARACTER_SPEAK_NO_EVIL_MONKEY' => "\u{1F64A}", 'CHARACTER_LIGHT_SKIN_TONE' => "\u{1F3FB}", 'CHARACTER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3FC}", 'CHARACTER_MEDIUM_SKIN_TONE' => "\u{1F3FD}", 'CHARACTER_MEDIUM_DARK_SKIN_TONE' => "\u{1F3FE}", 'CHARACTER_DARK_SKIN_TONE' => "\u{1F3FF}", 'CHARACTER_BABY' => "\u{1F476}", 'CHARACTER_BABY_LIGHT_SKIN_TONE' => "\u{1F476}\u{1F3FB}", 'CHARACTER_BABY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F476}\u{1F3FC}", 'CHARACTER_BABY_MEDIUM_SKIN_TONE' => "\u{1F476}\u{1F3FD}", 'CHARACTER_BABY_MEDIUM_DARK_SKIN_TONE' => "\u{1F476}\u{1F3FE}", 'CHARACTER_BABY_DARK_SKIN_TONE' => "\u{1F476}\u{1F3FF}", 'CHARACTER_CHILD' => "\u{1F9D2}", 'CHARACTER_CHILD_LIGHT_SKIN_TONE' => "\u{1F9D2}\u{1F3FB}", 'CHARACTER_CHILD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D2}\u{1F3FC}", 'CHARACTER_CHILD_MEDIUM_SKIN_TONE' => "\u{1F9D2}\u{1F3FD}", 'CHARACTER_CHILD_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D2}\u{1F3FE}", 'CHARACTER_CHILD_DARK_SKIN_TONE' => "\u{1F9D2}\u{1F3FF}", 'CHARACTER_BOY' => "\u{1F466}", 'CHARACTER_BOY_LIGHT_SKIN_TONE' => "\u{1F466}\u{1F3FB}", 'CHARACTER_BOY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F466}\u{1F3FC}", 'CHARACTER_BOY_MEDIUM_SKIN_TONE' => "\u{1F466}\u{1F3FD}", 'CHARACTER_BOY_MEDIUM_DARK_SKIN_TONE' => "\u{1F466}\u{1F3FE}", 'CHARACTER_BOY_DARK_SKIN_TONE' => "\u{1F466}\u{1F3FF}", 'CHARACTER_GIRL' => "\u{1F467}", 'CHARACTER_GIRL_LIGHT_SKIN_TONE' => "\u{1F467}\u{1F3FB}", 'CHARACTER_GIRL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F467}\u{1F3FC}", 'CHARACTER_GIRL_MEDIUM_SKIN_TONE' => "\u{1F467}\u{1F3FD}", 'CHARACTER_GIRL_MEDIUM_DARK_SKIN_TONE' => "\u{1F467}\u{1F3FE}", 'CHARACTER_GIRL_DARK_SKIN_TONE' => "\u{1F467}\u{1F3FF}", 'CHARACTER_ADULT' => "\u{1F9D1}", 'CHARACTER_ADULT_LIGHT_SKIN_TONE' => "\u{1F9D1}\u{1F3FB}", 'CHARACTER_ADULT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D1}\u{1F3FC}", 'CHARACTER_ADULT_MEDIUM_SKIN_TONE' => "\u{1F9D1}\u{1F3FD}", 'CHARACTER_ADULT_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D1}\u{1F3FE}", 'CHARACTER_ADULT_DARK_SKIN_TONE' => "\u{1F9D1}\u{1F3FF}", 'CHARACTER_MAN' => "\u{1F468}", 'CHARACTER_MAN_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}", 'CHARACTER_MAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}", 'CHARACTER_MAN_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}", 'CHARACTER_MAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}", 'CHARACTER_MAN_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}", 'CHARACTER_WOMAN' => "\u{1F469}", 'CHARACTER_WOMAN_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}", 'CHARACTER_WOMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}", 'CHARACTER_WOMAN_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}", 'CHARACTER_WOMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}", 'CHARACTER_WOMAN_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}", 'CHARACTER_OLDER_ADULT' => "\u{1F9D3}", 'CHARACTER_OLDER_ADULT_LIGHT_SKIN_TONE' => "\u{1F9D3}\u{1F3FB}", 'CHARACTER_OLDER_ADULT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D3}\u{1F3FC}", 'CHARACTER_OLDER_ADULT_MEDIUM_SKIN_TONE' => "\u{1F9D3}\u{1F3FD}", 'CHARACTER_OLDER_ADULT_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D3}\u{1F3FE}", 'CHARACTER_OLDER_ADULT_DARK_SKIN_TONE' => "\u{1F9D3}\u{1F3FF}", 'CHARACTER_OLD_MAN' => "\u{1F474}", 'CHARACTER_OLD_MAN_LIGHT_SKIN_TONE' => "\u{1F474}\u{1F3FB}", 'CHARACTER_OLD_MAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F474}\u{1F3FC}", 'CHARACTER_OLD_MAN_MEDIUM_SKIN_TONE' => "\u{1F474}\u{1F3FD}", 'CHARACTER_OLD_MAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F474}\u{1F3FE}", 'CHARACTER_OLD_MAN_DARK_SKIN_TONE' => "\u{1F474}\u{1F3FF}", 'CHARACTER_OLD_WOMAN' => "\u{1F475}", 'CHARACTER_OLD_WOMAN_LIGHT_SKIN_TONE' => "\u{1F475}\u{1F3FB}", 'CHARACTER_OLD_WOMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F475}\u{1F3FC}", 'CHARACTER_OLD_WOMAN_MEDIUM_SKIN_TONE' => "\u{1F475}\u{1F3FD}", 'CHARACTER_OLD_WOMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F475}\u{1F3FE}", 'CHARACTER_OLD_WOMAN_DARK_SKIN_TONE' => "\u{1F475}\u{1F3FF}", 'CHARACTER_MAN_HEALTH_WORKER' => "\u{1F468}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_MAN_HEALTH_WORKER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_MAN_HEALTH_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_MAN_HEALTH_WORKER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_MAN_HEALTH_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_MAN_HEALTH_WORKER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_WOMAN_HEALTH_WORKER' => "\u{1F469}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_WOMAN_HEALTH_WORKER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_WOMAN_HEALTH_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_WOMAN_HEALTH_WORKER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_WOMAN_HEALTH_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_WOMAN_HEALTH_WORKER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{2695}\u{FE0F}", 'CHARACTER_MAN_STUDENT' => "\u{1F468}\u{200D}\u{1F393}", 'CHARACTER_MAN_STUDENT_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F393}", 'CHARACTER_MAN_STUDENT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F393}", 'CHARACTER_MAN_STUDENT_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F393}", 'CHARACTER_MAN_STUDENT_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F393}", 'CHARACTER_MAN_STUDENT_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F393}", 'CHARACTER_WOMAN_STUDENT' => "\u{1F469}\u{200D}\u{1F393}", 'CHARACTER_WOMAN_STUDENT_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F393}", 'CHARACTER_WOMAN_STUDENT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F393}", 'CHARACTER_WOMAN_STUDENT_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F393}", 'CHARACTER_WOMAN_STUDENT_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F393}", 'CHARACTER_WOMAN_STUDENT_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F393}", 'CHARACTER_MAN_TEACHER' => "\u{1F468}\u{200D}\u{1F3EB}", 'CHARACTER_MAN_TEACHER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F3EB}", 'CHARACTER_MAN_TEACHER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F3EB}", 'CHARACTER_MAN_TEACHER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F3EB}", 'CHARACTER_MAN_TEACHER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F3EB}", 'CHARACTER_MAN_TEACHER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F3EB}", 'CHARACTER_WOMAN_TEACHER' => "\u{1F469}\u{200D}\u{1F3EB}", 'CHARACTER_WOMAN_TEACHER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F3EB}", 'CHARACTER_WOMAN_TEACHER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F3EB}", 'CHARACTER_WOMAN_TEACHER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F3EB}", 'CHARACTER_WOMAN_TEACHER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F3EB}", 'CHARACTER_WOMAN_TEACHER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F3EB}", 'CHARACTER_MAN_JUDGE' => "\u{1F468}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_MAN_JUDGE_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_MAN_JUDGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_MAN_JUDGE_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_MAN_JUDGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_MAN_JUDGE_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_WOMAN_JUDGE' => "\u{1F469}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_WOMAN_JUDGE_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_WOMAN_JUDGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_WOMAN_JUDGE_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_WOMAN_JUDGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_WOMAN_JUDGE_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{2696}\u{FE0F}", 'CHARACTER_MAN_FARMER' => "\u{1F468}\u{200D}\u{1F33E}", 'CHARACTER_MAN_FARMER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F33E}", 'CHARACTER_MAN_FARMER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F33E}", 'CHARACTER_MAN_FARMER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F33E}", 'CHARACTER_MAN_FARMER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F33E}", 'CHARACTER_MAN_FARMER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F33E}", 'CHARACTER_WOMAN_FARMER' => "\u{1F469}\u{200D}\u{1F33E}", 'CHARACTER_WOMAN_FARMER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F33E}", 'CHARACTER_WOMAN_FARMER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F33E}", 'CHARACTER_WOMAN_FARMER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F33E}", 'CHARACTER_WOMAN_FARMER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F33E}", 'CHARACTER_WOMAN_FARMER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F33E}", 'CHARACTER_MAN_COOK' => "\u{1F468}\u{200D}\u{1F373}", 'CHARACTER_MAN_COOK_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F373}", 'CHARACTER_MAN_COOK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F373}", 'CHARACTER_MAN_COOK_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F373}", 'CHARACTER_MAN_COOK_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F373}", 'CHARACTER_MAN_COOK_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F373}", 'CHARACTER_WOMAN_COOK' => "\u{1F469}\u{200D}\u{1F373}", 'CHARACTER_WOMAN_COOK_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F373}", 'CHARACTER_WOMAN_COOK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F373}", 'CHARACTER_WOMAN_COOK_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F373}", 'CHARACTER_WOMAN_COOK_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F373}", 'CHARACTER_WOMAN_COOK_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F373}", 'CHARACTER_MAN_MECHANIC' => "\u{1F468}\u{200D}\u{1F527}", 'CHARACTER_MAN_MECHANIC_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F527}", 'CHARACTER_MAN_MECHANIC_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F527}", 'CHARACTER_MAN_MECHANIC_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F527}", 'CHARACTER_MAN_MECHANIC_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F527}", 'CHARACTER_MAN_MECHANIC_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F527}", 'CHARACTER_WOMAN_MECHANIC' => "\u{1F469}\u{200D}\u{1F527}", 'CHARACTER_WOMAN_MECHANIC_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F527}", 'CHARACTER_WOMAN_MECHANIC_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F527}", 'CHARACTER_WOMAN_MECHANIC_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F527}", 'CHARACTER_WOMAN_MECHANIC_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F527}", 'CHARACTER_WOMAN_MECHANIC_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F527}", 'CHARACTER_MAN_FACTORY_WORKER' => "\u{1F468}\u{200D}\u{1F3ED}", 'CHARACTER_MAN_FACTORY_WORKER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F3ED}", 'CHARACTER_MAN_FACTORY_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F3ED}", 'CHARACTER_MAN_FACTORY_WORKER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F3ED}", 'CHARACTER_MAN_FACTORY_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F3ED}", 'CHARACTER_MAN_FACTORY_WORKER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F3ED}", 'CHARACTER_WOMAN_FACTORY_WORKER' => "\u{1F469}\u{200D}\u{1F3ED}", 'CHARACTER_WOMAN_FACTORY_WORKER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F3ED}", 'CHARACTER_WOMAN_FACTORY_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F3ED}", 'CHARACTER_WOMAN_FACTORY_WORKER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F3ED}", 'CHARACTER_WOMAN_FACTORY_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F3ED}", 'CHARACTER_WOMAN_FACTORY_WORKER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F3ED}", 'CHARACTER_MAN_OFFICE_WORKER' => "\u{1F468}\u{200D}\u{1F4BC}", 'CHARACTER_MAN_OFFICE_WORKER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F4BC}", 'CHARACTER_MAN_OFFICE_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F4BC}", 'CHARACTER_MAN_OFFICE_WORKER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F4BC}", 'CHARACTER_MAN_OFFICE_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F4BC}", 'CHARACTER_MAN_OFFICE_WORKER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F4BC}", 'CHARACTER_WOMAN_OFFICE_WORKER' => "\u{1F469}\u{200D}\u{1F4BC}", 'CHARACTER_WOMAN_OFFICE_WORKER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F4BC}", 'CHARACTER_WOMAN_OFFICE_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F4BC}", 'CHARACTER_WOMAN_OFFICE_WORKER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F4BC}", 'CHARACTER_WOMAN_OFFICE_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F4BC}", 'CHARACTER_WOMAN_OFFICE_WORKER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F4BC}", 'CHARACTER_MAN_SCIENTIST' => "\u{1F468}\u{200D}\u{1F52C}", 'CHARACTER_MAN_SCIENTIST_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F52C}", 'CHARACTER_MAN_SCIENTIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F52C}", 'CHARACTER_MAN_SCIENTIST_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F52C}", 'CHARACTER_MAN_SCIENTIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F52C}", 'CHARACTER_MAN_SCIENTIST_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F52C}", 'CHARACTER_WOMAN_SCIENTIST' => "\u{1F469}\u{200D}\u{1F52C}", 'CHARACTER_WOMAN_SCIENTIST_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F52C}", 'CHARACTER_WOMAN_SCIENTIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F52C}", 'CHARACTER_WOMAN_SCIENTIST_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F52C}", 'CHARACTER_WOMAN_SCIENTIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F52C}", 'CHARACTER_WOMAN_SCIENTIST_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F52C}", 'CHARACTER_MAN_TECHNOLOGIST' => "\u{1F468}\u{200D}\u{1F4BB}", 'CHARACTER_MAN_TECHNOLOGIST_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F4BB}", 'CHARACTER_MAN_TECHNOLOGIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F4BB}", 'CHARACTER_MAN_TECHNOLOGIST_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F4BB}", 'CHARACTER_MAN_TECHNOLOGIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F4BB}", 'CHARACTER_MAN_TECHNOLOGIST_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F4BB}", 'CHARACTER_WOMAN_TECHNOLOGIST' => "\u{1F469}\u{200D}\u{1F4BB}", 'CHARACTER_WOMAN_TECHNOLOGIST_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F4BB}", 'CHARACTER_WOMAN_TECHNOLOGIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F4BB}", 'CHARACTER_WOMAN_TECHNOLOGIST_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F4BB}", 'CHARACTER_WOMAN_TECHNOLOGIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F4BB}", 'CHARACTER_WOMAN_TECHNOLOGIST_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F4BB}", 'CHARACTER_MAN_SINGER' => "\u{1F468}\u{200D}\u{1F3A4}", 'CHARACTER_MAN_SINGER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F3A4}", 'CHARACTER_MAN_SINGER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F3A4}", 'CHARACTER_MAN_SINGER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F3A4}", 'CHARACTER_MAN_SINGER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F3A4}", 'CHARACTER_MAN_SINGER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F3A4}", 'CHARACTER_WOMAN_SINGER' => "\u{1F469}\u{200D}\u{1F3A4}", 'CHARACTER_WOMAN_SINGER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F3A4}", 'CHARACTER_WOMAN_SINGER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F3A4}", 'CHARACTER_WOMAN_SINGER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F3A4}", 'CHARACTER_WOMAN_SINGER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F3A4}", 'CHARACTER_WOMAN_SINGER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F3A4}", 'CHARACTER_MAN_ARTIST' => "\u{1F468}\u{200D}\u{1F3A8}", 'CHARACTER_MAN_ARTIST_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F3A8}", 'CHARACTER_MAN_ARTIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F3A8}", 'CHARACTER_MAN_ARTIST_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F3A8}", 'CHARACTER_MAN_ARTIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F3A8}", 'CHARACTER_MAN_ARTIST_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F3A8}", 'CHARACTER_WOMAN_ARTIST' => "\u{1F469}\u{200D}\u{1F3A8}", 'CHARACTER_WOMAN_ARTIST_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F3A8}", 'CHARACTER_WOMAN_ARTIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F3A8}", 'CHARACTER_WOMAN_ARTIST_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F3A8}", 'CHARACTER_WOMAN_ARTIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F3A8}", 'CHARACTER_WOMAN_ARTIST_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F3A8}", 'CHARACTER_MAN_PILOT' => "\u{1F468}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_MAN_PILOT_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_MAN_PILOT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_MAN_PILOT_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_MAN_PILOT_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_MAN_PILOT_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_WOMAN_PILOT' => "\u{1F469}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_WOMAN_PILOT_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_WOMAN_PILOT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_WOMAN_PILOT_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_WOMAN_PILOT_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_WOMAN_PILOT_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{2708}\u{FE0F}", 'CHARACTER_MAN_ASTRONAUT' => "\u{1F468}\u{200D}\u{1F680}", 'CHARACTER_MAN_ASTRONAUT_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F680}", 'CHARACTER_MAN_ASTRONAUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F680}", 'CHARACTER_MAN_ASTRONAUT_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F680}", 'CHARACTER_MAN_ASTRONAUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F680}", 'CHARACTER_MAN_ASTRONAUT_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F680}", 'CHARACTER_WOMAN_ASTRONAUT' => "\u{1F469}\u{200D}\u{1F680}", 'CHARACTER_WOMAN_ASTRONAUT_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F680}", 'CHARACTER_WOMAN_ASTRONAUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F680}", 'CHARACTER_WOMAN_ASTRONAUT_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F680}", 'CHARACTER_WOMAN_ASTRONAUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F680}", 'CHARACTER_WOMAN_ASTRONAUT_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F680}", 'CHARACTER_MAN_FIREFIGHTER' => "\u{1F468}\u{200D}\u{1F692}", 'CHARACTER_MAN_FIREFIGHTER_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F692}", 'CHARACTER_MAN_FIREFIGHTER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F692}", 'CHARACTER_MAN_FIREFIGHTER_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F692}", 'CHARACTER_MAN_FIREFIGHTER_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F692}", 'CHARACTER_MAN_FIREFIGHTER_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F692}", 'CHARACTER_WOMAN_FIREFIGHTER' => "\u{1F469}\u{200D}\u{1F692}", 'CHARACTER_WOMAN_FIREFIGHTER_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F692}", 'CHARACTER_WOMAN_FIREFIGHTER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F692}", 'CHARACTER_WOMAN_FIREFIGHTER_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F692}", 'CHARACTER_WOMAN_FIREFIGHTER_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F692}", 'CHARACTER_WOMAN_FIREFIGHTER_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F692}", 'CHARACTER_POLICE_OFFICER' => "\u{1F46E}", 'CHARACTER_POLICE_OFFICER_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FB}", 'CHARACTER_POLICE_OFFICER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FC}", 'CHARACTER_POLICE_OFFICER_MEDIUM_SKIN_TONE' => "\u{1F46E}\u{1F3FD}", 'CHARACTER_POLICE_OFFICER_MEDIUM_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FE}", 'CHARACTER_POLICE_OFFICER_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FF}", 'CHARACTER_MAN_POLICE_OFFICER' => "\u{1F46E}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POLICE_OFFICER_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POLICE_OFFICER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POLICE_OFFICER_MEDIUM_SKIN_TONE' => "\u{1F46E}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POLICE_OFFICER_MEDIUM_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POLICE_OFFICER_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_POLICE_OFFICER' => "\u{1F46E}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POLICE_OFFICER_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POLICE_OFFICER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F46E}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POLICE_OFFICER_MEDIUM_SKIN_TONE' => "\u{1F46E}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POLICE_OFFICER_MEDIUM_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POLICE_OFFICER_DARK_SKIN_TONE' => "\u{1F46E}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_DETECTIVE' => "\u{1F575}\u{FE0F}", 'CHARACTER_DETECTIVE_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FB}", 'CHARACTER_DETECTIVE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FC}", 'CHARACTER_DETECTIVE_MEDIUM_SKIN_TONE' => "\u{1F575}\u{1F3FD}", 'CHARACTER_DETECTIVE_MEDIUM_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FE}", 'CHARACTER_DETECTIVE_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FF}", 'CHARACTER_MAN_DETECTIVE' => "\u{1F575}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_DETECTIVE_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_DETECTIVE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_DETECTIVE_MEDIUM_SKIN_TONE' => "\u{1F575}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_DETECTIVE_MEDIUM_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_DETECTIVE_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_DETECTIVE' => "\u{1F575}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_DETECTIVE_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_DETECTIVE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F575}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_DETECTIVE_MEDIUM_SKIN_TONE' => "\u{1F575}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_DETECTIVE_MEDIUM_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_DETECTIVE_DARK_SKIN_TONE' => "\u{1F575}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_GUARD' => "\u{1F482}", 'CHARACTER_GUARD_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FB}", 'CHARACTER_GUARD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FC}", 'CHARACTER_GUARD_MEDIUM_SKIN_TONE' => "\u{1F482}\u{1F3FD}", 'CHARACTER_GUARD_MEDIUM_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FE}", 'CHARACTER_GUARD_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FF}", 'CHARACTER_MAN_GUARD' => "\u{1F482}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GUARD_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GUARD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GUARD_MEDIUM_SKIN_TONE' => "\u{1F482}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GUARD_MEDIUM_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GUARD_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_GUARD' => "\u{1F482}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GUARD_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GUARD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F482}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GUARD_MEDIUM_SKIN_TONE' => "\u{1F482}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GUARD_MEDIUM_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GUARD_DARK_SKIN_TONE' => "\u{1F482}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_CONSTRUCTION_WORKER' => "\u{1F477}", 'CHARACTER_CONSTRUCTION_WORKER_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FB}", 'CHARACTER_CONSTRUCTION_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FC}", 'CHARACTER_CONSTRUCTION_WORKER_MEDIUM_SKIN_TONE' => "\u{1F477}\u{1F3FD}", 'CHARACTER_CONSTRUCTION_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FE}", 'CHARACTER_CONSTRUCTION_WORKER_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FF}", 'CHARACTER_MAN_CONSTRUCTION_WORKER' => "\u{1F477}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CONSTRUCTION_WORKER_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CONSTRUCTION_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CONSTRUCTION_WORKER_MEDIUM_SKIN_TONE' => "\u{1F477}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CONSTRUCTION_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CONSTRUCTION_WORKER_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_CONSTRUCTION_WORKER' => "\u{1F477}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F477}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_MEDIUM_SKIN_TONE' => "\u{1F477}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_MEDIUM_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CONSTRUCTION_WORKER_DARK_SKIN_TONE' => "\u{1F477}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PRINCE' => "\u{1F934}", 'CHARACTER_PRINCE_LIGHT_SKIN_TONE' => "\u{1F934}\u{1F3FB}", 'CHARACTER_PRINCE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F934}\u{1F3FC}", 'CHARACTER_PRINCE_MEDIUM_SKIN_TONE' => "\u{1F934}\u{1F3FD}", 'CHARACTER_PRINCE_MEDIUM_DARK_SKIN_TONE' => "\u{1F934}\u{1F3FE}", 'CHARACTER_PRINCE_DARK_SKIN_TONE' => "\u{1F934}\u{1F3FF}", 'CHARACTER_PRINCESS' => "\u{1F478}", 'CHARACTER_PRINCESS_LIGHT_SKIN_TONE' => "\u{1F478}\u{1F3FB}", 'CHARACTER_PRINCESS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F478}\u{1F3FC}", 'CHARACTER_PRINCESS_MEDIUM_SKIN_TONE' => "\u{1F478}\u{1F3FD}", 'CHARACTER_PRINCESS_MEDIUM_DARK_SKIN_TONE' => "\u{1F478}\u{1F3FE}", 'CHARACTER_PRINCESS_DARK_SKIN_TONE' => "\u{1F478}\u{1F3FF}", 'CHARACTER_PERSON_WEARING_TURBAN' => "\u{1F473}", 'CHARACTER_PERSON_WEARING_TURBAN_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FB}", 'CHARACTER_PERSON_WEARING_TURBAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FC}", 'CHARACTER_PERSON_WEARING_TURBAN_MEDIUM_SKIN_TONE' => "\u{1F473}\u{1F3FD}", 'CHARACTER_PERSON_WEARING_TURBAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FE}", 'CHARACTER_PERSON_WEARING_TURBAN_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FF}", 'CHARACTER_MAN_WEARING_TURBAN' => "\u{1F473}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WEARING_TURBAN_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WEARING_TURBAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WEARING_TURBAN_MEDIUM_SKIN_TONE' => "\u{1F473}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WEARING_TURBAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WEARING_TURBAN_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_WEARING_TURBAN' => "\u{1F473}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WEARING_TURBAN_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WEARING_TURBAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F473}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WEARING_TURBAN_MEDIUM_SKIN_TONE' => "\u{1F473}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WEARING_TURBAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WEARING_TURBAN_DARK_SKIN_TONE' => "\u{1F473}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_WITH_CHINESE_CAP' => "\u{1F472}", 'CHARACTER_MAN_WITH_CHINESE_CAP_LIGHT_SKIN_TONE' => "\u{1F472}\u{1F3FB}", 'CHARACTER_MAN_WITH_CHINESE_CAP_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F472}\u{1F3FC}", 'CHARACTER_MAN_WITH_CHINESE_CAP_MEDIUM_SKIN_TONE' => "\u{1F472}\u{1F3FD}", 'CHARACTER_MAN_WITH_CHINESE_CAP_MEDIUM_DARK_SKIN_TONE' => "\u{1F472}\u{1F3FE}", 'CHARACTER_MAN_WITH_CHINESE_CAP_DARK_SKIN_TONE' => "\u{1F472}\u{1F3FF}", 'CHARACTER_WOMAN_WITH_HEADSCARF' => "\u{1F9D5}", 'CHARACTER_WOMAN_WITH_HEADSCARF_LIGHT_SKIN_TONE' => "\u{1F9D5}\u{1F3FB}", 'CHARACTER_WOMAN_WITH_HEADSCARF_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D5}\u{1F3FC}", 'CHARACTER_WOMAN_WITH_HEADSCARF_MEDIUM_SKIN_TONE' => "\u{1F9D5}\u{1F3FD}", 'CHARACTER_WOMAN_WITH_HEADSCARF_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D5}\u{1F3FE}", 'CHARACTER_WOMAN_WITH_HEADSCARF_DARK_SKIN_TONE' => "\u{1F9D5}\u{1F3FF}", 'CHARACTER_BEARDED_PERSON' => "\u{1F9D4}", 'CHARACTER_BEARDED_PERSON_LIGHT_SKIN_TONE' => "\u{1F9D4}\u{1F3FB}", 'CHARACTER_BEARDED_PERSON_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D4}\u{1F3FC}", 'CHARACTER_BEARDED_PERSON_MEDIUM_SKIN_TONE' => "\u{1F9D4}\u{1F3FD}", 'CHARACTER_BEARDED_PERSON_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D4}\u{1F3FE}", 'CHARACTER_BEARDED_PERSON_DARK_SKIN_TONE' => "\u{1F9D4}\u{1F3FF}", 'CHARACTER_BLOND_HAIRED_PERSON' => "\u{1F471}", 'CHARACTER_BLOND_HAIRED_PERSON_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FB}", 'CHARACTER_BLOND_HAIRED_PERSON_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FC}", 'CHARACTER_BLOND_HAIRED_PERSON_MEDIUM_SKIN_TONE' => "\u{1F471}\u{1F3FD}", 'CHARACTER_BLOND_HAIRED_PERSON_MEDIUM_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FE}", 'CHARACTER_BLOND_HAIRED_PERSON_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FF}", 'CHARACTER_BLOND_HAIRED_MAN' => "\u{1F471}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_MAN_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_MAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_MAN_MEDIUM_SKIN_TONE' => "\u{1F471}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_MAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_MAN_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_WOMAN' => "\u{1F471}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_WOMAN_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_WOMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F471}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_WOMAN_MEDIUM_SKIN_TONE' => "\u{1F471}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_WOMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_BLOND_HAIRED_WOMAN_DARK_SKIN_TONE' => "\u{1F471}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_RED_HAIRED' => "\u{1F468}\u{200D}\u{1F9B0}", 'CHARACTER_MAN_RED_HAIRED_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F9B0}", 'CHARACTER_MAN_RED_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F9B0}", 'CHARACTER_MAN_RED_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F9B0}", 'CHARACTER_MAN_RED_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F9B0}", 'CHARACTER_MAN_RED_HAIRED_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F9B0}", 'CHARACTER_WOMAN_RED_HAIRED' => "\u{1F469}\u{200D}\u{1F9B0}", 'CHARACTER_WOMAN_RED_HAIRED_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F9B0}", 'CHARACTER_WOMAN_RED_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F9B0}", 'CHARACTER_WOMAN_RED_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F9B0}", 'CHARACTER_WOMAN_RED_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F9B0}", 'CHARACTER_WOMAN_RED_HAIRED_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F9B0}", 'CHARACTER_MAN_CURLY_HAIRED' => "\u{1F468}\u{200D}\u{1F9B1}", 'CHARACTER_MAN_CURLY_HAIRED_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F9B1}", 'CHARACTER_MAN_CURLY_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F9B1}", 'CHARACTER_MAN_CURLY_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F9B1}", 'CHARACTER_MAN_CURLY_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F9B1}", 'CHARACTER_MAN_CURLY_HAIRED_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F9B1}", 'CHARACTER_WOMAN_CURLY_HAIRED' => "\u{1F469}\u{200D}\u{1F9B1}", 'CHARACTER_WOMAN_CURLY_HAIRED_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F9B1}", 'CHARACTER_WOMAN_CURLY_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F9B1}", 'CHARACTER_WOMAN_CURLY_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F9B1}", 'CHARACTER_WOMAN_CURLY_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F9B1}", 'CHARACTER_WOMAN_CURLY_HAIRED_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F9B1}", 'CHARACTER_MAN_BALD' => "\u{1F468}\u{200D}\u{1F9B2}", 'CHARACTER_MAN_BALD_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F9B2}", 'CHARACTER_MAN_BALD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F9B2}", 'CHARACTER_MAN_BALD_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F9B2}", 'CHARACTER_MAN_BALD_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F9B2}", 'CHARACTER_MAN_BALD_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F9B2}", 'CHARACTER_WOMAN_BALD' => "\u{1F469}\u{200D}\u{1F9B2}", 'CHARACTER_WOMAN_BALD_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F9B2}", 'CHARACTER_WOMAN_BALD_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F9B2}", 'CHARACTER_WOMAN_BALD_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F9B2}", 'CHARACTER_WOMAN_BALD_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F9B2}", 'CHARACTER_WOMAN_BALD_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F9B2}", 'CHARACTER_MAN_WHITE_HAIRED' => "\u{1F468}\u{200D}\u{1F9B3}", 'CHARACTER_MAN_WHITE_HAIRED_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FB}\u{200D}\u{1F9B3}", 'CHARACTER_MAN_WHITE_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F468}\u{1F3FC}\u{200D}\u{1F9B3}", 'CHARACTER_MAN_WHITE_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F468}\u{1F3FD}\u{200D}\u{1F9B3}", 'CHARACTER_MAN_WHITE_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FE}\u{200D}\u{1F9B3}", 'CHARACTER_MAN_WHITE_HAIRED_DARK_SKIN_TONE' => "\u{1F468}\u{1F3FF}\u{200D}\u{1F9B3}", 'CHARACTER_WOMAN_WHITE_HAIRED' => "\u{1F469}\u{200D}\u{1F9B3}", 'CHARACTER_WOMAN_WHITE_HAIRED_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FB}\u{200D}\u{1F9B3}", 'CHARACTER_WOMAN_WHITE_HAIRED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F469}\u{1F3FC}\u{200D}\u{1F9B3}", 'CHARACTER_WOMAN_WHITE_HAIRED_MEDIUM_SKIN_TONE' => "\u{1F469}\u{1F3FD}\u{200D}\u{1F9B3}", 'CHARACTER_WOMAN_WHITE_HAIRED_MEDIUM_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FE}\u{200D}\u{1F9B3}", 'CHARACTER_WOMAN_WHITE_HAIRED_DARK_SKIN_TONE' => "\u{1F469}\u{1F3FF}\u{200D}\u{1F9B3}", 'CHARACTER_MAN_IN_TUXEDO' => "\u{1F935}", 'CHARACTER_MAN_IN_TUXEDO_LIGHT_SKIN_TONE' => "\u{1F935}\u{1F3FB}", 'CHARACTER_MAN_IN_TUXEDO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F935}\u{1F3FC}", 'CHARACTER_MAN_IN_TUXEDO_MEDIUM_SKIN_TONE' => "\u{1F935}\u{1F3FD}", 'CHARACTER_MAN_IN_TUXEDO_MEDIUM_DARK_SKIN_TONE' => "\u{1F935}\u{1F3FE}", 'CHARACTER_MAN_IN_TUXEDO_DARK_SKIN_TONE' => "\u{1F935}\u{1F3FF}", 'CHARACTER_BRIDE_WITH_VEIL' => "\u{1F470}", 'CHARACTER_BRIDE_WITH_VEIL_LIGHT_SKIN_TONE' => "\u{1F470}\u{1F3FB}", 'CHARACTER_BRIDE_WITH_VEIL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F470}\u{1F3FC}", 'CHARACTER_BRIDE_WITH_VEIL_MEDIUM_SKIN_TONE' => "\u{1F470}\u{1F3FD}", 'CHARACTER_BRIDE_WITH_VEIL_MEDIUM_DARK_SKIN_TONE' => "\u{1F470}\u{1F3FE}", 'CHARACTER_BRIDE_WITH_VEIL_DARK_SKIN_TONE' => "\u{1F470}\u{1F3FF}", 'CHARACTER_PREGNANT_WOMAN' => "\u{1F930}", 'CHARACTER_PREGNANT_WOMAN_LIGHT_SKIN_TONE' => "\u{1F930}\u{1F3FB}", 'CHARACTER_PREGNANT_WOMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F930}\u{1F3FC}", 'CHARACTER_PREGNANT_WOMAN_MEDIUM_SKIN_TONE' => "\u{1F930}\u{1F3FD}", 'CHARACTER_PREGNANT_WOMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F930}\u{1F3FE}", 'CHARACTER_PREGNANT_WOMAN_DARK_SKIN_TONE' => "\u{1F930}\u{1F3FF}", 'CHARACTER_BREAST_FEEDING' => "\u{1F931}", 'CHARACTER_BREAST_FEEDING_LIGHT_SKIN_TONE' => "\u{1F931}\u{1F3FB}", 'CHARACTER_BREAST_FEEDING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F931}\u{1F3FC}", 'CHARACTER_BREAST_FEEDING_MEDIUM_SKIN_TONE' => "\u{1F931}\u{1F3FD}", 'CHARACTER_BREAST_FEEDING_MEDIUM_DARK_SKIN_TONE' => "\u{1F931}\u{1F3FE}", 'CHARACTER_BREAST_FEEDING_DARK_SKIN_TONE' => "\u{1F931}\u{1F3FF}", 'CHARACTER_BABY_ANGEL' => "\u{1F47C}", 'CHARACTER_BABY_ANGEL_LIGHT_SKIN_TONE' => "\u{1F47C}\u{1F3FB}", 'CHARACTER_BABY_ANGEL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F47C}\u{1F3FC}", 'CHARACTER_BABY_ANGEL_MEDIUM_SKIN_TONE' => "\u{1F47C}\u{1F3FD}", 'CHARACTER_BABY_ANGEL_MEDIUM_DARK_SKIN_TONE' => "\u{1F47C}\u{1F3FE}", 'CHARACTER_BABY_ANGEL_DARK_SKIN_TONE' => "\u{1F47C}\u{1F3FF}", 'CHARACTER_SANTA_CLAUS' => "\u{1F385}", 'CHARACTER_SANTA_CLAUS_LIGHT_SKIN_TONE' => "\u{1F385}\u{1F3FB}", 'CHARACTER_SANTA_CLAUS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F385}\u{1F3FC}", 'CHARACTER_SANTA_CLAUS_MEDIUM_SKIN_TONE' => "\u{1F385}\u{1F3FD}", 'CHARACTER_SANTA_CLAUS_MEDIUM_DARK_SKIN_TONE' => "\u{1F385}\u{1F3FE}", 'CHARACTER_SANTA_CLAUS_DARK_SKIN_TONE' => "\u{1F385}\u{1F3FF}", 'CHARACTER_MRS_CLAUS' => "\u{1F936}", 'CHARACTER_MRS_CLAUS_LIGHT_SKIN_TONE' => "\u{1F936}\u{1F3FB}", 'CHARACTER_MRS_CLAUS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F936}\u{1F3FC}", 'CHARACTER_MRS_CLAUS_MEDIUM_SKIN_TONE' => "\u{1F936}\u{1F3FD}", 'CHARACTER_MRS_CLAUS_MEDIUM_DARK_SKIN_TONE' => "\u{1F936}\u{1F3FE}", 'CHARACTER_MRS_CLAUS_DARK_SKIN_TONE' => "\u{1F936}\u{1F3FF}", 'CHARACTER_SUPERHERO' => "\u{1F9B8}", 'CHARACTER_SUPERHERO_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FB}", 'CHARACTER_SUPERHERO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FC}", 'CHARACTER_SUPERHERO_MEDIUM_SKIN_TONE' => "\u{1F9B8}\u{1F3FD}", 'CHARACTER_SUPERHERO_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FE}", 'CHARACTER_SUPERHERO_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FF}", 'CHARACTER_WOMAN_SUPERHERO' => "\u{1F9B8}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERHERO_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERHERO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERHERO_MEDIUM_SKIN_TONE' => "\u{1F9B8}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERHERO_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERHERO_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_SUPERHERO' => "\u{1F9B8}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERHERO_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERHERO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B8}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERHERO_MEDIUM_SKIN_TONE' => "\u{1F9B8}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERHERO_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERHERO_DARK_SKIN_TONE' => "\u{1F9B8}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_SUPERVILLAIN' => "\u{1F9B9}", 'CHARACTER_SUPERVILLAIN_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FB}", 'CHARACTER_SUPERVILLAIN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FC}", 'CHARACTER_SUPERVILLAIN_MEDIUM_SKIN_TONE' => "\u{1F9B9}\u{1F3FD}", 'CHARACTER_SUPERVILLAIN_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FE}", 'CHARACTER_SUPERVILLAIN_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FF}", 'CHARACTER_WOMAN_SUPERVILLAIN' => "\u{1F9B9}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERVILLAIN_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERVILLAIN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERVILLAIN_MEDIUM_SKIN_TONE' => "\u{1F9B9}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERVILLAIN_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SUPERVILLAIN_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_SUPERVILLAIN' => "\u{1F9B9}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERVILLAIN_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERVILLAIN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B9}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERVILLAIN_MEDIUM_SKIN_TONE' => "\u{1F9B9}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERVILLAIN_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SUPERVILLAIN_DARK_SKIN_TONE' => "\u{1F9B9}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAGE' => "\u{1F9D9}", 'CHARACTER_MAGE_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FB}", 'CHARACTER_MAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FC}", 'CHARACTER_MAGE_MEDIUM_SKIN_TONE' => "\u{1F9D9}\u{1F3FD}", 'CHARACTER_MAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FE}", 'CHARACTER_MAGE_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FF}", 'CHARACTER_WOMAN_MAGE' => "\u{1F9D9}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MAGE_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MAGE_MEDIUM_SKIN_TONE' => "\u{1F9D9}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MAGE_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_MAGE' => "\u{1F9D9}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MAGE_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D9}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MAGE_MEDIUM_SKIN_TONE' => "\u{1F9D9}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MAGE_DARK_SKIN_TONE' => "\u{1F9D9}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_FAIRY' => "\u{1F9DA}", 'CHARACTER_FAIRY_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FB}", 'CHARACTER_FAIRY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FC}", 'CHARACTER_FAIRY_MEDIUM_SKIN_TONE' => "\u{1F9DA}\u{1F3FD}", 'CHARACTER_FAIRY_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FE}", 'CHARACTER_FAIRY_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FF}", 'CHARACTER_WOMAN_FAIRY' => "\u{1F9DA}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FAIRY_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FAIRY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FAIRY_MEDIUM_SKIN_TONE' => "\u{1F9DA}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FAIRY_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FAIRY_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_FAIRY' => "\u{1F9DA}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FAIRY_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FAIRY_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DA}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FAIRY_MEDIUM_SKIN_TONE' => "\u{1F9DA}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FAIRY_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FAIRY_DARK_SKIN_TONE' => "\u{1F9DA}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_VAMPIRE' => "\u{1F9DB}", 'CHARACTER_VAMPIRE_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FB}", 'CHARACTER_VAMPIRE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FC}", 'CHARACTER_VAMPIRE_MEDIUM_SKIN_TONE' => "\u{1F9DB}\u{1F3FD}", 'CHARACTER_VAMPIRE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FE}", 'CHARACTER_VAMPIRE_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FF}", 'CHARACTER_WOMAN_VAMPIRE' => "\u{1F9DB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_VAMPIRE_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_VAMPIRE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_VAMPIRE_MEDIUM_SKIN_TONE' => "\u{1F9DB}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_VAMPIRE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_VAMPIRE_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_VAMPIRE' => "\u{1F9DB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_VAMPIRE_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_VAMPIRE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DB}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_VAMPIRE_MEDIUM_SKIN_TONE' => "\u{1F9DB}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_VAMPIRE_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_VAMPIRE_DARK_SKIN_TONE' => "\u{1F9DB}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MERPERSON' => "\u{1F9DC}", 'CHARACTER_MERPERSON_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FB}", 'CHARACTER_MERPERSON_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FC}", 'CHARACTER_MERPERSON_MEDIUM_SKIN_TONE' => "\u{1F9DC}\u{1F3FD}", 'CHARACTER_MERPERSON_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FE}", 'CHARACTER_MERPERSON_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FF}", 'CHARACTER_MERMAID' => "\u{1F9DC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MERMAID_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MERMAID_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MERMAID_MEDIUM_SKIN_TONE' => "\u{1F9DC}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MERMAID_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MERMAID_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MERMAN' => "\u{1F9DC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MERMAN_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MERMAN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DC}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MERMAN_MEDIUM_SKIN_TONE' => "\u{1F9DC}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MERMAN_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MERMAN_DARK_SKIN_TONE' => "\u{1F9DC}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_ELF' => "\u{1F9DD}", 'CHARACTER_ELF_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FB}", 'CHARACTER_ELF_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FC}", 'CHARACTER_ELF_MEDIUM_SKIN_TONE' => "\u{1F9DD}\u{1F3FD}", 'CHARACTER_ELF_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FE}", 'CHARACTER_ELF_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FF}", 'CHARACTER_WOMAN_ELF' => "\u{1F9DD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ELF_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ELF_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ELF_MEDIUM_SKIN_TONE' => "\u{1F9DD}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ELF_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ELF_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_ELF' => "\u{1F9DD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ELF_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ELF_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9DD}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ELF_MEDIUM_SKIN_TONE' => "\u{1F9DD}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ELF_MEDIUM_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ELF_DARK_SKIN_TONE' => "\u{1F9DD}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_GENIE' => "\u{1F9DE}", 'CHARACTER_WOMAN_GENIE' => "\u{1F9DE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_GENIE' => "\u{1F9DE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_ZOMBIE' => "\u{1F9DF}", 'CHARACTER_WOMAN_ZOMBIE' => "\u{1F9DF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_ZOMBIE' => "\u{1F9DF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_PERSON_FROWNING' => "\u{1F64D}", 'CHARACTER_PERSON_FROWNING_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FB}", 'CHARACTER_PERSON_FROWNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FC}", 'CHARACTER_PERSON_FROWNING_MEDIUM_SKIN_TONE' => "\u{1F64D}\u{1F3FD}", 'CHARACTER_PERSON_FROWNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FE}", 'CHARACTER_PERSON_FROWNING_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FF}", 'CHARACTER_MAN_FROWNING' => "\u{1F64D}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FROWNING_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FROWNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FROWNING_MEDIUM_SKIN_TONE' => "\u{1F64D}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FROWNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FROWNING_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_FROWNING' => "\u{1F64D}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FROWNING_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FROWNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64D}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FROWNING_MEDIUM_SKIN_TONE' => "\u{1F64D}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FROWNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FROWNING_DARK_SKIN_TONE' => "\u{1F64D}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_POUTING' => "\u{1F64E}", 'CHARACTER_PERSON_POUTING_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FB}", 'CHARACTER_PERSON_POUTING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FC}", 'CHARACTER_PERSON_POUTING_MEDIUM_SKIN_TONE' => "\u{1F64E}\u{1F3FD}", 'CHARACTER_PERSON_POUTING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FE}", 'CHARACTER_PERSON_POUTING_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FF}", 'CHARACTER_MAN_POUTING' => "\u{1F64E}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POUTING_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POUTING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POUTING_MEDIUM_SKIN_TONE' => "\u{1F64E}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POUTING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_POUTING_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_POUTING' => "\u{1F64E}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POUTING_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POUTING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64E}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POUTING_MEDIUM_SKIN_TONE' => "\u{1F64E}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POUTING_MEDIUM_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_POUTING_DARK_SKIN_TONE' => "\u{1F64E}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_GESTURING_NO' => "\u{1F645}", 'CHARACTER_PERSON_GESTURING_NO_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FB}", 'CHARACTER_PERSON_GESTURING_NO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FC}", 'CHARACTER_PERSON_GESTURING_NO_MEDIUM_SKIN_TONE' => "\u{1F645}\u{1F3FD}", 'CHARACTER_PERSON_GESTURING_NO_MEDIUM_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FE}", 'CHARACTER_PERSON_GESTURING_NO_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FF}", 'CHARACTER_MAN_GESTURING_NO' => "\u{1F645}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_NO_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_NO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_NO_MEDIUM_SKIN_TONE' => "\u{1F645}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_NO_MEDIUM_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_NO_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_NO' => "\u{1F645}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_NO_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_NO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F645}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_NO_MEDIUM_SKIN_TONE' => "\u{1F645}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_NO_MEDIUM_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_NO_DARK_SKIN_TONE' => "\u{1F645}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_GESTURING_OK' => "\u{1F646}", 'CHARACTER_PERSON_GESTURING_OK_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FB}", 'CHARACTER_PERSON_GESTURING_OK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FC}", 'CHARACTER_PERSON_GESTURING_OK_MEDIUM_SKIN_TONE' => "\u{1F646}\u{1F3FD}", 'CHARACTER_PERSON_GESTURING_OK_MEDIUM_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FE}", 'CHARACTER_PERSON_GESTURING_OK_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FF}", 'CHARACTER_MAN_GESTURING_OK' => "\u{1F646}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_OK_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_OK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_OK_MEDIUM_SKIN_TONE' => "\u{1F646}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_OK_MEDIUM_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GESTURING_OK_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_OK' => "\u{1F646}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_OK_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_OK_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F646}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_OK_MEDIUM_SKIN_TONE' => "\u{1F646}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_OK_MEDIUM_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GESTURING_OK_DARK_SKIN_TONE' => "\u{1F646}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_TIPPING_HAND' => "\u{1F481}", 'CHARACTER_PERSON_TIPPING_HAND_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FB}", 'CHARACTER_PERSON_TIPPING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FC}", 'CHARACTER_PERSON_TIPPING_HAND_MEDIUM_SKIN_TONE' => "\u{1F481}\u{1F3FD}", 'CHARACTER_PERSON_TIPPING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FE}", 'CHARACTER_PERSON_TIPPING_HAND_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FF}", 'CHARACTER_MAN_TIPPING_HAND' => "\u{1F481}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_TIPPING_HAND_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_TIPPING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_TIPPING_HAND_MEDIUM_SKIN_TONE' => "\u{1F481}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_TIPPING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_TIPPING_HAND_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_TIPPING_HAND' => "\u{1F481}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_TIPPING_HAND_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_TIPPING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F481}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_TIPPING_HAND_MEDIUM_SKIN_TONE' => "\u{1F481}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_TIPPING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_TIPPING_HAND_DARK_SKIN_TONE' => "\u{1F481}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_RAISING_HAND' => "\u{1F64B}", 'CHARACTER_PERSON_RAISING_HAND_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FB}", 'CHARACTER_PERSON_RAISING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FC}", 'CHARACTER_PERSON_RAISING_HAND_MEDIUM_SKIN_TONE' => "\u{1F64B}\u{1F3FD}", 'CHARACTER_PERSON_RAISING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FE}", 'CHARACTER_PERSON_RAISING_HAND_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FF}", 'CHARACTER_MAN_RAISING_HAND' => "\u{1F64B}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RAISING_HAND_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RAISING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RAISING_HAND_MEDIUM_SKIN_TONE' => "\u{1F64B}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RAISING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RAISING_HAND_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_RAISING_HAND' => "\u{1F64B}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RAISING_HAND_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RAISING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64B}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RAISING_HAND_MEDIUM_SKIN_TONE' => "\u{1F64B}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RAISING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RAISING_HAND_DARK_SKIN_TONE' => "\u{1F64B}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_BOWING' => "\u{1F647}", 'CHARACTER_PERSON_BOWING_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FB}", 'CHARACTER_PERSON_BOWING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FC}", 'CHARACTER_PERSON_BOWING_MEDIUM_SKIN_TONE' => "\u{1F647}\u{1F3FD}", 'CHARACTER_PERSON_BOWING_MEDIUM_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FE}", 'CHARACTER_PERSON_BOWING_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FF}", 'CHARACTER_MAN_BOWING' => "\u{1F647}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOWING_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOWING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOWING_MEDIUM_SKIN_TONE' => "\u{1F647}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOWING_MEDIUM_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOWING_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_BOWING' => "\u{1F647}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOWING_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOWING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F647}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOWING_MEDIUM_SKIN_TONE' => "\u{1F647}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOWING_MEDIUM_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOWING_DARK_SKIN_TONE' => "\u{1F647}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_FACEPALMING' => "\u{1F926}", 'CHARACTER_PERSON_FACEPALMING_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FB}", 'CHARACTER_PERSON_FACEPALMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FC}", 'CHARACTER_PERSON_FACEPALMING_MEDIUM_SKIN_TONE' => "\u{1F926}\u{1F3FD}", 'CHARACTER_PERSON_FACEPALMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FE}", 'CHARACTER_PERSON_FACEPALMING_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FF}", 'CHARACTER_MAN_FACEPALMING' => "\u{1F926}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FACEPALMING_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FACEPALMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FACEPALMING_MEDIUM_SKIN_TONE' => "\u{1F926}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FACEPALMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_FACEPALMING_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_FACEPALMING' => "\u{1F926}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FACEPALMING_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FACEPALMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F926}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FACEPALMING_MEDIUM_SKIN_TONE' => "\u{1F926}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FACEPALMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_FACEPALMING_DARK_SKIN_TONE' => "\u{1F926}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_SHRUGGING' => "\u{1F937}", 'CHARACTER_PERSON_SHRUGGING_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FB}", 'CHARACTER_PERSON_SHRUGGING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FC}", 'CHARACTER_PERSON_SHRUGGING_MEDIUM_SKIN_TONE' => "\u{1F937}\u{1F3FD}", 'CHARACTER_PERSON_SHRUGGING_MEDIUM_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FE}", 'CHARACTER_PERSON_SHRUGGING_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FF}", 'CHARACTER_MAN_SHRUGGING' => "\u{1F937}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SHRUGGING_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SHRUGGING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SHRUGGING_MEDIUM_SKIN_TONE' => "\u{1F937}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SHRUGGING_MEDIUM_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SHRUGGING_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_SHRUGGING' => "\u{1F937}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SHRUGGING_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SHRUGGING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F937}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SHRUGGING_MEDIUM_SKIN_TONE' => "\u{1F937}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SHRUGGING_MEDIUM_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SHRUGGING_DARK_SKIN_TONE' => "\u{1F937}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_GETTING_MASSAGE' => "\u{1F486}", 'CHARACTER_PERSON_GETTING_MASSAGE_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FB}", 'CHARACTER_PERSON_GETTING_MASSAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FC}", 'CHARACTER_PERSON_GETTING_MASSAGE_MEDIUM_SKIN_TONE' => "\u{1F486}\u{1F3FD}", 'CHARACTER_PERSON_GETTING_MASSAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FE}", 'CHARACTER_PERSON_GETTING_MASSAGE_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FF}", 'CHARACTER_MAN_GETTING_MASSAGE' => "\u{1F486}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_MASSAGE_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_MASSAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_MASSAGE_MEDIUM_SKIN_TONE' => "\u{1F486}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_MASSAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_MASSAGE_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_MASSAGE' => "\u{1F486}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_MASSAGE_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_MASSAGE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F486}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_MASSAGE_MEDIUM_SKIN_TONE' => "\u{1F486}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_MASSAGE_MEDIUM_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_MASSAGE_DARK_SKIN_TONE' => "\u{1F486}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_GETTING_HAIRCUT' => "\u{1F487}", 'CHARACTER_PERSON_GETTING_HAIRCUT_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FB}", 'CHARACTER_PERSON_GETTING_HAIRCUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FC}", 'CHARACTER_PERSON_GETTING_HAIRCUT_MEDIUM_SKIN_TONE' => "\u{1F487}\u{1F3FD}", 'CHARACTER_PERSON_GETTING_HAIRCUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FE}", 'CHARACTER_PERSON_GETTING_HAIRCUT_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FF}", 'CHARACTER_MAN_GETTING_HAIRCUT' => "\u{1F487}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_HAIRCUT_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_HAIRCUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_HAIRCUT_MEDIUM_SKIN_TONE' => "\u{1F487}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_HAIRCUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GETTING_HAIRCUT_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_HAIRCUT' => "\u{1F487}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_HAIRCUT_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_HAIRCUT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F487}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_HAIRCUT_MEDIUM_SKIN_TONE' => "\u{1F487}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_HAIRCUT_MEDIUM_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GETTING_HAIRCUT_DARK_SKIN_TONE' => "\u{1F487}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_WALKING' => "\u{1F6B6}", 'CHARACTER_PERSON_WALKING_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FB}", 'CHARACTER_PERSON_WALKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FC}", 'CHARACTER_PERSON_WALKING_MEDIUM_SKIN_TONE' => "\u{1F6B6}\u{1F3FD}", 'CHARACTER_PERSON_WALKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FE}", 'CHARACTER_PERSON_WALKING_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FF}", 'CHARACTER_MAN_WALKING' => "\u{1F6B6}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WALKING_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WALKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WALKING_MEDIUM_SKIN_TONE' => "\u{1F6B6}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WALKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_WALKING_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_WALKING' => "\u{1F6B6}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WALKING_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WALKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B6}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WALKING_MEDIUM_SKIN_TONE' => "\u{1F6B6}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WALKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_WALKING_DARK_SKIN_TONE' => "\u{1F6B6}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_RUNNING' => "\u{1F3C3}", 'CHARACTER_PERSON_RUNNING_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FB}", 'CHARACTER_PERSON_RUNNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FC}", 'CHARACTER_PERSON_RUNNING_MEDIUM_SKIN_TONE' => "\u{1F3C3}\u{1F3FD}", 'CHARACTER_PERSON_RUNNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FE}", 'CHARACTER_PERSON_RUNNING_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FF}", 'CHARACTER_MAN_RUNNING' => "\u{1F3C3}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RUNNING_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RUNNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RUNNING_MEDIUM_SKIN_TONE' => "\u{1F3C3}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RUNNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_RUNNING_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_RUNNING' => "\u{1F3C3}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RUNNING_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RUNNING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C3}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RUNNING_MEDIUM_SKIN_TONE' => "\u{1F3C3}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RUNNING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_RUNNING_DARK_SKIN_TONE' => "\u{1F3C3}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_DANCING' => "\u{1F483}", 'CHARACTER_WOMAN_DANCING_LIGHT_SKIN_TONE' => "\u{1F483}\u{1F3FB}", 'CHARACTER_WOMAN_DANCING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F483}\u{1F3FC}", 'CHARACTER_WOMAN_DANCING_MEDIUM_SKIN_TONE' => "\u{1F483}\u{1F3FD}", 'CHARACTER_WOMAN_DANCING_MEDIUM_DARK_SKIN_TONE' => "\u{1F483}\u{1F3FE}", 'CHARACTER_WOMAN_DANCING_DARK_SKIN_TONE' => "\u{1F483}\u{1F3FF}", 'CHARACTER_MAN_DANCING' => "\u{1F57A}", 'CHARACTER_MAN_DANCING_LIGHT_SKIN_TONE' => "\u{1F57A}\u{1F3FB}", 'CHARACTER_MAN_DANCING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F57A}\u{1F3FC}", 'CHARACTER_MAN_DANCING_MEDIUM_SKIN_TONE' => "\u{1F57A}\u{1F3FD}", 'CHARACTER_MAN_DANCING_MEDIUM_DARK_SKIN_TONE' => "\u{1F57A}\u{1F3FE}", 'CHARACTER_MAN_DANCING_DARK_SKIN_TONE' => "\u{1F57A}\u{1F3FF}", 'CHARACTER_PEOPLE_WITH_BUNNY_EARS' => "\u{1F46F}", 'CHARACTER_MEN_WITH_BUNNY_EARS' => "\u{1F46F}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMEN_WITH_BUNNY_EARS' => "\u{1F46F}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_IN_STEAMY_ROOM' => "\u{1F9D6}", 'CHARACTER_PERSON_IN_STEAMY_ROOM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FB}", 'CHARACTER_PERSON_IN_STEAMY_ROOM_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FC}", 'CHARACTER_PERSON_IN_STEAMY_ROOM_MEDIUM_SKIN_TONE' => "\u{1F9D6}\u{1F3FD}", 'CHARACTER_PERSON_IN_STEAMY_ROOM_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FE}", 'CHARACTER_PERSON_IN_STEAMY_ROOM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FF}", 'CHARACTER_WOMAN_IN_STEAMY_ROOM' => "\u{1F9D6}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_STEAMY_ROOM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_STEAMY_ROOM_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_STEAMY_ROOM_MEDIUM_SKIN_TONE' => "\u{1F9D6}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_STEAMY_ROOM_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_STEAMY_ROOM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_IN_STEAMY_ROOM' => "\u{1F9D6}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_STEAMY_ROOM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_STEAMY_ROOM_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D6}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_STEAMY_ROOM_MEDIUM_SKIN_TONE' => "\u{1F9D6}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_STEAMY_ROOM_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_STEAMY_ROOM_DARK_SKIN_TONE' => "\u{1F9D6}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_PERSON_CLIMBING' => "\u{1F9D7}", 'CHARACTER_PERSON_CLIMBING_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FB}", 'CHARACTER_PERSON_CLIMBING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FC}", 'CHARACTER_PERSON_CLIMBING_MEDIUM_SKIN_TONE' => "\u{1F9D7}\u{1F3FD}", 'CHARACTER_PERSON_CLIMBING_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FE}", 'CHARACTER_PERSON_CLIMBING_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FF}", 'CHARACTER_WOMAN_CLIMBING' => "\u{1F9D7}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CLIMBING_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CLIMBING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CLIMBING_MEDIUM_SKIN_TONE' => "\u{1F9D7}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CLIMBING_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CLIMBING_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_CLIMBING' => "\u{1F9D7}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CLIMBING_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CLIMBING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D7}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CLIMBING_MEDIUM_SKIN_TONE' => "\u{1F9D7}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CLIMBING_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CLIMBING_DARK_SKIN_TONE' => "\u{1F9D7}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_PERSON_IN_LOTUS_POSITION' => "\u{1F9D8}", 'CHARACTER_PERSON_IN_LOTUS_POSITION_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FB}", 'CHARACTER_PERSON_IN_LOTUS_POSITION_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FC}", 'CHARACTER_PERSON_IN_LOTUS_POSITION_MEDIUM_SKIN_TONE' => "\u{1F9D8}\u{1F3FD}", 'CHARACTER_PERSON_IN_LOTUS_POSITION_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FE}", 'CHARACTER_PERSON_IN_LOTUS_POSITION_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FF}", 'CHARACTER_WOMAN_IN_LOTUS_POSITION' => "\u{1F9D8}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_LOTUS_POSITION_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_LOTUS_POSITION_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_LOTUS_POSITION_MEDIUM_SKIN_TONE' => "\u{1F9D8}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_LOTUS_POSITION_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_IN_LOTUS_POSITION_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_IN_LOTUS_POSITION' => "\u{1F9D8}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_LOTUS_POSITION_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_LOTUS_POSITION_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9D8}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_LOTUS_POSITION_MEDIUM_SKIN_TONE' => "\u{1F9D8}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_LOTUS_POSITION_MEDIUM_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_IN_LOTUS_POSITION_DARK_SKIN_TONE' => "\u{1F9D8}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_PERSON_TAKING_BATH' => "\u{1F6C0}", 'CHARACTER_PERSON_TAKING_BATH_LIGHT_SKIN_TONE' => "\u{1F6C0}\u{1F3FB}", 'CHARACTER_PERSON_TAKING_BATH_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6C0}\u{1F3FC}", 'CHARACTER_PERSON_TAKING_BATH_MEDIUM_SKIN_TONE' => "\u{1F6C0}\u{1F3FD}", 'CHARACTER_PERSON_TAKING_BATH_MEDIUM_DARK_SKIN_TONE' => "\u{1F6C0}\u{1F3FE}", 'CHARACTER_PERSON_TAKING_BATH_DARK_SKIN_TONE' => "\u{1F6C0}\u{1F3FF}", 'CHARACTER_PERSON_IN_BED' => "\u{1F6CC}", 'CHARACTER_PERSON_IN_BED_LIGHT_SKIN_TONE' => "\u{1F6CC}\u{1F3FB}", 'CHARACTER_PERSON_IN_BED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6CC}\u{1F3FC}", 'CHARACTER_PERSON_IN_BED_MEDIUM_SKIN_TONE' => "\u{1F6CC}\u{1F3FD}", 'CHARACTER_PERSON_IN_BED_MEDIUM_DARK_SKIN_TONE' => "\u{1F6CC}\u{1F3FE}", 'CHARACTER_PERSON_IN_BED_DARK_SKIN_TONE' => "\u{1F6CC}\u{1F3FF}", 'CHARACTER_MAN_IN_SUIT_LEVITATING' => "\u{1F574}\u{FE0F}", 'CHARACTER_MAN_IN_SUIT_LEVITATING_LIGHT_SKIN_TONE' => "\u{1F574}\u{1F3FB}", 'CHARACTER_MAN_IN_SUIT_LEVITATING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F574}\u{1F3FC}", 'CHARACTER_MAN_IN_SUIT_LEVITATING_MEDIUM_SKIN_TONE' => "\u{1F574}\u{1F3FD}", 'CHARACTER_MAN_IN_SUIT_LEVITATING_MEDIUM_DARK_SKIN_TONE' => "\u{1F574}\u{1F3FE}", 'CHARACTER_MAN_IN_SUIT_LEVITATING_DARK_SKIN_TONE' => "\u{1F574}\u{1F3FF}", 'CHARACTER_SPEAKING_HEAD' => "\u{1F5E3}\u{FE0F}", 'CHARACTER_BUST_IN_SILHOUETTE' => "\u{1F464}", 'CHARACTER_BUSTS_IN_SILHOUETTE' => "\u{1F465}", 'CHARACTER_PERSON_FENCING' => "\u{1F93A}", 'CHARACTER_HORSE_RACING' => "\u{1F3C7}", 'CHARACTER_HORSE_RACING_LIGHT_SKIN_TONE' => "\u{1F3C7}\u{1F3FB}", 'CHARACTER_HORSE_RACING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C7}\u{1F3FC}", 'CHARACTER_HORSE_RACING_MEDIUM_SKIN_TONE' => "\u{1F3C7}\u{1F3FD}", 'CHARACTER_HORSE_RACING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C7}\u{1F3FE}", 'CHARACTER_HORSE_RACING_DARK_SKIN_TONE' => "\u{1F3C7}\u{1F3FF}", 'CHARACTER_SKIER' => "\u{26F7}\u{FE0F}", 'CHARACTER_SNOWBOARDER' => "\u{1F3C2}", 'CHARACTER_SNOWBOARDER_LIGHT_SKIN_TONE' => "\u{1F3C2}\u{1F3FB}", 'CHARACTER_SNOWBOARDER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C2}\u{1F3FC}", 'CHARACTER_SNOWBOARDER_MEDIUM_SKIN_TONE' => "\u{1F3C2}\u{1F3FD}", 'CHARACTER_SNOWBOARDER_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C2}\u{1F3FE}", 'CHARACTER_SNOWBOARDER_DARK_SKIN_TONE' => "\u{1F3C2}\u{1F3FF}", 'CHARACTER_PERSON_GOLFING' => "\u{1F3CC}\u{FE0F}", 'CHARACTER_PERSON_GOLFING_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FB}", 'CHARACTER_PERSON_GOLFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FC}", 'CHARACTER_PERSON_GOLFING_MEDIUM_SKIN_TONE' => "\u{1F3CC}\u{1F3FD}", 'CHARACTER_PERSON_GOLFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FE}", 'CHARACTER_PERSON_GOLFING_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FF}", 'CHARACTER_MAN_GOLFING' => "\u{1F3CC}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GOLFING_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GOLFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GOLFING_MEDIUM_SKIN_TONE' => "\u{1F3CC}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GOLFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_GOLFING_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_GOLFING' => "\u{1F3CC}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GOLFING_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GOLFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CC}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GOLFING_MEDIUM_SKIN_TONE' => "\u{1F3CC}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GOLFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_GOLFING_DARK_SKIN_TONE' => "\u{1F3CC}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_SURFING' => "\u{1F3C4}", 'CHARACTER_PERSON_SURFING_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FB}", 'CHARACTER_PERSON_SURFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FC}", 'CHARACTER_PERSON_SURFING_MEDIUM_SKIN_TONE' => "\u{1F3C4}\u{1F3FD}", 'CHARACTER_PERSON_SURFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FE}", 'CHARACTER_PERSON_SURFING_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FF}", 'CHARACTER_MAN_SURFING' => "\u{1F3C4}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SURFING_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SURFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SURFING_MEDIUM_SKIN_TONE' => "\u{1F3C4}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SURFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SURFING_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_SURFING' => "\u{1F3C4}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SURFING_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SURFING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3C4}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SURFING_MEDIUM_SKIN_TONE' => "\u{1F3C4}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SURFING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SURFING_DARK_SKIN_TONE' => "\u{1F3C4}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_ROWING_BOAT' => "\u{1F6A3}", 'CHARACTER_PERSON_ROWING_BOAT_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FB}", 'CHARACTER_PERSON_ROWING_BOAT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FC}", 'CHARACTER_PERSON_ROWING_BOAT_MEDIUM_SKIN_TONE' => "\u{1F6A3}\u{1F3FD}", 'CHARACTER_PERSON_ROWING_BOAT_MEDIUM_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FE}", 'CHARACTER_PERSON_ROWING_BOAT_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FF}", 'CHARACTER_MAN_ROWING_BOAT' => "\u{1F6A3}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ROWING_BOAT_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ROWING_BOAT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ROWING_BOAT_MEDIUM_SKIN_TONE' => "\u{1F6A3}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ROWING_BOAT_MEDIUM_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_ROWING_BOAT_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_ROWING_BOAT' => "\u{1F6A3}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ROWING_BOAT_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ROWING_BOAT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6A3}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ROWING_BOAT_MEDIUM_SKIN_TONE' => "\u{1F6A3}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ROWING_BOAT_MEDIUM_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_ROWING_BOAT_DARK_SKIN_TONE' => "\u{1F6A3}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_SWIMMING' => "\u{1F3CA}", 'CHARACTER_PERSON_SWIMMING_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FB}", 'CHARACTER_PERSON_SWIMMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FC}", 'CHARACTER_PERSON_SWIMMING_MEDIUM_SKIN_TONE' => "\u{1F3CA}\u{1F3FD}", 'CHARACTER_PERSON_SWIMMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FE}", 'CHARACTER_PERSON_SWIMMING_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FF}", 'CHARACTER_MAN_SWIMMING' => "\u{1F3CA}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SWIMMING_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SWIMMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SWIMMING_MEDIUM_SKIN_TONE' => "\u{1F3CA}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SWIMMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_SWIMMING_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_SWIMMING' => "\u{1F3CA}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SWIMMING_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SWIMMING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CA}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SWIMMING_MEDIUM_SKIN_TONE' => "\u{1F3CA}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SWIMMING_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_SWIMMING_DARK_SKIN_TONE' => "\u{1F3CA}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_BOUNCING_BALL' => "\u{26F9}\u{FE0F}", 'CHARACTER_PERSON_BOUNCING_BALL_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FB}", 'CHARACTER_PERSON_BOUNCING_BALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FC}", 'CHARACTER_PERSON_BOUNCING_BALL_MEDIUM_SKIN_TONE' => "\u{26F9}\u{1F3FD}", 'CHARACTER_PERSON_BOUNCING_BALL_MEDIUM_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FE}", 'CHARACTER_PERSON_BOUNCING_BALL_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FF}", 'CHARACTER_MAN_BOUNCING_BALL' => "\u{26F9}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOUNCING_BALL_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOUNCING_BALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOUNCING_BALL_MEDIUM_SKIN_TONE' => "\u{26F9}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOUNCING_BALL_MEDIUM_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BOUNCING_BALL_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_BOUNCING_BALL' => "\u{26F9}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOUNCING_BALL_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOUNCING_BALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{26F9}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOUNCING_BALL_MEDIUM_SKIN_TONE' => "\u{26F9}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOUNCING_BALL_MEDIUM_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BOUNCING_BALL_DARK_SKIN_TONE' => "\u{26F9}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_LIFTING_WEIGHTS' => "\u{1F3CB}\u{FE0F}", 'CHARACTER_PERSON_LIFTING_WEIGHTS_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FB}", 'CHARACTER_PERSON_LIFTING_WEIGHTS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FC}", 'CHARACTER_PERSON_LIFTING_WEIGHTS_MEDIUM_SKIN_TONE' => "\u{1F3CB}\u{1F3FD}", 'CHARACTER_PERSON_LIFTING_WEIGHTS_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FE}", 'CHARACTER_PERSON_LIFTING_WEIGHTS_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FF}", 'CHARACTER_MAN_LIFTING_WEIGHTS' => "\u{1F3CB}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_LIFTING_WEIGHTS_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_LIFTING_WEIGHTS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_LIFTING_WEIGHTS_MEDIUM_SKIN_TONE' => "\u{1F3CB}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_LIFTING_WEIGHTS_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_LIFTING_WEIGHTS_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_LIFTING_WEIGHTS' => "\u{1F3CB}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_LIFTING_WEIGHTS_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_LIFTING_WEIGHTS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F3CB}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_LIFTING_WEIGHTS_MEDIUM_SKIN_TONE' => "\u{1F3CB}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_LIFTING_WEIGHTS_MEDIUM_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_LIFTING_WEIGHTS_DARK_SKIN_TONE' => "\u{1F3CB}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_BIKING' => "\u{1F6B4}", 'CHARACTER_PERSON_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FB}", 'CHARACTER_PERSON_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FC}", 'CHARACTER_PERSON_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B4}\u{1F3FD}", 'CHARACTER_PERSON_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FE}", 'CHARACTER_PERSON_BIKING_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FF}", 'CHARACTER_MAN_BIKING' => "\u{1F6B4}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B4}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_BIKING_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_BIKING' => "\u{1F6B4}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B4}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B4}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_BIKING_DARK_SKIN_TONE' => "\u{1F6B4}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_MOUNTAIN_BIKING' => "\u{1F6B5}", 'CHARACTER_PERSON_MOUNTAIN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FB}", 'CHARACTER_PERSON_MOUNTAIN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FC}", 'CHARACTER_PERSON_MOUNTAIN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B5}\u{1F3FD}", 'CHARACTER_PERSON_MOUNTAIN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FE}", 'CHARACTER_PERSON_MOUNTAIN_BIKING_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FF}", 'CHARACTER_MAN_MOUNTAIN_BIKING' => "\u{1F6B5}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MOUNTAIN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MOUNTAIN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MOUNTAIN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B5}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MOUNTAIN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_MOUNTAIN_BIKING_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_MOUNTAIN_BIKING' => "\u{1F6B5}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MOUNTAIN_BIKING_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MOUNTAIN_BIKING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F6B5}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MOUNTAIN_BIKING_MEDIUM_SKIN_TONE' => "\u{1F6B5}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MOUNTAIN_BIKING_MEDIUM_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_MOUNTAIN_BIKING_DARK_SKIN_TONE' => "\u{1F6B5}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_RACING_CAR' => "\u{1F3CE}\u{FE0F}", 'CHARACTER_MOTORCYCLE' => "\u{1F3CD}\u{FE0F}", 'CHARACTER_PERSON_CARTWHEELING' => "\u{1F938}", 'CHARACTER_PERSON_CARTWHEELING_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FB}", 'CHARACTER_PERSON_CARTWHEELING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FC}", 'CHARACTER_PERSON_CARTWHEELING_MEDIUM_SKIN_TONE' => "\u{1F938}\u{1F3FD}", 'CHARACTER_PERSON_CARTWHEELING_MEDIUM_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FE}", 'CHARACTER_PERSON_CARTWHEELING_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FF}", 'CHARACTER_MAN_CARTWHEELING' => "\u{1F938}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CARTWHEELING_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CARTWHEELING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CARTWHEELING_MEDIUM_SKIN_TONE' => "\u{1F938}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CARTWHEELING_MEDIUM_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_CARTWHEELING_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_CARTWHEELING' => "\u{1F938}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CARTWHEELING_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CARTWHEELING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F938}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CARTWHEELING_MEDIUM_SKIN_TONE' => "\u{1F938}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CARTWHEELING_MEDIUM_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_CARTWHEELING_DARK_SKIN_TONE' => "\u{1F938}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PEOPLE_WRESTLING' => "\u{1F93C}", 'CHARACTER_MEN_WRESTLING' => "\u{1F93C}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMEN_WRESTLING' => "\u{1F93C}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_PLAYING_WATER_POLO' => "\u{1F93D}", 'CHARACTER_PERSON_PLAYING_WATER_POLO_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FB}", 'CHARACTER_PERSON_PLAYING_WATER_POLO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FC}", 'CHARACTER_PERSON_PLAYING_WATER_POLO_MEDIUM_SKIN_TONE' => "\u{1F93D}\u{1F3FD}", 'CHARACTER_PERSON_PLAYING_WATER_POLO_MEDIUM_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FE}", 'CHARACTER_PERSON_PLAYING_WATER_POLO_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FF}", 'CHARACTER_MAN_PLAYING_WATER_POLO' => "\u{1F93D}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_WATER_POLO_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_WATER_POLO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_WATER_POLO_MEDIUM_SKIN_TONE' => "\u{1F93D}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_WATER_POLO_MEDIUM_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_WATER_POLO_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_WATER_POLO' => "\u{1F93D}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_WATER_POLO_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_WATER_POLO_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93D}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_WATER_POLO_MEDIUM_SKIN_TONE' => "\u{1F93D}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_WATER_POLO_MEDIUM_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_WATER_POLO_DARK_SKIN_TONE' => "\u{1F93D}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_PLAYING_HANDBALL' => "\u{1F93E}", 'CHARACTER_PERSON_PLAYING_HANDBALL_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FB}", 'CHARACTER_PERSON_PLAYING_HANDBALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FC}", 'CHARACTER_PERSON_PLAYING_HANDBALL_MEDIUM_SKIN_TONE' => "\u{1F93E}\u{1F3FD}", 'CHARACTER_PERSON_PLAYING_HANDBALL_MEDIUM_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FE}", 'CHARACTER_PERSON_PLAYING_HANDBALL_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FF}", 'CHARACTER_MAN_PLAYING_HANDBALL' => "\u{1F93E}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_HANDBALL_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_HANDBALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_HANDBALL_MEDIUM_SKIN_TONE' => "\u{1F93E}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_HANDBALL_MEDIUM_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_PLAYING_HANDBALL_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_HANDBALL' => "\u{1F93E}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_HANDBALL_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_HANDBALL_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F93E}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_HANDBALL_MEDIUM_SKIN_TONE' => "\u{1F93E}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_HANDBALL_MEDIUM_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_PLAYING_HANDBALL_DARK_SKIN_TONE' => "\u{1F93E}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_PERSON_JUGGLING' => "\u{1F939}", 'CHARACTER_PERSON_JUGGLING_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FB}", 'CHARACTER_PERSON_JUGGLING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FC}", 'CHARACTER_PERSON_JUGGLING_MEDIUM_SKIN_TONE' => "\u{1F939}\u{1F3FD}", 'CHARACTER_PERSON_JUGGLING_MEDIUM_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FE}", 'CHARACTER_PERSON_JUGGLING_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FF}", 'CHARACTER_MAN_JUGGLING' => "\u{1F939}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_JUGGLING_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_JUGGLING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_JUGGLING_MEDIUM_SKIN_TONE' => "\u{1F939}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_JUGGLING_MEDIUM_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_MAN_JUGGLING_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}", 'CHARACTER_WOMAN_JUGGLING' => "\u{1F939}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_JUGGLING_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_JUGGLING_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F939}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_JUGGLING_MEDIUM_SKIN_TONE' => "\u{1F939}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_JUGGLING_MEDIUM_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_WOMAN_JUGGLING_DARK_SKIN_TONE' => "\u{1F939}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}", 'CHARACTER_MAN_AND_WOMAN_HOLDING_HANDS' => "\u{1F46B}", 'CHARACTER_TWO_MEN_HOLDING_HANDS' => "\u{1F46C}", 'CHARACTER_TWO_WOMEN_HOLDING_HANDS' => "\u{1F46D}", 'CHARACTER_KISS' => "\u{1F48F}", 'CHARACTER_KISS_WOMAN_MAN' => "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}", 'CHARACTER_KISS_MAN_MAN' => "\u{1F468}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}", 'CHARACTER_KISS_WOMAN_WOMAN' => "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}", 'CHARACTER_COUPLE_WITH_HEART' => "\u{1F491}", 'CHARACTER_COUPLE_WITH_HEART_WOMAN_MAN' => "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}", 'CHARACTER_COUPLE_WITH_HEART_MAN_MAN' => "\u{1F468}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}", 'CHARACTER_COUPLE_WITH_HEART_WOMAN_WOMAN' => "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}", 'CHARACTER_FAMILY' => "\u{1F46A}", 'CHARACTER_FAMILY_MAN_WOMAN_BOY' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_MAN_WOMAN_GIRL' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}", 'CHARACTER_FAMILY_MAN_WOMAN_GIRL_BOY' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_MAN_WOMAN_BOY_BOY' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F466}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_MAN_WOMAN_GIRL_GIRL' => "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F467}", 'CHARACTER_FAMILY_MAN_MAN_BOY' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_MAN_MAN_GIRL' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F467}", 'CHARACTER_FAMILY_MAN_MAN_GIRL_BOY' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_MAN_MAN_BOY_BOY' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F466}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_MAN_MAN_GIRL_GIRL' => "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F467}", 'CHARACTER_FAMILY_WOMAN_WOMAN_BOY' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_WOMAN_WOMAN_GIRL' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}", 'CHARACTER_FAMILY_WOMAN_WOMAN_GIRL_BOY' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_WOMAN_WOMAN_BOY_BOY' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F466}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_WOMAN_WOMAN_GIRL_GIRL' => "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F467}", 'CHARACTER_FAMILY_MAN_BOY' => "\u{1F468}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_MAN_BOY_BOY' => "\u{1F468}\u{200D}\u{1F466}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_MAN_GIRL' => "\u{1F468}\u{200D}\u{1F467}", 'CHARACTER_FAMILY_MAN_GIRL_BOY' => "\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_MAN_GIRL_GIRL' => "\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F467}", 'CHARACTER_FAMILY_WOMAN_BOY' => "\u{1F469}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_WOMAN_BOY_BOY' => "\u{1F469}\u{200D}\u{1F466}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_WOMAN_GIRL' => "\u{1F469}\u{200D}\u{1F467}", 'CHARACTER_FAMILY_WOMAN_GIRL_BOY' => "\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}", 'CHARACTER_FAMILY_WOMAN_GIRL_GIRL' => "\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F467}", 'CHARACTER_SELFIE' => "\u{1F933}", 'CHARACTER_SELFIE_LIGHT_SKIN_TONE' => "\u{1F933}\u{1F3FB}", 'CHARACTER_SELFIE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F933}\u{1F3FC}", 'CHARACTER_SELFIE_MEDIUM_SKIN_TONE' => "\u{1F933}\u{1F3FD}", 'CHARACTER_SELFIE_MEDIUM_DARK_SKIN_TONE' => "\u{1F933}\u{1F3FE}", 'CHARACTER_SELFIE_DARK_SKIN_TONE' => "\u{1F933}\u{1F3FF}", 'CHARACTER_FLEXED_BICEPS' => "\u{1F4AA}", 'CHARACTER_FLEXED_BICEPS_LIGHT_SKIN_TONE' => "\u{1F4AA}\u{1F3FB}", 'CHARACTER_FLEXED_BICEPS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F4AA}\u{1F3FC}", 'CHARACTER_FLEXED_BICEPS_MEDIUM_SKIN_TONE' => "\u{1F4AA}\u{1F3FD}", 'CHARACTER_FLEXED_BICEPS_MEDIUM_DARK_SKIN_TONE' => "\u{1F4AA}\u{1F3FE}", 'CHARACTER_FLEXED_BICEPS_DARK_SKIN_TONE' => "\u{1F4AA}\u{1F3FF}", 'CHARACTER_LEG' => "\u{1F9B5}", 'CHARACTER_LEG_LIGHT_SKIN_TONE' => "\u{1F9B5}\u{1F3FB}", 'CHARACTER_LEG_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B5}\u{1F3FC}", 'CHARACTER_LEG_MEDIUM_SKIN_TONE' => "\u{1F9B5}\u{1F3FD}", 'CHARACTER_LEG_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B5}\u{1F3FE}", 'CHARACTER_LEG_DARK_SKIN_TONE' => "\u{1F9B5}\u{1F3FF}", 'CHARACTER_FOOT' => "\u{1F9B6}", 'CHARACTER_FOOT_LIGHT_SKIN_TONE' => "\u{1F9B6}\u{1F3FB}", 'CHARACTER_FOOT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F9B6}\u{1F3FC}", 'CHARACTER_FOOT_MEDIUM_SKIN_TONE' => "\u{1F9B6}\u{1F3FD}", 'CHARACTER_FOOT_MEDIUM_DARK_SKIN_TONE' => "\u{1F9B6}\u{1F3FE}", 'CHARACTER_FOOT_DARK_SKIN_TONE' => "\u{1F9B6}\u{1F3FF}", 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT' => "\u{1F448}", 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_LIGHT_SKIN_TONE' => "\u{1F448}\u{1F3FB}", 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F448}\u{1F3FC}", 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_MEDIUM_SKIN_TONE' => "\u{1F448}\u{1F3FD}", 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_MEDIUM_DARK_SKIN_TONE' => "\u{1F448}\u{1F3FE}", 'CHARACTER_BACKHAND_INDEX_POINTING_LEFT_DARK_SKIN_TONE' => "\u{1F448}\u{1F3FF}", 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT' => "\u{1F449}", 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_LIGHT_SKIN_TONE' => "\u{1F449}\u{1F3FB}", 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F449}\u{1F3FC}", 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_MEDIUM_SKIN_TONE' => "\u{1F449}\u{1F3FD}", 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_MEDIUM_DARK_SKIN_TONE' => "\u{1F449}\u{1F3FE}", 'CHARACTER_BACKHAND_INDEX_POINTING_RIGHT_DARK_SKIN_TONE' => "\u{1F449}\u{1F3FF}", 'CHARACTER_INDEX_POINTING_UP' => "\u{261D}\u{FE0F}", 'CHARACTER_INDEX_POINTING_UP_LIGHT_SKIN_TONE' => "\u{261D}\u{1F3FB}", 'CHARACTER_INDEX_POINTING_UP_MEDIUM_LIGHT_SKIN_TONE' => "\u{261D}\u{1F3FC}", 'CHARACTER_INDEX_POINTING_UP_MEDIUM_SKIN_TONE' => "\u{261D}\u{1F3FD}", 'CHARACTER_INDEX_POINTING_UP_MEDIUM_DARK_SKIN_TONE' => "\u{261D}\u{1F3FE}", 'CHARACTER_INDEX_POINTING_UP_DARK_SKIN_TONE' => "\u{261D}\u{1F3FF}", 'CHARACTER_BACKHAND_INDEX_POINTING_UP' => "\u{1F446}", 'CHARACTER_BACKHAND_INDEX_POINTING_UP_LIGHT_SKIN_TONE' => "\u{1F446}\u{1F3FB}", 'CHARACTER_BACKHAND_INDEX_POINTING_UP_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F446}\u{1F3FC}", 'CHARACTER_BACKHAND_INDEX_POINTING_UP_MEDIUM_SKIN_TONE' => "\u{1F446}\u{1F3FD}", 'CHARACTER_BACKHAND_INDEX_POINTING_UP_MEDIUM_DARK_SKIN_TONE' => "\u{1F446}\u{1F3FE}", 'CHARACTER_BACKHAND_INDEX_POINTING_UP_DARK_SKIN_TONE' => "\u{1F446}\u{1F3FF}", 'CHARACTER_MIDDLE_FINGER' => "\u{1F595}", 'CHARACTER_MIDDLE_FINGER_LIGHT_SKIN_TONE' => "\u{1F595}\u{1F3FB}", 'CHARACTER_MIDDLE_FINGER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F595}\u{1F3FC}", 'CHARACTER_MIDDLE_FINGER_MEDIUM_SKIN_TONE' => "\u{1F595}\u{1F3FD}", 'CHARACTER_MIDDLE_FINGER_MEDIUM_DARK_SKIN_TONE' => "\u{1F595}\u{1F3FE}", 'CHARACTER_MIDDLE_FINGER_DARK_SKIN_TONE' => "\u{1F595}\u{1F3FF}", 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN' => "\u{1F447}", 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_LIGHT_SKIN_TONE' => "\u{1F447}\u{1F3FB}", 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F447}\u{1F3FC}", 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_MEDIUM_SKIN_TONE' => "\u{1F447}\u{1F3FD}", 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_MEDIUM_DARK_SKIN_TONE' => "\u{1F447}\u{1F3FE}", 'CHARACTER_BACKHAND_INDEX_POINTING_DOWN_DARK_SKIN_TONE' => "\u{1F447}\u{1F3FF}", 'CHARACTER_VICTORY_HAND' => "\u{270C}\u{FE0F}", 'CHARACTER_VICTORY_HAND_LIGHT_SKIN_TONE' => "\u{270C}\u{1F3FB}", 'CHARACTER_VICTORY_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{270C}\u{1F3FC}", 'CHARACTER_VICTORY_HAND_MEDIUM_SKIN_TONE' => "\u{270C}\u{1F3FD}", 'CHARACTER_VICTORY_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{270C}\u{1F3FE}", 'CHARACTER_VICTORY_HAND_DARK_SKIN_TONE' => "\u{270C}\u{1F3FF}", 'CHARACTER_CROSSED_FINGERS' => "\u{1F91E}", 'CHARACTER_CROSSED_FINGERS_LIGHT_SKIN_TONE' => "\u{1F91E}\u{1F3FB}", 'CHARACTER_CROSSED_FINGERS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91E}\u{1F3FC}", 'CHARACTER_CROSSED_FINGERS_MEDIUM_SKIN_TONE' => "\u{1F91E}\u{1F3FD}", 'CHARACTER_CROSSED_FINGERS_MEDIUM_DARK_SKIN_TONE' => "\u{1F91E}\u{1F3FE}", 'CHARACTER_CROSSED_FINGERS_DARK_SKIN_TONE' => "\u{1F91E}\u{1F3FF}", 'CHARACTER_VULCAN_SALUTE' => "\u{1F596}", 'CHARACTER_VULCAN_SALUTE_LIGHT_SKIN_TONE' => "\u{1F596}\u{1F3FB}", 'CHARACTER_VULCAN_SALUTE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F596}\u{1F3FC}", 'CHARACTER_VULCAN_SALUTE_MEDIUM_SKIN_TONE' => "\u{1F596}\u{1F3FD}", 'CHARACTER_VULCAN_SALUTE_MEDIUM_DARK_SKIN_TONE' => "\u{1F596}\u{1F3FE}", 'CHARACTER_VULCAN_SALUTE_DARK_SKIN_TONE' => "\u{1F596}\u{1F3FF}", 'CHARACTER_SIGN_OF_THE_HORNS' => "\u{1F918}", 'CHARACTER_SIGN_OF_THE_HORNS_LIGHT_SKIN_TONE' => "\u{1F918}\u{1F3FB}", 'CHARACTER_SIGN_OF_THE_HORNS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F918}\u{1F3FC}", 'CHARACTER_SIGN_OF_THE_HORNS_MEDIUM_SKIN_TONE' => "\u{1F918}\u{1F3FD}", 'CHARACTER_SIGN_OF_THE_HORNS_MEDIUM_DARK_SKIN_TONE' => "\u{1F918}\u{1F3FE}", 'CHARACTER_SIGN_OF_THE_HORNS_DARK_SKIN_TONE' => "\u{1F918}\u{1F3FF}", 'CHARACTER_CALL_ME_HAND' => "\u{1F919}", 'CHARACTER_CALL_ME_HAND_LIGHT_SKIN_TONE' => "\u{1F919}\u{1F3FB}", 'CHARACTER_CALL_ME_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F919}\u{1F3FC}", 'CHARACTER_CALL_ME_HAND_MEDIUM_SKIN_TONE' => "\u{1F919}\u{1F3FD}", 'CHARACTER_CALL_ME_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F919}\u{1F3FE}", 'CHARACTER_CALL_ME_HAND_DARK_SKIN_TONE' => "\u{1F919}\u{1F3FF}", 'CHARACTER_HAND_WITH_FINGERS_SPLAYED' => "\u{1F590}\u{FE0F}", 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_LIGHT_SKIN_TONE' => "\u{1F590}\u{1F3FB}", 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F590}\u{1F3FC}", 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_MEDIUM_SKIN_TONE' => "\u{1F590}\u{1F3FD}", 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_MEDIUM_DARK_SKIN_TONE' => "\u{1F590}\u{1F3FE}", 'CHARACTER_HAND_WITH_FINGERS_SPLAYED_DARK_SKIN_TONE' => "\u{1F590}\u{1F3FF}", 'CHARACTER_RAISED_HAND' => "\u{270B}", 'CHARACTER_RAISED_HAND_LIGHT_SKIN_TONE' => "\u{270B}\u{1F3FB}", 'CHARACTER_RAISED_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{270B}\u{1F3FC}", 'CHARACTER_RAISED_HAND_MEDIUM_SKIN_TONE' => "\u{270B}\u{1F3FD}", 'CHARACTER_RAISED_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{270B}\u{1F3FE}", 'CHARACTER_RAISED_HAND_DARK_SKIN_TONE' => "\u{270B}\u{1F3FF}", 'CHARACTER_OK_HAND' => "\u{1F44C}", 'CHARACTER_OK_HAND_LIGHT_SKIN_TONE' => "\u{1F44C}\u{1F3FB}", 'CHARACTER_OK_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44C}\u{1F3FC}", 'CHARACTER_OK_HAND_MEDIUM_SKIN_TONE' => "\u{1F44C}\u{1F3FD}", 'CHARACTER_OK_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F44C}\u{1F3FE}", 'CHARACTER_OK_HAND_DARK_SKIN_TONE' => "\u{1F44C}\u{1F3FF}", 'CHARACTER_THUMBS_UP' => "\u{1F44D}", 'CHARACTER_THUMBS_UP_LIGHT_SKIN_TONE' => "\u{1F44D}\u{1F3FB}", 'CHARACTER_THUMBS_UP_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44D}\u{1F3FC}", 'CHARACTER_THUMBS_UP_MEDIUM_SKIN_TONE' => "\u{1F44D}\u{1F3FD}", 'CHARACTER_THUMBS_UP_MEDIUM_DARK_SKIN_TONE' => "\u{1F44D}\u{1F3FE}", 'CHARACTER_THUMBS_UP_DARK_SKIN_TONE' => "\u{1F44D}\u{1F3FF}", 'CHARACTER_THUMBS_DOWN' => "\u{1F44E}", 'CHARACTER_THUMBS_DOWN_LIGHT_SKIN_TONE' => "\u{1F44E}\u{1F3FB}", 'CHARACTER_THUMBS_DOWN_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44E}\u{1F3FC}", 'CHARACTER_THUMBS_DOWN_MEDIUM_SKIN_TONE' => "\u{1F44E}\u{1F3FD}", 'CHARACTER_THUMBS_DOWN_MEDIUM_DARK_SKIN_TONE' => "\u{1F44E}\u{1F3FE}", 'CHARACTER_THUMBS_DOWN_DARK_SKIN_TONE' => "\u{1F44E}\u{1F3FF}", 'CHARACTER_RAISED_FIST' => "\u{270A}", 'CHARACTER_RAISED_FIST_LIGHT_SKIN_TONE' => "\u{270A}\u{1F3FB}", 'CHARACTER_RAISED_FIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{270A}\u{1F3FC}", 'CHARACTER_RAISED_FIST_MEDIUM_SKIN_TONE' => "\u{270A}\u{1F3FD}", 'CHARACTER_RAISED_FIST_MEDIUM_DARK_SKIN_TONE' => "\u{270A}\u{1F3FE}", 'CHARACTER_RAISED_FIST_DARK_SKIN_TONE' => "\u{270A}\u{1F3FF}", 'CHARACTER_ONCOMING_FIST' => "\u{1F44A}", 'CHARACTER_ONCOMING_FIST_LIGHT_SKIN_TONE' => "\u{1F44A}\u{1F3FB}", 'CHARACTER_ONCOMING_FIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44A}\u{1F3FC}", 'CHARACTER_ONCOMING_FIST_MEDIUM_SKIN_TONE' => "\u{1F44A}\u{1F3FD}", 'CHARACTER_ONCOMING_FIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F44A}\u{1F3FE}", 'CHARACTER_ONCOMING_FIST_DARK_SKIN_TONE' => "\u{1F44A}\u{1F3FF}", 'CHARACTER_LEFT_FACING_FIST' => "\u{1F91B}", 'CHARACTER_LEFT_FACING_FIST_LIGHT_SKIN_TONE' => "\u{1F91B}\u{1F3FB}", 'CHARACTER_LEFT_FACING_FIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91B}\u{1F3FC}", 'CHARACTER_LEFT_FACING_FIST_MEDIUM_SKIN_TONE' => "\u{1F91B}\u{1F3FD}", 'CHARACTER_LEFT_FACING_FIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F91B}\u{1F3FE}", 'CHARACTER_LEFT_FACING_FIST_DARK_SKIN_TONE' => "\u{1F91B}\u{1F3FF}", 'CHARACTER_RIGHT_FACING_FIST' => "\u{1F91C}", 'CHARACTER_RIGHT_FACING_FIST_LIGHT_SKIN_TONE' => "\u{1F91C}\u{1F3FB}", 'CHARACTER_RIGHT_FACING_FIST_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91C}\u{1F3FC}", 'CHARACTER_RIGHT_FACING_FIST_MEDIUM_SKIN_TONE' => "\u{1F91C}\u{1F3FD}", 'CHARACTER_RIGHT_FACING_FIST_MEDIUM_DARK_SKIN_TONE' => "\u{1F91C}\u{1F3FE}", 'CHARACTER_RIGHT_FACING_FIST_DARK_SKIN_TONE' => "\u{1F91C}\u{1F3FF}", 'CHARACTER_RAISED_BACK_OF_HAND' => "\u{1F91A}", 'CHARACTER_RAISED_BACK_OF_HAND_LIGHT_SKIN_TONE' => "\u{1F91A}\u{1F3FB}", 'CHARACTER_RAISED_BACK_OF_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91A}\u{1F3FC}", 'CHARACTER_RAISED_BACK_OF_HAND_MEDIUM_SKIN_TONE' => "\u{1F91A}\u{1F3FD}", 'CHARACTER_RAISED_BACK_OF_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F91A}\u{1F3FE}", 'CHARACTER_RAISED_BACK_OF_HAND_DARK_SKIN_TONE' => "\u{1F91A}\u{1F3FF}", 'CHARACTER_WAVING_HAND' => "\u{1F44B}", 'CHARACTER_WAVING_HAND_LIGHT_SKIN_TONE' => "\u{1F44B}\u{1F3FB}", 'CHARACTER_WAVING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44B}\u{1F3FC}", 'CHARACTER_WAVING_HAND_MEDIUM_SKIN_TONE' => "\u{1F44B}\u{1F3FD}", 'CHARACTER_WAVING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{1F44B}\u{1F3FE}", 'CHARACTER_WAVING_HAND_DARK_SKIN_TONE' => "\u{1F44B}\u{1F3FF}", 'CHARACTER_LOVE_YOU_GESTURE' => "\u{1F91F}", 'CHARACTER_LOVE_YOU_GESTURE_LIGHT_SKIN_TONE' => "\u{1F91F}\u{1F3FB}", 'CHARACTER_LOVE_YOU_GESTURE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F91F}\u{1F3FC}", 'CHARACTER_LOVE_YOU_GESTURE_MEDIUM_SKIN_TONE' => "\u{1F91F}\u{1F3FD}", 'CHARACTER_LOVE_YOU_GESTURE_MEDIUM_DARK_SKIN_TONE' => "\u{1F91F}\u{1F3FE}", 'CHARACTER_LOVE_YOU_GESTURE_DARK_SKIN_TONE' => "\u{1F91F}\u{1F3FF}", 'CHARACTER_WRITING_HAND' => "\u{270D}\u{FE0F}", 'CHARACTER_WRITING_HAND_LIGHT_SKIN_TONE' => "\u{270D}\u{1F3FB}", 'CHARACTER_WRITING_HAND_MEDIUM_LIGHT_SKIN_TONE' => "\u{270D}\u{1F3FC}", 'CHARACTER_WRITING_HAND_MEDIUM_SKIN_TONE' => "\u{270D}\u{1F3FD}", 'CHARACTER_WRITING_HAND_MEDIUM_DARK_SKIN_TONE' => "\u{270D}\u{1F3FE}", 'CHARACTER_WRITING_HAND_DARK_SKIN_TONE' => "\u{270D}\u{1F3FF}", 'CHARACTER_CLAPPING_HANDS' => "\u{1F44F}", 'CHARACTER_CLAPPING_HANDS_LIGHT_SKIN_TONE' => "\u{1F44F}\u{1F3FB}", 'CHARACTER_CLAPPING_HANDS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F44F}\u{1F3FC}", 'CHARACTER_CLAPPING_HANDS_MEDIUM_SKIN_TONE' => "\u{1F44F}\u{1F3FD}", 'CHARACTER_CLAPPING_HANDS_MEDIUM_DARK_SKIN_TONE' => "\u{1F44F}\u{1F3FE}", 'CHARACTER_CLAPPING_HANDS_DARK_SKIN_TONE' => "\u{1F44F}\u{1F3FF}", 'CHARACTER_OPEN_HANDS' => "\u{1F450}", 'CHARACTER_OPEN_HANDS_LIGHT_SKIN_TONE' => "\u{1F450}\u{1F3FB}", 'CHARACTER_OPEN_HANDS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F450}\u{1F3FC}", 'CHARACTER_OPEN_HANDS_MEDIUM_SKIN_TONE' => "\u{1F450}\u{1F3FD}", 'CHARACTER_OPEN_HANDS_MEDIUM_DARK_SKIN_TONE' => "\u{1F450}\u{1F3FE}", 'CHARACTER_OPEN_HANDS_DARK_SKIN_TONE' => "\u{1F450}\u{1F3FF}", 'CHARACTER_RAISING_HANDS' => "\u{1F64C}", 'CHARACTER_RAISING_HANDS_LIGHT_SKIN_TONE' => "\u{1F64C}\u{1F3FB}", 'CHARACTER_RAISING_HANDS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64C}\u{1F3FC}", 'CHARACTER_RAISING_HANDS_MEDIUM_SKIN_TONE' => "\u{1F64C}\u{1F3FD}", 'CHARACTER_RAISING_HANDS_MEDIUM_DARK_SKIN_TONE' => "\u{1F64C}\u{1F3FE}", 'CHARACTER_RAISING_HANDS_DARK_SKIN_TONE' => "\u{1F64C}\u{1F3FF}", 'CHARACTER_PALMS_UP_TOGETHER' => "\u{1F932}", 'CHARACTER_PALMS_UP_TOGETHER_LIGHT_SKIN_TONE' => "\u{1F932}\u{1F3FB}", 'CHARACTER_PALMS_UP_TOGETHER_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F932}\u{1F3FC}", 'CHARACTER_PALMS_UP_TOGETHER_MEDIUM_SKIN_TONE' => "\u{1F932}\u{1F3FD}", 'CHARACTER_PALMS_UP_TOGETHER_MEDIUM_DARK_SKIN_TONE' => "\u{1F932}\u{1F3FE}", 'CHARACTER_PALMS_UP_TOGETHER_DARK_SKIN_TONE' => "\u{1F932}\u{1F3FF}", 'CHARACTER_FOLDED_HANDS' => "\u{1F64F}", 'CHARACTER_FOLDED_HANDS_LIGHT_SKIN_TONE' => "\u{1F64F}\u{1F3FB}", 'CHARACTER_FOLDED_HANDS_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F64F}\u{1F3FC}", 'CHARACTER_FOLDED_HANDS_MEDIUM_SKIN_TONE' => "\u{1F64F}\u{1F3FD}", 'CHARACTER_FOLDED_HANDS_MEDIUM_DARK_SKIN_TONE' => "\u{1F64F}\u{1F3FE}", 'CHARACTER_FOLDED_HANDS_DARK_SKIN_TONE' => "\u{1F64F}\u{1F3FF}", 'CHARACTER_HANDSHAKE' => "\u{1F91D}", 'CHARACTER_NAIL_POLISH' => "\u{1F485}", 'CHARACTER_NAIL_POLISH_LIGHT_SKIN_TONE' => "\u{1F485}\u{1F3FB}", 'CHARACTER_NAIL_POLISH_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F485}\u{1F3FC}", 'CHARACTER_NAIL_POLISH_MEDIUM_SKIN_TONE' => "\u{1F485}\u{1F3FD}", 'CHARACTER_NAIL_POLISH_MEDIUM_DARK_SKIN_TONE' => "\u{1F485}\u{1F3FE}", 'CHARACTER_NAIL_POLISH_DARK_SKIN_TONE' => "\u{1F485}\u{1F3FF}", 'CHARACTER_EAR' => "\u{1F442}", 'CHARACTER_EAR_LIGHT_SKIN_TONE' => "\u{1F442}\u{1F3FB}", 'CHARACTER_EAR_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F442}\u{1F3FC}", 'CHARACTER_EAR_MEDIUM_SKIN_TONE' => "\u{1F442}\u{1F3FD}", 'CHARACTER_EAR_MEDIUM_DARK_SKIN_TONE' => "\u{1F442}\u{1F3FE}", 'CHARACTER_EAR_DARK_SKIN_TONE' => "\u{1F442}\u{1F3FF}", 'CHARACTER_NOSE' => "\u{1F443}", 'CHARACTER_NOSE_LIGHT_SKIN_TONE' => "\u{1F443}\u{1F3FB}", 'CHARACTER_NOSE_MEDIUM_LIGHT_SKIN_TONE' => "\u{1F443}\u{1F3FC}", 'CHARACTER_NOSE_MEDIUM_SKIN_TONE' => "\u{1F443}\u{1F3FD}", 'CHARACTER_NOSE_MEDIUM_DARK_SKIN_TONE' => "\u{1F443}\u{1F3FE}", 'CHARACTER_NOSE_DARK_SKIN_TONE' => "\u{1F443}\u{1F3FF}", 'CHARACTER_RED_HAIRED' => "\u{1F9B0}", 'CHARACTER_CURLY_HAIRED' => "\u{1F9B1}", 'CHARACTER_BALD' => "\u{1F9B2}", 'CHARACTER_WHITE_HAIRED' => "\u{1F9B3}", 'CHARACTER_FOOTPRINTS' => "\u{1F463}", 'CHARACTER_EYES' => "\u{1F440}", 'CHARACTER_EYE' => "\u{1F441}\u{FE0F}", 'CHARACTER_EYE_IN_SPEECH_BUBBLE' => "\u{1F441}\u{FE0F}\u{200D}\u{1F5E8}\u{FE0F}", 'CHARACTER_BRAIN' => "\u{1F9E0}", 'CHARACTER_BONE' => "\u{1F9B4}", 'CHARACTER_TOOTH' => "\u{1F9B7}", 'CHARACTER_TONGUE' => "\u{1F445}", 'CHARACTER_MOUTH' => "\u{1F444}", 'CHARACTER_KISS_MARK' => "\u{1F48B}", 'CHARACTER_HEART_WITH_ARROW' => "\u{1F498}", 'CHARACTER_RED_HEART' => "\u{2764}\u{FE0F}", 'CHARACTER_BEATING_HEART' => "\u{1F493}", 'CHARACTER_BROKEN_HEART' => "\u{1F494}", 'CHARACTER_TWO_HEARTS' => "\u{1F495}", 'CHARACTER_SPARKLING_HEART' => "\u{1F496}", 'CHARACTER_GROWING_HEART' => "\u{1F497}", 'CHARACTER_BLUE_HEART' => "\u{1F499}", 'CHARACTER_GREEN_HEART' => "\u{1F49A}", 'CHARACTER_YELLOW_HEART' => "\u{1F49B}", 'CHARACTER_ORANGE_HEART' => "\u{1F9E1}", 'CHARACTER_PURPLE_HEART' => "\u{1F49C}", 'CHARACTER_BLACK_HEART' => "\u{1F5A4}", 'CHARACTER_HEART_WITH_RIBBON' => "\u{1F49D}", 'CHARACTER_REVOLVING_HEARTS' => "\u{1F49E}", 'CHARACTER_HEART_DECORATION' => "\u{1F49F}", 'CHARACTER_HEAVY_HEART_EXCLAMATION' => "\u{2763}\u{FE0F}", 'CHARACTER_LOVE_LETTER' => "\u{1F48C}", 'CHARACTER_ZZZ' => "\u{1F4A4}", 'CHARACTER_ANGER_SYMBOL' => "\u{1F4A2}", 'CHARACTER_BOMB' => "\u{1F4A3}", 'CHARACTER_COLLISION' => "\u{1F4A5}", 'CHARACTER_SWEAT_DROPLETS' => "\u{1F4A6}", 'CHARACTER_DASHING_AWAY' => "\u{1F4A8}", 'CHARACTER_DIZZY' => "\u{1F4AB}", 'CHARACTER_SPEECH_BALLOON' => "\u{1F4AC}", 'CHARACTER_LEFT_SPEECH_BUBBLE' => "\u{1F5E8}\u{FE0F}", 'CHARACTER_RIGHT_ANGER_BUBBLE' => "\u{1F5EF}\u{FE0F}", 'CHARACTER_THOUGHT_BALLOON' => "\u{1F4AD}", 'CHARACTER_HOLE' => "\u{1F573}\u{FE0F}", 'CHARACTER_GLASSES' => "\u{1F453}", 'CHARACTER_SUNGLASSES' => "\u{1F576}\u{FE0F}", 'CHARACTER_GOGGLES' => "\u{1F97D}", 'CHARACTER_LAB_COAT' => "\u{1F97C}", 'CHARACTER_NECKTIE' => "\u{1F454}", 'CHARACTER_T_SHIRT' => "\u{1F455}", 'CHARACTER_JEANS' => "\u{1F456}", 'CHARACTER_SCARF' => "\u{1F9E3}", 'CHARACTER_GLOVES' => "\u{1F9E4}", 'CHARACTER_COAT' => "\u{1F9E5}", 'CHARACTER_SOCKS' => "\u{1F9E6}", 'CHARACTER_DRESS' => "\u{1F457}", 'CHARACTER_KIMONO' => "\u{1F458}", 'CHARACTER_BIKINI' => "\u{1F459}", 'CHARACTER_WOMAN_S_CLOTHES' => "\u{1F45A}", 'CHARACTER_PURSE' => "\u{1F45B}", 'CHARACTER_HANDBAG' => "\u{1F45C}", 'CHARACTER_CLUTCH_BAG' => "\u{1F45D}", 'CHARACTER_SHOPPING_BAGS' => "\u{1F6CD}\u{FE0F}", 'CHARACTER_SCHOOL_BACKPACK' => "\u{1F392}", 'CHARACTER_MAN_S_SHOE' => "\u{1F45E}", 'CHARACTER_RUNNING_SHOE' => "\u{1F45F}", 'CHARACTER_HIKING_BOOT' => "\u{1F97E}", 'CHARACTER_WOMAN_S_FLAT_SHOE' => "\u{1F97F}", 'CHARACTER_HIGH_HEELED_SHOE' => "\u{1F460}", 'CHARACTER_WOMAN_S_SANDAL' => "\u{1F461}", 'CHARACTER_WOMAN_S_BOOT' => "\u{1F462}", 'CHARACTER_CROWN' => "\u{1F451}", 'CHARACTER_WOMAN_S_HAT' => "\u{1F452}", 'CHARACTER_TOP_HAT' => "\u{1F3A9}", 'CHARACTER_GRADUATION_CAP' => "\u{1F393}", 'CHARACTER_BILLED_CAP' => "\u{1F9E2}", 'CHARACTER_RESCUE_WORKER_S_HELMET' => "\u{26D1}\u{FE0F}", 'CHARACTER_PRAYER_BEADS' => "\u{1F4FF}", 'CHARACTER_LIPSTICK' => "\u{1F484}", 'CHARACTER_RING' => "\u{1F48D}", 'CHARACTER_GEM_STONE' => "\u{1F48E}", 'CHARACTER_MONKEY_FACE' => "\u{1F435}", 'CHARACTER_MONKEY' => "\u{1F412}", 'CHARACTER_GORILLA' => "\u{1F98D}", 'CHARACTER_DOG_FACE' => "\u{1F436}", 'CHARACTER_DOG' => "\u{1F415}", 'CHARACTER_POODLE' => "\u{1F429}", 'CHARACTER_WOLF_FACE' => "\u{1F43A}", 'CHARACTER_FOX_FACE' => "\u{1F98A}", 'CHARACTER_RACCOON' => "\u{1F99D}", 'CHARACTER_CAT_FACE' => "\u{1F431}", 'CHARACTER_CAT' => "\u{1F408}", 'CHARACTER_LION_FACE' => "\u{1F981}", 'CHARACTER_TIGER_FACE' => "\u{1F42F}", 'CHARACTER_TIGER' => "\u{1F405}", 'CHARACTER_LEOPARD' => "\u{1F406}", 'CHARACTER_HORSE_FACE' => "\u{1F434}", 'CHARACTER_HORSE' => "\u{1F40E}", 'CHARACTER_UNICORN_FACE' => "\u{1F984}", 'CHARACTER_ZEBRA' => "\u{1F993}", 'CHARACTER_DEER' => "\u{1F98C}", 'CHARACTER_COW_FACE' => "\u{1F42E}", 'CHARACTER_OX' => "\u{1F402}", 'CHARACTER_WATER_BUFFALO' => "\u{1F403}", 'CHARACTER_COW' => "\u{1F404}", 'CHARACTER_PIG_FACE' => "\u{1F437}", 'CHARACTER_PIG' => "\u{1F416}", 'CHARACTER_BOAR' => "\u{1F417}", 'CHARACTER_PIG_NOSE' => "\u{1F43D}", 'CHARACTER_RAM' => "\u{1F40F}", 'CHARACTER_EWE' => "\u{1F411}", 'CHARACTER_GOAT' => "\u{1F410}", 'CHARACTER_CAMEL' => "\u{1F42A}", 'CHARACTER_TWO_HUMP_CAMEL' => "\u{1F42B}", 'CHARACTER_LLAMA' => "\u{1F999}", 'CHARACTER_GIRAFFE' => "\u{1F992}", 'CHARACTER_ELEPHANT' => "\u{1F418}", 'CHARACTER_RHINOCEROS' => "\u{1F98F}", 'CHARACTER_HIPPOPOTAMUS' => "\u{1F99B}", 'CHARACTER_MOUSE_FACE' => "\u{1F42D}", 'CHARACTER_MOUSE' => "\u{1F401}", 'CHARACTER_RAT' => "\u{1F400}", 'CHARACTER_HAMSTER_FACE' => "\u{1F439}", 'CHARACTER_RABBIT_FACE' => "\u{1F430}", 'CHARACTER_RABBIT' => "\u{1F407}", 'CHARACTER_CHIPMUNK' => "\u{1F43F}\u{FE0F}", 'CHARACTER_HEDGEHOG' => "\u{1F994}", 'CHARACTER_BAT' => "\u{1F987}", 'CHARACTER_BEAR_FACE' => "\u{1F43B}", 'CHARACTER_KOALA' => "\u{1F428}", 'CHARACTER_PANDA_FACE' => "\u{1F43C}", 'CHARACTER_KANGAROO' => "\u{1F998}", 'CHARACTER_BADGER' => "\u{1F9A1}", 'CHARACTER_PAW_PRINTS' => "\u{1F43E}", 'CHARACTER_TURKEY' => "\u{1F983}", 'CHARACTER_CHICKEN' => "\u{1F414}", 'CHARACTER_ROOSTER' => "\u{1F413}", 'CHARACTER_HATCHING_CHICK' => "\u{1F423}", 'CHARACTER_BABY_CHICK' => "\u{1F424}", 'CHARACTER_FRONT_FACING_BABY_CHICK' => "\u{1F425}", 'CHARACTER_BIRD' => "\u{1F426}", 'CHARACTER_PENGUIN' => "\u{1F427}", 'CHARACTER_DOVE' => "\u{1F54A}\u{FE0F}", 'CHARACTER_EAGLE' => "\u{1F985}", 'CHARACTER_DUCK' => "\u{1F986}", 'CHARACTER_SWAN' => "\u{1F9A2}", 'CHARACTER_OWL' => "\u{1F989}", 'CHARACTER_PEACOCK' => "\u{1F99A}", 'CHARACTER_PARROT' => "\u{1F99C}", 'CHARACTER_FROG_FACE' => "\u{1F438}", 'CHARACTER_CROCODILE' => "\u{1F40A}", 'CHARACTER_TURTLE' => "\u{1F422}", 'CHARACTER_LIZARD' => "\u{1F98E}", 'CHARACTER_SNAKE' => "\u{1F40D}", 'CHARACTER_DRAGON_FACE' => "\u{1F432}", 'CHARACTER_DRAGON' => "\u{1F409}", 'CHARACTER_SAUROPOD' => "\u{1F995}", 'CHARACTER_T_REX' => "\u{1F996}", 'CHARACTER_SPOUTING_WHALE' => "\u{1F433}", 'CHARACTER_WHALE' => "\u{1F40B}", 'CHARACTER_DOLPHIN' => "\u{1F42C}", 'CHARACTER_FISH' => "\u{1F41F}", 'CHARACTER_TROPICAL_FISH' => "\u{1F420}", 'CHARACTER_BLOWFISH' => "\u{1F421}", 'CHARACTER_SHARK' => "\u{1F988}", 'CHARACTER_OCTOPUS' => "\u{1F419}", 'CHARACTER_SPIRAL_SHELL' => "\u{1F41A}", 'CHARACTER_CRAB' => "\u{1F980}", 'CHARACTER_LOBSTER' => "\u{1F99E}", 'CHARACTER_SHRIMP' => "\u{1F990}", 'CHARACTER_SQUID' => "\u{1F991}", 'CHARACTER_SNAIL' => "\u{1F40C}", 'CHARACTER_BUTTERFLY' => "\u{1F98B}", 'CHARACTER_BUG' => "\u{1F41B}", 'CHARACTER_ANT' => "\u{1F41C}", 'CHARACTER_HONEYBEE' => "\u{1F41D}", 'CHARACTER_LADY_BEETLE' => "\u{1F41E}", 'CHARACTER_CRICKET' => "\u{1F997}", 'CHARACTER_SPIDER' => "\u{1F577}\u{FE0F}", 'CHARACTER_SPIDER_WEB' => "\u{1F578}\u{FE0F}", 'CHARACTER_SCORPION' => "\u{1F982}", 'CHARACTER_MOSQUITO' => "\u{1F99F}", 'CHARACTER_MICROBE' => "\u{1F9A0}", 'CHARACTER_BOUQUET' => "\u{1F490}", 'CHARACTER_CHERRY_BLOSSOM' => "\u{1F338}", 'CHARACTER_WHITE_FLOWER' => "\u{1F4AE}", 'CHARACTER_ROSETTE' => "\u{1F3F5}\u{FE0F}", 'CHARACTER_ROSE' => "\u{1F339}", 'CHARACTER_WILTED_FLOWER' => "\u{1F940}", 'CHARACTER_HIBISCUS' => "\u{1F33A}", 'CHARACTER_SUNFLOWER' => "\u{1F33B}", 'CHARACTER_BLOSSOM' => "\u{1F33C}", 'CHARACTER_TULIP' => "\u{1F337}", 'CHARACTER_SEEDLING' => "\u{1F331}", 'CHARACTER_EVERGREEN_TREE' => "\u{1F332}", 'CHARACTER_DECIDUOUS_TREE' => "\u{1F333}", 'CHARACTER_PALM_TREE' => "\u{1F334}", 'CHARACTER_CACTUS' => "\u{1F335}", 'CHARACTER_SHEAF_OF_RICE' => "\u{1F33E}", 'CHARACTER_HERB' => "\u{1F33F}", 'CHARACTER_SHAMROCK' => "\u{2618}\u{FE0F}", 'CHARACTER_FOUR_LEAF_CLOVER' => "\u{1F340}", 'CHARACTER_MAPLE_LEAF' => "\u{1F341}", 'CHARACTER_FALLEN_LEAF' => "\u{1F342}", 'CHARACTER_LEAF_FLUTTERING_IN_WIND' => "\u{1F343}", 'CHARACTER_GRAPES' => "\u{1F347}", 'CHARACTER_MELON' => "\u{1F348}", 'CHARACTER_WATERMELON' => "\u{1F349}", 'CHARACTER_TANGERINE' => "\u{1F34A}", 'CHARACTER_LEMON' => "\u{1F34B}", 'CHARACTER_BANANA' => "\u{1F34C}", 'CHARACTER_PINEAPPLE' => "\u{1F34D}", 'CHARACTER_MANGO' => "\u{1F96D}", 'CHARACTER_RED_APPLE' => "\u{1F34E}", 'CHARACTER_GREEN_APPLE' => "\u{1F34F}", 'CHARACTER_PEAR' => "\u{1F350}", 'CHARACTER_PEACH' => "\u{1F351}", 'CHARACTER_CHERRIES' => "\u{1F352}", 'CHARACTER_STRAWBERRY' => "\u{1F353}", 'CHARACTER_KIWI_FRUIT' => "\u{1F95D}", 'CHARACTER_TOMATO' => "\u{1F345}", 'CHARACTER_COCONUT' => "\u{1F965}", 'CHARACTER_AVOCADO' => "\u{1F951}", 'CHARACTER_EGGPLANT' => "\u{1F346}", 'CHARACTER_POTATO' => "\u{1F954}", 'CHARACTER_CARROT' => "\u{1F955}", 'CHARACTER_EAR_OF_CORN' => "\u{1F33D}", 'CHARACTER_HOT_PEPPER' => "\u{1F336}\u{FE0F}", 'CHARACTER_CUCUMBER' => "\u{1F952}", 'CHARACTER_LEAFY_GREEN' => "\u{1F96C}", 'CHARACTER_BROCCOLI' => "\u{1F966}", 'CHARACTER_MUSHROOM' => "\u{1F344}", 'CHARACTER_PEANUTS' => "\u{1F95C}", 'CHARACTER_CHESTNUT' => "\u{1F330}", 'CHARACTER_BREAD' => "\u{1F35E}", 'CHARACTER_CROISSANT' => "\u{1F950}", 'CHARACTER_BAGUETTE_BREAD' => "\u{1F956}", 'CHARACTER_PRETZEL' => "\u{1F968}", 'CHARACTER_BAGEL' => "\u{1F96F}", 'CHARACTER_PANCAKES' => "\u{1F95E}", 'CHARACTER_CHEESE_WEDGE' => "\u{1F9C0}", 'CHARACTER_MEAT_ON_BONE' => "\u{1F356}", 'CHARACTER_POULTRY_LEG' => "\u{1F357}", 'CHARACTER_CUT_OF_MEAT' => "\u{1F969}", 'CHARACTER_BACON' => "\u{1F953}", 'CHARACTER_HAMBURGER' => "\u{1F354}", 'CHARACTER_FRENCH_FRIES' => "\u{1F35F}", 'CHARACTER_PIZZA' => "\u{1F355}", 'CHARACTER_HOT_DOG' => "\u{1F32D}", 'CHARACTER_SANDWICH' => "\u{1F96A}", 'CHARACTER_TACO' => "\u{1F32E}", 'CHARACTER_BURRITO' => "\u{1F32F}", 'CHARACTER_STUFFED_FLATBREAD' => "\u{1F959}", 'CHARACTER_EGG' => "\u{1F95A}", 'CHARACTER_COOKING' => "\u{1F373}", 'CHARACTER_SHALLOW_PAN_OF_FOOD' => "\u{1F958}", 'CHARACTER_POT_OF_FOOD' => "\u{1F372}", 'CHARACTER_BOWL_WITH_SPOON' => "\u{1F963}", 'CHARACTER_GREEN_SALAD' => "\u{1F957}", 'CHARACTER_POPCORN' => "\u{1F37F}", 'CHARACTER_SALT' => "\u{1F9C2}", 'CHARACTER_CANNED_FOOD' => "\u{1F96B}", 'CHARACTER_BENTO_BOX' => "\u{1F371}", 'CHARACTER_RICE_CRACKER' => "\u{1F358}", 'CHARACTER_RICE_BALL' => "\u{1F359}", 'CHARACTER_COOKED_RICE' => "\u{1F35A}", 'CHARACTER_CURRY_RICE' => "\u{1F35B}", 'CHARACTER_STEAMING_BOWL' => "\u{1F35C}", 'CHARACTER_SPAGHETTI' => "\u{1F35D}", 'CHARACTER_ROASTED_SWEET_POTATO' => "\u{1F360}", 'CHARACTER_ODEN' => "\u{1F362}", 'CHARACTER_SUSHI' => "\u{1F363}", 'CHARACTER_FRIED_SHRIMP' => "\u{1F364}", 'CHARACTER_FISH_CAKE_WITH_SWIRL' => "\u{1F365}", 'CHARACTER_MOON_CAKE' => "\u{1F96E}", 'CHARACTER_DANGO' => "\u{1F361}", 'CHARACTER_DUMPLING' => "\u{1F95F}", 'CHARACTER_FORTUNE_COOKIE' => "\u{1F960}", 'CHARACTER_TAKEOUT_BOX' => "\u{1F961}", 'CHARACTER_SOFT_ICE_CREAM' => "\u{1F366}", 'CHARACTER_SHAVED_ICE' => "\u{1F367}", 'CHARACTER_ICE_CREAM' => "\u{1F368}", 'CHARACTER_DOUGHNUT' => "\u{1F369}", 'CHARACTER_COOKIE' => "\u{1F36A}", 'CHARACTER_BIRTHDAY_CAKE' => "\u{1F382}", 'CHARACTER_SHORTCAKE' => "\u{1F370}", 'CHARACTER_CUPCAKE' => "\u{1F9C1}", 'CHARACTER_PIE' => "\u{1F967}", 'CHARACTER_CHOCOLATE_BAR' => "\u{1F36B}", 'CHARACTER_CANDY' => "\u{1F36C}", 'CHARACTER_LOLLIPOP' => "\u{1F36D}", 'CHARACTER_CUSTARD' => "\u{1F36E}", 'CHARACTER_HONEY_POT' => "\u{1F36F}", 'CHARACTER_BABY_BOTTLE' => "\u{1F37C}", 'CHARACTER_GLASS_OF_MILK' => "\u{1F95B}", 'CHARACTER_HOT_BEVERAGE' => "\u{2615}", 'CHARACTER_TEACUP_WITHOUT_HANDLE' => "\u{1F375}", 'CHARACTER_SAKE' => "\u{1F376}", 'CHARACTER_BOTTLE_WITH_POPPING_CORK' => "\u{1F37E}", 'CHARACTER_WINE_GLASS' => "\u{1F377}", 'CHARACTER_COCKTAIL_GLASS' => "\u{1F378}", 'CHARACTER_TROPICAL_DRINK' => "\u{1F379}", 'CHARACTER_BEER_MUG' => "\u{1F37A}", 'CHARACTER_CLINKING_BEER_MUGS' => "\u{1F37B}", 'CHARACTER_CLINKING_GLASSES' => "\u{1F942}", 'CHARACTER_TUMBLER_GLASS' => "\u{1F943}", 'CHARACTER_CUP_WITH_STRAW' => "\u{1F964}", 'CHARACTER_CHOPSTICKS' => "\u{1F962}", 'CHARACTER_FORK_AND_KNIFE_WITH_PLATE' => "\u{1F37D}\u{FE0F}", 'CHARACTER_FORK_AND_KNIFE' => "\u{1F374}", 'CHARACTER_SPOON' => "\u{1F944}", 'CHARACTER_KITCHEN_KNIFE' => "\u{1F52A}", 'CHARACTER_AMPHORA' => "\u{1F3FA}", 'CHARACTER_GLOBE_SHOWING_EUROPE_AFRICA' => "\u{1F30D}", 'CHARACTER_GLOBE_SHOWING_AMERICAS' => "\u{1F30E}", 'CHARACTER_GLOBE_SHOWING_ASIA_AUSTRALIA' => "\u{1F30F}", 'CHARACTER_GLOBE_WITH_MERIDIANS' => "\u{1F310}", 'CHARACTER_WORLD_MAP' => "\u{1F5FA}\u{FE0F}", 'CHARACTER_MAP_OF_JAPAN' => "\u{1F5FE}", 'CHARACTER_COMPASS' => "\u{1F9ED}", 'CHARACTER_SNOW_CAPPED_MOUNTAIN' => "\u{1F3D4}\u{FE0F}", 'CHARACTER_MOUNTAIN' => "\u{26F0}\u{FE0F}", 'CHARACTER_VOLCANO' => "\u{1F30B}", 'CHARACTER_MOUNT_FUJI' => "\u{1F5FB}", 'CHARACTER_CAMPING' => "\u{1F3D5}\u{FE0F}", 'CHARACTER_BEACH_WITH_UMBRELLA' => "\u{1F3D6}\u{FE0F}", 'CHARACTER_DESERT' => "\u{1F3DC}\u{FE0F}", 'CHARACTER_DESERT_ISLAND' => "\u{1F3DD}\u{FE0F}", 'CHARACTER_NATIONAL_PARK' => "\u{1F3DE}\u{FE0F}", 'CHARACTER_STADIUM' => "\u{1F3DF}\u{FE0F}", 'CHARACTER_CLASSICAL_BUILDING' => "\u{1F3DB}\u{FE0F}", 'CHARACTER_BUILDING_CONSTRUCTION' => "\u{1F3D7}\u{FE0F}", 'CHARACTER_BRICKS' => "\u{1F9F1}", 'CHARACTER_HOUSES' => "\u{1F3D8}\u{FE0F}", 'CHARACTER_DERELICT_HOUSE' => "\u{1F3DA}\u{FE0F}", 'CHARACTER_HOUSE' => "\u{1F3E0}", 'CHARACTER_HOUSE_WITH_GARDEN' => "\u{1F3E1}", 'CHARACTER_OFFICE_BUILDING' => "\u{1F3E2}", 'CHARACTER_JAPANESE_POST_OFFICE' => "\u{1F3E3}", 'CHARACTER_POST_OFFICE' => "\u{1F3E4}", 'CHARACTER_HOSPITAL' => "\u{1F3E5}", 'CHARACTER_BANK' => "\u{1F3E6}", 'CHARACTER_HOTEL' => "\u{1F3E8}", 'CHARACTER_LOVE_HOTEL' => "\u{1F3E9}", 'CHARACTER_CONVENIENCE_STORE' => "\u{1F3EA}", 'CHARACTER_SCHOOL' => "\u{1F3EB}", 'CHARACTER_DEPARTMENT_STORE' => "\u{1F3EC}", 'CHARACTER_FACTORY' => "\u{1F3ED}", 'CHARACTER_JAPANESE_CASTLE' => "\u{1F3EF}", 'CHARACTER_CASTLE' => "\u{1F3F0}", 'CHARACTER_WEDDING' => "\u{1F492}", 'CHARACTER_TOKYO_TOWER' => "\u{1F5FC}", 'CHARACTER_STATUE_OF_LIBERTY' => "\u{1F5FD}", 'CHARACTER_CHURCH' => "\u{26EA}", 'CHARACTER_MOSQUE' => "\u{1F54C}", 'CHARACTER_SYNAGOGUE' => "\u{1F54D}", 'CHARACTER_SHINTO_SHRINE' => "\u{26E9}\u{FE0F}", 'CHARACTER_KAABA' => "\u{1F54B}", 'CHARACTER_FOUNTAIN' => "\u{26F2}", 'CHARACTER_TENT' => "\u{26FA}", 'CHARACTER_FOGGY' => "\u{1F301}", 'CHARACTER_NIGHT_WITH_STARS' => "\u{1F303}", 'CHARACTER_CITYSCAPE' => "\u{1F3D9}\u{FE0F}", 'CHARACTER_SUNRISE_OVER_MOUNTAINS' => "\u{1F304}", 'CHARACTER_SUNRISE' => "\u{1F305}", 'CHARACTER_CITYSCAPE_AT_DUSK' => "\u{1F306}", 'CHARACTER_SUNSET' => "\u{1F307}", 'CHARACTER_BRIDGE_AT_NIGHT' => "\u{1F309}", 'CHARACTER_HOT_SPRINGS' => "\u{2668}\u{FE0F}", 'CHARACTER_MILKY_WAY' => "\u{1F30C}", 'CHARACTER_CAROUSEL_HORSE' => "\u{1F3A0}", 'CHARACTER_FERRIS_WHEEL' => "\u{1F3A1}", 'CHARACTER_ROLLER_COASTER' => "\u{1F3A2}", 'CHARACTER_BARBER_POLE' => "\u{1F488}", 'CHARACTER_CIRCUS_TENT' => "\u{1F3AA}", 'CHARACTER_LOCOMOTIVE' => "\u{1F682}", 'CHARACTER_RAILWAY_CAR' => "\u{1F683}", 'CHARACTER_HIGH_SPEED_TRAIN' => "\u{1F684}", 'CHARACTER_BULLET_TRAIN' => "\u{1F685}", 'CHARACTER_TRAIN' => "\u{1F686}", 'CHARACTER_METRO' => "\u{1F687}", 'CHARACTER_LIGHT_RAIL' => "\u{1F688}", 'CHARACTER_STATION' => "\u{1F689}", 'CHARACTER_TRAM' => "\u{1F68A}", 'CHARACTER_MONORAIL' => "\u{1F69D}", 'CHARACTER_MOUNTAIN_RAILWAY' => "\u{1F69E}", 'CHARACTER_TRAM_CAR' => "\u{1F68B}", 'CHARACTER_BUS' => "\u{1F68C}", 'CHARACTER_ONCOMING_BUS' => "\u{1F68D}", 'CHARACTER_TROLLEYBUS' => "\u{1F68E}", 'CHARACTER_MINIBUS' => "\u{1F690}", 'CHARACTER_AMBULANCE' => "\u{1F691}", 'CHARACTER_FIRE_ENGINE' => "\u{1F692}", 'CHARACTER_POLICE_CAR' => "\u{1F693}", 'CHARACTER_ONCOMING_POLICE_CAR' => "\u{1F694}", 'CHARACTER_TAXI' => "\u{1F695}", 'CHARACTER_ONCOMING_TAXI' => "\u{1F696}", 'CHARACTER_AUTOMOBILE' => "\u{1F697}", 'CHARACTER_ONCOMING_AUTOMOBILE' => "\u{1F698}", 'CHARACTER_SPORT_UTILITY_VEHICLE' => "\u{1F699}", 'CHARACTER_DELIVERY_TRUCK' => "\u{1F69A}", 'CHARACTER_ARTICULATED_LORRY' => "\u{1F69B}", 'CHARACTER_TRACTOR' => "\u{1F69C}", 'CHARACTER_BICYCLE' => "\u{1F6B2}", 'CHARACTER_KICK_SCOOTER' => "\u{1F6F4}", 'CHARACTER_SKATEBOARD' => "\u{1F6F9}", 'CHARACTER_MOTOR_SCOOTER' => "\u{1F6F5}", 'CHARACTER_BUS_STOP' => "\u{1F68F}", 'CHARACTER_MOTORWAY' => "\u{1F6E3}\u{FE0F}", 'CHARACTER_RAILWAY_TRACK' => "\u{1F6E4}\u{FE0F}", 'CHARACTER_OIL_DRUM' => "\u{1F6E2}\u{FE0F}", 'CHARACTER_FUEL_PUMP' => "\u{26FD}", 'CHARACTER_POLICE_CAR_LIGHT' => "\u{1F6A8}", 'CHARACTER_HORIZONTAL_TRAFFIC_LIGHT' => "\u{1F6A5}", 'CHARACTER_VERTICAL_TRAFFIC_LIGHT' => "\u{1F6A6}", 'CHARACTER_STOP_SIGN' => "\u{1F6D1}", 'CHARACTER_CONSTRUCTION' => "\u{1F6A7}", 'CHARACTER_ANCHOR' => "\u{2693}", 'CHARACTER_SAILBOAT' => "\u{26F5}", 'CHARACTER_CANOE' => "\u{1F6F6}", 'CHARACTER_SPEEDBOAT' => "\u{1F6A4}", 'CHARACTER_PASSENGER_SHIP' => "\u{1F6F3}\u{FE0F}", 'CHARACTER_FERRY' => "\u{26F4}\u{FE0F}", 'CHARACTER_MOTOR_BOAT' => "\u{1F6E5}\u{FE0F}", 'CHARACTER_SHIP' => "\u{1F6A2}", 'CHARACTER_AIRPLANE' => "\u{2708}\u{FE0F}", 'CHARACTER_SMALL_AIRPLANE' => "\u{1F6E9}\u{FE0F}", 'CHARACTER_AIRPLANE_DEPARTURE' => "\u{1F6EB}", 'CHARACTER_AIRPLANE_ARRIVAL' => "\u{1F6EC}", 'CHARACTER_SEAT' => "\u{1F4BA}", 'CHARACTER_HELICOPTER' => "\u{1F681}", 'CHARACTER_SUSPENSION_RAILWAY' => "\u{1F69F}", 'CHARACTER_MOUNTAIN_CABLEWAY' => "\u{1F6A0}", 'CHARACTER_AERIAL_TRAMWAY' => "\u{1F6A1}", 'CHARACTER_SATELLITE' => "\u{1F6F0}\u{FE0F}", 'CHARACTER_ROCKET' => "\u{1F680}", 'CHARACTER_FLYING_SAUCER' => "\u{1F6F8}", 'CHARACTER_BELLHOP_BELL' => "\u{1F6CE}\u{FE0F}", 'CHARACTER_LUGGAGE' => "\u{1F9F3}", 'CHARACTER_HOURGLASS_DONE' => "\u{231B}", 'CHARACTER_HOURGLASS_NOT_DONE' => "\u{23F3}", 'CHARACTER_WATCH' => "\u{231A}", 'CHARACTER_ALARM_CLOCK' => "\u{23F0}", 'CHARACTER_STOPWATCH' => "\u{23F1}\u{FE0F}", 'CHARACTER_TIMER_CLOCK' => "\u{23F2}\u{FE0F}", 'CHARACTER_MANTELPIECE_CLOCK' => "\u{1F570}\u{FE0F}", 'CHARACTER_TWELVE_O_CLOCK' => "\u{1F55B}", 'CHARACTER_TWELVE_THIRTY' => "\u{1F567}", 'CHARACTER_ONE_O_CLOCK' => "\u{1F550}", 'CHARACTER_ONE_THIRTY' => "\u{1F55C}", 'CHARACTER_TWO_O_CLOCK' => "\u{1F551}", 'CHARACTER_TWO_THIRTY' => "\u{1F55D}", 'CHARACTER_THREE_O_CLOCK' => "\u{1F552}", 'CHARACTER_THREE_THIRTY' => "\u{1F55E}", 'CHARACTER_FOUR_O_CLOCK' => "\u{1F553}", 'CHARACTER_FOUR_THIRTY' => "\u{1F55F}", 'CHARACTER_FIVE_O_CLOCK' => "\u{1F554}", 'CHARACTER_FIVE_THIRTY' => "\u{1F560}", 'CHARACTER_SIX_O_CLOCK' => "\u{1F555}", 'CHARACTER_SIX_THIRTY' => "\u{1F561}", 'CHARACTER_SEVEN_O_CLOCK' => "\u{1F556}", 'CHARACTER_SEVEN_THIRTY' => "\u{1F562}", 'CHARACTER_EIGHT_O_CLOCK' => "\u{1F557}", 'CHARACTER_EIGHT_THIRTY' => "\u{1F563}", 'CHARACTER_NINE_O_CLOCK' => "\u{1F558}", 'CHARACTER_NINE_THIRTY' => "\u{1F564}", 'CHARACTER_TEN_O_CLOCK' => "\u{1F559}", 'CHARACTER_TEN_THIRTY' => "\u{1F565}", 'CHARACTER_ELEVEN_O_CLOCK' => "\u{1F55A}", 'CHARACTER_ELEVEN_THIRTY' => "\u{1F566}", 'CHARACTER_NEW_MOON' => "\u{1F311}", 'CHARACTER_WAXING_CRESCENT_MOON' => "\u{1F312}", 'CHARACTER_FIRST_QUARTER_MOON' => "\u{1F313}", 'CHARACTER_WAXING_GIBBOUS_MOON' => "\u{1F314}", 'CHARACTER_FULL_MOON' => "\u{1F315}", 'CHARACTER_WANING_GIBBOUS_MOON' => "\u{1F316}", 'CHARACTER_LAST_QUARTER_MOON' => "\u{1F317}", 'CHARACTER_WANING_CRESCENT_MOON' => "\u{1F318}", 'CHARACTER_CRESCENT_MOON' => "\u{1F319}", 'CHARACTER_NEW_MOON_FACE' => "\u{1F31A}", 'CHARACTER_FIRST_QUARTER_MOON_FACE' => "\u{1F31B}", 'CHARACTER_LAST_QUARTER_MOON_FACE' => "\u{1F31C}", 'CHARACTER_THERMOMETER' => "\u{1F321}\u{FE0F}", 'CHARACTER_SUN' => "\u{2600}\u{FE0F}", 'CHARACTER_FULL_MOON_FACE' => "\u{1F31D}", 'CHARACTER_SUN_WITH_FACE' => "\u{1F31E}", 'CHARACTER_STAR' => "\u{2B50}", 'CHARACTER_GLOWING_STAR' => "\u{1F31F}", 'CHARACTER_SHOOTING_STAR' => "\u{1F320}", 'CHARACTER_CLOUD' => "\u{2601}\u{FE0F}", 'CHARACTER_SUN_BEHIND_CLOUD' => "\u{26C5}", 'CHARACTER_CLOUD_WITH_LIGHTNING_AND_RAIN' => "\u{26C8}\u{FE0F}", 'CHARACTER_SUN_BEHIND_SMALL_CLOUD' => "\u{1F324}\u{FE0F}", 'CHARACTER_SUN_BEHIND_LARGE_CLOUD' => "\u{1F325}\u{FE0F}", 'CHARACTER_SUN_BEHIND_RAIN_CLOUD' => "\u{1F326}\u{FE0F}", 'CHARACTER_CLOUD_WITH_RAIN' => "\u{1F327}\u{FE0F}", 'CHARACTER_CLOUD_WITH_SNOW' => "\u{1F328}\u{FE0F}", 'CHARACTER_CLOUD_WITH_LIGHTNING' => "\u{1F329}\u{FE0F}", 'CHARACTER_TORNADO' => "\u{1F32A}\u{FE0F}", 'CHARACTER_FOG' => "\u{1F32B}\u{FE0F}", 'CHARACTER_WIND_FACE' => "\u{1F32C}\u{FE0F}", 'CHARACTER_CYCLONE' => "\u{1F300}", 'CHARACTER_RAINBOW' => "\u{1F308}", 'CHARACTER_CLOSED_UMBRELLA' => "\u{1F302}", 'CHARACTER_UMBRELLA' => "\u{2602}\u{FE0F}", 'CHARACTER_UMBRELLA_WITH_RAIN_DROPS' => "\u{2614}", 'CHARACTER_UMBRELLA_ON_GROUND' => "\u{26F1}\u{FE0F}", 'CHARACTER_HIGH_VOLTAGE' => "\u{26A1}", 'CHARACTER_SNOWFLAKE' => "\u{2744}\u{FE0F}", 'CHARACTER_SNOWMAN' => "\u{2603}\u{FE0F}", 'CHARACTER_SNOWMAN_WITHOUT_SNOW' => "\u{26C4}", 'CHARACTER_COMET' => "\u{2604}\u{FE0F}", 'CHARACTER_FIRE' => "\u{1F525}", 'CHARACTER_DROPLET' => "\u{1F4A7}", 'CHARACTER_WATER_WAVE' => "\u{1F30A}", 'CHARACTER_JACK_O_LANTERN' => "\u{1F383}", 'CHARACTER_CHRISTMAS_TREE' => "\u{1F384}", 'CHARACTER_FIREWORKS' => "\u{1F386}", 'CHARACTER_SPARKLER' => "\u{1F387}", 'CHARACTER_FIRECRACKER' => "\u{1F9E8}", 'CHARACTER_SPARKLES' => "\u{2728}", 'CHARACTER_BALLOON' => "\u{1F388}", 'CHARACTER_PARTY_POPPER' => "\u{1F389}", 'CHARACTER_CONFETTI_BALL' => "\u{1F38A}", 'CHARACTER_TANABATA_TREE' => "\u{1F38B}", 'CHARACTER_PINE_DECORATION' => "\u{1F38D}", 'CHARACTER_JAPANESE_DOLLS' => "\u{1F38E}", 'CHARACTER_CARP_STREAMER' => "\u{1F38F}", 'CHARACTER_WIND_CHIME' => "\u{1F390}", 'CHARACTER_MOON_VIEWING_CEREMONY' => "\u{1F391}", 'CHARACTER_RED_ENVELOPE' => "\u{1F9E7}", 'CHARACTER_RIBBON' => "\u{1F380}", 'CHARACTER_WRAPPED_GIFT' => "\u{1F381}", 'CHARACTER_REMINDER_RIBBON' => "\u{1F397}\u{FE0F}", 'CHARACTER_ADMISSION_TICKETS' => "\u{1F39F}\u{FE0F}", 'CHARACTER_TICKET' => "\u{1F3AB}", 'CHARACTER_MILITARY_MEDAL' => "\u{1F396}\u{FE0F}", 'CHARACTER_TROPHY' => "\u{1F3C6}", 'CHARACTER_SPORTS_MEDAL' => "\u{1F3C5}", 'CHARACTER_1ST_PLACE_MEDAL' => "\u{1F947}", 'CHARACTER_2ND_PLACE_MEDAL' => "\u{1F948}", 'CHARACTER_3RD_PLACE_MEDAL' => "\u{1F949}", 'CHARACTER_SOCCER_BALL' => "\u{26BD}", 'CHARACTER_BASEBALL' => "\u{26BE}", 'CHARACTER_SOFTBALL' => "\u{1F94E}", 'CHARACTER_BASKETBALL' => "\u{1F3C0}", 'CHARACTER_VOLLEYBALL' => "\u{1F3D0}", 'CHARACTER_AMERICAN_FOOTBALL' => "\u{1F3C8}", 'CHARACTER_RUGBY_FOOTBALL' => "\u{1F3C9}", 'CHARACTER_TENNIS' => "\u{1F3BE}", 'CHARACTER_FLYING_DISC' => "\u{1F94F}", 'CHARACTER_BOWLING' => "\u{1F3B3}", 'CHARACTER_CRICKET_GAME' => "\u{1F3CF}", 'CHARACTER_FIELD_HOCKEY' => "\u{1F3D1}", 'CHARACTER_ICE_HOCKEY' => "\u{1F3D2}", 'CHARACTER_LACROSSE' => "\u{1F94D}", 'CHARACTER_PING_PONG' => "\u{1F3D3}", 'CHARACTER_BADMINTON' => "\u{1F3F8}", 'CHARACTER_BOXING_GLOVE' => "\u{1F94A}", 'CHARACTER_MARTIAL_ARTS_UNIFORM' => "\u{1F94B}", 'CHARACTER_GOAL_NET' => "\u{1F945}", 'CHARACTER_FLAG_IN_HOLE' => "\u{26F3}", 'CHARACTER_ICE_SKATE' => "\u{26F8}\u{FE0F}", 'CHARACTER_FISHING_POLE' => "\u{1F3A3}", 'CHARACTER_RUNNING_SHIRT' => "\u{1F3BD}", 'CHARACTER_SKIS' => "\u{1F3BF}", 'CHARACTER_SLED' => "\u{1F6F7}", 'CHARACTER_CURLING_STONE' => "\u{1F94C}", 'CHARACTER_DIRECT_HIT' => "\u{1F3AF}", 'CHARACTER_POOL_8_BALL' => "\u{1F3B1}", 'CHARACTER_CRYSTAL_BALL' => "\u{1F52E}", 'CHARACTER_NAZAR_AMULET' => "\u{1F9FF}", 'CHARACTER_VIDEO_GAME' => "\u{1F3AE}", 'CHARACTER_JOYSTICK' => "\u{1F579}\u{FE0F}", 'CHARACTER_SLOT_MACHINE' => "\u{1F3B0}", 'CHARACTER_GAME_DIE' => "\u{1F3B2}", 'CHARACTER_JIGSAW' => "\u{1F9E9}", 'CHARACTER_TEDDY_BEAR' => "\u{1F9F8}", 'CHARACTER_SPADE_SUIT' => "\u{2660}\u{FE0F}", 'CHARACTER_HEART_SUIT' => "\u{2665}\u{FE0F}", 'CHARACTER_DIAMOND_SUIT' => "\u{2666}\u{FE0F}", 'CHARACTER_CLUB_SUIT' => "\u{2663}\u{FE0F}", 'CHARACTER_CHESS_PAWN' => "\u{265F}\u{FE0F}", 'CHARACTER_JOKER' => "\u{1F0CF}", 'CHARACTER_MAHJONG_RED_DRAGON' => "\u{1F004}", 'CHARACTER_FLOWER_PLAYING_CARDS' => "\u{1F3B4}", 'CHARACTER_PERFORMING_ARTS' => "\u{1F3AD}", 'CHARACTER_FRAMED_PICTURE' => "\u{1F5BC}\u{FE0F}", 'CHARACTER_ARTIST_PALETTE' => "\u{1F3A8}", 'CHARACTER_THREAD' => "\u{1F9F5}", 'CHARACTER_YARN' => "\u{1F9F6}", 'CHARACTER_MUTED_SPEAKER' => "\u{1F507}", 'CHARACTER_SPEAKER_LOW_VOLUME' => "\u{1F508}", 'CHARACTER_SPEAKER_MEDIUM_VOLUME' => "\u{1F509}", 'CHARACTER_SPEAKER_HIGH_VOLUME' => "\u{1F50A}", 'CHARACTER_LOUDSPEAKER' => "\u{1F4E2}", 'CHARACTER_MEGAPHONE' => "\u{1F4E3}", 'CHARACTER_POSTAL_HORN' => "\u{1F4EF}", 'CHARACTER_BELL' => "\u{1F514}", 'CHARACTER_BELL_WITH_SLASH' => "\u{1F515}", 'CHARACTER_MUSICAL_SCORE' => "\u{1F3BC}", 'CHARACTER_MUSICAL_NOTE' => "\u{1F3B5}", 'CHARACTER_MUSICAL_NOTES' => "\u{1F3B6}", 'CHARACTER_STUDIO_MICROPHONE' => "\u{1F399}\u{FE0F}", 'CHARACTER_LEVEL_SLIDER' => "\u{1F39A}\u{FE0F}", 'CHARACTER_CONTROL_KNOBS' => "\u{1F39B}\u{FE0F}", 'CHARACTER_MICROPHONE' => "\u{1F3A4}", 'CHARACTER_HEADPHONE' => "\u{1F3A7}", 'CHARACTER_RADIO' => "\u{1F4FB}", 'CHARACTER_SAXOPHONE' => "\u{1F3B7}", 'CHARACTER_GUITAR' => "\u{1F3B8}", 'CHARACTER_MUSICAL_KEYBOARD' => "\u{1F3B9}", 'CHARACTER_TRUMPET' => "\u{1F3BA}", 'CHARACTER_VIOLIN' => "\u{1F3BB}", 'CHARACTER_DRUM' => "\u{1F941}", 'CHARACTER_MOBILE_PHONE' => "\u{1F4F1}", 'CHARACTER_MOBILE_PHONE_WITH_ARROW' => "\u{1F4F2}", 'CHARACTER_TELEPHONE' => "\u{260E}\u{FE0F}", 'CHARACTER_TELEPHONE_RECEIVER' => "\u{1F4DE}", 'CHARACTER_PAGER' => "\u{1F4DF}", 'CHARACTER_FAX_MACHINE' => "\u{1F4E0}", 'CHARACTER_BATTERY' => "\u{1F50B}", 'CHARACTER_ELECTRIC_PLUG' => "\u{1F50C}", 'CHARACTER_LAPTOP_COMPUTER' => "\u{1F4BB}", 'CHARACTER_DESKTOP_COMPUTER' => "\u{1F5A5}\u{FE0F}", 'CHARACTER_PRINTER' => "\u{1F5A8}\u{FE0F}", 'CHARACTER_KEYBOARD' => "\u{2328}\u{FE0F}", 'CHARACTER_COMPUTER_MOUSE' => "\u{1F5B1}\u{FE0F}", 'CHARACTER_TRACKBALL' => "\u{1F5B2}\u{FE0F}", 'CHARACTER_COMPUTER_DISK' => "\u{1F4BD}", 'CHARACTER_FLOPPY_DISK' => "\u{1F4BE}", 'CHARACTER_OPTICAL_DISK' => "\u{1F4BF}", 'CHARACTER_DVD' => "\u{1F4C0}", 'CHARACTER_ABACUS' => "\u{1F9EE}", 'CHARACTER_MOVIE_CAMERA' => "\u{1F3A5}", 'CHARACTER_FILM_FRAMES' => "\u{1F39E}\u{FE0F}", 'CHARACTER_FILM_PROJECTOR' => "\u{1F4FD}\u{FE0F}", 'CHARACTER_CLAPPER_BOARD' => "\u{1F3AC}", 'CHARACTER_TELEVISION' => "\u{1F4FA}", 'CHARACTER_CAMERA' => "\u{1F4F7}", 'CHARACTER_CAMERA_WITH_FLASH' => "\u{1F4F8}", 'CHARACTER_VIDEO_CAMERA' => "\u{1F4F9}", 'CHARACTER_VIDEOCASSETTE' => "\u{1F4FC}", 'CHARACTER_MAGNIFYING_GLASS_TILTED_LEFT' => "\u{1F50D}", 'CHARACTER_MAGNIFYING_GLASS_TILTED_RIGHT' => "\u{1F50E}", 'CHARACTER_CANDLE' => "\u{1F56F}\u{FE0F}", 'CHARACTER_LIGHT_BULB' => "\u{1F4A1}", 'CHARACTER_FLASHLIGHT' => "\u{1F526}", 'CHARACTER_RED_PAPER_LANTERN' => "\u{1F3EE}", 'CHARACTER_NOTEBOOK_WITH_DECORATIVE_COVER' => "\u{1F4D4}", 'CHARACTER_CLOSED_BOOK' => "\u{1F4D5}", 'CHARACTER_OPEN_BOOK' => "\u{1F4D6}", 'CHARACTER_GREEN_BOOK' => "\u{1F4D7}", 'CHARACTER_BLUE_BOOK' => "\u{1F4D8}", 'CHARACTER_ORANGE_BOOK' => "\u{1F4D9}", 'CHARACTER_BOOKS' => "\u{1F4DA}", 'CHARACTER_NOTEBOOK' => "\u{1F4D3}", 'CHARACTER_LEDGER' => "\u{1F4D2}", 'CHARACTER_PAGE_WITH_CURL' => "\u{1F4C3}", 'CHARACTER_SCROLL' => "\u{1F4DC}", 'CHARACTER_PAGE_FACING_UP' => "\u{1F4C4}", 'CHARACTER_NEWSPAPER' => "\u{1F4F0}", 'CHARACTER_ROLLED_UP_NEWSPAPER' => "\u{1F5DE}\u{FE0F}", 'CHARACTER_BOOKMARK_TABS' => "\u{1F4D1}", 'CHARACTER_BOOKMARK' => "\u{1F516}", 'CHARACTER_LABEL' => "\u{1F3F7}\u{FE0F}", 'CHARACTER_MONEY_BAG' => "\u{1F4B0}", 'CHARACTER_YEN_BANKNOTE' => "\u{1F4B4}", 'CHARACTER_DOLLAR_BANKNOTE' => "\u{1F4B5}", 'CHARACTER_EURO_BANKNOTE' => "\u{1F4B6}", 'CHARACTER_POUND_BANKNOTE' => "\u{1F4B7}", 'CHARACTER_MONEY_WITH_WINGS' => "\u{1F4B8}", 'CHARACTER_CREDIT_CARD' => "\u{1F4B3}", 'CHARACTER_RECEIPT' => "\u{1F9FE}", 'CHARACTER_CHART_INCREASING_WITH_YEN' => "\u{1F4B9}", 'CHARACTER_CURRENCY_EXCHANGE' => "\u{1F4B1}", 'CHARACTER_HEAVY_DOLLAR_SIGN' => "\u{1F4B2}", 'CHARACTER_ENVELOPE' => "\u{2709}\u{FE0F}", 'CHARACTER_E_MAIL' => "\u{1F4E7}", 'CHARACTER_INCOMING_ENVELOPE' => "\u{1F4E8}", 'CHARACTER_ENVELOPE_WITH_ARROW' => "\u{1F4E9}", 'CHARACTER_OUTBOX_TRAY' => "\u{1F4E4}", 'CHARACTER_INBOX_TRAY' => "\u{1F4E5}", 'CHARACTER_PACKAGE' => "\u{1F4E6}", 'CHARACTER_CLOSED_MAILBOX_WITH_RAISED_FLAG' => "\u{1F4EB}", 'CHARACTER_CLOSED_MAILBOX_WITH_LOWERED_FLAG' => "\u{1F4EA}", 'CHARACTER_OPEN_MAILBOX_WITH_RAISED_FLAG' => "\u{1F4EC}", 'CHARACTER_OPEN_MAILBOX_WITH_LOWERED_FLAG' => "\u{1F4ED}", 'CHARACTER_POSTBOX' => "\u{1F4EE}", 'CHARACTER_BALLOT_BOX_WITH_BALLOT' => "\u{1F5F3}\u{FE0F}", 'CHARACTER_PENCIL' => "\u{270F}\u{FE0F}", 'CHARACTER_BLACK_NIB' => "\u{2712}\u{FE0F}", 'CHARACTER_FOUNTAIN_PEN' => "\u{1F58B}\u{FE0F}", 'CHARACTER_PEN' => "\u{1F58A}\u{FE0F}", 'CHARACTER_PAINTBRUSH' => "\u{1F58C}\u{FE0F}", 'CHARACTER_CRAYON' => "\u{1F58D}\u{FE0F}", 'CHARACTER_MEMO' => "\u{1F4DD}", 'CHARACTER_BRIEFCASE' => "\u{1F4BC}", 'CHARACTER_FILE_FOLDER' => "\u{1F4C1}", 'CHARACTER_OPEN_FILE_FOLDER' => "\u{1F4C2}", 'CHARACTER_CARD_INDEX_DIVIDERS' => "\u{1F5C2}\u{FE0F}", 'CHARACTER_CALENDAR' => "\u{1F4C5}", 'CHARACTER_TEAR_OFF_CALENDAR' => "\u{1F4C6}", 'CHARACTER_SPIRAL_NOTEPAD' => "\u{1F5D2}\u{FE0F}", 'CHARACTER_SPIRAL_CALENDAR' => "\u{1F5D3}\u{FE0F}", 'CHARACTER_CARD_INDEX' => "\u{1F4C7}", 'CHARACTER_CHART_INCREASING' => "\u{1F4C8}", 'CHARACTER_CHART_DECREASING' => "\u{1F4C9}", 'CHARACTER_BAR_CHART' => "\u{1F4CA}", 'CHARACTER_CLIPBOARD' => "\u{1F4CB}", 'CHARACTER_PUSHPIN' => "\u{1F4CC}", 'CHARACTER_ROUND_PUSHPIN' => "\u{1F4CD}", 'CHARACTER_PAPERCLIP' => "\u{1F4CE}", 'CHARACTER_LINKED_PAPERCLIPS' => "\u{1F587}\u{FE0F}", 'CHARACTER_STRAIGHT_RULER' => "\u{1F4CF}", 'CHARACTER_TRIANGULAR_RULER' => "\u{1F4D0}", 'CHARACTER_SCISSORS' => "\u{2702}\u{FE0F}", 'CHARACTER_CARD_FILE_BOX' => "\u{1F5C3}\u{FE0F}", 'CHARACTER_FILE_CABINET' => "\u{1F5C4}\u{FE0F}", 'CHARACTER_WASTEBASKET' => "\u{1F5D1}\u{FE0F}", 'CHARACTER_LOCKED' => "\u{1F512}", 'CHARACTER_UNLOCKED' => "\u{1F513}", 'CHARACTER_LOCKED_WITH_PEN' => "\u{1F50F}", 'CHARACTER_LOCKED_WITH_KEY' => "\u{1F510}", 'CHARACTER_KEY' => "\u{1F511}", 'CHARACTER_OLD_KEY' => "\u{1F5DD}\u{FE0F}", 'CHARACTER_HAMMER' => "\u{1F528}", 'CHARACTER_PICK' => "\u{26CF}\u{FE0F}", 'CHARACTER_HAMMER_AND_PICK' => "\u{2692}\u{FE0F}", 'CHARACTER_HAMMER_AND_WRENCH' => "\u{1F6E0}\u{FE0F}", 'CHARACTER_DAGGER' => "\u{1F5E1}\u{FE0F}", 'CHARACTER_CROSSED_SWORDS' => "\u{2694}\u{FE0F}", 'CHARACTER_PISTOL' => "\u{1F52B}", 'CHARACTER_BOW_AND_ARROW' => "\u{1F3F9}", 'CHARACTER_SHIELD' => "\u{1F6E1}\u{FE0F}", 'CHARACTER_WRENCH' => "\u{1F527}", 'CHARACTER_NUT_AND_BOLT' => "\u{1F529}", 'CHARACTER_GEAR' => "\u{2699}\u{FE0F}", 'CHARACTER_CLAMP' => "\u{1F5DC}\u{FE0F}", 'CHARACTER_BALANCE_SCALE' => "\u{2696}\u{FE0F}", 'CHARACTER_LINK' => "\u{1F517}", 'CHARACTER_CHAINS' => "\u{26D3}\u{FE0F}", 'CHARACTER_TOOLBOX' => "\u{1F9F0}", 'CHARACTER_MAGNET' => "\u{1F9F2}", 'CHARACTER_ALEMBIC' => "\u{2697}\u{FE0F}", 'CHARACTER_TEST_TUBE' => "\u{1F9EA}", 'CHARACTER_PETRI_DISH' => "\u{1F9EB}", 'CHARACTER_DNA' => "\u{1F9EC}", 'CHARACTER_MICROSCOPE' => "\u{1F52C}", 'CHARACTER_TELESCOPE' => "\u{1F52D}", 'CHARACTER_SATELLITE_ANTENNA' => "\u{1F4E1}", 'CHARACTER_SYRINGE' => "\u{1F489}", 'CHARACTER_PILL' => "\u{1F48A}", 'CHARACTER_DOOR' => "\u{1F6AA}", 'CHARACTER_BED' => "\u{1F6CF}\u{FE0F}", 'CHARACTER_COUCH_AND_LAMP' => "\u{1F6CB}\u{FE0F}", 'CHARACTER_TOILET' => "\u{1F6BD}", 'CHARACTER_SHOWER' => "\u{1F6BF}", 'CHARACTER_BATHTUB' => "\u{1F6C1}", 'CHARACTER_LOTION_BOTTLE' => "\u{1F9F4}", 'CHARACTER_SAFETY_PIN' => "\u{1F9F7}", 'CHARACTER_BROOM' => "\u{1F9F9}", 'CHARACTER_BASKET' => "\u{1F9FA}", 'CHARACTER_ROLL_OF_PAPER' => "\u{1F9FB}", 'CHARACTER_SOAP' => "\u{1F9FC}", 'CHARACTER_SPONGE' => "\u{1F9FD}", 'CHARACTER_FIRE_EXTINGUISHER' => "\u{1F9EF}", 'CHARACTER_SHOPPING_CART' => "\u{1F6D2}", 'CHARACTER_CIGARETTE' => "\u{1F6AC}", 'CHARACTER_COFFIN' => "\u{26B0}\u{FE0F}", 'CHARACTER_FUNERAL_URN' => "\u{26B1}\u{FE0F}", 'CHARACTER_MOAI' => "\u{1F5FF}", 'CHARACTER_ATM_SIGN' => "\u{1F3E7}", 'CHARACTER_LITTER_IN_BIN_SIGN' => "\u{1F6AE}", 'CHARACTER_POTABLE_WATER' => "\u{1F6B0}", 'CHARACTER_WHEELCHAIR_SYMBOL' => "\u{267F}", 'CHARACTER_MEN_S_ROOM' => "\u{1F6B9}", 'CHARACTER_WOMEN_S_ROOM' => "\u{1F6BA}", 'CHARACTER_RESTROOM' => "\u{1F6BB}", 'CHARACTER_BABY_SYMBOL' => "\u{1F6BC}", 'CHARACTER_WATER_CLOSET' => "\u{1F6BE}", 'CHARACTER_PASSPORT_CONTROL' => "\u{1F6C2}", 'CHARACTER_CUSTOMS' => "\u{1F6C3}", 'CHARACTER_BAGGAGE_CLAIM' => "\u{1F6C4}", 'CHARACTER_LEFT_LUGGAGE' => "\u{1F6C5}", 'CHARACTER_WARNING' => "\u{26A0}\u{FE0F}", 'CHARACTER_CHILDREN_CROSSING' => "\u{1F6B8}", 'CHARACTER_NO_ENTRY' => "\u{26D4}", 'CHARACTER_PROHIBITED' => "\u{1F6AB}", 'CHARACTER_NO_BICYCLES' => "\u{1F6B3}", 'CHARACTER_NO_SMOKING' => "\u{1F6AD}", 'CHARACTER_NO_LITTERING' => "\u{1F6AF}", 'CHARACTER_NON_POTABLE_WATER' => "\u{1F6B1}", 'CHARACTER_NO_PEDESTRIANS' => "\u{1F6B7}", 'CHARACTER_NO_MOBILE_PHONES' => "\u{1F4F5}", 'CHARACTER_NO_ONE_UNDER_EIGHTEEN' => "\u{1F51E}", 'CHARACTER_RADIOACTIVE' => "\u{2622}\u{FE0F}", 'CHARACTER_BIOHAZARD' => "\u{2623}\u{FE0F}", 'CHARACTER_UP_ARROW' => "\u{2B06}\u{FE0F}", 'CHARACTER_UP_RIGHT_ARROW' => "\u{2197}\u{FE0F}", 'CHARACTER_RIGHT_ARROW' => "\u{27A1}\u{FE0F}", 'CHARACTER_DOWN_RIGHT_ARROW' => "\u{2198}\u{FE0F}", 'CHARACTER_DOWN_ARROW' => "\u{2B07}\u{FE0F}", 'CHARACTER_DOWN_LEFT_ARROW' => "\u{2199}\u{FE0F}", 'CHARACTER_LEFT_ARROW' => "\u{2B05}\u{FE0F}", 'CHARACTER_UP_LEFT_ARROW' => "\u{2196}\u{FE0F}", 'CHARACTER_UP_DOWN_ARROW' => "\u{2195}\u{FE0F}", 'CHARACTER_LEFT_RIGHT_ARROW' => "\u{2194}\u{FE0F}", 'CHARACTER_RIGHT_ARROW_CURVING_LEFT' => "\u{21A9}\u{FE0F}", 'CHARACTER_LEFT_ARROW_CURVING_RIGHT' => "\u{21AA}\u{FE0F}", 'CHARACTER_RIGHT_ARROW_CURVING_UP' => "\u{2934}\u{FE0F}", 'CHARACTER_RIGHT_ARROW_CURVING_DOWN' => "\u{2935}\u{FE0F}", 'CHARACTER_CLOCKWISE_VERTICAL_ARROWS' => "\u{1F503}", 'CHARACTER_COUNTERCLOCKWISE_ARROWS_BUTTON' => "\u{1F504}", 'CHARACTER_BACK_ARROW' => "\u{1F519}", 'CHARACTER_END_ARROW' => "\u{1F51A}", 'CHARACTER_ON_ARROW' => "\u{1F51B}", 'CHARACTER_SOON_ARROW' => "\u{1F51C}", 'CHARACTER_TOP_ARROW' => "\u{1F51D}", 'CHARACTER_PLACE_OF_WORSHIP' => "\u{1F6D0}", 'CHARACTER_ATOM_SYMBOL' => "\u{269B}\u{FE0F}", 'CHARACTER_OM' => "\u{1F549}\u{FE0F}", 'CHARACTER_STAR_OF_DAVID' => "\u{2721}\u{FE0F}", 'CHARACTER_WHEEL_OF_DHARMA' => "\u{2638}\u{FE0F}", 'CHARACTER_YIN_YANG' => "\u{262F}\u{FE0F}", 'CHARACTER_LATIN_CROSS' => "\u{271D}\u{FE0F}", 'CHARACTER_ORTHODOX_CROSS' => "\u{2626}\u{FE0F}", 'CHARACTER_STAR_AND_CRESCENT' => "\u{262A}\u{FE0F}", 'CHARACTER_PEACE_SYMBOL' => "\u{262E}\u{FE0F}", 'CHARACTER_MENORAH' => "\u{1F54E}", 'CHARACTER_DOTTED_SIX_POINTED_STAR' => "\u{1F52F}", 'CHARACTER_ARIES' => "\u{2648}", 'CHARACTER_TAURUS' => "\u{2649}", 'CHARACTER_GEMINI' => "\u{264A}", 'CHARACTER_CANCER' => "\u{264B}", 'CHARACTER_LEO' => "\u{264C}", 'CHARACTER_VIRGO' => "\u{264D}", 'CHARACTER_LIBRA' => "\u{264E}", 'CHARACTER_SCORPIO' => "\u{264F}", 'CHARACTER_SAGITTARIUS' => "\u{2650}", 'CHARACTER_CAPRICORN' => "\u{2651}", 'CHARACTER_AQUARIUS' => "\u{2652}", 'CHARACTER_PISCES' => "\u{2653}", 'CHARACTER_OPHIUCHUS' => "\u{26CE}", 'CHARACTER_SHUFFLE_TRACKS_BUTTON' => "\u{1F500}", 'CHARACTER_REPEAT_BUTTON' => "\u{1F501}", 'CHARACTER_REPEAT_SINGLE_BUTTON' => "\u{1F502}", 'CHARACTER_PLAY_BUTTON' => "\u{25B6}\u{FE0F}", 'CHARACTER_FAST_FORWARD_BUTTON' => "\u{23E9}", 'CHARACTER_NEXT_TRACK_BUTTON' => "\u{23ED}\u{FE0F}", 'CHARACTER_PLAY_OR_PAUSE_BUTTON' => "\u{23EF}\u{FE0F}", 'CHARACTER_REVERSE_BUTTON' => "\u{25C0}\u{FE0F}", 'CHARACTER_FAST_REVERSE_BUTTON' => "\u{23EA}", 'CHARACTER_LAST_TRACK_BUTTON' => "\u{23EE}\u{FE0F}", 'CHARACTER_UPWARDS_BUTTON' => "\u{1F53C}", 'CHARACTER_FAST_UP_BUTTON' => "\u{23EB}", 'CHARACTER_DOWNWARDS_BUTTON' => "\u{1F53D}", 'CHARACTER_FAST_DOWN_BUTTON' => "\u{23EC}", 'CHARACTER_PAUSE_BUTTON' => "\u{23F8}\u{FE0F}", 'CHARACTER_STOP_BUTTON' => "\u{23F9}\u{FE0F}", 'CHARACTER_RECORD_BUTTON' => "\u{23FA}\u{FE0F}", 'CHARACTER_EJECT_BUTTON' => "\u{23CF}\u{FE0F}", 'CHARACTER_CINEMA' => "\u{1F3A6}", 'CHARACTER_DIM_BUTTON' => "\u{1F505}", 'CHARACTER_BRIGHT_BUTTON' => "\u{1F506}", 'CHARACTER_ANTENNA_BARS' => "\u{1F4F6}", 'CHARACTER_VIBRATION_MODE' => "\u{1F4F3}", 'CHARACTER_MOBILE_PHONE_OFF' => "\u{1F4F4}", 'CHARACTER_FEMALE_SIGN' => "\u{2640}\u{FE0F}", 'CHARACTER_MALE_SIGN' => "\u{2642}\u{FE0F}", 'CHARACTER_MEDICAL_SYMBOL' => "\u{2695}\u{FE0F}", 'CHARACTER_INFINITY' => "\u{267E}\u{FE0F}", 'CHARACTER_RECYCLING_SYMBOL' => "\u{267B}\u{FE0F}", 'CHARACTER_FLEUR_DE_LIS' => "\u{269C}\u{FE0F}", 'CHARACTER_TRIDENT_EMBLEM' => "\u{1F531}", 'CHARACTER_NAME_BADGE' => "\u{1F4DB}", 'CHARACTER_JAPANESE_SYMBOL_FOR_BEGINNER' => "\u{1F530}", 'CHARACTER_HEAVY_LARGE_CIRCLE' => "\u{2B55}", 'CHARACTER_WHITE_HEAVY_CHECK_MARK' => "\u{2705}", 'CHARACTER_BALLOT_BOX_WITH_CHECK' => "\u{2611}\u{FE0F}", 'CHARACTER_HEAVY_CHECK_MARK' => "\u{2714}\u{FE0F}", 'CHARACTER_HEAVY_MULTIPLICATION_X' => "\u{2716}\u{FE0F}", 'CHARACTER_CROSS_MARK' => "\u{274C}", 'CHARACTER_CROSS_MARK_BUTTON' => "\u{274E}", 'CHARACTER_HEAVY_PLUS_SIGN' => "\u{2795}", 'CHARACTER_HEAVY_MINUS_SIGN' => "\u{2796}", 'CHARACTER_HEAVY_DIVISION_SIGN' => "\u{2797}", 'CHARACTER_CURLY_LOOP' => "\u{27B0}", 'CHARACTER_DOUBLE_CURLY_LOOP' => "\u{27BF}", 'CHARACTER_PART_ALTERNATION_MARK' => "\u{303D}\u{FE0F}", 'CHARACTER_EIGHT_SPOKED_ASTERISK' => "\u{2733}\u{FE0F}", 'CHARACTER_EIGHT_POINTED_STAR' => "\u{2734}\u{FE0F}", 'CHARACTER_SPARKLE' => "\u{2747}\u{FE0F}", 'CHARACTER_DOUBLE_EXCLAMATION_MARK' => "\u{203C}\u{FE0F}", 'CHARACTER_EXCLAMATION_QUESTION_MARK' => "\u{2049}\u{FE0F}", 'CHARACTER_QUESTION_MARK' => "\u{2753}", 'CHARACTER_WHITE_QUESTION_MARK' => "\u{2754}", 'CHARACTER_WHITE_EXCLAMATION_MARK' => "\u{2755}", 'CHARACTER_EXCLAMATION_MARK' => "\u{2757}", 'CHARACTER_WAVY_DASH' => "\u{3030}\u{FE0F}", 'CHARACTER_COPYRIGHT' => "\u{00A9}\u{FE0F}", 'CHARACTER_REGISTERED' => "\u{00AE}\u{FE0F}", 'CHARACTER_TRADE_MARK' => "\u{2122}\u{FE0F}", 'CHARACTER_KEYCAP_HASH' => "\u{0023}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_ASTERISK' => "\u{002A}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_0' => "\u{0030}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_1' => "\u{0031}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_2' => "\u{0032}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_3' => "\u{0033}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_4' => "\u{0034}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_5' => "\u{0035}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_6' => "\u{0036}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_7' => "\u{0037}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_8' => "\u{0038}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_9' => "\u{0039}\u{FE0F}\u{20E3}", 'CHARACTER_KEYCAP_10' => "\u{1F51F}", 'CHARACTER_HUNDRED_POINTS' => "\u{1F4AF}", 'CHARACTER_INPUT_LATIN_UPPERCASE' => "\u{1F520}", 'CHARACTER_INPUT_LATIN_LOWERCASE' => "\u{1F521}", 'CHARACTER_INPUT_NUMBERS' => "\u{1F522}", 'CHARACTER_INPUT_SYMBOLS' => "\u{1F523}", 'CHARACTER_INPUT_LATIN_LETTERS' => "\u{1F524}", 'CHARACTER_A_BUTTON_BLOOD_TYPE' => "\u{1F170}\u{FE0F}", 'CHARACTER_AB_BUTTON_BLOOD_TYPE' => "\u{1F18E}", 'CHARACTER_B_BUTTON_BLOOD_TYPE' => "\u{1F171}\u{FE0F}", 'CHARACTER_CL_BUTTON' => "\u{1F191}", 'CHARACTER_COOL_BUTTON' => "\u{1F192}", 'CHARACTER_FREE_BUTTON' => "\u{1F193}", 'CHARACTER_INFORMATION' => "\u{2139}\u{FE0F}", 'CHARACTER_ID_BUTTON' => "\u{1F194}", 'CHARACTER_CIRCLED_M' => "\u{24C2}\u{FE0F}", 'CHARACTER_NEW_BUTTON' => "\u{1F195}", 'CHARACTER_NG_BUTTON' => "\u{1F196}", 'CHARACTER_O_BUTTON_BLOOD_TYPE' => "\u{1F17E}\u{FE0F}", 'CHARACTER_OK_BUTTON' => "\u{1F197}", 'CHARACTER_P_BUTTON' => "\u{1F17F}\u{FE0F}", 'CHARACTER_SOS_BUTTON' => "\u{1F198}", 'CHARACTER_UP_BUTTON' => "\u{1F199}", 'CHARACTER_VS_BUTTON' => "\u{1F19A}", 'CHARACTER_JAPANESE_HERE_BUTTON' => "\u{1F201}", 'CHARACTER_JAPANESE_SERVICE_CHARGE_BUTTON' => "\u{1F202}\u{FE0F}", 'CHARACTER_JAPANESE_MONTHLY_AMOUNT_BUTTON' => "\u{1F237}\u{FE0F}", 'CHARACTER_JAPANESE_NOT_FREE_OF_CHARGE_BUTTON' => "\u{1F236}", 'CHARACTER_JAPANESE_RESERVED_BUTTON' => "\u{1F22F}", 'CHARACTER_JAPANESE_BARGAIN_BUTTON' => "\u{1F250}", 'CHARACTER_JAPANESE_DISCOUNT_BUTTON' => "\u{1F239}", 'CHARACTER_JAPANESE_FREE_OF_CHARGE_BUTTON' => "\u{1F21A}", 'CHARACTER_JAPANESE_PROHIBITED_BUTTON' => "\u{1F232}", 'CHARACTER_JAPANESE_ACCEPTABLE_BUTTON' => "\u{1F251}", 'CHARACTER_JAPANESE_APPLICATION_BUTTON' => "\u{1F238}", 'CHARACTER_JAPANESE_PASSING_GRADE_BUTTON' => "\u{1F234}", 'CHARACTER_JAPANESE_VACANCY_BUTTON' => "\u{1F233}", 'CHARACTER_JAPANESE_CONGRATULATIONS_BUTTON' => "\u{3297}\u{FE0F}", 'CHARACTER_JAPANESE_SECRET_BUTTON' => "\u{3299}\u{FE0F}", 'CHARACTER_JAPANESE_OPEN_FOR_BUSINESS_BUTTON' => "\u{1F23A}", 'CHARACTER_JAPANESE_NO_VACANCY_BUTTON' => "\u{1F235}", 'CHARACTER_BLACK_SMALL_SQUARE' => "\u{25AA}\u{FE0F}", 'CHARACTER_WHITE_SMALL_SQUARE' => "\u{25AB}\u{FE0F}", 'CHARACTER_WHITE_MEDIUM_SQUARE' => "\u{25FB}\u{FE0F}", 'CHARACTER_BLACK_MEDIUM_SQUARE' => "\u{25FC}\u{FE0F}", 'CHARACTER_WHITE_MEDIUM_SMALL_SQUARE' => "\u{25FD}", 'CHARACTER_BLACK_MEDIUM_SMALL_SQUARE' => "\u{25FE}", 'CHARACTER_BLACK_LARGE_SQUARE' => "\u{2B1B}", 'CHARACTER_WHITE_LARGE_SQUARE' => "\u{2B1C}", 'CHARACTER_LARGE_ORANGE_DIAMOND' => "\u{1F536}", 'CHARACTER_LARGE_BLUE_DIAMOND' => "\u{1F537}", 'CHARACTER_SMALL_ORANGE_DIAMOND' => "\u{1F538}", 'CHARACTER_SMALL_BLUE_DIAMOND' => "\u{1F539}", 'CHARACTER_RED_TRIANGLE_POINTED_UP' => "\u{1F53A}", 'CHARACTER_RED_TRIANGLE_POINTED_DOWN' => "\u{1F53B}", 'CHARACTER_DIAMOND_WITH_A_DOT' => "\u{1F4A0}", 'CHARACTER_RADIO_BUTTON' => "\u{1F518}", 'CHARACTER_BLACK_SQUARE_BUTTON' => "\u{1F532}", 'CHARACTER_WHITE_SQUARE_BUTTON' => "\u{1F533}", 'CHARACTER_WHITE_CIRCLE' => "\u{26AA}", 'CHARACTER_BLACK_CIRCLE' => "\u{26AB}", 'CHARACTER_RED_CIRCLE' => "\u{1F534}", 'CHARACTER_BLUE_CIRCLE' => "\u{1F535}", 'CHARACTER_CHEQUERED_FLAG' => "\u{1F3C1}", 'CHARACTER_TRIANGULAR_FLAG' => "\u{1F6A9}", 'CHARACTER_CROSSED_FLAGS' => "\u{1F38C}", 'CHARACTER_BLACK_FLAG' => "\u{1F3F4}", 'CHARACTER_WHITE_FLAG' => "\u{1F3F3}\u{FE0F}", 'CHARACTER_RAINBOW_FLAG' => "\u{1F3F3}\u{FE0F}\u{200D}\u{1F308}", 'CHARACTER_PIRATE_FLAG' => "\u{1F3F4}\u{200D}\u{2620}\u{FE0F}", 'CHARACTER_FLAGS_FOR_ASCENSION_ISLAND' => "\u{1F1E6}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_ANDORRA' => "\u{1F1E6}\u{1F1E9}", 'CHARACTER_FLAGS_FOR_UNITED_ARAB_EMIRATES' => "\u{1F1E6}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_AFGHANISTAN' => "\u{1F1E6}\u{1F1EB}", 'CHARACTER_FLAGS_FOR_ANTIGUA_AND_BARBUDA' => "\u{1F1E6}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_ANGUILLA' => "\u{1F1E6}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_ALBANIA' => "\u{1F1E6}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_ARMENIA' => "\u{1F1E6}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_ANGOLA' => "\u{1F1E6}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_ANTARCTICA' => "\u{1F1E6}\u{1F1F6}", 'CHARACTER_FLAGS_FOR_ARGENTINA' => "\u{1F1E6}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_AMERICAN_SAMOA' => "\u{1F1E6}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_AUSTRIA' => "\u{1F1E6}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_AUSTRALIA' => "\u{1F1E6}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_ARUBA' => "\u{1F1E6}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_ALAND_ISLANDS' => "\u{1F1E6}\u{1F1FD}", 'CHARACTER_FLAGS_FOR_AZERBAIJAN' => "\u{1F1E6}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_BOSNIA_AND_HERZEGOVINA' => "\u{1F1E7}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_BARBADOS' => "\u{1F1E7}\u{1F1E7}", 'CHARACTER_FLAGS_FOR_BANGLADESH' => "\u{1F1E7}\u{1F1E9}", 'CHARACTER_FLAGS_FOR_BELGIUM' => "\u{1F1E7}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_BURKINA_FASO' => "\u{1F1E7}\u{1F1EB}", 'CHARACTER_FLAGS_FOR_BULGARIA' => "\u{1F1E7}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_BAHRAIN' => "\u{1F1E7}\u{1F1ED}", 'CHARACTER_FLAGS_FOR_BURUNDI' => "\u{1F1E7}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_BENIN' => "\u{1F1E7}\u{1F1EF}", 'CHARACTER_FLAGS_FOR_ST_BARTHELEMY' => "\u{1F1E7}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_BERMUDA' => "\u{1F1E7}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_BRUNEI' => "\u{1F1E7}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_BOLIVIA' => "\u{1F1E7}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_CARIBBEAN_NETHERLANDS' => "\u{1F1E7}\u{1F1F6}", 'CHARACTER_FLAGS_FOR_BRAZIL' => "\u{1F1E7}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_BAHAMAS' => "\u{1F1E7}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_BHUTAN' => "\u{1F1E7}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_BOUVET_ISLAND' => "\u{1F1E7}\u{1F1FB}", 'CHARACTER_FLAGS_FOR_BOTSWANA' => "\u{1F1E7}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_BELARUS' => "\u{1F1E7}\u{1F1FE}", 'CHARACTER_FLAGS_FOR_BELIZE' => "\u{1F1E7}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_CANADA' => "\u{1F1E8}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_COCOS_KEELING_ISLANDS' => "\u{1F1E8}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_CONGO_KINSHASA' => "\u{1F1E8}\u{1F1E9}", 'CHARACTER_FLAGS_FOR_CENTRAL_AFRICAN_REPUBLIC' => "\u{1F1E8}\u{1F1EB}", 'CHARACTER_FLAGS_FOR_CONGO_BRAZZAVILLE' => "\u{1F1E8}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_SWITZERLAND' => "\u{1F1E8}\u{1F1ED}", 'CHARACTER_FLAGS_FOR_COTE_D_IVOIRE' => "\u{1F1E8}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_COOK_ISLANDS' => "\u{1F1E8}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_CHILE' => "\u{1F1E8}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_CAMEROON' => "\u{1F1E8}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_CHINA' => "\u{1F1E8}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_COLOMBIA' => "\u{1F1E8}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_CLIPPERTON_ISLAND' => "\u{1F1E8}\u{1F1F5}", 'CHARACTER_FLAGS_FOR_COSTA_RICA' => "\u{1F1E8}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_CUBA' => "\u{1F1E8}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_CAPE_VERDE' => "\u{1F1E8}\u{1F1FB}", 'CHARACTER_FLAGS_FOR_CURACAO' => "\u{1F1E8}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_CHRISTMAS_ISLAND' => "\u{1F1E8}\u{1F1FD}", 'CHARACTER_FLAGS_FOR_CYPRUS' => "\u{1F1E8}\u{1F1FE}", 'CHARACTER_FLAGS_FOR_CZECHIA' => "\u{1F1E8}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_GERMANY' => "\u{1F1E9}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_DIEGO_GARCIA' => "\u{1F1E9}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_DJIBOUTI' => "\u{1F1E9}\u{1F1EF}", 'CHARACTER_FLAGS_FOR_DENMARK' => "\u{1F1E9}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_DOMINICA' => "\u{1F1E9}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_DOMINICAN_REPUBLIC' => "\u{1F1E9}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_ALGERIA' => "\u{1F1E9}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_CEUTA_AND_MELILLA' => "\u{1F1EA}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_ECUADOR' => "\u{1F1EA}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_ESTONIA' => "\u{1F1EA}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_EGYPT' => "\u{1F1EA}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_WESTERN_SAHARA' => "\u{1F1EA}\u{1F1ED}", 'CHARACTER_FLAGS_FOR_ERITREA' => "\u{1F1EA}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_SPAIN' => "\u{1F1EA}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_ETHIOPIA' => "\u{1F1EA}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_EUROPEAN_UNION' => "\u{1F1EA}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_FINLAND' => "\u{1F1EB}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_FIJI' => "\u{1F1EB}\u{1F1EF}", 'CHARACTER_FLAGS_FOR_FALKLAND_ISLANDS' => "\u{1F1EB}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_MICRONESIA' => "\u{1F1EB}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_FAROE_ISLANDS' => "\u{1F1EB}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_FRANCE' => "\u{1F1EB}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_GABON' => "\u{1F1EC}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_UNITED_KINGDOM' => "\u{1F1EC}\u{1F1E7}", 'CHARACTER_FLAGS_FOR_GRENADA' => "\u{1F1EC}\u{1F1E9}", 'CHARACTER_FLAGS_FOR_GEORGIA' => "\u{1F1EC}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_FRENCH_GUIANA' => "\u{1F1EC}\u{1F1EB}", 'CHARACTER_FLAGS_FOR_GUERNSEY' => "\u{1F1EC}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_GHANA' => "\u{1F1EC}\u{1F1ED}", 'CHARACTER_FLAGS_FOR_GIBRALTAR' => "\u{1F1EC}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_GREENLAND' => "\u{1F1EC}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_GAMBIA' => "\u{1F1EC}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_GUINEA' => "\u{1F1EC}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_GUADELOUPE' => "\u{1F1EC}\u{1F1F5}", 'CHARACTER_FLAGS_FOR_EQUATORIAL_GUINEA' => "\u{1F1EC}\u{1F1F6}", 'CHARACTER_FLAGS_FOR_GREECE' => "\u{1F1EC}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_SOUTH_GEORGIA_AND_SOUTH_SANDWICH_ISLANDS' => "\u{1F1EC}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_GUATEMALA' => "\u{1F1EC}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_GUAM' => "\u{1F1EC}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_GUINEA_BISSAU' => "\u{1F1EC}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_GUYANA' => "\u{1F1EC}\u{1F1FE}", 'CHARACTER_FLAGS_FOR_HONG_KONG_SAR_CHINA' => "\u{1F1ED}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_HEARD_AND_MCDONALD_ISLANDS' => "\u{1F1ED}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_HONDURAS' => "\u{1F1ED}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_CROATIA' => "\u{1F1ED}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_HAITI' => "\u{1F1ED}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_HUNGARY' => "\u{1F1ED}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_CANARY_ISLANDS' => "\u{1F1EE}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_INDONESIA' => "\u{1F1EE}\u{1F1E9}", 'CHARACTER_FLAGS_FOR_IRELAND' => "\u{1F1EE}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_ISRAEL' => "\u{1F1EE}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_ISLE_OF_MAN' => "\u{1F1EE}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_INDIA' => "\u{1F1EE}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_BRITISH_INDIAN_OCEAN_TERRITORY' => "\u{1F1EE}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_IRAQ' => "\u{1F1EE}\u{1F1F6}", 'CHARACTER_FLAGS_FOR_IRAN' => "\u{1F1EE}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_ICELAND' => "\u{1F1EE}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_ITALY' => "\u{1F1EE}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_JERSEY' => "\u{1F1EF}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_JAMAICA' => "\u{1F1EF}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_JORDAN' => "\u{1F1EF}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_JAPAN' => "\u{1F1EF}\u{1F1F5}", 'CHARACTER_FLAGS_FOR_KENYA' => "\u{1F1F0}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_KYRGYZSTAN' => "\u{1F1F0}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_CAMBODIA' => "\u{1F1F0}\u{1F1ED}", 'CHARACTER_FLAGS_FOR_KIRIBATI' => "\u{1F1F0}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_COMOROS' => "\u{1F1F0}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_ST_KITTS_AND_NEVIS' => "\u{1F1F0}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_NORTH_KOREA' => "\u{1F1F0}\u{1F1F5}", 'CHARACTER_FLAGS_FOR_SOUTH_KOREA' => "\u{1F1F0}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_KUWAIT' => "\u{1F1F0}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_CAYMAN_ISLANDS' => "\u{1F1F0}\u{1F1FE}", 'CHARACTER_FLAGS_FOR_KAZAKHSTAN' => "\u{1F1F0}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_LAOS' => "\u{1F1F1}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_LEBANON' => "\u{1F1F1}\u{1F1E7}", 'CHARACTER_FLAGS_FOR_ST_LUCIA' => "\u{1F1F1}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_LIECHTENSTEIN' => "\u{1F1F1}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_SRI_LANKA' => "\u{1F1F1}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_LIBERIA' => "\u{1F1F1}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_LESOTHO' => "\u{1F1F1}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_LITHUANIA' => "\u{1F1F1}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_LUXEMBOURG' => "\u{1F1F1}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_LATVIA' => "\u{1F1F1}\u{1F1FB}", 'CHARACTER_FLAGS_FOR_LIBYA' => "\u{1F1F1}\u{1F1FE}", 'CHARACTER_FLAGS_FOR_MOROCCO' => "\u{1F1F2}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_MONACO' => "\u{1F1F2}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_MOLDOVA' => "\u{1F1F2}\u{1F1E9}", 'CHARACTER_FLAGS_FOR_MONTENEGRO' => "\u{1F1F2}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_ST_MARTIN' => "\u{1F1F2}\u{1F1EB}", 'CHARACTER_FLAGS_FOR_MADAGASCAR' => "\u{1F1F2}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_MARSHALL_ISLANDS' => "\u{1F1F2}\u{1F1ED}", 'CHARACTER_FLAGS_FOR_MACEDONIA' => "\u{1F1F2}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_MALI' => "\u{1F1F2}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_MYANMAR_BURMA' => "\u{1F1F2}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_MONGOLIA' => "\u{1F1F2}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_MACAU_SAR_CHINA' => "\u{1F1F2}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_NORTHERN_MARIANA_ISLANDS' => "\u{1F1F2}\u{1F1F5}", 'CHARACTER_FLAGS_FOR_MARTINIQUE' => "\u{1F1F2}\u{1F1F6}", 'CHARACTER_FLAGS_FOR_MAURITANIA' => "\u{1F1F2}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_MONTSERRAT' => "\u{1F1F2}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_MALTA' => "\u{1F1F2}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_MAURITIUS' => "\u{1F1F2}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_MALDIVES' => "\u{1F1F2}\u{1F1FB}", 'CHARACTER_FLAGS_FOR_MALAWI' => "\u{1F1F2}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_MEXICO' => "\u{1F1F2}\u{1F1FD}", 'CHARACTER_FLAGS_FOR_MALAYSIA' => "\u{1F1F2}\u{1F1FE}", 'CHARACTER_FLAGS_FOR_MOZAMBIQUE' => "\u{1F1F2}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_NAMIBIA' => "\u{1F1F3}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_NEW_CALEDONIA' => "\u{1F1F3}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_NIGER' => "\u{1F1F3}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_NORFOLK_ISLAND' => "\u{1F1F3}\u{1F1EB}", 'CHARACTER_FLAGS_FOR_NIGERIA' => "\u{1F1F3}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_NICARAGUA' => "\u{1F1F3}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_NETHERLANDS' => "\u{1F1F3}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_NORWAY' => "\u{1F1F3}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_NEPAL' => "\u{1F1F3}\u{1F1F5}", 'CHARACTER_FLAGS_FOR_NAURU' => "\u{1F1F3}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_NIUE' => "\u{1F1F3}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_NEW_ZEALAND' => "\u{1F1F3}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_OMAN' => "\u{1F1F4}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_PANAMA' => "\u{1F1F5}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_PERU' => "\u{1F1F5}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_FRENCH_POLYNESIA' => "\u{1F1F5}\u{1F1EB}", 'CHARACTER_FLAGS_FOR_PAPUA_NEW_GUINEA' => "\u{1F1F5}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_PHILIPPINES' => "\u{1F1F5}\u{1F1ED}", 'CHARACTER_FLAGS_FOR_PAKISTAN' => "\u{1F1F5}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_POLAND' => "\u{1F1F5}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_ST_PIERRE_AND_MIQUELON' => "\u{1F1F5}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_PITCAIRN_ISLANDS' => "\u{1F1F5}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_PUERTO_RICO' => "\u{1F1F5}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_PALESTINIAN_TERRITORIES' => "\u{1F1F5}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_PORTUGAL' => "\u{1F1F5}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_PALAU' => "\u{1F1F5}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_PARAGUAY' => "\u{1F1F5}\u{1F1FE}", 'CHARACTER_FLAGS_FOR_QATAR' => "\u{1F1F6}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_REUNION' => "\u{1F1F7}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_ROMANIA' => "\u{1F1F7}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_SERBIA' => "\u{1F1F7}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_RUSSIA' => "\u{1F1F7}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_RWANDA' => "\u{1F1F7}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_SAUDI_ARABIA' => "\u{1F1F8}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_SOLOMON_ISLANDS' => "\u{1F1F8}\u{1F1E7}", 'CHARACTER_FLAGS_FOR_SEYCHELLES' => "\u{1F1F8}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_SUDAN' => "\u{1F1F8}\u{1F1E9}", 'CHARACTER_FLAGS_FOR_SWEDEN' => "\u{1F1F8}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_SINGAPORE' => "\u{1F1F8}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_ST_HELENA' => "\u{1F1F8}\u{1F1ED}", 'CHARACTER_FLAGS_FOR_SLOVENIA' => "\u{1F1F8}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_SVALBARD_AND_JAN_MAYEN' => "\u{1F1F8}\u{1F1EF}", 'CHARACTER_FLAGS_FOR_SLOVAKIA' => "\u{1F1F8}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_SIERRA_LEONE' => "\u{1F1F8}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_SAN_MARINO' => "\u{1F1F8}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_SENEGAL' => "\u{1F1F8}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_SOMALIA' => "\u{1F1F8}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_SURINAME' => "\u{1F1F8}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_SOUTH_SUDAN' => "\u{1F1F8}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_SAO_TOME_AND_PRINCIPE' => "\u{1F1F8}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_EL_SALVADOR' => "\u{1F1F8}\u{1F1FB}", 'CHARACTER_FLAGS_FOR_SINT_MAARTEN' => "\u{1F1F8}\u{1F1FD}", 'CHARACTER_FLAGS_FOR_SYRIA' => "\u{1F1F8}\u{1F1FE}", 'CHARACTER_FLAGS_FOR_SWAZILAND' => "\u{1F1F8}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_TRISTAN_DA_CUNHA' => "\u{1F1F9}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_TURKS_AND_CAICOS_ISLANDS' => "\u{1F1F9}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_CHAD' => "\u{1F1F9}\u{1F1E9}", 'CHARACTER_FLAGS_FOR_FRENCH_SOUTHERN_TERRITORIES' => "\u{1F1F9}\u{1F1EB}", 'CHARACTER_FLAGS_FOR_TOGO' => "\u{1F1F9}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_THAILAND' => "\u{1F1F9}\u{1F1ED}", 'CHARACTER_FLAGS_FOR_TAJIKISTAN' => "\u{1F1F9}\u{1F1EF}", 'CHARACTER_FLAGS_FOR_TOKELAU' => "\u{1F1F9}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_TIMOR_LESTE' => "\u{1F1F9}\u{1F1F1}", 'CHARACTER_FLAGS_FOR_TURKMENISTAN' => "\u{1F1F9}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_TUNISIA' => "\u{1F1F9}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_TONGA' => "\u{1F1F9}\u{1F1F4}", 'CHARACTER_FLAGS_FOR_TURKEY' => "\u{1F1F9}\u{1F1F7}", 'CHARACTER_FLAGS_FOR_TRINIDAD_AND_TOBAGO' => "\u{1F1F9}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_TUVALU' => "\u{1F1F9}\u{1F1FB}", 'CHARACTER_FLAGS_FOR_TAIWAN' => "\u{1F1F9}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_TANZANIA' => "\u{1F1F9}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_UKRAINE' => "\u{1F1FA}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_UGANDA' => "\u{1F1FA}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_US_OUTLYING_ISLANDS' => "\u{1F1FA}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_UNITED_NATIONS' => "\u{1F1FA}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_UNITED_STATES' => "\u{1F1FA}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_URUGUAY' => "\u{1F1FA}\u{1F1FE}", 'CHARACTER_FLAGS_FOR_UZBEKISTAN' => "\u{1F1FA}\u{1F1FF}", 'CHARACTER_FLAGS_FOR_VATICAN_CITY' => "\u{1F1FB}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_ST_VINCENT_AND_GRENADINES' => "\u{1F1FB}\u{1F1E8}", 'CHARACTER_FLAGS_FOR_VENEZUELA' => "\u{1F1FB}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_BRITISH_VIRGIN_ISLANDS' => "\u{1F1FB}\u{1F1EC}", 'CHARACTER_FLAGS_FOR_US_VIRGIN_ISLANDS' => "\u{1F1FB}\u{1F1EE}", 'CHARACTER_FLAGS_FOR_VIETNAM' => "\u{1F1FB}\u{1F1F3}", 'CHARACTER_FLAGS_FOR_VANUATU' => "\u{1F1FB}\u{1F1FA}", 'CHARACTER_FLAGS_FOR_WALLIS_AND_FUTUNA' => "\u{1F1FC}\u{1F1EB}", 'CHARACTER_FLAGS_FOR_SAMOA' => "\u{1F1FC}\u{1F1F8}", 'CHARACTER_FLAGS_FOR_KOSOVO' => "\u{1F1FD}\u{1F1F0}", 'CHARACTER_FLAGS_FOR_YEMEN' => "\u{1F1FE}\u{1F1EA}", 'CHARACTER_FLAGS_FOR_MAYOTTE' => "\u{1F1FE}\u{1F1F9}", 'CHARACTER_FLAGS_FOR_SOUTH_AFRICA' => "\u{1F1FF}\u{1F1E6}", 'CHARACTER_FLAGS_FOR_ZAMBIA' => "\u{1F1FF}\u{1F1F2}", 'CHARACTER_FLAGS_FOR_ZIMBABWE' => "\u{1F1FF}\u{1F1FC}", 'CHARACTER_FLAGS_FOR_ENGLAND' => "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}", 'CHARACTER_FLAGS_FOR_SCOTLAND' => "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}", 'CHARACTER_FLAGS_FOR_WALES' => "\u{1F3F4}\u{E0067}\u{E0062}\u{E0077}\u{E006C}\u{E0073}\u{E007F}"]; diff --git a/application/vendor/voku/portable-utf8/src/voku/helper/data/encodings.php b/application/vendor/voku/portable-utf8/src/voku/helper/data/encodings.php index 8fb8ccd..87d9070 100644 --- a/application/vendor/voku/portable-utf8/src/voku/helper/data/encodings.php +++ b/application/vendor/voku/portable-utf8/src/voku/helper/data/encodings.php @@ -1,430 +1 @@ - 0, - "\x00" => 0, - "\x01" => 1, - "\x02" => 2, - "\x03" => 3, - "\x04" => 4, - "\x05" => 5, - "\x06" => 6, - "\x07" => 7, - "\x08" => 8, - "\x09" => 9, - "\x0A" => 10, - "\x0B" => 11, - "\x0C" => 12, - "\x0D" => 13, - "\x0E" => 14, - "\x0F" => 15, - "\x10" => 16, - "\x11" => 17, - "\x12" => 18, - "\x13" => 19, - "\x14" => 20, - "\x15" => 21, - "\x16" => 22, - "\x17" => 23, - "\x18" => 24, - "\x19" => 25, - "\x1A" => 26, - "\x1B" => 27, - "\x1C" => 28, - "\x1D" => 29, - "\x1E" => 30, - "\x1F" => 31, - "\x20" => 32, - "\x21" => 33, - "\x22" => 34, - "\x23" => 35, - "\x24" => 36, - "\x25" => 37, - "\x26" => 38, - "\x27" => 39, - "\x28" => 40, - "\x29" => 41, - "\x2A" => 42, - "\x2B" => 43, - "\x2C" => 44, - "\x2D" => 45, - "\x2E" => 46, - "\x2F" => 47, - "\x30" => 48, - "\x31" => 49, - "\x32" => 50, - "\x33" => 51, - "\x34" => 52, - "\x35" => 53, - "\x36" => 54, - "\x37" => 55, - "\x38" => 56, - "\x39" => 57, - "\x3A" => 58, - "\x3B" => 59, - "\x3C" => 60, - "\x3D" => 61, - "\x3E" => 62, - "\x3F" => 63, - "\x40" => 64, - "\x41" => 65, - "\x42" => 66, - "\x43" => 67, - "\x44" => 68, - "\x45" => 69, - "\x46" => 70, - "\x47" => 71, - "\x48" => 72, - "\x49" => 73, - "\x4A" => 74, - "\x4B" => 75, - "\x4C" => 76, - "\x4D" => 77, - "\x4E" => 78, - "\x4F" => 79, - "\x50" => 80, - "\x51" => 81, - "\x52" => 82, - "\x53" => 83, - "\x54" => 84, - "\x55" => 85, - "\x56" => 86, - "\x57" => 87, - "\x58" => 88, - "\x59" => 89, - "\x5A" => 90, - "\x5B" => 91, - "\x5C" => 92, - "\x5D" => 93, - "\x5E" => 94, - "\x5F" => 95, - "\x60" => 96, - "\x61" => 97, - "\x62" => 98, - "\x63" => 99, - "\x64" => 100, - "\x65" => 101, - "\x66" => 102, - "\x67" => 103, - "\x68" => 104, - "\x69" => 105, - "\x6A" => 106, - "\x6B" => 107, - "\x6C" => 108, - "\x6D" => 109, - "\x6E" => 110, - "\x6F" => 111, - "\x70" => 112, - "\x71" => 113, - "\x72" => 114, - "\x73" => 115, - "\x74" => 116, - "\x75" => 117, - "\x76" => 118, - "\x77" => 119, - "\x78" => 120, - "\x79" => 121, - "\x7A" => 122, - "\x7B" => 123, - "\x7C" => 124, - "\x7D" => 125, - "\x7E" => 126, - "\x7F" => 127, - "\x80" => 128, - "\x81" => 129, - "\x82" => 130, - "\x83" => 131, - "\x84" => 132, - "\x85" => 133, - "\x86" => 134, - "\x87" => 135, - "\x88" => 136, - "\x89" => 137, - "\x8A" => 138, - "\x8B" => 139, - "\x8C" => 140, - "\x8D" => 141, - "\x8E" => 142, - "\x8F" => 143, - "\x90" => 144, - "\x91" => 145, - "\x92" => 146, - "\x93" => 147, - "\x94" => 148, - "\x95" => 149, - "\x96" => 150, - "\x97" => 151, - "\x98" => 152, - "\x99" => 153, - "\x9A" => 154, - "\x9B" => 155, - "\x9C" => 156, - "\x9D" => 157, - "\x9E" => 158, - "\x9F" => 159, - "\xA0" => 160, - "\xA1" => 161, - "\xA2" => 162, - "\xA3" => 163, - "\xA4" => 164, - "\xA5" => 165, - "\xA6" => 166, - "\xA7" => 167, - "\xA8" => 168, - "\xA9" => 169, - "\xAA" => 170, - "\xAB" => 171, - "\xAC" => 172, - "\xAD" => 173, - "\xAE" => 174, - "\xAF" => 175, - "\xB0" => 176, - "\xB1" => 177, - "\xB2" => 178, - "\xB3" => 179, - "\xB4" => 180, - "\xB5" => 181, - "\xB6" => 182, - "\xB7" => 183, - "\xB8" => 184, - "\xB9" => 185, - "\xBA" => 186, - "\xBB" => 187, - "\xBC" => 188, - "\xBD" => 189, - "\xBE" => 190, - "\xBF" => 191, - "\xC0" => 192, - "\xC1" => 193, - "\xC2" => 194, - "\xC3" => 195, - "\xC4" => 196, - "\xC5" => 197, - "\xC6" => 198, - "\xC7" => 199, - "\xC8" => 200, - "\xC9" => 201, - "\xCA" => 202, - "\xCB" => 203, - "\xCC" => 204, - "\xCD" => 205, - "\xCE" => 206, - "\xCF" => 207, - "\xD0" => 208, - "\xD1" => 209, - "\xD2" => 210, - "\xD3" => 211, - "\xD4" => 212, - "\xD5" => 213, - "\xD6" => 214, - "\xD7" => 215, - "\xD8" => 216, - "\xD9" => 217, - "\xDA" => 218, - "\xDB" => 219, - "\xDC" => 220, - "\xDD" => 221, - "\xDE" => 222, - "\xDF" => 223, - "\xE0" => 224, - "\xE1" => 225, - "\xE2" => 226, - "\xE3" => 227, - "\xE4" => 228, - "\xE5" => 229, - "\xE6" => 230, - "\xE7" => 231, - "\xE8" => 232, - "\xE9" => 233, - "\xEA" => 234, - "\xEB" => 235, - "\xEC" => 236, - "\xED" => 237, - "\xEE" => 238, - "\xEF" => 239, - "\xF0" => 240, - "\xF1" => 241, - "\xF2" => 242, - "\xF3" => 243, - "\xF4" => 244, - "\xF5" => 245, - "\xF6" => 246, - "\xF7" => 247, - "\xF8" => 248, - "\xF9" => 249, - "\xFA" => 250, - "\xFB" => 251, - "\xFC" => 252, - "\xFD" => 253, - "\xFE" => 254, - "\xFF" => 255, -]; + 0, "\x00" => 0, "\x01" => 1, "\x02" => 2, "\x03" => 3, "\x04" => 4, "\x05" => 5, "\x06" => 6, "\x07" => 7, "\x08" => 8, "\x09" => 9, "\x0A" => 10, "\x0B" => 11, "\x0C" => 12, "\x0D" => 13, "\x0E" => 14, "\x0F" => 15, "\x10" => 16, "\x11" => 17, "\x12" => 18, "\x13" => 19, "\x14" => 20, "\x15" => 21, "\x16" => 22, "\x17" => 23, "\x18" => 24, "\x19" => 25, "\x1A" => 26, "\x1B" => 27, "\x1C" => 28, "\x1D" => 29, "\x1E" => 30, "\x1F" => 31, "\x20" => 32, "\x21" => 33, "\x22" => 34, "\x23" => 35, "\x24" => 36, "\x25" => 37, "\x26" => 38, "\x27" => 39, "\x28" => 40, "\x29" => 41, "\x2A" => 42, "\x2B" => 43, "\x2C" => 44, "\x2D" => 45, "\x2E" => 46, "\x2F" => 47, "\x30" => 48, "\x31" => 49, "\x32" => 50, "\x33" => 51, "\x34" => 52, "\x35" => 53, "\x36" => 54, "\x37" => 55, "\x38" => 56, "\x39" => 57, "\x3A" => 58, "\x3B" => 59, "\x3C" => 60, "\x3D" => 61, "\x3E" => 62, "\x3F" => 63, "\x40" => 64, "\x41" => 65, "\x42" => 66, "\x43" => 67, "\x44" => 68, "\x45" => 69, "\x46" => 70, "\x47" => 71, "\x48" => 72, "\x49" => 73, "\x4A" => 74, "\x4B" => 75, "\x4C" => 76, "\x4D" => 77, "\x4E" => 78, "\x4F" => 79, "\x50" => 80, "\x51" => 81, "\x52" => 82, "\x53" => 83, "\x54" => 84, "\x55" => 85, "\x56" => 86, "\x57" => 87, "\x58" => 88, "\x59" => 89, "\x5A" => 90, "\x5B" => 91, "\x5C" => 92, "\x5D" => 93, "\x5E" => 94, "\x5F" => 95, "\x60" => 96, "\x61" => 97, "\x62" => 98, "\x63" => 99, "\x64" => 100, "\x65" => 101, "\x66" => 102, "\x67" => 103, "\x68" => 104, "\x69" => 105, "\x6A" => 106, "\x6B" => 107, "\x6C" => 108, "\x6D" => 109, "\x6E" => 110, "\x6F" => 111, "\x70" => 112, "\x71" => 113, "\x72" => 114, "\x73" => 115, "\x74" => 116, "\x75" => 117, "\x76" => 118, "\x77" => 119, "\x78" => 120, "\x79" => 121, "\x7A" => 122, "\x7B" => 123, "\x7C" => 124, "\x7D" => 125, "\x7E" => 126, "\x7F" => 127, "\x80" => 128, "\x81" => 129, "\x82" => 130, "\x83" => 131, "\x84" => 132, "\x85" => 133, "\x86" => 134, "\x87" => 135, "\x88" => 136, "\x89" => 137, "\x8A" => 138, "\x8B" => 139, "\x8C" => 140, "\x8D" => 141, "\x8E" => 142, "\x8F" => 143, "\x90" => 144, "\x91" => 145, "\x92" => 146, "\x93" => 147, "\x94" => 148, "\x95" => 149, "\x96" => 150, "\x97" => 151, "\x98" => 152, "\x99" => 153, "\x9A" => 154, "\x9B" => 155, "\x9C" => 156, "\x9D" => 157, "\x9E" => 158, "\x9F" => 159, "\xA0" => 160, "\xA1" => 161, "\xA2" => 162, "\xA3" => 163, "\xA4" => 164, "\xA5" => 165, "\xA6" => 166, "\xA7" => 167, "\xA8" => 168, "\xA9" => 169, "\xAA" => 170, "\xAB" => 171, "\xAC" => 172, "\xAD" => 173, "\xAE" => 174, "\xAF" => 175, "\xB0" => 176, "\xB1" => 177, "\xB2" => 178, "\xB3" => 179, "\xB4" => 180, "\xB5" => 181, "\xB6" => 182, "\xB7" => 183, "\xB8" => 184, "\xB9" => 185, "\xBA" => 186, "\xBB" => 187, "\xBC" => 188, "\xBD" => 189, "\xBE" => 190, "\xBF" => 191, "\xC0" => 192, "\xC1" => 193, "\xC2" => 194, "\xC3" => 195, "\xC4" => 196, "\xC5" => 197, "\xC6" => 198, "\xC7" => 199, "\xC8" => 200, "\xC9" => 201, "\xCA" => 202, "\xCB" => 203, "\xCC" => 204, "\xCD" => 205, "\xCE" => 206, "\xCF" => 207, "\xD0" => 208, "\xD1" => 209, "\xD2" => 210, "\xD3" => 211, "\xD4" => 212, "\xD5" => 213, "\xD6" => 214, "\xD7" => 215, "\xD8" => 216, "\xD9" => 217, "\xDA" => 218, "\xDB" => 219, "\xDC" => 220, "\xDD" => 221, "\xDE" => 222, "\xDF" => 223, "\xE0" => 224, "\xE1" => 225, "\xE2" => 226, "\xE3" => 227, "\xE4" => 228, "\xE5" => 229, "\xE6" => 230, "\xE7" => 231, "\xE8" => 232, "\xE9" => 233, "\xEA" => 234, "\xEB" => 235, "\xEC" => 236, "\xED" => 237, "\xEE" => 238, "\xEF" => 239, "\xF0" => 240, "\xF1" => 241, "\xF2" => 242, "\xF3" => 243, "\xF4" => 244, "\xF5" => 245, "\xF6" => 246, "\xF7" => 247, "\xF8" => 248, "\xF9" => 249, "\xFA" => 250, "\xFB" => 251, "\xFC" => 252, "\xFD" => 253, "\xFE" => 254, "\xFF" => 255]; diff --git a/application/vendor/voku/portable-utf8/src/voku/helper/data/transliterator_list.php b/application/vendor/voku/portable-utf8/src/voku/helper/data/transliterator_list.php index 38f8c00..91ddf13 100644 --- a/application/vendor/voku/portable-utf8/src/voku/helper/data/transliterator_list.php +++ b/application/vendor/voku/portable-utf8/src/voku/helper/data/transliterator_list.php @@ -1,659 +1 @@ - 'ASCII-Latin', - 1 => 'Accents-Any', - 2 => 'Amharic-Latin/BGN', - 3 => 'Any-Accents', - 4 => 'Any-Publishing', - 5 => 'Arab-Latn', - 6 => 'Arabic-Latin', - 7 => 'Arabic-Latin/BGN', - 8 => 'Armenian-Latin', - 9 => 'Armenian-Latin/BGN', - 10 => 'Armn-Latn', - 11 => 'Azerbaijani-Latin/BGN', - 12 => 'Belarusian-Latin/BGN', - 13 => 'Beng-Arab', - 14 => 'Beng-Deva', - 15 => 'Beng-Gujr', - 16 => 'Beng-Guru', - 17 => 'Beng-Knda', - 18 => 'Beng-Latn', - 19 => 'Beng-Mlym', - 20 => 'Beng-Orya', - 21 => 'Beng-Taml', - 22 => 'Beng-Telu', - 23 => 'Beng-ur', - 24 => 'Bengali-Arabic', - 25 => 'Bengali-Devanagari', - 26 => 'Bengali-Gujarati', - 27 => 'Bengali-Gurmukhi', - 28 => 'Bengali-Kannada', - 29 => 'Bengali-Latin', - 30 => 'Bengali-Malayalam', - 31 => 'Bengali-Oriya', - 32 => 'Bengali-Tamil', - 33 => 'Bengali-Telugu', - 34 => 'Bopo-Latn', - 35 => 'Bopomofo-Latin', - 36 => 'Bulgarian-Latin/BGN', - 37 => 'Cyrillic-Latin', - 38 => 'Cyrl-Latn', - 39 => 'Deva-Arab', - 40 => 'Deva-Beng', - 41 => 'Deva-Gujr', - 42 => 'Deva-Guru', - 43 => 'Deva-Knda', - 44 => 'Deva-Latn', - 45 => 'Deva-Mlym', - 46 => 'Deva-Orya', - 47 => 'Deva-Taml', - 48 => 'Deva-Telu', - 49 => 'Deva-ur', - 50 => 'Devanagari-Arabic', - 51 => 'Devanagari-Bengali', - 52 => 'Devanagari-Gujarati', - 53 => 'Devanagari-Gurmukhi', - 54 => 'Devanagari-Kannada', - 55 => 'Devanagari-Latin', - 56 => 'Devanagari-Malayalam', - 57 => 'Devanagari-Oriya', - 58 => 'Devanagari-Tamil', - 59 => 'Devanagari-Telugu', - 60 => 'Digit-Tone', - 61 => 'Fullwidth-Halfwidth', - 62 => 'Geor-Latn', - 63 => 'Georgian-Latin', - 64 => 'Georgian-Latin/BGN', - 65 => 'Greek-Latin', - 66 => 'Greek-Latin/BGN', - 67 => 'Greek-Latin/UNGEGN', - 68 => 'Grek-Latn', - 69 => 'Grek-Latn/UNGEGN', - 70 => 'Gujarati-Arabic', - 71 => 'Gujarati-Bengali', - 72 => 'Gujarati-Devanagari', - 73 => 'Gujarati-Gurmukhi', - 74 => 'Gujarati-Kannada', - 75 => 'Gujarati-Latin', - 76 => 'Gujarati-Malayalam', - 77 => 'Gujarati-Oriya', - 78 => 'Gujarati-Tamil', - 79 => 'Gujarati-Telugu', - 80 => 'Gujr-Arab', - 81 => 'Gujr-Beng', - 82 => 'Gujr-Deva', - 83 => 'Gujr-Guru', - 84 => 'Gujr-Knda', - 85 => 'Gujr-Latn', - 86 => 'Gujr-Mlym', - 87 => 'Gujr-Orya', - 88 => 'Gujr-Taml', - 89 => 'Gujr-Telu', - 90 => 'Gujr-ur', - 91 => 'Gurmukhi-Arabic', - 92 => 'Gurmukhi-Bengali', - 93 => 'Gurmukhi-Devanagari', - 94 => 'Gurmukhi-Gujarati', - 95 => 'Gurmukhi-Kannada', - 96 => 'Gurmukhi-Latin', - 97 => 'Gurmukhi-Malayalam', - 98 => 'Gurmukhi-Oriya', - 99 => 'Gurmukhi-Tamil', - 100 => 'Gurmukhi-Telugu', - 101 => 'Guru-Arab', - 102 => 'Guru-Beng', - 103 => 'Guru-Deva', - 104 => 'Guru-Gujr', - 105 => 'Guru-Knda', - 106 => 'Guru-Latn', - 107 => 'Guru-Mlym', - 108 => 'Guru-Orya', - 109 => 'Guru-Taml', - 110 => 'Guru-Telu', - 111 => 'Guru-ur', - 112 => 'Halfwidth-Fullwidth', - 113 => 'Han-Latin', - 114 => 'Han-Latin/Names', - 115 => 'Hang-Latn', - 116 => 'Hangul-Latin', - 117 => 'Hani-Latn', - 118 => 'Hans-Hant', - 119 => 'Hant-Hans', - 120 => 'Hebr-Latn', - 121 => 'Hebrew-Latin', - 122 => 'Hebrew-Latin/BGN', - 123 => 'Hira-Kana', - 124 => 'Hira-Latn', - 125 => 'Hiragana-Katakana', - 126 => 'Hiragana-Latin', - 127 => 'IPA-XSampa', - 128 => 'Jamo-Latin', - 129 => 'Jamo-Latn', - 130 => 'Kana-Hira', - 131 => 'Kana-Latn', - 132 => 'Kannada-Arabic', - 133 => 'Kannada-Bengali', - 134 => 'Kannada-Devanagari', - 135 => 'Kannada-Gujarati', - 136 => 'Kannada-Gurmukhi', - 137 => 'Kannada-Latin', - 138 => 'Kannada-Malayalam', - 139 => 'Kannada-Oriya', - 140 => 'Kannada-Tamil', - 141 => 'Kannada-Telugu', - 142 => 'Katakana-Hiragana', - 143 => 'Katakana-Latin', - 144 => 'Katakana-Latin/BGN', - 145 => 'Kazakh-Latin/BGN', - 146 => 'Kirghiz-Latin/BGN', - 147 => 'Knda-Arab', - 148 => 'Knda-Beng', - 149 => 'Knda-Deva', - 150 => 'Knda-Gujr', - 151 => 'Knda-Guru', - 152 => 'Knda-Latn', - 153 => 'Knda-Mlym', - 154 => 'Knda-Orya', - 155 => 'Knda-Taml', - 156 => 'Knda-Telu', - 157 => 'Knda-ur', - 158 => 'Korean-Latin/BGN', - 159 => 'Latin-ASCII', - 160 => 'Latin-Arabic', - 161 => 'Latin-Armenian', - 162 => 'Latin-Bengali', - 163 => 'Latin-Bopomofo', - 164 => 'Latin-Cyrillic', - 165 => 'Latin-Devanagari', - 166 => 'Latin-Georgian', - 167 => 'Latin-Greek', - 168 => 'Latin-Greek/UNGEGN', - 169 => 'Latin-Gujarati', - 170 => 'Latin-Gurmukhi', - 171 => 'Latin-Hangul', - 172 => 'Latin-Hebrew', - 173 => 'Latin-Hiragana', - 174 => 'Latin-Jamo', - 175 => 'Latin-Kannada', - 176 => 'Latin-Katakana', - 177 => 'Latin-Malayalam', - 178 => 'Latin-NumericPinyin', - 179 => 'Latin-Oriya', - 180 => 'Latin-Russian/BGN', - 181 => 'Latin-Syriac', - 182 => 'Latin-Tamil', - 183 => 'Latin-Telugu', - 184 => 'Latin-Thaana', - 185 => 'Latin-Thai', - 186 => 'Latn-Arab', - 187 => 'Latn-Armn', - 188 => 'Latn-Beng', - 189 => 'Latn-Bopo', - 190 => 'Latn-Cyrl', - 191 => 'Latn-Deva', - 192 => 'Latn-Geor', - 193 => 'Latn-Grek', - 194 => 'Latn-Grek/UNGEGN', - 195 => 'Latn-Gujr', - 196 => 'Latn-Guru', - 197 => 'Latn-Hang', - 198 => 'Latn-Hebr', - 199 => 'Latn-Hira', - 200 => 'Latn-Jamo', - 201 => 'Latn-Kana', - 202 => 'Latn-Knda', - 203 => 'Latn-Mlym', - 204 => 'Latn-Orya', - 205 => 'Latn-Syrc', - 206 => 'Latn-Taml', - 207 => 'Latn-Telu', - 208 => 'Latn-Thaa', - 209 => 'Latn-Thai', - 210 => 'Macedonian-Latin/BGN', - 211 => 'Malayalam-Arabic', - 212 => 'Malayalam-Bengali', - 213 => 'Malayalam-Devanagari', - 214 => 'Malayalam-Gujarati', - 215 => 'Malayalam-Gurmukhi', - 216 => 'Malayalam-Kannada', - 217 => 'Malayalam-Latin', - 218 => 'Malayalam-Oriya', - 219 => 'Malayalam-Tamil', - 220 => 'Malayalam-Telugu', - 221 => 'Maldivian-Latin/BGN', - 222 => 'Mlym-Arab', - 223 => 'Mlym-Beng', - 224 => 'Mlym-Deva', - 225 => 'Mlym-Gujr', - 226 => 'Mlym-Guru', - 227 => 'Mlym-Knda', - 228 => 'Mlym-Latn', - 229 => 'Mlym-Orya', - 230 => 'Mlym-Taml', - 231 => 'Mlym-Telu', - 232 => 'Mlym-ur', - 233 => 'Mongolian-Latin/BGN', - 234 => 'NumericPinyin-Latin', - 235 => 'NumericPinyin-Pinyin', - 236 => 'Oriya-Arabic', - 237 => 'Oriya-Bengali', - 238 => 'Oriya-Devanagari', - 239 => 'Oriya-Gujarati', - 240 => 'Oriya-Gurmukhi', - 241 => 'Oriya-Kannada', - 242 => 'Oriya-Latin', - 243 => 'Oriya-Malayalam', - 244 => 'Oriya-Tamil', - 245 => 'Oriya-Telugu', - 246 => 'Orya-Arab', - 247 => 'Orya-Beng', - 248 => 'Orya-Deva', - 249 => 'Orya-Gujr', - 250 => 'Orya-Guru', - 251 => 'Orya-Knda', - 252 => 'Orya-Latn', - 253 => 'Orya-Mlym', - 254 => 'Orya-Taml', - 255 => 'Orya-Telu', - 256 => 'Orya-ur', - 257 => 'Pashto-Latin/BGN', - 258 => 'Persian-Latin/BGN', - 259 => 'Pinyin-NumericPinyin', - 260 => 'Publishing-Any', - 261 => 'Russian-Latin/BGN', - 262 => 'Serbian-Latin/BGN', - 263 => 'Simplified-Traditional', - 264 => 'Syrc-Latn', - 265 => 'Syriac-Latin', - 266 => 'Tamil-Arabic', - 267 => 'Tamil-Bengali', - 268 => 'Tamil-Devanagari', - 269 => 'Tamil-Gujarati', - 270 => 'Tamil-Gurmukhi', - 271 => 'Tamil-Kannada', - 272 => 'Tamil-Latin', - 273 => 'Tamil-Malayalam', - 274 => 'Tamil-Oriya', - 275 => 'Tamil-Telugu', - 276 => 'Taml-Arab', - 277 => 'Taml-Beng', - 278 => 'Taml-Deva', - 279 => 'Taml-Gujr', - 280 => 'Taml-Guru', - 281 => 'Taml-Knda', - 282 => 'Taml-Latn', - 283 => 'Taml-Mlym', - 284 => 'Taml-Orya', - 285 => 'Taml-Telu', - 286 => 'Taml-ur', - 287 => 'Telu-Arab', - 288 => 'Telu-Beng', - 289 => 'Telu-Deva', - 290 => 'Telu-Gujr', - 291 => 'Telu-Guru', - 292 => 'Telu-Knda', - 293 => 'Telu-Latn', - 294 => 'Telu-Mlym', - 295 => 'Telu-Orya', - 296 => 'Telu-Taml', - 297 => 'Telu-ur', - 298 => 'Telugu-Arabic', - 299 => 'Telugu-Bengali', - 300 => 'Telugu-Devanagari', - 301 => 'Telugu-Gujarati', - 302 => 'Telugu-Gurmukhi', - 303 => 'Telugu-Kannada', - 304 => 'Telugu-Latin', - 305 => 'Telugu-Malayalam', - 306 => 'Telugu-Oriya', - 307 => 'Telugu-Tamil', - 308 => 'Thaa-Latn', - 309 => 'Thaana-Latin', - 310 => 'Thai-Latin', - 311 => 'Thai-Latn', - 312 => 'Tone-Digit', - 313 => 'Traditional-Simplified', - 314 => 'Turkmen-Latin/BGN', - 315 => 'Ukrainian-Latin/BGN', - 316 => 'Uzbek-Latin/BGN', - 317 => 'XSampa-IPA', - 318 => 'Zawgyi-my', - 319 => 'am-am_FONIPA', - 320 => 'am-am_Latn/BGN', - 321 => 'am-ar', - 322 => 'am-chr', - 323 => 'am-fa', - 324 => 'am_FONIPA-am', - 325 => 'ar-ar_Latn/BGN', - 326 => 'az-Lower', - 327 => 'az-Title', - 328 => 'az-Upper', - 329 => 'az_Cyrl-az/BGN', - 330 => 'be-be_Latn/BGN', - 331 => 'bg-bg_Latn/BGN', - 332 => 'blt-blt_FONIPA', - 333 => 'ch-am', - 334 => 'ch-ar', - 335 => 'ch-ch_FONIPA', - 336 => 'ch-chr', - 337 => 'ch-fa', - 338 => 'chr-chr_FONIPA', - 339 => 'cs-am', - 340 => 'cs-ar', - 341 => 'cs-chr', - 342 => 'cs-cs_FONIPA', - 343 => 'cs-fa', - 344 => 'cs-ja', - 345 => 'cs-ko', - 346 => 'cs_FONIPA-ja', - 347 => 'cs_FONIPA-ko', - 348 => 'cy-cy_FONIPA', - 349 => 'de-ASCII', - 350 => 'dsb-dsb_FONIPA', - 351 => 'dv-dv_Latn/BGN', - 352 => 'el-Lower', - 353 => 'el-Title', - 354 => 'el-Upper', - 355 => 'el-el_Latn/BGN', - 356 => 'eo-am', - 357 => 'eo-ar', - 358 => 'eo-chr', - 359 => 'eo-eo_FONIPA', - 360 => 'eo-fa', - 361 => 'es-am', - 362 => 'es-ar', - 363 => 'es-chr', - 364 => 'es-es_FONIPA', - 365 => 'es-fa', - 366 => 'es-ja', - 367 => 'es-zh', - 368 => 'es_419-am', - 369 => 'es_419-ar', - 370 => 'es_419-chr', - 371 => 'es_419-fa', - 372 => 'es_419-ja', - 373 => 'es_419-zh', - 374 => 'es_FONIPA-am', - 375 => 'es_FONIPA-es_419_FONIPA', - 376 => 'es_FONIPA-ja', - 377 => 'es_FONIPA-zh', - 378 => 'fa-fa_FONIPA', - 379 => 'fa-fa_Latn/BGN', - 380 => 'ha-ha_NE', - 381 => 'he-he_Latn/BGN', - 382 => 'hy-am', - 383 => 'hy-ar', - 384 => 'hy-chr', - 385 => 'hy-fa', - 386 => 'hy-hy_FONIPA', - 387 => 'hy-hy_Latn/BGN', - 388 => 'hy_AREVMDA-am', - 389 => 'hy_AREVMDA-ar', - 390 => 'hy_AREVMDA-chr', - 391 => 'hy_AREVMDA-fa', - 392 => 'hy_AREVMDA-hy_AREVMDA_FONIPA', - 393 => 'ia-am', - 394 => 'ia-ar', - 395 => 'ia-chr', - 396 => 'ia-fa', - 397 => 'ia-ia_FONIPA', - 398 => 'it-am', - 399 => 'it-ja', - 400 => 'ja_Hrkt-ja_Latn/BGN', - 401 => 'ja_Latn-ko', - 402 => 'ja_Latn-ru', - 403 => 'ka-ka_Latn/BGN', - 404 => 'ka-ka_Latn/BGN_1981', - 405 => 'kk-am', - 406 => 'kk-ar', - 407 => 'kk-chr', - 408 => 'kk-fa', - 409 => 'kk-kk_FONIPA', - 410 => 'kk-kk_Latn/BGN', - 411 => 'ko-ko_Latn/BGN', - 412 => 'ky-am', - 413 => 'ky-ar', - 414 => 'ky-chr', - 415 => 'ky-fa', - 416 => 'ky-ky_FONIPA', - 417 => 'ky-ky_Latn/BGN', - 418 => 'la-la_FONIPA', - 419 => 'lt-Lower', - 420 => 'lt-Title', - 421 => 'lt-Upper', - 422 => 'mk-mk_Latn/BGN', - 423 => 'mn-mn_Latn/BGN', - 424 => 'mn-mn_Latn/MNS', - 425 => 'my-Zawgyi', - 426 => 'my-am', - 427 => 'my-ar', - 428 => 'my-chr', - 429 => 'my-fa', - 430 => 'my-my_FONIPA', - 431 => 'nl-Title', - 432 => 'nv-nv_FONIPA', - 433 => 'pl-am', - 434 => 'pl-ar', - 435 => 'pl-chr', - 436 => 'pl-fa', - 437 => 'pl-ja', - 438 => 'pl-pl_FONIPA', - 439 => 'pl_FONIPA-ja', - 440 => 'ps-ps_Latn/BGN', - 441 => 'rm_SURSILV-am', - 442 => 'rm_SURSILV-ar', - 443 => 'rm_SURSILV-chr', - 444 => 'rm_SURSILV-fa', - 445 => 'rm_SURSILV-rm_FONIPA_SURSILV', - 446 => 'ro-am', - 447 => 'ro-ar', - 448 => 'ro-chr', - 449 => 'ro-fa', - 450 => 'ro-ja', - 451 => 'ro-ro_FONIPA', - 452 => 'ro_FONIPA-ja', - 453 => 'ru-ja', - 454 => 'ru-ru_Latn/BGN', - 455 => 'ru-zh', - 456 => 'ru_Latn-ru/BGN', - 457 => 'sat-am', - 458 => 'sat-ar', - 459 => 'sat-chr', - 460 => 'sat-fa', - 461 => 'sat_Olck-sat_FONIPA', - 462 => 'si-am', - 463 => 'si-ar', - 464 => 'si-chr', - 465 => 'si-fa', - 466 => 'si-si_FONIPA', - 467 => 'si-si_Latn', - 468 => 'sk-am', - 469 => 'sk-ar', - 470 => 'sk-chr', - 471 => 'sk-fa', - 472 => 'sk-ja', - 473 => 'sk-sk_FONIPA', - 474 => 'sk_FONIPA-ja', - 475 => 'sr-sr_Latn/BGN', - 476 => 'ta-ta_FONIPA', - 477 => 'tk_Cyrl-tk/BGN', - 478 => 'tlh-am', - 479 => 'tlh-ar', - 480 => 'tlh-chr', - 481 => 'tlh-fa', - 482 => 'tlh-tlh_FONIPA', - 483 => 'tr-Lower', - 484 => 'tr-Title', - 485 => 'tr-Upper', - 486 => 'ug-ug_FONIPA', - 487 => 'uk-uk_Latn/BGN', - 488 => 'und_FONIPA-ar', - 489 => 'und_FONIPA-chr', - 490 => 'und_FONIPA-fa', - 491 => 'und_FONIPA-und_FONXSAMP', - 492 => 'und_FONXSAMP-und_FONIPA', - 493 => 'uz_Cyrl-uz/BGN', - 494 => 'uz_Cyrl-uz_Latn', - 495 => 'uz_Latn-uz_Cyrl', - 496 => 'vec-vec_FONIPA', - 497 => 'xh-am', - 498 => 'xh-ar', - 499 => 'xh-chr', - 500 => 'xh-fa', - 501 => 'xh-xh_FONIPA', - 502 => 'yo-yo_BJ', - 503 => 'zh_Latn_PINYIN-ru', - 504 => 'zu-am', - 505 => 'zu-ar', - 506 => 'zu-chr', - 507 => 'zu-fa', - 508 => 'zu-zu_FONIPA', - 509 => 'Any-Null', - 510 => 'Any-Lower', - 511 => 'Any-Upper', - 512 => 'Any-Title', - 513 => 'Any-Name', - 514 => 'Name-Any', - 515 => 'Any-Remove', - 516 => 'Any-Hex/Unicode', - 517 => 'Any-Hex/Java', - 518 => 'Any-Hex/C', - 519 => 'Any-Hex/XML', - 520 => 'Any-Hex/XML10', - 521 => 'Any-Hex/Perl', - 522 => 'Any-Hex', - 523 => 'Hex-Any/Unicode', - 524 => 'Hex-Any/Java', - 525 => 'Hex-Any/C', - 526 => 'Hex-Any/XML', - 527 => 'Hex-Any/XML10', - 528 => 'Hex-Any/Perl', - 529 => 'Hex-Any', - 530 => 'Any-NFC', - 531 => 'Any-NFKC', - 532 => 'Any-NFD', - 533 => 'Any-NFKD', - 534 => 'Any-FCD', - 535 => 'Any-FCC', - 536 => 'Any-fa', - 537 => 'Any-ar', - 538 => 'Any-chr', - 539 => 'Any-rm_FONIPA_SURSILV', - 540 => 'Any-am', - 541 => 'Any-Latn', - 542 => 'Any-dv_Latn/BGN', - 543 => 'Any-ro_FONIPA', - 544 => 'Any-dsb_FONIPA', - 545 => 'Any-Latin', - 546 => 'Any-he_Latn/BGN', - 547 => 'Any-el_Latn/BGN', - 548 => 'Any-eo_FONIPA', - 549 => 'Any-si_Latn', - 550 => 'Any-si_FONIPA', - 551 => 'Any-zh', - 552 => 'Any-es_FONIPA', - 553 => 'Any-sk_FONIPA', - 554 => 'Any-und_FONIPA', - 555 => 'Any-und_FONXSAMP', - 556 => 'Any-az/BGN', - 557 => 'Any-Deva', - 558 => 'Any-Arab', - 559 => 'Any-Telu', - 560 => 'Any-Beng', - 561 => 'Any-ur', - 562 => 'Any-Orya', - 563 => 'Any-Guru', - 564 => 'Any-Taml', - 565 => 'Any-Gujr', - 566 => 'Any-Knda', - 567 => 'Any-Armenian', - 568 => 'Any-Thaana', - 569 => 'Any-Hiragana', - 570 => 'Any-Syriac', - 571 => 'Any-Jamo', - 572 => 'Any-Hangul', - 573 => 'Any-Kannada', - 574 => 'Any-Georgian', - 575 => 'Any-Telugu', - 576 => 'Any-Cyrillic', - 577 => 'Any-Thai', - 578 => 'Any-Oriya', - 579 => 'Any-Bopomofo', - 580 => 'Any-Malayalam', - 581 => 'Any-Gurmukhi', - 582 => 'Any-Gujarati', - 583 => 'Any-Tamil', - 584 => 'Any-Katakana', - 585 => 'Any-Hebrew', - 586 => 'Any-Bengali', - 587 => 'Any-Arabic', - 588 => 'Any-Greek', - 589 => 'Any-Greek/UNGEGN', - 590 => 'Any-Devanagari', - 591 => 'Any-fa_FONIPA', - 592 => 'Any-fa_Latn/BGN', - 593 => 'Any-ta_FONIPA', - 594 => 'Any-Mlym', - 595 => 'Any-Any', - 596 => 'Any-Hant', - 597 => 'Any-Hans', - 598 => 'Any-uz_Cyrl', - 599 => 'Any-blt_FONIPA', - 600 => 'Any-ug_FONIPA', - 601 => 'Any-uk_Latn/BGN', - 602 => 'Any-ha_NE', - 603 => 'Any-hy_AREVMDA_FONIPA', - 604 => 'Any-hy_FONIPA', - 605 => 'Any-hy_Latn/BGN', - 606 => 'Any-ia_FONIPA', - 607 => 'Any-uz/BGN', - 608 => 'Any-uz_Latn', - 609 => 'Any-vec_FONIPA', - 610 => 'Any-xh_FONIPA', - 611 => 'Any-ka_Latn/BGN', - 612 => 'Any-ka_Latn/BGN_1981', - 613 => 'Any-kk_FONIPA', - 614 => 'Any-kk_Latn/BGN', - 615 => 'Any-yo_BJ', - 616 => 'Any-ky_FONIPA', - 617 => 'Any-ky_Latn/BGN', - 618 => 'Any-la_FONIPA', - 619 => 'Any-ru_Latn/BGN', - 620 => 'Any-chr_FONIPA', - 621 => 'Any-zu_FONIPA', - 622 => 'Any-ru', - 623 => 'Any-Geor', - 624 => 'Any-Cyrl', - 625 => 'Any-Armn', - 626 => 'Any-Thaa', - 627 => 'Any-Hebr', - 628 => 'Any-Grek', - 629 => 'Any-Grek/UNGEGN', - 630 => 'Any-Syrc', - 631 => 'Any-Hira', - 632 => 'Any-Hang', - 633 => 'Any-Kana', - 634 => 'Any-Bopo', - 635 => 'Any-mn_Latn/BGN', - 636 => 'Any-mn_Latn/MNS', - 637 => 'Any-my_FONIPA', - 638 => 'Any-sr_Latn/BGN', - 639 => 'Any-nv_FONIPA', - 640 => 'Any-sat_FONIPA', - 641 => 'Any-my', - 642 => 'Any-am_FONIPA', - 643 => 'Any-am_Latn/BGN', - 644 => 'Any-ar_Latn/BGN', - 645 => 'Any-mk_Latn/BGN', - 646 => 'Any-be_Latn/BGN', - 647 => 'Any-bg_Latn/BGN', - 648 => 'Any-es_419_FONIPA', - 649 => 'Any-pl_FONIPA', - 650 => 'Any-ps_Latn/BGN', - 651 => 'Any-tk/BGN', - 652 => 'Any-ch_FONIPA', - 653 => 'Any-cs_FONIPA', - 654 => 'Any-cy_FONIPA', -]; + 'ASCII-Latin', 1 => 'Accents-Any', 2 => 'Amharic-Latin/BGN', 3 => 'Any-Accents', 4 => 'Any-Publishing', 5 => 'Arab-Latn', 6 => 'Arabic-Latin', 7 => 'Arabic-Latin/BGN', 8 => 'Armenian-Latin', 9 => 'Armenian-Latin/BGN', 10 => 'Armn-Latn', 11 => 'Azerbaijani-Latin/BGN', 12 => 'Belarusian-Latin/BGN', 13 => 'Beng-Arab', 14 => 'Beng-Deva', 15 => 'Beng-Gujr', 16 => 'Beng-Guru', 17 => 'Beng-Knda', 18 => 'Beng-Latn', 19 => 'Beng-Mlym', 20 => 'Beng-Orya', 21 => 'Beng-Taml', 22 => 'Beng-Telu', 23 => 'Beng-ur', 24 => 'Bengali-Arabic', 25 => 'Bengali-Devanagari', 26 => 'Bengali-Gujarati', 27 => 'Bengali-Gurmukhi', 28 => 'Bengali-Kannada', 29 => 'Bengali-Latin', 30 => 'Bengali-Malayalam', 31 => 'Bengali-Oriya', 32 => 'Bengali-Tamil', 33 => 'Bengali-Telugu', 34 => 'Bopo-Latn', 35 => 'Bopomofo-Latin', 36 => 'Bulgarian-Latin/BGN', 37 => 'Cyrillic-Latin', 38 => 'Cyrl-Latn', 39 => 'Deva-Arab', 40 => 'Deva-Beng', 41 => 'Deva-Gujr', 42 => 'Deva-Guru', 43 => 'Deva-Knda', 44 => 'Deva-Latn', 45 => 'Deva-Mlym', 46 => 'Deva-Orya', 47 => 'Deva-Taml', 48 => 'Deva-Telu', 49 => 'Deva-ur', 50 => 'Devanagari-Arabic', 51 => 'Devanagari-Bengali', 52 => 'Devanagari-Gujarati', 53 => 'Devanagari-Gurmukhi', 54 => 'Devanagari-Kannada', 55 => 'Devanagari-Latin', 56 => 'Devanagari-Malayalam', 57 => 'Devanagari-Oriya', 58 => 'Devanagari-Tamil', 59 => 'Devanagari-Telugu', 60 => 'Digit-Tone', 61 => 'Fullwidth-Halfwidth', 62 => 'Geor-Latn', 63 => 'Georgian-Latin', 64 => 'Georgian-Latin/BGN', 65 => 'Greek-Latin', 66 => 'Greek-Latin/BGN', 67 => 'Greek-Latin/UNGEGN', 68 => 'Grek-Latn', 69 => 'Grek-Latn/UNGEGN', 70 => 'Gujarati-Arabic', 71 => 'Gujarati-Bengali', 72 => 'Gujarati-Devanagari', 73 => 'Gujarati-Gurmukhi', 74 => 'Gujarati-Kannada', 75 => 'Gujarati-Latin', 76 => 'Gujarati-Malayalam', 77 => 'Gujarati-Oriya', 78 => 'Gujarati-Tamil', 79 => 'Gujarati-Telugu', 80 => 'Gujr-Arab', 81 => 'Gujr-Beng', 82 => 'Gujr-Deva', 83 => 'Gujr-Guru', 84 => 'Gujr-Knda', 85 => 'Gujr-Latn', 86 => 'Gujr-Mlym', 87 => 'Gujr-Orya', 88 => 'Gujr-Taml', 89 => 'Gujr-Telu', 90 => 'Gujr-ur', 91 => 'Gurmukhi-Arabic', 92 => 'Gurmukhi-Bengali', 93 => 'Gurmukhi-Devanagari', 94 => 'Gurmukhi-Gujarati', 95 => 'Gurmukhi-Kannada', 96 => 'Gurmukhi-Latin', 97 => 'Gurmukhi-Malayalam', 98 => 'Gurmukhi-Oriya', 99 => 'Gurmukhi-Tamil', 100 => 'Gurmukhi-Telugu', 101 => 'Guru-Arab', 102 => 'Guru-Beng', 103 => 'Guru-Deva', 104 => 'Guru-Gujr', 105 => 'Guru-Knda', 106 => 'Guru-Latn', 107 => 'Guru-Mlym', 108 => 'Guru-Orya', 109 => 'Guru-Taml', 110 => 'Guru-Telu', 111 => 'Guru-ur', 112 => 'Halfwidth-Fullwidth', 113 => 'Han-Latin', 114 => 'Han-Latin/Names', 115 => 'Hang-Latn', 116 => 'Hangul-Latin', 117 => 'Hani-Latn', 118 => 'Hans-Hant', 119 => 'Hant-Hans', 120 => 'Hebr-Latn', 121 => 'Hebrew-Latin', 122 => 'Hebrew-Latin/BGN', 123 => 'Hira-Kana', 124 => 'Hira-Latn', 125 => 'Hiragana-Katakana', 126 => 'Hiragana-Latin', 127 => 'IPA-XSampa', 128 => 'Jamo-Latin', 129 => 'Jamo-Latn', 130 => 'Kana-Hira', 131 => 'Kana-Latn', 132 => 'Kannada-Arabic', 133 => 'Kannada-Bengali', 134 => 'Kannada-Devanagari', 135 => 'Kannada-Gujarati', 136 => 'Kannada-Gurmukhi', 137 => 'Kannada-Latin', 138 => 'Kannada-Malayalam', 139 => 'Kannada-Oriya', 140 => 'Kannada-Tamil', 141 => 'Kannada-Telugu', 142 => 'Katakana-Hiragana', 143 => 'Katakana-Latin', 144 => 'Katakana-Latin/BGN', 145 => 'Kazakh-Latin/BGN', 146 => 'Kirghiz-Latin/BGN', 147 => 'Knda-Arab', 148 => 'Knda-Beng', 149 => 'Knda-Deva', 150 => 'Knda-Gujr', 151 => 'Knda-Guru', 152 => 'Knda-Latn', 153 => 'Knda-Mlym', 154 => 'Knda-Orya', 155 => 'Knda-Taml', 156 => 'Knda-Telu', 157 => 'Knda-ur', 158 => 'Korean-Latin/BGN', 159 => 'Latin-ASCII', 160 => 'Latin-Arabic', 161 => 'Latin-Armenian', 162 => 'Latin-Bengali', 163 => 'Latin-Bopomofo', 164 => 'Latin-Cyrillic', 165 => 'Latin-Devanagari', 166 => 'Latin-Georgian', 167 => 'Latin-Greek', 168 => 'Latin-Greek/UNGEGN', 169 => 'Latin-Gujarati', 170 => 'Latin-Gurmukhi', 171 => 'Latin-Hangul', 172 => 'Latin-Hebrew', 173 => 'Latin-Hiragana', 174 => 'Latin-Jamo', 175 => 'Latin-Kannada', 176 => 'Latin-Katakana', 177 => 'Latin-Malayalam', 178 => 'Latin-NumericPinyin', 179 => 'Latin-Oriya', 180 => 'Latin-Russian/BGN', 181 => 'Latin-Syriac', 182 => 'Latin-Tamil', 183 => 'Latin-Telugu', 184 => 'Latin-Thaana', 185 => 'Latin-Thai', 186 => 'Latn-Arab', 187 => 'Latn-Armn', 188 => 'Latn-Beng', 189 => 'Latn-Bopo', 190 => 'Latn-Cyrl', 191 => 'Latn-Deva', 192 => 'Latn-Geor', 193 => 'Latn-Grek', 194 => 'Latn-Grek/UNGEGN', 195 => 'Latn-Gujr', 196 => 'Latn-Guru', 197 => 'Latn-Hang', 198 => 'Latn-Hebr', 199 => 'Latn-Hira', 200 => 'Latn-Jamo', 201 => 'Latn-Kana', 202 => 'Latn-Knda', 203 => 'Latn-Mlym', 204 => 'Latn-Orya', 205 => 'Latn-Syrc', 206 => 'Latn-Taml', 207 => 'Latn-Telu', 208 => 'Latn-Thaa', 209 => 'Latn-Thai', 210 => 'Macedonian-Latin/BGN', 211 => 'Malayalam-Arabic', 212 => 'Malayalam-Bengali', 213 => 'Malayalam-Devanagari', 214 => 'Malayalam-Gujarati', 215 => 'Malayalam-Gurmukhi', 216 => 'Malayalam-Kannada', 217 => 'Malayalam-Latin', 218 => 'Malayalam-Oriya', 219 => 'Malayalam-Tamil', 220 => 'Malayalam-Telugu', 221 => 'Maldivian-Latin/BGN', 222 => 'Mlym-Arab', 223 => 'Mlym-Beng', 224 => 'Mlym-Deva', 225 => 'Mlym-Gujr', 226 => 'Mlym-Guru', 227 => 'Mlym-Knda', 228 => 'Mlym-Latn', 229 => 'Mlym-Orya', 230 => 'Mlym-Taml', 231 => 'Mlym-Telu', 232 => 'Mlym-ur', 233 => 'Mongolian-Latin/BGN', 234 => 'NumericPinyin-Latin', 235 => 'NumericPinyin-Pinyin', 236 => 'Oriya-Arabic', 237 => 'Oriya-Bengali', 238 => 'Oriya-Devanagari', 239 => 'Oriya-Gujarati', 240 => 'Oriya-Gurmukhi', 241 => 'Oriya-Kannada', 242 => 'Oriya-Latin', 243 => 'Oriya-Malayalam', 244 => 'Oriya-Tamil', 245 => 'Oriya-Telugu', 246 => 'Orya-Arab', 247 => 'Orya-Beng', 248 => 'Orya-Deva', 249 => 'Orya-Gujr', 250 => 'Orya-Guru', 251 => 'Orya-Knda', 252 => 'Orya-Latn', 253 => 'Orya-Mlym', 254 => 'Orya-Taml', 255 => 'Orya-Telu', 256 => 'Orya-ur', 257 => 'Pashto-Latin/BGN', 258 => 'Persian-Latin/BGN', 259 => 'Pinyin-NumericPinyin', 260 => 'Publishing-Any', 261 => 'Russian-Latin/BGN', 262 => 'Serbian-Latin/BGN', 263 => 'Simplified-Traditional', 264 => 'Syrc-Latn', 265 => 'Syriac-Latin', 266 => 'Tamil-Arabic', 267 => 'Tamil-Bengali', 268 => 'Tamil-Devanagari', 269 => 'Tamil-Gujarati', 270 => 'Tamil-Gurmukhi', 271 => 'Tamil-Kannada', 272 => 'Tamil-Latin', 273 => 'Tamil-Malayalam', 274 => 'Tamil-Oriya', 275 => 'Tamil-Telugu', 276 => 'Taml-Arab', 277 => 'Taml-Beng', 278 => 'Taml-Deva', 279 => 'Taml-Gujr', 280 => 'Taml-Guru', 281 => 'Taml-Knda', 282 => 'Taml-Latn', 283 => 'Taml-Mlym', 284 => 'Taml-Orya', 285 => 'Taml-Telu', 286 => 'Taml-ur', 287 => 'Telu-Arab', 288 => 'Telu-Beng', 289 => 'Telu-Deva', 290 => 'Telu-Gujr', 291 => 'Telu-Guru', 292 => 'Telu-Knda', 293 => 'Telu-Latn', 294 => 'Telu-Mlym', 295 => 'Telu-Orya', 296 => 'Telu-Taml', 297 => 'Telu-ur', 298 => 'Telugu-Arabic', 299 => 'Telugu-Bengali', 300 => 'Telugu-Devanagari', 301 => 'Telugu-Gujarati', 302 => 'Telugu-Gurmukhi', 303 => 'Telugu-Kannada', 304 => 'Telugu-Latin', 305 => 'Telugu-Malayalam', 306 => 'Telugu-Oriya', 307 => 'Telugu-Tamil', 308 => 'Thaa-Latn', 309 => 'Thaana-Latin', 310 => 'Thai-Latin', 311 => 'Thai-Latn', 312 => 'Tone-Digit', 313 => 'Traditional-Simplified', 314 => 'Turkmen-Latin/BGN', 315 => 'Ukrainian-Latin/BGN', 316 => 'Uzbek-Latin/BGN', 317 => 'XSampa-IPA', 318 => 'Zawgyi-my', 319 => 'am-am_FONIPA', 320 => 'am-am_Latn/BGN', 321 => 'am-ar', 322 => 'am-chr', 323 => 'am-fa', 324 => 'am_FONIPA-am', 325 => 'ar-ar_Latn/BGN', 326 => 'az-Lower', 327 => 'az-Title', 328 => 'az-Upper', 329 => 'az_Cyrl-az/BGN', 330 => 'be-be_Latn/BGN', 331 => 'bg-bg_Latn/BGN', 332 => 'blt-blt_FONIPA', 333 => 'ch-am', 334 => 'ch-ar', 335 => 'ch-ch_FONIPA', 336 => 'ch-chr', 337 => 'ch-fa', 338 => 'chr-chr_FONIPA', 339 => 'cs-am', 340 => 'cs-ar', 341 => 'cs-chr', 342 => 'cs-cs_FONIPA', 343 => 'cs-fa', 344 => 'cs-ja', 345 => 'cs-ko', 346 => 'cs_FONIPA-ja', 347 => 'cs_FONIPA-ko', 348 => 'cy-cy_FONIPA', 349 => 'de-ASCII', 350 => 'dsb-dsb_FONIPA', 351 => 'dv-dv_Latn/BGN', 352 => 'el-Lower', 353 => 'el-Title', 354 => 'el-Upper', 355 => 'el-el_Latn/BGN', 356 => 'eo-am', 357 => 'eo-ar', 358 => 'eo-chr', 359 => 'eo-eo_FONIPA', 360 => 'eo-fa', 361 => 'es-am', 362 => 'es-ar', 363 => 'es-chr', 364 => 'es-es_FONIPA', 365 => 'es-fa', 366 => 'es-ja', 367 => 'es-zh', 368 => 'es_419-am', 369 => 'es_419-ar', 370 => 'es_419-chr', 371 => 'es_419-fa', 372 => 'es_419-ja', 373 => 'es_419-zh', 374 => 'es_FONIPA-am', 375 => 'es_FONIPA-es_419_FONIPA', 376 => 'es_FONIPA-ja', 377 => 'es_FONIPA-zh', 378 => 'fa-fa_FONIPA', 379 => 'fa-fa_Latn/BGN', 380 => 'ha-ha_NE', 381 => 'he-he_Latn/BGN', 382 => 'hy-am', 383 => 'hy-ar', 384 => 'hy-chr', 385 => 'hy-fa', 386 => 'hy-hy_FONIPA', 387 => 'hy-hy_Latn/BGN', 388 => 'hy_AREVMDA-am', 389 => 'hy_AREVMDA-ar', 390 => 'hy_AREVMDA-chr', 391 => 'hy_AREVMDA-fa', 392 => 'hy_AREVMDA-hy_AREVMDA_FONIPA', 393 => 'ia-am', 394 => 'ia-ar', 395 => 'ia-chr', 396 => 'ia-fa', 397 => 'ia-ia_FONIPA', 398 => 'it-am', 399 => 'it-ja', 400 => 'ja_Hrkt-ja_Latn/BGN', 401 => 'ja_Latn-ko', 402 => 'ja_Latn-ru', 403 => 'ka-ka_Latn/BGN', 404 => 'ka-ka_Latn/BGN_1981', 405 => 'kk-am', 406 => 'kk-ar', 407 => 'kk-chr', 408 => 'kk-fa', 409 => 'kk-kk_FONIPA', 410 => 'kk-kk_Latn/BGN', 411 => 'ko-ko_Latn/BGN', 412 => 'ky-am', 413 => 'ky-ar', 414 => 'ky-chr', 415 => 'ky-fa', 416 => 'ky-ky_FONIPA', 417 => 'ky-ky_Latn/BGN', 418 => 'la-la_FONIPA', 419 => 'lt-Lower', 420 => 'lt-Title', 421 => 'lt-Upper', 422 => 'mk-mk_Latn/BGN', 423 => 'mn-mn_Latn/BGN', 424 => 'mn-mn_Latn/MNS', 425 => 'my-Zawgyi', 426 => 'my-am', 427 => 'my-ar', 428 => 'my-chr', 429 => 'my-fa', 430 => 'my-my_FONIPA', 431 => 'nl-Title', 432 => 'nv-nv_FONIPA', 433 => 'pl-am', 434 => 'pl-ar', 435 => 'pl-chr', 436 => 'pl-fa', 437 => 'pl-ja', 438 => 'pl-pl_FONIPA', 439 => 'pl_FONIPA-ja', 440 => 'ps-ps_Latn/BGN', 441 => 'rm_SURSILV-am', 442 => 'rm_SURSILV-ar', 443 => 'rm_SURSILV-chr', 444 => 'rm_SURSILV-fa', 445 => 'rm_SURSILV-rm_FONIPA_SURSILV', 446 => 'ro-am', 447 => 'ro-ar', 448 => 'ro-chr', 449 => 'ro-fa', 450 => 'ro-ja', 451 => 'ro-ro_FONIPA', 452 => 'ro_FONIPA-ja', 453 => 'ru-ja', 454 => 'ru-ru_Latn/BGN', 455 => 'ru-zh', 456 => 'ru_Latn-ru/BGN', 457 => 'sat-am', 458 => 'sat-ar', 459 => 'sat-chr', 460 => 'sat-fa', 461 => 'sat_Olck-sat_FONIPA', 462 => 'si-am', 463 => 'si-ar', 464 => 'si-chr', 465 => 'si-fa', 466 => 'si-si_FONIPA', 467 => 'si-si_Latn', 468 => 'sk-am', 469 => 'sk-ar', 470 => 'sk-chr', 471 => 'sk-fa', 472 => 'sk-ja', 473 => 'sk-sk_FONIPA', 474 => 'sk_FONIPA-ja', 475 => 'sr-sr_Latn/BGN', 476 => 'ta-ta_FONIPA', 477 => 'tk_Cyrl-tk/BGN', 478 => 'tlh-am', 479 => 'tlh-ar', 480 => 'tlh-chr', 481 => 'tlh-fa', 482 => 'tlh-tlh_FONIPA', 483 => 'tr-Lower', 484 => 'tr-Title', 485 => 'tr-Upper', 486 => 'ug-ug_FONIPA', 487 => 'uk-uk_Latn/BGN', 488 => 'und_FONIPA-ar', 489 => 'und_FONIPA-chr', 490 => 'und_FONIPA-fa', 491 => 'und_FONIPA-und_FONXSAMP', 492 => 'und_FONXSAMP-und_FONIPA', 493 => 'uz_Cyrl-uz/BGN', 494 => 'uz_Cyrl-uz_Latn', 495 => 'uz_Latn-uz_Cyrl', 496 => 'vec-vec_FONIPA', 497 => 'xh-am', 498 => 'xh-ar', 499 => 'xh-chr', 500 => 'xh-fa', 501 => 'xh-xh_FONIPA', 502 => 'yo-yo_BJ', 503 => 'zh_Latn_PINYIN-ru', 504 => 'zu-am', 505 => 'zu-ar', 506 => 'zu-chr', 507 => 'zu-fa', 508 => 'zu-zu_FONIPA', 509 => 'Any-Null', 510 => 'Any-Lower', 511 => 'Any-Upper', 512 => 'Any-Title', 513 => 'Any-Name', 514 => 'Name-Any', 515 => 'Any-Remove', 516 => 'Any-Hex/Unicode', 517 => 'Any-Hex/Java', 518 => 'Any-Hex/C', 519 => 'Any-Hex/XML', 520 => 'Any-Hex/XML10', 521 => 'Any-Hex/Perl', 522 => 'Any-Hex', 523 => 'Hex-Any/Unicode', 524 => 'Hex-Any/Java', 525 => 'Hex-Any/C', 526 => 'Hex-Any/XML', 527 => 'Hex-Any/XML10', 528 => 'Hex-Any/Perl', 529 => 'Hex-Any', 530 => 'Any-NFC', 531 => 'Any-NFKC', 532 => 'Any-NFD', 533 => 'Any-NFKD', 534 => 'Any-FCD', 535 => 'Any-FCC', 536 => 'Any-fa', 537 => 'Any-ar', 538 => 'Any-chr', 539 => 'Any-rm_FONIPA_SURSILV', 540 => 'Any-am', 541 => 'Any-Latn', 542 => 'Any-dv_Latn/BGN', 543 => 'Any-ro_FONIPA', 544 => 'Any-dsb_FONIPA', 545 => 'Any-Latin', 546 => 'Any-he_Latn/BGN', 547 => 'Any-el_Latn/BGN', 548 => 'Any-eo_FONIPA', 549 => 'Any-si_Latn', 550 => 'Any-si_FONIPA', 551 => 'Any-zh', 552 => 'Any-es_FONIPA', 553 => 'Any-sk_FONIPA', 554 => 'Any-und_FONIPA', 555 => 'Any-und_FONXSAMP', 556 => 'Any-az/BGN', 557 => 'Any-Deva', 558 => 'Any-Arab', 559 => 'Any-Telu', 560 => 'Any-Beng', 561 => 'Any-ur', 562 => 'Any-Orya', 563 => 'Any-Guru', 564 => 'Any-Taml', 565 => 'Any-Gujr', 566 => 'Any-Knda', 567 => 'Any-Armenian', 568 => 'Any-Thaana', 569 => 'Any-Hiragana', 570 => 'Any-Syriac', 571 => 'Any-Jamo', 572 => 'Any-Hangul', 573 => 'Any-Kannada', 574 => 'Any-Georgian', 575 => 'Any-Telugu', 576 => 'Any-Cyrillic', 577 => 'Any-Thai', 578 => 'Any-Oriya', 579 => 'Any-Bopomofo', 580 => 'Any-Malayalam', 581 => 'Any-Gurmukhi', 582 => 'Any-Gujarati', 583 => 'Any-Tamil', 584 => 'Any-Katakana', 585 => 'Any-Hebrew', 586 => 'Any-Bengali', 587 => 'Any-Arabic', 588 => 'Any-Greek', 589 => 'Any-Greek/UNGEGN', 590 => 'Any-Devanagari', 591 => 'Any-fa_FONIPA', 592 => 'Any-fa_Latn/BGN', 593 => 'Any-ta_FONIPA', 594 => 'Any-Mlym', 595 => 'Any-Any', 596 => 'Any-Hant', 597 => 'Any-Hans', 598 => 'Any-uz_Cyrl', 599 => 'Any-blt_FONIPA', 600 => 'Any-ug_FONIPA', 601 => 'Any-uk_Latn/BGN', 602 => 'Any-ha_NE', 603 => 'Any-hy_AREVMDA_FONIPA', 604 => 'Any-hy_FONIPA', 605 => 'Any-hy_Latn/BGN', 606 => 'Any-ia_FONIPA', 607 => 'Any-uz/BGN', 608 => 'Any-uz_Latn', 609 => 'Any-vec_FONIPA', 610 => 'Any-xh_FONIPA', 611 => 'Any-ka_Latn/BGN', 612 => 'Any-ka_Latn/BGN_1981', 613 => 'Any-kk_FONIPA', 614 => 'Any-kk_Latn/BGN', 615 => 'Any-yo_BJ', 616 => 'Any-ky_FONIPA', 617 => 'Any-ky_Latn/BGN', 618 => 'Any-la_FONIPA', 619 => 'Any-ru_Latn/BGN', 620 => 'Any-chr_FONIPA', 621 => 'Any-zu_FONIPA', 622 => 'Any-ru', 623 => 'Any-Geor', 624 => 'Any-Cyrl', 625 => 'Any-Armn', 626 => 'Any-Thaa', 627 => 'Any-Hebr', 628 => 'Any-Grek', 629 => 'Any-Grek/UNGEGN', 630 => 'Any-Syrc', 631 => 'Any-Hira', 632 => 'Any-Hang', 633 => 'Any-Kana', 634 => 'Any-Bopo', 635 => 'Any-mn_Latn/BGN', 636 => 'Any-mn_Latn/MNS', 637 => 'Any-my_FONIPA', 638 => 'Any-sr_Latn/BGN', 639 => 'Any-nv_FONIPA', 640 => 'Any-sat_FONIPA', 641 => 'Any-my', 642 => 'Any-am_FONIPA', 643 => 'Any-am_Latn/BGN', 644 => 'Any-ar_Latn/BGN', 645 => 'Any-mk_Latn/BGN', 646 => 'Any-be_Latn/BGN', 647 => 'Any-bg_Latn/BGN', 648 => 'Any-es_419_FONIPA', 649 => 'Any-pl_FONIPA', 650 => 'Any-ps_Latn/BGN', 651 => 'Any-tk/BGN', 652 => 'Any-ch_FONIPA', 653 => 'Any-cs_FONIPA', 654 => 'Any-cy_FONIPA'];