diff --git a/scripts/unicode.py b/scripts/unicode.py index 404b242..68b7acc 100755 --- a/scripts/unicode.py +++ b/scripts/unicode.py @@ -318,7 +318,114 @@ def check_incb_derivable(grapheme_table, incb_extend, incb_linker): sys.stderr.write( "InCB=Extend: %d codepoints, all derivable from the grapheme category\n" % len(actual)) -def emit_break_module(f, break_table, break_cats, name): +def strip_grapheme_derived_ranges(grapheme_table): + """Verify and strip ranges that the generated `grapheme_category` + derives at runtime via arithmetic, alongside its ASCII fast path. + + The generated `grapheme_cat_table` omits them, + so every shortcut is checked against the parsed UCD data here. + + Returns `(filtered_table, fast_path)`, where `fast_path` is Rust source injected + at the top of the generated `grapheme_category` function. + + Each branch returns `GraphemeCategoryResult::Fast(cat)`, + telling the caller in `src/grapheme.rs` to skip its range cache. + """ + + derived = ( + (0, 0x7F), # ASCII: Control/LF/CR/Any (see grapheme_category) + (0x30A0, 0xA660), # All Any, except U+3297/U+3299 (Extended_Pictographic) + (0xAC00, 0xD7A4), # Hangul syllables, LV every 28th and LVT otherwise + (0xFE00, 0xFE10), # Variation selectors, all Extend + ) + (_, GRAPHEME_ASCII_HI) = derived[0] + (GRAPHEME_CJK_GAP_LO, GRAPHEME_CJK_GAP_HI) = derived[1] + (GRAPHEME_HANGUL_LO, GRAPHEME_HANGUL_HI) = derived[2] + (GRAPHEME_VS_LO, GRAPHEME_VS_HI) = derived[3] + + catmap = {} + for (lo, hi, cat) in grapheme_table: + for cp in range(lo, hi + 1): + catmap[cp] = cat + + def check(cond, msg): + if not cond: + raise AssertionError( + "the inline shortcuts in src/grapheme.rs are stale " + f"for Unicode {UNICODE_VERSION_NUMBER}: {msg}" + ) + + # ASCII: [0x20, 0x7E] is Any, U+000A is LF, U+000D is CR, the rest of [0x00, 0x7E] is Control. + for cp in range(GRAPHEME_ASCII_HI): + if cp == 0x0A: + want = "LF" + elif cp == 0x0D: + want = "CR" + elif 0x20 <= cp < GRAPHEME_ASCII_HI: + want = "Any" + else: + want = "Control" + got = catmap.get(cp, "Any") + check(got == want, f"U+{cp:04X} is {got}, expected {want}") + + # CJK gap: all Any except U+3297 and U+3299, which are Extended_Pictographic. + non_any = {cp for cp in range(GRAPHEME_CJK_GAP_LO, GRAPHEME_CJK_GAP_HI) + if catmap.get(cp, "Any") != "Any"} + check(non_any == {0x3297, 0x3299}, + f"expected only U+3297 and U+3299 to be non-Any in [{GRAPHEME_CJK_GAP_LO:#x}, {GRAPHEME_CJK_GAP_HI:#x})," + f"found {sorted(hex(c) for c in non_any)}") + check(all(catmap[cp] == "Extended_Pictographic" for cp in non_any), + "U+3297/U+3299 are no longer Extended_Pictographic") + + # Hangul syllables: LV at every 28th codepoint, LVT otherwise. + for cp in range(GRAPHEME_HANGUL_LO, GRAPHEME_HANGUL_HI): + want = "LV" if (cp - GRAPHEME_HANGUL_LO) % 28 == 0 else "LVT" + got = catmap.get(cp, "Any") + check(got == want, f"U+{cp:04X} is {got}, expected {want}") + + # Variation selectors: all Extend. + for cp in range(GRAPHEME_VS_LO, GRAPHEME_VS_HI): + got = catmap.get(cp, "Any") + check(got == "Extend", f"U+{cp:04X} is {got}, expected Extend") + + filtered = [(lo, hi, cat) for (lo, hi, cat) in grapheme_table + if not any(dlo <= lo and hi < dhi for (dlo, dhi) in derived)] + + omitted = sum(hi - lo + 1 for (lo, hi, _) in grapheme_table + for (dlo, dhi) in derived if dlo <= lo and hi < dhi) + sys.stderr.write( + f"grapheme: {omitted} codepoints covered by runtime-derived ranges, " + "omitted from the generated table\n") + + fast_path = """ + // ASCII: Control/LF/CR/Any — derived from the codepoint value alone. + if c < 0x%X { + if ch == '\\n' { return Fast(GC_LF); } + if ch == '\\r' { return Fast(GC_CR); } + if ch >= '\\u{20}' { return Fast(GC_Any); } + return Fast(GC_Control); + } + // CJK through Vai: all Any except U+3297/U+3299 (Extended_Pictographic). + if (0x%X..0x%X).contains(&c) { + if ch == '\\u{3297}' || ch == '\\u{3299}' { return Fast(GC_Extended_Pictographic); } + return Fast(GC_Any); + } + // Hangul syllables: LV at every 28th from 0xAC00, LVT otherwise. + if (0x%X..0x%X).contains(&c) { + return Fast(if (c - 0xAC00) %% 28 == 0 { GC_LV } else { GC_LVT }); + } + // Variation selectors: all Extend. + if (0x%X..0x%X).contains(&c) { + return Fast(GC_Extend); + } +""" % (GRAPHEME_ASCII_HI, + GRAPHEME_CJK_GAP_LO, GRAPHEME_CJK_GAP_HI, + GRAPHEME_HANGUL_LO, GRAPHEME_HANGUL_HI, + GRAPHEME_VS_LO, GRAPHEME_VS_HI) + + return filtered, fast_path + +def emit_break_module(f, break_table, break_cats, name, fast_path=""): Name = name.capitalize() f.write("""pub mod %s { use core::result::Result::{Ok, Err}; @@ -379,12 +486,41 @@ def emit_break_module(f, break_table, break_cats, name): } } } +""" % (Name, Name, Name[0])) + + f.write(""" + /// Result of [`%s_category`], distinguishing categories derived at runtime + /// (no range to cache) from those found by table lookup. + #[allow(dead_code)] + #[derive(Clone, Copy, Debug)] + pub enum %sCategoryResult { + /// Category derived from the codepoint value alone. + Fast(%sCat), + /// Category from a table lookup, with the range it covers for caching. + Table { lo: u32, hi: u32, cat: %sCat }, + } + + #[allow(dead_code)] + impl %sCategoryResult { + /// The resolved category, regardless of which path produced it. + #[inline] + pub fn cat(self) -> %sCat { + match self { + %sCategoryResult::Fast(cat) => cat, + %sCategoryResult::Table { cat, .. } => cat, + } + } + } + + pub fn %s_category(ch: char) -> %sCategoryResult { + use self::%sCategoryResult::*; - pub fn %s_category(c: char) -> (u32, u32, %sCat) { + let c = ch as u32; + %s // Perform a quick O(1) lookup in a precomputed table to determine // the slice of the range table to search in. let lookup_interval = 0x%x; - let idx = (c as u32 / lookup_interval) as usize; + let idx = (c / lookup_interval) as usize; let range = %s_cat_lookup.get(idx..(idx + 2)).map_or( // If the `idx` is outside of the precomputed table - use the slice // starting from the last covered index in the precomputed table and @@ -398,10 +534,12 @@ def emit_break_module(f, break_table, break_cats, name): // in the table slice - these bounds has to apply. let lower = idx as u32 * lookup_interval; let upper = lower + lookup_interval - 1; - bsearch_range_value_table(c, &%s_cat_table[range], lower, upper) + let (lo, hi, cat) = bsearch_range_value_table(ch, &%s_cat_table[range], lower, upper); + Table { lo, hi, cat } } -""" % (Name, Name, Name[0], name, Name, lookup_interval, name, j, len(break_table), name)) +""" % (name, Name, Name, Name, Name, Name, Name, Name, name, Name, Name, + fast_path, lookup_interval, name, j, len(break_table), name)) if len(break_table) <= 0xff: @@ -481,7 +619,9 @@ def emit_break_module(f, break_table, break_cats, name): last = chars[1] check_incb_derivable(grapheme_table, derived[("InCB", "Extend")], derived[("InCB", "Linker")]) - emit_break_module(rf, grapheme_table, list(grapheme_cats.keys()), "grapheme") + grapheme_table, grapheme_fast_path = strip_grapheme_derived_ranges(grapheme_table) + emit_break_module(rf, grapheme_table, list(grapheme_cats.keys()), "grapheme", + fast_path=grapheme_fast_path) rf.write("\n") word_cats = load_properties("auxiliary/WordBreakProperty.txt") diff --git a/src/grapheme.rs b/src/grapheme.rs index 0b39f0c..cc70617 100644 --- a/src/grapheme.rs +++ b/src/grapheme.rs @@ -346,29 +346,17 @@ impl GraphemeCursor { fn grapheme_category(&mut self, ch: char) -> GraphemeCat { use crate::tables::grapheme as gr; - use crate::tables::grapheme::GraphemeCat::*; - - if ch <= '\u{7e}' { - // Special-case optimization for ascii, except U+007F. This - // improves performance even for many primarily non-ascii texts, - // due to use of punctuation and white space characters from the - // ascii range. - if ch >= '\u{20}' { - GC_Any - } else if ch == '\n' { - GC_LF - } else if ch == '\r' { - GC_CR - } else { - GC_Control - } - } else { - // If this char isn't within the cached range, update the cache to the - // range that includes it. - if (ch as u32) < self.grapheme_cat_cache.0 || (ch as u32) > self.grapheme_cat_cache.1 { - self.grapheme_cat_cache = gr::grapheme_category(ch); + + match gr::grapheme_category(ch) { + gr::GraphemeCategoryResult::Fast(cat) => cat, + gr::GraphemeCategoryResult::Table { lo, hi, cat } => { + if (ch as u32) < self.grapheme_cat_cache.0 + || (ch as u32) > self.grapheme_cat_cache.1 + { + self.grapheme_cat_cache = (lo, hi, cat); + } + self.grapheme_cat_cache.2 } - self.grapheme_cat_cache.2 } } diff --git a/src/sentence.rs b/src/sentence.rs index 4b0729e..3876e0d 100644 --- a/src/sentence.rs +++ b/src/sentence.rs @@ -111,7 +111,7 @@ mod fwd { for next_char in ahead.chars() { //( ¬(OLetter | Upper | Lower | ParaSep | SATerm) )* Lower - match se::sentence_category(next_char).2 { + match se::sentence_category(next_char).cat() { se::SC_Lower => return true, se::SC_OLetter | se::SC_Upper @@ -189,7 +189,7 @@ mod fwd { let position_before = self.pos; let state_before = self.state.clone(); - let next_cat = se::sentence_category(next_char).2; + let next_cat = se::sentence_category(next_char).cat(); self.pos += next_char.len_utf8(); self.state = self.state.next(next_cat); diff --git a/src/tables.rs b/src/tables.rs index 645642b..9112165 100644 --- a/src/tables.rs +++ b/src/tables.rs @@ -414,16 +414,64 @@ pub mod grapheme { } } - pub fn grapheme_category(c: char) -> (u32, u32, GraphemeCat) { + /// Result of [`grapheme_category`], distinguishing categories derived at runtime + /// (no range to cache) from those found by table lookup. + #[allow(dead_code)] + #[derive(Clone, Copy, Debug)] + pub enum GraphemeCategoryResult { + /// Category derived from the codepoint value alone. + Fast(GraphemeCat), + /// Category from a table lookup, with the range it covers for caching. + Table { lo: u32, hi: u32, cat: GraphemeCat }, + } + + #[allow(dead_code)] + impl GraphemeCategoryResult { + /// The resolved category, regardless of which path produced it. + #[inline] + pub fn cat(self) -> GraphemeCat { + match self { + GraphemeCategoryResult::Fast(cat) => cat, + GraphemeCategoryResult::Table { cat, .. } => cat, + } + } + } + + pub fn grapheme_category(ch: char) -> GraphemeCategoryResult { + use self::GraphemeCategoryResult::*; + + let c = ch as u32; + + // ASCII: Control/LF/CR/Any — derived from the codepoint value alone. + if c < 0x7F { + if ch == '\n' { return Fast(GC_LF); } + if ch == '\r' { return Fast(GC_CR); } + if ch >= '\u{20}' { return Fast(GC_Any); } + return Fast(GC_Control); + } + // CJK through Vai: all Any except U+3297/U+3299 (Extended_Pictographic). + if (0x30A0..0xA660).contains(&c) { + if ch == '\u{3297}' || ch == '\u{3299}' { return Fast(GC_Extended_Pictographic); } + return Fast(GC_Any); + } + // Hangul syllables: LV at every 28th from 0xAC00, LVT otherwise. + if (0xAC00..0xD7A4).contains(&c) { + return Fast(if (c - 0xAC00) % 28 == 0 { GC_LV } else { GC_LVT }); + } + // Variation selectors: all Extend. + if (0xFE00..0xFE10).contains(&c) { + return Fast(GC_Extend); + } + // Perform a quick O(1) lookup in a precomputed table to determine // the slice of the range table to search in. let lookup_interval = 0x80; - let idx = (c as u32 / lookup_interval) as usize; + let idx = (c / lookup_interval) as usize; let range = grapheme_cat_lookup.get(idx..(idx + 2)).map_or( // If the `idx` is outside of the precomputed table - use the slice // starting from the last covered index in the precomputed table and // ending with the length of the range table. - 1612..1618, + 806..812, |r| (r[0] as usize)..((r[1] + 1) as usize) ); @@ -432,82 +480,74 @@ pub mod grapheme { // in the table slice - these bounds has to apply. let lower = idx as u32 * lookup_interval; let upper = lower + lookup_interval - 1; - bsearch_range_value_table(c, &grapheme_cat_table[range], lower, upper) + let (lo, hi, cat) = bsearch_range_value_table(ch, &grapheme_cat_table[range], lower, upper); + Table { lo, hi, cat } } const grapheme_cat_lookup: &[u16] = &[ - 0, 5, 9, 9, 9, 9, 9, 10, 10, 10, 11, 11, 16, 21, 26, 29, 32, 37, 41, 56, 75, 85, 101, 119, - 128, 141, 154, 167, 177, 181, 185, 192, 197, 214, 221, 222, 224, 224, 224, 225, 225, 225, - 225, 225, 225, 225, 225, 229, 238, 241, 243, 251, 251, 265, 267, 276, 292, 296, 304, 304, - 305, 305, 305, 305, 305, 313, 314, 316, 318, 318, 318, 320, 323, 323, 324, 324, 328, 349, - 366, 384, 388, 388, 388, 389, 389, 389, 389, 393, 393, 393, 394, 395, 396, 396, 396, 396, - 396, 399, 400, 400, 400, 400, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 404, 406, 406, 406, 413, 418, 423, 438, 451, 462, 462, 470, 479, 489, 497, - 507, 515, 525, 534, 543, 553, 561, 571, 579, 589, 598, 607, 617, 625, 635, 643, 653, 662, - 671, 681, 689, 699, 707, 717, 726, 735, 745, 753, 763, 771, 781, 790, 799, 809, 817, 827, - 835, 845, 854, 863, 873, 881, 891, 899, 909, 918, 927, 937, 945, 955, 963, 973, 982, 991, - 1001, 1009, 1019, 1027, 1037, 1046, 1055, 1065, 1073, 1083, 1091, 1101, 1110, 1119, 1129, - 1137, 1147, 1155, 1165, 1174, 1183, 1193, 1201, 1211, 1219, 1229, 1238, 1247, 1257, 1265, - 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, - 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, - 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, - 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, - 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1271, 1271, 1271, 1271, - 1271, 1271, 1273, 1274, 1274, 1276, 1276, 1276, 1276, 1277, 1277, 1278, 1279, 1279, 1279, - 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1288, 1289, 1289, 1289, - 1289, 1289, 1291, 1291, 1291, 1293, 1294, 1295, 1301, 1310, 1319, 1329, 1335, 1338, 1352, - 1368, 1375, 1386, 1386, 1394, 1400, 1405, 1411, 1411, 1415, 1415, 1429, 1435, 1446, 1451, - 1457, 1457, 1462, 1469, 1475, 1481, 1481, 1483, 1493, 1493, 1493, 1493, 1493, 1493, 1493, - 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, - 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, - 1493, 1493, 1493, 1493, 1493, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, - 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, - 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, - 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, - 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, - 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, - 1496, 1496, 1496, 1496, 1496, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, - 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1500, 1501, 1501, 1501, 1501, 1503, - 1503, 1503, 1503, 1504, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, - 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, - 1512, 1512, 1512, 1512, 1515, 1518, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, - 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1522, 1525, 1525, 1525, 1525, 1525, 1525, 1525, - 1525, 1525, 1525, 1525, 1530, 1531, 1532, 1532, 1532, 1534, 1534, 1534, 1534, 1535, 1535, - 1536, 1536, 1540, 1540, 1540, 1540, 1541, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, - 1542, 1542, 1542, 1542, 1542, 1542, 1544, 1549, 1551, 1555, 1561, 1561, 1562, 1569, 1569, - 1570, 1575, 1591, 1592, 1598, 1598, 1599, 1602, 1607, 1609, 1610, 1611, 1612, 1612, 1612, - 1612, 1612, 1612, 1612, 1612, 1612, 1612 + 0, 0, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 11, 16, 21, 24, 27, 32, 36, 51, 70, 80, 96, 114, 123, + 136, 149, 162, 172, 176, 180, 187, 192, 209, 216, 217, 219, 219, 219, 220, 220, 220, 220, + 220, 220, 220, 220, 224, 233, 236, 238, 246, 246, 260, 262, 271, 287, 291, 299, 299, 300, + 300, 300, 300, 300, 308, 309, 311, 313, 313, 313, 315, 318, 318, 319, 319, 323, 344, 361, + 379, 383, 383, 383, 384, 384, 384, 384, 388, 388, 388, 389, 390, 391, 391, 391, 391, 391, + 394, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 397, 399, 399, 399, 406, 411, 416, 431, 444, 455, 455, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 465, 465, 465, 465, 465, 465, 465, + 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, + 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, + 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, + 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 466, 466, 466, 466, 466, 466, 467, 468, + 468, 470, 470, 470, 470, 471, 471, 472, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, + 473, 473, 473, 473, 482, 483, 483, 483, 483, 483, 485, 485, 485, 487, 488, 489, 495, 504, + 513, 523, 529, 532, 546, 562, 569, 580, 580, 588, 594, 599, 605, 605, 609, 609, 623, 629, + 640, 645, 651, 651, 656, 663, 669, 675, 675, 677, 687, 687, 687, 687, 687, 687, 687, 687, + 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, + 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 690, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 693, 693, + 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 694, + 695, 695, 695, 695, 697, 697, 697, 697, 698, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 706, 706, 706, 706, 709, 712, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, + 713, 713, 713, 713, 713, 713, 716, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, + 724, 725, 726, 726, 726, 728, 728, 728, 728, 729, 729, 730, 730, 734, 734, 734, 734, 735, + 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 738, 743, 745, 749, + 755, 755, 756, 763, 763, 764, 769, 785, 786, 792, 792, 793, 796, 801, 803, 804, 805, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806 ]; const grapheme_cat_table: &[(char, char, GraphemeCat)] = &[ - ('\u{0}', '\u{9}', GC_Control), ('\u{a}', '\u{a}', GC_LF), ('\u{b}', '\u{c}', GC_Control), - ('\u{d}', '\u{d}', GC_CR), ('\u{e}', '\u{1f}', GC_Control), ('\u{7f}', '\u{9f}', - GC_Control), ('\u{a9}', '\u{a9}', GC_Extended_Pictographic), ('\u{ad}', '\u{ad}', - GC_Control), ('\u{ae}', '\u{ae}', GC_Extended_Pictographic), ('\u{300}', '\u{36f}', - GC_Extend), ('\u{483}', '\u{489}', GC_Extend), ('\u{591}', '\u{5bd}', GC_Extend), + ('\u{7f}', '\u{9f}', GC_Control), ('\u{a9}', '\u{a9}', GC_Extended_Pictographic), ('\u{ad}', + '\u{ad}', GC_Control), ('\u{ae}', '\u{ae}', GC_Extended_Pictographic), ('\u{300}', + '\u{36f}', GC_Extend), ('\u{483}', '\u{489}', GC_Extend), ('\u{591}', '\u{5bd}', GC_Extend), ('\u{5bf}', '\u{5bf}', GC_Extend), ('\u{5c1}', '\u{5c2}', GC_Extend), ('\u{5c4}', '\u{5c5}', GC_Extend), ('\u{5c7}', '\u{5c7}', GC_Extend), ('\u{600}', '\u{605}', GC_Prepend), ('\u{610}', '\u{61a}', GC_Extend), ('\u{61c}', '\u{61c}', GC_Control), ('\u{64b}', @@ -690,21 +730,20 @@ pub mod grapheme { ('\u{2cef}', '\u{2cf1}', GC_Extend), ('\u{2d7f}', '\u{2d7f}', GC_Extend), ('\u{2de0}', '\u{2dff}', GC_Extend), ('\u{302a}', '\u{302f}', GC_Extend), ('\u{3030}', '\u{3030}', GC_Extended_Pictographic), ('\u{303d}', '\u{303d}', GC_Extended_Pictographic), ('\u{3099}', - '\u{309a}', GC_Extend), ('\u{3297}', '\u{3297}', GC_Extended_Pictographic), ('\u{3299}', - '\u{3299}', GC_Extended_Pictographic), ('\u{a66f}', '\u{a672}', GC_Extend), ('\u{a674}', - '\u{a67d}', GC_Extend), ('\u{a69e}', '\u{a69f}', GC_Extend), ('\u{a6f0}', '\u{a6f1}', - GC_Extend), ('\u{a802}', '\u{a802}', GC_Extend), ('\u{a806}', '\u{a806}', GC_Extend), - ('\u{a80b}', '\u{a80b}', GC_Extend), ('\u{a823}', '\u{a824}', GC_SpacingMark), ('\u{a825}', - '\u{a826}', GC_Extend), ('\u{a827}', '\u{a827}', GC_SpacingMark), ('\u{a82c}', '\u{a82c}', - GC_Extend), ('\u{a880}', '\u{a881}', GC_SpacingMark), ('\u{a8b4}', '\u{a8c3}', - GC_SpacingMark), ('\u{a8c4}', '\u{a8c5}', GC_Extend), ('\u{a8e0}', '\u{a8f1}', GC_Extend), - ('\u{a8ff}', '\u{a8ff}', GC_Extend), ('\u{a926}', '\u{a92d}', GC_Extend), ('\u{a947}', - '\u{a951}', GC_Extend), ('\u{a952}', '\u{a952}', GC_SpacingMark), ('\u{a953}', '\u{a953}', - GC_Extend), ('\u{a960}', '\u{a97c}', GC_L), ('\u{a980}', '\u{a982}', GC_Extend), - ('\u{a983}', '\u{a983}', GC_SpacingMark), ('\u{a989}', '\u{a98b}', GC_InCB_Consonant), - ('\u{a98f}', '\u{a9b2}', GC_InCB_Consonant), ('\u{a9b3}', '\u{a9b3}', GC_Extend), - ('\u{a9b4}', '\u{a9b5}', GC_SpacingMark), ('\u{a9b6}', '\u{a9b9}', GC_Extend), ('\u{a9ba}', - '\u{a9bb}', GC_SpacingMark), ('\u{a9bc}', '\u{a9bd}', GC_Extend), ('\u{a9be}', '\u{a9bf}', + '\u{309a}', GC_Extend), ('\u{a66f}', '\u{a672}', GC_Extend), ('\u{a674}', '\u{a67d}', + GC_Extend), ('\u{a69e}', '\u{a69f}', GC_Extend), ('\u{a6f0}', '\u{a6f1}', GC_Extend), + ('\u{a802}', '\u{a802}', GC_Extend), ('\u{a806}', '\u{a806}', GC_Extend), ('\u{a80b}', + '\u{a80b}', GC_Extend), ('\u{a823}', '\u{a824}', GC_SpacingMark), ('\u{a825}', '\u{a826}', + GC_Extend), ('\u{a827}', '\u{a827}', GC_SpacingMark), ('\u{a82c}', '\u{a82c}', GC_Extend), + ('\u{a880}', '\u{a881}', GC_SpacingMark), ('\u{a8b4}', '\u{a8c3}', GC_SpacingMark), + ('\u{a8c4}', '\u{a8c5}', GC_Extend), ('\u{a8e0}', '\u{a8f1}', GC_Extend), ('\u{a8ff}', + '\u{a8ff}', GC_Extend), ('\u{a926}', '\u{a92d}', GC_Extend), ('\u{a947}', '\u{a951}', + GC_Extend), ('\u{a952}', '\u{a952}', GC_SpacingMark), ('\u{a953}', '\u{a953}', GC_Extend), + ('\u{a960}', '\u{a97c}', GC_L), ('\u{a980}', '\u{a982}', GC_Extend), ('\u{a983}', + '\u{a983}', GC_SpacingMark), ('\u{a989}', '\u{a98b}', GC_InCB_Consonant), ('\u{a98f}', + '\u{a9b2}', GC_InCB_Consonant), ('\u{a9b3}', '\u{a9b3}', GC_Extend), ('\u{a9b4}', + '\u{a9b5}', GC_SpacingMark), ('\u{a9b6}', '\u{a9b9}', GC_Extend), ('\u{a9ba}', '\u{a9bb}', + GC_SpacingMark), ('\u{a9bc}', '\u{a9bd}', GC_Extend), ('\u{a9be}', '\u{a9bf}', GC_SpacingMark), ('\u{a9c0}', '\u{a9c0}', GC_Extend), ('\u{a9e0}', '\u{a9e4}', GC_InCB_Consonant), ('\u{a9e5}', '\u{a9e5}', GC_Extend), ('\u{a9e7}', '\u{a9ef}', GC_InCB_Consonant), ('\u{a9fa}', '\u{a9fe}', GC_InCB_Consonant), ('\u{aa29}', '\u{aa2e}', @@ -722,486 +761,186 @@ pub mod grapheme { GC_InCB_Consonant), ('\u{abe3}', '\u{abe4}', GC_SpacingMark), ('\u{abe5}', '\u{abe5}', GC_Extend), ('\u{abe6}', '\u{abe7}', GC_SpacingMark), ('\u{abe8}', '\u{abe8}', GC_Extend), ('\u{abe9}', '\u{abea}', GC_SpacingMark), ('\u{abec}', '\u{abec}', GC_SpacingMark), - ('\u{abed}', '\u{abed}', GC_Extend), ('\u{ac00}', '\u{ac00}', GC_LV), ('\u{ac01}', - '\u{ac1b}', GC_LVT), ('\u{ac1c}', '\u{ac1c}', GC_LV), ('\u{ac1d}', '\u{ac37}', GC_LVT), - ('\u{ac38}', '\u{ac38}', GC_LV), ('\u{ac39}', '\u{ac53}', GC_LVT), ('\u{ac54}', '\u{ac54}', - GC_LV), ('\u{ac55}', '\u{ac6f}', GC_LVT), ('\u{ac70}', '\u{ac70}', GC_LV), ('\u{ac71}', - '\u{ac8b}', GC_LVT), ('\u{ac8c}', '\u{ac8c}', GC_LV), ('\u{ac8d}', '\u{aca7}', GC_LVT), - ('\u{aca8}', '\u{aca8}', GC_LV), ('\u{aca9}', '\u{acc3}', GC_LVT), ('\u{acc4}', '\u{acc4}', - GC_LV), ('\u{acc5}', '\u{acdf}', GC_LVT), ('\u{ace0}', '\u{ace0}', GC_LV), ('\u{ace1}', - '\u{acfb}', GC_LVT), ('\u{acfc}', '\u{acfc}', GC_LV), ('\u{acfd}', '\u{ad17}', GC_LVT), - ('\u{ad18}', '\u{ad18}', GC_LV), ('\u{ad19}', '\u{ad33}', GC_LVT), ('\u{ad34}', '\u{ad34}', - GC_LV), ('\u{ad35}', '\u{ad4f}', GC_LVT), ('\u{ad50}', '\u{ad50}', GC_LV), ('\u{ad51}', - '\u{ad6b}', GC_LVT), ('\u{ad6c}', '\u{ad6c}', GC_LV), ('\u{ad6d}', '\u{ad87}', GC_LVT), - ('\u{ad88}', '\u{ad88}', GC_LV), ('\u{ad89}', '\u{ada3}', GC_LVT), ('\u{ada4}', '\u{ada4}', - GC_LV), ('\u{ada5}', '\u{adbf}', GC_LVT), ('\u{adc0}', '\u{adc0}', GC_LV), ('\u{adc1}', - '\u{addb}', GC_LVT), ('\u{addc}', '\u{addc}', GC_LV), ('\u{addd}', '\u{adf7}', GC_LVT), - ('\u{adf8}', '\u{adf8}', GC_LV), ('\u{adf9}', '\u{ae13}', GC_LVT), ('\u{ae14}', '\u{ae14}', - GC_LV), ('\u{ae15}', '\u{ae2f}', GC_LVT), ('\u{ae30}', '\u{ae30}', GC_LV), ('\u{ae31}', - '\u{ae4b}', GC_LVT), ('\u{ae4c}', '\u{ae4c}', GC_LV), ('\u{ae4d}', '\u{ae67}', GC_LVT), - ('\u{ae68}', '\u{ae68}', GC_LV), ('\u{ae69}', '\u{ae83}', GC_LVT), ('\u{ae84}', '\u{ae84}', - GC_LV), ('\u{ae85}', '\u{ae9f}', GC_LVT), ('\u{aea0}', '\u{aea0}', GC_LV), ('\u{aea1}', - '\u{aebb}', GC_LVT), ('\u{aebc}', '\u{aebc}', GC_LV), ('\u{aebd}', '\u{aed7}', GC_LVT), - ('\u{aed8}', '\u{aed8}', GC_LV), ('\u{aed9}', '\u{aef3}', GC_LVT), ('\u{aef4}', '\u{aef4}', - GC_LV), ('\u{aef5}', '\u{af0f}', GC_LVT), ('\u{af10}', '\u{af10}', GC_LV), ('\u{af11}', - '\u{af2b}', GC_LVT), ('\u{af2c}', '\u{af2c}', GC_LV), ('\u{af2d}', '\u{af47}', GC_LVT), - ('\u{af48}', '\u{af48}', GC_LV), ('\u{af49}', '\u{af63}', GC_LVT), ('\u{af64}', '\u{af64}', - GC_LV), ('\u{af65}', '\u{af7f}', GC_LVT), ('\u{af80}', '\u{af80}', GC_LV), ('\u{af81}', - '\u{af9b}', GC_LVT), ('\u{af9c}', '\u{af9c}', GC_LV), ('\u{af9d}', '\u{afb7}', GC_LVT), - ('\u{afb8}', '\u{afb8}', GC_LV), ('\u{afb9}', '\u{afd3}', GC_LVT), ('\u{afd4}', '\u{afd4}', - GC_LV), ('\u{afd5}', '\u{afef}', GC_LVT), ('\u{aff0}', '\u{aff0}', GC_LV), ('\u{aff1}', - '\u{b00b}', GC_LVT), ('\u{b00c}', '\u{b00c}', GC_LV), ('\u{b00d}', '\u{b027}', GC_LVT), - ('\u{b028}', '\u{b028}', GC_LV), ('\u{b029}', '\u{b043}', GC_LVT), ('\u{b044}', '\u{b044}', - GC_LV), ('\u{b045}', '\u{b05f}', GC_LVT), ('\u{b060}', '\u{b060}', GC_LV), ('\u{b061}', - '\u{b07b}', GC_LVT), ('\u{b07c}', '\u{b07c}', GC_LV), ('\u{b07d}', '\u{b097}', GC_LVT), - ('\u{b098}', '\u{b098}', GC_LV), ('\u{b099}', '\u{b0b3}', GC_LVT), ('\u{b0b4}', '\u{b0b4}', - GC_LV), ('\u{b0b5}', '\u{b0cf}', GC_LVT), ('\u{b0d0}', '\u{b0d0}', GC_LV), ('\u{b0d1}', - '\u{b0eb}', GC_LVT), ('\u{b0ec}', '\u{b0ec}', GC_LV), ('\u{b0ed}', '\u{b107}', GC_LVT), - ('\u{b108}', '\u{b108}', GC_LV), ('\u{b109}', '\u{b123}', GC_LVT), ('\u{b124}', '\u{b124}', - GC_LV), ('\u{b125}', '\u{b13f}', GC_LVT), ('\u{b140}', '\u{b140}', GC_LV), ('\u{b141}', - '\u{b15b}', GC_LVT), ('\u{b15c}', '\u{b15c}', GC_LV), ('\u{b15d}', '\u{b177}', GC_LVT), - ('\u{b178}', '\u{b178}', GC_LV), ('\u{b179}', '\u{b193}', GC_LVT), ('\u{b194}', '\u{b194}', - GC_LV), ('\u{b195}', '\u{b1af}', GC_LVT), ('\u{b1b0}', '\u{b1b0}', GC_LV), ('\u{b1b1}', - '\u{b1cb}', GC_LVT), ('\u{b1cc}', '\u{b1cc}', GC_LV), ('\u{b1cd}', '\u{b1e7}', GC_LVT), - ('\u{b1e8}', '\u{b1e8}', GC_LV), ('\u{b1e9}', '\u{b203}', GC_LVT), ('\u{b204}', '\u{b204}', - GC_LV), ('\u{b205}', '\u{b21f}', GC_LVT), ('\u{b220}', '\u{b220}', GC_LV), ('\u{b221}', - '\u{b23b}', GC_LVT), ('\u{b23c}', '\u{b23c}', GC_LV), ('\u{b23d}', '\u{b257}', GC_LVT), - ('\u{b258}', '\u{b258}', GC_LV), ('\u{b259}', '\u{b273}', GC_LVT), ('\u{b274}', '\u{b274}', - GC_LV), ('\u{b275}', '\u{b28f}', GC_LVT), ('\u{b290}', '\u{b290}', GC_LV), ('\u{b291}', - '\u{b2ab}', GC_LVT), ('\u{b2ac}', '\u{b2ac}', GC_LV), ('\u{b2ad}', '\u{b2c7}', GC_LVT), - ('\u{b2c8}', '\u{b2c8}', GC_LV), ('\u{b2c9}', '\u{b2e3}', GC_LVT), ('\u{b2e4}', '\u{b2e4}', - GC_LV), ('\u{b2e5}', '\u{b2ff}', GC_LVT), ('\u{b300}', '\u{b300}', GC_LV), ('\u{b301}', - '\u{b31b}', GC_LVT), ('\u{b31c}', '\u{b31c}', GC_LV), ('\u{b31d}', '\u{b337}', GC_LVT), - ('\u{b338}', '\u{b338}', GC_LV), ('\u{b339}', '\u{b353}', GC_LVT), ('\u{b354}', '\u{b354}', - GC_LV), ('\u{b355}', '\u{b36f}', GC_LVT), ('\u{b370}', '\u{b370}', GC_LV), ('\u{b371}', - '\u{b38b}', GC_LVT), ('\u{b38c}', '\u{b38c}', GC_LV), ('\u{b38d}', '\u{b3a7}', GC_LVT), - ('\u{b3a8}', '\u{b3a8}', GC_LV), ('\u{b3a9}', '\u{b3c3}', GC_LVT), ('\u{b3c4}', '\u{b3c4}', - GC_LV), ('\u{b3c5}', '\u{b3df}', GC_LVT), ('\u{b3e0}', '\u{b3e0}', GC_LV), ('\u{b3e1}', - '\u{b3fb}', GC_LVT), ('\u{b3fc}', '\u{b3fc}', GC_LV), ('\u{b3fd}', '\u{b417}', GC_LVT), - ('\u{b418}', '\u{b418}', GC_LV), ('\u{b419}', '\u{b433}', GC_LVT), ('\u{b434}', '\u{b434}', - GC_LV), ('\u{b435}', '\u{b44f}', GC_LVT), ('\u{b450}', '\u{b450}', GC_LV), ('\u{b451}', - '\u{b46b}', GC_LVT), ('\u{b46c}', '\u{b46c}', GC_LV), ('\u{b46d}', '\u{b487}', GC_LVT), - ('\u{b488}', '\u{b488}', GC_LV), ('\u{b489}', '\u{b4a3}', GC_LVT), ('\u{b4a4}', '\u{b4a4}', - GC_LV), ('\u{b4a5}', '\u{b4bf}', GC_LVT), ('\u{b4c0}', '\u{b4c0}', GC_LV), ('\u{b4c1}', - '\u{b4db}', GC_LVT), ('\u{b4dc}', '\u{b4dc}', GC_LV), ('\u{b4dd}', '\u{b4f7}', GC_LVT), - ('\u{b4f8}', '\u{b4f8}', GC_LV), ('\u{b4f9}', '\u{b513}', GC_LVT), ('\u{b514}', '\u{b514}', - GC_LV), ('\u{b515}', '\u{b52f}', GC_LVT), ('\u{b530}', '\u{b530}', GC_LV), ('\u{b531}', - '\u{b54b}', GC_LVT), ('\u{b54c}', '\u{b54c}', GC_LV), ('\u{b54d}', '\u{b567}', GC_LVT), - ('\u{b568}', '\u{b568}', GC_LV), ('\u{b569}', '\u{b583}', GC_LVT), ('\u{b584}', '\u{b584}', - GC_LV), ('\u{b585}', '\u{b59f}', GC_LVT), ('\u{b5a0}', '\u{b5a0}', GC_LV), ('\u{b5a1}', - '\u{b5bb}', GC_LVT), ('\u{b5bc}', '\u{b5bc}', GC_LV), ('\u{b5bd}', '\u{b5d7}', GC_LVT), - ('\u{b5d8}', '\u{b5d8}', GC_LV), ('\u{b5d9}', '\u{b5f3}', GC_LVT), ('\u{b5f4}', '\u{b5f4}', - GC_LV), ('\u{b5f5}', '\u{b60f}', GC_LVT), ('\u{b610}', '\u{b610}', GC_LV), ('\u{b611}', - '\u{b62b}', GC_LVT), ('\u{b62c}', '\u{b62c}', GC_LV), ('\u{b62d}', '\u{b647}', GC_LVT), - ('\u{b648}', '\u{b648}', GC_LV), ('\u{b649}', '\u{b663}', GC_LVT), ('\u{b664}', '\u{b664}', - GC_LV), ('\u{b665}', '\u{b67f}', GC_LVT), ('\u{b680}', '\u{b680}', GC_LV), ('\u{b681}', - '\u{b69b}', GC_LVT), ('\u{b69c}', '\u{b69c}', GC_LV), ('\u{b69d}', '\u{b6b7}', GC_LVT), - ('\u{b6b8}', '\u{b6b8}', GC_LV), ('\u{b6b9}', '\u{b6d3}', GC_LVT), ('\u{b6d4}', '\u{b6d4}', - GC_LV), ('\u{b6d5}', '\u{b6ef}', GC_LVT), ('\u{b6f0}', '\u{b6f0}', GC_LV), ('\u{b6f1}', - '\u{b70b}', GC_LVT), ('\u{b70c}', '\u{b70c}', GC_LV), ('\u{b70d}', '\u{b727}', GC_LVT), - ('\u{b728}', '\u{b728}', GC_LV), ('\u{b729}', '\u{b743}', GC_LVT), ('\u{b744}', '\u{b744}', - GC_LV), ('\u{b745}', '\u{b75f}', GC_LVT), ('\u{b760}', '\u{b760}', GC_LV), ('\u{b761}', - '\u{b77b}', GC_LVT), ('\u{b77c}', '\u{b77c}', GC_LV), ('\u{b77d}', '\u{b797}', GC_LVT), - ('\u{b798}', '\u{b798}', GC_LV), ('\u{b799}', '\u{b7b3}', GC_LVT), ('\u{b7b4}', '\u{b7b4}', - GC_LV), ('\u{b7b5}', '\u{b7cf}', GC_LVT), ('\u{b7d0}', '\u{b7d0}', GC_LV), ('\u{b7d1}', - '\u{b7eb}', GC_LVT), ('\u{b7ec}', '\u{b7ec}', GC_LV), ('\u{b7ed}', '\u{b807}', GC_LVT), - ('\u{b808}', '\u{b808}', GC_LV), ('\u{b809}', '\u{b823}', GC_LVT), ('\u{b824}', '\u{b824}', - GC_LV), ('\u{b825}', '\u{b83f}', GC_LVT), ('\u{b840}', '\u{b840}', GC_LV), ('\u{b841}', - '\u{b85b}', GC_LVT), ('\u{b85c}', '\u{b85c}', GC_LV), ('\u{b85d}', '\u{b877}', GC_LVT), - ('\u{b878}', '\u{b878}', GC_LV), ('\u{b879}', '\u{b893}', GC_LVT), ('\u{b894}', '\u{b894}', - GC_LV), ('\u{b895}', '\u{b8af}', GC_LVT), ('\u{b8b0}', '\u{b8b0}', GC_LV), ('\u{b8b1}', - '\u{b8cb}', GC_LVT), ('\u{b8cc}', '\u{b8cc}', GC_LV), ('\u{b8cd}', '\u{b8e7}', GC_LVT), - ('\u{b8e8}', '\u{b8e8}', GC_LV), ('\u{b8e9}', '\u{b903}', GC_LVT), ('\u{b904}', '\u{b904}', - GC_LV), ('\u{b905}', '\u{b91f}', GC_LVT), ('\u{b920}', '\u{b920}', GC_LV), ('\u{b921}', - '\u{b93b}', GC_LVT), ('\u{b93c}', '\u{b93c}', GC_LV), ('\u{b93d}', '\u{b957}', GC_LVT), - ('\u{b958}', '\u{b958}', GC_LV), ('\u{b959}', '\u{b973}', GC_LVT), ('\u{b974}', '\u{b974}', - GC_LV), ('\u{b975}', '\u{b98f}', GC_LVT), ('\u{b990}', '\u{b990}', GC_LV), ('\u{b991}', - '\u{b9ab}', GC_LVT), ('\u{b9ac}', '\u{b9ac}', GC_LV), ('\u{b9ad}', '\u{b9c7}', GC_LVT), - ('\u{b9c8}', '\u{b9c8}', GC_LV), ('\u{b9c9}', '\u{b9e3}', GC_LVT), ('\u{b9e4}', '\u{b9e4}', - GC_LV), ('\u{b9e5}', '\u{b9ff}', GC_LVT), ('\u{ba00}', '\u{ba00}', GC_LV), ('\u{ba01}', - '\u{ba1b}', GC_LVT), ('\u{ba1c}', '\u{ba1c}', GC_LV), ('\u{ba1d}', '\u{ba37}', GC_LVT), - ('\u{ba38}', '\u{ba38}', GC_LV), ('\u{ba39}', '\u{ba53}', GC_LVT), ('\u{ba54}', '\u{ba54}', - GC_LV), ('\u{ba55}', '\u{ba6f}', GC_LVT), ('\u{ba70}', '\u{ba70}', GC_LV), ('\u{ba71}', - '\u{ba8b}', GC_LVT), ('\u{ba8c}', '\u{ba8c}', GC_LV), ('\u{ba8d}', '\u{baa7}', GC_LVT), - ('\u{baa8}', '\u{baa8}', GC_LV), ('\u{baa9}', '\u{bac3}', GC_LVT), ('\u{bac4}', '\u{bac4}', - GC_LV), ('\u{bac5}', '\u{badf}', GC_LVT), ('\u{bae0}', '\u{bae0}', GC_LV), ('\u{bae1}', - '\u{bafb}', GC_LVT), ('\u{bafc}', '\u{bafc}', GC_LV), ('\u{bafd}', '\u{bb17}', GC_LVT), - ('\u{bb18}', '\u{bb18}', GC_LV), ('\u{bb19}', '\u{bb33}', GC_LVT), ('\u{bb34}', '\u{bb34}', - GC_LV), ('\u{bb35}', '\u{bb4f}', GC_LVT), ('\u{bb50}', '\u{bb50}', GC_LV), ('\u{bb51}', - '\u{bb6b}', GC_LVT), ('\u{bb6c}', '\u{bb6c}', GC_LV), ('\u{bb6d}', '\u{bb87}', GC_LVT), - ('\u{bb88}', '\u{bb88}', GC_LV), ('\u{bb89}', '\u{bba3}', GC_LVT), ('\u{bba4}', '\u{bba4}', - GC_LV), ('\u{bba5}', '\u{bbbf}', GC_LVT), ('\u{bbc0}', '\u{bbc0}', GC_LV), ('\u{bbc1}', - '\u{bbdb}', GC_LVT), ('\u{bbdc}', '\u{bbdc}', GC_LV), ('\u{bbdd}', '\u{bbf7}', GC_LVT), - ('\u{bbf8}', '\u{bbf8}', GC_LV), ('\u{bbf9}', '\u{bc13}', GC_LVT), ('\u{bc14}', '\u{bc14}', - GC_LV), ('\u{bc15}', '\u{bc2f}', GC_LVT), ('\u{bc30}', '\u{bc30}', GC_LV), ('\u{bc31}', - '\u{bc4b}', GC_LVT), ('\u{bc4c}', '\u{bc4c}', GC_LV), ('\u{bc4d}', '\u{bc67}', GC_LVT), - ('\u{bc68}', '\u{bc68}', GC_LV), ('\u{bc69}', '\u{bc83}', GC_LVT), ('\u{bc84}', '\u{bc84}', - GC_LV), ('\u{bc85}', '\u{bc9f}', GC_LVT), ('\u{bca0}', '\u{bca0}', GC_LV), ('\u{bca1}', - '\u{bcbb}', GC_LVT), ('\u{bcbc}', '\u{bcbc}', GC_LV), ('\u{bcbd}', '\u{bcd7}', GC_LVT), - ('\u{bcd8}', '\u{bcd8}', GC_LV), ('\u{bcd9}', '\u{bcf3}', GC_LVT), ('\u{bcf4}', '\u{bcf4}', - GC_LV), ('\u{bcf5}', '\u{bd0f}', GC_LVT), ('\u{bd10}', '\u{bd10}', GC_LV), ('\u{bd11}', - '\u{bd2b}', GC_LVT), ('\u{bd2c}', '\u{bd2c}', GC_LV), ('\u{bd2d}', '\u{bd47}', GC_LVT), - ('\u{bd48}', '\u{bd48}', GC_LV), ('\u{bd49}', '\u{bd63}', GC_LVT), ('\u{bd64}', '\u{bd64}', - GC_LV), ('\u{bd65}', '\u{bd7f}', GC_LVT), ('\u{bd80}', '\u{bd80}', GC_LV), ('\u{bd81}', - '\u{bd9b}', GC_LVT), ('\u{bd9c}', '\u{bd9c}', GC_LV), ('\u{bd9d}', '\u{bdb7}', GC_LVT), - ('\u{bdb8}', '\u{bdb8}', GC_LV), ('\u{bdb9}', '\u{bdd3}', GC_LVT), ('\u{bdd4}', '\u{bdd4}', - GC_LV), ('\u{bdd5}', '\u{bdef}', GC_LVT), ('\u{bdf0}', '\u{bdf0}', GC_LV), ('\u{bdf1}', - '\u{be0b}', GC_LVT), ('\u{be0c}', '\u{be0c}', GC_LV), ('\u{be0d}', '\u{be27}', GC_LVT), - ('\u{be28}', '\u{be28}', GC_LV), ('\u{be29}', '\u{be43}', GC_LVT), ('\u{be44}', '\u{be44}', - GC_LV), ('\u{be45}', '\u{be5f}', GC_LVT), ('\u{be60}', '\u{be60}', GC_LV), ('\u{be61}', - '\u{be7b}', GC_LVT), ('\u{be7c}', '\u{be7c}', GC_LV), ('\u{be7d}', '\u{be97}', GC_LVT), - ('\u{be98}', '\u{be98}', GC_LV), ('\u{be99}', '\u{beb3}', GC_LVT), ('\u{beb4}', '\u{beb4}', - GC_LV), ('\u{beb5}', '\u{becf}', GC_LVT), ('\u{bed0}', '\u{bed0}', GC_LV), ('\u{bed1}', - '\u{beeb}', GC_LVT), ('\u{beec}', '\u{beec}', GC_LV), ('\u{beed}', '\u{bf07}', GC_LVT), - ('\u{bf08}', '\u{bf08}', GC_LV), ('\u{bf09}', '\u{bf23}', GC_LVT), ('\u{bf24}', '\u{bf24}', - GC_LV), ('\u{bf25}', '\u{bf3f}', GC_LVT), ('\u{bf40}', '\u{bf40}', GC_LV), ('\u{bf41}', - '\u{bf5b}', GC_LVT), ('\u{bf5c}', '\u{bf5c}', GC_LV), ('\u{bf5d}', '\u{bf77}', GC_LVT), - ('\u{bf78}', '\u{bf78}', GC_LV), ('\u{bf79}', '\u{bf93}', GC_LVT), ('\u{bf94}', '\u{bf94}', - GC_LV), ('\u{bf95}', '\u{bfaf}', GC_LVT), ('\u{bfb0}', '\u{bfb0}', GC_LV), ('\u{bfb1}', - '\u{bfcb}', GC_LVT), ('\u{bfcc}', '\u{bfcc}', GC_LV), ('\u{bfcd}', '\u{bfe7}', GC_LVT), - ('\u{bfe8}', '\u{bfe8}', GC_LV), ('\u{bfe9}', '\u{c003}', GC_LVT), ('\u{c004}', '\u{c004}', - GC_LV), ('\u{c005}', '\u{c01f}', GC_LVT), ('\u{c020}', '\u{c020}', GC_LV), ('\u{c021}', - '\u{c03b}', GC_LVT), ('\u{c03c}', '\u{c03c}', GC_LV), ('\u{c03d}', '\u{c057}', GC_LVT), - ('\u{c058}', '\u{c058}', GC_LV), ('\u{c059}', '\u{c073}', GC_LVT), ('\u{c074}', '\u{c074}', - GC_LV), ('\u{c075}', '\u{c08f}', GC_LVT), ('\u{c090}', '\u{c090}', GC_LV), ('\u{c091}', - '\u{c0ab}', GC_LVT), ('\u{c0ac}', '\u{c0ac}', GC_LV), ('\u{c0ad}', '\u{c0c7}', GC_LVT), - ('\u{c0c8}', '\u{c0c8}', GC_LV), ('\u{c0c9}', '\u{c0e3}', GC_LVT), ('\u{c0e4}', '\u{c0e4}', - GC_LV), ('\u{c0e5}', '\u{c0ff}', GC_LVT), ('\u{c100}', '\u{c100}', GC_LV), ('\u{c101}', - '\u{c11b}', GC_LVT), ('\u{c11c}', '\u{c11c}', GC_LV), ('\u{c11d}', '\u{c137}', GC_LVT), - ('\u{c138}', '\u{c138}', GC_LV), ('\u{c139}', '\u{c153}', GC_LVT), ('\u{c154}', '\u{c154}', - GC_LV), ('\u{c155}', '\u{c16f}', GC_LVT), ('\u{c170}', '\u{c170}', GC_LV), ('\u{c171}', - '\u{c18b}', GC_LVT), ('\u{c18c}', '\u{c18c}', GC_LV), ('\u{c18d}', '\u{c1a7}', GC_LVT), - ('\u{c1a8}', '\u{c1a8}', GC_LV), ('\u{c1a9}', '\u{c1c3}', GC_LVT), ('\u{c1c4}', '\u{c1c4}', - GC_LV), ('\u{c1c5}', '\u{c1df}', GC_LVT), ('\u{c1e0}', '\u{c1e0}', GC_LV), ('\u{c1e1}', - '\u{c1fb}', GC_LVT), ('\u{c1fc}', '\u{c1fc}', GC_LV), ('\u{c1fd}', '\u{c217}', GC_LVT), - ('\u{c218}', '\u{c218}', GC_LV), ('\u{c219}', '\u{c233}', GC_LVT), ('\u{c234}', '\u{c234}', - GC_LV), ('\u{c235}', '\u{c24f}', GC_LVT), ('\u{c250}', '\u{c250}', GC_LV), ('\u{c251}', - '\u{c26b}', GC_LVT), ('\u{c26c}', '\u{c26c}', GC_LV), ('\u{c26d}', '\u{c287}', GC_LVT), - ('\u{c288}', '\u{c288}', GC_LV), ('\u{c289}', '\u{c2a3}', GC_LVT), ('\u{c2a4}', '\u{c2a4}', - GC_LV), ('\u{c2a5}', '\u{c2bf}', GC_LVT), ('\u{c2c0}', '\u{c2c0}', GC_LV), ('\u{c2c1}', - '\u{c2db}', GC_LVT), ('\u{c2dc}', '\u{c2dc}', GC_LV), ('\u{c2dd}', '\u{c2f7}', GC_LVT), - ('\u{c2f8}', '\u{c2f8}', GC_LV), ('\u{c2f9}', '\u{c313}', GC_LVT), ('\u{c314}', '\u{c314}', - GC_LV), ('\u{c315}', '\u{c32f}', GC_LVT), ('\u{c330}', '\u{c330}', GC_LV), ('\u{c331}', - '\u{c34b}', GC_LVT), ('\u{c34c}', '\u{c34c}', GC_LV), ('\u{c34d}', '\u{c367}', GC_LVT), - ('\u{c368}', '\u{c368}', GC_LV), ('\u{c369}', '\u{c383}', GC_LVT), ('\u{c384}', '\u{c384}', - GC_LV), ('\u{c385}', '\u{c39f}', GC_LVT), ('\u{c3a0}', '\u{c3a0}', GC_LV), ('\u{c3a1}', - '\u{c3bb}', GC_LVT), ('\u{c3bc}', '\u{c3bc}', GC_LV), ('\u{c3bd}', '\u{c3d7}', GC_LVT), - ('\u{c3d8}', '\u{c3d8}', GC_LV), ('\u{c3d9}', '\u{c3f3}', GC_LVT), ('\u{c3f4}', '\u{c3f4}', - GC_LV), ('\u{c3f5}', '\u{c40f}', GC_LVT), ('\u{c410}', '\u{c410}', GC_LV), ('\u{c411}', - '\u{c42b}', GC_LVT), ('\u{c42c}', '\u{c42c}', GC_LV), ('\u{c42d}', '\u{c447}', GC_LVT), - ('\u{c448}', '\u{c448}', GC_LV), ('\u{c449}', '\u{c463}', GC_LVT), ('\u{c464}', '\u{c464}', - GC_LV), ('\u{c465}', '\u{c47f}', GC_LVT), ('\u{c480}', '\u{c480}', GC_LV), ('\u{c481}', - '\u{c49b}', GC_LVT), ('\u{c49c}', '\u{c49c}', GC_LV), ('\u{c49d}', '\u{c4b7}', GC_LVT), - ('\u{c4b8}', '\u{c4b8}', GC_LV), ('\u{c4b9}', '\u{c4d3}', GC_LVT), ('\u{c4d4}', '\u{c4d4}', - GC_LV), ('\u{c4d5}', '\u{c4ef}', GC_LVT), ('\u{c4f0}', '\u{c4f0}', GC_LV), ('\u{c4f1}', - '\u{c50b}', GC_LVT), ('\u{c50c}', '\u{c50c}', GC_LV), ('\u{c50d}', '\u{c527}', GC_LVT), - ('\u{c528}', '\u{c528}', GC_LV), ('\u{c529}', '\u{c543}', GC_LVT), ('\u{c544}', '\u{c544}', - GC_LV), ('\u{c545}', '\u{c55f}', GC_LVT), ('\u{c560}', '\u{c560}', GC_LV), ('\u{c561}', - '\u{c57b}', GC_LVT), ('\u{c57c}', '\u{c57c}', GC_LV), ('\u{c57d}', '\u{c597}', GC_LVT), - ('\u{c598}', '\u{c598}', GC_LV), ('\u{c599}', '\u{c5b3}', GC_LVT), ('\u{c5b4}', '\u{c5b4}', - GC_LV), ('\u{c5b5}', '\u{c5cf}', GC_LVT), ('\u{c5d0}', '\u{c5d0}', GC_LV), ('\u{c5d1}', - '\u{c5eb}', GC_LVT), ('\u{c5ec}', '\u{c5ec}', GC_LV), ('\u{c5ed}', '\u{c607}', GC_LVT), - ('\u{c608}', '\u{c608}', GC_LV), ('\u{c609}', '\u{c623}', GC_LVT), ('\u{c624}', '\u{c624}', - GC_LV), ('\u{c625}', '\u{c63f}', GC_LVT), ('\u{c640}', '\u{c640}', GC_LV), ('\u{c641}', - '\u{c65b}', GC_LVT), ('\u{c65c}', '\u{c65c}', GC_LV), ('\u{c65d}', '\u{c677}', GC_LVT), - ('\u{c678}', '\u{c678}', GC_LV), ('\u{c679}', '\u{c693}', GC_LVT), ('\u{c694}', '\u{c694}', - GC_LV), ('\u{c695}', '\u{c6af}', GC_LVT), ('\u{c6b0}', '\u{c6b0}', GC_LV), ('\u{c6b1}', - '\u{c6cb}', GC_LVT), ('\u{c6cc}', '\u{c6cc}', GC_LV), ('\u{c6cd}', '\u{c6e7}', GC_LVT), - ('\u{c6e8}', '\u{c6e8}', GC_LV), ('\u{c6e9}', '\u{c703}', GC_LVT), ('\u{c704}', '\u{c704}', - GC_LV), ('\u{c705}', '\u{c71f}', GC_LVT), ('\u{c720}', '\u{c720}', GC_LV), ('\u{c721}', - '\u{c73b}', GC_LVT), ('\u{c73c}', '\u{c73c}', GC_LV), ('\u{c73d}', '\u{c757}', GC_LVT), - ('\u{c758}', '\u{c758}', GC_LV), ('\u{c759}', '\u{c773}', GC_LVT), ('\u{c774}', '\u{c774}', - GC_LV), ('\u{c775}', '\u{c78f}', GC_LVT), ('\u{c790}', '\u{c790}', GC_LV), ('\u{c791}', - '\u{c7ab}', GC_LVT), ('\u{c7ac}', '\u{c7ac}', GC_LV), ('\u{c7ad}', '\u{c7c7}', GC_LVT), - ('\u{c7c8}', '\u{c7c8}', GC_LV), ('\u{c7c9}', '\u{c7e3}', GC_LVT), ('\u{c7e4}', '\u{c7e4}', - GC_LV), ('\u{c7e5}', '\u{c7ff}', GC_LVT), ('\u{c800}', '\u{c800}', GC_LV), ('\u{c801}', - '\u{c81b}', GC_LVT), ('\u{c81c}', '\u{c81c}', GC_LV), ('\u{c81d}', '\u{c837}', GC_LVT), - ('\u{c838}', '\u{c838}', GC_LV), ('\u{c839}', '\u{c853}', GC_LVT), ('\u{c854}', '\u{c854}', - GC_LV), ('\u{c855}', '\u{c86f}', GC_LVT), ('\u{c870}', '\u{c870}', GC_LV), ('\u{c871}', - '\u{c88b}', GC_LVT), ('\u{c88c}', '\u{c88c}', GC_LV), ('\u{c88d}', '\u{c8a7}', GC_LVT), - ('\u{c8a8}', '\u{c8a8}', GC_LV), ('\u{c8a9}', '\u{c8c3}', GC_LVT), ('\u{c8c4}', '\u{c8c4}', - GC_LV), ('\u{c8c5}', '\u{c8df}', GC_LVT), ('\u{c8e0}', '\u{c8e0}', GC_LV), ('\u{c8e1}', - '\u{c8fb}', GC_LVT), ('\u{c8fc}', '\u{c8fc}', GC_LV), ('\u{c8fd}', '\u{c917}', GC_LVT), - ('\u{c918}', '\u{c918}', GC_LV), ('\u{c919}', '\u{c933}', GC_LVT), ('\u{c934}', '\u{c934}', - GC_LV), ('\u{c935}', '\u{c94f}', GC_LVT), ('\u{c950}', '\u{c950}', GC_LV), ('\u{c951}', - '\u{c96b}', GC_LVT), ('\u{c96c}', '\u{c96c}', GC_LV), ('\u{c96d}', '\u{c987}', GC_LVT), - ('\u{c988}', '\u{c988}', GC_LV), ('\u{c989}', '\u{c9a3}', GC_LVT), ('\u{c9a4}', '\u{c9a4}', - GC_LV), ('\u{c9a5}', '\u{c9bf}', GC_LVT), ('\u{c9c0}', '\u{c9c0}', GC_LV), ('\u{c9c1}', - '\u{c9db}', GC_LVT), ('\u{c9dc}', '\u{c9dc}', GC_LV), ('\u{c9dd}', '\u{c9f7}', GC_LVT), - ('\u{c9f8}', '\u{c9f8}', GC_LV), ('\u{c9f9}', '\u{ca13}', GC_LVT), ('\u{ca14}', '\u{ca14}', - GC_LV), ('\u{ca15}', '\u{ca2f}', GC_LVT), ('\u{ca30}', '\u{ca30}', GC_LV), ('\u{ca31}', - '\u{ca4b}', GC_LVT), ('\u{ca4c}', '\u{ca4c}', GC_LV), ('\u{ca4d}', '\u{ca67}', GC_LVT), - ('\u{ca68}', '\u{ca68}', GC_LV), ('\u{ca69}', '\u{ca83}', GC_LVT), ('\u{ca84}', '\u{ca84}', - GC_LV), ('\u{ca85}', '\u{ca9f}', GC_LVT), ('\u{caa0}', '\u{caa0}', GC_LV), ('\u{caa1}', - '\u{cabb}', GC_LVT), ('\u{cabc}', '\u{cabc}', GC_LV), ('\u{cabd}', '\u{cad7}', GC_LVT), - ('\u{cad8}', '\u{cad8}', GC_LV), ('\u{cad9}', '\u{caf3}', GC_LVT), ('\u{caf4}', '\u{caf4}', - GC_LV), ('\u{caf5}', '\u{cb0f}', GC_LVT), ('\u{cb10}', '\u{cb10}', GC_LV), ('\u{cb11}', - '\u{cb2b}', GC_LVT), ('\u{cb2c}', '\u{cb2c}', GC_LV), ('\u{cb2d}', '\u{cb47}', GC_LVT), - ('\u{cb48}', '\u{cb48}', GC_LV), ('\u{cb49}', '\u{cb63}', GC_LVT), ('\u{cb64}', '\u{cb64}', - GC_LV), ('\u{cb65}', '\u{cb7f}', GC_LVT), ('\u{cb80}', '\u{cb80}', GC_LV), ('\u{cb81}', - '\u{cb9b}', GC_LVT), ('\u{cb9c}', '\u{cb9c}', GC_LV), ('\u{cb9d}', '\u{cbb7}', GC_LVT), - ('\u{cbb8}', '\u{cbb8}', GC_LV), ('\u{cbb9}', '\u{cbd3}', GC_LVT), ('\u{cbd4}', '\u{cbd4}', - GC_LV), ('\u{cbd5}', '\u{cbef}', GC_LVT), ('\u{cbf0}', '\u{cbf0}', GC_LV), ('\u{cbf1}', - '\u{cc0b}', GC_LVT), ('\u{cc0c}', '\u{cc0c}', GC_LV), ('\u{cc0d}', '\u{cc27}', GC_LVT), - ('\u{cc28}', '\u{cc28}', GC_LV), ('\u{cc29}', '\u{cc43}', GC_LVT), ('\u{cc44}', '\u{cc44}', - GC_LV), ('\u{cc45}', '\u{cc5f}', GC_LVT), ('\u{cc60}', '\u{cc60}', GC_LV), ('\u{cc61}', - '\u{cc7b}', GC_LVT), ('\u{cc7c}', '\u{cc7c}', GC_LV), ('\u{cc7d}', '\u{cc97}', GC_LVT), - ('\u{cc98}', '\u{cc98}', GC_LV), ('\u{cc99}', '\u{ccb3}', GC_LVT), ('\u{ccb4}', '\u{ccb4}', - GC_LV), ('\u{ccb5}', '\u{cccf}', GC_LVT), ('\u{ccd0}', '\u{ccd0}', GC_LV), ('\u{ccd1}', - '\u{cceb}', GC_LVT), ('\u{ccec}', '\u{ccec}', GC_LV), ('\u{cced}', '\u{cd07}', GC_LVT), - ('\u{cd08}', '\u{cd08}', GC_LV), ('\u{cd09}', '\u{cd23}', GC_LVT), ('\u{cd24}', '\u{cd24}', - GC_LV), ('\u{cd25}', '\u{cd3f}', GC_LVT), ('\u{cd40}', '\u{cd40}', GC_LV), ('\u{cd41}', - '\u{cd5b}', GC_LVT), ('\u{cd5c}', '\u{cd5c}', GC_LV), ('\u{cd5d}', '\u{cd77}', GC_LVT), - ('\u{cd78}', '\u{cd78}', GC_LV), ('\u{cd79}', '\u{cd93}', GC_LVT), ('\u{cd94}', '\u{cd94}', - GC_LV), ('\u{cd95}', '\u{cdaf}', GC_LVT), ('\u{cdb0}', '\u{cdb0}', GC_LV), ('\u{cdb1}', - '\u{cdcb}', GC_LVT), ('\u{cdcc}', '\u{cdcc}', GC_LV), ('\u{cdcd}', '\u{cde7}', GC_LVT), - ('\u{cde8}', '\u{cde8}', GC_LV), ('\u{cde9}', '\u{ce03}', GC_LVT), ('\u{ce04}', '\u{ce04}', - GC_LV), ('\u{ce05}', '\u{ce1f}', GC_LVT), ('\u{ce20}', '\u{ce20}', GC_LV), ('\u{ce21}', - '\u{ce3b}', GC_LVT), ('\u{ce3c}', '\u{ce3c}', GC_LV), ('\u{ce3d}', '\u{ce57}', GC_LVT), - ('\u{ce58}', '\u{ce58}', GC_LV), ('\u{ce59}', '\u{ce73}', GC_LVT), ('\u{ce74}', '\u{ce74}', - GC_LV), ('\u{ce75}', '\u{ce8f}', GC_LVT), ('\u{ce90}', '\u{ce90}', GC_LV), ('\u{ce91}', - '\u{ceab}', GC_LVT), ('\u{ceac}', '\u{ceac}', GC_LV), ('\u{cead}', '\u{cec7}', GC_LVT), - ('\u{cec8}', '\u{cec8}', GC_LV), ('\u{cec9}', '\u{cee3}', GC_LVT), ('\u{cee4}', '\u{cee4}', - GC_LV), ('\u{cee5}', '\u{ceff}', GC_LVT), ('\u{cf00}', '\u{cf00}', GC_LV), ('\u{cf01}', - '\u{cf1b}', GC_LVT), ('\u{cf1c}', '\u{cf1c}', GC_LV), ('\u{cf1d}', '\u{cf37}', GC_LVT), - ('\u{cf38}', '\u{cf38}', GC_LV), ('\u{cf39}', '\u{cf53}', GC_LVT), ('\u{cf54}', '\u{cf54}', - GC_LV), ('\u{cf55}', '\u{cf6f}', GC_LVT), ('\u{cf70}', '\u{cf70}', GC_LV), ('\u{cf71}', - '\u{cf8b}', GC_LVT), ('\u{cf8c}', '\u{cf8c}', GC_LV), ('\u{cf8d}', '\u{cfa7}', GC_LVT), - ('\u{cfa8}', '\u{cfa8}', GC_LV), ('\u{cfa9}', '\u{cfc3}', GC_LVT), ('\u{cfc4}', '\u{cfc4}', - GC_LV), ('\u{cfc5}', '\u{cfdf}', GC_LVT), ('\u{cfe0}', '\u{cfe0}', GC_LV), ('\u{cfe1}', - '\u{cffb}', GC_LVT), ('\u{cffc}', '\u{cffc}', GC_LV), ('\u{cffd}', '\u{d017}', GC_LVT), - ('\u{d018}', '\u{d018}', GC_LV), ('\u{d019}', '\u{d033}', GC_LVT), ('\u{d034}', '\u{d034}', - GC_LV), ('\u{d035}', '\u{d04f}', GC_LVT), ('\u{d050}', '\u{d050}', GC_LV), ('\u{d051}', - '\u{d06b}', GC_LVT), ('\u{d06c}', '\u{d06c}', GC_LV), ('\u{d06d}', '\u{d087}', GC_LVT), - ('\u{d088}', '\u{d088}', GC_LV), ('\u{d089}', '\u{d0a3}', GC_LVT), ('\u{d0a4}', '\u{d0a4}', - GC_LV), ('\u{d0a5}', '\u{d0bf}', GC_LVT), ('\u{d0c0}', '\u{d0c0}', GC_LV), ('\u{d0c1}', - '\u{d0db}', GC_LVT), ('\u{d0dc}', '\u{d0dc}', GC_LV), ('\u{d0dd}', '\u{d0f7}', GC_LVT), - ('\u{d0f8}', '\u{d0f8}', GC_LV), ('\u{d0f9}', '\u{d113}', GC_LVT), ('\u{d114}', '\u{d114}', - GC_LV), ('\u{d115}', '\u{d12f}', GC_LVT), ('\u{d130}', '\u{d130}', GC_LV), ('\u{d131}', - '\u{d14b}', GC_LVT), ('\u{d14c}', '\u{d14c}', GC_LV), ('\u{d14d}', '\u{d167}', GC_LVT), - ('\u{d168}', '\u{d168}', GC_LV), ('\u{d169}', '\u{d183}', GC_LVT), ('\u{d184}', '\u{d184}', - GC_LV), ('\u{d185}', '\u{d19f}', GC_LVT), ('\u{d1a0}', '\u{d1a0}', GC_LV), ('\u{d1a1}', - '\u{d1bb}', GC_LVT), ('\u{d1bc}', '\u{d1bc}', GC_LV), ('\u{d1bd}', '\u{d1d7}', GC_LVT), - ('\u{d1d8}', '\u{d1d8}', GC_LV), ('\u{d1d9}', '\u{d1f3}', GC_LVT), ('\u{d1f4}', '\u{d1f4}', - GC_LV), ('\u{d1f5}', '\u{d20f}', GC_LVT), ('\u{d210}', '\u{d210}', GC_LV), ('\u{d211}', - '\u{d22b}', GC_LVT), ('\u{d22c}', '\u{d22c}', GC_LV), ('\u{d22d}', '\u{d247}', GC_LVT), - ('\u{d248}', '\u{d248}', GC_LV), ('\u{d249}', '\u{d263}', GC_LVT), ('\u{d264}', '\u{d264}', - GC_LV), ('\u{d265}', '\u{d27f}', GC_LVT), ('\u{d280}', '\u{d280}', GC_LV), ('\u{d281}', - '\u{d29b}', GC_LVT), ('\u{d29c}', '\u{d29c}', GC_LV), ('\u{d29d}', '\u{d2b7}', GC_LVT), - ('\u{d2b8}', '\u{d2b8}', GC_LV), ('\u{d2b9}', '\u{d2d3}', GC_LVT), ('\u{d2d4}', '\u{d2d4}', - GC_LV), ('\u{d2d5}', '\u{d2ef}', GC_LVT), ('\u{d2f0}', '\u{d2f0}', GC_LV), ('\u{d2f1}', - '\u{d30b}', GC_LVT), ('\u{d30c}', '\u{d30c}', GC_LV), ('\u{d30d}', '\u{d327}', GC_LVT), - ('\u{d328}', '\u{d328}', GC_LV), ('\u{d329}', '\u{d343}', GC_LVT), ('\u{d344}', '\u{d344}', - GC_LV), ('\u{d345}', '\u{d35f}', GC_LVT), ('\u{d360}', '\u{d360}', GC_LV), ('\u{d361}', - '\u{d37b}', GC_LVT), ('\u{d37c}', '\u{d37c}', GC_LV), ('\u{d37d}', '\u{d397}', GC_LVT), - ('\u{d398}', '\u{d398}', GC_LV), ('\u{d399}', '\u{d3b3}', GC_LVT), ('\u{d3b4}', '\u{d3b4}', - GC_LV), ('\u{d3b5}', '\u{d3cf}', GC_LVT), ('\u{d3d0}', '\u{d3d0}', GC_LV), ('\u{d3d1}', - '\u{d3eb}', GC_LVT), ('\u{d3ec}', '\u{d3ec}', GC_LV), ('\u{d3ed}', '\u{d407}', GC_LVT), - ('\u{d408}', '\u{d408}', GC_LV), ('\u{d409}', '\u{d423}', GC_LVT), ('\u{d424}', '\u{d424}', - GC_LV), ('\u{d425}', '\u{d43f}', GC_LVT), ('\u{d440}', '\u{d440}', GC_LV), ('\u{d441}', - '\u{d45b}', GC_LVT), ('\u{d45c}', '\u{d45c}', GC_LV), ('\u{d45d}', '\u{d477}', GC_LVT), - ('\u{d478}', '\u{d478}', GC_LV), ('\u{d479}', '\u{d493}', GC_LVT), ('\u{d494}', '\u{d494}', - GC_LV), ('\u{d495}', '\u{d4af}', GC_LVT), ('\u{d4b0}', '\u{d4b0}', GC_LV), ('\u{d4b1}', - '\u{d4cb}', GC_LVT), ('\u{d4cc}', '\u{d4cc}', GC_LV), ('\u{d4cd}', '\u{d4e7}', GC_LVT), - ('\u{d4e8}', '\u{d4e8}', GC_LV), ('\u{d4e9}', '\u{d503}', GC_LVT), ('\u{d504}', '\u{d504}', - GC_LV), ('\u{d505}', '\u{d51f}', GC_LVT), ('\u{d520}', '\u{d520}', GC_LV), ('\u{d521}', - '\u{d53b}', GC_LVT), ('\u{d53c}', '\u{d53c}', GC_LV), ('\u{d53d}', '\u{d557}', GC_LVT), - ('\u{d558}', '\u{d558}', GC_LV), ('\u{d559}', '\u{d573}', GC_LVT), ('\u{d574}', '\u{d574}', - GC_LV), ('\u{d575}', '\u{d58f}', GC_LVT), ('\u{d590}', '\u{d590}', GC_LV), ('\u{d591}', - '\u{d5ab}', GC_LVT), ('\u{d5ac}', '\u{d5ac}', GC_LV), ('\u{d5ad}', '\u{d5c7}', GC_LVT), - ('\u{d5c8}', '\u{d5c8}', GC_LV), ('\u{d5c9}', '\u{d5e3}', GC_LVT), ('\u{d5e4}', '\u{d5e4}', - GC_LV), ('\u{d5e5}', '\u{d5ff}', GC_LVT), ('\u{d600}', '\u{d600}', GC_LV), ('\u{d601}', - '\u{d61b}', GC_LVT), ('\u{d61c}', '\u{d61c}', GC_LV), ('\u{d61d}', '\u{d637}', GC_LVT), - ('\u{d638}', '\u{d638}', GC_LV), ('\u{d639}', '\u{d653}', GC_LVT), ('\u{d654}', '\u{d654}', - GC_LV), ('\u{d655}', '\u{d66f}', GC_LVT), ('\u{d670}', '\u{d670}', GC_LV), ('\u{d671}', - '\u{d68b}', GC_LVT), ('\u{d68c}', '\u{d68c}', GC_LV), ('\u{d68d}', '\u{d6a7}', GC_LVT), - ('\u{d6a8}', '\u{d6a8}', GC_LV), ('\u{d6a9}', '\u{d6c3}', GC_LVT), ('\u{d6c4}', '\u{d6c4}', - GC_LV), ('\u{d6c5}', '\u{d6df}', GC_LVT), ('\u{d6e0}', '\u{d6e0}', GC_LV), ('\u{d6e1}', - '\u{d6fb}', GC_LVT), ('\u{d6fc}', '\u{d6fc}', GC_LV), ('\u{d6fd}', '\u{d717}', GC_LVT), - ('\u{d718}', '\u{d718}', GC_LV), ('\u{d719}', '\u{d733}', GC_LVT), ('\u{d734}', '\u{d734}', - GC_LV), ('\u{d735}', '\u{d74f}', GC_LVT), ('\u{d750}', '\u{d750}', GC_LV), ('\u{d751}', - '\u{d76b}', GC_LVT), ('\u{d76c}', '\u{d76c}', GC_LV), ('\u{d76d}', '\u{d787}', GC_LVT), - ('\u{d788}', '\u{d788}', GC_LV), ('\u{d789}', '\u{d7a3}', GC_LVT), ('\u{d7b0}', '\u{d7c6}', - GC_V), ('\u{d7cb}', '\u{d7fb}', GC_T), ('\u{fb1e}', '\u{fb1e}', GC_Extend), ('\u{fe00}', - '\u{fe0f}', GC_Extend), ('\u{fe20}', '\u{fe2f}', GC_Extend), ('\u{feff}', '\u{feff}', - GC_Control), ('\u{ff9e}', '\u{ff9f}', GC_Extend), ('\u{fff0}', '\u{fffb}', GC_Control), - ('\u{101fd}', '\u{101fd}', GC_Extend), ('\u{102e0}', '\u{102e0}', GC_Extend), ('\u{10376}', - '\u{1037a}', GC_Extend), ('\u{10a00}', '\u{10a00}', GC_InCB_Consonant), ('\u{10a01}', - '\u{10a03}', GC_Extend), ('\u{10a05}', '\u{10a06}', GC_Extend), ('\u{10a0c}', '\u{10a0f}', - GC_Extend), ('\u{10a10}', '\u{10a13}', GC_InCB_Consonant), ('\u{10a15}', '\u{10a17}', - GC_InCB_Consonant), ('\u{10a19}', '\u{10a35}', GC_InCB_Consonant), ('\u{10a38}', - '\u{10a3a}', GC_Extend), ('\u{10a3f}', '\u{10a3f}', GC_Extend), ('\u{10ae5}', '\u{10ae6}', - GC_Extend), ('\u{10d24}', '\u{10d27}', GC_Extend), ('\u{10d69}', '\u{10d6d}', GC_Extend), - ('\u{10eab}', '\u{10eac}', GC_Extend), ('\u{10efa}', '\u{10eff}', GC_Extend), ('\u{10f46}', - '\u{10f50}', GC_Extend), ('\u{10f82}', '\u{10f85}', GC_Extend), ('\u{11000}', '\u{11000}', - GC_SpacingMark), ('\u{11001}', '\u{11001}', GC_Extend), ('\u{11002}', '\u{11002}', - GC_SpacingMark), ('\u{11038}', '\u{11046}', GC_Extend), ('\u{11070}', '\u{11070}', - GC_Extend), ('\u{11073}', '\u{11074}', GC_Extend), ('\u{1107f}', '\u{11081}', GC_Extend), - ('\u{11082}', '\u{11082}', GC_SpacingMark), ('\u{110b0}', '\u{110b2}', GC_SpacingMark), - ('\u{110b3}', '\u{110b6}', GC_Extend), ('\u{110b7}', '\u{110b8}', GC_SpacingMark), - ('\u{110b9}', '\u{110ba}', GC_Extend), ('\u{110bd}', '\u{110bd}', GC_Prepend), ('\u{110c2}', - '\u{110c2}', GC_Extend), ('\u{110cd}', '\u{110cd}', GC_Prepend), ('\u{11100}', '\u{11102}', - GC_Extend), ('\u{11103}', '\u{11126}', GC_InCB_Consonant), ('\u{11127}', '\u{1112b}', - GC_Extend), ('\u{1112c}', '\u{1112c}', GC_SpacingMark), ('\u{1112d}', '\u{11134}', - GC_Extend), ('\u{11144}', '\u{11144}', GC_InCB_Consonant), ('\u{11145}', '\u{11146}', - GC_SpacingMark), ('\u{11147}', '\u{11147}', GC_InCB_Consonant), ('\u{11173}', '\u{11173}', - GC_Extend), ('\u{11180}', '\u{11181}', GC_Extend), ('\u{11182}', '\u{11182}', - GC_SpacingMark), ('\u{111b3}', '\u{111b5}', GC_SpacingMark), ('\u{111b6}', '\u{111be}', - GC_Extend), ('\u{111bf}', '\u{111bf}', GC_SpacingMark), ('\u{111c0}', '\u{111c0}', - GC_Extend), ('\u{111c2}', '\u{111c3}', GC_Prepend), ('\u{111c9}', '\u{111cc}', GC_Extend), - ('\u{111ce}', '\u{111ce}', GC_SpacingMark), ('\u{111cf}', '\u{111cf}', GC_Extend), - ('\u{1122c}', '\u{1122e}', GC_SpacingMark), ('\u{1122f}', '\u{11231}', GC_Extend), - ('\u{11232}', '\u{11233}', GC_SpacingMark), ('\u{11234}', '\u{11237}', GC_Extend), - ('\u{1123e}', '\u{1123e}', GC_Extend), ('\u{11241}', '\u{11241}', GC_Extend), ('\u{112df}', - '\u{112df}', GC_Extend), ('\u{112e0}', '\u{112e2}', GC_SpacingMark), ('\u{112e3}', - '\u{112ea}', GC_Extend), ('\u{11300}', '\u{11301}', GC_Extend), ('\u{11302}', '\u{11303}', - GC_SpacingMark), ('\u{1133b}', '\u{1133c}', GC_Extend), ('\u{1133e}', '\u{1133e}', - GC_Extend), ('\u{1133f}', '\u{1133f}', GC_SpacingMark), ('\u{11340}', '\u{11340}', - GC_Extend), ('\u{11341}', '\u{11344}', GC_SpacingMark), ('\u{11347}', '\u{11348}', - GC_SpacingMark), ('\u{1134b}', '\u{1134c}', GC_SpacingMark), ('\u{1134d}', '\u{1134d}', - GC_Extend), ('\u{11357}', '\u{11357}', GC_Extend), ('\u{11362}', '\u{11363}', - GC_SpacingMark), ('\u{11366}', '\u{1136c}', GC_Extend), ('\u{11370}', '\u{11374}', - GC_Extend), ('\u{11380}', '\u{11389}', GC_InCB_Consonant), ('\u{1138b}', '\u{1138b}', - GC_InCB_Consonant), ('\u{1138e}', '\u{1138e}', GC_InCB_Consonant), ('\u{11390}', - '\u{113b5}', GC_InCB_Consonant), ('\u{113b8}', '\u{113b8}', GC_Extend), ('\u{113b9}', - '\u{113ba}', GC_SpacingMark), ('\u{113bb}', '\u{113c0}', GC_Extend), ('\u{113c2}', - '\u{113c2}', GC_Extend), ('\u{113c5}', '\u{113c5}', GC_Extend), ('\u{113c7}', '\u{113c9}', - GC_Extend), ('\u{113ca}', '\u{113ca}', GC_SpacingMark), ('\u{113cc}', '\u{113cd}', - GC_SpacingMark), ('\u{113ce}', '\u{113d0}', GC_Extend), ('\u{113d1}', '\u{113d1}', - GC_Prepend), ('\u{113d2}', '\u{113d2}', GC_Extend), ('\u{113e1}', '\u{113e2}', GC_Extend), - ('\u{11435}', '\u{11437}', GC_SpacingMark), ('\u{11438}', '\u{1143f}', GC_Extend), - ('\u{11440}', '\u{11441}', GC_SpacingMark), ('\u{11442}', '\u{11444}', GC_Extend), - ('\u{11445}', '\u{11445}', GC_SpacingMark), ('\u{11446}', '\u{11446}', GC_Extend), - ('\u{1145e}', '\u{1145e}', GC_Extend), ('\u{114b0}', '\u{114b0}', GC_Extend), ('\u{114b1}', - '\u{114b2}', GC_SpacingMark), ('\u{114b3}', '\u{114b8}', GC_Extend), ('\u{114b9}', - '\u{114b9}', GC_SpacingMark), ('\u{114ba}', '\u{114ba}', GC_Extend), ('\u{114bb}', - '\u{114bc}', GC_SpacingMark), ('\u{114bd}', '\u{114bd}', GC_Extend), ('\u{114be}', - '\u{114be}', GC_SpacingMark), ('\u{114bf}', '\u{114c0}', GC_Extend), ('\u{114c1}', - '\u{114c1}', GC_SpacingMark), ('\u{114c2}', '\u{114c3}', GC_Extend), ('\u{115af}', - '\u{115af}', GC_Extend), ('\u{115b0}', '\u{115b1}', GC_SpacingMark), ('\u{115b2}', - '\u{115b5}', GC_Extend), ('\u{115b8}', '\u{115bb}', GC_SpacingMark), ('\u{115bc}', - '\u{115bd}', GC_Extend), ('\u{115be}', '\u{115be}', GC_SpacingMark), ('\u{115bf}', - '\u{115c0}', GC_Extend), ('\u{115dc}', '\u{115dd}', GC_Extend), ('\u{11630}', '\u{11632}', - GC_SpacingMark), ('\u{11633}', '\u{1163a}', GC_Extend), ('\u{1163b}', '\u{1163c}', - GC_SpacingMark), ('\u{1163d}', '\u{1163d}', GC_Extend), ('\u{1163e}', '\u{1163e}', - GC_SpacingMark), ('\u{1163f}', '\u{11640}', GC_Extend), ('\u{116ab}', '\u{116ab}', - GC_Extend), ('\u{116ac}', '\u{116ac}', GC_SpacingMark), ('\u{116ad}', '\u{116ad}', - GC_Extend), ('\u{116ae}', '\u{116af}', GC_SpacingMark), ('\u{116b0}', '\u{116b7}', - GC_Extend), ('\u{1171d}', '\u{1171d}', GC_Extend), ('\u{1171e}', '\u{1171e}', - GC_SpacingMark), ('\u{1171f}', '\u{1171f}', GC_Extend), ('\u{11722}', '\u{11725}', - GC_Extend), ('\u{11726}', '\u{11726}', GC_SpacingMark), ('\u{11727}', '\u{1172b}', - GC_Extend), ('\u{1182c}', '\u{1182e}', GC_SpacingMark), ('\u{1182f}', '\u{11837}', - GC_Extend), ('\u{11838}', '\u{11838}', GC_SpacingMark), ('\u{11839}', '\u{1183a}', - GC_Extend), ('\u{11900}', '\u{11906}', GC_InCB_Consonant), ('\u{11909}', '\u{11909}', - GC_InCB_Consonant), ('\u{1190c}', '\u{11913}', GC_InCB_Consonant), ('\u{11915}', - '\u{11916}', GC_InCB_Consonant), ('\u{11918}', '\u{1192f}', GC_InCB_Consonant), - ('\u{11930}', '\u{11930}', GC_Extend), ('\u{11931}', '\u{11935}', GC_SpacingMark), - ('\u{11937}', '\u{11938}', GC_SpacingMark), ('\u{1193b}', '\u{1193e}', GC_Extend), - ('\u{1193f}', '\u{1193f}', GC_Prepend), ('\u{11940}', '\u{11940}', GC_SpacingMark), - ('\u{11941}', '\u{11941}', GC_Prepend), ('\u{11942}', '\u{11942}', GC_SpacingMark), - ('\u{11943}', '\u{11943}', GC_Extend), ('\u{119d1}', '\u{119d3}', GC_SpacingMark), - ('\u{119d4}', '\u{119d7}', GC_Extend), ('\u{119da}', '\u{119db}', GC_Extend), ('\u{119dc}', - '\u{119df}', GC_SpacingMark), ('\u{119e0}', '\u{119e0}', GC_Extend), ('\u{119e4}', - '\u{119e4}', GC_SpacingMark), ('\u{11a00}', '\u{11a00}', GC_InCB_Consonant), ('\u{11a01}', - '\u{11a0a}', GC_Extend), ('\u{11a0b}', '\u{11a32}', GC_InCB_Consonant), ('\u{11a33}', - '\u{11a38}', GC_Extend), ('\u{11a39}', '\u{11a39}', GC_SpacingMark), ('\u{11a3b}', - '\u{11a3e}', GC_Extend), ('\u{11a47}', '\u{11a47}', GC_Extend), ('\u{11a50}', '\u{11a50}', - GC_InCB_Consonant), ('\u{11a51}', '\u{11a56}', GC_Extend), ('\u{11a57}', '\u{11a58}', - GC_SpacingMark), ('\u{11a59}', '\u{11a5b}', GC_Extend), ('\u{11a5c}', '\u{11a83}', - GC_InCB_Consonant), ('\u{11a84}', '\u{11a89}', GC_Prepend), ('\u{11a8a}', '\u{11a96}', - GC_Extend), ('\u{11a97}', '\u{11a97}', GC_SpacingMark), ('\u{11a98}', '\u{11a99}', - GC_Extend), ('\u{11b60}', '\u{11b60}', GC_Extend), ('\u{11b61}', '\u{11b61}', - GC_SpacingMark), ('\u{11b62}', '\u{11b64}', GC_Extend), ('\u{11b65}', '\u{11b65}', - GC_SpacingMark), ('\u{11b66}', '\u{11b66}', GC_Extend), ('\u{11b67}', '\u{11b67}', - GC_SpacingMark), ('\u{11c2f}', '\u{11c2f}', GC_SpacingMark), ('\u{11c30}', '\u{11c36}', - GC_Extend), ('\u{11c38}', '\u{11c3d}', GC_Extend), ('\u{11c3e}', '\u{11c3e}', - GC_SpacingMark), ('\u{11c3f}', '\u{11c3f}', GC_Extend), ('\u{11c92}', '\u{11ca7}', - GC_Extend), ('\u{11ca9}', '\u{11ca9}', GC_SpacingMark), ('\u{11caa}', '\u{11cb0}', - GC_Extend), ('\u{11cb1}', '\u{11cb1}', GC_SpacingMark), ('\u{11cb2}', '\u{11cb3}', - GC_Extend), ('\u{11cb4}', '\u{11cb4}', GC_SpacingMark), ('\u{11cb5}', '\u{11cb6}', - GC_Extend), ('\u{11d31}', '\u{11d36}', GC_Extend), ('\u{11d3a}', '\u{11d3a}', GC_Extend), - ('\u{11d3c}', '\u{11d3d}', GC_Extend), ('\u{11d3f}', '\u{11d45}', GC_Extend), ('\u{11d46}', - '\u{11d46}', GC_Prepend), ('\u{11d47}', '\u{11d47}', GC_Extend), ('\u{11d8a}', '\u{11d8e}', - GC_SpacingMark), ('\u{11d90}', '\u{11d91}', GC_Extend), ('\u{11d93}', '\u{11d94}', - GC_SpacingMark), ('\u{11d95}', '\u{11d95}', GC_Extend), ('\u{11d96}', '\u{11d96}', - GC_SpacingMark), ('\u{11d97}', '\u{11d97}', GC_Extend), ('\u{11ef3}', '\u{11ef4}', - GC_Extend), ('\u{11ef5}', '\u{11ef6}', GC_SpacingMark), ('\u{11f00}', '\u{11f01}', - GC_Extend), ('\u{11f02}', '\u{11f02}', GC_Prepend), ('\u{11f03}', '\u{11f03}', - GC_SpacingMark), ('\u{11f04}', '\u{11f10}', GC_InCB_Consonant), ('\u{11f12}', '\u{11f33}', - GC_InCB_Consonant), ('\u{11f34}', '\u{11f35}', GC_SpacingMark), ('\u{11f36}', '\u{11f3a}', - GC_Extend), ('\u{11f3e}', '\u{11f3f}', GC_SpacingMark), ('\u{11f40}', '\u{11f42}', - GC_Extend), ('\u{11f5a}', '\u{11f5a}', GC_Extend), ('\u{13430}', '\u{1343f}', GC_Control), - ('\u{13440}', '\u{13440}', GC_Extend), ('\u{13447}', '\u{13455}', GC_Extend), ('\u{1611e}', - '\u{16129}', GC_Extend), ('\u{1612a}', '\u{1612c}', GC_SpacingMark), ('\u{1612d}', - '\u{1612f}', GC_Extend), ('\u{16af0}', '\u{16af4}', GC_Extend), ('\u{16b30}', '\u{16b36}', - GC_Extend), ('\u{16d63}', '\u{16d63}', GC_V), ('\u{16d67}', '\u{16d6a}', GC_V), - ('\u{16f4f}', '\u{16f4f}', GC_Extend), ('\u{16f51}', '\u{16f87}', GC_SpacingMark), - ('\u{16f8f}', '\u{16f92}', GC_Extend), ('\u{16fe4}', '\u{16fe4}', GC_Extend), ('\u{16ff0}', - '\u{16ff1}', GC_Extend), ('\u{1bc9d}', '\u{1bc9e}', GC_Extend), ('\u{1bca0}', '\u{1bca3}', - GC_Control), ('\u{1cf00}', '\u{1cf2d}', GC_Extend), ('\u{1cf30}', '\u{1cf46}', GC_Extend), - ('\u{1d165}', '\u{1d169}', GC_Extend), ('\u{1d16d}', '\u{1d172}', GC_Extend), ('\u{1d173}', - '\u{1d17a}', GC_Control), ('\u{1d17b}', '\u{1d182}', GC_Extend), ('\u{1d185}', '\u{1d18b}', - GC_Extend), ('\u{1d1aa}', '\u{1d1ad}', GC_Extend), ('\u{1d242}', '\u{1d244}', GC_Extend), - ('\u{1da00}', '\u{1da36}', GC_Extend), ('\u{1da3b}', '\u{1da6c}', GC_Extend), ('\u{1da75}', - '\u{1da75}', GC_Extend), ('\u{1da84}', '\u{1da84}', GC_Extend), ('\u{1da9b}', '\u{1da9f}', - GC_Extend), ('\u{1daa1}', '\u{1daaf}', GC_Extend), ('\u{1e000}', '\u{1e006}', GC_Extend), - ('\u{1e008}', '\u{1e018}', GC_Extend), ('\u{1e01b}', '\u{1e021}', GC_Extend), ('\u{1e023}', - '\u{1e024}', GC_Extend), ('\u{1e026}', '\u{1e02a}', GC_Extend), ('\u{1e08f}', '\u{1e08f}', - GC_Extend), ('\u{1e130}', '\u{1e136}', GC_Extend), ('\u{1e2ae}', '\u{1e2ae}', GC_Extend), - ('\u{1e2ec}', '\u{1e2ef}', GC_Extend), ('\u{1e4ec}', '\u{1e4ef}', GC_Extend), ('\u{1e5ee}', - '\u{1e5ef}', GC_Extend), ('\u{1e6e3}', '\u{1e6e3}', GC_Extend), ('\u{1e6e6}', '\u{1e6e6}', - GC_Extend), ('\u{1e6ee}', '\u{1e6ef}', GC_Extend), ('\u{1e6f5}', '\u{1e6f5}', GC_Extend), - ('\u{1e8d0}', '\u{1e8d6}', GC_Extend), ('\u{1e944}', '\u{1e94a}', GC_Extend), ('\u{1f004}', - '\u{1f004}', GC_Extended_Pictographic), ('\u{1f02c}', '\u{1f02f}', - GC_Extended_Pictographic), ('\u{1f094}', '\u{1f09f}', GC_Extended_Pictographic), - ('\u{1f0af}', '\u{1f0b0}', GC_Extended_Pictographic), ('\u{1f0c0}', '\u{1f0c0}', - GC_Extended_Pictographic), ('\u{1f0cf}', '\u{1f0d0}', GC_Extended_Pictographic), - ('\u{1f0f6}', '\u{1f0ff}', GC_Extended_Pictographic), ('\u{1f170}', '\u{1f171}', - GC_Extended_Pictographic), ('\u{1f17e}', '\u{1f17f}', GC_Extended_Pictographic), - ('\u{1f18e}', '\u{1f18e}', GC_Extended_Pictographic), ('\u{1f191}', '\u{1f19a}', - GC_Extended_Pictographic), ('\u{1f1ae}', '\u{1f1e5}', GC_Extended_Pictographic), - ('\u{1f1e6}', '\u{1f1ff}', GC_Regional_Indicator), ('\u{1f201}', '\u{1f20f}', - GC_Extended_Pictographic), ('\u{1f21a}', '\u{1f21a}', GC_Extended_Pictographic), - ('\u{1f22f}', '\u{1f22f}', GC_Extended_Pictographic), ('\u{1f232}', '\u{1f23a}', - GC_Extended_Pictographic), ('\u{1f23c}', '\u{1f23f}', GC_Extended_Pictographic), - ('\u{1f249}', '\u{1f25f}', GC_Extended_Pictographic), ('\u{1f266}', '\u{1f321}', - GC_Extended_Pictographic), ('\u{1f324}', '\u{1f393}', GC_Extended_Pictographic), - ('\u{1f396}', '\u{1f397}', GC_Extended_Pictographic), ('\u{1f399}', '\u{1f39b}', - GC_Extended_Pictographic), ('\u{1f39e}', '\u{1f3f0}', GC_Extended_Pictographic), - ('\u{1f3f3}', '\u{1f3f5}', GC_Extended_Pictographic), ('\u{1f3f7}', '\u{1f3fa}', - GC_Extended_Pictographic), ('\u{1f3fb}', '\u{1f3ff}', GC_Extend), ('\u{1f400}', '\u{1f4fd}', - GC_Extended_Pictographic), ('\u{1f4ff}', '\u{1f53d}', GC_Extended_Pictographic), - ('\u{1f549}', '\u{1f54e}', GC_Extended_Pictographic), ('\u{1f550}', '\u{1f567}', - GC_Extended_Pictographic), ('\u{1f56f}', '\u{1f570}', GC_Extended_Pictographic), - ('\u{1f573}', '\u{1f57a}', GC_Extended_Pictographic), ('\u{1f587}', '\u{1f587}', - GC_Extended_Pictographic), ('\u{1f58a}', '\u{1f58d}', GC_Extended_Pictographic), - ('\u{1f590}', '\u{1f590}', GC_Extended_Pictographic), ('\u{1f595}', '\u{1f596}', - GC_Extended_Pictographic), ('\u{1f5a4}', '\u{1f5a5}', GC_Extended_Pictographic), - ('\u{1f5a8}', '\u{1f5a8}', GC_Extended_Pictographic), ('\u{1f5b1}', '\u{1f5b2}', - GC_Extended_Pictographic), ('\u{1f5bc}', '\u{1f5bc}', GC_Extended_Pictographic), - ('\u{1f5c2}', '\u{1f5c4}', GC_Extended_Pictographic), ('\u{1f5d1}', '\u{1f5d3}', - GC_Extended_Pictographic), ('\u{1f5dc}', '\u{1f5de}', GC_Extended_Pictographic), - ('\u{1f5e1}', '\u{1f5e1}', GC_Extended_Pictographic), ('\u{1f5e3}', '\u{1f5e3}', - GC_Extended_Pictographic), ('\u{1f5e8}', '\u{1f5e8}', GC_Extended_Pictographic), - ('\u{1f5ef}', '\u{1f5ef}', GC_Extended_Pictographic), ('\u{1f5f3}', '\u{1f5f3}', - GC_Extended_Pictographic), ('\u{1f5fa}', '\u{1f64f}', GC_Extended_Pictographic), - ('\u{1f680}', '\u{1f6c5}', GC_Extended_Pictographic), ('\u{1f6cb}', '\u{1f6d2}', - GC_Extended_Pictographic), ('\u{1f6d5}', '\u{1f6e5}', GC_Extended_Pictographic), - ('\u{1f6e9}', '\u{1f6e9}', GC_Extended_Pictographic), ('\u{1f6eb}', '\u{1f6f0}', - GC_Extended_Pictographic), ('\u{1f6f3}', '\u{1f6ff}', GC_Extended_Pictographic), - ('\u{1f7da}', '\u{1f7ff}', GC_Extended_Pictographic), ('\u{1f80c}', '\u{1f80f}', - GC_Extended_Pictographic), ('\u{1f848}', '\u{1f84f}', GC_Extended_Pictographic), - ('\u{1f85a}', '\u{1f85f}', GC_Extended_Pictographic), ('\u{1f888}', '\u{1f88f}', - GC_Extended_Pictographic), ('\u{1f8ae}', '\u{1f8af}', GC_Extended_Pictographic), - ('\u{1f8bc}', '\u{1f8bf}', GC_Extended_Pictographic), ('\u{1f8c2}', '\u{1f8cf}', - GC_Extended_Pictographic), ('\u{1f8d9}', '\u{1f8ff}', GC_Extended_Pictographic), - ('\u{1f90c}', '\u{1f93a}', GC_Extended_Pictographic), ('\u{1f93c}', '\u{1f945}', - GC_Extended_Pictographic), ('\u{1f947}', '\u{1f9ff}', GC_Extended_Pictographic), - ('\u{1fa58}', '\u{1fa5f}', GC_Extended_Pictographic), ('\u{1fa6e}', '\u{1faff}', - GC_Extended_Pictographic), ('\u{1fc00}', '\u{1fffd}', GC_Extended_Pictographic), - ('\u{e0000}', '\u{e001f}', GC_Control), ('\u{e0020}', '\u{e007f}', GC_Extend), ('\u{e0080}', - '\u{e00ff}', GC_Control), ('\u{e0100}', '\u{e01ef}', GC_Extend), ('\u{e01f0}', '\u{e0fff}', - GC_Control) + ('\u{abed}', '\u{abed}', GC_Extend), ('\u{d7b0}', '\u{d7c6}', GC_V), ('\u{d7cb}', + '\u{d7fb}', GC_T), ('\u{fb1e}', '\u{fb1e}', GC_Extend), ('\u{fe20}', '\u{fe2f}', GC_Extend), + ('\u{feff}', '\u{feff}', GC_Control), ('\u{ff9e}', '\u{ff9f}', GC_Extend), ('\u{fff0}', + '\u{fffb}', GC_Control), ('\u{101fd}', '\u{101fd}', GC_Extend), ('\u{102e0}', '\u{102e0}', + GC_Extend), ('\u{10376}', '\u{1037a}', GC_Extend), ('\u{10a00}', '\u{10a00}', + GC_InCB_Consonant), ('\u{10a01}', '\u{10a03}', GC_Extend), ('\u{10a05}', '\u{10a06}', + GC_Extend), ('\u{10a0c}', '\u{10a0f}', GC_Extend), ('\u{10a10}', '\u{10a13}', + GC_InCB_Consonant), ('\u{10a15}', '\u{10a17}', GC_InCB_Consonant), ('\u{10a19}', + '\u{10a35}', GC_InCB_Consonant), ('\u{10a38}', '\u{10a3a}', GC_Extend), ('\u{10a3f}', + '\u{10a3f}', GC_Extend), ('\u{10ae5}', '\u{10ae6}', GC_Extend), ('\u{10d24}', '\u{10d27}', + GC_Extend), ('\u{10d69}', '\u{10d6d}', GC_Extend), ('\u{10eab}', '\u{10eac}', GC_Extend), + ('\u{10efa}', '\u{10eff}', GC_Extend), ('\u{10f46}', '\u{10f50}', GC_Extend), ('\u{10f82}', + '\u{10f85}', GC_Extend), ('\u{11000}', '\u{11000}', GC_SpacingMark), ('\u{11001}', + '\u{11001}', GC_Extend), ('\u{11002}', '\u{11002}', GC_SpacingMark), ('\u{11038}', + '\u{11046}', GC_Extend), ('\u{11070}', '\u{11070}', GC_Extend), ('\u{11073}', '\u{11074}', + GC_Extend), ('\u{1107f}', '\u{11081}', GC_Extend), ('\u{11082}', '\u{11082}', + GC_SpacingMark), ('\u{110b0}', '\u{110b2}', GC_SpacingMark), ('\u{110b3}', '\u{110b6}', + GC_Extend), ('\u{110b7}', '\u{110b8}', GC_SpacingMark), ('\u{110b9}', '\u{110ba}', + GC_Extend), ('\u{110bd}', '\u{110bd}', GC_Prepend), ('\u{110c2}', '\u{110c2}', GC_Extend), + ('\u{110cd}', '\u{110cd}', GC_Prepend), ('\u{11100}', '\u{11102}', GC_Extend), ('\u{11103}', + '\u{11126}', GC_InCB_Consonant), ('\u{11127}', '\u{1112b}', GC_Extend), ('\u{1112c}', + '\u{1112c}', GC_SpacingMark), ('\u{1112d}', '\u{11134}', GC_Extend), ('\u{11144}', + '\u{11144}', GC_InCB_Consonant), ('\u{11145}', '\u{11146}', GC_SpacingMark), ('\u{11147}', + '\u{11147}', GC_InCB_Consonant), ('\u{11173}', '\u{11173}', GC_Extend), ('\u{11180}', + '\u{11181}', GC_Extend), ('\u{11182}', '\u{11182}', GC_SpacingMark), ('\u{111b3}', + '\u{111b5}', GC_SpacingMark), ('\u{111b6}', '\u{111be}', GC_Extend), ('\u{111bf}', + '\u{111bf}', GC_SpacingMark), ('\u{111c0}', '\u{111c0}', GC_Extend), ('\u{111c2}', + '\u{111c3}', GC_Prepend), ('\u{111c9}', '\u{111cc}', GC_Extend), ('\u{111ce}', '\u{111ce}', + GC_SpacingMark), ('\u{111cf}', '\u{111cf}', GC_Extend), ('\u{1122c}', '\u{1122e}', + GC_SpacingMark), ('\u{1122f}', '\u{11231}', GC_Extend), ('\u{11232}', '\u{11233}', + GC_SpacingMark), ('\u{11234}', '\u{11237}', GC_Extend), ('\u{1123e}', '\u{1123e}', + GC_Extend), ('\u{11241}', '\u{11241}', GC_Extend), ('\u{112df}', '\u{112df}', GC_Extend), + ('\u{112e0}', '\u{112e2}', GC_SpacingMark), ('\u{112e3}', '\u{112ea}', GC_Extend), + ('\u{11300}', '\u{11301}', GC_Extend), ('\u{11302}', '\u{11303}', GC_SpacingMark), + ('\u{1133b}', '\u{1133c}', GC_Extend), ('\u{1133e}', '\u{1133e}', GC_Extend), ('\u{1133f}', + '\u{1133f}', GC_SpacingMark), ('\u{11340}', '\u{11340}', GC_Extend), ('\u{11341}', + '\u{11344}', GC_SpacingMark), ('\u{11347}', '\u{11348}', GC_SpacingMark), ('\u{1134b}', + '\u{1134c}', GC_SpacingMark), ('\u{1134d}', '\u{1134d}', GC_Extend), ('\u{11357}', + '\u{11357}', GC_Extend), ('\u{11362}', '\u{11363}', GC_SpacingMark), ('\u{11366}', + '\u{1136c}', GC_Extend), ('\u{11370}', '\u{11374}', GC_Extend), ('\u{11380}', '\u{11389}', + GC_InCB_Consonant), ('\u{1138b}', '\u{1138b}', GC_InCB_Consonant), ('\u{1138e}', + '\u{1138e}', GC_InCB_Consonant), ('\u{11390}', '\u{113b5}', GC_InCB_Consonant), + ('\u{113b8}', '\u{113b8}', GC_Extend), ('\u{113b9}', '\u{113ba}', GC_SpacingMark), + ('\u{113bb}', '\u{113c0}', GC_Extend), ('\u{113c2}', '\u{113c2}', GC_Extend), ('\u{113c5}', + '\u{113c5}', GC_Extend), ('\u{113c7}', '\u{113c9}', GC_Extend), ('\u{113ca}', '\u{113ca}', + GC_SpacingMark), ('\u{113cc}', '\u{113cd}', GC_SpacingMark), ('\u{113ce}', '\u{113d0}', + GC_Extend), ('\u{113d1}', '\u{113d1}', GC_Prepend), ('\u{113d2}', '\u{113d2}', GC_Extend), + ('\u{113e1}', '\u{113e2}', GC_Extend), ('\u{11435}', '\u{11437}', GC_SpacingMark), + ('\u{11438}', '\u{1143f}', GC_Extend), ('\u{11440}', '\u{11441}', GC_SpacingMark), + ('\u{11442}', '\u{11444}', GC_Extend), ('\u{11445}', '\u{11445}', GC_SpacingMark), + ('\u{11446}', '\u{11446}', GC_Extend), ('\u{1145e}', '\u{1145e}', GC_Extend), ('\u{114b0}', + '\u{114b0}', GC_Extend), ('\u{114b1}', '\u{114b2}', GC_SpacingMark), ('\u{114b3}', + '\u{114b8}', GC_Extend), ('\u{114b9}', '\u{114b9}', GC_SpacingMark), ('\u{114ba}', + '\u{114ba}', GC_Extend), ('\u{114bb}', '\u{114bc}', GC_SpacingMark), ('\u{114bd}', + '\u{114bd}', GC_Extend), ('\u{114be}', '\u{114be}', GC_SpacingMark), ('\u{114bf}', + '\u{114c0}', GC_Extend), ('\u{114c1}', '\u{114c1}', GC_SpacingMark), ('\u{114c2}', + '\u{114c3}', GC_Extend), ('\u{115af}', '\u{115af}', GC_Extend), ('\u{115b0}', '\u{115b1}', + GC_SpacingMark), ('\u{115b2}', '\u{115b5}', GC_Extend), ('\u{115b8}', '\u{115bb}', + GC_SpacingMark), ('\u{115bc}', '\u{115bd}', GC_Extend), ('\u{115be}', '\u{115be}', + GC_SpacingMark), ('\u{115bf}', '\u{115c0}', GC_Extend), ('\u{115dc}', '\u{115dd}', + GC_Extend), ('\u{11630}', '\u{11632}', GC_SpacingMark), ('\u{11633}', '\u{1163a}', + GC_Extend), ('\u{1163b}', '\u{1163c}', GC_SpacingMark), ('\u{1163d}', '\u{1163d}', + GC_Extend), ('\u{1163e}', '\u{1163e}', GC_SpacingMark), ('\u{1163f}', '\u{11640}', + GC_Extend), ('\u{116ab}', '\u{116ab}', GC_Extend), ('\u{116ac}', '\u{116ac}', + GC_SpacingMark), ('\u{116ad}', '\u{116ad}', GC_Extend), ('\u{116ae}', '\u{116af}', + GC_SpacingMark), ('\u{116b0}', '\u{116b7}', GC_Extend), ('\u{1171d}', '\u{1171d}', + GC_Extend), ('\u{1171e}', '\u{1171e}', GC_SpacingMark), ('\u{1171f}', '\u{1171f}', + GC_Extend), ('\u{11722}', '\u{11725}', GC_Extend), ('\u{11726}', '\u{11726}', + GC_SpacingMark), ('\u{11727}', '\u{1172b}', GC_Extend), ('\u{1182c}', '\u{1182e}', + GC_SpacingMark), ('\u{1182f}', '\u{11837}', GC_Extend), ('\u{11838}', '\u{11838}', + GC_SpacingMark), ('\u{11839}', '\u{1183a}', GC_Extend), ('\u{11900}', '\u{11906}', + GC_InCB_Consonant), ('\u{11909}', '\u{11909}', GC_InCB_Consonant), ('\u{1190c}', + '\u{11913}', GC_InCB_Consonant), ('\u{11915}', '\u{11916}', GC_InCB_Consonant), + ('\u{11918}', '\u{1192f}', GC_InCB_Consonant), ('\u{11930}', '\u{11930}', GC_Extend), + ('\u{11931}', '\u{11935}', GC_SpacingMark), ('\u{11937}', '\u{11938}', GC_SpacingMark), + ('\u{1193b}', '\u{1193e}', GC_Extend), ('\u{1193f}', '\u{1193f}', GC_Prepend), ('\u{11940}', + '\u{11940}', GC_SpacingMark), ('\u{11941}', '\u{11941}', GC_Prepend), ('\u{11942}', + '\u{11942}', GC_SpacingMark), ('\u{11943}', '\u{11943}', GC_Extend), ('\u{119d1}', + '\u{119d3}', GC_SpacingMark), ('\u{119d4}', '\u{119d7}', GC_Extend), ('\u{119da}', + '\u{119db}', GC_Extend), ('\u{119dc}', '\u{119df}', GC_SpacingMark), ('\u{119e0}', + '\u{119e0}', GC_Extend), ('\u{119e4}', '\u{119e4}', GC_SpacingMark), ('\u{11a00}', + '\u{11a00}', GC_InCB_Consonant), ('\u{11a01}', '\u{11a0a}', GC_Extend), ('\u{11a0b}', + '\u{11a32}', GC_InCB_Consonant), ('\u{11a33}', '\u{11a38}', GC_Extend), ('\u{11a39}', + '\u{11a39}', GC_SpacingMark), ('\u{11a3b}', '\u{11a3e}', GC_Extend), ('\u{11a47}', + '\u{11a47}', GC_Extend), ('\u{11a50}', '\u{11a50}', GC_InCB_Consonant), ('\u{11a51}', + '\u{11a56}', GC_Extend), ('\u{11a57}', '\u{11a58}', GC_SpacingMark), ('\u{11a59}', + '\u{11a5b}', GC_Extend), ('\u{11a5c}', '\u{11a83}', GC_InCB_Consonant), ('\u{11a84}', + '\u{11a89}', GC_Prepend), ('\u{11a8a}', '\u{11a96}', GC_Extend), ('\u{11a97}', '\u{11a97}', + GC_SpacingMark), ('\u{11a98}', '\u{11a99}', GC_Extend), ('\u{11b60}', '\u{11b60}', + GC_Extend), ('\u{11b61}', '\u{11b61}', GC_SpacingMark), ('\u{11b62}', '\u{11b64}', + GC_Extend), ('\u{11b65}', '\u{11b65}', GC_SpacingMark), ('\u{11b66}', '\u{11b66}', + GC_Extend), ('\u{11b67}', '\u{11b67}', GC_SpacingMark), ('\u{11c2f}', '\u{11c2f}', + GC_SpacingMark), ('\u{11c30}', '\u{11c36}', GC_Extend), ('\u{11c38}', '\u{11c3d}', + GC_Extend), ('\u{11c3e}', '\u{11c3e}', GC_SpacingMark), ('\u{11c3f}', '\u{11c3f}', + GC_Extend), ('\u{11c92}', '\u{11ca7}', GC_Extend), ('\u{11ca9}', '\u{11ca9}', + GC_SpacingMark), ('\u{11caa}', '\u{11cb0}', GC_Extend), ('\u{11cb1}', '\u{11cb1}', + GC_SpacingMark), ('\u{11cb2}', '\u{11cb3}', GC_Extend), ('\u{11cb4}', '\u{11cb4}', + GC_SpacingMark), ('\u{11cb5}', '\u{11cb6}', GC_Extend), ('\u{11d31}', '\u{11d36}', + GC_Extend), ('\u{11d3a}', '\u{11d3a}', GC_Extend), ('\u{11d3c}', '\u{11d3d}', GC_Extend), + ('\u{11d3f}', '\u{11d45}', GC_Extend), ('\u{11d46}', '\u{11d46}', GC_Prepend), ('\u{11d47}', + '\u{11d47}', GC_Extend), ('\u{11d8a}', '\u{11d8e}', GC_SpacingMark), ('\u{11d90}', + '\u{11d91}', GC_Extend), ('\u{11d93}', '\u{11d94}', GC_SpacingMark), ('\u{11d95}', + '\u{11d95}', GC_Extend), ('\u{11d96}', '\u{11d96}', GC_SpacingMark), ('\u{11d97}', + '\u{11d97}', GC_Extend), ('\u{11ef3}', '\u{11ef4}', GC_Extend), ('\u{11ef5}', '\u{11ef6}', + GC_SpacingMark), ('\u{11f00}', '\u{11f01}', GC_Extend), ('\u{11f02}', '\u{11f02}', + GC_Prepend), ('\u{11f03}', '\u{11f03}', GC_SpacingMark), ('\u{11f04}', '\u{11f10}', + GC_InCB_Consonant), ('\u{11f12}', '\u{11f33}', GC_InCB_Consonant), ('\u{11f34}', + '\u{11f35}', GC_SpacingMark), ('\u{11f36}', '\u{11f3a}', GC_Extend), ('\u{11f3e}', + '\u{11f3f}', GC_SpacingMark), ('\u{11f40}', '\u{11f42}', GC_Extend), ('\u{11f5a}', + '\u{11f5a}', GC_Extend), ('\u{13430}', '\u{1343f}', GC_Control), ('\u{13440}', '\u{13440}', + GC_Extend), ('\u{13447}', '\u{13455}', GC_Extend), ('\u{1611e}', '\u{16129}', GC_Extend), + ('\u{1612a}', '\u{1612c}', GC_SpacingMark), ('\u{1612d}', '\u{1612f}', GC_Extend), + ('\u{16af0}', '\u{16af4}', GC_Extend), ('\u{16b30}', '\u{16b36}', GC_Extend), ('\u{16d63}', + '\u{16d63}', GC_V), ('\u{16d67}', '\u{16d6a}', GC_V), ('\u{16f4f}', '\u{16f4f}', GC_Extend), + ('\u{16f51}', '\u{16f87}', GC_SpacingMark), ('\u{16f8f}', '\u{16f92}', GC_Extend), + ('\u{16fe4}', '\u{16fe4}', GC_Extend), ('\u{16ff0}', '\u{16ff1}', GC_Extend), ('\u{1bc9d}', + '\u{1bc9e}', GC_Extend), ('\u{1bca0}', '\u{1bca3}', GC_Control), ('\u{1cf00}', '\u{1cf2d}', + GC_Extend), ('\u{1cf30}', '\u{1cf46}', GC_Extend), ('\u{1d165}', '\u{1d169}', GC_Extend), + ('\u{1d16d}', '\u{1d172}', GC_Extend), ('\u{1d173}', '\u{1d17a}', GC_Control), ('\u{1d17b}', + '\u{1d182}', GC_Extend), ('\u{1d185}', '\u{1d18b}', GC_Extend), ('\u{1d1aa}', '\u{1d1ad}', + GC_Extend), ('\u{1d242}', '\u{1d244}', GC_Extend), ('\u{1da00}', '\u{1da36}', GC_Extend), + ('\u{1da3b}', '\u{1da6c}', GC_Extend), ('\u{1da75}', '\u{1da75}', GC_Extend), ('\u{1da84}', + '\u{1da84}', GC_Extend), ('\u{1da9b}', '\u{1da9f}', GC_Extend), ('\u{1daa1}', '\u{1daaf}', + GC_Extend), ('\u{1e000}', '\u{1e006}', GC_Extend), ('\u{1e008}', '\u{1e018}', GC_Extend), + ('\u{1e01b}', '\u{1e021}', GC_Extend), ('\u{1e023}', '\u{1e024}', GC_Extend), ('\u{1e026}', + '\u{1e02a}', GC_Extend), ('\u{1e08f}', '\u{1e08f}', GC_Extend), ('\u{1e130}', '\u{1e136}', + GC_Extend), ('\u{1e2ae}', '\u{1e2ae}', GC_Extend), ('\u{1e2ec}', '\u{1e2ef}', GC_Extend), + ('\u{1e4ec}', '\u{1e4ef}', GC_Extend), ('\u{1e5ee}', '\u{1e5ef}', GC_Extend), ('\u{1e6e3}', + '\u{1e6e3}', GC_Extend), ('\u{1e6e6}', '\u{1e6e6}', GC_Extend), ('\u{1e6ee}', '\u{1e6ef}', + GC_Extend), ('\u{1e6f5}', '\u{1e6f5}', GC_Extend), ('\u{1e8d0}', '\u{1e8d6}', GC_Extend), + ('\u{1e944}', '\u{1e94a}', GC_Extend), ('\u{1f004}', '\u{1f004}', GC_Extended_Pictographic), + ('\u{1f02c}', '\u{1f02f}', GC_Extended_Pictographic), ('\u{1f094}', '\u{1f09f}', + GC_Extended_Pictographic), ('\u{1f0af}', '\u{1f0b0}', GC_Extended_Pictographic), + ('\u{1f0c0}', '\u{1f0c0}', GC_Extended_Pictographic), ('\u{1f0cf}', '\u{1f0d0}', + GC_Extended_Pictographic), ('\u{1f0f6}', '\u{1f0ff}', GC_Extended_Pictographic), + ('\u{1f170}', '\u{1f171}', GC_Extended_Pictographic), ('\u{1f17e}', '\u{1f17f}', + GC_Extended_Pictographic), ('\u{1f18e}', '\u{1f18e}', GC_Extended_Pictographic), + ('\u{1f191}', '\u{1f19a}', GC_Extended_Pictographic), ('\u{1f1ae}', '\u{1f1e5}', + GC_Extended_Pictographic), ('\u{1f1e6}', '\u{1f1ff}', GC_Regional_Indicator), ('\u{1f201}', + '\u{1f20f}', GC_Extended_Pictographic), ('\u{1f21a}', '\u{1f21a}', + GC_Extended_Pictographic), ('\u{1f22f}', '\u{1f22f}', GC_Extended_Pictographic), + ('\u{1f232}', '\u{1f23a}', GC_Extended_Pictographic), ('\u{1f23c}', '\u{1f23f}', + GC_Extended_Pictographic), ('\u{1f249}', '\u{1f25f}', GC_Extended_Pictographic), + ('\u{1f266}', '\u{1f321}', GC_Extended_Pictographic), ('\u{1f324}', '\u{1f393}', + GC_Extended_Pictographic), ('\u{1f396}', '\u{1f397}', GC_Extended_Pictographic), + ('\u{1f399}', '\u{1f39b}', GC_Extended_Pictographic), ('\u{1f39e}', '\u{1f3f0}', + GC_Extended_Pictographic), ('\u{1f3f3}', '\u{1f3f5}', GC_Extended_Pictographic), + ('\u{1f3f7}', '\u{1f3fa}', GC_Extended_Pictographic), ('\u{1f3fb}', '\u{1f3ff}', GC_Extend), + ('\u{1f400}', '\u{1f4fd}', GC_Extended_Pictographic), ('\u{1f4ff}', '\u{1f53d}', + GC_Extended_Pictographic), ('\u{1f549}', '\u{1f54e}', GC_Extended_Pictographic), + ('\u{1f550}', '\u{1f567}', GC_Extended_Pictographic), ('\u{1f56f}', '\u{1f570}', + GC_Extended_Pictographic), ('\u{1f573}', '\u{1f57a}', GC_Extended_Pictographic), + ('\u{1f587}', '\u{1f587}', GC_Extended_Pictographic), ('\u{1f58a}', '\u{1f58d}', + GC_Extended_Pictographic), ('\u{1f590}', '\u{1f590}', GC_Extended_Pictographic), + ('\u{1f595}', '\u{1f596}', GC_Extended_Pictographic), ('\u{1f5a4}', '\u{1f5a5}', + GC_Extended_Pictographic), ('\u{1f5a8}', '\u{1f5a8}', GC_Extended_Pictographic), + ('\u{1f5b1}', '\u{1f5b2}', GC_Extended_Pictographic), ('\u{1f5bc}', '\u{1f5bc}', + GC_Extended_Pictographic), ('\u{1f5c2}', '\u{1f5c4}', GC_Extended_Pictographic), + ('\u{1f5d1}', '\u{1f5d3}', GC_Extended_Pictographic), ('\u{1f5dc}', '\u{1f5de}', + GC_Extended_Pictographic), ('\u{1f5e1}', '\u{1f5e1}', GC_Extended_Pictographic), + ('\u{1f5e3}', '\u{1f5e3}', GC_Extended_Pictographic), ('\u{1f5e8}', '\u{1f5e8}', + GC_Extended_Pictographic), ('\u{1f5ef}', '\u{1f5ef}', GC_Extended_Pictographic), + ('\u{1f5f3}', '\u{1f5f3}', GC_Extended_Pictographic), ('\u{1f5fa}', '\u{1f64f}', + GC_Extended_Pictographic), ('\u{1f680}', '\u{1f6c5}', GC_Extended_Pictographic), + ('\u{1f6cb}', '\u{1f6d2}', GC_Extended_Pictographic), ('\u{1f6d5}', '\u{1f6e5}', + GC_Extended_Pictographic), ('\u{1f6e9}', '\u{1f6e9}', GC_Extended_Pictographic), + ('\u{1f6eb}', '\u{1f6f0}', GC_Extended_Pictographic), ('\u{1f6f3}', '\u{1f6ff}', + GC_Extended_Pictographic), ('\u{1f7da}', '\u{1f7ff}', GC_Extended_Pictographic), + ('\u{1f80c}', '\u{1f80f}', GC_Extended_Pictographic), ('\u{1f848}', '\u{1f84f}', + GC_Extended_Pictographic), ('\u{1f85a}', '\u{1f85f}', GC_Extended_Pictographic), + ('\u{1f888}', '\u{1f88f}', GC_Extended_Pictographic), ('\u{1f8ae}', '\u{1f8af}', + GC_Extended_Pictographic), ('\u{1f8bc}', '\u{1f8bf}', GC_Extended_Pictographic), + ('\u{1f8c2}', '\u{1f8cf}', GC_Extended_Pictographic), ('\u{1f8d9}', '\u{1f8ff}', + GC_Extended_Pictographic), ('\u{1f90c}', '\u{1f93a}', GC_Extended_Pictographic), + ('\u{1f93c}', '\u{1f945}', GC_Extended_Pictographic), ('\u{1f947}', '\u{1f9ff}', + GC_Extended_Pictographic), ('\u{1fa58}', '\u{1fa5f}', GC_Extended_Pictographic), + ('\u{1fa6e}', '\u{1faff}', GC_Extended_Pictographic), ('\u{1fc00}', '\u{1fffd}', + GC_Extended_Pictographic), ('\u{e0000}', '\u{e001f}', GC_Control), ('\u{e0020}', + '\u{e007f}', GC_Extend), ('\u{e0080}', '\u{e00ff}', GC_Control), ('\u{e0100}', '\u{e01ef}', + GC_Extend), ('\u{e01f0}', '\u{e0fff}', GC_Control) ]; } @@ -1256,11 +995,38 @@ pub mod word { } } - pub fn word_category(c: char) -> (u32, u32, WordCat) { + /// Result of [`word_category`], distinguishing categories derived at runtime + /// (no range to cache) from those found by table lookup. + #[allow(dead_code)] + #[derive(Clone, Copy, Debug)] + pub enum WordCategoryResult { + /// Category derived from the codepoint value alone. + Fast(WordCat), + /// Category from a table lookup, with the range it covers for caching. + Table { lo: u32, hi: u32, cat: WordCat }, + } + + #[allow(dead_code)] + impl WordCategoryResult { + /// The resolved category, regardless of which path produced it. + #[inline] + pub fn cat(self) -> WordCat { + match self { + WordCategoryResult::Fast(cat) => cat, + WordCategoryResult::Table { cat, .. } => cat, + } + } + } + + pub fn word_category(ch: char) -> WordCategoryResult { + use self::WordCategoryResult::*; + + let c = ch as u32; + // Perform a quick O(1) lookup in a precomputed table to determine // the slice of the range table to search in. let lookup_interval = 0x80; - let idx = (c as u32 / lookup_interval) as usize; + let idx = (c / lookup_interval) as usize; let range = word_cat_lookup.get(idx..(idx + 2)).map_or( // If the `idx` is outside of the precomputed table - use the slice // starting from the last covered index in the precomputed table and @@ -1274,7 +1040,8 @@ pub mod word { // in the table slice - these bounds has to apply. let lower = idx as u32 * lookup_interval; let upper = lower + lookup_interval - 1; - bsearch_range_value_table(c, &word_cat_table[range], lower, upper) + let (lo, hi, cat) = bsearch_range_value_table(ch, &word_cat_table[range], lower, upper); + Table { lo, hi, cat } } const word_cat_lookup: &[u16] = &[ @@ -1857,11 +1624,38 @@ pub mod emoji { } } - pub fn emoji_category(c: char) -> (u32, u32, EmojiCat) { + /// Result of [`emoji_category`], distinguishing categories derived at runtime + /// (no range to cache) from those found by table lookup. + #[allow(dead_code)] + #[derive(Clone, Copy, Debug)] + pub enum EmojiCategoryResult { + /// Category derived from the codepoint value alone. + Fast(EmojiCat), + /// Category from a table lookup, with the range it covers for caching. + Table { lo: u32, hi: u32, cat: EmojiCat }, + } + + #[allow(dead_code)] + impl EmojiCategoryResult { + /// The resolved category, regardless of which path produced it. + #[inline] + pub fn cat(self) -> EmojiCat { + match self { + EmojiCategoryResult::Fast(cat) => cat, + EmojiCategoryResult::Table { cat, .. } => cat, + } + } + } + + pub fn emoji_category(ch: char) -> EmojiCategoryResult { + use self::EmojiCategoryResult::*; + + let c = ch as u32; + // Perform a quick O(1) lookup in a precomputed table to determine // the slice of the range table to search in. let lookup_interval = 0x80; - let idx = (c as u32 / lookup_interval) as usize; + let idx = (c / lookup_interval) as usize; let range = emoji_cat_lookup.get(idx..(idx + 2)).map_or( // If the `idx` is outside of the precomputed table - use the slice // starting from the last covered index in the precomputed table and @@ -1875,7 +1669,8 @@ pub mod emoji { // in the table slice - these bounds has to apply. let lower = idx as u32 * lookup_interval; let upper = lower + lookup_interval - 1; - bsearch_range_value_table(c, &emoji_cat_table[range], lower, upper) + let (lo, hi, cat) = bsearch_range_value_table(ch, &emoji_cat_table[range], lower, upper); + Table { lo, hi, cat } } const emoji_cat_lookup: &[u8] = &[ @@ -2075,11 +1870,38 @@ pub mod sentence { } } - pub fn sentence_category(c: char) -> (u32, u32, SentenceCat) { + /// Result of [`sentence_category`], distinguishing categories derived at runtime + /// (no range to cache) from those found by table lookup. + #[allow(dead_code)] + #[derive(Clone, Copy, Debug)] + pub enum SentenceCategoryResult { + /// Category derived from the codepoint value alone. + Fast(SentenceCat), + /// Category from a table lookup, with the range it covers for caching. + Table { lo: u32, hi: u32, cat: SentenceCat }, + } + + #[allow(dead_code)] + impl SentenceCategoryResult { + /// The resolved category, regardless of which path produced it. + #[inline] + pub fn cat(self) -> SentenceCat { + match self { + SentenceCategoryResult::Fast(cat) => cat, + SentenceCategoryResult::Table { cat, .. } => cat, + } + } + } + + pub fn sentence_category(ch: char) -> SentenceCategoryResult { + use self::SentenceCategoryResult::*; + + let c = ch as u32; + // Perform a quick O(1) lookup in a precomputed table to determine // the slice of the range table to search in. let lookup_interval = 0x80; - let idx = (c as u32 / lookup_interval) as usize; + let idx = (c / lookup_interval) as usize; let range = sentence_cat_lookup.get(idx..(idx + 2)).map_or( // If the `idx` is outside of the precomputed table - use the slice // starting from the last covered index in the precomputed table and @@ -2093,7 +1915,8 @@ pub mod sentence { // in the table slice - these bounds has to apply. let lower = idx as u32 * lookup_interval; let upper = lower + lookup_interval - 1; - bsearch_range_value_table(c, &sentence_cat_table[range], lower, upper) + let (lo, hi, cat) = bsearch_range_value_table(ch, &sentence_cat_table[range], lower, upper); + Table { lo, hi, cat } } const sentence_cat_lookup: &[u16] = &[ diff --git a/src/word.rs b/src/word.rs index 5e20f48..444121b 100644 --- a/src/word.rs +++ b/src/word.rs @@ -209,7 +209,7 @@ enum RegionalState { fn is_emoji(ch: char) -> bool { use crate::tables::emoji; - emoji::emoji_category(ch).2 == emoji::EmojiCat::EC_Extended_Pictographic + emoji::emoji_category(ch).cat() == emoji::EmojiCat::EC_Extended_Pictographic } impl<'a> Iterator for UWordBounds<'a> { @@ -247,7 +247,7 @@ impl<'a> Iterator for UWordBounds<'a> { let prev_zwj = cat == wd::WC_ZWJ; // if there's a category cached, grab it cat = match self.cat { - None => wd::word_category(ch).2, + None => wd::word_category(ch).cat(), _ => self.cat.take().unwrap(), }; take_cat = true; @@ -483,7 +483,7 @@ impl<'a> DoubleEndedIterator for UWordBounds<'a> { // if there's a category cached, grab it cat = match self.catb { - None => wd::word_category(ch).2, + None => wd::word_category(ch).cat(), _ => self.catb.take().unwrap(), }; take_cat = true; @@ -632,7 +632,7 @@ impl<'a> DoubleEndedIterator for UWordBounds<'a> { let count = self.string[..previdx] .chars() .rev() - .map(|c| wd::word_category(c).2) + .map(|c| wd::word_category(c).cat()) .filter(|&c| { !(c == wd::WC_ZWJ || c == wd::WC_Extend || c == wd::WC_Format) }) @@ -730,7 +730,7 @@ impl<'a> UWordBounds<'a> { let nidx = idx + self.string[idx..].chars().next().unwrap().len_utf8(); if nidx < self.string.len() { let nch = self.string[nidx..].chars().next().unwrap(); - Some(wd::word_category(nch).2) + Some(wd::word_category(nch).cat()) } else { None } @@ -741,7 +741,7 @@ impl<'a> UWordBounds<'a> { use crate::tables::word as wd; if idx > 0 { let nch = self.string[..idx].chars().next_back().unwrap(); - Some(wd::word_category(nch).2) + Some(wd::word_category(nch).cat()) } else { None } @@ -1053,14 +1053,14 @@ mod tests { #[test] fn test_syriac_abbr_mark() { use crate::tables::word as wd; - let (_, _, cat) = wd::word_category('\u{70f}'); + let cat = wd::word_category('\u{70f}').cat(); assert_eq!(cat, wd::WC_ALetter); } #[test] fn test_end_of_ayah_cat() { use crate::tables::word as wd; - let (_, _, cat) = wd::word_category('\u{6dd}'); + let cat = wd::word_category('\u{6dd}').cat(); assert_eq!(cat, wd::WC_Numeric); }