angelovcom.net

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

formatting.php (326624B)


      1 <?php
      2 /**
      3  * Main WordPress Formatting API.
      4  *
      5  * Handles many functions for formatting output.
      6  *
      7  * @package WordPress
      8  */
      9 
     10 /**
     11  * Replaces common plain text characters with formatted entities.
     12  *
     13  * Returns given text with transformations of quotes into smart quotes, apostrophes,
     14  * dashes, ellipses, the trademark symbol, and the multiplication symbol.
     15  *
     16  * As an example,
     17  *
     18  *     'cause today's effort makes it worth tomorrow's "holiday" ...
     19  *
     20  * Becomes:
     21  *
     22  *     &#8217;cause today&#8217;s effort makes it worth tomorrow&#8217;s &#8220;holiday&#8221; &#8230;
     23  *
     24  * Code within certain HTML blocks are skipped.
     25  *
     26  * Do not use this function before the {@see 'init'} action hook; everything will break.
     27  *
     28  * @since 0.71
     29  *
     30  * @global array $wp_cockneyreplace Array of formatted entities for certain common phrases.
     31  * @global array $shortcode_tags
     32  *
     33  * @param string $text  The text to be formatted.
     34  * @param bool   $reset Set to true for unit testing. Translated patterns will reset.
     35  * @return string The string replaced with HTML entities.
     36  */
     37 function wptexturize( $text, $reset = false ) {
     38 	global $wp_cockneyreplace, $shortcode_tags;
     39 	static $static_characters            = null,
     40 		$static_replacements             = null,
     41 		$dynamic_characters              = null,
     42 		$dynamic_replacements            = null,
     43 		$default_no_texturize_tags       = null,
     44 		$default_no_texturize_shortcodes = null,
     45 		$run_texturize                   = true,
     46 		$apos                            = null,
     47 		$prime                           = null,
     48 		$double_prime                    = null,
     49 		$opening_quote                   = null,
     50 		$closing_quote                   = null,
     51 		$opening_single_quote            = null,
     52 		$closing_single_quote            = null,
     53 		$open_q_flag                     = '<!--oq-->',
     54 		$open_sq_flag                    = '<!--osq-->',
     55 		$apos_flag                       = '<!--apos-->';
     56 
     57 	// If there's nothing to do, just stop.
     58 	if ( empty( $text ) || false === $run_texturize ) {
     59 		return $text;
     60 	}
     61 
     62 	// Set up static variables. Run once only.
     63 	if ( $reset || ! isset( $static_characters ) ) {
     64 		/**
     65 		 * Filters whether to skip running wptexturize().
     66 		 *
     67 		 * Returning false from the filter will effectively short-circuit wptexturize()
     68 		 * and return the original text passed to the function instead.
     69 		 *
     70 		 * The filter runs only once, the first time wptexturize() is called.
     71 		 *
     72 		 * @since 4.0.0
     73 		 *
     74 		 * @see wptexturize()
     75 		 *
     76 		 * @param bool $run_texturize Whether to short-circuit wptexturize().
     77 		 */
     78 		$run_texturize = apply_filters( 'run_wptexturize', $run_texturize );
     79 		if ( false === $run_texturize ) {
     80 			return $text;
     81 		}
     82 
     83 		/* translators: Opening curly double quote. */
     84 		$opening_quote = _x( '&#8220;', 'opening curly double quote' );
     85 		/* translators: Closing curly double quote. */
     86 		$closing_quote = _x( '&#8221;', 'closing curly double quote' );
     87 
     88 		/* translators: Apostrophe, for example in 'cause or can't. */
     89 		$apos = _x( '&#8217;', 'apostrophe' );
     90 
     91 		/* translators: Prime, for example in 9' (nine feet). */
     92 		$prime = _x( '&#8242;', 'prime' );
     93 		/* translators: Double prime, for example in 9" (nine inches). */
     94 		$double_prime = _x( '&#8243;', 'double prime' );
     95 
     96 		/* translators: Opening curly single quote. */
     97 		$opening_single_quote = _x( '&#8216;', 'opening curly single quote' );
     98 		/* translators: Closing curly single quote. */
     99 		$closing_single_quote = _x( '&#8217;', 'closing curly single quote' );
    100 
    101 		/* translators: En dash. */
    102 		$en_dash = _x( '&#8211;', 'en dash' );
    103 		/* translators: Em dash. */
    104 		$em_dash = _x( '&#8212;', 'em dash' );
    105 
    106 		$default_no_texturize_tags       = array( 'pre', 'code', 'kbd', 'style', 'script', 'tt' );
    107 		$default_no_texturize_shortcodes = array( 'code' );
    108 
    109 		// If a plugin has provided an autocorrect array, use it.
    110 		if ( isset( $wp_cockneyreplace ) ) {
    111 			$cockney        = array_keys( $wp_cockneyreplace );
    112 			$cockneyreplace = array_values( $wp_cockneyreplace );
    113 		} else {
    114 			/*
    115 			 * translators: This is a comma-separated list of words that defy the syntax of quotations in normal use,
    116 			 * for example... 'We do not have enough words yet'... is a typical quoted phrase. But when we write
    117 			 * lines of code 'til we have enough of 'em, then we need to insert apostrophes instead of quotes.
    118 			 */
    119 			$cockney = explode(
    120 				',',
    121 				_x(
    122 					"'tain't,'twere,'twas,'tis,'twill,'til,'bout,'nuff,'round,'cause,'em",
    123 					'Comma-separated list of words to texturize in your language'
    124 				)
    125 			);
    126 
    127 			$cockneyreplace = explode(
    128 				',',
    129 				_x(
    130 					'&#8217;tain&#8217;t,&#8217;twere,&#8217;twas,&#8217;tis,&#8217;twill,&#8217;til,&#8217;bout,&#8217;nuff,&#8217;round,&#8217;cause,&#8217;em',
    131 					'Comma-separated list of replacement words in your language'
    132 				)
    133 			);
    134 		}
    135 
    136 		$static_characters   = array_merge( array( '...', '``', '\'\'', ' (tm)' ), $cockney );
    137 		$static_replacements = array_merge( array( '&#8230;', $opening_quote, $closing_quote, ' &#8482;' ), $cockneyreplace );
    138 
    139 		// Pattern-based replacements of characters.
    140 		// Sort the remaining patterns into several arrays for performance tuning.
    141 		$dynamic_characters   = array(
    142 			'apos'  => array(),
    143 			'quote' => array(),
    144 			'dash'  => array(),
    145 		);
    146 		$dynamic_replacements = array(
    147 			'apos'  => array(),
    148 			'quote' => array(),
    149 			'dash'  => array(),
    150 		);
    151 		$dynamic              = array();
    152 		$spaces               = wp_spaces_regexp();
    153 
    154 		// '99' and '99" are ambiguous among other patterns; assume it's an abbreviated year at the end of a quotation.
    155 		if ( "'" !== $apos || "'" !== $closing_single_quote ) {
    156 			$dynamic[ '/\'(\d\d)\'(?=\Z|[.,:;!?)}\-\]]|&gt;|' . $spaces . ')/' ] = $apos_flag . '$1' . $closing_single_quote;
    157 		}
    158 		if ( "'" !== $apos || '"' !== $closing_quote ) {
    159 			$dynamic[ '/\'(\d\d)"(?=\Z|[.,:;!?)}\-\]]|&gt;|' . $spaces . ')/' ] = $apos_flag . '$1' . $closing_quote;
    160 		}
    161 
    162 		// '99 '99s '99's (apostrophe)  But never '9 or '99% or '999 or '99.0.
    163 		if ( "'" !== $apos ) {
    164 			$dynamic['/\'(?=\d\d(?:\Z|(?![%\d]|[.,]\d)))/'] = $apos_flag;
    165 		}
    166 
    167 		// Quoted numbers like '0.42'.
    168 		if ( "'" !== $opening_single_quote && "'" !== $closing_single_quote ) {
    169 			$dynamic[ '/(?<=\A|' . $spaces . ')\'(\d[.,\d]*)\'/' ] = $open_sq_flag . '$1' . $closing_single_quote;
    170 		}
    171 
    172 		// Single quote at start, or preceded by (, {, <, [, ", -, or spaces.
    173 		if ( "'" !== $opening_single_quote ) {
    174 			$dynamic[ '/(?<=\A|[([{"\-]|&lt;|' . $spaces . ')\'/' ] = $open_sq_flag;
    175 		}
    176 
    177 		// Apostrophe in a word. No spaces, double apostrophes, or other punctuation.
    178 		if ( "'" !== $apos ) {
    179 			$dynamic[ '/(?<!' . $spaces . ')\'(?!\Z|[.,:;!?"\'(){}[\]\-]|&[lg]t;|' . $spaces . ')/' ] = $apos_flag;
    180 		}
    181 
    182 		$dynamic_characters['apos']   = array_keys( $dynamic );
    183 		$dynamic_replacements['apos'] = array_values( $dynamic );
    184 		$dynamic                      = array();
    185 
    186 		// Quoted numbers like "42".
    187 		if ( '"' !== $opening_quote && '"' !== $closing_quote ) {
    188 			$dynamic[ '/(?<=\A|' . $spaces . ')"(\d[.,\d]*)"/' ] = $open_q_flag . '$1' . $closing_quote;
    189 		}
    190 
    191 		// Double quote at start, or preceded by (, {, <, [, -, or spaces, and not followed by spaces.
    192 		if ( '"' !== $opening_quote ) {
    193 			$dynamic[ '/(?<=\A|[([{\-]|&lt;|' . $spaces . ')"(?!' . $spaces . ')/' ] = $open_q_flag;
    194 		}
    195 
    196 		$dynamic_characters['quote']   = array_keys( $dynamic );
    197 		$dynamic_replacements['quote'] = array_values( $dynamic );
    198 		$dynamic                       = array();
    199 
    200 		// Dashes and spaces.
    201 		$dynamic['/---/'] = $em_dash;
    202 		$dynamic[ '/(?<=^|' . $spaces . ')--(?=$|' . $spaces . ')/' ] = $em_dash;
    203 		$dynamic['/(?<!xn)--/']                                       = $en_dash;
    204 		$dynamic[ '/(?<=^|' . $spaces . ')-(?=$|' . $spaces . ')/' ]  = $en_dash;
    205 
    206 		$dynamic_characters['dash']   = array_keys( $dynamic );
    207 		$dynamic_replacements['dash'] = array_values( $dynamic );
    208 	}
    209 
    210 	// Must do this every time in case plugins use these filters in a context sensitive manner.
    211 	/**
    212 	 * Filters the list of HTML elements not to texturize.
    213 	 *
    214 	 * @since 2.8.0
    215 	 *
    216 	 * @param string[] $default_no_texturize_tags An array of HTML element names.
    217 	 */
    218 	$no_texturize_tags = apply_filters( 'no_texturize_tags', $default_no_texturize_tags );
    219 	/**
    220 	 * Filters the list of shortcodes not to texturize.
    221 	 *
    222 	 * @since 2.8.0
    223 	 *
    224 	 * @param string[] $default_no_texturize_shortcodes An array of shortcode names.
    225 	 */
    226 	$no_texturize_shortcodes = apply_filters( 'no_texturize_shortcodes', $default_no_texturize_shortcodes );
    227 
    228 	$no_texturize_tags_stack       = array();
    229 	$no_texturize_shortcodes_stack = array();
    230 
    231 	// Look for shortcodes and HTML elements.
    232 
    233 	preg_match_all( '@\[/?([^<>&/\[\]\x00-\x20=]++)@', $text, $matches );
    234 	$tagnames         = array_intersect( array_keys( $shortcode_tags ), $matches[1] );
    235 	$found_shortcodes = ! empty( $tagnames );
    236 	$shortcode_regex  = $found_shortcodes ? _get_wptexturize_shortcode_regex( $tagnames ) : '';
    237 	$regex            = _get_wptexturize_split_regex( $shortcode_regex );
    238 
    239 	$textarr = preg_split( $regex, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );
    240 
    241 	foreach ( $textarr as &$curl ) {
    242 		// Only call _wptexturize_pushpop_element if $curl is a delimiter.
    243 		$first = $curl[0];
    244 		if ( '<' === $first ) {
    245 			if ( '<!--' === substr( $curl, 0, 4 ) ) {
    246 				// This is an HTML comment delimiter.
    247 				continue;
    248 			} else {
    249 				// This is an HTML element delimiter.
    250 
    251 				// Replace each & with &#038; unless it already looks like an entity.
    252 				$curl = preg_replace( '/&(?!#(?:\d+|x[a-f0-9]+);|[a-z1-4]{1,8};)/i', '&#038;', $curl );
    253 
    254 				_wptexturize_pushpop_element( $curl, $no_texturize_tags_stack, $no_texturize_tags );
    255 			}
    256 		} elseif ( '' === trim( $curl ) ) {
    257 			// This is a newline between delimiters. Performance improves when we check this.
    258 			continue;
    259 
    260 		} elseif ( '[' === $first && $found_shortcodes && 1 === preg_match( '/^' . $shortcode_regex . '$/', $curl ) ) {
    261 			// This is a shortcode delimiter.
    262 
    263 			if ( '[[' !== substr( $curl, 0, 2 ) && ']]' !== substr( $curl, -2 ) ) {
    264 				// Looks like a normal shortcode.
    265 				_wptexturize_pushpop_element( $curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes );
    266 			} else {
    267 				// Looks like an escaped shortcode.
    268 				continue;
    269 			}
    270 		} elseif ( empty( $no_texturize_shortcodes_stack ) && empty( $no_texturize_tags_stack ) ) {
    271 			// This is neither a delimiter, nor is this content inside of no_texturize pairs. Do texturize.
    272 
    273 			$curl = str_replace( $static_characters, $static_replacements, $curl );
    274 
    275 			if ( false !== strpos( $curl, "'" ) ) {
    276 				$curl = preg_replace( $dynamic_characters['apos'], $dynamic_replacements['apos'], $curl );
    277 				$curl = wptexturize_primes( $curl, "'", $prime, $open_sq_flag, $closing_single_quote );
    278 				$curl = str_replace( $apos_flag, $apos, $curl );
    279 				$curl = str_replace( $open_sq_flag, $opening_single_quote, $curl );
    280 			}
    281 			if ( false !== strpos( $curl, '"' ) ) {
    282 				$curl = preg_replace( $dynamic_characters['quote'], $dynamic_replacements['quote'], $curl );
    283 				$curl = wptexturize_primes( $curl, '"', $double_prime, $open_q_flag, $closing_quote );
    284 				$curl = str_replace( $open_q_flag, $opening_quote, $curl );
    285 			}
    286 			if ( false !== strpos( $curl, '-' ) ) {
    287 				$curl = preg_replace( $dynamic_characters['dash'], $dynamic_replacements['dash'], $curl );
    288 			}
    289 
    290 			// 9x9 (times), but never 0x9999.
    291 			if ( 1 === preg_match( '/(?<=\d)x\d/', $curl ) ) {
    292 				// Searching for a digit is 10 times more expensive than for the x, so we avoid doing this one!
    293 				$curl = preg_replace( '/\b(\d(?(?<=0)[\d\.,]+|[\d\.,]*))x(\d[\d\.,]*)\b/', '$1&#215;$2', $curl );
    294 			}
    295 
    296 			// Replace each & with &#038; unless it already looks like an entity.
    297 			$curl = preg_replace( '/&(?!#(?:\d+|x[a-f0-9]+);|[a-z1-4]{1,8};)/i', '&#038;', $curl );
    298 		}
    299 	}
    300 
    301 	return implode( '', $textarr );
    302 }
    303 
    304 /**
    305  * Implements a logic tree to determine whether or not "7'." represents seven feet,
    306  * then converts the special char into either a prime char or a closing quote char.
    307  *
    308  * @since 4.3.0
    309  *
    310  * @param string $haystack    The plain text to be searched.
    311  * @param string $needle      The character to search for such as ' or ".
    312  * @param string $prime       The prime char to use for replacement.
    313  * @param string $open_quote  The opening quote char. Opening quote replacement must be
    314  *                            accomplished already.
    315  * @param string $close_quote The closing quote char to use for replacement.
    316  * @return string The $haystack value after primes and quotes replacements.
    317  */
    318 function wptexturize_primes( $haystack, $needle, $prime, $open_quote, $close_quote ) {
    319 	$spaces           = wp_spaces_regexp();
    320 	$flag             = '<!--wp-prime-or-quote-->';
    321 	$quote_pattern    = "/$needle(?=\\Z|[.,:;!?)}\\-\\]]|&gt;|" . $spaces . ')/';
    322 	$prime_pattern    = "/(?<=\\d)$needle/";
    323 	$flag_after_digit = "/(?<=\\d)$flag/";
    324 	$flag_no_digit    = "/(?<!\\d)$flag/";
    325 
    326 	$sentences = explode( $open_quote, $haystack );
    327 
    328 	foreach ( $sentences as $key => &$sentence ) {
    329 		if ( false === strpos( $sentence, $needle ) ) {
    330 			continue;
    331 		} elseif ( 0 !== $key && 0 === substr_count( $sentence, $close_quote ) ) {
    332 			$sentence = preg_replace( $quote_pattern, $flag, $sentence, -1, $count );
    333 			if ( $count > 1 ) {
    334 				// This sentence appears to have multiple closing quotes. Attempt Vulcan logic.
    335 				$sentence = preg_replace( $flag_no_digit, $close_quote, $sentence, -1, $count2 );
    336 				if ( 0 === $count2 ) {
    337 					// Try looking for a quote followed by a period.
    338 					$count2 = substr_count( $sentence, "$flag." );
    339 					if ( $count2 > 0 ) {
    340 						// Assume the rightmost quote-period match is the end of quotation.
    341 						$pos = strrpos( $sentence, "$flag." );
    342 					} else {
    343 						// When all else fails, make the rightmost candidate a closing quote.
    344 						// This is most likely to be problematic in the context of bug #18549.
    345 						$pos = strrpos( $sentence, $flag );
    346 					}
    347 					$sentence = substr_replace( $sentence, $close_quote, $pos, strlen( $flag ) );
    348 				}
    349 				// Use conventional replacement on any remaining primes and quotes.
    350 				$sentence = preg_replace( $prime_pattern, $prime, $sentence );
    351 				$sentence = preg_replace( $flag_after_digit, $prime, $sentence );
    352 				$sentence = str_replace( $flag, $close_quote, $sentence );
    353 			} elseif ( 1 == $count ) {
    354 				// Found only one closing quote candidate, so give it priority over primes.
    355 				$sentence = str_replace( $flag, $close_quote, $sentence );
    356 				$sentence = preg_replace( $prime_pattern, $prime, $sentence );
    357 			} else {
    358 				// No closing quotes found. Just run primes pattern.
    359 				$sentence = preg_replace( $prime_pattern, $prime, $sentence );
    360 			}
    361 		} else {
    362 			$sentence = preg_replace( $prime_pattern, $prime, $sentence );
    363 			$sentence = preg_replace( $quote_pattern, $close_quote, $sentence );
    364 		}
    365 		if ( '"' === $needle && false !== strpos( $sentence, '"' ) ) {
    366 			$sentence = str_replace( '"', $close_quote, $sentence );
    367 		}
    368 	}
    369 
    370 	return implode( $open_quote, $sentences );
    371 }
    372 
    373 /**
    374  * Search for disabled element tags. Push element to stack on tag open and pop
    375  * on tag close.
    376  *
    377  * Assumes first char of $text is tag opening and last char is tag closing.
    378  * Assumes second char of $text is optionally '/' to indicate closing as in </html>.
    379  *
    380  * @since 2.9.0
    381  * @access private
    382  *
    383  * @param string   $text              Text to check. Must be a tag like `<html>` or `[shortcode]`.
    384  * @param string[] $stack             Array of open tag elements.
    385  * @param string[] $disabled_elements Array of tag names to match against. Spaces are not allowed in tag names.
    386  */
    387 function _wptexturize_pushpop_element( $text, &$stack, $disabled_elements ) {
    388 	// Is it an opening tag or closing tag?
    389 	if ( isset( $text[1] ) && '/' !== $text[1] ) {
    390 		$opening_tag = true;
    391 		$name_offset = 1;
    392 	} elseif ( 0 === count( $stack ) ) {
    393 		// Stack is empty. Just stop.
    394 		return;
    395 	} else {
    396 		$opening_tag = false;
    397 		$name_offset = 2;
    398 	}
    399 
    400 	// Parse out the tag name.
    401 	$space = strpos( $text, ' ' );
    402 	if ( false === $space ) {
    403 		$space = -1;
    404 	} else {
    405 		$space -= $name_offset;
    406 	}
    407 	$tag = substr( $text, $name_offset, $space );
    408 
    409 	// Handle disabled tags.
    410 	if ( in_array( $tag, $disabled_elements, true ) ) {
    411 		if ( $opening_tag ) {
    412 			/*
    413 			 * This disables texturize until we find a closing tag of our type
    414 			 * (e.g. <pre>) even if there was invalid nesting before that.
    415 			 *
    416 			 * Example: in the case <pre>sadsadasd</code>"baba"</pre>
    417 			 *          "baba" won't be texturized.
    418 			 */
    419 
    420 			array_push( $stack, $tag );
    421 		} elseif ( end( $stack ) == $tag ) {
    422 			array_pop( $stack );
    423 		}
    424 	}
    425 }
    426 
    427 /**
    428  * Replaces double line breaks with paragraph elements.
    429  *
    430  * A group of regex replaces used to identify text formatted with newlines and
    431  * replace double line breaks with HTML paragraph tags. The remaining line breaks
    432  * after conversion become <<br />> tags, unless $br is set to '0' or 'false'.
    433  *
    434  * @since 0.71
    435  *
    436  * @param string $pee The text which has to be formatted.
    437  * @param bool   $br  Optional. If set, this will convert all remaining line breaks
    438  *                    after paragraphing. Line breaks within `<script>`, `<style>`,
    439  *                    and `<svg>` tags are not affected. Default true.
    440  * @return string Text which has been converted into correct paragraph tags.
    441  */
    442 function wpautop( $pee, $br = true ) {
    443 	$pre_tags = array();
    444 
    445 	if ( trim( $pee ) === '' ) {
    446 		return '';
    447 	}
    448 
    449 	// Just to make things a little easier, pad the end.
    450 	$pee = $pee . "\n";
    451 
    452 	/*
    453 	 * Pre tags shouldn't be touched by autop.
    454 	 * Replace pre tags with placeholders and bring them back after autop.
    455 	 */
    456 	if ( strpos( $pee, '<pre' ) !== false ) {
    457 		$pee_parts = explode( '</pre>', $pee );
    458 		$last_pee  = array_pop( $pee_parts );
    459 		$pee       = '';
    460 		$i         = 0;
    461 
    462 		foreach ( $pee_parts as $pee_part ) {
    463 			$start = strpos( $pee_part, '<pre' );
    464 
    465 			// Malformed HTML?
    466 			if ( false === $start ) {
    467 				$pee .= $pee_part;
    468 				continue;
    469 			}
    470 
    471 			$name              = "<pre wp-pre-tag-$i></pre>";
    472 			$pre_tags[ $name ] = substr( $pee_part, $start ) . '</pre>';
    473 
    474 			$pee .= substr( $pee_part, 0, $start ) . $name;
    475 			$i++;
    476 		}
    477 
    478 		$pee .= $last_pee;
    479 	}
    480 	// Change multiple <br>'s into two line breaks, which will turn into paragraphs.
    481 	$pee = preg_replace( '|<br\s*/?>\s*<br\s*/?>|', "\n\n", $pee );
    482 
    483 	$allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)';
    484 
    485 	// Add a double line break above block-level opening tags.
    486 	$pee = preg_replace( '!(<' . $allblocks . '[\s/>])!', "\n\n$1", $pee );
    487 
    488 	// Add a double line break below block-level closing tags.
    489 	$pee = preg_replace( '!(</' . $allblocks . '>)!', "$1\n\n", $pee );
    490 
    491 	// Add a double line break after hr tags, which are self closing.
    492 	$pee = preg_replace( '!(<hr\s*?/?>)!', "$1\n\n", $pee );
    493 
    494 	// Standardize newline characters to "\n".
    495 	$pee = str_replace( array( "\r\n", "\r" ), "\n", $pee );
    496 
    497 	// Find newlines in all elements and add placeholders.
    498 	$pee = wp_replace_in_html_tags( $pee, array( "\n" => ' <!-- wpnl --> ' ) );
    499 
    500 	// Collapse line breaks before and after <option> elements so they don't get autop'd.
    501 	if ( strpos( $pee, '<option' ) !== false ) {
    502 		$pee = preg_replace( '|\s*<option|', '<option', $pee );
    503 		$pee = preg_replace( '|</option>\s*|', '</option>', $pee );
    504 	}
    505 
    506 	/*
    507 	 * Collapse line breaks inside <object> elements, before <param> and <embed> elements
    508 	 * so they don't get autop'd.
    509 	 */
    510 	if ( strpos( $pee, '</object>' ) !== false ) {
    511 		$pee = preg_replace( '|(<object[^>]*>)\s*|', '$1', $pee );
    512 		$pee = preg_replace( '|\s*</object>|', '</object>', $pee );
    513 		$pee = preg_replace( '%\s*(</?(?:param|embed)[^>]*>)\s*%', '$1', $pee );
    514 	}
    515 
    516 	/*
    517 	 * Collapse line breaks inside <audio> and <video> elements,
    518 	 * before and after <source> and <track> elements.
    519 	 */
    520 	if ( strpos( $pee, '<source' ) !== false || strpos( $pee, '<track' ) !== false ) {
    521 		$pee = preg_replace( '%([<\[](?:audio|video)[^>\]]*[>\]])\s*%', '$1', $pee );
    522 		$pee = preg_replace( '%\s*([<\[]/(?:audio|video)[>\]])%', '$1', $pee );
    523 		$pee = preg_replace( '%\s*(<(?:source|track)[^>]*>)\s*%', '$1', $pee );
    524 	}
    525 
    526 	// Collapse line breaks before and after <figcaption> elements.
    527 	if ( strpos( $pee, '<figcaption' ) !== false ) {
    528 		$pee = preg_replace( '|\s*(<figcaption[^>]*>)|', '$1', $pee );
    529 		$pee = preg_replace( '|</figcaption>\s*|', '</figcaption>', $pee );
    530 	}
    531 
    532 	// Remove more than two contiguous line breaks.
    533 	$pee = preg_replace( "/\n\n+/", "\n\n", $pee );
    534 
    535 	// Split up the contents into an array of strings, separated by double line breaks.
    536 	$pees = preg_split( '/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY );
    537 
    538 	// Reset $pee prior to rebuilding.
    539 	$pee = '';
    540 
    541 	// Rebuild the content as a string, wrapping every bit with a <p>.
    542 	foreach ( $pees as $tinkle ) {
    543 		$pee .= '<p>' . trim( $tinkle, "\n" ) . "</p>\n";
    544 	}
    545 
    546 	// Under certain strange conditions it could create a P of entirely whitespace.
    547 	$pee = preg_replace( '|<p>\s*</p>|', '', $pee );
    548 
    549 	// Add a closing <p> inside <div>, <address>, or <form> tag if missing.
    550 	$pee = preg_replace( '!<p>([^<]+)</(div|address|form)>!', '<p>$1</p></$2>', $pee );
    551 
    552 	// If an opening or closing block element tag is wrapped in a <p>, unwrap it.
    553 	$pee = preg_replace( '!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', '$1', $pee );
    554 
    555 	// In some cases <li> may get wrapped in <p>, fix them.
    556 	$pee = preg_replace( '|<p>(<li.+?)</p>|', '$1', $pee );
    557 
    558 	// If a <blockquote> is wrapped with a <p>, move it inside the <blockquote>.
    559 	$pee = preg_replace( '|<p><blockquote([^>]*)>|i', '<blockquote$1><p>', $pee );
    560 	$pee = str_replace( '</blockquote></p>', '</p></blockquote>', $pee );
    561 
    562 	// If an opening or closing block element tag is preceded by an opening <p> tag, remove it.
    563 	$pee = preg_replace( '!<p>\s*(</?' . $allblocks . '[^>]*>)!', '$1', $pee );
    564 
    565 	// If an opening or closing block element tag is followed by a closing <p> tag, remove it.
    566 	$pee = preg_replace( '!(</?' . $allblocks . '[^>]*>)\s*</p>!', '$1', $pee );
    567 
    568 	// Optionally insert line breaks.
    569 	if ( $br ) {
    570 		// Replace newlines that shouldn't be touched with a placeholder.
    571 		$pee = preg_replace_callback( '/<(script|style|svg).*?<\/\\1>/s', '_autop_newline_preservation_helper', $pee );
    572 
    573 		// Normalize <br>
    574 		$pee = str_replace( array( '<br>', '<br/>' ), '<br />', $pee );
    575 
    576 		// Replace any new line characters that aren't preceded by a <br /> with a <br />.
    577 		$pee = preg_replace( '|(?<!<br />)\s*\n|', "<br />\n", $pee );
    578 
    579 		// Replace newline placeholders with newlines.
    580 		$pee = str_replace( '<WPPreserveNewline />', "\n", $pee );
    581 	}
    582 
    583 	// If a <br /> tag is after an opening or closing block tag, remove it.
    584 	$pee = preg_replace( '!(</?' . $allblocks . '[^>]*>)\s*<br />!', '$1', $pee );
    585 
    586 	// If a <br /> tag is before a subset of opening or closing block tags, remove it.
    587 	$pee = preg_replace( '!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee );
    588 	$pee = preg_replace( "|\n</p>$|", '</p>', $pee );
    589 
    590 	// Replace placeholder <pre> tags with their original content.
    591 	if ( ! empty( $pre_tags ) ) {
    592 		$pee = str_replace( array_keys( $pre_tags ), array_values( $pre_tags ), $pee );
    593 	}
    594 
    595 	// Restore newlines in all elements.
    596 	if ( false !== strpos( $pee, '<!-- wpnl -->' ) ) {
    597 		$pee = str_replace( array( ' <!-- wpnl --> ', '<!-- wpnl -->' ), "\n", $pee );
    598 	}
    599 
    600 	return $pee;
    601 }
    602 
    603 /**
    604  * Separate HTML elements and comments from the text.
    605  *
    606  * @since 4.2.4
    607  *
    608  * @param string $input The text which has to be formatted.
    609  * @return string[] Array of the formatted text.
    610  */
    611 function wp_html_split( $input ) {
    612 	return preg_split( get_html_split_regex(), $input, -1, PREG_SPLIT_DELIM_CAPTURE );
    613 }
    614 
    615 /**
    616  * Retrieve the regular expression for an HTML element.
    617  *
    618  * @since 4.4.0
    619  *
    620  * @return string The regular expression
    621  */
    622 function get_html_split_regex() {
    623 	static $regex;
    624 
    625 	if ( ! isset( $regex ) ) {
    626 		// phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation
    627 		$comments =
    628 			'!'             // Start of comment, after the <.
    629 			. '(?:'         // Unroll the loop: Consume everything until --> is found.
    630 			.     '-(?!->)' // Dash not followed by end of comment.
    631 			.     '[^\-]*+' // Consume non-dashes.
    632 			. ')*+'         // Loop possessively.
    633 			. '(?:-->)?';   // End of comment. If not found, match all input.
    634 
    635 		$cdata =
    636 			'!\[CDATA\['    // Start of comment, after the <.
    637 			. '[^\]]*+'     // Consume non-].
    638 			. '(?:'         // Unroll the loop: Consume everything until ]]> is found.
    639 			.     '](?!]>)' // One ] not followed by end of comment.
    640 			.     '[^\]]*+' // Consume non-].
    641 			. ')*+'         // Loop possessively.
    642 			. '(?:]]>)?';   // End of comment. If not found, match all input.
    643 
    644 		$escaped =
    645 			'(?='             // Is the element escaped?
    646 			.    '!--'
    647 			. '|'
    648 			.    '!\[CDATA\['
    649 			. ')'
    650 			. '(?(?=!-)'      // If yes, which type?
    651 			.     $comments
    652 			. '|'
    653 			.     $cdata
    654 			. ')';
    655 
    656 		$regex =
    657 			'/('                // Capture the entire match.
    658 			.     '<'           // Find start of element.
    659 			.     '(?'          // Conditional expression follows.
    660 			.         $escaped  // Find end of escaped element.
    661 			.     '|'           // ...else...
    662 			.         '[^>]*>?' // Find end of normal element.
    663 			.     ')'
    664 			. ')/';
    665 		// phpcs:enable
    666 	}
    667 
    668 	return $regex;
    669 }
    670 
    671 /**
    672  * Retrieve the combined regular expression for HTML and shortcodes.
    673  *
    674  * @access private
    675  * @ignore
    676  * @internal This function will be removed in 4.5.0 per Shortcode API Roadmap.
    677  * @since 4.4.0
    678  *
    679  * @param string $shortcode_regex The result from _get_wptexturize_shortcode_regex(). Optional.
    680  * @return string The regular expression
    681  */
    682 function _get_wptexturize_split_regex( $shortcode_regex = '' ) {
    683 	static $html_regex;
    684 
    685 	if ( ! isset( $html_regex ) ) {
    686 		// phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation
    687 		$comment_regex =
    688 			'!'             // Start of comment, after the <.
    689 			. '(?:'         // Unroll the loop: Consume everything until --> is found.
    690 			.     '-(?!->)' // Dash not followed by end of comment.
    691 			.     '[^\-]*+' // Consume non-dashes.
    692 			. ')*+'         // Loop possessively.
    693 			. '(?:-->)?';   // End of comment. If not found, match all input.
    694 
    695 		$html_regex = // Needs replaced with wp_html_split() per Shortcode API Roadmap.
    696 			'<'                  // Find start of element.
    697 			. '(?(?=!--)'        // Is this a comment?
    698 			.     $comment_regex // Find end of comment.
    699 			. '|'
    700 			.     '[^>]*>?'      // Find end of element. If not found, match all input.
    701 			. ')';
    702 		// phpcs:enable
    703 	}
    704 
    705 	if ( empty( $shortcode_regex ) ) {
    706 		$regex = '/(' . $html_regex . ')/';
    707 	} else {
    708 		$regex = '/(' . $html_regex . '|' . $shortcode_regex . ')/';
    709 	}
    710 
    711 	return $regex;
    712 }
    713 
    714 /**
    715  * Retrieve the regular expression for shortcodes.
    716  *
    717  * @access private
    718  * @ignore
    719  * @since 4.4.0
    720  *
    721  * @param string[] $tagnames Array of shortcodes to find.
    722  * @return string The regular expression
    723  */
    724 function _get_wptexturize_shortcode_regex( $tagnames ) {
    725 	$tagregexp = implode( '|', array_map( 'preg_quote', $tagnames ) );
    726 	$tagregexp = "(?:$tagregexp)(?=[\\s\\]\\/])"; // Excerpt of get_shortcode_regex().
    727 	// phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation
    728 	$regex =
    729 		'\['                // Find start of shortcode.
    730 		. '[\/\[]?'         // Shortcodes may begin with [/ or [[.
    731 		. $tagregexp        // Only match registered shortcodes, because performance.
    732 		. '(?:'
    733 		.     '[^\[\]<>]+'  // Shortcodes do not contain other shortcodes. Quantifier critical.
    734 		. '|'
    735 		.     '<[^\[\]>]*>' // HTML elements permitted. Prevents matching ] before >.
    736 		. ')*+'             // Possessive critical.
    737 		. '\]'              // Find end of shortcode.
    738 		. '\]?';            // Shortcodes may end with ]].
    739 	// phpcs:enable
    740 
    741 	return $regex;
    742 }
    743 
    744 /**
    745  * Replace characters or phrases within HTML elements only.
    746  *
    747  * @since 4.2.3
    748  *
    749  * @param string $haystack      The text which has to be formatted.
    750  * @param array  $replace_pairs In the form array('from' => 'to', ...).
    751  * @return string The formatted text.
    752  */
    753 function wp_replace_in_html_tags( $haystack, $replace_pairs ) {
    754 	// Find all elements.
    755 	$textarr = wp_html_split( $haystack );
    756 	$changed = false;
    757 
    758 	// Optimize when searching for one item.
    759 	if ( 1 === count( $replace_pairs ) ) {
    760 		// Extract $needle and $replace.
    761 		foreach ( $replace_pairs as $needle => $replace ) {
    762 		}
    763 
    764 		// Loop through delimiters (elements) only.
    765 		for ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {
    766 			if ( false !== strpos( $textarr[ $i ], $needle ) ) {
    767 				$textarr[ $i ] = str_replace( $needle, $replace, $textarr[ $i ] );
    768 				$changed       = true;
    769 			}
    770 		}
    771 	} else {
    772 		// Extract all $needles.
    773 		$needles = array_keys( $replace_pairs );
    774 
    775 		// Loop through delimiters (elements) only.
    776 		for ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {
    777 			foreach ( $needles as $needle ) {
    778 				if ( false !== strpos( $textarr[ $i ], $needle ) ) {
    779 					$textarr[ $i ] = strtr( $textarr[ $i ], $replace_pairs );
    780 					$changed       = true;
    781 					// After one strtr() break out of the foreach loop and look at next element.
    782 					break;
    783 				}
    784 			}
    785 		}
    786 	}
    787 
    788 	if ( $changed ) {
    789 		$haystack = implode( $textarr );
    790 	}
    791 
    792 	return $haystack;
    793 }
    794 
    795 /**
    796  * Newline preservation help function for wpautop
    797  *
    798  * @since 3.1.0
    799  * @access private
    800  *
    801  * @param array $matches preg_replace_callback matches array
    802  * @return string
    803  */
    804 function _autop_newline_preservation_helper( $matches ) {
    805 	return str_replace( "\n", '<WPPreserveNewline />', $matches[0] );
    806 }
    807 
    808 /**
    809  * Don't auto-p wrap shortcodes that stand alone
    810  *
    811  * Ensures that shortcodes are not wrapped in `<p>...</p>`.
    812  *
    813  * @since 2.9.0
    814  *
    815  * @global array $shortcode_tags
    816  *
    817  * @param string $pee The content.
    818  * @return string The filtered content.
    819  */
    820 function shortcode_unautop( $pee ) {
    821 	global $shortcode_tags;
    822 
    823 	if ( empty( $shortcode_tags ) || ! is_array( $shortcode_tags ) ) {
    824 		return $pee;
    825 	}
    826 
    827 	$tagregexp = implode( '|', array_map( 'preg_quote', array_keys( $shortcode_tags ) ) );
    828 	$spaces    = wp_spaces_regexp();
    829 
    830 	// phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound,WordPress.WhiteSpace.PrecisionAlignment.Found -- don't remove regex indentation
    831 	$pattern =
    832 		'/'
    833 		. '<p>'                              // Opening paragraph.
    834 		. '(?:' . $spaces . ')*+'            // Optional leading whitespace.
    835 		. '('                                // 1: The shortcode.
    836 		.     '\\['                          // Opening bracket.
    837 		.     "($tagregexp)"                 // 2: Shortcode name.
    838 		.     '(?![\\w-])'                   // Not followed by word character or hyphen.
    839 											 // Unroll the loop: Inside the opening shortcode tag.
    840 		.     '[^\\]\\/]*'                   // Not a closing bracket or forward slash.
    841 		.     '(?:'
    842 		.         '\\/(?!\\])'               // A forward slash not followed by a closing bracket.
    843 		.         '[^\\]\\/]*'               // Not a closing bracket or forward slash.
    844 		.     ')*?'
    845 		.     '(?:'
    846 		.         '\\/\\]'                   // Self closing tag and closing bracket.
    847 		.     '|'
    848 		.         '\\]'                      // Closing bracket.
    849 		.         '(?:'                      // Unroll the loop: Optionally, anything between the opening and closing shortcode tags.
    850 		.             '[^\\[]*+'             // Not an opening bracket.
    851 		.             '(?:'
    852 		.                 '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag.
    853 		.                 '[^\\[]*+'         // Not an opening bracket.
    854 		.             ')*+'
    855 		.             '\\[\\/\\2\\]'         // Closing shortcode tag.
    856 		.         ')?'
    857 		.     ')'
    858 		. ')'
    859 		. '(?:' . $spaces . ')*+'            // Optional trailing whitespace.
    860 		. '<\\/p>'                           // Closing paragraph.
    861 		. '/';
    862 	// phpcs:enable
    863 
    864 	return preg_replace( $pattern, '$1', $pee );
    865 }
    866 
    867 /**
    868  * Checks to see if a string is utf8 encoded.
    869  *
    870  * NOTE: This function checks for 5-Byte sequences, UTF8
    871  *       has Bytes Sequences with a maximum length of 4.
    872  *
    873  * @author bmorel at ssi dot fr (modified)
    874  * @since 1.2.1
    875  *
    876  * @param string $str The string to be checked
    877  * @return bool True if $str fits a UTF-8 model, false otherwise.
    878  */
    879 function seems_utf8( $str ) {
    880 	mbstring_binary_safe_encoding();
    881 	$length = strlen( $str );
    882 	reset_mbstring_encoding();
    883 	for ( $i = 0; $i < $length; $i++ ) {
    884 		$c = ord( $str[ $i ] );
    885 		if ( $c < 0x80 ) {
    886 			$n = 0; // 0bbbbbbb
    887 		} elseif ( ( $c & 0xE0 ) == 0xC0 ) {
    888 			$n = 1; // 110bbbbb
    889 		} elseif ( ( $c & 0xF0 ) == 0xE0 ) {
    890 			$n = 2; // 1110bbbb
    891 		} elseif ( ( $c & 0xF8 ) == 0xF0 ) {
    892 			$n = 3; // 11110bbb
    893 		} elseif ( ( $c & 0xFC ) == 0xF8 ) {
    894 			$n = 4; // 111110bb
    895 		} elseif ( ( $c & 0xFE ) == 0xFC ) {
    896 			$n = 5; // 1111110b
    897 		} else {
    898 			return false; // Does not match any model.
    899 		}
    900 		for ( $j = 0; $j < $n; $j++ ) { // n bytes matching 10bbbbbb follow ?
    901 			if ( ( ++$i == $length ) || ( ( ord( $str[ $i ] ) & 0xC0 ) != 0x80 ) ) {
    902 				return false;
    903 			}
    904 		}
    905 	}
    906 	return true;
    907 }
    908 
    909 /**
    910  * Converts a number of special characters into their HTML entities.
    911  *
    912  * Specifically deals with: &, <, >, ", and '.
    913  *
    914  * $quote_style can be set to ENT_COMPAT to encode " to
    915  * &quot;, or ENT_QUOTES to do both. Default is ENT_NOQUOTES where no quotes are encoded.
    916  *
    917  * @since 1.2.2
    918  * @since 5.5.0 `$quote_style` also accepts `ENT_XML1`.
    919  * @access private
    920  *
    921  * @param string       $string        The text which is to be encoded.
    922  * @param int|string   $quote_style   Optional. Converts double quotes if set to ENT_COMPAT,
    923  *                                    both single and double if set to ENT_QUOTES or none if set to ENT_NOQUOTES.
    924  *                                    Converts single and double quotes, as well as converting HTML
    925  *                                    named entities (that are not also XML named entities) to their
    926  *                                    code points if set to ENT_XML1. Also compatible with old values;
    927  *                                    converting single quotes if set to 'single',
    928  *                                    double if set to 'double' or both if otherwise set.
    929  *                                    Default is ENT_NOQUOTES.
    930  * @param false|string $charset       Optional. The character encoding of the string. Default false.
    931  * @param bool         $double_encode Optional. Whether to encode existing HTML entities. Default false.
    932  * @return string The encoded text with HTML entities.
    933  */
    934 function _wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) {
    935 	$string = (string) $string;
    936 
    937 	if ( 0 === strlen( $string ) ) {
    938 		return '';
    939 	}
    940 
    941 	// Don't bother if there are no specialchars - saves some processing.
    942 	if ( ! preg_match( '/[&<>"\']/', $string ) ) {
    943 		return $string;
    944 	}
    945 
    946 	// Account for the previous behaviour of the function when the $quote_style is not an accepted value.
    947 	if ( empty( $quote_style ) ) {
    948 		$quote_style = ENT_NOQUOTES;
    949 	} elseif ( ENT_XML1 === $quote_style ) {
    950 		$quote_style = ENT_QUOTES | ENT_XML1;
    951 	} elseif ( ! in_array( $quote_style, array( ENT_NOQUOTES, ENT_COMPAT, ENT_QUOTES, 'single', 'double' ), true ) ) {
    952 		$quote_style = ENT_QUOTES;
    953 	}
    954 
    955 	// Store the site charset as a static to avoid multiple calls to wp_load_alloptions().
    956 	if ( ! $charset ) {
    957 		static $_charset = null;
    958 		if ( ! isset( $_charset ) ) {
    959 			$alloptions = wp_load_alloptions();
    960 			$_charset   = isset( $alloptions['blog_charset'] ) ? $alloptions['blog_charset'] : '';
    961 		}
    962 		$charset = $_charset;
    963 	}
    964 
    965 	if ( in_array( $charset, array( 'utf8', 'utf-8', 'UTF8' ), true ) ) {
    966 		$charset = 'UTF-8';
    967 	}
    968 
    969 	$_quote_style = $quote_style;
    970 
    971 	if ( 'double' === $quote_style ) {
    972 		$quote_style  = ENT_COMPAT;
    973 		$_quote_style = ENT_COMPAT;
    974 	} elseif ( 'single' === $quote_style ) {
    975 		$quote_style = ENT_NOQUOTES;
    976 	}
    977 
    978 	if ( ! $double_encode ) {
    979 		// Guarantee every &entity; is valid, convert &garbage; into &amp;garbage;
    980 		// This is required for PHP < 5.4.0 because ENT_HTML401 flag is unavailable.
    981 		$string = wp_kses_normalize_entities( $string, ( $quote_style & ENT_XML1 ) ? 'xml' : 'html' );
    982 	}
    983 
    984 	$string = htmlspecialchars( $string, $quote_style, $charset, $double_encode );
    985 
    986 	// Back-compat.
    987 	if ( 'single' === $_quote_style ) {
    988 		$string = str_replace( "'", '&#039;', $string );
    989 	}
    990 
    991 	return $string;
    992 }
    993 
    994 /**
    995  * Converts a number of HTML entities into their special characters.
    996  *
    997  * Specifically deals with: &, <, >, ", and '.
    998  *
    999  * $quote_style can be set to ENT_COMPAT to decode " entities,
   1000  * or ENT_QUOTES to do both " and '. Default is ENT_NOQUOTES where no quotes are decoded.
   1001  *
   1002  * @since 2.8.0
   1003  *
   1004  * @param string     $string The text which is to be decoded.
   1005  * @param string|int $quote_style Optional. Converts double quotes if set to ENT_COMPAT,
   1006  *                                both single and double if set to ENT_QUOTES or
   1007  *                                none if set to ENT_NOQUOTES.
   1008  *                                Also compatible with old _wp_specialchars() values;
   1009  *                                converting single quotes if set to 'single',
   1010  *                                double if set to 'double' or both if otherwise set.
   1011  *                                Default is ENT_NOQUOTES.
   1012  * @return string The decoded text without HTML entities.
   1013  */
   1014 function wp_specialchars_decode( $string, $quote_style = ENT_NOQUOTES ) {
   1015 	$string = (string) $string;
   1016 
   1017 	if ( 0 === strlen( $string ) ) {
   1018 		return '';
   1019 	}
   1020 
   1021 	// Don't bother if there are no entities - saves a lot of processing.
   1022 	if ( strpos( $string, '&' ) === false ) {
   1023 		return $string;
   1024 	}
   1025 
   1026 	// Match the previous behaviour of _wp_specialchars() when the $quote_style is not an accepted value.
   1027 	if ( empty( $quote_style ) ) {
   1028 		$quote_style = ENT_NOQUOTES;
   1029 	} elseif ( ! in_array( $quote_style, array( 0, 2, 3, 'single', 'double' ), true ) ) {
   1030 		$quote_style = ENT_QUOTES;
   1031 	}
   1032 
   1033 	// More complete than get_html_translation_table( HTML_SPECIALCHARS ).
   1034 	$single      = array(
   1035 		'&#039;' => '\'',
   1036 		'&#x27;' => '\'',
   1037 	);
   1038 	$single_preg = array(
   1039 		'/&#0*39;/'   => '&#039;',
   1040 		'/&#x0*27;/i' => '&#x27;',
   1041 	);
   1042 	$double      = array(
   1043 		'&quot;' => '"',
   1044 		'&#034;' => '"',
   1045 		'&#x22;' => '"',
   1046 	);
   1047 	$double_preg = array(
   1048 		'/&#0*34;/'   => '&#034;',
   1049 		'/&#x0*22;/i' => '&#x22;',
   1050 	);
   1051 	$others      = array(
   1052 		'&lt;'   => '<',
   1053 		'&#060;' => '<',
   1054 		'&gt;'   => '>',
   1055 		'&#062;' => '>',
   1056 		'&amp;'  => '&',
   1057 		'&#038;' => '&',
   1058 		'&#x26;' => '&',
   1059 	);
   1060 	$others_preg = array(
   1061 		'/&#0*60;/'   => '&#060;',
   1062 		'/&#0*62;/'   => '&#062;',
   1063 		'/&#0*38;/'   => '&#038;',
   1064 		'/&#x0*26;/i' => '&#x26;',
   1065 	);
   1066 
   1067 	if ( ENT_QUOTES === $quote_style ) {
   1068 		$translation      = array_merge( $single, $double, $others );
   1069 		$translation_preg = array_merge( $single_preg, $double_preg, $others_preg );
   1070 	} elseif ( ENT_COMPAT === $quote_style || 'double' === $quote_style ) {
   1071 		$translation      = array_merge( $double, $others );
   1072 		$translation_preg = array_merge( $double_preg, $others_preg );
   1073 	} elseif ( 'single' === $quote_style ) {
   1074 		$translation      = array_merge( $single, $others );
   1075 		$translation_preg = array_merge( $single_preg, $others_preg );
   1076 	} elseif ( ENT_NOQUOTES === $quote_style ) {
   1077 		$translation      = $others;
   1078 		$translation_preg = $others_preg;
   1079 	}
   1080 
   1081 	// Remove zero padding on numeric entities.
   1082 	$string = preg_replace( array_keys( $translation_preg ), array_values( $translation_preg ), $string );
   1083 
   1084 	// Replace characters according to translation table.
   1085 	return strtr( $string, $translation );
   1086 }
   1087 
   1088 /**
   1089  * Checks for invalid UTF8 in a string.
   1090  *
   1091  * @since 2.8.0
   1092  *
   1093  * @param string $string The text which is to be checked.
   1094  * @param bool   $strip  Optional. Whether to attempt to strip out invalid UTF8. Default false.
   1095  * @return string The checked text.
   1096  */
   1097 function wp_check_invalid_utf8( $string, $strip = false ) {
   1098 	$string = (string) $string;
   1099 
   1100 	if ( 0 === strlen( $string ) ) {
   1101 		return '';
   1102 	}
   1103 
   1104 	// Store the site charset as a static to avoid multiple calls to get_option().
   1105 	static $is_utf8 = null;
   1106 	if ( ! isset( $is_utf8 ) ) {
   1107 		$is_utf8 = in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ), true );
   1108 	}
   1109 	if ( ! $is_utf8 ) {
   1110 		return $string;
   1111 	}
   1112 
   1113 	// Check for support for utf8 in the installed PCRE library once and store the result in a static.
   1114 	static $utf8_pcre = null;
   1115 	if ( ! isset( $utf8_pcre ) ) {
   1116 		// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
   1117 		$utf8_pcre = @preg_match( '/^./u', 'a' );
   1118 	}
   1119 	// We can't demand utf8 in the PCRE installation, so just return the string in those cases.
   1120 	if ( ! $utf8_pcre ) {
   1121 		return $string;
   1122 	}
   1123 
   1124 	// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- preg_match fails when it encounters invalid UTF8 in $string.
   1125 	if ( 1 === @preg_match( '/^./us', $string ) ) {
   1126 		return $string;
   1127 	}
   1128 
   1129 	// Attempt to strip the bad chars if requested (not recommended).
   1130 	if ( $strip && function_exists( 'iconv' ) ) {
   1131 		return iconv( 'utf-8', 'utf-8', $string );
   1132 	}
   1133 
   1134 	return '';
   1135 }
   1136 
   1137 /**
   1138  * Encode the Unicode values to be used in the URI.
   1139  *
   1140  * @since 1.5.0
   1141  *
   1142  * @param string $utf8_string
   1143  * @param int    $length Max  length of the string
   1144  * @return string String with Unicode encoded for URI.
   1145  */
   1146 function utf8_uri_encode( $utf8_string, $length = 0 ) {
   1147 	$unicode        = '';
   1148 	$values         = array();
   1149 	$num_octets     = 1;
   1150 	$unicode_length = 0;
   1151 
   1152 	mbstring_binary_safe_encoding();
   1153 	$string_length = strlen( $utf8_string );
   1154 	reset_mbstring_encoding();
   1155 
   1156 	for ( $i = 0; $i < $string_length; $i++ ) {
   1157 
   1158 		$value = ord( $utf8_string[ $i ] );
   1159 
   1160 		if ( $value < 128 ) {
   1161 			if ( $length && ( $unicode_length >= $length ) ) {
   1162 				break;
   1163 			}
   1164 			$unicode .= chr( $value );
   1165 			$unicode_length++;
   1166 		} else {
   1167 			if ( count( $values ) == 0 ) {
   1168 				if ( $value < 224 ) {
   1169 					$num_octets = 2;
   1170 				} elseif ( $value < 240 ) {
   1171 					$num_octets = 3;
   1172 				} else {
   1173 					$num_octets = 4;
   1174 				}
   1175 			}
   1176 
   1177 			$values[] = $value;
   1178 
   1179 			if ( $length && ( $unicode_length + ( $num_octets * 3 ) ) > $length ) {
   1180 				break;
   1181 			}
   1182 			if ( count( $values ) == $num_octets ) {
   1183 				for ( $j = 0; $j < $num_octets; $j++ ) {
   1184 					$unicode .= '%' . dechex( $values[ $j ] );
   1185 				}
   1186 
   1187 				$unicode_length += $num_octets * 3;
   1188 
   1189 				$values     = array();
   1190 				$num_octets = 1;
   1191 			}
   1192 		}
   1193 	}
   1194 
   1195 	return $unicode;
   1196 }
   1197 
   1198 /**
   1199  * Converts all accent characters to ASCII characters.
   1200  *
   1201  * If there are no accent characters, then the string given is just returned.
   1202  *
   1203  * **Accent characters converted:**
   1204  *
   1205  * Currency signs:
   1206  *
   1207  * |   Code   | Glyph | Replacement |     Description     |
   1208  * | -------- | ----- | ----------- | ------------------- |
   1209  * | U+00A3   | £     | (empty)     | British Pound sign  |
   1210  * | U+20AC   | €     | E           | Euro sign           |
   1211  *
   1212  * Decompositions for Latin-1 Supplement:
   1213  *
   1214  * |  Code   | Glyph | Replacement |               Description              |
   1215  * | ------- | ----- | ----------- | -------------------------------------- |
   1216  * | U+00AA  | ª     | a           | Feminine ordinal indicator             |
   1217  * | U+00BA  | º     | o           | Masculine ordinal indicator            |
   1218  * | U+00C0  | À     | A           | Latin capital letter A with grave      |
   1219  * | U+00C1  | Á     | A           | Latin capital letter A with acute      |
   1220  * | U+00C2  | Â     | A           | Latin capital letter A with circumflex |
   1221  * | U+00C3  | Ã     | A           | Latin capital letter A with tilde      |
   1222  * | U+00C4  | Ä     | A           | Latin capital letter A with diaeresis  |
   1223  * | U+00C5  | Å     | A           | Latin capital letter A with ring above |
   1224  * | U+00C6  | Æ     | AE          | Latin capital letter AE                |
   1225  * | U+00C7  | Ç     | C           | Latin capital letter C with cedilla    |
   1226  * | U+00C8  | È     | E           | Latin capital letter E with grave      |
   1227  * | U+00C9  | É     | E           | Latin capital letter E with acute      |
   1228  * | U+00CA  | Ê     | E           | Latin capital letter E with circumflex |
   1229  * | U+00CB  | Ë     | E           | Latin capital letter E with diaeresis  |
   1230  * | U+00CC  | Ì     | I           | Latin capital letter I with grave      |
   1231  * | U+00CD  | Í     | I           | Latin capital letter I with acute      |
   1232  * | U+00CE  | Î     | I           | Latin capital letter I with circumflex |
   1233  * | U+00CF  | Ï     | I           | Latin capital letter I with diaeresis  |
   1234  * | U+00D0  | Ð     | D           | Latin capital letter Eth               |
   1235  * | U+00D1  | Ñ     | N           | Latin capital letter N with tilde      |
   1236  * | U+00D2  | Ò     | O           | Latin capital letter O with grave      |
   1237  * | U+00D3  | Ó     | O           | Latin capital letter O with acute      |
   1238  * | U+00D4  | Ô     | O           | Latin capital letter O with circumflex |
   1239  * | U+00D5  | Õ     | O           | Latin capital letter O with tilde      |
   1240  * | U+00D6  | Ö     | O           | Latin capital letter O with diaeresis  |
   1241  * | U+00D8  | Ø     | O           | Latin capital letter O with stroke     |
   1242  * | U+00D9  | Ù     | U           | Latin capital letter U with grave      |
   1243  * | U+00DA  | Ú     | U           | Latin capital letter U with acute      |
   1244  * | U+00DB  | Û     | U           | Latin capital letter U with circumflex |
   1245  * | U+00DC  | Ü     | U           | Latin capital letter U with diaeresis  |
   1246  * | U+00DD  | Ý     | Y           | Latin capital letter Y with acute      |
   1247  * | U+00DE  | Þ     | TH          | Latin capital letter Thorn             |
   1248  * | U+00DF  | ß     | s           | Latin small letter sharp s             |
   1249  * | U+00E0  | à     | a           | Latin small letter a with grave        |
   1250  * | U+00E1  | á     | a           | Latin small letter a with acute        |
   1251  * | U+00E2  | â     | a           | Latin small letter a with circumflex   |
   1252  * | U+00E3  | ã     | a           | Latin small letter a with tilde        |
   1253  * | U+00E4  | ä     | a           | Latin small letter a with diaeresis    |
   1254  * | U+00E5  | å     | a           | Latin small letter a with ring above   |
   1255  * | U+00E6  | æ     | ae          | Latin small letter ae                  |
   1256  * | U+00E7  | ç     | c           | Latin small letter c with cedilla      |
   1257  * | U+00E8  | è     | e           | Latin small letter e with grave        |
   1258  * | U+00E9  | é     | e           | Latin small letter e with acute        |
   1259  * | U+00EA  | ê     | e           | Latin small letter e with circumflex   |
   1260  * | U+00EB  | ë     | e           | Latin small letter e with diaeresis    |
   1261  * | U+00EC  | ì     | i           | Latin small letter i with grave        |
   1262  * | U+00ED  | í     | i           | Latin small letter i with acute        |
   1263  * | U+00EE  | î     | i           | Latin small letter i with circumflex   |
   1264  * | U+00EF  | ï     | i           | Latin small letter i with diaeresis    |
   1265  * | U+00F0  | ð     | d           | Latin small letter Eth                 |
   1266  * | U+00F1  | ñ     | n           | Latin small letter n with tilde        |
   1267  * | U+00F2  | ò     | o           | Latin small letter o with grave        |
   1268  * | U+00F3  | ó     | o           | Latin small letter o with acute        |
   1269  * | U+00F4  | ô     | o           | Latin small letter o with circumflex   |
   1270  * | U+00F5  | õ     | o           | Latin small letter o with tilde        |
   1271  * | U+00F6  | ö     | o           | Latin small letter o with diaeresis    |
   1272  * | U+00F8  | ø     | o           | Latin small letter o with stroke       |
   1273  * | U+00F9  | ù     | u           | Latin small letter u with grave        |
   1274  * | U+00FA  | ú     | u           | Latin small letter u with acute        |
   1275  * | U+00FB  | û     | u           | Latin small letter u with circumflex   |
   1276  * | U+00FC  | ü     | u           | Latin small letter u with diaeresis    |
   1277  * | U+00FD  | ý     | y           | Latin small letter y with acute        |
   1278  * | U+00FE  | þ     | th          | Latin small letter Thorn               |
   1279  * | U+00FF  | ÿ     | y           | Latin small letter y with diaeresis    |
   1280  *
   1281  * Decompositions for Latin Extended-A:
   1282  *
   1283  * |  Code   | Glyph | Replacement |                    Description                    |
   1284  * | ------- | ----- | ----------- | ------------------------------------------------- |
   1285  * | U+0100  | Ā     | A           | Latin capital letter A with macron                |
   1286  * | U+0101  | ā     | a           | Latin small letter a with macron                  |
   1287  * | U+0102  | Ă     | A           | Latin capital letter A with breve                 |
   1288  * | U+0103  | ă     | a           | Latin small letter a with breve                   |
   1289  * | U+0104  | Ą     | A           | Latin capital letter A with ogonek                |
   1290  * | U+0105  | ą     | a           | Latin small letter a with ogonek                  |
   1291  * | U+01006 | Ć     | C           | Latin capital letter C with acute                 |
   1292  * | U+0107  | ć     | c           | Latin small letter c with acute                   |
   1293  * | U+0108  | Ĉ     | C           | Latin capital letter C with circumflex            |
   1294  * | U+0109  | ĉ     | c           | Latin small letter c with circumflex              |
   1295  * | U+010A  | Ċ     | C           | Latin capital letter C with dot above             |
   1296  * | U+010B  | ċ     | c           | Latin small letter c with dot above               |
   1297  * | U+010C  | Č     | C           | Latin capital letter C with caron                 |
   1298  * | U+010D  | č     | c           | Latin small letter c with caron                   |
   1299  * | U+010E  | Ď     | D           | Latin capital letter D with caron                 |
   1300  * | U+010F  | ď     | d           | Latin small letter d with caron                   |
   1301  * | U+0110  | Đ     | D           | Latin capital letter D with stroke                |
   1302  * | U+0111  | đ     | d           | Latin small letter d with stroke                  |
   1303  * | U+0112  | Ē     | E           | Latin capital letter E with macron                |
   1304  * | U+0113  | ē     | e           | Latin small letter e with macron                  |
   1305  * | U+0114  | Ĕ     | E           | Latin capital letter E with breve                 |
   1306  * | U+0115  | ĕ     | e           | Latin small letter e with breve                   |
   1307  * | U+0116  | Ė     | E           | Latin capital letter E with dot above             |
   1308  * | U+0117  | ė     | e           | Latin small letter e with dot above               |
   1309  * | U+0118  | Ę     | E           | Latin capital letter E with ogonek                |
   1310  * | U+0119  | ę     | e           | Latin small letter e with ogonek                  |
   1311  * | U+011A  | Ě     | E           | Latin capital letter E with caron                 |
   1312  * | U+011B  | ě     | e           | Latin small letter e with caron                   |
   1313  * | U+011C  | Ĝ     | G           | Latin capital letter G with circumflex            |
   1314  * | U+011D  | ĝ     | g           | Latin small letter g with circumflex              |
   1315  * | U+011E  | Ğ     | G           | Latin capital letter G with breve                 |
   1316  * | U+011F  | ğ     | g           | Latin small letter g with breve                   |
   1317  * | U+0120  | Ġ     | G           | Latin capital letter G with dot above             |
   1318  * | U+0121  | ġ     | g           | Latin small letter g with dot above               |
   1319  * | U+0122  | Ģ     | G           | Latin capital letter G with cedilla               |
   1320  * | U+0123  | ģ     | g           | Latin small letter g with cedilla                 |
   1321  * | U+0124  | Ĥ     | H           | Latin capital letter H with circumflex            |
   1322  * | U+0125  | ĥ     | h           | Latin small letter h with circumflex              |
   1323  * | U+0126  | Ħ     | H           | Latin capital letter H with stroke                |
   1324  * | U+0127  | ħ     | h           | Latin small letter h with stroke                  |
   1325  * | U+0128  | Ĩ     | I           | Latin capital letter I with tilde                 |
   1326  * | U+0129  | ĩ     | i           | Latin small letter i with tilde                   |
   1327  * | U+012A  | Ī     | I           | Latin capital letter I with macron                |
   1328  * | U+012B  | ī     | i           | Latin small letter i with macron                  |
   1329  * | U+012C  | Ĭ     | I           | Latin capital letter I with breve                 |
   1330  * | U+012D  | ĭ     | i           | Latin small letter i with breve                   |
   1331  * | U+012E  | Į     | I           | Latin capital letter I with ogonek                |
   1332  * | U+012F  | į     | i           | Latin small letter i with ogonek                  |
   1333  * | U+0130  | İ     | I           | Latin capital letter I with dot above             |
   1334  * | U+0131  | ı     | i           | Latin small letter dotless i                      |
   1335  * | U+0132  | IJ     | IJ          | Latin capital ligature IJ                         |
   1336  * | U+0133  | ij     | ij          | Latin small ligature ij                           |
   1337  * | U+0134  | Ĵ     | J           | Latin capital letter J with circumflex            |
   1338  * | U+0135  | ĵ     | j           | Latin small letter j with circumflex              |
   1339  * | U+0136  | Ķ     | K           | Latin capital letter K with cedilla               |
   1340  * | U+0137  | ķ     | k           | Latin small letter k with cedilla                 |
   1341  * | U+0138  | ĸ     | k           | Latin small letter Kra                            |
   1342  * | U+0139  | Ĺ     | L           | Latin capital letter L with acute                 |
   1343  * | U+013A  | ĺ     | l           | Latin small letter l with acute                   |
   1344  * | U+013B  | Ļ     | L           | Latin capital letter L with cedilla               |
   1345  * | U+013C  | ļ     | l           | Latin small letter l with cedilla                 |
   1346  * | U+013D  | Ľ     | L           | Latin capital letter L with caron                 |
   1347  * | U+013E  | ľ     | l           | Latin small letter l with caron                   |
   1348  * | U+013F  | Ŀ     | L           | Latin capital letter L with middle dot            |
   1349  * | U+0140  | ŀ     | l           | Latin small letter l with middle dot              |
   1350  * | U+0141  | Ł     | L           | Latin capital letter L with stroke                |
   1351  * | U+0142  | ł     | l           | Latin small letter l with stroke                  |
   1352  * | U+0143  | Ń     | N           | Latin capital letter N with acute                 |
   1353  * | U+0144  | ń     | n           | Latin small letter N with acute                   |
   1354  * | U+0145  | Ņ     | N           | Latin capital letter N with cedilla               |
   1355  * | U+0146  | ņ     | n           | Latin small letter n with cedilla                 |
   1356  * | U+0147  | Ň     | N           | Latin capital letter N with caron                 |
   1357  * | U+0148  | ň     | n           | Latin small letter n with caron                   |
   1358  * | U+0149  | ʼn     | n           | Latin small letter n preceded by apostrophe       |
   1359  * | U+014A  | Ŋ     | N           | Latin capital letter Eng                          |
   1360  * | U+014B  | ŋ     | n           | Latin small letter Eng                            |
   1361  * | U+014C  | Ō     | O           | Latin capital letter O with macron                |
   1362  * | U+014D  | ō     | o           | Latin small letter o with macron                  |
   1363  * | U+014E  | Ŏ     | O           | Latin capital letter O with breve                 |
   1364  * | U+014F  | ŏ     | o           | Latin small letter o with breve                   |
   1365  * | U+0150  | Ő     | O           | Latin capital letter O with double acute          |
   1366  * | U+0151  | ő     | o           | Latin small letter o with double acute            |
   1367  * | U+0152  | Œ     | OE          | Latin capital ligature OE                         |
   1368  * | U+0153  | œ     | oe          | Latin small ligature oe                           |
   1369  * | U+0154  | Ŕ     | R           | Latin capital letter R with acute                 |
   1370  * | U+0155  | ŕ     | r           | Latin small letter r with acute                   |
   1371  * | U+0156  | Ŗ     | R           | Latin capital letter R with cedilla               |
   1372  * | U+0157  | ŗ     | r           | Latin small letter r with cedilla                 |
   1373  * | U+0158  | Ř     | R           | Latin capital letter R with caron                 |
   1374  * | U+0159  | ř     | r           | Latin small letter r with caron                   |
   1375  * | U+015A  | Ś     | S           | Latin capital letter S with acute                 |
   1376  * | U+015B  | ś     | s           | Latin small letter s with acute                   |
   1377  * | U+015C  | Ŝ     | S           | Latin capital letter S with circumflex            |
   1378  * | U+015D  | ŝ     | s           | Latin small letter s with circumflex              |
   1379  * | U+015E  | Ş     | S           | Latin capital letter S with cedilla               |
   1380  * | U+015F  | ş     | s           | Latin small letter s with cedilla                 |
   1381  * | U+0160  | Š     | S           | Latin capital letter S with caron                 |
   1382  * | U+0161  | š     | s           | Latin small letter s with caron                   |
   1383  * | U+0162  | Ţ     | T           | Latin capital letter T with cedilla               |
   1384  * | U+0163  | ţ     | t           | Latin small letter t with cedilla                 |
   1385  * | U+0164  | Ť     | T           | Latin capital letter T with caron                 |
   1386  * | U+0165  | ť     | t           | Latin small letter t with caron                   |
   1387  * | U+0166  | Ŧ     | T           | Latin capital letter T with stroke                |
   1388  * | U+0167  | ŧ     | t           | Latin small letter t with stroke                  |
   1389  * | U+0168  | Ũ     | U           | Latin capital letter U with tilde                 |
   1390  * | U+0169  | ũ     | u           | Latin small letter u with tilde                   |
   1391  * | U+016A  | Ū     | U           | Latin capital letter U with macron                |
   1392  * | U+016B  | ū     | u           | Latin small letter u with macron                  |
   1393  * | U+016C  | Ŭ     | U           | Latin capital letter U with breve                 |
   1394  * | U+016D  | ŭ     | u           | Latin small letter u with breve                   |
   1395  * | U+016E  | Ů     | U           | Latin capital letter U with ring above            |
   1396  * | U+016F  | ů     | u           | Latin small letter u with ring above              |
   1397  * | U+0170  | Ű     | U           | Latin capital letter U with double acute          |
   1398  * | U+0171  | ű     | u           | Latin small letter u with double acute            |
   1399  * | U+0172  | Ų     | U           | Latin capital letter U with ogonek                |
   1400  * | U+0173  | ų     | u           | Latin small letter u with ogonek                  |
   1401  * | U+0174  | Ŵ     | W           | Latin capital letter W with circumflex            |
   1402  * | U+0175  | ŵ     | w           | Latin small letter w with circumflex              |
   1403  * | U+0176  | Ŷ     | Y           | Latin capital letter Y with circumflex            |
   1404  * | U+0177  | ŷ     | y           | Latin small letter y with circumflex              |
   1405  * | U+0178  | Ÿ     | Y           | Latin capital letter Y with diaeresis             |
   1406  * | U+0179  | Ź     | Z           | Latin capital letter Z with acute                 |
   1407  * | U+017A  | ź     | z           | Latin small letter z with acute                   |
   1408  * | U+017B  | Ż     | Z           | Latin capital letter Z with dot above             |
   1409  * | U+017C  | ż     | z           | Latin small letter z with dot above               |
   1410  * | U+017D  | Ž     | Z           | Latin capital letter Z with caron                 |
   1411  * | U+017E  | ž     | z           | Latin small letter z with caron                   |
   1412  * | U+017F  | ſ     | s           | Latin small letter long s                         |
   1413  * | U+01A0  | Ơ     | O           | Latin capital letter O with horn                  |
   1414  * | U+01A1  | ơ     | o           | Latin small letter o with horn                    |
   1415  * | U+01AF  | Ư     | U           | Latin capital letter U with horn                  |
   1416  * | U+01B0  | ư     | u           | Latin small letter u with horn                    |
   1417  * | U+01CD  | Ǎ     | A           | Latin capital letter A with caron                 |
   1418  * | U+01CE  | ǎ     | a           | Latin small letter a with caron                   |
   1419  * | U+01CF  | Ǐ     | I           | Latin capital letter I with caron                 |
   1420  * | U+01D0  | ǐ     | i           | Latin small letter i with caron                   |
   1421  * | U+01D1  | Ǒ     | O           | Latin capital letter O with caron                 |
   1422  * | U+01D2  | ǒ     | o           | Latin small letter o with caron                   |
   1423  * | U+01D3  | Ǔ     | U           | Latin capital letter U with caron                 |
   1424  * | U+01D4  | ǔ     | u           | Latin small letter u with caron                   |
   1425  * | U+01D5  | Ǖ     | U           | Latin capital letter U with diaeresis and macron  |
   1426  * | U+01D6  | ǖ     | u           | Latin small letter u with diaeresis and macron    |
   1427  * | U+01D7  | Ǘ     | U           | Latin capital letter U with diaeresis and acute   |
   1428  * | U+01D8  | ǘ     | u           | Latin small letter u with diaeresis and acute     |
   1429  * | U+01D9  | Ǚ     | U           | Latin capital letter U with diaeresis and caron   |
   1430  * | U+01DA  | ǚ     | u           | Latin small letter u with diaeresis and caron     |
   1431  * | U+01DB  | Ǜ     | U           | Latin capital letter U with diaeresis and grave   |
   1432  * | U+01DC  | ǜ     | u           | Latin small letter u with diaeresis and grave     |
   1433  *
   1434  * Decompositions for Latin Extended-B:
   1435  *
   1436  * |   Code   | Glyph | Replacement |                Description                |
   1437  * | -------- | ----- | ----------- | ----------------------------------------- |
   1438  * | U+0218   | Ș     | S           | Latin capital letter S with comma below   |
   1439  * | U+0219   | ș     | s           | Latin small letter s with comma below     |
   1440  * | U+021A   | Ț     | T           | Latin capital letter T with comma below   |
   1441  * | U+021B   | ț     | t           | Latin small letter t with comma below     |
   1442  *
   1443  * Vowels with diacritic (Chinese, Hanyu Pinyin):
   1444  *
   1445  * |   Code   | Glyph | Replacement |                      Description                      |
   1446  * | -------- | ----- | ----------- | ----------------------------------------------------- |
   1447  * | U+0251   | ɑ     | a           | Latin small letter alpha                              |
   1448  * | U+1EA0   | Ạ     | A           | Latin capital letter A with dot below                 |
   1449  * | U+1EA1   | ạ     | a           | Latin small letter a with dot below                   |
   1450  * | U+1EA2   | Ả     | A           | Latin capital letter A with hook above                |
   1451  * | U+1EA3   | ả     | a           | Latin small letter a with hook above                  |
   1452  * | U+1EA4   | Ấ     | A           | Latin capital letter A with circumflex and acute      |
   1453  * | U+1EA5   | ấ     | a           | Latin small letter a with circumflex and acute        |
   1454  * | U+1EA6   | Ầ     | A           | Latin capital letter A with circumflex and grave      |
   1455  * | U+1EA7   | ầ     | a           | Latin small letter a with circumflex and grave        |
   1456  * | U+1EA8   | Ẩ     | A           | Latin capital letter A with circumflex and hook above |
   1457  * | U+1EA9   | ẩ     | a           | Latin small letter a with circumflex and hook above   |
   1458  * | U+1EAA   | Ẫ     | A           | Latin capital letter A with circumflex and tilde      |
   1459  * | U+1EAB   | ẫ     | a           | Latin small letter a with circumflex and tilde        |
   1460  * | U+1EA6   | Ậ     | A           | Latin capital letter A with circumflex and dot below  |
   1461  * | U+1EAD   | ậ     | a           | Latin small letter a with circumflex and dot below    |
   1462  * | U+1EAE   | Ắ     | A           | Latin capital letter A with breve and acute           |
   1463  * | U+1EAF   | ắ     | a           | Latin small letter a with breve and acute             |
   1464  * | U+1EB0   | Ằ     | A           | Latin capital letter A with breve and grave           |
   1465  * | U+1EB1   | ằ     | a           | Latin small letter a with breve and grave             |
   1466  * | U+1EB2   | Ẳ     | A           | Latin capital letter A with breve and hook above      |
   1467  * | U+1EB3   | ẳ     | a           | Latin small letter a with breve and hook above        |
   1468  * | U+1EB4   | Ẵ     | A           | Latin capital letter A with breve and tilde           |
   1469  * | U+1EB5   | ẵ     | a           | Latin small letter a with breve and tilde             |
   1470  * | U+1EB6   | Ặ     | A           | Latin capital letter A with breve and dot below       |
   1471  * | U+1EB7   | ặ     | a           | Latin small letter a with breve and dot below         |
   1472  * | U+1EB8   | Ẹ     | E           | Latin capital letter E with dot below                 |
   1473  * | U+1EB9   | ẹ     | e           | Latin small letter e with dot below                   |
   1474  * | U+1EBA   | Ẻ     | E           | Latin capital letter E with hook above                |
   1475  * | U+1EBB   | ẻ     | e           | Latin small letter e with hook above                  |
   1476  * | U+1EBC   | Ẽ     | E           | Latin capital letter E with tilde                     |
   1477  * | U+1EBD   | ẽ     | e           | Latin small letter e with tilde                       |
   1478  * | U+1EBE   | Ế     | E           | Latin capital letter E with circumflex and acute      |
   1479  * | U+1EBF   | ế     | e           | Latin small letter e with circumflex and acute        |
   1480  * | U+1EC0   | Ề     | E           | Latin capital letter E with circumflex and grave      |
   1481  * | U+1EC1   | ề     | e           | Latin small letter e with circumflex and grave        |
   1482  * | U+1EC2   | Ể     | E           | Latin capital letter E with circumflex and hook above |
   1483  * | U+1EC3   | ể     | e           | Latin small letter e with circumflex and hook above   |
   1484  * | U+1EC4   | Ễ     | E           | Latin capital letter E with circumflex and tilde      |
   1485  * | U+1EC5   | ễ     | e           | Latin small letter e with circumflex and tilde        |
   1486  * | U+1EC6   | Ệ     | E           | Latin capital letter E with circumflex and dot below  |
   1487  * | U+1EC7   | ệ     | e           | Latin small letter e with circumflex and dot below    |
   1488  * | U+1EC8   | Ỉ     | I           | Latin capital letter I with hook above                |
   1489  * | U+1EC9   | ỉ     | i           | Latin small letter i with hook above                  |
   1490  * | U+1ECA   | Ị     | I           | Latin capital letter I with dot below                 |
   1491  * | U+1ECB   | ị     | i           | Latin small letter i with dot below                   |
   1492  * | U+1ECC   | Ọ     | O           | Latin capital letter O with dot below                 |
   1493  * | U+1ECD   | ọ     | o           | Latin small letter o with dot below                   |
   1494  * | U+1ECE   | Ỏ     | O           | Latin capital letter O with hook above                |
   1495  * | U+1ECF   | ỏ     | o           | Latin small letter o with hook above                  |
   1496  * | U+1ED0   | Ố     | O           | Latin capital letter O with circumflex and acute      |
   1497  * | U+1ED1   | ố     | o           | Latin small letter o with circumflex and acute        |
   1498  * | U+1ED2   | Ồ     | O           | Latin capital letter O with circumflex and grave      |
   1499  * | U+1ED3   | ồ     | o           | Latin small letter o with circumflex and grave        |
   1500  * | U+1ED4   | Ổ     | O           | Latin capital letter O with circumflex and hook above |
   1501  * | U+1ED5   | ổ     | o           | Latin small letter o with circumflex and hook above   |
   1502  * | U+1ED6   | Ỗ     | O           | Latin capital letter O with circumflex and tilde      |
   1503  * | U+1ED7   | ỗ     | o           | Latin small letter o with circumflex and tilde        |
   1504  * | U+1ED8   | Ộ     | O           | Latin capital letter O with circumflex and dot below  |
   1505  * | U+1ED9   | ộ     | o           | Latin small letter o with circumflex and dot below    |
   1506  * | U+1EDA   | Ớ     | O           | Latin capital letter O with horn and acute            |
   1507  * | U+1EDB   | ớ     | o           | Latin small letter o with horn and acute              |
   1508  * | U+1EDC   | Ờ     | O           | Latin capital letter O with horn and grave            |
   1509  * | U+1EDD   | ờ     | o           | Latin small letter o with horn and grave              |
   1510  * | U+1EDE   | Ở     | O           | Latin capital letter O with horn and hook above       |
   1511  * | U+1EDF   | ở     | o           | Latin small letter o with horn and hook above         |
   1512  * | U+1EE0   | Ỡ     | O           | Latin capital letter O with horn and tilde            |
   1513  * | U+1EE1   | ỡ     | o           | Latin small letter o with horn and tilde              |
   1514  * | U+1EE2   | Ợ     | O           | Latin capital letter O with horn and dot below        |
   1515  * | U+1EE3   | ợ     | o           | Latin small letter o with horn and dot below          |
   1516  * | U+1EE4   | Ụ     | U           | Latin capital letter U with dot below                 |
   1517  * | U+1EE5   | ụ     | u           | Latin small letter u with dot below                   |
   1518  * | U+1EE6   | Ủ     | U           | Latin capital letter U with hook above                |
   1519  * | U+1EE7   | ủ     | u           | Latin small letter u with hook above                  |
   1520  * | U+1EE8   | Ứ     | U           | Latin capital letter U with horn and acute            |
   1521  * | U+1EE9   | ứ     | u           | Latin small letter u with horn and acute              |
   1522  * | U+1EEA   | Ừ     | U           | Latin capital letter U with horn and grave            |
   1523  * | U+1EEB   | ừ     | u           | Latin small letter u with horn and grave              |
   1524  * | U+1EEC   | Ử     | U           | Latin capital letter U with horn and hook above       |
   1525  * | U+1EED   | ử     | u           | Latin small letter u with horn and hook above         |
   1526  * | U+1EEE   | Ữ     | U           | Latin capital letter U with horn and tilde            |
   1527  * | U+1EEF   | ữ     | u           | Latin small letter u with horn and tilde              |
   1528  * | U+1EF0   | Ự     | U           | Latin capital letter U with horn and dot below        |
   1529  * | U+1EF1   | ự     | u           | Latin small letter u with horn and dot below          |
   1530  * | U+1EF2   | Ỳ     | Y           | Latin capital letter Y with grave                     |
   1531  * | U+1EF3   | ỳ     | y           | Latin small letter y with grave                       |
   1532  * | U+1EF4   | Ỵ     | Y           | Latin capital letter Y with dot below                 |
   1533  * | U+1EF5   | ỵ     | y           | Latin small letter y with dot below                   |
   1534  * | U+1EF6   | Ỷ     | Y           | Latin capital letter Y with hook above                |
   1535  * | U+1EF7   | ỷ     | y           | Latin small letter y with hook above                  |
   1536  * | U+1EF8   | Ỹ     | Y           | Latin capital letter Y with tilde                     |
   1537  * | U+1EF9   | ỹ     | y           | Latin small letter y with tilde                       |
   1538  *
   1539  * German (`de_DE`), German formal (`de_DE_formal`), German (Switzerland) formal (`de_CH`),
   1540  * German (Switzerland) informal (`de_CH_informal`), and German (Austria) (`de_AT`) locales:
   1541  *
   1542  * |   Code   | Glyph | Replacement |               Description               |
   1543  * | -------- | ----- | ----------- | --------------------------------------- |
   1544  * | U+00C4   | Ä     | Ae          | Latin capital letter A with diaeresis   |
   1545  * | U+00E4   | ä     | ae          | Latin small letter a with diaeresis     |
   1546  * | U+00D6   | Ö     | Oe          | Latin capital letter O with diaeresis   |
   1547  * | U+00F6   | ö     | oe          | Latin small letter o with diaeresis     |
   1548  * | U+00DC   | Ü     | Ue          | Latin capital letter U with diaeresis   |
   1549  * | U+00FC   | ü     | ue          | Latin small letter u with diaeresis     |
   1550  * | U+00DF   | ß     | ss          | Latin small letter sharp s              |
   1551  *
   1552  * Danish (`da_DK`) locale:
   1553  *
   1554  * |   Code   | Glyph | Replacement |               Description               |
   1555  * | -------- | ----- | ----------- | --------------------------------------- |
   1556  * | U+00C6   | Æ     | Ae          | Latin capital letter AE                 |
   1557  * | U+00E6   | æ     | ae          | Latin small letter ae                   |
   1558  * | U+00D8   | Ø     | Oe          | Latin capital letter O with stroke      |
   1559  * | U+00F8   | ø     | oe          | Latin small letter o with stroke        |
   1560  * | U+00C5   | Å     | Aa          | Latin capital letter A with ring above  |
   1561  * | U+00E5   | å     | aa          | Latin small letter a with ring above    |
   1562  *
   1563  * Catalan (`ca`) locale:
   1564  *
   1565  * |   Code   | Glyph | Replacement |               Description               |
   1566  * | -------- | ----- | ----------- | --------------------------------------- |
   1567  * | U+00B7   | l·l   | ll          | Flown dot (between two Ls)              |
   1568  *
   1569  * Serbian (`sr_RS`) and Bosnian (`bs_BA`) locales:
   1570  *
   1571  * |   Code   | Glyph | Replacement |               Description               |
   1572  * | -------- | ----- | ----------- | --------------------------------------- |
   1573  * | U+0110   | Đ     | DJ          | Latin capital letter D with stroke      |
   1574  * | U+0111   | đ     | dj          | Latin small letter d with stroke        |
   1575  *
   1576  * @since 1.2.1
   1577  * @since 4.6.0 Added locale support for `de_CH`, `de_CH_informal`, and `ca`.
   1578  * @since 4.7.0 Added locale support for `sr_RS`.
   1579  * @since 4.8.0 Added locale support for `bs_BA`.
   1580  * @since 5.7.0 Added locale support for `de_AT`.
   1581  *
   1582  * @param string $string Text that might have accent characters
   1583  * @return string Filtered string with replaced "nice" characters.
   1584  */
   1585 function remove_accents( $string ) {
   1586 	if ( ! preg_match( '/[\x80-\xff]/', $string ) ) {
   1587 		return $string;
   1588 	}
   1589 
   1590 	if ( seems_utf8( $string ) ) {
   1591 		$chars = array(
   1592 			// Decompositions for Latin-1 Supplement.
   1593 			'ª' => 'a',
   1594 			'º' => 'o',
   1595 			'À' => 'A',
   1596 			'Á' => 'A',
   1597 			'Â' => 'A',
   1598 			'Ã' => 'A',
   1599 			'Ä' => 'A',
   1600 			'Å' => 'A',
   1601 			'Æ' => 'AE',
   1602 			'Ç' => 'C',
   1603 			'È' => 'E',
   1604 			'É' => 'E',
   1605 			'Ê' => 'E',
   1606 			'Ë' => 'E',
   1607 			'Ì' => 'I',
   1608 			'Í' => 'I',
   1609 			'Î' => 'I',
   1610 			'Ï' => 'I',
   1611 			'Ð' => 'D',
   1612 			'Ñ' => 'N',
   1613 			'Ò' => 'O',
   1614 			'Ó' => 'O',
   1615 			'Ô' => 'O',
   1616 			'Õ' => 'O',
   1617 			'Ö' => 'O',
   1618 			'Ù' => 'U',
   1619 			'Ú' => 'U',
   1620 			'Û' => 'U',
   1621 			'Ü' => 'U',
   1622 			'Ý' => 'Y',
   1623 			'Þ' => 'TH',
   1624 			'ß' => 's',
   1625 			'à' => 'a',
   1626 			'á' => 'a',
   1627 			'â' => 'a',
   1628 			'ã' => 'a',
   1629 			'ä' => 'a',
   1630 			'å' => 'a',
   1631 			'æ' => 'ae',
   1632 			'ç' => 'c',
   1633 			'è' => 'e',
   1634 			'é' => 'e',
   1635 			'ê' => 'e',
   1636 			'ë' => 'e',
   1637 			'ì' => 'i',
   1638 			'í' => 'i',
   1639 			'î' => 'i',
   1640 			'ï' => 'i',
   1641 			'ð' => 'd',
   1642 			'ñ' => 'n',
   1643 			'ò' => 'o',
   1644 			'ó' => 'o',
   1645 			'ô' => 'o',
   1646 			'õ' => 'o',
   1647 			'ö' => 'o',
   1648 			'ø' => 'o',
   1649 			'ù' => 'u',
   1650 			'ú' => 'u',
   1651 			'û' => 'u',
   1652 			'ü' => 'u',
   1653 			'ý' => 'y',
   1654 			'þ' => 'th',
   1655 			'ÿ' => 'y',
   1656 			'Ø' => 'O',
   1657 			// Decompositions for Latin Extended-A.
   1658 			'Ā' => 'A',
   1659 			'ā' => 'a',
   1660 			'Ă' => 'A',
   1661 			'ă' => 'a',
   1662 			'Ą' => 'A',
   1663 			'ą' => 'a',
   1664 			'Ć' => 'C',
   1665 			'ć' => 'c',
   1666 			'Ĉ' => 'C',
   1667 			'ĉ' => 'c',
   1668 			'Ċ' => 'C',
   1669 			'ċ' => 'c',
   1670 			'Č' => 'C',
   1671 			'č' => 'c',
   1672 			'Ď' => 'D',
   1673 			'ď' => 'd',
   1674 			'Đ' => 'D',
   1675 			'đ' => 'd',
   1676 			'Ē' => 'E',
   1677 			'ē' => 'e',
   1678 			'Ĕ' => 'E',
   1679 			'ĕ' => 'e',
   1680 			'Ė' => 'E',
   1681 			'ė' => 'e',
   1682 			'Ę' => 'E',
   1683 			'ę' => 'e',
   1684 			'Ě' => 'E',
   1685 			'ě' => 'e',
   1686 			'Ĝ' => 'G',
   1687 			'ĝ' => 'g',
   1688 			'Ğ' => 'G',
   1689 			'ğ' => 'g',
   1690 			'Ġ' => 'G',
   1691 			'ġ' => 'g',
   1692 			'Ģ' => 'G',
   1693 			'ģ' => 'g',
   1694 			'Ĥ' => 'H',
   1695 			'ĥ' => 'h',
   1696 			'Ħ' => 'H',
   1697 			'ħ' => 'h',
   1698 			'Ĩ' => 'I',
   1699 			'ĩ' => 'i',
   1700 			'Ī' => 'I',
   1701 			'ī' => 'i',
   1702 			'Ĭ' => 'I',
   1703 			'ĭ' => 'i',
   1704 			'Į' => 'I',
   1705 			'į' => 'i',
   1706 			'İ' => 'I',
   1707 			'ı' => 'i',
   1708 			'IJ' => 'IJ',
   1709 			'ij' => 'ij',
   1710 			'Ĵ' => 'J',
   1711 			'ĵ' => 'j',
   1712 			'Ķ' => 'K',
   1713 			'ķ' => 'k',
   1714 			'ĸ' => 'k',
   1715 			'Ĺ' => 'L',
   1716 			'ĺ' => 'l',
   1717 			'Ļ' => 'L',
   1718 			'ļ' => 'l',
   1719 			'Ľ' => 'L',
   1720 			'ľ' => 'l',
   1721 			'Ŀ' => 'L',
   1722 			'ŀ' => 'l',
   1723 			'Ł' => 'L',
   1724 			'ł' => 'l',
   1725 			'Ń' => 'N',
   1726 			'ń' => 'n',
   1727 			'Ņ' => 'N',
   1728 			'ņ' => 'n',
   1729 			'Ň' => 'N',
   1730 			'ň' => 'n',
   1731 			'ʼn' => 'n',
   1732 			'Ŋ' => 'N',
   1733 			'ŋ' => 'n',
   1734 			'Ō' => 'O',
   1735 			'ō' => 'o',
   1736 			'Ŏ' => 'O',
   1737 			'ŏ' => 'o',
   1738 			'Ő' => 'O',
   1739 			'ő' => 'o',
   1740 			'Œ' => 'OE',
   1741 			'œ' => 'oe',
   1742 			'Ŕ' => 'R',
   1743 			'ŕ' => 'r',
   1744 			'Ŗ' => 'R',
   1745 			'ŗ' => 'r',
   1746 			'Ř' => 'R',
   1747 			'ř' => 'r',
   1748 			'Ś' => 'S',
   1749 			'ś' => 's',
   1750 			'Ŝ' => 'S',
   1751 			'ŝ' => 's',
   1752 			'Ş' => 'S',
   1753 			'ş' => 's',
   1754 			'Š' => 'S',
   1755 			'š' => 's',
   1756 			'Ţ' => 'T',
   1757 			'ţ' => 't',
   1758 			'Ť' => 'T',
   1759 			'ť' => 't',
   1760 			'Ŧ' => 'T',
   1761 			'ŧ' => 't',
   1762 			'Ũ' => 'U',
   1763 			'ũ' => 'u',
   1764 			'Ū' => 'U',
   1765 			'ū' => 'u',
   1766 			'Ŭ' => 'U',
   1767 			'ŭ' => 'u',
   1768 			'Ů' => 'U',
   1769 			'ů' => 'u',
   1770 			'Ű' => 'U',
   1771 			'ű' => 'u',
   1772 			'Ų' => 'U',
   1773 			'ų' => 'u',
   1774 			'Ŵ' => 'W',
   1775 			'ŵ' => 'w',
   1776 			'Ŷ' => 'Y',
   1777 			'ŷ' => 'y',
   1778 			'Ÿ' => 'Y',
   1779 			'Ź' => 'Z',
   1780 			'ź' => 'z',
   1781 			'Ż' => 'Z',
   1782 			'ż' => 'z',
   1783 			'Ž' => 'Z',
   1784 			'ž' => 'z',
   1785 			'ſ' => 's',
   1786 			// Decompositions for Latin Extended-B.
   1787 			'Ș' => 'S',
   1788 			'ș' => 's',
   1789 			'Ț' => 'T',
   1790 			'ț' => 't',
   1791 			// Euro sign.
   1792 			'€' => 'E',
   1793 			// GBP (Pound) sign.
   1794 			'£' => '',
   1795 			// Vowels with diacritic (Vietnamese).
   1796 			// Unmarked.
   1797 			'Ơ' => 'O',
   1798 			'ơ' => 'o',
   1799 			'Ư' => 'U',
   1800 			'ư' => 'u',
   1801 			// Grave accent.
   1802 			'Ầ' => 'A',
   1803 			'ầ' => 'a',
   1804 			'Ằ' => 'A',
   1805 			'ằ' => 'a',
   1806 			'Ề' => 'E',
   1807 			'ề' => 'e',
   1808 			'Ồ' => 'O',
   1809 			'ồ' => 'o',
   1810 			'Ờ' => 'O',
   1811 			'ờ' => 'o',
   1812 			'Ừ' => 'U',
   1813 			'ừ' => 'u',
   1814 			'Ỳ' => 'Y',
   1815 			'ỳ' => 'y',
   1816 			// Hook.
   1817 			'Ả' => 'A',
   1818 			'ả' => 'a',
   1819 			'Ẩ' => 'A',
   1820 			'ẩ' => 'a',
   1821 			'Ẳ' => 'A',
   1822 			'ẳ' => 'a',
   1823 			'Ẻ' => 'E',
   1824 			'ẻ' => 'e',
   1825 			'Ể' => 'E',
   1826 			'ể' => 'e',
   1827 			'Ỉ' => 'I',
   1828 			'ỉ' => 'i',
   1829 			'Ỏ' => 'O',
   1830 			'ỏ' => 'o',
   1831 			'Ổ' => 'O',
   1832 			'ổ' => 'o',
   1833 			'Ở' => 'O',
   1834 			'ở' => 'o',
   1835 			'Ủ' => 'U',
   1836 			'ủ' => 'u',
   1837 			'Ử' => 'U',
   1838 			'ử' => 'u',
   1839 			'Ỷ' => 'Y',
   1840 			'ỷ' => 'y',
   1841 			// Tilde.
   1842 			'Ẫ' => 'A',
   1843 			'ẫ' => 'a',
   1844 			'Ẵ' => 'A',
   1845 			'ẵ' => 'a',
   1846 			'Ẽ' => 'E',
   1847 			'ẽ' => 'e',
   1848 			'Ễ' => 'E',
   1849 			'ễ' => 'e',
   1850 			'Ỗ' => 'O',
   1851 			'ỗ' => 'o',
   1852 			'Ỡ' => 'O',
   1853 			'ỡ' => 'o',
   1854 			'Ữ' => 'U',
   1855 			'ữ' => 'u',
   1856 			'Ỹ' => 'Y',
   1857 			'ỹ' => 'y',
   1858 			// Acute accent.
   1859 			'Ấ' => 'A',
   1860 			'ấ' => 'a',
   1861 			'Ắ' => 'A',
   1862 			'ắ' => 'a',
   1863 			'Ế' => 'E',
   1864 			'ế' => 'e',
   1865 			'Ố' => 'O',
   1866 			'ố' => 'o',
   1867 			'Ớ' => 'O',
   1868 			'ớ' => 'o',
   1869 			'Ứ' => 'U',
   1870 			'ứ' => 'u',
   1871 			// Dot below.
   1872 			'Ạ' => 'A',
   1873 			'ạ' => 'a',
   1874 			'Ậ' => 'A',
   1875 			'ậ' => 'a',
   1876 			'Ặ' => 'A',
   1877 			'ặ' => 'a',
   1878 			'Ẹ' => 'E',
   1879 			'ẹ' => 'e',
   1880 			'Ệ' => 'E',
   1881 			'ệ' => 'e',
   1882 			'Ị' => 'I',
   1883 			'ị' => 'i',
   1884 			'Ọ' => 'O',
   1885 			'ọ' => 'o',
   1886 			'Ộ' => 'O',
   1887 			'ộ' => 'o',
   1888 			'Ợ' => 'O',
   1889 			'ợ' => 'o',
   1890 			'Ụ' => 'U',
   1891 			'ụ' => 'u',
   1892 			'Ự' => 'U',
   1893 			'ự' => 'u',
   1894 			'Ỵ' => 'Y',
   1895 			'ỵ' => 'y',
   1896 			// Vowels with diacritic (Chinese, Hanyu Pinyin).
   1897 			'ɑ' => 'a',
   1898 			// Macron.
   1899 			'Ǖ' => 'U',
   1900 			'ǖ' => 'u',
   1901 			// Acute accent.
   1902 			'Ǘ' => 'U',
   1903 			'ǘ' => 'u',
   1904 			// Caron.
   1905 			'Ǎ' => 'A',
   1906 			'ǎ' => 'a',
   1907 			'Ǐ' => 'I',
   1908 			'ǐ' => 'i',
   1909 			'Ǒ' => 'O',
   1910 			'ǒ' => 'o',
   1911 			'Ǔ' => 'U',
   1912 			'ǔ' => 'u',
   1913 			'Ǚ' => 'U',
   1914 			'ǚ' => 'u',
   1915 			// Grave accent.
   1916 			'Ǜ' => 'U',
   1917 			'ǜ' => 'u',
   1918 		);
   1919 
   1920 		// Used for locale-specific rules.
   1921 		$locale = get_locale();
   1922 
   1923 		if ( in_array( $locale, array( 'de_DE', 'de_DE_formal', 'de_CH', 'de_CH_informal', 'de_AT' ), true ) ) {
   1924 			$chars['Ä'] = 'Ae';
   1925 			$chars['ä'] = 'ae';
   1926 			$chars['Ö'] = 'Oe';
   1927 			$chars['ö'] = 'oe';
   1928 			$chars['Ü'] = 'Ue';
   1929 			$chars['ü'] = 'ue';
   1930 			$chars['ß'] = 'ss';
   1931 		} elseif ( 'da_DK' === $locale ) {
   1932 			$chars['Æ'] = 'Ae';
   1933 			$chars['æ'] = 'ae';
   1934 			$chars['Ø'] = 'Oe';
   1935 			$chars['ø'] = 'oe';
   1936 			$chars['Å'] = 'Aa';
   1937 			$chars['å'] = 'aa';
   1938 		} elseif ( 'ca' === $locale ) {
   1939 			$chars['l·l'] = 'll';
   1940 		} elseif ( 'sr_RS' === $locale || 'bs_BA' === $locale ) {
   1941 			$chars['Đ'] = 'DJ';
   1942 			$chars['đ'] = 'dj';
   1943 		}
   1944 
   1945 		$string = strtr( $string, $chars );
   1946 	} else {
   1947 		$chars = array();
   1948 		// Assume ISO-8859-1 if not UTF-8.
   1949 		$chars['in'] = "\x80\x83\x8a\x8e\x9a\x9e"
   1950 			. "\x9f\xa2\xa5\xb5\xc0\xc1\xc2"
   1951 			. "\xc3\xc4\xc5\xc7\xc8\xc9\xca"
   1952 			. "\xcb\xcc\xcd\xce\xcf\xd1\xd2"
   1953 			. "\xd3\xd4\xd5\xd6\xd8\xd9\xda"
   1954 			. "\xdb\xdc\xdd\xe0\xe1\xe2\xe3"
   1955 			. "\xe4\xe5\xe7\xe8\xe9\xea\xeb"
   1956 			. "\xec\xed\xee\xef\xf1\xf2\xf3"
   1957 			. "\xf4\xf5\xf6\xf8\xf9\xfa\xfb"
   1958 			. "\xfc\xfd\xff";
   1959 
   1960 		$chars['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy';
   1961 
   1962 		$string              = strtr( $string, $chars['in'], $chars['out'] );
   1963 		$double_chars        = array();
   1964 		$double_chars['in']  = array( "\x8c", "\x9c", "\xc6", "\xd0", "\xde", "\xdf", "\xe6", "\xf0", "\xfe" );
   1965 		$double_chars['out'] = array( 'OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th' );
   1966 		$string              = str_replace( $double_chars['in'], $double_chars['out'], $string );
   1967 	}
   1968 
   1969 	return $string;
   1970 }
   1971 
   1972 /**
   1973  * Sanitizes a filename, replacing whitespace with dashes.
   1974  *
   1975  * Removes special characters that are illegal in filenames on certain
   1976  * operating systems and special characters requiring special escaping
   1977  * to manipulate at the command line. Replaces spaces and consecutive
   1978  * dashes with a single dash. Trims period, dash and underscore from beginning
   1979  * and end of filename. It is not guaranteed that this function will return a
   1980  * filename that is allowed to be uploaded.
   1981  *
   1982  * @since 2.1.0
   1983  *
   1984  * @param string $filename The filename to be sanitized.
   1985  * @return string The sanitized filename.
   1986  */
   1987 function sanitize_file_name( $filename ) {
   1988 	$filename_raw = $filename;
   1989 	$filename     = remove_accents( $filename );
   1990 
   1991 	$special_chars = array( '?', '[', ']', '/', '\\', '=', '<', '>', ':', ';', ',', "'", '"', '&', '$', '#', '*', '(', ')', '|', '~', '`', '!', '{', '}', '%', '+', '’', '«', '»', '”', '“', chr( 0 ) );
   1992 
   1993 	// Check for support for utf8 in the installed PCRE library once and store the result in a static.
   1994 	static $utf8_pcre = null;
   1995 	if ( ! isset( $utf8_pcre ) ) {
   1996 		// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
   1997 		$utf8_pcre = @preg_match( '/^./u', 'a' );
   1998 	}
   1999 
   2000 	if ( ! seems_utf8( $filename ) ) {
   2001 		$_ext     = pathinfo( $filename, PATHINFO_EXTENSION );
   2002 		$_name    = pathinfo( $filename, PATHINFO_FILENAME );
   2003 		$filename = sanitize_title_with_dashes( $_name ) . '.' . $_ext;
   2004 	}
   2005 
   2006 	if ( $utf8_pcre ) {
   2007 		$filename = preg_replace( "#\x{00a0}#siu", ' ', $filename );
   2008 	}
   2009 
   2010 	/**
   2011 	 * Filters the list of characters to remove from a filename.
   2012 	 *
   2013 	 * @since 2.8.0
   2014 	 *
   2015 	 * @param string[] $special_chars Array of characters to remove.
   2016 	 * @param string   $filename_raw  The original filename to be sanitized.
   2017 	 */
   2018 	$special_chars = apply_filters( 'sanitize_file_name_chars', $special_chars, $filename_raw );
   2019 
   2020 	$filename = str_replace( $special_chars, '', $filename );
   2021 	$filename = str_replace( array( '%20', '+' ), '-', $filename );
   2022 	$filename = preg_replace( '/[\r\n\t -]+/', '-', $filename );
   2023 	$filename = trim( $filename, '.-_' );
   2024 
   2025 	if ( false === strpos( $filename, '.' ) ) {
   2026 		$mime_types = wp_get_mime_types();
   2027 		$filetype   = wp_check_filetype( 'test.' . $filename, $mime_types );
   2028 		if ( $filetype['ext'] === $filename ) {
   2029 			$filename = 'unnamed-file.' . $filetype['ext'];
   2030 		}
   2031 	}
   2032 
   2033 	// Split the filename into a base and extension[s].
   2034 	$parts = explode( '.', $filename );
   2035 
   2036 	// Return if only one extension.
   2037 	if ( count( $parts ) <= 2 ) {
   2038 		/** This filter is documented in wp-includes/formatting.php */
   2039 		return apply_filters( 'sanitize_file_name', $filename, $filename_raw );
   2040 	}
   2041 
   2042 	// Process multiple extensions.
   2043 	$filename  = array_shift( $parts );
   2044 	$extension = array_pop( $parts );
   2045 	$mimes     = get_allowed_mime_types();
   2046 
   2047 	/*
   2048 	 * Loop over any intermediate extensions. Postfix them with a trailing underscore
   2049 	 * if they are a 2 - 5 character long alpha string not in the allowed extension list.
   2050 	 */
   2051 	foreach ( (array) $parts as $part ) {
   2052 		$filename .= '.' . $part;
   2053 
   2054 		if ( preg_match( '/^[a-zA-Z]{2,5}\d?$/', $part ) ) {
   2055 			$allowed = false;
   2056 			foreach ( $mimes as $ext_preg => $mime_match ) {
   2057 				$ext_preg = '!^(' . $ext_preg . ')$!i';
   2058 				if ( preg_match( $ext_preg, $part ) ) {
   2059 					$allowed = true;
   2060 					break;
   2061 				}
   2062 			}
   2063 			if ( ! $allowed ) {
   2064 				$filename .= '_';
   2065 			}
   2066 		}
   2067 	}
   2068 
   2069 	$filename .= '.' . $extension;
   2070 
   2071 	/**
   2072 	 * Filters a sanitized filename string.
   2073 	 *
   2074 	 * @since 2.8.0
   2075 	 *
   2076 	 * @param string $filename     Sanitized filename.
   2077 	 * @param string $filename_raw The filename prior to sanitization.
   2078 	 */
   2079 	return apply_filters( 'sanitize_file_name', $filename, $filename_raw );
   2080 }
   2081 
   2082 /**
   2083  * Sanitizes a username, stripping out unsafe characters.
   2084  *
   2085  * Removes tags, octets, entities, and if strict is enabled, will only keep
   2086  * alphanumeric, _, space, ., -, @. After sanitizing, it passes the username,
   2087  * raw username (the username in the parameter), and the value of $strict as
   2088  * parameters for the {@see 'sanitize_user'} filter.
   2089  *
   2090  * @since 2.0.0
   2091  *
   2092  * @param string $username The username to be sanitized.
   2093  * @param bool   $strict   Optional. If set limits $username to specific characters.
   2094  *                         Default false.
   2095  * @return string The sanitized username, after passing through filters.
   2096  */
   2097 function sanitize_user( $username, $strict = false ) {
   2098 	$raw_username = $username;
   2099 	$username     = wp_strip_all_tags( $username );
   2100 	$username     = remove_accents( $username );
   2101 	// Kill octets.
   2102 	$username = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '', $username );
   2103 	// Kill entities.
   2104 	$username = preg_replace( '/&.+?;/', '', $username );
   2105 
   2106 	// If strict, reduce to ASCII for max portability.
   2107 	if ( $strict ) {
   2108 		$username = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $username );
   2109 	}
   2110 
   2111 	$username = trim( $username );
   2112 	// Consolidate contiguous whitespace.
   2113 	$username = preg_replace( '|\s+|', ' ', $username );
   2114 
   2115 	/**
   2116 	 * Filters a sanitized username string.
   2117 	 *
   2118 	 * @since 2.0.1
   2119 	 *
   2120 	 * @param string $username     Sanitized username.
   2121 	 * @param string $raw_username The username prior to sanitization.
   2122 	 * @param bool   $strict       Whether to limit the sanitization to specific characters.
   2123 	 */
   2124 	return apply_filters( 'sanitize_user', $username, $raw_username, $strict );
   2125 }
   2126 
   2127 /**
   2128  * Sanitizes a string key.
   2129  *
   2130  * Keys are used as internal identifiers. Lowercase alphanumeric characters,
   2131  * dashes, and underscores are allowed.
   2132  *
   2133  * @since 3.0.0
   2134  *
   2135  * @param string $key String key
   2136  * @return string Sanitized key
   2137  */
   2138 function sanitize_key( $key ) {
   2139 	$raw_key = $key;
   2140 	$key     = strtolower( $key );
   2141 	$key     = preg_replace( '/[^a-z0-9_\-]/', '', $key );
   2142 
   2143 	/**
   2144 	 * Filters a sanitized key string.
   2145 	 *
   2146 	 * @since 3.0.0
   2147 	 *
   2148 	 * @param string $key     Sanitized key.
   2149 	 * @param string $raw_key The key prior to sanitization.
   2150 	 */
   2151 	return apply_filters( 'sanitize_key', $key, $raw_key );
   2152 }
   2153 
   2154 /**
   2155  * Sanitizes a string into a slug, which can be used in URLs or HTML attributes.
   2156  *
   2157  * By default, converts accent characters to ASCII characters and further
   2158  * limits the output to alphanumeric characters, underscore (_) and dash (-)
   2159  * through the {@see 'sanitize_title'} filter.
   2160  *
   2161  * If `$title` is empty and `$fallback_title` is set, the latter will be used.
   2162  *
   2163  * @since 1.0.0
   2164  *
   2165  * @param string $title          The string to be sanitized.
   2166  * @param string $fallback_title Optional. A title to use if $title is empty. Default empty.
   2167  * @param string $context        Optional. The operation for which the string is sanitized.
   2168  *                               When set to 'save', the string runs through remove_accents().
   2169  *                               Default 'save'.
   2170  * @return string The sanitized string.
   2171  */
   2172 function sanitize_title( $title, $fallback_title = '', $context = 'save' ) {
   2173 	$raw_title = $title;
   2174 
   2175 	if ( 'save' === $context ) {
   2176 		$title = remove_accents( $title );
   2177 	}
   2178 
   2179 	/**
   2180 	 * Filters a sanitized title string.
   2181 	 *
   2182 	 * @since 1.2.0
   2183 	 *
   2184 	 * @param string $title     Sanitized title.
   2185 	 * @param string $raw_title The title prior to sanitization.
   2186 	 * @param string $context   The context for which the title is being sanitized.
   2187 	 */
   2188 	$title = apply_filters( 'sanitize_title', $title, $raw_title, $context );
   2189 
   2190 	if ( '' === $title || false === $title ) {
   2191 		$title = $fallback_title;
   2192 	}
   2193 
   2194 	return $title;
   2195 }
   2196 
   2197 /**
   2198  * Sanitizes a title with the 'query' context.
   2199  *
   2200  * Used for querying the database for a value from URL.
   2201  *
   2202  * @since 3.1.0
   2203  *
   2204  * @param string $title The string to be sanitized.
   2205  * @return string The sanitized string.
   2206  */
   2207 function sanitize_title_for_query( $title ) {
   2208 	return sanitize_title( $title, '', 'query' );
   2209 }
   2210 
   2211 /**
   2212  * Sanitizes a title, replacing whitespace and a few other characters with dashes.
   2213  *
   2214  * Limits the output to alphanumeric characters, underscore (_) and dash (-).
   2215  * Whitespace becomes a dash.
   2216  *
   2217  * @since 1.2.0
   2218  *
   2219  * @param string $title     The title to be sanitized.
   2220  * @param string $raw_title Optional. Not used. Default empty.
   2221  * @param string $context   Optional. The operation for which the string is sanitized.
   2222  *                          When set to 'save', additional entities are converted to hyphens
   2223  *                          or stripped entirely. Default 'display'.
   2224  * @return string The sanitized title.
   2225  */
   2226 function sanitize_title_with_dashes( $title, $raw_title = '', $context = 'display' ) {
   2227 	$title = strip_tags( $title );
   2228 	// Preserve escaped octets.
   2229 	$title = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title );
   2230 	// Remove percent signs that are not part of an octet.
   2231 	$title = str_replace( '%', '', $title );
   2232 	// Restore octets.
   2233 	$title = preg_replace( '|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title );
   2234 
   2235 	if ( seems_utf8( $title ) ) {
   2236 		if ( function_exists( 'mb_strtolower' ) ) {
   2237 			$title = mb_strtolower( $title, 'UTF-8' );
   2238 		}
   2239 		$title = utf8_uri_encode( $title, 200 );
   2240 	}
   2241 
   2242 	$title = strtolower( $title );
   2243 
   2244 	if ( 'save' === $context ) {
   2245 		// Convert &nbsp, &ndash, and &mdash to hyphens.
   2246 		$title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
   2247 		// Convert &nbsp, &ndash, and &mdash HTML entities to hyphens.
   2248 		$title = str_replace( array( '&nbsp;', '&#160;', '&ndash;', '&#8211;', '&mdash;', '&#8212;' ), '-', $title );
   2249 		// Convert forward slash to hyphen.
   2250 		$title = str_replace( '/', '-', $title );
   2251 
   2252 		// Strip these characters entirely.
   2253 		$title = str_replace(
   2254 			array(
   2255 				// Soft hyphens.
   2256 				'%c2%ad',
   2257 				// &iexcl and &iquest.
   2258 				'%c2%a1',
   2259 				'%c2%bf',
   2260 				// Angle quotes.
   2261 				'%c2%ab',
   2262 				'%c2%bb',
   2263 				'%e2%80%b9',
   2264 				'%e2%80%ba',
   2265 				// Curly quotes.
   2266 				'%e2%80%98',
   2267 				'%e2%80%99',
   2268 				'%e2%80%9c',
   2269 				'%e2%80%9d',
   2270 				'%e2%80%9a',
   2271 				'%e2%80%9b',
   2272 				'%e2%80%9e',
   2273 				'%e2%80%9f',
   2274 				// Bullet.
   2275 				'%e2%80%a2',
   2276 				// &copy, &reg, &deg, &hellip, and &trade.
   2277 				'%c2%a9',
   2278 				'%c2%ae',
   2279 				'%c2%b0',
   2280 				'%e2%80%a6',
   2281 				'%e2%84%a2',
   2282 				// Acute accents.
   2283 				'%c2%b4',
   2284 				'%cb%8a',
   2285 				'%cc%81',
   2286 				'%cd%81',
   2287 				// Grave accent, macron, caron.
   2288 				'%cc%80',
   2289 				'%cc%84',
   2290 				'%cc%8c',
   2291 			),
   2292 			'',
   2293 			$title
   2294 		);
   2295 
   2296 		// Convert &times to 'x'.
   2297 		$title = str_replace( '%c3%97', 'x', $title );
   2298 	}
   2299 
   2300 	// Kill entities.
   2301 	$title = preg_replace( '/&.+?;/', '', $title );
   2302 	$title = str_replace( '.', '-', $title );
   2303 
   2304 	$title = preg_replace( '/[^%a-z0-9 _-]/', '', $title );
   2305 	$title = preg_replace( '/\s+/', '-', $title );
   2306 	$title = preg_replace( '|-+|', '-', $title );
   2307 	$title = trim( $title, '-' );
   2308 
   2309 	return $title;
   2310 }
   2311 
   2312 /**
   2313  * Ensures a string is a valid SQL 'order by' clause.
   2314  *
   2315  * Accepts one or more columns, with or without a sort order (ASC / DESC).
   2316  * e.g. 'column_1', 'column_1, column_2', 'column_1 ASC, column_2 DESC' etc.
   2317  *
   2318  * Also accepts 'RAND()'.
   2319  *
   2320  * @since 2.5.1
   2321  *
   2322  * @param string $orderby Order by clause to be validated.
   2323  * @return string|false Returns $orderby if valid, false otherwise.
   2324  */
   2325 function sanitize_sql_orderby( $orderby ) {
   2326 	if ( preg_match( '/^\s*(([a-z0-9_]+|`[a-z0-9_]+`)(\s+(ASC|DESC))?\s*(,\s*(?=[a-z0-9_`])|$))+$/i', $orderby ) || preg_match( '/^\s*RAND\(\s*\)\s*$/i', $orderby ) ) {
   2327 		return $orderby;
   2328 	}
   2329 	return false;
   2330 }
   2331 
   2332 /**
   2333  * Sanitizes an HTML classname to ensure it only contains valid characters.
   2334  *
   2335  * Strips the string down to A-Z,a-z,0-9,_,-. If this results in an empty
   2336  * string then it will return the alternative value supplied.
   2337  *
   2338  * @todo Expand to support the full range of CDATA that a class attribute can contain.
   2339  *
   2340  * @since 2.8.0
   2341  *
   2342  * @param string $class    The classname to be sanitized
   2343  * @param string $fallback Optional. The value to return if the sanitization ends up as an empty string.
   2344  *  Defaults to an empty string.
   2345  * @return string The sanitized value
   2346  */
   2347 function sanitize_html_class( $class, $fallback = '' ) {
   2348 	// Strip out any %-encoded octets.
   2349 	$sanitized = preg_replace( '|%[a-fA-F0-9][a-fA-F0-9]|', '', $class );
   2350 
   2351 	// Limit to A-Z, a-z, 0-9, '_', '-'.
   2352 	$sanitized = preg_replace( '/[^A-Za-z0-9_-]/', '', $sanitized );
   2353 
   2354 	if ( '' === $sanitized && $fallback ) {
   2355 		return sanitize_html_class( $fallback );
   2356 	}
   2357 	/**
   2358 	 * Filters a sanitized HTML class string.
   2359 	 *
   2360 	 * @since 2.8.0
   2361 	 *
   2362 	 * @param string $sanitized The sanitized HTML class.
   2363 	 * @param string $class     HTML class before sanitization.
   2364 	 * @param string $fallback  The fallback string.
   2365 	 */
   2366 	return apply_filters( 'sanitize_html_class', $sanitized, $class, $fallback );
   2367 }
   2368 
   2369 /**
   2370  * Converts lone & characters into `&#038;` (a.k.a. `&amp;`)
   2371  *
   2372  * @since 0.71
   2373  *
   2374  * @param string $content    String of characters to be converted.
   2375  * @param string $deprecated Not used.
   2376  * @return string Converted string.
   2377  */
   2378 function convert_chars( $content, $deprecated = '' ) {
   2379 	if ( ! empty( $deprecated ) ) {
   2380 		_deprecated_argument( __FUNCTION__, '0.71' );
   2381 	}
   2382 
   2383 	if ( strpos( $content, '&' ) !== false ) {
   2384 		$content = preg_replace( '/&([^#])(?![a-z1-4]{1,8};)/i', '&#038;$1', $content );
   2385 	}
   2386 
   2387 	return $content;
   2388 }
   2389 
   2390 /**
   2391  * Converts invalid Unicode references range to valid range.
   2392  *
   2393  * @since 4.3.0
   2394  *
   2395  * @param string $content String with entities that need converting.
   2396  * @return string Converted string.
   2397  */
   2398 function convert_invalid_entities( $content ) {
   2399 	$wp_htmltranswinuni = array(
   2400 		'&#128;' => '&#8364;', // The Euro sign.
   2401 		'&#129;' => '',
   2402 		'&#130;' => '&#8218;', // These are Windows CP1252 specific characters.
   2403 		'&#131;' => '&#402;',  // They would look weird on non-Windows browsers.
   2404 		'&#132;' => '&#8222;',
   2405 		'&#133;' => '&#8230;',
   2406 		'&#134;' => '&#8224;',
   2407 		'&#135;' => '&#8225;',
   2408 		'&#136;' => '&#710;',
   2409 		'&#137;' => '&#8240;',
   2410 		'&#138;' => '&#352;',
   2411 		'&#139;' => '&#8249;',
   2412 		'&#140;' => '&#338;',
   2413 		'&#141;' => '',
   2414 		'&#142;' => '&#381;',
   2415 		'&#143;' => '',
   2416 		'&#144;' => '',
   2417 		'&#145;' => '&#8216;',
   2418 		'&#146;' => '&#8217;',
   2419 		'&#147;' => '&#8220;',
   2420 		'&#148;' => '&#8221;',
   2421 		'&#149;' => '&#8226;',
   2422 		'&#150;' => '&#8211;',
   2423 		'&#151;' => '&#8212;',
   2424 		'&#152;' => '&#732;',
   2425 		'&#153;' => '&#8482;',
   2426 		'&#154;' => '&#353;',
   2427 		'&#155;' => '&#8250;',
   2428 		'&#156;' => '&#339;',
   2429 		'&#157;' => '',
   2430 		'&#158;' => '&#382;',
   2431 		'&#159;' => '&#376;',
   2432 	);
   2433 
   2434 	if ( strpos( $content, '&#1' ) !== false ) {
   2435 		$content = strtr( $content, $wp_htmltranswinuni );
   2436 	}
   2437 
   2438 	return $content;
   2439 }
   2440 
   2441 /**
   2442  * Balances tags if forced to, or if the 'use_balanceTags' option is set to true.
   2443  *
   2444  * @since 0.71
   2445  *
   2446  * @param string $text  Text to be balanced
   2447  * @param bool   $force If true, forces balancing, ignoring the value of the option. Default false.
   2448  * @return string Balanced text
   2449  */
   2450 function balanceTags( $text, $force = false ) {  // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
   2451 	if ( $force || (int) get_option( 'use_balanceTags' ) === 1 ) {
   2452 		return force_balance_tags( $text );
   2453 	} else {
   2454 		return $text;
   2455 	}
   2456 }
   2457 
   2458 /**
   2459  * Balances tags of string using a modified stack.
   2460  *
   2461  * @since 2.0.4
   2462  * @since 5.3.0 Improve accuracy and add support for custom element tags.
   2463  *
   2464  * @author Leonard Lin <leonard@acm.org>
   2465  * @license GPL
   2466  * @copyright November 4, 2001
   2467  * @version 1.1
   2468  * @todo Make better - change loop condition to $text in 1.2
   2469  * @internal Modified by Scott Reilly (coffee2code) 02 Aug 2004
   2470  *      1.1  Fixed handling of append/stack pop order of end text
   2471  *           Added Cleaning Hooks
   2472  *      1.0  First Version
   2473  *
   2474  * @param string $text Text to be balanced.
   2475  * @return string Balanced text.
   2476  */
   2477 function force_balance_tags( $text ) {
   2478 	$tagstack  = array();
   2479 	$stacksize = 0;
   2480 	$tagqueue  = '';
   2481 	$newtext   = '';
   2482 	// Known single-entity/self-closing tags.
   2483 	$single_tags = array( 'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param', 'source' );
   2484 	// Tags that can be immediately nested within themselves.
   2485 	$nestable_tags = array( 'blockquote', 'div', 'object', 'q', 'span' );
   2486 
   2487 	// WP bug fix for comments - in case you REALLY meant to type '< !--'.
   2488 	$text = str_replace( '< !--', '<    !--', $text );
   2489 	// WP bug fix for LOVE <3 (and other situations with '<' before a number).
   2490 	$text = preg_replace( '#<([0-9]{1})#', '&lt;$1', $text );
   2491 
   2492 	/**
   2493 	 * Matches supported tags.
   2494 	 *
   2495 	 * To get the pattern as a string without the comments paste into a PHP
   2496 	 * REPL like `php -a`.
   2497 	 *
   2498 	 * @see https://html.spec.whatwg.org/#elements-2
   2499 	 * @see https://w3c.github.io/webcomponents/spec/custom/#valid-custom-element-name
   2500 	 *
   2501 	 * @example
   2502 	 * ~# php -a
   2503 	 * php > $s = [paste copied contents of expression below including parentheses];
   2504 	 * php > echo $s;
   2505 	 */
   2506 	$tag_pattern = (
   2507 		'#<' . // Start with an opening bracket.
   2508 		'(/?)' . // Group 1 - If it's a closing tag it'll have a leading slash.
   2509 		'(' . // Group 2 - Tag name.
   2510 			// Custom element tags have more lenient rules than HTML tag names.
   2511 			'(?:[a-z](?:[a-z0-9._]*)-(?:[a-z0-9._-]+)+)' .
   2512 				'|' .
   2513 			// Traditional tag rules approximate HTML tag names.
   2514 			'(?:[\w:]+)' .
   2515 		')' .
   2516 		'(?:' .
   2517 			// We either immediately close the tag with its '>' and have nothing here.
   2518 			'\s*' .
   2519 			'(/?)' . // Group 3 - "attributes" for empty tag.
   2520 				'|' .
   2521 			// Or we must start with space characters to separate the tag name from the attributes (or whitespace).
   2522 			'(\s+)' . // Group 4 - Pre-attribute whitespace.
   2523 			'([^>]*)' . // Group 5 - Attributes.
   2524 		')' .
   2525 		'>#' // End with a closing bracket.
   2526 	);
   2527 
   2528 	while ( preg_match( $tag_pattern, $text, $regex ) ) {
   2529 		$full_match        = $regex[0];
   2530 		$has_leading_slash = ! empty( $regex[1] );
   2531 		$tag_name          = $regex[2];
   2532 		$tag               = strtolower( $tag_name );
   2533 		$is_single_tag     = in_array( $tag, $single_tags, true );
   2534 		$pre_attribute_ws  = isset( $regex[4] ) ? $regex[4] : '';
   2535 		$attributes        = trim( isset( $regex[5] ) ? $regex[5] : $regex[3] );
   2536 		$has_self_closer   = '/' === substr( $attributes, -1 );
   2537 
   2538 		$newtext .= $tagqueue;
   2539 
   2540 		$i = strpos( $text, $full_match );
   2541 		$l = strlen( $full_match );
   2542 
   2543 		// Clear the shifter.
   2544 		$tagqueue = '';
   2545 		if ( $has_leading_slash ) { // End tag.
   2546 			// If too many closing tags.
   2547 			if ( $stacksize <= 0 ) {
   2548 				$tag = '';
   2549 				// Or close to be safe $tag = '/' . $tag.
   2550 
   2551 				// If stacktop value = tag close value, then pop.
   2552 			} elseif ( $tagstack[ $stacksize - 1 ] === $tag ) { // Found closing tag.
   2553 				$tag = '</' . $tag . '>'; // Close tag.
   2554 				array_pop( $tagstack );
   2555 				$stacksize--;
   2556 			} else { // Closing tag not at top, search for it.
   2557 				for ( $j = $stacksize - 1; $j >= 0; $j-- ) {
   2558 					if ( $tagstack[ $j ] === $tag ) {
   2559 						// Add tag to tagqueue.
   2560 						for ( $k = $stacksize - 1; $k >= $j; $k-- ) {
   2561 							$tagqueue .= '</' . array_pop( $tagstack ) . '>';
   2562 							$stacksize--;
   2563 						}
   2564 						break;
   2565 					}
   2566 				}
   2567 				$tag = '';
   2568 			}
   2569 		} else { // Begin tag.
   2570 			if ( $has_self_closer ) { // If it presents itself as a self-closing tag...
   2571 				// ...but it isn't a known single-entity self-closing tag, then don't let it be treated as such
   2572 				// and immediately close it with a closing tag (the tag will encapsulate no text as a result).
   2573 				if ( ! $is_single_tag ) {
   2574 					$attributes = trim( substr( $attributes, 0, -1 ) ) . "></$tag";
   2575 				}
   2576 			} elseif ( $is_single_tag ) { // Else if it's a known single-entity tag but it doesn't close itself, do so.
   2577 				$pre_attribute_ws = ' ';
   2578 				$attributes      .= '/';
   2579 			} else { // It's not a single-entity tag.
   2580 				// If the top of the stack is the same as the tag we want to push, close previous tag.
   2581 				if ( $stacksize > 0 && ! in_array( $tag, $nestable_tags, true ) && $tagstack[ $stacksize - 1 ] === $tag ) {
   2582 					$tagqueue = '</' . array_pop( $tagstack ) . '>';
   2583 					$stacksize--;
   2584 				}
   2585 				$stacksize = array_push( $tagstack, $tag );
   2586 			}
   2587 
   2588 			// Attributes.
   2589 			if ( $has_self_closer && $is_single_tag ) {
   2590 				// We need some space - avoid <br/> and prefer <br />.
   2591 				$pre_attribute_ws = ' ';
   2592 			}
   2593 
   2594 			$tag = '<' . $tag . $pre_attribute_ws . $attributes . '>';
   2595 			// If already queuing a close tag, then put this tag on too.
   2596 			if ( ! empty( $tagqueue ) ) {
   2597 				$tagqueue .= $tag;
   2598 				$tag       = '';
   2599 			}
   2600 		}
   2601 		$newtext .= substr( $text, 0, $i ) . $tag;
   2602 		$text     = substr( $text, $i + $l );
   2603 	}
   2604 
   2605 	// Clear tag queue.
   2606 	$newtext .= $tagqueue;
   2607 
   2608 	// Add remaining text.
   2609 	$newtext .= $text;
   2610 
   2611 	while ( $x = array_pop( $tagstack ) ) {
   2612 		$newtext .= '</' . $x . '>'; // Add remaining tags to close.
   2613 	}
   2614 
   2615 	// WP fix for the bug with HTML comments.
   2616 	$newtext = str_replace( '< !--', '<!--', $newtext );
   2617 	$newtext = str_replace( '<    !--', '< !--', $newtext );
   2618 
   2619 	return $newtext;
   2620 }
   2621 
   2622 /**
   2623  * Acts on text which is about to be edited.
   2624  *
   2625  * The $content is run through esc_textarea(), which uses htmlspecialchars()
   2626  * to convert special characters to HTML entities. If `$richedit` is set to true,
   2627  * it is simply a holder for the {@see 'format_to_edit'} filter.
   2628  *
   2629  * @since 0.71
   2630  * @since 4.4.0 The `$richedit` parameter was renamed to `$rich_text` for clarity.
   2631  *
   2632  * @param string $content   The text about to be edited.
   2633  * @param bool   $rich_text Optional. Whether `$content` should be considered rich text,
   2634  *                          in which case it would not be passed through esc_textarea().
   2635  *                          Default false.
   2636  * @return string The text after the filter (and possibly htmlspecialchars()) has been run.
   2637  */
   2638 function format_to_edit( $content, $rich_text = false ) {
   2639 	/**
   2640 	 * Filters the text to be formatted for editing.
   2641 	 *
   2642 	 * @since 1.2.0
   2643 	 *
   2644 	 * @param string $content The text, prior to formatting for editing.
   2645 	 */
   2646 	$content = apply_filters( 'format_to_edit', $content );
   2647 	if ( ! $rich_text ) {
   2648 		$content = esc_textarea( $content );
   2649 	}
   2650 	return $content;
   2651 }
   2652 
   2653 /**
   2654  * Add leading zeros when necessary.
   2655  *
   2656  * If you set the threshold to '4' and the number is '10', then you will get
   2657  * back '0010'. If you set the threshold to '4' and the number is '5000', then you
   2658  * will get back '5000'.
   2659  *
   2660  * Uses sprintf to append the amount of zeros based on the $threshold parameter
   2661  * and the size of the number. If the number is large enough, then no zeros will
   2662  * be appended.
   2663  *
   2664  * @since 0.71
   2665  *
   2666  * @param int $number     Number to append zeros to if not greater than threshold.
   2667  * @param int $threshold  Digit places number needs to be to not have zeros added.
   2668  * @return string Adds leading zeros to number if needed.
   2669  */
   2670 function zeroise( $number, $threshold ) {
   2671 	return sprintf( '%0' . $threshold . 's', $number );
   2672 }
   2673 
   2674 /**
   2675  * Adds backslashes before letters and before a number at the start of a string.
   2676  *
   2677  * @since 0.71
   2678  *
   2679  * @param string $string Value to which backslashes will be added.
   2680  * @return string String with backslashes inserted.
   2681  */
   2682 function backslashit( $string ) {
   2683 	if ( isset( $string[0] ) && $string[0] >= '0' && $string[0] <= '9' ) {
   2684 		$string = '\\\\' . $string;
   2685 	}
   2686 	return addcslashes( $string, 'A..Za..z' );
   2687 }
   2688 
   2689 /**
   2690  * Appends a trailing slash.
   2691  *
   2692  * Will remove trailing forward and backslashes if it exists already before adding
   2693  * a trailing forward slash. This prevents double slashing a string or path.
   2694  *
   2695  * The primary use of this is for paths and thus should be used for paths. It is
   2696  * not restricted to paths and offers no specific path support.
   2697  *
   2698  * @since 1.2.0
   2699  *
   2700  * @param string $string What to add the trailing slash to.
   2701  * @return string String with trailing slash added.
   2702  */
   2703 function trailingslashit( $string ) {
   2704 	return untrailingslashit( $string ) . '/';
   2705 }
   2706 
   2707 /**
   2708  * Removes trailing forward slashes and backslashes if they exist.
   2709  *
   2710  * The primary use of this is for paths and thus should be used for paths. It is
   2711  * not restricted to paths and offers no specific path support.
   2712  *
   2713  * @since 2.2.0
   2714  *
   2715  * @param string $string What to remove the trailing slashes from.
   2716  * @return string String without the trailing slashes.
   2717  */
   2718 function untrailingslashit( $string ) {
   2719 	return rtrim( $string, '/\\' );
   2720 }
   2721 
   2722 /**
   2723  * Adds slashes to escape strings.
   2724  *
   2725  * Slashes will first be removed if magic_quotes_gpc is set, see {@link
   2726  * https://www.php.net/magic_quotes} for more details.
   2727  *
   2728  * @since 0.71
   2729  *
   2730  * @param string $gpc The string returned from HTTP request data.
   2731  * @return string Returns a string escaped with slashes.
   2732  */
   2733 function addslashes_gpc( $gpc ) {
   2734 	return wp_slash( $gpc );
   2735 }
   2736 
   2737 /**
   2738  * Navigates through an array, object, or scalar, and removes slashes from the values.
   2739  *
   2740  * @since 2.0.0
   2741  *
   2742  * @param mixed $value The value to be stripped.
   2743  * @return mixed Stripped value.
   2744  */
   2745 function stripslashes_deep( $value ) {
   2746 	return map_deep( $value, 'stripslashes_from_strings_only' );
   2747 }
   2748 
   2749 /**
   2750  * Callback function for `stripslashes_deep()` which strips slashes from strings.
   2751  *
   2752  * @since 4.4.0
   2753  *
   2754  * @param mixed $value The array or string to be stripped.
   2755  * @return mixed The stripped value.
   2756  */
   2757 function stripslashes_from_strings_only( $value ) {
   2758 	return is_string( $value ) ? stripslashes( $value ) : $value;
   2759 }
   2760 
   2761 /**
   2762  * Navigates through an array, object, or scalar, and encodes the values to be used in a URL.
   2763  *
   2764  * @since 2.2.0
   2765  *
   2766  * @param mixed $value The array or string to be encoded.
   2767  * @return mixed The encoded value.
   2768  */
   2769 function urlencode_deep( $value ) {
   2770 	return map_deep( $value, 'urlencode' );
   2771 }
   2772 
   2773 /**
   2774  * Navigates through an array, object, or scalar, and raw-encodes the values to be used in a URL.
   2775  *
   2776  * @since 3.4.0
   2777  *
   2778  * @param mixed $value The array or string to be encoded.
   2779  * @return mixed The encoded value.
   2780  */
   2781 function rawurlencode_deep( $value ) {
   2782 	return map_deep( $value, 'rawurlencode' );
   2783 }
   2784 
   2785 /**
   2786  * Navigates through an array, object, or scalar, and decodes URL-encoded values
   2787  *
   2788  * @since 4.4.0
   2789  *
   2790  * @param mixed $value The array or string to be decoded.
   2791  * @return mixed The decoded value.
   2792  */
   2793 function urldecode_deep( $value ) {
   2794 	return map_deep( $value, 'urldecode' );
   2795 }
   2796 
   2797 /**
   2798  * Converts email addresses characters to HTML entities to block spam bots.
   2799  *
   2800  * @since 0.71
   2801  *
   2802  * @param string $email_address Email address.
   2803  * @param int    $hex_encoding  Optional. Set to 1 to enable hex encoding.
   2804  * @return string Converted email address.
   2805  */
   2806 function antispambot( $email_address, $hex_encoding = 0 ) {
   2807 	$email_no_spam_address = '';
   2808 	for ( $i = 0, $len = strlen( $email_address ); $i < $len; $i++ ) {
   2809 		$j = rand( 0, 1 + $hex_encoding );
   2810 		if ( 0 == $j ) {
   2811 			$email_no_spam_address .= '&#' . ord( $email_address[ $i ] ) . ';';
   2812 		} elseif ( 1 == $j ) {
   2813 			$email_no_spam_address .= $email_address[ $i ];
   2814 		} elseif ( 2 == $j ) {
   2815 			$email_no_spam_address .= '%' . zeroise( dechex( ord( $email_address[ $i ] ) ), 2 );
   2816 		}
   2817 	}
   2818 
   2819 	return str_replace( '@', '&#64;', $email_no_spam_address );
   2820 }
   2821 
   2822 /**
   2823  * Callback to convert URI match to HTML A element.
   2824  *
   2825  * This function was backported from 2.5.0 to 2.3.2. Regex callback for make_clickable().
   2826  *
   2827  * @since 2.3.2
   2828  * @access private
   2829  *
   2830  * @param array $matches Single Regex Match.
   2831  * @return string HTML A element with URI address.
   2832  */
   2833 function _make_url_clickable_cb( $matches ) {
   2834 	$url = $matches[2];
   2835 
   2836 	if ( ')' === $matches[3] && strpos( $url, '(' ) ) {
   2837 		// If the trailing character is a closing parethesis, and the URL has an opening parenthesis in it,
   2838 		// add the closing parenthesis to the URL. Then we can let the parenthesis balancer do its thing below.
   2839 		$url   .= $matches[3];
   2840 		$suffix = '';
   2841 	} else {
   2842 		$suffix = $matches[3];
   2843 	}
   2844 
   2845 	// Include parentheses in the URL only if paired.
   2846 	while ( substr_count( $url, '(' ) < substr_count( $url, ')' ) ) {
   2847 		$suffix = strrchr( $url, ')' ) . $suffix;
   2848 		$url    = substr( $url, 0, strrpos( $url, ')' ) );
   2849 	}
   2850 
   2851 	$url = esc_url( $url );
   2852 	if ( empty( $url ) ) {
   2853 		return $matches[0];
   2854 	}
   2855 
   2856 	if ( 'comment_text' === current_filter() ) {
   2857 		$rel = 'nofollow ugc';
   2858 	} else {
   2859 		$rel = 'nofollow';
   2860 	}
   2861 
   2862 	/**
   2863 	 * Filters the rel value that is added to URL matches converted to links.
   2864 	 *
   2865 	 * @since 5.3.0
   2866 	 *
   2867 	 * @param string $rel The rel value.
   2868 	 * @param string $url The matched URL being converted to a link tag.
   2869 	 */
   2870 	$rel = apply_filters( 'make_clickable_rel', $rel, $url );
   2871 	$rel = esc_attr( $rel );
   2872 
   2873 	return $matches[1] . "<a href=\"$url\" rel=\"$rel\">$url</a>" . $suffix;
   2874 }
   2875 
   2876 /**
   2877  * Callback to convert URL match to HTML A element.
   2878  *
   2879  * This function was backported from 2.5.0 to 2.3.2. Regex callback for make_clickable().
   2880  *
   2881  * @since 2.3.2
   2882  * @access private
   2883  *
   2884  * @param array $matches Single Regex Match.
   2885  * @return string HTML A element with URL address.
   2886  */
   2887 function _make_web_ftp_clickable_cb( $matches ) {
   2888 	$ret  = '';
   2889 	$dest = $matches[2];
   2890 	$dest = 'http://' . $dest;
   2891 
   2892 	// Removed trailing [.,;:)] from URL.
   2893 	$last_char = substr( $dest, -1 );
   2894 	if ( in_array( $last_char, array( '.', ',', ';', ':', ')' ), true ) === true ) {
   2895 		$ret  = $last_char;
   2896 		$dest = substr( $dest, 0, strlen( $dest ) - 1 );
   2897 	}
   2898 
   2899 	$dest = esc_url( $dest );
   2900 	if ( empty( $dest ) ) {
   2901 		return $matches[0];
   2902 	}
   2903 
   2904 	if ( 'comment_text' === current_filter() ) {
   2905 		$rel = 'nofollow ugc';
   2906 	} else {
   2907 		$rel = 'nofollow';
   2908 	}
   2909 
   2910 	/** This filter is documented in wp-includes/formatting.php */
   2911 	$rel = apply_filters( 'make_clickable_rel', $rel, $dest );
   2912 	$rel = esc_attr( $rel );
   2913 
   2914 	return $matches[1] . "<a href=\"$dest\" rel=\"$rel\">$dest</a>$ret";
   2915 }
   2916 
   2917 /**
   2918  * Callback to convert email address match to HTML A element.
   2919  *
   2920  * This function was backported from 2.5.0 to 2.3.2. Regex callback for make_clickable().
   2921  *
   2922  * @since 2.3.2
   2923  * @access private
   2924  *
   2925  * @param array $matches Single Regex Match.
   2926  * @return string HTML A element with email address.
   2927  */
   2928 function _make_email_clickable_cb( $matches ) {
   2929 	$email = $matches[2] . '@' . $matches[3];
   2930 	return $matches[1] . "<a href=\"mailto:$email\">$email</a>";
   2931 }
   2932 
   2933 /**
   2934  * Convert plaintext URI to HTML links.
   2935  *
   2936  * Converts URI, www and ftp, and email addresses. Finishes by fixing links
   2937  * within links.
   2938  *
   2939  * @since 0.71
   2940  *
   2941  * @param string $text Content to convert URIs.
   2942  * @return string Content with converted URIs.
   2943  */
   2944 function make_clickable( $text ) {
   2945 	$r               = '';
   2946 	$textarr         = preg_split( '/(<[^<>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // Split out HTML tags.
   2947 	$nested_code_pre = 0; // Keep track of how many levels link is nested inside <pre> or <code>.
   2948 	foreach ( $textarr as $piece ) {
   2949 
   2950 		if ( preg_match( '|^<code[\s>]|i', $piece ) || preg_match( '|^<pre[\s>]|i', $piece ) || preg_match( '|^<script[\s>]|i', $piece ) || preg_match( '|^<style[\s>]|i', $piece ) ) {
   2951 			$nested_code_pre++;
   2952 		} elseif ( $nested_code_pre && ( '</code>' === strtolower( $piece ) || '</pre>' === strtolower( $piece ) || '</script>' === strtolower( $piece ) || '</style>' === strtolower( $piece ) ) ) {
   2953 			$nested_code_pre--;
   2954 		}
   2955 
   2956 		if ( $nested_code_pre || empty( $piece ) || ( '<' === $piece[0] && ! preg_match( '|^<\s*[\w]{1,20}+://|', $piece ) ) ) {
   2957 			$r .= $piece;
   2958 			continue;
   2959 		}
   2960 
   2961 		// Long strings might contain expensive edge cases...
   2962 		if ( 10000 < strlen( $piece ) ) {
   2963 			// ...break it up.
   2964 			foreach ( _split_str_by_whitespace( $piece, 2100 ) as $chunk ) { // 2100: Extra room for scheme and leading and trailing paretheses.
   2965 				if ( 2101 < strlen( $chunk ) ) {
   2966 					$r .= $chunk; // Too big, no whitespace: bail.
   2967 				} else {
   2968 					$r .= make_clickable( $chunk );
   2969 				}
   2970 			}
   2971 		} else {
   2972 			$ret = " $piece "; // Pad with whitespace to simplify the regexes.
   2973 
   2974 			$url_clickable = '~
   2975 				([\\s(<.,;:!?])                                # 1: Leading whitespace, or punctuation.
   2976 				(                                              # 2: URL.
   2977 					[\\w]{1,20}+://                                # Scheme and hier-part prefix.
   2978 					(?=\S{1,2000}\s)                               # Limit to URLs less than about 2000 characters long.
   2979 					[\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]*+         # Non-punctuation URL character.
   2980 					(?:                                            # Unroll the Loop: Only allow puctuation URL character if followed by a non-punctuation URL character.
   2981 						[\'.,;:!?)]                                    # Punctuation URL character.
   2982 						[\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]++         # Non-punctuation URL character.
   2983 					)*
   2984 				)
   2985 				(\)?)                                          # 3: Trailing closing parenthesis (for parethesis balancing post processing).
   2986 			~xS';
   2987 			// The regex is a non-anchored pattern and does not have a single fixed starting character.
   2988 			// Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times.
   2989 
   2990 			$ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret );
   2991 
   2992 			$ret = preg_replace_callback( '#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]+)#is', '_make_web_ftp_clickable_cb', $ret );
   2993 			$ret = preg_replace_callback( '#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret );
   2994 
   2995 			$ret = substr( $ret, 1, -1 ); // Remove our whitespace padding.
   2996 			$r  .= $ret;
   2997 		}
   2998 	}
   2999 
   3000 	// Cleanup of accidental links within links.
   3001 	return preg_replace( '#(<a([ \r\n\t]+[^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', '$1$3</a>', $r );
   3002 }
   3003 
   3004 /**
   3005  * Breaks a string into chunks by splitting at whitespace characters.
   3006  * The length of each returned chunk is as close to the specified length goal as possible,
   3007  * with the caveat that each chunk includes its trailing delimiter.
   3008  * Chunks longer than the goal are guaranteed to not have any inner whitespace.
   3009  *
   3010  * Joining the returned chunks with empty delimiters reconstructs the input string losslessly.
   3011  *
   3012  * Input string must have no null characters (or eventual transformations on output chunks must not care about null characters)
   3013  *
   3014  *     _split_str_by_whitespace( "1234 67890 1234 67890a cd 1234   890 123456789 1234567890a    45678   1 3 5 7 90 ", 10 ) ==
   3015  *     array (
   3016  *         0 => '1234 67890 ',  // 11 characters: Perfect split.
   3017  *         1 => '1234 ',        //  5 characters: '1234 67890a' was too long.
   3018  *         2 => '67890a cd ',   // 10 characters: '67890a cd 1234' was too long.
   3019  *         3 => '1234   890 ',  // 11 characters: Perfect split.
   3020  *         4 => '123456789 ',   // 10 characters: '123456789 1234567890a' was too long.
   3021  *         5 => '1234567890a ', // 12 characters: Too long, but no inner whitespace on which to split.
   3022  *         6 => '   45678   ',  // 11 characters: Perfect split.
   3023  *         7 => '1 3 5 7 90 ',  // 11 characters: End of $string.
   3024  *     );
   3025  *
   3026  * @since 3.4.0
   3027  * @access private
   3028  *
   3029  * @param string $string The string to split.
   3030  * @param int    $goal   The desired chunk length.
   3031  * @return array Numeric array of chunks.
   3032  */
   3033 function _split_str_by_whitespace( $string, $goal ) {
   3034 	$chunks = array();
   3035 
   3036 	$string_nullspace = strtr( $string, "\r\n\t\v\f ", "\000\000\000\000\000\000" );
   3037 
   3038 	while ( $goal < strlen( $string_nullspace ) ) {
   3039 		$pos = strrpos( substr( $string_nullspace, 0, $goal + 1 ), "\000" );
   3040 
   3041 		if ( false === $pos ) {
   3042 			$pos = strpos( $string_nullspace, "\000", $goal + 1 );
   3043 			if ( false === $pos ) {
   3044 				break;
   3045 			}
   3046 		}
   3047 
   3048 		$chunks[]         = substr( $string, 0, $pos + 1 );
   3049 		$string           = substr( $string, $pos + 1 );
   3050 		$string_nullspace = substr( $string_nullspace, $pos + 1 );
   3051 	}
   3052 
   3053 	if ( $string ) {
   3054 		$chunks[] = $string;
   3055 	}
   3056 
   3057 	return $chunks;
   3058 }
   3059 
   3060 /**
   3061  * Callback to add a rel attribute to HTML A element.
   3062  *
   3063  * Will remove already existing string before adding to prevent invalidating (X)HTML.
   3064  *
   3065  * @since 5.3.0
   3066  *
   3067  * @param array  $matches Single match.
   3068  * @param string $rel     The rel attribute to add.
   3069  * @return string HTML A element with the added rel attribute.
   3070  */
   3071 function wp_rel_callback( $matches, $rel ) {
   3072 	$text = $matches[1];
   3073 	$atts = wp_kses_hair( $matches[1], wp_allowed_protocols() );
   3074 
   3075 	if ( ! empty( $atts['href'] ) ) {
   3076 		if ( in_array( strtolower( wp_parse_url( $atts['href']['value'], PHP_URL_SCHEME ) ), array( 'http', 'https' ), true ) ) {
   3077 			if ( strtolower( wp_parse_url( $atts['href']['value'], PHP_URL_HOST ) ) === strtolower( wp_parse_url( home_url(), PHP_URL_HOST ) ) ) {
   3078 				return "<a $text>";
   3079 			}
   3080 		}
   3081 	}
   3082 
   3083 	if ( ! empty( $atts['rel'] ) ) {
   3084 		$parts     = array_map( 'trim', explode( ' ', $atts['rel']['value'] ) );
   3085 		$rel_array = array_map( 'trim', explode( ' ', $rel ) );
   3086 		$parts     = array_unique( array_merge( $parts, $rel_array ) );
   3087 		$rel       = implode( ' ', $parts );
   3088 		unset( $atts['rel'] );
   3089 
   3090 		$html = '';
   3091 		foreach ( $atts as $name => $value ) {
   3092 			if ( isset( $value['vless'] ) && 'y' === $value['vless'] ) {
   3093 				$html .= $name . ' ';
   3094 			} else {
   3095 				$html .= "{$name}=\"" . esc_attr( $value['value'] ) . '" ';
   3096 			}
   3097 		}
   3098 		$text = trim( $html );
   3099 	}
   3100 	return "<a $text rel=\"" . esc_attr( $rel ) . '">';
   3101 }
   3102 
   3103 /**
   3104  * Adds `rel="nofollow"` string to all HTML A elements in content.
   3105  *
   3106  * @since 1.5.0
   3107  *
   3108  * @param string $text Content that may contain HTML A elements.
   3109  * @return string Converted content.
   3110  */
   3111 function wp_rel_nofollow( $text ) {
   3112 	// This is a pre-save filter, so text is already escaped.
   3113 	$text = stripslashes( $text );
   3114 	$text = preg_replace_callback(
   3115 		'|<a (.+?)>|i',
   3116 		function( $matches ) {
   3117 			return wp_rel_callback( $matches, 'nofollow' );
   3118 		},
   3119 		$text
   3120 	);
   3121 	return wp_slash( $text );
   3122 }
   3123 
   3124 /**
   3125  * Callback to add `rel="nofollow"` string to HTML A element.
   3126  *
   3127  * @since 2.3.0
   3128  * @deprecated 5.3.0 Use wp_rel_callback()
   3129  *
   3130  * @param array $matches Single match.
   3131  * @return string HTML A Element with `rel="nofollow"`.
   3132  */
   3133 function wp_rel_nofollow_callback( $matches ) {
   3134 	return wp_rel_callback( $matches, 'nofollow' );
   3135 }
   3136 
   3137 /**
   3138  * Adds `rel="nofollow ugc"` string to all HTML A elements in content.
   3139  *
   3140  * @since 5.3.0
   3141  *
   3142  * @param string $text Content that may contain HTML A elements.
   3143  * @return string Converted content.
   3144  */
   3145 function wp_rel_ugc( $text ) {
   3146 	// This is a pre-save filter, so text is already escaped.
   3147 	$text = stripslashes( $text );
   3148 	$text = preg_replace_callback(
   3149 		'|<a (.+?)>|i',
   3150 		function( $matches ) {
   3151 			return wp_rel_callback( $matches, 'nofollow ugc' );
   3152 		},
   3153 		$text
   3154 	);
   3155 	return wp_slash( $text );
   3156 }
   3157 
   3158 /**
   3159  * Adds `rel="noopener"` to all HTML A elements that have a target.
   3160  *
   3161  * @since 5.1.0
   3162  * @since 5.6.0 Removed 'noreferrer' relationship.
   3163  *
   3164  * @param string $text Content that may contain HTML A elements.
   3165  * @return string Converted content.
   3166  */
   3167 function wp_targeted_link_rel( $text ) {
   3168 	// Don't run (more expensive) regex if no links with targets.
   3169 	if ( stripos( $text, 'target' ) === false || stripos( $text, '<a ' ) === false || is_serialized( $text ) ) {
   3170 		return $text;
   3171 	}
   3172 
   3173 	$script_and_style_regex = '/<(script|style).*?<\/\\1>/si';
   3174 
   3175 	preg_match_all( $script_and_style_regex, $text, $matches );
   3176 	$extra_parts = $matches[0];
   3177 	$html_parts  = preg_split( $script_and_style_regex, $text );
   3178 
   3179 	foreach ( $html_parts as &$part ) {
   3180 		$part = preg_replace_callback( '|<a\s([^>]*target\s*=[^>]*)>|i', 'wp_targeted_link_rel_callback', $part );
   3181 	}
   3182 
   3183 	$text = '';
   3184 	for ( $i = 0; $i < count( $html_parts ); $i++ ) {
   3185 		$text .= $html_parts[ $i ];
   3186 		if ( isset( $extra_parts[ $i ] ) ) {
   3187 			$text .= $extra_parts[ $i ];
   3188 		}
   3189 	}
   3190 
   3191 	return $text;
   3192 }
   3193 
   3194 /**
   3195  * Callback to add `rel="noopener"` string to HTML A element.
   3196  *
   3197  * Will not duplicate an existing 'noopener' value to avoid invalidating the HTML.
   3198  *
   3199  * @since 5.1.0
   3200  * @since 5.6.0 Removed 'noreferrer' relationship.
   3201  *
   3202  * @param array $matches Single match.
   3203  * @return string HTML A Element with `rel="noopener"` in addition to any existing values.
   3204  */
   3205 function wp_targeted_link_rel_callback( $matches ) {
   3206 	$link_html          = $matches[1];
   3207 	$original_link_html = $link_html;
   3208 
   3209 	// Consider the HTML escaped if there are no unescaped quotes.
   3210 	$is_escaped = ! preg_match( '/(^|[^\\\\])[\'"]/', $link_html );
   3211 	if ( $is_escaped ) {
   3212 		// Replace only the quotes so that they are parsable by wp_kses_hair(), leave the rest as is.
   3213 		$link_html = preg_replace( '/\\\\([\'"])/', '$1', $link_html );
   3214 	}
   3215 
   3216 	$atts = wp_kses_hair( $link_html, wp_allowed_protocols() );
   3217 
   3218 	/**
   3219 	 * Filters the rel values that are added to links with `target` attribute.
   3220 	 *
   3221 	 * @since 5.1.0
   3222 	 *
   3223 	 * @param string $rel       The rel values.
   3224 	 * @param string $link_html The matched content of the link tag including all HTML attributes.
   3225 	 */
   3226 	$rel = apply_filters( 'wp_targeted_link_rel', 'noopener', $link_html );
   3227 
   3228 	// Return early if no rel values to be added or if no actual target attribute.
   3229 	if ( ! $rel || ! isset( $atts['target'] ) ) {
   3230 		return "<a $original_link_html>";
   3231 	}
   3232 
   3233 	if ( isset( $atts['rel'] ) ) {
   3234 		$all_parts = preg_split( '/\s/', "{$atts['rel']['value']} $rel", -1, PREG_SPLIT_NO_EMPTY );
   3235 		$rel       = implode( ' ', array_unique( $all_parts ) );
   3236 	}
   3237 
   3238 	$atts['rel']['whole'] = 'rel="' . esc_attr( $rel ) . '"';
   3239 	$link_html            = implode( ' ', array_column( $atts, 'whole' ) );
   3240 
   3241 	if ( $is_escaped ) {
   3242 		$link_html = preg_replace( '/[\'"]/', '\\\\$0', $link_html );
   3243 	}
   3244 
   3245 	return "<a $link_html>";
   3246 }
   3247 
   3248 /**
   3249  * Adds all filters modifying the rel attribute of targeted links.
   3250  *
   3251  * @since 5.1.0
   3252  */
   3253 function wp_init_targeted_link_rel_filters() {
   3254 	$filters = array(
   3255 		'title_save_pre',
   3256 		'content_save_pre',
   3257 		'excerpt_save_pre',
   3258 		'content_filtered_save_pre',
   3259 		'pre_comment_content',
   3260 		'pre_term_description',
   3261 		'pre_link_description',
   3262 		'pre_link_notes',
   3263 		'pre_user_description',
   3264 	);
   3265 
   3266 	foreach ( $filters as $filter ) {
   3267 		add_filter( $filter, 'wp_targeted_link_rel' );
   3268 	};
   3269 }
   3270 
   3271 /**
   3272  * Removes all filters modifying the rel attribute of targeted links.
   3273  *
   3274  * @since 5.1.0
   3275  */
   3276 function wp_remove_targeted_link_rel_filters() {
   3277 	$filters = array(
   3278 		'title_save_pre',
   3279 		'content_save_pre',
   3280 		'excerpt_save_pre',
   3281 		'content_filtered_save_pre',
   3282 		'pre_comment_content',
   3283 		'pre_term_description',
   3284 		'pre_link_description',
   3285 		'pre_link_notes',
   3286 		'pre_user_description',
   3287 	);
   3288 
   3289 	foreach ( $filters as $filter ) {
   3290 		remove_filter( $filter, 'wp_targeted_link_rel' );
   3291 	};
   3292 }
   3293 
   3294 /**
   3295  * Convert one smiley code to the icon graphic file equivalent.
   3296  *
   3297  * Callback handler for convert_smilies().
   3298  *
   3299  * Looks up one smiley code in the $wpsmiliestrans global array and returns an
   3300  * `<img>` string for that smiley.
   3301  *
   3302  * @since 2.8.0
   3303  *
   3304  * @global array $wpsmiliestrans
   3305  *
   3306  * @param array $matches Single match. Smiley code to convert to image.
   3307  * @return string Image string for smiley.
   3308  */
   3309 function translate_smiley( $matches ) {
   3310 	global $wpsmiliestrans;
   3311 
   3312 	if ( count( $matches ) == 0 ) {
   3313 		return '';
   3314 	}
   3315 
   3316 	$smiley = trim( reset( $matches ) );
   3317 	$img    = $wpsmiliestrans[ $smiley ];
   3318 
   3319 	$matches    = array();
   3320 	$ext        = preg_match( '/\.([^.]+)$/', $img, $matches ) ? strtolower( $matches[1] ) : false;
   3321 	$image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' );
   3322 
   3323 	// Don't convert smilies that aren't images - they're probably emoji.
   3324 	if ( ! in_array( $ext, $image_exts, true ) ) {
   3325 		return $img;
   3326 	}
   3327 
   3328 	/**
   3329 	 * Filters the Smiley image URL before it's used in the image element.
   3330 	 *
   3331 	 * @since 2.9.0
   3332 	 *
   3333 	 * @param string $smiley_url URL for the smiley image.
   3334 	 * @param string $img        Filename for the smiley image.
   3335 	 * @param string $site_url   Site URL, as returned by site_url().
   3336 	 */
   3337 	$src_url = apply_filters( 'smilies_src', includes_url( "images/smilies/$img" ), $img, site_url() );
   3338 
   3339 	return sprintf( '<img src="%s" alt="%s" class="wp-smiley" style="height: 1em; max-height: 1em;" />', esc_url( $src_url ), esc_attr( $smiley ) );
   3340 }
   3341 
   3342 /**
   3343  * Convert text equivalent of smilies to images.
   3344  *
   3345  * Will only convert smilies if the option 'use_smilies' is true and the global
   3346  * used in the function isn't empty.
   3347  *
   3348  * @since 0.71
   3349  *
   3350  * @global string|array $wp_smiliessearch
   3351  *
   3352  * @param string $text Content to convert smilies from text.
   3353  * @return string Converted content with text smilies replaced with images.
   3354  */
   3355 function convert_smilies( $text ) {
   3356 	global $wp_smiliessearch;
   3357 	$output = '';
   3358 	if ( get_option( 'use_smilies' ) && ! empty( $wp_smiliessearch ) ) {
   3359 		// HTML loop taken from texturize function, could possible be consolidated.
   3360 		$textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // Capture the tags as well as in between.
   3361 		$stop    = count( $textarr ); // Loop stuff.
   3362 
   3363 		// Ignore proessing of specific tags.
   3364 		$tags_to_ignore       = 'code|pre|style|script|textarea';
   3365 		$ignore_block_element = '';
   3366 
   3367 		for ( $i = 0; $i < $stop; $i++ ) {
   3368 			$content = $textarr[ $i ];
   3369 
   3370 			// If we're in an ignore block, wait until we find its closing tag.
   3371 			if ( '' === $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')[^>]*>/', $content, $matches ) ) {
   3372 				$ignore_block_element = $matches[1];
   3373 			}
   3374 
   3375 			// If it's not a tag and not in ignore block.
   3376 			if ( '' === $ignore_block_element && strlen( $content ) > 0 && '<' !== $content[0] ) {
   3377 				$content = preg_replace_callback( $wp_smiliessearch, 'translate_smiley', $content );
   3378 			}
   3379 
   3380 			// Did we exit ignore block?
   3381 			if ( '' !== $ignore_block_element && '</' . $ignore_block_element . '>' === $content ) {
   3382 				$ignore_block_element = '';
   3383 			}
   3384 
   3385 			$output .= $content;
   3386 		}
   3387 	} else {
   3388 		// Return default text.
   3389 		$output = $text;
   3390 	}
   3391 	return $output;
   3392 }
   3393 
   3394 /**
   3395  * Verifies that an email is valid.
   3396  *
   3397  * Does not grok i18n domains. Not RFC compliant.
   3398  *
   3399  * @since 0.71
   3400  *
   3401  * @param string $email      Email address to verify.
   3402  * @param bool   $deprecated Deprecated.
   3403  * @return string|false Valid email address on success, false on failure.
   3404  */
   3405 function is_email( $email, $deprecated = false ) {
   3406 	if ( ! empty( $deprecated ) ) {
   3407 		_deprecated_argument( __FUNCTION__, '3.0.0' );
   3408 	}
   3409 
   3410 	// Test for the minimum length the email can be.
   3411 	if ( strlen( $email ) < 6 ) {
   3412 		/**
   3413 		 * Filters whether an email address is valid.
   3414 		 *
   3415 		 * This filter is evaluated under several different contexts, such as 'email_too_short',
   3416 		 * 'email_no_at', 'local_invalid_chars', 'domain_period_sequence', 'domain_period_limits',
   3417 		 * 'domain_no_periods', 'sub_hyphen_limits', 'sub_invalid_chars', or no specific context.
   3418 		 *
   3419 		 * @since 2.8.0
   3420 		 *
   3421 		 * @param string|false $is_email The email address if successfully passed the is_email() checks, false otherwise.
   3422 		 * @param string       $email    The email address being checked.
   3423 		 * @param string       $context  Context under which the email was tested.
   3424 		 */
   3425 		return apply_filters( 'is_email', false, $email, 'email_too_short' );
   3426 	}
   3427 
   3428 	// Test for an @ character after the first position.
   3429 	if ( strpos( $email, '@', 1 ) === false ) {
   3430 		/** This filter is documented in wp-includes/formatting.php */
   3431 		return apply_filters( 'is_email', false, $email, 'email_no_at' );
   3432 	}
   3433 
   3434 	// Split out the local and domain parts.
   3435 	list( $local, $domain ) = explode( '@', $email, 2 );
   3436 
   3437 	// LOCAL PART
   3438 	// Test for invalid characters.
   3439 	if ( ! preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local ) ) {
   3440 		/** This filter is documented in wp-includes/formatting.php */
   3441 		return apply_filters( 'is_email', false, $email, 'local_invalid_chars' );
   3442 	}
   3443 
   3444 	// DOMAIN PART
   3445 	// Test for sequences of periods.
   3446 	if ( preg_match( '/\.{2,}/', $domain ) ) {
   3447 		/** This filter is documented in wp-includes/formatting.php */
   3448 		return apply_filters( 'is_email', false, $email, 'domain_period_sequence' );
   3449 	}
   3450 
   3451 	// Test for leading and trailing periods and whitespace.
   3452 	if ( trim( $domain, " \t\n\r\0\x0B." ) !== $domain ) {
   3453 		/** This filter is documented in wp-includes/formatting.php */
   3454 		return apply_filters( 'is_email', false, $email, 'domain_period_limits' );
   3455 	}
   3456 
   3457 	// Split the domain into subs.
   3458 	$subs = explode( '.', $domain );
   3459 
   3460 	// Assume the domain will have at least two subs.
   3461 	if ( 2 > count( $subs ) ) {
   3462 		/** This filter is documented in wp-includes/formatting.php */
   3463 		return apply_filters( 'is_email', false, $email, 'domain_no_periods' );
   3464 	}
   3465 
   3466 	// Loop through each sub.
   3467 	foreach ( $subs as $sub ) {
   3468 		// Test for leading and trailing hyphens and whitespace.
   3469 		if ( trim( $sub, " \t\n\r\0\x0B-" ) !== $sub ) {
   3470 			/** This filter is documented in wp-includes/formatting.php */
   3471 			return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' );
   3472 		}
   3473 
   3474 		// Test for invalid characters.
   3475 		if ( ! preg_match( '/^[a-z0-9-]+$/i', $sub ) ) {
   3476 			/** This filter is documented in wp-includes/formatting.php */
   3477 			return apply_filters( 'is_email', false, $email, 'sub_invalid_chars' );
   3478 		}
   3479 	}
   3480 
   3481 	// Congratulations, your email made it!
   3482 	/** This filter is documented in wp-includes/formatting.php */
   3483 	return apply_filters( 'is_email', $email, $email, null );
   3484 }
   3485 
   3486 /**
   3487  * Convert to ASCII from email subjects.
   3488  *
   3489  * @since 1.2.0
   3490  *
   3491  * @param string $string Subject line
   3492  * @return string Converted string to ASCII
   3493  */
   3494 function wp_iso_descrambler( $string ) {
   3495 	/* this may only work with iso-8859-1, I'm afraid */
   3496 	if ( ! preg_match( '#\=\?(.+)\?Q\?(.+)\?\=#i', $string, $matches ) ) {
   3497 		return $string;
   3498 	} else {
   3499 		$subject = str_replace( '_', ' ', $matches[2] );
   3500 		return preg_replace_callback( '#\=([0-9a-f]{2})#i', '_wp_iso_convert', $subject );
   3501 	}
   3502 }
   3503 
   3504 /**
   3505  * Helper function to convert hex encoded chars to ASCII
   3506  *
   3507  * @since 3.1.0
   3508  * @access private
   3509  *
   3510  * @param array $match The preg_replace_callback matches array
   3511  * @return string Converted chars
   3512  */
   3513 function _wp_iso_convert( $match ) {
   3514 	return chr( hexdec( strtolower( $match[1] ) ) );
   3515 }
   3516 
   3517 /**
   3518  * Given a date in the timezone of the site, returns that date in UTC.
   3519  *
   3520  * Requires and returns a date in the Y-m-d H:i:s format.
   3521  * Return format can be overridden using the $format parameter.
   3522  *
   3523  * @since 1.2.0
   3524  *
   3525  * @param string $string The date to be converted, in the timezone of the site.
   3526  * @param string $format The format string for the returned date. Default 'Y-m-d H:i:s'.
   3527  * @return string Formatted version of the date, in UTC.
   3528  */
   3529 function get_gmt_from_date( $string, $format = 'Y-m-d H:i:s' ) {
   3530 	$datetime = date_create( $string, wp_timezone() );
   3531 
   3532 	if ( false === $datetime ) {
   3533 		return gmdate( $format, 0 );
   3534 	}
   3535 
   3536 	return $datetime->setTimezone( new DateTimeZone( 'UTC' ) )->format( $format );
   3537 }
   3538 
   3539 /**
   3540  * Given a date in UTC or GMT timezone, returns that date in the timezone of the site.
   3541  *
   3542  * Requires and returns a date in the Y-m-d H:i:s format.
   3543  * Return format can be overridden using the $format parameter.
   3544  *
   3545  * @since 1.2.0
   3546  *
   3547  * @param string $string The date to be converted, in UTC or GMT timezone.
   3548  * @param string $format The format string for the returned date. Default 'Y-m-d H:i:s'.
   3549  * @return string Formatted version of the date, in the site's timezone.
   3550  */
   3551 function get_date_from_gmt( $string, $format = 'Y-m-d H:i:s' ) {
   3552 	$datetime = date_create( $string, new DateTimeZone( 'UTC' ) );
   3553 
   3554 	if ( false === $datetime ) {
   3555 		return gmdate( $format, 0 );
   3556 	}
   3557 
   3558 	return $datetime->setTimezone( wp_timezone() )->format( $format );
   3559 }
   3560 
   3561 /**
   3562  * Given an ISO 8601 timezone, returns its UTC offset in seconds.
   3563  *
   3564  * @since 1.5.0
   3565  *
   3566  * @param string $timezone Either 'Z' for 0 offset or '±hhmm'.
   3567  * @return int|float The offset in seconds.
   3568  */
   3569 function iso8601_timezone_to_offset( $timezone ) {
   3570 	// $timezone is either 'Z' or '[+|-]hhmm'.
   3571 	if ( 'Z' === $timezone ) {
   3572 		$offset = 0;
   3573 	} else {
   3574 		$sign    = ( '+' === substr( $timezone, 0, 1 ) ) ? 1 : -1;
   3575 		$hours   = (int) substr( $timezone, 1, 2 );
   3576 		$minutes = (int) substr( $timezone, 3, 4 ) / 60;
   3577 		$offset  = $sign * HOUR_IN_SECONDS * ( $hours + $minutes );
   3578 	}
   3579 	return $offset;
   3580 }
   3581 
   3582 /**
   3583  * Given an ISO 8601 (Ymd\TH:i:sO) date, returns a MySQL DateTime (Y-m-d H:i:s) format used by post_date[_gmt].
   3584  *
   3585  * @since 1.5.0
   3586  *
   3587  * @param string $date_string Date and time in ISO 8601 format {@link https://en.wikipedia.org/wiki/ISO_8601}.
   3588  * @param string $timezone    Optional. If set to 'gmt' returns the result in UTC. Default 'user'.
   3589  * @return string|false The date and time in MySQL DateTime format - Y-m-d H:i:s, or false on failure.
   3590  */
   3591 function iso8601_to_datetime( $date_string, $timezone = 'user' ) {
   3592 	$timezone    = strtolower( $timezone );
   3593 	$wp_timezone = wp_timezone();
   3594 	$datetime    = date_create( $date_string, $wp_timezone ); // Timezone is ignored if input has one.
   3595 
   3596 	if ( false === $datetime ) {
   3597 		return false;
   3598 	}
   3599 
   3600 	if ( 'gmt' === $timezone ) {
   3601 		return $datetime->setTimezone( new DateTimeZone( 'UTC' ) )->format( 'Y-m-d H:i:s' );
   3602 	}
   3603 
   3604 	if ( 'user' === $timezone ) {
   3605 		return $datetime->setTimezone( $wp_timezone )->format( 'Y-m-d H:i:s' );
   3606 	}
   3607 
   3608 	return false;
   3609 }
   3610 
   3611 /**
   3612  * Strips out all characters that are not allowable in an email.
   3613  *
   3614  * @since 1.5.0
   3615  *
   3616  * @param string $email Email address to filter.
   3617  * @return string Filtered email address.
   3618  */
   3619 function sanitize_email( $email ) {
   3620 	// Test for the minimum length the email can be.
   3621 	if ( strlen( $email ) < 6 ) {
   3622 		/**
   3623 		 * Filters a sanitized email address.
   3624 		 *
   3625 		 * This filter is evaluated under several contexts, including 'email_too_short',
   3626 		 * 'email_no_at', 'local_invalid_chars', 'domain_period_sequence', 'domain_period_limits',
   3627 		 * 'domain_no_periods', 'domain_no_valid_subs', or no context.
   3628 		 *
   3629 		 * @since 2.8.0
   3630 		 *
   3631 		 * @param string $sanitized_email The sanitized email address.
   3632 		 * @param string $email           The email address, as provided to sanitize_email().
   3633 		 * @param string|null $message    A message to pass to the user. null if email is sanitized.
   3634 		 */
   3635 		return apply_filters( 'sanitize_email', '', $email, 'email_too_short' );
   3636 	}
   3637 
   3638 	// Test for an @ character after the first position.
   3639 	if ( strpos( $email, '@', 1 ) === false ) {
   3640 		/** This filter is documented in wp-includes/formatting.php */
   3641 		return apply_filters( 'sanitize_email', '', $email, 'email_no_at' );
   3642 	}
   3643 
   3644 	// Split out the local and domain parts.
   3645 	list( $local, $domain ) = explode( '@', $email, 2 );
   3646 
   3647 	// LOCAL PART
   3648 	// Test for invalid characters.
   3649 	$local = preg_replace( '/[^a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]/', '', $local );
   3650 	if ( '' === $local ) {
   3651 		/** This filter is documented in wp-includes/formatting.php */
   3652 		return apply_filters( 'sanitize_email', '', $email, 'local_invalid_chars' );
   3653 	}
   3654 
   3655 	// DOMAIN PART
   3656 	// Test for sequences of periods.
   3657 	$domain = preg_replace( '/\.{2,}/', '', $domain );
   3658 	if ( '' === $domain ) {
   3659 		/** This filter is documented in wp-includes/formatting.php */
   3660 		return apply_filters( 'sanitize_email', '', $email, 'domain_period_sequence' );
   3661 	}
   3662 
   3663 	// Test for leading and trailing periods and whitespace.
   3664 	$domain = trim( $domain, " \t\n\r\0\x0B." );
   3665 	if ( '' === $domain ) {
   3666 		/** This filter is documented in wp-includes/formatting.php */
   3667 		return apply_filters( 'sanitize_email', '', $email, 'domain_period_limits' );
   3668 	}
   3669 
   3670 	// Split the domain into subs.
   3671 	$subs = explode( '.', $domain );
   3672 
   3673 	// Assume the domain will have at least two subs.
   3674 	if ( 2 > count( $subs ) ) {
   3675 		/** This filter is documented in wp-includes/formatting.php */
   3676 		return apply_filters( 'sanitize_email', '', $email, 'domain_no_periods' );
   3677 	}
   3678 
   3679 	// Create an array that will contain valid subs.
   3680 	$new_subs = array();
   3681 
   3682 	// Loop through each sub.
   3683 	foreach ( $subs as $sub ) {
   3684 		// Test for leading and trailing hyphens.
   3685 		$sub = trim( $sub, " \t\n\r\0\x0B-" );
   3686 
   3687 		// Test for invalid characters.
   3688 		$sub = preg_replace( '/[^a-z0-9-]+/i', '', $sub );
   3689 
   3690 		// If there's anything left, add it to the valid subs.
   3691 		if ( '' !== $sub ) {
   3692 			$new_subs[] = $sub;
   3693 		}
   3694 	}
   3695 
   3696 	// If there aren't 2 or more valid subs.
   3697 	if ( 2 > count( $new_subs ) ) {
   3698 		/** This filter is documented in wp-includes/formatting.php */
   3699 		return apply_filters( 'sanitize_email', '', $email, 'domain_no_valid_subs' );
   3700 	}
   3701 
   3702 	// Join valid subs into the new domain.
   3703 	$domain = implode( '.', $new_subs );
   3704 
   3705 	// Put the email back together.
   3706 	$sanitized_email = $local . '@' . $domain;
   3707 
   3708 	// Congratulations, your email made it!
   3709 	/** This filter is documented in wp-includes/formatting.php */
   3710 	return apply_filters( 'sanitize_email', $sanitized_email, $email, null );
   3711 }
   3712 
   3713 /**
   3714  * Determines the difference between two timestamps.
   3715  *
   3716  * The difference is returned in a human readable format such as "1 hour",
   3717  * "5 mins", "2 days".
   3718  *
   3719  * @since 1.5.0
   3720  * @since 5.3.0 Added support for showing a difference in seconds.
   3721  *
   3722  * @param int $from Unix timestamp from which the difference begins.
   3723  * @param int $to   Optional. Unix timestamp to end the time difference. Default becomes time() if not set.
   3724  * @return string Human readable time difference.
   3725  */
   3726 function human_time_diff( $from, $to = 0 ) {
   3727 	if ( empty( $to ) ) {
   3728 		$to = time();
   3729 	}
   3730 
   3731 	$diff = (int) abs( $to - $from );
   3732 
   3733 	if ( $diff < MINUTE_IN_SECONDS ) {
   3734 		$secs = $diff;
   3735 		if ( $secs <= 1 ) {
   3736 			$secs = 1;
   3737 		}
   3738 		/* translators: Time difference between two dates, in seconds. %s: Number of seconds. */
   3739 		$since = sprintf( _n( '%s second', '%s seconds', $secs ), $secs );
   3740 	} elseif ( $diff < HOUR_IN_SECONDS && $diff >= MINUTE_IN_SECONDS ) {
   3741 		$mins = round( $diff / MINUTE_IN_SECONDS );
   3742 		if ( $mins <= 1 ) {
   3743 			$mins = 1;
   3744 		}
   3745 		/* translators: Time difference between two dates, in minutes (min=minute). %s: Number of minutes. */
   3746 		$since = sprintf( _n( '%s min', '%s mins', $mins ), $mins );
   3747 	} elseif ( $diff < DAY_IN_SECONDS && $diff >= HOUR_IN_SECONDS ) {
   3748 		$hours = round( $diff / HOUR_IN_SECONDS );
   3749 		if ( $hours <= 1 ) {
   3750 			$hours = 1;
   3751 		}
   3752 		/* translators: Time difference between two dates, in hours. %s: Number of hours. */
   3753 		$since = sprintf( _n( '%s hour', '%s hours', $hours ), $hours );
   3754 	} elseif ( $diff < WEEK_IN_SECONDS && $diff >= DAY_IN_SECONDS ) {
   3755 		$days = round( $diff / DAY_IN_SECONDS );
   3756 		if ( $days <= 1 ) {
   3757 			$days = 1;
   3758 		}
   3759 		/* translators: Time difference between two dates, in days. %s: Number of days. */
   3760 		$since = sprintf( _n( '%s day', '%s days', $days ), $days );
   3761 	} elseif ( $diff < MONTH_IN_SECONDS && $diff >= WEEK_IN_SECONDS ) {
   3762 		$weeks = round( $diff / WEEK_IN_SECONDS );
   3763 		if ( $weeks <= 1 ) {
   3764 			$weeks = 1;
   3765 		}
   3766 		/* translators: Time difference between two dates, in weeks. %s: Number of weeks. */
   3767 		$since = sprintf( _n( '%s week', '%s weeks', $weeks ), $weeks );
   3768 	} elseif ( $diff < YEAR_IN_SECONDS && $diff >= MONTH_IN_SECONDS ) {
   3769 		$months = round( $diff / MONTH_IN_SECONDS );
   3770 		if ( $months <= 1 ) {
   3771 			$months = 1;
   3772 		}
   3773 		/* translators: Time difference between two dates, in months. %s: Number of months. */
   3774 		$since = sprintf( _n( '%s month', '%s months', $months ), $months );
   3775 	} elseif ( $diff >= YEAR_IN_SECONDS ) {
   3776 		$years = round( $diff / YEAR_IN_SECONDS );
   3777 		if ( $years <= 1 ) {
   3778 			$years = 1;
   3779 		}
   3780 		/* translators: Time difference between two dates, in years. %s: Number of years. */
   3781 		$since = sprintf( _n( '%s year', '%s years', $years ), $years );
   3782 	}
   3783 
   3784 	/**
   3785 	 * Filters the human readable difference between two timestamps.
   3786 	 *
   3787 	 * @since 4.0.0
   3788 	 *
   3789 	 * @param string $since The difference in human readable text.
   3790 	 * @param int    $diff  The difference in seconds.
   3791 	 * @param int    $from  Unix timestamp from which the difference begins.
   3792 	 * @param int    $to    Unix timestamp to end the time difference.
   3793 	 */
   3794 	return apply_filters( 'human_time_diff', $since, $diff, $from, $to );
   3795 }
   3796 
   3797 /**
   3798  * Generates an excerpt from the content, if needed.
   3799  *
   3800  * Returns a maximum of 55 words with an ellipsis appended if necessary.
   3801  *
   3802  * The 55 word limit can be modified by plugins/themes using the {@see 'excerpt_length'} filter
   3803  * The ' [&hellip;]' string can be modified by plugins/themes using the {@see 'excerpt_more'} filter
   3804  *
   3805  * @since 1.5.0
   3806  * @since 5.2.0 Added the `$post` parameter.
   3807  *
   3808  * @param string             $text Optional. The excerpt. If set to empty, an excerpt is generated.
   3809  * @param WP_Post|object|int $post Optional. WP_Post instance or Post ID/object. Default null.
   3810  * @return string The excerpt.
   3811  */
   3812 function wp_trim_excerpt( $text = '', $post = null ) {
   3813 	$raw_excerpt = $text;
   3814 
   3815 	if ( '' === trim( $text ) ) {
   3816 		$post = get_post( $post );
   3817 		$text = get_the_content( '', false, $post );
   3818 
   3819 		$text = strip_shortcodes( $text );
   3820 		$text = excerpt_remove_blocks( $text );
   3821 
   3822 		/** This filter is documented in wp-includes/post-template.php */
   3823 		$text = apply_filters( 'the_content', $text );
   3824 		$text = str_replace( ']]>', ']]&gt;', $text );
   3825 
   3826 		/* translators: Maximum number of words used in a post excerpt. */
   3827 		$excerpt_length = (int) _x( '55', 'excerpt_length' );
   3828 
   3829 		/**
   3830 		 * Filters the maximum number of words in a post excerpt.
   3831 		 *
   3832 		 * @since 2.7.0
   3833 		 *
   3834 		 * @param int $number The maximum number of words. Default 55.
   3835 		 */
   3836 		$excerpt_length = (int) apply_filters( 'excerpt_length', $excerpt_length );
   3837 
   3838 		/**
   3839 		 * Filters the string in the "more" link displayed after a trimmed excerpt.
   3840 		 *
   3841 		 * @since 2.9.0
   3842 		 *
   3843 		 * @param string $more_string The string shown within the more link.
   3844 		 */
   3845 		$excerpt_more = apply_filters( 'excerpt_more', ' ' . '[&hellip;]' );
   3846 		$text         = wp_trim_words( $text, $excerpt_length, $excerpt_more );
   3847 	}
   3848 
   3849 	/**
   3850 	 * Filters the trimmed excerpt string.
   3851 	 *
   3852 	 * @since 2.8.0
   3853 	 *
   3854 	 * @param string $text        The trimmed text.
   3855 	 * @param string $raw_excerpt The text prior to trimming.
   3856 	 */
   3857 	return apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt );
   3858 }
   3859 
   3860 /**
   3861  * Trims text to a certain number of words.
   3862  *
   3863  * This function is localized. For languages that count 'words' by the individual
   3864  * character (such as East Asian languages), the $num_words argument will apply
   3865  * to the number of individual characters.
   3866  *
   3867  * @since 3.3.0
   3868  *
   3869  * @param string $text      Text to trim.
   3870  * @param int    $num_words Number of words. Default 55.
   3871  * @param string $more      Optional. What to append if $text needs to be trimmed. Default '&hellip;'.
   3872  * @return string Trimmed text.
   3873  */
   3874 function wp_trim_words( $text, $num_words = 55, $more = null ) {
   3875 	if ( null === $more ) {
   3876 		$more = __( '&hellip;' );
   3877 	}
   3878 
   3879 	$original_text = $text;
   3880 	$text          = wp_strip_all_tags( $text );
   3881 	$num_words     = (int) $num_words;
   3882 
   3883 	/*
   3884 	 * translators: If your word count is based on single characters (e.g. East Asian characters),
   3885 	 * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'.
   3886 	 * Do not translate into your own language.
   3887 	 */
   3888 	if ( strpos( _x( 'words', 'Word count type. Do not translate!' ), 'characters' ) === 0 && preg_match( '/^utf\-?8$/i', get_option( 'blog_charset' ) ) ) {
   3889 		$text = trim( preg_replace( "/[\n\r\t ]+/", ' ', $text ), ' ' );
   3890 		preg_match_all( '/./u', $text, $words_array );
   3891 		$words_array = array_slice( $words_array[0], 0, $num_words + 1 );
   3892 		$sep         = '';
   3893 	} else {
   3894 		$words_array = preg_split( "/[\n\r\t ]+/", $text, $num_words + 1, PREG_SPLIT_NO_EMPTY );
   3895 		$sep         = ' ';
   3896 	}
   3897 
   3898 	if ( count( $words_array ) > $num_words ) {
   3899 		array_pop( $words_array );
   3900 		$text = implode( $sep, $words_array );
   3901 		$text = $text . $more;
   3902 	} else {
   3903 		$text = implode( $sep, $words_array );
   3904 	}
   3905 
   3906 	/**
   3907 	 * Filters the text content after words have been trimmed.
   3908 	 *
   3909 	 * @since 3.3.0
   3910 	 *
   3911 	 * @param string $text          The trimmed text.
   3912 	 * @param int    $num_words     The number of words to trim the text to. Default 55.
   3913 	 * @param string $more          An optional string to append to the end of the trimmed text, e.g. &hellip;.
   3914 	 * @param string $original_text The text before it was trimmed.
   3915 	 */
   3916 	return apply_filters( 'wp_trim_words', $text, $num_words, $more, $original_text );
   3917 }
   3918 
   3919 /**
   3920  * Converts named entities into numbered entities.
   3921  *
   3922  * @since 1.5.1
   3923  *
   3924  * @param string $text The text within which entities will be converted.
   3925  * @return string Text with converted entities.
   3926  */
   3927 function ent2ncr( $text ) {
   3928 
   3929 	/**
   3930 	 * Filters text before named entities are converted into numbered entities.
   3931 	 *
   3932 	 * A non-null string must be returned for the filter to be evaluated.
   3933 	 *
   3934 	 * @since 3.3.0
   3935 	 *
   3936 	 * @param string|null $converted_text The text to be converted. Default null.
   3937 	 * @param string      $text           The text prior to entity conversion.
   3938 	 */
   3939 	$filtered = apply_filters( 'pre_ent2ncr', null, $text );
   3940 	if ( null !== $filtered ) {
   3941 		return $filtered;
   3942 	}
   3943 
   3944 	$to_ncr = array(
   3945 		'&quot;'     => '&#34;',
   3946 		'&amp;'      => '&#38;',
   3947 		'&lt;'       => '&#60;',
   3948 		'&gt;'       => '&#62;',
   3949 		'|'          => '&#124;',
   3950 		'&nbsp;'     => '&#160;',
   3951 		'&iexcl;'    => '&#161;',
   3952 		'&cent;'     => '&#162;',
   3953 		'&pound;'    => '&#163;',
   3954 		'&curren;'   => '&#164;',
   3955 		'&yen;'      => '&#165;',
   3956 		'&brvbar;'   => '&#166;',
   3957 		'&brkbar;'   => '&#166;',
   3958 		'&sect;'     => '&#167;',
   3959 		'&uml;'      => '&#168;',
   3960 		'&die;'      => '&#168;',
   3961 		'&copy;'     => '&#169;',
   3962 		'&ordf;'     => '&#170;',
   3963 		'&laquo;'    => '&#171;',
   3964 		'&not;'      => '&#172;',
   3965 		'&shy;'      => '&#173;',
   3966 		'&reg;'      => '&#174;',
   3967 		'&macr;'     => '&#175;',
   3968 		'&hibar;'    => '&#175;',
   3969 		'&deg;'      => '&#176;',
   3970 		'&plusmn;'   => '&#177;',
   3971 		'&sup2;'     => '&#178;',
   3972 		'&sup3;'     => '&#179;',
   3973 		'&acute;'    => '&#180;',
   3974 		'&micro;'    => '&#181;',
   3975 		'&para;'     => '&#182;',
   3976 		'&middot;'   => '&#183;',
   3977 		'&cedil;'    => '&#184;',
   3978 		'&sup1;'     => '&#185;',
   3979 		'&ordm;'     => '&#186;',
   3980 		'&raquo;'    => '&#187;',
   3981 		'&frac14;'   => '&#188;',
   3982 		'&frac12;'   => '&#189;',
   3983 		'&frac34;'   => '&#190;',
   3984 		'&iquest;'   => '&#191;',
   3985 		'&Agrave;'   => '&#192;',
   3986 		'&Aacute;'   => '&#193;',
   3987 		'&Acirc;'    => '&#194;',
   3988 		'&Atilde;'   => '&#195;',
   3989 		'&Auml;'     => '&#196;',
   3990 		'&Aring;'    => '&#197;',
   3991 		'&AElig;'    => '&#198;',
   3992 		'&Ccedil;'   => '&#199;',
   3993 		'&Egrave;'   => '&#200;',
   3994 		'&Eacute;'   => '&#201;',
   3995 		'&Ecirc;'    => '&#202;',
   3996 		'&Euml;'     => '&#203;',
   3997 		'&Igrave;'   => '&#204;',
   3998 		'&Iacute;'   => '&#205;',
   3999 		'&Icirc;'    => '&#206;',
   4000 		'&Iuml;'     => '&#207;',
   4001 		'&ETH;'      => '&#208;',
   4002 		'&Ntilde;'   => '&#209;',
   4003 		'&Ograve;'   => '&#210;',
   4004 		'&Oacute;'   => '&#211;',
   4005 		'&Ocirc;'    => '&#212;',
   4006 		'&Otilde;'   => '&#213;',
   4007 		'&Ouml;'     => '&#214;',
   4008 		'&times;'    => '&#215;',
   4009 		'&Oslash;'   => '&#216;',
   4010 		'&Ugrave;'   => '&#217;',
   4011 		'&Uacute;'   => '&#218;',
   4012 		'&Ucirc;'    => '&#219;',
   4013 		'&Uuml;'     => '&#220;',
   4014 		'&Yacute;'   => '&#221;',
   4015 		'&THORN;'    => '&#222;',
   4016 		'&szlig;'    => '&#223;',
   4017 		'&agrave;'   => '&#224;',
   4018 		'&aacute;'   => '&#225;',
   4019 		'&acirc;'    => '&#226;',
   4020 		'&atilde;'   => '&#227;',
   4021 		'&auml;'     => '&#228;',
   4022 		'&aring;'    => '&#229;',
   4023 		'&aelig;'    => '&#230;',
   4024 		'&ccedil;'   => '&#231;',
   4025 		'&egrave;'   => '&#232;',
   4026 		'&eacute;'   => '&#233;',
   4027 		'&ecirc;'    => '&#234;',
   4028 		'&euml;'     => '&#235;',
   4029 		'&igrave;'   => '&#236;',
   4030 		'&iacute;'   => '&#237;',
   4031 		'&icirc;'    => '&#238;',
   4032 		'&iuml;'     => '&#239;',
   4033 		'&eth;'      => '&#240;',
   4034 		'&ntilde;'   => '&#241;',
   4035 		'&ograve;'   => '&#242;',
   4036 		'&oacute;'   => '&#243;',
   4037 		'&ocirc;'    => '&#244;',
   4038 		'&otilde;'   => '&#245;',
   4039 		'&ouml;'     => '&#246;',
   4040 		'&divide;'   => '&#247;',
   4041 		'&oslash;'   => '&#248;',
   4042 		'&ugrave;'   => '&#249;',
   4043 		'&uacute;'   => '&#250;',
   4044 		'&ucirc;'    => '&#251;',
   4045 		'&uuml;'     => '&#252;',
   4046 		'&yacute;'   => '&#253;',
   4047 		'&thorn;'    => '&#254;',
   4048 		'&yuml;'     => '&#255;',
   4049 		'&OElig;'    => '&#338;',
   4050 		'&oelig;'    => '&#339;',
   4051 		'&Scaron;'   => '&#352;',
   4052 		'&scaron;'   => '&#353;',
   4053 		'&Yuml;'     => '&#376;',
   4054 		'&fnof;'     => '&#402;',
   4055 		'&circ;'     => '&#710;',
   4056 		'&tilde;'    => '&#732;',
   4057 		'&Alpha;'    => '&#913;',
   4058 		'&Beta;'     => '&#914;',
   4059 		'&Gamma;'    => '&#915;',
   4060 		'&Delta;'    => '&#916;',
   4061 		'&Epsilon;'  => '&#917;',
   4062 		'&Zeta;'     => '&#918;',
   4063 		'&Eta;'      => '&#919;',
   4064 		'&Theta;'    => '&#920;',
   4065 		'&Iota;'     => '&#921;',
   4066 		'&Kappa;'    => '&#922;',
   4067 		'&Lambda;'   => '&#923;',
   4068 		'&Mu;'       => '&#924;',
   4069 		'&Nu;'       => '&#925;',
   4070 		'&Xi;'       => '&#926;',
   4071 		'&Omicron;'  => '&#927;',
   4072 		'&Pi;'       => '&#928;',
   4073 		'&Rho;'      => '&#929;',
   4074 		'&Sigma;'    => '&#931;',
   4075 		'&Tau;'      => '&#932;',
   4076 		'&Upsilon;'  => '&#933;',
   4077 		'&Phi;'      => '&#934;',
   4078 		'&Chi;'      => '&#935;',
   4079 		'&Psi;'      => '&#936;',
   4080 		'&Omega;'    => '&#937;',
   4081 		'&alpha;'    => '&#945;',
   4082 		'&beta;'     => '&#946;',
   4083 		'&gamma;'    => '&#947;',
   4084 		'&delta;'    => '&#948;',
   4085 		'&epsilon;'  => '&#949;',
   4086 		'&zeta;'     => '&#950;',
   4087 		'&eta;'      => '&#951;',
   4088 		'&theta;'    => '&#952;',
   4089 		'&iota;'     => '&#953;',
   4090 		'&kappa;'    => '&#954;',
   4091 		'&lambda;'   => '&#955;',
   4092 		'&mu;'       => '&#956;',
   4093 		'&nu;'       => '&#957;',
   4094 		'&xi;'       => '&#958;',
   4095 		'&omicron;'  => '&#959;',
   4096 		'&pi;'       => '&#960;',
   4097 		'&rho;'      => '&#961;',
   4098 		'&sigmaf;'   => '&#962;',
   4099 		'&sigma;'    => '&#963;',
   4100 		'&tau;'      => '&#964;',
   4101 		'&upsilon;'  => '&#965;',
   4102 		'&phi;'      => '&#966;',
   4103 		'&chi;'      => '&#967;',
   4104 		'&psi;'      => '&#968;',
   4105 		'&omega;'    => '&#969;',
   4106 		'&thetasym;' => '&#977;',
   4107 		'&upsih;'    => '&#978;',
   4108 		'&piv;'      => '&#982;',
   4109 		'&ensp;'     => '&#8194;',
   4110 		'&emsp;'     => '&#8195;',
   4111 		'&thinsp;'   => '&#8201;',
   4112 		'&zwnj;'     => '&#8204;',
   4113 		'&zwj;'      => '&#8205;',
   4114 		'&lrm;'      => '&#8206;',
   4115 		'&rlm;'      => '&#8207;',
   4116 		'&ndash;'    => '&#8211;',
   4117 		'&mdash;'    => '&#8212;',
   4118 		'&lsquo;'    => '&#8216;',
   4119 		'&rsquo;'    => '&#8217;',
   4120 		'&sbquo;'    => '&#8218;',
   4121 		'&ldquo;'    => '&#8220;',
   4122 		'&rdquo;'    => '&#8221;',
   4123 		'&bdquo;'    => '&#8222;',
   4124 		'&dagger;'   => '&#8224;',
   4125 		'&Dagger;'   => '&#8225;',
   4126 		'&bull;'     => '&#8226;',
   4127 		'&hellip;'   => '&#8230;',
   4128 		'&permil;'   => '&#8240;',
   4129 		'&prime;'    => '&#8242;',
   4130 		'&Prime;'    => '&#8243;',
   4131 		'&lsaquo;'   => '&#8249;',
   4132 		'&rsaquo;'   => '&#8250;',
   4133 		'&oline;'    => '&#8254;',
   4134 		'&frasl;'    => '&#8260;',
   4135 		'&euro;'     => '&#8364;',
   4136 		'&image;'    => '&#8465;',
   4137 		'&weierp;'   => '&#8472;',
   4138 		'&real;'     => '&#8476;',
   4139 		'&trade;'    => '&#8482;',
   4140 		'&alefsym;'  => '&#8501;',
   4141 		'&crarr;'    => '&#8629;',
   4142 		'&lArr;'     => '&#8656;',
   4143 		'&uArr;'     => '&#8657;',
   4144 		'&rArr;'     => '&#8658;',
   4145 		'&dArr;'     => '&#8659;',
   4146 		'&hArr;'     => '&#8660;',
   4147 		'&forall;'   => '&#8704;',
   4148 		'&part;'     => '&#8706;',
   4149 		'&exist;'    => '&#8707;',
   4150 		'&empty;'    => '&#8709;',
   4151 		'&nabla;'    => '&#8711;',
   4152 		'&isin;'     => '&#8712;',
   4153 		'&notin;'    => '&#8713;',
   4154 		'&ni;'       => '&#8715;',
   4155 		'&prod;'     => '&#8719;',
   4156 		'&sum;'      => '&#8721;',
   4157 		'&minus;'    => '&#8722;',
   4158 		'&lowast;'   => '&#8727;',
   4159 		'&radic;'    => '&#8730;',
   4160 		'&prop;'     => '&#8733;',
   4161 		'&infin;'    => '&#8734;',
   4162 		'&ang;'      => '&#8736;',
   4163 		'&and;'      => '&#8743;',
   4164 		'&or;'       => '&#8744;',
   4165 		'&cap;'      => '&#8745;',
   4166 		'&cup;'      => '&#8746;',
   4167 		'&int;'      => '&#8747;',
   4168 		'&there4;'   => '&#8756;',
   4169 		'&sim;'      => '&#8764;',
   4170 		'&cong;'     => '&#8773;',
   4171 		'&asymp;'    => '&#8776;',
   4172 		'&ne;'       => '&#8800;',
   4173 		'&equiv;'    => '&#8801;',
   4174 		'&le;'       => '&#8804;',
   4175 		'&ge;'       => '&#8805;',
   4176 		'&sub;'      => '&#8834;',
   4177 		'&sup;'      => '&#8835;',
   4178 		'&nsub;'     => '&#8836;',
   4179 		'&sube;'     => '&#8838;',
   4180 		'&supe;'     => '&#8839;',
   4181 		'&oplus;'    => '&#8853;',
   4182 		'&otimes;'   => '&#8855;',
   4183 		'&perp;'     => '&#8869;',
   4184 		'&sdot;'     => '&#8901;',
   4185 		'&lceil;'    => '&#8968;',
   4186 		'&rceil;'    => '&#8969;',
   4187 		'&lfloor;'   => '&#8970;',
   4188 		'&rfloor;'   => '&#8971;',
   4189 		'&lang;'     => '&#9001;',
   4190 		'&rang;'     => '&#9002;',
   4191 		'&larr;'     => '&#8592;',
   4192 		'&uarr;'     => '&#8593;',
   4193 		'&rarr;'     => '&#8594;',
   4194 		'&darr;'     => '&#8595;',
   4195 		'&harr;'     => '&#8596;',
   4196 		'&loz;'      => '&#9674;',
   4197 		'&spades;'   => '&#9824;',
   4198 		'&clubs;'    => '&#9827;',
   4199 		'&hearts;'   => '&#9829;',
   4200 		'&diams;'    => '&#9830;',
   4201 	);
   4202 
   4203 	return str_replace( array_keys( $to_ncr ), array_values( $to_ncr ), $text );
   4204 }
   4205 
   4206 /**
   4207  * Formats text for the editor.
   4208  *
   4209  * Generally the browsers treat everything inside a textarea as text, but
   4210  * it is still a good idea to HTML entity encode `<`, `>` and `&` in the content.
   4211  *
   4212  * The filter {@see 'format_for_editor'} is applied here. If `$text` is empty the
   4213  * filter will be applied to an empty string.
   4214  *
   4215  * @since 4.3.0
   4216  *
   4217  * @see _WP_Editors::editor()
   4218  *
   4219  * @param string $text           The text to be formatted.
   4220  * @param string $default_editor The default editor for the current user.
   4221  *                               It is usually either 'html' or 'tinymce'.
   4222  * @return string The formatted text after filter is applied.
   4223  */
   4224 function format_for_editor( $text, $default_editor = null ) {
   4225 	if ( $text ) {
   4226 		$text = htmlspecialchars( $text, ENT_NOQUOTES, get_option( 'blog_charset' ) );
   4227 	}
   4228 
   4229 	/**
   4230 	 * Filters the text after it is formatted for the editor.
   4231 	 *
   4232 	 * @since 4.3.0
   4233 	 *
   4234 	 * @param string $text           The formatted text.
   4235 	 * @param string $default_editor The default editor for the current user.
   4236 	 *                               It is usually either 'html' or 'tinymce'.
   4237 	 */
   4238 	return apply_filters( 'format_for_editor', $text, $default_editor );
   4239 }
   4240 
   4241 /**
   4242  * Perform a deep string replace operation to ensure the values in $search are no longer present
   4243  *
   4244  * Repeats the replacement operation until it no longer replaces anything so as to remove "nested" values
   4245  * e.g. $subject = '%0%0%0DDD', $search ='%0D', $result ='' rather than the '%0%0DD' that
   4246  * str_replace would return
   4247  *
   4248  * @since 2.8.1
   4249  * @access private
   4250  *
   4251  * @param string|array $search  The value being searched for, otherwise known as the needle.
   4252  *                              An array may be used to designate multiple needles.
   4253  * @param string       $subject The string being searched and replaced on, otherwise known as the haystack.
   4254  * @return string The string with the replaced values.
   4255  */
   4256 function _deep_replace( $search, $subject ) {
   4257 	$subject = (string) $subject;
   4258 
   4259 	$count = 1;
   4260 	while ( $count ) {
   4261 		$subject = str_replace( $search, '', $subject, $count );
   4262 	}
   4263 
   4264 	return $subject;
   4265 }
   4266 
   4267 /**
   4268  * Escapes data for use in a MySQL query.
   4269  *
   4270  * Usually you should prepare queries using wpdb::prepare().
   4271  * Sometimes, spot-escaping is required or useful. One example
   4272  * is preparing an array for use in an IN clause.
   4273  *
   4274  * NOTE: Since 4.8.3, '%' characters will be replaced with a placeholder string,
   4275  * this prevents certain SQLi attacks from taking place. This change in behaviour
   4276  * may cause issues for code that expects the return value of esc_sql() to be useable
   4277  * for other purposes.
   4278  *
   4279  * @since 2.8.0
   4280  *
   4281  * @global wpdb $wpdb WordPress database abstraction object.
   4282  *
   4283  * @param string|array $data Unescaped data
   4284  * @return string|array Escaped data
   4285  */
   4286 function esc_sql( $data ) {
   4287 	global $wpdb;
   4288 	return $wpdb->_escape( $data );
   4289 }
   4290 
   4291 /**
   4292  * Checks and cleans a URL.
   4293  *
   4294  * A number of characters are removed from the URL. If the URL is for displaying
   4295  * (the default behaviour) ampersands are also replaced. The {@see 'clean_url'} filter
   4296  * is applied to the returned cleaned URL.
   4297  *
   4298  * @since 2.8.0
   4299  *
   4300  * @param string   $url       The URL to be cleaned.
   4301  * @param string[] $protocols Optional. An array of acceptable protocols.
   4302  *                            Defaults to return value of wp_allowed_protocols().
   4303  * @param string   $_context  Private. Use esc_url_raw() for database usage.
   4304  * @return string The cleaned URL after the {@see 'clean_url'} filter is applied.
   4305  *                An empty string is returned if `$url` specifies a protocol other than
   4306  *                those in `$protocols`, or if `$url` contains an empty string.
   4307  */
   4308 function esc_url( $url, $protocols = null, $_context = 'display' ) {
   4309 	$original_url = $url;
   4310 
   4311 	if ( '' === $url ) {
   4312 		return $url;
   4313 	}
   4314 
   4315 	$url = str_replace( ' ', '%20', ltrim( $url ) );
   4316 	$url = preg_replace( '|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\[\]\\x80-\\xff]|i', '', $url );
   4317 
   4318 	if ( '' === $url ) {
   4319 		return $url;
   4320 	}
   4321 
   4322 	if ( 0 !== stripos( $url, 'mailto:' ) ) {
   4323 		$strip = array( '%0d', '%0a', '%0D', '%0A' );
   4324 		$url   = _deep_replace( $strip, $url );
   4325 	}
   4326 
   4327 	$url = str_replace( ';//', '://', $url );
   4328 	/*
   4329 	 * If the URL doesn't appear to contain a scheme, we presume
   4330 	 * it needs http:// prepended (unless it's a relative link
   4331 	 * starting with /, # or ?, or a PHP file).
   4332 	 */
   4333 	if ( strpos( $url, ':' ) === false && ! in_array( $url[0], array( '/', '#', '?' ), true ) &&
   4334 		! preg_match( '/^[a-z0-9-]+?\.php/i', $url ) ) {
   4335 		$url = 'http://' . $url;
   4336 	}
   4337 
   4338 	// Replace ampersands and single quotes only when displaying.
   4339 	if ( 'display' === $_context ) {
   4340 		$url = wp_kses_normalize_entities( $url );
   4341 		$url = str_replace( '&amp;', '&#038;', $url );
   4342 		$url = str_replace( "'", '&#039;', $url );
   4343 	}
   4344 
   4345 	if ( ( false !== strpos( $url, '[' ) ) || ( false !== strpos( $url, ']' ) ) ) {
   4346 
   4347 		$parsed = wp_parse_url( $url );
   4348 		$front  = '';
   4349 
   4350 		if ( isset( $parsed['scheme'] ) ) {
   4351 			$front .= $parsed['scheme'] . '://';
   4352 		} elseif ( '/' === $url[0] ) {
   4353 			$front .= '//';
   4354 		}
   4355 
   4356 		if ( isset( $parsed['user'] ) ) {
   4357 			$front .= $parsed['user'];
   4358 		}
   4359 
   4360 		if ( isset( $parsed['pass'] ) ) {
   4361 			$front .= ':' . $parsed['pass'];
   4362 		}
   4363 
   4364 		if ( isset( $parsed['user'] ) || isset( $parsed['pass'] ) ) {
   4365 			$front .= '@';
   4366 		}
   4367 
   4368 		if ( isset( $parsed['host'] ) ) {
   4369 			$front .= $parsed['host'];
   4370 		}
   4371 
   4372 		if ( isset( $parsed['port'] ) ) {
   4373 			$front .= ':' . $parsed['port'];
   4374 		}
   4375 
   4376 		$end_dirty = str_replace( $front, '', $url );
   4377 		$end_clean = str_replace( array( '[', ']' ), array( '%5B', '%5D' ), $end_dirty );
   4378 		$url       = str_replace( $end_dirty, $end_clean, $url );
   4379 
   4380 	}
   4381 
   4382 	if ( '/' === $url[0] ) {
   4383 		$good_protocol_url = $url;
   4384 	} else {
   4385 		if ( ! is_array( $protocols ) ) {
   4386 			$protocols = wp_allowed_protocols();
   4387 		}
   4388 		$good_protocol_url = wp_kses_bad_protocol( $url, $protocols );
   4389 		if ( strtolower( $good_protocol_url ) != strtolower( $url ) ) {
   4390 			return '';
   4391 		}
   4392 	}
   4393 
   4394 	/**
   4395 	 * Filters a string cleaned and escaped for output as a URL.
   4396 	 *
   4397 	 * @since 2.3.0
   4398 	 *
   4399 	 * @param string $good_protocol_url The cleaned URL to be returned.
   4400 	 * @param string $original_url      The URL prior to cleaning.
   4401 	 * @param string $_context          If 'display', replace ampersands and single quotes only.
   4402 	 */
   4403 	return apply_filters( 'clean_url', $good_protocol_url, $original_url, $_context );
   4404 }
   4405 
   4406 /**
   4407  * Performs esc_url() for database usage.
   4408  *
   4409  * @since 2.8.0
   4410  *
   4411  * @see esc_url()
   4412  *
   4413  * @param string   $url       The URL to be cleaned.
   4414  * @param string[] $protocols Optional. An array of acceptable protocols.
   4415  *                            Defaults to return value of wp_allowed_protocols().
   4416  * @return string The cleaned URL after esc_url() is run with the 'db' context.
   4417  */
   4418 function esc_url_raw( $url, $protocols = null ) {
   4419 	return esc_url( $url, $protocols, 'db' );
   4420 }
   4421 
   4422 /**
   4423  * Convert entities, while preserving already-encoded entities.
   4424  *
   4425  * @link https://www.php.net/htmlentities Borrowed from the PHP Manual user notes.
   4426  *
   4427  * @since 1.2.2
   4428  *
   4429  * @param string $myHTML The text to be converted.
   4430  * @return string Converted text.
   4431  */
   4432 function htmlentities2( $myHTML ) {
   4433 	$translation_table              = get_html_translation_table( HTML_ENTITIES, ENT_QUOTES );
   4434 	$translation_table[ chr( 38 ) ] = '&';
   4435 	return preg_replace( '/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,3};)/', '&amp;', strtr( $myHTML, $translation_table ) );
   4436 }
   4437 
   4438 /**
   4439  * Escape single quotes, htmlspecialchar " < > &, and fix line endings.
   4440  *
   4441  * Escapes text strings for echoing in JS. It is intended to be used for inline JS
   4442  * (in a tag attribute, for example onclick="..."). Note that the strings have to
   4443  * be in single quotes. The {@see 'js_escape'} filter is also applied here.
   4444  *
   4445  * @since 2.8.0
   4446  *
   4447  * @param string $text The text to be escaped.
   4448  * @return string Escaped text.
   4449  */
   4450 function esc_js( $text ) {
   4451 	$safe_text = wp_check_invalid_utf8( $text );
   4452 	$safe_text = _wp_specialchars( $safe_text, ENT_COMPAT );
   4453 	$safe_text = preg_replace( '/&#(x)?0*(?(1)27|39);?/i', "'", stripslashes( $safe_text ) );
   4454 	$safe_text = str_replace( "\r", '', $safe_text );
   4455 	$safe_text = str_replace( "\n", '\\n', addslashes( $safe_text ) );
   4456 	/**
   4457 	 * Filters a string cleaned and escaped for output in JavaScript.
   4458 	 *
   4459 	 * Text passed to esc_js() is stripped of invalid or special characters,
   4460 	 * and properly slashed for output.
   4461 	 *
   4462 	 * @since 2.0.6
   4463 	 *
   4464 	 * @param string $safe_text The text after it has been escaped.
   4465 	 * @param string $text      The text prior to being escaped.
   4466 	 */
   4467 	return apply_filters( 'js_escape', $safe_text, $text );
   4468 }
   4469 
   4470 /**
   4471  * Escaping for HTML blocks.
   4472  *
   4473  * @since 2.8.0
   4474  *
   4475  * @param string $text
   4476  * @return string
   4477  */
   4478 function esc_html( $text ) {
   4479 	$safe_text = wp_check_invalid_utf8( $text );
   4480 	$safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
   4481 	/**
   4482 	 * Filters a string cleaned and escaped for output in HTML.
   4483 	 *
   4484 	 * Text passed to esc_html() is stripped of invalid or special characters
   4485 	 * before output.
   4486 	 *
   4487 	 * @since 2.8.0
   4488 	 *
   4489 	 * @param string $safe_text The text after it has been escaped.
   4490 	 * @param string $text      The text prior to being escaped.
   4491 	 */
   4492 	return apply_filters( 'esc_html', $safe_text, $text );
   4493 }
   4494 
   4495 /**
   4496  * Escaping for HTML attributes.
   4497  *
   4498  * @since 2.8.0
   4499  *
   4500  * @param string $text
   4501  * @return string
   4502  */
   4503 function esc_attr( $text ) {
   4504 	$safe_text = wp_check_invalid_utf8( $text );
   4505 	$safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
   4506 	/**
   4507 	 * Filters a string cleaned and escaped for output in an HTML attribute.
   4508 	 *
   4509 	 * Text passed to esc_attr() is stripped of invalid or special characters
   4510 	 * before output.
   4511 	 *
   4512 	 * @since 2.0.6
   4513 	 *
   4514 	 * @param string $safe_text The text after it has been escaped.
   4515 	 * @param string $text      The text prior to being escaped.
   4516 	 */
   4517 	return apply_filters( 'attribute_escape', $safe_text, $text );
   4518 }
   4519 
   4520 /**
   4521  * Escaping for textarea values.
   4522  *
   4523  * @since 3.1.0
   4524  *
   4525  * @param string $text
   4526  * @return string
   4527  */
   4528 function esc_textarea( $text ) {
   4529 	$safe_text = htmlspecialchars( $text, ENT_QUOTES, get_option( 'blog_charset' ) );
   4530 	/**
   4531 	 * Filters a string cleaned and escaped for output in a textarea element.
   4532 	 *
   4533 	 * @since 3.1.0
   4534 	 *
   4535 	 * @param string $safe_text The text after it has been escaped.
   4536 	 * @param string $text      The text prior to being escaped.
   4537 	 */
   4538 	return apply_filters( 'esc_textarea', $safe_text, $text );
   4539 }
   4540 
   4541 /**
   4542  * Escaping for XML blocks.
   4543  *
   4544  * @since 5.5.0
   4545  *
   4546  * @param string $text Text to escape.
   4547  * @return string Escaped text.
   4548  */
   4549 function esc_xml( $text ) {
   4550 	$safe_text = wp_check_invalid_utf8( $text );
   4551 
   4552 	$cdata_regex = '\<\!\[CDATA\[.*?\]\]\>';
   4553 	$regex       = <<<EOF
   4554 /
   4555 	(?=.*?{$cdata_regex})                 # lookahead that will match anything followed by a CDATA Section
   4556 	(?<non_cdata_followed_by_cdata>(.*?)) # the "anything" matched by the lookahead
   4557 	(?<cdata>({$cdata_regex}))            # the CDATA Section matched by the lookahead
   4558 
   4559 |	                                      # alternative
   4560 
   4561 	(?<non_cdata>(.*))                    # non-CDATA Section
   4562 /sx
   4563 EOF;
   4564 
   4565 	$safe_text = (string) preg_replace_callback(
   4566 		$regex,
   4567 		static function( $matches ) {
   4568 			if ( ! $matches[0] ) {
   4569 				return '';
   4570 			}
   4571 
   4572 			if ( ! empty( $matches['non_cdata'] ) ) {
   4573 				// escape HTML entities in the non-CDATA Section.
   4574 				return _wp_specialchars( $matches['non_cdata'], ENT_XML1 );
   4575 			}
   4576 
   4577 			// Return the CDATA Section unchanged, escape HTML entities in the rest.
   4578 			return _wp_specialchars( $matches['non_cdata_followed_by_cdata'], ENT_XML1 ) . $matches['cdata'];
   4579 		},
   4580 		$safe_text
   4581 	);
   4582 
   4583 	/**
   4584 	 * Filters a string cleaned and escaped for output in XML.
   4585 	 *
   4586 	 * Text passed to esc_xml() is stripped of invalid or special characters
   4587 	 * before output. HTML named character references are converted to their
   4588 	 * equivalent code points.
   4589 	 *
   4590 	 * @since 5.5.0
   4591 	 *
   4592 	 * @param string $safe_text The text after it has been escaped.
   4593 	 * @param string $text      The text prior to being escaped.
   4594 	 */
   4595 	return apply_filters( 'esc_xml', $safe_text, $text );
   4596 }
   4597 
   4598 /**
   4599  * Escape an HTML tag name.
   4600  *
   4601  * @since 2.5.0
   4602  *
   4603  * @param string $tag_name
   4604  * @return string
   4605  */
   4606 function tag_escape( $tag_name ) {
   4607 	$safe_tag = strtolower( preg_replace( '/[^a-zA-Z0-9_:]/', '', $tag_name ) );
   4608 	/**
   4609 	 * Filters a string cleaned and escaped for output as an HTML tag.
   4610 	 *
   4611 	 * @since 2.8.0
   4612 	 *
   4613 	 * @param string $safe_tag The tag name after it has been escaped.
   4614 	 * @param string $tag_name The text before it was escaped.
   4615 	 */
   4616 	return apply_filters( 'tag_escape', $safe_tag, $tag_name );
   4617 }
   4618 
   4619 /**
   4620  * Convert full URL paths to absolute paths.
   4621  *
   4622  * Removes the http or https protocols and the domain. Keeps the path '/' at the
   4623  * beginning, so it isn't a true relative link, but from the web root base.
   4624  *
   4625  * @since 2.1.0
   4626  * @since 4.1.0 Support was added for relative URLs.
   4627  *
   4628  * @param string $link Full URL path.
   4629  * @return string Absolute path.
   4630  */
   4631 function wp_make_link_relative( $link ) {
   4632 	return preg_replace( '|^(https?:)?//[^/]+(/?.*)|i', '$2', $link );
   4633 }
   4634 
   4635 /**
   4636  * Sanitises various option values based on the nature of the option.
   4637  *
   4638  * This is basically a switch statement which will pass $value through a number
   4639  * of functions depending on the $option.
   4640  *
   4641  * @since 2.0.5
   4642  *
   4643  * @global wpdb $wpdb WordPress database abstraction object.
   4644  *
   4645  * @param string $option The name of the option.
   4646  * @param string $value  The unsanitised value.
   4647  * @return string Sanitized value.
   4648  */
   4649 function sanitize_option( $option, $value ) {
   4650 	global $wpdb;
   4651 
   4652 	$original_value = $value;
   4653 	$error          = '';
   4654 
   4655 	switch ( $option ) {
   4656 		case 'admin_email':
   4657 		case 'new_admin_email':
   4658 			$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
   4659 			if ( is_wp_error( $value ) ) {
   4660 				$error = $value->get_error_message();
   4661 			} else {
   4662 				$value = sanitize_email( $value );
   4663 				if ( ! is_email( $value ) ) {
   4664 					$error = __( 'The email address entered did not appear to be a valid email address. Please enter a valid email address.' );
   4665 				}
   4666 			}
   4667 			break;
   4668 
   4669 		case 'thumbnail_size_w':
   4670 		case 'thumbnail_size_h':
   4671 		case 'medium_size_w':
   4672 		case 'medium_size_h':
   4673 		case 'medium_large_size_w':
   4674 		case 'medium_large_size_h':
   4675 		case 'large_size_w':
   4676 		case 'large_size_h':
   4677 		case 'mailserver_port':
   4678 		case 'comment_max_links':
   4679 		case 'page_on_front':
   4680 		case 'page_for_posts':
   4681 		case 'rss_excerpt_length':
   4682 		case 'default_category':
   4683 		case 'default_email_category':
   4684 		case 'default_link_category':
   4685 		case 'close_comments_days_old':
   4686 		case 'comments_per_page':
   4687 		case 'thread_comments_depth':
   4688 		case 'users_can_register':
   4689 		case 'start_of_week':
   4690 		case 'site_icon':
   4691 			$value = absint( $value );
   4692 			break;
   4693 
   4694 		case 'posts_per_page':
   4695 		case 'posts_per_rss':
   4696 			$value = (int) $value;
   4697 			if ( empty( $value ) ) {
   4698 				$value = 1;
   4699 			}
   4700 			if ( $value < -1 ) {
   4701 				$value = abs( $value );
   4702 			}
   4703 			break;
   4704 
   4705 		case 'default_ping_status':
   4706 		case 'default_comment_status':
   4707 			// Options that if not there have 0 value but need to be something like "closed".
   4708 			if ( '0' == $value || '' === $value ) {
   4709 				$value = 'closed';
   4710 			}
   4711 			break;
   4712 
   4713 		case 'blogdescription':
   4714 		case 'blogname':
   4715 			$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
   4716 			if ( $value !== $original_value ) {
   4717 				$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', wp_encode_emoji( $original_value ) );
   4718 			}
   4719 
   4720 			if ( is_wp_error( $value ) ) {
   4721 				$error = $value->get_error_message();
   4722 			} else {
   4723 				$value = esc_html( $value );
   4724 			}
   4725 			break;
   4726 
   4727 		case 'blog_charset':
   4728 			$value = preg_replace( '/[^a-zA-Z0-9_-]/', '', $value ); // Strips slashes.
   4729 			break;
   4730 
   4731 		case 'blog_public':
   4732 			// This is the value if the settings checkbox is not checked on POST. Don't rely on this.
   4733 			if ( null === $value ) {
   4734 				$value = 1;
   4735 			} else {
   4736 				$value = (int) $value;
   4737 			}
   4738 			break;
   4739 
   4740 		case 'date_format':
   4741 		case 'time_format':
   4742 		case 'mailserver_url':
   4743 		case 'mailserver_login':
   4744 		case 'mailserver_pass':
   4745 		case 'upload_path':
   4746 			$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
   4747 			if ( is_wp_error( $value ) ) {
   4748 				$error = $value->get_error_message();
   4749 			} else {
   4750 				$value = strip_tags( $value );
   4751 				$value = wp_kses_data( $value );
   4752 			}
   4753 			break;
   4754 
   4755 		case 'ping_sites':
   4756 			$value = explode( "\n", $value );
   4757 			$value = array_filter( array_map( 'trim', $value ) );
   4758 			$value = array_filter( array_map( 'esc_url_raw', $value ) );
   4759 			$value = implode( "\n", $value );
   4760 			break;
   4761 
   4762 		case 'gmt_offset':
   4763 			$value = preg_replace( '/[^0-9:.-]/', '', $value ); // Strips slashes.
   4764 			break;
   4765 
   4766 		case 'siteurl':
   4767 			$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
   4768 			if ( is_wp_error( $value ) ) {
   4769 				$error = $value->get_error_message();
   4770 			} else {
   4771 				if ( preg_match( '#http(s?)://(.+)#i', $value ) ) {
   4772 					$value = esc_url_raw( $value );
   4773 				} else {
   4774 					$error = __( 'The WordPress address you entered did not appear to be a valid URL. Please enter a valid URL.' );
   4775 				}
   4776 			}
   4777 			break;
   4778 
   4779 		case 'home':
   4780 			$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
   4781 			if ( is_wp_error( $value ) ) {
   4782 				$error = $value->get_error_message();
   4783 			} else {
   4784 				if ( preg_match( '#http(s?)://(.+)#i', $value ) ) {
   4785 					$value = esc_url_raw( $value );
   4786 				} else {
   4787 					$error = __( 'The Site address you entered did not appear to be a valid URL. Please enter a valid URL.' );
   4788 				}
   4789 			}
   4790 			break;
   4791 
   4792 		case 'WPLANG':
   4793 			$allowed = get_available_languages();
   4794 			if ( ! is_multisite() && defined( 'WPLANG' ) && '' !== WPLANG && 'en_US' !== WPLANG ) {
   4795 				$allowed[] = WPLANG;
   4796 			}
   4797 			if ( ! in_array( $value, $allowed, true ) && ! empty( $value ) ) {
   4798 				$value = get_option( $option );
   4799 			}
   4800 			break;
   4801 
   4802 		case 'illegal_names':
   4803 			$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
   4804 			if ( is_wp_error( $value ) ) {
   4805 				$error = $value->get_error_message();
   4806 			} else {
   4807 				if ( ! is_array( $value ) ) {
   4808 					$value = explode( ' ', $value );
   4809 				}
   4810 
   4811 				$value = array_values( array_filter( array_map( 'trim', $value ) ) );
   4812 
   4813 				if ( ! $value ) {
   4814 					$value = '';
   4815 				}
   4816 			}
   4817 			break;
   4818 
   4819 		case 'limited_email_domains':
   4820 		case 'banned_email_domains':
   4821 			$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
   4822 			if ( is_wp_error( $value ) ) {
   4823 				$error = $value->get_error_message();
   4824 			} else {
   4825 				if ( ! is_array( $value ) ) {
   4826 					$value = explode( "\n", $value );
   4827 				}
   4828 
   4829 				$domains = array_values( array_filter( array_map( 'trim', $value ) ) );
   4830 				$value   = array();
   4831 
   4832 				foreach ( $domains as $domain ) {
   4833 					if ( ! preg_match( '/(--|\.\.)/', $domain ) && preg_match( '|^([a-zA-Z0-9-\.])+$|', $domain ) ) {
   4834 						$value[] = $domain;
   4835 					}
   4836 				}
   4837 				if ( ! $value ) {
   4838 					$value = '';
   4839 				}
   4840 			}
   4841 			break;
   4842 
   4843 		case 'timezone_string':
   4844 			$allowed_zones = timezone_identifiers_list();
   4845 			if ( ! in_array( $value, $allowed_zones, true ) && ! empty( $value ) ) {
   4846 				$error = __( 'The timezone you have entered is not valid. Please select a valid timezone.' );
   4847 			}
   4848 			break;
   4849 
   4850 		case 'permalink_structure':
   4851 		case 'category_base':
   4852 		case 'tag_base':
   4853 			$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
   4854 			if ( is_wp_error( $value ) ) {
   4855 				$error = $value->get_error_message();
   4856 			} else {
   4857 				$value = esc_url_raw( $value );
   4858 				$value = str_replace( 'http://', '', $value );
   4859 			}
   4860 
   4861 			if ( 'permalink_structure' === $option && '' !== $value && ! preg_match( '/%[^\/%]+%/', $value ) ) {
   4862 				$error = sprintf(
   4863 					/* translators: %s: Documentation URL. */
   4864 					__( 'A structure tag is required when using custom permalinks. <a href="%s">Learn more</a>' ),
   4865 					__( 'https://wordpress.org/support/article/using-permalinks/#choosing-your-permalink-structure' )
   4866 				);
   4867 			}
   4868 			break;
   4869 
   4870 		case 'default_role':
   4871 			if ( ! get_role( $value ) && get_role( 'subscriber' ) ) {
   4872 				$value = 'subscriber';
   4873 			}
   4874 			break;
   4875 
   4876 		case 'moderation_keys':
   4877 		case 'disallowed_keys':
   4878 			$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
   4879 			if ( is_wp_error( $value ) ) {
   4880 				$error = $value->get_error_message();
   4881 			} else {
   4882 				$value = explode( "\n", $value );
   4883 				$value = array_filter( array_map( 'trim', $value ) );
   4884 				$value = array_unique( $value );
   4885 				$value = implode( "\n", $value );
   4886 			}
   4887 			break;
   4888 	}
   4889 
   4890 	if ( ! empty( $error ) ) {
   4891 		$value = get_option( $option );
   4892 		if ( function_exists( 'add_settings_error' ) ) {
   4893 			add_settings_error( $option, "invalid_{$option}", $error );
   4894 		}
   4895 	}
   4896 
   4897 	/**
   4898 	 * Filters an option value following sanitization.
   4899 	 *
   4900 	 * @since 2.3.0
   4901 	 * @since 4.3.0 Added the `$original_value` parameter.
   4902 	 *
   4903 	 * @param string $value          The sanitized option value.
   4904 	 * @param string $option         The option name.
   4905 	 * @param string $original_value The original value passed to the function.
   4906 	 */
   4907 	return apply_filters( "sanitize_option_{$option}", $value, $option, $original_value );
   4908 }
   4909 
   4910 /**
   4911  * Maps a function to all non-iterable elements of an array or an object.
   4912  *
   4913  * This is similar to `array_walk_recursive()` but acts upon objects too.
   4914  *
   4915  * @since 4.4.0
   4916  *
   4917  * @param mixed    $value    The array, object, or scalar.
   4918  * @param callable $callback The function to map onto $value.
   4919  * @return mixed The value with the callback applied to all non-arrays and non-objects inside it.
   4920  */
   4921 function map_deep( $value, $callback ) {
   4922 	if ( is_array( $value ) ) {
   4923 		foreach ( $value as $index => $item ) {
   4924 			$value[ $index ] = map_deep( $item, $callback );
   4925 		}
   4926 	} elseif ( is_object( $value ) ) {
   4927 		$object_vars = get_object_vars( $value );
   4928 		foreach ( $object_vars as $property_name => $property_value ) {
   4929 			$value->$property_name = map_deep( $property_value, $callback );
   4930 		}
   4931 	} else {
   4932 		$value = call_user_func( $callback, $value );
   4933 	}
   4934 
   4935 	return $value;
   4936 }
   4937 
   4938 /**
   4939  * Parses a string into variables to be stored in an array.
   4940  *
   4941  * @since 2.2.1
   4942  *
   4943  * @param string $string The string to be parsed.
   4944  * @param array  $array  Variables will be stored in this array.
   4945  */
   4946 function wp_parse_str( $string, &$array ) {
   4947 	parse_str( $string, $array );
   4948 
   4949 	/**
   4950 	 * Filters the array of variables derived from a parsed string.
   4951 	 *
   4952 	 * @since 2.3.0
   4953 	 *
   4954 	 * @param array $array The array populated with variables.
   4955 	 */
   4956 	$array = apply_filters( 'wp_parse_str', $array );
   4957 }
   4958 
   4959 /**
   4960  * Convert lone less than signs.
   4961  *
   4962  * KSES already converts lone greater than signs.
   4963  *
   4964  * @since 2.3.0
   4965  *
   4966  * @param string $text Text to be converted.
   4967  * @return string Converted text.
   4968  */
   4969 function wp_pre_kses_less_than( $text ) {
   4970 	return preg_replace_callback( '%<[^>]*?((?=<)|>|$)%', 'wp_pre_kses_less_than_callback', $text );
   4971 }
   4972 
   4973 /**
   4974  * Callback function used by preg_replace.
   4975  *
   4976  * @since 2.3.0
   4977  *
   4978  * @param array $matches Populated by matches to preg_replace.
   4979  * @return string The text returned after esc_html if needed.
   4980  */
   4981 function wp_pre_kses_less_than_callback( $matches ) {
   4982 	if ( false === strpos( $matches[0], '>' ) ) {
   4983 		return esc_html( $matches[0] );
   4984 	}
   4985 	return $matches[0];
   4986 }
   4987 
   4988 /**
   4989  * Remove non-allowable HTML from parsed block attribute values when filtering
   4990  * in the post context.
   4991  *
   4992  * @since 5.3.1
   4993  *
   4994  * @param string         $string            Content to be run through KSES.
   4995  * @param array[]|string $allowed_html      An array of allowed HTML elements
   4996  *                                          and attributes, or a context name
   4997  *                                          such as 'post'.
   4998  * @param string[]       $allowed_protocols Array of allowed URL protocols.
   4999  * @return string Filtered text to run through KSES.
   5000  */
   5001 function wp_pre_kses_block_attributes( $string, $allowed_html, $allowed_protocols ) {
   5002 	/*
   5003 	 * `filter_block_content` is expected to call `wp_kses`. Temporarily remove
   5004 	 * the filter to avoid recursion.
   5005 	 */
   5006 	remove_filter( 'pre_kses', 'wp_pre_kses_block_attributes', 10 );
   5007 	$string = filter_block_content( $string, $allowed_html, $allowed_protocols );
   5008 	add_filter( 'pre_kses', 'wp_pre_kses_block_attributes', 10, 3 );
   5009 
   5010 	return $string;
   5011 }
   5012 
   5013 /**
   5014  * WordPress implementation of PHP sprintf() with filters.
   5015  *
   5016  * @since 2.5.0
   5017  * @since 5.3.0 Formalized the existing and already documented `...$args` parameter
   5018  *              by adding it to the function signature.
   5019  *
   5020  * @link https://www.php.net/sprintf
   5021  *
   5022  * @param string $pattern The string which formatted args are inserted.
   5023  * @param mixed  ...$args Arguments to be formatted into the $pattern string.
   5024  * @return string The formatted string.
   5025  */
   5026 function wp_sprintf( $pattern, ...$args ) {
   5027 	$len       = strlen( $pattern );
   5028 	$start     = 0;
   5029 	$result    = '';
   5030 	$arg_index = 0;
   5031 	while ( $len > $start ) {
   5032 		// Last character: append and break.
   5033 		if ( strlen( $pattern ) - 1 == $start ) {
   5034 			$result .= substr( $pattern, -1 );
   5035 			break;
   5036 		}
   5037 
   5038 		// Literal %: append and continue.
   5039 		if ( '%%' === substr( $pattern, $start, 2 ) ) {
   5040 			$start  += 2;
   5041 			$result .= '%';
   5042 			continue;
   5043 		}
   5044 
   5045 		// Get fragment before next %.
   5046 		$end = strpos( $pattern, '%', $start + 1 );
   5047 		if ( false === $end ) {
   5048 			$end = $len;
   5049 		}
   5050 		$fragment = substr( $pattern, $start, $end - $start );
   5051 
   5052 		// Fragment has a specifier.
   5053 		if ( '%' === $pattern[ $start ] ) {
   5054 			// Find numbered arguments or take the next one in order.
   5055 			if ( preg_match( '/^%(\d+)\$/', $fragment, $matches ) ) {
   5056 				$index    = $matches[1] - 1; // 0-based array vs 1-based sprintf() arguments.
   5057 				$arg      = isset( $args[ $index ] ) ? $args[ $index ] : '';
   5058 				$fragment = str_replace( "%{$matches[1]}$", '%', $fragment );
   5059 			} else {
   5060 				$arg = isset( $args[ $arg_index ] ) ? $args[ $arg_index ] : '';
   5061 				++$arg_index;
   5062 			}
   5063 
   5064 			/**
   5065 			 * Filters a fragment from the pattern passed to wp_sprintf().
   5066 			 *
   5067 			 * If the fragment is unchanged, then sprintf() will be run on the fragment.
   5068 			 *
   5069 			 * @since 2.5.0
   5070 			 *
   5071 			 * @param string $fragment A fragment from the pattern.
   5072 			 * @param string $arg      The argument.
   5073 			 */
   5074 			$_fragment = apply_filters( 'wp_sprintf', $fragment, $arg );
   5075 			if ( $_fragment != $fragment ) {
   5076 				$fragment = $_fragment;
   5077 			} else {
   5078 				$fragment = sprintf( $fragment, (string) $arg );
   5079 			}
   5080 		}
   5081 
   5082 		// Append to result and move to next fragment.
   5083 		$result .= $fragment;
   5084 		$start   = $end;
   5085 	}
   5086 
   5087 	return $result;
   5088 }
   5089 
   5090 /**
   5091  * Localize list items before the rest of the content.
   5092  *
   5093  * The '%l' must be at the first characters can then contain the rest of the
   5094  * content. The list items will have ', ', ', and', and ' and ' added depending
   5095  * on the amount of list items in the $args parameter.
   5096  *
   5097  * @since 2.5.0
   5098  *
   5099  * @param string $pattern Content containing '%l' at the beginning.
   5100  * @param array  $args    List items to prepend to the content and replace '%l'.
   5101  * @return string Localized list items and rest of the content.
   5102  */
   5103 function wp_sprintf_l( $pattern, $args ) {
   5104 	// Not a match.
   5105 	if ( '%l' !== substr( $pattern, 0, 2 ) ) {
   5106 		return $pattern;
   5107 	}
   5108 
   5109 	// Nothing to work with.
   5110 	if ( empty( $args ) ) {
   5111 		return '';
   5112 	}
   5113 
   5114 	/**
   5115 	 * Filters the translated delimiters used by wp_sprintf_l().
   5116 	 * Placeholders (%s) are included to assist translators and then
   5117 	 * removed before the array of strings reaches the filter.
   5118 	 *
   5119 	 * Please note: Ampersands and entities should be avoided here.
   5120 	 *
   5121 	 * @since 2.5.0
   5122 	 *
   5123 	 * @param array $delimiters An array of translated delimiters.
   5124 	 */
   5125 	$l = apply_filters(
   5126 		'wp_sprintf_l',
   5127 		array(
   5128 			/* translators: Used to join items in a list with more than 2 items. */
   5129 			'between'          => sprintf( __( '%1$s, %2$s' ), '', '' ),
   5130 			/* translators: Used to join last two items in a list with more than 2 times. */
   5131 			'between_last_two' => sprintf( __( '%1$s, and %2$s' ), '', '' ),
   5132 			/* translators: Used to join items in a list with only 2 items. */
   5133 			'between_only_two' => sprintf( __( '%1$s and %2$s' ), '', '' ),
   5134 		)
   5135 	);
   5136 
   5137 	$args   = (array) $args;
   5138 	$result = array_shift( $args );
   5139 	if ( count( $args ) == 1 ) {
   5140 		$result .= $l['between_only_two'] . array_shift( $args );
   5141 	}
   5142 
   5143 	// Loop when more than two args.
   5144 	$i = count( $args );
   5145 	while ( $i ) {
   5146 		$arg = array_shift( $args );
   5147 		$i--;
   5148 		if ( 0 == $i ) {
   5149 			$result .= $l['between_last_two'] . $arg;
   5150 		} else {
   5151 			$result .= $l['between'] . $arg;
   5152 		}
   5153 	}
   5154 
   5155 	return $result . substr( $pattern, 2 );
   5156 }
   5157 
   5158 /**
   5159  * Safely extracts not more than the first $count characters from HTML string.
   5160  *
   5161  * UTF-8, tags and entities safe prefix extraction. Entities inside will *NOT*
   5162  * be counted as one character. For example &amp; will be counted as 4, &lt; as
   5163  * 3, etc.
   5164  *
   5165  * @since 2.5.0
   5166  *
   5167  * @param string $str   String to get the excerpt from.
   5168  * @param int    $count Maximum number of characters to take.
   5169  * @param string $more  Optional. What to append if $str needs to be trimmed. Defaults to empty string.
   5170  * @return string The excerpt.
   5171  */
   5172 function wp_html_excerpt( $str, $count, $more = null ) {
   5173 	if ( null === $more ) {
   5174 		$more = '';
   5175 	}
   5176 
   5177 	$str     = wp_strip_all_tags( $str, true );
   5178 	$excerpt = mb_substr( $str, 0, $count );
   5179 
   5180 	// Remove part of an entity at the end.
   5181 	$excerpt = preg_replace( '/&[^;\s]{0,6}$/', '', $excerpt );
   5182 	if ( $str != $excerpt ) {
   5183 		$excerpt = trim( $excerpt ) . $more;
   5184 	}
   5185 
   5186 	return $excerpt;
   5187 }
   5188 
   5189 /**
   5190  * Add a Base url to relative links in passed content.
   5191  *
   5192  * By default it supports the 'src' and 'href' attributes. However this can be
   5193  * changed via the 3rd param.
   5194  *
   5195  * @since 2.7.0
   5196  *
   5197  * @global string $_links_add_base
   5198  *
   5199  * @param string $content String to search for links in.
   5200  * @param string $base    The base URL to prefix to links.
   5201  * @param array  $attrs   The attributes which should be processed.
   5202  * @return string The processed content.
   5203  */
   5204 function links_add_base_url( $content, $base, $attrs = array( 'src', 'href' ) ) {
   5205 	global $_links_add_base;
   5206 	$_links_add_base = $base;
   5207 	$attrs           = implode( '|', (array) $attrs );
   5208 	return preg_replace_callback( "!($attrs)=(['\"])(.+?)\\2!i", '_links_add_base', $content );
   5209 }
   5210 
   5211 /**
   5212  * Callback to add a base url to relative links in passed content.
   5213  *
   5214  * @since 2.7.0
   5215  * @access private
   5216  *
   5217  * @global string $_links_add_base
   5218  *
   5219  * @param string $m The matched link.
   5220  * @return string The processed link.
   5221  */
   5222 function _links_add_base( $m ) {
   5223 	global $_links_add_base;
   5224 	// 1 = attribute name  2 = quotation mark  3 = URL.
   5225 	return $m[1] . '=' . $m[2] .
   5226 		( preg_match( '#^(\w{1,20}):#', $m[3], $protocol ) && in_array( $protocol[1], wp_allowed_protocols(), true ) ?
   5227 			$m[3] :
   5228 			WP_Http::make_absolute_url( $m[3], $_links_add_base )
   5229 		)
   5230 		. $m[2];
   5231 }
   5232 
   5233 /**
   5234  * Adds a Target attribute to all links in passed content.
   5235  *
   5236  * This function by default only applies to `<a>` tags, however this can be
   5237  * modified by the 3rd param.
   5238  *
   5239  * *NOTE:* Any current target attributed will be stripped and replaced.
   5240  *
   5241  * @since 2.7.0
   5242  *
   5243  * @global string $_links_add_target
   5244  *
   5245  * @param string   $content String to search for links in.
   5246  * @param string   $target  The Target to add to the links.
   5247  * @param string[] $tags    An array of tags to apply to.
   5248  * @return string The processed content.
   5249  */
   5250 function links_add_target( $content, $target = '_blank', $tags = array( 'a' ) ) {
   5251 	global $_links_add_target;
   5252 	$_links_add_target = $target;
   5253 	$tags              = implode( '|', (array) $tags );
   5254 	return preg_replace_callback( "!<($tags)((\s[^>]*)?)>!i", '_links_add_target', $content );
   5255 }
   5256 
   5257 /**
   5258  * Callback to add a target attribute to all links in passed content.
   5259  *
   5260  * @since 2.7.0
   5261  * @access private
   5262  *
   5263  * @global string $_links_add_target
   5264  *
   5265  * @param string $m The matched link.
   5266  * @return string The processed link.
   5267  */
   5268 function _links_add_target( $m ) {
   5269 	global $_links_add_target;
   5270 	$tag  = $m[1];
   5271 	$link = preg_replace( '|( target=([\'"])(.*?)\2)|i', '', $m[2] );
   5272 	return '<' . $tag . $link . ' target="' . esc_attr( $_links_add_target ) . '">';
   5273 }
   5274 
   5275 /**
   5276  * Normalize EOL characters and strip duplicate whitespace.
   5277  *
   5278  * @since 2.7.0
   5279  *
   5280  * @param string $str The string to normalize.
   5281  * @return string The normalized string.
   5282  */
   5283 function normalize_whitespace( $str ) {
   5284 	$str = trim( $str );
   5285 	$str = str_replace( "\r", "\n", $str );
   5286 	$str = preg_replace( array( '/\n+/', '/[ \t]+/' ), array( "\n", ' ' ), $str );
   5287 	return $str;
   5288 }
   5289 
   5290 /**
   5291  * Properly strip all HTML tags including script and style
   5292  *
   5293  * This differs from strip_tags() because it removes the contents of
   5294  * the `<script>` and `<style>` tags. E.g. `strip_tags( '<script>something</script>' )`
   5295  * will return 'something'. wp_strip_all_tags will return ''
   5296  *
   5297  * @since 2.9.0
   5298  *
   5299  * @param string $string        String containing HTML tags
   5300  * @param bool   $remove_breaks Optional. Whether to remove left over line breaks and white space chars
   5301  * @return string The processed string.
   5302  */
   5303 function wp_strip_all_tags( $string, $remove_breaks = false ) {
   5304 	$string = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $string );
   5305 	$string = strip_tags( $string );
   5306 
   5307 	if ( $remove_breaks ) {
   5308 		$string = preg_replace( '/[\r\n\t ]+/', ' ', $string );
   5309 	}
   5310 
   5311 	return trim( $string );
   5312 }
   5313 
   5314 /**
   5315  * Sanitizes a string from user input or from the database.
   5316  *
   5317  * - Checks for invalid UTF-8,
   5318  * - Converts single `<` characters to entities
   5319  * - Strips all tags
   5320  * - Removes line breaks, tabs, and extra whitespace
   5321  * - Strips octets
   5322  *
   5323  * @since 2.9.0
   5324  *
   5325  * @see sanitize_textarea_field()
   5326  * @see wp_check_invalid_utf8()
   5327  * @see wp_strip_all_tags()
   5328  *
   5329  * @param string $str String to sanitize.
   5330  * @return string Sanitized string.
   5331  */
   5332 function sanitize_text_field( $str ) {
   5333 	$filtered = _sanitize_text_fields( $str, false );
   5334 
   5335 	/**
   5336 	 * Filters a sanitized text field string.
   5337 	 *
   5338 	 * @since 2.9.0
   5339 	 *
   5340 	 * @param string $filtered The sanitized string.
   5341 	 * @param string $str      The string prior to being sanitized.
   5342 	 */
   5343 	return apply_filters( 'sanitize_text_field', $filtered, $str );
   5344 }
   5345 
   5346 /**
   5347  * Sanitizes a multiline string from user input or from the database.
   5348  *
   5349  * The function is like sanitize_text_field(), but preserves
   5350  * new lines (\n) and other whitespace, which are legitimate
   5351  * input in textarea elements.
   5352  *
   5353  * @see sanitize_text_field()
   5354  *
   5355  * @since 4.7.0
   5356  *
   5357  * @param string $str String to sanitize.
   5358  * @return string Sanitized string.
   5359  */
   5360 function sanitize_textarea_field( $str ) {
   5361 	$filtered = _sanitize_text_fields( $str, true );
   5362 
   5363 	/**
   5364 	 * Filters a sanitized textarea field string.
   5365 	 *
   5366 	 * @since 4.7.0
   5367 	 *
   5368 	 * @param string $filtered The sanitized string.
   5369 	 * @param string $str      The string prior to being sanitized.
   5370 	 */
   5371 	return apply_filters( 'sanitize_textarea_field', $filtered, $str );
   5372 }
   5373 
   5374 /**
   5375  * Internal helper function to sanitize a string from user input or from the db
   5376  *
   5377  * @since 4.7.0
   5378  * @access private
   5379  *
   5380  * @param string $str           String to sanitize.
   5381  * @param bool   $keep_newlines Optional. Whether to keep newlines. Default: false.
   5382  * @return string Sanitized string.
   5383  */
   5384 function _sanitize_text_fields( $str, $keep_newlines = false ) {
   5385 	if ( is_object( $str ) || is_array( $str ) ) {
   5386 		return '';
   5387 	}
   5388 
   5389 	$str = (string) $str;
   5390 
   5391 	$filtered = wp_check_invalid_utf8( $str );
   5392 
   5393 	if ( strpos( $filtered, '<' ) !== false ) {
   5394 		$filtered = wp_pre_kses_less_than( $filtered );
   5395 		// This will strip extra whitespace for us.
   5396 		$filtered = wp_strip_all_tags( $filtered, false );
   5397 
   5398 		// Use HTML entities in a special case to make sure no later
   5399 		// newline stripping stage could lead to a functional tag.
   5400 		$filtered = str_replace( "<\n", "&lt;\n", $filtered );
   5401 	}
   5402 
   5403 	if ( ! $keep_newlines ) {
   5404 		$filtered = preg_replace( '/[\r\n\t ]+/', ' ', $filtered );
   5405 	}
   5406 	$filtered = trim( $filtered );
   5407 
   5408 	$found = false;
   5409 	while ( preg_match( '/%[a-f0-9]{2}/i', $filtered, $match ) ) {
   5410 		$filtered = str_replace( $match[0], '', $filtered );
   5411 		$found    = true;
   5412 	}
   5413 
   5414 	if ( $found ) {
   5415 		// Strip out the whitespace that may now exist after removing the octets.
   5416 		$filtered = trim( preg_replace( '/ +/', ' ', $filtered ) );
   5417 	}
   5418 
   5419 	return $filtered;
   5420 }
   5421 
   5422 /**
   5423  * i18n friendly version of basename()
   5424  *
   5425  * @since 3.1.0
   5426  *
   5427  * @param string $path   A path.
   5428  * @param string $suffix If the filename ends in suffix this will also be cut off.
   5429  * @return string
   5430  */
   5431 function wp_basename( $path, $suffix = '' ) {
   5432 	return urldecode( basename( str_replace( array( '%2F', '%5C' ), '/', urlencode( $path ) ), $suffix ) );
   5433 }
   5434 
   5435 // phpcs:disable WordPress.WP.CapitalPDangit.Misspelled, WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid -- 8-)
   5436 /**
   5437  * Forever eliminate "Wordpress" from the planet (or at least the little bit we can influence).
   5438  *
   5439  * Violating our coding standards for a good function name.
   5440  *
   5441  * @since 3.0.0
   5442  *
   5443  * @param string $text The text to be modified.
   5444  * @return string The modified text.
   5445  */
   5446 function capital_P_dangit( $text ) {
   5447 	// Simple replacement for titles.
   5448 	$current_filter = current_filter();
   5449 	if ( 'the_title' === $current_filter || 'wp_title' === $current_filter ) {
   5450 		return str_replace( 'Wordpress', 'WordPress', $text );
   5451 	}
   5452 	// Still here? Use the more judicious replacement.
   5453 	static $dblq = false;
   5454 	if ( false === $dblq ) {
   5455 		$dblq = _x( '&#8220;', 'opening curly double quote' );
   5456 	}
   5457 	return str_replace(
   5458 		array( ' Wordpress', '&#8216;Wordpress', $dblq . 'Wordpress', '>Wordpress', '(Wordpress' ),
   5459 		array( ' WordPress', '&#8216;WordPress', $dblq . 'WordPress', '>WordPress', '(WordPress' ),
   5460 		$text
   5461 	);
   5462 }
   5463 // phpcs:enable
   5464 
   5465 /**
   5466  * Sanitize a mime type
   5467  *
   5468  * @since 3.1.3
   5469  *
   5470  * @param string $mime_type Mime type
   5471  * @return string Sanitized mime type
   5472  */
   5473 function sanitize_mime_type( $mime_type ) {
   5474 	$sani_mime_type = preg_replace( '/[^-+*.a-zA-Z0-9\/]/', '', $mime_type );
   5475 	/**
   5476 	 * Filters a mime type following sanitization.
   5477 	 *
   5478 	 * @since 3.1.3
   5479 	 *
   5480 	 * @param string $sani_mime_type The sanitized mime type.
   5481 	 * @param string $mime_type      The mime type prior to sanitization.
   5482 	 */
   5483 	return apply_filters( 'sanitize_mime_type', $sani_mime_type, $mime_type );
   5484 }
   5485 
   5486 /**
   5487  * Sanitize space or carriage return separated URLs that are used to send trackbacks.
   5488  *
   5489  * @since 3.4.0
   5490  *
   5491  * @param string $to_ping Space or carriage return separated URLs
   5492  * @return string URLs starting with the http or https protocol, separated by a carriage return.
   5493  */
   5494 function sanitize_trackback_urls( $to_ping ) {
   5495 	$urls_to_ping = preg_split( '/[\r\n\t ]/', trim( $to_ping ), -1, PREG_SPLIT_NO_EMPTY );
   5496 	foreach ( $urls_to_ping as $k => $url ) {
   5497 		if ( ! preg_match( '#^https?://.#i', $url ) ) {
   5498 			unset( $urls_to_ping[ $k ] );
   5499 		}
   5500 	}
   5501 	$urls_to_ping = array_map( 'esc_url_raw', $urls_to_ping );
   5502 	$urls_to_ping = implode( "\n", $urls_to_ping );
   5503 	/**
   5504 	 * Filters a list of trackback URLs following sanitization.
   5505 	 *
   5506 	 * The string returned here consists of a space or carriage return-delimited list
   5507 	 * of trackback URLs.
   5508 	 *
   5509 	 * @since 3.4.0
   5510 	 *
   5511 	 * @param string $urls_to_ping Sanitized space or carriage return separated URLs.
   5512 	 * @param string $to_ping      Space or carriage return separated URLs before sanitization.
   5513 	 */
   5514 	return apply_filters( 'sanitize_trackback_urls', $urls_to_ping, $to_ping );
   5515 }
   5516 
   5517 /**
   5518  * Adds slashes to a string or recursively adds slashes to strings within an array.
   5519  *
   5520  * This should be used when preparing data for core API that expects slashed data.
   5521  * This should not be used to escape data going directly into an SQL query.
   5522  *
   5523  * @since 3.6.0
   5524  * @since 5.5.0 Non-string values are left untouched.
   5525  *
   5526  * @param string|array $value String or array of data to slash.
   5527  * @return string|array Slashed $value.
   5528  */
   5529 function wp_slash( $value ) {
   5530 	if ( is_array( $value ) ) {
   5531 		$value = array_map( 'wp_slash', $value );
   5532 	}
   5533 
   5534 	if ( is_string( $value ) ) {
   5535 		return addslashes( $value );
   5536 	}
   5537 
   5538 	return $value;
   5539 }
   5540 
   5541 /**
   5542  * Removes slashes from a string or recursively removes slashes from strings within an array.
   5543  *
   5544  * This should be used to remove slashes from data passed to core API that
   5545  * expects data to be unslashed.
   5546  *
   5547  * @since 3.6.0
   5548  *
   5549  * @param string|array $value String or array of data to unslash.
   5550  * @return string|array Unslashed $value.
   5551  */
   5552 function wp_unslash( $value ) {
   5553 	return stripslashes_deep( $value );
   5554 }
   5555 
   5556 /**
   5557  * Extract and return the first URL from passed content.
   5558  *
   5559  * @since 3.6.0
   5560  *
   5561  * @param string $content A string which might contain a URL.
   5562  * @return string|false The found URL.
   5563  */
   5564 function get_url_in_content( $content ) {
   5565 	if ( empty( $content ) ) {
   5566 		return false;
   5567 	}
   5568 
   5569 	if ( preg_match( '/<a\s[^>]*?href=([\'"])(.+?)\1/is', $content, $matches ) ) {
   5570 		return esc_url_raw( $matches[2] );
   5571 	}
   5572 
   5573 	return false;
   5574 }
   5575 
   5576 /**
   5577  * Returns the regexp for common whitespace characters.
   5578  *
   5579  * By default, spaces include new lines, tabs, nbsp entities, and the UTF-8 nbsp.
   5580  * This is designed to replace the PCRE \s sequence. In ticket #22692, that
   5581  * sequence was found to be unreliable due to random inclusion of the A0 byte.
   5582  *
   5583  * @since 4.0.0
   5584  *
   5585  * @return string The spaces regexp.
   5586  */
   5587 function wp_spaces_regexp() {
   5588 	static $spaces = '';
   5589 
   5590 	if ( empty( $spaces ) ) {
   5591 		/**
   5592 		 * Filters the regexp for common whitespace characters.
   5593 		 *
   5594 		 * This string is substituted for the \s sequence as needed in regular
   5595 		 * expressions. For websites not written in English, different characters
   5596 		 * may represent whitespace. For websites not encoded in UTF-8, the 0xC2 0xA0
   5597 		 * sequence may not be in use.
   5598 		 *
   5599 		 * @since 4.0.0
   5600 		 *
   5601 		 * @param string $spaces Regexp pattern for matching common whitespace characters.
   5602 		 */
   5603 		$spaces = apply_filters( 'wp_spaces_regexp', '[\r\n\t ]|\xC2\xA0|&nbsp;' );
   5604 	}
   5605 
   5606 	return $spaces;
   5607 }
   5608 
   5609 /**
   5610  * Print the important emoji-related styles.
   5611  *
   5612  * @since 4.2.0
   5613  */
   5614 function print_emoji_styles() {
   5615 	static $printed = false;
   5616 
   5617 	if ( $printed ) {
   5618 		return;
   5619 	}
   5620 
   5621 	$printed = true;
   5622 
   5623 	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
   5624 	?>
   5625 <style<?php echo $type_attr; ?>>
   5626 img.wp-smiley,
   5627 img.emoji {
   5628 	display: inline !important;
   5629 	border: none !important;
   5630 	box-shadow: none !important;
   5631 	height: 1em !important;
   5632 	width: 1em !important;
   5633 	margin: 0 .07em !important;
   5634 	vertical-align: -0.1em !important;
   5635 	background: none !important;
   5636 	padding: 0 !important;
   5637 }
   5638 </style>
   5639 	<?php
   5640 }
   5641 
   5642 /**
   5643  * Print the inline Emoji detection script if it is not already printed.
   5644  *
   5645  * @since 4.2.0
   5646  */
   5647 function print_emoji_detection_script() {
   5648 	static $printed = false;
   5649 
   5650 	if ( $printed ) {
   5651 		return;
   5652 	}
   5653 
   5654 	$printed = true;
   5655 
   5656 	_print_emoji_detection_script();
   5657 }
   5658 
   5659 /**
   5660  * Prints inline Emoji detection script.
   5661  *
   5662  * @ignore
   5663  * @since 4.6.0
   5664  * @access private
   5665  */
   5666 function _print_emoji_detection_script() {
   5667 	$settings = array(
   5668 		/**
   5669 		 * Filters the URL where emoji png images are hosted.
   5670 		 *
   5671 		 * @since 4.2.0
   5672 		 *
   5673 		 * @param string $url The emoji base URL for png images.
   5674 		 */
   5675 		'baseUrl' => apply_filters( 'emoji_url', 'https://s.w.org/images/core/emoji/13.1.0/72x72/' ),
   5676 
   5677 		/**
   5678 		 * Filters the extension of the emoji png files.
   5679 		 *
   5680 		 * @since 4.2.0
   5681 		 *
   5682 		 * @param string $extension The emoji extension for png files. Default .png.
   5683 		 */
   5684 		'ext'     => apply_filters( 'emoji_ext', '.png' ),
   5685 
   5686 		/**
   5687 		 * Filters the URL where emoji SVG images are hosted.
   5688 		 *
   5689 		 * @since 4.6.0
   5690 		 *
   5691 		 * @param string $url The emoji base URL for svg images.
   5692 		 */
   5693 		'svgUrl'  => apply_filters( 'emoji_svg_url', 'https://s.w.org/images/core/emoji/13.1.0/svg/' ),
   5694 
   5695 		/**
   5696 		 * Filters the extension of the emoji SVG files.
   5697 		 *
   5698 		 * @since 4.6.0
   5699 		 *
   5700 		 * @param string $extension The emoji extension for svg files. Default .svg.
   5701 		 */
   5702 		'svgExt'  => apply_filters( 'emoji_svg_ext', '.svg' ),
   5703 	);
   5704 
   5705 	$version   = 'ver=' . get_bloginfo( 'version' );
   5706 	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/javascript"';
   5707 
   5708 	if ( SCRIPT_DEBUG ) {
   5709 		$settings['source'] = array(
   5710 			/** This filter is documented in wp-includes/class.wp-scripts.php */
   5711 			'wpemoji' => apply_filters( 'script_loader_src', includes_url( "js/wp-emoji.js?$version" ), 'wpemoji' ),
   5712 			/** This filter is documented in wp-includes/class.wp-scripts.php */
   5713 			'twemoji' => apply_filters( 'script_loader_src', includes_url( "js/twemoji.js?$version" ), 'twemoji' ),
   5714 		);
   5715 
   5716 		?>
   5717 		<script<?php echo $type_attr; ?>>
   5718 			window._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>;
   5719 			<?php readfile( ABSPATH . WPINC . '/js/wp-emoji-loader.js' ); ?>
   5720 		</script>
   5721 		<?php
   5722 	} else {
   5723 		$settings['source'] = array(
   5724 			/** This filter is documented in wp-includes/class.wp-scripts.php */
   5725 			'concatemoji' => apply_filters( 'script_loader_src', includes_url( "js/wp-emoji-release.min.js?$version" ), 'concatemoji' ),
   5726 		);
   5727 
   5728 		/*
   5729 		 * If you're looking at a src version of this file, you'll see an "include"
   5730 		 * statement below. This is used by the `npm run build` process to directly
   5731 		 * include a minified version of wp-emoji-loader.js, instead of using the
   5732 		 * readfile() method from above.
   5733 		 *
   5734 		 * If you're looking at a build version of this file, you'll see a string of
   5735 		 * minified JavaScript. If you need to debug it, please turn on SCRIPT_DEBUG
   5736 		 * and edit wp-emoji-loader.js directly.
   5737 		 */
   5738 		?>
   5739 		<script<?php echo $type_attr; ?>>
   5740 			window._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>;
   5741 			!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode;p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0);e=i.toDataURL();return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(!p||!p.fillText)return!1;switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([10084,65039,8205,55357,56613],[10084,65039,8203,55357,56613])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(n=t.source||{}).concatemoji?c(n.concatemoji):n.wpemoji&&n.twemoji&&(c(n.twemoji),c(n.wpemoji)))}(window,document,window._wpemojiSettings);
   5742 		</script>
   5743 		<?php
   5744 	}
   5745 }
   5746 
   5747 /**
   5748  * Convert emoji characters to their equivalent HTML entity.
   5749  *
   5750  * This allows us to store emoji in a DB using the utf8 character set.
   5751  *
   5752  * @since 4.2.0
   5753  *
   5754  * @param string $content The content to encode.
   5755  * @return string The encoded content.
   5756  */
   5757 function wp_encode_emoji( $content ) {
   5758 	$emoji = _wp_emoji_list( 'partials' );
   5759 
   5760 	foreach ( $emoji as $emojum ) {
   5761 		$emoji_char = html_entity_decode( $emojum );
   5762 		if ( false !== strpos( $content, $emoji_char ) ) {
   5763 			$content = preg_replace( "/$emoji_char/", $emojum, $content );
   5764 		}
   5765 	}
   5766 
   5767 	return $content;
   5768 }
   5769 
   5770 /**
   5771  * Convert emoji to a static img element.
   5772  *
   5773  * @since 4.2.0
   5774  *
   5775  * @param string $text The content to encode.
   5776  * @return string The encoded content.
   5777  */
   5778 function wp_staticize_emoji( $text ) {
   5779 	if ( false === strpos( $text, '&#x' ) ) {
   5780 		if ( ( function_exists( 'mb_check_encoding' ) && mb_check_encoding( $text, 'ASCII' ) ) || ! preg_match( '/[^\x00-\x7F]/', $text ) ) {
   5781 			// The text doesn't contain anything that might be emoji, so we can return early.
   5782 			return $text;
   5783 		} else {
   5784 			$encoded_text = wp_encode_emoji( $text );
   5785 			if ( $encoded_text === $text ) {
   5786 				return $encoded_text;
   5787 			}
   5788 
   5789 			$text = $encoded_text;
   5790 		}
   5791 	}
   5792 
   5793 	$emoji = _wp_emoji_list( 'entities' );
   5794 
   5795 	// Quickly narrow down the list of emoji that might be in the text and need replacing.
   5796 	$possible_emoji = array();
   5797 	foreach ( $emoji as $emojum ) {
   5798 		if ( false !== strpos( $text, $emojum ) ) {
   5799 			$possible_emoji[ $emojum ] = html_entity_decode( $emojum );
   5800 		}
   5801 	}
   5802 
   5803 	if ( ! $possible_emoji ) {
   5804 		return $text;
   5805 	}
   5806 
   5807 	/** This filter is documented in wp-includes/formatting.php */
   5808 	$cdn_url = apply_filters( 'emoji_url', 'https://s.w.org/images/core/emoji/13.1.0/72x72/' );
   5809 
   5810 	/** This filter is documented in wp-includes/formatting.php */
   5811 	$ext = apply_filters( 'emoji_ext', '.png' );
   5812 
   5813 	$output = '';
   5814 	/*
   5815 	 * HTML loop taken from smiley function, which was taken from texturize function.
   5816 	 * It'll never be consolidated.
   5817 	 *
   5818 	 * First, capture the tags as well as in between.
   5819 	 */
   5820 	$textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE );
   5821 	$stop    = count( $textarr );
   5822 
   5823 	// Ignore processing of specific tags.
   5824 	$tags_to_ignore       = 'code|pre|style|script|textarea';
   5825 	$ignore_block_element = '';
   5826 
   5827 	for ( $i = 0; $i < $stop; $i++ ) {
   5828 		$content = $textarr[ $i ];
   5829 
   5830 		// If we're in an ignore block, wait until we find its closing tag.
   5831 		if ( '' === $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')>/', $content, $matches ) ) {
   5832 			$ignore_block_element = $matches[1];
   5833 		}
   5834 
   5835 		// If it's not a tag and not in ignore block.
   5836 		if ( '' === $ignore_block_element && strlen( $content ) > 0 && '<' !== $content[0] && false !== strpos( $content, '&#x' ) ) {
   5837 			foreach ( $possible_emoji as $emojum => $emoji_char ) {
   5838 				if ( false === strpos( $content, $emojum ) ) {
   5839 					continue;
   5840 				}
   5841 
   5842 				$file = str_replace( ';&#x', '-', $emojum );
   5843 				$file = str_replace( array( '&#x', ';' ), '', $file );
   5844 
   5845 				$entity = sprintf( '<img src="%s" alt="%s" class="wp-smiley" style="height: 1em; max-height: 1em;" />', $cdn_url . $file . $ext, $emoji_char );
   5846 
   5847 				$content = str_replace( $emojum, $entity, $content );
   5848 			}
   5849 		}
   5850 
   5851 		// Did we exit ignore block?
   5852 		if ( '' !== $ignore_block_element && '</' . $ignore_block_element . '>' === $content ) {
   5853 			$ignore_block_element = '';
   5854 		}
   5855 
   5856 		$output .= $content;
   5857 	}
   5858 
   5859 	// Finally, remove any stray U+FE0F characters.
   5860 	$output = str_replace( '&#xfe0f;', '', $output );
   5861 
   5862 	return $output;
   5863 }
   5864 
   5865 /**
   5866  * Convert emoji in emails into static images.
   5867  *
   5868  * @since 4.2.0
   5869  *
   5870  * @param array $mail The email data array.
   5871  * @return array The email data array, with emoji in the message staticized.
   5872  */
   5873 function wp_staticize_emoji_for_email( $mail ) {
   5874 	if ( ! isset( $mail['message'] ) ) {
   5875 		return $mail;
   5876 	}
   5877 
   5878 	/*
   5879 	 * We can only transform the emoji into images if it's a text/html email.
   5880 	 * To do that, here's a cut down version of the same process that happens
   5881 	 * in wp_mail() - get the Content-Type from the headers, if there is one,
   5882 	 * then pass it through the wp_mail_content_type filter, in case a plugin
   5883 	 * is handling changing the Content-Type.
   5884 	 */
   5885 	$headers = array();
   5886 	if ( isset( $mail['headers'] ) ) {
   5887 		if ( is_array( $mail['headers'] ) ) {
   5888 			$headers = $mail['headers'];
   5889 		} else {
   5890 			$headers = explode( "\n", str_replace( "\r\n", "\n", $mail['headers'] ) );
   5891 		}
   5892 	}
   5893 
   5894 	foreach ( $headers as $header ) {
   5895 		if ( strpos( $header, ':' ) === false ) {
   5896 			continue;
   5897 		}
   5898 
   5899 		// Explode them out.
   5900 		list( $name, $content ) = explode( ':', trim( $header ), 2 );
   5901 
   5902 		// Cleanup crew.
   5903 		$name    = trim( $name );
   5904 		$content = trim( $content );
   5905 
   5906 		if ( 'content-type' === strtolower( $name ) ) {
   5907 			if ( strpos( $content, ';' ) !== false ) {
   5908 				list( $type, $charset ) = explode( ';', $content );
   5909 				$content_type           = trim( $type );
   5910 			} else {
   5911 				$content_type = trim( $content );
   5912 			}
   5913 			break;
   5914 		}
   5915 	}
   5916 
   5917 	// Set Content-Type if we don't have a content-type from the input headers.
   5918 	if ( ! isset( $content_type ) ) {
   5919 		$content_type = 'text/plain';
   5920 	}
   5921 
   5922 	/** This filter is documented in wp-includes/pluggable.php */
   5923 	$content_type = apply_filters( 'wp_mail_content_type', $content_type );
   5924 
   5925 	if ( 'text/html' === $content_type ) {
   5926 		$mail['message'] = wp_staticize_emoji( $mail['message'] );
   5927 	}
   5928 
   5929 	return $mail;
   5930 }
   5931 
   5932 /**
   5933  * Returns arrays of emoji data.
   5934  *
   5935  * These arrays are automatically built from the regex in twemoji.js - if they need to be updated,
   5936  * you should update the regex there, then run the `npm run grunt precommit:emoji` job.
   5937  *
   5938  * @since 4.9.0
   5939  * @access private
   5940  *
   5941  * @param string $type Optional. Which array type to return. Accepts 'partials' or 'entities', default 'entities'.
   5942  * @return array An array to match all emoji that WordPress recognises.
   5943  */
   5944 function _wp_emoji_list( $type = 'entities' ) {
   5945 	// Do not remove the START/END comments - they're used to find where to insert the arrays.
   5946 
   5947 	// START: emoji arrays
   5948 	$entities = array( '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f468;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;', '&#x1f469;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f468;', '&#x1f469;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f48b;&#x200d;&#x1f469;', '&#x1f3f4;&#xe0067;&#xe0062;&#xe0065;&#xe006e;&#xe0067;&#xe007f;', '&#x1f3f4;&#xe0067;&#xe0062;&#xe0073;&#xe0063;&#xe0074;&#xe007f;', '&#x1f3f4;&#xe0067;&#xe0062;&#xe0077;&#xe006c;&#xe0073;&#xe007f;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3ff;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fb;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fc;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fd;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f468;&#x1f3fe;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f469;&#x1f3fe;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;&#x1f3ff;', '&#x1f468;&#x200d;&#x1f468;&#x200d;&#x1f466;&#x200d;&#x1f466;', '&#x1f468;&#x200d;&#x1f468;&#x200d;&#x1f467;&#x200d;&#x1f466;', '&#x1f468;&#x200d;&#x1f468;&#x200d;&#x1f467;&#x200d;&#x1f467;', '&#x1f468;&#x200d;&#x1f469;&#x200d;&#x1f466;&#x200d;&#x1f466;', '&#x1f468;&#x200d;&#x1f469;&#x200d;&#x1f467;&#x200d;&#x1f466;', '&#x1f468;&#x200d;&#x1f469;&#x200d;&#x1f467;&#x200d;&#x1f467;', '&#x1f469;&#x200d;&#x1f469;&#x200d;&#x1f466;&#x200d;&#x1f466;', '&#x1f469;&#x200d;&#x1f469;&#x200d;&#x1f467;&#x200d;&#x1f466;', '&#x1f469;&#x200d;&#x1f469;&#x200d;&#x1f467;&#x200d;&#x1f467;', '&#x1f468;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;', '&#x1f469;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f468;', '&#x1f469;&#x200d;&#x2764;&#xfe0f;&#x200d;&#x1f469;', '&#x1f468;&#x200d;&#x1f466;&#x200d;&#x1f466;', '&#x1f468;&#x200d;&#x1f467;&#x200d;&#x1f466;', '&#x1f468;&#x200d;&#x1f467;&#x200d;&#x1f467;', '&#x1f468;&#x200d;&#x1f468;&#x200d;&#x1f466;', '&#x1f468;&#x200d;&#x1f468;&#x200d;&#x1f467;', '&#x1f468;&#x200d;&#x1f469;&#x200d;&#x1f466;', '&#x1f468;&#x200d;&#x1f469;&#x200d;&#x1f467;', '&#x1f469;&#x200d;&#x1f466;&#x200d;&#x1f466;', '&#x1f469;&#x200d;&#x1f467;&#x200d;&#x1f466;', '&#x1f469;&#x200d;&#x1f467;&#x200d;&#x1f467;', '&#x1f469;&#x200d;&#x1f469;&#x200d;&#x1f466;', '&#x1f469;&#x200d;&#x1f469;&#x200d;&#x1f467;', '&#x1f9d1;&#x200d;&#x1f91d;&#x200d;&#x1f9d1;', '&#x1f3c3;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c3;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c3;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c3;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c3;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c3;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c3;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c3;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c3;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c3;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c4;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c4;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c4;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c4;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c4;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c4;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c4;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c4;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c4;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c4;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f3ca;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f3ca;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f3ca;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f3ca;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f3ca;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f3ca;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f3ca;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f3ca;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f3ca;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f3ca;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cb;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cb;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cb;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cb;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cb;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cb;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cb;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cb;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cb;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cb;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cc;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cc;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cc;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cc;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cc;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cc;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cc;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cc;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cc;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cc;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f468;&#x1f3fb;&#x200d;&#x2695;&#xfe0f;', '&#x1f468;&#x1f3fb;&#x200d;&#x2696;&#xfe0f;', '&#x1f468;&#x1f3fb;&#x200d;&#x2708;&#xfe0f;', '&#x1f468;&#x1f3fc;&#x200d;&#x2695;&#xfe0f;', '&#x1f468;&#x1f3fc;&#x200d;&#x2696;&#xfe0f;', '&#x1f468;&#x1f3fc;&#x200d;&#x2708;&#xfe0f;', '&#x1f468;&#x1f3fd;&#x200d;&#x2695;&#xfe0f;', '&#x1f468;&#x1f3fd;&#x200d;&#x2696;&#xfe0f;', '&#x1f468;&#x1f3fd;&#x200d;&#x2708;&#xfe0f;', '&#x1f468;&#x1f3fe;&#x200d;&#x2695;&#xfe0f;', '&#x1f468;&#x1f3fe;&#x200d;&#x2696;&#xfe0f;', '&#x1f468;&#x1f3fe;&#x200d;&#x2708;&#xfe0f;', '&#x1f468;&#x1f3ff;&#x200d;&#x2695;&#xfe0f;', '&#x1f468;&#x1f3ff;&#x200d;&#x2696;&#xfe0f;', '&#x1f468;&#x1f3ff;&#x200d;&#x2708;&#xfe0f;', '&#x1f469;&#x1f3fb;&#x200d;&#x2695;&#xfe0f;', '&#x1f469;&#x1f3fb;&#x200d;&#x2696;&#xfe0f;', '&#x1f469;&#x1f3fb;&#x200d;&#x2708;&#xfe0f;', '&#x1f469;&#x1f3fc;&#x200d;&#x2695;&#xfe0f;', '&#x1f469;&#x1f3fc;&#x200d;&#x2696;&#xfe0f;', '&#x1f469;&#x1f3fc;&#x200d;&#x2708;&#xfe0f;', '&#x1f469;&#x1f3fd;&#x200d;&#x2695;&#xfe0f;', '&#x1f469;&#x1f3fd;&#x200d;&#x2696;&#xfe0f;', '&#x1f469;&#x1f3fd;&#x200d;&#x2708;&#xfe0f;', '&#x1f469;&#x1f3fe;&#x200d;&#x2695;&#xfe0f;', '&#x1f469;&#x1f3fe;&#x200d;&#x2696;&#xfe0f;', '&#x1f469;&#x1f3fe;&#x200d;&#x2708;&#xfe0f;', '&#x1f469;&#x1f3ff;&#x200d;&#x2695;&#xfe0f;', '&#x1f469;&#x1f3ff;&#x200d;&#x2696;&#xfe0f;', '&#x1f469;&#x1f3ff;&#x200d;&#x2708;&#xfe0f;', '&#x1f46e;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f46e;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f46e;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f46e;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f46e;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f46e;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f46e;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f46e;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f46e;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f46e;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f470;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f470;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f470;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f470;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f470;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f470;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f470;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f470;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f470;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f470;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f471;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f471;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f471;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f471;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f471;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f471;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f471;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f471;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f471;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f471;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f473;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f473;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f473;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f473;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f473;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f473;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f473;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f473;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f473;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f473;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f477;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f477;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f477;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f477;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f477;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f477;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f477;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f477;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f477;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f477;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f481;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f481;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f481;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f481;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f481;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f481;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f481;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f481;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f481;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f481;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f482;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f482;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f482;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f482;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f482;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f482;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f482;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f482;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f482;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f482;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f486;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f486;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f486;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f486;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f486;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f486;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f486;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f486;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f486;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f486;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f487;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f487;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f487;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f487;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f487;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f487;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f487;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f487;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f487;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f487;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f574;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f574;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f574;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f574;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f574;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f574;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f574;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f574;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f574;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f574;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f575;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f575;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f575;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f575;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f575;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f575;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f575;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f575;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f575;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f575;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f645;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f645;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f645;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f645;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f645;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f645;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f645;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f645;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f645;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f645;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f646;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f646;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f646;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f646;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f646;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f646;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f646;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f646;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f646;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f646;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f647;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f647;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f647;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f647;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f647;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f647;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f647;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f647;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f647;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f647;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f64b;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f64b;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f64b;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f64b;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f64b;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f64b;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f64b;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f64b;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f64b;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f64b;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f64d;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f64d;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f64d;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f64d;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f64d;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f64d;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f64d;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f64d;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f64d;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f64d;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f64e;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f64e;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f64e;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f64e;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f64e;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f64e;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f64e;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f64e;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f64e;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f64e;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f6a3;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f6a3;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f6a3;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f6a3;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f6a3;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f6a3;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f6a3;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f6a3;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f6a3;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f6a3;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b4;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b4;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b4;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b4;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b4;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b4;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b4;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b4;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b4;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b4;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b5;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b5;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b5;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b5;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b5;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b5;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b5;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b5;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b5;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b5;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b6;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b6;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b6;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b6;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b6;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b6;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b6;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b6;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b6;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b6;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f926;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f926;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f926;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f926;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f926;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f926;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f926;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f926;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f926;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f926;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f935;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f935;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f935;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f935;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f935;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f935;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f935;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f935;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f935;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f935;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f937;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f937;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f937;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f937;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f937;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f937;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f937;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f937;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f937;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f937;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f938;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f938;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f938;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f938;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f938;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f938;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f938;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f938;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f938;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f938;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f939;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f939;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f939;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f939;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f939;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f939;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f939;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f939;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f939;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f939;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f93d;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f93d;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f93d;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f93d;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f93d;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f93d;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f93d;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f93d;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f93d;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f93d;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f93e;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f93e;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f93e;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f93e;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f93e;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f93e;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f93e;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f93e;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f93e;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f93e;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b8;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b8;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b8;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b8;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b8;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b8;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b8;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b8;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b8;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b8;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b9;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b9;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b9;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b9;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b9;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b9;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b9;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b9;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b9;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b9;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cd;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cd;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cd;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cd;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cd;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cd;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cd;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cd;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cd;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cd;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9ce;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9ce;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9ce;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9ce;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9ce;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9ce;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9ce;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9ce;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9ce;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9ce;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cf;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cf;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cf;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cf;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cf;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cf;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cf;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cf;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cf;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cf;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2695;&#xfe0f;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2696;&#xfe0f;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x2708;&#xfe0f;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2695;&#xfe0f;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2696;&#xfe0f;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x2708;&#xfe0f;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2695;&#xfe0f;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2696;&#xfe0f;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x2708;&#xfe0f;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2695;&#xfe0f;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2696;&#xfe0f;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x2708;&#xfe0f;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2695;&#xfe0f;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2696;&#xfe0f;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x2708;&#xfe0f;', '&#x1f9d4;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d4;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d4;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d4;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d4;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d4;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d4;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d4;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d4;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d4;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d6;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d6;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d6;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d6;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d6;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d6;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d6;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d6;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d6;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d6;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d7;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d7;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d7;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d7;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d7;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d7;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d7;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d7;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d7;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d7;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d8;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d8;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d8;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d8;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d8;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d8;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d8;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d8;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d8;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d8;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d9;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d9;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d9;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d9;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d9;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d9;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d9;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d9;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d9;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d9;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9da;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9da;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9da;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9da;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9da;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9da;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9da;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9da;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9da;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9da;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9db;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9db;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9db;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9db;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9db;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9db;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9db;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9db;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9db;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9db;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dc;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dc;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dc;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dc;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dc;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dc;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dc;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dc;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dc;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dc;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dd;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dd;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dd;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dd;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dd;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dd;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dd;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dd;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dd;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dd;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cb;&#xfe0f;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cb;&#xfe0f;&#x200d;&#x2642;&#xfe0f;', '&#x1f3cc;&#xfe0f;&#x200d;&#x2640;&#xfe0f;', '&#x1f3cc;&#xfe0f;&#x200d;&#x2642;&#xfe0f;', '&#x1f3f3;&#xfe0f;&#x200d;&#x26a7;&#xfe0f;', '&#x1f574;&#xfe0f;&#x200d;&#x2640;&#xfe0f;', '&#x1f574;&#xfe0f;&#x200d;&#x2642;&#xfe0f;', '&#x1f575;&#xfe0f;&#x200d;&#x2640;&#xfe0f;', '&#x1f575;&#xfe0f;&#x200d;&#x2642;&#xfe0f;', '&#x26f9;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;', '&#x26f9;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;', '&#x26f9;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;', '&#x26f9;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;', '&#x26f9;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;', '&#x26f9;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;', '&#x26f9;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;', '&#x26f9;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;', '&#x26f9;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;', '&#x26f9;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;', '&#x26f9;&#xfe0f;&#x200d;&#x2640;&#xfe0f;', '&#x26f9;&#xfe0f;&#x200d;&#x2642;&#xfe0f;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f33e;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f373;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f37c;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f384;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f393;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f3a4;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f3a8;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f3eb;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f3ed;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f4bb;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f4bc;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f527;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f52c;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f680;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f692;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f9af;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f9b0;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f9b1;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f9b2;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f9b3;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f9bc;', '&#x1f468;&#x1f3fb;&#x200d;&#x1f9bd;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f33e;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f373;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f37c;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f384;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f393;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f3a4;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f3a8;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f3eb;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f3ed;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f4bb;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f4bc;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f527;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f52c;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f680;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f692;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f9af;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f9b0;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f9b1;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f9b2;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f9b3;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f9bc;', '&#x1f468;&#x1f3fc;&#x200d;&#x1f9bd;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f33e;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f373;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f37c;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f384;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f393;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f3a4;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f3a8;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f3eb;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f3ed;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f4bb;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f4bc;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f527;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f52c;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f680;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f692;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f9af;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f9b0;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f9b1;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f9b2;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f9b3;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f9bc;', '&#x1f468;&#x1f3fd;&#x200d;&#x1f9bd;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f33e;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f373;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f37c;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f384;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f393;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f3a4;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f3a8;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f3eb;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f3ed;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f4bb;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f4bc;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f527;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f52c;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f680;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f692;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f9af;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f9b0;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f9b1;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f9b2;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f9b3;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f9bc;', '&#x1f468;&#x1f3fe;&#x200d;&#x1f9bd;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f33e;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f373;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f37c;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f384;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f393;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f3a4;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f3a8;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f3eb;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f3ed;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f4bb;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f4bc;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f527;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f52c;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f680;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f692;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f9af;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f9b0;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f9b1;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f9b2;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f9b3;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f9bc;', '&#x1f468;&#x1f3ff;&#x200d;&#x1f9bd;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f33e;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f373;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f37c;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f384;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f393;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f3a4;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f3a8;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f3eb;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f3ed;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f4bb;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f4bc;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f527;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f52c;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f680;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f692;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f9af;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f9b0;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f9b1;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f9b2;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f9b3;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f9bc;', '&#x1f469;&#x1f3fb;&#x200d;&#x1f9bd;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f33e;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f373;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f37c;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f384;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f393;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f3a4;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f3a8;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f3eb;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f3ed;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f4bb;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f4bc;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f527;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f52c;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f680;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f692;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f9af;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f9b0;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f9b1;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f9b2;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f9b3;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f9bc;', '&#x1f469;&#x1f3fc;&#x200d;&#x1f9bd;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f33e;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f373;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f37c;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f384;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f393;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f3a4;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f3a8;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f3eb;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f3ed;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f4bb;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f4bc;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f527;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f52c;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f680;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f692;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f9af;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f9b0;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f9b1;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f9b2;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f9b3;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f9bc;', '&#x1f469;&#x1f3fd;&#x200d;&#x1f9bd;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f33e;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f373;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f37c;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f384;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f393;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f3a4;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f3a8;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f3eb;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f3ed;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f4bb;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f4bc;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f527;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f52c;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f680;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f692;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f9af;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f9b0;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f9b1;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f9b2;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f9b3;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f9bc;', '&#x1f469;&#x1f3fe;&#x200d;&#x1f9bd;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f33e;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f373;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f37c;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f384;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f393;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f3a4;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f3a8;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f3eb;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f3ed;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f4bb;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f4bc;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f527;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f52c;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f680;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f692;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f9af;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f9b0;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f9b1;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f9b2;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f9b3;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f9bc;', '&#x1f469;&#x1f3ff;&#x200d;&#x1f9bd;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f33e;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f373;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f37c;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f384;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f393;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f3a4;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f3a8;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f3eb;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f3ed;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f4bb;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f4bc;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f527;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f52c;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f680;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f692;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f9af;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f9b0;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f9b1;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f9b2;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f9b3;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f9bc;', '&#x1f9d1;&#x1f3fb;&#x200d;&#x1f9bd;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f33e;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f373;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f37c;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f384;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f393;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f3a4;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f3a8;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f3eb;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f3ed;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f4bb;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f4bc;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f527;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f52c;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f680;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f692;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f9af;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f9b0;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f9b1;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f9b2;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f9b3;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f9bc;', '&#x1f9d1;&#x1f3fc;&#x200d;&#x1f9bd;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f33e;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f373;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f37c;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f384;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f393;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f3a4;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f3a8;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f3eb;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f3ed;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f4bb;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f4bc;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f527;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f52c;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f680;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f692;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f9af;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f9b0;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f9b1;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f9b2;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f9b3;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f9bc;', '&#x1f9d1;&#x1f3fd;&#x200d;&#x1f9bd;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f33e;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f373;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f37c;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f384;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f393;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f3a4;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f3a8;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f3eb;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f3ed;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f4bb;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f4bc;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f527;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f52c;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f680;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f692;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f9af;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f9b0;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f9b1;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f9b2;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f9b3;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f9bc;', '&#x1f9d1;&#x1f3fe;&#x200d;&#x1f9bd;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f33e;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f373;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f37c;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f384;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f393;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f3a4;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f3a8;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f3eb;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f3ed;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f4bb;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f4bc;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f527;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f52c;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f680;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f692;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f9af;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f9b0;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f9b1;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f9b2;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f9b3;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f9bc;', '&#x1f9d1;&#x1f3ff;&#x200d;&#x1f9bd;', '&#x1f3f3;&#xfe0f;&#x200d;&#x1f308;', '&#x1f636;&#x200d;&#x1f32b;&#xfe0f;', '&#x1f3c3;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c3;&#x200d;&#x2642;&#xfe0f;', '&#x1f3c4;&#x200d;&#x2640;&#xfe0f;', '&#x1f3c4;&#x200d;&#x2642;&#xfe0f;', '&#x1f3ca;&#x200d;&#x2640;&#xfe0f;', '&#x1f3ca;&#x200d;&#x2642;&#xfe0f;', '&#x1f3f4;&#x200d;&#x2620;&#xfe0f;', '&#x1f43b;&#x200d;&#x2744;&#xfe0f;', '&#x1f468;&#x200d;&#x2695;&#xfe0f;', '&#x1f468;&#x200d;&#x2696;&#xfe0f;', '&#x1f468;&#x200d;&#x2708;&#xfe0f;', '&#x1f469;&#x200d;&#x2695;&#xfe0f;', '&#x1f469;&#x200d;&#x2696;&#xfe0f;', '&#x1f469;&#x200d;&#x2708;&#xfe0f;', '&#x1f46e;&#x200d;&#x2640;&#xfe0f;', '&#x1f46e;&#x200d;&#x2642;&#xfe0f;', '&#x1f46f;&#x200d;&#x2640;&#xfe0f;', '&#x1f46f;&#x200d;&#x2642;&#xfe0f;', '&#x1f470;&#x200d;&#x2640;&#xfe0f;', '&#x1f470;&#x200d;&#x2642;&#xfe0f;', '&#x1f471;&#x200d;&#x2640;&#xfe0f;', '&#x1f471;&#x200d;&#x2642;&#xfe0f;', '&#x1f473;&#x200d;&#x2640;&#xfe0f;', '&#x1f473;&#x200d;&#x2642;&#xfe0f;', '&#x1f477;&#x200d;&#x2640;&#xfe0f;', '&#x1f477;&#x200d;&#x2642;&#xfe0f;', '&#x1f481;&#x200d;&#x2640;&#xfe0f;', '&#x1f481;&#x200d;&#x2642;&#xfe0f;', '&#x1f482;&#x200d;&#x2640;&#xfe0f;', '&#x1f482;&#x200d;&#x2642;&#xfe0f;', '&#x1f486;&#x200d;&#x2640;&#xfe0f;', '&#x1f486;&#x200d;&#x2642;&#xfe0f;', '&#x1f487;&#x200d;&#x2640;&#xfe0f;', '&#x1f487;&#x200d;&#x2642;&#xfe0f;', '&#x1f645;&#x200d;&#x2640;&#xfe0f;', '&#x1f645;&#x200d;&#x2642;&#xfe0f;', '&#x1f646;&#x200d;&#x2640;&#xfe0f;', '&#x1f646;&#x200d;&#x2642;&#xfe0f;', '&#x1f647;&#x200d;&#x2640;&#xfe0f;', '&#x1f647;&#x200d;&#x2642;&#xfe0f;', '&#x1f64b;&#x200d;&#x2640;&#xfe0f;', '&#x1f64b;&#x200d;&#x2642;&#xfe0f;', '&#x1f64d;&#x200d;&#x2640;&#xfe0f;', '&#x1f64d;&#x200d;&#x2642;&#xfe0f;', '&#x1f64e;&#x200d;&#x2640;&#xfe0f;', '&#x1f64e;&#x200d;&#x2642;&#xfe0f;', '&#x1f6a3;&#x200d;&#x2640;&#xfe0f;', '&#x1f6a3;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b4;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b4;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b5;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b5;&#x200d;&#x2642;&#xfe0f;', '&#x1f6b6;&#x200d;&#x2640;&#xfe0f;', '&#x1f6b6;&#x200d;&#x2642;&#xfe0f;', '&#x1f926;&#x200d;&#x2640;&#xfe0f;', '&#x1f926;&#x200d;&#x2642;&#xfe0f;', '&#x1f935;&#x200d;&#x2640;&#xfe0f;', '&#x1f935;&#x200d;&#x2642;&#xfe0f;', '&#x1f937;&#x200d;&#x2640;&#xfe0f;', '&#x1f937;&#x200d;&#x2642;&#xfe0f;', '&#x1f938;&#x200d;&#x2640;&#xfe0f;', '&#x1f938;&#x200d;&#x2642;&#xfe0f;', '&#x1f939;&#x200d;&#x2640;&#xfe0f;', '&#x1f939;&#x200d;&#x2642;&#xfe0f;', '&#x1f93c;&#x200d;&#x2640;&#xfe0f;', '&#x1f93c;&#x200d;&#x2642;&#xfe0f;', '&#x1f93d;&#x200d;&#x2640;&#xfe0f;', '&#x1f93d;&#x200d;&#x2642;&#xfe0f;', '&#x1f93e;&#x200d;&#x2640;&#xfe0f;', '&#x1f93e;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b8;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b8;&#x200d;&#x2642;&#xfe0f;', '&#x1f9b9;&#x200d;&#x2640;&#xfe0f;', '&#x1f9b9;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9ce;&#x200d;&#x2640;&#xfe0f;', '&#x1f9ce;&#x200d;&#x2642;&#xfe0f;', '&#x1f9cf;&#x200d;&#x2640;&#xfe0f;', '&#x1f9cf;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d1;&#x200d;&#x2695;&#xfe0f;', '&#x1f9d1;&#x200d;&#x2696;&#xfe0f;', '&#x1f9d1;&#x200d;&#x2708;&#xfe0f;', '&#x1f9d4;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d4;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d6;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d6;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d7;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d7;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d8;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d8;&#x200d;&#x2642;&#xfe0f;', '&#x1f9d9;&#x200d;&#x2640;&#xfe0f;', '&#x1f9d9;&#x200d;&#x2642;&#xfe0f;', '&#x1f9da;&#x200d;&#x2640;&#xfe0f;', '&#x1f9da;&#x200d;&#x2642;&#xfe0f;', '&#x1f9db;&#x200d;&#x2640;&#xfe0f;', '&#x1f9db;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dc;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dc;&#x200d;&#x2642;&#xfe0f;', '&#x1f9dd;&#x200d;&#x2640;&#xfe0f;', '&#x1f9dd;&#x200d;&#x2642;&#xfe0f;', '&#x1f9de;&#x200d;&#x2640;&#xfe0f;', '&#x1f9de;&#x200d;&#x2642;&#xfe0f;', '&#x1f9df;&#x200d;&#x2640;&#xfe0f;', '&#x1f9df;&#x200d;&#x2642;&#xfe0f;', '&#x2764;&#xfe0f;&#x200d;&#x1f525;', '&#x2764;&#xfe0f;&#x200d;&#x1fa79;', '&#x1f415;&#x200d;&#x1f9ba;', '&#x1f441;&#x200d;&#x1f5e8;', '&#x1f468;&#x200d;&#x1f33e;', '&#x1f468;&#x200d;&#x1f373;', '&#x1f468;&#x200d;&#x1f37c;', '&#x1f468;&#x200d;&#x1f384;', '&#x1f468;&#x200d;&#x1f393;', '&#x1f468;&#x200d;&#x1f3a4;', '&#x1f468;&#x200d;&#x1f3a8;', '&#x1f468;&#x200d;&#x1f3eb;', '&#x1f468;&#x200d;&#x1f3ed;', '&#x1f468;&#x200d;&#x1f466;', '&#x1f468;&#x200d;&#x1f467;', '&#x1f468;&#x200d;&#x1f4bb;', '&#x1f468;&#x200d;&#x1f4bc;', '&#x1f468;&#x200d;&#x1f527;', '&#x1f468;&#x200d;&#x1f52c;', '&#x1f468;&#x200d;&#x1f680;', '&#x1f468;&#x200d;&#x1f692;', '&#x1f468;&#x200d;&#x1f9af;', '&#x1f468;&#x200d;&#x1f9b0;', '&#x1f468;&#x200d;&#x1f9b1;', '&#x1f468;&#x200d;&#x1f9b2;', '&#x1f468;&#x200d;&#x1f9b3;', '&#x1f468;&#x200d;&#x1f9bc;', '&#x1f468;&#x200d;&#x1f9bd;', '&#x1f469;&#x200d;&#x1f33e;', '&#x1f469;&#x200d;&#x1f373;', '&#x1f469;&#x200d;&#x1f37c;', '&#x1f469;&#x200d;&#x1f384;', '&#x1f469;&#x200d;&#x1f393;', '&#x1f469;&#x200d;&#x1f3a4;', '&#x1f469;&#x200d;&#x1f3a8;', '&#x1f469;&#x200d;&#x1f3eb;', '&#x1f469;&#x200d;&#x1f3ed;', '&#x1f469;&#x200d;&#x1f466;', '&#x1f469;&#x200d;&#x1f467;', '&#x1f469;&#x200d;&#x1f4bb;', '&#x1f469;&#x200d;&#x1f4bc;', '&#x1f469;&#x200d;&#x1f527;', '&#x1f469;&#x200d;&#x1f52c;', '&#x1f469;&#x200d;&#x1f680;', '&#x1f469;&#x200d;&#x1f692;', '&#x1f469;&#x200d;&#x1f9af;', '&#x1f469;&#x200d;&#x1f9b0;', '&#x1f469;&#x200d;&#x1f9b1;', '&#x1f469;&#x200d;&#x1f9b2;', '&#x1f469;&#x200d;&#x1f9b3;', '&#x1f469;&#x200d;&#x1f9bc;', '&#x1f469;&#x200d;&#x1f9bd;', '&#x1f62e;&#x200d;&#x1f4a8;', '&#x1f635;&#x200d;&#x1f4ab;', '&#x1f9d1;&#x200d;&#x1f33e;', '&#x1f9d1;&#x200d;&#x1f373;', '&#x1f9d1;&#x200d;&#x1f37c;', '&#x1f9d1;&#x200d;&#x1f384;', '&#x1f9d1;&#x200d;&#x1f393;', '&#x1f9d1;&#x200d;&#x1f3a4;', '&#x1f9d1;&#x200d;&#x1f3a8;', '&#x1f9d1;&#x200d;&#x1f3eb;', '&#x1f9d1;&#x200d;&#x1f3ed;', '&#x1f9d1;&#x200d;&#x1f4bb;', '&#x1f9d1;&#x200d;&#x1f4bc;', '&#x1f9d1;&#x200d;&#x1f527;', '&#x1f9d1;&#x200d;&#x1f52c;', '&#x1f9d1;&#x200d;&#x1f680;', '&#x1f9d1;&#x200d;&#x1f692;', '&#x1f9d1;&#x200d;&#x1f9af;', '&#x1f9d1;&#x200d;&#x1f9b0;', '&#x1f9d1;&#x200d;&#x1f9b1;', '&#x1f9d1;&#x200d;&#x1f9b2;', '&#x1f9d1;&#x200d;&#x1f9b3;', '&#x1f9d1;&#x200d;&#x1f9bc;', '&#x1f9d1;&#x200d;&#x1f9bd;', '&#x1f408;&#x200d;&#x2b1b;', '&#x1f1e6;&#x1f1e8;', '&#x1f1e6;&#x1f1e9;', '&#x1f1e6;&#x1f1ea;', '&#x1f1e6;&#x1f1eb;', '&#x1f1e6;&#x1f1ec;', '&#x1f1e6;&#x1f1ee;', '&#x1f1e6;&#x1f1f1;', '&#x1f1e6;&#x1f1f2;', '&#x1f1e6;&#x1f1f4;', '&#x1f1e6;&#x1f1f6;', '&#x1f1e6;&#x1f1f7;', '&#x1f1e6;&#x1f1f8;', '&#x1f1e6;&#x1f1f9;', '&#x1f1e6;&#x1f1fa;', '&#x1f1e6;&#x1f1fc;', '&#x1f1e6;&#x1f1fd;', '&#x1f1e6;&#x1f1ff;', '&#x1f1e7;&#x1f1e6;', '&#x1f1e7;&#x1f1e7;', '&#x1f1e7;&#x1f1e9;', '&#x1f1e7;&#x1f1ea;', '&#x1f1e7;&#x1f1eb;', '&#x1f1e7;&#x1f1ec;', '&#x1f1e7;&#x1f1ed;', '&#x1f1e7;&#x1f1ee;', '&#x1f1e7;&#x1f1ef;', '&#x1f1e7;&#x1f1f1;', '&#x1f1e7;&#x1f1f2;', '&#x1f1e7;&#x1f1f3;', '&#x1f1e7;&#x1f1f4;', '&#x1f1e7;&#x1f1f6;', '&#x1f1e7;&#x1f1f7;', '&#x1f1e7;&#x1f1f8;', '&#x1f1e7;&#x1f1f9;', '&#x1f1e7;&#x1f1fb;', '&#x1f1e7;&#x1f1fc;', '&#x1f1e7;&#x1f1fe;', '&#x1f1e7;&#x1f1ff;', '&#x1f1e8;&#x1f1e6;', '&#x1f1e8;&#x1f1e8;', '&#x1f1e8;&#x1f1e9;', '&#x1f1e8;&#x1f1eb;', '&#x1f1e8;&#x1f1ec;', '&#x1f1e8;&#x1f1ed;', '&#x1f1e8;&#x1f1ee;', '&#x1f1e8;&#x1f1f0;', '&#x1f1e8;&#x1f1f1;', '&#x1f1e8;&#x1f1f2;', '&#x1f1e8;&#x1f1f3;', '&#x1f1e8;&#x1f1f4;', '&#x1f1e8;&#x1f1f5;', '&#x1f1e8;&#x1f1f7;', '&#x1f1e8;&#x1f1fa;', '&#x1f1e8;&#x1f1fb;', '&#x1f1e8;&#x1f1fc;', '&#x1f1e8;&#x1f1fd;', '&#x1f1e8;&#x1f1fe;', '&#x1f1e8;&#x1f1ff;', '&#x1f1e9;&#x1f1ea;', '&#x1f1e9;&#x1f1ec;', '&#x1f1e9;&#x1f1ef;', '&#x1f1e9;&#x1f1f0;', '&#x1f1e9;&#x1f1f2;', '&#x1f1e9;&#x1f1f4;', '&#x1f1e9;&#x1f1ff;', '&#x1f1ea;&#x1f1e6;', '&#x1f1ea;&#x1f1e8;', '&#x1f1ea;&#x1f1ea;', '&#x1f1ea;&#x1f1ec;', '&#x1f1ea;&#x1f1ed;', '&#x1f1ea;&#x1f1f7;', '&#x1f1ea;&#x1f1f8;', '&#x1f1ea;&#x1f1f9;', '&#x1f1ea;&#x1f1fa;', '&#x1f1eb;&#x1f1ee;', '&#x1f1eb;&#x1f1ef;', '&#x1f1eb;&#x1f1f0;', '&#x1f1eb;&#x1f1f2;', '&#x1f1eb;&#x1f1f4;', '&#x1f1eb;&#x1f1f7;', '&#x1f1ec;&#x1f1e6;', '&#x1f1ec;&#x1f1e7;', '&#x1f1ec;&#x1f1e9;', '&#x1f1ec;&#x1f1ea;', '&#x1f1ec;&#x1f1eb;', '&#x1f1ec;&#x1f1ec;', '&#x1f1ec;&#x1f1ed;', '&#x1f1ec;&#x1f1ee;', '&#x1f1ec;&#x1f1f1;', '&#x1f1ec;&#x1f1f2;', '&#x1f1ec;&#x1f1f3;', '&#x1f1ec;&#x1f1f5;', '&#x1f1ec;&#x1f1f6;', '&#x1f1ec;&#x1f1f7;', '&#x1f1ec;&#x1f1f8;', '&#x1f1ec;&#x1f1f9;', '&#x1f1ec;&#x1f1fa;', '&#x1f1ec;&#x1f1fc;', '&#x1f1ec;&#x1f1fe;', '&#x1f1ed;&#x1f1f0;', '&#x1f1ed;&#x1f1f2;', '&#x1f1ed;&#x1f1f3;', '&#x1f1ed;&#x1f1f7;', '&#x1f1ed;&#x1f1f9;', '&#x1f1ed;&#x1f1fa;', '&#x1f1ee;&#x1f1e8;', '&#x1f1ee;&#x1f1e9;', '&#x1f1ee;&#x1f1ea;', '&#x1f1ee;&#x1f1f1;', '&#x1f1ee;&#x1f1f2;', '&#x1f1ee;&#x1f1f3;', '&#x1f1ee;&#x1f1f4;', '&#x1f1ee;&#x1f1f6;', '&#x1f1ee;&#x1f1f7;', '&#x1f1ee;&#x1f1f8;', '&#x1f1ee;&#x1f1f9;', '&#x1f1ef;&#x1f1ea;', '&#x1f1ef;&#x1f1f2;', '&#x1f1ef;&#x1f1f4;', '&#x1f1ef;&#x1f1f5;', '&#x1f1f0;&#x1f1ea;', '&#x1f1f0;&#x1f1ec;', '&#x1f1f0;&#x1f1ed;', '&#x1f1f0;&#x1f1ee;', '&#x1f1f0;&#x1f1f2;', '&#x1f1f0;&#x1f1f3;', '&#x1f1f0;&#x1f1f5;', '&#x1f1f0;&#x1f1f7;', '&#x1f1f0;&#x1f1fc;', '&#x1f1f0;&#x1f1fe;', '&#x1f1f0;&#x1f1ff;', '&#x1f1f1;&#x1f1e6;', '&#x1f1f1;&#x1f1e7;', '&#x1f1f1;&#x1f1e8;', '&#x1f1f1;&#x1f1ee;', '&#x1f1f1;&#x1f1f0;', '&#x1f1f1;&#x1f1f7;', '&#x1f1f1;&#x1f1f8;', '&#x1f1f1;&#x1f1f9;', '&#x1f1f1;&#x1f1fa;', '&#x1f1f1;&#x1f1fb;', '&#x1f1f1;&#x1f1fe;', '&#x1f1f2;&#x1f1e6;', '&#x1f1f2;&#x1f1e8;', '&#x1f1f2;&#x1f1e9;', '&#x1f1f2;&#x1f1ea;', '&#x1f1f2;&#x1f1eb;', '&#x1f1f2;&#x1f1ec;', '&#x1f1f2;&#x1f1ed;', '&#x1f1f2;&#x1f1f0;', '&#x1f1f2;&#x1f1f1;', '&#x1f1f2;&#x1f1f2;', '&#x1f1f2;&#x1f1f3;', '&#x1f1f2;&#x1f1f4;', '&#x1f1f2;&#x1f1f5;', '&#x1f1f2;&#x1f1f6;', '&#x1f1f2;&#x1f1f7;', '&#x1f1f2;&#x1f1f8;', '&#x1f1f2;&#x1f1f9;', '&#x1f1f2;&#x1f1fa;', '&#x1f1f2;&#x1f1fb;', '&#x1f1f2;&#x1f1fc;', '&#x1f1f2;&#x1f1fd;', '&#x1f1f2;&#x1f1fe;', '&#x1f1f2;&#x1f1ff;', '&#x1f1f3;&#x1f1e6;', '&#x1f1f3;&#x1f1e8;', '&#x1f1f3;&#x1f1ea;', '&#x1f1f3;&#x1f1eb;', '&#x1f1f3;&#x1f1ec;', '&#x1f1f3;&#x1f1ee;', '&#x1f1f3;&#x1f1f1;', '&#x1f1f3;&#x1f1f4;', '&#x1f1f3;&#x1f1f5;', '&#x1f1f3;&#x1f1f7;', '&#x1f1f3;&#x1f1fa;', '&#x1f1f3;&#x1f1ff;', '&#x1f1f4;&#x1f1f2;', '&#x1f1f5;&#x1f1e6;', '&#x1f1f5;&#x1f1ea;', '&#x1f1f5;&#x1f1eb;', '&#x1f1f5;&#x1f1ec;', '&#x1f1f5;&#x1f1ed;', '&#x1f1f5;&#x1f1f0;', '&#x1f1f5;&#x1f1f1;', '&#x1f1f5;&#x1f1f2;', '&#x1f1f5;&#x1f1f3;', '&#x1f1f5;&#x1f1f7;', '&#x1f1f5;&#x1f1f8;', '&#x1f1f5;&#x1f1f9;', '&#x1f1f5;&#x1f1fc;', '&#x1f1f5;&#x1f1fe;', '&#x1f1f6;&#x1f1e6;', '&#x1f1f7;&#x1f1ea;', '&#x1f1f7;&#x1f1f4;', '&#x1f1f7;&#x1f1f8;', '&#x1f1f7;&#x1f1fa;', '&#x1f1f7;&#x1f1fc;', '&#x1f1f8;&#x1f1e6;', '&#x1f1f8;&#x1f1e7;', '&#x1f1f8;&#x1f1e8;', '&#x1f1f8;&#x1f1e9;', '&#x1f1f8;&#x1f1ea;', '&#x1f1f8;&#x1f1ec;', '&#x1f1f8;&#x1f1ed;', '&#x1f1f8;&#x1f1ee;', '&#x1f1f8;&#x1f1ef;', '&#x1f1f8;&#x1f1f0;', '&#x1f1f8;&#x1f1f1;', '&#x1f1f8;&#x1f1f2;', '&#x1f1f8;&#x1f1f3;', '&#x1f1f8;&#x1f1f4;', '&#x1f1f8;&#x1f1f7;', '&#x1f1f8;&#x1f1f8;', '&#x1f1f8;&#x1f1f9;', '&#x1f1f8;&#x1f1fb;', '&#x1f1f8;&#x1f1fd;', '&#x1f1f8;&#x1f1fe;', '&#x1f1f8;&#x1f1ff;', '&#x1f1f9;&#x1f1e6;', '&#x1f1f9;&#x1f1e8;', '&#x1f1f9;&#x1f1e9;', '&#x1f1f9;&#x1f1eb;', '&#x1f1f9;&#x1f1ec;', '&#x1f1f9;&#x1f1ed;', '&#x1f1f9;&#x1f1ef;', '&#x1f1f9;&#x1f1f0;', '&#x1f1f9;&#x1f1f1;', '&#x1f1f9;&#x1f1f2;', '&#x1f1f9;&#x1f1f3;', '&#x1f1f9;&#x1f1f4;', '&#x1f1f9;&#x1f1f7;', '&#x1f1f9;&#x1f1f9;', '&#x1f1f9;&#x1f1fb;', '&#x1f1f9;&#x1f1fc;', '&#x1f1f9;&#x1f1ff;', '&#x1f1fa;&#x1f1e6;', '&#x1f1fa;&#x1f1ec;', '&#x1f1fa;&#x1f1f2;', '&#x1f1fa;&#x1f1f3;', '&#x1f1fa;&#x1f1f8;', '&#x1f1fa;&#x1f1fe;', '&#x1f1fa;&#x1f1ff;', '&#x1f1fb;&#x1f1e6;', '&#x1f1fb;&#x1f1e8;', '&#x1f1fb;&#x1f1ea;', '&#x1f1fb;&#x1f1ec;', '&#x1f1fb;&#x1f1ee;', '&#x1f1fb;&#x1f1f3;', '&#x1f1fb;&#x1f1fa;', '&#x1f1fc;&#x1f1eb;', '&#x1f1fc;&#x1f1f8;', '&#x1f1fd;&#x1f1f0;', '&#x1f1fe;&#x1f1ea;', '&#x1f1fe;&#x1f1f9;', '&#x1f1ff;&#x1f1e6;', '&#x1f1ff;&#x1f1f2;', '&#x1f1ff;&#x1f1fc;', '&#x1f385;&#x1f3fb;', '&#x1f385;&#x1f3fc;', '&#x1f385;&#x1f3fd;', '&#x1f385;&#x1f3fe;', '&#x1f385;&#x1f3ff;', '&#x1f3c2;&#x1f3fb;', '&#x1f3c2;&#x1f3fc;', '&#x1f3c2;&#x1f3fd;', '&#x1f3c2;&#x1f3fe;', '&#x1f3c2;&#x1f3ff;', '&#x1f3c3;&#x1f3fb;', '&#x1f3c3;&#x1f3fc;', '&#x1f3c3;&#x1f3fd;', '&#x1f3c3;&#x1f3fe;', '&#x1f3c3;&#x1f3ff;', '&#x1f3c4;&#x1f3fb;', '&#x1f3c4;&#x1f3fc;', '&#x1f3c4;&#x1f3fd;', '&#x1f3c4;&#x1f3fe;', '&#x1f3c4;&#x1f3ff;', '&#x1f3c7;&#x1f3fb;', '&#x1f3c7;&#x1f3fc;', '&#x1f3c7;&#x1f3fd;', '&#x1f3c7;&#x1f3fe;', '&#x1f3c7;&#x1f3ff;', '&#x1f3ca;&#x1f3fb;', '&#x1f3ca;&#x1f3fc;', '&#x1f3ca;&#x1f3fd;', '&#x1f3ca;&#x1f3fe;', '&#x1f3ca;&#x1f3ff;', '&#x1f3cb;&#x1f3fb;', '&#x1f3cb;&#x1f3fc;', '&#x1f3cb;&#x1f3fd;', '&#x1f3cb;&#x1f3fe;', '&#x1f3cb;&#x1f3ff;', '&#x1f3cc;&#x1f3fb;', '&#x1f3cc;&#x1f3fc;', '&#x1f3cc;&#x1f3fd;', '&#x1f3cc;&#x1f3fe;', '&#x1f3cc;&#x1f3ff;', '&#x1f442;&#x1f3fb;', '&#x1f442;&#x1f3fc;', '&#x1f442;&#x1f3fd;', '&#x1f442;&#x1f3fe;', '&#x1f442;&#x1f3ff;', '&#x1f443;&#x1f3fb;', '&#x1f443;&#x1f3fc;', '&#x1f443;&#x1f3fd;', '&#x1f443;&#x1f3fe;', '&#x1f443;&#x1f3ff;', '&#x1f446;&#x1f3fb;', '&#x1f446;&#x1f3fc;', '&#x1f446;&#x1f3fd;', '&#x1f446;&#x1f3fe;', '&#x1f446;&#x1f3ff;', '&#x1f447;&#x1f3fb;', '&#x1f447;&#x1f3fc;', '&#x1f447;&#x1f3fd;', '&#x1f447;&#x1f3fe;', '&#x1f447;&#x1f3ff;', '&#x1f448;&#x1f3fb;', '&#x1f448;&#x1f3fc;', '&#x1f448;&#x1f3fd;', '&#x1f448;&#x1f3fe;', '&#x1f448;&#x1f3ff;', '&#x1f449;&#x1f3fb;', '&#x1f449;&#x1f3fc;', '&#x1f449;&#x1f3fd;', '&#x1f449;&#x1f3fe;', '&#x1f449;&#x1f3ff;', '&#x1f44a;&#x1f3fb;', '&#x1f44a;&#x1f3fc;', '&#x1f44a;&#x1f3fd;', '&#x1f44a;&#x1f3fe;', '&#x1f44a;&#x1f3ff;', '&#x1f44b;&#x1f3fb;', '&#x1f44b;&#x1f3fc;', '&#x1f44b;&#x1f3fd;', '&#x1f44b;&#x1f3fe;', '&#x1f44b;&#x1f3ff;', '&#x1f44c;&#x1f3fb;', '&#x1f44c;&#x1f3fc;', '&#x1f44c;&#x1f3fd;', '&#x1f44c;&#x1f3fe;', '&#x1f44c;&#x1f3ff;', '&#x1f44d;&#x1f3fb;', '&#x1f44d;&#x1f3fc;', '&#x1f44d;&#x1f3fd;', '&#x1f44d;&#x1f3fe;', '&#x1f44d;&#x1f3ff;', '&#x1f44e;&#x1f3fb;', '&#x1f44e;&#x1f3fc;', '&#x1f44e;&#x1f3fd;', '&#x1f44e;&#x1f3fe;', '&#x1f44e;&#x1f3ff;', '&#x1f44f;&#x1f3fb;', '&#x1f44f;&#x1f3fc;', '&#x1f44f;&#x1f3fd;', '&#x1f44f;&#x1f3fe;', '&#x1f44f;&#x1f3ff;', '&#x1f450;&#x1f3fb;', '&#x1f450;&#x1f3fc;', '&#x1f450;&#x1f3fd;', '&#x1f450;&#x1f3fe;', '&#x1f450;&#x1f3ff;', '&#x1f466;&#x1f3fb;', '&#x1f466;&#x1f3fc;', '&#x1f466;&#x1f3fd;', '&#x1f466;&#x1f3fe;', '&#x1f466;&#x1f3ff;', '&#x1f467;&#x1f3fb;', '&#x1f467;&#x1f3fc;', '&#x1f467;&#x1f3fd;', '&#x1f467;&#x1f3fe;', '&#x1f467;&#x1f3ff;', '&#x1f468;&#x1f3fb;', '&#x1f468;&#x1f3fc;', '&#x1f468;&#x1f3fd;', '&#x1f468;&#x1f3fe;', '&#x1f468;&#x1f3ff;', '&#x1f469;&#x1f3fb;', '&#x1f469;&#x1f3fc;', '&#x1f469;&#x1f3fd;', '&#x1f469;&#x1f3fe;', '&#x1f469;&#x1f3ff;', '&#x1f46b;&#x1f3fb;', '&#x1f46b;&#x1f3fc;', '&#x1f46b;&#x1f3fd;', '&#x1f46b;&#x1f3fe;', '&#x1f46b;&#x1f3ff;', '&#x1f46c;&#x1f3fb;', '&#x1f46c;&#x1f3fc;', '&#x1f46c;&#x1f3fd;', '&#x1f46c;&#x1f3fe;', '&#x1f46c;&#x1f3ff;', '&#x1f46d;&#x1f3fb;', '&#x1f46d;&#x1f3fc;', '&#x1f46d;&#x1f3fd;', '&#x1f46d;&#x1f3fe;', '&#x1f46d;&#x1f3ff;', '&#x1f46e;&#x1f3fb;', '&#x1f46e;&#x1f3fc;', '&#x1f46e;&#x1f3fd;', '&#x1f46e;&#x1f3fe;', '&#x1f46e;&#x1f3ff;', '&#x1f470;&#x1f3fb;', '&#x1f470;&#x1f3fc;', '&#x1f470;&#x1f3fd;', '&#x1f470;&#x1f3fe;', '&#x1f470;&#x1f3ff;', '&#x1f471;&#x1f3fb;', '&#x1f471;&#x1f3fc;', '&#x1f471;&#x1f3fd;', '&#x1f471;&#x1f3fe;', '&#x1f471;&#x1f3ff;', '&#x1f472;&#x1f3fb;', '&#x1f472;&#x1f3fc;', '&#x1f472;&#x1f3fd;', '&#x1f472;&#x1f3fe;', '&#x1f472;&#x1f3ff;', '&#x1f473;&#x1f3fb;', '&#x1f473;&#x1f3fc;', '&#x1f473;&#x1f3fd;', '&#x1f473;&#x1f3fe;', '&#x1f473;&#x1f3ff;', '&#x1f474;&#x1f3fb;', '&#x1f474;&#x1f3fc;', '&#x1f474;&#x1f3fd;', '&#x1f474;&#x1f3fe;', '&#x1f474;&#x1f3ff;', '&#x1f475;&#x1f3fb;', '&#x1f475;&#x1f3fc;', '&#x1f475;&#x1f3fd;', '&#x1f475;&#x1f3fe;', '&#x1f475;&#x1f3ff;', '&#x1f476;&#x1f3fb;', '&#x1f476;&#x1f3fc;', '&#x1f476;&#x1f3fd;', '&#x1f476;&#x1f3fe;', '&#x1f476;&#x1f3ff;', '&#x1f477;&#x1f3fb;', '&#x1f477;&#x1f3fc;', '&#x1f477;&#x1f3fd;', '&#x1f477;&#x1f3fe;', '&#x1f477;&#x1f3ff;', '&#x1f478;&#x1f3fb;', '&#x1f478;&#x1f3fc;', '&#x1f478;&#x1f3fd;', '&#x1f478;&#x1f3fe;', '&#x1f478;&#x1f3ff;', '&#x1f47c;&#x1f3fb;', '&#x1f47c;&#x1f3fc;', '&#x1f47c;&#x1f3fd;', '&#x1f47c;&#x1f3fe;', '&#x1f47c;&#x1f3ff;', '&#x1f481;&#x1f3fb;', '&#x1f481;&#x1f3fc;', '&#x1f481;&#x1f3fd;', '&#x1f481;&#x1f3fe;', '&#x1f481;&#x1f3ff;', '&#x1f482;&#x1f3fb;', '&#x1f482;&#x1f3fc;', '&#x1f482;&#x1f3fd;', '&#x1f482;&#x1f3fe;', '&#x1f482;&#x1f3ff;', '&#x1f483;&#x1f3fb;', '&#x1f483;&#x1f3fc;', '&#x1f483;&#x1f3fd;', '&#x1f483;&#x1f3fe;', '&#x1f483;&#x1f3ff;', '&#x1f485;&#x1f3fb;', '&#x1f485;&#x1f3fc;', '&#x1f485;&#x1f3fd;', '&#x1f485;&#x1f3fe;', '&#x1f485;&#x1f3ff;', '&#x1f486;&#x1f3fb;', '&#x1f486;&#x1f3fc;', '&#x1f486;&#x1f3fd;', '&#x1f486;&#x1f3fe;', '&#x1f486;&#x1f3ff;', '&#x1f487;&#x1f3fb;', '&#x1f487;&#x1f3fc;', '&#x1f487;&#x1f3fd;', '&#x1f487;&#x1f3fe;', '&#x1f487;&#x1f3ff;', '&#x1f48f;&#x1f3fb;', '&#x1f48f;&#x1f3fc;', '&#x1f48f;&#x1f3fd;', '&#x1f48f;&#x1f3fe;', '&#x1f48f;&#x1f3ff;', '&#x1f491;&#x1f3fb;', '&#x1f491;&#x1f3fc;', '&#x1f491;&#x1f3fd;', '&#x1f491;&#x1f3fe;', '&#x1f491;&#x1f3ff;', '&#x1f4aa;&#x1f3fb;', '&#x1f4aa;&#x1f3fc;', '&#x1f4aa;&#x1f3fd;', '&#x1f4aa;&#x1f3fe;', '&#x1f4aa;&#x1f3ff;', '&#x1f574;&#x1f3fb;', '&#x1f574;&#x1f3fc;', '&#x1f574;&#x1f3fd;', '&#x1f574;&#x1f3fe;', '&#x1f574;&#x1f3ff;', '&#x1f575;&#x1f3fb;', '&#x1f575;&#x1f3fc;', '&#x1f575;&#x1f3fd;', '&#x1f575;&#x1f3fe;', '&#x1f575;&#x1f3ff;', '&#x1f57a;&#x1f3fb;', '&#x1f57a;&#x1f3fc;', '&#x1f57a;&#x1f3fd;', '&#x1f57a;&#x1f3fe;', '&#x1f57a;&#x1f3ff;', '&#x1f590;&#x1f3fb;', '&#x1f590;&#x1f3fc;', '&#x1f590;&#x1f3fd;', '&#x1f590;&#x1f3fe;', '&#x1f590;&#x1f3ff;', '&#x1f595;&#x1f3fb;', '&#x1f595;&#x1f3fc;', '&#x1f595;&#x1f3fd;', '&#x1f595;&#x1f3fe;', '&#x1f595;&#x1f3ff;', '&#x1f596;&#x1f3fb;', '&#x1f596;&#x1f3fc;', '&#x1f596;&#x1f3fd;', '&#x1f596;&#x1f3fe;', '&#x1f596;&#x1f3ff;', '&#x1f645;&#x1f3fb;', '&#x1f645;&#x1f3fc;', '&#x1f645;&#x1f3fd;', '&#x1f645;&#x1f3fe;', '&#x1f645;&#x1f3ff;', '&#x1f646;&#x1f3fb;', '&#x1f646;&#x1f3fc;', '&#x1f646;&#x1f3fd;', '&#x1f646;&#x1f3fe;', '&#x1f646;&#x1f3ff;', '&#x1f647;&#x1f3fb;', '&#x1f647;&#x1f3fc;', '&#x1f647;&#x1f3fd;', '&#x1f647;&#x1f3fe;', '&#x1f647;&#x1f3ff;', '&#x1f64b;&#x1f3fb;', '&#x1f64b;&#x1f3fc;', '&#x1f64b;&#x1f3fd;', '&#x1f64b;&#x1f3fe;', '&#x1f64b;&#x1f3ff;', '&#x1f64c;&#x1f3fb;', '&#x1f64c;&#x1f3fc;', '&#x1f64c;&#x1f3fd;', '&#x1f64c;&#x1f3fe;', '&#x1f64c;&#x1f3ff;', '&#x1f64d;&#x1f3fb;', '&#x1f64d;&#x1f3fc;', '&#x1f64d;&#x1f3fd;', '&#x1f64d;&#x1f3fe;', '&#x1f64d;&#x1f3ff;', '&#x1f64e;&#x1f3fb;', '&#x1f64e;&#x1f3fc;', '&#x1f64e;&#x1f3fd;', '&#x1f64e;&#x1f3fe;', '&#x1f64e;&#x1f3ff;', '&#x1f64f;&#x1f3fb;', '&#x1f64f;&#x1f3fc;', '&#x1f64f;&#x1f3fd;', '&#x1f64f;&#x1f3fe;', '&#x1f64f;&#x1f3ff;', '&#x1f6a3;&#x1f3fb;', '&#x1f6a3;&#x1f3fc;', '&#x1f6a3;&#x1f3fd;', '&#x1f6a3;&#x1f3fe;', '&#x1f6a3;&#x1f3ff;', '&#x1f6b4;&#x1f3fb;', '&#x1f6b4;&#x1f3fc;', '&#x1f6b4;&#x1f3fd;', '&#x1f6b4;&#x1f3fe;', '&#x1f6b4;&#x1f3ff;', '&#x1f6b5;&#x1f3fb;', '&#x1f6b5;&#x1f3fc;', '&#x1f6b5;&#x1f3fd;', '&#x1f6b5;&#x1f3fe;', '&#x1f6b5;&#x1f3ff;', '&#x1f6b6;&#x1f3fb;', '&#x1f6b6;&#x1f3fc;', '&#x1f6b6;&#x1f3fd;', '&#x1f6b6;&#x1f3fe;', '&#x1f6b6;&#x1f3ff;', '&#x1f6c0;&#x1f3fb;', '&#x1f6c0;&#x1f3fc;', '&#x1f6c0;&#x1f3fd;', '&#x1f6c0;&#x1f3fe;', '&#x1f6c0;&#x1f3ff;', '&#x1f6cc;&#x1f3fb;', '&#x1f6cc;&#x1f3fc;', '&#x1f6cc;&#x1f3fd;', '&#x1f6cc;&#x1f3fe;', '&#x1f6cc;&#x1f3ff;', '&#x1f90c;&#x1f3fb;', '&#x1f90c;&#x1f3fc;', '&#x1f90c;&#x1f3fd;', '&#x1f90c;&#x1f3fe;', '&#x1f90c;&#x1f3ff;', '&#x1f90f;&#x1f3fb;', '&#x1f90f;&#x1f3fc;', '&#x1f90f;&#x1f3fd;', '&#x1f90f;&#x1f3fe;', '&#x1f90f;&#x1f3ff;', '&#x1f918;&#x1f3fb;', '&#x1f918;&#x1f3fc;', '&#x1f918;&#x1f3fd;', '&#x1f918;&#x1f3fe;', '&#x1f918;&#x1f3ff;', '&#x1f919;&#x1f3fb;', '&#x1f919;&#x1f3fc;', '&#x1f919;&#x1f3fd;', '&#x1f919;&#x1f3fe;', '&#x1f919;&#x1f3ff;', '&#x1f91a;&#x1f3fb;', '&#x1f91a;&#x1f3fc;', '&#x1f91a;&#x1f3fd;', '&#x1f91a;&#x1f3fe;', '&#x1f91a;&#x1f3ff;', '&#x1f91b;&#x1f3fb;', '&#x1f91b;&#x1f3fc;', '&#x1f91b;&#x1f3fd;', '&#x1f91b;&#x1f3fe;', '&#x1f91b;&#x1f3ff;', '&#x1f91c;&#x1f3fb;', '&#x1f91c;&#x1f3fc;', '&#x1f91c;&#x1f3fd;', '&#x1f91c;&#x1f3fe;', '&#x1f91c;&#x1f3ff;', '&#x1f91e;&#x1f3fb;', '&#x1f91e;&#x1f3fc;', '&#x1f91e;&#x1f3fd;', '&#x1f91e;&#x1f3fe;', '&#x1f91e;&#x1f3ff;', '&#x1f91f;&#x1f3fb;', '&#x1f91f;&#x1f3fc;', '&#x1f91f;&#x1f3fd;', '&#x1f91f;&#x1f3fe;', '&#x1f91f;&#x1f3ff;', '&#x1f926;&#x1f3fb;', '&#x1f926;&#x1f3fc;', '&#x1f926;&#x1f3fd;', '&#x1f926;&#x1f3fe;', '&#x1f926;&#x1f3ff;', '&#x1f930;&#x1f3fb;', '&#x1f930;&#x1f3fc;', '&#x1f930;&#x1f3fd;', '&#x1f930;&#x1f3fe;', '&#x1f930;&#x1f3ff;', '&#x1f931;&#x1f3fb;', '&#x1f931;&#x1f3fc;', '&#x1f931;&#x1f3fd;', '&#x1f931;&#x1f3fe;', '&#x1f931;&#x1f3ff;', '&#x1f932;&#x1f3fb;', '&#x1f932;&#x1f3fc;', '&#x1f932;&#x1f3fd;', '&#x1f932;&#x1f3fe;', '&#x1f932;&#x1f3ff;', '&#x1f933;&#x1f3fb;', '&#x1f933;&#x1f3fc;', '&#x1f933;&#x1f3fd;', '&#x1f933;&#x1f3fe;', '&#x1f933;&#x1f3ff;', '&#x1f934;&#x1f3fb;', '&#x1f934;&#x1f3fc;', '&#x1f934;&#x1f3fd;', '&#x1f934;&#x1f3fe;', '&#x1f934;&#x1f3ff;', '&#x1f935;&#x1f3fb;', '&#x1f935;&#x1f3fc;', '&#x1f935;&#x1f3fd;', '&#x1f935;&#x1f3fe;', '&#x1f935;&#x1f3ff;', '&#x1f936;&#x1f3fb;', '&#x1f936;&#x1f3fc;', '&#x1f936;&#x1f3fd;', '&#x1f936;&#x1f3fe;', '&#x1f936;&#x1f3ff;', '&#x1f937;&#x1f3fb;', '&#x1f937;&#x1f3fc;', '&#x1f937;&#x1f3fd;', '&#x1f937;&#x1f3fe;', '&#x1f937;&#x1f3ff;', '&#x1f938;&#x1f3fb;', '&#x1f938;&#x1f3fc;', '&#x1f938;&#x1f3fd;', '&#x1f938;&#x1f3fe;', '&#x1f938;&#x1f3ff;', '&#x1f939;&#x1f3fb;', '&#x1f939;&#x1f3fc;', '&#x1f939;&#x1f3fd;', '&#x1f939;&#x1f3fe;', '&#x1f939;&#x1f3ff;', '&#x1f93d;&#x1f3fb;', '&#x1f93d;&#x1f3fc;', '&#x1f93d;&#x1f3fd;', '&#x1f93d;&#x1f3fe;', '&#x1f93d;&#x1f3ff;', '&#x1f93e;&#x1f3fb;', '&#x1f93e;&#x1f3fc;', '&#x1f93e;&#x1f3fd;', '&#x1f93e;&#x1f3fe;', '&#x1f93e;&#x1f3ff;', '&#x1f977;&#x1f3fb;', '&#x1f977;&#x1f3fc;', '&#x1f977;&#x1f3fd;', '&#x1f977;&#x1f3fe;', '&#x1f977;&#x1f3ff;', '&#x1f9b5;&#x1f3fb;', '&#x1f9b5;&#x1f3fc;', '&#x1f9b5;&#x1f3fd;', '&#x1f9b5;&#x1f3fe;', '&#x1f9b5;&#x1f3ff;', '&#x1f9b6;&#x1f3fb;', '&#x1f9b6;&#x1f3fc;', '&#x1f9b6;&#x1f3fd;', '&#x1f9b6;&#x1f3fe;', '&#x1f9b6;&#x1f3ff;', '&#x1f9b8;&#x1f3fb;', '&#x1f9b8;&#x1f3fc;', '&#x1f9b8;&#x1f3fd;', '&#x1f9b8;&#x1f3fe;', '&#x1f9b8;&#x1f3ff;', '&#x1f9b9;&#x1f3fb;', '&#x1f9b9;&#x1f3fc;', '&#x1f9b9;&#x1f3fd;', '&#x1f9b9;&#x1f3fe;', '&#x1f9b9;&#x1f3ff;', '&#x1f9bb;&#x1f3fb;', '&#x1f9bb;&#x1f3fc;', '&#x1f9bb;&#x1f3fd;', '&#x1f9bb;&#x1f3fe;', '&#x1f9bb;&#x1f3ff;', '&#x1f9cd;&#x1f3fb;', '&#x1f9cd;&#x1f3fc;', '&#x1f9cd;&#x1f3fd;', '&#x1f9cd;&#x1f3fe;', '&#x1f9cd;&#x1f3ff;', '&#x1f9ce;&#x1f3fb;', '&#x1f9ce;&#x1f3fc;', '&#x1f9ce;&#x1f3fd;', '&#x1f9ce;&#x1f3fe;', '&#x1f9ce;&#x1f3ff;', '&#x1f9cf;&#x1f3fb;', '&#x1f9cf;&#x1f3fc;', '&#x1f9cf;&#x1f3fd;', '&#x1f9cf;&#x1f3fe;', '&#x1f9cf;&#x1f3ff;', '&#x1f9d1;&#x1f3fb;', '&#x1f9d1;&#x1f3fc;', '&#x1f9d1;&#x1f3fd;', '&#x1f9d1;&#x1f3fe;', '&#x1f9d1;&#x1f3ff;', '&#x1f9d2;&#x1f3fb;', '&#x1f9d2;&#x1f3fc;', '&#x1f9d2;&#x1f3fd;', '&#x1f9d2;&#x1f3fe;', '&#x1f9d2;&#x1f3ff;', '&#x1f9d3;&#x1f3fb;', '&#x1f9d3;&#x1f3fc;', '&#x1f9d3;&#x1f3fd;', '&#x1f9d3;&#x1f3fe;', '&#x1f9d3;&#x1f3ff;', '&#x1f9d4;&#x1f3fb;', '&#x1f9d4;&#x1f3fc;', '&#x1f9d4;&#x1f3fd;', '&#x1f9d4;&#x1f3fe;', '&#x1f9d4;&#x1f3ff;', '&#x1f9d5;&#x1f3fb;', '&#x1f9d5;&#x1f3fc;', '&#x1f9d5;&#x1f3fd;', '&#x1f9d5;&#x1f3fe;', '&#x1f9d5;&#x1f3ff;', '&#x1f9d6;&#x1f3fb;', '&#x1f9d6;&#x1f3fc;', '&#x1f9d6;&#x1f3fd;', '&#x1f9d6;&#x1f3fe;', '&#x1f9d6;&#x1f3ff;', '&#x1f9d7;&#x1f3fb;', '&#x1f9d7;&#x1f3fc;', '&#x1f9d7;&#x1f3fd;', '&#x1f9d7;&#x1f3fe;', '&#x1f9d7;&#x1f3ff;', '&#x1f9d8;&#x1f3fb;', '&#x1f9d8;&#x1f3fc;', '&#x1f9d8;&#x1f3fd;', '&#x1f9d8;&#x1f3fe;', '&#x1f9d8;&#x1f3ff;', '&#x1f9d9;&#x1f3fb;', '&#x1f9d9;&#x1f3fc;', '&#x1f9d9;&#x1f3fd;', '&#x1f9d9;&#x1f3fe;', '&#x1f9d9;&#x1f3ff;', '&#x1f9da;&#x1f3fb;', '&#x1f9da;&#x1f3fc;', '&#x1f9da;&#x1f3fd;', '&#x1f9da;&#x1f3fe;', '&#x1f9da;&#x1f3ff;', '&#x1f9db;&#x1f3fb;', '&#x1f9db;&#x1f3fc;', '&#x1f9db;&#x1f3fd;', '&#x1f9db;&#x1f3fe;', '&#x1f9db;&#x1f3ff;', '&#x1f9dc;&#x1f3fb;', '&#x1f9dc;&#x1f3fc;', '&#x1f9dc;&#x1f3fd;', '&#x1f9dc;&#x1f3fe;', '&#x1f9dc;&#x1f3ff;', '&#x1f9dd;&#x1f3fb;', '&#x1f9dd;&#x1f3fc;', '&#x1f9dd;&#x1f3fd;', '&#x1f9dd;&#x1f3fe;', '&#x1f9dd;&#x1f3ff;', '&#x261d;&#x1f3fb;', '&#x261d;&#x1f3fc;', '&#x261d;&#x1f3fd;', '&#x261d;&#x1f3fe;', '&#x261d;&#x1f3ff;', '&#x26f7;&#x1f3fb;', '&#x26f7;&#x1f3fc;', '&#x26f7;&#x1f3fd;', '&#x26f7;&#x1f3fe;', '&#x26f7;&#x1f3ff;', '&#x26f9;&#x1f3fb;', '&#x26f9;&#x1f3fc;', '&#x26f9;&#x1f3fd;', '&#x26f9;&#x1f3fe;', '&#x26f9;&#x1f3ff;', '&#x270a;&#x1f3fb;', '&#x270a;&#x1f3fc;', '&#x270a;&#x1f3fd;', '&#x270a;&#x1f3fe;', '&#x270a;&#x1f3ff;', '&#x270b;&#x1f3fb;', '&#x270b;&#x1f3fc;', '&#x270b;&#x1f3fd;', '&#x270b;&#x1f3fe;', '&#x270b;&#x1f3ff;', '&#x270c;&#x1f3fb;', '&#x270c;&#x1f3fc;', '&#x270c;&#x1f3fd;', '&#x270c;&#x1f3fe;', '&#x270c;&#x1f3ff;', '&#x270d;&#x1f3fb;', '&#x270d;&#x1f3fc;', '&#x270d;&#x1f3fd;', '&#x270d;&#x1f3fe;', '&#x270d;&#x1f3ff;', '&#x23;&#x20e3;', '&#x2a;&#x20e3;', '&#x30;&#x20e3;', '&#x31;&#x20e3;', '&#x32;&#x20e3;', '&#x33;&#x20e3;', '&#x34;&#x20e3;', '&#x35;&#x20e3;', '&#x36;&#x20e3;', '&#x37;&#x20e3;', '&#x38;&#x20e3;', '&#x39;&#x20e3;', '&#x1f004;', '&#x1f0cf;', '&#x1f170;', '&#x1f171;', '&#x1f17e;', '&#x1f17f;', '&#x1f18e;', '&#x1f191;', '&#x1f192;', '&#x1f193;', '&#x1f194;', '&#x1f195;', '&#x1f196;', '&#x1f197;', '&#x1f198;', '&#x1f199;', '&#x1f19a;', '&#x1f1e6;', '&#x1f1e7;', '&#x1f1e8;', '&#x1f1e9;', '&#x1f1ea;', '&#x1f1eb;', '&#x1f1ec;', '&#x1f1ed;', '&#x1f1ee;', '&#x1f1ef;', '&#x1f1f0;', '&#x1f1f1;', '&#x1f1f2;', '&#x1f1f3;', '&#x1f1f4;', '&#x1f1f5;', '&#x1f1f6;', '&#x1f1f7;', '&#x1f1f8;', '&#x1f1f9;', '&#x1f1fa;', '&#x1f1fb;', '&#x1f1fc;', '&#x1f1fd;', '&#x1f1fe;', '&#x1f1ff;', '&#x1f201;', '&#x1f202;', '&#x1f21a;', '&#x1f22f;', '&#x1f232;', '&#x1f233;', '&#x1f234;', '&#x1f235;', '&#x1f236;', '&#x1f237;', '&#x1f238;', '&#x1f239;', '&#x1f23a;', '&#x1f250;', '&#x1f251;', '&#x1f300;', '&#x1f301;', '&#x1f302;', '&#x1f303;', '&#x1f304;', '&#x1f305;', '&#x1f306;', '&#x1f307;', '&#x1f308;', '&#x1f309;', '&#x1f30a;', '&#x1f30b;', '&#x1f30c;', '&#x1f30d;', '&#x1f30e;', '&#x1f30f;', '&#x1f310;', '&#x1f311;', '&#x1f312;', '&#x1f313;', '&#x1f314;', '&#x1f315;', '&#x1f316;', '&#x1f317;', '&#x1f318;', '&#x1f319;', '&#x1f31a;', '&#x1f31b;', '&#x1f31c;', '&#x1f31d;', '&#x1f31e;', '&#x1f31f;', '&#x1f320;', '&#x1f321;', '&#x1f324;', '&#x1f325;', '&#x1f326;', '&#x1f327;', '&#x1f328;', '&#x1f329;', '&#x1f32a;', '&#x1f32b;', '&#x1f32c;', '&#x1f32d;', '&#x1f32e;', '&#x1f32f;', '&#x1f330;', '&#x1f331;', '&#x1f332;', '&#x1f333;', '&#x1f334;', '&#x1f335;', '&#x1f336;', '&#x1f337;', '&#x1f338;', '&#x1f339;', '&#x1f33a;', '&#x1f33b;', '&#x1f33c;', '&#x1f33d;', '&#x1f33e;', '&#x1f33f;', '&#x1f340;', '&#x1f341;', '&#x1f342;', '&#x1f343;', '&#x1f344;', '&#x1f345;', '&#x1f346;', '&#x1f347;', '&#x1f348;', '&#x1f349;', '&#x1f34a;', '&#x1f34b;', '&#x1f34c;', '&#x1f34d;', '&#x1f34e;', '&#x1f34f;', '&#x1f350;', '&#x1f351;', '&#x1f352;', '&#x1f353;', '&#x1f354;', '&#x1f355;', '&#x1f356;', '&#x1f357;', '&#x1f358;', '&#x1f359;', '&#x1f35a;', '&#x1f35b;', '&#x1f35c;', '&#x1f35d;', '&#x1f35e;', '&#x1f35f;', '&#x1f360;', '&#x1f361;', '&#x1f362;', '&#x1f363;', '&#x1f364;', '&#x1f365;', '&#x1f366;', '&#x1f367;', '&#x1f368;', '&#x1f369;', '&#x1f36a;', '&#x1f36b;', '&#x1f36c;', '&#x1f36d;', '&#x1f36e;', '&#x1f36f;', '&#x1f370;', '&#x1f371;', '&#x1f372;', '&#x1f373;', '&#x1f374;', '&#x1f375;', '&#x1f376;', '&#x1f377;', '&#x1f378;', '&#x1f379;', '&#x1f37a;', '&#x1f37b;', '&#x1f37c;', '&#x1f37d;', '&#x1f37e;', '&#x1f37f;', '&#x1f380;', '&#x1f381;', '&#x1f382;', '&#x1f383;', '&#x1f384;', '&#x1f385;', '&#x1f386;', '&#x1f387;', '&#x1f388;', '&#x1f389;', '&#x1f38a;', '&#x1f38b;', '&#x1f38c;', '&#x1f38d;', '&#x1f38e;', '&#x1f38f;', '&#x1f390;', '&#x1f391;', '&#x1f392;', '&#x1f393;', '&#x1f396;', '&#x1f397;', '&#x1f399;', '&#x1f39a;', '&#x1f39b;', '&#x1f39e;', '&#x1f39f;', '&#x1f3a0;', '&#x1f3a1;', '&#x1f3a2;', '&#x1f3a3;', '&#x1f3a4;', '&#x1f3a5;', '&#x1f3a6;', '&#x1f3a7;', '&#x1f3a8;', '&#x1f3a9;', '&#x1f3aa;', '&#x1f3ab;', '&#x1f3ac;', '&#x1f3ad;', '&#x1f3ae;', '&#x1f3af;', '&#x1f3b0;', '&#x1f3b1;', '&#x1f3b2;', '&#x1f3b3;', '&#x1f3b4;', '&#x1f3b5;', '&#x1f3b6;', '&#x1f3b7;', '&#x1f3b8;', '&#x1f3b9;', '&#x1f3ba;', '&#x1f3bb;', '&#x1f3bc;', '&#x1f3bd;', '&#x1f3be;', '&#x1f3bf;', '&#x1f3c0;', '&#x1f3c1;', '&#x1f3c2;', '&#x1f3c3;', '&#x1f3c4;', '&#x1f3c5;', '&#x1f3c6;', '&#x1f3c7;', '&#x1f3c8;', '&#x1f3c9;', '&#x1f3ca;', '&#x1f3cb;', '&#x1f3cc;', '&#x1f3cd;', '&#x1f3ce;', '&#x1f3cf;', '&#x1f3d0;', '&#x1f3d1;', '&#x1f3d2;', '&#x1f3d3;', '&#x1f3d4;', '&#x1f3d5;', '&#x1f3d6;', '&#x1f3d7;', '&#x1f3d8;', '&#x1f3d9;', '&#x1f3da;', '&#x1f3db;', '&#x1f3dc;', '&#x1f3dd;', '&#x1f3de;', '&#x1f3df;', '&#x1f3e0;', '&#x1f3e1;', '&#x1f3e2;', '&#x1f3e3;', '&#x1f3e4;', '&#x1f3e5;', '&#x1f3e6;', '&#x1f3e7;', '&#x1f3e8;', '&#x1f3e9;', '&#x1f3ea;', '&#x1f3eb;', '&#x1f3ec;', '&#x1f3ed;', '&#x1f3ee;', '&#x1f3ef;', '&#x1f3f0;', '&#x1f3f3;', '&#x1f3f4;', '&#x1f3f5;', '&#x1f3f7;', '&#x1f3f8;', '&#x1f3f9;', '&#x1f3fa;', '&#x1f3fb;', '&#x1f3fc;', '&#x1f3fd;', '&#x1f3fe;', '&#x1f3ff;', '&#x1f400;', '&#x1f401;', '&#x1f402;', '&#x1f403;', '&#x1f404;', '&#x1f405;', '&#x1f406;', '&#x1f407;', '&#x1f408;', '&#x1f409;', '&#x1f40a;', '&#x1f40b;', '&#x1f40c;', '&#x1f40d;', '&#x1f40e;', '&#x1f40f;', '&#x1f410;', '&#x1f411;', '&#x1f412;', '&#x1f413;', '&#x1f414;', '&#x1f415;', '&#x1f416;', '&#x1f417;', '&#x1f418;', '&#x1f419;', '&#x1f41a;', '&#x1f41b;', '&#x1f41c;', '&#x1f41d;', '&#x1f41e;', '&#x1f41f;', '&#x1f420;', '&#x1f421;', '&#x1f422;', '&#x1f423;', '&#x1f424;', '&#x1f425;', '&#x1f426;', '&#x1f427;', '&#x1f428;', '&#x1f429;', '&#x1f42a;', '&#x1f42b;', '&#x1f42c;', '&#x1f42d;', '&#x1f42e;', '&#x1f42f;', '&#x1f430;', '&#x1f431;', '&#x1f432;', '&#x1f433;', '&#x1f434;', '&#x1f435;', '&#x1f436;', '&#x1f437;', '&#x1f438;', '&#x1f439;', '&#x1f43a;', '&#x1f43b;', '&#x1f43c;', '&#x1f43d;', '&#x1f43e;', '&#x1f43f;', '&#x1f440;', '&#x1f441;', '&#x1f442;', '&#x1f443;', '&#x1f444;', '&#x1f445;', '&#x1f446;', '&#x1f447;', '&#x1f448;', '&#x1f449;', '&#x1f44a;', '&#x1f44b;', '&#x1f44c;', '&#x1f44d;', '&#x1f44e;', '&#x1f44f;', '&#x1f450;', '&#x1f451;', '&#x1f452;', '&#x1f453;', '&#x1f454;', '&#x1f455;', '&#x1f456;', '&#x1f457;', '&#x1f458;', '&#x1f459;', '&#x1f45a;', '&#x1f45b;', '&#x1f45c;', '&#x1f45d;', '&#x1f45e;', '&#x1f45f;', '&#x1f460;', '&#x1f461;', '&#x1f462;', '&#x1f463;', '&#x1f464;', '&#x1f465;', '&#x1f466;', '&#x1f467;', '&#x1f468;', '&#x1f469;', '&#x1f46a;', '&#x1f46b;', '&#x1f46c;', '&#x1f46d;', '&#x1f46e;', '&#x1f46f;', '&#x1f470;', '&#x1f471;', '&#x1f472;', '&#x1f473;', '&#x1f474;', '&#x1f475;', '&#x1f476;', '&#x1f477;', '&#x1f478;', '&#x1f479;', '&#x1f47a;', '&#x1f47b;', '&#x1f47c;', '&#x1f47d;', '&#x1f47e;', '&#x1f47f;', '&#x1f480;', '&#x1f481;', '&#x1f482;', '&#x1f483;', '&#x1f484;', '&#x1f485;', '&#x1f486;', '&#x1f487;', '&#x1f488;', '&#x1f489;', '&#x1f48a;', '&#x1f48b;', '&#x1f48c;', '&#x1f48d;', '&#x1f48e;', '&#x1f48f;', '&#x1f490;', '&#x1f491;', '&#x1f492;', '&#x1f493;', '&#x1f494;', '&#x1f495;', '&#x1f496;', '&#x1f497;', '&#x1f498;', '&#x1f499;', '&#x1f49a;', '&#x1f49b;', '&#x1f49c;', '&#x1f49d;', '&#x1f49e;', '&#x1f49f;', '&#x1f4a0;', '&#x1f4a1;', '&#x1f4a2;', '&#x1f4a3;', '&#x1f4a4;', '&#x1f4a5;', '&#x1f4a6;', '&#x1f4a7;', '&#x1f4a8;', '&#x1f4a9;', '&#x1f4aa;', '&#x1f4ab;', '&#x1f4ac;', '&#x1f4ad;', '&#x1f4ae;', '&#x1f4af;', '&#x1f4b0;', '&#x1f4b1;', '&#x1f4b2;', '&#x1f4b3;', '&#x1f4b4;', '&#x1f4b5;', '&#x1f4b6;', '&#x1f4b7;', '&#x1f4b8;', '&#x1f4b9;', '&#x1f4ba;', '&#x1f4bb;', '&#x1f4bc;', '&#x1f4bd;', '&#x1f4be;', '&#x1f4bf;', '&#x1f4c0;', '&#x1f4c1;', '&#x1f4c2;', '&#x1f4c3;', '&#x1f4c4;', '&#x1f4c5;', '&#x1f4c6;', '&#x1f4c7;', '&#x1f4c8;', '&#x1f4c9;', '&#x1f4ca;', '&#x1f4cb;', '&#x1f4cc;', '&#x1f4cd;', '&#x1f4ce;', '&#x1f4cf;', '&#x1f4d0;', '&#x1f4d1;', '&#x1f4d2;', '&#x1f4d3;', '&#x1f4d4;', '&#x1f4d5;', '&#x1f4d6;', '&#x1f4d7;', '&#x1f4d8;', '&#x1f4d9;', '&#x1f4da;', '&#x1f4db;', '&#x1f4dc;', '&#x1f4dd;', '&#x1f4de;', '&#x1f4df;', '&#x1f4e0;', '&#x1f4e1;', '&#x1f4e2;', '&#x1f4e3;', '&#x1f4e4;', '&#x1f4e5;', '&#x1f4e6;', '&#x1f4e7;', '&#x1f4e8;', '&#x1f4e9;', '&#x1f4ea;', '&#x1f4eb;', '&#x1f4ec;', '&#x1f4ed;', '&#x1f4ee;', '&#x1f4ef;', '&#x1f4f0;', '&#x1f4f1;', '&#x1f4f2;', '&#x1f4f3;', '&#x1f4f4;', '&#x1f4f5;', '&#x1f4f6;', '&#x1f4f7;', '&#x1f4f8;', '&#x1f4f9;', '&#x1f4fa;', '&#x1f4fb;', '&#x1f4fc;', '&#x1f4fd;', '&#x1f4ff;', '&#x1f500;', '&#x1f501;', '&#x1f502;', '&#x1f503;', '&#x1f504;', '&#x1f505;', '&#x1f506;', '&#x1f507;', '&#x1f508;', '&#x1f509;', '&#x1f50a;', '&#x1f50b;', '&#x1f50c;', '&#x1f50d;', '&#x1f50e;', '&#x1f50f;', '&#x1f510;', '&#x1f511;', '&#x1f512;', '&#x1f513;', '&#x1f514;', '&#x1f515;', '&#x1f516;', '&#x1f517;', '&#x1f518;', '&#x1f519;', '&#x1f51a;', '&#x1f51b;', '&#x1f51c;', '&#x1f51d;', '&#x1f51e;', '&#x1f51f;', '&#x1f520;', '&#x1f521;', '&#x1f522;', '&#x1f523;', '&#x1f524;', '&#x1f525;', '&#x1f526;', '&#x1f527;', '&#x1f528;', '&#x1f529;', '&#x1f52a;', '&#x1f52b;', '&#x1f52c;', '&#x1f52d;', '&#x1f52e;', '&#x1f52f;', '&#x1f530;', '&#x1f531;', '&#x1f532;', '&#x1f533;', '&#x1f534;', '&#x1f535;', '&#x1f536;', '&#x1f537;', '&#x1f538;', '&#x1f539;', '&#x1f53a;', '&#x1f53b;', '&#x1f53c;', '&#x1f53d;', '&#x1f549;', '&#x1f54a;', '&#x1f54b;', '&#x1f54c;', '&#x1f54d;', '&#x1f54e;', '&#x1f550;', '&#x1f551;', '&#x1f552;', '&#x1f553;', '&#x1f554;', '&#x1f555;', '&#x1f556;', '&#x1f557;', '&#x1f558;', '&#x1f559;', '&#x1f55a;', '&#x1f55b;', '&#x1f55c;', '&#x1f55d;', '&#x1f55e;', '&#x1f55f;', '&#x1f560;', '&#x1f561;', '&#x1f562;', '&#x1f563;', '&#x1f564;', '&#x1f565;', '&#x1f566;', '&#x1f567;', '&#x1f56f;', '&#x1f570;', '&#x1f573;', '&#x1f574;', '&#x1f575;', '&#x1f576;', '&#x1f577;', '&#x1f578;', '&#x1f579;', '&#x1f57a;', '&#x1f587;', '&#x1f58a;', '&#x1f58b;', '&#x1f58c;', '&#x1f58d;', '&#x1f590;', '&#x1f595;', '&#x1f596;', '&#x1f5a4;', '&#x1f5a5;', '&#x1f5a8;', '&#x1f5b1;', '&#x1f5b2;', '&#x1f5bc;', '&#x1f5c2;', '&#x1f5c3;', '&#x1f5c4;', '&#x1f5d1;', '&#x1f5d2;', '&#x1f5d3;', '&#x1f5dc;', '&#x1f5dd;', '&#x1f5de;', '&#x1f5e1;', '&#x1f5e3;', '&#x1f5e8;', '&#x1f5ef;', '&#x1f5f3;', '&#x1f5fa;', '&#x1f5fb;', '&#x1f5fc;', '&#x1f5fd;', '&#x1f5fe;', '&#x1f5ff;', '&#x1f600;', '&#x1f601;', '&#x1f602;', '&#x1f603;', '&#x1f604;', '&#x1f605;', '&#x1f606;', '&#x1f607;', '&#x1f608;', '&#x1f609;', '&#x1f60a;', '&#x1f60b;', '&#x1f60c;', '&#x1f60d;', '&#x1f60e;', '&#x1f60f;', '&#x1f610;', '&#x1f611;', '&#x1f612;', '&#x1f613;', '&#x1f614;', '&#x1f615;', '&#x1f616;', '&#x1f617;', '&#x1f618;', '&#x1f619;', '&#x1f61a;', '&#x1f61b;', '&#x1f61c;', '&#x1f61d;', '&#x1f61e;', '&#x1f61f;', '&#x1f620;', '&#x1f621;', '&#x1f622;', '&#x1f623;', '&#x1f624;', '&#x1f625;', '&#x1f626;', '&#x1f627;', '&#x1f628;', '&#x1f629;', '&#x1f62a;', '&#x1f62b;', '&#x1f62c;', '&#x1f62d;', '&#x1f62e;', '&#x1f62f;', '&#x1f630;', '&#x1f631;', '&#x1f632;', '&#x1f633;', '&#x1f634;', '&#x1f635;', '&#x1f636;', '&#x1f637;', '&#x1f638;', '&#x1f639;', '&#x1f63a;', '&#x1f63b;', '&#x1f63c;', '&#x1f63d;', '&#x1f63e;', '&#x1f63f;', '&#x1f640;', '&#x1f641;', '&#x1f642;', '&#x1f643;', '&#x1f644;', '&#x1f645;', '&#x1f646;', '&#x1f647;', '&#x1f648;', '&#x1f649;', '&#x1f64a;', '&#x1f64b;', '&#x1f64c;', '&#x1f64d;', '&#x1f64e;', '&#x1f64f;', '&#x1f680;', '&#x1f681;', '&#x1f682;', '&#x1f683;', '&#x1f684;', '&#x1f685;', '&#x1f686;', '&#x1f687;', '&#x1f688;', '&#x1f689;', '&#x1f68a;', '&#x1f68b;', '&#x1f68c;', '&#x1f68d;', '&#x1f68e;', '&#x1f68f;', '&#x1f690;', '&#x1f691;', '&#x1f692;', '&#x1f693;', '&#x1f694;', '&#x1f695;', '&#x1f696;', '&#x1f697;', '&#x1f698;', '&#x1f699;', '&#x1f69a;', '&#x1f69b;', '&#x1f69c;', '&#x1f69d;', '&#x1f69e;', '&#x1f69f;', '&#x1f6a0;', '&#x1f6a1;', '&#x1f6a2;', '&#x1f6a3;', '&#x1f6a4;', '&#x1f6a5;', '&#x1f6a6;', '&#x1f6a7;', '&#x1f6a8;', '&#x1f6a9;', '&#x1f6aa;', '&#x1f6ab;', '&#x1f6ac;', '&#x1f6ad;', '&#x1f6ae;', '&#x1f6af;', '&#x1f6b0;', '&#x1f6b1;', '&#x1f6b2;', '&#x1f6b3;', '&#x1f6b4;', '&#x1f6b5;', '&#x1f6b6;', '&#x1f6b7;', '&#x1f6b8;', '&#x1f6b9;', '&#x1f6ba;', '&#x1f6bb;', '&#x1f6bc;', '&#x1f6bd;', '&#x1f6be;', '&#x1f6bf;', '&#x1f6c0;', '&#x1f6c1;', '&#x1f6c2;', '&#x1f6c3;', '&#x1f6c4;', '&#x1f6c5;', '&#x1f6cb;', '&#x1f6cc;', '&#x1f6cd;', '&#x1f6ce;', '&#x1f6cf;', '&#x1f6d0;', '&#x1f6d1;', '&#x1f6d2;', '&#x1f6d5;', '&#x1f6d6;', '&#x1f6d7;', '&#x1f6e0;', '&#x1f6e1;', '&#x1f6e2;', '&#x1f6e3;', '&#x1f6e4;', '&#x1f6e5;', '&#x1f6e9;', '&#x1f6eb;', '&#x1f6ec;', '&#x1f6f0;', '&#x1f6f3;', '&#x1f6f4;', '&#x1f6f5;', '&#x1f6f6;', '&#x1f6f7;', '&#x1f6f8;', '&#x1f6f9;', '&#x1f6fa;', '&#x1f6fb;', '&#x1f6fc;', '&#x1f7e0;', '&#x1f7e1;', '&#x1f7e2;', '&#x1f7e3;', '&#x1f7e4;', '&#x1f7e5;', '&#x1f7e6;', '&#x1f7e7;', '&#x1f7e8;', '&#x1f7e9;', '&#x1f7ea;', '&#x1f7eb;', '&#x1f90c;', '&#x1f90d;', '&#x1f90e;', '&#x1f90f;', '&#x1f910;', '&#x1f911;', '&#x1f912;', '&#x1f913;', '&#x1f914;', '&#x1f915;', '&#x1f916;', '&#x1f917;', '&#x1f918;', '&#x1f919;', '&#x1f91a;', '&#x1f91b;', '&#x1f91c;', '&#x1f91d;', '&#x1f91e;', '&#x1f91f;', '&#x1f920;', '&#x1f921;', '&#x1f922;', '&#x1f923;', '&#x1f924;', '&#x1f925;', '&#x1f926;', '&#x1f927;', '&#x1f928;', '&#x1f929;', '&#x1f92a;', '&#x1f92b;', '&#x1f92c;', '&#x1f92d;', '&#x1f92e;', '&#x1f92f;', '&#x1f930;', '&#x1f931;', '&#x1f932;', '&#x1f933;', '&#x1f934;', '&#x1f935;', '&#x1f936;', '&#x1f937;', '&#x1f938;', '&#x1f939;', '&#x1f93a;', '&#x1f93c;', '&#x1f93d;', '&#x1f93e;', '&#x1f93f;', '&#x1f940;', '&#x1f941;', '&#x1f942;', '&#x1f943;', '&#x1f944;', '&#x1f945;', '&#x1f947;', '&#x1f948;', '&#x1f949;', '&#x1f94a;', '&#x1f94b;', '&#x1f94c;', '&#x1f94d;', '&#x1f94e;', '&#x1f94f;', '&#x1f950;', '&#x1f951;', '&#x1f952;', '&#x1f953;', '&#x1f954;', '&#x1f955;', '&#x1f956;', '&#x1f957;', '&#x1f958;', '&#x1f959;', '&#x1f95a;', '&#x1f95b;', '&#x1f95c;', '&#x1f95d;', '&#x1f95e;', '&#x1f95f;', '&#x1f960;', '&#x1f961;', '&#x1f962;', '&#x1f963;', '&#x1f964;', '&#x1f965;', '&#x1f966;', '&#x1f967;', '&#x1f968;', '&#x1f969;', '&#x1f96a;', '&#x1f96b;', '&#x1f96c;', '&#x1f96d;', '&#x1f96e;', '&#x1f96f;', '&#x1f970;', '&#x1f971;', '&#x1f972;', '&#x1f973;', '&#x1f974;', '&#x1f975;', '&#x1f976;', '&#x1f977;', '&#x1f978;', '&#x1f97a;', '&#x1f97b;', '&#x1f97c;', '&#x1f97d;', '&#x1f97e;', '&#x1f97f;', '&#x1f980;', '&#x1f981;', '&#x1f982;', '&#x1f983;', '&#x1f984;', '&#x1f985;', '&#x1f986;', '&#x1f987;', '&#x1f988;', '&#x1f989;', '&#x1f98a;', '&#x1f98b;', '&#x1f98c;', '&#x1f98d;', '&#x1f98e;', '&#x1f98f;', '&#x1f990;', '&#x1f991;', '&#x1f992;', '&#x1f993;', '&#x1f994;', '&#x1f995;', '&#x1f996;', '&#x1f997;', '&#x1f998;', '&#x1f999;', '&#x1f99a;', '&#x1f99b;', '&#x1f99c;', '&#x1f99d;', '&#x1f99e;', '&#x1f99f;', '&#x1f9a0;', '&#x1f9a1;', '&#x1f9a2;', '&#x1f9a3;', '&#x1f9a4;', '&#x1f9a5;', '&#x1f9a6;', '&#x1f9a7;', '&#x1f9a8;', '&#x1f9a9;', '&#x1f9aa;', '&#x1f9ab;', '&#x1f9ac;', '&#x1f9ad;', '&#x1f9ae;', '&#x1f9af;', '&#x1f9b0;', '&#x1f9b1;', '&#x1f9b2;', '&#x1f9b3;', '&#x1f9b4;', '&#x1f9b5;', '&#x1f9b6;', '&#x1f9b7;', '&#x1f9b8;', '&#x1f9b9;', '&#x1f9ba;', '&#x1f9bb;', '&#x1f9bc;', '&#x1f9bd;', '&#x1f9be;', '&#x1f9bf;', '&#x1f9c0;', '&#x1f9c1;', '&#x1f9c2;', '&#x1f9c3;', '&#x1f9c4;', '&#x1f9c5;', '&#x1f9c6;', '&#x1f9c7;', '&#x1f9c8;', '&#x1f9c9;', '&#x1f9ca;', '&#x1f9cb;', '&#x1f9cd;', '&#x1f9ce;', '&#x1f9cf;', '&#x1f9d0;', '&#x1f9d1;', '&#x1f9d2;', '&#x1f9d3;', '&#x1f9d4;', '&#x1f9d5;', '&#x1f9d6;', '&#x1f9d7;', '&#x1f9d8;', '&#x1f9d9;', '&#x1f9da;', '&#x1f9db;', '&#x1f9dc;', '&#x1f9dd;', '&#x1f9de;', '&#x1f9df;', '&#x1f9e0;', '&#x1f9e1;', '&#x1f9e2;', '&#x1f9e3;', '&#x1f9e4;', '&#x1f9e5;', '&#x1f9e6;', '&#x1f9e7;', '&#x1f9e8;', '&#x1f9e9;', '&#x1f9ea;', '&#x1f9eb;', '&#x1f9ec;', '&#x1f9ed;', '&#x1f9ee;', '&#x1f9ef;', '&#x1f9f0;', '&#x1f9f1;', '&#x1f9f2;', '&#x1f9f3;', '&#x1f9f4;', '&#x1f9f5;', '&#x1f9f6;', '&#x1f9f7;', '&#x1f9f8;', '&#x1f9f9;', '&#x1f9fa;', '&#x1f9fb;', '&#x1f9fc;', '&#x1f9fd;', '&#x1f9fe;', '&#x1f9ff;', '&#x1fa70;', '&#x1fa71;', '&#x1fa72;', '&#x1fa73;', '&#x1fa74;', '&#x1fa78;', '&#x1fa79;', '&#x1fa7a;', '&#x1fa80;', '&#x1fa81;', '&#x1fa82;', '&#x1fa83;', '&#x1fa84;', '&#x1fa85;', '&#x1fa86;', '&#x1fa90;', '&#x1fa91;', '&#x1fa92;', '&#x1fa93;', '&#x1fa94;', '&#x1fa95;', '&#x1fa96;', '&#x1fa97;', '&#x1fa98;', '&#x1fa99;', '&#x1fa9a;', '&#x1fa9b;', '&#x1fa9c;', '&#x1fa9d;', '&#x1fa9e;', '&#x1fa9f;', '&#x1faa0;', '&#x1faa1;', '&#x1faa2;', '&#x1faa3;', '&#x1faa4;', '&#x1faa5;', '&#x1faa6;', '&#x1faa7;', '&#x1faa8;', '&#x1fab0;', '&#x1fab1;', '&#x1fab2;', '&#x1fab3;', '&#x1fab4;', '&#x1fab5;', '&#x1fab6;', '&#x1fac0;', '&#x1fac1;', '&#x1fac2;', '&#x1fad0;', '&#x1fad1;', '&#x1fad2;', '&#x1fad3;', '&#x1fad4;', '&#x1fad5;', '&#x1fad6;', '&#x203c;', '&#x2049;', '&#x2122;', '&#x2139;', '&#x2194;', '&#x2195;', '&#x2196;', '&#x2197;', '&#x2198;', '&#x2199;', '&#x21a9;', '&#x21aa;', '&#x231a;', '&#x231b;', '&#x2328;', '&#x23cf;', '&#x23e9;', '&#x23ea;', '&#x23eb;', '&#x23ec;', '&#x23ed;', '&#x23ee;', '&#x23ef;', '&#x23f0;', '&#x23f1;', '&#x23f2;', '&#x23f3;', '&#x23f8;', '&#x23f9;', '&#x23fa;', '&#x24c2;', '&#x25aa;', '&#x25ab;', '&#x25b6;', '&#x25c0;', '&#x25fb;', '&#x25fc;', '&#x25fd;', '&#x25fe;', '&#x2600;', '&#x2601;', '&#x2602;', '&#x2603;', '&#x2604;', '&#x260e;', '&#x2611;', '&#x2614;', '&#x2615;', '&#x2618;', '&#x261d;', '&#x2620;', '&#x2622;', '&#x2623;', '&#x2626;', '&#x262a;', '&#x262e;', '&#x262f;', '&#x2638;', '&#x2639;', '&#x263a;', '&#x2640;', '&#x2642;', '&#x2648;', '&#x2649;', '&#x264a;', '&#x264b;', '&#x264c;', '&#x264d;', '&#x264e;', '&#x264f;', '&#x2650;', '&#x2651;', '&#x2652;', '&#x2653;', '&#x265f;', '&#x2660;', '&#x2663;', '&#x2665;', '&#x2666;', '&#x2668;', '&#x267b;', '&#x267e;', '&#x267f;', '&#x2692;', '&#x2693;', '&#x2694;', '&#x2695;', '&#x2696;', '&#x2697;', '&#x2699;', '&#x269b;', '&#x269c;', '&#x26a0;', '&#x26a1;', '&#x26a7;', '&#x26aa;', '&#x26ab;', '&#x26b0;', '&#x26b1;', '&#x26bd;', '&#x26be;', '&#x26c4;', '&#x26c5;', '&#x26c8;', '&#x26ce;', '&#x26cf;', '&#x26d1;', '&#x26d3;', '&#x26d4;', '&#x26e9;', '&#x26ea;', '&#x26f0;', '&#x26f1;', '&#x26f2;', '&#x26f3;', '&#x26f4;', '&#x26f5;', '&#x26f7;', '&#x26f8;', '&#x26f9;', '&#x26fa;', '&#x26fd;', '&#x2702;', '&#x2705;', '&#x2708;', '&#x2709;', '&#x270a;', '&#x270b;', '&#x270c;', '&#x270d;', '&#x270f;', '&#x2712;', '&#x2714;', '&#x2716;', '&#x271d;', '&#x2721;', '&#x2728;', '&#x2733;', '&#x2734;', '&#x2744;', '&#x2747;', '&#x274c;', '&#x274e;', '&#x2753;', '&#x2754;', '&#x2755;', '&#x2757;', '&#x2763;', '&#x2764;', '&#x2795;', '&#x2796;', '&#x2797;', '&#x27a1;', '&#x27b0;', '&#x27bf;', '&#x2934;', '&#x2935;', '&#x2b05;', '&#x2b06;', '&#x2b07;', '&#x2b1b;', '&#x2b1c;', '&#x2b50;', '&#x2b55;', '&#x3030;', '&#x303d;', '&#x3297;', '&#x3299;', '&#xe50a;' );
   5949 	$partials = array( '&#x1f004;', '&#x1f0cf;', '&#x1f170;', '&#x1f171;', '&#x1f17e;', '&#x1f17f;', '&#x1f18e;', '&#x1f191;', '&#x1f192;', '&#x1f193;', '&#x1f194;', '&#x1f195;', '&#x1f196;', '&#x1f197;', '&#x1f198;', '&#x1f199;', '&#x1f19a;', '&#x1f1e6;', '&#x1f1e8;', '&#x1f1e9;', '&#x1f1ea;', '&#x1f1eb;', '&#x1f1ec;', '&#x1f1ee;', '&#x1f1f1;', '&#x1f1f2;', '&#x1f1f4;', '&#x1f1f6;', '&#x1f1f7;', '&#x1f1f8;', '&#x1f1f9;', '&#x1f1fa;', '&#x1f1fc;', '&#x1f1fd;', '&#x1f1ff;', '&#x1f1e7;', '&#x1f1ed;', '&#x1f1ef;', '&#x1f1f3;', '&#x1f1fb;', '&#x1f1fe;', '&#x1f1f0;', '&#x1f1f5;', '&#x1f201;', '&#x1f202;', '&#x1f21a;', '&#x1f22f;', '&#x1f232;', '&#x1f233;', '&#x1f234;', '&#x1f235;', '&#x1f236;', '&#x1f237;', '&#x1f238;', '&#x1f239;', '&#x1f23a;', '&#x1f250;', '&#x1f251;', '&#x1f300;', '&#x1f301;', '&#x1f302;', '&#x1f303;', '&#x1f304;', '&#x1f305;', '&#x1f306;', '&#x1f307;', '&#x1f308;', '&#x1f309;', '&#x1f30a;', '&#x1f30b;', '&#x1f30c;', '&#x1f30d;', '&#x1f30e;', '&#x1f30f;', '&#x1f310;', '&#x1f311;', '&#x1f312;', '&#x1f313;', '&#x1f314;', '&#x1f315;', '&#x1f316;', '&#x1f317;', '&#x1f318;', '&#x1f319;', '&#x1f31a;', '&#x1f31b;', '&#x1f31c;', '&#x1f31d;', '&#x1f31e;', '&#x1f31f;', '&#x1f320;', '&#x1f321;', '&#x1f324;', '&#x1f325;', '&#x1f326;', '&#x1f327;', '&#x1f328;', '&#x1f329;', '&#x1f32a;', '&#x1f32b;', '&#x1f32c;', '&#x1f32d;', '&#x1f32e;', '&#x1f32f;', '&#x1f330;', '&#x1f331;', '&#x1f332;', '&#x1f333;', '&#x1f334;', '&#x1f335;', '&#x1f336;', '&#x1f337;', '&#x1f338;', '&#x1f339;', '&#x1f33a;', '&#x1f33b;', '&#x1f33c;', '&#x1f33d;', '&#x1f33e;', '&#x1f33f;', '&#x1f340;', '&#x1f341;', '&#x1f342;', '&#x1f343;', '&#x1f344;', '&#x1f345;', '&#x1f346;', '&#x1f347;', '&#x1f348;', '&#x1f349;', '&#x1f34a;', '&#x1f34b;', '&#x1f34c;', '&#x1f34d;', '&#x1f34e;', '&#x1f34f;', '&#x1f350;', '&#x1f351;', '&#x1f352;', '&#x1f353;', '&#x1f354;', '&#x1f355;', '&#x1f356;', '&#x1f357;', '&#x1f358;', '&#x1f359;', '&#x1f35a;', '&#x1f35b;', '&#x1f35c;', '&#x1f35d;', '&#x1f35e;', '&#x1f35f;', '&#x1f360;', '&#x1f361;', '&#x1f362;', '&#x1f363;', '&#x1f364;', '&#x1f365;', '&#x1f366;', '&#x1f367;', '&#x1f368;', '&#x1f369;', '&#x1f36a;', '&#x1f36b;', '&#x1f36c;', '&#x1f36d;', '&#x1f36e;', '&#x1f36f;', '&#x1f370;', '&#x1f371;', '&#x1f372;', '&#x1f373;', '&#x1f374;', '&#x1f375;', '&#x1f376;', '&#x1f377;', '&#x1f378;', '&#x1f379;', '&#x1f37a;', '&#x1f37b;', '&#x1f37c;', '&#x1f37d;', '&#x1f37e;', '&#x1f37f;', '&#x1f380;', '&#x1f381;', '&#x1f382;', '&#x1f383;', '&#x1f384;', '&#x1f385;', '&#x1f3fb;', '&#x1f3fc;', '&#x1f3fd;', '&#x1f3fe;', '&#x1f3ff;', '&#x1f386;', '&#x1f387;', '&#x1f388;', '&#x1f389;', '&#x1f38a;', '&#x1f38b;', '&#x1f38c;', '&#x1f38d;', '&#x1f38e;', '&#x1f38f;', '&#x1f390;', '&#x1f391;', '&#x1f392;', '&#x1f393;', '&#x1f396;', '&#x1f397;', '&#x1f399;', '&#x1f39a;', '&#x1f39b;', '&#x1f39e;', '&#x1f39f;', '&#x1f3a0;', '&#x1f3a1;', '&#x1f3a2;', '&#x1f3a3;', '&#x1f3a4;', '&#x1f3a5;', '&#x1f3a6;', '&#x1f3a7;', '&#x1f3a8;', '&#x1f3a9;', '&#x1f3aa;', '&#x1f3ab;', '&#x1f3ac;', '&#x1f3ad;', '&#x1f3ae;', '&#x1f3af;', '&#x1f3b0;', '&#x1f3b1;', '&#x1f3b2;', '&#x1f3b3;', '&#x1f3b4;', '&#x1f3b5;', '&#x1f3b6;', '&#x1f3b7;', '&#x1f3b8;', '&#x1f3b9;', '&#x1f3ba;', '&#x1f3bb;', '&#x1f3bc;', '&#x1f3bd;', '&#x1f3be;', '&#x1f3bf;', '&#x1f3c0;', '&#x1f3c1;', '&#x1f3c2;', '&#x1f3c3;', '&#x200d;', '&#x2640;', '&#xfe0f;', '&#x2642;', '&#x1f3c4;', '&#x1f3c5;', '&#x1f3c6;', '&#x1f3c7;', '&#x1f3c8;', '&#x1f3c9;', '&#x1f3ca;', '&#x1f3cb;', '&#x1f3cc;', '&#x1f3cd;', '&#x1f3ce;', '&#x1f3cf;', '&#x1f3d0;', '&#x1f3d1;', '&#x1f3d2;', '&#x1f3d3;', '&#x1f3d4;', '&#x1f3d5;', '&#x1f3d6;', '&#x1f3d7;', '&#x1f3d8;', '&#x1f3d9;', '&#x1f3da;', '&#x1f3db;', '&#x1f3dc;', '&#x1f3dd;', '&#x1f3de;', '&#x1f3df;', '&#x1f3e0;', '&#x1f3e1;', '&#x1f3e2;', '&#x1f3e3;', '&#x1f3e4;', '&#x1f3e5;', '&#x1f3e6;', '&#x1f3e7;', '&#x1f3e8;', '&#x1f3e9;', '&#x1f3ea;', '&#x1f3eb;', '&#x1f3ec;', '&#x1f3ed;', '&#x1f3ee;', '&#x1f3ef;', '&#x1f3f0;', '&#x1f3f3;', '&#x26a7;', '&#x1f3f4;', '&#x2620;', '&#xe0067;', '&#xe0062;', '&#xe0065;', '&#xe006e;', '&#xe007f;', '&#xe0073;', '&#xe0063;', '&#xe0074;', '&#xe0077;', '&#xe006c;', '&#x1f3f5;', '&#x1f3f7;', '&#x1f3f8;', '&#x1f3f9;', '&#x1f3fa;', '&#x1f400;', '&#x1f401;', '&#x1f402;', '&#x1f403;', '&#x1f404;', '&#x1f405;', '&#x1f406;', '&#x1f407;', '&#x1f408;', '&#x2b1b;', '&#x1f409;', '&#x1f40a;', '&#x1f40b;', '&#x1f40c;', '&#x1f40d;', '&#x1f40e;', '&#x1f40f;', '&#x1f410;', '&#x1f411;', '&#x1f412;', '&#x1f413;', '&#x1f414;', '&#x1f415;', '&#x1f9ba;', '&#x1f416;', '&#x1f417;', '&#x1f418;', '&#x1f419;', '&#x1f41a;', '&#x1f41b;', '&#x1f41c;', '&#x1f41d;', '&#x1f41e;', '&#x1f41f;', '&#x1f420;', '&#x1f421;', '&#x1f422;', '&#x1f423;', '&#x1f424;', '&#x1f425;', '&#x1f426;', '&#x1f427;', '&#x1f428;', '&#x1f429;', '&#x1f42a;', '&#x1f42b;', '&#x1f42c;', '&#x1f42d;', '&#x1f42e;', '&#x1f42f;', '&#x1f430;', '&#x1f431;', '&#x1f432;', '&#x1f433;', '&#x1f434;', '&#x1f435;', '&#x1f436;', '&#x1f437;', '&#x1f438;', '&#x1f439;', '&#x1f43a;', '&#x1f43b;', '&#x2744;', '&#x1f43c;', '&#x1f43d;', '&#x1f43e;', '&#x1f43f;', '&#x1f440;', '&#x1f441;', '&#x1f5e8;', '&#x1f442;', '&#x1f443;', '&#x1f444;', '&#x1f445;', '&#x1f446;', '&#x1f447;', '&#x1f448;', '&#x1f449;', '&#x1f44a;', '&#x1f44b;', '&#x1f44c;', '&#x1f44d;', '&#x1f44e;', '&#x1f44f;', '&#x1f450;', '&#x1f451;', '&#x1f452;', '&#x1f453;', '&#x1f454;', '&#x1f455;', '&#x1f456;', '&#x1f457;', '&#x1f458;', '&#x1f459;', '&#x1f45a;', '&#x1f45b;', '&#x1f45c;', '&#x1f45d;', '&#x1f45e;', '&#x1f45f;', '&#x1f460;', '&#x1f461;', '&#x1f462;', '&#x1f463;', '&#x1f464;', '&#x1f465;', '&#x1f466;', '&#x1f467;', '&#x1f468;', '&#x1f4bb;', '&#x1f4bc;', '&#x1f527;', '&#x1f52c;', '&#x1f680;', '&#x1f692;', '&#x1f91d;', '&#x1f9af;', '&#x1f9b0;', '&#x1f9b1;', '&#x1f9b2;', '&#x1f9b3;', '&#x1f9bc;', '&#x1f9bd;', '&#x2695;', '&#x2696;', '&#x2708;', '&#x2764;', '&#x1f48b;', '&#x1f469;', '&#x1f46a;', '&#x1f46b;', '&#x1f46c;', '&#x1f46d;', '&#x1f46e;', '&#x1f46f;', '&#x1f470;', '&#x1f471;', '&#x1f472;', '&#x1f473;', '&#x1f474;', '&#x1f475;', '&#x1f476;', '&#x1f477;', '&#x1f478;', '&#x1f479;', '&#x1f47a;', '&#x1f47b;', '&#x1f47c;', '&#x1f47d;', '&#x1f47e;', '&#x1f47f;', '&#x1f480;', '&#x1f481;', '&#x1f482;', '&#x1f483;', '&#x1f484;', '&#x1f485;', '&#x1f486;', '&#x1f487;', '&#x1f488;', '&#x1f489;', '&#x1f48a;', '&#x1f48c;', '&#x1f48d;', '&#x1f48e;', '&#x1f48f;', '&#x1f490;', '&#x1f491;', '&#x1f492;', '&#x1f493;', '&#x1f494;', '&#x1f495;', '&#x1f496;', '&#x1f497;', '&#x1f498;', '&#x1f499;', '&#x1f49a;', '&#x1f49b;', '&#x1f49c;', '&#x1f49d;', '&#x1f49e;', '&#x1f49f;', '&#x1f4a0;', '&#x1f4a1;', '&#x1f4a2;', '&#x1f4a3;', '&#x1f4a4;', '&#x1f4a5;', '&#x1f4a6;', '&#x1f4a7;', '&#x1f4a8;', '&#x1f4a9;', '&#x1f4aa;', '&#x1f4ab;', '&#x1f4ac;', '&#x1f4ad;', '&#x1f4ae;', '&#x1f4af;', '&#x1f4b0;', '&#x1f4b1;', '&#x1f4b2;', '&#x1f4b3;', '&#x1f4b4;', '&#x1f4b5;', '&#x1f4b6;', '&#x1f4b7;', '&#x1f4b8;', '&#x1f4b9;', '&#x1f4ba;', '&#x1f4bd;', '&#x1f4be;', '&#x1f4bf;', '&#x1f4c0;', '&#x1f4c1;', '&#x1f4c2;', '&#x1f4c3;', '&#x1f4c4;', '&#x1f4c5;', '&#x1f4c6;', '&#x1f4c7;', '&#x1f4c8;', '&#x1f4c9;', '&#x1f4ca;', '&#x1f4cb;', '&#x1f4cc;', '&#x1f4cd;', '&#x1f4ce;', '&#x1f4cf;', '&#x1f4d0;', '&#x1f4d1;', '&#x1f4d2;', '&#x1f4d3;', '&#x1f4d4;', '&#x1f4d5;', '&#x1f4d6;', '&#x1f4d7;', '&#x1f4d8;', '&#x1f4d9;', '&#x1f4da;', '&#x1f4db;', '&#x1f4dc;', '&#x1f4dd;', '&#x1f4de;', '&#x1f4df;', '&#x1f4e0;', '&#x1f4e1;', '&#x1f4e2;', '&#x1f4e3;', '&#x1f4e4;', '&#x1f4e5;', '&#x1f4e6;', '&#x1f4e7;', '&#x1f4e8;', '&#x1f4e9;', '&#x1f4ea;', '&#x1f4eb;', '&#x1f4ec;', '&#x1f4ed;', '&#x1f4ee;', '&#x1f4ef;', '&#x1f4f0;', '&#x1f4f1;', '&#x1f4f2;', '&#x1f4f3;', '&#x1f4f4;', '&#x1f4f5;', '&#x1f4f6;', '&#x1f4f7;', '&#x1f4f8;', '&#x1f4f9;', '&#x1f4fa;', '&#x1f4fb;', '&#x1f4fc;', '&#x1f4fd;', '&#x1f4ff;', '&#x1f500;', '&#x1f501;', '&#x1f502;', '&#x1f503;', '&#x1f504;', '&#x1f505;', '&#x1f506;', '&#x1f507;', '&#x1f508;', '&#x1f509;', '&#x1f50a;', '&#x1f50b;', '&#x1f50c;', '&#x1f50d;', '&#x1f50e;', '&#x1f50f;', '&#x1f510;', '&#x1f511;', '&#x1f512;', '&#x1f513;', '&#x1f514;', '&#x1f515;', '&#x1f516;', '&#x1f517;', '&#x1f518;', '&#x1f519;', '&#x1f51a;', '&#x1f51b;', '&#x1f51c;', '&#x1f51d;', '&#x1f51e;', '&#x1f51f;', '&#x1f520;', '&#x1f521;', '&#x1f522;', '&#x1f523;', '&#x1f524;', '&#x1f525;', '&#x1f526;', '&#x1f528;', '&#x1f529;', '&#x1f52a;', '&#x1f52b;', '&#x1f52d;', '&#x1f52e;', '&#x1f52f;', '&#x1f530;', '&#x1f531;', '&#x1f532;', '&#x1f533;', '&#x1f534;', '&#x1f535;', '&#x1f536;', '&#x1f537;', '&#x1f538;', '&#x1f539;', '&#x1f53a;', '&#x1f53b;', '&#x1f53c;', '&#x1f53d;', '&#x1f549;', '&#x1f54a;', '&#x1f54b;', '&#x1f54c;', '&#x1f54d;', '&#x1f54e;', '&#x1f550;', '&#x1f551;', '&#x1f552;', '&#x1f553;', '&#x1f554;', '&#x1f555;', '&#x1f556;', '&#x1f557;', '&#x1f558;', '&#x1f559;', '&#x1f55a;', '&#x1f55b;', '&#x1f55c;', '&#x1f55d;', '&#x1f55e;', '&#x1f55f;', '&#x1f560;', '&#x1f561;', '&#x1f562;', '&#x1f563;', '&#x1f564;', '&#x1f565;', '&#x1f566;', '&#x1f567;', '&#x1f56f;', '&#x1f570;', '&#x1f573;', '&#x1f574;', '&#x1f575;', '&#x1f576;', '&#x1f577;', '&#x1f578;', '&#x1f579;', '&#x1f57a;', '&#x1f587;', '&#x1f58a;', '&#x1f58b;', '&#x1f58c;', '&#x1f58d;', '&#x1f590;', '&#x1f595;', '&#x1f596;', '&#x1f5a4;', '&#x1f5a5;', '&#x1f5a8;', '&#x1f5b1;', '&#x1f5b2;', '&#x1f5bc;', '&#x1f5c2;', '&#x1f5c3;', '&#x1f5c4;', '&#x1f5d1;', '&#x1f5d2;', '&#x1f5d3;', '&#x1f5dc;', '&#x1f5dd;', '&#x1f5de;', '&#x1f5e1;', '&#x1f5e3;', '&#x1f5ef;', '&#x1f5f3;', '&#x1f5fa;', '&#x1f5fb;', '&#x1f5fc;', '&#x1f5fd;', '&#x1f5fe;', '&#x1f5ff;', '&#x1f600;', '&#x1f601;', '&#x1f602;', '&#x1f603;', '&#x1f604;', '&#x1f605;', '&#x1f606;', '&#x1f607;', '&#x1f608;', '&#x1f609;', '&#x1f60a;', '&#x1f60b;', '&#x1f60c;', '&#x1f60d;', '&#x1f60e;', '&#x1f60f;', '&#x1f610;', '&#x1f611;', '&#x1f612;', '&#x1f613;', '&#x1f614;', '&#x1f615;', '&#x1f616;', '&#x1f617;', '&#x1f618;', '&#x1f619;', '&#x1f61a;', '&#x1f61b;', '&#x1f61c;', '&#x1f61d;', '&#x1f61e;', '&#x1f61f;', '&#x1f620;', '&#x1f621;', '&#x1f622;', '&#x1f623;', '&#x1f624;', '&#x1f625;', '&#x1f626;', '&#x1f627;', '&#x1f628;', '&#x1f629;', '&#x1f62a;', '&#x1f62b;', '&#x1f62c;', '&#x1f62d;', '&#x1f62e;', '&#x1f62f;', '&#x1f630;', '&#x1f631;', '&#x1f632;', '&#x1f633;', '&#x1f634;', '&#x1f635;', '&#x1f636;', '&#x1f637;', '&#x1f638;', '&#x1f639;', '&#x1f63a;', '&#x1f63b;', '&#x1f63c;', '&#x1f63d;', '&#x1f63e;', '&#x1f63f;', '&#x1f640;', '&#x1f641;', '&#x1f642;', '&#x1f643;', '&#x1f644;', '&#x1f645;', '&#x1f646;', '&#x1f647;', '&#x1f648;', '&#x1f649;', '&#x1f64a;', '&#x1f64b;', '&#x1f64c;', '&#x1f64d;', '&#x1f64e;', '&#x1f64f;', '&#x1f681;', '&#x1f682;', '&#x1f683;', '&#x1f684;', '&#x1f685;', '&#x1f686;', '&#x1f687;', '&#x1f688;', '&#x1f689;', '&#x1f68a;', '&#x1f68b;', '&#x1f68c;', '&#x1f68d;', '&#x1f68e;', '&#x1f68f;', '&#x1f690;', '&#x1f691;', '&#x1f693;', '&#x1f694;', '&#x1f695;', '&#x1f696;', '&#x1f697;', '&#x1f698;', '&#x1f699;', '&#x1f69a;', '&#x1f69b;', '&#x1f69c;', '&#x1f69d;', '&#x1f69e;', '&#x1f69f;', '&#x1f6a0;', '&#x1f6a1;', '&#x1f6a2;', '&#x1f6a3;', '&#x1f6a4;', '&#x1f6a5;', '&#x1f6a6;', '&#x1f6a7;', '&#x1f6a8;', '&#x1f6a9;', '&#x1f6aa;', '&#x1f6ab;', '&#x1f6ac;', '&#x1f6ad;', '&#x1f6ae;', '&#x1f6af;', '&#x1f6b0;', '&#x1f6b1;', '&#x1f6b2;', '&#x1f6b3;', '&#x1f6b4;', '&#x1f6b5;', '&#x1f6b6;', '&#x1f6b7;', '&#x1f6b8;', '&#x1f6b9;', '&#x1f6ba;', '&#x1f6bb;', '&#x1f6bc;', '&#x1f6bd;', '&#x1f6be;', '&#x1f6bf;', '&#x1f6c0;', '&#x1f6c1;', '&#x1f6c2;', '&#x1f6c3;', '&#x1f6c4;', '&#x1f6c5;', '&#x1f6cb;', '&#x1f6cc;', '&#x1f6cd;', '&#x1f6ce;', '&#x1f6cf;', '&#x1f6d0;', '&#x1f6d1;', '&#x1f6d2;', '&#x1f6d5;', '&#x1f6d6;', '&#x1f6d7;', '&#x1f6e0;', '&#x1f6e1;', '&#x1f6e2;', '&#x1f6e3;', '&#x1f6e4;', '&#x1f6e5;', '&#x1f6e9;', '&#x1f6eb;', '&#x1f6ec;', '&#x1f6f0;', '&#x1f6f3;', '&#x1f6f4;', '&#x1f6f5;', '&#x1f6f6;', '&#x1f6f7;', '&#x1f6f8;', '&#x1f6f9;', '&#x1f6fa;', '&#x1f6fb;', '&#x1f6fc;', '&#x1f7e0;', '&#x1f7e1;', '&#x1f7e2;', '&#x1f7e3;', '&#x1f7e4;', '&#x1f7e5;', '&#x1f7e6;', '&#x1f7e7;', '&#x1f7e8;', '&#x1f7e9;', '&#x1f7ea;', '&#x1f7eb;', '&#x1f90c;', '&#x1f90d;', '&#x1f90e;', '&#x1f90f;', '&#x1f910;', '&#x1f911;', '&#x1f912;', '&#x1f913;', '&#x1f914;', '&#x1f915;', '&#x1f916;', '&#x1f917;', '&#x1f918;', '&#x1f919;', '&#x1f91a;', '&#x1f91b;', '&#x1f91c;', '&#x1f91e;', '&#x1f91f;', '&#x1f920;', '&#x1f921;', '&#x1f922;', '&#x1f923;', '&#x1f924;', '&#x1f925;', '&#x1f926;', '&#x1f927;', '&#x1f928;', '&#x1f929;', '&#x1f92a;', '&#x1f92b;', '&#x1f92c;', '&#x1f92d;', '&#x1f92e;', '&#x1f92f;', '&#x1f930;', '&#x1f931;', '&#x1f932;', '&#x1f933;', '&#x1f934;', '&#x1f935;', '&#x1f936;', '&#x1f937;', '&#x1f938;', '&#x1f939;', '&#x1f93a;', '&#x1f93c;', '&#x1f93d;', '&#x1f93e;', '&#x1f93f;', '&#x1f940;', '&#x1f941;', '&#x1f942;', '&#x1f943;', '&#x1f944;', '&#x1f945;', '&#x1f947;', '&#x1f948;', '&#x1f949;', '&#x1f94a;', '&#x1f94b;', '&#x1f94c;', '&#x1f94d;', '&#x1f94e;', '&#x1f94f;', '&#x1f950;', '&#x1f951;', '&#x1f952;', '&#x1f953;', '&#x1f954;', '&#x1f955;', '&#x1f956;', '&#x1f957;', '&#x1f958;', '&#x1f959;', '&#x1f95a;', '&#x1f95b;', '&#x1f95c;', '&#x1f95d;', '&#x1f95e;', '&#x1f95f;', '&#x1f960;', '&#x1f961;', '&#x1f962;', '&#x1f963;', '&#x1f964;', '&#x1f965;', '&#x1f966;', '&#x1f967;', '&#x1f968;', '&#x1f969;', '&#x1f96a;', '&#x1f96b;', '&#x1f96c;', '&#x1f96d;', '&#x1f96e;', '&#x1f96f;', '&#x1f970;', '&#x1f971;', '&#x1f972;', '&#x1f973;', '&#x1f974;', '&#x1f975;', '&#x1f976;', '&#x1f977;', '&#x1f978;', '&#x1f97a;', '&#x1f97b;', '&#x1f97c;', '&#x1f97d;', '&#x1f97e;', '&#x1f97f;', '&#x1f980;', '&#x1f981;', '&#x1f982;', '&#x1f983;', '&#x1f984;', '&#x1f985;', '&#x1f986;', '&#x1f987;', '&#x1f988;', '&#x1f989;', '&#x1f98a;', '&#x1f98b;', '&#x1f98c;', '&#x1f98d;', '&#x1f98e;', '&#x1f98f;', '&#x1f990;', '&#x1f991;', '&#x1f992;', '&#x1f993;', '&#x1f994;', '&#x1f995;', '&#x1f996;', '&#x1f997;', '&#x1f998;', '&#x1f999;', '&#x1f99a;', '&#x1f99b;', '&#x1f99c;', '&#x1f99d;', '&#x1f99e;', '&#x1f99f;', '&#x1f9a0;', '&#x1f9a1;', '&#x1f9a2;', '&#x1f9a3;', '&#x1f9a4;', '&#x1f9a5;', '&#x1f9a6;', '&#x1f9a7;', '&#x1f9a8;', '&#x1f9a9;', '&#x1f9aa;', '&#x1f9ab;', '&#x1f9ac;', '&#x1f9ad;', '&#x1f9ae;', '&#x1f9b4;', '&#x1f9b5;', '&#x1f9b6;', '&#x1f9b7;', '&#x1f9b8;', '&#x1f9b9;', '&#x1f9bb;', '&#x1f9be;', '&#x1f9bf;', '&#x1f9c0;', '&#x1f9c1;', '&#x1f9c2;', '&#x1f9c3;', '&#x1f9c4;', '&#x1f9c5;', '&#x1f9c6;', '&#x1f9c7;', '&#x1f9c8;', '&#x1f9c9;', '&#x1f9ca;', '&#x1f9cb;', '&#x1f9cd;', '&#x1f9ce;', '&#x1f9cf;', '&#x1f9d0;', '&#x1f9d1;', '&#x1f9d2;', '&#x1f9d3;', '&#x1f9d4;', '&#x1f9d5;', '&#x1f9d6;', '&#x1f9d7;', '&#x1f9d8;', '&#x1f9d9;', '&#x1f9da;', '&#x1f9db;', '&#x1f9dc;', '&#x1f9dd;', '&#x1f9de;', '&#x1f9df;', '&#x1f9e0;', '&#x1f9e1;', '&#x1f9e2;', '&#x1f9e3;', '&#x1f9e4;', '&#x1f9e5;', '&#x1f9e6;', '&#x1f9e7;', '&#x1f9e8;', '&#x1f9e9;', '&#x1f9ea;', '&#x1f9eb;', '&#x1f9ec;', '&#x1f9ed;', '&#x1f9ee;', '&#x1f9ef;', '&#x1f9f0;', '&#x1f9f1;', '&#x1f9f2;', '&#x1f9f3;', '&#x1f9f4;', '&#x1f9f5;', '&#x1f9f6;', '&#x1f9f7;', '&#x1f9f8;', '&#x1f9f9;', '&#x1f9fa;', '&#x1f9fb;', '&#x1f9fc;', '&#x1f9fd;', '&#x1f9fe;', '&#x1f9ff;', '&#x1fa70;', '&#x1fa71;', '&#x1fa72;', '&#x1fa73;', '&#x1fa74;', '&#x1fa78;', '&#x1fa79;', '&#x1fa7a;', '&#x1fa80;', '&#x1fa81;', '&#x1fa82;', '&#x1fa83;', '&#x1fa84;', '&#x1fa85;', '&#x1fa86;', '&#x1fa90;', '&#x1fa91;', '&#x1fa92;', '&#x1fa93;', '&#x1fa94;', '&#x1fa95;', '&#x1fa96;', '&#x1fa97;', '&#x1fa98;', '&#x1fa99;', '&#x1fa9a;', '&#x1fa9b;', '&#x1fa9c;', '&#x1fa9d;', '&#x1fa9e;', '&#x1fa9f;', '&#x1faa0;', '&#x1faa1;', '&#x1faa2;', '&#x1faa3;', '&#x1faa4;', '&#x1faa5;', '&#x1faa6;', '&#x1faa7;', '&#x1faa8;', '&#x1fab0;', '&#x1fab1;', '&#x1fab2;', '&#x1fab3;', '&#x1fab4;', '&#x1fab5;', '&#x1fab6;', '&#x1fac0;', '&#x1fac1;', '&#x1fac2;', '&#x1fad0;', '&#x1fad1;', '&#x1fad2;', '&#x1fad3;', '&#x1fad4;', '&#x1fad5;', '&#x1fad6;', '&#x203c;', '&#x2049;', '&#x2122;', '&#x2139;', '&#x2194;', '&#x2195;', '&#x2196;', '&#x2197;', '&#x2198;', '&#x2199;', '&#x21a9;', '&#x21aa;', '&#x20e3;', '&#x231a;', '&#x231b;', '&#x2328;', '&#x23cf;', '&#x23e9;', '&#x23ea;', '&#x23eb;', '&#x23ec;', '&#x23ed;', '&#x23ee;', '&#x23ef;', '&#x23f0;', '&#x23f1;', '&#x23f2;', '&#x23f3;', '&#x23f8;', '&#x23f9;', '&#x23fa;', '&#x24c2;', '&#x25aa;', '&#x25ab;', '&#x25b6;', '&#x25c0;', '&#x25fb;', '&#x25fc;', '&#x25fd;', '&#x25fe;', '&#x2600;', '&#x2601;', '&#x2602;', '&#x2603;', '&#x2604;', '&#x260e;', '&#x2611;', '&#x2614;', '&#x2615;', '&#x2618;', '&#x261d;', '&#x2622;', '&#x2623;', '&#x2626;', '&#x262a;', '&#x262e;', '&#x262f;', '&#x2638;', '&#x2639;', '&#x263a;', '&#x2648;', '&#x2649;', '&#x264a;', '&#x264b;', '&#x264c;', '&#x264d;', '&#x264e;', '&#x264f;', '&#x2650;', '&#x2651;', '&#x2652;', '&#x2653;', '&#x265f;', '&#x2660;', '&#x2663;', '&#x2665;', '&#x2666;', '&#x2668;', '&#x267b;', '&#x267e;', '&#x267f;', '&#x2692;', '&#x2693;', '&#x2694;', '&#x2697;', '&#x2699;', '&#x269b;', '&#x269c;', '&#x26a0;', '&#x26a1;', '&#x26aa;', '&#x26ab;', '&#x26b0;', '&#x26b1;', '&#x26bd;', '&#x26be;', '&#x26c4;', '&#x26c5;', '&#x26c8;', '&#x26ce;', '&#x26cf;', '&#x26d1;', '&#x26d3;', '&#x26d4;', '&#x26e9;', '&#x26ea;', '&#x26f0;', '&#x26f1;', '&#x26f2;', '&#x26f3;', '&#x26f4;', '&#x26f5;', '&#x26f7;', '&#x26f8;', '&#x26f9;', '&#x26fa;', '&#x26fd;', '&#x2702;', '&#x2705;', '&#x2709;', '&#x270a;', '&#x270b;', '&#x270c;', '&#x270d;', '&#x270f;', '&#x2712;', '&#x2714;', '&#x2716;', '&#x271d;', '&#x2721;', '&#x2728;', '&#x2733;', '&#x2734;', '&#x2747;', '&#x274c;', '&#x274e;', '&#x2753;', '&#x2754;', '&#x2755;', '&#x2757;', '&#x2763;', '&#x2795;', '&#x2796;', '&#x2797;', '&#x27a1;', '&#x27b0;', '&#x27bf;', '&#x2934;', '&#x2935;', '&#x2b05;', '&#x2b06;', '&#x2b07;', '&#x2b1c;', '&#x2b50;', '&#x2b55;', '&#x3030;', '&#x303d;', '&#x3297;', '&#x3299;', '&#xe50a;' );
   5950 	// END: emoji arrays
   5951 
   5952 	if ( 'entities' === $type ) {
   5953 		return $entities;
   5954 	}
   5955 
   5956 	return $partials;
   5957 }
   5958 
   5959 /**
   5960  * Shorten a URL, to be used as link text.
   5961  *
   5962  * @since 1.2.0
   5963  * @since 4.4.0 Moved to wp-includes/formatting.php from wp-admin/includes/misc.php and added $length param.
   5964  *
   5965  * @param string $url    URL to shorten.
   5966  * @param int    $length Optional. Maximum length of the shortened URL. Default 35 characters.
   5967  * @return string Shortened URL.
   5968  */
   5969 function url_shorten( $url, $length = 35 ) {
   5970 	$stripped  = str_replace( array( 'https://', 'http://', 'www.' ), '', $url );
   5971 	$short_url = untrailingslashit( $stripped );
   5972 
   5973 	if ( strlen( $short_url ) > $length ) {
   5974 		$short_url = substr( $short_url, 0, $length - 3 ) . '&hellip;';
   5975 	}
   5976 	return $short_url;
   5977 }
   5978 
   5979 /**
   5980  * Sanitizes a hex color.
   5981  *
   5982  * Returns either '', a 3 or 6 digit hex color (with #), or nothing.
   5983  * For sanitizing values without a #, see sanitize_hex_color_no_hash().
   5984  *
   5985  * @since 3.4.0
   5986  *
   5987  * @param string $color
   5988  * @return string|void
   5989  */
   5990 function sanitize_hex_color( $color ) {
   5991 	if ( '' === $color ) {
   5992 		return '';
   5993 	}
   5994 
   5995 	// 3 or 6 hex digits, or the empty string.
   5996 	if ( preg_match( '|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) {
   5997 		return $color;
   5998 	}
   5999 }
   6000 
   6001 /**
   6002  * Sanitizes a hex color without a hash. Use sanitize_hex_color() when possible.
   6003  *
   6004  * Saving hex colors without a hash puts the burden of adding the hash on the
   6005  * UI, which makes it difficult to use or upgrade to other color types such as
   6006  * rgba, hsl, rgb, and HTML color names.
   6007  *
   6008  * Returns either '', a 3 or 6 digit hex color (without a #), or null.
   6009  *
   6010  * @since 3.4.0
   6011  *
   6012  * @param string $color
   6013  * @return string|null
   6014  */
   6015 function sanitize_hex_color_no_hash( $color ) {
   6016 	$color = ltrim( $color, '#' );
   6017 
   6018 	if ( '' === $color ) {
   6019 		return '';
   6020 	}
   6021 
   6022 	return sanitize_hex_color( '#' . $color ) ? $color : null;
   6023 }
   6024 
   6025 /**
   6026  * Ensures that any hex color is properly hashed.
   6027  * Otherwise, returns value untouched.
   6028  *
   6029  * This method should only be necessary if using sanitize_hex_color_no_hash().
   6030  *
   6031  * @since 3.4.0
   6032  *
   6033  * @param string $color
   6034  * @return string
   6035  */
   6036 function maybe_hash_hex_color( $color ) {
   6037 	$unhashed = sanitize_hex_color_no_hash( $color );
   6038 	if ( $unhashed ) {
   6039 		return '#' . $unhashed;
   6040 	}
   6041 
   6042 	return $color;
   6043 }