r esc_html if needed.
*/
function wp_pre_kses_less_than_callback( $matches ) {
if ( ! str_contains( $matches[0], '>' ) ) {
return esc_html( $matches[0] );
}
return $matches[0];
}
/**
* Removes non-allowable HTML from parsed block attribute values when filtering
* in the post context.
*
* @since 5.3.1
*
* @param string $content Content to be run through KSES.
* @param array[]|string $allowed_html An array of allowed HTML elements
* and attributes, or a context name
* such as 'post'.
* @param string[] $allowed_protocols Array of allowed URL protocols.
* @return string Filtered text to run through KSES.
*/
function wp_pre_kses_block_attributes( $content, $allowed_html, $allowed_protocols ) {
/*
* `filter_block_content` is expected to call `wp_kses`. Temporarily remove
* the filter to avoid recursion.
*/
remove_filter( 'pre_kses', 'wp_pre_kses_block_attributes', 10 );
$content = filter_block_content( $content, $allowed_html, $allowed_protocols );
add_filter( 'pre_kses', 'wp_pre_kses_block_attributes', 10, 3 );
return $content;
}
/**
* WordPress' implementation of PHP sprintf() with filters.
*
* @since 2.5.0
* @since 5.3.0 Formalized the existing and already documented `...$args` parameter
* by adding it to the function signature.
*
* @link https://www.php.net/sprintf
*
* @param string $pattern The string which formatted args are inserted.
* @param mixed ...$args Arguments to be formatted into the $pattern string.
* @return string The formatted string.
*/
function wp_sprintf( $pattern, ...$args ) {
$len = strlen( $pattern );
$start = 0;
$result = '';
$arg_index = 0;
while ( $len > $start ) {
// Last character: append and break.
if ( strlen( $pattern ) - 1 === $start ) {
$result .= substr( $pattern, -1 );
break;
}
// Literal %: append and continue.
if ( '%%' === substr( $pattern, $start, 2 ) ) {
$start += 2;
$result .= '%';
continue;
}
// Get fragment before next %.
$end = strpos( $pattern, '%', $start + 1 );
if ( false === $end ) {
$end = $len;
}
$fragment = substr( $pattern, $start, $end - $start );
// Fragment has a specifier.
if ( '%' === $pattern[ $start ] ) {
// Find numbered arguments or take the next one in order.
if ( preg_match( '/^%(\d+)\$/', $fragment, $matches ) ) {
$index = $matches[1] - 1; // 0-based array vs 1-based sprintf() arguments.
$arg = isset( $args[ $index ] ) ? $args[ $index ] : '';
$fragment = str_replace( "%{$matches[1]}$", '%', $fragment );
} else {
$arg = isset( $args[ $arg_index ] ) ? $args[ $arg_index ] : '';
++$arg_index;
}
/**
* Filters a fragment from the pattern passed to wp_sprintf().
*
* If the fragment is unchanged, then sprintf() will be run on the fragment.
*
* @since 2.5.0
*
* @param string $fragment A fragment from the pattern.
* @param string $arg The argument.
*/
$_fragment = apply_filters( 'wp_sprintf', $fragment, $arg );
if ( $_fragment !== $fragment ) {
$fragment = $_fragment;
} else {
$fragment = sprintf( $fragment, (string) $arg );
}
}
// Append to result and move to next fragment.
$result .= $fragment;
$start = $end;
}
return $result;
}
/**
* Localizes list items before the rest of the content.
*
* The '%l' must be at the first characters can then contain the rest of the
* content. The list items will have ', ', ', and', and ' and ' added depending
* on the amount of list items in the $args parameter.
*
* @since 2.5.0
*
* @param string $pattern Content containing '%l' at the beginning.
* @param array $args List items to prepend to the content and replace '%l'.
* @return string Localized list items and rest of the content.
*/
function wp_sprintf_l( $pattern, $args ) {
// Not a match.
if ( ! str_starts_with( $pattern, '%l' ) ) {
return $pattern;
}
// Nothing to work with.
if ( empty( $args ) ) {
return '';
}
/**
* Filters the translated delimiters used by wp_sprintf_l().
* Placeholders (%s) are included to assist translators and then
* removed before the array of strings reaches the filter.
*
* Please note: Ampersands and entities should be avoided here.
*
* @since 2.5.0
*
* @param array $delimiters An array of translated delimiters.
*/
$l = apply_filters(
'wp_sprintf_l',
array(
/* translators: Used to join items in a list with more than 2 items. */
'between' => sprintf( __( '%1$s, %2$s' ), '', '' ),
/* translators: Used to join last two items in a list with more than 2 times. */
'between_last_two' => sprintf( __( '%1$s, and %2$s' ), '', '' ),
/* translators: Used to join items in a list with only 2 items. */
'between_only_two' => sprintf( __( '%1$s and %2$s' ), '', '' ),
)
);
$args = (array) $args;
$result = array_shift( $args );
if ( count( $args ) === 1 ) {
$result .= $l['between_only_two'] . array_shift( $args );
}
// Loop when more than two args.
$i = count( $args );
while ( $i ) {
$arg = array_shift( $args );
--$i;
if ( 0 === $i ) {
$result .= $l['between_last_two'] . $arg;
} else {
$result .= $l['between'] . $arg;
}
}
return $result . substr( $pattern, 2 );
}
/**
* Safely extracts not more than the first $count characters from HTML string.
*
* UTF-8, tags and entities safe prefix extraction. Entities inside will *NOT*
* be counted as one character. For example & will be counted as 4, < as
* 3, etc.
*
* @since 2.5.0
*
* @param string $str String to get the excerpt from.
* @param int $count Maximum number of characters to take.
* @param string $more Optional. What to append if $str needs to be trimmed. Defaults to empty string.
* @return string The excerpt.
*/
function wp_html_excerpt( $str, $count, $more = null ) {
if ( null === $more ) {
$more = '';
}
$str = wp_strip_all_tags( $str, true );
$excerpt = mb_substr( $str, 0, $count );
// Remove part of an entity at the end.
$excerpt = preg_replace( '/&[^;\s]{0,6}$/', '', $excerpt );
if ( $str !== $excerpt ) {
$excerpt = trim( $excerpt ) . $more;
}
return $excerpt;
}
/**
* Adds a base URL to relative links in passed content.
*
* By default, this function supports the 'src' and 'href' attributes.
* However, this can be modified via the `$attrs` parameter.
*
* @since 2.7.0
*
* @global string $_links_add_base
*
* @param string $content String to search for links in.
* @param string $base The base URL to prefix to links.
* @param string[] $attrs The attributes which should be processed.
* @return string The processed content.
*/
function links_add_base_url( $content, $base, $attrs = array( 'src', 'href' ) ) {
global $_links_add_base;
$_links_add_base = $base;
$attrs = implode( '|', (array) $attrs );
return preg_replace_callback( "!($attrs)=(['\"])(.+?)\\2!i", '_links_add_base', $content );
}
/**
* Callback to add a base URL to relative links in passed content.
*
* @since 2.7.0
* @access private
*
* @global string $_links_add_base
*
* @param string $m The matched link.
* @return string The processed link.
*/
function _links_add_base( $m ) {
global $_links_add_base;
// 1 = attribute name 2 = quotation mark 3 = URL.
return $m[1] . '=' . $m[2] .
( preg_match( '#^(\w{1,20}):#', $m[3], $protocol ) && in_array( $protocol[1], wp_allowed_protocols(), true ) ?
$m[3] :
WP_Http::make_absolute_url( $m[3], $_links_add_base )
)
. $m[2];
}
/**
* Adds a target attribute to all links in passed content.
*
* By default, this function only applies to `` tags.
* However, this can be modified via the `$tags` parameter.
*
* *NOTE:* Any current target attribute will be stripped and replaced.
*
* @since 2.7.0
*
* @global string $_links_add_target
*
* @param string $content String to search for links in.
* @param string $target The target to add to the links.
* @param string[] $tags An array of tags to apply to.
* @return string The processed content.
*/
function links_add_target( $content, $target = '_blank', $tags = array( 'a' ) ) {
global $_links_add_target;
$_links_add_target = $target;
$tags = implode( '|', (array) $tags );
return preg_replace_callback( "!<($tags)((\s[^>]*)?)>!i", '_links_add_target', $content );
}
/**
* Callback to add a target attribute to all links in passed content.
*
* @since 2.7.0
* @access private
*
* @global string $_links_add_target
*
* @param string $m The matched link.
* @return string The processed link.
*/
function _links_add_target( $m ) {
global $_links_add_target;
$tag = $m[1];
$link = preg_replace( '|( target=([\'"])(.*?)\2)|i', '', $m[2] );
return '<' . $tag . $link . ' target="' . esc_attr( $_links_add_target ) . '">';
}
/**
* Normalizes EOL characters and strips duplicate whitespace.
*
* @since 2.7.0
*
* @param string $str The string to normalize.
* @return string The normalized string.
*/
function normalize_whitespace( $str ) {
$str = trim( $str );
$str = str_replace( "\r", "\n", $str );
$str = preg_replace( array( '/\n+/', '/[ \t]+/' ), array( "\n", ' ' ), $str );
return $str;
}
/**
* Properly strips all HTML tags including 'script' and 'style'.
*
* This differs from strip_tags() because it removes the contents of
* the `' )`
* will return 'something'. wp_strip_all_tags() will return an empty string.
*
* @since 2.9.0
*
* @param string $text String containing HTML tags
* @param bool $remove_breaks Optional. Whether to remove left over line breaks and white space chars
* @return string The processed string.
*/
function wp_strip_all_tags( $text, $remove_breaks = false ) {
if ( is_null( $text ) ) {
return '';
}
if ( ! is_scalar( $text ) ) {
/*
* To maintain consistency with pre-PHP 8 error levels,
* wp_trigger_error() is used to trigger an E_USER_WARNING,
* rather than _doing_it_wrong(), which triggers an E_USER_NOTICE.
*/
wp_trigger_error(
'',
sprintf(
/* translators: 1: The function name, 2: The argument number, 3: The argument name, 4: The expected type, 5: The provided type. */
__( 'Warning: %1$s expects parameter %2$s (%3$s) to be a %4$s, %5$s given.' ),
__FUNCTION__,
'#1',
'$text',
'string',
gettype( $text )
),
E_USER_WARNING
);
return '';
}
$text = preg_replace( '@<(script|style)[^>]*?>.*?\\1>@si', '', $text );
$text = strip_tags( $text );
if ( $remove_breaks ) {
$text = preg_replace( '/[\r\n\t ]+/', ' ', $text );
}
return trim( $text );
}
/**
* Sanitizes a string from user input or from the database.
*
* - Checks for invalid UTF-8,
* - Converts single `<` characters to entities
* - Strips all tags
* - Removes line breaks, tabs, and extra whitespace
* - Strips percent-encoded characters
*
* @since 2.9.0
*
* @see sanitize_textarea_field()
* @see wp_check_invalid_utf8()
* @see wp_strip_all_tags()
*
* @param string $str String to sanitize.
* @return string Sanitized string.
*/
function sanitize_text_field( $str ) {
$filtered = _sanitize_text_fields( $str, false );
/**
* Filters a sanitized text field string.
*
* @since 2.9.0
*
* @param string $filtered The sanitized string.
* @param string $str The string prior to being sanitized.
*/
return apply_filters( 'sanitize_text_field', $filtered, $str );
}
/**
* Sanitizes a multiline string from user input or from the database.
*
* The function is like sanitize_text_field(), but preserves
* new lines (\n) and other whitespace, which are legitimate
* input in textarea elements.
*
* @see sanitize_text_field()
*
* @since 4.7.0
*
* @param string $str String to sanitize.
* @return string Sanitized string.
*/
function sanitize_textarea_field( $str ) {
$filtered = _sanitize_text_fields( $str, true );
/**
* Filters a sanitized textarea field string.
*
* @since 4.7.0
*
* @param string $filtered The sanitized string.
* @param string $str The string prior to being sanitized.
*/
return apply_filters( 'sanitize_textarea_field', $filtered, $str );
}
/**
* Internal helper function to sanitize a string from user input or from the database.
*
* @since 4.7.0
* @access private
*
* @param string $str String to sanitize.
* @param bool $keep_newlines Optional. Whether to keep newlines. Default: false.
* @return string Sanitized string.
*/
function _sanitize_text_fields( $str, $keep_newlines = false ) {
if ( is_object( $str ) || is_array( $str ) ) {
return '';
}
$str = (string) $str;
$filtered = wp_check_invalid_utf8( $str );
if ( str_contains( $filtered, '<' ) ) {
$filtered = wp_pre_kses_less_than( $filtered );
// This will strip extra whitespace for us.
$filtered = wp_strip_all_tags( $filtered, false );
/*
* Use HTML entities in a special case to make sure that
* later newline stripping stages cannot lead to a functional tag.
*/
$filtered = str_replace( "<\n", "<\n", $filtered );
}
if ( ! $keep_newlines ) {
$filtered = preg_replace( '/[\r\n\t ]+/', ' ', $filtered );
}
$filtered = trim( $filtered );
// Remove percent-encoded characters.
$found = false;
while ( preg_match( '/%[a-f0-9]{2}/i', $filtered, $match ) ) {
$filtered = str_replace( $match[0], '', $filtered );
$found = true;
}
if ( $found ) {
// Strip out the whitespace that may now exist after removing percent-encoded characters.
$filtered = trim( preg_replace( '/ +/', ' ', $filtered ) );
}
return $filtered;
}
/**
* i18n-friendly version of basename().
*
* @since 3.1.0
*
* @param string $path A path.
* @param string $suffix If the filename ends in suffix this will also be cut off.
* @return string
*/
function wp_basename( $path, $suffix = '' ) {
return urldecode( basename( str_replace( array( '%2F', '%5C' ), '/', urlencode( $path ) ), $suffix ) );
}
// phpcs:disable WordPress.WP.CapitalPDangit.MisspelledInComment,WordPress.WP.CapitalPDangit.MisspelledInText,WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid -- 8-)
/**
* Forever eliminate "Wordpress" from the planet (or at least the little bit we can influence).
*
* Violating our coding standards for a good function name.
*
* @since 3.0.0
*
* @param string $text The text to be modified.
* @return string The modified text.
*/
function capital_P_dangit( $text ) {
// Simple replacement for titles.
$current_filter = current_filter();
if ( 'the_title' === $current_filter || 'wp_title' === $current_filter ) {
return str_replace( 'Wordpress', 'WordPress', $text );
}
// Still here? Use the more judicious replacement.
static $dblq = false;
if ( false === $dblq ) {
$dblq = _x( '“', 'opening curly double quote' );
}
return str_replace(
array( ' Wordpress', '‘Wordpress', $dblq . 'Wordpress', '>Wordpress', '(Wordpress' ),
array( ' WordPress', '‘WordPress', $dblq . 'WordPress', '>WordPress', '(WordPress' ),
$text
);
}
// phpcs:enable
/**
* Sanitizes a mime type
*
* @since 3.1.3
*
* @param string $mime_type Mime type.
* @return string Sanitized mime type.
*/
function sanitize_mime_type( $mime_type ) {
$sani_mime_type = preg_replace( '/[^-+*.a-zA-Z0-9\/]/', '', $mime_type );
/**
* Filters a mime type following sanitization.
*
* @since 3.1.3
*
* @param string $sani_mime_type The sanitized mime type.
* @param string $mime_type The mime type prior to sanitization.
*/
return apply_filters( 'sanitize_mime_type', $sani_mime_type, $mime_type );
}
/**
* Sanitizes space or carriage return separated URLs that are used to send trackbacks.
*
* @since 3.4.0
*
* @param string $to_ping Space or carriage return separated URLs
* @return string URLs starting with the http or https protocol, separated by a carriage return.
*/
function sanitize_trackback_urls( $to_ping ) {
$urls_to_ping = preg_split( '/[\r\n\t ]/', trim( $to_ping ), -1, PREG_SPLIT_NO_EMPTY );
foreach ( $urls_to_ping as $k => $url ) {
if ( ! preg_match( '#^https?://.#i', $url ) ) {
unset( $urls_to_ping[ $k ] );
}
}
$urls_to_ping = array_map( 'sanitize_url', $urls_to_ping );
$urls_to_ping = implode( "\n", $urls_to_ping );
/**
* Filters a list of trackback URLs following sanitization.
*
* The string returned here consists of a space or carriage return-delimited list
* of trackback URLs.
*
* @since 3.4.0
*
* @param string $urls_to_ping Sanitized space or carriage return separated URLs.
* @param string $to_ping Space or carriage return separated URLs before sanitization.
*/
return apply_filters( 'sanitize_trackback_urls', $urls_to_ping, $to_ping );
}
/**
* Adds slashes to a string or recursively adds slashes to strings within an array.
*
* This should be used when preparing data for core API that expects slashed data.
* This should not be used to escape data going directly into an SQL query.
*
* @since 3.6.0
* @since 5.5.0 Non-string values are left untouched.
*
* @param string|array $value String or array of data to slash.
* @return string|array Slashed `$value`, in the same type as supplied.
*/
function wp_slash( $value ) {
if ( is_array( $value ) ) {
$value = array_map( 'wp_slash', $value );
}
if ( is_string( $value ) ) {
return addslashes( $value );
}
return $value;
}
/**
* Removes slashes from a string or recursively removes slashes from strings within an array.
*
* This should be used to remove slashes from data passed to core API that
* expects data to be unslashed.
*
* @since 3.6.0
*
* @param string|array $value String or array of data to unslash.
* @return string|array Unslashed `$value`, in the same type as supplied.
*/
function wp_unslash( $value ) {
return stripslashes_deep( $value );
}
/**
* Extracts and returns the first URL from passed content.
*
* @since 3.6.0
*
* @param string $content A string which might contain a URL.
* @return string|false The found URL.
*/
function get_url_in_content( $content ) {
if ( empty( $content ) ) {
return false;
}
if ( preg_match( '/]*?href=([\'"])(.+?)\1/is', $content, $matches ) ) {
return sanitize_url( $matches[2] );
}
return false;
}
/**
* Returns the regexp for common whitespace characters.
*
* By default, spaces include new lines, tabs, nbsp entities, and the UTF-8 nbsp.
* This is designed to replace the PCRE \s sequence. In ticket #22692, that
* sequence was found to be unreliable due to random inclusion of the A0 byte.
*
* @since 4.0.0
*
* @return string The spaces regexp.
*/
function wp_spaces_regexp() {
static $spaces = '';
if ( empty( $spaces ) ) {
/**
* Filters the regexp for common whitespace characters.
*
* This string is substituted for the \s sequence as needed in regular
* expressions. For websites not written in English, different characters
* may represent whitespace. For websites not encoded in UTF-8, the 0xC2 0xA0
* sequence may not be in use.
*
* @since 4.0.0
*
* @param string $spaces Regexp pattern for matching common whitespace characters.
*/
$spaces = apply_filters( 'wp_spaces_regexp', '[\r\n\t ]|\xC2\xA0| ' );
}
return $spaces;
}
/**
* Enqueues the important emoji-related styles.
*
* @since 6.4.0
*/
function wp_enqueue_emoji_styles() {
// Back-compat for plugins that disable functionality by unhooking this action.
$action = is_admin() ? 'admin_print_styles' : 'wp_print_styles';
if ( ! has_action( $action, 'print_emoji_styles' ) ) {
return;
}
remove_action( $action, 'print_emoji_styles' );
$emoji_styles = '
img.wp-smiley, img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 0.07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}';
$handle = 'wp-emoji-styles';
wp_register_style( $handle, false );
wp_add_inline_style( $handle, $emoji_styles );
wp_enqueue_style( $handle );
}
/**
* Prints the inline Emoji detection script if it is not already printed.
*
* @since 4.2.0
*/
function print_emoji_detection_script() {
static $printed = false;
if ( $printed ) {
return;
}
$printed = true;
_print_emoji_detection_script();
}
/**
* Prints inline Emoji detection script.
*
* @ignore
* @since 4.6.0
* @access private
*/
function _print_emoji_detection_script() {
$settings = array(
/**
* Filters the URL where emoji png images are hosted.
*
* @since 4.2.0
*
* @param string $url The emoji base URL for png images.
*/
'baseUrl' => apply_filters( 'emoji_url', 'https://s.w.org/images/core/emoji/15.0.3/72x72/' ),
/**
* Filters the extension of the emoji png files.
*
* @since 4.2.0
*
* @param string $extension The emoji extension for png files. Default .png.
*/
'ext' => apply_filters( 'emoji_ext', '.png' ),
/**
* Filters the URL where emoji SVG images are hosted.
*
* @since 4.6.0
*
* @param string $url The emoji base URL for svg images.
*/
'svgUrl' => apply_filters( 'emoji_svg_url', 'https://s.w.org/images/core/emoji/15.0.3/svg/' ),
/**
* Filters the extension of the emoji SVG files.
*
* @since 4.6.0
*
* @param string $extension The emoji extension for svg files. Default .svg.
*/
'svgExt' => apply_filters( 'emoji_svg_ext', '.svg' ),
);
$version = 'ver=' . get_bloginfo( 'version' );
if ( SCRIPT_DEBUG ) {
$settings['source'] = array(
/** This filter is documented in wp-includes/class-wp-scripts.php */
'wpemoji' => apply_filters( 'script_loader_src', includes_url( "js/wp-emoji.js?$version" ), 'wpemoji' ),
/** This filter is documented in wp-includes/class-wp-scripts.php */
'twemoji' => apply_filters( 'script_loader_src', includes_url( "js/twemoji.js?$version" ), 'twemoji' ),
);
} else {
$settings['source'] = array(
/** This filter is documented in wp-includes/class-wp-scripts.php */
'concatemoji' => apply_filters( 'script_loader_src', includes_url( "js/wp-emoji-release.min.js?$version" ), 'concatemoji' ),
);
}
wp_print_inline_script_tag(
sprintf( 'window._wpemojiSettings = %s;', wp_json_encode( $settings ) ) . "\n" .
file_get_contents( ABSPATH . WPINC . '/js/wp-emoji-loader' . wp_scripts_get_suffix() . '.js' )
);
}
/**
* Converts emoji characters to their equivalent HTML entity.
*
* This allows us to store emoji in a DB using the utf8 character set.
*
* @since 4.2.0
*
* @param string $content The content to encode.
* @return string The encoded content.
*/
function wp_encode_emoji( $content ) {
$emoji = _wp_emoji_list( 'partials' );
foreach ( $emoji as $emojum ) {
$emoji_char = html_entity_decode( $emojum );
if ( str_contains( $content, $emoji_char ) ) {
$content = preg_replace( "/$emoji_char/", $emojum, $content );
}
}
return $content;
}
/**
* Converts emoji to a static img element.
*
* @since 4.2.0
*
* @param string $text The content to encode.
* @return string The encoded content.
*/
function wp_staticize_emoji( $text ) {
if ( ! str_contains( $text, '' ) ) {
if ( ( function_exists( 'mb_check_encoding' ) && mb_check_encoding( $text, 'ASCII' ) ) || ! preg_match( '/[^\x00-\x7F]/', $text ) ) {
// The text doesn't contain anything that might be emoji, so we can return early.
return $text;
} else {
$encoded_text = wp_encode_emoji( $text );
if ( $encoded_text === $text ) {
return $encoded_text;
}
$text = $encoded_text;
}
}
$emoji = _wp_emoji_list( 'entities' );
// Quickly narrow down the list of emoji that might be in the text and need replacing.
$possible_emoji = array();
foreach ( $emoji as $emojum ) {
if ( str_contains( $text, $emojum ) ) {
$possible_emoji[ $emojum ] = html_entity_decode( $emojum );
}
}
if ( ! $possible_emoji ) {
return $text;
}
/** This filter is documented in wp-includes/formatting.php */
$cdn_url = apply_filters( 'emoji_url', 'https://s.w.org/images/core/emoji/15.0.3/72x72/' );
/** This filter is documented in wp-includes/formatting.php */
$ext = apply_filters( 'emoji_ext', '.png' );
$output = '';
/*
* HTML loop taken from smiley function, which was taken from texturize function.
* It'll never be consolidated.
*
* First, capture the tags as well as in between.
*/
$textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE );
$stop = count( $textarr );
// Ignore processing of specific tags.
$tags_to_ignore = 'code|pre|style|script|textarea';
$ignore_block_element = '';
for ( $i = 0; $i < $stop; $i++ ) {
$content = $textarr[ $i ];
// If we're in an ignore block, wait until we find its closing tag.
if ( '' === $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')>/', $content, $matches ) ) {
$ignore_block_element = $matches[1];
}
// If it's not a tag and not in ignore block.
if ( '' === $ignore_block_element && strlen( $content ) > 0 && '<' !== $content[0] && str_contains( $content, '' ) ) {
foreach ( $possible_emoji as $emojum => $emoji_char ) {
if ( ! str_contains( $content, $emojum ) ) {
continue;
}
$file = str_replace( ';', '-', $emojum );
$file = str_replace( array( '', ';' ), '', $file );
$entity = sprintf( '', $cdn_url . $file . $ext, $emoji_char );
$content = str_replace( $emojum, $entity, $content );
}
}
// Did we exit ignore block?
if ( '' !== $ignore_block_element && '' . $ignore_block_element . '>' === $content ) {
$ignore_block_element = '';
}
$output .= $content;
}
// Finally, remove any stray U+FE0F characters.
$output = str_replace( '️', '', $output );
return $output;
}
/**
* Converts emoji in emails into static images.
*
* @since 4.2.0
*
* @param array $mail The email data array.
* @return array The email data array, with emoji in the message staticized.
*/
function wp_staticize_emoji_for_email( $mail ) {
if ( ! isset( $mail['message'] ) ) {
return $mail;
}
/*
* We can only transform the emoji into images if it's a `text/html` email.
* To do that, here's a cut down version of the same process that happens
* in wp_mail() - get the `Content-Type` from the headers, if there is one,
* then pass it through the {@see 'wp_mail_content_type'} filter, in case
* a plugin is handling changing the `Content-Type`.
*/
$headers = array();
if ( isset( $mail['headers'] ) ) {
if ( is_array( $mail['headers'] ) ) {
$headers = $mail['headers'];
} else {
$headers = explode( "\n", str_replace( "\r\n", "\n", $mail['headers'] ) );
}
}
foreach ( $headers as $header ) {
if ( ! str_contains( $header, ':' ) ) {
continue;
}
// Explode them out.
list( $name, $content ) = explode( ':', trim( $header ), 2 );
// Cleanup crew.
$name = trim( $name );
$content = trim( $content );
if ( 'content-type' === strtolower( $name ) ) {
if ( str_contains( $content, ';' ) ) {
list( $type, $charset ) = explode( ';', $content );
$content_type = trim( $type );
} else {
$content_type = trim( $content );
}
break;
}
}
// Set Content-Type if we don't have a content-type from the input headers.
if ( ! isset( $content_type ) ) {
$content_type = 'text/plain';
}
/** This filter is documented in wp-includes/pluggable.php */
$content_type = apply_filters( 'wp_mail_content_type', $content_type );
if ( 'text/html' === $content_type ) {
$mail['message'] = wp_staticize_emoji( $mail['message'] );
}
return $mail;
}
/**
* Returns arrays of emoji data.
*
* These arrays are automatically built from the regex in twemoji.js - if they need to be updated,
* you should update the regex there, then run the `npm run grunt precommit:emoji` job.
*
* @since 4.9.0
* @access private
*
* @param string $type Optional. Which array type to return. Accepts 'partials' or 'entities', default 'entities'.
* @return array An array to match all emoji that WordPress recognises.
*/
function _wp_emoji_list( $type = 'entities' ) {
// Do not remove the START/END comments - they're used to find where to insert the arrays.
// START: emoji arrays
$entities = array( '👨🏻❤️💋👨🏻', '👨🏻❤️💋👨🏼', '👨🏻❤️💋👨🏽', '👨🏻❤️💋👨🏾', '👨🏻❤️💋👨🏿', '👨🏼❤️💋👨🏻', '👨🏼❤️💋👨🏼', '👨🏼❤️💋👨🏽', '👨🏼❤️💋👨🏾', '👨🏼❤️💋👨🏿', '👨🏽❤️💋👨🏻', '👨🏽❤️💋👨🏼', '👨🏽❤️💋👨🏽', '👨🏽❤️💋👨🏾', '👨🏽❤️💋👨🏿', '👨🏾❤️💋👨🏻', '👨🏾❤️💋👨🏼', '👨🏾❤️💋👨🏽', '👨🏾❤️💋👨🏾', '👨🏾❤️💋👨🏿', '👨🏿❤️💋👨🏻', '👨🏿❤️💋👨🏼', '👨🏿❤️💋👨🏽', '👨🏿❤️💋👨🏾', '👨🏿❤️💋👨🏿', '👩🏻❤️💋👨🏻', '👩🏻❤️💋👨🏼', '👩🏻❤️💋👨🏽', '👩🏻❤️💋👨🏾', '👩🏻❤️💋👨🏿', '👩🏻❤️💋👩🏻', '👩🏻❤️💋👩🏼', '👩🏻❤️💋👩🏽', '👩🏻❤️💋👩🏾', '👩🏻❤️💋👩🏿', '👩🏼❤️💋👨🏻', '👩🏼❤️💋👨🏼', '👩🏼❤️💋👨🏽', '👩🏼❤️💋👨🏾', '👩🏼❤️💋👨🏿', '👩🏼❤️💋👩🏻', '👩🏼❤️💋👩🏼', '👩🏼❤️💋👩🏽', '👩🏼❤️💋👩🏾', '👩🏼❤️💋👩🏿', '👩🏽❤️💋👨🏻', '👩🏽❤️💋👨🏼', '👩🏽❤️💋👨🏽', '👩🏽❤️💋👨🏾', '👩🏽❤️💋👨🏿', '👩🏽❤️💋👩🏻', '👩🏽❤️💋👩🏼', '👩🏽❤️💋👩🏽', '👩🏽❤️💋👩🏾', '👩🏽❤️💋👩🏿', '👩🏾❤️💋👨🏻', '👩🏾❤️💋👨🏼', '👩🏾❤️💋👨🏽', '👩🏾❤️💋👨🏾', '👩🏾❤️💋👨🏿', '👩🏾❤️💋👩🏻', '👩🏾❤️💋👩🏼', '👩🏾❤️💋👩🏽', '👩🏾❤️💋👩🏾', '👩🏾❤️💋👩🏿', '👩🏿❤️💋👨🏻', '👩🏿❤️💋👨🏼', '👩🏿❤️💋👨🏽', '👩🏿❤️💋👨🏾', '👩🏿❤️💋👨🏿', '👩🏿❤️💋👩🏻', '👩🏿❤️💋👩🏼', '👩🏿❤️💋👩🏽', '👩🏿❤️💋👩🏾', '👩🏿❤️💋👩🏿', '🧑🏻❤️💋🧑🏼', '🧑🏻❤️💋🧑🏽', '🧑🏻❤️💋🧑🏾', '🧑🏻❤️💋🧑🏿', '🧑🏼❤️💋🧑🏻', '🧑🏼❤️💋🧑🏽', '🧑🏼❤️💋🧑🏾', '🧑🏼❤️💋🧑🏿', '🧑🏽❤️💋🧑🏻', '🧑🏽❤️💋🧑🏼', '🧑🏽❤️💋🧑🏾', '🧑🏽❤️💋🧑🏿', '🧑🏾❤️💋🧑🏻', '🧑🏾❤️💋🧑🏼', '🧑🏾❤️💋🧑🏽', '🧑🏾❤️💋🧑🏿', '🧑🏿❤️💋🧑🏻', '🧑🏿❤️💋🧑🏼', '🧑🏿❤️💋🧑🏽', '🧑🏿❤️💋🧑🏾', '👨🏻❤️👨🏻', '👨🏻❤️👨🏼', '👨🏻❤️👨🏽', '👨🏻❤️👨🏾', '👨🏻❤️👨🏿', '👨🏼❤️👨🏻', '👨🏼❤️👨🏼', '👨🏼❤️👨🏽', '👨🏼❤️👨🏾', '👨🏼❤️👨🏿', '👨🏽❤️👨🏻', '👨🏽❤️👨🏼', '👨🏽❤️👨🏽', '👨🏽❤️👨🏾', '👨🏽❤️👨🏿', '👨🏾❤️👨🏻', '👨🏾❤️👨🏼', '👨🏾❤️👨🏽', '👨🏾❤️👨🏾', '👨🏾❤️👨🏿', '👨🏿❤️👨🏻', '👨🏿❤️👨🏼', '👨🏿❤️👨🏽', '👨🏿❤️👨🏾', '👨🏿❤️👨🏿', '👩🏻❤️👨🏻', '👩🏻❤️👨🏼', '👩🏻❤️👨🏽', '👩🏻❤️👨🏾', '👩🏻❤️👨🏿', '👩🏻❤️👩🏻', '👩🏻❤️👩🏼', '👩🏻❤️👩🏽', '👩🏻❤️👩🏾', '👩🏻❤️👩🏿', '👩🏼❤️👨🏻', '👩🏼❤️👨🏼', '👩🏼❤️👨🏽', '👩🏼❤️👨🏾', '👩🏼❤️👨🏿', '👩🏼❤️👩🏻', '👩🏼❤️👩🏼', '👩🏼❤️👩🏽', '👩🏼❤️👩🏾', '👩🏼❤️👩🏿', '👩🏽❤️👨🏻', '👩🏽❤️👨🏼', '👩🏽❤️👨🏽', '👩🏽❤️👨🏾', '👩🏽❤️👨🏿', '👩🏽❤️👩🏻', '👩🏽❤️👩🏼', '👩🏽❤️👩🏽', '👩🏽❤️👩🏾', '👩🏽❤️👩🏿', '👩🏾❤️👨🏻', '👩🏾❤️👨🏼', '👩🏾❤️👨🏽', '👩🏾❤️👨🏾', '👩🏾❤️👨🏿', '👩🏾❤️👩🏻', '👩🏾❤️👩🏼', '👩🏾❤️👩🏽', '👩🏾❤️👩🏾', '👩🏾❤️👩🏿', '👩🏿❤️👨🏻', '👩🏿❤️👨🏼', '👩🏿❤️👨🏽', '👩🏿❤️👨🏾', '👩🏿❤️👨🏿', '👩🏿❤️👩🏻', '👩🏿❤️👩🏼', '👩🏿❤️👩🏽', '👩🏿❤️👩🏾', '👩🏿❤️👩🏿', '🧑🏻❤️🧑🏼', '🧑🏻❤️🧑🏽', '🧑🏻❤️🧑🏾', '🧑🏻❤️🧑🏿', '🧑🏼❤️🧑🏻', '🧑🏼❤️🧑🏽', '🧑🏼❤️🧑🏾', '🧑🏼❤️🧑🏿', '🧑🏽❤️🧑🏻', '🧑🏽❤️🧑🏼', '🧑🏽❤️🧑🏾', '🧑🏽❤️🧑🏿', '🧑🏾❤️🧑🏻', '🧑🏾❤️🧑🏼', '🧑🏾❤️🧑🏽', '🧑🏾❤️🧑🏿', '🧑🏿❤️🧑🏻', '🧑🏿❤️🧑🏼', '🧑🏿❤️🧑🏽', '🧑🏿❤️🧑🏾', '👨❤️💋👨', '👩❤️💋👨', '👩❤️💋👩', '🏴', '🏴', '🏴', '👨🏻🤝👨🏼', '👨🏻🤝👨🏽', '👨🏻🤝👨🏾', '👨🏻🤝👨🏿', '👨🏼🤝👨🏻', '👨🏼🤝👨🏽', '👨🏼🤝👨🏾', '👨🏼🤝👨🏿', '👨🏽🤝👨🏻', '👨🏽🤝👨🏼', '👨🏽🤝👨🏾', '👨🏽🤝👨🏿', '👨🏾🤝👨🏻', '👨🏾🤝👨🏼', '👨🏾🤝👨🏽', '👨🏾🤝👨🏿', '👨🏿🤝👨🏻', '👨🏿🤝👨🏼', '👨🏿🤝👨🏽', '👨🏿🤝👨🏾', '👩🏻🤝👨🏼', '👩🏻🤝👨🏽', '👩🏻🤝👨🏾', '👩🏻🤝👨🏿', '👩🏻🤝👩🏼', '👩🏻🤝👩🏽', '👩🏻🤝👩🏾', '👩🏻🤝👩🏿', '👩🏼🤝👨🏻', '👩🏼🤝👨🏽', '👩🏼🤝👨🏾', '👩🏼🤝👨🏿', '👩🏼🤝👩🏻', '👩🏼🤝👩🏽', '👩🏼🤝👩🏾', '👩🏼🤝👩🏿', '👩🏽🤝👨🏻', '👩🏽🤝👨🏼', '👩🏽🤝👨🏾', '👩🏽🤝👨🏿', '👩🏽🤝👩🏻', '👩🏽🤝👩🏼', '👩🏽🤝👩🏾', '👩🏽🤝👩🏿', '👩🏾🤝👨🏻', '👩🏾🤝👨🏼', '👩🏾🤝👨🏽', '👩🏾🤝👨🏿', '👩🏾🤝👩🏻', '👩🏾🤝👩🏼', '👩🏾🤝👩🏽', '👩🏾🤝👩🏿', '👩🏿🤝👨🏻', '👩🏿🤝👨🏼', '👩🏿🤝👨🏽', '👩🏿🤝👨🏾', '👩🏿🤝👩🏻', '👩🏿🤝👩🏼', '👩🏿🤝👩🏽', '👩🏿🤝👩🏾', '🧑🏻🤝🧑🏻', '🧑🏻🤝🧑🏼', '🧑🏻🤝🧑🏽', '🧑🏻🤝🧑🏾', '🧑🏻🤝🧑🏿', '🧑🏼🤝🧑🏻', '🧑🏼🤝🧑🏼', '🧑🏼🤝🧑🏽', '🧑🏼🤝🧑🏾', '🧑🏼🤝🧑🏿', '🧑🏽🤝🧑🏻', '🧑🏽🤝🧑🏼', '🧑🏽🤝🧑🏽', '🧑🏽🤝🧑🏾', '🧑🏽🤝🧑🏿', '🧑🏾🤝🧑🏻', '🧑🏾🤝🧑🏼', '🧑🏾🤝🧑🏽', '🧑🏾🤝🧑🏾', '🧑🏾🤝🧑🏿', '🧑🏿🤝🧑🏻', '🧑🏿🤝🧑🏼', '🧑🏿🤝🧑🏽', '🧑🏿🤝🧑🏾', '🧑🏿🤝🧑🏿', '👨👨👦👦', '👨👨👧👦', '👨👨👧👧', '👨👩👦👦', '👨👩👧👦', '👨👩👧👧', '👩👩👦👦', '👩👩👧👦', '👩👩👧👧', '👨❤️👨', '👩❤️👨', '👩❤️👩', '🫱🏻🫲🏼', '🫱🏻🫲🏽', '🫱🏻🫲🏾', '🫱🏻🫲🏿', '🫱🏼🫲🏻', '🫱🏼🫲🏽', '🫱🏼🫲🏾', '🫱🏼🫲🏿', '🫱🏽🫲🏻', '🫱🏽🫲🏼', '🫱🏽🫲🏾', '🫱🏽🫲🏿', '🫱🏾🫲🏻', '🫱🏾🫲🏼', '🫱🏾🫲🏽', '🫱🏾🫲🏿', '🫱🏿🫲🏻', '🫱🏿🫲🏼', '🫱🏿🫲🏽', '🫱🏿🫲🏾', '👨👦👦', '👨👧👦', '👨👧👧', '👨👨👦', '👨👨👧', '👨👩👦', '👨👩👧', '👩👦👦', '👩👧👦', '👩👧👧', '👩👩👦', '👩👩👧', '🧑🤝🧑', '🏃🏻♀️', '🏃🏻♂️', '🏃🏼♀️', '🏃🏼♂️', '🏃🏽♀️', '🏃🏽♂️', '🏃🏾♀️', '🏃🏾♂️', '🏃🏿♀️', '🏃🏿♂️', '🏄🏻♀️', '🏄🏻♂️', '🏄🏼♀️', '🏄🏼♂️', '🏄🏽♀️', '🏄🏽♂️', '🏄🏾♀️', '🏄🏾♂️', '🏄🏿♀️', '🏄🏿♂️', '🏊🏻♀️', '🏊🏻♂️', '🏊🏼♀️', '🏊🏼♂️', '🏊🏽♀️', '🏊🏽♂️', '🏊🏾♀️', '🏊🏾♂️', '🏊🏿♀️', '🏊🏿♂️', '🏋🏻♀️', '🏋🏻♂️', '🏋🏼♀️', '🏋🏼♂️', '🏋🏽♀️', '🏋🏽♂️', '🏋🏾♀️', '🏋🏾♂️', '🏋🏿♀️', '🏋🏿♂️', '🏌🏻♀️', '🏌🏻♂️', '🏌🏼♀️', '🏌🏼♂️', '🏌🏽♀️', '🏌🏽♂️', '🏌🏾♀️', '🏌🏾♂️', '🏌🏿♀️', '🏌🏿♂️', '👨🏻⚕️', '👨🏻⚖️', '👨🏻✈️', '👨🏼⚕️', '👨🏼⚖️', '👨🏼✈️', '👨🏽⚕️', '👨🏽⚖️', '👨🏽✈️', '👨🏾⚕️', '👨🏾⚖️', '👨🏾✈️', '👨🏿⚕️', '👨🏿⚖️', '👨🏿✈️', '👩🏻⚕️', '👩🏻⚖️', '👩🏻✈️', '👩🏼⚕️', '👩🏼⚖️', '👩🏼✈️', '👩🏽⚕️', '👩🏽⚖️', '👩🏽✈️', '👩🏾⚕️', '👩🏾⚖️', '👩🏾✈️', '👩🏿⚕️', '👩🏿⚖️', '👩🏿✈️', '👮🏻♀️', '👮🏻♂️', '👮🏼♀️', '👮🏼♂️', '👮🏽♀️', '👮🏽♂️', '👮🏾♀️', '👮🏾♂️', '👮🏿♀️', '👮🏿♂️', '👰🏻♀️', '👰🏻♂️', '👰🏼♀️', '👰🏼♂️', '👰🏽♀️', '👰🏽♂️', '👰🏾♀️', '👰🏾♂️', '👰🏿♀️', '👰🏿♂️', '👱🏻♀️', '👱🏻♂️', '👱🏼♀️', '👱🏼♂️', '👱🏽♀️', '👱🏽♂️', '👱🏾♀️', '👱🏾♂️', '👱🏿♀️', '👱🏿♂️', '👳🏻♀️', '👳🏻♂️', '👳🏼♀️', '👳🏼♂️', '👳🏽♀️', '👳🏽♂️', '👳🏾♀️', '👳🏾♂️', '👳🏿♀️', '👳🏿♂️', '👷🏻♀️', '👷🏻♂️', '👷🏼♀️', '👷🏼♂️', '👷🏽♀️', '👷🏽♂️', '👷🏾♀️', '👷🏾♂️', '👷🏿♀️', '👷🏿♂️', '💁🏻♀️', '💁🏻♂️', '💁🏼♀️', '💁🏼♂️', '💁🏽♀️', '💁🏽♂️', '💁🏾♀️', '💁🏾♂️', '💁🏿♀️', '💁🏿♂️', '💂🏻♀️', '💂🏻♂️', '💂🏼♀️', '💂🏼♂️', '💂🏽♀️', '💂🏽♂️', '💂🏾♀️', '💂🏾♂️', '💂🏿♀️', '💂🏿♂️', '💆🏻♀️', '💆🏻♂️', '💆🏼♀️', '💆🏼♂️', '💆🏽♀️', '💆🏽♂️', '💆🏾♀️', '💆🏾♂️', '💆🏿♀️', '💆🏿♂️', '💇🏻♀️', '💇🏻♂️', '💇🏼♀️', '💇🏼♂️', '💇🏽♀️', '💇🏽♂️', '💇🏾♀️', '💇🏾♂️', '💇🏿♀️', '💇🏿♂️', '🕴🏻♀️', '🕴🏻♂️', '🕴🏼♀️', '🕴🏼♂️', '🕴🏽♀️', '🕴🏽♂️', '🕴🏾♀️', '🕴🏾♂️', '🕴🏿♀️', '🕴🏿♂️', '🕵🏻♀️', '🕵🏻♂️', '🕵🏼♀️', '🕵🏼♂️', '🕵🏽♀️', '🕵🏽♂️', '🕵🏾♀️', '🕵🏾♂️', '🕵🏿♀️', '🕵🏿♂️', '🙅🏻♀️', '🙅🏻♂️', '🙅🏼♀️', '🙅🏼♂️', '🙅🏽♀️', '🙅🏽♂️', '🙅🏾♀️', '🙅🏾♂️', '🙅🏿♀️', '🙅🏿♂️', '🙆🏻♀️', '🙆🏻♂️', '🙆🏼♀️', '🙆🏼♂️', '🙆🏽♀️', '🙆🏽♂️', '🙆🏾♀️', '🙆🏾♂️', '🙆🏿♀️', '🙆🏿♂️', '🙇🏻♀️', '🙇🏻♂️', '🙇🏼♀️', '🙇🏼♂️', '🙇🏽♀️', '🙇🏽♂️', '🙇🏾♀️', '🙇🏾♂️', '🙇🏿♀️', '🙇🏿♂️', '🙋🏻♀️', '🙋🏻♂️', '🙋🏼♀️', '🙋🏼♂️', '🙋🏽♀️', '🙋🏽♂️', '🙋🏾♀️', '🙋🏾♂️', '🙋🏿♀️', '🙋🏿♂️', '🙍🏻♀️', '🙍🏻♂️', '🙍🏼♀️', '🙍🏼♂️', '🙍🏽♀️', '🙍🏽♂️', '🙍🏾♀️', '🙍🏾♂️', '🙍🏿♀️', '🙍🏿♂️', '🙎🏻♀️', '🙎🏻♂️', '🙎🏼♀️', '🙎🏼♂️', '🙎🏽♀️', '🙎🏽♂️', '🙎🏾♀️', '🙎🏾♂️', '🙎🏿♀️', '🙎🏿♂️', '🚣🏻♀️', '🚣🏻♂️', '🚣🏼♀️', '🚣🏼♂️', '🚣🏽♀️', '🚣🏽♂️', '🚣🏾♀️', '🚣🏾♂️', '🚣🏿♀️', '🚣🏿♂️', '🚴🏻♀️', '🚴🏻♂️', '🚴🏼♀️', '🚴🏼♂️', '🚴🏽♀️', '🚴🏽♂️', '🚴🏾♀️', '🚴🏾♂️', '🚴🏿♀️', '🚴🏿♂️', '🚵🏻♀️', '🚵🏻♂️', '🚵🏼♀️', '🚵🏼♂️', '🚵🏽♀️', '🚵🏽♂️', '🚵🏾♀️', '🚵🏾♂️', '🚵🏿♀️', '🚵🏿♂️', '🚶🏻♀️', '🚶🏻♂️', '🚶🏼♀️', '🚶🏼♂️', '🚶🏽♀️', '🚶🏽♂️', '🚶🏾♀️', '🚶🏾♂️', '🚶🏿♀️', '🚶🏿♂️', '🤦🏻♀️', '🤦🏻♂️', '🤦🏼♀️', '🤦🏼♂️', '🤦🏽♀️', '🤦🏽♂️', '🤦🏾♀️', '🤦🏾♂️', '🤦🏿♀️', '🤦🏿♂️', '🤵🏻♀️', '🤵🏻♂️', '🤵🏼♀️', '🤵🏼♂️', '🤵🏽♀️', '🤵🏽♂️', '🤵🏾♀️', '🤵🏾♂️', '🤵🏿♀️', '🤵🏿♂️', '🤷🏻♀️', '🤷🏻♂️', '🤷🏼♀️', '🤷🏼♂️', '🤷🏽♀️', '🤷🏽♂️', '🤷🏾♀️', '🤷🏾♂️', '🤷🏿♀️', '🤷🏿♂️', '🤸🏻♀️', '🤸🏻♂️', '🤸🏼♀️', '🤸🏼♂️', '🤸🏽♀️', '🤸🏽♂️', '🤸🏾♀️', '🤸🏾♂️', '🤸🏿♀️', '🤸🏿♂️', '🤹🏻♀️', '🤹🏻♂️', '🤹🏼♀️', '🤹🏼♂️', '🤹🏽♀️', '🤹🏽♂️', '🤹🏾♀️', '🤹🏾♂️', '🤹🏿♀️', '🤹🏿♂️', '🤽🏻♀️', '🤽🏻♂️', '🤽🏼♀️', '🤽🏼♂️', '🤽🏽♀️', '🤽🏽♂️', '🤽🏾♀️', '🤽🏾♂️', '🤽🏿♀️', '🤽🏿♂️', '🤾🏻♀️', '🤾🏻♂️', '🤾🏼♀️', '🤾🏼♂️', '🤾🏽♀️', '🤾🏽♂️', '🤾🏾♀️', '🤾🏾♂️', '🤾🏿♀️', '🤾🏿♂️', '🦸🏻♀️', '🦸🏻♂️', '🦸🏼♀️', '🦸🏼♂️', '🦸🏽♀️', '🦸🏽♂️', '🦸🏾♀️', '🦸🏾♂️', '🦸🏿♀️', '🦸🏿♂️', '🦹🏻♀️', '🦹🏻♂️', '🦹🏼♀️', '🦹🏼♂️', '🦹🏽♀️', '🦹🏽♂️', '🦹🏾♀️', '🦹🏾♂️', '🦹🏿♀️', '🦹🏿♂️', '🧍🏻♀️', '🧍🏻♂️', '🧍🏼♀️', '🧍🏼♂️', '🧍🏽♀️', '🧍🏽♂️', '🧍🏾♀️', '🧍🏾♂️', '🧍🏿♀️', '🧍🏿♂️', '🧎🏻♀️', '🧎🏻♂️', '🧎🏼♀️', '🧎🏼♂️', '🧎🏽♀️', '🧎🏽♂️', '🧎🏾♀️', '🧎🏾♂️', '🧎🏿♀️', '🧎🏿♂️', '🧏🏻♀️', '🧏🏻♂️', '🧏🏼♀️', '🧏🏼♂️', '🧏🏽♀️', '🧏🏽♂️', '🧏🏾♀️', '🧏🏾♂️', '🧏🏿♀️', '🧏🏿♂️', '🧑🏻⚕️', '🧑🏻⚖️', '🧑🏻✈️', '🧑🏼⚕️', '🧑🏼⚖️', '🧑🏼✈️', '🧑🏽⚕️', '🧑🏽⚖️', '🧑🏽✈️', '🧑🏾⚕️', '🧑🏾⚖️', '🧑🏾✈️', '🧑🏿⚕️', '🧑🏿⚖️', '🧑🏿✈️', '🧔🏻♀️', '🧔🏻♂️', '🧔🏼♀️', '🧔🏼♂️', '🧔🏽♀️', '🧔🏽♂️', '🧔🏾♀️', '🧔🏾♂️', '🧔🏿♀️', '🧔🏿♂️', '🧖🏻♀️', '🧖🏻♂️', '🧖🏼♀️', '🧖🏼♂️', '🧖🏽♀️', '🧖🏽♂️', '🧖🏾♀️', '🧖🏾♂️', '🧖🏿♀️', '🧖🏿♂️', '🧗🏻♀️', '🧗🏻♂️', '🧗🏼♀️', '🧗🏼♂️', '🧗🏽♀️', '🧗🏽♂️', '🧗🏾♀️', '🧗🏾♂️', '🧗🏿♀️', '🧗🏿♂️', '🧘🏻♀️', '🧘🏻♂️', '🧘🏼♀️', '🧘🏼♂️', '🧘🏽♀️', '🧘🏽♂️', '🧘🏾♀️', '🧘🏾♂️', '🧘🏿♀️', '🧘🏿♂️', '🧙🏻♀️', '🧙🏻♂️', '🧙🏼♀️', '🧙🏼♂️', '🧙🏽♀️', '🧙🏽♂️', '🧙🏾♀️', '🧙🏾♂️', '🧙🏿♀️', '🧙🏿♂️', '🧚🏻♀️', '🧚🏻♂️', '🧚🏼♀️', '🧚🏼♂️', '🧚🏽♀️', '🧚🏽♂️', '🧚🏾♀️', '🧚🏾♂️', '🧚🏿♀️', '🧚🏿♂️', '🧛🏻♀️', '🧛🏻♂️', '🧛🏼♀️', '🧛🏼♂️', '🧛🏽♀️', '🧛🏽♂️', '🧛🏾♀️', '🧛🏾♂️', '🧛🏿♀️', '🧛🏿♂️', '🧜🏻♀️', '🧜🏻♂️', '🧜🏼♀️', '🧜🏼♂️', '🧜🏽♀️', '🧜🏽♂️', '🧜🏾♀️', '🧜🏾♂️', '🧜🏿♀️', '🧜🏿♂️', '🧝🏻♀️', '🧝🏻♂️', '🧝🏼♀️', '🧝🏼♂️', '🧝🏽♀️', '🧝🏽♂️', '🧝🏾♀️', '🧝🏾♂️', '🧝🏿♀️', '🧝🏿♂️', '🏋️♀️', '🏋️♂️', '🏌️♀️', '🏌️♂️', '🏳️⚧️', '🕴️♀️', '🕴️♂️', '🕵️♀️', '🕵️♂️', '⛹🏻♀️', '⛹🏻♂️', '⛹🏼♀️', '⛹🏼♂️', '⛹🏽♀️', '⛹🏽♂️', '⛹🏾♀️', '⛹🏾♂️', '⛹🏿♀️', '⛹🏿♂️', '⛹️♀️', '⛹️♂️', '👨🏻🌾', '👨🏻🍳', '👨🏻🍼', '👨🏻🎄', '👨🏻🎓', '👨🏻🎤', '👨🏻🎨', '👨🏻🏫', '👨🏻🏭', '👨🏻💻', '👨🏻💼', '👨🏻🔧', '👨🏻🔬', '👨🏻🚀', '👨🏻🚒', '👨🏻🦯', '👨🏻🦰', '👨🏻🦱', '👨🏻🦲', '👨🏻🦳', '👨🏻🦼', '👨🏻🦽', '👨🏼🌾', '👨🏼🍳', '👨🏼🍼', '👨🏼🎄', '👨🏼🎓', '👨🏼🎤', '👨🏼🎨', '👨🏼🏫', '👨🏼🏭', '👨🏼💻', '👨🏼💼', '👨🏼🔧', '👨🏼🔬', '👨🏼🚀', '👨🏼🚒', '👨🏼🦯', '👨🏼🦰', '👨🏼🦱', '👨🏼🦲', '👨🏼🦳', '👨🏼🦼', '👨🏼🦽', '👨🏽🌾', '👨🏽🍳', '👨🏽🍼', '👨🏽🎄', '👨🏽🎓', '👨🏽🎤', '👨🏽🎨', '👨🏽🏫', '👨🏽🏭', '👨🏽💻', '👨🏽💼', '👨🏽🔧', '👨🏽🔬', '👨🏽🚀', '👨🏽🚒', '👨🏽🦯', '👨🏽🦰', '👨🏽🦱', '👨🏽🦲', '👨🏽🦳', '👨🏽🦼', '👨🏽🦽', '👨🏾🌾', '👨🏾🍳', '👨🏾🍼', '👨🏾🎄', '👨🏾🎓', '👨🏾🎤', '👨🏾🎨', '👨🏾🏫', '👨🏾🏭', '👨🏾💻', '👨🏾💼', '👨🏾🔧', '👨🏾🔬', '👨🏾🚀', '👨🏾🚒', '👨🏾🦯', '👨🏾🦰', '👨🏾🦱', '👨🏾🦲', '👨🏾🦳', '👨🏾🦼', '👨🏾🦽', '👨🏿🌾', '👨🏿🍳', '👨🏿🍼', '👨🏿🎄', '👨🏿🎓', '👨🏿🎤', '👨🏿🎨', '👨🏿🏫', '👨🏿🏭', '👨🏿💻', '👨🏿💼', '👨🏿🔧', '👨🏿🔬', '👨🏿🚀', '👨🏿🚒', '👨🏿🦯', '👨🏿🦰', '👨🏿🦱', '👨🏿🦲', '👨🏿🦳', '👨🏿🦼', '👨🏿🦽', '👩🏻🌾', '👩🏻🍳', '👩🏻🍼', '👩🏻🎄', '👩🏻🎓', '👩🏻🎤', '👩🏻🎨', '👩🏻🏫', '👩🏻🏭', '👩🏻💻', '👩🏻💼', '👩🏻🔧', '👩🏻🔬', '👩🏻🚀', '👩🏻🚒', '👩🏻🦯', '👩🏻🦰', '👩🏻🦱', '👩🏻🦲', '👩🏻🦳', '👩🏻🦼', '👩🏻🦽', '👩🏼🌾', '👩🏼🍳', '👩🏼🍼', '👩🏼🎄', '👩🏼🎓', '👩🏼🎤', '👩🏼🎨', '👩🏼🏫', '👩🏼🏭', '👩🏼💻', '👩🏼💼', '👩🏼🔧', '👩🏼🔬', '👩🏼🚀', '👩🏼🚒', '👩🏼🦯', '👩🏼🦰', '👩🏼🦱', '👩🏼🦲', '👩🏼🦳', '👩🏼🦼', '👩🏼🦽', '👩🏽🌾', '👩🏽🍳', '👩🏽🍼', '👩🏽🎄', '👩🏽🎓', '👩🏽🎤', '👩🏽🎨', '👩🏽🏫', '👩🏽🏭', '👩🏽💻', '👩🏽💼', '👩🏽🔧', '👩🏽🔬', '👩🏽🚀', '👩🏽🚒', '👩🏽🦯', '👩🏽🦰', '👩🏽🦱', '👩🏽🦲', '👩🏽🦳', '👩🏽🦼', '👩🏽🦽', '👩🏾🌾', '👩🏾🍳', '👩🏾🍼', '👩🏾🎄', '👩🏾🎓', '👩🏾🎤', '👩🏾🎨', '👩🏾🏫', '👩🏾🏭', '👩🏾💻', '👩🏾💼', '👩🏾🔧', '👩🏾🔬', '👩🏾🚀', '👩🏾🚒', '👩🏾🦯', '👩🏾🦰', '👩🏾🦱', '👩🏾🦲', '👩🏾🦳', '👩🏾🦼', '👩🏾🦽', '👩🏿🌾', '👩🏿🍳', '👩🏿🍼', '👩🏿🎄', '👩🏿🎓', '👩🏿🎤', '👩🏿🎨', '👩🏿🏫', '👩🏿🏭', '👩🏿💻', '👩🏿💼', '👩🏿🔧', '👩🏿🔬', '👩🏿🚀', '👩🏿🚒', '👩🏿🦯', '👩🏿🦰', '👩🏿🦱', '👩🏿🦲', '👩🏿🦳', '👩🏿🦼', '👩🏿🦽', '🧑🏻🌾', '🧑🏻🍳', '🧑🏻🍼', '🧑🏻🎄', '🧑🏻🎓', '🧑🏻🎤', '🧑🏻🎨', '🧑🏻🏫', '🧑🏻🏭', '🧑🏻💻', '🧑🏻💼', '🧑🏻🔧', '🧑🏻🔬', '🧑🏻🚀', '🧑🏻🚒', '🧑🏻🦯', '🧑🏻🦰', '🧑🏻🦱', '🧑🏻🦲', '🧑🏻🦳', '🧑🏻🦼', '🧑🏻🦽', '🧑🏼🌾', '🧑🏼🍳', '🧑🏼🍼', '🧑🏼🎄', '🧑🏼🎓', '🧑🏼🎤', '🧑🏼🎨', '🧑🏼🏫', '🧑🏼🏭', '🧑🏼💻', '🧑🏼💼', '🧑🏼🔧', '🧑🏼🔬', '🧑🏼🚀', '🧑🏼🚒', '🧑🏼🦯', '🧑🏼🦰', '🧑🏼🦱', '🧑🏼🦲', '🧑🏼🦳', '🧑🏼🦼', '🧑🏼🦽', '🧑🏽🌾', '🧑🏽🍳', '🧑🏽🍼', '🧑🏽🎄', '🧑🏽🎓', '🧑🏽🎤', '🧑🏽🎨', '🧑🏽🏫', '🧑🏽🏭', '🧑🏽💻', '🧑🏽💼', '🧑🏽🔧', '🧑🏽🔬', '🧑🏽🚀', '🧑🏽🚒', '🧑🏽🦯', '🧑🏽🦰', '🧑🏽🦱', '🧑🏽🦲', '🧑🏽🦳', '🧑🏽🦼', '🧑🏽🦽', '🧑🏾🌾', '🧑🏾🍳', '🧑🏾🍼', '🧑🏾🎄', '🧑🏾🎓', '🧑🏾🎤', '🧑🏾🎨', '🧑🏾🏫', '🧑🏾🏭', '🧑🏾💻', '🧑🏾💼', '🧑🏾🔧', '🧑🏾🔬', '🧑🏾🚀', '🧑🏾🚒', '🧑🏾🦯', '🧑🏾🦰', '🧑🏾🦱', '🧑🏾🦲', '🧑🏾🦳', '🧑🏾🦼', '🧑🏾🦽', '🧑🏿🌾', '🧑🏿🍳', '🧑🏿🍼', '🧑🏿🎄', '🧑🏿🎓', '🧑🏿🎤', '🧑🏿🎨', '🧑🏿🏫', '🧑🏿🏭', '🧑🏿💻', '🧑🏿💼', '🧑🏿🔧', '🧑🏿🔬', '🧑🏿🚀', '🧑🏿🚒', '🧑🏿🦯', '🧑🏿🦰', '🧑🏿🦱', '🧑🏿🦲', '🧑🏿🦳', '🧑🏿🦼', '🧑🏿🦽', '🏳️🌈', '😶🌫️', '🏃♀️', '🏃♂️', '🏄♀️', '🏄♂️', '🏊♀️', '🏊♂️', '🏴☠️', '🐻❄️', '👨⚕️', '👨⚖️', '👨✈️', '👩⚕️', '👩⚖️', '👩✈️', '👮♀️', '👮♂️', '👯♀️', '👯♂️', '👰♀️', '👰♂️', '👱♀️', '👱♂️', '👳♀️', '👳♂️', '👷♀️', '👷♂️', '💁♀️', '💁♂️', '💂♀️', '💂♂️', '💆♀️', '💆♂️', '💇♀️', '💇♂️', '🙅♀️', '🙅♂️', '🙆♀️', '🙆♂️', '🙇♀️', '🙇♂️', '🙋♀️', '🙋♂️', '🙍♀️', '🙍♂️', '🙎♀️', '🙎♂️', '🚣♀️', '🚣♂️', '🚴♀️', '🚴♂️', '🚵♀️', '🚵♂️', '🚶♀️', '🚶♂️', '🤦♀️', '🤦♂️', '🤵♀️', '🤵♂️', '🤷♀️', '🤷♂️', '🤸♀️', '🤸♂️', '🤹♀️', '🤹♂️', '🤼♀️', '🤼♂️', '🤽♀️', '🤽♂️', '🤾♀️', '🤾♂️', '🦸♀️', '🦸♂️', '🦹♀️', '🦹♂️', '🧍♀️', '🧍♂️', '🧎♀️', '🧎♂️', '🧏♀️', '🧏♂️', '🧑⚕️', '🧑⚖️', '🧑✈️', '🧔♀️', '🧔♂️', '🧖♀️', '🧖♂️', '🧗♀️', '🧗♂️', '🧘♀️', '🧘♂️', '🧙♀️', '🧙♂️', '🧚♀️', '🧚♂️', '🧛♀️', '🧛♂️', '🧜♀️', '🧜♂️', '🧝♀️', '🧝♂️', '🧞♀️', '🧞♂️', '🧟♀️', '🧟♂️', '❤️🔥', '❤️🩹', '🐕🦺', '👁🗨', '👨🌾', '👨🍳', '👨🍼', '👨🎄', '👨🎓', '👨🎤', '👨🎨', '👨🏫', '👨🏭', '👨👦', '👨👧', '👨💻', '👨💼', '👨🔧', '👨🔬', '👨🚀', '👨🚒', '👨🦯', '👨🦰', '👨🦱', '👨🦲', '👨🦳', '👨🦼', '👨🦽', '👩🌾', '👩🍳', '👩🍼', '👩🎄', '👩🎓', '👩🎤', '👩🎨', '👩🏫', '👩🏭', '👩👦', '👩👧', '👩💻', '👩💼', '👩🔧', '👩🔬', '👩🚀', '👩🚒', '👩🦯', '👩🦰', '👩🦱', '👩🦲', '👩🦳', '👩🦼', '👩🦽', '😮💨', '😵💫', '🧑🌾', '🧑🍳', '🧑🍼', '🧑🎄', '🧑🎓', '🧑🎤', '🧑🎨', '🧑🏫', '🧑🏭', '🧑💻', '🧑💼', '🧑🔧', '🧑🔬', '🧑🚀', '🧑🚒', '🧑🦯', '🧑🦰', '🧑🦱', '🧑🦲', '🧑🦳', '🧑🦼', '🧑🦽', '🐈⬛', '🐦⬛', '🇦🇨', '🇦🇩', '🇦🇪', '🇦🇫', '🇦🇬', '🇦🇮', '🇦🇱', '🇦🇲', '🇦🇴', '🇦🇶', '🇦🇷', '🇦🇸', '🇦🇹', '🇦🇺', '🇦🇼', '🇦🇽', '🇦🇿', '🇧🇦', '🇧🇧', '🇧🇩', '🇧🇪', '🇧🇫', '🇧🇬', '🇧🇭', '🇧🇮', '🇧🇯', '🇧🇱', '🇧🇲', '🇧🇳', '🇧🇴', '🇧🇶', '🇧🇷', '🇧🇸', '🇧🇹', '🇧🇻', '🇧🇼', '🇧🇾', '🇧🇿', '🇨🇦', '🇨🇨', '🇨🇩', '🇨🇫', '🇨🇬', '🇨🇭', '🇨🇮', '🇨🇰', '🇨🇱', '🇨🇲', '🇨🇳', '🇨🇴', '🇨🇵', '🇨🇷', '🇨🇺', '🇨🇻', '🇨🇼', '🇨🇽', '🇨🇾', '🇨🇿', '🇩🇪', '🇩🇬', '🇩🇯', '🇩🇰', '🇩🇲', '🇩🇴', '🇩🇿', '🇪🇦', '🇪🇨', '🇪🇪', '🇪🇬', '🇪🇭', '🇪🇷', '🇪🇸', '🇪🇹', '🇪🇺', '🇫🇮', '🇫🇯', '🇫🇰', '🇫🇲', '🇫🇴', '🇫🇷', '🇬🇦', '🇬🇧', '🇬🇩', '🇬🇪', '🇬🇫', '🇬🇬', '🇬🇭', '🇬🇮', '🇬🇱', '🇬🇲', '🇬🇳', '🇬🇵', '🇬🇶', '🇬🇷', '🇬🇸', '🇬🇹', '🇬🇺', '🇬🇼', '🇬🇾', '🇭🇰', '🇭🇲', '🇭🇳', '🇭🇷', '🇭🇹', '🇭🇺', '🇮🇨', '🇮🇩', '🇮🇪', '🇮🇱', '🇮🇲', '🇮🇳', '🇮🇴', '🇮🇶', '🇮🇷', '🇮🇸', '🇮🇹', '🇯🇪', '🇯🇲', '🇯🇴', '🇯🇵', '🇰🇪', '🇰🇬', '🇰🇭', '🇰🇮', '🇰🇲', '🇰🇳', '🇰🇵', '🇰🇷', '🇰🇼', '🇰🇾', '🇰🇿', '🇱🇦', '🇱🇧', '🇱🇨', '🇱🇮', '🇱🇰', '🇱🇷', '🇱🇸', '🇱🇹', '🇱🇺', '🇱🇻', '🇱🇾', '🇲🇦', '🇲🇨', '🇲🇩', '🇲🇪', '🇲🇫', '🇲🇬', '🇲🇭', '🇲🇰', '🇲🇱', '🇲🇲', '🇲🇳', '🇲🇴', '🇲🇵', '🇲🇶', '🇲🇷', '🇲🇸', '🇲🇹', '🇲🇺', '🇲🇻', '🇲🇼', '🇲🇽', '🇲🇾', '🇲🇿', '🇳🇦', '🇳🇨', '🇳🇪', '🇳🇫', '🇳🇬', '🇳🇮', '🇳🇱', '🇳🇴', '🇳🇵', '🇳🇷', '🇳🇺', '🇳🇿', '🇴🇲', '🇵🇦', '🇵🇪', '🇵🇫', '🇵🇬', '🇵🇭', '🇵🇰', '🇵🇱', '🇵🇲', '🇵🇳', '🇵🇷', '🇵🇸', '🇵🇹', '🇵🇼', '🇵🇾', '🇶🇦', '🇷🇪', '🇷🇴', '🇷🇸', '🇷🇺', '🇷🇼', '🇸🇦', '🇸🇧', '🇸🇨', '🇸🇩', '🇸🇪', '🇸🇬', '🇸🇭', '🇸🇮', '🇸🇯', '🇸🇰', '🇸🇱', '🇸🇲', '🇸🇳', '🇸🇴', '🇸🇷', '🇸🇸', '🇸🇹', '🇸🇻', '🇸🇽', '🇸🇾', '🇸🇿', '🇹🇦', '🇹🇨', '🇹🇩', '🇹🇫', '🇹🇬', '🇹🇭', '🇹🇯', '🇹🇰', '🇹🇱', '🇹🇲', '🇹🇳', '🇹🇴', '🇹🇷', '🇹🇹', '🇹🇻', '🇹🇼', '🇹🇿', '🇺🇦', '🇺🇬', '🇺🇲', '🇺🇳', '🇺🇸', '🇺🇾', '🇺🇿', '🇻🇦', '🇻🇨', '🇻🇪', '🇻🇬', '🇻🇮', '🇻🇳', '🇻🇺', '🇼🇫', '🇼🇸', '🇽🇰', '🇾🇪', '🇾🇹', '🇿🇦', '🇿🇲', '🇿🇼', '🎅🏻', '🎅🏼', '🎅🏽', '🎅🏾', '🎅🏿', '🏂🏻', '🏂🏼', '🏂🏽', '🏂🏾', '🏂🏿', '🏃🏻', '🏃🏼', '🏃🏽', '🏃🏾', '🏃🏿', '🏄🏻', '🏄🏼', '🏄🏽', '🏄🏾', '🏄🏿', '🏇🏻', '🏇🏼', '🏇🏽', '🏇🏾', '🏇🏿', '🏊🏻', '🏊🏼', '🏊🏽', '🏊🏾', '🏊🏿', '🏋🏻', '🏋🏼', '🏋🏽', '🏋🏾', '🏋🏿', '🏌🏻', '🏌🏼', '🏌🏽', '🏌🏾', '🏌🏿', '👂🏻', '👂🏼', '👂🏽', '👂🏾', '👂🏿', '👃🏻', '👃🏼', '👃🏽', '👃🏾', '👃🏿', '👆🏻', '👆🏼', '👆🏽', '👆🏾', '👆🏿', '👇🏻', '👇🏼', '👇🏽', '👇🏾', '👇🏿', '👈🏻', '👈🏼', '👈🏽', '👈🏾', '👈🏿', '👉🏻', '👉🏼', '👉🏽', '👉🏾', '👉🏿', '👊🏻', '👊🏼', '👊🏽', '👊🏾', '👊🏿', '👋🏻', '👋🏼', '👋🏽', '👋🏾', '👋🏿', '👌🏻', '👌🏼', '👌🏽', '👌🏾', '👌🏿', '👍🏻', '👍🏼', '👍🏽', '👍🏾', '👍🏿', '👎🏻', '👎🏼', '👎🏽', '👎🏾', '👎🏿', '👏🏻', '👏🏼', '👏🏽', '👏🏾', '👏🏿', '👐🏻', '👐🏼', '👐🏽', '👐🏾', '👐🏿', '👦🏻', '👦🏼', '👦🏽', '👦🏾', '👦🏿', '👧🏻', '👧🏼', '👧🏽', '👧🏾', '👧🏿', '👨🏻', '👨🏼', '👨🏽', '👨🏾', '👨🏿', '👩🏻', '👩🏼', '👩🏽', '👩🏾', '👩🏿', '👫🏻', '👫🏼', '👫🏽', '👫🏾', '👫🏿', '👬🏻', '👬🏼', '👬🏽', '👬🏾', '👬🏿', '👭🏻', '👭🏼', '👭🏽', '👭🏾', '👭🏿', '👮🏻', '👮🏼', '👮🏽', '👮🏾', '👮🏿', '👰🏻', '👰🏼', '👰🏽', '👰🏾', '👰🏿', '👱🏻', '👱🏼', '👱🏽', '👱🏾', '👱🏿', '👲🏻', '👲🏼', '👲🏽', '👲🏾', '👲🏿', '👳🏻', '👳🏼', '👳🏽', '👳🏾', '👳🏿', '👴🏻', '👴🏼', '👴🏽', '👴🏾', '👴🏿', '👵🏻', '👵🏼', '👵🏽', '👵🏾', '👵🏿', '👶🏻', '👶🏼', '👶🏽', '👶🏾', '👶🏿', '👷🏻', '👷🏼', '👷🏽', '👷🏾', '👷🏿', '👸🏻', '👸🏼', '👸🏽', '👸🏾', '👸🏿', '👼🏻', '👼🏼', '👼🏽', '👼🏾', '👼🏿', '💁🏻', '💁🏼', '💁🏽', '💁🏾', '💁🏿', '💂🏻', '💂🏼', '💂🏽', '💂🏾', '💂🏿', '💃🏻', '💃🏼', '💃🏽', '💃🏾', '💃🏿', '💅🏻', '💅🏼', '💅🏽', '💅🏾', '💅🏿', '💆🏻', '💆🏼', '💆🏽', '💆🏾', '💆🏿', '💇🏻', '💇🏼', '💇🏽', '💇🏾', '💇🏿', '💏🏻', '💏🏼', '💏🏽', '💏🏾', '💏🏿', '💑🏻', '💑🏼', '💑🏽', '💑🏾', '💑🏿', '💪🏻', '💪🏼', '💪🏽', '💪🏾', '💪🏿', '🕴🏻', '🕴🏼', '🕴🏽', '🕴🏾', '🕴🏿', '🕵🏻', '🕵🏼', '🕵🏽', '🕵🏾', '🕵🏿', '🕺🏻', '🕺🏼', '🕺🏽', '🕺🏾', '🕺🏿', '🖐🏻', '🖐🏼', '🖐🏽', '🖐🏾', '🖐🏿', '🖕🏻', '🖕🏼', '🖕🏽', '🖕🏾', '🖕🏿', '🖖🏻', '🖖🏼', '🖖🏽', '🖖🏾', '🖖🏿', '🙅🏻', '🙅🏼', '🙅🏽', '🙅🏾', '🙅🏿', '🙆🏻', '🙆🏼', '🙆🏽', '🙆🏾', '🙆🏿', '🙇🏻', '🙇🏼', '🙇🏽', '🙇🏾', '🙇🏿', '🙋🏻', '🙋🏼', '🙋🏽', '🙋🏾', '🙋🏿', '🙌🏻', '🙌🏼', '🙌🏽', '🙌🏾', '🙌🏿', '🙍🏻', '🙍🏼', '🙍🏽', '🙍🏾', '🙍🏿', '🙎🏻', '🙎🏼', '🙎🏽', '🙎🏾', '🙎🏿', '🙏🏻', '🙏🏼', '🙏🏽', '🙏🏾', '🙏🏿', '🚣🏻', '🚣🏼', '🚣🏽', '🚣🏾', '🚣🏿', '🚴🏻', '🚴🏼', '🚴🏽', '🚴🏾', '🚴🏿', '🚵🏻', '🚵🏼', '🚵🏽', '🚵🏾', '🚵🏿', '🚶🏻', '🚶🏼', '🚶🏽', '🚶🏾', '🚶🏿', '🛀🏻', '🛀🏼', '🛀🏽', '🛀🏾', '🛀🏿', '🛌🏻', '🛌🏼', '🛌🏽', '🛌🏾', '🛌🏿', '🤌🏻', '🤌🏼', '🤌🏽', '🤌🏾', '🤌🏿', '🤏🏻', '🤏🏼', '🤏🏽', '🤏🏾', '🤏🏿', '🤘🏻', '🤘🏼', '🤘🏽', '🤘🏾', '🤘🏿', '🤙🏻', '🤙🏼', '🤙🏽', '🤙🏾', '🤙🏿', '🤚🏻', '🤚🏼', '🤚🏽', '🤚🏾', '🤚🏿', '🤛🏻', '🤛🏼', '🤛🏽', '🤛🏾', '🤛🏿', '🤜🏻', '🤜🏼', '🤜🏽', '🤜🏾', '🤜🏿', '🤝🏻', '🤝🏼', '🤝🏽', '🤝🏾', '🤝🏿', '🤞🏻', '🤞🏼', '🤞🏽', '🤞🏾', '🤞🏿', '🤟🏻', '🤟🏼', '🤟🏽', '🤟🏾', '🤟🏿', '🤦🏻', '🤦🏼', '🤦🏽', '🤦🏾', '🤦🏿', '🤰🏻', '🤰🏼', '🤰🏽', '🤰🏾', '🤰🏿', '🤱🏻', '🤱🏼', '🤱🏽', '🤱🏾', '🤱🏿', '🤲🏻', '🤲🏼', '🤲🏽', '🤲🏾', '🤲🏿', '🤳🏻', '🤳🏼', '🤳🏽', '🤳🏾', '🤳🏿', '🤴🏻', '🤴🏼', '🤴🏽', '🤴🏾', '🤴🏿', '🤵🏻', '🤵🏼', '🤵🏽', '🤵🏾', '🤵🏿', '🤶🏻', '🤶🏼', '🤶🏽', '🤶🏾', '🤶🏿', '🤷🏻', '🤷🏼', '🤷🏽', '🤷🏾', '🤷🏿', '🤸🏻', '🤸🏼', '🤸🏽', '🤸🏾', '🤸🏿', '🤹🏻', '🤹🏼', '🤹🏽', '🤹🏾', '🤹🏿', '🤽🏻', '🤽🏼', '🤽🏽', '🤽🏾', '🤽🏿', '🤾🏻', '🤾🏼', '🤾🏽', '🤾🏾', '🤾🏿', '🥷🏻', '🥷🏼', '🥷🏽', '🥷🏾', '🥷🏿', '🦵🏻', '🦵🏼', '🦵🏽', '🦵🏾', '🦵🏿', '🦶🏻', '🦶🏼', '🦶🏽', '🦶🏾', '🦶🏿', '🦸🏻', '🦸🏼', '🦸🏽', '🦸🏾', '🦸🏿', '🦹🏻', '🦹🏼', '🦹🏽', '🦹🏾', '🦹🏿', '🦻🏻', '🦻🏼', '🦻🏽', '🦻🏾', '🦻🏿', '🧍🏻', '🧍🏼', '🧍🏽', '🧍🏾', '🧍🏿', '🧎🏻', '🧎🏼', '🧎🏽', '🧎🏾', '🧎🏿', '🧏🏻', '🧏🏼', '🧏🏽', '🧏🏾', '🧏🏿', '🧑🏻', '🧑🏼', '🧑🏽', '🧑🏾', '🧑🏿', '🧒🏻', '🧒🏼', '🧒🏽', '🧒🏾', '🧒🏿', '🧓🏻', '🧓🏼', '🧓🏽', '🧓🏾', '🧓🏿', '🧔🏻', '🧔🏼', '🧔🏽', '🧔🏾', '🧔🏿', '🧕🏻', '🧕🏼', '🧕🏽', '🧕🏾', '🧕🏿', '🧖🏻', '🧖🏼', '🧖🏽', '🧖🏾', '🧖🏿', '🧗🏻', '🧗🏼', '🧗🏽', '🧗🏾', '🧗🏿', '🧘🏻', '🧘🏼', '🧘🏽', '🧘🏾', '🧘🏿', '🧙🏻', '🧙🏼', '🧙🏽', '🧙🏾', '🧙🏿', '🧚🏻', '🧚🏼', '🧚🏽', '🧚🏾', '🧚🏿', '🧛🏻', '🧛🏼', '🧛🏽', '🧛🏾', '🧛🏿', '🧜🏻', '🧜🏼', '🧜🏽', '🧜🏾', '🧜🏿', '🧝🏻', '🧝🏼', '🧝🏽', '🧝🏾', '🧝🏿', '🫃🏻', '🫃🏼', '🫃🏽', '🫃🏾', '🫃🏿', '🫄🏻', '🫄🏼', '🫄🏽', '🫄🏾', '🫄🏿', '🫅🏻', '🫅🏼', '🫅🏽', '🫅🏾', '🫅🏿', '🫰🏻', '🫰🏼', '🫰🏽', '🫰🏾', '🫰🏿', '🫱🏻', '🫱🏼', '🫱🏽', '🫱🏾', '🫱🏿', '🫲🏻', '🫲🏼', '🫲🏽', '🫲🏾', '🫲🏿', '🫳🏻', '🫳🏼', '🫳🏽', '🫳🏾', '🫳🏿', '🫴🏻', '🫴🏼', '🫴🏽', '🫴🏾', '🫴🏿', '🫵🏻', '🫵🏼', '🫵🏽', '🫵🏾', '🫵🏿', '🫶🏻', '🫶🏼', '🫶🏽', '🫶🏾', '🫶🏿', '🫷🏻', '🫷🏼', '🫷🏽', '🫷🏾', '🫷🏿', '🫸🏻', '🫸🏼', '🫸🏽', '🫸🏾', '🫸🏿', '☝🏻', '☝🏼', '☝🏽', '☝🏾', '☝🏿', '⛷🏻', '⛷🏼', '⛷🏽', '⛷🏾', '⛷🏿', '⛹🏻', '⛹🏼', '⛹🏽', '⛹🏾', '⛹🏿', '✊🏻', '✊🏼', '✊🏽', '✊🏾', '✊🏿', '✋🏻', '✋🏼', '✋🏽', '✋🏾', '✋🏿', '✌🏻', '✌🏼', '✌🏽', '✌🏾', '✌🏿', '✍🏻', '✍🏼', '✍🏽', '✍🏾', '✍🏿', '#⃣', '*⃣', '0⃣', '1⃣', '2⃣', '3⃣', '4⃣', '5⃣', '6⃣', '7⃣', '8⃣', '9⃣', '🀄', '🃏', '🅰', '🅱', '🅾', '🅿', '🆎', '🆑', '🆒', '🆓', '🆔', '🆕', '🆖', '🆗', '🆘', '🆙', '🆚', '🇦', '🇧', '🇨', '🇩', '🇪', '🇫', '🇬', '🇭', '🇮', '🇯', '🇰', '🇱', '🇲', '🇳', '🇴', '🇵', '🇶', '🇷', '🇸', '🇹', '🇺', '🇻', '🇼', '🇽', '🇾', '🇿', '🈁', '🈂', '🈚', '🈯', '🈲', '🈳', '🈴', '🈵', '🈶', '🈷', '🈸', '🈹', '🈺', '🉐', '🉑', '🌀', '🌁', '🌂', '🌃', '🌄', '🌅', '🌆', '🌇', '🌈', '🌉', '🌊', '🌋', '🌌', '🌍', '🌎', '🌏', '🌐', '🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘', '🌙', '🌚', '🌛', '🌜', '🌝', '🌞', '🌟', '🌠', '🌡', '🌤', '🌥', '🌦', '🌧', '🌨', '🌩', '🌪', '🌫', '🌬', '🌭', '🌮', '🌯', '🌰', '🌱', '🌲', '🌳', '🌴', '🌵', '🌶', '🌷', '🌸', '🌹', '🌺', '🌻', '🌼', '🌽', '🌾', '🌿', '🍀', '🍁', '🍂', '🍃', '🍄', '🍅', '🍆', '🍇', '🍈', '🍉', '🍊', '🍋', '🍌', '🍍', '🍎', '🍏', '🍐', '🍑', '🍒', '🍓', '🍔', '🍕', '🍖', '🍗', '🍘', '🍙', '🍚', '🍛', '🍜', '🍝', '🍞', '🍟', '🍠', '🍡', '🍢', '🍣', '🍤', '🍥', '🍦', '🍧', '🍨', '🍩', '🍪', '🍫', '🍬', '🍭', '🍮', '🍯', '🍰', '🍱', '🍲', '🍳', '🍴', '🍵', '🍶', '🍷', '🍸', '🍹', '🍺', '🍻', '🍼', '🍽', '🍾', '🍿', '🎀', '🎁', '🎂', '🎃', '🎄', '🎅', '🎆', '🎇', '🎈', '🎉', '🎊', '🎋', '🎌', '🎍', '🎎', '🎏', '🎐', '🎑', '🎒', '🎓', '🎖', '🎗', '🎙', '🎚', '🎛', '🎞', '🎟', '🎠', '🎡', '🎢', '🎣', '🎤', '🎥', '🎦', '🎧', '🎨', '🎩', '🎪', '🎫', '🎬', '🎭', '🎮', '🎯', '🎰', '🎱', '🎲', '🎳', '🎴', '🎵', '🎶', '🎷', '🎸', '🎹', '🎺', '🎻', '🎼', '🎽', '🎾', '🎿', '🏀', '🏁', '🏂', '🏃', '🏄', '🏅', '🏆', '🏇', '🏈', '🏉', '🏊', '🏋', '🏌', '🏍', '🏎', '🏏', '🏐', '🏑', '🏒', '🏓', '🏔', '🏕', '🏖', '🏗', '🏘', '🏙', '🏚', '🏛', '🏜', '🏝', '🏞', '🏟', '🏠', '🏡', '🏢', '🏣', '🏤', '🏥', '🏦', '🏧', '🏨', '🏩', '🏪', '🏫', '🏬', '🏭', '🏮', '🏯', '🏰', '🏳', '🏴', '🏵', '🏷', '🏸', '🏹', '🏺', '🏻', '🏼', '🏽', '🏾', '🏿', '🐀', '🐁', '🐂', '🐃', '🐄', '🐅', '🐆', '🐇', '🐈', '🐉', '🐊', '🐋', '🐌', '🐍', '🐎', '🐏', '🐐', '🐑', '🐒', '🐓', '🐔', '🐕', '🐖', '🐗', '🐘', '🐙', '🐚', '🐛', '🐜', '🐝', '🐞', '🐟', '🐠', '🐡', '🐢', '🐣', '🐤', '🐥', '🐦', '🐧', '🐨', '🐩', '🐪', '🐫', '🐬', '🐭', '🐮', '🐯', '🐰', '🐱', '🐲', '🐳', '🐴', '🐵', '🐶', '🐷', '🐸', '🐹', '🐺', '🐻', '🐼', '🐽', '🐾', '🐿', '👀', '👁', '👂', '👃', '👄', '👅', '👆', '👇', '👈', '👉', '👊', '👋', '👌', '👍', '👎', '👏', '👐', '👑', '👒', '👓', '👔', '👕', '👖', '👗', '👘', '👙', '👚', '👛', '👜', '👝', '👞', '👟', '👠', '👡', '👢', '👣', '👤', '👥', '👦', '👧', '👨', '👩', '👪', '👫', '👬', '👭', '👮', '👯', '👰', '👱', '👲', '👳', '👴', '👵', '👶', '👷', '👸', '👹', '👺', '👻', '👼', '👽', '👾', '👿', '💀', '💁', '💂', '💃', '💄', '💅', '💆', '💇', '💈', '💉', '💊', '💋', '💌', '💍', '💎', '💏', '💐', '💑', '💒', '💓', '💔', '💕', '💖', '💗', '💘', '💙', '💚', '💛', '💜', '💝', '💞', '💟', '💠', '💡', '💢', '💣', '💤', '💥', '💦', '💧', '💨', '💩', '💪', '💫', '💬', '💭', '💮', '💯', '💰', '💱', '💲', '💳', '💴', '💵', '💶', '💷', '💸', '💹', '💺', '💻', '💼', '💽', '💾', '💿', '📀', '📁', '📂', '📃', '📄', '📅', '📆', '📇', '📈', '📉', '📊', '📋', '📌', '📍', '📎', '📏', '📐', '📑', '📒', '📓', '📔', '📕', '📖', '📗', '📘', '📙', '📚', '📛', '📜', '📝', '📞', '📟', '📠', '📡', '📢', '📣', '📤', '📥', '📦', '📧', '📨', '📩', '📪', '📫', '📬', '📭', '📮', '📯', '📰', '📱', '📲', '📳', '📴', '📵', '📶', '📷', '📸', '📹', '📺', '📻', '📼', '📽', '📿', '🔀', '🔁', '🔂', '🔃', '🔄', '🔅', '🔆', '🔇', '🔈', '🔉', '🔊', '🔋', '🔌', '🔍', '🔎', '🔏', '🔐', '🔑', '🔒', '🔓', '🔔', '🔕', '🔖', '🔗', '🔘', '🔙', '🔚', '🔛', '🔜', '🔝', '🔞', '🔟', '🔠', '🔡', '🔢', '🔣', '🔤', '🔥', '🔦', '🔧', '🔨', '🔩', '🔪', '🔫', '🔬', '🔭', '🔮', '🔯', '🔰', '🔱', '🔲', '🔳', '🔴', '🔵', '🔶', '🔷', '🔸', '🔹', '🔺', '🔻', '🔼', '🔽', '🕉', '🕊', '🕋', '🕌', '🕍', '🕎', '🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛', '🕜', '🕝', '🕞', '🕟', '🕠', '🕡', '🕢', '🕣', '🕤', '🕥', '🕦', '🕧', '🕯', '🕰', '🕳', '🕴', '🕵', '🕶', '🕷', '🕸', '🕹', '🕺', '🖇', '🖊', '🖋', '🖌', '🖍', '🖐', '🖕', '🖖', '🖤', '🖥', '🖨', '🖱', '🖲', '🖼', '🗂', '🗃', '🗄', '🗑', '🗒', '🗓', '🗜', '🗝', '🗞', '🗡', '🗣', '🗨', '🗯', '🗳', '🗺', '🗻', '🗼', '🗽', '🗾', '🗿', '😀', '😁', '😂', '😃', '😄', '😅', '😆', '😇', '😈', '😉', '😊', '😋', '😌', '😍', '😎', '😏', '😐', '😑', '😒', '😓', '😔', '😕', '😖', '😗', '😘', '😙', '😚', '😛', '😜', '😝', '😞', '😟', '😠', '😡', '😢', '😣', '😤', '😥', '😦', '😧', '😨', '😩', '😪', '😫', '😬', '😭', '😮', '😯', '😰', '😱', '😲', '😳', '😴', '😵', '😶', '😷', '😸', '😹', '😺', '😻', '😼', '😽', '😾', '😿', '🙀', '🙁', '🙂', '🙃', '🙄', '🙅', '🙆', '🙇', '🙈', '🙉', '🙊', '🙋', '🙌', '🙍', '🙎', '🙏', '🚀', '🚁', '🚂', '🚃', '🚄', '🚅', '🚆', '🚇', '🚈', '🚉', '🚊', '🚋', '🚌', '🚍', '🚎', '🚏', '🚐', '🚑', '🚒', '🚓', '🚔', '🚕', '🚖', '🚗', '🚘', '🚙', '🚚', '🚛', '🚜', '🚝', '🚞', '🚟', '🚠', '🚡', '🚢', '🚣', '🚤', '🚥', '🚦', '🚧', '🚨', '🚩', '🚪', '🚫', '🚬', '🚭', '🚮', '🚯', '🚰', '🚱', '🚲', '🚳', '🚴', '🚵', '🚶', '🚷', '🚸', '🚹', '🚺', '🚻', '🚼', '🚽', '🚾', '🚿', '🛀', '🛁', '🛂', '🛃', '🛄', '🛅', '🛋', '🛌', '🛍', '🛎', '🛏', '🛐', '🛑', '🛒', '🛕', '🛖', '🛗', '🛜', '🛝', '🛞', '🛟', '🛠', '🛡', '🛢', '🛣', '🛤', '🛥', '🛩', '🛫', '🛬', '🛰', '🛳', '🛴', '🛵', '🛶', '🛷', '🛸', '🛹', '🛺', '🛻', '🛼', '🟠', '🟡', '🟢', '🟣', '🟤', '🟥', '🟦', '🟧', '🟨', '🟩', '🟪', '🟫', '🟰', '🤌', '🤍', '🤎', '🤏', '🤐', '🤑', '🤒', '🤓', '🤔', '🤕', '🤖', '🤗', '🤘', '🤙', '🤚', '🤛', '🤜', '🤝', '🤞', '🤟', '🤠', '🤡', '🤢', '🤣', '🤤', '🤥', '🤦', '🤧', '🤨', '🤩', '🤪', '🤫', '🤬', '🤭', '🤮', '🤯', '🤰', '🤱', '🤲', '🤳', '🤴', '🤵', '🤶', '🤷', '🤸', '🤹', '🤺', '🤼', '🤽', '🤾', '🤿', '🥀', '🥁', '🥂', '🥃', '🥄', '🥅', '🥇', '🥈', '🥉', '🥊', '🥋', '🥌', '🥍', '🥎', '🥏', '🥐', '🥑', '🥒', '🥓', '🥔', '🥕', '🥖', '🥗', '🥘', '🥙', '🥚', '🥛', '🥜', '🥝', '🥞', '🥟', '🥠', '🥡', '🥢', '🥣', '🥤', '🥥', '🥦', '🥧', '🥨', '🥩', '🥪', '🥫', '🥬', '🥭', '🥮', '🥯', '🥰', '🥱', '🥲', '🥳', '🥴', '🥵', '🥶', '🥷', '🥸', '🥹', '🥺', '🥻', '🥼', '🥽', '🥾', '🥿', '🦀', '🦁', '🦂', '🦃', '🦄', '🦅', '🦆', '🦇', '🦈', '🦉', '🦊', '🦋', '🦌', '🦍', '🦎', '🦏', '🦐', '🦑', '🦒', '🦓', '🦔', '🦕', '🦖', '🦗', '🦘', '🦙', '🦚', '🦛', '🦜', '🦝', '🦞', '🦟', '🦠', '🦡', '🦢', '🦣', '🦤', '🦥', '🦦', '🦧', '🦨', '🦩', '🦪', '🦫', '🦬', '🦭', '🦮', '🦯', '🦰', '🦱', '🦲', '🦳', '🦴', '🦵', '🦶', '🦷', '🦸', '🦹', '🦺', '🦻', '🦼', '🦽', '🦾', '🦿', '🧀', '🧁', '🧂', '🧃', '🧄', '🧅', '🧆', '🧇', '🧈', '🧉', '🧊', '🧋', '🧌', '🧍', '🧎', '🧏', '🧐', '🧑', '🧒', '🧓', '🧔', '🧕', '🧖', '🧗', '🧘', '🧙', '🧚', '🧛', '🧜', '🧝', '🧞', '🧟', '🧠', '🧡', '🧢', '🧣', '🧤', '🧥', '🧦', '🧧', '🧨', '🧩', '🧪', '🧫', '🧬', '🧭', '🧮', '🧯', '🧰', '🧱', '🧲', '🧳', '🧴', '🧵', '🧶', '🧷', '🧸', '🧹', '🧺', '🧻', '🧼', '🧽', '🧾', '🧿', '🩰', '🩱', '🩲', '🩳', '🩴', '🩵', '🩶', '🩷', '🩸', '🩹', '🩺', '🩻', '🩼', '🪀', '🪁', '🪂', '🪃', '🪄', '🪅', '🪆', '🪇', '🪈', '🪐', '🪑', '🪒', '🪓', '🪔', '🪕', '🪖', '🪗', '🪘', '🪙', '🪚', '🪛', '🪜', '🪝', '🪞', '🪟', '🪠', '🪡', '🪢', '🪣', '🪤', '🪥', '🪦', '🪧', '🪨', '🪩', '🪪', '🪫', '🪬', '🪭', '🪮', '🪯', '🪰', '🪱', '🪲', '🪳', '🪴', '🪵', '🪶', '🪷', '🪸', '🪹', '🪺', '🪻', '🪼', '🪽', '🪿', '🫀', '🫁', '🫂', '🫃', '🫄', '🫅', '🫎', '🫏', '🫐', '🫑', '🫒', '🫓', '🫔', '🫕', '🫖', '🫗', '🫘', '🫙', '🫚', '🫛', '🫠', '🫡', '🫢', '🫣', '🫤', '🫥', '🫦', '🫧', '🫨', '🫰', '🫱', '🫲', '🫳', '🫴', '🫵', '🫶', '🫷', '🫸', '‼', '⁉', '™', 'ℹ', '↔', '↕', '↖', '↗', '↘', '↙', '↩', '↪', '⌚', '⌛', '⌨', '⏏', '⏩', '⏪', '⏫', '⏬', '⏭', '⏮', '⏯', '⏰', '⏱', '⏲', '⏳', '⏸', '⏹', '⏺', 'Ⓜ', '▪', '▫', '▶', '◀', '◻', '◼', '◽', '◾', '☀', '☁', '☂', '☃', '☄', '☎', '☑', '☔', '☕', '☘', '☝', '☠', '☢', '☣', '☦', '☪', '☮', '☯', '☸', '☹', '☺', '♀', '♂', '♈', '♉', '♊', '♋', '♌', '♍', '♎', '♏', '♐', '♑', '♒', '♓', '♟', '♠', '♣', '♥', '♦', '♨', '♻', '♾', '♿', '⚒', '⚓', '⚔', '⚕', '⚖', '⚗', '⚙', '⚛', '⚜', '⚠', '⚡', '⚧', '⚪', '⚫', '⚰', '⚱', '⚽', '⚾', '⛄', '⛅', '⛈', '⛎', '⛏', '⛑', '⛓', '⛔', '⛩', '⛪', '⛰', '⛱', '⛲', '⛳', '⛴', '⛵', '⛷', '⛸', '⛹', '⛺', '⛽', '✂', '✅', '✈', '✉', '✊', '✋', '✌', '✍', '✏', '✒', '✔', '✖', '✝', '✡', '✨', '✳', '✴', '❄', '❇', '❌', '❎', '❓', '❔', '❕', '❗', '❣', '❤', '➕', '➖', '➗', '➡', '➰', '➿', '⤴', '⤵', '⬅', '⬆', '⬇', '⬛', '⬜', '⭐', '⭕', '〰', '〽', '㊗', '㊙', '' );
$partials = array( '🀄', '🃏', '🅰', '🅱', '🅾', '🅿', '🆎', '🆑', '🆒', '🆓', '🆔', '🆕', '🆖', '🆗', '🆘', '🆙', '🆚', '🇦', '🇨', '🇩', '🇪', '🇫', '🇬', '🇮', '🇱', '🇲', '🇴', '🇶', '🇷', '🇸', '🇹', '🇺', '🇼', '🇽', '🇿', '🇧', '🇭', '🇯', '🇳', '🇻', '🇾', '🇰', '🇵', '🈁', '🈂', '🈚', '🈯', '🈲', '🈳', '🈴', '🈵', '🈶', '🈷', '🈸', '🈹', '🈺', '🉐', '🉑', '🌀', '🌁', '🌂', '🌃', '🌄', '🌅', '🌆', '🌇', '🌈', '🌉', '🌊', '🌋', '🌌', '🌍', '🌎', '🌏', '🌐', '🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘', '🌙', '🌚', '🌛', '🌜', '🌝', '🌞', '🌟', '🌠', '🌡', '🌤', '🌥', '🌦', '🌧', '🌨', '🌩', '🌪', '🌫', '🌬', '🌭', '🌮', '🌯', '🌰', '🌱', '🌲', '🌳', '🌴', '🌵', '🌶', '🌷', '🌸', '🌹', '🌺', '🌻', '🌼', '🌽', '🌾', '🌿', '🍀', '🍁', '🍂', '🍃', '🍄', '🍅', '🍆', '🍇', '🍈', '🍉', '🍊', '🍋', '🍌', '🍍', '🍎', '🍏', '🍐', '🍑', '🍒', '🍓', '🍔', '🍕', '🍖', '🍗', '🍘', '🍙', '🍚', '🍛', '🍜', '🍝', '🍞', '🍟', '🍠', '🍡', '🍢', '🍣', '🍤', '🍥', '🍦', '🍧', '🍨', '🍩', '🍪', '🍫', '🍬', '🍭', '🍮', '🍯', '🍰', '🍱', '🍲', '🍳', '🍴', '🍵', '🍶', '🍷', '🍸', '🍹', '🍺', '🍻', '🍼', '🍽', '🍾', '🍿', '🎀', '🎁', '🎂', '🎃', '🎄', '🎅', '🏻', '🏼', '🏽', '🏾', '🏿', '🎆', '🎇', '🎈', '🎉', '🎊', '🎋', '🎌', '🎍', '🎎', '🎏', '🎐', '🎑', '🎒', '🎓', '🎖', '🎗', '🎙', '🎚', '🎛', '🎞', '🎟', '🎠', '🎡', '🎢', '🎣', '🎤', '🎥', '🎦', '🎧', '🎨', '🎩', '🎪', '🎫', '🎬', '🎭', '🎮', '🎯', '🎰', '🎱', '🎲', '🎳', '🎴', '🎵', '🎶', '🎷', '🎸', '🎹', '🎺', '🎻', '🎼', '🎽', '🎾', '🎿', '🏀', '🏁', '🏂', '🏃', '', '♀', '️', '♂', '🏄', '🏅', '🏆', '🏇', '🏈', '🏉', '🏊', '🏋', '🏌', '🏍', '🏎', '🏏', '🏐', '🏑', '🏒', '🏓', '🏔', '🏕', '🏖', '🏗', '🏘', '🏙', '🏚', '🏛', '🏜', '🏝', '🏞', '🏟', '🏠', '🏡', '🏢', '🏣', '🏤', '🏥', '🏦', '🏧', '🏨', '🏩', '🏪', '🏫', '🏬', '🏭', '🏮', '🏯', '🏰', '🏳', '⚧', '🏴', '☠', '', '', '', '', '', '', '', '', '', '', '🏵', '🏷', '🏸', '🏹', '🏺', '🐀', '🐁', '🐂', '🐃', '🐄', '🐅', '🐆', '🐇', '🐈', '⬛', '🐉', '🐊', '🐋', '🐌', '🐍', '🐎', '🐏', '🐐', '🐑', '🐒', '🐓', '🐔', '🐕', '🦺', '🐖', '🐗', '🐘', '🐙', '🐚', '🐛', '🐜', '🐝', '🐞', '🐟', '🐠', '🐡', '🐢', '🐣', '🐤', '🐥', '🐦', '🐧', '🐨', '🐩', '🐪', '🐫', '🐬', '🐭', '🐮', '🐯', '🐰', '🐱', '🐲', '🐳', '🐴', '🐵', '🐶', '🐷', '🐸', '🐹', '🐺', '🐻', '❄', '🐼', '🐽', '🐾', '🐿', '👀', '👁', '🗨', '👂', '👃', '👄', '👅', '👆', '👇', '👈', '👉', '👊', '👋', '👌', '👍', '👎', '👏', '👐', '👑', '👒', '👓', '👔', '👕', '👖', '👗', '👘', '👙', '👚', '👛', '👜', '👝', '👞', '👟', '👠', '👡', '👢', '👣', '👤', '👥', '👦', '👧', '👨', '💻', '💼', '🔧', '🔬', '🚀', '🚒', '🤝', '🦯', '🦰', '🦱', '🦲', '🦳', '🦼', '🦽', '⚕', '⚖', '✈', '❤', '💋', '👩', '👪', '👫', '👬', '👭', '👮', '👯', '👰', '👱', '👲', '👳', '👴', '👵', '👶', '👷', '👸', '👹', '👺', '👻', '👼', '👽', '👾', '👿', '💀', '💁', '💂', '💃', '💄', '💅', '💆', '💇', '💈', '💉', '💊', '💌', '💍', '💎', '💏', '💐', '💑', '💒', '💓', '💔', '💕', '💖', '💗', '💘', '💙', '💚', '💛', '💜', '💝', '💞', '💟', '💠', '💡', '💢', '💣', '💤', '💥', '💦', '💧', '💨', '💩', '💪', '💫', '💬', '💭', '💮', '💯', '💰', '💱', '💲', '💳', '💴', '💵', '💶', '💷', '💸', '💹', '💺', '💽', '💾', '💿', '📀', '📁', '📂', '📃', '📄', '📅', '📆', '📇', '📈', '📉', '📊', '📋', '📌', '📍', '📎', '📏', '📐', '📑', '📒', '📓', '📔', '📕', '📖', '📗', '📘', '📙', '📚', '📛', '📜', '📝', '📞', '📟', '📠', '📡', '📢', '📣', '📤', '📥', '📦', '📧', '📨', '📩', '📪', '📫', '📬', '📭', '📮', '📯', '📰', '📱', '📲', '📳', '📴', '📵', '📶', '📷', '📸', '📹', '📺', '📻', '📼', '📽', '📿', '🔀', '🔁', '🔂', '🔃', '🔄', '🔅', '🔆', '🔇', '🔈', '🔉', '🔊', '🔋', '🔌', '🔍', '🔎', '🔏', '🔐', '🔑', '🔒', '🔓', '🔔', '🔕', '🔖', '🔗', '🔘', '🔙', '🔚', '🔛', '🔜', '🔝', '🔞', '🔟', '🔠', '🔡', '🔢', '🔣', '🔤', '🔥', '🔦', '🔨', '🔩', '🔪', '🔫', '🔭', '🔮', '🔯', '🔰', '🔱', '🔲', '🔳', '🔴', '🔵', '🔶', '🔷', '🔸', '🔹', '🔺', '🔻', '🔼', '🔽', '🕉', '🕊', '🕋', '🕌', '🕍', '🕎', '🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛', '🕜', '🕝', '🕞', '🕟', '🕠', '🕡', '🕢', '🕣', '🕤', '🕥', '🕦', '🕧', '🕯', '🕰', '🕳', '🕴', '🕵', '🕶', '🕷', '🕸', '🕹', '🕺', '🖇', '🖊', '🖋', '🖌', '🖍', '🖐', '🖕', '🖖', '🖤', '🖥', '🖨', '🖱', '🖲', '🖼', '🗂', '🗃', '🗄', '🗑', '🗒', '🗓', '🗜', '🗝', '🗞', '🗡', '🗣', '🗯', '🗳', '🗺', '🗻', '🗼', '🗽', '🗾', '🗿', '😀', '😁', '😂', '😃', '😄', '😅', '😆', '😇', '😈', '😉', '😊', '😋', '😌', '😍', '😎', '😏', '😐', '😑', '😒', '😓', '😔', '😕', '😖', '😗', '😘', '😙', '😚', '😛', '😜', '😝', '😞', '😟', '😠', '😡', '😢', '😣', '😤', '😥', '😦', '😧', '😨', '😩', '😪', '😫', '😬', '😭', '😮', '😯', '😰', '😱', '😲', '😳', '😴', '😵', '😶', '😷', '😸', '😹', '😺', '😻', '😼', '😽', '😾', '😿', '🙀', '🙁', '🙂', '🙃', '🙄', '🙅', '🙆', '🙇', '🙈', '🙉', '🙊', '🙋', '🙌', '🙍', '🙎', '🙏', '🚁', '🚂', '🚃', '🚄', '🚅', '🚆', '🚇', '🚈', '🚉', '🚊', '🚋', '🚌', '🚍', '🚎', '🚏', '🚐', '🚑', '🚓', '🚔', '🚕', '🚖', '🚗', '🚘', '🚙', '🚚', '🚛', '🚜', '🚝', '🚞', '🚟', '🚠', '🚡', '🚢', '🚣', '🚤', '🚥', '🚦', '🚧', '🚨', '🚩', '🚪', '🚫', '🚬', '🚭', '🚮', '🚯', '🚰', '🚱', '🚲', '🚳', '🚴', '🚵', '🚶', '🚷', '🚸', '🚹', '🚺', '🚻', '🚼', '🚽', '🚾', '🚿', '🛀', '🛁', '🛂', '🛃', '🛄', '🛅', '🛋', '🛌', '🛍', '🛎', '🛏', '🛐', '🛑', '🛒', '🛕', '🛖', '🛗', '🛜', '🛝', '🛞', '🛟', '🛠', '🛡', '🛢', '🛣', '🛤', '🛥', '🛩', '🛫', '🛬', '🛰', '🛳', '🛴', '🛵', '🛶', '🛷', '🛸', '🛹', '🛺', '🛻', '🛼', '🟠', '🟡', '🟢', '🟣', '🟤', '🟥', '🟦', '🟧', '🟨', '🟩', '🟪', '🟫', '🟰', '🤌', '🤍', '🤎', '🤏', '🤐', '🤑', '🤒', '🤓', '🤔', '🤕', '🤖', '🤗', '🤘', '🤙', '🤚', '🤛', '🤜', '🤞', '🤟', '🤠', '🤡', '🤢', '🤣', '🤤', '🤥', '🤦', '🤧', '🤨', '🤩', '🤪', '🤫', '🤬', '🤭', '🤮', '🤯', '🤰', '🤱', '🤲', '🤳', '🤴', '🤵', '🤶', '🤷', '🤸', '🤹', '🤺', '🤼', '🤽', '🤾', '🤿', '🥀', '🥁', '🥂', '🥃', '🥄', '🥅', '🥇', '🥈', '🥉', '🥊', '🥋', '🥌', '🥍', '🥎', '🥏', '🥐', '🥑', '🥒', '🥓', '🥔', '🥕', '🥖', '🥗', '🥘', '🥙', '🥚', '🥛', '🥜', '🥝', '🥞', '🥟', '🥠', '🥡', '🥢', '🥣', '🥤', '🥥', '🥦', '🥧', '🥨', '🥩', '🥪', '🥫', '🥬', '🥭', '🥮', '🥯', '🥰', '🥱', '🥲', '🥳', '🥴', '🥵', '🥶', '🥷', '🥸', '🥹', '🥺', '🥻', '🥼', '🥽', '🥾', '🥿', '🦀', '🦁', '🦂', '🦃', '🦄', '🦅', '🦆', '🦇', '🦈', '🦉', '🦊', '🦋', '🦌', '🦍', '🦎', '🦏', '🦐', '🦑', '🦒', '🦓', '🦔', '🦕', '🦖', '🦗', '🦘', '🦙', '🦚', '🦛', '🦜', '🦝', '🦞', '🦟', '🦠', '🦡', '🦢', '🦣', '🦤', '🦥', '🦦', '🦧', '🦨', '🦩', '🦪', '🦫', '🦬', '🦭', '🦮', '🦴', '🦵', '🦶', '🦷', '🦸', '🦹', '🦻', '🦾', '🦿', '🧀', '🧁', '🧂', '🧃', '🧄', '🧅', '🧆', '🧇', '🧈', '🧉', '🧊', '🧋', '🧌', '🧍', '🧎', '🧏', '🧐', '🧑', '🧒', '🧓', '🧔', '🧕', '🧖', '🧗', '🧘', '🧙', '🧚', '🧛', '🧜', '🧝', '🧞', '🧟', '🧠', '🧡', '🧢', '🧣', '🧤', '🧥', '🧦', '🧧', '🧨', '🧩', '🧪', '🧫', '🧬', '🧭', '🧮', '🧯', '🧰', '🧱', '🧲', '🧳', '🧴', '🧵', '🧶', '🧷', '🧸', '🧹', '🧺', '🧻', '🧼', '🧽', '🧾', '🧿', '🩰', '🩱', '🩲', '🩳', '🩴', '🩵', '🩶', '🩷', '🩸', '🩹', '🩺', '🩻', '🩼', '🪀', '🪁', '🪂', '🪃', '🪄', '🪅', '🪆', '🪇', '🪈', '🪐', '🪑', '🪒', '🪓', '🪔', '🪕', '🪖', '🪗', '🪘', '🪙', '🪚', '🪛', '🪜', '🪝', '🪞', '🪟', '🪠', '🪡', '🪢', '🪣', '🪤', '🪥', '🪦', '🪧', '🪨', '🪩', '🪪', '🪫', '🪬', '🪭', '🪮', '🪯', '🪰', '🪱', '🪲', '🪳', '🪴', '🪵', '🪶', '🪷', '🪸', '🪹', '🪺', '🪻', '🪼', '🪽', '🪿', '🫀', '🫁', '🫂', '🫃', '🫄', '🫅', '🫎', '🫏', '🫐', '🫑', '🫒', '🫓', '🫔', '🫕', '🫖', '🫗', '🫘', '🫙', '🫚', '🫛', '🫠', '🫡', '🫢', '🫣', '🫤', '🫥', '🫦', '🫧', '🫨', '🫰', '🫱', '🫲', '🫳', '🫴', '🫵', '🫶', '🫷', '🫸', '‼', '⁉', '™', 'ℹ', '↔', '↕', '↖', '↗', '↘', '↙', '↩', '↪', '⃣', '⌚', '⌛', '⌨', '⏏', '⏩', '⏪', '⏫', '⏬', '⏭', '⏮', '⏯', '⏰', '⏱', '⏲', '⏳', '⏸', '⏹', '⏺', 'Ⓜ', '▪', '▫', '▶', '◀', '◻', '◼', '◽', '◾', '☀', '☁', '☂', '☃', '☄', '☎', '☑', '☔', '☕', '☘', '☝', '☢', '☣', '☦', '☪', '☮', '☯', '☸', '☹', '☺', '♈', '♉', '♊', '♋', '♌', '♍', '♎', '♏', '♐', '♑', '♒', '♓', '♟', '♠', '♣', '♥', '♦', '♨', '♻', '♾', '♿', '⚒', '⚓', '⚔', '⚗', '⚙', '⚛', '⚜', '⚠', '⚡', '⚪', '⚫', '⚰', '⚱', '⚽', '⚾', '⛄', '⛅', '⛈', '⛎', '⛏', '⛑', '⛓', '⛔', '⛩', '⛪', '⛰', '⛱', '⛲', '⛳', '⛴', '⛵', '⛷', '⛸', '⛹', '⛺', '⛽', '✂', '✅', '✉', '✊', '✋', '✌', '✍', '✏', '✒', '✔', '✖', '✝', '✡', '✨', '✳', '✴', '❇', '❌', '❎', '❓', '❔', '❕', '❗', '❣', '➕', '➖', '➗', '➡', '➰', '➿', '⤴', '⤵', '⬅', '⬆', '⬇', '⬜', '⭐', '⭕', '〰', '〽', '㊗', '㊙', '' );
// END: emoji arrays
if ( 'entities' === $type ) {
return $entities;
}
return $partials;
}
/**
* Shortens a URL, to be used as link text.
*
* @since 1.2.0
* @since 4.4.0 Moved to wp-includes/formatting.php from wp-admin/includes/misc.php and added $length param.
*
* @param string $url URL to shorten.
* @param int $length Optional. Maximum length of the shortened URL. Default 35 characters.
* @return string Shortened URL.
*/
function url_shorten( $url, $length = 35 ) {
$stripped = str_replace( array( 'https://', 'http://', 'www.' ), '', $url );
$short_url = untrailingslashit( $stripped );
if ( strlen( $short_url ) > $length ) {
$short_url = substr( $short_url, 0, $length - 3 ) . '…';
}
return $short_url;
}
/**
* Sanitizes a hex color.
*
* Returns either '', a 3 or 6 digit hex color (with #), or nothing.
* For sanitizing values without a #, see sanitize_hex_color_no_hash().
*
* @since 3.4.0
*
* @param string $color
* @return string|void
*/
function sanitize_hex_color( $color ) {
if ( '' === $color ) {
return '';
}
// 3 or 6 hex digits, or the empty string.
if ( preg_match( '|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) {
return $color;
}
}
/**
* Sanitizes a hex color without a hash. Use sanitize_hex_color() when possible.
*
* Saving hex colors without a hash puts the burden of adding the hash on the
* UI, which makes it difficult to use or upgrade to other color types such as
* rgba, hsl, rgb, and HTML color names.
*
* Returns either '', a 3 or 6 digit hex color (without a #), or null.
*
* @since 3.4.0
*
* @param string $color
* @return string|null
*/
function sanitize_hex_color_no_hash( $color ) {
$color = ltrim( $color, '#' );
if ( '' === $color ) {
return '';
}
return sanitize_hex_color( '#' . $color ) ? $color : null;
}
/**
* Ensures that any hex color is properly hashed.
* Otherwise, returns value untouched.
*
* This method should only be necessary if using sanitize_hex_color_no_hash().
*
* @since 3.4.0
*
* @param string $color
* @return string
*/
function maybe_hash_hex_color( $color ) {
$unhashed = sanitize_hex_color_no_hash( $color );
if ( $unhashed ) {
return '#' . $unhashed;
}
return $color;
}