public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-6991] libstdc++: Add Unicode-aware width estimation for std::format
@ 2024-01-08  1:15 Jonathan Wakely
  0 siblings, 0 replies; only message in thread
From: Jonathan Wakely @ 2024-01-08  1:15 UTC (permalink / raw)
  To: gcc-cvs, libstdc++-cvs

https://gcc.gnu.org/g:37a4c5c23a270cd9350ba5d56e526371424b5742

commit r14-6991-g37a4c5c23a270cd9350ba5d56e526371424b5742
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Sat Dec 16 23:30:20 2023 +0000

    libstdc++: Add Unicode-aware width estimation for std::format
    
    This implements the requirements in the following proposals, which
    dictate how std::format deals with non-ASCII strings:
    https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1868r1.html
    https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2572r1.html
    https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2675r1.pdf
    
    There are two parts to this. The width estimation for strings must only
    count the width of the first character in an extended grapheme cluster.
    That requires implementing the algorithm for detecting cluster breaks,
    which requires a number of lookup tables of the grapheme cluster break
    properties (and Indic_Conjunct_Break and Extended_Pictographic
    properties) of every code point. Additionally, some characters have a
    field width of 2, which requires another lookup table of field widths
    for every code point.  The tables added in this commit do not contain
    entries for every code point from 0 to 0x10FFFF as that would be very
    inefficient and use too much memory. Instead the tables only contain the
    code points that form an "edge" for a property, omitting all the code
    points that have the same property as the preceding one. We can use a
    binary search to find the closest code point in the table that is not
    greater than the one we're looking for.
    
    The tables are generated by a new Python script added to the
    contrib/unicode directory, and a new data file downloaded from the
    Unicode Consortium website.
    
    The rules for extended grapheme cluster breaking are implemented for the
    latest Unicode standard, version 15.1.0.
    
    libstdc++-v3/ChangeLog:
    
            * include/Makefile.am: Add new headers.
            * include/Makefile.in: Regenerate.
            * include/bits/unicode.h: New file.
            * include/bits/unicode-data.h: New file.
            * include/std/format: Include <bits/unicode.h>.
            (__literal_encoding_is_utf8): Move to <bits/unicode.h>.
            (_Spec::_M_fill): Change type to char32_t.
            (_Spec::_M_parse_fill_and_align): Read a Unicode scalar value
            instead of a single character.
            (__write_padded): Change __fill_char parameter to char32_t and
            encode it into the output.
            (__formatter_str::format): Use new __unicode::__field_width and
            __unicode::__truncate functions.
            * include/std/ostream: Adjust namespace qualification for
            __literal_encoding_is_utf8.
            * include/std/print: Likewise.
            * src/c++23/print.cc: Add [[unlikely]] attribute to error path.
            * testsuite/ext/unicode/view.cc: New test.
            * testsuite/std/format/functions/format.cc: Add missing examples
            from the standard demonstrating alignment with non-ASCII
            characters. Add examples checking correct handling of extended
            grapheme clusters.
    
    contrib/ChangeLog:
    
            * unicode/README: Add notes about generating libstdc++ tables.
            * unicode/GraphemeBreakProperty.txt: New file.
            * unicode/emoji-data.txt: New file.
            * unicode/gen_libstdcxx_unicode_data.py: New file.

Diff:
---
 contrib/unicode/GraphemeBreakProperty.txt          | 1475 ++++++++++++++++++++
 contrib/unicode/README                             |   12 +-
 contrib/unicode/emoji-data.txt                     | 1320 ++++++++++++++++++
 contrib/unicode/gen_libstdcxx_unicode_data.py      |  222 +++
 libstdc++-v3/include/Makefile.am                   |    2 +
 libstdc++-v3/include/Makefile.in                   |    2 +
 libstdc++-v3/include/bits/unicode-data.h           |  449 ++++++
 libstdc++-v3/include/bits/unicode.h                | 1065 ++++++++++++++
 libstdc++-v3/include/std/format                    |  116 +-
 libstdc++-v3/include/std/ostream                   |    2 +-
 libstdc++-v3/include/std/print                     |    2 +-
 libstdc++-v3/src/c++23/print.cc                    |    2 +-
 libstdc++-v3/testsuite/ext/unicode/view.cc         |  102 ++
 .../testsuite/std/format/functions/format.cc       |   67 +
 14 files changed, 4776 insertions(+), 62 deletions(-)

diff --git a/contrib/unicode/GraphemeBreakProperty.txt b/contrib/unicode/GraphemeBreakProperty.txt
new file mode 100644
index 00000000000..12453cbdb54
--- /dev/null
+++ b/contrib/unicode/GraphemeBreakProperty.txt
@@ -0,0 +1,1475 @@
+# GraphemeBreakProperty-15.1.0.txt
+# Date: 2023-01-05, 20:34:41 GMT
+# © 2023 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
+#
+# Unicode Character Database
+#   For documentation, see https://www.unicode.org/reports/tr44/
+
+# ================================================
+
+# Property:	Grapheme_Cluster_Break
+
+#  All code points not explicitly listed for Grapheme_Cluster_Break
+#  have the value Other (XX).
+
+# @missing: 0000..10FFFF; Other
+
+# ================================================
+
+0600..0605    ; Prepend # Cf   [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE
+06DD          ; Prepend # Cf       ARABIC END OF AYAH
+070F          ; Prepend # Cf       SYRIAC ABBREVIATION MARK
+0890..0891    ; Prepend # Cf   [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE
+08E2          ; Prepend # Cf       ARABIC DISPUTED END OF AYAH
+0D4E          ; Prepend # Lo       MALAYALAM LETTER DOT REPH
+110BD         ; Prepend # Cf       KAITHI NUMBER SIGN
+110CD         ; Prepend # Cf       KAITHI NUMBER SIGN ABOVE
+111C2..111C3  ; Prepend # Lo   [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA
+1193F         ; Prepend # Lo       DIVES AKURU PREFIXED NASAL SIGN
+11941         ; Prepend # Lo       DIVES AKURU INITIAL RA
+11A3A         ; Prepend # Lo       ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA
+11A84..11A89  ; Prepend # Lo   [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA
+11D46         ; Prepend # Lo       MASARAM GONDI REPHA
+11F02         ; Prepend # Lo       KAWI SIGN REPHA
+
+# Total code points: 27
+
+# ================================================
+
+000D          ; CR # Cc       <control-000D>
+
+# Total code points: 1
+
+# ================================================
+
+000A          ; LF # Cc       <control-000A>
+
+# Total code points: 1
+
+# ================================================
+
+0000..0009    ; Control # Cc  [10] <control-0000>..<control-0009>
+000B..000C    ; Control # Cc   [2] <control-000B>..<control-000C>
+000E..001F    ; Control # Cc  [18] <control-000E>..<control-001F>
+007F..009F    ; Control # Cc  [33] <control-007F>..<control-009F>
+00AD          ; Control # Cf       SOFT HYPHEN
+061C          ; Control # Cf       ARABIC LETTER MARK
+180E          ; Control # Cf       MONGOLIAN VOWEL SEPARATOR
+200B          ; Control # Cf       ZERO WIDTH SPACE
+200E..200F    ; Control # Cf   [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+2028          ; Control # Zl       LINE SEPARATOR
+2029          ; Control # Zp       PARAGRAPH SEPARATOR
+202A..202E    ; Control # Cf   [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+2060..2064    ; Control # Cf   [5] WORD JOINER..INVISIBLE PLUS
+2065          ; Control # Cn       <reserved-2065>
+2066..206F    ; Control # Cf  [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES
+FEFF          ; Control # Cf       ZERO WIDTH NO-BREAK SPACE
+FFF0..FFF8    ; Control # Cn   [9] <reserved-FFF0>..<reserved-FFF8>
+FFF9..FFFB    ; Control # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+13430..1343F  ; Control # Cf  [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+1BCA0..1BCA3  ; Control # Cf   [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
+1D173..1D17A  ; Control # Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+E0000         ; Control # Cn       <reserved-E0000>
+E0001         ; Control # Cf       LANGUAGE TAG
+E0002..E001F  ; Control # Cn  [30] <reserved-E0002>..<reserved-E001F>
+E0080..E00FF  ; Control # Cn [128] <reserved-E0080>..<reserved-E00FF>
+E01F0..E0FFF  ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
+
+# Total code points: 3893
+
+# ================================================
+
+0300..036F    ; Extend # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+0483..0487    ; Extend # Mn   [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0488..0489    ; Extend # Me   [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+0591..05BD    ; Extend # Mn  [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BF          ; Extend # Mn       HEBREW POINT RAFE
+05C1..05C2    ; Extend # Mn   [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5    ; Extend # Mn   [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7          ; Extend # Mn       HEBREW POINT QAMATS QATAN
+0610..061A    ; Extend # Mn  [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+064B..065F    ; Extend # Mn  [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW
+0670          ; Extend # Mn       ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC    ; Extend # Mn   [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DF..06E4    ; Extend # Mn   [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E7..06E8    ; Extend # Mn   [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06EA..06ED    ; Extend # Mn   [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+0711          ; Extend # Mn       SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..074A    ; Extend # Mn  [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0    ; Extend # Mn  [11] THAANA ABAFILI..THAANA SUKUN
+07EB..07F3    ; Extend # Mn   [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07FD          ; Extend # Mn       NKO DANTAYALAN
+0816..0819    ; Extend # Mn   [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
+081B..0823    ; Extend # Mn   [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0825..0827    ; Extend # Mn   [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0829..082D    ; Extend # Mn   [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+0859..085B    ; Extend # Mn   [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK
+0898..089F    ; Extend # Mn   [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA
+08CA..08E1    ; Extend # Mn  [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA
+08E3..0902    ; Extend # Mn  [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA
+093A          ; Extend # Mn       DEVANAGARI VOWEL SIGN OE
+093C          ; Extend # Mn       DEVANAGARI SIGN NUKTA
+0941..0948    ; Extend # Mn   [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+094D          ; Extend # Mn       DEVANAGARI SIGN VIRAMA
+0951..0957    ; Extend # Mn   [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE
+0962..0963    ; Extend # Mn   [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0981          ; Extend # Mn       BENGALI SIGN CANDRABINDU
+09BC          ; Extend # Mn       BENGALI SIGN NUKTA
+09BE          ; Extend # Mc       BENGALI VOWEL SIGN AA
+09C1..09C4    ; Extend # Mn   [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09CD          ; Extend # Mn       BENGALI SIGN VIRAMA
+09D7          ; Extend # Mc       BENGALI AU LENGTH MARK
+09E2..09E3    ; Extend # Mn   [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09FE          ; Extend # Mn       BENGALI SANDHI MARK
+0A01..0A02    ; Extend # Mn   [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A3C          ; Extend # Mn       GURMUKHI SIGN NUKTA
+0A41..0A42    ; Extend # Mn   [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48    ; Extend # Mn   [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D    ; Extend # Mn   [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51          ; Extend # Mn       GURMUKHI SIGN UDAAT
+0A70..0A71    ; Extend # Mn   [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A75          ; Extend # Mn       GURMUKHI SIGN YAKASH
+0A81..0A82    ; Extend # Mn   [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0ABC          ; Extend # Mn       GUJARATI SIGN NUKTA
+0AC1..0AC5    ; Extend # Mn   [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8    ; Extend # Mn   [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0ACD          ; Extend # Mn       GUJARATI SIGN VIRAMA
+0AE2..0AE3    ; Extend # Mn   [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AFA..0AFF    ; Extend # Mn   [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE
+0B01          ; Extend # Mn       ORIYA SIGN CANDRABINDU
+0B3C          ; Extend # Mn       ORIYA SIGN NUKTA
+0B3E          ; Extend # Mc       ORIYA VOWEL SIGN AA
+0B3F          ; Extend # Mn       ORIYA VOWEL SIGN I
+0B41..0B44    ; Extend # Mn   [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B4D          ; Extend # Mn       ORIYA SIGN VIRAMA
+0B55..0B56    ; Extend # Mn   [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK
+0B57          ; Extend # Mc       ORIYA AU LENGTH MARK
+0B62..0B63    ; Extend # Mn   [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B82          ; Extend # Mn       TAMIL SIGN ANUSVARA
+0BBE          ; Extend # Mc       TAMIL VOWEL SIGN AA
+0BC0          ; Extend # Mn       TAMIL VOWEL SIGN II
+0BCD          ; Extend # Mn       TAMIL SIGN VIRAMA
+0BD7          ; Extend # Mc       TAMIL AU LENGTH MARK
+0C00          ; Extend # Mn       TELUGU SIGN COMBINING CANDRABINDU ABOVE
+0C04          ; Extend # Mn       TELUGU SIGN COMBINING ANUSVARA ABOVE
+0C3C          ; Extend # Mn       TELUGU SIGN NUKTA
+0C3E..0C40    ; Extend # Mn   [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C46..0C48    ; Extend # Mn   [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D    ; Extend # Mn   [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56    ; Extend # Mn   [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C62..0C63    ; Extend # Mn   [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C81          ; Extend # Mn       KANNADA SIGN CANDRABINDU
+0CBC          ; Extend # Mn       KANNADA SIGN NUKTA
+0CBF          ; Extend # Mn       KANNADA VOWEL SIGN I
+0CC2          ; Extend # Mc       KANNADA VOWEL SIGN UU
+0CC6          ; Extend # Mn       KANNADA VOWEL SIGN E
+0CCC..0CCD    ; Extend # Mn   [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6    ; Extend # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CE2..0CE3    ; Extend # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0D00..0D01    ; Extend # Mn   [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
+0D3B..0D3C    ; Extend # Mn   [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
+0D3E          ; Extend # Mc       MALAYALAM VOWEL SIGN AA
+0D41..0D44    ; Extend # Mn   [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D4D          ; Extend # Mn       MALAYALAM SIGN VIRAMA
+0D57          ; Extend # Mc       MALAYALAM AU LENGTH MARK
+0D62..0D63    ; Extend # Mn   [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D81          ; Extend # Mn       SINHALA SIGN CANDRABINDU
+0DCA          ; Extend # Mn       SINHALA SIGN AL-LAKUNA
+0DCF          ; Extend # Mc       SINHALA VOWEL SIGN AELA-PILLA
+0DD2..0DD4    ; Extend # Mn   [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6          ; Extend # Mn       SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DDF          ; Extend # Mc       SINHALA VOWEL SIGN GAYANUKITTA
+0E31          ; Extend # Mn       THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A    ; Extend # Mn   [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E47..0E4E    ; Extend # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0EB1          ; Extend # Mn       LAO VOWEL SIGN MAI KAN
+0EB4..0EBC    ; Extend # Mn   [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
+0EC8..0ECE    ; Extend # Mn   [7] LAO TONE MAI EK..LAO YAMAKKAN
+0F18..0F19    ; Extend # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35          ; Extend # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37          ; Extend # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39          ; Extend # Mn       TIBETAN MARK TSA -PHRU
+0F71..0F7E    ; Extend # Mn  [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F80..0F84    ; Extend # Mn   [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F86..0F87    ; Extend # Mn   [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F8D..0F97    ; Extend # Mn  [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC    ; Extend # Mn  [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FC6          ; Extend # Mn       TIBETAN SYMBOL PADMA GDAN
+102D..1030    ; Extend # Mn   [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1032..1037    ; Extend # Mn   [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1039..103A    ; Extend # Mn   [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103D..103E    ; Extend # Mn   [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+1058..1059    ; Extend # Mn   [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105E..1060    ; Extend # Mn   [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1071..1074    ; Extend # Mn   [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1082          ; Extend # Mn       MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1085..1086    ; Extend # Mn   [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+108D          ; Extend # Mn       MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+109D          ; Extend # Mn       MYANMAR VOWEL SIGN AITON AI
+135D..135F    ; Extend # Mn   [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK
+1712..1714    ; Extend # Mn   [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1732..1733    ; Extend # Mn   [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
+1752..1753    ; Extend # Mn   [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773    ; Extend # Mn   [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B4..17B5    ; Extend # Mn   [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B7..17BD    ; Extend # Mn   [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17C6          ; Extend # Mn       KHMER SIGN NIKAHIT
+17C9..17D3    ; Extend # Mn  [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD          ; Extend # Mn       KHMER SIGN ATTHACAN
+180B..180D    ; Extend # Mn   [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+180F          ; Extend # Mn       MONGOLIAN FREE VARIATION SELECTOR FOUR
+1885..1886    ; Extend # Mn   [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
+18A9          ; Extend # Mn       MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922    ; Extend # Mn   [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1927..1928    ; Extend # Mn   [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1932          ; Extend # Mn       LIMBU SMALL LETTER ANUSVARA
+1939..193B    ; Extend # Mn   [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1A17..1A18    ; Extend # Mn   [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A1B          ; Extend # Mn       BUGINESE VOWEL SIGN AE
+1A56          ; Extend # Mn       TAI THAM CONSONANT SIGN MEDIAL LA
+1A58..1A5E    ; Extend # Mn   [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A60          ; Extend # Mn       TAI THAM SIGN SAKOT
+1A62          ; Extend # Mn       TAI THAM VOWEL SIGN MAI SAT
+1A65..1A6C    ; Extend # Mn   [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A73..1A7C    ; Extend # Mn  [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F          ; Extend # Mn       TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1AB0..1ABD    ; Extend # Mn  [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW
+1ABE          ; Extend # Me       COMBINING PARENTHESES OVERLAY
+1ABF..1ACE    ; Extend # Mn  [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T
+1B00..1B03    ; Extend # Mn   [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B34          ; Extend # Mn       BALINESE SIGN REREKAN
+1B35          ; Extend # Mc       BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A    ; Extend # Mn   [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3C          ; Extend # Mn       BALINESE VOWEL SIGN LA LENGA
+1B42          ; Extend # Mn       BALINESE VOWEL SIGN PEPET
+1B6B..1B73    ; Extend # Mn   [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B80..1B81    ; Extend # Mn   [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1BA2..1BA5    ; Extend # Mn   [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA8..1BA9    ; Extend # Mn   [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1BAB..1BAD    ; Extend # Mn   [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA
+1BE6          ; Extend # Mn       BATAK SIGN TOMPI
+1BE8..1BE9    ; Extend # Mn   [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE
+1BED          ; Extend # Mn       BATAK VOWEL SIGN KARO O
+1BEF..1BF1    ; Extend # Mn   [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H
+1C2C..1C33    ; Extend # Mn   [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C36..1C37    ; Extend # Mn   [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1CD0..1CD2    ; Extend # Mn   [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD4..1CE0    ; Extend # Mn  [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE2..1CE8    ; Extend # Mn   [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CED          ; Extend # Mn       VEDIC SIGN TIRYAK
+1CF4          ; Extend # Mn       VEDIC TONE CANDRA ABOVE
+1CF8..1CF9    ; Extend # Mn   [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
+1DC0..1DFF    ; Extend # Mn  [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+200C          ; Extend # Cf       ZERO WIDTH NON-JOINER
+20D0..20DC    ; Extend # Mn  [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0    ; Extend # Me   [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1          ; Extend # Mn       COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4    ; Extend # Me   [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20F0    ; Extend # Mn  [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+2CEF..2CF1    ; Extend # Mn   [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2D7F          ; Extend # Mn       TIFINAGH CONSONANT JOINER
+2DE0..2DFF    ; Extend # Mn  [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+302A..302D    ; Extend # Mn   [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK
+302E..302F    ; Extend # Mc   [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A    ; Extend # Mn   [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+A66F          ; Extend # Mn       COMBINING CYRILLIC VZMET
+A670..A672    ; Extend # Me   [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A674..A67D    ; Extend # Mn  [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK
+A69E..A69F    ; Extend # Mn   [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E
+A6F0..A6F1    ; Extend # Mn   [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A802          ; Extend # Mn       SYLOTI NAGRI SIGN DVISVARA
+A806          ; Extend # Mn       SYLOTI NAGRI SIGN HASANTA
+A80B          ; Extend # Mn       SYLOTI NAGRI SIGN ANUSVARA
+A825..A826    ; Extend # Mn   [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A82C          ; Extend # Mn       SYLOTI NAGRI SIGN ALTERNATE HASANTA
+A8C4..A8C5    ; Extend # Mn   [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU
+A8E0..A8F1    ; Extend # Mn  [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A8FF          ; Extend # Mn       DEVANAGARI VOWEL SIGN AY
+A926..A92D    ; Extend # Mn   [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A947..A951    ; Extend # Mn  [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A980..A982    ; Extend # Mn   [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A9B3          ; Extend # Mn       JAVANESE SIGN CECAK TELU
+A9B6..A9B9    ; Extend # Mn   [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BC..A9BD    ; Extend # Mn   [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET
+A9E5          ; Extend # Mn       MYANMAR SIGN SHAN SAW
+AA29..AA2E    ; Extend # Mn   [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA31..AA32    ; Extend # Mn   [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA35..AA36    ; Extend # Mn   [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA43          ; Extend # Mn       CHAM CONSONANT SIGN FINAL NG
+AA4C          ; Extend # Mn       CHAM CONSONANT SIGN FINAL M
+AA7C          ; Extend # Mn       MYANMAR SIGN TAI LAING TONE-2
+AAB0          ; Extend # Mn       TAI VIET MAI KANG
+AAB2..AAB4    ; Extend # Mn   [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB7..AAB8    ; Extend # Mn   [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AABE..AABF    ; Extend # Mn   [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+AAC1          ; Extend # Mn       TAI VIET TONE MAI THO
+AAEC..AAED    ; Extend # Mn   [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI
+AAF6          ; Extend # Mn       MEETEI MAYEK VIRAMA
+ABE5          ; Extend # Mn       MEETEI MAYEK VOWEL SIGN ANAP
+ABE8          ; Extend # Mn       MEETEI MAYEK VOWEL SIGN UNAP
+ABED          ; Extend # Mn       MEETEI MAYEK APUN IYEK
+FB1E          ; Extend # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
+FE00..FE0F    ; Extend # Mn  [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE2F    ; Extend # Mn  [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF
+FF9E..FF9F    ; Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+101FD         ; Extend # Mn       PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+102E0         ; Extend # Mn       COPTIC EPACT THOUSANDS MARK
+10376..1037A  ; Extend # Mn   [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII
+10A01..10A03  ; Extend # Mn   [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06  ; Extend # Mn   [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F  ; Extend # Mn   [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A38..10A3A  ; Extend # Mn   [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F         ; Extend # Mn       KHAROSHTHI VIRAMA
+10AE5..10AE6  ; Extend # Mn   [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
+10D24..10D27  ; Extend # Mn   [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
+10EAB..10EAC  ; Extend # Mn   [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF  ; Extend # Mn   [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
+10F46..10F50  ; Extend # Mn  [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
+10F82..10F85  ; Extend # Mn   [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
+11001         ; Extend # Mn       BRAHMI SIGN ANUSVARA
+11038..11046  ; Extend # Mn  [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA
+11070         ; Extend # Mn       BRAHMI SIGN OLD TAMIL VIRAMA
+11073..11074  ; Extend # Mn   [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O
+1107F..11081  ; Extend # Mn   [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA
+110B3..110B6  ; Extend # Mn   [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B9..110BA  ; Extend # Mn   [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+110C2         ; Extend # Mn       KAITHI VOWEL SIGN VOCALIC R
+11100..11102  ; Extend # Mn   [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA
+11127..1112B  ; Extend # Mn   [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
+1112D..11134  ; Extend # Mn   [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA
+11173         ; Extend # Mn       MAHAJANI SIGN NUKTA
+11180..11181  ; Extend # Mn   [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA
+111B6..111BE  ; Extend # Mn   [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O
+111C9..111CC  ; Extend # Mn   [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK
+111CF         ; Extend # Mn       SHARADA SIGN INVERTED CANDRABINDU
+1122F..11231  ; Extend # Mn   [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI
+11234         ; Extend # Mn       KHOJKI SIGN ANUSVARA
+11236..11237  ; Extend # Mn   [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
+1123E         ; Extend # Mn       KHOJKI SIGN SUKUN
+11241         ; Extend # Mn       KHOJKI VOWEL SIGN VOCALIC R
+112DF         ; Extend # Mn       KHUDAWADI SIGN ANUSVARA
+112E3..112EA  ; Extend # Mn   [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
+11300..11301  ; Extend # Mn   [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
+1133B..1133C  ; Extend # Mn   [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA
+1133E         ; Extend # Mc       GRANTHA VOWEL SIGN AA
+11340         ; Extend # Mn       GRANTHA VOWEL SIGN II
+11357         ; Extend # Mc       GRANTHA AU LENGTH MARK
+11366..1136C  ; Extend # Mn   [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX
+11370..11374  ; Extend # Mn   [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA
+11438..1143F  ; Extend # Mn   [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI
+11442..11444  ; Extend # Mn   [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA
+11446         ; Extend # Mn       NEWA SIGN NUKTA
+1145E         ; Extend # Mn       NEWA SANDHI MARK
+114B0         ; Extend # Mc       TIRHUTA VOWEL SIGN AA
+114B3..114B8  ; Extend # Mn   [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL
+114BA         ; Extend # Mn       TIRHUTA VOWEL SIGN SHORT E
+114BD         ; Extend # Mc       TIRHUTA VOWEL SIGN SHORT O
+114BF..114C0  ; Extend # Mn   [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA
+114C2..114C3  ; Extend # Mn   [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA
+115AF         ; Extend # Mc       SIDDHAM VOWEL SIGN AA
+115B2..115B5  ; Extend # Mn   [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR
+115BC..115BD  ; Extend # Mn   [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA
+115BF..115C0  ; Extend # Mn   [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA
+115DC..115DD  ; Extend # Mn   [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU
+11633..1163A  ; Extend # Mn   [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI
+1163D         ; Extend # Mn       MODI SIGN ANUSVARA
+1163F..11640  ; Extend # Mn   [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA
+116AB         ; Extend # Mn       TAKRI SIGN ANUSVARA
+116AD         ; Extend # Mn       TAKRI VOWEL SIGN AA
+116B0..116B5  ; Extend # Mn   [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU
+116B7         ; Extend # Mn       TAKRI SIGN NUKTA
+1171D..1171F  ; Extend # Mn   [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA
+11722..11725  ; Extend # Mn   [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
+11727..1172B  ; Extend # Mn   [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER
+1182F..11837  ; Extend # Mn   [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
+11839..1183A  ; Extend # Mn   [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
+11930         ; Extend # Mc       DIVES AKURU VOWEL SIGN AA
+1193B..1193C  ; Extend # Mn   [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU
+1193E         ; Extend # Mn       DIVES AKURU VIRAMA
+11943         ; Extend # Mn       DIVES AKURU SIGN NUKTA
+119D4..119D7  ; Extend # Mn   [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR
+119DA..119DB  ; Extend # Mn   [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI
+119E0         ; Extend # Mn       NANDINAGARI SIGN VIRAMA
+11A01..11A0A  ; Extend # Mn  [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
+11A33..11A38  ; Extend # Mn   [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA
+11A3B..11A3E  ; Extend # Mn   [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
+11A47         ; Extend # Mn       ZANABAZAR SQUARE SUBJOINER
+11A51..11A56  ; Extend # Mn   [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE
+11A59..11A5B  ; Extend # Mn   [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK
+11A8A..11A96  ; Extend # Mn  [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA
+11A98..11A99  ; Extend # Mn   [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
+11C30..11C36  ; Extend # Mn   [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L
+11C38..11C3D  ; Extend # Mn   [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA
+11C3F         ; Extend # Mn       BHAIKSUKI SIGN VIRAMA
+11C92..11CA7  ; Extend # Mn  [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA
+11CAA..11CB0  ; Extend # Mn   [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA
+11CB2..11CB3  ; Extend # Mn   [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E
+11CB5..11CB6  ; Extend # Mn   [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU
+11D31..11D36  ; Extend # Mn   [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R
+11D3A         ; Extend # Mn       MASARAM GONDI VOWEL SIGN E
+11D3C..11D3D  ; Extend # Mn   [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O
+11D3F..11D45  ; Extend # Mn   [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA
+11D47         ; Extend # Mn       MASARAM GONDI RA-KARA
+11D90..11D91  ; Extend # Mn   [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
+11D95         ; Extend # Mn       GUNJALA GONDI SIGN ANUSVARA
+11D97         ; Extend # Mn       GUNJALA GONDI VIRAMA
+11EF3..11EF4  ; Extend # Mn   [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
+11F00..11F01  ; Extend # Mn   [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F36..11F3A  ; Extend # Mn   [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F40         ; Extend # Mn       KAWI VOWEL SIGN EU
+11F42         ; Extend # Mn       KAWI CONJOINER
+13440         ; Extend # Mn       EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455  ; Extend # Mn  [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
+16AF0..16AF4  ; Extend # Mn   [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
+16B30..16B36  ; Extend # Mn   [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
+16F4F         ; Extend # Mn       MIAO SIGN CONSONANT MODIFIER BAR
+16F8F..16F92  ; Extend # Mn   [4] MIAO TONE RIGHT..MIAO TONE BELOW
+16FE4         ; Extend # Mn       KHITAN SMALL SCRIPT FILLER
+1BC9D..1BC9E  ; Extend # Mn   [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK
+1CF00..1CF2D  ; Extend # Mn  [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT
+1CF30..1CF46  ; Extend # Mn  [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG
+1D165         ; Extend # Mc       MUSICAL SYMBOL COMBINING STEM
+1D167..1D169  ; Extend # Mn   [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16E..1D172  ; Extend # Mc   [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5
+1D17B..1D182  ; Extend # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B  ; Extend # Mn   [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD  ; Extend # Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D242..1D244  ; Extend # Mn   [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+1DA00..1DA36  ; Extend # Mn  [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN
+1DA3B..1DA6C  ; Extend # Mn  [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT
+1DA75         ; Extend # Mn       SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS
+1DA84         ; Extend # Mn       SIGNWRITING LOCATION HEAD NECK
+1DA9B..1DA9F  ; Extend # Mn   [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6
+1DAA1..1DAAF  ; Extend # Mn  [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16
+1E000..1E006  ; Extend # Mn   [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
+1E008..1E018  ; Extend # Mn  [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
+1E01B..1E021  ; Extend # Mn   [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
+1E023..1E024  ; Extend # Mn   [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
+1E026..1E02A  ; Extend # Mn   [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F         ; Extend # Mn       COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+1E130..1E136  ; Extend # Mn   [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
+1E2AE         ; Extend # Mn       TOTO SIGN RISING TONE
+1E2EC..1E2EF  ; Extend # Mn   [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF  ; Extend # Mn   [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
+1E8D0..1E8D6  ; Extend # Mn   [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
+1E944..1E94A  ; Extend # Mn   [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
+1F3FB..1F3FF  ; Extend # Sk   [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
+E0020..E007F  ; Extend # Cf  [96] TAG SPACE..CANCEL TAG
+E0100..E01EF  ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 2130
+
+# ================================================
+
+1F1E6..1F1FF  ; Regional_Indicator # So  [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
+
+# Total code points: 26
+
+# ================================================
+
+0903          ; SpacingMark # Mc       DEVANAGARI SIGN VISARGA
+093B          ; SpacingMark # Mc       DEVANAGARI VOWEL SIGN OOE
+093E..0940    ; SpacingMark # Mc   [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0949..094C    ; SpacingMark # Mc   [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094E..094F    ; SpacingMark # Mc   [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW
+0982..0983    ; SpacingMark # Mc   [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+09BF..09C0    ; SpacingMark # Mc   [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II
+09C7..09C8    ; SpacingMark # Mc   [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC    ; SpacingMark # Mc   [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+0A03          ; SpacingMark # Mc       GURMUKHI SIGN VISARGA
+0A3E..0A40    ; SpacingMark # Mc   [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A83          ; SpacingMark # Mc       GUJARATI SIGN VISARGA
+0ABE..0AC0    ; SpacingMark # Mc   [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC9          ; SpacingMark # Mc       GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC    ; SpacingMark # Mc   [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0B02..0B03    ; SpacingMark # Mc   [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B40          ; SpacingMark # Mc       ORIYA VOWEL SIGN II
+0B47..0B48    ; SpacingMark # Mc   [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C    ; SpacingMark # Mc   [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0BBF          ; SpacingMark # Mc       TAMIL VOWEL SIGN I
+0BC1..0BC2    ; SpacingMark # Mc   [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8    ; SpacingMark # Mc   [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC    ; SpacingMark # Mc   [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0C01..0C03    ; SpacingMark # Mc   [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C41..0C44    ; SpacingMark # Mc   [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C82..0C83    ; SpacingMark # Mc   [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0CBE          ; SpacingMark # Mc       KANNADA VOWEL SIGN AA
+0CC0..0CC1    ; SpacingMark # Mc   [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U
+0CC3..0CC4    ; SpacingMark # Mc   [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR
+0CC7..0CC8    ; SpacingMark # Mc   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB    ; SpacingMark # Mc   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CF3          ; SpacingMark # Mc       KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
+0D02..0D03    ; SpacingMark # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D3F..0D40    ; SpacingMark # Mc   [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II
+0D46..0D48    ; SpacingMark # Mc   [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C    ; SpacingMark # Mc   [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D82..0D83    ; SpacingMark # Mc   [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0DD0..0DD1    ; SpacingMark # Mc   [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD8..0DDE    ; SpacingMark # Mc   [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DF2..0DF3    ; SpacingMark # Mc   [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0E33          ; SpacingMark # Lo       THAI CHARACTER SARA AM
+0EB3          ; SpacingMark # Lo       LAO VOWEL SIGN AM
+0F3E..0F3F    ; SpacingMark # Mc   [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F7F          ; SpacingMark # Mc       TIBETAN SIGN RNAM BCAD
+1031          ; SpacingMark # Mc       MYANMAR VOWEL SIGN E
+103B..103C    ; SpacingMark # Mc   [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+1056..1057    ; SpacingMark # Mc   [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1084          ; SpacingMark # Mc       MYANMAR VOWEL SIGN SHAN E
+1715          ; SpacingMark # Mc       TAGALOG SIGN PAMUDPOD
+1734          ; SpacingMark # Mc       HANUNOO SIGN PAMUDPOD
+17B6          ; SpacingMark # Mc       KHMER VOWEL SIGN AA
+17BE..17C5    ; SpacingMark # Mc   [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C7..17C8    ; SpacingMark # Mc   [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+1923..1926    ; SpacingMark # Mc   [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1929..192B    ; SpacingMark # Mc   [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931    ; SpacingMark # Mc   [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1933..1938    ; SpacingMark # Mc   [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1A19..1A1A    ; SpacingMark # Mc   [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O
+1A55          ; SpacingMark # Mc       TAI THAM CONSONANT SIGN MEDIAL RA
+1A57          ; SpacingMark # Mc       TAI THAM CONSONANT SIGN LA TANG LAI
+1A6D..1A72    ; SpacingMark # Mc   [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+1B04          ; SpacingMark # Mc       BALINESE SIGN BISAH
+1B3B          ; SpacingMark # Mc       BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3D..1B41    ; SpacingMark # Mc   [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B43..1B44    ; SpacingMark # Mc   [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
+1B82          ; SpacingMark # Mc       SUNDANESE SIGN PANGWISAD
+1BA1          ; SpacingMark # Mc       SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA6..1BA7    ; SpacingMark # Mc   [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BAA          ; SpacingMark # Mc       SUNDANESE SIGN PAMAAEH
+1BE7          ; SpacingMark # Mc       BATAK VOWEL SIGN E
+1BEA..1BEC    ; SpacingMark # Mc   [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O
+1BEE          ; SpacingMark # Mc       BATAK VOWEL SIGN U
+1BF2..1BF3    ; SpacingMark # Mc   [2] BATAK PANGOLAT..BATAK PANONGONAN
+1C24..1C2B    ; SpacingMark # Mc   [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C34..1C35    ; SpacingMark # Mc   [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1CE1          ; SpacingMark # Mc       VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CF7          ; SpacingMark # Mc       VEDIC SIGN ATIKRAMA
+A823..A824    ; SpacingMark # Mc   [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A827          ; SpacingMark # Mc       SYLOTI NAGRI VOWEL SIGN OO
+A880..A881    ; SpacingMark # Mc   [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A8B4..A8C3    ; SpacingMark # Mc  [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A952..A953    ; SpacingMark # Mc   [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
+A983          ; SpacingMark # Mc       JAVANESE SIGN WIGNYAN
+A9B4..A9B5    ; SpacingMark # Mc   [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
+A9BA..A9BB    ; SpacingMark # Mc   [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
+A9BE..A9C0    ; SpacingMark # Mc   [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON
+AA2F..AA30    ; SpacingMark # Mc   [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA33..AA34    ; SpacingMark # Mc   [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA4D          ; SpacingMark # Mc       CHAM CONSONANT SIGN FINAL H
+AAEB          ; SpacingMark # Mc       MEETEI MAYEK VOWEL SIGN II
+AAEE..AAEF    ; SpacingMark # Mc   [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU
+AAF5          ; SpacingMark # Mc       MEETEI MAYEK VOWEL SIGN VISARGA
+ABE3..ABE4    ; SpacingMark # Mc   [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
+ABE6..ABE7    ; SpacingMark # Mc   [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE9..ABEA    ; SpacingMark # Mc   [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
+ABEC          ; SpacingMark # Mc       MEETEI MAYEK LUM IYEK
+11000         ; SpacingMark # Mc       BRAHMI SIGN CANDRABINDU
+11002         ; SpacingMark # Mc       BRAHMI SIGN VISARGA
+11082         ; SpacingMark # Mc       KAITHI SIGN VISARGA
+110B0..110B2  ; SpacingMark # Mc   [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
+110B7..110B8  ; SpacingMark # Mc   [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+1112C         ; SpacingMark # Mc       CHAKMA VOWEL SIGN E
+11145..11146  ; SpacingMark # Mc   [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI
+11182         ; SpacingMark # Mc       SHARADA SIGN VISARGA
+111B3..111B5  ; SpacingMark # Mc   [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II
+111BF..111C0  ; SpacingMark # Mc   [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
+111CE         ; SpacingMark # Mc       SHARADA VOWEL SIGN PRISHTHAMATRA E
+1122C..1122E  ; SpacingMark # Mc   [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II
+11232..11233  ; SpacingMark # Mc   [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU
+11235         ; SpacingMark # Mc       KHOJKI SIGN VIRAMA
+112E0..112E2  ; SpacingMark # Mc   [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II
+11302..11303  ; SpacingMark # Mc   [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA
+1133F         ; SpacingMark # Mc       GRANTHA VOWEL SIGN I
+11341..11344  ; SpacingMark # Mc   [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR
+11347..11348  ; SpacingMark # Mc   [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI
+1134B..1134D  ; SpacingMark # Mc   [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA
+11362..11363  ; SpacingMark # Mc   [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL
+11435..11437  ; SpacingMark # Mc   [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II
+11440..11441  ; SpacingMark # Mc   [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU
+11445         ; SpacingMark # Mc       NEWA SIGN VISARGA
+114B1..114B2  ; SpacingMark # Mc   [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II
+114B9         ; SpacingMark # Mc       TIRHUTA VOWEL SIGN E
+114BB..114BC  ; SpacingMark # Mc   [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O
+114BE         ; SpacingMark # Mc       TIRHUTA VOWEL SIGN AU
+114C1         ; SpacingMark # Mc       TIRHUTA SIGN VISARGA
+115B0..115B1  ; SpacingMark # Mc   [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II
+115B8..115BB  ; SpacingMark # Mc   [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU
+115BE         ; SpacingMark # Mc       SIDDHAM SIGN VISARGA
+11630..11632  ; SpacingMark # Mc   [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II
+1163B..1163C  ; SpacingMark # Mc   [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU
+1163E         ; SpacingMark # Mc       MODI SIGN VISARGA
+116AC         ; SpacingMark # Mc       TAKRI SIGN VISARGA
+116AE..116AF  ; SpacingMark # Mc   [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II
+116B6         ; SpacingMark # Mc       TAKRI SIGN VIRAMA
+11726         ; SpacingMark # Mc       AHOM VOWEL SIGN E
+1182C..1182E  ; SpacingMark # Mc   [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
+11838         ; SpacingMark # Mc       DOGRA SIGN VISARGA
+11931..11935  ; SpacingMark # Mc   [5] DIVES AKURU VOWEL SIGN I..DIVES AKURU VOWEL SIGN E
+11937..11938  ; SpacingMark # Mc   [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O
+1193D         ; SpacingMark # Mc       DIVES AKURU SIGN HALANTA
+11940         ; SpacingMark # Mc       DIVES AKURU MEDIAL YA
+11942         ; SpacingMark # Mc       DIVES AKURU MEDIAL RA
+119D1..119D3  ; SpacingMark # Mc   [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II
+119DC..119DF  ; SpacingMark # Mc   [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA
+119E4         ; SpacingMark # Mc       NANDINAGARI VOWEL SIGN PRISHTHAMATRA E
+11A39         ; SpacingMark # Mc       ZANABAZAR SQUARE SIGN VISARGA
+11A57..11A58  ; SpacingMark # Mc   [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU
+11A97         ; SpacingMark # Mc       SOYOMBO SIGN VISARGA
+11C2F         ; SpacingMark # Mc       BHAIKSUKI VOWEL SIGN AA
+11C3E         ; SpacingMark # Mc       BHAIKSUKI SIGN VISARGA
+11CA9         ; SpacingMark # Mc       MARCHEN SUBJOINED LETTER YA
+11CB1         ; SpacingMark # Mc       MARCHEN VOWEL SIGN I
+11CB4         ; SpacingMark # Mc       MARCHEN VOWEL SIGN O
+11D8A..11D8E  ; SpacingMark # Mc   [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU
+11D93..11D94  ; SpacingMark # Mc   [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
+11D96         ; SpacingMark # Mc       GUNJALA GONDI SIGN VISARGA
+11EF5..11EF6  ; SpacingMark # Mc   [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F03         ; SpacingMark # Mc       KAWI SIGN VISARGA
+11F34..11F35  ; SpacingMark # Mc   [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F3E..11F3F  ; SpacingMark # Mc   [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F41         ; SpacingMark # Mc       KAWI SIGN KILLER
+16F51..16F87  ; SpacingMark # Mc  [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI
+16FF0..16FF1  ; SpacingMark # Mc   [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY
+1D166         ; SpacingMark # Mc       MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D16D         ; SpacingMark # Mc       MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+
+# Total code points: 395
+
+# ================================================
+
+1100..115F    ; L # Lo  [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER
+A960..A97C    ; L # Lo  [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+
+# Total code points: 125
+
+# ================================================
+
+1160..11A7    ; V # Lo  [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE
+D7B0..D7C6    ; V # Lo  [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+
+# Total code points: 95
+
+# ================================================
+
+11A8..11FF    ; T # Lo  [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN
+D7CB..D7FB    ; T # Lo  [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+
+# Total code points: 137
+
+# ================================================
+
+AC00          ; LV # Lo       HANGUL SYLLABLE GA
+AC1C          ; LV # Lo       HANGUL SYLLABLE GAE
+AC38          ; LV # Lo       HANGUL SYLLABLE GYA
+AC54          ; LV # Lo       HANGUL SYLLABLE GYAE
+AC70          ; LV # Lo       HANGUL SYLLABLE GEO
+AC8C          ; LV # Lo       HANGUL SYLLABLE GE
+ACA8          ; LV # Lo       HANGUL SYLLABLE GYEO
+ACC4          ; LV # Lo       HANGUL SYLLABLE GYE
+ACE0          ; LV # Lo       HANGUL SYLLABLE GO
+ACFC          ; LV # Lo       HANGUL SYLLABLE GWA
+AD18          ; LV # Lo       HANGUL SYLLABLE GWAE
+AD34          ; LV # Lo       HANGUL SYLLABLE GOE
+AD50          ; LV # Lo       HANGUL SYLLABLE GYO
+AD6C          ; LV # Lo       HANGUL SYLLABLE GU
+AD88          ; LV # Lo       HANGUL SYLLABLE GWEO
+ADA4          ; LV # Lo       HANGUL SYLLABLE GWE
+ADC0          ; LV # Lo       HANGUL SYLLABLE GWI
+ADDC          ; LV # Lo       HANGUL SYLLABLE GYU
+ADF8          ; LV # Lo       HANGUL SYLLABLE GEU
+AE14          ; LV # Lo       HANGUL SYLLABLE GYI
+AE30          ; LV # Lo       HANGUL SYLLABLE GI
+AE4C          ; LV # Lo       HANGUL SYLLABLE GGA
+AE68          ; LV # Lo       HANGUL SYLLABLE GGAE
+AE84          ; LV # Lo       HANGUL SYLLABLE GGYA
+AEA0          ; LV # Lo       HANGUL SYLLABLE GGYAE
+AEBC          ; LV # Lo       HANGUL SYLLABLE GGEO
+AED8          ; LV # Lo       HANGUL SYLLABLE GGE
+AEF4          ; LV # Lo       HANGUL SYLLABLE GGYEO
+AF10          ; LV # Lo       HANGUL SYLLABLE GGYE
+AF2C          ; LV # Lo       HANGUL SYLLABLE GGO
+AF48          ; LV # Lo       HANGUL SYLLABLE GGWA
+AF64          ; LV # Lo       HANGUL SYLLABLE GGWAE
+AF80          ; LV # Lo       HANGUL SYLLABLE GGOE
+AF9C          ; LV # Lo       HANGUL SYLLABLE GGYO
+AFB8          ; LV # Lo       HANGUL SYLLABLE GGU
+AFD4          ; LV # Lo       HANGUL SYLLABLE GGWEO
+AFF0          ; LV # Lo       HANGUL SYLLABLE GGWE
+B00C          ; LV # Lo       HANGUL SYLLABLE GGWI
+B028          ; LV # Lo       HANGUL SYLLABLE GGYU
+B044          ; LV # Lo       HANGUL SYLLABLE GGEU
+B060          ; LV # Lo       HANGUL SYLLABLE GGYI
+B07C          ; LV # Lo       HANGUL SYLLABLE GGI
+B098          ; LV # Lo       HANGUL SYLLABLE NA
+B0B4          ; LV # Lo       HANGUL SYLLABLE NAE
+B0D0          ; LV # Lo       HANGUL SYLLABLE NYA
+B0EC          ; LV # Lo       HANGUL SYLLABLE NYAE
+B108          ; LV # Lo       HANGUL SYLLABLE NEO
+B124          ; LV # Lo       HANGUL SYLLABLE NE
+B140          ; LV # Lo       HANGUL SYLLABLE NYEO
+B15C          ; LV # Lo       HANGUL SYLLABLE NYE
+B178          ; LV # Lo       HANGUL SYLLABLE NO
+B194          ; LV # Lo       HANGUL SYLLABLE NWA
+B1B0          ; LV # Lo       HANGUL SYLLABLE NWAE
+B1CC          ; LV # Lo       HANGUL SYLLABLE NOE
+B1E8          ; LV # Lo       HANGUL SYLLABLE NYO
+B204          ; LV # Lo       HANGUL SYLLABLE NU
+B220          ; LV # Lo       HANGUL SYLLABLE NWEO
+B23C          ; LV # Lo       HANGUL SYLLABLE NWE
+B258          ; LV # Lo       HANGUL SYLLABLE NWI
+B274          ; LV # Lo       HANGUL SYLLABLE NYU
+B290          ; LV # Lo       HANGUL SYLLABLE NEU
+B2AC          ; LV # Lo       HANGUL SYLLABLE NYI
+B2C8          ; LV # Lo       HANGUL SYLLABLE NI
+B2E4          ; LV # Lo       HANGUL SYLLABLE DA
+B300          ; LV # Lo       HANGUL SYLLABLE DAE
+B31C          ; LV # Lo       HANGUL SYLLABLE DYA
+B338          ; LV # Lo       HANGUL SYLLABLE DYAE
+B354          ; LV # Lo       HANGUL SYLLABLE DEO
+B370          ; LV # Lo       HANGUL SYLLABLE DE
+B38C          ; LV # Lo       HANGUL SYLLABLE DYEO
+B3A8          ; LV # Lo       HANGUL SYLLABLE DYE
+B3C4          ; LV # Lo       HANGUL SYLLABLE DO
+B3E0          ; LV # Lo       HANGUL SYLLABLE DWA
+B3FC          ; LV # Lo       HANGUL SYLLABLE DWAE
+B418          ; LV # Lo       HANGUL SYLLABLE DOE
+B434          ; LV # Lo       HANGUL SYLLABLE DYO
+B450          ; LV # Lo       HANGUL SYLLABLE DU
+B46C          ; LV # Lo       HANGUL SYLLABLE DWEO
+B488          ; LV # Lo       HANGUL SYLLABLE DWE
+B4A4          ; LV # Lo       HANGUL SYLLABLE DWI
+B4C0          ; LV # Lo       HANGUL SYLLABLE DYU
+B4DC          ; LV # Lo       HANGUL SYLLABLE DEU
+B4F8          ; LV # Lo       HANGUL SYLLABLE DYI
+B514          ; LV # Lo       HANGUL SYLLABLE DI
+B530          ; LV # Lo       HANGUL SYLLABLE DDA
+B54C          ; LV # Lo       HANGUL SYLLABLE DDAE
+B568          ; LV # Lo       HANGUL SYLLABLE DDYA
+B584          ; LV # Lo       HANGUL SYLLABLE DDYAE
+B5A0          ; LV # Lo       HANGUL SYLLABLE DDEO
+B5BC          ; LV # Lo       HANGUL SYLLABLE DDE
+B5D8          ; LV # Lo       HANGUL SYLLABLE DDYEO
+B5F4          ; LV # Lo       HANGUL SYLLABLE DDYE
+B610          ; LV # Lo       HANGUL SYLLABLE DDO
+B62C          ; LV # Lo       HANGUL SYLLABLE DDWA
+B648          ; LV # Lo       HANGUL SYLLABLE DDWAE
+B664          ; LV # Lo       HANGUL SYLLABLE DDOE
+B680          ; LV # Lo       HANGUL SYLLABLE DDYO
+B69C          ; LV # Lo       HANGUL SYLLABLE DDU
+B6B8          ; LV # Lo       HANGUL SYLLABLE DDWEO
+B6D4          ; LV # Lo       HANGUL SYLLABLE DDWE
+B6F0          ; LV # Lo       HANGUL SYLLABLE DDWI
+B70C          ; LV # Lo       HANGUL SYLLABLE DDYU
+B728          ; LV # Lo       HANGUL SYLLABLE DDEU
+B744          ; LV # Lo       HANGUL SYLLABLE DDYI
+B760          ; LV # Lo       HANGUL SYLLABLE DDI
+B77C          ; LV # Lo       HANGUL SYLLABLE RA
+B798          ; LV # Lo       HANGUL SYLLABLE RAE
+B7B4          ; LV # Lo       HANGUL SYLLABLE RYA
+B7D0          ; LV # Lo       HANGUL SYLLABLE RYAE
+B7EC          ; LV # Lo       HANGUL SYLLABLE REO
+B808          ; LV # Lo       HANGUL SYLLABLE RE
+B824          ; LV # Lo       HANGUL SYLLABLE RYEO
+B840          ; LV # Lo       HANGUL SYLLABLE RYE
+B85C          ; LV # Lo       HANGUL SYLLABLE RO
+B878          ; LV # Lo       HANGUL SYLLABLE RWA
+B894          ; LV # Lo       HANGUL SYLLABLE RWAE
+B8B0          ; LV # Lo       HANGUL SYLLABLE ROE
+B8CC          ; LV # Lo       HANGUL SYLLABLE RYO
+B8E8          ; LV # Lo       HANGUL SYLLABLE RU
+B904          ; LV # Lo       HANGUL SYLLABLE RWEO
+B920          ; LV # Lo       HANGUL SYLLABLE RWE
+B93C          ; LV # Lo       HANGUL SYLLABLE RWI
+B958          ; LV # Lo       HANGUL SYLLABLE RYU
+B974          ; LV # Lo       HANGUL SYLLABLE REU
+B990          ; LV # Lo       HANGUL SYLLABLE RYI
+B9AC          ; LV # Lo       HANGUL SYLLABLE RI
+B9C8          ; LV # Lo       HANGUL SYLLABLE MA
+B9E4          ; LV # Lo       HANGUL SYLLABLE MAE
+BA00          ; LV # Lo       HANGUL SYLLABLE MYA
+BA1C          ; LV # Lo       HANGUL SYLLABLE MYAE
+BA38          ; LV # Lo       HANGUL SYLLABLE MEO
+BA54          ; LV # Lo       HANGUL SYLLABLE ME
+BA70          ; LV # Lo       HANGUL SYLLABLE MYEO
+BA8C          ; LV # Lo       HANGUL SYLLABLE MYE
+BAA8          ; LV # Lo       HANGUL SYLLABLE MO
+BAC4          ; LV # Lo       HANGUL SYLLABLE MWA
+BAE0          ; LV # Lo       HANGUL SYLLABLE MWAE
+BAFC          ; LV # Lo       HANGUL SYLLABLE MOE
+BB18          ; LV # Lo       HANGUL SYLLABLE MYO
+BB34          ; LV # Lo       HANGUL SYLLABLE MU
+BB50          ; LV # Lo       HANGUL SYLLABLE MWEO
+BB6C          ; LV # Lo       HANGUL SYLLABLE MWE
+BB88          ; LV # Lo       HANGUL SYLLABLE MWI
+BBA4          ; LV # Lo       HANGUL SYLLABLE MYU
+BBC0          ; LV # Lo       HANGUL SYLLABLE MEU
+BBDC          ; LV # Lo       HANGUL SYLLABLE MYI
+BBF8          ; LV # Lo       HANGUL SYLLABLE MI
+BC14          ; LV # Lo       HANGUL SYLLABLE BA
+BC30          ; LV # Lo       HANGUL SYLLABLE BAE
+BC4C          ; LV # Lo       HANGUL SYLLABLE BYA
+BC68          ; LV # Lo       HANGUL SYLLABLE BYAE
+BC84          ; LV # Lo       HANGUL SYLLABLE BEO
+BCA0          ; LV # Lo       HANGUL SYLLABLE BE
+BCBC          ; LV # Lo       HANGUL SYLLABLE BYEO
+BCD8          ; LV # Lo       HANGUL SYLLABLE BYE
+BCF4          ; LV # Lo       HANGUL SYLLABLE BO
+BD10          ; LV # Lo       HANGUL SYLLABLE BWA
+BD2C          ; LV # Lo       HANGUL SYLLABLE BWAE
+BD48          ; LV # Lo       HANGUL SYLLABLE BOE
+BD64          ; LV # Lo       HANGUL SYLLABLE BYO
+BD80          ; LV # Lo       HANGUL SYLLABLE BU
+BD9C          ; LV # Lo       HANGUL SYLLABLE BWEO
+BDB8          ; LV # Lo       HANGUL SYLLABLE BWE
+BDD4          ; LV # Lo       HANGUL SYLLABLE BWI
+BDF0          ; LV # Lo       HANGUL SYLLABLE BYU
+BE0C          ; LV # Lo       HANGUL SYLLABLE BEU
+BE28          ; LV # Lo       HANGUL SYLLABLE BYI
+BE44          ; LV # Lo       HANGUL SYLLABLE BI
+BE60          ; LV # Lo       HANGUL SYLLABLE BBA
+BE7C          ; LV # Lo       HANGUL SYLLABLE BBAE
+BE98          ; LV # Lo       HANGUL SYLLABLE BBYA
+BEB4          ; LV # Lo       HANGUL SYLLABLE BBYAE
+BED0          ; LV # Lo       HANGUL SYLLABLE BBEO
+BEEC          ; LV # Lo       HANGUL SYLLABLE BBE
+BF08          ; LV # Lo       HANGUL SYLLABLE BBYEO
+BF24          ; LV # Lo       HANGUL SYLLABLE BBYE
+BF40          ; LV # Lo       HANGUL SYLLABLE BBO
+BF5C          ; LV # Lo       HANGUL SYLLABLE BBWA
+BF78          ; LV # Lo       HANGUL SYLLABLE BBWAE
+BF94          ; LV # Lo       HANGUL SYLLABLE BBOE
+BFB0          ; LV # Lo       HANGUL SYLLABLE BBYO
+BFCC          ; LV # Lo       HANGUL SYLLABLE BBU
+BFE8          ; LV # Lo       HANGUL SYLLABLE BBWEO
+C004          ; LV # Lo       HANGUL SYLLABLE BBWE
+C020          ; LV # Lo       HANGUL SYLLABLE BBWI
+C03C          ; LV # Lo       HANGUL SYLLABLE BBYU
+C058          ; LV # Lo       HANGUL SYLLABLE BBEU
+C074          ; LV # Lo       HANGUL SYLLABLE BBYI
+C090          ; LV # Lo       HANGUL SYLLABLE BBI
+C0AC          ; LV # Lo       HANGUL SYLLABLE SA
+C0C8          ; LV # Lo       HANGUL SYLLABLE SAE
+C0E4          ; LV # Lo       HANGUL SYLLABLE SYA
+C100          ; LV # Lo       HANGUL SYLLABLE SYAE
+C11C          ; LV # Lo       HANGUL SYLLABLE SEO
+C138          ; LV # Lo       HANGUL SYLLABLE SE
+C154          ; LV # Lo       HANGUL SYLLABLE SYEO
+C170          ; LV # Lo       HANGUL SYLLABLE SYE
+C18C          ; LV # Lo       HANGUL SYLLABLE SO
+C1A8          ; LV # Lo       HANGUL SYLLABLE SWA
+C1C4          ; LV # Lo       HANGUL SYLLABLE SWAE
+C1E0          ; LV # Lo       HANGUL SYLLABLE SOE
+C1FC          ; LV # Lo       HANGUL SYLLABLE SYO
+C218          ; LV # Lo       HANGUL SYLLABLE SU
+C234          ; LV # Lo       HANGUL SYLLABLE SWEO
+C250          ; LV # Lo       HANGUL SYLLABLE SWE
+C26C          ; LV # Lo       HANGUL SYLLABLE SWI
+C288          ; LV # Lo       HANGUL SYLLABLE SYU
+C2A4          ; LV # Lo       HANGUL SYLLABLE SEU
+C2C0          ; LV # Lo       HANGUL SYLLABLE SYI
+C2DC          ; LV # Lo       HANGUL SYLLABLE SI
+C2F8          ; LV # Lo       HANGUL SYLLABLE SSA
+C314          ; LV # Lo       HANGUL SYLLABLE SSAE
+C330          ; LV # Lo       HANGUL SYLLABLE SSYA
+C34C          ; LV # Lo       HANGUL SYLLABLE SSYAE
+C368          ; LV # Lo       HANGUL SYLLABLE SSEO
+C384          ; LV # Lo       HANGUL SYLLABLE SSE
+C3A0          ; LV # Lo       HANGUL SYLLABLE SSYEO
+C3BC          ; LV # Lo       HANGUL SYLLABLE SSYE
+C3D8          ; LV # Lo       HANGUL SYLLABLE SSO
+C3F4          ; LV # Lo       HANGUL SYLLABLE SSWA
+C410          ; LV # Lo       HANGUL SYLLABLE SSWAE
+C42C          ; LV # Lo       HANGUL SYLLABLE SSOE
+C448          ; LV # Lo       HANGUL SYLLABLE SSYO
+C464          ; LV # Lo       HANGUL SYLLABLE SSU
+C480          ; LV # Lo       HANGUL SYLLABLE SSWEO
+C49C          ; LV # Lo       HANGUL SYLLABLE SSWE
+C4B8          ; LV # Lo       HANGUL SYLLABLE SSWI
+C4D4          ; LV # Lo       HANGUL SYLLABLE SSYU
+C4F0          ; LV # Lo       HANGUL SYLLABLE SSEU
+C50C          ; LV # Lo       HANGUL SYLLABLE SSYI
+C528          ; LV # Lo       HANGUL SYLLABLE SSI
+C544          ; LV # Lo       HANGUL SYLLABLE A
+C560          ; LV # Lo       HANGUL SYLLABLE AE
+C57C          ; LV # Lo       HANGUL SYLLABLE YA
+C598          ; LV # Lo       HANGUL SYLLABLE YAE
+C5B4          ; LV # Lo       HANGUL SYLLABLE EO
+C5D0          ; LV # Lo       HANGUL SYLLABLE E
+C5EC          ; LV # Lo       HANGUL SYLLABLE YEO
+C608          ; LV # Lo       HANGUL SYLLABLE YE
+C624          ; LV # Lo       HANGUL SYLLABLE O
+C640          ; LV # Lo       HANGUL SYLLABLE WA
+C65C          ; LV # Lo       HANGUL SYLLABLE WAE
+C678          ; LV # Lo       HANGUL SYLLABLE OE
+C694          ; LV # Lo       HANGUL SYLLABLE YO
+C6B0          ; LV # Lo       HANGUL SYLLABLE U
+C6CC          ; LV # Lo       HANGUL SYLLABLE WEO
+C6E8          ; LV # Lo       HANGUL SYLLABLE WE
+C704          ; LV # Lo       HANGUL SYLLABLE WI
+C720          ; LV # Lo       HANGUL SYLLABLE YU
+C73C          ; LV # Lo       HANGUL SYLLABLE EU
+C758          ; LV # Lo       HANGUL SYLLABLE YI
+C774          ; LV # Lo       HANGUL SYLLABLE I
+C790          ; LV # Lo       HANGUL SYLLABLE JA
+C7AC          ; LV # Lo       HANGUL SYLLABLE JAE
+C7C8          ; LV # Lo       HANGUL SYLLABLE JYA
+C7E4          ; LV # Lo       HANGUL SYLLABLE JYAE
+C800          ; LV # Lo       HANGUL SYLLABLE JEO
+C81C          ; LV # Lo       HANGUL SYLLABLE JE
+C838          ; LV # Lo       HANGUL SYLLABLE JYEO
+C854          ; LV # Lo       HANGUL SYLLABLE JYE
+C870          ; LV # Lo       HANGUL SYLLABLE JO
+C88C          ; LV # Lo       HANGUL SYLLABLE JWA
+C8A8          ; LV # Lo       HANGUL SYLLABLE JWAE
+C8C4          ; LV # Lo       HANGUL SYLLABLE JOE
+C8E0          ; LV # Lo       HANGUL SYLLABLE JYO
+C8FC          ; LV # Lo       HANGUL SYLLABLE JU
+C918          ; LV # Lo       HANGUL SYLLABLE JWEO
+C934          ; LV # Lo       HANGUL SYLLABLE JWE
+C950          ; LV # Lo       HANGUL SYLLABLE JWI
+C96C          ; LV # Lo       HANGUL SYLLABLE JYU
+C988          ; LV # Lo       HANGUL SYLLABLE JEU
+C9A4          ; LV # Lo       HANGUL SYLLABLE JYI
+C9C0          ; LV # Lo       HANGUL SYLLABLE JI
+C9DC          ; LV # Lo       HANGUL SYLLABLE JJA
+C9F8          ; LV # Lo       HANGUL SYLLABLE JJAE
+CA14          ; LV # Lo       HANGUL SYLLABLE JJYA
+CA30          ; LV # Lo       HANGUL SYLLABLE JJYAE
+CA4C          ; LV # Lo       HANGUL SYLLABLE JJEO
+CA68          ; LV # Lo       HANGUL SYLLABLE JJE
+CA84          ; LV # Lo       HANGUL SYLLABLE JJYEO
+CAA0          ; LV # Lo       HANGUL SYLLABLE JJYE
+CABC          ; LV # Lo       HANGUL SYLLABLE JJO
+CAD8          ; LV # Lo       HANGUL SYLLABLE JJWA
+CAF4          ; LV # Lo       HANGUL SYLLABLE JJWAE
+CB10          ; LV # Lo       HANGUL SYLLABLE JJOE
+CB2C          ; LV # Lo       HANGUL SYLLABLE JJYO
+CB48          ; LV # Lo       HANGUL SYLLABLE JJU
+CB64          ; LV # Lo       HANGUL SYLLABLE JJWEO
+CB80          ; LV # Lo       HANGUL SYLLABLE JJWE
+CB9C          ; LV # Lo       HANGUL SYLLABLE JJWI
+CBB8          ; LV # Lo       HANGUL SYLLABLE JJYU
+CBD4          ; LV # Lo       HANGUL SYLLABLE JJEU
+CBF0          ; LV # Lo       HANGUL SYLLABLE JJYI
+CC0C          ; LV # Lo       HANGUL SYLLABLE JJI
+CC28          ; LV # Lo       HANGUL SYLLABLE CA
+CC44          ; LV # Lo       HANGUL SYLLABLE CAE
+CC60          ; LV # Lo       HANGUL SYLLABLE CYA
+CC7C          ; LV # Lo       HANGUL SYLLABLE CYAE
+CC98          ; LV # Lo       HANGUL SYLLABLE CEO
+CCB4          ; LV # Lo       HANGUL SYLLABLE CE
+CCD0          ; LV # Lo       HANGUL SYLLABLE CYEO
+CCEC          ; LV # Lo       HANGUL SYLLABLE CYE
+CD08          ; LV # Lo       HANGUL SYLLABLE CO
+CD24          ; LV # Lo       HANGUL SYLLABLE CWA
+CD40          ; LV # Lo       HANGUL SYLLABLE CWAE
+CD5C          ; LV # Lo       HANGUL SYLLABLE COE
+CD78          ; LV # Lo       HANGUL SYLLABLE CYO
+CD94          ; LV # Lo       HANGUL SYLLABLE CU
+CDB0          ; LV # Lo       HANGUL SYLLABLE CWEO
+CDCC          ; LV # Lo       HANGUL SYLLABLE CWE
+CDE8          ; LV # Lo       HANGUL SYLLABLE CWI
+CE04          ; LV # Lo       HANGUL SYLLABLE CYU
+CE20          ; LV # Lo       HANGUL SYLLABLE CEU
+CE3C          ; LV # Lo       HANGUL SYLLABLE CYI
+CE58          ; LV # Lo       HANGUL SYLLABLE CI
+CE74          ; LV # Lo       HANGUL SYLLABLE KA
+CE90          ; LV # Lo       HANGUL SYLLABLE KAE
+CEAC          ; LV # Lo       HANGUL SYLLABLE KYA
+CEC8          ; LV # Lo       HANGUL SYLLABLE KYAE
+CEE4          ; LV # Lo       HANGUL SYLLABLE KEO
+CF00          ; LV # Lo       HANGUL SYLLABLE KE
+CF1C          ; LV # Lo       HANGUL SYLLABLE KYEO
+CF38          ; LV # Lo       HANGUL SYLLABLE KYE
+CF54          ; LV # Lo       HANGUL SYLLABLE KO
+CF70          ; LV # Lo       HANGUL SYLLABLE KWA
+CF8C          ; LV # Lo       HANGUL SYLLABLE KWAE
+CFA8          ; LV # Lo       HANGUL SYLLABLE KOE
+CFC4          ; LV # Lo       HANGUL SYLLABLE KYO
+CFE0          ; LV # Lo       HANGUL SYLLABLE KU
+CFFC          ; LV # Lo       HANGUL SYLLABLE KWEO
+D018          ; LV # Lo       HANGUL SYLLABLE KWE
+D034          ; LV # Lo       HANGUL SYLLABLE KWI
+D050          ; LV # Lo       HANGUL SYLLABLE KYU
+D06C          ; LV # Lo       HANGUL SYLLABLE KEU
+D088          ; LV # Lo       HANGUL SYLLABLE KYI
+D0A4          ; LV # Lo       HANGUL SYLLABLE KI
+D0C0          ; LV # Lo       HANGUL SYLLABLE TA
+D0DC          ; LV # Lo       HANGUL SYLLABLE TAE
+D0F8          ; LV # Lo       HANGUL SYLLABLE TYA
+D114          ; LV # Lo       HANGUL SYLLABLE TYAE
+D130          ; LV # Lo       HANGUL SYLLABLE TEO
+D14C          ; LV # Lo       HANGUL SYLLABLE TE
+D168          ; LV # Lo       HANGUL SYLLABLE TYEO
+D184          ; LV # Lo       HANGUL SYLLABLE TYE
+D1A0          ; LV # Lo       HANGUL SYLLABLE TO
+D1BC          ; LV # Lo       HANGUL SYLLABLE TWA
+D1D8          ; LV # Lo       HANGUL SYLLABLE TWAE
+D1F4          ; LV # Lo       HANGUL SYLLABLE TOE
+D210          ; LV # Lo       HANGUL SYLLABLE TYO
+D22C          ; LV # Lo       HANGUL SYLLABLE TU
+D248          ; LV # Lo       HANGUL SYLLABLE TWEO
+D264          ; LV # Lo       HANGUL SYLLABLE TWE
+D280          ; LV # Lo       HANGUL SYLLABLE TWI
+D29C          ; LV # Lo       HANGUL SYLLABLE TYU
+D2B8          ; LV # Lo       HANGUL SYLLABLE TEU
+D2D4          ; LV # Lo       HANGUL SYLLABLE TYI
+D2F0          ; LV # Lo       HANGUL SYLLABLE TI
+D30C          ; LV # Lo       HANGUL SYLLABLE PA
+D328          ; LV # Lo       HANGUL SYLLABLE PAE
+D344          ; LV # Lo       HANGUL SYLLABLE PYA
+D360          ; LV # Lo       HANGUL SYLLABLE PYAE
+D37C          ; LV # Lo       HANGUL SYLLABLE PEO
+D398          ; LV # Lo       HANGUL SYLLABLE PE
+D3B4          ; LV # Lo       HANGUL SYLLABLE PYEO
+D3D0          ; LV # Lo       HANGUL SYLLABLE PYE
+D3EC          ; LV # Lo       HANGUL SYLLABLE PO
+D408          ; LV # Lo       HANGUL SYLLABLE PWA
+D424          ; LV # Lo       HANGUL SYLLABLE PWAE
+D440          ; LV # Lo       HANGUL SYLLABLE POE
+D45C          ; LV # Lo       HANGUL SYLLABLE PYO
+D478          ; LV # Lo       HANGUL SYLLABLE PU
+D494          ; LV # Lo       HANGUL SYLLABLE PWEO
+D4B0          ; LV # Lo       HANGUL SYLLABLE PWE
+D4CC          ; LV # Lo       HANGUL SYLLABLE PWI
+D4E8          ; LV # Lo       HANGUL SYLLABLE PYU
+D504          ; LV # Lo       HANGUL SYLLABLE PEU
+D520          ; LV # Lo       HANGUL SYLLABLE PYI
+D53C          ; LV # Lo       HANGUL SYLLABLE PI
+D558          ; LV # Lo       HANGUL SYLLABLE HA
+D574          ; LV # Lo       HANGUL SYLLABLE HAE
+D590          ; LV # Lo       HANGUL SYLLABLE HYA
+D5AC          ; LV # Lo       HANGUL SYLLABLE HYAE
+D5C8          ; LV # Lo       HANGUL SYLLABLE HEO
+D5E4          ; LV # Lo       HANGUL SYLLABLE HE
+D600          ; LV # Lo       HANGUL SYLLABLE HYEO
+D61C          ; LV # Lo       HANGUL SYLLABLE HYE
+D638          ; LV # Lo       HANGUL SYLLABLE HO
+D654          ; LV # Lo       HANGUL SYLLABLE HWA
+D670          ; LV # Lo       HANGUL SYLLABLE HWAE
+D68C          ; LV # Lo       HANGUL SYLLABLE HOE
+D6A8          ; LV # Lo       HANGUL SYLLABLE HYO
+D6C4          ; LV # Lo       HANGUL SYLLABLE HU
+D6E0          ; LV # Lo       HANGUL SYLLABLE HWEO
+D6FC          ; LV # Lo       HANGUL SYLLABLE HWE
+D718          ; LV # Lo       HANGUL SYLLABLE HWI
+D734          ; LV # Lo       HANGUL SYLLABLE HYU
+D750          ; LV # Lo       HANGUL SYLLABLE HEU
+D76C          ; LV # Lo       HANGUL SYLLABLE HYI
+D788          ; LV # Lo       HANGUL SYLLABLE HI
+
+# Total code points: 399
+
+# ================================================
+
+AC01..AC1B    ; LVT # Lo  [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH
+AC1D..AC37    ; LVT # Lo  [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH
+AC39..AC53    ; LVT # Lo  [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH
+AC55..AC6F    ; LVT # Lo  [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH
+AC71..AC8B    ; LVT # Lo  [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH
+AC8D..ACA7    ; LVT # Lo  [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH
+ACA9..ACC3    ; LVT # Lo  [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH
+ACC5..ACDF    ; LVT # Lo  [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH
+ACE1..ACFB    ; LVT # Lo  [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH
+ACFD..AD17    ; LVT # Lo  [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH
+AD19..AD33    ; LVT # Lo  [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH
+AD35..AD4F    ; LVT # Lo  [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH
+AD51..AD6B    ; LVT # Lo  [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH
+AD6D..AD87    ; LVT # Lo  [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH
+AD89..ADA3    ; LVT # Lo  [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH
+ADA5..ADBF    ; LVT # Lo  [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH
+ADC1..ADDB    ; LVT # Lo  [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH
+ADDD..ADF7    ; LVT # Lo  [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH
+ADF9..AE13    ; LVT # Lo  [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH
+AE15..AE2F    ; LVT # Lo  [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH
+AE31..AE4B    ; LVT # Lo  [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH
+AE4D..AE67    ; LVT # Lo  [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH
+AE69..AE83    ; LVT # Lo  [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH
+AE85..AE9F    ; LVT # Lo  [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH
+AEA1..AEBB    ; LVT # Lo  [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH
+AEBD..AED7    ; LVT # Lo  [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH
+AED9..AEF3    ; LVT # Lo  [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH
+AEF5..AF0F    ; LVT # Lo  [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH
+AF11..AF2B    ; LVT # Lo  [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH
+AF2D..AF47    ; LVT # Lo  [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH
+AF49..AF63    ; LVT # Lo  [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH
+AF65..AF7F    ; LVT # Lo  [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH
+AF81..AF9B    ; LVT # Lo  [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH
+AF9D..AFB7    ; LVT # Lo  [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH
+AFB9..AFD3    ; LVT # Lo  [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH
+AFD5..AFEF    ; LVT # Lo  [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH
+AFF1..B00B    ; LVT # Lo  [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH
+B00D..B027    ; LVT # Lo  [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH
+B029..B043    ; LVT # Lo  [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH
+B045..B05F    ; LVT # Lo  [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH
+B061..B07B    ; LVT # Lo  [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH
+B07D..B097    ; LVT # Lo  [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH
+B099..B0B3    ; LVT # Lo  [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH
+B0B5..B0CF    ; LVT # Lo  [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH
+B0D1..B0EB    ; LVT # Lo  [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH
+B0ED..B107    ; LVT # Lo  [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH
+B109..B123    ; LVT # Lo  [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH
+B125..B13F    ; LVT # Lo  [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH
+B141..B15B    ; LVT # Lo  [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH
+B15D..B177    ; LVT # Lo  [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH
+B179..B193    ; LVT # Lo  [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH
+B195..B1AF    ; LVT # Lo  [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH
+B1B1..B1CB    ; LVT # Lo  [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH
+B1CD..B1E7    ; LVT # Lo  [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH
+B1E9..B203    ; LVT # Lo  [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH
+B205..B21F    ; LVT # Lo  [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH
+B221..B23B    ; LVT # Lo  [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH
+B23D..B257    ; LVT # Lo  [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH
+B259..B273    ; LVT # Lo  [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH
+B275..B28F    ; LVT # Lo  [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH
+B291..B2AB    ; LVT # Lo  [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH
+B2AD..B2C7    ; LVT # Lo  [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH
+B2C9..B2E3    ; LVT # Lo  [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH
+B2E5..B2FF    ; LVT # Lo  [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH
+B301..B31B    ; LVT # Lo  [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH
+B31D..B337    ; LVT # Lo  [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH
+B339..B353    ; LVT # Lo  [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH
+B355..B36F    ; LVT # Lo  [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH
+B371..B38B    ; LVT # Lo  [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH
+B38D..B3A7    ; LVT # Lo  [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH
+B3A9..B3C3    ; LVT # Lo  [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH
+B3C5..B3DF    ; LVT # Lo  [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH
+B3E1..B3FB    ; LVT # Lo  [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH
+B3FD..B417    ; LVT # Lo  [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH
+B419..B433    ; LVT # Lo  [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH
+B435..B44F    ; LVT # Lo  [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH
+B451..B46B    ; LVT # Lo  [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH
+B46D..B487    ; LVT # Lo  [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH
+B489..B4A3    ; LVT # Lo  [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH
+B4A5..B4BF    ; LVT # Lo  [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH
+B4C1..B4DB    ; LVT # Lo  [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH
+B4DD..B4F7    ; LVT # Lo  [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH
+B4F9..B513    ; LVT # Lo  [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH
+B515..B52F    ; LVT # Lo  [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH
+B531..B54B    ; LVT # Lo  [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH
+B54D..B567    ; LVT # Lo  [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH
+B569..B583    ; LVT # Lo  [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH
+B585..B59F    ; LVT # Lo  [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH
+B5A1..B5BB    ; LVT # Lo  [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH
+B5BD..B5D7    ; LVT # Lo  [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH
+B5D9..B5F3    ; LVT # Lo  [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH
+B5F5..B60F    ; LVT # Lo  [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH
+B611..B62B    ; LVT # Lo  [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH
+B62D..B647    ; LVT # Lo  [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH
+B649..B663    ; LVT # Lo  [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH
+B665..B67F    ; LVT # Lo  [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH
+B681..B69B    ; LVT # Lo  [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH
+B69D..B6B7    ; LVT # Lo  [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH
+B6B9..B6D3    ; LVT # Lo  [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH
+B6D5..B6EF    ; LVT # Lo  [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH
+B6F1..B70B    ; LVT # Lo  [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH
+B70D..B727    ; LVT # Lo  [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH
+B729..B743    ; LVT # Lo  [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH
+B745..B75F    ; LVT # Lo  [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH
+B761..B77B    ; LVT # Lo  [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH
+B77D..B797    ; LVT # Lo  [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH
+B799..B7B3    ; LVT # Lo  [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH
+B7B5..B7CF    ; LVT # Lo  [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH
+B7D1..B7EB    ; LVT # Lo  [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH
+B7ED..B807    ; LVT # Lo  [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH
+B809..B823    ; LVT # Lo  [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH
+B825..B83F    ; LVT # Lo  [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH
+B841..B85B    ; LVT # Lo  [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH
+B85D..B877    ; LVT # Lo  [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH
+B879..B893    ; LVT # Lo  [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH
+B895..B8AF    ; LVT # Lo  [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH
+B8B1..B8CB    ; LVT # Lo  [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH
+B8CD..B8E7    ; LVT # Lo  [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH
+B8E9..B903    ; LVT # Lo  [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH
+B905..B91F    ; LVT # Lo  [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH
+B921..B93B    ; LVT # Lo  [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH
+B93D..B957    ; LVT # Lo  [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH
+B959..B973    ; LVT # Lo  [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH
+B975..B98F    ; LVT # Lo  [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH
+B991..B9AB    ; LVT # Lo  [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH
+B9AD..B9C7    ; LVT # Lo  [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH
+B9C9..B9E3    ; LVT # Lo  [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH
+B9E5..B9FF    ; LVT # Lo  [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH
+BA01..BA1B    ; LVT # Lo  [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH
+BA1D..BA37    ; LVT # Lo  [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH
+BA39..BA53    ; LVT # Lo  [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH
+BA55..BA6F    ; LVT # Lo  [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH
+BA71..BA8B    ; LVT # Lo  [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH
+BA8D..BAA7    ; LVT # Lo  [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH
+BAA9..BAC3    ; LVT # Lo  [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH
+BAC5..BADF    ; LVT # Lo  [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH
+BAE1..BAFB    ; LVT # Lo  [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH
+BAFD..BB17    ; LVT # Lo  [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH
+BB19..BB33    ; LVT # Lo  [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH
+BB35..BB4F    ; LVT # Lo  [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH
+BB51..BB6B    ; LVT # Lo  [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH
+BB6D..BB87    ; LVT # Lo  [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH
+BB89..BBA3    ; LVT # Lo  [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH
+BBA5..BBBF    ; LVT # Lo  [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH
+BBC1..BBDB    ; LVT # Lo  [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH
+BBDD..BBF7    ; LVT # Lo  [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH
+BBF9..BC13    ; LVT # Lo  [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH
+BC15..BC2F    ; LVT # Lo  [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH
+BC31..BC4B    ; LVT # Lo  [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH
+BC4D..BC67    ; LVT # Lo  [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH
+BC69..BC83    ; LVT # Lo  [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH
+BC85..BC9F    ; LVT # Lo  [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH
+BCA1..BCBB    ; LVT # Lo  [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH
+BCBD..BCD7    ; LVT # Lo  [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH
+BCD9..BCF3    ; LVT # Lo  [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH
+BCF5..BD0F    ; LVT # Lo  [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH
+BD11..BD2B    ; LVT # Lo  [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH
+BD2D..BD47    ; LVT # Lo  [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH
+BD49..BD63    ; LVT # Lo  [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH
+BD65..BD7F    ; LVT # Lo  [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH
+BD81..BD9B    ; LVT # Lo  [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH
+BD9D..BDB7    ; LVT # Lo  [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH
+BDB9..BDD3    ; LVT # Lo  [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH
+BDD5..BDEF    ; LVT # Lo  [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH
+BDF1..BE0B    ; LVT # Lo  [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH
+BE0D..BE27    ; LVT # Lo  [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH
+BE29..BE43    ; LVT # Lo  [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH
+BE45..BE5F    ; LVT # Lo  [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH
+BE61..BE7B    ; LVT # Lo  [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH
+BE7D..BE97    ; LVT # Lo  [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH
+BE99..BEB3    ; LVT # Lo  [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH
+BEB5..BECF    ; LVT # Lo  [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH
+BED1..BEEB    ; LVT # Lo  [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH
+BEED..BF07    ; LVT # Lo  [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH
+BF09..BF23    ; LVT # Lo  [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH
+BF25..BF3F    ; LVT # Lo  [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH
+BF41..BF5B    ; LVT # Lo  [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH
+BF5D..BF77    ; LVT # Lo  [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH
+BF79..BF93    ; LVT # Lo  [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH
+BF95..BFAF    ; LVT # Lo  [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH
+BFB1..BFCB    ; LVT # Lo  [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH
+BFCD..BFE7    ; LVT # Lo  [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH
+BFE9..C003    ; LVT # Lo  [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH
+C005..C01F    ; LVT # Lo  [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH
+C021..C03B    ; LVT # Lo  [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH
+C03D..C057    ; LVT # Lo  [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH
+C059..C073    ; LVT # Lo  [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH
+C075..C08F    ; LVT # Lo  [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH
+C091..C0AB    ; LVT # Lo  [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH
+C0AD..C0C7    ; LVT # Lo  [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH
+C0C9..C0E3    ; LVT # Lo  [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH
+C0E5..C0FF    ; LVT # Lo  [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH
+C101..C11B    ; LVT # Lo  [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH
+C11D..C137    ; LVT # Lo  [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH
+C139..C153    ; LVT # Lo  [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH
+C155..C16F    ; LVT # Lo  [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH
+C171..C18B    ; LVT # Lo  [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH
+C18D..C1A7    ; LVT # Lo  [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH
+C1A9..C1C3    ; LVT # Lo  [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH
+C1C5..C1DF    ; LVT # Lo  [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH
+C1E1..C1FB    ; LVT # Lo  [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH
+C1FD..C217    ; LVT # Lo  [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH
+C219..C233    ; LVT # Lo  [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH
+C235..C24F    ; LVT # Lo  [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH
+C251..C26B    ; LVT # Lo  [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH
+C26D..C287    ; LVT # Lo  [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH
+C289..C2A3    ; LVT # Lo  [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH
+C2A5..C2BF    ; LVT # Lo  [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH
+C2C1..C2DB    ; LVT # Lo  [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH
+C2DD..C2F7    ; LVT # Lo  [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH
+C2F9..C313    ; LVT # Lo  [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH
+C315..C32F    ; LVT # Lo  [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH
+C331..C34B    ; LVT # Lo  [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH
+C34D..C367    ; LVT # Lo  [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH
+C369..C383    ; LVT # Lo  [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH
+C385..C39F    ; LVT # Lo  [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH
+C3A1..C3BB    ; LVT # Lo  [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH
+C3BD..C3D7    ; LVT # Lo  [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH
+C3D9..C3F3    ; LVT # Lo  [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH
+C3F5..C40F    ; LVT # Lo  [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH
+C411..C42B    ; LVT # Lo  [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH
+C42D..C447    ; LVT # Lo  [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH
+C449..C463    ; LVT # Lo  [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH
+C465..C47F    ; LVT # Lo  [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH
+C481..C49B    ; LVT # Lo  [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH
+C49D..C4B7    ; LVT # Lo  [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH
+C4B9..C4D3    ; LVT # Lo  [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH
+C4D5..C4EF    ; LVT # Lo  [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH
+C4F1..C50B    ; LVT # Lo  [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH
+C50D..C527    ; LVT # Lo  [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH
+C529..C543    ; LVT # Lo  [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH
+C545..C55F    ; LVT # Lo  [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH
+C561..C57B    ; LVT # Lo  [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH
+C57D..C597    ; LVT # Lo  [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH
+C599..C5B3    ; LVT # Lo  [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH
+C5B5..C5CF    ; LVT # Lo  [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH
+C5D1..C5EB    ; LVT # Lo  [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH
+C5ED..C607    ; LVT # Lo  [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH
+C609..C623    ; LVT # Lo  [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH
+C625..C63F    ; LVT # Lo  [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH
+C641..C65B    ; LVT # Lo  [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH
+C65D..C677    ; LVT # Lo  [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH
+C679..C693    ; LVT # Lo  [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH
+C695..C6AF    ; LVT # Lo  [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH
+C6B1..C6CB    ; LVT # Lo  [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH
+C6CD..C6E7    ; LVT # Lo  [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH
+C6E9..C703    ; LVT # Lo  [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH
+C705..C71F    ; LVT # Lo  [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH
+C721..C73B    ; LVT # Lo  [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH
+C73D..C757    ; LVT # Lo  [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH
+C759..C773    ; LVT # Lo  [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH
+C775..C78F    ; LVT # Lo  [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH
+C791..C7AB    ; LVT # Lo  [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH
+C7AD..C7C7    ; LVT # Lo  [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH
+C7C9..C7E3    ; LVT # Lo  [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH
+C7E5..C7FF    ; LVT # Lo  [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH
+C801..C81B    ; LVT # Lo  [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH
+C81D..C837    ; LVT # Lo  [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH
+C839..C853    ; LVT # Lo  [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH
+C855..C86F    ; LVT # Lo  [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH
+C871..C88B    ; LVT # Lo  [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH
+C88D..C8A7    ; LVT # Lo  [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH
+C8A9..C8C3    ; LVT # Lo  [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH
+C8C5..C8DF    ; LVT # Lo  [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH
+C8E1..C8FB    ; LVT # Lo  [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH
+C8FD..C917    ; LVT # Lo  [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH
+C919..C933    ; LVT # Lo  [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH
+C935..C94F    ; LVT # Lo  [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH
+C951..C96B    ; LVT # Lo  [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH
+C96D..C987    ; LVT # Lo  [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH
+C989..C9A3    ; LVT # Lo  [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH
+C9A5..C9BF    ; LVT # Lo  [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH
+C9C1..C9DB    ; LVT # Lo  [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH
+C9DD..C9F7    ; LVT # Lo  [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH
+C9F9..CA13    ; LVT # Lo  [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH
+CA15..CA2F    ; LVT # Lo  [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH
+CA31..CA4B    ; LVT # Lo  [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH
+CA4D..CA67    ; LVT # Lo  [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH
+CA69..CA83    ; LVT # Lo  [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH
+CA85..CA9F    ; LVT # Lo  [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH
+CAA1..CABB    ; LVT # Lo  [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH
+CABD..CAD7    ; LVT # Lo  [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH
+CAD9..CAF3    ; LVT # Lo  [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH
+CAF5..CB0F    ; LVT # Lo  [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH
+CB11..CB2B    ; LVT # Lo  [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH
+CB2D..CB47    ; LVT # Lo  [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH
+CB49..CB63    ; LVT # Lo  [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH
+CB65..CB7F    ; LVT # Lo  [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH
+CB81..CB9B    ; LVT # Lo  [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH
+CB9D..CBB7    ; LVT # Lo  [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH
+CBB9..CBD3    ; LVT # Lo  [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH
+CBD5..CBEF    ; LVT # Lo  [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH
+CBF1..CC0B    ; LVT # Lo  [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH
+CC0D..CC27    ; LVT # Lo  [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH
+CC29..CC43    ; LVT # Lo  [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH
+CC45..CC5F    ; LVT # Lo  [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH
+CC61..CC7B    ; LVT # Lo  [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH
+CC7D..CC97    ; LVT # Lo  [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH
+CC99..CCB3    ; LVT # Lo  [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH
+CCB5..CCCF    ; LVT # Lo  [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH
+CCD1..CCEB    ; LVT # Lo  [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH
+CCED..CD07    ; LVT # Lo  [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH
+CD09..CD23    ; LVT # Lo  [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH
+CD25..CD3F    ; LVT # Lo  [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH
+CD41..CD5B    ; LVT # Lo  [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH
+CD5D..CD77    ; LVT # Lo  [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH
+CD79..CD93    ; LVT # Lo  [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH
+CD95..CDAF    ; LVT # Lo  [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH
+CDB1..CDCB    ; LVT # Lo  [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH
+CDCD..CDE7    ; LVT # Lo  [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH
+CDE9..CE03    ; LVT # Lo  [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH
+CE05..CE1F    ; LVT # Lo  [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH
+CE21..CE3B    ; LVT # Lo  [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH
+CE3D..CE57    ; LVT # Lo  [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH
+CE59..CE73    ; LVT # Lo  [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH
+CE75..CE8F    ; LVT # Lo  [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH
+CE91..CEAB    ; LVT # Lo  [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH
+CEAD..CEC7    ; LVT # Lo  [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH
+CEC9..CEE3    ; LVT # Lo  [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH
+CEE5..CEFF    ; LVT # Lo  [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH
+CF01..CF1B    ; LVT # Lo  [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH
+CF1D..CF37    ; LVT # Lo  [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH
+CF39..CF53    ; LVT # Lo  [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH
+CF55..CF6F    ; LVT # Lo  [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH
+CF71..CF8B    ; LVT # Lo  [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH
+CF8D..CFA7    ; LVT # Lo  [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH
+CFA9..CFC3    ; LVT # Lo  [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH
+CFC5..CFDF    ; LVT # Lo  [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH
+CFE1..CFFB    ; LVT # Lo  [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH
+CFFD..D017    ; LVT # Lo  [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH
+D019..D033    ; LVT # Lo  [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH
+D035..D04F    ; LVT # Lo  [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH
+D051..D06B    ; LVT # Lo  [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH
+D06D..D087    ; LVT # Lo  [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH
+D089..D0A3    ; LVT # Lo  [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH
+D0A5..D0BF    ; LVT # Lo  [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH
+D0C1..D0DB    ; LVT # Lo  [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH
+D0DD..D0F7    ; LVT # Lo  [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH
+D0F9..D113    ; LVT # Lo  [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH
+D115..D12F    ; LVT # Lo  [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH
+D131..D14B    ; LVT # Lo  [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH
+D14D..D167    ; LVT # Lo  [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH
+D169..D183    ; LVT # Lo  [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH
+D185..D19F    ; LVT # Lo  [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH
+D1A1..D1BB    ; LVT # Lo  [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH
+D1BD..D1D7    ; LVT # Lo  [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH
+D1D9..D1F3    ; LVT # Lo  [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH
+D1F5..D20F    ; LVT # Lo  [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH
+D211..D22B    ; LVT # Lo  [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH
+D22D..D247    ; LVT # Lo  [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH
+D249..D263    ; LVT # Lo  [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH
+D265..D27F    ; LVT # Lo  [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH
+D281..D29B    ; LVT # Lo  [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH
+D29D..D2B7    ; LVT # Lo  [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH
+D2B9..D2D3    ; LVT # Lo  [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH
+D2D5..D2EF    ; LVT # Lo  [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH
+D2F1..D30B    ; LVT # Lo  [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH
+D30D..D327    ; LVT # Lo  [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH
+D329..D343    ; LVT # Lo  [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH
+D345..D35F    ; LVT # Lo  [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH
+D361..D37B    ; LVT # Lo  [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH
+D37D..D397    ; LVT # Lo  [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH
+D399..D3B3    ; LVT # Lo  [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH
+D3B5..D3CF    ; LVT # Lo  [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH
+D3D1..D3EB    ; LVT # Lo  [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH
+D3ED..D407    ; LVT # Lo  [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH
+D409..D423    ; LVT # Lo  [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH
+D425..D43F    ; LVT # Lo  [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH
+D441..D45B    ; LVT # Lo  [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH
+D45D..D477    ; LVT # Lo  [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH
+D479..D493    ; LVT # Lo  [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH
+D495..D4AF    ; LVT # Lo  [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH
+D4B1..D4CB    ; LVT # Lo  [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH
+D4CD..D4E7    ; LVT # Lo  [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH
+D4E9..D503    ; LVT # Lo  [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH
+D505..D51F    ; LVT # Lo  [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH
+D521..D53B    ; LVT # Lo  [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH
+D53D..D557    ; LVT # Lo  [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH
+D559..D573    ; LVT # Lo  [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH
+D575..D58F    ; LVT # Lo  [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH
+D591..D5AB    ; LVT # Lo  [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH
+D5AD..D5C7    ; LVT # Lo  [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH
+D5C9..D5E3    ; LVT # Lo  [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH
+D5E5..D5FF    ; LVT # Lo  [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH
+D601..D61B    ; LVT # Lo  [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH
+D61D..D637    ; LVT # Lo  [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH
+D639..D653    ; LVT # Lo  [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH
+D655..D66F    ; LVT # Lo  [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH
+D671..D68B    ; LVT # Lo  [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH
+D68D..D6A7    ; LVT # Lo  [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH
+D6A9..D6C3    ; LVT # Lo  [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH
+D6C5..D6DF    ; LVT # Lo  [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH
+D6E1..D6FB    ; LVT # Lo  [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH
+D6FD..D717    ; LVT # Lo  [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH
+D719..D733    ; LVT # Lo  [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH
+D735..D74F    ; LVT # Lo  [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH
+D751..D76B    ; LVT # Lo  [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH
+D76D..D787    ; LVT # Lo  [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH
+D789..D7A3    ; LVT # Lo  [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH
+
+# Total code points: 10773
+
+# ================================================
+
+200D          ; ZWJ # Cf       ZERO WIDTH JOINER
+
+# Total code points: 1
+
+# EOF
diff --git a/contrib/unicode/README b/contrib/unicode/README
index 1f5fee6dc35..1448a8d9f30 100644
--- a/contrib/unicode/README
+++ b/contrib/unicode/README
@@ -16,7 +16,12 @@ ftp://ftp.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt
 ftp://ftp.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
 ftp://ftp.unicode.org/Public/UNIDATA/NameAliases.txt
 
-These files have been added to source control in this directory;
+Two additional files are needed for lookup tables in libstdc++:
+
+ftp://ftp.unicode.org/Public/UNIDATA/auxiliary/GraphemeBreakProperty.txt
+ftp://ftp.unicode.org/Public/UNIDATA/emoji/emoji-data.txt
+
+All these files have been added to source control in this directory;
 please see unicode-license.txt for the relevant copyright information.
 
 In order to keep in sync with glibc's wcwidth as much as possible, it is
@@ -24,7 +29,7 @@ desirable for the logic that processes the Unicode data to be the same as
 glibc's.  To that end, we also put in this directory, in the from_glibc/
 directory, the glibc python code that implements their logic.  This code was
 copied verbatim from glibc, and it can be updated at any time from the glibc
-source code repository.  The files copied from that respository are:
+source code repository.  The files copied from that repository are:
 
 localedata/unicode-gen/unicode_utils.py
 localedata/unicode-gen/utf8_gen.py
@@ -71,3 +76,6 @@ The procedure to update GCC's Unicode support is the following:
 9:  Generate uname2c.h as follows:
       ../../libcpp/makeuname2c UnicodeData.txt NameAliases.txt \
 	> ../../libcpp/uname2c.h
+
+See gen_libstdcxx_unicode_data.py for instructions on updating the lookup
+tables in libstdc++.
diff --git a/contrib/unicode/emoji-data.txt b/contrib/unicode/emoji-data.txt
new file mode 100644
index 00000000000..0ba10e9ce4c
--- /dev/null
+++ b/contrib/unicode/emoji-data.txt
@@ -0,0 +1,1320 @@
+# emoji-data.txt
+# Date: 2023-02-01, 02:22:54 GMT
+# © 2023 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
+#
+# Emoji Data for UTS #51
+# Used with Emoji Version 15.1 and subsequent minor revisions (if any)
+#
+# For documentation and usage, see https://www.unicode.org/reports/tr51
+#
+# Format: 
+# <codepoint(s)> ; <property> # <comments> 
+# Note: there is no guarantee as to the structure of whitespace or comments
+#
+# Characters and sequences are listed in code point order. Users should be shown a more natural order.
+# See the CLDR collation order for Emoji.
+
+
+# ================================================
+
+# All omitted code points have Emoji=No
+
+0023          ; Emoji                # E0.0   [1] (#️)       hash sign
+002A          ; Emoji                # E0.0   [1] (*️)       asterisk
+0030..0039    ; Emoji                # E0.0  [10] (0️..9️)    digit zero..digit nine
+00A9          ; Emoji                # E0.6   [1] (©️)       copyright
+00AE          ; Emoji                # E0.6   [1] (®️)       registered
+203C          ; Emoji                # E0.6   [1] (‼️)       double exclamation mark
+2049          ; Emoji                # E0.6   [1] (⁉️)       exclamation question mark
+2122          ; Emoji                # E0.6   [1] (™️)       trade mark
+2139          ; Emoji                # E0.6   [1] (ℹ️)       information
+2194..2199    ; Emoji                # E0.6   [6] (↔️..↙️)    left-right arrow..down-left arrow
+21A9..21AA    ; Emoji                # E0.6   [2] (↩️..↪️)    right arrow curving left..left arrow curving right
+231A..231B    ; Emoji                # E0.6   [2] (⌚..⌛)    watch..hourglass done
+2328          ; Emoji                # E1.0   [1] (⌨️)       keyboard
+23CF          ; Emoji                # E1.0   [1] (⏏️)       eject button
+23E9..23EC    ; Emoji                # E0.6   [4] (⏩..⏬)    fast-forward button..fast down button
+23ED..23EE    ; Emoji                # E0.7   [2] (⏭️..⏮️)    next track button..last track button
+23EF          ; Emoji                # E1.0   [1] (⏯️)       play or pause button
+23F0          ; Emoji                # E0.6   [1] (⏰)       alarm clock
+23F1..23F2    ; Emoji                # E1.0   [2] (⏱️..⏲️)    stopwatch..timer clock
+23F3          ; Emoji                # E0.6   [1] (⏳)       hourglass not done
+23F8..23FA    ; Emoji                # E0.7   [3] (⏸️..⏺️)    pause button..record button
+24C2          ; Emoji                # E0.6   [1] (Ⓜ️)       circled M
+25AA..25AB    ; Emoji                # E0.6   [2] (▪️..▫️)    black small square..white small square
+25B6          ; Emoji                # E0.6   [1] (▶️)       play button
+25C0          ; Emoji                # E0.6   [1] (◀️)       reverse button
+25FB..25FE    ; Emoji                # E0.6   [4] (◻️..◾)    white medium square..black medium-small square
+2600..2601    ; Emoji                # E0.6   [2] (☀️..☁️)    sun..cloud
+2602..2603    ; Emoji                # E0.7   [2] (☂️..☃️)    umbrella..snowman
+2604          ; Emoji                # E1.0   [1] (☄️)       comet
+260E          ; Emoji                # E0.6   [1] (☎️)       telephone
+2611          ; Emoji                # E0.6   [1] (☑️)       check box with check
+2614..2615    ; Emoji                # E0.6   [2] (☔..☕)    umbrella with rain drops..hot beverage
+2618          ; Emoji                # E1.0   [1] (☘️)       shamrock
+261D          ; Emoji                # E0.6   [1] (☝️)       index pointing up
+2620          ; Emoji                # E1.0   [1] (☠️)       skull and crossbones
+2622..2623    ; Emoji                # E1.0   [2] (☢️..☣️)    radioactive..biohazard
+2626          ; Emoji                # E1.0   [1] (☦️)       orthodox cross
+262A          ; Emoji                # E0.7   [1] (☪️)       star and crescent
+262E          ; Emoji                # E1.0   [1] (☮️)       peace symbol
+262F          ; Emoji                # E0.7   [1] (☯️)       yin yang
+2638..2639    ; Emoji                # E0.7   [2] (☸️..☹️)    wheel of dharma..frowning face
+263A          ; Emoji                # E0.6   [1] (☺️)       smiling face
+2640          ; Emoji                # E4.0   [1] (♀️)       female sign
+2642          ; Emoji                # E4.0   [1] (♂️)       male sign
+2648..2653    ; Emoji                # E0.6  [12] (♈..♓)    Aries..Pisces
+265F          ; Emoji                # E11.0  [1] (♟️)       chess pawn
+2660          ; Emoji                # E0.6   [1] (♠️)       spade suit
+2663          ; Emoji                # E0.6   [1] (♣️)       club suit
+2665..2666    ; Emoji                # E0.6   [2] (♥️..♦️)    heart suit..diamond suit
+2668          ; Emoji                # E0.6   [1] (♨️)       hot springs
+267B          ; Emoji                # E0.6   [1] (♻️)       recycling symbol
+267E          ; Emoji                # E11.0  [1] (♾️)       infinity
+267F          ; Emoji                # E0.6   [1] (♿)       wheelchair symbol
+2692          ; Emoji                # E1.0   [1] (⚒️)       hammer and pick
+2693          ; Emoji                # E0.6   [1] (⚓)       anchor
+2694          ; Emoji                # E1.0   [1] (⚔️)       crossed swords
+2695          ; Emoji                # E4.0   [1] (⚕️)       medical symbol
+2696..2697    ; Emoji                # E1.0   [2] (⚖️..⚗️)    balance scale..alembic
+2699          ; Emoji                # E1.0   [1] (⚙️)       gear
+269B..269C    ; Emoji                # E1.0   [2] (⚛️..⚜️)    atom symbol..fleur-de-lis
+26A0..26A1    ; Emoji                # E0.6   [2] (⚠️..⚡)    warning..high voltage
+26A7          ; Emoji                # E13.0  [1] (⚧️)       transgender symbol
+26AA..26AB    ; Emoji                # E0.6   [2] (⚪..⚫)    white circle..black circle
+26B0..26B1    ; Emoji                # E1.0   [2] (⚰️..⚱️)    coffin..funeral urn
+26BD..26BE    ; Emoji                # E0.6   [2] (⚽..⚾)    soccer ball..baseball
+26C4..26C5    ; Emoji                # E0.6   [2] (⛄..⛅)    snowman without snow..sun behind cloud
+26C8          ; Emoji                # E0.7   [1] (⛈️)       cloud with lightning and rain
+26CE          ; Emoji                # E0.6   [1] (⛎)       Ophiuchus
+26CF          ; Emoji                # E0.7   [1] (⛏️)       pick
+26D1          ; Emoji                # E0.7   [1] (⛑️)       rescue worker’s helmet
+26D3          ; Emoji                # E0.7   [1] (⛓️)       chains
+26D4          ; Emoji                # E0.6   [1] (⛔)       no entry
+26E9          ; Emoji                # E0.7   [1] (⛩️)       shinto shrine
+26EA          ; Emoji                # E0.6   [1] (⛪)       church
+26F0..26F1    ; Emoji                # E0.7   [2] (⛰️..⛱️)    mountain..umbrella on ground
+26F2..26F3    ; Emoji                # E0.6   [2] (⛲..⛳)    fountain..flag in hole
+26F4          ; Emoji                # E0.7   [1] (⛴️)       ferry
+26F5          ; Emoji                # E0.6   [1] (⛵)       sailboat
+26F7..26F9    ; Emoji                # E0.7   [3] (⛷️..⛹️)    skier..person bouncing ball
+26FA          ; Emoji                # E0.6   [1] (⛺)       tent
+26FD          ; Emoji                # E0.6   [1] (⛽)       fuel pump
+2702          ; Emoji                # E0.6   [1] (✂️)       scissors
+2705          ; Emoji                # E0.6   [1] (✅)       check mark button
+2708..270C    ; Emoji                # E0.6   [5] (✈️..✌️)    airplane..victory hand
+270D          ; Emoji                # E0.7   [1] (✍️)       writing hand
+270F          ; Emoji                # E0.6   [1] (✏️)       pencil
+2712          ; Emoji                # E0.6   [1] (✒️)       black nib
+2714          ; Emoji                # E0.6   [1] (✔️)       check mark
+2716          ; Emoji                # E0.6   [1] (✖️)       multiply
+271D          ; Emoji                # E0.7   [1] (✝️)       latin cross
+2721          ; Emoji                # E0.7   [1] (✡️)       star of David
+2728          ; Emoji                # E0.6   [1] (✨)       sparkles
+2733..2734    ; Emoji                # E0.6   [2] (✳️..✴️)    eight-spoked asterisk..eight-pointed star
+2744          ; Emoji                # E0.6   [1] (❄️)       snowflake
+2747          ; Emoji                # E0.6   [1] (❇️)       sparkle
+274C          ; Emoji                # E0.6   [1] (❌)       cross mark
+274E          ; Emoji                # E0.6   [1] (❎)       cross mark button
+2753..2755    ; Emoji                # E0.6   [3] (❓..❕)    red question mark..white exclamation mark
+2757          ; Emoji                # E0.6   [1] (❗)       red exclamation mark
+2763          ; Emoji                # E1.0   [1] (❣️)       heart exclamation
+2764          ; Emoji                # E0.6   [1] (❤️)       red heart
+2795..2797    ; Emoji                # E0.6   [3] (➕..➗)    plus..divide
+27A1          ; Emoji                # E0.6   [1] (➡️)       right arrow
+27B0          ; Emoji                # E0.6   [1] (➰)       curly loop
+27BF          ; Emoji                # E1.0   [1] (➿)       double curly loop
+2934..2935    ; Emoji                # E0.6   [2] (⤴️..⤵️)    right arrow curving up..right arrow curving down
+2B05..2B07    ; Emoji                # E0.6   [3] (⬅️..⬇️)    left arrow..down arrow
+2B1B..2B1C    ; Emoji                # E0.6   [2] (⬛..⬜)    black large square..white large square
+2B50          ; Emoji                # E0.6   [1] (⭐)       star
+2B55          ; Emoji                # E0.6   [1] (⭕)       hollow red circle
+3030          ; Emoji                # E0.6   [1] (〰️)       wavy dash
+303D          ; Emoji                # E0.6   [1] (〽️)       part alternation mark
+3297          ; Emoji                # E0.6   [1] (㊗️)       Japanese “congratulations” button
+3299          ; Emoji                # E0.6   [1] (㊙️)       Japanese “secret” button
+1F004         ; Emoji                # E0.6   [1] (🀄)       mahjong red dragon
+1F0CF         ; Emoji                # E0.6   [1] (🃏)       joker
+1F170..1F171  ; Emoji                # E0.6   [2] (🅰️..🅱️)    A button (blood type)..B button (blood type)
+1F17E..1F17F  ; Emoji                # E0.6   [2] (🅾️..🅿️)    O button (blood type)..P button
+1F18E         ; Emoji                # E0.6   [1] (🆎)       AB button (blood type)
+1F191..1F19A  ; Emoji                # E0.6  [10] (🆑..🆚)    CL button..VS button
+1F1E6..1F1FF  ; Emoji                # E0.0  [26] (🇦..🇿)    regional indicator symbol letter a..regional indicator symbol letter z
+1F201..1F202  ; Emoji                # E0.6   [2] (🈁..🈂️)    Japanese “here” button..Japanese “service charge” button
+1F21A         ; Emoji                # E0.6   [1] (🈚)       Japanese “free of charge” button
+1F22F         ; Emoji                # E0.6   [1] (🈯)       Japanese “reserved” button
+1F232..1F23A  ; Emoji                # E0.6   [9] (🈲..🈺)    Japanese “prohibited” button..Japanese “open for business” button
+1F250..1F251  ; Emoji                # E0.6   [2] (🉐..🉑)    Japanese “bargain” button..Japanese “acceptable” button
+1F300..1F30C  ; Emoji                # E0.6  [13] (🌀..🌌)    cyclone..milky way
+1F30D..1F30E  ; Emoji                # E0.7   [2] (🌍..🌎)    globe showing Europe-Africa..globe showing Americas
+1F30F         ; Emoji                # E0.6   [1] (🌏)       globe showing Asia-Australia
+1F310         ; Emoji                # E1.0   [1] (🌐)       globe with meridians
+1F311         ; Emoji                # E0.6   [1] (🌑)       new moon
+1F312         ; Emoji                # E1.0   [1] (🌒)       waxing crescent moon
+1F313..1F315  ; Emoji                # E0.6   [3] (🌓..🌕)    first quarter moon..full moon
+1F316..1F318  ; Emoji                # E1.0   [3] (🌖..🌘)    waning gibbous moon..waning crescent moon
+1F319         ; Emoji                # E0.6   [1] (🌙)       crescent moon
+1F31A         ; Emoji                # E1.0   [1] (🌚)       new moon face
+1F31B         ; Emoji                # E0.6   [1] (🌛)       first quarter moon face
+1F31C         ; Emoji                # E0.7   [1] (🌜)       last quarter moon face
+1F31D..1F31E  ; Emoji                # E1.0   [2] (🌝..🌞)    full moon face..sun with face
+1F31F..1F320  ; Emoji                # E0.6   [2] (🌟..🌠)    glowing star..shooting star
+1F321         ; Emoji                # E0.7   [1] (🌡️)       thermometer
+1F324..1F32C  ; Emoji                # E0.7   [9] (🌤️..🌬️)    sun behind small cloud..wind face
+1F32D..1F32F  ; Emoji                # E1.0   [3] (🌭..🌯)    hot dog..burrito
+1F330..1F331  ; Emoji                # E0.6   [2] (🌰..🌱)    chestnut..seedling
+1F332..1F333  ; Emoji                # E1.0   [2] (🌲..🌳)    evergreen tree..deciduous tree
+1F334..1F335  ; Emoji                # E0.6   [2] (🌴..🌵)    palm tree..cactus
+1F336         ; Emoji                # E0.7   [1] (🌶️)       hot pepper
+1F337..1F34A  ; Emoji                # E0.6  [20] (🌷..🍊)    tulip..tangerine
+1F34B         ; Emoji                # E1.0   [1] (🍋)       lemon
+1F34C..1F34F  ; Emoji                # E0.6   [4] (🍌..🍏)    banana..green apple
+1F350         ; Emoji                # E1.0   [1] (🍐)       pear
+1F351..1F37B  ; Emoji                # E0.6  [43] (🍑..🍻)    peach..clinking beer mugs
+1F37C         ; Emoji                # E1.0   [1] (🍼)       baby bottle
+1F37D         ; Emoji                # E0.7   [1] (🍽️)       fork and knife with plate
+1F37E..1F37F  ; Emoji                # E1.0   [2] (🍾..🍿)    bottle with popping cork..popcorn
+1F380..1F393  ; Emoji                # E0.6  [20] (🎀..🎓)    ribbon..graduation cap
+1F396..1F397  ; Emoji                # E0.7   [2] (🎖️..🎗️)    military medal..reminder ribbon
+1F399..1F39B  ; Emoji                # E0.7   [3] (🎙️..🎛️)    studio microphone..control knobs
+1F39E..1F39F  ; Emoji                # E0.7   [2] (🎞️..🎟️)    film frames..admission tickets
+1F3A0..1F3C4  ; Emoji                # E0.6  [37] (🎠..🏄)    carousel horse..person surfing
+1F3C5         ; Emoji                # E1.0   [1] (🏅)       sports medal
+1F3C6         ; Emoji                # E0.6   [1] (🏆)       trophy
+1F3C7         ; Emoji                # E1.0   [1] (🏇)       horse racing
+1F3C8         ; Emoji                # E0.6   [1] (🏈)       american football
+1F3C9         ; Emoji                # E1.0   [1] (🏉)       rugby football
+1F3CA         ; Emoji                # E0.6   [1] (🏊)       person swimming
+1F3CB..1F3CE  ; Emoji                # E0.7   [4] (🏋️..🏎️)    person lifting weights..racing car
+1F3CF..1F3D3  ; Emoji                # E1.0   [5] (🏏..🏓)    cricket game..ping pong
+1F3D4..1F3DF  ; Emoji                # E0.7  [12] (🏔️..🏟️)    snow-capped mountain..stadium
+1F3E0..1F3E3  ; Emoji                # E0.6   [4] (🏠..🏣)    house..Japanese post office
+1F3E4         ; Emoji                # E1.0   [1] (🏤)       post office
+1F3E5..1F3F0  ; Emoji                # E0.6  [12] (🏥..🏰)    hospital..castle
+1F3F3         ; Emoji                # E0.7   [1] (🏳️)       white flag
+1F3F4         ; Emoji                # E1.0   [1] (🏴)       black flag
+1F3F5         ; Emoji                # E0.7   [1] (🏵️)       rosette
+1F3F7         ; Emoji                # E0.7   [1] (🏷️)       label
+1F3F8..1F407  ; Emoji                # E1.0  [16] (🏸..🐇)    badminton..rabbit
+1F408         ; Emoji                # E0.7   [1] (🐈)       cat
+1F409..1F40B  ; Emoji                # E1.0   [3] (🐉..🐋)    dragon..whale
+1F40C..1F40E  ; Emoji                # E0.6   [3] (🐌..🐎)    snail..horse
+1F40F..1F410  ; Emoji                # E1.0   [2] (🐏..🐐)    ram..goat
+1F411..1F412  ; Emoji                # E0.6   [2] (🐑..🐒)    ewe..monkey
+1F413         ; Emoji                # E1.0   [1] (🐓)       rooster
+1F414         ; Emoji                # E0.6   [1] (🐔)       chicken
+1F415         ; Emoji                # E0.7   [1] (🐕)       dog
+1F416         ; Emoji                # E1.0   [1] (🐖)       pig
+1F417..1F429  ; Emoji                # E0.6  [19] (🐗..🐩)    boar..poodle
+1F42A         ; Emoji                # E1.0   [1] (🐪)       camel
+1F42B..1F43E  ; Emoji                # E0.6  [20] (🐫..🐾)    two-hump camel..paw prints
+1F43F         ; Emoji                # E0.7   [1] (🐿️)       chipmunk
+1F440         ; Emoji                # E0.6   [1] (👀)       eyes
+1F441         ; Emoji                # E0.7   [1] (👁️)       eye
+1F442..1F464  ; Emoji                # E0.6  [35] (👂..👤)    ear..bust in silhouette
+1F465         ; Emoji                # E1.0   [1] (👥)       busts in silhouette
+1F466..1F46B  ; Emoji                # E0.6   [6] (👦..👫)    boy..woman and man holding hands
+1F46C..1F46D  ; Emoji                # E1.0   [2] (👬..👭)    men holding hands..women holding hands
+1F46E..1F4AC  ; Emoji                # E0.6  [63] (👮..💬)    police officer..speech balloon
+1F4AD         ; Emoji                # E1.0   [1] (💭)       thought balloon
+1F4AE..1F4B5  ; Emoji                # E0.6   [8] (💮..💵)    white flower..dollar banknote
+1F4B6..1F4B7  ; Emoji                # E1.0   [2] (💶..💷)    euro banknote..pound banknote
+1F4B8..1F4EB  ; Emoji                # E0.6  [52] (💸..📫)    money with wings..closed mailbox with raised flag
+1F4EC..1F4ED  ; Emoji                # E0.7   [2] (📬..📭)    open mailbox with raised flag..open mailbox with lowered flag
+1F4EE         ; Emoji                # E0.6   [1] (📮)       postbox
+1F4EF         ; Emoji                # E1.0   [1] (📯)       postal horn
+1F4F0..1F4F4  ; Emoji                # E0.6   [5] (📰..📴)    newspaper..mobile phone off
+1F4F5         ; Emoji                # E1.0   [1] (📵)       no mobile phones
+1F4F6..1F4F7  ; Emoji                # E0.6   [2] (📶..📷)    antenna bars..camera
+1F4F8         ; Emoji                # E1.0   [1] (📸)       camera with flash
+1F4F9..1F4FC  ; Emoji                # E0.6   [4] (📹..📼)    video camera..videocassette
+1F4FD         ; Emoji                # E0.7   [1] (📽️)       film projector
+1F4FF..1F502  ; Emoji                # E1.0   [4] (📿..🔂)    prayer beads..repeat single button
+1F503         ; Emoji                # E0.6   [1] (🔃)       clockwise vertical arrows
+1F504..1F507  ; Emoji                # E1.0   [4] (🔄..🔇)    counterclockwise arrows button..muted speaker
+1F508         ; Emoji                # E0.7   [1] (🔈)       speaker low volume
+1F509         ; Emoji                # E1.0   [1] (🔉)       speaker medium volume
+1F50A..1F514  ; Emoji                # E0.6  [11] (🔊..🔔)    speaker high volume..bell
+1F515         ; Emoji                # E1.0   [1] (🔕)       bell with slash
+1F516..1F52B  ; Emoji                # E0.6  [22] (🔖..🔫)    bookmark..water pistol
+1F52C..1F52D  ; Emoji                # E1.0   [2] (🔬..🔭)    microscope..telescope
+1F52E..1F53D  ; Emoji                # E0.6  [16] (🔮..🔽)    crystal ball..downwards button
+1F549..1F54A  ; Emoji                # E0.7   [2] (🕉️..🕊️)    om..dove
+1F54B..1F54E  ; Emoji                # E1.0   [4] (🕋..🕎)    kaaba..menorah
+1F550..1F55B  ; Emoji                # E0.6  [12] (🕐..🕛)    one o’clock..twelve o’clock
+1F55C..1F567  ; Emoji                # E0.7  [12] (🕜..🕧)    one-thirty..twelve-thirty
+1F56F..1F570  ; Emoji                # E0.7   [2] (🕯️..🕰️)    candle..mantelpiece clock
+1F573..1F579  ; Emoji                # E0.7   [7] (🕳️..🕹️)    hole..joystick
+1F57A         ; Emoji                # E3.0   [1] (🕺)       man dancing
+1F587         ; Emoji                # E0.7   [1] (🖇️)       linked paperclips
+1F58A..1F58D  ; Emoji                # E0.7   [4] (🖊️..🖍️)    pen..crayon
+1F590         ; Emoji                # E0.7   [1] (🖐️)       hand with fingers splayed
+1F595..1F596  ; Emoji                # E1.0   [2] (🖕..🖖)    middle finger..vulcan salute
+1F5A4         ; Emoji                # E3.0   [1] (🖤)       black heart
+1F5A5         ; Emoji                # E0.7   [1] (🖥️)       desktop computer
+1F5A8         ; Emoji                # E0.7   [1] (🖨️)       printer
+1F5B1..1F5B2  ; Emoji                # E0.7   [2] (🖱️..🖲️)    computer mouse..trackball
+1F5BC         ; Emoji                # E0.7   [1] (🖼️)       framed picture
+1F5C2..1F5C4  ; Emoji                # E0.7   [3] (🗂️..🗄️)    card index dividers..file cabinet
+1F5D1..1F5D3  ; Emoji                # E0.7   [3] (🗑️..🗓️)    wastebasket..spiral calendar
+1F5DC..1F5DE  ; Emoji                # E0.7   [3] (🗜️..🗞️)    clamp..rolled-up newspaper
+1F5E1         ; Emoji                # E0.7   [1] (🗡️)       dagger
+1F5E3         ; Emoji                # E0.7   [1] (🗣️)       speaking head
+1F5E8         ; Emoji                # E2.0   [1] (🗨️)       left speech bubble
+1F5EF         ; Emoji                # E0.7   [1] (🗯️)       right anger bubble
+1F5F3         ; Emoji                # E0.7   [1] (🗳️)       ballot box with ballot
+1F5FA         ; Emoji                # E0.7   [1] (🗺️)       world map
+1F5FB..1F5FF  ; Emoji                # E0.6   [5] (🗻..🗿)    mount fuji..moai
+1F600         ; Emoji                # E1.0   [1] (😀)       grinning face
+1F601..1F606  ; Emoji                # E0.6   [6] (😁..😆)    beaming face with smiling eyes..grinning squinting face
+1F607..1F608  ; Emoji                # E1.0   [2] (😇..😈)    smiling face with halo..smiling face with horns
+1F609..1F60D  ; Emoji                # E0.6   [5] (😉..😍)    winking face..smiling face with heart-eyes
+1F60E         ; Emoji                # E1.0   [1] (😎)       smiling face with sunglasses
+1F60F         ; Emoji                # E0.6   [1] (😏)       smirking face
+1F610         ; Emoji                # E0.7   [1] (😐)       neutral face
+1F611         ; Emoji                # E1.0   [1] (😑)       expressionless face
+1F612..1F614  ; Emoji                # E0.6   [3] (😒..😔)    unamused face..pensive face
+1F615         ; Emoji                # E1.0   [1] (😕)       confused face
+1F616         ; Emoji                # E0.6   [1] (😖)       confounded face
+1F617         ; Emoji                # E1.0   [1] (😗)       kissing face
+1F618         ; Emoji                # E0.6   [1] (😘)       face blowing a kiss
+1F619         ; Emoji                # E1.0   [1] (😙)       kissing face with smiling eyes
+1F61A         ; Emoji                # E0.6   [1] (😚)       kissing face with closed eyes
+1F61B         ; Emoji                # E1.0   [1] (😛)       face with tongue
+1F61C..1F61E  ; Emoji                # E0.6   [3] (😜..😞)    winking face with tongue..disappointed face
+1F61F         ; Emoji                # E1.0   [1] (😟)       worried face
+1F620..1F625  ; Emoji                # E0.6   [6] (😠..😥)    angry face..sad but relieved face
+1F626..1F627  ; Emoji                # E1.0   [2] (😦..😧)    frowning face with open mouth..anguished face
+1F628..1F62B  ; Emoji                # E0.6   [4] (😨..😫)    fearful face..tired face
+1F62C         ; Emoji                # E1.0   [1] (😬)       grimacing face
+1F62D         ; Emoji                # E0.6   [1] (😭)       loudly crying face
+1F62E..1F62F  ; Emoji                # E1.0   [2] (😮..😯)    face with open mouth..hushed face
+1F630..1F633  ; Emoji                # E0.6   [4] (😰..😳)    anxious face with sweat..flushed face
+1F634         ; Emoji                # E1.0   [1] (😴)       sleeping face
+1F635         ; Emoji                # E0.6   [1] (😵)       face with crossed-out eyes
+1F636         ; Emoji                # E1.0   [1] (😶)       face without mouth
+1F637..1F640  ; Emoji                # E0.6  [10] (😷..🙀)    face with medical mask..weary cat
+1F641..1F644  ; Emoji                # E1.0   [4] (🙁..🙄)    slightly frowning face..face with rolling eyes
+1F645..1F64F  ; Emoji                # E0.6  [11] (🙅..🙏)    person gesturing NO..folded hands
+1F680         ; Emoji                # E0.6   [1] (🚀)       rocket
+1F681..1F682  ; Emoji                # E1.0   [2] (🚁..🚂)    helicopter..locomotive
+1F683..1F685  ; Emoji                # E0.6   [3] (🚃..🚅)    railway car..bullet train
+1F686         ; Emoji                # E1.0   [1] (🚆)       train
+1F687         ; Emoji                # E0.6   [1] (🚇)       metro
+1F688         ; Emoji                # E1.0   [1] (🚈)       light rail
+1F689         ; Emoji                # E0.6   [1] (🚉)       station
+1F68A..1F68B  ; Emoji                # E1.0   [2] (🚊..🚋)    tram..tram car
+1F68C         ; Emoji                # E0.6   [1] (🚌)       bus
+1F68D         ; Emoji                # E0.7   [1] (🚍)       oncoming bus
+1F68E         ; Emoji                # E1.0   [1] (🚎)       trolleybus
+1F68F         ; Emoji                # E0.6   [1] (🚏)       bus stop
+1F690         ; Emoji                # E1.0   [1] (🚐)       minibus
+1F691..1F693  ; Emoji                # E0.6   [3] (🚑..🚓)    ambulance..police car
+1F694         ; Emoji                # E0.7   [1] (🚔)       oncoming police car
+1F695         ; Emoji                # E0.6   [1] (🚕)       taxi
+1F696         ; Emoji                # E1.0   [1] (🚖)       oncoming taxi
+1F697         ; Emoji                # E0.6   [1] (🚗)       automobile
+1F698         ; Emoji                # E0.7   [1] (🚘)       oncoming automobile
+1F699..1F69A  ; Emoji                # E0.6   [2] (🚙..🚚)    sport utility vehicle..delivery truck
+1F69B..1F6A1  ; Emoji                # E1.0   [7] (🚛..🚡)    articulated lorry..aerial tramway
+1F6A2         ; Emoji                # E0.6   [1] (🚢)       ship
+1F6A3         ; Emoji                # E1.0   [1] (🚣)       person rowing boat
+1F6A4..1F6A5  ; Emoji                # E0.6   [2] (🚤..🚥)    speedboat..horizontal traffic light
+1F6A6         ; Emoji                # E1.0   [1] (🚦)       vertical traffic light
+1F6A7..1F6AD  ; Emoji                # E0.6   [7] (🚧..🚭)    construction..no smoking
+1F6AE..1F6B1  ; Emoji                # E1.0   [4] (🚮..🚱)    litter in bin sign..non-potable water
+1F6B2         ; Emoji                # E0.6   [1] (🚲)       bicycle
+1F6B3..1F6B5  ; Emoji                # E1.0   [3] (🚳..🚵)    no bicycles..person mountain biking
+1F6B6         ; Emoji                # E0.6   [1] (🚶)       person walking
+1F6B7..1F6B8  ; Emoji                # E1.0   [2] (🚷..🚸)    no pedestrians..children crossing
+1F6B9..1F6BE  ; Emoji                # E0.6   [6] (🚹..🚾)    men’s room..water closet
+1F6BF         ; Emoji                # E1.0   [1] (🚿)       shower
+1F6C0         ; Emoji                # E0.6   [1] (🛀)       person taking bath
+1F6C1..1F6C5  ; Emoji                # E1.0   [5] (🛁..🛅)    bathtub..left luggage
+1F6CB         ; Emoji                # E0.7   [1] (🛋️)       couch and lamp
+1F6CC         ; Emoji                # E1.0   [1] (🛌)       person in bed
+1F6CD..1F6CF  ; Emoji                # E0.7   [3] (🛍️..🛏️)    shopping bags..bed
+1F6D0         ; Emoji                # E1.0   [1] (🛐)       place of worship
+1F6D1..1F6D2  ; Emoji                # E3.0   [2] (🛑..🛒)    stop sign..shopping cart
+1F6D5         ; Emoji                # E12.0  [1] (🛕)       hindu temple
+1F6D6..1F6D7  ; Emoji                # E13.0  [2] (🛖..🛗)    hut..elevator
+1F6DC         ; Emoji                # E15.0  [1] (🛜)       wireless
+1F6DD..1F6DF  ; Emoji                # E14.0  [3] (🛝..🛟)    playground slide..ring buoy
+1F6E0..1F6E5  ; Emoji                # E0.7   [6] (🛠️..🛥️)    hammer and wrench..motor boat
+1F6E9         ; Emoji                # E0.7   [1] (🛩️)       small airplane
+1F6EB..1F6EC  ; Emoji                # E1.0   [2] (🛫..🛬)    airplane departure..airplane arrival
+1F6F0         ; Emoji                # E0.7   [1] (🛰️)       satellite
+1F6F3         ; Emoji                # E0.7   [1] (🛳️)       passenger ship
+1F6F4..1F6F6  ; Emoji                # E3.0   [3] (🛴..🛶)    kick scooter..canoe
+1F6F7..1F6F8  ; Emoji                # E5.0   [2] (🛷..🛸)    sled..flying saucer
+1F6F9         ; Emoji                # E11.0  [1] (🛹)       skateboard
+1F6FA         ; Emoji                # E12.0  [1] (🛺)       auto rickshaw
+1F6FB..1F6FC  ; Emoji                # E13.0  [2] (🛻..🛼)    pickup truck..roller skate
+1F7E0..1F7EB  ; Emoji                # E12.0 [12] (🟠..🟫)    orange circle..brown square
+1F7F0         ; Emoji                # E14.0  [1] (🟰)       heavy equals sign
+1F90C         ; Emoji                # E13.0  [1] (🤌)       pinched fingers
+1F90D..1F90F  ; Emoji                # E12.0  [3] (🤍..🤏)    white heart..pinching hand
+1F910..1F918  ; Emoji                # E1.0   [9] (🤐..🤘)    zipper-mouth face..sign of the horns
+1F919..1F91E  ; Emoji                # E3.0   [6] (🤙..🤞)    call me hand..crossed fingers
+1F91F         ; Emoji                # E5.0   [1] (🤟)       love-you gesture
+1F920..1F927  ; Emoji                # E3.0   [8] (🤠..🤧)    cowboy hat face..sneezing face
+1F928..1F92F  ; Emoji                # E5.0   [8] (🤨..🤯)    face with raised eyebrow..exploding head
+1F930         ; Emoji                # E3.0   [1] (🤰)       pregnant woman
+1F931..1F932  ; Emoji                # E5.0   [2] (🤱..🤲)    breast-feeding..palms up together
+1F933..1F93A  ; Emoji                # E3.0   [8] (🤳..🤺)    selfie..person fencing
+1F93C..1F93E  ; Emoji                # E3.0   [3] (🤼..🤾)    people wrestling..person playing handball
+1F93F         ; Emoji                # E12.0  [1] (🤿)       diving mask
+1F940..1F945  ; Emoji                # E3.0   [6] (🥀..🥅)    wilted flower..goal net
+1F947..1F94B  ; Emoji                # E3.0   [5] (🥇..🥋)    1st place medal..martial arts uniform
+1F94C         ; Emoji                # E5.0   [1] (🥌)       curling stone
+1F94D..1F94F  ; Emoji                # E11.0  [3] (🥍..🥏)    lacrosse..flying disc
+1F950..1F95E  ; Emoji                # E3.0  [15] (🥐..🥞)    croissant..pancakes
+1F95F..1F96B  ; Emoji                # E5.0  [13] (🥟..🥫)    dumpling..canned food
+1F96C..1F970  ; Emoji                # E11.0  [5] (🥬..🥰)    leafy green..smiling face with hearts
+1F971         ; Emoji                # E12.0  [1] (🥱)       yawning face
+1F972         ; Emoji                # E13.0  [1] (🥲)       smiling face with tear
+1F973..1F976  ; Emoji                # E11.0  [4] (🥳..🥶)    partying face..cold face
+1F977..1F978  ; Emoji                # E13.0  [2] (🥷..🥸)    ninja..disguised face
+1F979         ; Emoji                # E14.0  [1] (🥹)       face holding back tears
+1F97A         ; Emoji                # E11.0  [1] (🥺)       pleading face
+1F97B         ; Emoji                # E12.0  [1] (🥻)       sari
+1F97C..1F97F  ; Emoji                # E11.0  [4] (🥼..🥿)    lab coat..flat shoe
+1F980..1F984  ; Emoji                # E1.0   [5] (🦀..🦄)    crab..unicorn
+1F985..1F991  ; Emoji                # E3.0  [13] (🦅..🦑)    eagle..squid
+1F992..1F997  ; Emoji                # E5.0   [6] (🦒..🦗)    giraffe..cricket
+1F998..1F9A2  ; Emoji                # E11.0 [11] (🦘..🦢)    kangaroo..swan
+1F9A3..1F9A4  ; Emoji                # E13.0  [2] (🦣..🦤)    mammoth..dodo
+1F9A5..1F9AA  ; Emoji                # E12.0  [6] (🦥..🦪)    sloth..oyster
+1F9AB..1F9AD  ; Emoji                # E13.0  [3] (🦫..🦭)    beaver..seal
+1F9AE..1F9AF  ; Emoji                # E12.0  [2] (🦮..🦯)    guide dog..white cane
+1F9B0..1F9B9  ; Emoji                # E11.0 [10] (🦰..🦹)    red hair..supervillain
+1F9BA..1F9BF  ; Emoji                # E12.0  [6] (🦺..🦿)    safety vest..mechanical leg
+1F9C0         ; Emoji                # E1.0   [1] (🧀)       cheese wedge
+1F9C1..1F9C2  ; Emoji                # E11.0  [2] (🧁..🧂)    cupcake..salt
+1F9C3..1F9CA  ; Emoji                # E12.0  [8] (🧃..🧊)    beverage box..ice
+1F9CB         ; Emoji                # E13.0  [1] (🧋)       bubble tea
+1F9CC         ; Emoji                # E14.0  [1] (🧌)       troll
+1F9CD..1F9CF  ; Emoji                # E12.0  [3] (🧍..🧏)    person standing..deaf person
+1F9D0..1F9E6  ; Emoji                # E5.0  [23] (🧐..🧦)    face with monocle..socks
+1F9E7..1F9FF  ; Emoji                # E11.0 [25] (🧧..🧿)    red envelope..nazar amulet
+1FA70..1FA73  ; Emoji                # E12.0  [4] (🩰..🩳)    ballet shoes..shorts
+1FA74         ; Emoji                # E13.0  [1] (🩴)       thong sandal
+1FA75..1FA77  ; Emoji                # E15.0  [3] (🩵..🩷)    light blue heart..pink heart
+1FA78..1FA7A  ; Emoji                # E12.0  [3] (🩸..🩺)    drop of blood..stethoscope
+1FA7B..1FA7C  ; Emoji                # E14.0  [2] (🩻..🩼)    x-ray..crutch
+1FA80..1FA82  ; Emoji                # E12.0  [3] (🪀..🪂)    yo-yo..parachute
+1FA83..1FA86  ; Emoji                # E13.0  [4] (🪃..🪆)    boomerang..nesting dolls
+1FA87..1FA88  ; Emoji                # E15.0  [2] (🪇..🪈)    maracas..flute
+1FA90..1FA95  ; Emoji                # E12.0  [6] (🪐..🪕)    ringed planet..banjo
+1FA96..1FAA8  ; Emoji                # E13.0 [19] (🪖..🪨)    military helmet..rock
+1FAA9..1FAAC  ; Emoji                # E14.0  [4] (🪩..🪬)    mirror ball..hamsa
+1FAAD..1FAAF  ; Emoji                # E15.0  [3] (🪭..🪯)    folding hand fan..khanda
+1FAB0..1FAB6  ; Emoji                # E13.0  [7] (🪰..🪶)    fly..feather
+1FAB7..1FABA  ; Emoji                # E14.0  [4] (🪷..🪺)    lotus..nest with eggs
+1FABB..1FABD  ; Emoji                # E15.0  [3] (🪻..🪽)    hyacinth..wing
+1FABF         ; Emoji                # E15.0  [1] (🪿)       goose
+1FAC0..1FAC2  ; Emoji                # E13.0  [3] (🫀..🫂)    anatomical heart..people hugging
+1FAC3..1FAC5  ; Emoji                # E14.0  [3] (🫃..🫅)    pregnant man..person with crown
+1FACE..1FACF  ; Emoji                # E15.0  [2] (🫎..🫏)    moose..donkey
+1FAD0..1FAD6  ; Emoji                # E13.0  [7] (🫐..🫖)    blueberries..teapot
+1FAD7..1FAD9  ; Emoji                # E14.0  [3] (🫗..🫙)    pouring liquid..jar
+1FADA..1FADB  ; Emoji                # E15.0  [2] (🫚..🫛)    ginger root..pea pod
+1FAE0..1FAE7  ; Emoji                # E14.0  [8] (🫠..🫧)    melting face..bubbles
+1FAE8         ; Emoji                # E15.0  [1] (🫨)       shaking face
+1FAF0..1FAF6  ; Emoji                # E14.0  [7] (🫰..🫶)    hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8  ; Emoji                # E15.0  [2] (🫷..🫸)    leftwards pushing hand..rightwards pushing hand
+
+# Total elements: 1424
+
+# ================================================
+
+# All omitted code points have Emoji_Presentation=No
+
+231A..231B    ; Emoji_Presentation   # E0.6   [2] (⌚..⌛)    watch..hourglass done
+23E9..23EC    ; Emoji_Presentation   # E0.6   [4] (⏩..⏬)    fast-forward button..fast down button
+23F0          ; Emoji_Presentation   # E0.6   [1] (⏰)       alarm clock
+23F3          ; Emoji_Presentation   # E0.6   [1] (⏳)       hourglass not done
+25FD..25FE    ; Emoji_Presentation   # E0.6   [2] (◽..◾)    white medium-small square..black medium-small square
+2614..2615    ; Emoji_Presentation   # E0.6   [2] (☔..☕)    umbrella with rain drops..hot beverage
+2648..2653    ; Emoji_Presentation   # E0.6  [12] (♈..♓)    Aries..Pisces
+267F          ; Emoji_Presentation   # E0.6   [1] (♿)       wheelchair symbol
+2693          ; Emoji_Presentation   # E0.6   [1] (⚓)       anchor
+26A1          ; Emoji_Presentation   # E0.6   [1] (⚡)       high voltage
+26AA..26AB    ; Emoji_Presentation   # E0.6   [2] (⚪..⚫)    white circle..black circle
+26BD..26BE    ; Emoji_Presentation   # E0.6   [2] (⚽..⚾)    soccer ball..baseball
+26C4..26C5    ; Emoji_Presentation   # E0.6   [2] (⛄..⛅)    snowman without snow..sun behind cloud
+26CE          ; Emoji_Presentation   # E0.6   [1] (⛎)       Ophiuchus
+26D4          ; Emoji_Presentation   # E0.6   [1] (⛔)       no entry
+26EA          ; Emoji_Presentation   # E0.6   [1] (⛪)       church
+26F2..26F3    ; Emoji_Presentation   # E0.6   [2] (⛲..⛳)    fountain..flag in hole
+26F5          ; Emoji_Presentation   # E0.6   [1] (⛵)       sailboat
+26FA          ; Emoji_Presentation   # E0.6   [1] (⛺)       tent
+26FD          ; Emoji_Presentation   # E0.6   [1] (⛽)       fuel pump
+2705          ; Emoji_Presentation   # E0.6   [1] (✅)       check mark button
+270A..270B    ; Emoji_Presentation   # E0.6   [2] (✊..✋)    raised fist..raised hand
+2728          ; Emoji_Presentation   # E0.6   [1] (✨)       sparkles
+274C          ; Emoji_Presentation   # E0.6   [1] (❌)       cross mark
+274E          ; Emoji_Presentation   # E0.6   [1] (❎)       cross mark button
+2753..2755    ; Emoji_Presentation   # E0.6   [3] (❓..❕)    red question mark..white exclamation mark
+2757          ; Emoji_Presentation   # E0.6   [1] (❗)       red exclamation mark
+2795..2797    ; Emoji_Presentation   # E0.6   [3] (➕..➗)    plus..divide
+27B0          ; Emoji_Presentation   # E0.6   [1] (➰)       curly loop
+27BF          ; Emoji_Presentation   # E1.0   [1] (➿)       double curly loop
+2B1B..2B1C    ; Emoji_Presentation   # E0.6   [2] (⬛..⬜)    black large square..white large square
+2B50          ; Emoji_Presentation   # E0.6   [1] (⭐)       star
+2B55          ; Emoji_Presentation   # E0.6   [1] (⭕)       hollow red circle
+1F004         ; Emoji_Presentation   # E0.6   [1] (🀄)       mahjong red dragon
+1F0CF         ; Emoji_Presentation   # E0.6   [1] (🃏)       joker
+1F18E         ; Emoji_Presentation   # E0.6   [1] (🆎)       AB button (blood type)
+1F191..1F19A  ; Emoji_Presentation   # E0.6  [10] (🆑..🆚)    CL button..VS button
+1F1E6..1F1FF  ; Emoji_Presentation   # E0.0  [26] (🇦..🇿)    regional indicator symbol letter a..regional indicator symbol letter z
+1F201         ; Emoji_Presentation   # E0.6   [1] (🈁)       Japanese “here” button
+1F21A         ; Emoji_Presentation   # E0.6   [1] (🈚)       Japanese “free of charge” button
+1F22F         ; Emoji_Presentation   # E0.6   [1] (🈯)       Japanese “reserved” button
+1F232..1F236  ; Emoji_Presentation   # E0.6   [5] (🈲..🈶)    Japanese “prohibited” button..Japanese “not free of charge” button
+1F238..1F23A  ; Emoji_Presentation   # E0.6   [3] (🈸..🈺)    Japanese “application” button..Japanese “open for business” button
+1F250..1F251  ; Emoji_Presentation   # E0.6   [2] (🉐..🉑)    Japanese “bargain” button..Japanese “acceptable” button
+1F300..1F30C  ; Emoji_Presentation   # E0.6  [13] (🌀..🌌)    cyclone..milky way
+1F30D..1F30E  ; Emoji_Presentation   # E0.7   [2] (🌍..🌎)    globe showing Europe-Africa..globe showing Americas
+1F30F         ; Emoji_Presentation   # E0.6   [1] (🌏)       globe showing Asia-Australia
+1F310         ; Emoji_Presentation   # E1.0   [1] (🌐)       globe with meridians
+1F311         ; Emoji_Presentation   # E0.6   [1] (🌑)       new moon
+1F312         ; Emoji_Presentation   # E1.0   [1] (🌒)       waxing crescent moon
+1F313..1F315  ; Emoji_Presentation   # E0.6   [3] (🌓..🌕)    first quarter moon..full moon
+1F316..1F318  ; Emoji_Presentation   # E1.0   [3] (🌖..🌘)    waning gibbous moon..waning crescent moon
+1F319         ; Emoji_Presentation   # E0.6   [1] (🌙)       crescent moon
+1F31A         ; Emoji_Presentation   # E1.0   [1] (🌚)       new moon face
+1F31B         ; Emoji_Presentation   # E0.6   [1] (🌛)       first quarter moon face
+1F31C         ; Emoji_Presentation   # E0.7   [1] (🌜)       last quarter moon face
+1F31D..1F31E  ; Emoji_Presentation   # E1.0   [2] (🌝..🌞)    full moon face..sun with face
+1F31F..1F320  ; Emoji_Presentation   # E0.6   [2] (🌟..🌠)    glowing star..shooting star
+1F32D..1F32F  ; Emoji_Presentation   # E1.0   [3] (🌭..🌯)    hot dog..burrito
+1F330..1F331  ; Emoji_Presentation   # E0.6   [2] (🌰..🌱)    chestnut..seedling
+1F332..1F333  ; Emoji_Presentation   # E1.0   [2] (🌲..🌳)    evergreen tree..deciduous tree
+1F334..1F335  ; Emoji_Presentation   # E0.6   [2] (🌴..🌵)    palm tree..cactus
+1F337..1F34A  ; Emoji_Presentation   # E0.6  [20] (🌷..🍊)    tulip..tangerine
+1F34B         ; Emoji_Presentation   # E1.0   [1] (🍋)       lemon
+1F34C..1F34F  ; Emoji_Presentation   # E0.6   [4] (🍌..🍏)    banana..green apple
+1F350         ; Emoji_Presentation   # E1.0   [1] (🍐)       pear
+1F351..1F37B  ; Emoji_Presentation   # E0.6  [43] (🍑..🍻)    peach..clinking beer mugs
+1F37C         ; Emoji_Presentation   # E1.0   [1] (🍼)       baby bottle
+1F37E..1F37F  ; Emoji_Presentation   # E1.0   [2] (🍾..🍿)    bottle with popping cork..popcorn
+1F380..1F393  ; Emoji_Presentation   # E0.6  [20] (🎀..🎓)    ribbon..graduation cap
+1F3A0..1F3C4  ; Emoji_Presentation   # E0.6  [37] (🎠..🏄)    carousel horse..person surfing
+1F3C5         ; Emoji_Presentation   # E1.0   [1] (🏅)       sports medal
+1F3C6         ; Emoji_Presentation   # E0.6   [1] (🏆)       trophy
+1F3C7         ; Emoji_Presentation   # E1.0   [1] (🏇)       horse racing
+1F3C8         ; Emoji_Presentation   # E0.6   [1] (🏈)       american football
+1F3C9         ; Emoji_Presentation   # E1.0   [1] (🏉)       rugby football
+1F3CA         ; Emoji_Presentation   # E0.6   [1] (🏊)       person swimming
+1F3CF..1F3D3  ; Emoji_Presentation   # E1.0   [5] (🏏..🏓)    cricket game..ping pong
+1F3E0..1F3E3  ; Emoji_Presentation   # E0.6   [4] (🏠..🏣)    house..Japanese post office
+1F3E4         ; Emoji_Presentation   # E1.0   [1] (🏤)       post office
+1F3E5..1F3F0  ; Emoji_Presentation   # E0.6  [12] (🏥..🏰)    hospital..castle
+1F3F4         ; Emoji_Presentation   # E1.0   [1] (🏴)       black flag
+1F3F8..1F407  ; Emoji_Presentation   # E1.0  [16] (🏸..🐇)    badminton..rabbit
+1F408         ; Emoji_Presentation   # E0.7   [1] (🐈)       cat
+1F409..1F40B  ; Emoji_Presentation   # E1.0   [3] (🐉..🐋)    dragon..whale
+1F40C..1F40E  ; Emoji_Presentation   # E0.6   [3] (🐌..🐎)    snail..horse
+1F40F..1F410  ; Emoji_Presentation   # E1.0   [2] (🐏..🐐)    ram..goat
+1F411..1F412  ; Emoji_Presentation   # E0.6   [2] (🐑..🐒)    ewe..monkey
+1F413         ; Emoji_Presentation   # E1.0   [1] (🐓)       rooster
+1F414         ; Emoji_Presentation   # E0.6   [1] (🐔)       chicken
+1F415         ; Emoji_Presentation   # E0.7   [1] (🐕)       dog
+1F416         ; Emoji_Presentation   # E1.0   [1] (🐖)       pig
+1F417..1F429  ; Emoji_Presentation   # E0.6  [19] (🐗..🐩)    boar..poodle
+1F42A         ; Emoji_Presentation   # E1.0   [1] (🐪)       camel
+1F42B..1F43E  ; Emoji_Presentation   # E0.6  [20] (🐫..🐾)    two-hump camel..paw prints
+1F440         ; Emoji_Presentation   # E0.6   [1] (👀)       eyes
+1F442..1F464  ; Emoji_Presentation   # E0.6  [35] (👂..👤)    ear..bust in silhouette
+1F465         ; Emoji_Presentation   # E1.0   [1] (👥)       busts in silhouette
+1F466..1F46B  ; Emoji_Presentation   # E0.6   [6] (👦..👫)    boy..woman and man holding hands
+1F46C..1F46D  ; Emoji_Presentation   # E1.0   [2] (👬..👭)    men holding hands..women holding hands
+1F46E..1F4AC  ; Emoji_Presentation   # E0.6  [63] (👮..💬)    police officer..speech balloon
+1F4AD         ; Emoji_Presentation   # E1.0   [1] (💭)       thought balloon
+1F4AE..1F4B5  ; Emoji_Presentation   # E0.6   [8] (💮..💵)    white flower..dollar banknote
+1F4B6..1F4B7  ; Emoji_Presentation   # E1.0   [2] (💶..💷)    euro banknote..pound banknote
+1F4B8..1F4EB  ; Emoji_Presentation   # E0.6  [52] (💸..📫)    money with wings..closed mailbox with raised flag
+1F4EC..1F4ED  ; Emoji_Presentation   # E0.7   [2] (📬..📭)    open mailbox with raised flag..open mailbox with lowered flag
+1F4EE         ; Emoji_Presentation   # E0.6   [1] (📮)       postbox
+1F4EF         ; Emoji_Presentation   # E1.0   [1] (📯)       postal horn
+1F4F0..1F4F4  ; Emoji_Presentation   # E0.6   [5] (📰..📴)    newspaper..mobile phone off
+1F4F5         ; Emoji_Presentation   # E1.0   [1] (📵)       no mobile phones
+1F4F6..1F4F7  ; Emoji_Presentation   # E0.6   [2] (📶..📷)    antenna bars..camera
+1F4F8         ; Emoji_Presentation   # E1.0   [1] (📸)       camera with flash
+1F4F9..1F4FC  ; Emoji_Presentation   # E0.6   [4] (📹..📼)    video camera..videocassette
+1F4FF..1F502  ; Emoji_Presentation   # E1.0   [4] (📿..🔂)    prayer beads..repeat single button
+1F503         ; Emoji_Presentation   # E0.6   [1] (🔃)       clockwise vertical arrows
+1F504..1F507  ; Emoji_Presentation   # E1.0   [4] (🔄..🔇)    counterclockwise arrows button..muted speaker
+1F508         ; Emoji_Presentation   # E0.7   [1] (🔈)       speaker low volume
+1F509         ; Emoji_Presentation   # E1.0   [1] (🔉)       speaker medium volume
+1F50A..1F514  ; Emoji_Presentation   # E0.6  [11] (🔊..🔔)    speaker high volume..bell
+1F515         ; Emoji_Presentation   # E1.0   [1] (🔕)       bell with slash
+1F516..1F52B  ; Emoji_Presentation   # E0.6  [22] (🔖..🔫)    bookmark..water pistol
+1F52C..1F52D  ; Emoji_Presentation   # E1.0   [2] (🔬..🔭)    microscope..telescope
+1F52E..1F53D  ; Emoji_Presentation   # E0.6  [16] (🔮..🔽)    crystal ball..downwards button
+1F54B..1F54E  ; Emoji_Presentation   # E1.0   [4] (🕋..🕎)    kaaba..menorah
+1F550..1F55B  ; Emoji_Presentation   # E0.6  [12] (🕐..🕛)    one o’clock..twelve o’clock
+1F55C..1F567  ; Emoji_Presentation   # E0.7  [12] (🕜..🕧)    one-thirty..twelve-thirty
+1F57A         ; Emoji_Presentation   # E3.0   [1] (🕺)       man dancing
+1F595..1F596  ; Emoji_Presentation   # E1.0   [2] (🖕..🖖)    middle finger..vulcan salute
+1F5A4         ; Emoji_Presentation   # E3.0   [1] (🖤)       black heart
+1F5FB..1F5FF  ; Emoji_Presentation   # E0.6   [5] (🗻..🗿)    mount fuji..moai
+1F600         ; Emoji_Presentation   # E1.0   [1] (😀)       grinning face
+1F601..1F606  ; Emoji_Presentation   # E0.6   [6] (😁..😆)    beaming face with smiling eyes..grinning squinting face
+1F607..1F608  ; Emoji_Presentation   # E1.0   [2] (😇..😈)    smiling face with halo..smiling face with horns
+1F609..1F60D  ; Emoji_Presentation   # E0.6   [5] (😉..😍)    winking face..smiling face with heart-eyes
+1F60E         ; Emoji_Presentation   # E1.0   [1] (😎)       smiling face with sunglasses
+1F60F         ; Emoji_Presentation   # E0.6   [1] (😏)       smirking face
+1F610         ; Emoji_Presentation   # E0.7   [1] (😐)       neutral face
+1F611         ; Emoji_Presentation   # E1.0   [1] (😑)       expressionless face
+1F612..1F614  ; Emoji_Presentation   # E0.6   [3] (😒..😔)    unamused face..pensive face
+1F615         ; Emoji_Presentation   # E1.0   [1] (😕)       confused face
+1F616         ; Emoji_Presentation   # E0.6   [1] (😖)       confounded face
+1F617         ; Emoji_Presentation   # E1.0   [1] (😗)       kissing face
+1F618         ; Emoji_Presentation   # E0.6   [1] (😘)       face blowing a kiss
+1F619         ; Emoji_Presentation   # E1.0   [1] (😙)       kissing face with smiling eyes
+1F61A         ; Emoji_Presentation   # E0.6   [1] (😚)       kissing face with closed eyes
+1F61B         ; Emoji_Presentation   # E1.0   [1] (😛)       face with tongue
+1F61C..1F61E  ; Emoji_Presentation   # E0.6   [3] (😜..😞)    winking face with tongue..disappointed face
+1F61F         ; Emoji_Presentation   # E1.0   [1] (😟)       worried face
+1F620..1F625  ; Emoji_Presentation   # E0.6   [6] (😠..😥)    angry face..sad but relieved face
+1F626..1F627  ; Emoji_Presentation   # E1.0   [2] (😦..😧)    frowning face with open mouth..anguished face
+1F628..1F62B  ; Emoji_Presentation   # E0.6   [4] (😨..😫)    fearful face..tired face
+1F62C         ; Emoji_Presentation   # E1.0   [1] (😬)       grimacing face
+1F62D         ; Emoji_Presentation   # E0.6   [1] (😭)       loudly crying face
+1F62E..1F62F  ; Emoji_Presentation   # E1.0   [2] (😮..😯)    face with open mouth..hushed face
+1F630..1F633  ; Emoji_Presentation   # E0.6   [4] (😰..😳)    anxious face with sweat..flushed face
+1F634         ; Emoji_Presentation   # E1.0   [1] (😴)       sleeping face
+1F635         ; Emoji_Presentation   # E0.6   [1] (😵)       face with crossed-out eyes
+1F636         ; Emoji_Presentation   # E1.0   [1] (😶)       face without mouth
+1F637..1F640  ; Emoji_Presentation   # E0.6  [10] (😷..🙀)    face with medical mask..weary cat
+1F641..1F644  ; Emoji_Presentation   # E1.0   [4] (🙁..🙄)    slightly frowning face..face with rolling eyes
+1F645..1F64F  ; Emoji_Presentation   # E0.6  [11] (🙅..🙏)    person gesturing NO..folded hands
+1F680         ; Emoji_Presentation   # E0.6   [1] (🚀)       rocket
+1F681..1F682  ; Emoji_Presentation   # E1.0   [2] (🚁..🚂)    helicopter..locomotive
+1F683..1F685  ; Emoji_Presentation   # E0.6   [3] (🚃..🚅)    railway car..bullet train
+1F686         ; Emoji_Presentation   # E1.0   [1] (🚆)       train
+1F687         ; Emoji_Presentation   # E0.6   [1] (🚇)       metro
+1F688         ; Emoji_Presentation   # E1.0   [1] (🚈)       light rail
+1F689         ; Emoji_Presentation   # E0.6   [1] (🚉)       station
+1F68A..1F68B  ; Emoji_Presentation   # E1.0   [2] (🚊..🚋)    tram..tram car
+1F68C         ; Emoji_Presentation   # E0.6   [1] (🚌)       bus
+1F68D         ; Emoji_Presentation   # E0.7   [1] (🚍)       oncoming bus
+1F68E         ; Emoji_Presentation   # E1.0   [1] (🚎)       trolleybus
+1F68F         ; Emoji_Presentation   # E0.6   [1] (🚏)       bus stop
+1F690         ; Emoji_Presentation   # E1.0   [1] (🚐)       minibus
+1F691..1F693  ; Emoji_Presentation   # E0.6   [3] (🚑..🚓)    ambulance..police car
+1F694         ; Emoji_Presentation   # E0.7   [1] (🚔)       oncoming police car
+1F695         ; Emoji_Presentation   # E0.6   [1] (🚕)       taxi
+1F696         ; Emoji_Presentation   # E1.0   [1] (🚖)       oncoming taxi
+1F697         ; Emoji_Presentation   # E0.6   [1] (🚗)       automobile
+1F698         ; Emoji_Presentation   # E0.7   [1] (🚘)       oncoming automobile
+1F699..1F69A  ; Emoji_Presentation   # E0.6   [2] (🚙..🚚)    sport utility vehicle..delivery truck
+1F69B..1F6A1  ; Emoji_Presentation   # E1.0   [7] (🚛..🚡)    articulated lorry..aerial tramway
+1F6A2         ; Emoji_Presentation   # E0.6   [1] (🚢)       ship
+1F6A3         ; Emoji_Presentation   # E1.0   [1] (🚣)       person rowing boat
+1F6A4..1F6A5  ; Emoji_Presentation   # E0.6   [2] (🚤..🚥)    speedboat..horizontal traffic light
+1F6A6         ; Emoji_Presentation   # E1.0   [1] (🚦)       vertical traffic light
+1F6A7..1F6AD  ; Emoji_Presentation   # E0.6   [7] (🚧..🚭)    construction..no smoking
+1F6AE..1F6B1  ; Emoji_Presentation   # E1.0   [4] (🚮..🚱)    litter in bin sign..non-potable water
+1F6B2         ; Emoji_Presentation   # E0.6   [1] (🚲)       bicycle
+1F6B3..1F6B5  ; Emoji_Presentation   # E1.0   [3] (🚳..🚵)    no bicycles..person mountain biking
+1F6B6         ; Emoji_Presentation   # E0.6   [1] (🚶)       person walking
+1F6B7..1F6B8  ; Emoji_Presentation   # E1.0   [2] (🚷..🚸)    no pedestrians..children crossing
+1F6B9..1F6BE  ; Emoji_Presentation   # E0.6   [6] (🚹..🚾)    men’s room..water closet
+1F6BF         ; Emoji_Presentation   # E1.0   [1] (🚿)       shower
+1F6C0         ; Emoji_Presentation   # E0.6   [1] (🛀)       person taking bath
+1F6C1..1F6C5  ; Emoji_Presentation   # E1.0   [5] (🛁..🛅)    bathtub..left luggage
+1F6CC         ; Emoji_Presentation   # E1.0   [1] (🛌)       person in bed
+1F6D0         ; Emoji_Presentation   # E1.0   [1] (🛐)       place of worship
+1F6D1..1F6D2  ; Emoji_Presentation   # E3.0   [2] (🛑..🛒)    stop sign..shopping cart
+1F6D5         ; Emoji_Presentation   # E12.0  [1] (🛕)       hindu temple
+1F6D6..1F6D7  ; Emoji_Presentation   # E13.0  [2] (🛖..🛗)    hut..elevator
+1F6DC         ; Emoji_Presentation   # E15.0  [1] (🛜)       wireless
+1F6DD..1F6DF  ; Emoji_Presentation   # E14.0  [3] (🛝..🛟)    playground slide..ring buoy
+1F6EB..1F6EC  ; Emoji_Presentation   # E1.0   [2] (🛫..🛬)    airplane departure..airplane arrival
+1F6F4..1F6F6  ; Emoji_Presentation   # E3.0   [3] (🛴..🛶)    kick scooter..canoe
+1F6F7..1F6F8  ; Emoji_Presentation   # E5.0   [2] (🛷..🛸)    sled..flying saucer
+1F6F9         ; Emoji_Presentation   # E11.0  [1] (🛹)       skateboard
+1F6FA         ; Emoji_Presentation   # E12.0  [1] (🛺)       auto rickshaw
+1F6FB..1F6FC  ; Emoji_Presentation   # E13.0  [2] (🛻..🛼)    pickup truck..roller skate
+1F7E0..1F7EB  ; Emoji_Presentation   # E12.0 [12] (🟠..🟫)    orange circle..brown square
+1F7F0         ; Emoji_Presentation   # E14.0  [1] (🟰)       heavy equals sign
+1F90C         ; Emoji_Presentation   # E13.0  [1] (🤌)       pinched fingers
+1F90D..1F90F  ; Emoji_Presentation   # E12.0  [3] (🤍..🤏)    white heart..pinching hand
+1F910..1F918  ; Emoji_Presentation   # E1.0   [9] (🤐..🤘)    zipper-mouth face..sign of the horns
+1F919..1F91E  ; Emoji_Presentation   # E3.0   [6] (🤙..🤞)    call me hand..crossed fingers
+1F91F         ; Emoji_Presentation   # E5.0   [1] (🤟)       love-you gesture
+1F920..1F927  ; Emoji_Presentation   # E3.0   [8] (🤠..🤧)    cowboy hat face..sneezing face
+1F928..1F92F  ; Emoji_Presentation   # E5.0   [8] (🤨..🤯)    face with raised eyebrow..exploding head
+1F930         ; Emoji_Presentation   # E3.0   [1] (🤰)       pregnant woman
+1F931..1F932  ; Emoji_Presentation   # E5.0   [2] (🤱..🤲)    breast-feeding..palms up together
+1F933..1F93A  ; Emoji_Presentation   # E3.0   [8] (🤳..🤺)    selfie..person fencing
+1F93C..1F93E  ; Emoji_Presentation   # E3.0   [3] (🤼..🤾)    people wrestling..person playing handball
+1F93F         ; Emoji_Presentation   # E12.0  [1] (🤿)       diving mask
+1F940..1F945  ; Emoji_Presentation   # E3.0   [6] (🥀..🥅)    wilted flower..goal net
+1F947..1F94B  ; Emoji_Presentation   # E3.0   [5] (🥇..🥋)    1st place medal..martial arts uniform
+1F94C         ; Emoji_Presentation   # E5.0   [1] (🥌)       curling stone
+1F94D..1F94F  ; Emoji_Presentation   # E11.0  [3] (🥍..🥏)    lacrosse..flying disc
+1F950..1F95E  ; Emoji_Presentation   # E3.0  [15] (🥐..🥞)    croissant..pancakes
+1F95F..1F96B  ; Emoji_Presentation   # E5.0  [13] (🥟..🥫)    dumpling..canned food
+1F96C..1F970  ; Emoji_Presentation   # E11.0  [5] (🥬..🥰)    leafy green..smiling face with hearts
+1F971         ; Emoji_Presentation   # E12.0  [1] (🥱)       yawning face
+1F972         ; Emoji_Presentation   # E13.0  [1] (🥲)       smiling face with tear
+1F973..1F976  ; Emoji_Presentation   # E11.0  [4] (🥳..🥶)    partying face..cold face
+1F977..1F978  ; Emoji_Presentation   # E13.0  [2] (🥷..🥸)    ninja..disguised face
+1F979         ; Emoji_Presentation   # E14.0  [1] (🥹)       face holding back tears
+1F97A         ; Emoji_Presentation   # E11.0  [1] (🥺)       pleading face
+1F97B         ; Emoji_Presentation   # E12.0  [1] (🥻)       sari
+1F97C..1F97F  ; Emoji_Presentation   # E11.0  [4] (🥼..🥿)    lab coat..flat shoe
+1F980..1F984  ; Emoji_Presentation   # E1.0   [5] (🦀..🦄)    crab..unicorn
+1F985..1F991  ; Emoji_Presentation   # E3.0  [13] (🦅..🦑)    eagle..squid
+1F992..1F997  ; Emoji_Presentation   # E5.0   [6] (🦒..🦗)    giraffe..cricket
+1F998..1F9A2  ; Emoji_Presentation   # E11.0 [11] (🦘..🦢)    kangaroo..swan
+1F9A3..1F9A4  ; Emoji_Presentation   # E13.0  [2] (🦣..🦤)    mammoth..dodo
+1F9A5..1F9AA  ; Emoji_Presentation   # E12.0  [6] (🦥..🦪)    sloth..oyster
+1F9AB..1F9AD  ; Emoji_Presentation   # E13.0  [3] (🦫..🦭)    beaver..seal
+1F9AE..1F9AF  ; Emoji_Presentation   # E12.0  [2] (🦮..🦯)    guide dog..white cane
+1F9B0..1F9B9  ; Emoji_Presentation   # E11.0 [10] (🦰..🦹)    red hair..supervillain
+1F9BA..1F9BF  ; Emoji_Presentation   # E12.0  [6] (🦺..🦿)    safety vest..mechanical leg
+1F9C0         ; Emoji_Presentation   # E1.0   [1] (🧀)       cheese wedge
+1F9C1..1F9C2  ; Emoji_Presentation   # E11.0  [2] (🧁..🧂)    cupcake..salt
+1F9C3..1F9CA  ; Emoji_Presentation   # E12.0  [8] (🧃..🧊)    beverage box..ice
+1F9CB         ; Emoji_Presentation   # E13.0  [1] (🧋)       bubble tea
+1F9CC         ; Emoji_Presentation   # E14.0  [1] (🧌)       troll
+1F9CD..1F9CF  ; Emoji_Presentation   # E12.0  [3] (🧍..🧏)    person standing..deaf person
+1F9D0..1F9E6  ; Emoji_Presentation   # E5.0  [23] (🧐..🧦)    face with monocle..socks
+1F9E7..1F9FF  ; Emoji_Presentation   # E11.0 [25] (🧧..🧿)    red envelope..nazar amulet
+1FA70..1FA73  ; Emoji_Presentation   # E12.0  [4] (🩰..🩳)    ballet shoes..shorts
+1FA74         ; Emoji_Presentation   # E13.0  [1] (🩴)       thong sandal
+1FA75..1FA77  ; Emoji_Presentation   # E15.0  [3] (🩵..🩷)    light blue heart..pink heart
+1FA78..1FA7A  ; Emoji_Presentation   # E12.0  [3] (🩸..🩺)    drop of blood..stethoscope
+1FA7B..1FA7C  ; Emoji_Presentation   # E14.0  [2] (🩻..🩼)    x-ray..crutch
+1FA80..1FA82  ; Emoji_Presentation   # E12.0  [3] (🪀..🪂)    yo-yo..parachute
+1FA83..1FA86  ; Emoji_Presentation   # E13.0  [4] (🪃..🪆)    boomerang..nesting dolls
+1FA87..1FA88  ; Emoji_Presentation   # E15.0  [2] (🪇..🪈)    maracas..flute
+1FA90..1FA95  ; Emoji_Presentation   # E12.0  [6] (🪐..🪕)    ringed planet..banjo
+1FA96..1FAA8  ; Emoji_Presentation   # E13.0 [19] (🪖..🪨)    military helmet..rock
+1FAA9..1FAAC  ; Emoji_Presentation   # E14.0  [4] (🪩..🪬)    mirror ball..hamsa
+1FAAD..1FAAF  ; Emoji_Presentation   # E15.0  [3] (🪭..🪯)    folding hand fan..khanda
+1FAB0..1FAB6  ; Emoji_Presentation   # E13.0  [7] (🪰..🪶)    fly..feather
+1FAB7..1FABA  ; Emoji_Presentation   # E14.0  [4] (🪷..🪺)    lotus..nest with eggs
+1FABB..1FABD  ; Emoji_Presentation   # E15.0  [3] (🪻..🪽)    hyacinth..wing
+1FABF         ; Emoji_Presentation   # E15.0  [1] (🪿)       goose
+1FAC0..1FAC2  ; Emoji_Presentation   # E13.0  [3] (🫀..🫂)    anatomical heart..people hugging
+1FAC3..1FAC5  ; Emoji_Presentation   # E14.0  [3] (🫃..🫅)    pregnant man..person with crown
+1FACE..1FACF  ; Emoji_Presentation   # E15.0  [2] (🫎..🫏)    moose..donkey
+1FAD0..1FAD6  ; Emoji_Presentation   # E13.0  [7] (🫐..🫖)    blueberries..teapot
+1FAD7..1FAD9  ; Emoji_Presentation   # E14.0  [3] (🫗..🫙)    pouring liquid..jar
+1FADA..1FADB  ; Emoji_Presentation   # E15.0  [2] (🫚..🫛)    ginger root..pea pod
+1FAE0..1FAE7  ; Emoji_Presentation   # E14.0  [8] (🫠..🫧)    melting face..bubbles
+1FAE8         ; Emoji_Presentation   # E15.0  [1] (🫨)       shaking face
+1FAF0..1FAF6  ; Emoji_Presentation   # E14.0  [7] (🫰..🫶)    hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8  ; Emoji_Presentation   # E15.0  [2] (🫷..🫸)    leftwards pushing hand..rightwards pushing hand
+
+# Total elements: 1205
+
+# ================================================
+
+# All omitted code points have Emoji_Modifier=No
+
+1F3FB..1F3FF  ; Emoji_Modifier       # E1.0   [5] (🏻..🏿)    light skin tone..dark skin tone
+
+# Total elements: 5
+
+# ================================================
+
+# All omitted code points have Emoji_Modifier_Base=No
+
+261D          ; Emoji_Modifier_Base  # E0.6   [1] (☝️)       index pointing up
+26F9          ; Emoji_Modifier_Base  # E0.7   [1] (⛹️)       person bouncing ball
+270A..270C    ; Emoji_Modifier_Base  # E0.6   [3] (✊..✌️)    raised fist..victory hand
+270D          ; Emoji_Modifier_Base  # E0.7   [1] (✍️)       writing hand
+1F385         ; Emoji_Modifier_Base  # E0.6   [1] (🎅)       Santa Claus
+1F3C2..1F3C4  ; Emoji_Modifier_Base  # E0.6   [3] (🏂..🏄)    snowboarder..person surfing
+1F3C7         ; Emoji_Modifier_Base  # E1.0   [1] (🏇)       horse racing
+1F3CA         ; Emoji_Modifier_Base  # E0.6   [1] (🏊)       person swimming
+1F3CB..1F3CC  ; Emoji_Modifier_Base  # E0.7   [2] (🏋️..🏌️)    person lifting weights..person golfing
+1F442..1F443  ; Emoji_Modifier_Base  # E0.6   [2] (👂..👃)    ear..nose
+1F446..1F450  ; Emoji_Modifier_Base  # E0.6  [11] (👆..👐)    backhand index pointing up..open hands
+1F466..1F46B  ; Emoji_Modifier_Base  # E0.6   [6] (👦..👫)    boy..woman and man holding hands
+1F46C..1F46D  ; Emoji_Modifier_Base  # E1.0   [2] (👬..👭)    men holding hands..women holding hands
+1F46E..1F478  ; Emoji_Modifier_Base  # E0.6  [11] (👮..👸)    police officer..princess
+1F47C         ; Emoji_Modifier_Base  # E0.6   [1] (👼)       baby angel
+1F481..1F483  ; Emoji_Modifier_Base  # E0.6   [3] (💁..💃)    person tipping hand..woman dancing
+1F485..1F487  ; Emoji_Modifier_Base  # E0.6   [3] (💅..💇)    nail polish..person getting haircut
+1F48F         ; Emoji_Modifier_Base  # E0.6   [1] (💏)       kiss
+1F491         ; Emoji_Modifier_Base  # E0.6   [1] (💑)       couple with heart
+1F4AA         ; Emoji_Modifier_Base  # E0.6   [1] (💪)       flexed biceps
+1F574..1F575  ; Emoji_Modifier_Base  # E0.7   [2] (🕴️..🕵️)    person in suit levitating..detective
+1F57A         ; Emoji_Modifier_Base  # E3.0   [1] (🕺)       man dancing
+1F590         ; Emoji_Modifier_Base  # E0.7   [1] (🖐️)       hand with fingers splayed
+1F595..1F596  ; Emoji_Modifier_Base  # E1.0   [2] (🖕..🖖)    middle finger..vulcan salute
+1F645..1F647  ; Emoji_Modifier_Base  # E0.6   [3] (🙅..🙇)    person gesturing NO..person bowing
+1F64B..1F64F  ; Emoji_Modifier_Base  # E0.6   [5] (🙋..🙏)    person raising hand..folded hands
+1F6A3         ; Emoji_Modifier_Base  # E1.0   [1] (🚣)       person rowing boat
+1F6B4..1F6B5  ; Emoji_Modifier_Base  # E1.0   [2] (🚴..🚵)    person biking..person mountain biking
+1F6B6         ; Emoji_Modifier_Base  # E0.6   [1] (🚶)       person walking
+1F6C0         ; Emoji_Modifier_Base  # E0.6   [1] (🛀)       person taking bath
+1F6CC         ; Emoji_Modifier_Base  # E1.0   [1] (🛌)       person in bed
+1F90C         ; Emoji_Modifier_Base  # E13.0  [1] (🤌)       pinched fingers
+1F90F         ; Emoji_Modifier_Base  # E12.0  [1] (🤏)       pinching hand
+1F918         ; Emoji_Modifier_Base  # E1.0   [1] (🤘)       sign of the horns
+1F919..1F91E  ; Emoji_Modifier_Base  # E3.0   [6] (🤙..🤞)    call me hand..crossed fingers
+1F91F         ; Emoji_Modifier_Base  # E5.0   [1] (🤟)       love-you gesture
+1F926         ; Emoji_Modifier_Base  # E3.0   [1] (🤦)       person facepalming
+1F930         ; Emoji_Modifier_Base  # E3.0   [1] (🤰)       pregnant woman
+1F931..1F932  ; Emoji_Modifier_Base  # E5.0   [2] (🤱..🤲)    breast-feeding..palms up together
+1F933..1F939  ; Emoji_Modifier_Base  # E3.0   [7] (🤳..🤹)    selfie..person juggling
+1F93C..1F93E  ; Emoji_Modifier_Base  # E3.0   [3] (🤼..🤾)    people wrestling..person playing handball
+1F977         ; Emoji_Modifier_Base  # E13.0  [1] (🥷)       ninja
+1F9B5..1F9B6  ; Emoji_Modifier_Base  # E11.0  [2] (🦵..🦶)    leg..foot
+1F9B8..1F9B9  ; Emoji_Modifier_Base  # E11.0  [2] (🦸..🦹)    superhero..supervillain
+1F9BB         ; Emoji_Modifier_Base  # E12.0  [1] (🦻)       ear with hearing aid
+1F9CD..1F9CF  ; Emoji_Modifier_Base  # E12.0  [3] (🧍..🧏)    person standing..deaf person
+1F9D1..1F9DD  ; Emoji_Modifier_Base  # E5.0  [13] (🧑..🧝)    person..elf
+1FAC3..1FAC5  ; Emoji_Modifier_Base  # E14.0  [3] (🫃..🫅)    pregnant man..person with crown
+1FAF0..1FAF6  ; Emoji_Modifier_Base  # E14.0  [7] (🫰..🫶)    hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8  ; Emoji_Modifier_Base  # E15.0  [2] (🫷..🫸)    leftwards pushing hand..rightwards pushing hand
+
+# Total elements: 134
+
+# ================================================
+
+# All omitted code points have Emoji_Component=No
+
+0023          ; Emoji_Component      # E0.0   [1] (#️)       hash sign
+002A          ; Emoji_Component      # E0.0   [1] (*️)       asterisk
+0030..0039    ; Emoji_Component      # E0.0  [10] (0️..9️)    digit zero..digit nine
+200D          ; Emoji_Component      # E0.0   [1] (‍)        zero width joiner
+20E3          ; Emoji_Component      # E0.0   [1] (⃣)       combining enclosing keycap
+FE0F          ; Emoji_Component      # E0.0   [1] ()        VARIATION SELECTOR-16
+1F1E6..1F1FF  ; Emoji_Component      # E0.0  [26] (🇦..🇿)    regional indicator symbol letter a..regional indicator symbol letter z
+1F3FB..1F3FF  ; Emoji_Component      # E1.0   [5] (🏻..🏿)    light skin tone..dark skin tone
+1F9B0..1F9B3  ; Emoji_Component      # E11.0  [4] (🦰..🦳)    red hair..white hair
+E0020..E007F  ; Emoji_Component      # E0.0  [96] (󠀠..󠁿)      tag space..cancel tag
+
+# Total elements: 146
+
+# ================================================
+
+# All omitted code points have Extended_Pictographic=No
+
+00A9          ; Extended_Pictographic# E0.6   [1] (©️)       copyright
+00AE          ; Extended_Pictographic# E0.6   [1] (®️)       registered
+203C          ; Extended_Pictographic# E0.6   [1] (‼️)       double exclamation mark
+2049          ; Extended_Pictographic# E0.6   [1] (⁉️)       exclamation question mark
+2122          ; Extended_Pictographic# E0.6   [1] (™️)       trade mark
+2139          ; Extended_Pictographic# E0.6   [1] (ℹ️)       information
+2194..2199    ; Extended_Pictographic# E0.6   [6] (↔️..↙️)    left-right arrow..down-left arrow
+21A9..21AA    ; Extended_Pictographic# E0.6   [2] (↩️..↪️)    right arrow curving left..left arrow curving right
+231A..231B    ; Extended_Pictographic# E0.6   [2] (⌚..⌛)    watch..hourglass done
+2328          ; Extended_Pictographic# E1.0   [1] (⌨️)       keyboard
+2388          ; Extended_Pictographic# E0.0   [1] (⎈)       HELM SYMBOL
+23CF          ; Extended_Pictographic# E1.0   [1] (⏏️)       eject button
+23E9..23EC    ; Extended_Pictographic# E0.6   [4] (⏩..⏬)    fast-forward button..fast down button
+23ED..23EE    ; Extended_Pictographic# E0.7   [2] (⏭️..⏮️)    next track button..last track button
+23EF          ; Extended_Pictographic# E1.0   [1] (⏯️)       play or pause button
+23F0          ; Extended_Pictographic# E0.6   [1] (⏰)       alarm clock
+23F1..23F2    ; Extended_Pictographic# E1.0   [2] (⏱️..⏲️)    stopwatch..timer clock
+23F3          ; Extended_Pictographic# E0.6   [1] (⏳)       hourglass not done
+23F8..23FA    ; Extended_Pictographic# E0.7   [3] (⏸️..⏺️)    pause button..record button
+24C2          ; Extended_Pictographic# E0.6   [1] (Ⓜ️)       circled M
+25AA..25AB    ; Extended_Pictographic# E0.6   [2] (▪️..▫️)    black small square..white small square
+25B6          ; Extended_Pictographic# E0.6   [1] (▶️)       play button
+25C0          ; Extended_Pictographic# E0.6   [1] (◀️)       reverse button
+25FB..25FE    ; Extended_Pictographic# E0.6   [4] (◻️..◾)    white medium square..black medium-small square
+2600..2601    ; Extended_Pictographic# E0.6   [2] (☀️..☁️)    sun..cloud
+2602..2603    ; Extended_Pictographic# E0.7   [2] (☂️..☃️)    umbrella..snowman
+2604          ; Extended_Pictographic# E1.0   [1] (☄️)       comet
+2605          ; Extended_Pictographic# E0.0   [1] (★)       BLACK STAR
+2607..260D    ; Extended_Pictographic# E0.0   [7] (☇..☍)    LIGHTNING..OPPOSITION
+260E          ; Extended_Pictographic# E0.6   [1] (☎️)       telephone
+260F..2610    ; Extended_Pictographic# E0.0   [2] (☏..☐)    WHITE TELEPHONE..BALLOT BOX
+2611          ; Extended_Pictographic# E0.6   [1] (☑️)       check box with check
+2612          ; Extended_Pictographic# E0.0   [1] (☒)       BALLOT BOX WITH X
+2614..2615    ; Extended_Pictographic# E0.6   [2] (☔..☕)    umbrella with rain drops..hot beverage
+2616..2617    ; Extended_Pictographic# E0.0   [2] (☖..☗)    WHITE SHOGI PIECE..BLACK SHOGI PIECE
+2618          ; Extended_Pictographic# E1.0   [1] (☘️)       shamrock
+2619..261C    ; Extended_Pictographic# E0.0   [4] (☙..☜)    REVERSED ROTATED FLORAL HEART BULLET..WHITE LEFT POINTING INDEX
+261D          ; Extended_Pictographic# E0.6   [1] (☝️)       index pointing up
+261E..261F    ; Extended_Pictographic# E0.0   [2] (☞..☟)    WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX
+2620          ; Extended_Pictographic# E1.0   [1] (☠️)       skull and crossbones
+2621          ; Extended_Pictographic# E0.0   [1] (☡)       CAUTION SIGN
+2622..2623    ; Extended_Pictographic# E1.0   [2] (☢️..☣️)    radioactive..biohazard
+2624..2625    ; Extended_Pictographic# E0.0   [2] (☤..☥)    CADUCEUS..ANKH
+2626          ; Extended_Pictographic# E1.0   [1] (☦️)       orthodox cross
+2627..2629    ; Extended_Pictographic# E0.0   [3] (☧..☩)    CHI RHO..CROSS OF JERUSALEM
+262A          ; Extended_Pictographic# E0.7   [1] (☪️)       star and crescent
+262B..262D    ; Extended_Pictographic# E0.0   [3] (☫..☭)    FARSI SYMBOL..HAMMER AND SICKLE
+262E          ; Extended_Pictographic# E1.0   [1] (☮️)       peace symbol
+262F          ; Extended_Pictographic# E0.7   [1] (☯️)       yin yang
+2630..2637    ; Extended_Pictographic# E0.0   [8] (☰..☷)    TRIGRAM FOR HEAVEN..TRIGRAM FOR EARTH
+2638..2639    ; Extended_Pictographic# E0.7   [2] (☸️..☹️)    wheel of dharma..frowning face
+263A          ; Extended_Pictographic# E0.6   [1] (☺️)       smiling face
+263B..263F    ; Extended_Pictographic# E0.0   [5] (☻..☿)    BLACK SMILING FACE..MERCURY
+2640          ; Extended_Pictographic# E4.0   [1] (♀️)       female sign
+2641          ; Extended_Pictographic# E0.0   [1] (♁)       EARTH
+2642          ; Extended_Pictographic# E4.0   [1] (♂️)       male sign
+2643..2647    ; Extended_Pictographic# E0.0   [5] (♃..♇)    JUPITER..PLUTO
+2648..2653    ; Extended_Pictographic# E0.6  [12] (♈..♓)    Aries..Pisces
+2654..265E    ; Extended_Pictographic# E0.0  [11] (♔..♞)    WHITE CHESS KING..BLACK CHESS KNIGHT
+265F          ; Extended_Pictographic# E11.0  [1] (♟️)       chess pawn
+2660          ; Extended_Pictographic# E0.6   [1] (♠️)       spade suit
+2661..2662    ; Extended_Pictographic# E0.0   [2] (♡..♢)    WHITE HEART SUIT..WHITE DIAMOND SUIT
+2663          ; Extended_Pictographic# E0.6   [1] (♣️)       club suit
+2664          ; Extended_Pictographic# E0.0   [1] (♤)       WHITE SPADE SUIT
+2665..2666    ; Extended_Pictographic# E0.6   [2] (♥️..♦️)    heart suit..diamond suit
+2667          ; Extended_Pictographic# E0.0   [1] (♧)       WHITE CLUB SUIT
+2668          ; Extended_Pictographic# E0.6   [1] (♨️)       hot springs
+2669..267A    ; Extended_Pictographic# E0.0  [18] (♩..♺)    QUARTER NOTE..RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B          ; Extended_Pictographic# E0.6   [1] (♻️)       recycling symbol
+267C..267D    ; Extended_Pictographic# E0.0   [2] (♼..♽)    RECYCLED PAPER SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL
+267E          ; Extended_Pictographic# E11.0  [1] (♾️)       infinity
+267F          ; Extended_Pictographic# E0.6   [1] (♿)       wheelchair symbol
+2680..2685    ; Extended_Pictographic# E0.0   [6] (⚀..⚅)    DIE FACE-1..DIE FACE-6
+2690..2691    ; Extended_Pictographic# E0.0   [2] (⚐..⚑)    WHITE FLAG..BLACK FLAG
+2692          ; Extended_Pictographic# E1.0   [1] (⚒️)       hammer and pick
+2693          ; Extended_Pictographic# E0.6   [1] (⚓)       anchor
+2694          ; Extended_Pictographic# E1.0   [1] (⚔️)       crossed swords
+2695          ; Extended_Pictographic# E4.0   [1] (⚕️)       medical symbol
+2696..2697    ; Extended_Pictographic# E1.0   [2] (⚖️..⚗️)    balance scale..alembic
+2698          ; Extended_Pictographic# E0.0   [1] (⚘)       FLOWER
+2699          ; Extended_Pictographic# E1.0   [1] (⚙️)       gear
+269A          ; Extended_Pictographic# E0.0   [1] (⚚)       STAFF OF HERMES
+269B..269C    ; Extended_Pictographic# E1.0   [2] (⚛️..⚜️)    atom symbol..fleur-de-lis
+269D..269F    ; Extended_Pictographic# E0.0   [3] (⚝..⚟)    OUTLINED WHITE STAR..THREE LINES CONVERGING LEFT
+26A0..26A1    ; Extended_Pictographic# E0.6   [2] (⚠️..⚡)    warning..high voltage
+26A2..26A6    ; Extended_Pictographic# E0.0   [5] (⚢..⚦)    DOUBLED FEMALE SIGN..MALE WITH STROKE SIGN
+26A7          ; Extended_Pictographic# E13.0  [1] (⚧️)       transgender symbol
+26A8..26A9    ; Extended_Pictographic# E0.0   [2] (⚨..⚩)    VERTICAL MALE WITH STROKE SIGN..HORIZONTAL MALE WITH STROKE SIGN
+26AA..26AB    ; Extended_Pictographic# E0.6   [2] (⚪..⚫)    white circle..black circle
+26AC..26AF    ; Extended_Pictographic# E0.0   [4] (⚬..⚯)    MEDIUM SMALL WHITE CIRCLE..UNMARRIED PARTNERSHIP SYMBOL
+26B0..26B1    ; Extended_Pictographic# E1.0   [2] (⚰️..⚱️)    coffin..funeral urn
+26B2..26BC    ; Extended_Pictographic# E0.0  [11] (⚲..⚼)    NEUTER..SESQUIQUADRATE
+26BD..26BE    ; Extended_Pictographic# E0.6   [2] (⚽..⚾)    soccer ball..baseball
+26BF..26C3    ; Extended_Pictographic# E0.0   [5] (⚿..⛃)    SQUARED KEY..BLACK DRAUGHTS KING
+26C4..26C5    ; Extended_Pictographic# E0.6   [2] (⛄..⛅)    snowman without snow..sun behind cloud
+26C6..26C7    ; Extended_Pictographic# E0.0   [2] (⛆..⛇)    RAIN..BLACK SNOWMAN
+26C8          ; Extended_Pictographic# E0.7   [1] (⛈️)       cloud with lightning and rain
+26C9..26CD    ; Extended_Pictographic# E0.0   [5] (⛉..⛍)    TURNED WHITE SHOGI PIECE..DISABLED CAR
+26CE          ; Extended_Pictographic# E0.6   [1] (⛎)       Ophiuchus
+26CF          ; Extended_Pictographic# E0.7   [1] (⛏️)       pick
+26D0          ; Extended_Pictographic# E0.0   [1] (⛐)       CAR SLIDING
+26D1          ; Extended_Pictographic# E0.7   [1] (⛑️)       rescue worker’s helmet
+26D2          ; Extended_Pictographic# E0.0   [1] (⛒)       CIRCLED CROSSING LANES
+26D3          ; Extended_Pictographic# E0.7   [1] (⛓️)       chains
+26D4          ; Extended_Pictographic# E0.6   [1] (⛔)       no entry
+26D5..26E8    ; Extended_Pictographic# E0.0  [20] (⛕..⛨)    ALTERNATE ONE-WAY LEFT WAY TRAFFIC..BLACK CROSS ON SHIELD
+26E9          ; Extended_Pictographic# E0.7   [1] (⛩️)       shinto shrine
+26EA          ; Extended_Pictographic# E0.6   [1] (⛪)       church
+26EB..26EF    ; Extended_Pictographic# E0.0   [5] (⛫..⛯)    CASTLE..MAP SYMBOL FOR LIGHTHOUSE
+26F0..26F1    ; Extended_Pictographic# E0.7   [2] (⛰️..⛱️)    mountain..umbrella on ground
+26F2..26F3    ; Extended_Pictographic# E0.6   [2] (⛲..⛳)    fountain..flag in hole
+26F4          ; Extended_Pictographic# E0.7   [1] (⛴️)       ferry
+26F5          ; Extended_Pictographic# E0.6   [1] (⛵)       sailboat
+26F6          ; Extended_Pictographic# E0.0   [1] (⛶)       SQUARE FOUR CORNERS
+26F7..26F9    ; Extended_Pictographic# E0.7   [3] (⛷️..⛹️)    skier..person bouncing ball
+26FA          ; Extended_Pictographic# E0.6   [1] (⛺)       tent
+26FB..26FC    ; Extended_Pictographic# E0.0   [2] (⛻..⛼)    JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL
+26FD          ; Extended_Pictographic# E0.6   [1] (⛽)       fuel pump
+26FE..2701    ; Extended_Pictographic# E0.0   [4] (⛾..✁)    CUP ON BLACK SQUARE..UPPER BLADE SCISSORS
+2702          ; Extended_Pictographic# E0.6   [1] (✂️)       scissors
+2703..2704    ; Extended_Pictographic# E0.0   [2] (✃..✄)    LOWER BLADE SCISSORS..WHITE SCISSORS
+2705          ; Extended_Pictographic# E0.6   [1] (✅)       check mark button
+2708..270C    ; Extended_Pictographic# E0.6   [5] (✈️..✌️)    airplane..victory hand
+270D          ; Extended_Pictographic# E0.7   [1] (✍️)       writing hand
+270E          ; Extended_Pictographic# E0.0   [1] (✎)       LOWER RIGHT PENCIL
+270F          ; Extended_Pictographic# E0.6   [1] (✏️)       pencil
+2710..2711    ; Extended_Pictographic# E0.0   [2] (✐..✑)    UPPER RIGHT PENCIL..WHITE NIB
+2712          ; Extended_Pictographic# E0.6   [1] (✒️)       black nib
+2714          ; Extended_Pictographic# E0.6   [1] (✔️)       check mark
+2716          ; Extended_Pictographic# E0.6   [1] (✖️)       multiply
+271D          ; Extended_Pictographic# E0.7   [1] (✝️)       latin cross
+2721          ; Extended_Pictographic# E0.7   [1] (✡️)       star of David
+2728          ; Extended_Pictographic# E0.6   [1] (✨)       sparkles
+2733..2734    ; Extended_Pictographic# E0.6   [2] (✳️..✴️)    eight-spoked asterisk..eight-pointed star
+2744          ; Extended_Pictographic# E0.6   [1] (❄️)       snowflake
+2747          ; Extended_Pictographic# E0.6   [1] (❇️)       sparkle
+274C          ; Extended_Pictographic# E0.6   [1] (❌)       cross mark
+274E          ; Extended_Pictographic# E0.6   [1] (❎)       cross mark button
+2753..2755    ; Extended_Pictographic# E0.6   [3] (❓..❕)    red question mark..white exclamation mark
+2757          ; Extended_Pictographic# E0.6   [1] (❗)       red exclamation mark
+2763          ; Extended_Pictographic# E1.0   [1] (❣️)       heart exclamation
+2764          ; Extended_Pictographic# E0.6   [1] (❤️)       red heart
+2765..2767    ; Extended_Pictographic# E0.0   [3] (❥..❧)    ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET
+2795..2797    ; Extended_Pictographic# E0.6   [3] (➕..➗)    plus..divide
+27A1          ; Extended_Pictographic# E0.6   [1] (➡️)       right arrow
+27B0          ; Extended_Pictographic# E0.6   [1] (➰)       curly loop
+27BF          ; Extended_Pictographic# E1.0   [1] (➿)       double curly loop
+2934..2935    ; Extended_Pictographic# E0.6   [2] (⤴️..⤵️)    right arrow curving up..right arrow curving down
+2B05..2B07    ; Extended_Pictographic# E0.6   [3] (⬅️..⬇️)    left arrow..down arrow
+2B1B..2B1C    ; Extended_Pictographic# E0.6   [2] (⬛..⬜)    black large square..white large square
+2B50          ; Extended_Pictographic# E0.6   [1] (⭐)       star
+2B55          ; Extended_Pictographic# E0.6   [1] (⭕)       hollow red circle
+3030          ; Extended_Pictographic# E0.6   [1] (〰️)       wavy dash
+303D          ; Extended_Pictographic# E0.6   [1] (〽️)       part alternation mark
+3297          ; Extended_Pictographic# E0.6   [1] (㊗️)       Japanese “congratulations” button
+3299          ; Extended_Pictographic# E0.6   [1] (㊙️)       Japanese “secret” button
+1F000..1F003  ; Extended_Pictographic# E0.0   [4] (🀀..🀃)    MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND
+1F004         ; Extended_Pictographic# E0.6   [1] (🀄)       mahjong red dragon
+1F005..1F0CE  ; Extended_Pictographic# E0.0 [202] (🀅..🃎)    MAHJONG TILE GREEN DRAGON..PLAYING CARD KING OF DIAMONDS
+1F0CF         ; Extended_Pictographic# E0.6   [1] (🃏)       joker
+1F0D0..1F0FF  ; Extended_Pictographic# E0.0  [48] (🃐..🃿)    <reserved-1F0D0>..<reserved-1F0FF>
+1F10D..1F10F  ; Extended_Pictographic# E0.0   [3] (🄍..🄏)    CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH
+1F12F         ; Extended_Pictographic# E0.0   [1] (🄯)       COPYLEFT SYMBOL
+1F16C..1F16F  ; Extended_Pictographic# E0.0   [4] (🅬..🅯)    RAISED MR SIGN..CIRCLED HUMAN FIGURE
+1F170..1F171  ; Extended_Pictographic# E0.6   [2] (🅰️..🅱️)    A button (blood type)..B button (blood type)
+1F17E..1F17F  ; Extended_Pictographic# E0.6   [2] (🅾️..🅿️)    O button (blood type)..P button
+1F18E         ; Extended_Pictographic# E0.6   [1] (🆎)       AB button (blood type)
+1F191..1F19A  ; Extended_Pictographic# E0.6  [10] (🆑..🆚)    CL button..VS button
+1F1AD..1F1E5  ; Extended_Pictographic# E0.0  [57] (🆭..🇥)    MASK WORK SYMBOL..<reserved-1F1E5>
+1F201..1F202  ; Extended_Pictographic# E0.6   [2] (🈁..🈂️)    Japanese “here” button..Japanese “service charge” button
+1F203..1F20F  ; Extended_Pictographic# E0.0  [13] (🈃..🈏)    <reserved-1F203>..<reserved-1F20F>
+1F21A         ; Extended_Pictographic# E0.6   [1] (🈚)       Japanese “free of charge” button
+1F22F         ; Extended_Pictographic# E0.6   [1] (🈯)       Japanese “reserved” button
+1F232..1F23A  ; Extended_Pictographic# E0.6   [9] (🈲..🈺)    Japanese “prohibited” button..Japanese “open for business” button
+1F23C..1F23F  ; Extended_Pictographic# E0.0   [4] (🈼..🈿)    <reserved-1F23C>..<reserved-1F23F>
+1F249..1F24F  ; Extended_Pictographic# E0.0   [7] (🉉..🉏)    <reserved-1F249>..<reserved-1F24F>
+1F250..1F251  ; Extended_Pictographic# E0.6   [2] (🉐..🉑)    Japanese “bargain” button..Japanese “acceptable” button
+1F252..1F2FF  ; Extended_Pictographic# E0.0 [174] (🉒..🋿)    <reserved-1F252>..<reserved-1F2FF>
+1F300..1F30C  ; Extended_Pictographic# E0.6  [13] (🌀..🌌)    cyclone..milky way
+1F30D..1F30E  ; Extended_Pictographic# E0.7   [2] (🌍..🌎)    globe showing Europe-Africa..globe showing Americas
+1F30F         ; Extended_Pictographic# E0.6   [1] (🌏)       globe showing Asia-Australia
+1F310         ; Extended_Pictographic# E1.0   [1] (🌐)       globe with meridians
+1F311         ; Extended_Pictographic# E0.6   [1] (🌑)       new moon
+1F312         ; Extended_Pictographic# E1.0   [1] (🌒)       waxing crescent moon
+1F313..1F315  ; Extended_Pictographic# E0.6   [3] (🌓..🌕)    first quarter moon..full moon
+1F316..1F318  ; Extended_Pictographic# E1.0   [3] (🌖..🌘)    waning gibbous moon..waning crescent moon
+1F319         ; Extended_Pictographic# E0.6   [1] (🌙)       crescent moon
+1F31A         ; Extended_Pictographic# E1.0   [1] (🌚)       new moon face
+1F31B         ; Extended_Pictographic# E0.6   [1] (🌛)       first quarter moon face
+1F31C         ; Extended_Pictographic# E0.7   [1] (🌜)       last quarter moon face
+1F31D..1F31E  ; Extended_Pictographic# E1.0   [2] (🌝..🌞)    full moon face..sun with face
+1F31F..1F320  ; Extended_Pictographic# E0.6   [2] (🌟..🌠)    glowing star..shooting star
+1F321         ; Extended_Pictographic# E0.7   [1] (🌡️)       thermometer
+1F322..1F323  ; Extended_Pictographic# E0.0   [2] (🌢..🌣)    BLACK DROPLET..WHITE SUN
+1F324..1F32C  ; Extended_Pictographic# E0.7   [9] (🌤️..🌬️)    sun behind small cloud..wind face
+1F32D..1F32F  ; Extended_Pictographic# E1.0   [3] (🌭..🌯)    hot dog..burrito
+1F330..1F331  ; Extended_Pictographic# E0.6   [2] (🌰..🌱)    chestnut..seedling
+1F332..1F333  ; Extended_Pictographic# E1.0   [2] (🌲..🌳)    evergreen tree..deciduous tree
+1F334..1F335  ; Extended_Pictographic# E0.6   [2] (🌴..🌵)    palm tree..cactus
+1F336         ; Extended_Pictographic# E0.7   [1] (🌶️)       hot pepper
+1F337..1F34A  ; Extended_Pictographic# E0.6  [20] (🌷..🍊)    tulip..tangerine
+1F34B         ; Extended_Pictographic# E1.0   [1] (🍋)       lemon
+1F34C..1F34F  ; Extended_Pictographic# E0.6   [4] (🍌..🍏)    banana..green apple
+1F350         ; Extended_Pictographic# E1.0   [1] (🍐)       pear
+1F351..1F37B  ; Extended_Pictographic# E0.6  [43] (🍑..🍻)    peach..clinking beer mugs
+1F37C         ; Extended_Pictographic# E1.0   [1] (🍼)       baby bottle
+1F37D         ; Extended_Pictographic# E0.7   [1] (🍽️)       fork and knife with plate
+1F37E..1F37F  ; Extended_Pictographic# E1.0   [2] (🍾..🍿)    bottle with popping cork..popcorn
+1F380..1F393  ; Extended_Pictographic# E0.6  [20] (🎀..🎓)    ribbon..graduation cap
+1F394..1F395  ; Extended_Pictographic# E0.0   [2] (🎔..🎕)    HEART WITH TIP ON THE LEFT..BOUQUET OF FLOWERS
+1F396..1F397  ; Extended_Pictographic# E0.7   [2] (🎖️..🎗️)    military medal..reminder ribbon
+1F398         ; Extended_Pictographic# E0.0   [1] (🎘)       MUSICAL KEYBOARD WITH JACKS
+1F399..1F39B  ; Extended_Pictographic# E0.7   [3] (🎙️..🎛️)    studio microphone..control knobs
+1F39C..1F39D  ; Extended_Pictographic# E0.0   [2] (🎜..🎝)    BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES
+1F39E..1F39F  ; Extended_Pictographic# E0.7   [2] (🎞️..🎟️)    film frames..admission tickets
+1F3A0..1F3C4  ; Extended_Pictographic# E0.6  [37] (🎠..🏄)    carousel horse..person surfing
+1F3C5         ; Extended_Pictographic# E1.0   [1] (🏅)       sports medal
+1F3C6         ; Extended_Pictographic# E0.6   [1] (🏆)       trophy
+1F3C7         ; Extended_Pictographic# E1.0   [1] (🏇)       horse racing
+1F3C8         ; Extended_Pictographic# E0.6   [1] (🏈)       american football
+1F3C9         ; Extended_Pictographic# E1.0   [1] (🏉)       rugby football
+1F3CA         ; Extended_Pictographic# E0.6   [1] (🏊)       person swimming
+1F3CB..1F3CE  ; Extended_Pictographic# E0.7   [4] (🏋️..🏎️)    person lifting weights..racing car
+1F3CF..1F3D3  ; Extended_Pictographic# E1.0   [5] (🏏..🏓)    cricket game..ping pong
+1F3D4..1F3DF  ; Extended_Pictographic# E0.7  [12] (🏔️..🏟️)    snow-capped mountain..stadium
+1F3E0..1F3E3  ; Extended_Pictographic# E0.6   [4] (🏠..🏣)    house..Japanese post office
+1F3E4         ; Extended_Pictographic# E1.0   [1] (🏤)       post office
+1F3E5..1F3F0  ; Extended_Pictographic# E0.6  [12] (🏥..🏰)    hospital..castle
+1F3F1..1F3F2  ; Extended_Pictographic# E0.0   [2] (🏱..🏲)    WHITE PENNANT..BLACK PENNANT
+1F3F3         ; Extended_Pictographic# E0.7   [1] (🏳️)       white flag
+1F3F4         ; Extended_Pictographic# E1.0   [1] (🏴)       black flag
+1F3F5         ; Extended_Pictographic# E0.7   [1] (🏵️)       rosette
+1F3F6         ; Extended_Pictographic# E0.0   [1] (🏶)       BLACK ROSETTE
+1F3F7         ; Extended_Pictographic# E0.7   [1] (🏷️)       label
+1F3F8..1F3FA  ; Extended_Pictographic# E1.0   [3] (🏸..🏺)    badminton..amphora
+1F400..1F407  ; Extended_Pictographic# E1.0   [8] (🐀..🐇)    rat..rabbit
+1F408         ; Extended_Pictographic# E0.7   [1] (🐈)       cat
+1F409..1F40B  ; Extended_Pictographic# E1.0   [3] (🐉..🐋)    dragon..whale
+1F40C..1F40E  ; Extended_Pictographic# E0.6   [3] (🐌..🐎)    snail..horse
+1F40F..1F410  ; Extended_Pictographic# E1.0   [2] (🐏..🐐)    ram..goat
+1F411..1F412  ; Extended_Pictographic# E0.6   [2] (🐑..🐒)    ewe..monkey
+1F413         ; Extended_Pictographic# E1.0   [1] (🐓)       rooster
+1F414         ; Extended_Pictographic# E0.6   [1] (🐔)       chicken
+1F415         ; Extended_Pictographic# E0.7   [1] (🐕)       dog
+1F416         ; Extended_Pictographic# E1.0   [1] (🐖)       pig
+1F417..1F429  ; Extended_Pictographic# E0.6  [19] (🐗..🐩)    boar..poodle
+1F42A         ; Extended_Pictographic# E1.0   [1] (🐪)       camel
+1F42B..1F43E  ; Extended_Pictographic# E0.6  [20] (🐫..🐾)    two-hump camel..paw prints
+1F43F         ; Extended_Pictographic# E0.7   [1] (🐿️)       chipmunk
+1F440         ; Extended_Pictographic# E0.6   [1] (👀)       eyes
+1F441         ; Extended_Pictographic# E0.7   [1] (👁️)       eye
+1F442..1F464  ; Extended_Pictographic# E0.6  [35] (👂..👤)    ear..bust in silhouette
+1F465         ; Extended_Pictographic# E1.0   [1] (👥)       busts in silhouette
+1F466..1F46B  ; Extended_Pictographic# E0.6   [6] (👦..👫)    boy..woman and man holding hands
+1F46C..1F46D  ; Extended_Pictographic# E1.0   [2] (👬..👭)    men holding hands..women holding hands
+1F46E..1F4AC  ; Extended_Pictographic# E0.6  [63] (👮..💬)    police officer..speech balloon
+1F4AD         ; Extended_Pictographic# E1.0   [1] (💭)       thought balloon
+1F4AE..1F4B5  ; Extended_Pictographic# E0.6   [8] (💮..💵)    white flower..dollar banknote
+1F4B6..1F4B7  ; Extended_Pictographic# E1.0   [2] (💶..💷)    euro banknote..pound banknote
+1F4B8..1F4EB  ; Extended_Pictographic# E0.6  [52] (💸..📫)    money with wings..closed mailbox with raised flag
+1F4EC..1F4ED  ; Extended_Pictographic# E0.7   [2] (📬..📭)    open mailbox with raised flag..open mailbox with lowered flag
+1F4EE         ; Extended_Pictographic# E0.6   [1] (📮)       postbox
+1F4EF         ; Extended_Pictographic# E1.0   [1] (📯)       postal horn
+1F4F0..1F4F4  ; Extended_Pictographic# E0.6   [5] (📰..📴)    newspaper..mobile phone off
+1F4F5         ; Extended_Pictographic# E1.0   [1] (📵)       no mobile phones
+1F4F6..1F4F7  ; Extended_Pictographic# E0.6   [2] (📶..📷)    antenna bars..camera
+1F4F8         ; Extended_Pictographic# E1.0   [1] (📸)       camera with flash
+1F4F9..1F4FC  ; Extended_Pictographic# E0.6   [4] (📹..📼)    video camera..videocassette
+1F4FD         ; Extended_Pictographic# E0.7   [1] (📽️)       film projector
+1F4FE         ; Extended_Pictographic# E0.0   [1] (📾)       PORTABLE STEREO
+1F4FF..1F502  ; Extended_Pictographic# E1.0   [4] (📿..🔂)    prayer beads..repeat single button
+1F503         ; Extended_Pictographic# E0.6   [1] (🔃)       clockwise vertical arrows
+1F504..1F507  ; Extended_Pictographic# E1.0   [4] (🔄..🔇)    counterclockwise arrows button..muted speaker
+1F508         ; Extended_Pictographic# E0.7   [1] (🔈)       speaker low volume
+1F509         ; Extended_Pictographic# E1.0   [1] (🔉)       speaker medium volume
+1F50A..1F514  ; Extended_Pictographic# E0.6  [11] (🔊..🔔)    speaker high volume..bell
+1F515         ; Extended_Pictographic# E1.0   [1] (🔕)       bell with slash
+1F516..1F52B  ; Extended_Pictographic# E0.6  [22] (🔖..🔫)    bookmark..water pistol
+1F52C..1F52D  ; Extended_Pictographic# E1.0   [2] (🔬..🔭)    microscope..telescope
+1F52E..1F53D  ; Extended_Pictographic# E0.6  [16] (🔮..🔽)    crystal ball..downwards button
+1F546..1F548  ; Extended_Pictographic# E0.0   [3] (🕆..🕈)    WHITE LATIN CROSS..CELTIC CROSS
+1F549..1F54A  ; Extended_Pictographic# E0.7   [2] (🕉️..🕊️)    om..dove
+1F54B..1F54E  ; Extended_Pictographic# E1.0   [4] (🕋..🕎)    kaaba..menorah
+1F54F         ; Extended_Pictographic# E0.0   [1] (🕏)       BOWL OF HYGIEIA
+1F550..1F55B  ; Extended_Pictographic# E0.6  [12] (🕐..🕛)    one o’clock..twelve o’clock
+1F55C..1F567  ; Extended_Pictographic# E0.7  [12] (🕜..🕧)    one-thirty..twelve-thirty
+1F568..1F56E  ; Extended_Pictographic# E0.0   [7] (🕨..🕮)    RIGHT SPEAKER..BOOK
+1F56F..1F570  ; Extended_Pictographic# E0.7   [2] (🕯️..🕰️)    candle..mantelpiece clock
+1F571..1F572  ; Extended_Pictographic# E0.0   [2] (🕱..🕲)    BLACK SKULL AND CROSSBONES..NO PIRACY
+1F573..1F579  ; Extended_Pictographic# E0.7   [7] (🕳️..🕹️)    hole..joystick
+1F57A         ; Extended_Pictographic# E3.0   [1] (🕺)       man dancing
+1F57B..1F586  ; Extended_Pictographic# E0.0  [12] (🕻..🖆)    LEFT HAND TELEPHONE RECEIVER..PEN OVER STAMPED ENVELOPE
+1F587         ; Extended_Pictographic# E0.7   [1] (🖇️)       linked paperclips
+1F588..1F589  ; Extended_Pictographic# E0.0   [2] (🖈..🖉)    BLACK PUSHPIN..LOWER LEFT PENCIL
+1F58A..1F58D  ; Extended_Pictographic# E0.7   [4] (🖊️..🖍️)    pen..crayon
+1F58E..1F58F  ; Extended_Pictographic# E0.0   [2] (🖎..🖏)    LEFT WRITING HAND..TURNED OK HAND SIGN
+1F590         ; Extended_Pictographic# E0.7   [1] (🖐️)       hand with fingers splayed
+1F591..1F594  ; Extended_Pictographic# E0.0   [4] (🖑..🖔)    REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND
+1F595..1F596  ; Extended_Pictographic# E1.0   [2] (🖕..🖖)    middle finger..vulcan salute
+1F597..1F5A3  ; Extended_Pictographic# E0.0  [13] (🖗..🖣)    WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX
+1F5A4         ; Extended_Pictographic# E3.0   [1] (🖤)       black heart
+1F5A5         ; Extended_Pictographic# E0.7   [1] (🖥️)       desktop computer
+1F5A6..1F5A7  ; Extended_Pictographic# E0.0   [2] (🖦..🖧)    KEYBOARD AND MOUSE..THREE NETWORKED COMPUTERS
+1F5A8         ; Extended_Pictographic# E0.7   [1] (🖨️)       printer
+1F5A9..1F5B0  ; Extended_Pictographic# E0.0   [8] (🖩..🖰)    POCKET CALCULATOR..TWO BUTTON MOUSE
+1F5B1..1F5B2  ; Extended_Pictographic# E0.7   [2] (🖱️..🖲️)    computer mouse..trackball
+1F5B3..1F5BB  ; Extended_Pictographic# E0.0   [9] (🖳..🖻)    OLD PERSONAL COMPUTER..DOCUMENT WITH PICTURE
+1F5BC         ; Extended_Pictographic# E0.7   [1] (🖼️)       framed picture
+1F5BD..1F5C1  ; Extended_Pictographic# E0.0   [5] (🖽..🗁)    FRAME WITH TILES..OPEN FOLDER
+1F5C2..1F5C4  ; Extended_Pictographic# E0.7   [3] (🗂️..🗄️)    card index dividers..file cabinet
+1F5C5..1F5D0  ; Extended_Pictographic# E0.0  [12] (🗅..🗐)    EMPTY NOTE..PAGES
+1F5D1..1F5D3  ; Extended_Pictographic# E0.7   [3] (🗑️..🗓️)    wastebasket..spiral calendar
+1F5D4..1F5DB  ; Extended_Pictographic# E0.0   [8] (🗔..🗛)    DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL
+1F5DC..1F5DE  ; Extended_Pictographic# E0.7   [3] (🗜️..🗞️)    clamp..rolled-up newspaper
+1F5DF..1F5E0  ; Extended_Pictographic# E0.0   [2] (🗟..🗠)    PAGE WITH CIRCLED TEXT..STOCK CHART
+1F5E1         ; Extended_Pictographic# E0.7   [1] (🗡️)       dagger
+1F5E2         ; Extended_Pictographic# E0.0   [1] (🗢)       LIPS
+1F5E3         ; Extended_Pictographic# E0.7   [1] (🗣️)       speaking head
+1F5E4..1F5E7  ; Extended_Pictographic# E0.0   [4] (🗤..🗧)    THREE RAYS ABOVE..THREE RAYS RIGHT
+1F5E8         ; Extended_Pictographic# E2.0   [1] (🗨️)       left speech bubble
+1F5E9..1F5EE  ; Extended_Pictographic# E0.0   [6] (🗩..🗮)    RIGHT SPEECH BUBBLE..LEFT ANGER BUBBLE
+1F5EF         ; Extended_Pictographic# E0.7   [1] (🗯️)       right anger bubble
+1F5F0..1F5F2  ; Extended_Pictographic# E0.0   [3] (🗰..🗲)    MOOD BUBBLE..LIGHTNING MOOD
+1F5F3         ; Extended_Pictographic# E0.7   [1] (🗳️)       ballot box with ballot
+1F5F4..1F5F9  ; Extended_Pictographic# E0.0   [6] (🗴..🗹)    BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK
+1F5FA         ; Extended_Pictographic# E0.7   [1] (🗺️)       world map
+1F5FB..1F5FF  ; Extended_Pictographic# E0.6   [5] (🗻..🗿)    mount fuji..moai
+1F600         ; Extended_Pictographic# E1.0   [1] (😀)       grinning face
+1F601..1F606  ; Extended_Pictographic# E0.6   [6] (😁..😆)    beaming face with smiling eyes..grinning squinting face
+1F607..1F608  ; Extended_Pictographic# E1.0   [2] (😇..😈)    smiling face with halo..smiling face with horns
+1F609..1F60D  ; Extended_Pictographic# E0.6   [5] (😉..😍)    winking face..smiling face with heart-eyes
+1F60E         ; Extended_Pictographic# E1.0   [1] (😎)       smiling face with sunglasses
+1F60F         ; Extended_Pictographic# E0.6   [1] (😏)       smirking face
+1F610         ; Extended_Pictographic# E0.7   [1] (😐)       neutral face
+1F611         ; Extended_Pictographic# E1.0   [1] (😑)       expressionless face
+1F612..1F614  ; Extended_Pictographic# E0.6   [3] (😒..😔)    unamused face..pensive face
+1F615         ; Extended_Pictographic# E1.0   [1] (😕)       confused face
+1F616         ; Extended_Pictographic# E0.6   [1] (😖)       confounded face
+1F617         ; Extended_Pictographic# E1.0   [1] (😗)       kissing face
+1F618         ; Extended_Pictographic# E0.6   [1] (😘)       face blowing a kiss
+1F619         ; Extended_Pictographic# E1.0   [1] (😙)       kissing face with smiling eyes
+1F61A         ; Extended_Pictographic# E0.6   [1] (😚)       kissing face with closed eyes
+1F61B         ; Extended_Pictographic# E1.0   [1] (😛)       face with tongue
+1F61C..1F61E  ; Extended_Pictographic# E0.6   [3] (😜..😞)    winking face with tongue..disappointed face
+1F61F         ; Extended_Pictographic# E1.0   [1] (😟)       worried face
+1F620..1F625  ; Extended_Pictographic# E0.6   [6] (😠..😥)    angry face..sad but relieved face
+1F626..1F627  ; Extended_Pictographic# E1.0   [2] (😦..😧)    frowning face with open mouth..anguished face
+1F628..1F62B  ; Extended_Pictographic# E0.6   [4] (😨..😫)    fearful face..tired face
+1F62C         ; Extended_Pictographic# E1.0   [1] (😬)       grimacing face
+1F62D         ; Extended_Pictographic# E0.6   [1] (😭)       loudly crying face
+1F62E..1F62F  ; Extended_Pictographic# E1.0   [2] (😮..😯)    face with open mouth..hushed face
+1F630..1F633  ; Extended_Pictographic# E0.6   [4] (😰..😳)    anxious face with sweat..flushed face
+1F634         ; Extended_Pictographic# E1.0   [1] (😴)       sleeping face
+1F635         ; Extended_Pictographic# E0.6   [1] (😵)       face with crossed-out eyes
+1F636         ; Extended_Pictographic# E1.0   [1] (😶)       face without mouth
+1F637..1F640  ; Extended_Pictographic# E0.6  [10] (😷..🙀)    face with medical mask..weary cat
+1F641..1F644  ; Extended_Pictographic# E1.0   [4] (🙁..🙄)    slightly frowning face..face with rolling eyes
+1F645..1F64F  ; Extended_Pictographic# E0.6  [11] (🙅..🙏)    person gesturing NO..folded hands
+1F680         ; Extended_Pictographic# E0.6   [1] (🚀)       rocket
+1F681..1F682  ; Extended_Pictographic# E1.0   [2] (🚁..🚂)    helicopter..locomotive
+1F683..1F685  ; Extended_Pictographic# E0.6   [3] (🚃..🚅)    railway car..bullet train
+1F686         ; Extended_Pictographic# E1.0   [1] (🚆)       train
+1F687         ; Extended_Pictographic# E0.6   [1] (🚇)       metro
+1F688         ; Extended_Pictographic# E1.0   [1] (🚈)       light rail
+1F689         ; Extended_Pictographic# E0.6   [1] (🚉)       station
+1F68A..1F68B  ; Extended_Pictographic# E1.0   [2] (🚊..🚋)    tram..tram car
+1F68C         ; Extended_Pictographic# E0.6   [1] (🚌)       bus
+1F68D         ; Extended_Pictographic# E0.7   [1] (🚍)       oncoming bus
+1F68E         ; Extended_Pictographic# E1.0   [1] (🚎)       trolleybus
+1F68F         ; Extended_Pictographic# E0.6   [1] (🚏)       bus stop
+1F690         ; Extended_Pictographic# E1.0   [1] (🚐)       minibus
+1F691..1F693  ; Extended_Pictographic# E0.6   [3] (🚑..🚓)    ambulance..police car
+1F694         ; Extended_Pictographic# E0.7   [1] (🚔)       oncoming police car
+1F695         ; Extended_Pictographic# E0.6   [1] (🚕)       taxi
+1F696         ; Extended_Pictographic# E1.0   [1] (🚖)       oncoming taxi
+1F697         ; Extended_Pictographic# E0.6   [1] (🚗)       automobile
+1F698         ; Extended_Pictographic# E0.7   [1] (🚘)       oncoming automobile
+1F699..1F69A  ; Extended_Pictographic# E0.6   [2] (🚙..🚚)    sport utility vehicle..delivery truck
+1F69B..1F6A1  ; Extended_Pictographic# E1.0   [7] (🚛..🚡)    articulated lorry..aerial tramway
+1F6A2         ; Extended_Pictographic# E0.6   [1] (🚢)       ship
+1F6A3         ; Extended_Pictographic# E1.0   [1] (🚣)       person rowing boat
+1F6A4..1F6A5  ; Extended_Pictographic# E0.6   [2] (🚤..🚥)    speedboat..horizontal traffic light
+1F6A6         ; Extended_Pictographic# E1.0   [1] (🚦)       vertical traffic light
+1F6A7..1F6AD  ; Extended_Pictographic# E0.6   [7] (🚧..🚭)    construction..no smoking
+1F6AE..1F6B1  ; Extended_Pictographic# E1.0   [4] (🚮..🚱)    litter in bin sign..non-potable water
+1F6B2         ; Extended_Pictographic# E0.6   [1] (🚲)       bicycle
+1F6B3..1F6B5  ; Extended_Pictographic# E1.0   [3] (🚳..🚵)    no bicycles..person mountain biking
+1F6B6         ; Extended_Pictographic# E0.6   [1] (🚶)       person walking
+1F6B7..1F6B8  ; Extended_Pictographic# E1.0   [2] (🚷..🚸)    no pedestrians..children crossing
+1F6B9..1F6BE  ; Extended_Pictographic# E0.6   [6] (🚹..🚾)    men’s room..water closet
+1F6BF         ; Extended_Pictographic# E1.0   [1] (🚿)       shower
+1F6C0         ; Extended_Pictographic# E0.6   [1] (🛀)       person taking bath
+1F6C1..1F6C5  ; Extended_Pictographic# E1.0   [5] (🛁..🛅)    bathtub..left luggage
+1F6C6..1F6CA  ; Extended_Pictographic# E0.0   [5] (🛆..🛊)    TRIANGLE WITH ROUNDED CORNERS..GIRLS SYMBOL
+1F6CB         ; Extended_Pictographic# E0.7   [1] (🛋️)       couch and lamp
+1F6CC         ; Extended_Pictographic# E1.0   [1] (🛌)       person in bed
+1F6CD..1F6CF  ; Extended_Pictographic# E0.7   [3] (🛍️..🛏️)    shopping bags..bed
+1F6D0         ; Extended_Pictographic# E1.0   [1] (🛐)       place of worship
+1F6D1..1F6D2  ; Extended_Pictographic# E3.0   [2] (🛑..🛒)    stop sign..shopping cart
+1F6D3..1F6D4  ; Extended_Pictographic# E0.0   [2] (🛓..🛔)    STUPA..PAGODA
+1F6D5         ; Extended_Pictographic# E12.0  [1] (🛕)       hindu temple
+1F6D6..1F6D7  ; Extended_Pictographic# E13.0  [2] (🛖..🛗)    hut..elevator
+1F6D8..1F6DB  ; Extended_Pictographic# E0.0   [4] (🛘..🛛)    <reserved-1F6D8>..<reserved-1F6DB>
+1F6DC         ; Extended_Pictographic# E15.0  [1] (🛜)       wireless
+1F6DD..1F6DF  ; Extended_Pictographic# E14.0  [3] (🛝..🛟)    playground slide..ring buoy
+1F6E0..1F6E5  ; Extended_Pictographic# E0.7   [6] (🛠️..🛥️)    hammer and wrench..motor boat
+1F6E6..1F6E8  ; Extended_Pictographic# E0.0   [3] (🛦..🛨)    UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE
+1F6E9         ; Extended_Pictographic# E0.7   [1] (🛩️)       small airplane
+1F6EA         ; Extended_Pictographic# E0.0   [1] (🛪)       NORTHEAST-POINTING AIRPLANE
+1F6EB..1F6EC  ; Extended_Pictographic# E1.0   [2] (🛫..🛬)    airplane departure..airplane arrival
+1F6ED..1F6EF  ; Extended_Pictographic# E0.0   [3] (🛭..🛯)    <reserved-1F6ED>..<reserved-1F6EF>
+1F6F0         ; Extended_Pictographic# E0.7   [1] (🛰️)       satellite
+1F6F1..1F6F2  ; Extended_Pictographic# E0.0   [2] (🛱..🛲)    ONCOMING FIRE ENGINE..DIESEL LOCOMOTIVE
+1F6F3         ; Extended_Pictographic# E0.7   [1] (🛳️)       passenger ship
+1F6F4..1F6F6  ; Extended_Pictographic# E3.0   [3] (🛴..🛶)    kick scooter..canoe
+1F6F7..1F6F8  ; Extended_Pictographic# E5.0   [2] (🛷..🛸)    sled..flying saucer
+1F6F9         ; Extended_Pictographic# E11.0  [1] (🛹)       skateboard
+1F6FA         ; Extended_Pictographic# E12.0  [1] (🛺)       auto rickshaw
+1F6FB..1F6FC  ; Extended_Pictographic# E13.0  [2] (🛻..🛼)    pickup truck..roller skate
+1F6FD..1F6FF  ; Extended_Pictographic# E0.0   [3] (🛽..🛿)    <reserved-1F6FD>..<reserved-1F6FF>
+1F774..1F77F  ; Extended_Pictographic# E0.0  [12] (🝴..🝿)    LOT OF FORTUNE..ORCUS
+1F7D5..1F7DF  ; Extended_Pictographic# E0.0  [11] (🟕..🟟)    CIRCLED TRIANGLE..<reserved-1F7DF>
+1F7E0..1F7EB  ; Extended_Pictographic# E12.0 [12] (🟠..🟫)    orange circle..brown square
+1F7EC..1F7EF  ; Extended_Pictographic# E0.0   [4] (🟬..🟯)    <reserved-1F7EC>..<reserved-1F7EF>
+1F7F0         ; Extended_Pictographic# E14.0  [1] (🟰)       heavy equals sign
+1F7F1..1F7FF  ; Extended_Pictographic# E0.0  [15] (🟱..🟿)    <reserved-1F7F1>..<reserved-1F7FF>
+1F80C..1F80F  ; Extended_Pictographic# E0.0   [4] (🠌..🠏)    <reserved-1F80C>..<reserved-1F80F>
+1F848..1F84F  ; Extended_Pictographic# E0.0   [8] (🡈..🡏)    <reserved-1F848>..<reserved-1F84F>
+1F85A..1F85F  ; Extended_Pictographic# E0.0   [6] (🡚..🡟)    <reserved-1F85A>..<reserved-1F85F>
+1F888..1F88F  ; Extended_Pictographic# E0.0   [8] (🢈..🢏)    <reserved-1F888>..<reserved-1F88F>
+1F8AE..1F8FF  ; Extended_Pictographic# E0.0  [82] (🢮..🣿)    <reserved-1F8AE>..<reserved-1F8FF>
+1F90C         ; Extended_Pictographic# E13.0  [1] (🤌)       pinched fingers
+1F90D..1F90F  ; Extended_Pictographic# E12.0  [3] (🤍..🤏)    white heart..pinching hand
+1F910..1F918  ; Extended_Pictographic# E1.0   [9] (🤐..🤘)    zipper-mouth face..sign of the horns
+1F919..1F91E  ; Extended_Pictographic# E3.0   [6] (🤙..🤞)    call me hand..crossed fingers
+1F91F         ; Extended_Pictographic# E5.0   [1] (🤟)       love-you gesture
+1F920..1F927  ; Extended_Pictographic# E3.0   [8] (🤠..🤧)    cowboy hat face..sneezing face
+1F928..1F92F  ; Extended_Pictographic# E5.0   [8] (🤨..🤯)    face with raised eyebrow..exploding head
+1F930         ; Extended_Pictographic# E3.0   [1] (🤰)       pregnant woman
+1F931..1F932  ; Extended_Pictographic# E5.0   [2] (🤱..🤲)    breast-feeding..palms up together
+1F933..1F93A  ; Extended_Pictographic# E3.0   [8] (🤳..🤺)    selfie..person fencing
+1F93C..1F93E  ; Extended_Pictographic# E3.0   [3] (🤼..🤾)    people wrestling..person playing handball
+1F93F         ; Extended_Pictographic# E12.0  [1] (🤿)       diving mask
+1F940..1F945  ; Extended_Pictographic# E3.0   [6] (🥀..🥅)    wilted flower..goal net
+1F947..1F94B  ; Extended_Pictographic# E3.0   [5] (🥇..🥋)    1st place medal..martial arts uniform
+1F94C         ; Extended_Pictographic# E5.0   [1] (🥌)       curling stone
+1F94D..1F94F  ; Extended_Pictographic# E11.0  [3] (🥍..🥏)    lacrosse..flying disc
+1F950..1F95E  ; Extended_Pictographic# E3.0  [15] (🥐..🥞)    croissant..pancakes
+1F95F..1F96B  ; Extended_Pictographic# E5.0  [13] (🥟..🥫)    dumpling..canned food
+1F96C..1F970  ; Extended_Pictographic# E11.0  [5] (🥬..🥰)    leafy green..smiling face with hearts
+1F971         ; Extended_Pictographic# E12.0  [1] (🥱)       yawning face
+1F972         ; Extended_Pictographic# E13.0  [1] (🥲)       smiling face with tear
+1F973..1F976  ; Extended_Pictographic# E11.0  [4] (🥳..🥶)    partying face..cold face
+1F977..1F978  ; Extended_Pictographic# E13.0  [2] (🥷..🥸)    ninja..disguised face
+1F979         ; Extended_Pictographic# E14.0  [1] (🥹)       face holding back tears
+1F97A         ; Extended_Pictographic# E11.0  [1] (🥺)       pleading face
+1F97B         ; Extended_Pictographic# E12.0  [1] (🥻)       sari
+1F97C..1F97F  ; Extended_Pictographic# E11.0  [4] (🥼..🥿)    lab coat..flat shoe
+1F980..1F984  ; Extended_Pictographic# E1.0   [5] (🦀..🦄)    crab..unicorn
+1F985..1F991  ; Extended_Pictographic# E3.0  [13] (🦅..🦑)    eagle..squid
+1F992..1F997  ; Extended_Pictographic# E5.0   [6] (🦒..🦗)    giraffe..cricket
+1F998..1F9A2  ; Extended_Pictographic# E11.0 [11] (🦘..🦢)    kangaroo..swan
+1F9A3..1F9A4  ; Extended_Pictographic# E13.0  [2] (🦣..🦤)    mammoth..dodo
+1F9A5..1F9AA  ; Extended_Pictographic# E12.0  [6] (🦥..🦪)    sloth..oyster
+1F9AB..1F9AD  ; Extended_Pictographic# E13.0  [3] (🦫..🦭)    beaver..seal
+1F9AE..1F9AF  ; Extended_Pictographic# E12.0  [2] (🦮..🦯)    guide dog..white cane
+1F9B0..1F9B9  ; Extended_Pictographic# E11.0 [10] (🦰..🦹)    red hair..supervillain
+1F9BA..1F9BF  ; Extended_Pictographic# E12.0  [6] (🦺..🦿)    safety vest..mechanical leg
+1F9C0         ; Extended_Pictographic# E1.0   [1] (🧀)       cheese wedge
+1F9C1..1F9C2  ; Extended_Pictographic# E11.0  [2] (🧁..🧂)    cupcake..salt
+1F9C3..1F9CA  ; Extended_Pictographic# E12.0  [8] (🧃..🧊)    beverage box..ice
+1F9CB         ; Extended_Pictographic# E13.0  [1] (🧋)       bubble tea
+1F9CC         ; Extended_Pictographic# E14.0  [1] (🧌)       troll
+1F9CD..1F9CF  ; Extended_Pictographic# E12.0  [3] (🧍..🧏)    person standing..deaf person
+1F9D0..1F9E6  ; Extended_Pictographic# E5.0  [23] (🧐..🧦)    face with monocle..socks
+1F9E7..1F9FF  ; Extended_Pictographic# E11.0 [25] (🧧..🧿)    red envelope..nazar amulet
+1FA00..1FA6F  ; Extended_Pictographic# E0.0 [112] (🨀..🩯)    NEUTRAL CHESS KING..<reserved-1FA6F>
+1FA70..1FA73  ; Extended_Pictographic# E12.0  [4] (🩰..🩳)    ballet shoes..shorts
+1FA74         ; Extended_Pictographic# E13.0  [1] (🩴)       thong sandal
+1FA75..1FA77  ; Extended_Pictographic# E15.0  [3] (🩵..🩷)    light blue heart..pink heart
+1FA78..1FA7A  ; Extended_Pictographic# E12.0  [3] (🩸..🩺)    drop of blood..stethoscope
+1FA7B..1FA7C  ; Extended_Pictographic# E14.0  [2] (🩻..🩼)    x-ray..crutch
+1FA7D..1FA7F  ; Extended_Pictographic# E0.0   [3] (🩽..🩿)    <reserved-1FA7D>..<reserved-1FA7F>
+1FA80..1FA82  ; Extended_Pictographic# E12.0  [3] (🪀..🪂)    yo-yo..parachute
+1FA83..1FA86  ; Extended_Pictographic# E13.0  [4] (🪃..🪆)    boomerang..nesting dolls
+1FA87..1FA88  ; Extended_Pictographic# E15.0  [2] (🪇..🪈)    maracas..flute
+1FA89..1FA8F  ; Extended_Pictographic# E0.0   [7] (🪉..🪏)    <reserved-1FA89>..<reserved-1FA8F>
+1FA90..1FA95  ; Extended_Pictographic# E12.0  [6] (🪐..🪕)    ringed planet..banjo
+1FA96..1FAA8  ; Extended_Pictographic# E13.0 [19] (🪖..🪨)    military helmet..rock
+1FAA9..1FAAC  ; Extended_Pictographic# E14.0  [4] (🪩..🪬)    mirror ball..hamsa
+1FAAD..1FAAF  ; Extended_Pictographic# E15.0  [3] (🪭..🪯)    folding hand fan..khanda
+1FAB0..1FAB6  ; Extended_Pictographic# E13.0  [7] (🪰..🪶)    fly..feather
+1FAB7..1FABA  ; Extended_Pictographic# E14.0  [4] (🪷..🪺)    lotus..nest with eggs
+1FABB..1FABD  ; Extended_Pictographic# E15.0  [3] (🪻..🪽)    hyacinth..wing
+1FABE         ; Extended_Pictographic# E0.0   [1] (🪾)       <reserved-1FABE>
+1FABF         ; Extended_Pictographic# E15.0  [1] (🪿)       goose
+1FAC0..1FAC2  ; Extended_Pictographic# E13.0  [3] (🫀..🫂)    anatomical heart..people hugging
+1FAC3..1FAC5  ; Extended_Pictographic# E14.0  [3] (🫃..🫅)    pregnant man..person with crown
+1FAC6..1FACD  ; Extended_Pictographic# E0.0   [8] (🫆..🫍)    <reserved-1FAC6>..<reserved-1FACD>
+1FACE..1FACF  ; Extended_Pictographic# E15.0  [2] (🫎..🫏)    moose..donkey
+1FAD0..1FAD6  ; Extended_Pictographic# E13.0  [7] (🫐..🫖)    blueberries..teapot
+1FAD7..1FAD9  ; Extended_Pictographic# E14.0  [3] (🫗..🫙)    pouring liquid..jar
+1FADA..1FADB  ; Extended_Pictographic# E15.0  [2] (🫚..🫛)    ginger root..pea pod
+1FADC..1FADF  ; Extended_Pictographic# E0.0   [4] (🫜..🫟)    <reserved-1FADC>..<reserved-1FADF>
+1FAE0..1FAE7  ; Extended_Pictographic# E14.0  [8] (🫠..🫧)    melting face..bubbles
+1FAE8         ; Extended_Pictographic# E15.0  [1] (🫨)       shaking face
+1FAE9..1FAEF  ; Extended_Pictographic# E0.0   [7] (🫩..🫯)    <reserved-1FAE9>..<reserved-1FAEF>
+1FAF0..1FAF6  ; Extended_Pictographic# E14.0  [7] (🫰..🫶)    hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8  ; Extended_Pictographic# E15.0  [2] (🫷..🫸)    leftwards pushing hand..rightwards pushing hand
+1FAF9..1FAFF  ; Extended_Pictographic# E0.0   [7] (🫹..🫿)    <reserved-1FAF9>..<reserved-1FAFF>
+1FC00..1FFFD  ; Extended_Pictographic# E0.0[1022] (🰀..🿽)    <reserved-1FC00>..<reserved-1FFFD>
+
+# Total elements: 3537
+
+#EOF
diff --git a/contrib/unicode/gen_libstdcxx_unicode_data.py b/contrib/unicode/gen_libstdcxx_unicode_data.py
new file mode 100755
index 00000000000..14491451435
--- /dev/null
+++ b/contrib/unicode/gen_libstdcxx_unicode_data.py
@@ -0,0 +1,222 @@
+#!/usr/bin/env python3
+#
+# Script to generate tables for libstdc++ std::format width estimation.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 3, or (at your option) any later
+# version.
+#
+# GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# To update the Libstdc++ static data in <bits/unicode-data.h> download the latest:
+# ftp://ftp.unicode.org/Public/UNIDATA/EastAsianWidth.txt
+# ftp://ftp.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
+# ftp://ftp.unicode.org/Public/UNIDATA/auxiliary/GraphemeBreakProperty.txt
+# ftp://ftp.unicode.org/Public/UNIDATA/emoji/emoji-data.txt
+# Then run this script and save the output to
+# ../../libstdc++-v3/include/bits/unicode-data.h
+
+import sys
+import re
+import math
+
+print("// Generated by contrib/unicode/gen_std_format_width.py, do not edit.\n")
+print("#ifndef _GLIBCXX_GET_UNICODE_DATA")
+print('# error "This is not a public header, do not include it directly"')
+print("#elif _GLIBCXX_GET_UNICODE_DATA != 150100")
+print('# error "Version mismatch for Unicode static data"')
+print("#endif\n")
+
+# Process a list and return a list of tuples (index, val) which are the elements
+# in the list that have a different val from the previous element.
+# e.g. find_edges([a, a, b, b, c, b, b, d]) is [(0,a), (2,b), (4,c), (5,b), (7,d)]
+# and find_edges([a, a, b, b, c, b, b, d], a) is [(2,b), (4,c), (5,b), (7,d)]
+def find_edges(vals, init = None):
+    edges = []
+    prev_val = init
+    for i, v in enumerate(vals):
+        if v != prev_val:
+            edges.append((i,v))
+            prev_val = v
+    return edges
+
+all_code_points = []
+
+# Process a code point value or range of code point values with given property.
+def process_code_points(code_points, val):
+    # Example arguments:
+    # 1100..115F, x
+    # 232A, y
+
+    r = code_points.split("..")
+    if len(r) == 1:
+        c = int(r[0], base=16)
+        all_code_points[c] = val
+    elif len(r) == 2:
+        begin = int(r[0], base=16)
+        end = int(r[1], base=16) + 1
+        all_code_points[begin:end] = [val] * (end - begin)
+    else:
+        raise ValueError
+
+# By default every code point has width 1. This is what the C++ standard says,
+# even though the Unicode standard says some code points have width 0.
+all_code_points = [1] * (1 + 0x10FFFF)
+
+# Extract all code points with East_Asian_Width=W or East_Asian_Width=F
+for line in open("EastAsianWidth.txt", "r"):
+    # Example lines:
+    # 3000           ; F
+    # 3001..3003     ; W
+    line = line.split("#")[0]
+    if re.match(r'^[\dA-Fa-f][^;]+;\s*[WF]\s*$', line):
+        process_code_points(line.split(";")[0], 2)
+
+# The C++ standard also gives width 2 to the following ranges:
+# U+4DC0 – U+4DFF (Yijing Hexagram Symbols)
+process_code_points("4DC0..4DFF", 2)
+# U+1F300 – U+1F5FF (Miscellaneous Symbols and Pictographs)
+process_code_points("1F300..1F5FF", 2)
+# U+1F900 – U+1F9FF (Supplemental Symbols and Pictographs)
+process_code_points("1F900..1F9FF", 2)
+
+# Create a list that only contains the code points that have a different width
+# to the previous code point.
+edges = find_edges(all_code_points, 1)
+
+# Table for std::__unicode::__format_width(char32_t)
+
+print("  // Table generated by contrib/unicode/gen_std_format_width.py,")
+print("  // from EastAsianWidth.txt from the Unicode standard.");
+print("  inline constexpr char32_t __width_edges[] = {", end="")
+for i, e in enumerate(edges):
+    if i % 8:
+        print(" ", end="")
+    else:
+        print("\n    ", end="")
+    c,_ = e
+    print("{:#x},".format(c), end="")
+print("\n  };\n")
+
+# By default every code point has Grapheme_Cluster_Break=Other.
+all_code_points = ["Other"] * (1 + 0x10FFFF)
+
+# Extract Grapheme_Cluster_Break property for all code points.
+for line in open("GraphemeBreakProperty.txt", "r"):
+    # Example lines:
+    # "0600..0605", "Prepend"
+    # "00AD", "Control"
+    line = line.split("#")[0]
+    if re.match(r'^[\dA-Fa-f][^;]+;', line):
+        code_points, grapheme_property = line.split(";")
+        process_code_points(code_points, grapheme_property.strip())
+
+edges = find_edges(all_code_points)
+gcb_props = {p:i+1 for i,p in enumerate(sorted(set([x[1] for x in edges])))}
+shift_bits = int(math.ceil(math.log2(len(gcb_props))))
+
+# Enum definition for std::__unicode::_Gcb_property
+
+print("  enum class _Gcb_property {")
+for p in gcb_props.items():
+    print("    _Gcb_{} = {},".format(p[0],p[1]))
+print("  };\n")
+
+# Tables for std::__unicode::_Grapheme_cluster_state
+
+print("  // Values generated by contrib/unicode/gen_std_format_width.py,")
+print("  // from GraphemeBreakProperty.txt from the Unicode standard.");
+print("  // Entries are (code_point << shift_bits) + property.")
+print("  inline constexpr int __gcb_shift_bits = {:#x};".format(shift_bits))
+print("  inline constexpr uint32_t __gcb_edges[] = {", end="")
+for i, e in enumerate(edges):
+    if i % 6:
+        print(" ", end="")
+    else:
+        print("\n    ", end="")
+    c, p = e
+    x = (c << shift_bits) + gcb_props[p]
+    print("{0:#x},".format(x), end="")
+print("\n  };\n")
+
+# By default every code point has Indic_Conjunct_Break=None.
+all_code_points = [None] * (1 + 0x10FFFF)
+
+# Extract Indic_Conjunct_Break property for all code points.
+for line in open("DerivedCoreProperties.txt", "r"):
+    # Example lines:
+    # 094D       ; InCB; Linker
+    # 0B71       ; InCB; Consonant
+    # 0300..034E ; InCB; Extend
+    line = line.split("#")[0]
+    if re.match(r'^[\dA-Fa-f][^;]+; InCB;', line):
+        code_points, _, incb_property = line.split(";")
+        process_code_points(code_points, incb_property.strip())
+
+# Table for std::__unicode::__is_incb_linker
+# This table is tiny, so just contains the list of code points.
+print("  inline constexpr char32_t __incb_linkers[] = {\n   ", end="")
+for i in [i for i,p in enumerate(all_code_points) if p == "Linker"]:
+    print(" 0x{:04x},".format(i), end="")
+    all_code_points[i] = None
+print("\n  };\n")
+
+edges = find_edges(all_code_points)
+
+incb_props = {None:0, "Consonant":1, "Extend":2}
+print("  enum class _InCB { _Consonant = 1, _Extend = 2 };\n")
+# Table for std::__unicode::__incb_property
+print("  // Values generated by contrib/unicode/gen_std_format_width.py,")
+print("  // from DerivedCoreProperties.txt from the Unicode standard.");
+print("  // Entries are (code_point << 2) + property.")
+print("  inline constexpr uint32_t __incb_edges[] = {", end="")
+for i, e in enumerate(edges):
+    if i % 6:
+        print(" ", end="")
+    else:
+        print("\n    ", end="")
+    c, p = e
+    x = (c << 2) + incb_props[p]
+    print("{0:#x},".format(x), end="")
+print("\n  };\n")
+
+# By default every code point has Emoji=No.
+all_code_points = [False] * (1 + 0x10FFFF)
+
+# Extract Emoji=Extended_Pictographic for all code points.
+for line in open("emoji-data.txt", "r"):
+    # Example lines:
+    # 1100..115F ; Extended_Pictographic
+    # 232A       ; Extended_Pictographic
+    line = line.split("#")[0]
+    if re.match(r'^[\dA-Fa-f][^;]+; Extended_Pictographic', line):
+        process_code_points(line.split(";")[0], True)
+
+edges = find_edges(all_code_points, False)
+
+# Table for std::__unicode::__is_extended_pictographic
+print("  // Table generated by contrib/unicode/gen_std_format_width.py,")
+print("  // from emoji-data.txt from the Unicode standard.");
+print("  inline constexpr char32_t __xpicto_edges[] = {", end="")
+for i, e in enumerate(edges):
+    if i % 8:
+        print(" ", end="")
+    else:
+        print("\n    ", end="")
+    c,_ = e
+    print("{:#x},".format(c), end="")
+print("\n  };\n")
+
+# <bits/unicode.h> gives an error if this macro is left defined.
+# Do this last, so that the generated output is not usable unless we reach here.
+print("#undef _GLIBCXX_GET_UNICODE_DATA")
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index d44a399b9f6..c6d6a24eb9e 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -161,6 +161,8 @@ bits_freestanding = \
 	${bits_srcdir}/stl_uninitialized.h \
 	${bits_srcdir}/version.h \
 	${bits_srcdir}/string_view.tcc \
+	${bits_srcdir}/unicode.h \
+	${bits_srcdir}/unicode-data.h \
 	${bits_srcdir}/uniform_int_dist.h \
 	${bits_srcdir}/unique_ptr.h \
 	${bits_srcdir}/uses_allocator.h \
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index 4fa4a259fef..36bb9b0771e 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -516,6 +516,8 @@ bits_freestanding = \
 	${bits_srcdir}/stl_uninitialized.h \
 	${bits_srcdir}/version.h \
 	${bits_srcdir}/string_view.tcc \
+	${bits_srcdir}/unicode.h \
+	${bits_srcdir}/unicode-data.h \
 	${bits_srcdir}/uniform_int_dist.h \
 	${bits_srcdir}/unique_ptr.h \
 	${bits_srcdir}/uses_allocator.h \
diff --git a/libstdc++-v3/include/bits/unicode-data.h b/libstdc++-v3/include/bits/unicode-data.h
new file mode 100644
index 00000000000..c0c7e7d86ff
--- /dev/null
+++ b/libstdc++-v3/include/bits/unicode-data.h
@@ -0,0 +1,449 @@
+// Generated by contrib/unicode/gen_std_format_width.py, do not edit.
+
+#ifndef _GLIBCXX_GET_UNICODE_DATA
+# error "This is not a public header, do not include it directly"
+#elif _GLIBCXX_GET_UNICODE_DATA != 150100
+# error "Version mismatch for Unicode static data"
+#endif
+
+  // Table generated by contrib/unicode/gen_std_format_width.py,
+  // from EastAsianWidth.txt from the Unicode standard.
+  inline constexpr char32_t __width_edges[] = {
+    0x1100, 0x1160, 0x231a, 0x231c, 0x2329, 0x232b, 0x23e9, 0x23ed,
+    0x23f0, 0x23f1, 0x23f3, 0x23f4, 0x25fd, 0x25ff, 0x2614, 0x2616,
+    0x2648, 0x2654, 0x267f, 0x2680, 0x2693, 0x2694, 0x26a1, 0x26a2,
+    0x26aa, 0x26ac, 0x26bd, 0x26bf, 0x26c4, 0x26c6, 0x26ce, 0x26cf,
+    0x26d4, 0x26d5, 0x26ea, 0x26eb, 0x26f2, 0x26f4, 0x26f5, 0x26f6,
+    0x26fa, 0x26fb, 0x26fd, 0x26fe, 0x2705, 0x2706, 0x270a, 0x270c,
+    0x2728, 0x2729, 0x274c, 0x274d, 0x274e, 0x274f, 0x2753, 0x2756,
+    0x2757, 0x2758, 0x2795, 0x2798, 0x27b0, 0x27b1, 0x27bf, 0x27c0,
+    0x2b1b, 0x2b1d, 0x2b50, 0x2b51, 0x2b55, 0x2b56, 0x2e80, 0x2e9a,
+    0x2e9b, 0x2ef4, 0x2f00, 0x2fd6, 0x2ff0, 0x303f, 0x3041, 0x3097,
+    0x3099, 0x3100, 0x3105, 0x3130, 0x3131, 0x318f, 0x3190, 0x31e4,
+    0x31ef, 0x321f, 0x3220, 0x3248, 0x3250, 0xa48d, 0xa490, 0xa4c7,
+    0xa960, 0xa97d, 0xac00, 0xd7a4, 0xf900, 0xfb00, 0xfe10, 0xfe1a,
+    0xfe30, 0xfe53, 0xfe54, 0xfe67, 0xfe68, 0xfe6c, 0xff01, 0xff61,
+    0xffe0, 0xffe7, 0x16fe0, 0x16fe5, 0x16ff0, 0x16ff2, 0x17000, 0x187f8,
+    0x18800, 0x18cd6, 0x18d00, 0x18d09, 0x1aff0, 0x1aff4, 0x1aff5, 0x1affc,
+    0x1affd, 0x1afff, 0x1b000, 0x1b123, 0x1b132, 0x1b133, 0x1b150, 0x1b153,
+    0x1b155, 0x1b156, 0x1b164, 0x1b168, 0x1b170, 0x1b2fc, 0x1f004, 0x1f005,
+    0x1f0cf, 0x1f0d0, 0x1f18e, 0x1f18f, 0x1f191, 0x1f19b, 0x1f200, 0x1f203,
+    0x1f210, 0x1f23c, 0x1f240, 0x1f249, 0x1f250, 0x1f252, 0x1f260, 0x1f266,
+    0x1f300, 0x1f650, 0x1f680, 0x1f6c6, 0x1f6cc, 0x1f6cd, 0x1f6d0, 0x1f6d3,
+    0x1f6d5, 0x1f6d8, 0x1f6dc, 0x1f6e0, 0x1f6eb, 0x1f6ed, 0x1f6f4, 0x1f6fd,
+    0x1f7e0, 0x1f7ec, 0x1f7f0, 0x1f7f1, 0x1f900, 0x1fa00, 0x1fa70, 0x1fa7d,
+    0x1fa80, 0x1fa89, 0x1fa90, 0x1fabe, 0x1fabf, 0x1fac6, 0x1face, 0x1fadc,
+    0x1fae0, 0x1fae9, 0x1faf0, 0x1faf9, 0x20000, 0x2fffe, 0x30000, 0x3fffe,
+  };
+
+  enum class _Gcb_property {
+    _Gcb_CR = 1,
+    _Gcb_Control = 2,
+    _Gcb_Extend = 3,
+    _Gcb_L = 4,
+    _Gcb_LF = 5,
+    _Gcb_LV = 6,
+    _Gcb_LVT = 7,
+    _Gcb_Other = 8,
+    _Gcb_Prepend = 9,
+    _Gcb_Regional_Indicator = 10,
+    _Gcb_SpacingMark = 11,
+    _Gcb_T = 12,
+    _Gcb_V = 13,
+    _Gcb_ZWJ = 14,
+  };
+
+  // Values generated by contrib/unicode/gen_std_format_width.py,
+  // from GraphemeBreakProperty.txt from the Unicode standard.
+  // Entries are (code_point << shift_bits) + property.
+  inline constexpr int __gcb_shift_bits = 0x4;
+  inline constexpr uint32_t __gcb_edges[] = {
+    0x2, 0xa5, 0xb2, 0xd1, 0xe2, 0x208,
+    0x7f2, 0xa08, 0xad2, 0xae8, 0x3003, 0x3708,
+    0x4833, 0x48a8, 0x5913, 0x5be8, 0x5bf3, 0x5c08,
+    0x5c13, 0x5c38, 0x5c43, 0x5c68, 0x5c73, 0x5c88,
+    0x6009, 0x6068, 0x6103, 0x61b8, 0x61c2, 0x61d8,
+    0x64b3, 0x6608, 0x6703, 0x6718, 0x6d63, 0x6dd9,
+    0x6de8, 0x6df3, 0x6e58, 0x6e73, 0x6e98, 0x6ea3,
+    0x6ee8, 0x70f9, 0x7108, 0x7113, 0x7128, 0x7303,
+    0x74b8, 0x7a63, 0x7b18, 0x7eb3, 0x7f48, 0x7fd3,
+    0x7fe8, 0x8163, 0x81a8, 0x81b3, 0x8248, 0x8253,
+    0x8288, 0x8293, 0x82e8, 0x8593, 0x85c8, 0x8909,
+    0x8928, 0x8983, 0x8a08, 0x8ca3, 0x8e29, 0x8e33,
+    0x903b, 0x9048, 0x93a3, 0x93bb, 0x93c3, 0x93d8,
+    0x93eb, 0x9413, 0x949b, 0x94d3, 0x94eb, 0x9508,
+    0x9513, 0x9588, 0x9623, 0x9648, 0x9813, 0x982b,
+    0x9848, 0x9bc3, 0x9bd8, 0x9be3, 0x9bfb, 0x9c13,
+    0x9c58, 0x9c7b, 0x9c98, 0x9cbb, 0x9cd3, 0x9ce8,
+    0x9d73, 0x9d88, 0x9e23, 0x9e48, 0x9fe3, 0x9ff8,
+    0xa013, 0xa03b, 0xa048, 0xa3c3, 0xa3d8, 0xa3eb,
+    0xa413, 0xa438, 0xa473, 0xa498, 0xa4b3, 0xa4e8,
+    0xa513, 0xa528, 0xa703, 0xa728, 0xa753, 0xa768,
+    0xa813, 0xa83b, 0xa848, 0xabc3, 0xabd8, 0xabeb,
+    0xac13, 0xac68, 0xac73, 0xac9b, 0xaca8, 0xacbb,
+    0xacd3, 0xace8, 0xae23, 0xae48, 0xafa3, 0xb008,
+    0xb013, 0xb02b, 0xb048, 0xb3c3, 0xb3d8, 0xb3e3,
+    0xb40b, 0xb413, 0xb458, 0xb47b, 0xb498, 0xb4bb,
+    0xb4d3, 0xb4e8, 0xb553, 0xb588, 0xb623, 0xb648,
+    0xb823, 0xb838, 0xbbe3, 0xbbfb, 0xbc03, 0xbc1b,
+    0xbc38, 0xbc6b, 0xbc98, 0xbcab, 0xbcd3, 0xbce8,
+    0xbd73, 0xbd88, 0xc003, 0xc01b, 0xc043, 0xc058,
+    0xc3c3, 0xc3d8, 0xc3e3, 0xc41b, 0xc458, 0xc463,
+    0xc498, 0xc4a3, 0xc4e8, 0xc553, 0xc578, 0xc623,
+    0xc648, 0xc813, 0xc82b, 0xc848, 0xcbc3, 0xcbd8,
+    0xcbeb, 0xcbf3, 0xcc0b, 0xcc23, 0xcc3b, 0xcc58,
+    0xcc63, 0xcc7b, 0xcc98, 0xccab, 0xccc3, 0xcce8,
+    0xcd53, 0xcd78, 0xce23, 0xce48, 0xcf3b, 0xcf48,
+    0xd003, 0xd02b, 0xd048, 0xd3b3, 0xd3d8, 0xd3e3,
+    0xd3fb, 0xd413, 0xd458, 0xd46b, 0xd498, 0xd4ab,
+    0xd4d3, 0xd4e9, 0xd4f8, 0xd573, 0xd588, 0xd623,
+    0xd648, 0xd813, 0xd82b, 0xd848, 0xdca3, 0xdcb8,
+    0xdcf3, 0xdd0b, 0xdd23, 0xdd58, 0xdd63, 0xdd78,
+    0xdd8b, 0xddf3, 0xde08, 0xdf2b, 0xdf48, 0xe313,
+    0xe328, 0xe33b, 0xe343, 0xe3b8, 0xe473, 0xe4f8,
+    0xeb13, 0xeb28, 0xeb3b, 0xeb43, 0xebd8, 0xec83,
+    0xecf8, 0xf183, 0xf1a8, 0xf353, 0xf368, 0xf373,
+    0xf388, 0xf393, 0xf3a8, 0xf3eb, 0xf408, 0xf713,
+    0xf7fb, 0xf803, 0xf858, 0xf863, 0xf888, 0xf8d3,
+    0xf988, 0xf993, 0xfbd8, 0xfc63, 0xfc78, 0x102d3,
+    0x1031b, 0x10323, 0x10388, 0x10393, 0x103bb, 0x103d3,
+    0x103f8, 0x1056b, 0x10583, 0x105a8, 0x105e3, 0x10618,
+    0x10713, 0x10758, 0x10823, 0x10838, 0x1084b, 0x10853,
+    0x10878, 0x108d3, 0x108e8, 0x109d3, 0x109e8, 0x11004,
+    0x1160d, 0x11a8c, 0x12008, 0x135d3, 0x13608, 0x17123,
+    0x1715b, 0x17168, 0x17323, 0x1734b, 0x17358, 0x17523,
+    0x17548, 0x17723, 0x17748, 0x17b43, 0x17b6b, 0x17b73,
+    0x17beb, 0x17c63, 0x17c7b, 0x17c93, 0x17d48, 0x17dd3,
+    0x17de8, 0x180b3, 0x180e2, 0x180f3, 0x18108, 0x18853,
+    0x18878, 0x18a93, 0x18aa8, 0x19203, 0x1923b, 0x19273,
+    0x1929b, 0x192c8, 0x1930b, 0x19323, 0x1933b, 0x19393,
+    0x193c8, 0x1a173, 0x1a19b, 0x1a1b3, 0x1a1c8, 0x1a55b,
+    0x1a563, 0x1a57b, 0x1a583, 0x1a5f8, 0x1a603, 0x1a618,
+    0x1a623, 0x1a638, 0x1a653, 0x1a6db, 0x1a733, 0x1a7d8,
+    0x1a7f3, 0x1a808, 0x1ab03, 0x1acf8, 0x1b003, 0x1b04b,
+    0x1b058, 0x1b343, 0x1b3bb, 0x1b3c3, 0x1b3db, 0x1b423,
+    0x1b43b, 0x1b458, 0x1b6b3, 0x1b748, 0x1b803, 0x1b82b,
+    0x1b838, 0x1ba1b, 0x1ba23, 0x1ba6b, 0x1ba83, 0x1baab,
+    0x1bab3, 0x1bae8, 0x1be63, 0x1be7b, 0x1be83, 0x1beab,
+    0x1bed3, 0x1beeb, 0x1bef3, 0x1bf2b, 0x1bf48, 0x1c24b,
+    0x1c2c3, 0x1c34b, 0x1c363, 0x1c388, 0x1cd03, 0x1cd38,
+    0x1cd43, 0x1ce1b, 0x1ce23, 0x1ce98, 0x1ced3, 0x1cee8,
+    0x1cf43, 0x1cf58, 0x1cf7b, 0x1cf83, 0x1cfa8, 0x1dc03,
+    0x1e008, 0x200b2, 0x200c3, 0x200de, 0x200e2, 0x20108,
+    0x20282, 0x202f8, 0x20602, 0x20708, 0x20d03, 0x20f18,
+    0x2cef3, 0x2cf28, 0x2d7f3, 0x2d808, 0x2de03, 0x2e008,
+    0x302a3, 0x30308, 0x30993, 0x309b8, 0xa66f3, 0xa6738,
+    0xa6743, 0xa67e8, 0xa69e3, 0xa6a08, 0xa6f03, 0xa6f28,
+    0xa8023, 0xa8038, 0xa8063, 0xa8078, 0xa80b3, 0xa80c8,
+    0xa823b, 0xa8253, 0xa827b, 0xa8288, 0xa82c3, 0xa82d8,
+    0xa880b, 0xa8828, 0xa8b4b, 0xa8c43, 0xa8c68, 0xa8e03,
+    0xa8f28, 0xa8ff3, 0xa9008, 0xa9263, 0xa92e8, 0xa9473,
+    0xa952b, 0xa9548, 0xa9604, 0xa97d8, 0xa9803, 0xa983b,
+    0xa9848, 0xa9b33, 0xa9b4b, 0xa9b63, 0xa9bab, 0xa9bc3,
+    0xa9beb, 0xa9c18, 0xa9e53, 0xa9e68, 0xaa293, 0xaa2fb,
+    0xaa313, 0xaa33b, 0xaa353, 0xaa378, 0xaa433, 0xaa448,
+    0xaa4c3, 0xaa4db, 0xaa4e8, 0xaa7c3, 0xaa7d8, 0xaab03,
+    0xaab18, 0xaab23, 0xaab58, 0xaab73, 0xaab98, 0xaabe3,
+    0xaac08, 0xaac13, 0xaac28, 0xaaebb, 0xaaec3, 0xaaeeb,
+    0xaaf08, 0xaaf5b, 0xaaf63, 0xaaf78, 0xabe3b, 0xabe53,
+    0xabe6b, 0xabe83, 0xabe9b, 0xabeb8, 0xabecb, 0xabed3,
+    0xabee8, 0xac006, 0xac017, 0xac1c6, 0xac1d7, 0xac386,
+    0xac397, 0xac546, 0xac557, 0xac706, 0xac717, 0xac8c6,
+    0xac8d7, 0xaca86, 0xaca97, 0xacc46, 0xacc57, 0xace06,
+    0xace17, 0xacfc6, 0xacfd7, 0xad186, 0xad197, 0xad346,
+    0xad357, 0xad506, 0xad517, 0xad6c6, 0xad6d7, 0xad886,
+    0xad897, 0xada46, 0xada57, 0xadc06, 0xadc17, 0xaddc6,
+    0xaddd7, 0xadf86, 0xadf97, 0xae146, 0xae157, 0xae306,
+    0xae317, 0xae4c6, 0xae4d7, 0xae686, 0xae697, 0xae846,
+    0xae857, 0xaea06, 0xaea17, 0xaebc6, 0xaebd7, 0xaed86,
+    0xaed97, 0xaef46, 0xaef57, 0xaf106, 0xaf117, 0xaf2c6,
+    0xaf2d7, 0xaf486, 0xaf497, 0xaf646, 0xaf657, 0xaf806,
+    0xaf817, 0xaf9c6, 0xaf9d7, 0xafb86, 0xafb97, 0xafd46,
+    0xafd57, 0xaff06, 0xaff17, 0xb00c6, 0xb00d7, 0xb0286,
+    0xb0297, 0xb0446, 0xb0457, 0xb0606, 0xb0617, 0xb07c6,
+    0xb07d7, 0xb0986, 0xb0997, 0xb0b46, 0xb0b57, 0xb0d06,
+    0xb0d17, 0xb0ec6, 0xb0ed7, 0xb1086, 0xb1097, 0xb1246,
+    0xb1257, 0xb1406, 0xb1417, 0xb15c6, 0xb15d7, 0xb1786,
+    0xb1797, 0xb1946, 0xb1957, 0xb1b06, 0xb1b17, 0xb1cc6,
+    0xb1cd7, 0xb1e86, 0xb1e97, 0xb2046, 0xb2057, 0xb2206,
+    0xb2217, 0xb23c6, 0xb23d7, 0xb2586, 0xb2597, 0xb2746,
+    0xb2757, 0xb2906, 0xb2917, 0xb2ac6, 0xb2ad7, 0xb2c86,
+    0xb2c97, 0xb2e46, 0xb2e57, 0xb3006, 0xb3017, 0xb31c6,
+    0xb31d7, 0xb3386, 0xb3397, 0xb3546, 0xb3557, 0xb3706,
+    0xb3717, 0xb38c6, 0xb38d7, 0xb3a86, 0xb3a97, 0xb3c46,
+    0xb3c57, 0xb3e06, 0xb3e17, 0xb3fc6, 0xb3fd7, 0xb4186,
+    0xb4197, 0xb4346, 0xb4357, 0xb4506, 0xb4517, 0xb46c6,
+    0xb46d7, 0xb4886, 0xb4897, 0xb4a46, 0xb4a57, 0xb4c06,
+    0xb4c17, 0xb4dc6, 0xb4dd7, 0xb4f86, 0xb4f97, 0xb5146,
+    0xb5157, 0xb5306, 0xb5317, 0xb54c6, 0xb54d7, 0xb5686,
+    0xb5697, 0xb5846, 0xb5857, 0xb5a06, 0xb5a17, 0xb5bc6,
+    0xb5bd7, 0xb5d86, 0xb5d97, 0xb5f46, 0xb5f57, 0xb6106,
+    0xb6117, 0xb62c6, 0xb62d7, 0xb6486, 0xb6497, 0xb6646,
+    0xb6657, 0xb6806, 0xb6817, 0xb69c6, 0xb69d7, 0xb6b86,
+    0xb6b97, 0xb6d46, 0xb6d57, 0xb6f06, 0xb6f17, 0xb70c6,
+    0xb70d7, 0xb7286, 0xb7297, 0xb7446, 0xb7457, 0xb7606,
+    0xb7617, 0xb77c6, 0xb77d7, 0xb7986, 0xb7997, 0xb7b46,
+    0xb7b57, 0xb7d06, 0xb7d17, 0xb7ec6, 0xb7ed7, 0xb8086,
+    0xb8097, 0xb8246, 0xb8257, 0xb8406, 0xb8417, 0xb85c6,
+    0xb85d7, 0xb8786, 0xb8797, 0xb8946, 0xb8957, 0xb8b06,
+    0xb8b17, 0xb8cc6, 0xb8cd7, 0xb8e86, 0xb8e97, 0xb9046,
+    0xb9057, 0xb9206, 0xb9217, 0xb93c6, 0xb93d7, 0xb9586,
+    0xb9597, 0xb9746, 0xb9757, 0xb9906, 0xb9917, 0xb9ac6,
+    0xb9ad7, 0xb9c86, 0xb9c97, 0xb9e46, 0xb9e57, 0xba006,
+    0xba017, 0xba1c6, 0xba1d7, 0xba386, 0xba397, 0xba546,
+    0xba557, 0xba706, 0xba717, 0xba8c6, 0xba8d7, 0xbaa86,
+    0xbaa97, 0xbac46, 0xbac57, 0xbae06, 0xbae17, 0xbafc6,
+    0xbafd7, 0xbb186, 0xbb197, 0xbb346, 0xbb357, 0xbb506,
+    0xbb517, 0xbb6c6, 0xbb6d7, 0xbb886, 0xbb897, 0xbba46,
+    0xbba57, 0xbbc06, 0xbbc17, 0xbbdc6, 0xbbdd7, 0xbbf86,
+    0xbbf97, 0xbc146, 0xbc157, 0xbc306, 0xbc317, 0xbc4c6,
+    0xbc4d7, 0xbc686, 0xbc697, 0xbc846, 0xbc857, 0xbca06,
+    0xbca17, 0xbcbc6, 0xbcbd7, 0xbcd86, 0xbcd97, 0xbcf46,
+    0xbcf57, 0xbd106, 0xbd117, 0xbd2c6, 0xbd2d7, 0xbd486,
+    0xbd497, 0xbd646, 0xbd657, 0xbd806, 0xbd817, 0xbd9c6,
+    0xbd9d7, 0xbdb86, 0xbdb97, 0xbdd46, 0xbdd57, 0xbdf06,
+    0xbdf17, 0xbe0c6, 0xbe0d7, 0xbe286, 0xbe297, 0xbe446,
+    0xbe457, 0xbe606, 0xbe617, 0xbe7c6, 0xbe7d7, 0xbe986,
+    0xbe997, 0xbeb46, 0xbeb57, 0xbed06, 0xbed17, 0xbeec6,
+    0xbeed7, 0xbf086, 0xbf097, 0xbf246, 0xbf257, 0xbf406,
+    0xbf417, 0xbf5c6, 0xbf5d7, 0xbf786, 0xbf797, 0xbf946,
+    0xbf957, 0xbfb06, 0xbfb17, 0xbfcc6, 0xbfcd7, 0xbfe86,
+    0xbfe97, 0xc0046, 0xc0057, 0xc0206, 0xc0217, 0xc03c6,
+    0xc03d7, 0xc0586, 0xc0597, 0xc0746, 0xc0757, 0xc0906,
+    0xc0917, 0xc0ac6, 0xc0ad7, 0xc0c86, 0xc0c97, 0xc0e46,
+    0xc0e57, 0xc1006, 0xc1017, 0xc11c6, 0xc11d7, 0xc1386,
+    0xc1397, 0xc1546, 0xc1557, 0xc1706, 0xc1717, 0xc18c6,
+    0xc18d7, 0xc1a86, 0xc1a97, 0xc1c46, 0xc1c57, 0xc1e06,
+    0xc1e17, 0xc1fc6, 0xc1fd7, 0xc2186, 0xc2197, 0xc2346,
+    0xc2357, 0xc2506, 0xc2517, 0xc26c6, 0xc26d7, 0xc2886,
+    0xc2897, 0xc2a46, 0xc2a57, 0xc2c06, 0xc2c17, 0xc2dc6,
+    0xc2dd7, 0xc2f86, 0xc2f97, 0xc3146, 0xc3157, 0xc3306,
+    0xc3317, 0xc34c6, 0xc34d7, 0xc3686, 0xc3697, 0xc3846,
+    0xc3857, 0xc3a06, 0xc3a17, 0xc3bc6, 0xc3bd7, 0xc3d86,
+    0xc3d97, 0xc3f46, 0xc3f57, 0xc4106, 0xc4117, 0xc42c6,
+    0xc42d7, 0xc4486, 0xc4497, 0xc4646, 0xc4657, 0xc4806,
+    0xc4817, 0xc49c6, 0xc49d7, 0xc4b86, 0xc4b97, 0xc4d46,
+    0xc4d57, 0xc4f06, 0xc4f17, 0xc50c6, 0xc50d7, 0xc5286,
+    0xc5297, 0xc5446, 0xc5457, 0xc5606, 0xc5617, 0xc57c6,
+    0xc57d7, 0xc5986, 0xc5997, 0xc5b46, 0xc5b57, 0xc5d06,
+    0xc5d17, 0xc5ec6, 0xc5ed7, 0xc6086, 0xc6097, 0xc6246,
+    0xc6257, 0xc6406, 0xc6417, 0xc65c6, 0xc65d7, 0xc6786,
+    0xc6797, 0xc6946, 0xc6957, 0xc6b06, 0xc6b17, 0xc6cc6,
+    0xc6cd7, 0xc6e86, 0xc6e97, 0xc7046, 0xc7057, 0xc7206,
+    0xc7217, 0xc73c6, 0xc73d7, 0xc7586, 0xc7597, 0xc7746,
+    0xc7757, 0xc7906, 0xc7917, 0xc7ac6, 0xc7ad7, 0xc7c86,
+    0xc7c97, 0xc7e46, 0xc7e57, 0xc8006, 0xc8017, 0xc81c6,
+    0xc81d7, 0xc8386, 0xc8397, 0xc8546, 0xc8557, 0xc8706,
+    0xc8717, 0xc88c6, 0xc88d7, 0xc8a86, 0xc8a97, 0xc8c46,
+    0xc8c57, 0xc8e06, 0xc8e17, 0xc8fc6, 0xc8fd7, 0xc9186,
+    0xc9197, 0xc9346, 0xc9357, 0xc9506, 0xc9517, 0xc96c6,
+    0xc96d7, 0xc9886, 0xc9897, 0xc9a46, 0xc9a57, 0xc9c06,
+    0xc9c17, 0xc9dc6, 0xc9dd7, 0xc9f86, 0xc9f97, 0xca146,
+    0xca157, 0xca306, 0xca317, 0xca4c6, 0xca4d7, 0xca686,
+    0xca697, 0xca846, 0xca857, 0xcaa06, 0xcaa17, 0xcabc6,
+    0xcabd7, 0xcad86, 0xcad97, 0xcaf46, 0xcaf57, 0xcb106,
+    0xcb117, 0xcb2c6, 0xcb2d7, 0xcb486, 0xcb497, 0xcb646,
+    0xcb657, 0xcb806, 0xcb817, 0xcb9c6, 0xcb9d7, 0xcbb86,
+    0xcbb97, 0xcbd46, 0xcbd57, 0xcbf06, 0xcbf17, 0xcc0c6,
+    0xcc0d7, 0xcc286, 0xcc297, 0xcc446, 0xcc457, 0xcc606,
+    0xcc617, 0xcc7c6, 0xcc7d7, 0xcc986, 0xcc997, 0xccb46,
+    0xccb57, 0xccd06, 0xccd17, 0xccec6, 0xcced7, 0xcd086,
+    0xcd097, 0xcd246, 0xcd257, 0xcd406, 0xcd417, 0xcd5c6,
+    0xcd5d7, 0xcd786, 0xcd797, 0xcd946, 0xcd957, 0xcdb06,
+    0xcdb17, 0xcdcc6, 0xcdcd7, 0xcde86, 0xcde97, 0xce046,
+    0xce057, 0xce206, 0xce217, 0xce3c6, 0xce3d7, 0xce586,
+    0xce597, 0xce746, 0xce757, 0xce906, 0xce917, 0xceac6,
+    0xcead7, 0xcec86, 0xcec97, 0xcee46, 0xcee57, 0xcf006,
+    0xcf017, 0xcf1c6, 0xcf1d7, 0xcf386, 0xcf397, 0xcf546,
+    0xcf557, 0xcf706, 0xcf717, 0xcf8c6, 0xcf8d7, 0xcfa86,
+    0xcfa97, 0xcfc46, 0xcfc57, 0xcfe06, 0xcfe17, 0xcffc6,
+    0xcffd7, 0xd0186, 0xd0197, 0xd0346, 0xd0357, 0xd0506,
+    0xd0517, 0xd06c6, 0xd06d7, 0xd0886, 0xd0897, 0xd0a46,
+    0xd0a57, 0xd0c06, 0xd0c17, 0xd0dc6, 0xd0dd7, 0xd0f86,
+    0xd0f97, 0xd1146, 0xd1157, 0xd1306, 0xd1317, 0xd14c6,
+    0xd14d7, 0xd1686, 0xd1697, 0xd1846, 0xd1857, 0xd1a06,
+    0xd1a17, 0xd1bc6, 0xd1bd7, 0xd1d86, 0xd1d97, 0xd1f46,
+    0xd1f57, 0xd2106, 0xd2117, 0xd22c6, 0xd22d7, 0xd2486,
+    0xd2497, 0xd2646, 0xd2657, 0xd2806, 0xd2817, 0xd29c6,
+    0xd29d7, 0xd2b86, 0xd2b97, 0xd2d46, 0xd2d57, 0xd2f06,
+    0xd2f17, 0xd30c6, 0xd30d7, 0xd3286, 0xd3297, 0xd3446,
+    0xd3457, 0xd3606, 0xd3617, 0xd37c6, 0xd37d7, 0xd3986,
+    0xd3997, 0xd3b46, 0xd3b57, 0xd3d06, 0xd3d17, 0xd3ec6,
+    0xd3ed7, 0xd4086, 0xd4097, 0xd4246, 0xd4257, 0xd4406,
+    0xd4417, 0xd45c6, 0xd45d7, 0xd4786, 0xd4797, 0xd4946,
+    0xd4957, 0xd4b06, 0xd4b17, 0xd4cc6, 0xd4cd7, 0xd4e86,
+    0xd4e97, 0xd5046, 0xd5057, 0xd5206, 0xd5217, 0xd53c6,
+    0xd53d7, 0xd5586, 0xd5597, 0xd5746, 0xd5757, 0xd5906,
+    0xd5917, 0xd5ac6, 0xd5ad7, 0xd5c86, 0xd5c97, 0xd5e46,
+    0xd5e57, 0xd6006, 0xd6017, 0xd61c6, 0xd61d7, 0xd6386,
+    0xd6397, 0xd6546, 0xd6557, 0xd6706, 0xd6717, 0xd68c6,
+    0xd68d7, 0xd6a86, 0xd6a97, 0xd6c46, 0xd6c57, 0xd6e06,
+    0xd6e17, 0xd6fc6, 0xd6fd7, 0xd7186, 0xd7197, 0xd7346,
+    0xd7357, 0xd7506, 0xd7517, 0xd76c6, 0xd76d7, 0xd7886,
+    0xd7897, 0xd7a48, 0xd7b0d, 0xd7c78, 0xd7cbc, 0xd7fc8,
+    0xfb1e3, 0xfb1f8, 0xfe003, 0xfe108, 0xfe203, 0xfe308,
+    0xfeff2, 0xff008, 0xff9e3, 0xffa08, 0xfff02, 0xfffc8,
+    0x101fd3, 0x101fe8, 0x102e03, 0x102e18, 0x103763, 0x1037b8,
+    0x10a013, 0x10a048, 0x10a053, 0x10a078, 0x10a0c3, 0x10a108,
+    0x10a383, 0x10a3b8, 0x10a3f3, 0x10a408, 0x10ae53, 0x10ae78,
+    0x10d243, 0x10d288, 0x10eab3, 0x10ead8, 0x10efd3, 0x10f008,
+    0x10f463, 0x10f518, 0x10f823, 0x10f868, 0x11000b, 0x110013,
+    0x11002b, 0x110038, 0x110383, 0x110478, 0x110703, 0x110718,
+    0x110733, 0x110758, 0x1107f3, 0x11082b, 0x110838, 0x110b0b,
+    0x110b33, 0x110b7b, 0x110b93, 0x110bb8, 0x110bd9, 0x110be8,
+    0x110c23, 0x110c38, 0x110cd9, 0x110ce8, 0x111003, 0x111038,
+    0x111273, 0x1112cb, 0x1112d3, 0x111358, 0x11145b, 0x111478,
+    0x111733, 0x111748, 0x111803, 0x11182b, 0x111838, 0x111b3b,
+    0x111b63, 0x111bfb, 0x111c18, 0x111c29, 0x111c48, 0x111c93,
+    0x111cd8, 0x111ceb, 0x111cf3, 0x111d08, 0x1122cb, 0x1122f3,
+    0x11232b, 0x112343, 0x11235b, 0x112363, 0x112388, 0x1123e3,
+    0x1123f8, 0x112413, 0x112428, 0x112df3, 0x112e0b, 0x112e33,
+    0x112eb8, 0x113003, 0x11302b, 0x113048, 0x1133b3, 0x1133d8,
+    0x1133e3, 0x1133fb, 0x113403, 0x11341b, 0x113458, 0x11347b,
+    0x113498, 0x1134bb, 0x1134e8, 0x113573, 0x113588, 0x11362b,
+    0x113648, 0x113663, 0x1136d8, 0x113703, 0x113758, 0x11435b,
+    0x114383, 0x11440b, 0x114423, 0x11445b, 0x114463, 0x114478,
+    0x1145e3, 0x1145f8, 0x114b03, 0x114b1b, 0x114b33, 0x114b9b,
+    0x114ba3, 0x114bbb, 0x114bd3, 0x114beb, 0x114bf3, 0x114c1b,
+    0x114c23, 0x114c48, 0x115af3, 0x115b0b, 0x115b23, 0x115b68,
+    0x115b8b, 0x115bc3, 0x115beb, 0x115bf3, 0x115c18, 0x115dc3,
+    0x115de8, 0x11630b, 0x116333, 0x1163bb, 0x1163d3, 0x1163eb,
+    0x1163f3, 0x116418, 0x116ab3, 0x116acb, 0x116ad3, 0x116aeb,
+    0x116b03, 0x116b6b, 0x116b73, 0x116b88, 0x1171d3, 0x117208,
+    0x117223, 0x11726b, 0x117273, 0x1172c8, 0x1182cb, 0x1182f3,
+    0x11838b, 0x118393, 0x1183b8, 0x119303, 0x11931b, 0x119368,
+    0x11937b, 0x119398, 0x1193b3, 0x1193db, 0x1193e3, 0x1193f9,
+    0x11940b, 0x119419, 0x11942b, 0x119433, 0x119448, 0x119d1b,
+    0x119d43, 0x119d88, 0x119da3, 0x119dcb, 0x119e03, 0x119e18,
+    0x119e4b, 0x119e58, 0x11a013, 0x11a0b8, 0x11a333, 0x11a39b,
+    0x11a3a9, 0x11a3b3, 0x11a3f8, 0x11a473, 0x11a488, 0x11a513,
+    0x11a57b, 0x11a593, 0x11a5c8, 0x11a849, 0x11a8a3, 0x11a97b,
+    0x11a983, 0x11a9a8, 0x11c2fb, 0x11c303, 0x11c378, 0x11c383,
+    0x11c3eb, 0x11c3f3, 0x11c408, 0x11c923, 0x11ca88, 0x11ca9b,
+    0x11caa3, 0x11cb1b, 0x11cb23, 0x11cb4b, 0x11cb53, 0x11cb78,
+    0x11d313, 0x11d378, 0x11d3a3, 0x11d3b8, 0x11d3c3, 0x11d3e8,
+    0x11d3f3, 0x11d469, 0x11d473, 0x11d488, 0x11d8ab, 0x11d8f8,
+    0x11d903, 0x11d928, 0x11d93b, 0x11d953, 0x11d96b, 0x11d973,
+    0x11d988, 0x11ef33, 0x11ef5b, 0x11ef78, 0x11f003, 0x11f029,
+    0x11f03b, 0x11f048, 0x11f34b, 0x11f363, 0x11f3b8, 0x11f3eb,
+    0x11f403, 0x11f41b, 0x11f423, 0x11f438, 0x134302, 0x134403,
+    0x134418, 0x134473, 0x134568, 0x16af03, 0x16af58, 0x16b303,
+    0x16b378, 0x16f4f3, 0x16f508, 0x16f51b, 0x16f888, 0x16f8f3,
+    0x16f938, 0x16fe43, 0x16fe58, 0x16ff0b, 0x16ff28, 0x1bc9d3,
+    0x1bc9f8, 0x1bca02, 0x1bca48, 0x1cf003, 0x1cf2e8, 0x1cf303,
+    0x1cf478, 0x1d1653, 0x1d166b, 0x1d1673, 0x1d16a8, 0x1d16db,
+    0x1d16e3, 0x1d1732, 0x1d17b3, 0x1d1838, 0x1d1853, 0x1d18c8,
+    0x1d1aa3, 0x1d1ae8, 0x1d2423, 0x1d2458, 0x1da003, 0x1da378,
+    0x1da3b3, 0x1da6d8, 0x1da753, 0x1da768, 0x1da843, 0x1da858,
+    0x1da9b3, 0x1daa08, 0x1daa13, 0x1dab08, 0x1e0003, 0x1e0078,
+    0x1e0083, 0x1e0198, 0x1e01b3, 0x1e0228, 0x1e0233, 0x1e0258,
+    0x1e0263, 0x1e02b8, 0x1e08f3, 0x1e0908, 0x1e1303, 0x1e1378,
+    0x1e2ae3, 0x1e2af8, 0x1e2ec3, 0x1e2f08, 0x1e4ec3, 0x1e4f08,
+    0x1e8d03, 0x1e8d78, 0x1e9443, 0x1e94b8, 0x1f1e6a, 0x1f2008,
+    0x1f3fb3, 0x1f4008, 0xe00002, 0xe00203, 0xe00802, 0xe01003,
+    0xe01f02, 0xe10008,
+  };
+
+  inline constexpr char32_t __incb_linkers[] = {
+    0x094d, 0x09cd, 0x0acd, 0x0b4d, 0x0c4d, 0x0d4d,
+  };
+
+  enum class _InCB { _Consonant = 1, _Extend = 2 };
+
+  // Values generated by contrib/unicode/gen_std_format_width.py,
+  // from DerivedCoreProperties.txt from the Unicode standard.
+  // Entries are (code_point << 2) + property.
+  inline constexpr uint32_t __incb_edges[] = {
+    0xc02, 0xd3c, 0xd42, 0xdc0, 0x120e, 0x1220,
+    0x1646, 0x16f8, 0x16fe, 0x1700, 0x1706, 0x170c,
+    0x1712, 0x1718, 0x171e, 0x1720, 0x1842, 0x186c,
+    0x192e, 0x1980, 0x19c2, 0x19c4, 0x1b5a, 0x1b74,
+    0x1b7e, 0x1b94, 0x1b9e, 0x1ba4, 0x1baa, 0x1bb8,
+    0x1c46, 0x1c48, 0x1cc2, 0x1d2c, 0x1fae, 0x1fd0,
+    0x1ff6, 0x1ff8, 0x205a, 0x2068, 0x206e, 0x2090,
+    0x2096, 0x20a0, 0x20a6, 0x20b8, 0x2166, 0x2170,
+    0x2262, 0x2280, 0x232a, 0x2388, 0x238e, 0x2400,
+    0x2455, 0x24e8, 0x24f2, 0x24f4, 0x2546, 0x2554,
+    0x2561, 0x2580, 0x25e1, 0x2600, 0x2655, 0x26a4,
+    0x26a9, 0x26c4, 0x26c9, 0x26cc, 0x26d9, 0x26e8,
+    0x26f2, 0x26f4, 0x2771, 0x2778, 0x277d, 0x2780,
+    0x27c1, 0x27c8, 0x27fa, 0x27fc, 0x28f2, 0x28f4,
+    0x2a55, 0x2aa4, 0x2aa9, 0x2ac4, 0x2ac9, 0x2ad0,
+    0x2ad5, 0x2ae8, 0x2af2, 0x2af4, 0x2be5, 0x2be8,
+    0x2c55, 0x2ca4, 0x2ca9, 0x2cc4, 0x2cc9, 0x2cd0,
+    0x2cd5, 0x2ce8, 0x2cf2, 0x2cf4, 0x2d71, 0x2d78,
+    0x2d7d, 0x2d80, 0x2dc5, 0x2dc8, 0x3055, 0x30a4,
+    0x30a9, 0x30e8, 0x30f2, 0x30f4, 0x3156, 0x315c,
+    0x3161, 0x316c, 0x32f2, 0x32f4, 0x3455, 0x34ee,
+    0x34f4, 0x38e2, 0x38ec, 0x3922, 0x3930, 0x3ae2,
+    0x3aec, 0x3b22, 0x3b30, 0x3c62, 0x3c68, 0x3cd6,
+    0x3cd8, 0x3cde, 0x3ce0, 0x3ce6, 0x3ce8, 0x3dc6,
+    0x3dcc, 0x3dd2, 0x3dd4, 0x3dea, 0x3df8, 0x3e02,
+    0x3e04, 0x3e0a, 0x3e14, 0x3e1a, 0x3e20, 0x3f1a,
+    0x3f1c, 0x40de, 0x40e0, 0x40e6, 0x40ec, 0x4236,
+    0x4238, 0x4d76, 0x4d80, 0x5c52, 0x5c54, 0x5f4a,
+    0x5f4c, 0x5f76, 0x5f78, 0x62a6, 0x62a8, 0x64e6,
+    0x64f0, 0x685e, 0x6864, 0x6982, 0x6984, 0x69d6,
+    0x69f4, 0x69fe, 0x6a00, 0x6ac2, 0x6af8, 0x6afe,
+    0x6b3c, 0x6cd2, 0x6cd4, 0x6dae, 0x6dd0, 0x6eae,
+    0x6eb0, 0x6f9a, 0x6f9c, 0x70de, 0x70e0, 0x7342,
+    0x734c, 0x7352, 0x7384, 0x738a, 0x73a4, 0x73b6,
+    0x73b8, 0x73d2, 0x73d4, 0x73e2, 0x73e8, 0x7702,
+    0x7800, 0x8036, 0x8038, 0x8342, 0x8374, 0x8386,
+    0x8388, 0x8396, 0x83c4, 0xb3be, 0xb3c8, 0xb5fe,
+    0xb600, 0xb782, 0xb800, 0xc0aa, 0xc0c0, 0xc266,
+    0xc26c, 0x299be, 0x299c0, 0x299d2, 0x299f8, 0x29a7a,
+    0x29a80, 0x29bc2, 0x29bc8, 0x2a0b2, 0x2a0b4, 0x2a382,
+    0x2a3c8, 0x2a4ae, 0x2a4b8, 0x2a6ce, 0x2a6d0, 0x2aac2,
+    0x2aac4, 0x2aaca, 0x2aad4, 0x2aade, 0x2aae4, 0x2aafa,
+    0x2ab00, 0x2ab06, 0x2ab08, 0x2abda, 0x2abdc, 0x2afb6,
+    0x2afb8, 0x3ec7a, 0x3ec7c, 0x3f882, 0x3f8c0, 0x407f6,
+    0x407f8, 0x40b82, 0x40b84, 0x40dda, 0x40dec, 0x42836,
+    0x42838, 0x4283e, 0x42840, 0x428e2, 0x428ec, 0x428fe,
+    0x42900, 0x42b96, 0x42b9c, 0x43492, 0x434a0, 0x43aae,
+    0x43ab4, 0x43bf6, 0x43c00, 0x43d1a, 0x43d44, 0x43e0a,
+    0x43e18, 0x441c2, 0x441c4, 0x441fe, 0x44200, 0x442ea,
+    0x442ec, 0x44402, 0x4440c, 0x444ce, 0x444d4, 0x445ce,
+    0x445d0, 0x4472a, 0x4472c, 0x448da, 0x448dc, 0x44ba6,
+    0x44bac, 0x44cee, 0x44cf4, 0x44d9a, 0x44db4, 0x44dc2,
+    0x44dd4, 0x4511a, 0x4511c, 0x4517a, 0x4517c, 0x4530e,
+    0x45310, 0x45702, 0x45704, 0x45ade, 0x45ae0, 0x45cae,
+    0x45cb0, 0x460ea, 0x460ec, 0x464fa, 0x464fc, 0x4650e,
+    0x46510, 0x468d2, 0x468d4, 0x4691e, 0x46920, 0x46a66,
+    0x46a68, 0x4750a, 0x4750c, 0x47512, 0x47518, 0x4765e,
+    0x47660, 0x47d0a, 0x47d0c, 0x5abc2, 0x5abd4, 0x5acc2,
+    0x5acdc, 0x6f27a, 0x6f27c, 0x74596, 0x74598, 0x7459e,
+    0x745a8, 0x745ba, 0x745cc, 0x745ee, 0x7460c, 0x74616,
+    0x74630, 0x746aa, 0x746b8, 0x7490a, 0x74914, 0x78002,
+    0x7801c, 0x78022, 0x78064, 0x7806e, 0x78088, 0x7808e,
+    0x78094, 0x7809a, 0x780ac, 0x7823e, 0x78240, 0x784c2,
+    0x784dc, 0x78aba, 0x78abc, 0x78bb2, 0x78bc0, 0x793b2,
+    0x793c0, 0x7a342, 0x7a35c, 0x7a512, 0x7a52c,
+  };
+
+  // Table generated by contrib/unicode/gen_std_format_width.py,
+  // from emoji-data.txt from the Unicode standard.
+  inline constexpr char32_t __xpicto_edges[] = {
+    0xa9, 0xaa, 0xae, 0xaf, 0x203c, 0x203d, 0x2049, 0x204a,
+    0x2122, 0x2123, 0x2139, 0x213a, 0x2194, 0x219a, 0x21a9, 0x21ab,
+    0x231a, 0x231c, 0x2328, 0x2329, 0x2388, 0x2389, 0x23cf, 0x23d0,
+    0x23e9, 0x23f4, 0x23f8, 0x23fb, 0x24c2, 0x24c3, 0x25aa, 0x25ac,
+    0x25b6, 0x25b7, 0x25c0, 0x25c1, 0x25fb, 0x25ff, 0x2600, 0x2606,
+    0x2607, 0x2613, 0x2614, 0x2686, 0x2690, 0x2706, 0x2708, 0x2713,
+    0x2714, 0x2715, 0x2716, 0x2717, 0x271d, 0x271e, 0x2721, 0x2722,
+    0x2728, 0x2729, 0x2733, 0x2735, 0x2744, 0x2745, 0x2747, 0x2748,
+    0x274c, 0x274d, 0x274e, 0x274f, 0x2753, 0x2756, 0x2757, 0x2758,
+    0x2763, 0x2768, 0x2795, 0x2798, 0x27a1, 0x27a2, 0x27b0, 0x27b1,
+    0x27bf, 0x27c0, 0x2934, 0x2936, 0x2b05, 0x2b08, 0x2b1b, 0x2b1d,
+    0x2b50, 0x2b51, 0x2b55, 0x2b56, 0x3030, 0x3031, 0x303d, 0x303e,
+    0x3297, 0x3298, 0x3299, 0x329a, 0x1f000, 0x1f100, 0x1f10d, 0x1f110,
+    0x1f12f, 0x1f130, 0x1f16c, 0x1f172, 0x1f17e, 0x1f180, 0x1f18e, 0x1f18f,
+    0x1f191, 0x1f19b, 0x1f1ad, 0x1f1e6, 0x1f201, 0x1f210, 0x1f21a, 0x1f21b,
+    0x1f22f, 0x1f230, 0x1f232, 0x1f23b, 0x1f23c, 0x1f240, 0x1f249, 0x1f3fb,
+    0x1f400, 0x1f53e, 0x1f546, 0x1f650, 0x1f680, 0x1f700, 0x1f774, 0x1f780,
+    0x1f7d5, 0x1f800, 0x1f80c, 0x1f810, 0x1f848, 0x1f850, 0x1f85a, 0x1f860,
+    0x1f888, 0x1f890, 0x1f8ae, 0x1f900, 0x1f90c, 0x1f93b, 0x1f93c, 0x1f946,
+    0x1f947, 0x1fb00, 0x1fc00, 0x1fffe,
+  };
+
+#undef _GLIBCXX_GET_UNICODE_DATA
diff --git a/libstdc++-v3/include/bits/unicode.h b/libstdc++-v3/include/bits/unicode.h
new file mode 100644
index 00000000000..66f8399fdfb
--- /dev/null
+++ b/libstdc++-v3/include/bits/unicode.h
@@ -0,0 +1,1065 @@
+// Unicode utilities -*- C++ -*-
+
+// Copyright The GNU Toolchain Authors.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file include/bits/unicode.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{format}
+ */
+
+#ifndef _GLIBCXX_UNICODE_H
+#define _GLIBCXX_UNICODE_H 1
+
+#if __cplusplus >= 202002L
+#include <array>
+#include <bit>
+#include <cstdint>
+#include <bits/stl_algo.h>
+#include <bits/stl_iterator.h>
+#include <bits/ranges_base.h>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+namespace __unicode
+{
+  // A Unicode code point that is not a high or low surrogate.
+  constexpr bool
+  __is_scalar_value(char32_t __c)
+  {
+    if (__c < 0xD800) [[likely]]
+      return true;
+    return 0xDFFF < __c && __c <= 0x10FFFF;
+  }
+
+  // A code point that can be encoded in a single code unit of type _CharT.
+  template<typename _CharT>
+    constexpr bool
+    __is_single_code_unit(char32_t __c)
+    {
+      if constexpr (__gnu_cxx::__int_traits<_CharT>::__max <= 0xFF)
+	return __c < 0x7F; // ASCII character
+      else
+	return __c < __gnu_cxx::__int_traits<_CharT>::__max
+		       && __is_scalar_value(__c);
+    }
+
+  // Based on https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2728r6.html#add-the-transcoding-iterator-template
+
+  struct _Repl
+  {
+    constexpr char32_t
+    operator()() const noexcept
+    { return 0xFFFD; }
+  };
+
+  struct _Null_sentinel_t
+  {
+    template<input_iterator _It>
+      requires default_initializable<iter_value_t<_It>>
+	&& equality_comparable_with<iter_reference_t<_It>, iter_value_t<_It>>
+      friend constexpr auto
+      operator==(_It __it, _Null_sentinel_t)
+      { return *__it == iter_value_t<_It>{}; }
+  };
+
+  inline constexpr _Null_sentinel_t __null_sentinel;
+
+  template<typename _FromFmt, typename _ToFmt,
+	   input_iterator _Iter, sentinel_for<_Iter> _Sent = _Iter,
+	   typename _ErrorHandler = _Repl>
+    requires convertible_to<iter_value_t<_Iter>, _FromFmt>
+    class _Utf_iterator
+    {
+      static_assert(forward_iterator<_Iter> || noexcept(_ErrorHandler()()));
+
+    public:
+      using value_type = _ToFmt;
+      using difference_type = iter_difference_t<_Iter>;
+      using reference = value_type;
+      using iterator_concept
+	= std::__detail::__clamp_iter_cat<__iter_category_t<_Iter>,
+					  bidirectional_iterator_tag>;
+
+      constexpr _Utf_iterator() = default;
+
+      constexpr
+      _Utf_iterator(_Iter __first, _Iter __it, _Sent __last)
+      requires bidirectional_iterator<_Iter>
+      : _M_first_and_curr{__first, __it}, _M_last(__last)
+      {
+	if (_M_curr() != _M_last)
+	  _M_read();
+	else
+	  _M_buf = {};
+      }
+
+      constexpr
+      _Utf_iterator(_Iter __it, _Sent __last)
+      requires (!bidirectional_iterator<_Iter>)
+      : _M_first_and_curr{__it}, _M_last(__last)
+      {
+	if (_M_curr() != _M_last)
+	  _M_read();
+	else
+	  _M_buf = {};
+      }
+
+      template<class _Iter2, class _Sent2>
+	requires convertible_to<_Iter2, _Iter> && convertible_to<_Sent2, _Sent>
+	constexpr
+	_Utf_iterator(const _Utf_iterator<_FromFmt, _ToFmt, _Iter2, _Sent2,
+					  _ErrorHandler>& __other)
+	: _M_buf(__other._M_buf), _M_first_and_curr(__other._M_first_and_curr),
+	  _M_buf_index(__other._M_buf_index), _M_buf_last(__other._M_buf_last),
+	  _M_last(__other._M_last)
+	{ }
+
+      [[nodiscard]]
+      constexpr _Iter
+      begin() const requires bidirectional_iterator<_Iter>
+      { return _M_first(); }
+
+      [[nodiscard]]
+      constexpr _Sent
+      end() const { return _M_last; }
+
+      [[nodiscard]]
+      constexpr _Iter
+      base() const requires forward_iterator<_Iter>
+      { return _M_curr(); }
+
+      [[nodiscard]]
+      constexpr value_type
+      operator*() const { return _M_buf[_M_buf_index]; }
+
+      constexpr _Utf_iterator&
+      operator++()
+      {
+	if (_M_buf_index + 1 == _M_buf_last && _M_curr() != _M_last)
+	  {
+	    if constexpr (forward_iterator<_Iter>)
+	      std::advance(_M_curr(), _M_to_increment);
+	    if (_M_curr() == _M_last)
+	      _M_buf_index = 0;
+	    else
+	      _M_read();
+	  }
+	else if (_M_buf_index + 1 <= _M_buf_last)
+	  ++_M_buf_index;
+	return *this;
+      }
+
+      constexpr _Utf_iterator
+      operator++(int)
+      {
+	auto __tmp = *this;
+	++*this;
+	return __tmp;
+      }
+
+      constexpr _Utf_iterator&
+      operator--() requires bidirectional_iterator<_Iter>
+      {
+	if (!_M_buf_index && _M_curr() != _M_first())
+	  _M_read_reverse();
+	else if (_M_buf_index)
+	  --_M_buf_index;
+	return *this;
+      }
+
+      constexpr _Utf_iterator
+      operator--(int)
+      {
+	auto __tmp = *this;
+	--*this;
+	return __tmp;
+      }
+
+      [[nodiscard]]
+      friend constexpr bool
+      operator==(_Utf_iterator __lhs, _Utf_iterator __rhs)
+      requires forward_iterator<_Iter> || requires (_Iter __i) { __i != __i; }
+      {
+	if constexpr (forward_iterator<_Iter>)
+	  return __lhs._M_curr() == __rhs._M_curr()
+		   && __lhs._M_buf_index == __rhs._M_buf_index;
+	else if (__lhs._M_curr() != __rhs._M_curr())
+	  return false;
+	else if (__lhs._M_buf_index == __rhs._M_buf_index
+		   && __lhs._M_buf_last == __rhs._M_buf_last)
+	  return true;
+	else
+	  return __lhs._M_buf_index == __lhs._M_buf_last
+		   && __rhs._M_buf_index == __rhs._M_buf_last;
+      }
+
+      [[nodiscard]]
+      friend constexpr bool
+      operator==(_Utf_iterator __lhs, _Sent __rhs)
+      {
+	if constexpr (forward_iterator<_Iter>)
+	  return __lhs._M_curr() == __rhs;
+	else
+	  return __lhs._M_curr() == __rhs
+		   && __lhs._M_buf_index == __lhs._M_buf_last;
+      }
+
+    private:
+      constexpr void
+      _M_read()
+      {
+	if constexpr (sizeof(_FromFmt) == sizeof(uint8_t))
+	  _M_read_utf8();
+	else if constexpr (sizeof(_FromFmt) == sizeof(uint16_t))
+	  _M_read_utf16();
+	else
+	  {
+	    static_assert(sizeof(_FromFmt) == sizeof(uint32_t));
+	    _M_read_utf32();
+	  }
+      }
+
+      constexpr void
+      _M_read_reverse(); // TODO
+
+      template<typename>
+	struct _Guard
+	{
+	  _Guard(void*, _Iter&) { }
+	};
+
+      template<typename _It> requires forward_iterator<_It>
+	struct _Guard<_It>
+	{
+	  constexpr ~_Guard() { _M_this->_M_curr() = std::move(_M_orig); }
+	  _Utf_iterator* _M_this;
+	  _It _M_orig;
+	};
+
+      constexpr void
+      _M_read_utf8()
+      {
+	_Guard<_Iter> __g{this, _M_curr()};
+	char32_t __c{};
+	uint8_t __u = *_M_curr()++;
+	const uint8_t __lo_bound = 0x80, __hi_bound = 0xBF;
+	uint8_t __to_incr = 1;
+
+	if (__u <= 0x7F) [[likely]]      // 0x00 to 0x7F
+	  __c = __u;
+	else if (__u < 0xC2) [[unlikely]]
+	  __c = _S_error();
+	else if (_M_curr() == _M_last) [[unlikely]]
+	  __c = _S_error();
+	else if (__u <= 0xDF) // 0xC2 to 0xDF
+	  {
+	    __c = __u & 0x1F;
+	    __u = *_M_curr();
+
+	    if (__u < __lo_bound || __u > __hi_bound) [[unlikely]]
+	      __c = _S_error();
+	    else
+	      {
+		__c = (__c << 6) | (__u & 0x3F);
+		++_M_curr();
+		++__to_incr;
+	      }
+	  }
+	else if (__u <= 0xEF) // 0xE0 to 0xEF
+	  {
+	    const uint8_t __lo_bound_2 = __u == 0xE0 ? 0xA0 : __lo_bound;
+	    const uint8_t __hi_bound_2 = __u == 0xED ? 0x9F : __hi_bound;
+
+	    __c = __u & 0x0F;
+	    __u = *_M_curr();
+
+	    if (__u < __lo_bound_2 || __u > __hi_bound_2) [[unlikely]]
+	      __c = _S_error();
+	    else if (++_M_curr() == _M_last) [[unlikely]]
+	      __c = _S_error();
+	    else
+	      {
+		++__to_incr;
+		__c = (__c << 6) | (__u & 0x3F);
+		__u = *_M_curr();
+
+		if (__u < __lo_bound || __u > __hi_bound) [[unlikely]]
+		  __c = _S_error();
+		else
+		  {
+		    __c = (__c << 6) | (__u & 0x3F);
+		    ++_M_curr();
+		    ++__to_incr;
+		  }
+	      }
+	  }
+	else if (__u <= 0xF4) // 0xF0 to 0xF4
+	  {
+	    const uint8_t __lo_bound_2 = __u == 0xF0 ? 0x90 : __lo_bound;
+	    const uint8_t __hi_bound_2 = __u == 0xF4 ? 0x8F : __hi_bound;
+
+	    __c = __u & 0x07;
+	    __u = *_M_curr();
+
+	    if (__u < __lo_bound_2 || __u > __hi_bound_2) [[unlikely]]
+	      __c = _S_error();
+	    else if (++_M_curr() == _M_last) [[unlikely]]
+	      __c = _S_error();
+	    else
+	      {
+		++__to_incr;
+		__c = (__c << 6) | (__u & 0x3F);
+		__u = *_M_curr();
+
+		if (__u < __lo_bound || __u > __hi_bound) [[unlikely]]
+		  __c = _S_error();
+		else if (++_M_curr() == _M_last) [[unlikely]]
+		  __c = _S_error();
+		else
+		  {
+		    ++__to_incr;
+		    __c = (__c << 6) | (__u & 0x3F);
+		    __u = *_M_curr();
+
+		    if (__u < __lo_bound || __u > __hi_bound) [[unlikely]]
+		      __c = _S_error();
+		    else
+		      {
+			__c = (__c << 6) | (__u & 0x3F);
+			++_M_curr();
+			++__to_incr;
+		      }
+		  }
+	      }
+	  }
+	else [[unlikely]]
+	  __c = _S_error();
+
+	_M_update(__c, __to_incr);
+      }
+
+      constexpr void
+      _M_read_utf16()
+      {
+	_Guard<_Iter> __g{this, _M_curr()};
+	char32_t __c{};
+	uint16_t __u = *_M_curr()++;
+	uint8_t __to_incr = 1;
+
+	if (__u < 0xD800 || __u > 0xDFFF) [[likely]]
+	  __c = __u;
+	else if (__u < 0xDC00 && _M_curr() != _M_last)
+	  {
+	    uint16_t __u2 = *_M_curr();
+	    if (__u2 < 0xDC00 || __u2 > 0xDFFF) [[unlikely]]
+	      __c = _S_error();
+	    else
+	      {
+		++_M_curr();
+		__to_incr = 2;
+		uint32_t __x = (__u & 0x3F) << 10 | __u2 & 0x3FF;
+		uint32_t __w = (__u >> 6) & 0x1F;
+		__c = (__w + 1) << 16 | __x;
+	      }
+	  }
+	else
+	  __c = _S_error();
+
+	_M_update(__c, __to_incr);
+      }
+
+      constexpr void
+      _M_read_utf32()
+      {
+	_Guard<_Iter> __g{this, _M_curr()};
+	char32_t __c = *_M_curr()++;
+	if (!__is_scalar_value(__c)) [[unlikely]]
+	  __c = _S_error();
+	_M_update(__c, 1);
+      }
+
+      // Encode the code point __c as one or more code units in _M_buf.
+      constexpr void
+      _M_update(char32_t __c, uint8_t __to_incr)
+      {
+	_M_to_increment = __to_incr;
+	_M_buf_index = 0;
+	if constexpr (sizeof(_ToFmt) == sizeof(uint32_t))
+	  {
+	    _M_buf[0] = __c;
+	    _M_buf_last = 1;
+	  }
+	else if constexpr (sizeof(_ToFmt) == sizeof(uint16_t))
+	  {
+	    if (__is_single_code_unit<_ToFmt>(__c))
+	      {
+		_M_buf[0] = __c;
+		_M_buf[1] = 0;
+		_M_buf_last = 1;
+	      }
+	    else
+	      {
+		// From http://www.unicode.org/faq/utf_bom.html#utf16-4
+		const char32_t __lead_offset = 0xD800 - (0x10000 >> 10);
+		char16_t __lead = __lead_offset + (__c >> 10);
+		char16_t __trail = 0xDC00 + (__c & 0x3FF);
+		_M_buf[0] = __lead;
+		_M_buf[1] = __trail;
+		_M_buf_last = 2;
+	      }
+	  }
+	else
+	  {
+	    static_assert(sizeof(_ToFmt) == 1);
+	    int __bits = std::bit_width((uint32_t)__c);
+	    if (__bits <= 7) [[likely]]
+	      {
+		_M_buf[0] = __c;
+		_M_buf[1] = _M_buf[2] = _M_buf[3] = 0;
+		_M_buf_last = 1;
+	      }
+	    else if (__bits <= 11)
+	      {
+		_M_buf[0] = 0xC0 | (__c >> 6);
+		_M_buf[1] = 0x80 | (__c & 0x3F);
+		_M_buf[2] = _M_buf[3] = 0;
+		_M_buf_last = 2;
+	      }
+	    else if (__bits <= 16)
+	      {
+		_M_buf[0] = 0xE0 | (__c >> 12);
+		_M_buf[1] = 0x80 | ((__c >> 6) & 0x3F);
+		_M_buf[2] = 0x80 | (__c & 0x3F);
+		_M_buf[3] = 0;
+		_M_buf_last = 3;
+	      }
+	    else
+	      {
+		_M_buf[0] = 0xF0 | ((__c >> 18) & 0x07);
+		_M_buf[1] = 0x80 | ((__c >> 12) & 0x3F);
+		_M_buf[2] = 0x80 | ((__c >> 6) & 0x3F);
+		_M_buf[3] = 0x80 | (__c & 0x3F);
+		_M_buf_last = 4;
+	      }
+	  }
+      }
+
+      constexpr char32_t
+      _S_error()
+      {
+	char32_t __c = _ErrorHandler()();
+	__glibcxx_assert(__is_scalar_value(__c));
+	return __c;
+      }
+
+      constexpr _Iter
+      _M_first() const requires bidirectional_iterator<_Iter>
+      { return _M_first_and_curr._M_first; }
+
+      constexpr _Iter&
+      _M_curr() { return _M_first_and_curr._M_curr; }
+
+      constexpr _Iter
+      _M_curr() const { return _M_first_and_curr._M_curr; }
+
+      array<value_type, 4 / sizeof(_ToFmt)> _M_buf;
+
+      template<typename _It>
+	struct _First_and_curr
+	{
+	  _First_and_curr() = default;
+
+	  constexpr
+	  _First_and_curr(_It __curr) : _M_curr(__curr) { }
+
+	  template<convertible_to<_It> _It2>
+	    constexpr
+	    _First_and_curr(const _First_and_curr<_It2>& __other)
+	    : _M_curr(__other._M_curr) { }
+
+	  _It _M_curr;
+	};
+
+      template<typename _It> requires bidirectional_iterator<_It>
+	struct _First_and_curr<_It>
+	{
+	  _First_and_curr() = default;
+
+	  constexpr
+	  _First_and_curr(_It __first, _It __curr)
+	  : _M_first(__first), _M_curr(__curr) { }
+
+	  template<convertible_to<_It> _It2>
+	    constexpr
+	    _First_and_curr(const _First_and_curr<_It2>& __other)
+	    : _M_first(__other._M_first), _M_curr(__other._M_curr) { }
+
+	  _It _M_first;
+	  _It _M_curr;
+	};
+
+      _First_and_curr<_Iter> _M_first_and_curr;
+
+      uint8_t _M_buf_index = 0;
+      uint8_t _M_buf_last = 0;
+      uint8_t _M_to_increment = 0;
+
+      [[no_unique_address]] _Sent _M_last;
+
+      template<typename _FromFmt2, typename _ToFmt2,
+	       input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
+	       typename _ErrHandler>
+	requires convertible_to<iter_value_t<_Iter2>, _FromFmt2>
+	friend class _Utf_iterator;
+    };
+
+  template<typename _ToFormat, ranges::input_range _Range>
+    class _Utf_view
+    : public ranges::view_interface<_Utf_view<_ToFormat, _Range>>
+    {
+      using _Iterator = _Utf_iterator<ranges::range_value_t<_Range>,
+				      _ToFormat, ranges::iterator_t<_Range>,
+				      ranges::sentinel_t<_Range>>;
+
+      template<typename _Iter, typename _Sent>
+	constexpr auto
+	_M_begin(_Iter __first, _Sent __last)
+	{
+	  if constexpr (bidirectional_iterator<_Iter>)
+	    return _Iterator(__first, __first, __last);
+	  else
+	    return _Iterator(__first, __last);
+	}
+
+      template<typename _Iter, typename _Sent>
+	constexpr auto
+	_M_end(_Iter __first, _Sent __last)
+	{
+	  if constexpr (!is_same_v<_Iter, _Sent>)
+	    return __last;
+	  else if constexpr (bidirectional_iterator<_Iter>)
+	    return _Iterator(__first, __last, __last);
+	  else
+	    return _Iterator(__last, __last);
+	}
+
+      _Range _M_base;
+
+    public:
+      constexpr explicit
+      _Utf_view(_Range&& __r) : _M_base(std::forward<_Range>(__r)) { }
+
+      constexpr auto begin()
+      { return _M_begin(ranges::begin(_M_base), ranges::end(_M_base)); }
+
+      constexpr auto end()
+      { return _M_end(ranges::begin(_M_base), ranges::end(_M_base)); }
+
+      constexpr bool empty() const { return ranges::empty(_M_base); }
+    };
+
+  template<typename _View>
+    using _Utf8_view = _Utf_view<char8_t, _View>;
+  template<typename _View>
+    using _Utf16_view = _Utf_view<char16_t, _View>;
+  template<typename _View>
+    using _Utf32_view = _Utf_view<char32_t, _View>;
+
+inline namespace __v15_1_0
+{
+#define _GLIBCXX_GET_UNICODE_DATA 150100
+#include "unicode-data.h"
+#ifdef _GLIBCXX_GET_UNICODE_DATA
+# error "Invalid unicode data"
+#endif
+
+  // The field width of a code point.
+  constexpr int
+  __field_width(char32_t __c) noexcept
+  {
+    if (__c < __width_edges[0]) [[likely]]
+      return 1;
+
+    auto* __p = std::upper_bound(__width_edges, std::end(__width_edges), __c);
+    return (__p - __width_edges) % 2 + 1;
+  }
+
+  constexpr _Gcb_property
+  __grapheme_cluster_break_property(char32_t __c) noexcept
+  {
+    constexpr uint32_t __mask = (1 << __gcb_shift_bits) - 1;
+    auto* __end = std::end(__gcb_edges);
+    auto* __p = std::lower_bound(__gcb_edges, __end,
+				 (__c << __gcb_shift_bits) | __mask);
+    return _Gcb_property(__p[-1] & __mask);
+  }
+
+  constexpr bool
+  __is_incb_linker(char32_t __c) noexcept
+  {
+    const auto __end = std::end(__incb_linkers);
+    // Array is small enough that linear search is faster than binary search.
+    return std::find(__incb_linkers, __end, __c) != __end;
+  }
+
+  constexpr _InCB
+  __incb_property(char32_t __c) noexcept
+  {
+    constexpr uint32_t __mask = 0x3;
+    auto* __end = std::end(__incb_edges);
+    auto* __p = std::lower_bound(__incb_edges, __end, (__c << 2) | __mask);
+    return _InCB(__p[-1] & __mask);
+  }
+
+  constexpr bool
+  __is_extended_pictographic(char32_t __c)
+  {
+    if (__c < __xpicto_edges[0]) [[likely]]
+      return 1;
+
+    auto* __p = std::upper_bound(__xpicto_edges, std::end(__xpicto_edges), __c);
+    return (__p - __xpicto_edges) % 2 + 1;
+  }
+
+  struct _Grapheme_cluster_iterator_base
+  {
+    char32_t _M_c; // First code point in the cluster.
+    _Gcb_property _M_prop; // GCB property of _M_c.
+    enum class _XPicto : unsigned char { _Init, _Zwj, _Matched, _Failed };
+    _XPicto _M_xpicto_seq_state = _XPicto::_Init;
+    unsigned char _M_RI_count = 0;
+    bool _M_incb_linker_seen = false;
+
+    constexpr void
+    _M_reset(char32_t __c, _Gcb_property __p)
+    {
+      _M_c = __c;
+      _M_prop = __p;
+      _M_xpicto_seq_state = _XPicto::_Init;
+      _M_RI_count = 0;
+      _M_incb_linker_seen = false;
+    }
+
+    constexpr void
+    _M_update_xpicto_seq_state(char32_t __c, _Gcb_property __p)
+    {
+      if (_M_xpicto_seq_state == _XPicto::_Failed)
+	return;
+
+      auto __next_state = _XPicto::_Failed;
+      if (_M_xpicto_seq_state != _XPicto::_Zwj) // i.e. Init or Matched
+	{
+	  if (__p == _Gcb_property::_Gcb_ZWJ)
+	    {
+	      if (_M_xpicto_seq_state == _XPicto::_Matched)
+		__next_state = _XPicto::_Zwj;
+	      // We check _M_c here so that we do the lookup at most once,
+	      // and only for clusters containing at least one ZWJ.
+	      else if (__is_extended_pictographic(_M_c))
+		__next_state = _XPicto::_Zwj;
+	    }
+	  else if (__p == _Gcb_property::_Gcb_Extend)
+	    __next_state = _M_xpicto_seq_state; // no change
+	}
+      else // Zwj
+	{
+	  // This assumes that all \p{Extended_Pictographic} emoji have
+	  // Grapheme_Cluster_Break=Other.
+	  if (__p == _Gcb_property::_Gcb_Other
+		&& __is_extended_pictographic(__c))
+	    __next_state = _XPicto::_Matched;
+	}
+      _M_xpicto_seq_state = __next_state;
+    }
+
+    constexpr void
+    _M_update_ri_count(_Gcb_property __p)
+    {
+      if (__p == _Gcb_property::_Gcb_Regional_Indicator)
+	++_M_RI_count;
+      else
+	_M_RI_count = 0;
+    }
+
+    constexpr void
+    _M_update_incb_state(char32_t __c, _Gcb_property)
+    {
+      if (__is_incb_linker(__c))
+	_M_incb_linker_seen = true;
+    }
+  };
+
+  // Split a range into extended grapheme clusters.
+  template<ranges::forward_range _View>
+    class _Grapheme_cluster_view
+    : public ranges::view_interface<_Grapheme_cluster_view<_View>>
+    {
+    public:
+
+      constexpr
+      _Grapheme_cluster_view(const _View& __v)
+      : _M_begin(_Utf32_view(__v).begin())
+      { }
+
+      constexpr auto begin() const { return _M_begin; }
+      constexpr auto end() const { return _M_begin.end(); }
+
+    private:
+      struct _Iterator : private _Grapheme_cluster_iterator_base
+      {
+      private:
+	// Iterator over the underlying code points.
+	using _U32_iterator = ranges::iterator_t<_Utf32_view<_View>>;
+
+      public:
+	// TODO: Change value_type to be subrange<_U32_iterator> instead?
+	// That would be the whole cluster, not just the first code point.
+	// Would need to change type of _M_start to _U32_iterator, so that
+	// operator* just does return value_type{_M_start, _M_next}.
+	// Alternatively, value_type could be _Utf32_view<iterator_t<_View>>.
+	using value_type = char32_t;
+	using iterator_concept = forward_iterator_tag;
+
+	constexpr
+	_Iterator(_U32_iterator __i)
+	: _M_start(__i.base()), _M_next(__i)
+	{
+	  if (_M_start != __i.end())
+	    {
+	      _M_c = *__i;
+	      _M_prop = __grapheme_cluster_break_property(_M_c);
+	      operator++(); // Finds the end of the first cluster.
+	    }
+	}
+
+	// The first code point of the current extended grapheme cluster.
+	constexpr value_type
+	operator*() const
+	{ return _M_c; }
+
+	constexpr auto
+	operator->() const
+	{ return &_M_c; }
+
+	// Move to the next extended grapheme cluster.
+	constexpr _Iterator&
+	operator++()
+	{
+	  const auto __end = _M_next.end();
+	  if (_M_next != __end)
+	    {
+	      auto __p_prev = _M_prop;
+	      auto __it = _M_next;
+	      while (++__it != __end)
+		{
+		  char32_t __c = *__it;
+		  auto __p = __grapheme_cluster_break_property(*__it);
+		  _M_update_xpicto_seq_state(__c, __p);
+		  _M_update_ri_count(__p);
+		  _M_update_incb_state(__c, __p);
+		  if (_M_is_break(__p_prev, __p, __it))
+		    {
+		      // Found a grapheme cluster break
+		      _M_reset(__c, __p);
+		      break;
+		    }
+		  __p_prev = __p;
+		}
+	      _M_start = _M_next.base();
+	      _M_next = __it;
+	    }
+	  else
+	    _M_start = __end;
+	  return *this;
+	}
+
+	constexpr _Iterator
+	operator++(int)
+	{
+	  auto __tmp = *this;
+	  ++this;
+	  return __tmp;
+	}
+
+	constexpr bool
+	operator==(const _Iterator& __i) const
+	{ return _M_start == __i._M_start; }
+
+	// This supports iter != iter.end()
+	constexpr bool
+	operator==(const ranges::sentinel_t<_View>& __i) const
+	{ return _M_start == __i; }
+
+	// Iterator to the start of the current cluster.
+	constexpr auto base() const { return _M_start; }
+
+	// The end of the underlying view (not the end of the current cluster!)
+	constexpr auto end() const { return _M_next.end(); }
+
+	// Field width of the first code point in the cluster.
+	constexpr int
+	width() const noexcept
+	{ return __field_width(_M_c); }
+
+      private:
+	ranges::iterator_t<_View> _M_start;
+	_U32_iterator _M_next;
+
+	// Implement the Grapheme Cluster Boundary Rules from Unicode Annex #29
+	// http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules
+	// This implements the rules from TR29 revision 43 in Unicode 15.1.0.
+	// Return true if there is a break between code point with property p1
+	// and code point with property p2.
+	constexpr bool
+	_M_is_break(_Gcb_property __p1, _Gcb_property __p2,
+		    _U32_iterator __curr) const
+	{
+	  using enum _Gcb_property;
+
+	  if (__p1 == _Gcb_Control || __p1 == _Gcb_LF)
+	    return true; // Break after Control or LF.
+
+	  if (__p1 == _Gcb_CR)
+	    return __p2 != _Gcb_LF; // Do not break between a CR and LF.
+
+	  // Rule GB5
+	  if (__p2 == _Gcb_Control || __p2 == _Gcb_CR || __p2 == _Gcb_LF)
+	    return true; // Break before Control, CR or LF.
+
+	  // Rule GB6
+	  if (__p1 == _Gcb_L)
+	    switch (__p2)
+	    {
+	      case _Gcb_L:
+	      case _Gcb_V:
+	      case _Gcb_LV:
+	      case _Gcb_LVT:
+		return false; // Do not break Hangul syllable sequences.
+	      default:
+		return true;
+	      }
+
+	  // Rule GB7
+	  if (__p1 == _Gcb_LV || __p1 == _Gcb_V)
+	    switch (__p2)
+	    {
+	      case _Gcb_V:
+	      case _Gcb_T:
+		return false; // Do not break Hangul syllable sequences.
+	      default:
+		return true;
+	      }
+
+	  // Rule GB8
+	  if (__p1 == _Gcb_LVT || __p1 == _Gcb_T)
+	    return __p2 != _Gcb_T; // Do not break Hangul syllable sequences.
+
+	  // Rule GB9
+	  if (__p2 == _Gcb_Extend || __p2 == _Gcb_ZWJ)
+	    return false; // Do not break before extending characters or ZWJ.
+
+	  // The following GB9x rules only apply to extended grapheme clusters,
+	  // which is what the C++ standard uses (not legacy grapheme clusters).
+
+	  // Rule GB9a
+	  if (__p2 == _Gcb_SpacingMark)
+	    return false; // Do not break before SpacingMarks,
+	  // Rule GB9b
+	  if (__p1 == _Gcb_Prepend)
+	    return false; // or after Prepend characters.
+
+	  // Rule GB9c (Unicode 15.1.0)
+	  // Do not break within certain combinations with
+	  // Indic_Conjunct_Break (InCB)=Linker.
+	  if (_M_incb_linker_seen
+		&& __incb_property(*_M_start) == _InCB::_Consonant
+		&& __incb_property(*__curr) == _InCB::_Consonant)
+	    {
+	      // Match [_M_start, __curr] against regular expression
+	      // Consonant ([Extend Linker]* Linker [Extend Linker]* Consonant)+
+	      bool __have_linker = false;
+	      auto __it = _M_start;
+	      while (++__it != __curr)
+		{
+		  if (__is_incb_linker(*__it))
+		    __have_linker = true;
+		  else
+		    {
+		      auto __incb = __incb_property(*__it);
+		      if (__incb == _InCB::_Consonant)
+			__have_linker = false;
+		      else if (__incb != _InCB::_Extend)
+			break;
+		    }
+		}
+	      if (__it == __curr && __have_linker)
+		return false;
+	    }
+
+	  // Rule GB11
+	  // Do not break within emoji modifier sequences
+	  // or emoji zwj sequences.
+	  if (__p1 == _Gcb_ZWJ && _M_xpicto_seq_state == _XPicto::_Matched)
+	    return false;
+
+	  // Rules GB12 and GB13
+	  // Do not break within emoji flag sequences. That is, do not break
+	  // between regional indicator (RI) symbols if there is an odd number
+	  // of RI characters before the break point.
+	  if (__p1 == _Gcb_property::_Gcb_Regional_Indicator && __p1 == __p2)
+	    return (_M_RI_count & 1) == 0;
+
+	  // Rule GB999
+	  return true; // Otherwise, break everywhere.
+	}
+      };
+
+      _Iterator _M_begin;
+    };
+
+} // namespace __v15_1_0
+
+  // Return the field width of a string.
+  template<typename _CharT>
+    constexpr size_t
+    __field_width(basic_string_view<_CharT> __s)
+    {
+      if (__s.empty()) [[unlikely]]
+	return 0;
+      _Grapheme_cluster_view __gc(__s);
+      auto __it = __gc.begin();
+      const auto __end = __gc.end();
+      size_t __n = __it.width();
+      while (++__it != __end)
+	__n += __it.width();
+      return __n;
+    }
+
+  // Truncate a string to at most `__max` field width units, and return the
+  // resulting field width.
+  template<typename _CharT>
+    constexpr size_t
+    __truncate(basic_string_view<_CharT>& __s, size_t __max)
+    {
+      if (__s.empty()) [[unlikely]]
+	return 0;
+
+      _Grapheme_cluster_view __gc(__s);
+      auto __it = __gc.begin();
+      const auto __end = __gc.end();
+      size_t __n = __it.width();
+      if (__n > __max)
+	{
+	  __s = {};
+	  return 0;
+	}
+      while (++__it != __end)
+	{
+	  size_t __n2 = __n + __it.width();
+	  if (__n2 > __max)
+	    {
+	      __s = basic_string_view<_CharT>(__s.begin(), __it.base());
+	      return __n;
+	    }
+	  __n = __n2;
+	}
+      return __n;
+    }
+
+    template<typename _CharT>
+    consteval bool
+    __literal_encoding_is_unicode()
+    {
+      if constexpr (is_same_v<_CharT, char8_t>)
+	return true;
+      else if constexpr (is_same_v<_CharT, char16_t>)
+	return true;
+      else if constexpr (is_same_v<_CharT, char32_t>)
+	  return true;
+
+      const char* __enc = "";
+
+#ifdef __GNUC_EXECUTION_CHARSET_NAME
+      auto __remove_iso10646_prefix = [](const char* __s) {
+	// GNU iconv allows "ISO-10646/" prefix (case-insensitive).
+	if (__s[0] == 'I' || __s[0] == 'i')
+	  if (__s[1] == 'S' || __s[1] == 's')
+	    if (__s[2] == 'O' || __s[2] == 'o')
+	      if (string_view(__s + 3).starts_with("-10646/"))
+		return __s + 10;
+	return __s;
+      };
+
+      if constexpr (is_same_v<_CharT, char>)
+	__enc = __remove_iso10646_prefix(__GNUC_EXECUTION_CHARSET_NAME);
+# if defined _GLIBCXX_USE_WCHAR_T && defined __GNUC_WIDE_EXECUTION_CHARSET_NAME
+      else
+	__enc = __remove_iso10646_prefix(__GNUC_WIDE_EXECUTION_CHARSET_NAME);
+# endif
+
+      if ((__enc[0] == 'U' || __enc[0] == 'u')
+	    && (__enc[1] == 'T' || __enc[1] == 't')
+	    && (__enc[2] == 'F' || __enc[2] == 'f'))
+	{
+	  __enc += 3;
+	  if (__enc[0] == '-')
+	    ++__enc;
+	  if (__enc[0] == '8')
+	    return __enc[1] == '\0' || string_view(__enc + 1) == "//";
+	  else if constexpr (!is_same_v<_CharT, char>)
+	    {
+	      string_view __s(__enc);
+	      if (__s.ends_with("//"))
+		__s.remove_suffix(2);
+	      return __s == "16" || __s == "32";
+	    }
+	}
+#elif defined __clang_literal_encoding__
+      if constexpr (is_same_v<_CharT, char>)
+	__enc = __clang_literal_encoding__;
+# if defined _GLIBCXX_USE_WCHAR_T && defined __clang_wide_literal_encoding__
+      else
+	__enc = __clang_wide_literal_encoding__;
+# endif
+      // Clang accepts "-fexec-charset=utf-8" but the macro is still uppercase.
+      string_view __s(__enc);
+      if (__s == "UTF-8")
+	return true;
+      else if constexpr (!is_same_v<_CharT, char>)
+	return __s == "UTF-16" || __s == "UTF-32";
+#endif
+
+      return false;
+    }
+
+  consteval bool
+  __literal_encoding_is_utf8()
+  { return __literal_encoding_is_unicode<char>(); }
+
+} // namespace __unicode
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace std
+#endif // C++20
+#endif // _GLIBCXX_UNICODE_H
diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index 886c7c64c14..0d9f70ee555 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -51,9 +51,11 @@
 #include <string>
 #include <variant>	       // monostate (TODO: move to bits/utility.h?)
 #include <bits/ranges_base.h>  // input_range, range_reference_t
+#include <bits/ranges_util.h>  // subrange
 #include <bits/ranges_algobase.h> // ranges::copy
 #include <bits/stl_iterator.h> // back_insert_iterator
 #include <bits/stl_pair.h>     // __is_pair
+#include <bits/unicode.h>      // __is_scalar_value, _Utf_view, etc.
 #include <bits/utility.h>      // tuple_size_v
 #include <ext/numeric_traits.h> // __int_traits
 
@@ -347,44 +349,6 @@ namespace __format
     _WP_from_arg // Use a formatting argument for width/prec.
   };
 
-  consteval bool
-  __literal_encoding_is_utf8()
-  {
-#ifdef __GNUC_EXECUTION_CHARSET_NAME
-    const char* __enc = __GNUC_EXECUTION_CHARSET_NAME;
-    // GNU iconv allows "ISO-10646/" prefix (case-insensitive).
-    if (__enc[0] == 'I' || __enc[0] == 'i')
-      {
-	if ((__enc[1] == 'S' || __enc[1] == 's')
-	      && (__enc[2] == 'O' || __enc[2] == 'o'))
-	  {
-	    __enc += 3;
-	    if (string_view(__enc).starts_with("-10646/"))
-	      __enc += 7;
-	    else
-	      return false;
-	  }
-	else
-	  return false;
-      }
-
-    if ((__enc[0] == 'U' || __enc[0] == 'u')
-	  && (__enc[1] == 'T' || __enc[1] == 't')
-	  && (__enc[2] == 'F' || __enc[2] == 'f'))
-      {
-	__enc += 3;
-	if (__enc[0] == '-')
-	  ++__enc;
-	if (__enc[0] == '8')
-	  return __enc[1] == '\0' || string_view(__enc + 1) == "//";
-      }
-#elif defined __clang_literal_encoding__
-    // Clang accepts "-fexec-charset=utf-8" but the macro is still uppercase.
-    return string_view(__clang_literal_encoding__) == "UTF-8";
-#endif
-    return false;
-  }
-
   template<typename _Context>
     size_t
     __int_from_arg(const basic_format_arg<_Context>& __arg);
@@ -408,7 +372,7 @@ namespace __format
       _Pres_type _M_type : 4;
       unsigned short _M_width;
       unsigned short _M_prec;
-      _CharT _M_fill = ' ';
+      char32_t _M_fill = ' ';
 
       using iterator = typename basic_string_view<_CharT>::iterator;
 
@@ -430,17 +394,32 @@ namespace __format
       {
 	if (*__first != '{')
 	  {
-	    // TODO: accept any UCS scalar value as fill character.
-	    // If narrow source encoding is UTF-8 then accept multibyte char.
-	    if (__last - __first >= 2)
+	    using namespace __unicode;
+	    if constexpr (__literal_encoding_is_unicode<_CharT>())
 	      {
-		if (_Align __align = _S_align(__first[1]))
+		// Accept any UCS scalar value as fill character.
+		_Utf32_view __uv(ranges::subrange(__first, __last));
+		if (!__uv.empty())
 		  {
-		    _M_fill = *__first;
-		    _M_align = __align;
-		    return __first + 2;
+		    auto __beg = __uv.begin();
+		    char32_t __c = *__beg++;
+		    if (__is_scalar_value(__c))
+		      if (auto __next = __beg.base(); __next != __last)
+			if (_Align __align = _S_align(*__next))
+			  {
+			    _M_fill = __c;
+			    _M_align = __align;
+			    return ++__next;
+			  }
 		  }
 	      }
+	    else if (__last - __first >= 2)
+	      if (_Align __align = _S_align(__first[1]))
+		{
+		  _M_fill = *__first;
+		  _M_align = __align;
+		  return __first + 2;
+		}
 
 	    if (_Align __align = _S_align(__first[0]))
 	      {
@@ -647,7 +626,7 @@ namespace __format
   template<typename _Out, typename _CharT>
     _Out
     __write_padded(_Out __out, basic_string_view<_CharT> __str,
-		   _Align __align, size_t __nfill, _CharT __fill_char)
+		   _Align __align, size_t __nfill, char32_t __fill_char)
     {
       const size_t __buflen = 0x20;
       _CharT __padding_chars[__buflen];
@@ -685,12 +664,30 @@ namespace __format
 	  __r = __nfill;
 	  __max = __r;
 	}
+
+      using namespace __unicode;
+      if constexpr (__literal_encoding_is_unicode<_CharT>())
+	if (!__is_single_code_unit<_CharT>(__fill_char)) [[unlikely]]
+	  {
+	    // Encode fill char as multiple code units of type _CharT.
+	    const char32_t __arr[1]{ __fill_char };
+	    _Utf_view<_CharT, const char32_t(&)[1]> __v(__arr);
+	    basic_string<_CharT> __padstr(__v.begin(), __v.end());
+	    __padding = __padstr;
+	    while (__l-- > 0)
+	      __out = __format::__write(std::move(__out), __padding);
+	    __out = __format::__write(std::move(__out), __str);
+	    while (__r-- > 0)
+	      __out = __format::__write(std::move(__out), __padding);
+	    return __out;
+	  }
+
       if (__max < __buflen)
 	__padding.remove_suffix(__buflen - __max);
       else
 	__max = __buflen;
-      char_traits<_CharT>::assign(__padding_chars, __max, __fill_char);
 
+      char_traits<_CharT>::assign(__padding_chars, __max, __fill_char);
       __pad(__l, __out);
       __out = __format::__write(std::move(__out), __str);
       __pad(__r, __out);
@@ -871,16 +868,21 @@ namespace __format
 		&& _M_spec._M_prec_kind == _WP_none)
 	    return __format::__write(__fc.out(), __s);
 
-	  size_t __estimated_width = __s.size(); // TODO: Unicode-aware estim.
-
-	  if (_M_spec._M_prec_kind != _WP_none)
+	  size_t __estimated_width;
+	  if constexpr (__unicode::__literal_encoding_is_unicode<_CharT>())
 	    {
-	      size_t __prec = _M_spec._M_get_precision(__fc);
-	      if (__estimated_width > __prec)
+	      if (_M_spec._M_prec_kind != _WP_none)
 		{
-		  __s = __s.substr(0, __prec); // TODO: do not split code points
-		  __estimated_width = __prec;
+		  size_t __prec = _M_spec._M_get_precision(__fc);
+		  __estimated_width = __unicode::__truncate(__s, __prec);
 		}
+	      else
+		__estimated_width = __unicode::__field_width(__s);
+	    }
+	  else
+	    {
+	      __s = __s.substr(0, _M_spec._M_get_precision(__fc));
+	      __estimated_width = __s.size();
 	    }
 
 	  return __format::__write_padded_as_spec(__s, __estimated_width,
@@ -1222,7 +1224,7 @@ namespace __format
 	  if (__width <= __str.size())
 	    return __format::__write(__fc.out(), __str);
 
-	  _CharT __fill_char = _M_spec._M_fill;
+	  char32_t __fill_char = _M_spec._M_fill;
 	  _Align __align = _M_spec._M_align;
 
 	  size_t __nfill = __width - __str.size();
@@ -1687,7 +1689,7 @@ namespace __format
 	  if (__width <= __str.size())
 	    return __format::__write(__fc.out(), __str);
 
-	  _CharT __fill_char = _M_spec._M_fill;
+	  char32_t __fill_char = _M_spec._M_fill;
 	  _Align __align = _M_spec._M_align;
 
 	  size_t __nfill = __width - __str.size();
diff --git a/libstdc++-v3/include/std/ostream b/libstdc++-v3/include/std/ostream
index a4ef92c04b2..4dff0cf645d 100644
--- a/libstdc++-v3/include/std/ostream
+++ b/libstdc++-v3/include/std/ostream
@@ -982,7 +982,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     print(ostream& __os, format_string<_Args...> __fmt, _Args&&... __args)
     {
       auto __fmtargs = std::make_format_args(std::forward<_Args>(__args)...);
-      if constexpr (__format::__literal_encoding_is_utf8())
+      if constexpr (__unicode::__literal_encoding_is_utf8())
 	std::vprint_unicode(__os, __fmt.get(), __fmtargs);
       else
 	std::vprint_nonunicode(__os, __fmt.get(), __fmtargs);
diff --git a/libstdc++-v3/include/std/print b/libstdc++-v3/include/std/print
index bb029610d70..f44256c5dca 100644
--- a/libstdc++-v3/include/std/print
+++ b/libstdc++-v3/include/std/print
@@ -104,7 +104,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     print(FILE* __stream, format_string<_Args...> __fmt, _Args&&... __args)
     {
       auto __fmtargs = std::make_format_args(std::forward<_Args>(__args)...);
-      if constexpr (__format::__literal_encoding_is_utf8())
+      if constexpr (__unicode::__literal_encoding_is_utf8())
 	std::vprint_unicode(__stream, __fmt.get(), __fmtargs);
       else
 	std::vprint_nonunicode(__stream, __fmt.get(), __fmtargs);
diff --git a/libstdc++-v3/src/c++23/print.cc b/libstdc++-v3/src/c++23/print.cc
index be9762bbfdc..aceca6f9139 100644
--- a/libstdc++-v3/src/c++23/print.cc
+++ b/libstdc++-v3/src/c++23/print.cc
@@ -162,7 +162,7 @@ namespace
 		    }
 		  continue;
 		}
-	      else if (byte < 0xC2)
+	      else if (byte < 0xC2) [[unlikely]]
 		{
 		  if constexpr (transcode)
 		    out.push_back(0xFFFD);
diff --git a/libstdc++-v3/testsuite/ext/unicode/view.cc b/libstdc++-v3/testsuite/ext/unicode/view.cc
new file mode 100644
index 00000000000..eaab5c79edc
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/unicode/view.cc
@@ -0,0 +1,102 @@
+// { dg-do run { target c++20 } }
+#include <format>
+#include <string_view>
+#include <ranges>
+#include <testsuite_hooks.h>
+
+namespace uc = std::__unicode;
+using namespace std::string_view_literals;
+
+constexpr void
+test_utf8_to_utf8()
+{
+  const std::u8string_view s8 = u8"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡";
+  uc::_Utf8_view v(s8);
+  VERIFY( std::ranges::distance(v) == s8.size() );
+  VERIFY( std::ranges::equal(v,  s8) );
+}
+
+constexpr void
+test_utf8_to_utf16()
+{
+  const std::u8string_view s8  = u8"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡";
+  const std::u16string_view s16 = u"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡";
+  uc::_Utf16_view v(s8);
+  VERIFY( std::ranges::distance(v) == s16.size() );
+  VERIFY( std::ranges::equal(v,  s16) );
+}
+
+constexpr void
+test_utf8_to_utf32()
+{
+  const auto s8 = u8"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡"sv;
+  const auto s32 = U"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡"sv;
+  uc::_Utf32_view v(s8);
+  VERIFY( std::ranges::distance(v) == s32.size() );
+  VERIFY( std::ranges::equal(v,  s32) );
+}
+
+constexpr void
+test_illformed_utf8()
+{
+  uc::_Utf32_view v("\xa3 10.99 \xee \xdd"sv);
+  VERIFY( std::ranges::equal(v, U"\uFFFD 10.99 \uFFFD \uFFFD"sv) );
+
+  uc::_Utf16_view v2(" \xf8\x80\x80\x80 "sv);
+  VERIFY( std::ranges::distance(v2) == 6 );
+  VERIFY( std::ranges::equal(v2, U" \uFFFD\uFFFD\uFFFD\uFFFD "sv) );
+
+  // Examples of U+FFFD substitution from Unicode standard.
+  uc::_Utf8_view v3("\xc0\xaf\xe0\x80\xbf\xf0\x81\x82\x41"sv); // Table 3-8
+  VERIFY( std::ranges::equal(v3, u8"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\x41"sv) );
+  uc::_Utf8_view v4("\xed\xa0\x80\xed\xbf\xbf\xed\xaf\x41"sv); // Table 3-9
+  VERIFY( std::ranges::equal(v4, u8"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\x41"sv) );
+  uc::_Utf8_view v5("\xf4\x91\x92\x93\xff\x41\x80\xbf\x42"sv); // Table 3-10
+  VERIFY( std::ranges::equal(v5, u8"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\x41\uFFFD\uFFFD\x42"sv) );
+  uc::_Utf8_view v6("\xe1\x80\xe2\xf0\x91\x92\xf1\xbf\x41"sv); // Table 3-11
+  VERIFY( std::ranges::equal(v6, u8"\uFFFD\uFFFD\uFFFD\uFFFD\x41"sv) );
+}
+
+constexpr void
+test_illformed_utf16()
+{
+  std::u16string_view s = u"\N{CLOWN FACE}";
+  std::u16string_view r = u"\uFFFD";
+  VERIFY( std::ranges::equal(uc::_Utf16_view(s.substr(0, 1)), r) );
+  VERIFY( std::ranges::equal(uc::_Utf16_view(s.substr(1, 1)), r) );
+  std::array s2{ s[0], s[0] };
+  VERIFY( std::ranges::equal(uc::_Utf16_view(s2), u"\uFFFD\uFFFD"sv) );
+  std::array s3{ s[0], s[0], s[1] };
+  VERIFY( std::ranges::equal(uc::_Utf16_view(s3), u"\uFFFD\N{CLOWN FACE}"sv) );
+  std::array s4{ s[1], s[0] };
+  VERIFY( std::ranges::equal(uc::_Utf16_view(s4), u"\uFFFD\uFFFD"sv) );
+  std::array s5{ s[1], s[0], s[1] };
+  VERIFY( std::ranges::equal(uc::_Utf16_view(s5), u"\uFFFD\N{CLOWN FACE}"sv) );
+}
+
+constexpr void
+test_illformed_utf32()
+{
+  std::u32string_view s = U"\x110000";
+  VERIFY( std::ranges::equal(uc::_Utf32_view(s), U"\uFFFD"sv) );
+  s = U"\xFFFFFF";
+  VERIFY( std::ranges::equal(uc::_Utf32_view(s), U"\uFFFD"sv) );
+  s = U"\xFFFFFFF0";
+  VERIFY( std::ranges::equal(uc::_Utf32_view(s), U"\uFFFD"sv) );
+}
+
+int main()
+{
+  auto run_tests = []{
+    test_utf8_to_utf8();
+    test_utf8_to_utf16();
+    test_utf8_to_utf32();
+    test_illformed_utf8();
+    test_illformed_utf16();
+    test_illformed_utf32();
+    return true;
+  };
+
+  VERIFY( run_tests() );
+  static_assert( run_tests() );
+}
diff --git a/libstdc++-v3/testsuite/std/format/functions/format.cc b/libstdc++-v3/testsuite/std/format/functions/format.cc
index 6bf7a126ed1..6320e20170c 100644
--- a/libstdc++-v3/testsuite/std/format/functions/format.cc
+++ b/libstdc++-v3/testsuite/std/format/functions/format.cc
@@ -1,3 +1,4 @@
+// { dg-options "-fexec-charset=UTF-8" }
 // { dg-do run { target c++20 } }
 // { dg-add-options no_pch }
 
@@ -97,6 +98,18 @@ test_std_examples()
     VERIFY(s5 == "   120");
     string s6 = format("{:6}", true);
     VERIFY(s6 == "true  ");
+    string s7 = format("{:*<6.3}", "123456");
+    VERIFY( s7 == "123***" );
+    string s8 = format("{:02}", 1234);
+    VERIFY( s8 == "1234" );
+    string s9 = format("{:*<}", "12");
+    VERIFY( s9 == "12" );
+    string sA = format("{:*<6}", "12345678");
+    VERIFY( sA == "12345678" );
+    string sB = format("{:🤡^6}", "x");
+    VERIFY( sB == "🤡🤡x🤡🤡🤡" );
+    string sC = format("{:*^6}", "🤡🤡🤡");
+    VERIFY( sC == "🤡🤡🤡" );
   }
 
   // sign
@@ -458,6 +471,59 @@ test_bool()
   VERIFY( s == "0 0x1 0X0" );
 }
 
+void
+test_unicode()
+{
+  // Similar to sC example in test_std_examples, but not from the standard.
+  // Verify that the character "🤡" has estimated field width 2,
+  // rather than estimated field width equal to strlen("🤡"), which would be 4.
+  std::string sC = std::format("{:*<3}", "🤡");
+  VERIFY( sC == "🤡*" );
+
+  // Verify that "£" has estimated field width 1, not strlen("£") == 2.
+  std::string sL = std::format("{:*<3}", "£");
+  VERIFY( sL == "£**" );
+
+  // Verify that precision is measured in field width units (column positions)
+  // not bytes. The result should contain complete Unicode characters, not be
+  // truncated in the middle of a multibyte UTF-8 sequence. The string "£" has
+  // field width 1 despite being 2 bytes, and the string "🤡" has field width 2
+  // and so cannot be formatted into a replacement field using .1 precision.
+  std::string sP = std::format("{:1.1} {:*<1.1}", "£", "🤡");
+  VERIFY( sP == "£ *" );
+  sP = std::format("{:*<2.1} {:*<2.1}", "£", "🤡");
+  VERIFY( sP == "£* **" );
+
+  // Verify field width handling for extended grapheme clusters,
+  // and that a cluster gets output as a single item, not truncated.
+  std::string sG = std::format("{:*>2.1}", "\u006f\u0302\u0323!");
+  VERIFY( sG == "*\u006f\u0302\u0323" );
+
+  // Examples from P1868R2
+  // https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1868r2.html
+  const char* inputs[][2] = {
+    {"\x41",         "    \u0041"},
+    {"\xC3\x81",     "    \u00c1"},
+    {"\x41\xCC\x81", "    \u0041\u0301"},
+    {"\xc4\xb2", "    \u0132"},
+    {"\xce\x94", "    \u0394"},
+    {"\xd0\xa9", "    \u0429"},
+    {"\xd7\x90", "    \u05D0"},
+    {"\xd8\xb4", "    \u0634"},
+    {"\xe3\x80\x89", "   \u3009"},
+    {"\xe7\x95\x8c", "   \u754C"},
+    {"\xf0\x9f\xa6\x84", "   \U0001F984"},
+    {"\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d"
+     "\xf0\x9f\x91\xa7\xe2\x80\x8d\xf0\x9f\x91\xa6",
+     "   \U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466" }
+  };
+  for (auto& input : inputs)
+  {
+    std::string sA = std::format("{:>5}", input[0]);
+    VERIFY( sA == input[1] );
+  }
+}
+
 int main()
 {
   test_no_args();
@@ -472,4 +538,5 @@ int main()
   test_p1652r1();
   test_pointer();
   test_bool();
+  test_unicode();
 }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-01-08  1:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-08  1:15 [gcc r14-6991] libstdc++: Add Unicode-aware width estimation for std::format Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).