[llvm-branch-commits] [libc] [libc][wctype] Add perfect hash map for conversion functions (PR #187670)
Muhammad Bassiouni via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Mar 20 03:26:28 PDT 2026
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/187670
>From 658bed566fa520ae7113603cf4a8832c92a73738 Mon Sep 17 00:00:00 2001
From: bassiounix <muhammad.m.bassiouni at gmail.com>
Date: Fri, 20 Mar 2026 12:01:03 +0200
Subject: [PATCH 1/3] [libc][wctype] Add perfect hash map for conversion
functions
---
libc/src/__support/CPP/CMakeLists.txt | 8 +
libc/src/__support/CPP/algorithm.h | 20 +
libc/src/__support/CPP/iterator.h | 37 +-
libc/src/__support/CPP/monostate.h | 31 +
libc/src/__support/wctype/CMakeLists.txt | 36 +
libc/src/__support/wctype/lower_to_upper.h | 568 ++++++++++++
libc/src/__support/wctype/lower_to_upper.inc | 400 --------
libc/src/__support/wctype/perfect_hash_map.h | 876 ++++++++++++++++++
libc/src/__support/wctype/upper_to_lower.h | 553 +++++++++++
libc/src/__support/wctype/upper_to_lower.inc | 390 --------
libc/test/src/__support/wctype/CMakeLists.txt | 14 +-
.../wctype/wctype_perfect_hash_test.cpp | 35 +
.../wctype_utils/conversion/hex_writer.py | 72 +-
libc/utils/wctype_utils/gen.py | 13 +-
14 files changed, 2256 insertions(+), 797 deletions(-)
create mode 100644 libc/src/__support/CPP/monostate.h
create mode 100644 libc/src/__support/wctype/lower_to_upper.h
delete mode 100644 libc/src/__support/wctype/lower_to_upper.inc
create mode 100644 libc/src/__support/wctype/perfect_hash_map.h
create mode 100644 libc/src/__support/wctype/upper_to_lower.h
delete mode 100644 libc/src/__support/wctype/upper_to_lower.inc
create mode 100644 libc/test/src/__support/wctype/wctype_perfect_hash_test.cpp
diff --git a/libc/src/__support/CPP/CMakeLists.txt b/libc/src/__support/CPP/CMakeLists.txt
index bdfbc6151c773..678fb7f50e9cf 100644
--- a/libc/src/__support/CPP/CMakeLists.txt
+++ b/libc/src/__support/CPP/CMakeLists.txt
@@ -56,6 +56,14 @@ add_header_library(
libc.src.__support.macros.properties.types
)
+add_header_library(
+ monostate
+ HDRS
+ monostate.h
+ DEPENDS
+ libc.src.__support.common
+)
+
add_header_library(
mutex
HDRS
diff --git a/libc/src/__support/CPP/algorithm.h b/libc/src/__support/CPP/algorithm.h
index de0c47369d945..3e2ac8b7b95ce 100644
--- a/libc/src/__support/CPP/algorithm.h
+++ b/libc/src/__support/CPP/algorithm.h
@@ -49,6 +49,26 @@ LIBC_INLINE constexpr bool all_of(InputIt first, InputIt last, UnaryPred p) {
return find_if_not(first, last, p) == last;
}
+template <typename It, typename T, typename Comp>
+LIBC_INLINE constexpr It lower_bound(It first, It last, const T &value,
+ Comp comp) {
+ auto count = last - first;
+
+ while (count > 0) {
+ It it = first;
+ auto step = count / 2;
+ it += step;
+
+ if (comp(*it, value)) {
+ first = ++it;
+ count -= step + 1;
+ } else {
+ count = step;
+ }
+ }
+ return first;
+}
+
} // namespace cpp
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/CPP/iterator.h b/libc/src/__support/CPP/iterator.h
index 168a269731822..cfefbbd3b9101 100644
--- a/libc/src/__support/CPP/iterator.h
+++ b/libc/src/__support/CPP/iterator.h
@@ -9,6 +9,7 @@
#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H
#define LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H
+#include "hdr/types/size_t.h"
#include "src/__support/CPP/type_traits/enable_if.h"
#include "src/__support/CPP/type_traits/is_convertible.h"
#include "src/__support/CPP/type_traits/is_same.h"
@@ -18,12 +19,22 @@
namespace LIBC_NAMESPACE_DECL {
namespace cpp {
-template <typename T> struct iterator_traits;
+struct input_iterator_tag {};
+struct random_access_iterator_tag : input_iterator_tag {};
+
+template <typename It> struct iterator_traits {
+ using iterator_category = typename It::iterator_category;
+};
template <typename T> struct iterator_traits<T *> {
using reference = T &;
+ using iterator_category = random_access_iterator_tag;
using value_type = T;
};
+template <typename T> struct iterator_traits<const T *> {
+ using iterator_category = random_access_iterator_tag;
+};
+
template <typename Iter> class reverse_iterator {
Iter current;
@@ -93,6 +104,30 @@ template <typename Iter> class reverse_iterator {
}
};
+namespace cpp_internal {
+
+template <typename It>
+LIBC_INLINE constexpr size_t distance(It first, It last,
+ random_access_iterator_tag) {
+ return last - first;
+}
+
+template <typename It>
+LIBC_INLINE constexpr auto distance(It first, It last, input_iterator_tag) {
+ size_t n = 0;
+ for (; first != last; ++first) {
+ ++n;
+ }
+ return n;
+}
+
+} // namespace cpp_internal
+
+template <typename It> auto distance(It first, It last) {
+ return cpp_internal::distance(
+ first, last, typename iterator_traits<It>::iterator_category{});
+}
+
} // namespace cpp
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/CPP/monostate.h b/libc/src/__support/CPP/monostate.h
new file mode 100644
index 0000000000000..231550cd4cc69
--- /dev/null
+++ b/libc/src/__support/CPP/monostate.h
@@ -0,0 +1,31 @@
+//===-- Definition of cpp::monostate ----------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_MONOSTATE_H
+#define LLVM_LIBC_SRC___SUPPORT_CPP_MONOSTATE_H
+
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+namespace cpp {
+
+struct monostate {};
+
+LIBC_INLINE constexpr bool operator==(monostate, monostate) { return true; }
+LIBC_INLINE constexpr bool operator!=(monostate, monostate) { return false; }
+LIBC_INLINE constexpr bool operator<(monostate, monostate) { return false; }
+LIBC_INLINE constexpr bool operator>(monostate, monostate) { return false; }
+LIBC_INLINE constexpr bool operator<=(monostate, monostate) { return true; }
+LIBC_INLINE constexpr bool operator>=(monostate, monostate) { return true; }
+
+} // namespace cpp
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_SRC___SUPPORT_CPP_MONOSTATE_H
diff --git a/libc/src/__support/wctype/CMakeLists.txt b/libc/src/__support/wctype/CMakeLists.txt
index fcd4b777b2203..43c45d04ec2b7 100644
--- a/libc/src/__support/wctype/CMakeLists.txt
+++ b/libc/src/__support/wctype/CMakeLists.txt
@@ -1,3 +1,39 @@
+add_header_library(
+ perfect_hash_map
+ HDRS
+ perfect_hash_map.h
+ DEPENDS
+ libc.hdr.types.size_t
+ libc.hdr.types.wint_t
+ libc.src.__support.CPP.array
+ libc.src.__support.CPP.expected
+ libc.src.__support.CPP.monostate
+ libc.src.__support.CPP.optional
+ libc.src.__support.CPP.span
+ libc.src.__support.CPP.string
+ libc.src.__support.CPP.tuple
+ libc.src.__support.CPP.type_traits
+ libc.src.__support.OSUtil.osutil
+ libc.src.__support.math.ceil
+ libc.src.__support.math.log
+)
+
+add_header_library(
+ lower_to_upper
+ HDRS
+ lower_to_upper.h
+ DEPENDS
+ .perfect_hash_map
+)
+
+add_header_library(
+ upper_to_lower
+ HDRS
+ upper_to_lower.h
+ DEPENDS
+ .perfect_hash_map
+)
+
add_object_library(
wctype_classification_utils
HDRS
diff --git a/libc/src/__support/wctype/lower_to_upper.h b/libc/src/__support/wctype/lower_to_upper.h
new file mode 100644
index 0000000000000..489089c6ea628
--- /dev/null
+++ b/libc/src/__support/wctype/lower_to_upper.h
@@ -0,0 +1,568 @@
+//===-- Auto-generated lower to upper case mappings table -------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+// DO NOT EDIT MANUALLY.
+// This file is generated by libc/utils/wctype_utils scripts.
+// This file is meant to be included directly into LLVM libc code
+// Format: {from_codepoint, to_codepoint}
+// Info: 1458 entries
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_WCTYPE_LOWER_TO_UPPER_H
+#define LLVM_LIBC_SRC___SUPPORT_WCTYPE_LOWER_TO_UPPER_H
+
+#include "perfect_hash_map.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LIBC_INLINE_VAR constexpr cpp::array<cpp::array<wint_t, 2>, 1458>
+ LOWER_TO_UPPER_DATA = {
+ {{0x61, 0x41}, {0x62, 0x42}, {0x63, 0x43},
+ {0x64, 0x44}, {0x65, 0x45}, {0x66, 0x46},
+ {0x67, 0x47}, {0x68, 0x48}, {0x69, 0x49},
+ {0x6A, 0x4A}, {0x6B, 0x4B}, {0x6C, 0x4C},
+ {0x6D, 0x4D}, {0x6E, 0x4E}, {0x6F, 0x4F},
+ {0x70, 0x50}, {0x71, 0x51}, {0x72, 0x52},
+ {0x73, 0x53}, {0x74, 0x54}, {0x75, 0x55},
+ {0x76, 0x56}, {0x77, 0x57}, {0x78, 0x58},
+ {0x79, 0x59}, {0x7A, 0x5A}, {0xB5, 0x39C},
+ {0xE0, 0xC0}, {0xE1, 0xC1}, {0xE2, 0xC2},
+ {0xE3, 0xC3}, {0xE4, 0xC4}, {0xE5, 0xC5},
+ {0xE6, 0xC6}, {0xE7, 0xC7}, {0xE8, 0xC8},
+ {0xE9, 0xC9}, {0xEA, 0xCA}, {0xEB, 0xCB},
+ {0xEC, 0xCC}, {0xED, 0xCD}, {0xEE, 0xCE},
+ {0xEF, 0xCF}, {0xF0, 0xD0}, {0xF1, 0xD1},
+ {0xF2, 0xD2}, {0xF3, 0xD3}, {0xF4, 0xD4},
+ {0xF5, 0xD5}, {0xF6, 0xD6}, {0xF8, 0xD8},
+ {0xF9, 0xD9}, {0xFA, 0xDA}, {0xFB, 0xDB},
+ {0xFC, 0xDC}, {0xFD, 0xDD}, {0xFE, 0xDE},
+ {0xFF, 0x178}, {0x101, 0x100}, {0x103, 0x102},
+ {0x105, 0x104}, {0x107, 0x106}, {0x109, 0x108},
+ {0x10B, 0x10A}, {0x10D, 0x10C}, {0x10F, 0x10E},
+ {0x111, 0x110}, {0x113, 0x112}, {0x115, 0x114},
+ {0x117, 0x116}, {0x119, 0x118}, {0x11B, 0x11A},
+ {0x11D, 0x11C}, {0x11F, 0x11E}, {0x121, 0x120},
+ {0x123, 0x122}, {0x125, 0x124}, {0x127, 0x126},
+ {0x129, 0x128}, {0x12B, 0x12A}, {0x12D, 0x12C},
+ {0x12F, 0x12E}, {0x131, 0x49}, {0x133, 0x132},
+ {0x135, 0x134}, {0x137, 0x136}, {0x13A, 0x139},
+ {0x13C, 0x13B}, {0x13E, 0x13D}, {0x140, 0x13F},
+ {0x142, 0x141}, {0x144, 0x143}, {0x146, 0x145},
+ {0x148, 0x147}, {0x14B, 0x14A}, {0x14D, 0x14C},
+ {0x14F, 0x14E}, {0x151, 0x150}, {0x153, 0x152},
+ {0x155, 0x154}, {0x157, 0x156}, {0x159, 0x158},
+ {0x15B, 0x15A}, {0x15D, 0x15C}, {0x15F, 0x15E},
+ {0x161, 0x160}, {0x163, 0x162}, {0x165, 0x164},
+ {0x167, 0x166}, {0x169, 0x168}, {0x16B, 0x16A},
+ {0x16D, 0x16C}, {0x16F, 0x16E}, {0x171, 0x170},
+ {0x173, 0x172}, {0x175, 0x174}, {0x177, 0x176},
+ {0x17A, 0x179}, {0x17C, 0x17B}, {0x17E, 0x17D},
+ {0x17F, 0x53}, {0x180, 0x243}, {0x183, 0x182},
+ {0x185, 0x184}, {0x188, 0x187}, {0x18C, 0x18B},
+ {0x192, 0x191}, {0x195, 0x1F6}, {0x199, 0x198},
+ {0x19A, 0x23D}, {0x19B, 0xA7DC}, {0x19E, 0x220},
+ {0x1A1, 0x1A0}, {0x1A3, 0x1A2}, {0x1A5, 0x1A4},
+ {0x1A8, 0x1A7}, {0x1AD, 0x1AC}, {0x1B0, 0x1AF},
+ {0x1B4, 0x1B3}, {0x1B6, 0x1B5}, {0x1B9, 0x1B8},
+ {0x1BD, 0x1BC}, {0x1BF, 0x1F7}, {0x1C6, 0x1C4},
+ {0x1C9, 0x1C7}, {0x1CC, 0x1CA}, {0x1CE, 0x1CD},
+ {0x1D0, 0x1CF}, {0x1D2, 0x1D1}, {0x1D4, 0x1D3},
+ {0x1D6, 0x1D5}, {0x1D8, 0x1D7}, {0x1DA, 0x1D9},
+ {0x1DC, 0x1DB}, {0x1DD, 0x18E}, {0x1DF, 0x1DE},
+ {0x1E1, 0x1E0}, {0x1E3, 0x1E2}, {0x1E5, 0x1E4},
+ {0x1E7, 0x1E6}, {0x1E9, 0x1E8}, {0x1EB, 0x1EA},
+ {0x1ED, 0x1EC}, {0x1EF, 0x1EE}, {0x1F3, 0x1F1},
+ {0x1F5, 0x1F4}, {0x1F9, 0x1F8}, {0x1FB, 0x1FA},
+ {0x1FD, 0x1FC}, {0x1FF, 0x1FE}, {0x201, 0x200},
+ {0x203, 0x202}, {0x205, 0x204}, {0x207, 0x206},
+ {0x209, 0x208}, {0x20B, 0x20A}, {0x20D, 0x20C},
+ {0x20F, 0x20E}, {0x211, 0x210}, {0x213, 0x212},
+ {0x215, 0x214}, {0x217, 0x216}, {0x219, 0x218},
+ {0x21B, 0x21A}, {0x21D, 0x21C}, {0x21F, 0x21E},
+ {0x223, 0x222}, {0x225, 0x224}, {0x227, 0x226},
+ {0x229, 0x228}, {0x22B, 0x22A}, {0x22D, 0x22C},
+ {0x22F, 0x22E}, {0x231, 0x230}, {0x233, 0x232},
+ {0x23C, 0x23B}, {0x23F, 0x2C7E}, {0x240, 0x2C7F},
+ {0x242, 0x241}, {0x247, 0x246}, {0x249, 0x248},
+ {0x24B, 0x24A}, {0x24D, 0x24C}, {0x24F, 0x24E},
+ {0x250, 0x2C6F}, {0x251, 0x2C6D}, {0x252, 0x2C70},
+ {0x253, 0x181}, {0x254, 0x186}, {0x256, 0x189},
+ {0x257, 0x18A}, {0x259, 0x18F}, {0x25B, 0x190},
+ {0x25C, 0xA7AB}, {0x260, 0x193}, {0x261, 0xA7AC},
+ {0x263, 0x194}, {0x264, 0xA7CB}, {0x265, 0xA78D},
+ {0x266, 0xA7AA}, {0x268, 0x197}, {0x269, 0x196},
+ {0x26A, 0xA7AE}, {0x26B, 0x2C62}, {0x26C, 0xA7AD},
+ {0x26F, 0x19C}, {0x271, 0x2C6E}, {0x272, 0x19D},
+ {0x275, 0x19F}, {0x27D, 0x2C64}, {0x280, 0x1A6},
+ {0x282, 0xA7C5}, {0x283, 0x1A9}, {0x287, 0xA7B1},
+ {0x288, 0x1AE}, {0x289, 0x244}, {0x28A, 0x1B1},
+ {0x28B, 0x1B2}, {0x28C, 0x245}, {0x292, 0x1B7},
+ {0x29D, 0xA7B2}, {0x29E, 0xA7B0}, {0x371, 0x370},
+ {0x373, 0x372}, {0x377, 0x376}, {0x37B, 0x3FD},
+ {0x37C, 0x3FE}, {0x37D, 0x3FF}, {0x3AC, 0x386},
+ {0x3AD, 0x388}, {0x3AE, 0x389}, {0x3AF, 0x38A},
+ {0x3B1, 0x391}, {0x3B2, 0x392}, {0x3B3, 0x393},
+ {0x3B4, 0x394}, {0x3B5, 0x395}, {0x3B6, 0x396},
+ {0x3B7, 0x397}, {0x3B8, 0x398}, {0x3B9, 0x399},
+ {0x3BA, 0x39A}, {0x3BB, 0x39B}, {0x3BC, 0x39C},
+ {0x3BD, 0x39D}, {0x3BE, 0x39E}, {0x3BF, 0x39F},
+ {0x3C0, 0x3A0}, {0x3C1, 0x3A1}, {0x3C2, 0x3A3},
+ {0x3C3, 0x3A3}, {0x3C4, 0x3A4}, {0x3C5, 0x3A5},
+ {0x3C6, 0x3A6}, {0x3C7, 0x3A7}, {0x3C8, 0x3A8},
+ {0x3C9, 0x3A9}, {0x3CA, 0x3AA}, {0x3CB, 0x3AB},
+ {0x3CC, 0x38C}, {0x3CD, 0x38E}, {0x3CE, 0x38F},
+ {0x3D0, 0x392}, {0x3D1, 0x398}, {0x3D5, 0x3A6},
+ {0x3D6, 0x3A0}, {0x3D7, 0x3CF}, {0x3D9, 0x3D8},
+ {0x3DB, 0x3DA}, {0x3DD, 0x3DC}, {0x3DF, 0x3DE},
+ {0x3E1, 0x3E0}, {0x3E3, 0x3E2}, {0x3E5, 0x3E4},
+ {0x3E7, 0x3E6}, {0x3E9, 0x3E8}, {0x3EB, 0x3EA},
+ {0x3ED, 0x3EC}, {0x3EF, 0x3EE}, {0x3F0, 0x39A},
+ {0x3F1, 0x3A1}, {0x3F2, 0x3F9}, {0x3F3, 0x37F},
+ {0x3F5, 0x395}, {0x3F8, 0x3F7}, {0x3FB, 0x3FA},
+ {0x430, 0x410}, {0x431, 0x411}, {0x432, 0x412},
+ {0x433, 0x413}, {0x434, 0x414}, {0x435, 0x415},
+ {0x436, 0x416}, {0x437, 0x417}, {0x438, 0x418},
+ {0x439, 0x419}, {0x43A, 0x41A}, {0x43B, 0x41B},
+ {0x43C, 0x41C}, {0x43D, 0x41D}, {0x43E, 0x41E},
+ {0x43F, 0x41F}, {0x440, 0x420}, {0x441, 0x421},
+ {0x442, 0x422}, {0x443, 0x423}, {0x444, 0x424},
+ {0x445, 0x425}, {0x446, 0x426}, {0x447, 0x427},
+ {0x448, 0x428}, {0x449, 0x429}, {0x44A, 0x42A},
+ {0x44B, 0x42B}, {0x44C, 0x42C}, {0x44D, 0x42D},
+ {0x44E, 0x42E}, {0x44F, 0x42F}, {0x450, 0x400},
+ {0x451, 0x401}, {0x452, 0x402}, {0x453, 0x403},
+ {0x454, 0x404}, {0x455, 0x405}, {0x456, 0x406},
+ {0x457, 0x407}, {0x458, 0x408}, {0x459, 0x409},
+ {0x45A, 0x40A}, {0x45B, 0x40B}, {0x45C, 0x40C},
+ {0x45D, 0x40D}, {0x45E, 0x40E}, {0x45F, 0x40F},
+ {0x461, 0x460}, {0x463, 0x462}, {0x465, 0x464},
+ {0x467, 0x466}, {0x469, 0x468}, {0x46B, 0x46A},
+ {0x46D, 0x46C}, {0x46F, 0x46E}, {0x471, 0x470},
+ {0x473, 0x472}, {0x475, 0x474}, {0x477, 0x476},
+ {0x479, 0x478}, {0x47B, 0x47A}, {0x47D, 0x47C},
+ {0x47F, 0x47E}, {0x481, 0x480}, {0x48B, 0x48A},
+ {0x48D, 0x48C}, {0x48F, 0x48E}, {0x491, 0x490},
+ {0x493, 0x492}, {0x495, 0x494}, {0x497, 0x496},
+ {0x499, 0x498}, {0x49B, 0x49A}, {0x49D, 0x49C},
+ {0x49F, 0x49E}, {0x4A1, 0x4A0}, {0x4A3, 0x4A2},
+ {0x4A5, 0x4A4}, {0x4A7, 0x4A6}, {0x4A9, 0x4A8},
+ {0x4AB, 0x4AA}, {0x4AD, 0x4AC}, {0x4AF, 0x4AE},
+ {0x4B1, 0x4B0}, {0x4B3, 0x4B2}, {0x4B5, 0x4B4},
+ {0x4B7, 0x4B6}, {0x4B9, 0x4B8}, {0x4BB, 0x4BA},
+ {0x4BD, 0x4BC}, {0x4BF, 0x4BE}, {0x4C2, 0x4C1},
+ {0x4C4, 0x4C3}, {0x4C6, 0x4C5}, {0x4C8, 0x4C7},
+ {0x4CA, 0x4C9}, {0x4CC, 0x4CB}, {0x4CE, 0x4CD},
+ {0x4CF, 0x4C0}, {0x4D1, 0x4D0}, {0x4D3, 0x4D2},
+ {0x4D5, 0x4D4}, {0x4D7, 0x4D6}, {0x4D9, 0x4D8},
+ {0x4DB, 0x4DA}, {0x4DD, 0x4DC}, {0x4DF, 0x4DE},
+ {0x4E1, 0x4E0}, {0x4E3, 0x4E2}, {0x4E5, 0x4E4},
+ {0x4E7, 0x4E6}, {0x4E9, 0x4E8}, {0x4EB, 0x4EA},
+ {0x4ED, 0x4EC}, {0x4EF, 0x4EE}, {0x4F1, 0x4F0},
+ {0x4F3, 0x4F2}, {0x4F5, 0x4F4}, {0x4F7, 0x4F6},
+ {0x4F9, 0x4F8}, {0x4FB, 0x4FA}, {0x4FD, 0x4FC},
+ {0x4FF, 0x4FE}, {0x501, 0x500}, {0x503, 0x502},
+ {0x505, 0x504}, {0x507, 0x506}, {0x509, 0x508},
+ {0x50B, 0x50A}, {0x50D, 0x50C}, {0x50F, 0x50E},
+ {0x511, 0x510}, {0x513, 0x512}, {0x515, 0x514},
+ {0x517, 0x516}, {0x519, 0x518}, {0x51B, 0x51A},
+ {0x51D, 0x51C}, {0x51F, 0x51E}, {0x521, 0x520},
+ {0x523, 0x522}, {0x525, 0x524}, {0x527, 0x526},
+ {0x529, 0x528}, {0x52B, 0x52A}, {0x52D, 0x52C},
+ {0x52F, 0x52E}, {0x561, 0x531}, {0x562, 0x532},
+ {0x563, 0x533}, {0x564, 0x534}, {0x565, 0x535},
+ {0x566, 0x536}, {0x567, 0x537}, {0x568, 0x538},
+ {0x569, 0x539}, {0x56A, 0x53A}, {0x56B, 0x53B},
+ {0x56C, 0x53C}, {0x56D, 0x53D}, {0x56E, 0x53E},
+ {0x56F, 0x53F}, {0x570, 0x540}, {0x571, 0x541},
+ {0x572, 0x542}, {0x573, 0x543}, {0x574, 0x544},
+ {0x575, 0x545}, {0x576, 0x546}, {0x577, 0x547},
+ {0x578, 0x548}, {0x579, 0x549}, {0x57A, 0x54A},
+ {0x57B, 0x54B}, {0x57C, 0x54C}, {0x57D, 0x54D},
+ {0x57E, 0x54E}, {0x57F, 0x54F}, {0x580, 0x550},
+ {0x581, 0x551}, {0x582, 0x552}, {0x583, 0x553},
+ {0x584, 0x554}, {0x585, 0x555}, {0x586, 0x556},
+ {0x10D0, 0x1C90}, {0x10D1, 0x1C91}, {0x10D2, 0x1C92},
+ {0x10D3, 0x1C93}, {0x10D4, 0x1C94}, {0x10D5, 0x1C95},
+ {0x10D6, 0x1C96}, {0x10D7, 0x1C97}, {0x10D8, 0x1C98},
+ {0x10D9, 0x1C99}, {0x10DA, 0x1C9A}, {0x10DB, 0x1C9B},
+ {0x10DC, 0x1C9C}, {0x10DD, 0x1C9D}, {0x10DE, 0x1C9E},
+ {0x10DF, 0x1C9F}, {0x10E0, 0x1CA0}, {0x10E1, 0x1CA1},
+ {0x10E2, 0x1CA2}, {0x10E3, 0x1CA3}, {0x10E4, 0x1CA4},
+ {0x10E5, 0x1CA5}, {0x10E6, 0x1CA6}, {0x10E7, 0x1CA7},
+ {0x10E8, 0x1CA8}, {0x10E9, 0x1CA9}, {0x10EA, 0x1CAA},
+ {0x10EB, 0x1CAB}, {0x10EC, 0x1CAC}, {0x10ED, 0x1CAD},
+ {0x10EE, 0x1CAE}, {0x10EF, 0x1CAF}, {0x10F0, 0x1CB0},
+ {0x10F1, 0x1CB1}, {0x10F2, 0x1CB2}, {0x10F3, 0x1CB3},
+ {0x10F4, 0x1CB4}, {0x10F5, 0x1CB5}, {0x10F6, 0x1CB6},
+ {0x10F7, 0x1CB7}, {0x10F8, 0x1CB8}, {0x10F9, 0x1CB9},
+ {0x10FA, 0x1CBA}, {0x10FD, 0x1CBD}, {0x10FE, 0x1CBE},
+ {0x10FF, 0x1CBF}, {0x13F8, 0x13F0}, {0x13F9, 0x13F1},
+ {0x13FA, 0x13F2}, {0x13FB, 0x13F3}, {0x13FC, 0x13F4},
+ {0x13FD, 0x13F5}, {0x1C80, 0x412}, {0x1C81, 0x414},
+ {0x1C82, 0x41E}, {0x1C83, 0x421}, {0x1C84, 0x422},
+ {0x1C85, 0x422}, {0x1C86, 0x42A}, {0x1C87, 0x462},
+ {0x1C88, 0xA64A}, {0x1C8A, 0x1C89}, {0x1D79, 0xA77D},
+ {0x1D7D, 0x2C63}, {0x1D8E, 0xA7C6}, {0x1E01, 0x1E00},
+ {0x1E03, 0x1E02}, {0x1E05, 0x1E04}, {0x1E07, 0x1E06},
+ {0x1E09, 0x1E08}, {0x1E0B, 0x1E0A}, {0x1E0D, 0x1E0C},
+ {0x1E0F, 0x1E0E}, {0x1E11, 0x1E10}, {0x1E13, 0x1E12},
+ {0x1E15, 0x1E14}, {0x1E17, 0x1E16}, {0x1E19, 0x1E18},
+ {0x1E1B, 0x1E1A}, {0x1E1D, 0x1E1C}, {0x1E1F, 0x1E1E},
+ {0x1E21, 0x1E20}, {0x1E23, 0x1E22}, {0x1E25, 0x1E24},
+ {0x1E27, 0x1E26}, {0x1E29, 0x1E28}, {0x1E2B, 0x1E2A},
+ {0x1E2D, 0x1E2C}, {0x1E2F, 0x1E2E}, {0x1E31, 0x1E30},
+ {0x1E33, 0x1E32}, {0x1E35, 0x1E34}, {0x1E37, 0x1E36},
+ {0x1E39, 0x1E38}, {0x1E3B, 0x1E3A}, {0x1E3D, 0x1E3C},
+ {0x1E3F, 0x1E3E}, {0x1E41, 0x1E40}, {0x1E43, 0x1E42},
+ {0x1E45, 0x1E44}, {0x1E47, 0x1E46}, {0x1E49, 0x1E48},
+ {0x1E4B, 0x1E4A}, {0x1E4D, 0x1E4C}, {0x1E4F, 0x1E4E},
+ {0x1E51, 0x1E50}, {0x1E53, 0x1E52}, {0x1E55, 0x1E54},
+ {0x1E57, 0x1E56}, {0x1E59, 0x1E58}, {0x1E5B, 0x1E5A},
+ {0x1E5D, 0x1E5C}, {0x1E5F, 0x1E5E}, {0x1E61, 0x1E60},
+ {0x1E63, 0x1E62}, {0x1E65, 0x1E64}, {0x1E67, 0x1E66},
+ {0x1E69, 0x1E68}, {0x1E6B, 0x1E6A}, {0x1E6D, 0x1E6C},
+ {0x1E6F, 0x1E6E}, {0x1E71, 0x1E70}, {0x1E73, 0x1E72},
+ {0x1E75, 0x1E74}, {0x1E77, 0x1E76}, {0x1E79, 0x1E78},
+ {0x1E7B, 0x1E7A}, {0x1E7D, 0x1E7C}, {0x1E7F, 0x1E7E},
+ {0x1E81, 0x1E80}, {0x1E83, 0x1E82}, {0x1E85, 0x1E84},
+ {0x1E87, 0x1E86}, {0x1E89, 0x1E88}, {0x1E8B, 0x1E8A},
+ {0x1E8D, 0x1E8C}, {0x1E8F, 0x1E8E}, {0x1E91, 0x1E90},
+ {0x1E93, 0x1E92}, {0x1E95, 0x1E94}, {0x1E9B, 0x1E60},
+ {0x1EA1, 0x1EA0}, {0x1EA3, 0x1EA2}, {0x1EA5, 0x1EA4},
+ {0x1EA7, 0x1EA6}, {0x1EA9, 0x1EA8}, {0x1EAB, 0x1EAA},
+ {0x1EAD, 0x1EAC}, {0x1EAF, 0x1EAE}, {0x1EB1, 0x1EB0},
+ {0x1EB3, 0x1EB2}, {0x1EB5, 0x1EB4}, {0x1EB7, 0x1EB6},
+ {0x1EB9, 0x1EB8}, {0x1EBB, 0x1EBA}, {0x1EBD, 0x1EBC},
+ {0x1EBF, 0x1EBE}, {0x1EC1, 0x1EC0}, {0x1EC3, 0x1EC2},
+ {0x1EC5, 0x1EC4}, {0x1EC7, 0x1EC6}, {0x1EC9, 0x1EC8},
+ {0x1ECB, 0x1ECA}, {0x1ECD, 0x1ECC}, {0x1ECF, 0x1ECE},
+ {0x1ED1, 0x1ED0}, {0x1ED3, 0x1ED2}, {0x1ED5, 0x1ED4},
+ {0x1ED7, 0x1ED6}, {0x1ED9, 0x1ED8}, {0x1EDB, 0x1EDA},
+ {0x1EDD, 0x1EDC}, {0x1EDF, 0x1EDE}, {0x1EE1, 0x1EE0},
+ {0x1EE3, 0x1EE2}, {0x1EE5, 0x1EE4}, {0x1EE7, 0x1EE6},
+ {0x1EE9, 0x1EE8}, {0x1EEB, 0x1EEA}, {0x1EED, 0x1EEC},
+ {0x1EEF, 0x1EEE}, {0x1EF1, 0x1EF0}, {0x1EF3, 0x1EF2},
+ {0x1EF5, 0x1EF4}, {0x1EF7, 0x1EF6}, {0x1EF9, 0x1EF8},
+ {0x1EFB, 0x1EFA}, {0x1EFD, 0x1EFC}, {0x1EFF, 0x1EFE},
+ {0x1F00, 0x1F08}, {0x1F01, 0x1F09}, {0x1F02, 0x1F0A},
+ {0x1F03, 0x1F0B}, {0x1F04, 0x1F0C}, {0x1F05, 0x1F0D},
+ {0x1F06, 0x1F0E}, {0x1F07, 0x1F0F}, {0x1F10, 0x1F18},
+ {0x1F11, 0x1F19}, {0x1F12, 0x1F1A}, {0x1F13, 0x1F1B},
+ {0x1F14, 0x1F1C}, {0x1F15, 0x1F1D}, {0x1F20, 0x1F28},
+ {0x1F21, 0x1F29}, {0x1F22, 0x1F2A}, {0x1F23, 0x1F2B},
+ {0x1F24, 0x1F2C}, {0x1F25, 0x1F2D}, {0x1F26, 0x1F2E},
+ {0x1F27, 0x1F2F}, {0x1F30, 0x1F38}, {0x1F31, 0x1F39},
+ {0x1F32, 0x1F3A}, {0x1F33, 0x1F3B}, {0x1F34, 0x1F3C},
+ {0x1F35, 0x1F3D}, {0x1F36, 0x1F3E}, {0x1F37, 0x1F3F},
+ {0x1F40, 0x1F48}, {0x1F41, 0x1F49}, {0x1F42, 0x1F4A},
+ {0x1F43, 0x1F4B}, {0x1F44, 0x1F4C}, {0x1F45, 0x1F4D},
+ {0x1F51, 0x1F59}, {0x1F53, 0x1F5B}, {0x1F55, 0x1F5D},
+ {0x1F57, 0x1F5F}, {0x1F60, 0x1F68}, {0x1F61, 0x1F69},
+ {0x1F62, 0x1F6A}, {0x1F63, 0x1F6B}, {0x1F64, 0x1F6C},
+ {0x1F65, 0x1F6D}, {0x1F66, 0x1F6E}, {0x1F67, 0x1F6F},
+ {0x1F70, 0x1FBA}, {0x1F71, 0x1FBB}, {0x1F72, 0x1FC8},
+ {0x1F73, 0x1FC9}, {0x1F74, 0x1FCA}, {0x1F75, 0x1FCB},
+ {0x1F76, 0x1FDA}, {0x1F77, 0x1FDB}, {0x1F78, 0x1FF8},
+ {0x1F79, 0x1FF9}, {0x1F7A, 0x1FEA}, {0x1F7B, 0x1FEB},
+ {0x1F7C, 0x1FFA}, {0x1F7D, 0x1FFB}, {0x1F80, 0x1F88},
+ {0x1F81, 0x1F89}, {0x1F82, 0x1F8A}, {0x1F83, 0x1F8B},
+ {0x1F84, 0x1F8C}, {0x1F85, 0x1F8D}, {0x1F86, 0x1F8E},
+ {0x1F87, 0x1F8F}, {0x1F90, 0x1F98}, {0x1F91, 0x1F99},
+ {0x1F92, 0x1F9A}, {0x1F93, 0x1F9B}, {0x1F94, 0x1F9C},
+ {0x1F95, 0x1F9D}, {0x1F96, 0x1F9E}, {0x1F97, 0x1F9F},
+ {0x1FA0, 0x1FA8}, {0x1FA1, 0x1FA9}, {0x1FA2, 0x1FAA},
+ {0x1FA3, 0x1FAB}, {0x1FA4, 0x1FAC}, {0x1FA5, 0x1FAD},
+ {0x1FA6, 0x1FAE}, {0x1FA7, 0x1FAF}, {0x1FB0, 0x1FB8},
+ {0x1FB1, 0x1FB9}, {0x1FB3, 0x1FBC}, {0x1FBE, 0x399},
+ {0x1FC3, 0x1FCC}, {0x1FD0, 0x1FD8}, {0x1FD1, 0x1FD9},
+ {0x1FE0, 0x1FE8}, {0x1FE1, 0x1FE9}, {0x1FE5, 0x1FEC},
+ {0x1FF3, 0x1FFC}, {0x214E, 0x2132}, {0x2184, 0x2183},
+ {0x2C30, 0x2C00}, {0x2C31, 0x2C01}, {0x2C32, 0x2C02},
+ {0x2C33, 0x2C03}, {0x2C34, 0x2C04}, {0x2C35, 0x2C05},
+ {0x2C36, 0x2C06}, {0x2C37, 0x2C07}, {0x2C38, 0x2C08},
+ {0x2C39, 0x2C09}, {0x2C3A, 0x2C0A}, {0x2C3B, 0x2C0B},
+ {0x2C3C, 0x2C0C}, {0x2C3D, 0x2C0D}, {0x2C3E, 0x2C0E},
+ {0x2C3F, 0x2C0F}, {0x2C40, 0x2C10}, {0x2C41, 0x2C11},
+ {0x2C42, 0x2C12}, {0x2C43, 0x2C13}, {0x2C44, 0x2C14},
+ {0x2C45, 0x2C15}, {0x2C46, 0x2C16}, {0x2C47, 0x2C17},
+ {0x2C48, 0x2C18}, {0x2C49, 0x2C19}, {0x2C4A, 0x2C1A},
+ {0x2C4B, 0x2C1B}, {0x2C4C, 0x2C1C}, {0x2C4D, 0x2C1D},
+ {0x2C4E, 0x2C1E}, {0x2C4F, 0x2C1F}, {0x2C50, 0x2C20},
+ {0x2C51, 0x2C21}, {0x2C52, 0x2C22}, {0x2C53, 0x2C23},
+ {0x2C54, 0x2C24}, {0x2C55, 0x2C25}, {0x2C56, 0x2C26},
+ {0x2C57, 0x2C27}, {0x2C58, 0x2C28}, {0x2C59, 0x2C29},
+ {0x2C5A, 0x2C2A}, {0x2C5B, 0x2C2B}, {0x2C5C, 0x2C2C},
+ {0x2C5D, 0x2C2D}, {0x2C5E, 0x2C2E}, {0x2C5F, 0x2C2F},
+ {0x2C61, 0x2C60}, {0x2C65, 0x23A}, {0x2C66, 0x23E},
+ {0x2C68, 0x2C67}, {0x2C6A, 0x2C69}, {0x2C6C, 0x2C6B},
+ {0x2C73, 0x2C72}, {0x2C76, 0x2C75}, {0x2C81, 0x2C80},
+ {0x2C83, 0x2C82}, {0x2C85, 0x2C84}, {0x2C87, 0x2C86},
+ {0x2C89, 0x2C88}, {0x2C8B, 0x2C8A}, {0x2C8D, 0x2C8C},
+ {0x2C8F, 0x2C8E}, {0x2C91, 0x2C90}, {0x2C93, 0x2C92},
+ {0x2C95, 0x2C94}, {0x2C97, 0x2C96}, {0x2C99, 0x2C98},
+ {0x2C9B, 0x2C9A}, {0x2C9D, 0x2C9C}, {0x2C9F, 0x2C9E},
+ {0x2CA1, 0x2CA0}, {0x2CA3, 0x2CA2}, {0x2CA5, 0x2CA4},
+ {0x2CA7, 0x2CA6}, {0x2CA9, 0x2CA8}, {0x2CAB, 0x2CAA},
+ {0x2CAD, 0x2CAC}, {0x2CAF, 0x2CAE}, {0x2CB1, 0x2CB0},
+ {0x2CB3, 0x2CB2}, {0x2CB5, 0x2CB4}, {0x2CB7, 0x2CB6},
+ {0x2CB9, 0x2CB8}, {0x2CBB, 0x2CBA}, {0x2CBD, 0x2CBC},
+ {0x2CBF, 0x2CBE}, {0x2CC1, 0x2CC0}, {0x2CC3, 0x2CC2},
+ {0x2CC5, 0x2CC4}, {0x2CC7, 0x2CC6}, {0x2CC9, 0x2CC8},
+ {0x2CCB, 0x2CCA}, {0x2CCD, 0x2CCC}, {0x2CCF, 0x2CCE},
+ {0x2CD1, 0x2CD0}, {0x2CD3, 0x2CD2}, {0x2CD5, 0x2CD4},
+ {0x2CD7, 0x2CD6}, {0x2CD9, 0x2CD8}, {0x2CDB, 0x2CDA},
+ {0x2CDD, 0x2CDC}, {0x2CDF, 0x2CDE}, {0x2CE1, 0x2CE0},
+ {0x2CE3, 0x2CE2}, {0x2CEC, 0x2CEB}, {0x2CEE, 0x2CED},
+ {0x2CF3, 0x2CF2}, {0x2D00, 0x10A0}, {0x2D01, 0x10A1},
+ {0x2D02, 0x10A2}, {0x2D03, 0x10A3}, {0x2D04, 0x10A4},
+ {0x2D05, 0x10A5}, {0x2D06, 0x10A6}, {0x2D07, 0x10A7},
+ {0x2D08, 0x10A8}, {0x2D09, 0x10A9}, {0x2D0A, 0x10AA},
+ {0x2D0B, 0x10AB}, {0x2D0C, 0x10AC}, {0x2D0D, 0x10AD},
+ {0x2D0E, 0x10AE}, {0x2D0F, 0x10AF}, {0x2D10, 0x10B0},
+ {0x2D11, 0x10B1}, {0x2D12, 0x10B2}, {0x2D13, 0x10B3},
+ {0x2D14, 0x10B4}, {0x2D15, 0x10B5}, {0x2D16, 0x10B6},
+ {0x2D17, 0x10B7}, {0x2D18, 0x10B8}, {0x2D19, 0x10B9},
+ {0x2D1A, 0x10BA}, {0x2D1B, 0x10BB}, {0x2D1C, 0x10BC},
+ {0x2D1D, 0x10BD}, {0x2D1E, 0x10BE}, {0x2D1F, 0x10BF},
+ {0x2D20, 0x10C0}, {0x2D21, 0x10C1}, {0x2D22, 0x10C2},
+ {0x2D23, 0x10C3}, {0x2D24, 0x10C4}, {0x2D25, 0x10C5},
+ {0x2D27, 0x10C7}, {0x2D2D, 0x10CD}, {0xA641, 0xA640},
+ {0xA643, 0xA642}, {0xA645, 0xA644}, {0xA647, 0xA646},
+ {0xA649, 0xA648}, {0xA64B, 0xA64A}, {0xA64D, 0xA64C},
+ {0xA64F, 0xA64E}, {0xA651, 0xA650}, {0xA653, 0xA652},
+ {0xA655, 0xA654}, {0xA657, 0xA656}, {0xA659, 0xA658},
+ {0xA65B, 0xA65A}, {0xA65D, 0xA65C}, {0xA65F, 0xA65E},
+ {0xA661, 0xA660}, {0xA663, 0xA662}, {0xA665, 0xA664},
+ {0xA667, 0xA666}, {0xA669, 0xA668}, {0xA66B, 0xA66A},
+ {0xA66D, 0xA66C}, {0xA681, 0xA680}, {0xA683, 0xA682},
+ {0xA685, 0xA684}, {0xA687, 0xA686}, {0xA689, 0xA688},
+ {0xA68B, 0xA68A}, {0xA68D, 0xA68C}, {0xA68F, 0xA68E},
+ {0xA691, 0xA690}, {0xA693, 0xA692}, {0xA695, 0xA694},
+ {0xA697, 0xA696}, {0xA699, 0xA698}, {0xA69B, 0xA69A},
+ {0xA723, 0xA722}, {0xA725, 0xA724}, {0xA727, 0xA726},
+ {0xA729, 0xA728}, {0xA72B, 0xA72A}, {0xA72D, 0xA72C},
+ {0xA72F, 0xA72E}, {0xA733, 0xA732}, {0xA735, 0xA734},
+ {0xA737, 0xA736}, {0xA739, 0xA738}, {0xA73B, 0xA73A},
+ {0xA73D, 0xA73C}, {0xA73F, 0xA73E}, {0xA741, 0xA740},
+ {0xA743, 0xA742}, {0xA745, 0xA744}, {0xA747, 0xA746},
+ {0xA749, 0xA748}, {0xA74B, 0xA74A}, {0xA74D, 0xA74C},
+ {0xA74F, 0xA74E}, {0xA751, 0xA750}, {0xA753, 0xA752},
+ {0xA755, 0xA754}, {0xA757, 0xA756}, {0xA759, 0xA758},
+ {0xA75B, 0xA75A}, {0xA75D, 0xA75C}, {0xA75F, 0xA75E},
+ {0xA761, 0xA760}, {0xA763, 0xA762}, {0xA765, 0xA764},
+ {0xA767, 0xA766}, {0xA769, 0xA768}, {0xA76B, 0xA76A},
+ {0xA76D, 0xA76C}, {0xA76F, 0xA76E}, {0xA77A, 0xA779},
+ {0xA77C, 0xA77B}, {0xA77F, 0xA77E}, {0xA781, 0xA780},
+ {0xA783, 0xA782}, {0xA785, 0xA784}, {0xA787, 0xA786},
+ {0xA78C, 0xA78B}, {0xA791, 0xA790}, {0xA793, 0xA792},
+ {0xA794, 0xA7C4}, {0xA797, 0xA796}, {0xA799, 0xA798},
+ {0xA79B, 0xA79A}, {0xA79D, 0xA79C}, {0xA79F, 0xA79E},
+ {0xA7A1, 0xA7A0}, {0xA7A3, 0xA7A2}, {0xA7A5, 0xA7A4},
+ {0xA7A7, 0xA7A6}, {0xA7A9, 0xA7A8}, {0xA7B5, 0xA7B4},
+ {0xA7B7, 0xA7B6}, {0xA7B9, 0xA7B8}, {0xA7BB, 0xA7BA},
+ {0xA7BD, 0xA7BC}, {0xA7BF, 0xA7BE}, {0xA7C1, 0xA7C0},
+ {0xA7C3, 0xA7C2}, {0xA7C8, 0xA7C7}, {0xA7CA, 0xA7C9},
+ {0xA7CD, 0xA7CC}, {0xA7CF, 0xA7CE}, {0xA7D1, 0xA7D0},
+ {0xA7D3, 0xA7D2}, {0xA7D5, 0xA7D4}, {0xA7D7, 0xA7D6},
+ {0xA7D9, 0xA7D8}, {0xA7DB, 0xA7DA}, {0xA7F6, 0xA7F5},
+ {0xAB53, 0xA7B3}, {0xAB70, 0x13A0}, {0xAB71, 0x13A1},
+ {0xAB72, 0x13A2}, {0xAB73, 0x13A3}, {0xAB74, 0x13A4},
+ {0xAB75, 0x13A5}, {0xAB76, 0x13A6}, {0xAB77, 0x13A7},
+ {0xAB78, 0x13A8}, {0xAB79, 0x13A9}, {0xAB7A, 0x13AA},
+ {0xAB7B, 0x13AB}, {0xAB7C, 0x13AC}, {0xAB7D, 0x13AD},
+ {0xAB7E, 0x13AE}, {0xAB7F, 0x13AF}, {0xAB80, 0x13B0},
+ {0xAB81, 0x13B1}, {0xAB82, 0x13B2}, {0xAB83, 0x13B3},
+ {0xAB84, 0x13B4}, {0xAB85, 0x13B5}, {0xAB86, 0x13B6},
+ {0xAB87, 0x13B7}, {0xAB88, 0x13B8}, {0xAB89, 0x13B9},
+ {0xAB8A, 0x13BA}, {0xAB8B, 0x13BB}, {0xAB8C, 0x13BC},
+ {0xAB8D, 0x13BD}, {0xAB8E, 0x13BE}, {0xAB8F, 0x13BF},
+ {0xAB90, 0x13C0}, {0xAB91, 0x13C1}, {0xAB92, 0x13C2},
+ {0xAB93, 0x13C3}, {0xAB94, 0x13C4}, {0xAB95, 0x13C5},
+ {0xAB96, 0x13C6}, {0xAB97, 0x13C7}, {0xAB98, 0x13C8},
+ {0xAB99, 0x13C9}, {0xAB9A, 0x13CA}, {0xAB9B, 0x13CB},
+ {0xAB9C, 0x13CC}, {0xAB9D, 0x13CD}, {0xAB9E, 0x13CE},
+ {0xAB9F, 0x13CF}, {0xABA0, 0x13D0}, {0xABA1, 0x13D1},
+ {0xABA2, 0x13D2}, {0xABA3, 0x13D3}, {0xABA4, 0x13D4},
+ {0xABA5, 0x13D5}, {0xABA6, 0x13D6}, {0xABA7, 0x13D7},
+ {0xABA8, 0x13D8}, {0xABA9, 0x13D9}, {0xABAA, 0x13DA},
+ {0xABAB, 0x13DB}, {0xABAC, 0x13DC}, {0xABAD, 0x13DD},
+ {0xABAE, 0x13DE}, {0xABAF, 0x13DF}, {0xABB0, 0x13E0},
+ {0xABB1, 0x13E1}, {0xABB2, 0x13E2}, {0xABB3, 0x13E3},
+ {0xABB4, 0x13E4}, {0xABB5, 0x13E5}, {0xABB6, 0x13E6},
+ {0xABB7, 0x13E7}, {0xABB8, 0x13E8}, {0xABB9, 0x13E9},
+ {0xABBA, 0x13EA}, {0xABBB, 0x13EB}, {0xABBC, 0x13EC},
+ {0xABBD, 0x13ED}, {0xABBE, 0x13EE}, {0xABBF, 0x13EF},
+ {0xFF41, 0xFF21}, {0xFF42, 0xFF22}, {0xFF43, 0xFF23},
+ {0xFF44, 0xFF24}, {0xFF45, 0xFF25}, {0xFF46, 0xFF26},
+ {0xFF47, 0xFF27}, {0xFF48, 0xFF28}, {0xFF49, 0xFF29},
+ {0xFF4A, 0xFF2A}, {0xFF4B, 0xFF2B}, {0xFF4C, 0xFF2C},
+ {0xFF4D, 0xFF2D}, {0xFF4E, 0xFF2E}, {0xFF4F, 0xFF2F},
+ {0xFF50, 0xFF30}, {0xFF51, 0xFF31}, {0xFF52, 0xFF32},
+ {0xFF53, 0xFF33}, {0xFF54, 0xFF34}, {0xFF55, 0xFF35},
+ {0xFF56, 0xFF36}, {0xFF57, 0xFF37}, {0xFF58, 0xFF38},
+ {0xFF59, 0xFF39}, {0xFF5A, 0xFF3A}, {0x10428, 0x10400},
+ {0x10429, 0x10401}, {0x1042A, 0x10402}, {0x1042B, 0x10403},
+ {0x1042C, 0x10404}, {0x1042D, 0x10405}, {0x1042E, 0x10406},
+ {0x1042F, 0x10407}, {0x10430, 0x10408}, {0x10431, 0x10409},
+ {0x10432, 0x1040A}, {0x10433, 0x1040B}, {0x10434, 0x1040C},
+ {0x10435, 0x1040D}, {0x10436, 0x1040E}, {0x10437, 0x1040F},
+ {0x10438, 0x10410}, {0x10439, 0x10411}, {0x1043A, 0x10412},
+ {0x1043B, 0x10413}, {0x1043C, 0x10414}, {0x1043D, 0x10415},
+ {0x1043E, 0x10416}, {0x1043F, 0x10417}, {0x10440, 0x10418},
+ {0x10441, 0x10419}, {0x10442, 0x1041A}, {0x10443, 0x1041B},
+ {0x10444, 0x1041C}, {0x10445, 0x1041D}, {0x10446, 0x1041E},
+ {0x10447, 0x1041F}, {0x10448, 0x10420}, {0x10449, 0x10421},
+ {0x1044A, 0x10422}, {0x1044B, 0x10423}, {0x1044C, 0x10424},
+ {0x1044D, 0x10425}, {0x1044E, 0x10426}, {0x1044F, 0x10427},
+ {0x104D8, 0x104B0}, {0x104D9, 0x104B1}, {0x104DA, 0x104B2},
+ {0x104DB, 0x104B3}, {0x104DC, 0x104B4}, {0x104DD, 0x104B5},
+ {0x104DE, 0x104B6}, {0x104DF, 0x104B7}, {0x104E0, 0x104B8},
+ {0x104E1, 0x104B9}, {0x104E2, 0x104BA}, {0x104E3, 0x104BB},
+ {0x104E4, 0x104BC}, {0x104E5, 0x104BD}, {0x104E6, 0x104BE},
+ {0x104E7, 0x104BF}, {0x104E8, 0x104C0}, {0x104E9, 0x104C1},
+ {0x104EA, 0x104C2}, {0x104EB, 0x104C3}, {0x104EC, 0x104C4},
+ {0x104ED, 0x104C5}, {0x104EE, 0x104C6}, {0x104EF, 0x104C7},
+ {0x104F0, 0x104C8}, {0x104F1, 0x104C9}, {0x104F2, 0x104CA},
+ {0x104F3, 0x104CB}, {0x104F4, 0x104CC}, {0x104F5, 0x104CD},
+ {0x104F6, 0x104CE}, {0x104F7, 0x104CF}, {0x104F8, 0x104D0},
+ {0x104F9, 0x104D1}, {0x104FA, 0x104D2}, {0x104FB, 0x104D3},
+ {0x10597, 0x10570}, {0x10598, 0x10571}, {0x10599, 0x10572},
+ {0x1059A, 0x10573}, {0x1059B, 0x10574}, {0x1059C, 0x10575},
+ {0x1059D, 0x10576}, {0x1059E, 0x10577}, {0x1059F, 0x10578},
+ {0x105A0, 0x10579}, {0x105A1, 0x1057A}, {0x105A3, 0x1057C},
+ {0x105A4, 0x1057D}, {0x105A5, 0x1057E}, {0x105A6, 0x1057F},
+ {0x105A7, 0x10580}, {0x105A8, 0x10581}, {0x105A9, 0x10582},
+ {0x105AA, 0x10583}, {0x105AB, 0x10584}, {0x105AC, 0x10585},
+ {0x105AD, 0x10586}, {0x105AE, 0x10587}, {0x105AF, 0x10588},
+ {0x105B0, 0x10589}, {0x105B1, 0x1058A}, {0x105B3, 0x1058C},
+ {0x105B4, 0x1058D}, {0x105B5, 0x1058E}, {0x105B6, 0x1058F},
+ {0x105B7, 0x10590}, {0x105B8, 0x10591}, {0x105B9, 0x10592},
+ {0x105BB, 0x10594}, {0x105BC, 0x10595}, {0x10CC0, 0x10C80},
+ {0x10CC1, 0x10C81}, {0x10CC2, 0x10C82}, {0x10CC3, 0x10C83},
+ {0x10CC4, 0x10C84}, {0x10CC5, 0x10C85}, {0x10CC6, 0x10C86},
+ {0x10CC7, 0x10C87}, {0x10CC8, 0x10C88}, {0x10CC9, 0x10C89},
+ {0x10CCA, 0x10C8A}, {0x10CCB, 0x10C8B}, {0x10CCC, 0x10C8C},
+ {0x10CCD, 0x10C8D}, {0x10CCE, 0x10C8E}, {0x10CCF, 0x10C8F},
+ {0x10CD0, 0x10C90}, {0x10CD1, 0x10C91}, {0x10CD2, 0x10C92},
+ {0x10CD3, 0x10C93}, {0x10CD4, 0x10C94}, {0x10CD5, 0x10C95},
+ {0x10CD6, 0x10C96}, {0x10CD7, 0x10C97}, {0x10CD8, 0x10C98},
+ {0x10CD9, 0x10C99}, {0x10CDA, 0x10C9A}, {0x10CDB, 0x10C9B},
+ {0x10CDC, 0x10C9C}, {0x10CDD, 0x10C9D}, {0x10CDE, 0x10C9E},
+ {0x10CDF, 0x10C9F}, {0x10CE0, 0x10CA0}, {0x10CE1, 0x10CA1},
+ {0x10CE2, 0x10CA2}, {0x10CE3, 0x10CA3}, {0x10CE4, 0x10CA4},
+ {0x10CE5, 0x10CA5}, {0x10CE6, 0x10CA6}, {0x10CE7, 0x10CA7},
+ {0x10CE8, 0x10CA8}, {0x10CE9, 0x10CA9}, {0x10CEA, 0x10CAA},
+ {0x10CEB, 0x10CAB}, {0x10CEC, 0x10CAC}, {0x10CED, 0x10CAD},
+ {0x10CEE, 0x10CAE}, {0x10CEF, 0x10CAF}, {0x10CF0, 0x10CB0},
+ {0x10CF1, 0x10CB1}, {0x10CF2, 0x10CB2}, {0x10D70, 0x10D50},
+ {0x10D71, 0x10D51}, {0x10D72, 0x10D52}, {0x10D73, 0x10D53},
+ {0x10D74, 0x10D54}, {0x10D75, 0x10D55}, {0x10D76, 0x10D56},
+ {0x10D77, 0x10D57}, {0x10D78, 0x10D58}, {0x10D79, 0x10D59},
+ {0x10D7A, 0x10D5A}, {0x10D7B, 0x10D5B}, {0x10D7C, 0x10D5C},
+ {0x10D7D, 0x10D5D}, {0x10D7E, 0x10D5E}, {0x10D7F, 0x10D5F},
+ {0x10D80, 0x10D60}, {0x10D81, 0x10D61}, {0x10D82, 0x10D62},
+ {0x10D83, 0x10D63}, {0x10D84, 0x10D64}, {0x10D85, 0x10D65},
+ {0x118C0, 0x118A0}, {0x118C1, 0x118A1}, {0x118C2, 0x118A2},
+ {0x118C3, 0x118A3}, {0x118C4, 0x118A4}, {0x118C5, 0x118A5},
+ {0x118C6, 0x118A6}, {0x118C7, 0x118A7}, {0x118C8, 0x118A8},
+ {0x118C9, 0x118A9}, {0x118CA, 0x118AA}, {0x118CB, 0x118AB},
+ {0x118CC, 0x118AC}, {0x118CD, 0x118AD}, {0x118CE, 0x118AE},
+ {0x118CF, 0x118AF}, {0x118D0, 0x118B0}, {0x118D1, 0x118B1},
+ {0x118D2, 0x118B2}, {0x118D3, 0x118B3}, {0x118D4, 0x118B4},
+ {0x118D5, 0x118B5}, {0x118D6, 0x118B6}, {0x118D7, 0x118B7},
+ {0x118D8, 0x118B8}, {0x118D9, 0x118B9}, {0x118DA, 0x118BA},
+ {0x118DB, 0x118BB}, {0x118DC, 0x118BC}, {0x118DD, 0x118BD},
+ {0x118DE, 0x118BE}, {0x118DF, 0x118BF}, {0x16E60, 0x16E40},
+ {0x16E61, 0x16E41}, {0x16E62, 0x16E42}, {0x16E63, 0x16E43},
+ {0x16E64, 0x16E44}, {0x16E65, 0x16E45}, {0x16E66, 0x16E46},
+ {0x16E67, 0x16E47}, {0x16E68, 0x16E48}, {0x16E69, 0x16E49},
+ {0x16E6A, 0x16E4A}, {0x16E6B, 0x16E4B}, {0x16E6C, 0x16E4C},
+ {0x16E6D, 0x16E4D}, {0x16E6E, 0x16E4E}, {0x16E6F, 0x16E4F},
+ {0x16E70, 0x16E50}, {0x16E71, 0x16E51}, {0x16E72, 0x16E52},
+ {0x16E73, 0x16E53}, {0x16E74, 0x16E54}, {0x16E75, 0x16E55},
+ {0x16E76, 0x16E56}, {0x16E77, 0x16E57}, {0x16E78, 0x16E58},
+ {0x16E79, 0x16E59}, {0x16E7A, 0x16E5A}, {0x16E7B, 0x16E5B},
+ {0x16E7C, 0x16E5C}, {0x16E7D, 0x16E5D}, {0x16E7E, 0x16E5E},
+ {0x16E7F, 0x16E5F}, {0x16EBB, 0x16EA0}, {0x16EBC, 0x16EA1},
+ {0x16EBD, 0x16EA2}, {0x16EBE, 0x16EA3}, {0x16EBF, 0x16EA4},
+ {0x16EC0, 0x16EA5}, {0x16EC1, 0x16EA6}, {0x16EC2, 0x16EA7},
+ {0x16EC3, 0x16EA8}, {0x16EC4, 0x16EA9}, {0x16EC5, 0x16EAA},
+ {0x16EC6, 0x16EAB}, {0x16EC7, 0x16EAC}, {0x16EC8, 0x16EAD},
+ {0x16EC9, 0x16EAE}, {0x16ECA, 0x16EAF}, {0x16ECB, 0x16EB0},
+ {0x16ECC, 0x16EB1}, {0x16ECD, 0x16EB2}, {0x16ECE, 0x16EB3},
+ {0x16ECF, 0x16EB4}, {0x16ED0, 0x16EB5}, {0x16ED1, 0x16EB6},
+ {0x16ED2, 0x16EB7}, {0x16ED3, 0x16EB8}, {0x1E922, 0x1E900},
+ {0x1E923, 0x1E901}, {0x1E924, 0x1E902}, {0x1E925, 0x1E903},
+ {0x1E926, 0x1E904}, {0x1E927, 0x1E905}, {0x1E928, 0x1E906},
+ {0x1E929, 0x1E907}, {0x1E92A, 0x1E908}, {0x1E92B, 0x1E909},
+ {0x1E92C, 0x1E90A}, {0x1E92D, 0x1E90B}, {0x1E92E, 0x1E90C},
+ {0x1E92F, 0x1E90D}, {0x1E930, 0x1E90E}, {0x1E931, 0x1E90F},
+ {0x1E932, 0x1E910}, {0x1E933, 0x1E911}, {0x1E934, 0x1E912},
+ {0x1E935, 0x1E913}, {0x1E936, 0x1E914}, {0x1E937, 0x1E915},
+ {0x1E938, 0x1E916}, {0x1E939, 0x1E917}, {0x1E93A, 0x1E918},
+ {0x1E93B, 0x1E919}, {0x1E93C, 0x1E91A}, {0x1E93D, 0x1E91B},
+ {0x1E93E, 0x1E91C}, {0x1E93F, 0x1E91D}, {0x1E940, 0x1E91E},
+ {0x1E941, 0x1E91F}, {0x1E942, 0x1E920}, {0x1E943, 0x1E921}}};
+
+LIBC_INLINE_VAR constexpr auto LOWER_TO_UPPER_HASHER =
+ ptrhash::init_hasher<1458>(
+ 0x1A275D28E2768536,
+ cpp::array<uint8_t, 489>{
+ 0x0, 0x12, 0x8, 0x16, 0x2, 0x1, 0x2, 0xD, 0x2E, 0x0, 0x0,
+ 0x8, 0x10, 0x33, 0x0, 0x1A, 0xB, 0x3, 0x0, 0x0, 0x0, 0x17,
+ 0x2C, 0x19, 0x48, 0x33, 0x2, 0x11, 0x0, 0x42, 0x1, 0xA, 0x0,
+ 0x31, 0x2, 0x5, 0x0, 0x4E, 0x2, 0x4, 0x0, 0x1, 0x9, 0x23,
+ 0x7, 0x2, 0x9, 0xE, 0x0, 0x1, 0x14, 0x27, 0x1, 0x3B, 0x0,
+ 0x41, 0xB, 0x2, 0x15, 0xB, 0x33, 0x1, 0x0, 0x11, 0x1, 0x6,
+ 0x2, 0x0, 0x3E, 0x0, 0x0, 0x1, 0xE, 0x18, 0x50, 0x1, 0xB,
+ 0x18, 0xC, 0x1, 0x28, 0x8, 0x15, 0x6, 0x0, 0x1, 0x13, 0x3,
+ 0x8, 0x9, 0x1D, 0x0, 0x3, 0xC, 0x0, 0x17, 0x10, 0xB, 0x15,
+ 0x5, 0x1, 0x18, 0x18, 0x34, 0x2D, 0x0, 0x5, 0xC0, 0xE, 0x40,
+ 0x3C, 0x1, 0x4, 0x1, 0x2, 0x11, 0x10, 0x10, 0x3E, 0x27, 0x5,
+ 0x7, 0x2B, 0x0, 0x2, 0x2, 0xC, 0x21, 0x1, 0xC, 0x5, 0x2,
+ 0x6, 0x10, 0x1, 0x4C, 0x3B, 0xB, 0x0, 0x0, 0xD, 0x5, 0x12,
+ 0x2, 0x5, 0x4, 0x0, 0x1B, 0x5B, 0xE, 0x3, 0x20, 0x13, 0x7,
+ 0x0, 0x7, 0x14, 0x8, 0x20, 0x0, 0x29, 0x0, 0x19, 0x1F, 0x0,
+ 0x40, 0x1D, 0x0, 0x7, 0x0, 0x2, 0x1, 0x1D, 0x1B, 0x32, 0xD,
+ 0x4, 0x0, 0x9, 0x0, 0x18, 0x13, 0x4D, 0x10, 0x13, 0xE, 0x21,
+ 0x2C, 0x94, 0x7, 0x25, 0x5, 0x0, 0x93, 0x7, 0x0, 0x0, 0x30,
+ 0xF, 0x2, 0x5, 0x30, 0x2C, 0x4, 0x0, 0x5, 0x2, 0x0, 0x2,
+ 0x0, 0x5, 0x12, 0x4, 0x40, 0x2, 0x9, 0x5, 0xE, 0x2A, 0x3C,
+ 0x3F, 0x0, 0x1A, 0x0, 0x9F, 0x1, 0x0, 0x45, 0x26, 0xC, 0x10,
+ 0x23, 0x7, 0x0, 0x1B, 0x6, 0x0, 0x1F, 0xA, 0x5, 0x3, 0x2,
+ 0x0, 0x0, 0x80, 0x20, 0x1, 0x2C, 0x36, 0x8, 0x20, 0x4, 0x87,
+ 0x2A, 0xC, 0x2, 0x33, 0x5, 0x0, 0x3A, 0x1, 0x4F, 0xB, 0x0,
+ 0xF, 0x1F, 0x24, 0x6, 0xE, 0x85, 0xF, 0x6, 0x3, 0x1D, 0x1,
+ 0x1, 0x7A, 0x7, 0x1, 0x2, 0x1A, 0x3, 0x34, 0x2, 0x0, 0x6,
+ 0x48, 0x2, 0xD, 0x49, 0xA, 0x8, 0xF, 0xC, 0x1F, 0x25, 0x6,
+ 0x6, 0x4, 0xE, 0x0, 0x1, 0x0, 0x0, 0x4E, 0x16, 0x1C, 0x15,
+ 0x38, 0xD, 0x2F, 0x27, 0x3C, 0x3, 0x0, 0x64, 0x4F, 0xD, 0x32,
+ 0x0, 0x13, 0x21, 0x16, 0x0, 0x11, 0x0, 0x8, 0x1F, 0x36, 0x1,
+ 0x1E, 0x0, 0x0, 0x15, 0x10, 0x20, 0x7E, 0x2, 0x6, 0x2, 0x63,
+ 0x11, 0x6, 0x35, 0x14, 0x3, 0x0, 0x39, 0x2, 0x13, 0x48, 0x30,
+ 0x0, 0x4B, 0x55, 0x3A, 0xB, 0x11, 0x1D, 0x2D, 0x0, 0xB, 0x0,
+ 0xA6, 0x36, 0x0, 0x4, 0x17, 0x5, 0x11, 0x40, 0xB3, 0x1, 0x89,
+ 0x0, 0x10, 0xDF, 0x22, 0xF, 0x4C, 0x3, 0x0, 0x30, 0x42, 0x15,
+ 0x6D, 0x1C, 0xA, 0x22, 0x0, 0x0, 0x78, 0x2, 0x6, 0x46, 0x4B,
+ 0x1E, 0x32, 0x5D, 0x2E, 0x0, 0x65, 0x5, 0x0, 0xE, 0x5, 0xE,
+ 0x24, 0x19, 0x3F, 0x8F, 0x16, 0x1, 0x71, 0x1E, 0x15, 0x0, 0x1,
+ 0x4, 0x2, 0x0, 0x4, 0x0, 0x8, 0x57, 0xE, 0x3, 0x4, 0xEF,
+ 0x93, 0xF, 0x21, 0x4, 0x0, 0x3A, 0x9, 0x9, 0xF3, 0x33, 0x6,
+ 0x12, 0x1C, 0xAB, 0x18, 0x2, 0x2, 0x7, 0x7, 0x0, 0x8, 0x2,
+ 0x9, 0x0, 0x51, 0xC6, 0x37, 0xB, 0xB2, 0x0, 0x60, 0x1E, 0x83,
+ 0x9, 0xA2, 0x1, 0x5B, 0xF5, 0x30, 0x7, 0x0, 0x1, 0xF6, 0x7E,
+ 0x29, 0xC, 0xF4, 0x35, 0xD, 0xB5, 0xD, 0x9, 0x27, 0x86, 0x6,
+ 0xEC, 0x4, 0x57, 0xE, 0x1C},
+ cpp::array<uint32_t, 14>{0xA5, 0xB1, 0xEB, 0x136, 0x156, 0x176, 0x19C,
+ 0x1A5, 0x2D8, 0x42A, 0x446, 0x4F3, 0x500,
+ 0x52E});
+
+LIBC_INLINE_VAR constexpr PerfectHashMap<1458, decltype(LOWER_TO_UPPER_HASHER)>
+ LOWER_TO_UPPER_MAP{LOWER_TO_UPPER_DATA, LOWER_TO_UPPER_HASHER};
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_LOWER_TO_UPPER_H
diff --git a/libc/src/__support/wctype/lower_to_upper.inc b/libc/src/__support/wctype/lower_to_upper.inc
deleted file mode 100644
index e20d8a9e61714..0000000000000
--- a/libc/src/__support/wctype/lower_to_upper.inc
+++ /dev/null
@@ -1,400 +0,0 @@
-//===-- Auto-generated lower to upper case mappings table -------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-// DO NOT EDIT MANUALLY.
-// This file is generated by libc/utils/wctype_utils scripts.
-// This file is meant to be included directly into LLVM libc code
-// Format: {from_codepoint, to_codepoint}
-// Info: 1458 entries
-
-{0x61, 0x41}, {0x62, 0x42}, {0x63, 0x43}, {0x64, 0x44}, {0x65, 0x45},
- {0x66, 0x46}, {0x67, 0x47}, {0x68, 0x48}, {0x69, 0x49}, {0x6A, 0x4A},
- {0x6B, 0x4B}, {0x6C, 0x4C}, {0x6D, 0x4D}, {0x6E, 0x4E}, {0x6F, 0x4F},
- {0x70, 0x50}, {0x71, 0x51}, {0x72, 0x52}, {0x73, 0x53}, {0x74, 0x54},
- {0x75, 0x55}, {0x76, 0x56}, {0x77, 0x57}, {0x78, 0x58}, {0x79, 0x59},
- {0x7A, 0x5A}, {0xB5, 0x39C}, {0xE0, 0xC0}, {0xE1, 0xC1}, {0xE2, 0xC2},
- {0xE3, 0xC3}, {0xE4, 0xC4}, {0xE5, 0xC5}, {0xE6, 0xC6}, {0xE7, 0xC7},
- {0xE8, 0xC8}, {0xE9, 0xC9}, {0xEA, 0xCA}, {0xEB, 0xCB}, {0xEC, 0xCC},
- {0xED, 0xCD}, {0xEE, 0xCE}, {0xEF, 0xCF}, {0xF0, 0xD0}, {0xF1, 0xD1},
- {0xF2, 0xD2}, {0xF3, 0xD3}, {0xF4, 0xD4}, {0xF5, 0xD5}, {0xF6, 0xD6},
- {0xF8, 0xD8}, {0xF9, 0xD9}, {0xFA, 0xDA}, {0xFB, 0xDB}, {0xFC, 0xDC},
- {0xFD, 0xDD}, {0xFE, 0xDE}, {0xFF, 0x178}, {0x101, 0x100}, {0x103, 0x102},
- {0x105, 0x104}, {0x107, 0x106}, {0x109, 0x108}, {0x10B, 0x10A},
- {0x10D, 0x10C}, {0x10F, 0x10E}, {0x111, 0x110}, {0x113, 0x112},
- {0x115, 0x114}, {0x117, 0x116}, {0x119, 0x118}, {0x11B, 0x11A},
- {0x11D, 0x11C}, {0x11F, 0x11E}, {0x121, 0x120}, {0x123, 0x122},
- {0x125, 0x124}, {0x127, 0x126}, {0x129, 0x128}, {0x12B, 0x12A},
- {0x12D, 0x12C}, {0x12F, 0x12E}, {0x131, 0x49}, {0x133, 0x132},
- {0x135, 0x134}, {0x137, 0x136}, {0x13A, 0x139}, {0x13C, 0x13B},
- {0x13E, 0x13D}, {0x140, 0x13F}, {0x142, 0x141}, {0x144, 0x143},
- {0x146, 0x145}, {0x148, 0x147}, {0x14B, 0x14A}, {0x14D, 0x14C},
- {0x14F, 0x14E}, {0x151, 0x150}, {0x153, 0x152}, {0x155, 0x154},
- {0x157, 0x156}, {0x159, 0x158}, {0x15B, 0x15A}, {0x15D, 0x15C},
- {0x15F, 0x15E}, {0x161, 0x160}, {0x163, 0x162}, {0x165, 0x164},
- {0x167, 0x166}, {0x169, 0x168}, {0x16B, 0x16A}, {0x16D, 0x16C},
- {0x16F, 0x16E}, {0x171, 0x170}, {0x173, 0x172}, {0x175, 0x174},
- {0x177, 0x176}, {0x17A, 0x179}, {0x17C, 0x17B}, {0x17E, 0x17D},
- {0x17F, 0x53}, {0x180, 0x243}, {0x183, 0x182}, {0x185, 0x184},
- {0x188, 0x187}, {0x18C, 0x18B}, {0x192, 0x191}, {0x195, 0x1F6},
- {0x199, 0x198}, {0x19A, 0x23D}, {0x19B, 0xA7DC}, {0x19E, 0x220},
- {0x1A1, 0x1A0}, {0x1A3, 0x1A2}, {0x1A5, 0x1A4}, {0x1A8, 0x1A7},
- {0x1AD, 0x1AC}, {0x1B0, 0x1AF}, {0x1B4, 0x1B3}, {0x1B6, 0x1B5},
- {0x1B9, 0x1B8}, {0x1BD, 0x1BC}, {0x1BF, 0x1F7}, {0x1C6, 0x1C4},
- {0x1C9, 0x1C7}, {0x1CC, 0x1CA}, {0x1CE, 0x1CD}, {0x1D0, 0x1CF},
- {0x1D2, 0x1D1}, {0x1D4, 0x1D3}, {0x1D6, 0x1D5}, {0x1D8, 0x1D7},
- {0x1DA, 0x1D9}, {0x1DC, 0x1DB}, {0x1DD, 0x18E}, {0x1DF, 0x1DE},
- {0x1E1, 0x1E0}, {0x1E3, 0x1E2}, {0x1E5, 0x1E4}, {0x1E7, 0x1E6},
- {0x1E9, 0x1E8}, {0x1EB, 0x1EA}, {0x1ED, 0x1EC}, {0x1EF, 0x1EE},
- {0x1F3, 0x1F1}, {0x1F5, 0x1F4}, {0x1F9, 0x1F8}, {0x1FB, 0x1FA},
- {0x1FD, 0x1FC}, {0x1FF, 0x1FE}, {0x201, 0x200}, {0x203, 0x202},
- {0x205, 0x204}, {0x207, 0x206}, {0x209, 0x208}, {0x20B, 0x20A},
- {0x20D, 0x20C}, {0x20F, 0x20E}, {0x211, 0x210}, {0x213, 0x212},
- {0x215, 0x214}, {0x217, 0x216}, {0x219, 0x218}, {0x21B, 0x21A},
- {0x21D, 0x21C}, {0x21F, 0x21E}, {0x223, 0x222}, {0x225, 0x224},
- {0x227, 0x226}, {0x229, 0x228}, {0x22B, 0x22A}, {0x22D, 0x22C},
- {0x22F, 0x22E}, {0x231, 0x230}, {0x233, 0x232}, {0x23C, 0x23B},
- {0x23F, 0x2C7E}, {0x240, 0x2C7F}, {0x242, 0x241}, {0x247, 0x246},
- {0x249, 0x248}, {0x24B, 0x24A}, {0x24D, 0x24C}, {0x24F, 0x24E},
- {0x250, 0x2C6F}, {0x251, 0x2C6D}, {0x252, 0x2C70}, {0x253, 0x181},
- {0x254, 0x186}, {0x256, 0x189}, {0x257, 0x18A}, {0x259, 0x18F},
- {0x25B, 0x190}, {0x25C, 0xA7AB}, {0x260, 0x193}, {0x261, 0xA7AC},
- {0x263, 0x194}, {0x264, 0xA7CB}, {0x265, 0xA78D}, {0x266, 0xA7AA},
- {0x268, 0x197}, {0x269, 0x196}, {0x26A, 0xA7AE}, {0x26B, 0x2C62},
- {0x26C, 0xA7AD}, {0x26F, 0x19C}, {0x271, 0x2C6E}, {0x272, 0x19D},
- {0x275, 0x19F}, {0x27D, 0x2C64}, {0x280, 0x1A6}, {0x282, 0xA7C5},
- {0x283, 0x1A9}, {0x287, 0xA7B1}, {0x288, 0x1AE}, {0x289, 0x244},
- {0x28A, 0x1B1}, {0x28B, 0x1B2}, {0x28C, 0x245}, {0x292, 0x1B7},
- {0x29D, 0xA7B2}, {0x29E, 0xA7B0}, {0x371, 0x370}, {0x373, 0x372},
- {0x377, 0x376}, {0x37B, 0x3FD}, {0x37C, 0x3FE}, {0x37D, 0x3FF},
- {0x3AC, 0x386}, {0x3AD, 0x388}, {0x3AE, 0x389}, {0x3AF, 0x38A},
- {0x3B1, 0x391}, {0x3B2, 0x392}, {0x3B3, 0x393}, {0x3B4, 0x394},
- {0x3B5, 0x395}, {0x3B6, 0x396}, {0x3B7, 0x397}, {0x3B8, 0x398},
- {0x3B9, 0x399}, {0x3BA, 0x39A}, {0x3BB, 0x39B}, {0x3BC, 0x39C},
- {0x3BD, 0x39D}, {0x3BE, 0x39E}, {0x3BF, 0x39F}, {0x3C0, 0x3A0},
- {0x3C1, 0x3A1}, {0x3C2, 0x3A3}, {0x3C3, 0x3A3}, {0x3C4, 0x3A4},
- {0x3C5, 0x3A5}, {0x3C6, 0x3A6}, {0x3C7, 0x3A7}, {0x3C8, 0x3A8},
- {0x3C9, 0x3A9}, {0x3CA, 0x3AA}, {0x3CB, 0x3AB}, {0x3CC, 0x38C},
- {0x3CD, 0x38E}, {0x3CE, 0x38F}, {0x3D0, 0x392}, {0x3D1, 0x398},
- {0x3D5, 0x3A6}, {0x3D6, 0x3A0}, {0x3D7, 0x3CF}, {0x3D9, 0x3D8},
- {0x3DB, 0x3DA}, {0x3DD, 0x3DC}, {0x3DF, 0x3DE}, {0x3E1, 0x3E0},
- {0x3E3, 0x3E2}, {0x3E5, 0x3E4}, {0x3E7, 0x3E6}, {0x3E9, 0x3E8},
- {0x3EB, 0x3EA}, {0x3ED, 0x3EC}, {0x3EF, 0x3EE}, {0x3F0, 0x39A},
- {0x3F1, 0x3A1}, {0x3F2, 0x3F9}, {0x3F3, 0x37F}, {0x3F5, 0x395},
- {0x3F8, 0x3F7}, {0x3FB, 0x3FA}, {0x430, 0x410}, {0x431, 0x411},
- {0x432, 0x412}, {0x433, 0x413}, {0x434, 0x414}, {0x435, 0x415},
- {0x436, 0x416}, {0x437, 0x417}, {0x438, 0x418}, {0x439, 0x419},
- {0x43A, 0x41A}, {0x43B, 0x41B}, {0x43C, 0x41C}, {0x43D, 0x41D},
- {0x43E, 0x41E}, {0x43F, 0x41F}, {0x440, 0x420}, {0x441, 0x421},
- {0x442, 0x422}, {0x443, 0x423}, {0x444, 0x424}, {0x445, 0x425},
- {0x446, 0x426}, {0x447, 0x427}, {0x448, 0x428}, {0x449, 0x429},
- {0x44A, 0x42A}, {0x44B, 0x42B}, {0x44C, 0x42C}, {0x44D, 0x42D},
- {0x44E, 0x42E}, {0x44F, 0x42F}, {0x450, 0x400}, {0x451, 0x401},
- {0x452, 0x402}, {0x453, 0x403}, {0x454, 0x404}, {0x455, 0x405},
- {0x456, 0x406}, {0x457, 0x407}, {0x458, 0x408}, {0x459, 0x409},
- {0x45A, 0x40A}, {0x45B, 0x40B}, {0x45C, 0x40C}, {0x45D, 0x40D},
- {0x45E, 0x40E}, {0x45F, 0x40F}, {0x461, 0x460}, {0x463, 0x462},
- {0x465, 0x464}, {0x467, 0x466}, {0x469, 0x468}, {0x46B, 0x46A},
- {0x46D, 0x46C}, {0x46F, 0x46E}, {0x471, 0x470}, {0x473, 0x472},
- {0x475, 0x474}, {0x477, 0x476}, {0x479, 0x478}, {0x47B, 0x47A},
- {0x47D, 0x47C}, {0x47F, 0x47E}, {0x481, 0x480}, {0x48B, 0x48A},
- {0x48D, 0x48C}, {0x48F, 0x48E}, {0x491, 0x490}, {0x493, 0x492},
- {0x495, 0x494}, {0x497, 0x496}, {0x499, 0x498}, {0x49B, 0x49A},
- {0x49D, 0x49C}, {0x49F, 0x49E}, {0x4A1, 0x4A0}, {0x4A3, 0x4A2},
- {0x4A5, 0x4A4}, {0x4A7, 0x4A6}, {0x4A9, 0x4A8}, {0x4AB, 0x4AA},
- {0x4AD, 0x4AC}, {0x4AF, 0x4AE}, {0x4B1, 0x4B0}, {0x4B3, 0x4B2},
- {0x4B5, 0x4B4}, {0x4B7, 0x4B6}, {0x4B9, 0x4B8}, {0x4BB, 0x4BA},
- {0x4BD, 0x4BC}, {0x4BF, 0x4BE}, {0x4C2, 0x4C1}, {0x4C4, 0x4C3},
- {0x4C6, 0x4C5}, {0x4C8, 0x4C7}, {0x4CA, 0x4C9}, {0x4CC, 0x4CB},
- {0x4CE, 0x4CD}, {0x4CF, 0x4C0}, {0x4D1, 0x4D0}, {0x4D3, 0x4D2},
- {0x4D5, 0x4D4}, {0x4D7, 0x4D6}, {0x4D9, 0x4D8}, {0x4DB, 0x4DA},
- {0x4DD, 0x4DC}, {0x4DF, 0x4DE}, {0x4E1, 0x4E0}, {0x4E3, 0x4E2},
- {0x4E5, 0x4E4}, {0x4E7, 0x4E6}, {0x4E9, 0x4E8}, {0x4EB, 0x4EA},
- {0x4ED, 0x4EC}, {0x4EF, 0x4EE}, {0x4F1, 0x4F0}, {0x4F3, 0x4F2},
- {0x4F5, 0x4F4}, {0x4F7, 0x4F6}, {0x4F9, 0x4F8}, {0x4FB, 0x4FA},
- {0x4FD, 0x4FC}, {0x4FF, 0x4FE}, {0x501, 0x500}, {0x503, 0x502},
- {0x505, 0x504}, {0x507, 0x506}, {0x509, 0x508}, {0x50B, 0x50A},
- {0x50D, 0x50C}, {0x50F, 0x50E}, {0x511, 0x510}, {0x513, 0x512},
- {0x515, 0x514}, {0x517, 0x516}, {0x519, 0x518}, {0x51B, 0x51A},
- {0x51D, 0x51C}, {0x51F, 0x51E}, {0x521, 0x520}, {0x523, 0x522},
- {0x525, 0x524}, {0x527, 0x526}, {0x529, 0x528}, {0x52B, 0x52A},
- {0x52D, 0x52C}, {0x52F, 0x52E}, {0x561, 0x531}, {0x562, 0x532},
- {0x563, 0x533}, {0x564, 0x534}, {0x565, 0x535}, {0x566, 0x536},
- {0x567, 0x537}, {0x568, 0x538}, {0x569, 0x539}, {0x56A, 0x53A},
- {0x56B, 0x53B}, {0x56C, 0x53C}, {0x56D, 0x53D}, {0x56E, 0x53E},
- {0x56F, 0x53F}, {0x570, 0x540}, {0x571, 0x541}, {0x572, 0x542},
- {0x573, 0x543}, {0x574, 0x544}, {0x575, 0x545}, {0x576, 0x546},
- {0x577, 0x547}, {0x578, 0x548}, {0x579, 0x549}, {0x57A, 0x54A},
- {0x57B, 0x54B}, {0x57C, 0x54C}, {0x57D, 0x54D}, {0x57E, 0x54E},
- {0x57F, 0x54F}, {0x580, 0x550}, {0x581, 0x551}, {0x582, 0x552},
- {0x583, 0x553}, {0x584, 0x554}, {0x585, 0x555}, {0x586, 0x556},
- {0x10D0, 0x1C90}, {0x10D1, 0x1C91}, {0x10D2, 0x1C92}, {0x10D3, 0x1C93},
- {0x10D4, 0x1C94}, {0x10D5, 0x1C95}, {0x10D6, 0x1C96}, {0x10D7, 0x1C97},
- {0x10D8, 0x1C98}, {0x10D9, 0x1C99}, {0x10DA, 0x1C9A}, {0x10DB, 0x1C9B},
- {0x10DC, 0x1C9C}, {0x10DD, 0x1C9D}, {0x10DE, 0x1C9E}, {0x10DF, 0x1C9F},
- {0x10E0, 0x1CA0}, {0x10E1, 0x1CA1}, {0x10E2, 0x1CA2}, {0x10E3, 0x1CA3},
- {0x10E4, 0x1CA4}, {0x10E5, 0x1CA5}, {0x10E6, 0x1CA6}, {0x10E7, 0x1CA7},
- {0x10E8, 0x1CA8}, {0x10E9, 0x1CA9}, {0x10EA, 0x1CAA}, {0x10EB, 0x1CAB},
- {0x10EC, 0x1CAC}, {0x10ED, 0x1CAD}, {0x10EE, 0x1CAE}, {0x10EF, 0x1CAF},
- {0x10F0, 0x1CB0}, {0x10F1, 0x1CB1}, {0x10F2, 0x1CB2}, {0x10F3, 0x1CB3},
- {0x10F4, 0x1CB4}, {0x10F5, 0x1CB5}, {0x10F6, 0x1CB6}, {0x10F7, 0x1CB7},
- {0x10F8, 0x1CB8}, {0x10F9, 0x1CB9}, {0x10FA, 0x1CBA}, {0x10FD, 0x1CBD},
- {0x10FE, 0x1CBE}, {0x10FF, 0x1CBF}, {0x13F8, 0x13F0}, {0x13F9, 0x13F1},
- {0x13FA, 0x13F2}, {0x13FB, 0x13F3}, {0x13FC, 0x13F4}, {0x13FD, 0x13F5},
- {0x1C80, 0x412}, {0x1C81, 0x414}, {0x1C82, 0x41E}, {0x1C83, 0x421},
- {0x1C84, 0x422}, {0x1C85, 0x422}, {0x1C86, 0x42A}, {0x1C87, 0x462},
- {0x1C88, 0xA64A}, {0x1C8A, 0x1C89}, {0x1D79, 0xA77D}, {0x1D7D, 0x2C63},
- {0x1D8E, 0xA7C6}, {0x1E01, 0x1E00}, {0x1E03, 0x1E02}, {0x1E05, 0x1E04},
- {0x1E07, 0x1E06}, {0x1E09, 0x1E08}, {0x1E0B, 0x1E0A}, {0x1E0D, 0x1E0C},
- {0x1E0F, 0x1E0E}, {0x1E11, 0x1E10}, {0x1E13, 0x1E12}, {0x1E15, 0x1E14},
- {0x1E17, 0x1E16}, {0x1E19, 0x1E18}, {0x1E1B, 0x1E1A}, {0x1E1D, 0x1E1C},
- {0x1E1F, 0x1E1E}, {0x1E21, 0x1E20}, {0x1E23, 0x1E22}, {0x1E25, 0x1E24},
- {0x1E27, 0x1E26}, {0x1E29, 0x1E28}, {0x1E2B, 0x1E2A}, {0x1E2D, 0x1E2C},
- {0x1E2F, 0x1E2E}, {0x1E31, 0x1E30}, {0x1E33, 0x1E32}, {0x1E35, 0x1E34},
- {0x1E37, 0x1E36}, {0x1E39, 0x1E38}, {0x1E3B, 0x1E3A}, {0x1E3D, 0x1E3C},
- {0x1E3F, 0x1E3E}, {0x1E41, 0x1E40}, {0x1E43, 0x1E42}, {0x1E45, 0x1E44},
- {0x1E47, 0x1E46}, {0x1E49, 0x1E48}, {0x1E4B, 0x1E4A}, {0x1E4D, 0x1E4C},
- {0x1E4F, 0x1E4E}, {0x1E51, 0x1E50}, {0x1E53, 0x1E52}, {0x1E55, 0x1E54},
- {0x1E57, 0x1E56}, {0x1E59, 0x1E58}, {0x1E5B, 0x1E5A}, {0x1E5D, 0x1E5C},
- {0x1E5F, 0x1E5E}, {0x1E61, 0x1E60}, {0x1E63, 0x1E62}, {0x1E65, 0x1E64},
- {0x1E67, 0x1E66}, {0x1E69, 0x1E68}, {0x1E6B, 0x1E6A}, {0x1E6D, 0x1E6C},
- {0x1E6F, 0x1E6E}, {0x1E71, 0x1E70}, {0x1E73, 0x1E72}, {0x1E75, 0x1E74},
- {0x1E77, 0x1E76}, {0x1E79, 0x1E78}, {0x1E7B, 0x1E7A}, {0x1E7D, 0x1E7C},
- {0x1E7F, 0x1E7E}, {0x1E81, 0x1E80}, {0x1E83, 0x1E82}, {0x1E85, 0x1E84},
- {0x1E87, 0x1E86}, {0x1E89, 0x1E88}, {0x1E8B, 0x1E8A}, {0x1E8D, 0x1E8C},
- {0x1E8F, 0x1E8E}, {0x1E91, 0x1E90}, {0x1E93, 0x1E92}, {0x1E95, 0x1E94},
- {0x1E9B, 0x1E60}, {0x1EA1, 0x1EA0}, {0x1EA3, 0x1EA2}, {0x1EA5, 0x1EA4},
- {0x1EA7, 0x1EA6}, {0x1EA9, 0x1EA8}, {0x1EAB, 0x1EAA}, {0x1EAD, 0x1EAC},
- {0x1EAF, 0x1EAE}, {0x1EB1, 0x1EB0}, {0x1EB3, 0x1EB2}, {0x1EB5, 0x1EB4},
- {0x1EB7, 0x1EB6}, {0x1EB9, 0x1EB8}, {0x1EBB, 0x1EBA}, {0x1EBD, 0x1EBC},
- {0x1EBF, 0x1EBE}, {0x1EC1, 0x1EC0}, {0x1EC3, 0x1EC2}, {0x1EC5, 0x1EC4},
- {0x1EC7, 0x1EC6}, {0x1EC9, 0x1EC8}, {0x1ECB, 0x1ECA}, {0x1ECD, 0x1ECC},
- {0x1ECF, 0x1ECE}, {0x1ED1, 0x1ED0}, {0x1ED3, 0x1ED2}, {0x1ED5, 0x1ED4},
- {0x1ED7, 0x1ED6}, {0x1ED9, 0x1ED8}, {0x1EDB, 0x1EDA}, {0x1EDD, 0x1EDC},
- {0x1EDF, 0x1EDE}, {0x1EE1, 0x1EE0}, {0x1EE3, 0x1EE2}, {0x1EE5, 0x1EE4},
- {0x1EE7, 0x1EE6}, {0x1EE9, 0x1EE8}, {0x1EEB, 0x1EEA}, {0x1EED, 0x1EEC},
- {0x1EEF, 0x1EEE}, {0x1EF1, 0x1EF0}, {0x1EF3, 0x1EF2}, {0x1EF5, 0x1EF4},
- {0x1EF7, 0x1EF6}, {0x1EF9, 0x1EF8}, {0x1EFB, 0x1EFA}, {0x1EFD, 0x1EFC},
- {0x1EFF, 0x1EFE}, {0x1F00, 0x1F08}, {0x1F01, 0x1F09}, {0x1F02, 0x1F0A},
- {0x1F03, 0x1F0B}, {0x1F04, 0x1F0C}, {0x1F05, 0x1F0D}, {0x1F06, 0x1F0E},
- {0x1F07, 0x1F0F}, {0x1F10, 0x1F18}, {0x1F11, 0x1F19}, {0x1F12, 0x1F1A},
- {0x1F13, 0x1F1B}, {0x1F14, 0x1F1C}, {0x1F15, 0x1F1D}, {0x1F20, 0x1F28},
- {0x1F21, 0x1F29}, {0x1F22, 0x1F2A}, {0x1F23, 0x1F2B}, {0x1F24, 0x1F2C},
- {0x1F25, 0x1F2D}, {0x1F26, 0x1F2E}, {0x1F27, 0x1F2F}, {0x1F30, 0x1F38},
- {0x1F31, 0x1F39}, {0x1F32, 0x1F3A}, {0x1F33, 0x1F3B}, {0x1F34, 0x1F3C},
- {0x1F35, 0x1F3D}, {0x1F36, 0x1F3E}, {0x1F37, 0x1F3F}, {0x1F40, 0x1F48},
- {0x1F41, 0x1F49}, {0x1F42, 0x1F4A}, {0x1F43, 0x1F4B}, {0x1F44, 0x1F4C},
- {0x1F45, 0x1F4D}, {0x1F51, 0x1F59}, {0x1F53, 0x1F5B}, {0x1F55, 0x1F5D},
- {0x1F57, 0x1F5F}, {0x1F60, 0x1F68}, {0x1F61, 0x1F69}, {0x1F62, 0x1F6A},
- {0x1F63, 0x1F6B}, {0x1F64, 0x1F6C}, {0x1F65, 0x1F6D}, {0x1F66, 0x1F6E},
- {0x1F67, 0x1F6F}, {0x1F70, 0x1FBA}, {0x1F71, 0x1FBB}, {0x1F72, 0x1FC8},
- {0x1F73, 0x1FC9}, {0x1F74, 0x1FCA}, {0x1F75, 0x1FCB}, {0x1F76, 0x1FDA},
- {0x1F77, 0x1FDB}, {0x1F78, 0x1FF8}, {0x1F79, 0x1FF9}, {0x1F7A, 0x1FEA},
- {0x1F7B, 0x1FEB}, {0x1F7C, 0x1FFA}, {0x1F7D, 0x1FFB}, {0x1F80, 0x1F88},
- {0x1F81, 0x1F89}, {0x1F82, 0x1F8A}, {0x1F83, 0x1F8B}, {0x1F84, 0x1F8C},
- {0x1F85, 0x1F8D}, {0x1F86, 0x1F8E}, {0x1F87, 0x1F8F}, {0x1F90, 0x1F98},
- {0x1F91, 0x1F99}, {0x1F92, 0x1F9A}, {0x1F93, 0x1F9B}, {0x1F94, 0x1F9C},
- {0x1F95, 0x1F9D}, {0x1F96, 0x1F9E}, {0x1F97, 0x1F9F}, {0x1FA0, 0x1FA8},
- {0x1FA1, 0x1FA9}, {0x1FA2, 0x1FAA}, {0x1FA3, 0x1FAB}, {0x1FA4, 0x1FAC},
- {0x1FA5, 0x1FAD}, {0x1FA6, 0x1FAE}, {0x1FA7, 0x1FAF}, {0x1FB0, 0x1FB8},
- {0x1FB1, 0x1FB9}, {0x1FB3, 0x1FBC}, {0x1FBE, 0x399}, {0x1FC3, 0x1FCC},
- {0x1FD0, 0x1FD8}, {0x1FD1, 0x1FD9}, {0x1FE0, 0x1FE8}, {0x1FE1, 0x1FE9},
- {0x1FE5, 0x1FEC}, {0x1FF3, 0x1FFC}, {0x214E, 0x2132}, {0x2184, 0x2183},
- {0x2C30, 0x2C00}, {0x2C31, 0x2C01}, {0x2C32, 0x2C02}, {0x2C33, 0x2C03},
- {0x2C34, 0x2C04}, {0x2C35, 0x2C05}, {0x2C36, 0x2C06}, {0x2C37, 0x2C07},
- {0x2C38, 0x2C08}, {0x2C39, 0x2C09}, {0x2C3A, 0x2C0A}, {0x2C3B, 0x2C0B},
- {0x2C3C, 0x2C0C}, {0x2C3D, 0x2C0D}, {0x2C3E, 0x2C0E}, {0x2C3F, 0x2C0F},
- {0x2C40, 0x2C10}, {0x2C41, 0x2C11}, {0x2C42, 0x2C12}, {0x2C43, 0x2C13},
- {0x2C44, 0x2C14}, {0x2C45, 0x2C15}, {0x2C46, 0x2C16}, {0x2C47, 0x2C17},
- {0x2C48, 0x2C18}, {0x2C49, 0x2C19}, {0x2C4A, 0x2C1A}, {0x2C4B, 0x2C1B},
- {0x2C4C, 0x2C1C}, {0x2C4D, 0x2C1D}, {0x2C4E, 0x2C1E}, {0x2C4F, 0x2C1F},
- {0x2C50, 0x2C20}, {0x2C51, 0x2C21}, {0x2C52, 0x2C22}, {0x2C53, 0x2C23},
- {0x2C54, 0x2C24}, {0x2C55, 0x2C25}, {0x2C56, 0x2C26}, {0x2C57, 0x2C27},
- {0x2C58, 0x2C28}, {0x2C59, 0x2C29}, {0x2C5A, 0x2C2A}, {0x2C5B, 0x2C2B},
- {0x2C5C, 0x2C2C}, {0x2C5D, 0x2C2D}, {0x2C5E, 0x2C2E}, {0x2C5F, 0x2C2F},
- {0x2C61, 0x2C60}, {0x2C65, 0x23A}, {0x2C66, 0x23E}, {0x2C68, 0x2C67},
- {0x2C6A, 0x2C69}, {0x2C6C, 0x2C6B}, {0x2C73, 0x2C72}, {0x2C76, 0x2C75},
- {0x2C81, 0x2C80}, {0x2C83, 0x2C82}, {0x2C85, 0x2C84}, {0x2C87, 0x2C86},
- {0x2C89, 0x2C88}, {0x2C8B, 0x2C8A}, {0x2C8D, 0x2C8C}, {0x2C8F, 0x2C8E},
- {0x2C91, 0x2C90}, {0x2C93, 0x2C92}, {0x2C95, 0x2C94}, {0x2C97, 0x2C96},
- {0x2C99, 0x2C98}, {0x2C9B, 0x2C9A}, {0x2C9D, 0x2C9C}, {0x2C9F, 0x2C9E},
- {0x2CA1, 0x2CA0}, {0x2CA3, 0x2CA2}, {0x2CA5, 0x2CA4}, {0x2CA7, 0x2CA6},
- {0x2CA9, 0x2CA8}, {0x2CAB, 0x2CAA}, {0x2CAD, 0x2CAC}, {0x2CAF, 0x2CAE},
- {0x2CB1, 0x2CB0}, {0x2CB3, 0x2CB2}, {0x2CB5, 0x2CB4}, {0x2CB7, 0x2CB6},
- {0x2CB9, 0x2CB8}, {0x2CBB, 0x2CBA}, {0x2CBD, 0x2CBC}, {0x2CBF, 0x2CBE},
- {0x2CC1, 0x2CC0}, {0x2CC3, 0x2CC2}, {0x2CC5, 0x2CC4}, {0x2CC7, 0x2CC6},
- {0x2CC9, 0x2CC8}, {0x2CCB, 0x2CCA}, {0x2CCD, 0x2CCC}, {0x2CCF, 0x2CCE},
- {0x2CD1, 0x2CD0}, {0x2CD3, 0x2CD2}, {0x2CD5, 0x2CD4}, {0x2CD7, 0x2CD6},
- {0x2CD9, 0x2CD8}, {0x2CDB, 0x2CDA}, {0x2CDD, 0x2CDC}, {0x2CDF, 0x2CDE},
- {0x2CE1, 0x2CE0}, {0x2CE3, 0x2CE2}, {0x2CEC, 0x2CEB}, {0x2CEE, 0x2CED},
- {0x2CF3, 0x2CF2}, {0x2D00, 0x10A0}, {0x2D01, 0x10A1}, {0x2D02, 0x10A2},
- {0x2D03, 0x10A3}, {0x2D04, 0x10A4}, {0x2D05, 0x10A5}, {0x2D06, 0x10A6},
- {0x2D07, 0x10A7}, {0x2D08, 0x10A8}, {0x2D09, 0x10A9}, {0x2D0A, 0x10AA},
- {0x2D0B, 0x10AB}, {0x2D0C, 0x10AC}, {0x2D0D, 0x10AD}, {0x2D0E, 0x10AE},
- {0x2D0F, 0x10AF}, {0x2D10, 0x10B0}, {0x2D11, 0x10B1}, {0x2D12, 0x10B2},
- {0x2D13, 0x10B3}, {0x2D14, 0x10B4}, {0x2D15, 0x10B5}, {0x2D16, 0x10B6},
- {0x2D17, 0x10B7}, {0x2D18, 0x10B8}, {0x2D19, 0x10B9}, {0x2D1A, 0x10BA},
- {0x2D1B, 0x10BB}, {0x2D1C, 0x10BC}, {0x2D1D, 0x10BD}, {0x2D1E, 0x10BE},
- {0x2D1F, 0x10BF}, {0x2D20, 0x10C0}, {0x2D21, 0x10C1}, {0x2D22, 0x10C2},
- {0x2D23, 0x10C3}, {0x2D24, 0x10C4}, {0x2D25, 0x10C5}, {0x2D27, 0x10C7},
- {0x2D2D, 0x10CD}, {0xA641, 0xA640}, {0xA643, 0xA642}, {0xA645, 0xA644},
- {0xA647, 0xA646}, {0xA649, 0xA648}, {0xA64B, 0xA64A}, {0xA64D, 0xA64C},
- {0xA64F, 0xA64E}, {0xA651, 0xA650}, {0xA653, 0xA652}, {0xA655, 0xA654},
- {0xA657, 0xA656}, {0xA659, 0xA658}, {0xA65B, 0xA65A}, {0xA65D, 0xA65C},
- {0xA65F, 0xA65E}, {0xA661, 0xA660}, {0xA663, 0xA662}, {0xA665, 0xA664},
- {0xA667, 0xA666}, {0xA669, 0xA668}, {0xA66B, 0xA66A}, {0xA66D, 0xA66C},
- {0xA681, 0xA680}, {0xA683, 0xA682}, {0xA685, 0xA684}, {0xA687, 0xA686},
- {0xA689, 0xA688}, {0xA68B, 0xA68A}, {0xA68D, 0xA68C}, {0xA68F, 0xA68E},
- {0xA691, 0xA690}, {0xA693, 0xA692}, {0xA695, 0xA694}, {0xA697, 0xA696},
- {0xA699, 0xA698}, {0xA69B, 0xA69A}, {0xA723, 0xA722}, {0xA725, 0xA724},
- {0xA727, 0xA726}, {0xA729, 0xA728}, {0xA72B, 0xA72A}, {0xA72D, 0xA72C},
- {0xA72F, 0xA72E}, {0xA733, 0xA732}, {0xA735, 0xA734}, {0xA737, 0xA736},
- {0xA739, 0xA738}, {0xA73B, 0xA73A}, {0xA73D, 0xA73C}, {0xA73F, 0xA73E},
- {0xA741, 0xA740}, {0xA743, 0xA742}, {0xA745, 0xA744}, {0xA747, 0xA746},
- {0xA749, 0xA748}, {0xA74B, 0xA74A}, {0xA74D, 0xA74C}, {0xA74F, 0xA74E},
- {0xA751, 0xA750}, {0xA753, 0xA752}, {0xA755, 0xA754}, {0xA757, 0xA756},
- {0xA759, 0xA758}, {0xA75B, 0xA75A}, {0xA75D, 0xA75C}, {0xA75F, 0xA75E},
- {0xA761, 0xA760}, {0xA763, 0xA762}, {0xA765, 0xA764}, {0xA767, 0xA766},
- {0xA769, 0xA768}, {0xA76B, 0xA76A}, {0xA76D, 0xA76C}, {0xA76F, 0xA76E},
- {0xA77A, 0xA779}, {0xA77C, 0xA77B}, {0xA77F, 0xA77E}, {0xA781, 0xA780},
- {0xA783, 0xA782}, {0xA785, 0xA784}, {0xA787, 0xA786}, {0xA78C, 0xA78B},
- {0xA791, 0xA790}, {0xA793, 0xA792}, {0xA794, 0xA7C4}, {0xA797, 0xA796},
- {0xA799, 0xA798}, {0xA79B, 0xA79A}, {0xA79D, 0xA79C}, {0xA79F, 0xA79E},
- {0xA7A1, 0xA7A0}, {0xA7A3, 0xA7A2}, {0xA7A5, 0xA7A4}, {0xA7A7, 0xA7A6},
- {0xA7A9, 0xA7A8}, {0xA7B5, 0xA7B4}, {0xA7B7, 0xA7B6}, {0xA7B9, 0xA7B8},
- {0xA7BB, 0xA7BA}, {0xA7BD, 0xA7BC}, {0xA7BF, 0xA7BE}, {0xA7C1, 0xA7C0},
- {0xA7C3, 0xA7C2}, {0xA7C8, 0xA7C7}, {0xA7CA, 0xA7C9}, {0xA7CD, 0xA7CC},
- {0xA7CF, 0xA7CE}, {0xA7D1, 0xA7D0}, {0xA7D3, 0xA7D2}, {0xA7D5, 0xA7D4},
- {0xA7D7, 0xA7D6}, {0xA7D9, 0xA7D8}, {0xA7DB, 0xA7DA}, {0xA7F6, 0xA7F5},
- {0xAB53, 0xA7B3}, {0xAB70, 0x13A0}, {0xAB71, 0x13A1}, {0xAB72, 0x13A2},
- {0xAB73, 0x13A3}, {0xAB74, 0x13A4}, {0xAB75, 0x13A5}, {0xAB76, 0x13A6},
- {0xAB77, 0x13A7}, {0xAB78, 0x13A8}, {0xAB79, 0x13A9}, {0xAB7A, 0x13AA},
- {0xAB7B, 0x13AB}, {0xAB7C, 0x13AC}, {0xAB7D, 0x13AD}, {0xAB7E, 0x13AE},
- {0xAB7F, 0x13AF}, {0xAB80, 0x13B0}, {0xAB81, 0x13B1}, {0xAB82, 0x13B2},
- {0xAB83, 0x13B3}, {0xAB84, 0x13B4}, {0xAB85, 0x13B5}, {0xAB86, 0x13B6},
- {0xAB87, 0x13B7}, {0xAB88, 0x13B8}, {0xAB89, 0x13B9}, {0xAB8A, 0x13BA},
- {0xAB8B, 0x13BB}, {0xAB8C, 0x13BC}, {0xAB8D, 0x13BD}, {0xAB8E, 0x13BE},
- {0xAB8F, 0x13BF}, {0xAB90, 0x13C0}, {0xAB91, 0x13C1}, {0xAB92, 0x13C2},
- {0xAB93, 0x13C3}, {0xAB94, 0x13C4}, {0xAB95, 0x13C5}, {0xAB96, 0x13C6},
- {0xAB97, 0x13C7}, {0xAB98, 0x13C8}, {0xAB99, 0x13C9}, {0xAB9A, 0x13CA},
- {0xAB9B, 0x13CB}, {0xAB9C, 0x13CC}, {0xAB9D, 0x13CD}, {0xAB9E, 0x13CE},
- {0xAB9F, 0x13CF}, {0xABA0, 0x13D0}, {0xABA1, 0x13D1}, {0xABA2, 0x13D2},
- {0xABA3, 0x13D3}, {0xABA4, 0x13D4}, {0xABA5, 0x13D5}, {0xABA6, 0x13D6},
- {0xABA7, 0x13D7}, {0xABA8, 0x13D8}, {0xABA9, 0x13D9}, {0xABAA, 0x13DA},
- {0xABAB, 0x13DB}, {0xABAC, 0x13DC}, {0xABAD, 0x13DD}, {0xABAE, 0x13DE},
- {0xABAF, 0x13DF}, {0xABB0, 0x13E0}, {0xABB1, 0x13E1}, {0xABB2, 0x13E2},
- {0xABB3, 0x13E3}, {0xABB4, 0x13E4}, {0xABB5, 0x13E5}, {0xABB6, 0x13E6},
- {0xABB7, 0x13E7}, {0xABB8, 0x13E8}, {0xABB9, 0x13E9}, {0xABBA, 0x13EA},
- {0xABBB, 0x13EB}, {0xABBC, 0x13EC}, {0xABBD, 0x13ED}, {0xABBE, 0x13EE},
- {0xABBF, 0x13EF}, {0xFF41, 0xFF21}, {0xFF42, 0xFF22}, {0xFF43, 0xFF23},
- {0xFF44, 0xFF24}, {0xFF45, 0xFF25}, {0xFF46, 0xFF26}, {0xFF47, 0xFF27},
- {0xFF48, 0xFF28}, {0xFF49, 0xFF29}, {0xFF4A, 0xFF2A}, {0xFF4B, 0xFF2B},
- {0xFF4C, 0xFF2C}, {0xFF4D, 0xFF2D}, {0xFF4E, 0xFF2E}, {0xFF4F, 0xFF2F},
- {0xFF50, 0xFF30}, {0xFF51, 0xFF31}, {0xFF52, 0xFF32}, {0xFF53, 0xFF33},
- {0xFF54, 0xFF34}, {0xFF55, 0xFF35}, {0xFF56, 0xFF36}, {0xFF57, 0xFF37},
- {0xFF58, 0xFF38}, {0xFF59, 0xFF39}, {0xFF5A, 0xFF3A}, {0x10428, 0x10400},
- {0x10429, 0x10401}, {0x1042A, 0x10402}, {0x1042B, 0x10403},
- {0x1042C, 0x10404}, {0x1042D, 0x10405}, {0x1042E, 0x10406},
- {0x1042F, 0x10407}, {0x10430, 0x10408}, {0x10431, 0x10409},
- {0x10432, 0x1040A}, {0x10433, 0x1040B}, {0x10434, 0x1040C},
- {0x10435, 0x1040D}, {0x10436, 0x1040E}, {0x10437, 0x1040F},
- {0x10438, 0x10410}, {0x10439, 0x10411}, {0x1043A, 0x10412},
- {0x1043B, 0x10413}, {0x1043C, 0x10414}, {0x1043D, 0x10415},
- {0x1043E, 0x10416}, {0x1043F, 0x10417}, {0x10440, 0x10418},
- {0x10441, 0x10419}, {0x10442, 0x1041A}, {0x10443, 0x1041B},
- {0x10444, 0x1041C}, {0x10445, 0x1041D}, {0x10446, 0x1041E},
- {0x10447, 0x1041F}, {0x10448, 0x10420}, {0x10449, 0x10421},
- {0x1044A, 0x10422}, {0x1044B, 0x10423}, {0x1044C, 0x10424},
- {0x1044D, 0x10425}, {0x1044E, 0x10426}, {0x1044F, 0x10427},
- {0x104D8, 0x104B0}, {0x104D9, 0x104B1}, {0x104DA, 0x104B2},
- {0x104DB, 0x104B3}, {0x104DC, 0x104B4}, {0x104DD, 0x104B5},
- {0x104DE, 0x104B6}, {0x104DF, 0x104B7}, {0x104E0, 0x104B8},
- {0x104E1, 0x104B9}, {0x104E2, 0x104BA}, {0x104E3, 0x104BB},
- {0x104E4, 0x104BC}, {0x104E5, 0x104BD}, {0x104E6, 0x104BE},
- {0x104E7, 0x104BF}, {0x104E8, 0x104C0}, {0x104E9, 0x104C1},
- {0x104EA, 0x104C2}, {0x104EB, 0x104C3}, {0x104EC, 0x104C4},
- {0x104ED, 0x104C5}, {0x104EE, 0x104C6}, {0x104EF, 0x104C7},
- {0x104F0, 0x104C8}, {0x104F1, 0x104C9}, {0x104F2, 0x104CA},
- {0x104F3, 0x104CB}, {0x104F4, 0x104CC}, {0x104F5, 0x104CD},
- {0x104F6, 0x104CE}, {0x104F7, 0x104CF}, {0x104F8, 0x104D0},
- {0x104F9, 0x104D1}, {0x104FA, 0x104D2}, {0x104FB, 0x104D3},
- {0x10597, 0x10570}, {0x10598, 0x10571}, {0x10599, 0x10572},
- {0x1059A, 0x10573}, {0x1059B, 0x10574}, {0x1059C, 0x10575},
- {0x1059D, 0x10576}, {0x1059E, 0x10577}, {0x1059F, 0x10578},
- {0x105A0, 0x10579}, {0x105A1, 0x1057A}, {0x105A3, 0x1057C},
- {0x105A4, 0x1057D}, {0x105A5, 0x1057E}, {0x105A6, 0x1057F},
- {0x105A7, 0x10580}, {0x105A8, 0x10581}, {0x105A9, 0x10582},
- {0x105AA, 0x10583}, {0x105AB, 0x10584}, {0x105AC, 0x10585},
- {0x105AD, 0x10586}, {0x105AE, 0x10587}, {0x105AF, 0x10588},
- {0x105B0, 0x10589}, {0x105B1, 0x1058A}, {0x105B3, 0x1058C},
- {0x105B4, 0x1058D}, {0x105B5, 0x1058E}, {0x105B6, 0x1058F},
- {0x105B7, 0x10590}, {0x105B8, 0x10591}, {0x105B9, 0x10592},
- {0x105BB, 0x10594}, {0x105BC, 0x10595}, {0x10CC0, 0x10C80},
- {0x10CC1, 0x10C81}, {0x10CC2, 0x10C82}, {0x10CC3, 0x10C83},
- {0x10CC4, 0x10C84}, {0x10CC5, 0x10C85}, {0x10CC6, 0x10C86},
- {0x10CC7, 0x10C87}, {0x10CC8, 0x10C88}, {0x10CC9, 0x10C89},
- {0x10CCA, 0x10C8A}, {0x10CCB, 0x10C8B}, {0x10CCC, 0x10C8C},
- {0x10CCD, 0x10C8D}, {0x10CCE, 0x10C8E}, {0x10CCF, 0x10C8F},
- {0x10CD0, 0x10C90}, {0x10CD1, 0x10C91}, {0x10CD2, 0x10C92},
- {0x10CD3, 0x10C93}, {0x10CD4, 0x10C94}, {0x10CD5, 0x10C95},
- {0x10CD6, 0x10C96}, {0x10CD7, 0x10C97}, {0x10CD8, 0x10C98},
- {0x10CD9, 0x10C99}, {0x10CDA, 0x10C9A}, {0x10CDB, 0x10C9B},
- {0x10CDC, 0x10C9C}, {0x10CDD, 0x10C9D}, {0x10CDE, 0x10C9E},
- {0x10CDF, 0x10C9F}, {0x10CE0, 0x10CA0}, {0x10CE1, 0x10CA1},
- {0x10CE2, 0x10CA2}, {0x10CE3, 0x10CA3}, {0x10CE4, 0x10CA4},
- {0x10CE5, 0x10CA5}, {0x10CE6, 0x10CA6}, {0x10CE7, 0x10CA7},
- {0x10CE8, 0x10CA8}, {0x10CE9, 0x10CA9}, {0x10CEA, 0x10CAA},
- {0x10CEB, 0x10CAB}, {0x10CEC, 0x10CAC}, {0x10CED, 0x10CAD},
- {0x10CEE, 0x10CAE}, {0x10CEF, 0x10CAF}, {0x10CF0, 0x10CB0},
- {0x10CF1, 0x10CB1}, {0x10CF2, 0x10CB2}, {0x10D70, 0x10D50},
- {0x10D71, 0x10D51}, {0x10D72, 0x10D52}, {0x10D73, 0x10D53},
- {0x10D74, 0x10D54}, {0x10D75, 0x10D55}, {0x10D76, 0x10D56},
- {0x10D77, 0x10D57}, {0x10D78, 0x10D58}, {0x10D79, 0x10D59},
- {0x10D7A, 0x10D5A}, {0x10D7B, 0x10D5B}, {0x10D7C, 0x10D5C},
- {0x10D7D, 0x10D5D}, {0x10D7E, 0x10D5E}, {0x10D7F, 0x10D5F},
- {0x10D80, 0x10D60}, {0x10D81, 0x10D61}, {0x10D82, 0x10D62},
- {0x10D83, 0x10D63}, {0x10D84, 0x10D64}, {0x10D85, 0x10D65},
- {0x118C0, 0x118A0}, {0x118C1, 0x118A1}, {0x118C2, 0x118A2},
- {0x118C3, 0x118A3}, {0x118C4, 0x118A4}, {0x118C5, 0x118A5},
- {0x118C6, 0x118A6}, {0x118C7, 0x118A7}, {0x118C8, 0x118A8},
- {0x118C9, 0x118A9}, {0x118CA, 0x118AA}, {0x118CB, 0x118AB},
- {0x118CC, 0x118AC}, {0x118CD, 0x118AD}, {0x118CE, 0x118AE},
- {0x118CF, 0x118AF}, {0x118D0, 0x118B0}, {0x118D1, 0x118B1},
- {0x118D2, 0x118B2}, {0x118D3, 0x118B3}, {0x118D4, 0x118B4},
- {0x118D5, 0x118B5}, {0x118D6, 0x118B6}, {0x118D7, 0x118B7},
- {0x118D8, 0x118B8}, {0x118D9, 0x118B9}, {0x118DA, 0x118BA},
- {0x118DB, 0x118BB}, {0x118DC, 0x118BC}, {0x118DD, 0x118BD},
- {0x118DE, 0x118BE}, {0x118DF, 0x118BF}, {0x16E60, 0x16E40},
- {0x16E61, 0x16E41}, {0x16E62, 0x16E42}, {0x16E63, 0x16E43},
- {0x16E64, 0x16E44}, {0x16E65, 0x16E45}, {0x16E66, 0x16E46},
- {0x16E67, 0x16E47}, {0x16E68, 0x16E48}, {0x16E69, 0x16E49},
- {0x16E6A, 0x16E4A}, {0x16E6B, 0x16E4B}, {0x16E6C, 0x16E4C},
- {0x16E6D, 0x16E4D}, {0x16E6E, 0x16E4E}, {0x16E6F, 0x16E4F},
- {0x16E70, 0x16E50}, {0x16E71, 0x16E51}, {0x16E72, 0x16E52},
- {0x16E73, 0x16E53}, {0x16E74, 0x16E54}, {0x16E75, 0x16E55},
- {0x16E76, 0x16E56}, {0x16E77, 0x16E57}, {0x16E78, 0x16E58},
- {0x16E79, 0x16E59}, {0x16E7A, 0x16E5A}, {0x16E7B, 0x16E5B},
- {0x16E7C, 0x16E5C}, {0x16E7D, 0x16E5D}, {0x16E7E, 0x16E5E},
- {0x16E7F, 0x16E5F}, {0x16EBB, 0x16EA0}, {0x16EBC, 0x16EA1},
- {0x16EBD, 0x16EA2}, {0x16EBE, 0x16EA3}, {0x16EBF, 0x16EA4},
- {0x16EC0, 0x16EA5}, {0x16EC1, 0x16EA6}, {0x16EC2, 0x16EA7},
- {0x16EC3, 0x16EA8}, {0x16EC4, 0x16EA9}, {0x16EC5, 0x16EAA},
- {0x16EC6, 0x16EAB}, {0x16EC7, 0x16EAC}, {0x16EC8, 0x16EAD},
- {0x16EC9, 0x16EAE}, {0x16ECA, 0x16EAF}, {0x16ECB, 0x16EB0},
- {0x16ECC, 0x16EB1}, {0x16ECD, 0x16EB2}, {0x16ECE, 0x16EB3},
- {0x16ECF, 0x16EB4}, {0x16ED0, 0x16EB5}, {0x16ED1, 0x16EB6},
- {0x16ED2, 0x16EB7}, {0x16ED3, 0x16EB8}, {0x1E922, 0x1E900},
- {0x1E923, 0x1E901}, {0x1E924, 0x1E902}, {0x1E925, 0x1E903},
- {0x1E926, 0x1E904}, {0x1E927, 0x1E905}, {0x1E928, 0x1E906},
- {0x1E929, 0x1E907}, {0x1E92A, 0x1E908}, {0x1E92B, 0x1E909},
- {0x1E92C, 0x1E90A}, {0x1E92D, 0x1E90B}, {0x1E92E, 0x1E90C},
- {0x1E92F, 0x1E90D}, {0x1E930, 0x1E90E}, {0x1E931, 0x1E90F},
- {0x1E932, 0x1E910}, {0x1E933, 0x1E911}, {0x1E934, 0x1E912},
- {0x1E935, 0x1E913}, {0x1E936, 0x1E914}, {0x1E937, 0x1E915},
- {0x1E938, 0x1E916}, {0x1E939, 0x1E917}, {0x1E93A, 0x1E918},
- {0x1E93B, 0x1E919}, {0x1E93C, 0x1E91A}, {0x1E93D, 0x1E91B},
- {0x1E93E, 0x1E91C}, {0x1E93F, 0x1E91D}, {0x1E940, 0x1E91E},
- {0x1E941, 0x1E91F}, {0x1E942, 0x1E920}, {0x1E943, 0x1E921}
diff --git a/libc/src/__support/wctype/perfect_hash_map.h b/libc/src/__support/wctype/perfect_hash_map.h
new file mode 100644
index 0000000000000..2832723121ce4
--- /dev/null
+++ b/libc/src/__support/wctype/perfect_hash_map.h
@@ -0,0 +1,876 @@
+//===-- Perfect hash map for conversion functions ---------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_WCTYPE_PTR_HASH_H
+#define LLVM_LIBC_SRC___SUPPORT_WCTYPE_PTR_HASH_H
+
+#define LIBC_ENABLE_CONSTEXPR 1
+
+#include "hdr/types/size_t.h"
+#include "hdr/types/wint_t.h"
+#include "src/__support/CPP/array.h"
+#include "src/__support/CPP/expected.h"
+#include "src/__support/CPP/monostate.h"
+#include "src/__support/CPP/optional.h"
+#include "src/__support/CPP/span.h"
+#include "src/__support/CPP/string.h"
+#include "src/__support/CPP/tuple.h"
+#include "src/__support/CPP/type_traits/is_unsigned.h"
+#include "src/__support/OSUtil/io.h"
+#include "src/__support/math/ceil.h"
+#include "src/__support/math/log.h"
+
+#undef LIBC_ENABLE_CONSTEXPR
+
+namespace LIBC_NAMESPACE_DECL {
+
+namespace ptrhash {
+
+LIBC_INLINE_VAR constexpr size_t SHARDS = 1;
+
+class Fastrand {
+public:
+ // This seed value is very important for different inputs. Bad values are
+ // known to cause compilation errors and/or incorrect computations in some
+ // cases. Defaulted to 0xEF6F79ED30BA75A in the original implementation, but
+ // this is not sufficient. 0x64a727ea04c46a32 is another viable seed.
+ LIBC_INLINE constexpr Fastrand() : seed(0xeec13c9f1362aa74) {}
+
+ LIBC_INLINE constexpr uint8_t gen_byte() {
+ return static_cast<uint8_t>(this->gen());
+ }
+
+ LIBC_INLINE constexpr uint64_t gen() {
+ constexpr uint64_t WY_CONST_0 = 0x2d35'8dcc'aa6c'78a5;
+ constexpr uint64_t WY_CONST_1 = 0x8bb8'4b93'962e'acc9;
+
+ auto s = wrapping_add(seed, WY_CONST_0);
+ seed = s;
+ auto const t =
+ static_cast<__uint128_t>(s) * static_cast<__uint128_t>(s ^ WY_CONST_1);
+ return static_cast<uint64_t>(t) ^ static_cast<uint64_t>(t >> 64);
+ }
+
+private:
+ template <typename T> LIBC_INLINE static constexpr T wrapping_add(T a, T b) {
+ while (b != 0) {
+ T carry = a & b;
+ a = a ^ b;
+ b = carry << 1;
+ }
+ return a;
+ }
+
+private:
+ uint64_t seed;
+};
+
+LIBC_INLINE_VAR constexpr auto BUCKET_IDX_NONE = ~static_cast<uint32_t>(0);
+
+template <size_t MaxSize = 5> class BinaryHeap {
+public:
+ LIBC_INLINE constexpr BinaryHeap() = default;
+
+ LIBC_INLINE constexpr void push(const cpp::tuple<size_t, uint32_t> &value) {
+ if (current_size >= MaxSize)
+ return;
+ data[current_size++] = value;
+ }
+
+ LIBC_INLINE constexpr cpp::tuple<size_t, uint32_t> pop() {
+ if (current_size == 0)
+ return {};
+ size_t max_idx = 0;
+ for (size_t i = 1; i < current_size; ++i) {
+ if (cmp(data[max_idx], data[i]))
+ max_idx = i;
+ }
+ auto top = data[max_idx];
+ data[max_idx] = data[current_size - 1];
+ --current_size;
+ return top;
+ }
+
+ LIBC_INLINE constexpr const cpp::tuple<size_t, uint32_t> &peek() const {
+ size_t max_idx = 0;
+ for (size_t i = 1; i < current_size; ++i) {
+ if (cmp(data[max_idx], data[i]))
+ max_idx = i;
+ }
+ return data[max_idx];
+ }
+
+ LIBC_INLINE constexpr bool empty() const { return current_size == 0; }
+
+private:
+ LIBC_INLINE static constexpr bool cmp(cpp::tuple<size_t, uint32_t> x,
+ cpp::tuple<size_t, uint32_t> y) {
+ return cpp::get<0>(x) < cpp::get<0>(y) ||
+ (!(cpp::get<0>(y) < cpp::get<0>(x)) &&
+ cpp::get<1>(x) < cpp::get<1>(y));
+ }
+
+private:
+ cpp::array<cpp::tuple<size_t, uint32_t>, MaxSize> data{};
+ size_t current_size{};
+};
+
+template <typename T> LIBC_INLINE constexpr bool is_power_of_two(T x) {
+ static_assert(cpp::is_unsigned_v<T>,
+ "is_power_of_two requires unsigned type");
+ return x != 0 && (x & (x - 1)) == 0;
+}
+
+LIBC_INLINE constexpr size_t get_parts(size_t n) {
+ size_t parts = 0;
+ auto eps = 0.01 / 2.0;
+ auto x = static_cast<double>(n) * eps * eps / 2.0;
+ auto target_parts = static_cast<size_t>(x / math::log(x));
+ auto parts_per_shard = target_parts / SHARDS;
+ parts = ((parts_per_shard > 1) ? parts_per_shard : 1) * SHARDS;
+ return parts;
+}
+
+LIBC_INLINE constexpr size_t get_slots_per_part(size_t keys_per_part) {
+ size_t slots_per_part =
+ static_cast<size_t>(static_cast<double>(keys_per_part) / 0.99);
+ if (is_power_of_two(slots_per_part)) {
+ slots_per_part += 1;
+ }
+ return slots_per_part;
+}
+
+template <size_t n> class PtrhashConfig {
+public:
+ LIBC_INLINE_VAR static constexpr size_t PARTS = get_parts(n);
+ LIBC_INLINE_VAR static constexpr size_t KEYS_PER_PART = n / PARTS;
+ LIBC_INLINE_VAR static constexpr size_t PARTS_PER_SHARD = PARTS / SHARDS;
+ LIBC_INLINE_VAR static constexpr size_t SLOTS_PER_PART =
+ get_slots_per_part(KEYS_PER_PART);
+ LIBC_INLINE_VAR static constexpr size_t SLOTS_TOTAL = PARTS * SLOTS_PER_PART;
+ LIBC_INLINE_VAR static constexpr size_t BUCKETS_PER_PART =
+ math::ceil(KEYS_PER_PART / 3.0) + 3;
+ LIBC_INLINE_VAR static constexpr size_t BUCKETS_TOTAL =
+ PARTS * BUCKETS_PER_PART;
+};
+
+template <size_t n_, size_t parts_, size_t parts_per_shard_,
+ size_t slots_total_, size_t buckets_total_, size_t slots_,
+ size_t buckets_, typename Key = uint64_t,
+ typename F = cpp::array<uint32_t, slots_total_ - n_>,
+ typename PilotsTypeV = cpp::array<uint8_t, buckets_total_>>
+class PtrHash {
+public:
+ static_assert(
+ cpp::is_same_v<PilotsTypeV, cpp::span<uint8_t>> ||
+ cpp::is_same_v<PilotsTypeV, cpp::array<uint8_t, buckets_total_>>,
+ "V must be a byte slice or byte vector");
+
+ uint64_t seed;
+ PilotsTypeV pilots;
+ F remap;
+
+ LIBC_INLINE constexpr PtrHash(uint64_t seed_, PilotsTypeV pilots_, F remap_)
+ : seed(seed_), pilots(pilots_), remap(remap_) {}
+
+ LIBC_INLINE constexpr PtrHash(const PtrHash &) = default;
+ LIBC_INLINE constexpr PtrHash(PtrHash &&) = default;
+
+ LIBC_INLINE constexpr PtrHash &operator=(const PtrHash &) = default;
+ LIBC_INLINE constexpr PtrHash &operator=(PtrHash &&) = default;
+
+ LIBC_INLINE constexpr size_t index(Key key) const {
+ auto slot = this->index_no_remap(key);
+
+ if (slot < n_) {
+ return slot;
+ }
+
+ return this->remap[slot - n_];
+ }
+
+ LIBC_INLINE constexpr size_t index_no_remap(Key key) const {
+ auto hx = this->hash_key(key);
+ auto b = this->bucket(hx);
+ auto pilot = this->pilots[b];
+ return this->slot(hx, pilot);
+ }
+
+ LIBC_INLINE constexpr size_t slot(uint64_t hx, uint64_t pilot) const {
+ return (this->part(hx) * slots_) + this->slot_in_part(hx, pilot);
+ }
+
+ LIBC_INLINE constexpr size_t slot_in_part(uint64_t hx, uint64_t pilot) const {
+ return this->slot_in_part_hp(hx, this->hash_pilot(pilot));
+ }
+
+ LIBC_INLINE constexpr cpp::optional<cpp::tuple<uint64_t, PilotsTypeV, F>>
+ compute_pilots(const cpp::array<Key, n_> &keys) {
+ cpp::array<cpp::array<bool, slots_>, parts_> taken{};
+ for (cpp::array<bool, slots_> &t : taken) {
+ for (size_t i = 0; i < slots_; i++) {
+ t[i] = 0;
+ }
+ }
+ PilotsTypeV pilots{};
+
+ size_t tries = 0;
+ constexpr size_t MAX_TRIES = 10;
+
+ // hard code random numbers for the generator to make it simpler
+ constexpr uint64_t STDRNG[MAX_TRIES] = {
+ 0x1a275d28e2768536, 0x72737b411117ac11, 0xeb08f8fcd423148f,
+ 0x1d6f85975d49be9e, 0xf03250d1c097577, 0xac6e884d8db1fa90,
+ 0x4415d98c0c03a79f, 0xa36bfbcfddf4d5e6, 0x154aef1f436d8e98,
+ 0xd21f78471475f18e};
+
+ while (true) {
+ bool contd = false;
+ tries += 1;
+ if (tries > MAX_TRIES) {
+ return {};
+ }
+
+ this->seed = STDRNG[tries - 1];
+ pilots = PilotsTypeV{0};
+
+ for (auto &t : taken)
+ for (size_t e = 0; e < pilots.size(); e++)
+ t[e] = false;
+
+ auto shard_hashes = this->shards(keys);
+
+ const size_t pilots_chunk_size =
+ cpp::max(buckets_ * parts_per_shard_, static_cast<size_t>(1));
+ const size_t taken_chunk_size = parts_per_shard_;
+ const size_t num_pilots_chunks =
+ (pilots.size() + pilots_chunk_size - 1) / pilots_chunk_size;
+ const size_t num_taken_chunks =
+ (taken.size() + taken_chunk_size - 1) / taken_chunk_size;
+
+ for (size_t shard = 0;
+ shard < cpp::min(shard_hashes.size(),
+ cpp::min(num_pilots_chunks, num_taken_chunks));
+ shard++) {
+ cpp::array<uint64_t, n_> hashes = shard_hashes[shard];
+
+ size_t pilots_begin = shard * pilots_chunk_size;
+ size_t pilots_end =
+ cpp::min(pilots_begin + pilots_chunk_size, pilots.size());
+
+ size_t taken_begin = shard * taken_chunk_size;
+ size_t taken_end =
+ cpp::min(taken_begin + taken_chunk_size, taken.size());
+
+ cpp::optional<cpp::tuple<cpp::array<uint64_t, n_>,
+ cpp::array<uint32_t, parts_per_shard_ + 1>>>
+ sorted_parts = this->sort_parts(shard, hashes);
+ if (!sorted_parts) {
+ contd = true;
+ break;
+ }
+
+ auto &[new_hashes, part_starts] = sorted_parts.value();
+
+ if (!this->build_shard(shard, new_hashes, part_starts, pilots,
+ pilots_begin, pilots_end, taken_begin, taken_end,
+ taken)) {
+ contd = true;
+ break;
+ }
+ }
+ if (contd) {
+ continue;
+ }
+
+ auto const remap = this->remap_free_slots(taken);
+
+ if (!remap) {
+ continue;
+ }
+ break;
+ }
+ this->pilots = pilots;
+
+ return {{this->seed, this->pilots, this->remap}};
+ }
+
+ LIBC_INLINE constexpr cpp::expected<cpp::monostate, cpp::nullopt_t>
+ remap_free_slots(cpp::array<cpp::array<bool, slots_>, parts_> &taken) {
+ cpp::array<size_t, parts_> val{};
+ for (size_t i = 0; i < taken.size(); ++i) {
+ size_t counter = 0;
+ for (auto element : taken[i]) {
+ if (!element) {
+ counter++;
+ }
+ }
+ val[i] = counter;
+ }
+
+ size_t acc = 0;
+ for (const auto &item : val) {
+ acc += item;
+ }
+
+ if (acc != slots_total_ - n_) {
+ write_to_stderr("Not the right number of free slots left!\n");
+ write_to_stderr(" total slots ");
+ write_to_stderr(cpp::to_string(slots_total_));
+ write_to_stderr(" - n ");
+ write_to_stderr(cpp::to_string(n_));
+ write_to_stderr("\n");
+ return cpp::unexpected(cpp::nullopt);
+ }
+
+ if (slots_total_ == n_) {
+ return cpp::monostate{};
+ }
+
+ cpp::array<uint64_t, slots_total_ - n_> v{};
+ size_t v_idx = 0;
+
+ auto const get = [&](cpp::array<cpp::array<bool, slots_>, parts_> &t,
+ size_t idx) { return t[idx / slots_][idx % slots_]; };
+
+ size_t p = 0;
+ for (const auto &t : taken) {
+ auto const offset = p * slots_;
+ for (size_t idx = 0; idx < t.size(); idx++) {
+ if (!t[idx]) {
+ auto result = offset + idx;
+ if (result < n_) {
+ while (!get(taken, n_ + v_idx)) {
+ v[v_idx++] = result;
+ }
+ v[v_idx++] = result;
+ }
+ }
+ }
+ p++;
+ }
+
+ for (size_t i = 0; i < v.size(); i++) {
+ this->remap[i] = static_cast<uint32_t>(v[i]);
+ }
+
+ return cpp::monostate{};
+ }
+
+ LIBC_INLINE constexpr auto shards(const cpp::array<Key, n_> &keys) const {
+ return this->no_sharding(keys);
+ }
+
+ LIBC_INLINE constexpr cpp::array<cpp::array<uint64_t, n_>, 1>
+ no_sharding(const cpp::array<Key, n_> &keys) const {
+ cpp::array<uint64_t, n_> ret;
+ for (size_t i = 0; i < keys.size(); i++) {
+ ret[i] = this->hash_key(keys[i]);
+ }
+ return {ret};
+ }
+
+ LIBC_INLINE constexpr uint64_t hash_key(Key x) const {
+ uint64_t value = 0;
+ constexpr uint64_t BITS = sizeof(uint64_t) * 8;
+ value = ((value << 5) | (value >> (BITS - 5))) ^ x;
+ value *= 0x517cc1b727220a95;
+ return value ^ this->seed;
+ }
+
+ LIBC_INLINE constexpr cpp::optional<cpp::tuple<
+ cpp::array<uint64_t, n_>, cpp::array<uint32_t, parts_per_shard_ + 1>>>
+ sort_parts(size_t shard, cpp::array<uint64_t, n_> hashes) const {
+ for (size_t i = 0; i < hashes.size(); i++) {
+ for (size_t j = i + 1; j < hashes.size(); j++) {
+ if (hashes[i] > hashes[j]) {
+ auto temp = hashes[i];
+ hashes[i] = hashes[j];
+ hashes[j] = temp;
+ }
+ }
+ }
+
+ bool distinct = true;
+ for (size_t i = 1; i < hashes.size(); ++i) {
+ if (hashes[i] == hashes[i - 1]) {
+ distinct = false;
+ break;
+ }
+ }
+
+ if (!distinct) {
+ write_to_stderr("Hashes are not distinct\n");
+ return cpp::nullopt;
+ }
+
+ if (!hashes.empty()) {
+ LIBC_ASSERT(shard * parts_per_shard_ <= this->part(hashes[0]));
+ LIBC_ASSERT(this->part(hashes[hashes.size() - 1]) <
+ (shard + 1) * parts_per_shard_);
+ }
+
+ cpp::array<uint32_t, parts_per_shard_ + 1> part_starts{};
+
+ for (size_t part_in_shard = 1; part_in_shard < parts_per_shard_ + 1;
+ ++part_in_shard) {
+ auto it = cpp::lower_bound(
+ hashes.begin(), hashes.end(),
+ shard * parts_per_shard_ + part_in_shard,
+ [&](uint64_t h, uint64_t k) { return this->part(h) < k; });
+
+ part_starts[part_in_shard] =
+ static_cast<uint32_t>(cpp::distance(hashes.begin(), it));
+ }
+ size_t max_part_len = 0;
+ for (size_t i = 0; i + 1 < part_starts.size(); ++i) {
+ auto start = part_starts[i];
+ auto end = part_starts[i + 1];
+
+ size_t len = end - start;
+ max_part_len = cpp::max<size_t>(max_part_len, len);
+ }
+
+ if (max_part_len > slots_) {
+ return cpp::nullopt;
+ }
+
+ return cpp::tuple<cpp::array<uint64_t, n_>,
+ cpp::array<uint32_t, parts_per_shard_ + 1>>{hashes,
+ part_starts};
+ }
+
+ LIBC_INLINE constexpr bool
+ build_shard(size_t shard, cpp::array<uint64_t, n_> &hashes,
+ cpp::array<uint32_t, parts_per_shard_ + 1> &part_starts,
+ PilotsTypeV &pilots, size_t pilots_begin, size_t pilots_end,
+ size_t taken_begin, size_t taken_end,
+ cpp::array<cpp::array<bool, slots_>, parts_> &taken) const {
+
+ size_t pilots_chunk_size = pilots_end - pilots_begin;
+
+ auto part_in_shard = 0;
+ for (size_t taken_idx = taken_begin; taken_idx < taken_end; ++taken_idx) {
+ const auto num_chunks = pilots_chunk_size / buckets_;
+ for (size_t i = 0; i < num_chunks; ++i) {
+ size_t target_pilots_begin = pilots_begin + i * buckets_;
+ size_t target_pilots_end =
+ cpp::min(target_pilots_begin + buckets_, pilots_end);
+ auto part = shard * parts_per_shard_ + part_in_shard;
+
+ auto _cnt = this->build_part(
+ part,
+ cpp::span<uint64_t>(hashes).subspan(part_starts[part_in_shard],
+ part_starts[part_in_shard + 1] -
+ part_starts[part_in_shard]),
+ cpp::span<uint8_t>(
+ const_cast<uint8_t *>(pilots.data() + target_pilots_begin),
+ target_pilots_end - target_pilots_begin),
+ taken[taken_idx]);
+ if (!_cnt) {
+ return false;
+ }
+ }
+ part_in_shard++;
+ }
+
+ return true;
+ }
+
+ LIBC_INLINE constexpr cpp::optional<size_t>
+ build_part(size_t part, cpp::span<uint64_t> hashes, cpp::span<uint8_t> pilots,
+ cpp::array<bool, slots_> &taken) const {
+ cpp::tuple<cpp::array<uint32_t, buckets_ + 1>,
+ cpp::array<uint32_t, buckets_>>
+ sorted_buckets = this->sort_buckets(part, hashes);
+ cpp::array<uint32_t, buckets_ + 1> starts = cpp::get<0>(sorted_buckets);
+ cpp::array<uint32_t, buckets_> bucket_order = cpp::get<1>(sorted_buckets);
+
+ auto kmax = 256u;
+
+ cpp::array<uint32_t, slots_> slots{};
+ for (size_t i = 0; i < slots_; i++) {
+ slots[i] = BUCKET_IDX_NONE;
+ }
+
+ auto bucket_len = [&](uint32_t b) constexpr -> size_t {
+ return starts[b + 1] - starts[b];
+ };
+
+ auto heap = BinaryHeap<>();
+
+ auto duplicate_slots = [&](uint32_t b, uint64_t p) constexpr {
+ auto hp = this->hash_pilot(p);
+ auto hashes_range = hashes.subspan(starts[b], starts[b + 1] - starts[b]);
+
+ auto i = 0;
+ for (auto const &e1 : hashes_range) {
+ auto hx = this->slot_in_part_hp(e1, hp);
+ for (auto e2 : hashes_range.subspan(i + 1)) {
+ auto hy = this->slot_in_part_hp(e2, hp);
+ if (hx == hy) {
+ return true;
+ }
+ }
+ i++;
+ }
+ return false;
+ };
+
+ cpp::array<uint32_t, 16> recent{
+ {BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE,
+ BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE,
+ BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE,
+ BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE}};
+ size_t total_evictions = 0;
+
+ auto rng = Fastrand();
+
+ for (size_t iter_num = 0; iter_num < bucket_order.size(); iter_num++) {
+ auto const &new_b = bucket_order[iter_num];
+ auto const new_bucket =
+ hashes.subspan(starts[new_b], starts[new_b + 1] - starts[new_b]);
+ if (new_bucket.empty()) {
+ pilots[new_b] = 0;
+ continue;
+ }
+ auto const new_b_len = new_bucket.size();
+ size_t evictions = 0;
+
+ heap.push({new_b_len, new_b});
+ for (size_t i = 0; i < recent.size(); ++i) {
+ recent[i] = BUCKET_IDX_NONE;
+ }
+ auto recent_idx = 0;
+ recent[0] = new_b;
+
+ while (!heap.empty()) {
+ auto const b = cpp::get<1>(heap.peek());
+ heap.pop();
+ if (evictions > slots_ && is_power_of_two((evictions))) {
+ if (evictions >= 10 * slots_) {
+ return cpp::nullopt;
+ }
+ }
+ auto const bucket =
+ hashes.subspan(starts[b], starts[b + 1] - starts[b]);
+ if (auto fpilot = this->find_pilot(kmax, bucket, taken)) {
+ auto &[p, hp] = fpilot.value();
+ pilots[b] = static_cast<uint8_t>(p);
+ for (auto &item :
+ hashes.subspan(starts[b], starts[b + 1] - starts[b])) {
+ auto p = this->slot_in_part_hp(item, hp);
+ slots[p] = b;
+ }
+ continue;
+ }
+ uint64_t p0 = rng.gen_byte();
+ cpp::tuple<size_t, uint64_t> best = {
+ cpp::numeric_limits<size_t>::max(),
+ cpp::numeric_limits<uint64_t>::max()};
+ for (size_t delat = 0; delat < kmax; ++delat) {
+ bool build_part_loop_continue_inner_continue = false;
+ auto const p = (p0 + delat) % kmax;
+ auto const hp = this->hash_pilot(p);
+ size_t collision_score = 0;
+ for (auto &item :
+ hashes.subspan(starts[b], starts[b + 1] - starts[b])) {
+ auto p = this->slot_in_part_hp(item, hp);
+ auto const s = slots[p];
+ size_t new_score = 0;
+ if (s == BUCKET_IDX_NONE) {
+ continue;
+ } else {
+ bool found = false;
+ for (auto it : recent) {
+ found = found || it == s;
+ }
+ if (found) {
+ build_part_loop_continue_inner_continue = true;
+ break;
+ } else {
+ auto const len = bucket_len(s);
+ new_score = len * len;
+ }
+ }
+ collision_score += new_score;
+ if (collision_score >= cpp::get<0>(best)) {
+ build_part_loop_continue_inner_continue = true;
+ break;
+ }
+ }
+ if (build_part_loop_continue_inner_continue) {
+ continue;
+ }
+ if (!duplicate_slots(b, p)) {
+ best = {collision_score, p};
+ if (collision_score == new_b_len * new_b_len) {
+ break;
+ }
+ }
+ }
+ if (cpp::get<0>(best) == cpp::numeric_limits<size_t>::max() &&
+ cpp::get<1>(best) == cpp::numeric_limits<uint64_t>::max()) {
+ return cpp::nullopt;
+ }
+
+ auto const &p = cpp::get<1>(best);
+ pilots[b] = static_cast<uint8_t>(p);
+ auto const hp = this->hash_pilot(p);
+ for (auto &item :
+ hashes.subspan(starts[b], starts[b + 1] - starts[b])) {
+ auto slot = this->slot_in_part_hp(item, hp);
+ auto const b2 = slots[slot];
+ if (b2 != BUCKET_IDX_NONE) {
+ LIBC_ASSERT(b2 != b);
+ heap.push({bucket_len(b2), b2});
+ evictions++;
+
+ auto hp = this->hash_pilot(static_cast<uint64_t>(pilots[b2]));
+ for (auto &item :
+ hashes.subspan(starts[b2], starts[b2 + 1] - starts[b2])) {
+ auto p2 = this->slot_in_part_hp(item, hp);
+ slots[p2] = BUCKET_IDX_NONE;
+ taken[p2] = false;
+ }
+ }
+ slots[slot] = b;
+ taken[slot] = true;
+ }
+
+ recent_idx++;
+ recent_idx %= recent.size();
+ recent[recent_idx] = b;
+ }
+
+ total_evictions += evictions;
+ }
+ return total_evictions;
+ }
+
+ LIBC_INLINE constexpr cpp::optional<cpp::tuple<uint64_t, uint64_t>>
+ find_pilot(uint64_t kmax, cpp::span<uint64_t> bucket,
+ cpp::array<bool, slots_> &taken) const {
+ auto const r = bucket.size() / 4 * 4;
+ for (size_t p = 0; p < kmax; p++) {
+ bool find_pilot_continue = false;
+ auto const hp = this->hash_pilot(p);
+ auto const check = [&](uint64_t hx) {
+ return taken[this->slot_in_part_hp(hx, hp)];
+ };
+ auto bad = false;
+ for (size_t i = 0; i < r; i++) {
+ if (check(bucket[i])) {
+ find_pilot_continue = true;
+ break;
+ }
+ }
+ if (find_pilot_continue) {
+ continue;
+ }
+ for (auto hx : bucket.subspan(r)) {
+ bad |= check(hx);
+ }
+ if (bad) {
+ continue;
+ }
+
+ if (this->try_take_pilot(bucket, hp, taken)) {
+ return cpp::tuple<size_t, uint64_t>{p, hp};
+ }
+ }
+ return cpp::nullopt;
+ }
+
+ LIBC_INLINE constexpr bool
+ try_take_pilot(cpp::span<uint64_t> bucket, uint64_t hp,
+ cpp::array<bool, slots_> &taken) const {
+ for (size_t i = 0; i < bucket.size(); i++) {
+ size_t hx = bucket[i];
+ auto const slot = this->slot_in_part_hp(hx, hp);
+ if (taken[slot]) {
+ for (auto hx : bucket.subspan(0, i)) {
+ taken[this->slot_in_part_hp(hx, hp)] = false;
+ }
+ return false;
+ }
+ taken[slot] = true;
+ }
+ return true;
+ }
+
+ LIBC_INLINE constexpr uint64_t hash_pilot(uint64_t p) const {
+ uint64_t c = 0x517cc1b727220a95;
+ uint64_t b = p ^ this->seed;
+ uint64_t result = 0;
+
+ while (b != 0) {
+ if (b & 1) {
+ result = result + c;
+ }
+ c = c << 1;
+ b >>= 1;
+ }
+
+ return result;
+ }
+
+ LIBC_INLINE constexpr size_t slot_in_part_hp(uint64_t hx, uint64_t hp) const {
+ uint64_t d =
+ cpp::max(PtrhashConfig<n_>::SLOTS_PER_PART, static_cast<size_t>(1));
+ uint64_t m = cpp::numeric_limits<uint64_t>::max() / d + 1;
+ auto lowbits = m * (hx ^ hp);
+ return (static_cast<__uint128_t>(lowbits) * static_cast<__uint128_t>(d)) >>
+ 64;
+ }
+
+ LIBC_INLINE constexpr cpp::tuple<cpp::array<uint32_t, buckets_ + 1>,
+ cpp::array<uint32_t, buckets_>>
+ sort_buckets(size_t part, cpp::span<uint64_t> hashes) const {
+ cpp::array<uint32_t, buckets_ + 1> bucket_starts{};
+ size_t bucket_starts_idx = 0;
+ cpp::array<uint32_t, buckets_> order{};
+ for (size_t i = 0; i < order.size(); ++i) {
+ order[i] = BUCKET_IDX_NONE;
+ }
+ cpp::array<size_t, 32> bucket_len_cnt = {0};
+
+ size_t end = 0;
+ bucket_starts[bucket_starts_idx++] = static_cast<uint32_t>(end);
+
+ for (size_t b = 0; b < buckets_; b++) {
+ auto start = end;
+ while (end < hashes.size() &&
+ this->bucket(hashes[end]) == part * buckets_ + b) {
+ end++;
+ }
+
+ auto l = end - start;
+ bucket_len_cnt[l]++;
+ bucket_starts[bucket_starts_idx++] = static_cast<uint32_t>(end);
+ }
+
+ LIBC_ASSERT(end == hashes.size());
+
+ auto max_bucket_size = bucket_len_cnt.size() - 1;
+ auto const expected_bucket_size = slots_ / buckets_;
+ // "Part {part}: Bucket size {max_bucket_size} is too much "
+ // "larger than the expected size of {expected_bucket_size}."
+ LIBC_ASSERT(static_cast<double>(max_bucket_size) <=
+ (20. * expected_bucket_size));
+ auto acc = 0;
+ for (int i = static_cast<int>(max_bucket_size); i > -1; i--) {
+ auto tmp = bucket_len_cnt[i];
+ bucket_len_cnt[i] = acc;
+ acc += tmp;
+ }
+ for (size_t b = 0; b < buckets_; b++) {
+ size_t l = bucket_starts[b + 1] - bucket_starts[b];
+ order[bucket_len_cnt[l]] = static_cast<uint32_t>(b);
+ bucket_len_cnt[l] += 1;
+ }
+
+ return {bucket_starts, order};
+ }
+
+ LIBC_INLINE constexpr size_t part(uint64_t hx) const {
+ return (static_cast<__uint128_t>(PtrhashConfig<n_>::PARTS) *
+ static_cast<__uint128_t>(hx)) >>
+ 64;
+ }
+
+ LIBC_INLINE constexpr size_t bucket(uint64_t hx) const {
+ return (static_cast<__uint128_t>(PtrhashConfig<n_>::BUCKETS_TOTAL) *
+ static_cast<__uint128_t>(hx)) >>
+ 64;
+ }
+};
+
+template <size_t n, typename Key = uint64_t>
+LIBC_INLINE constexpr auto get_params(const cpp::array<Key, n> &keys) {
+ using F = cpp::array<uint32_t, PtrhashConfig<n>::SLOTS_TOTAL - n>;
+ using PilotsTypeV = cpp::array<uint8_t, PtrhashConfig<n>::BUCKETS_TOTAL>;
+
+ auto p =
+ PtrHash<n, PtrhashConfig<n>::PARTS, PtrhashConfig<n>::PARTS_PER_SHARD,
+ PtrhashConfig<n>::SLOTS_TOTAL, PtrhashConfig<n>::BUCKETS_TOTAL,
+ PtrhashConfig<n>::SLOTS_PER_PART,
+ PtrhashConfig<n>::BUCKETS_PER_PART, Key, F, PilotsTypeV>(
+ 0, PilotsTypeV(), F());
+ auto result = p.compute_pilots(keys);
+
+ LIBC_ASSERT(result &&
+ "Unable to construct PtrHash after 10 tries. Try using a "
+ "better hash or decreasing lambda.\n");
+
+ return result.value();
+}
+
+template <
+ size_t n,
+ typename PilotsTypeV = cpp::array<uint8_t, PtrhashConfig<n>::BUCKETS_TOTAL>,
+ typename F = cpp::array<uint32_t, PtrhashConfig<n>::SLOTS_TOTAL - n>>
+LIBC_INLINE constexpr auto init_hasher(size_t seed, PilotsTypeV pilots,
+ F remap) {
+ return PtrHash<n, PtrhashConfig<n>::PARTS, PtrhashConfig<n>::PARTS_PER_SHARD,
+ PtrhashConfig<n>::SLOTS_TOTAL, PtrhashConfig<n>::BUCKETS_TOTAL,
+ PtrhashConfig<n>::SLOTS_PER_PART,
+ PtrhashConfig<n>::BUCKETS_PER_PART>(seed, pilots, remap);
+}
+
+} // namespace ptrhash
+
+template <size_t Capacity, class Hasher> class PerfectHashMap {
+public:
+ struct Entry {
+ wint_t key : 21;
+ wint_t value : 21;
+ LIBC_INLINE constexpr Entry() = default;
+ LIBC_INLINE constexpr Entry(wint_t key, wint_t value)
+ : key(key), value(value) {}
+ };
+
+ LIBC_INLINE constexpr PerfectHashMap(
+ const cpp::array<cpp::array<wint_t, 2>, Capacity> &pairs,
+ const Hasher &hasher)
+ : hasher(hasher) {
+ for (const auto &pair : pairs) {
+ const auto &key = pair[0];
+ const auto &value = pair[1];
+ auto const idx = hasher.index(key);
+ LIBC_ASSERT(idx < Capacity && "Index out of bounds");
+ this->entries[idx] = Entry{key, value};
+ }
+ }
+
+ LIBC_INLINE constexpr cpp::optional<wint_t> find(const wint_t key) const {
+ size_t idx = hasher.index(key);
+ if (idx >= Capacity)
+ return cpp::nullopt;
+
+ const Entry &e = entries[idx];
+ if (e.key != key)
+ return cpp::nullopt;
+
+ return e.value;
+ }
+
+ LIBC_INLINE constexpr bool contains(const wint_t key) const {
+ return this->find(key).has_value();
+ }
+
+ LIBC_INLINE constexpr size_t size() { return Capacity; }
+
+private:
+ Entry entries[Capacity];
+ const Hasher &hasher;
+};
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_PTR_HASH_H
diff --git a/libc/src/__support/wctype/upper_to_lower.h b/libc/src/__support/wctype/upper_to_lower.h
new file mode 100644
index 0000000000000..516a89033c9c0
--- /dev/null
+++ b/libc/src/__support/wctype/upper_to_lower.h
@@ -0,0 +1,553 @@
+//===-- Auto-generated upper to lower case mappings table -------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+// DO NOT EDIT MANUALLY.
+// This file is generated by libc/utils/wctype_utils scripts.
+// This file is meant to be included directly into LLVM libc code
+// Format: {from_codepoint, to_codepoint}
+// Info: 1415 entries
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_WCTYPE_UPPER_TO_LOWER_H
+#define LLVM_LIBC_SRC___SUPPORT_WCTYPE_UPPER_TO_LOWER_H
+
+#include "perfect_hash_map.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LIBC_INLINE_VAR constexpr cpp::array<cpp::array<wint_t, 2>, 1415>
+ UPPER_TO_LOWER_DATA = {
+ {{0x41, 0x61}, {0x42, 0x62}, {0x43, 0x63},
+ {0x44, 0x64}, {0x45, 0x65}, {0x46, 0x66},
+ {0x47, 0x67}, {0x48, 0x68}, {0x49, 0x69},
+ {0x4A, 0x6A}, {0x4B, 0x6B}, {0x4C, 0x6C},
+ {0x4D, 0x6D}, {0x4E, 0x6E}, {0x4F, 0x6F},
+ {0x50, 0x70}, {0x51, 0x71}, {0x52, 0x72},
+ {0x53, 0x73}, {0x54, 0x74}, {0x55, 0x75},
+ {0x56, 0x76}, {0x57, 0x77}, {0x58, 0x78},
+ {0x59, 0x79}, {0x5A, 0x7A}, {0xC0, 0xE0},
+ {0xC1, 0xE1}, {0xC2, 0xE2}, {0xC3, 0xE3},
+ {0xC4, 0xE4}, {0xC5, 0xE5}, {0xC6, 0xE6},
+ {0xC7, 0xE7}, {0xC8, 0xE8}, {0xC9, 0xE9},
+ {0xCA, 0xEA}, {0xCB, 0xEB}, {0xCC, 0xEC},
+ {0xCD, 0xED}, {0xCE, 0xEE}, {0xCF, 0xEF},
+ {0xD0, 0xF0}, {0xD1, 0xF1}, {0xD2, 0xF2},
+ {0xD3, 0xF3}, {0xD4, 0xF4}, {0xD5, 0xF5},
+ {0xD6, 0xF6}, {0xD8, 0xF8}, {0xD9, 0xF9},
+ {0xDA, 0xFA}, {0xDB, 0xFB}, {0xDC, 0xFC},
+ {0xDD, 0xFD}, {0xDE, 0xFE}, {0x100, 0x101},
+ {0x102, 0x103}, {0x104, 0x105}, {0x106, 0x107},
+ {0x108, 0x109}, {0x10A, 0x10B}, {0x10C, 0x10D},
+ {0x10E, 0x10F}, {0x110, 0x111}, {0x112, 0x113},
+ {0x114, 0x115}, {0x116, 0x117}, {0x118, 0x119},
+ {0x11A, 0x11B}, {0x11C, 0x11D}, {0x11E, 0x11F},
+ {0x120, 0x121}, {0x122, 0x123}, {0x124, 0x125},
+ {0x126, 0x127}, {0x128, 0x129}, {0x12A, 0x12B},
+ {0x12C, 0x12D}, {0x12E, 0x12F}, {0x130, 0x69},
+ {0x132, 0x133}, {0x134, 0x135}, {0x136, 0x137},
+ {0x139, 0x13A}, {0x13B, 0x13C}, {0x13D, 0x13E},
+ {0x13F, 0x140}, {0x141, 0x142}, {0x143, 0x144},
+ {0x145, 0x146}, {0x147, 0x148}, {0x14A, 0x14B},
+ {0x14C, 0x14D}, {0x14E, 0x14F}, {0x150, 0x151},
+ {0x152, 0x153}, {0x154, 0x155}, {0x156, 0x157},
+ {0x158, 0x159}, {0x15A, 0x15B}, {0x15C, 0x15D},
+ {0x15E, 0x15F}, {0x160, 0x161}, {0x162, 0x163},
+ {0x164, 0x165}, {0x166, 0x167}, {0x168, 0x169},
+ {0x16A, 0x16B}, {0x16C, 0x16D}, {0x16E, 0x16F},
+ {0x170, 0x171}, {0x172, 0x173}, {0x174, 0x175},
+ {0x176, 0x177}, {0x178, 0xFF}, {0x179, 0x17A},
+ {0x17B, 0x17C}, {0x17D, 0x17E}, {0x181, 0x253},
+ {0x182, 0x183}, {0x184, 0x185}, {0x186, 0x254},
+ {0x187, 0x188}, {0x189, 0x256}, {0x18A, 0x257},
+ {0x18B, 0x18C}, {0x18E, 0x1DD}, {0x18F, 0x259},
+ {0x190, 0x25B}, {0x191, 0x192}, {0x193, 0x260},
+ {0x194, 0x263}, {0x196, 0x269}, {0x197, 0x268},
+ {0x198, 0x199}, {0x19C, 0x26F}, {0x19D, 0x272},
+ {0x19F, 0x275}, {0x1A0, 0x1A1}, {0x1A2, 0x1A3},
+ {0x1A4, 0x1A5}, {0x1A6, 0x280}, {0x1A7, 0x1A8},
+ {0x1A9, 0x283}, {0x1AC, 0x1AD}, {0x1AE, 0x288},
+ {0x1AF, 0x1B0}, {0x1B1, 0x28A}, {0x1B2, 0x28B},
+ {0x1B3, 0x1B4}, {0x1B5, 0x1B6}, {0x1B7, 0x292},
+ {0x1B8, 0x1B9}, {0x1BC, 0x1BD}, {0x1C4, 0x1C6},
+ {0x1C7, 0x1C9}, {0x1CA, 0x1CC}, {0x1CD, 0x1CE},
+ {0x1CF, 0x1D0}, {0x1D1, 0x1D2}, {0x1D3, 0x1D4},
+ {0x1D5, 0x1D6}, {0x1D7, 0x1D8}, {0x1D9, 0x1DA},
+ {0x1DB, 0x1DC}, {0x1DE, 0x1DF}, {0x1E0, 0x1E1},
+ {0x1E2, 0x1E3}, {0x1E4, 0x1E5}, {0x1E6, 0x1E7},
+ {0x1E8, 0x1E9}, {0x1EA, 0x1EB}, {0x1EC, 0x1ED},
+ {0x1EE, 0x1EF}, {0x1F1, 0x1F3}, {0x1F4, 0x1F5},
+ {0x1F6, 0x195}, {0x1F7, 0x1BF}, {0x1F8, 0x1F9},
+ {0x1FA, 0x1FB}, {0x1FC, 0x1FD}, {0x1FE, 0x1FF},
+ {0x200, 0x201}, {0x202, 0x203}, {0x204, 0x205},
+ {0x206, 0x207}, {0x208, 0x209}, {0x20A, 0x20B},
+ {0x20C, 0x20D}, {0x20E, 0x20F}, {0x210, 0x211},
+ {0x212, 0x213}, {0x214, 0x215}, {0x216, 0x217},
+ {0x218, 0x219}, {0x21A, 0x21B}, {0x21C, 0x21D},
+ {0x21E, 0x21F}, {0x220, 0x19E}, {0x222, 0x223},
+ {0x224, 0x225}, {0x226, 0x227}, {0x228, 0x229},
+ {0x22A, 0x22B}, {0x22C, 0x22D}, {0x22E, 0x22F},
+ {0x230, 0x231}, {0x232, 0x233}, {0x23A, 0x2C65},
+ {0x23B, 0x23C}, {0x23D, 0x19A}, {0x23E, 0x2C66},
+ {0x241, 0x242}, {0x243, 0x180}, {0x244, 0x289},
+ {0x245, 0x28C}, {0x246, 0x247}, {0x248, 0x249},
+ {0x24A, 0x24B}, {0x24C, 0x24D}, {0x24E, 0x24F},
+ {0x370, 0x371}, {0x372, 0x373}, {0x376, 0x377},
+ {0x37F, 0x3F3}, {0x386, 0x3AC}, {0x388, 0x3AD},
+ {0x389, 0x3AE}, {0x38A, 0x3AF}, {0x38C, 0x3CC},
+ {0x38E, 0x3CD}, {0x38F, 0x3CE}, {0x391, 0x3B1},
+ {0x392, 0x3B2}, {0x393, 0x3B3}, {0x394, 0x3B4},
+ {0x395, 0x3B5}, {0x396, 0x3B6}, {0x397, 0x3B7},
+ {0x398, 0x3B8}, {0x399, 0x3B9}, {0x39A, 0x3BA},
+ {0x39B, 0x3BB}, {0x39C, 0x3BC}, {0x39D, 0x3BD},
+ {0x39E, 0x3BE}, {0x39F, 0x3BF}, {0x3A0, 0x3C0},
+ {0x3A1, 0x3C1}, {0x3A3, 0x3C3}, {0x3A4, 0x3C4},
+ {0x3A5, 0x3C5}, {0x3A6, 0x3C6}, {0x3A7, 0x3C7},
+ {0x3A8, 0x3C8}, {0x3A9, 0x3C9}, {0x3AA, 0x3CA},
+ {0x3AB, 0x3CB}, {0x3CF, 0x3D7}, {0x3D8, 0x3D9},
+ {0x3DA, 0x3DB}, {0x3DC, 0x3DD}, {0x3DE, 0x3DF},
+ {0x3E0, 0x3E1}, {0x3E2, 0x3E3}, {0x3E4, 0x3E5},
+ {0x3E6, 0x3E7}, {0x3E8, 0x3E9}, {0x3EA, 0x3EB},
+ {0x3EC, 0x3ED}, {0x3EE, 0x3EF}, {0x3F4, 0x3B8},
+ {0x3F7, 0x3F8}, {0x3F9, 0x3F2}, {0x3FA, 0x3FB},
+ {0x3FD, 0x37B}, {0x3FE, 0x37C}, {0x3FF, 0x37D},
+ {0x400, 0x450}, {0x401, 0x451}, {0x402, 0x452},
+ {0x403, 0x453}, {0x404, 0x454}, {0x405, 0x455},
+ {0x406, 0x456}, {0x407, 0x457}, {0x408, 0x458},
+ {0x409, 0x459}, {0x40A, 0x45A}, {0x40B, 0x45B},
+ {0x40C, 0x45C}, {0x40D, 0x45D}, {0x40E, 0x45E},
+ {0x40F, 0x45F}, {0x410, 0x430}, {0x411, 0x431},
+ {0x412, 0x432}, {0x413, 0x433}, {0x414, 0x434},
+ {0x415, 0x435}, {0x416, 0x436}, {0x417, 0x437},
+ {0x418, 0x438}, {0x419, 0x439}, {0x41A, 0x43A},
+ {0x41B, 0x43B}, {0x41C, 0x43C}, {0x41D, 0x43D},
+ {0x41E, 0x43E}, {0x41F, 0x43F}, {0x420, 0x440},
+ {0x421, 0x441}, {0x422, 0x442}, {0x423, 0x443},
+ {0x424, 0x444}, {0x425, 0x445}, {0x426, 0x446},
+ {0x427, 0x447}, {0x428, 0x448}, {0x429, 0x449},
+ {0x42A, 0x44A}, {0x42B, 0x44B}, {0x42C, 0x44C},
+ {0x42D, 0x44D}, {0x42E, 0x44E}, {0x42F, 0x44F},
+ {0x460, 0x461}, {0x462, 0x463}, {0x464, 0x465},
+ {0x466, 0x467}, {0x468, 0x469}, {0x46A, 0x46B},
+ {0x46C, 0x46D}, {0x46E, 0x46F}, {0x470, 0x471},
+ {0x472, 0x473}, {0x474, 0x475}, {0x476, 0x477},
+ {0x478, 0x479}, {0x47A, 0x47B}, {0x47C, 0x47D},
+ {0x47E, 0x47F}, {0x480, 0x481}, {0x48A, 0x48B},
+ {0x48C, 0x48D}, {0x48E, 0x48F}, {0x490, 0x491},
+ {0x492, 0x493}, {0x494, 0x495}, {0x496, 0x497},
+ {0x498, 0x499}, {0x49A, 0x49B}, {0x49C, 0x49D},
+ {0x49E, 0x49F}, {0x4A0, 0x4A1}, {0x4A2, 0x4A3},
+ {0x4A4, 0x4A5}, {0x4A6, 0x4A7}, {0x4A8, 0x4A9},
+ {0x4AA, 0x4AB}, {0x4AC, 0x4AD}, {0x4AE, 0x4AF},
+ {0x4B0, 0x4B1}, {0x4B2, 0x4B3}, {0x4B4, 0x4B5},
+ {0x4B6, 0x4B7}, {0x4B8, 0x4B9}, {0x4BA, 0x4BB},
+ {0x4BC, 0x4BD}, {0x4BE, 0x4BF}, {0x4C0, 0x4CF},
+ {0x4C1, 0x4C2}, {0x4C3, 0x4C4}, {0x4C5, 0x4C6},
+ {0x4C7, 0x4C8}, {0x4C9, 0x4CA}, {0x4CB, 0x4CC},
+ {0x4CD, 0x4CE}, {0x4D0, 0x4D1}, {0x4D2, 0x4D3},
+ {0x4D4, 0x4D5}, {0x4D6, 0x4D7}, {0x4D8, 0x4D9},
+ {0x4DA, 0x4DB}, {0x4DC, 0x4DD}, {0x4DE, 0x4DF},
+ {0x4E0, 0x4E1}, {0x4E2, 0x4E3}, {0x4E4, 0x4E5},
+ {0x4E6, 0x4E7}, {0x4E8, 0x4E9}, {0x4EA, 0x4EB},
+ {0x4EC, 0x4ED}, {0x4EE, 0x4EF}, {0x4F0, 0x4F1},
+ {0x4F2, 0x4F3}, {0x4F4, 0x4F5}, {0x4F6, 0x4F7},
+ {0x4F8, 0x4F9}, {0x4FA, 0x4FB}, {0x4FC, 0x4FD},
+ {0x4FE, 0x4FF}, {0x500, 0x501}, {0x502, 0x503},
+ {0x504, 0x505}, {0x506, 0x507}, {0x508, 0x509},
+ {0x50A, 0x50B}, {0x50C, 0x50D}, {0x50E, 0x50F},
+ {0x510, 0x511}, {0x512, 0x513}, {0x514, 0x515},
+ {0x516, 0x517}, {0x518, 0x519}, {0x51A, 0x51B},
+ {0x51C, 0x51D}, {0x51E, 0x51F}, {0x520, 0x521},
+ {0x522, 0x523}, {0x524, 0x525}, {0x526, 0x527},
+ {0x528, 0x529}, {0x52A, 0x52B}, {0x52C, 0x52D},
+ {0x52E, 0x52F}, {0x531, 0x561}, {0x532, 0x562},
+ {0x533, 0x563}, {0x534, 0x564}, {0x535, 0x565},
+ {0x536, 0x566}, {0x537, 0x567}, {0x538, 0x568},
+ {0x539, 0x569}, {0x53A, 0x56A}, {0x53B, 0x56B},
+ {0x53C, 0x56C}, {0x53D, 0x56D}, {0x53E, 0x56E},
+ {0x53F, 0x56F}, {0x540, 0x570}, {0x541, 0x571},
+ {0x542, 0x572}, {0x543, 0x573}, {0x544, 0x574},
+ {0x545, 0x575}, {0x546, 0x576}, {0x547, 0x577},
+ {0x548, 0x578}, {0x549, 0x579}, {0x54A, 0x57A},
+ {0x54B, 0x57B}, {0x54C, 0x57C}, {0x54D, 0x57D},
+ {0x54E, 0x57E}, {0x54F, 0x57F}, {0x550, 0x580},
+ {0x551, 0x581}, {0x552, 0x582}, {0x553, 0x583},
+ {0x554, 0x584}, {0x555, 0x585}, {0x556, 0x586},
+ {0x10A0, 0x2D00}, {0x10A1, 0x2D01}, {0x10A2, 0x2D02},
+ {0x10A3, 0x2D03}, {0x10A4, 0x2D04}, {0x10A5, 0x2D05},
+ {0x10A6, 0x2D06}, {0x10A7, 0x2D07}, {0x10A8, 0x2D08},
+ {0x10A9, 0x2D09}, {0x10AA, 0x2D0A}, {0x10AB, 0x2D0B},
+ {0x10AC, 0x2D0C}, {0x10AD, 0x2D0D}, {0x10AE, 0x2D0E},
+ {0x10AF, 0x2D0F}, {0x10B0, 0x2D10}, {0x10B1, 0x2D11},
+ {0x10B2, 0x2D12}, {0x10B3, 0x2D13}, {0x10B4, 0x2D14},
+ {0x10B5, 0x2D15}, {0x10B6, 0x2D16}, {0x10B7, 0x2D17},
+ {0x10B8, 0x2D18}, {0x10B9, 0x2D19}, {0x10BA, 0x2D1A},
+ {0x10BB, 0x2D1B}, {0x10BC, 0x2D1C}, {0x10BD, 0x2D1D},
+ {0x10BE, 0x2D1E}, {0x10BF, 0x2D1F}, {0x10C0, 0x2D20},
+ {0x10C1, 0x2D21}, {0x10C2, 0x2D22}, {0x10C3, 0x2D23},
+ {0x10C4, 0x2D24}, {0x10C5, 0x2D25}, {0x10C7, 0x2D27},
+ {0x10CD, 0x2D2D}, {0x13A0, 0xAB70}, {0x13A1, 0xAB71},
+ {0x13A2, 0xAB72}, {0x13A3, 0xAB73}, {0x13A4, 0xAB74},
+ {0x13A5, 0xAB75}, {0x13A6, 0xAB76}, {0x13A7, 0xAB77},
+ {0x13A8, 0xAB78}, {0x13A9, 0xAB79}, {0x13AA, 0xAB7A},
+ {0x13AB, 0xAB7B}, {0x13AC, 0xAB7C}, {0x13AD, 0xAB7D},
+ {0x13AE, 0xAB7E}, {0x13AF, 0xAB7F}, {0x13B0, 0xAB80},
+ {0x13B1, 0xAB81}, {0x13B2, 0xAB82}, {0x13B3, 0xAB83},
+ {0x13B4, 0xAB84}, {0x13B5, 0xAB85}, {0x13B6, 0xAB86},
+ {0x13B7, 0xAB87}, {0x13B8, 0xAB88}, {0x13B9, 0xAB89},
+ {0x13BA, 0xAB8A}, {0x13BB, 0xAB8B}, {0x13BC, 0xAB8C},
+ {0x13BD, 0xAB8D}, {0x13BE, 0xAB8E}, {0x13BF, 0xAB8F},
+ {0x13C0, 0xAB90}, {0x13C1, 0xAB91}, {0x13C2, 0xAB92},
+ {0x13C3, 0xAB93}, {0x13C4, 0xAB94}, {0x13C5, 0xAB95},
+ {0x13C6, 0xAB96}, {0x13C7, 0xAB97}, {0x13C8, 0xAB98},
+ {0x13C9, 0xAB99}, {0x13CA, 0xAB9A}, {0x13CB, 0xAB9B},
+ {0x13CC, 0xAB9C}, {0x13CD, 0xAB9D}, {0x13CE, 0xAB9E},
+ {0x13CF, 0xAB9F}, {0x13D0, 0xABA0}, {0x13D1, 0xABA1},
+ {0x13D2, 0xABA2}, {0x13D3, 0xABA3}, {0x13D4, 0xABA4},
+ {0x13D5, 0xABA5}, {0x13D6, 0xABA6}, {0x13D7, 0xABA7},
+ {0x13D8, 0xABA8}, {0x13D9, 0xABA9}, {0x13DA, 0xABAA},
+ {0x13DB, 0xABAB}, {0x13DC, 0xABAC}, {0x13DD, 0xABAD},
+ {0x13DE, 0xABAE}, {0x13DF, 0xABAF}, {0x13E0, 0xABB0},
+ {0x13E1, 0xABB1}, {0x13E2, 0xABB2}, {0x13E3, 0xABB3},
+ {0x13E4, 0xABB4}, {0x13E5, 0xABB5}, {0x13E6, 0xABB6},
+ {0x13E7, 0xABB7}, {0x13E8, 0xABB8}, {0x13E9, 0xABB9},
+ {0x13EA, 0xABBA}, {0x13EB, 0xABBB}, {0x13EC, 0xABBC},
+ {0x13ED, 0xABBD}, {0x13EE, 0xABBE}, {0x13EF, 0xABBF},
+ {0x13F0, 0x13F8}, {0x13F1, 0x13F9}, {0x13F2, 0x13FA},
+ {0x13F3, 0x13FB}, {0x13F4, 0x13FC}, {0x13F5, 0x13FD},
+ {0x1C89, 0x1C8A}, {0x1C90, 0x10D0}, {0x1C91, 0x10D1},
+ {0x1C92, 0x10D2}, {0x1C93, 0x10D3}, {0x1C94, 0x10D4},
+ {0x1C95, 0x10D5}, {0x1C96, 0x10D6}, {0x1C97, 0x10D7},
+ {0x1C98, 0x10D8}, {0x1C99, 0x10D9}, {0x1C9A, 0x10DA},
+ {0x1C9B, 0x10DB}, {0x1C9C, 0x10DC}, {0x1C9D, 0x10DD},
+ {0x1C9E, 0x10DE}, {0x1C9F, 0x10DF}, {0x1CA0, 0x10E0},
+ {0x1CA1, 0x10E1}, {0x1CA2, 0x10E2}, {0x1CA3, 0x10E3},
+ {0x1CA4, 0x10E4}, {0x1CA5, 0x10E5}, {0x1CA6, 0x10E6},
+ {0x1CA7, 0x10E7}, {0x1CA8, 0x10E8}, {0x1CA9, 0x10E9},
+ {0x1CAA, 0x10EA}, {0x1CAB, 0x10EB}, {0x1CAC, 0x10EC},
+ {0x1CAD, 0x10ED}, {0x1CAE, 0x10EE}, {0x1CAF, 0x10EF},
+ {0x1CB0, 0x10F0}, {0x1CB1, 0x10F1}, {0x1CB2, 0x10F2},
+ {0x1CB3, 0x10F3}, {0x1CB4, 0x10F4}, {0x1CB5, 0x10F5},
+ {0x1CB6, 0x10F6}, {0x1CB7, 0x10F7}, {0x1CB8, 0x10F8},
+ {0x1CB9, 0x10F9}, {0x1CBA, 0x10FA}, {0x1CBD, 0x10FD},
+ {0x1CBE, 0x10FE}, {0x1CBF, 0x10FF}, {0x1E00, 0x1E01},
+ {0x1E02, 0x1E03}, {0x1E04, 0x1E05}, {0x1E06, 0x1E07},
+ {0x1E08, 0x1E09}, {0x1E0A, 0x1E0B}, {0x1E0C, 0x1E0D},
+ {0x1E0E, 0x1E0F}, {0x1E10, 0x1E11}, {0x1E12, 0x1E13},
+ {0x1E14, 0x1E15}, {0x1E16, 0x1E17}, {0x1E18, 0x1E19},
+ {0x1E1A, 0x1E1B}, {0x1E1C, 0x1E1D}, {0x1E1E, 0x1E1F},
+ {0x1E20, 0x1E21}, {0x1E22, 0x1E23}, {0x1E24, 0x1E25},
+ {0x1E26, 0x1E27}, {0x1E28, 0x1E29}, {0x1E2A, 0x1E2B},
+ {0x1E2C, 0x1E2D}, {0x1E2E, 0x1E2F}, {0x1E30, 0x1E31},
+ {0x1E32, 0x1E33}, {0x1E34, 0x1E35}, {0x1E36, 0x1E37},
+ {0x1E38, 0x1E39}, {0x1E3A, 0x1E3B}, {0x1E3C, 0x1E3D},
+ {0x1E3E, 0x1E3F}, {0x1E40, 0x1E41}, {0x1E42, 0x1E43},
+ {0x1E44, 0x1E45}, {0x1E46, 0x1E47}, {0x1E48, 0x1E49},
+ {0x1E4A, 0x1E4B}, {0x1E4C, 0x1E4D}, {0x1E4E, 0x1E4F},
+ {0x1E50, 0x1E51}, {0x1E52, 0x1E53}, {0x1E54, 0x1E55},
+ {0x1E56, 0x1E57}, {0x1E58, 0x1E59}, {0x1E5A, 0x1E5B},
+ {0x1E5C, 0x1E5D}, {0x1E5E, 0x1E5F}, {0x1E60, 0x1E61},
+ {0x1E62, 0x1E63}, {0x1E64, 0x1E65}, {0x1E66, 0x1E67},
+ {0x1E68, 0x1E69}, {0x1E6A, 0x1E6B}, {0x1E6C, 0x1E6D},
+ {0x1E6E, 0x1E6F}, {0x1E70, 0x1E71}, {0x1E72, 0x1E73},
+ {0x1E74, 0x1E75}, {0x1E76, 0x1E77}, {0x1E78, 0x1E79},
+ {0x1E7A, 0x1E7B}, {0x1E7C, 0x1E7D}, {0x1E7E, 0x1E7F},
+ {0x1E80, 0x1E81}, {0x1E82, 0x1E83}, {0x1E84, 0x1E85},
+ {0x1E86, 0x1E87}, {0x1E88, 0x1E89}, {0x1E8A, 0x1E8B},
+ {0x1E8C, 0x1E8D}, {0x1E8E, 0x1E8F}, {0x1E90, 0x1E91},
+ {0x1E92, 0x1E93}, {0x1E94, 0x1E95}, {0x1E9E, 0xDF},
+ {0x1EA0, 0x1EA1}, {0x1EA2, 0x1EA3}, {0x1EA4, 0x1EA5},
+ {0x1EA6, 0x1EA7}, {0x1EA8, 0x1EA9}, {0x1EAA, 0x1EAB},
+ {0x1EAC, 0x1EAD}, {0x1EAE, 0x1EAF}, {0x1EB0, 0x1EB1},
+ {0x1EB2, 0x1EB3}, {0x1EB4, 0x1EB5}, {0x1EB6, 0x1EB7},
+ {0x1EB8, 0x1EB9}, {0x1EBA, 0x1EBB}, {0x1EBC, 0x1EBD},
+ {0x1EBE, 0x1EBF}, {0x1EC0, 0x1EC1}, {0x1EC2, 0x1EC3},
+ {0x1EC4, 0x1EC5}, {0x1EC6, 0x1EC7}, {0x1EC8, 0x1EC9},
+ {0x1ECA, 0x1ECB}, {0x1ECC, 0x1ECD}, {0x1ECE, 0x1ECF},
+ {0x1ED0, 0x1ED1}, {0x1ED2, 0x1ED3}, {0x1ED4, 0x1ED5},
+ {0x1ED6, 0x1ED7}, {0x1ED8, 0x1ED9}, {0x1EDA, 0x1EDB},
+ {0x1EDC, 0x1EDD}, {0x1EDE, 0x1EDF}, {0x1EE0, 0x1EE1},
+ {0x1EE2, 0x1EE3}, {0x1EE4, 0x1EE5}, {0x1EE6, 0x1EE7},
+ {0x1EE8, 0x1EE9}, {0x1EEA, 0x1EEB}, {0x1EEC, 0x1EED},
+ {0x1EEE, 0x1EEF}, {0x1EF0, 0x1EF1}, {0x1EF2, 0x1EF3},
+ {0x1EF4, 0x1EF5}, {0x1EF6, 0x1EF7}, {0x1EF8, 0x1EF9},
+ {0x1EFA, 0x1EFB}, {0x1EFC, 0x1EFD}, {0x1EFE, 0x1EFF},
+ {0x1F08, 0x1F00}, {0x1F09, 0x1F01}, {0x1F0A, 0x1F02},
+ {0x1F0B, 0x1F03}, {0x1F0C, 0x1F04}, {0x1F0D, 0x1F05},
+ {0x1F0E, 0x1F06}, {0x1F0F, 0x1F07}, {0x1F18, 0x1F10},
+ {0x1F19, 0x1F11}, {0x1F1A, 0x1F12}, {0x1F1B, 0x1F13},
+ {0x1F1C, 0x1F14}, {0x1F1D, 0x1F15}, {0x1F28, 0x1F20},
+ {0x1F29, 0x1F21}, {0x1F2A, 0x1F22}, {0x1F2B, 0x1F23},
+ {0x1F2C, 0x1F24}, {0x1F2D, 0x1F25}, {0x1F2E, 0x1F26},
+ {0x1F2F, 0x1F27}, {0x1F38, 0x1F30}, {0x1F39, 0x1F31},
+ {0x1F3A, 0x1F32}, {0x1F3B, 0x1F33}, {0x1F3C, 0x1F34},
+ {0x1F3D, 0x1F35}, {0x1F3E, 0x1F36}, {0x1F3F, 0x1F37},
+ {0x1F48, 0x1F40}, {0x1F49, 0x1F41}, {0x1F4A, 0x1F42},
+ {0x1F4B, 0x1F43}, {0x1F4C, 0x1F44}, {0x1F4D, 0x1F45},
+ {0x1F59, 0x1F51}, {0x1F5B, 0x1F53}, {0x1F5D, 0x1F55},
+ {0x1F5F, 0x1F57}, {0x1F68, 0x1F60}, {0x1F69, 0x1F61},
+ {0x1F6A, 0x1F62}, {0x1F6B, 0x1F63}, {0x1F6C, 0x1F64},
+ {0x1F6D, 0x1F65}, {0x1F6E, 0x1F66}, {0x1F6F, 0x1F67},
+ {0x1FB8, 0x1FB0}, {0x1FB9, 0x1FB1}, {0x1FBA, 0x1F70},
+ {0x1FBB, 0x1F71}, {0x1FC8, 0x1F72}, {0x1FC9, 0x1F73},
+ {0x1FCA, 0x1F74}, {0x1FCB, 0x1F75}, {0x1FD8, 0x1FD0},
+ {0x1FD9, 0x1FD1}, {0x1FDA, 0x1F76}, {0x1FDB, 0x1F77},
+ {0x1FE8, 0x1FE0}, {0x1FE9, 0x1FE1}, {0x1FEA, 0x1F7A},
+ {0x1FEB, 0x1F7B}, {0x1FEC, 0x1FE5}, {0x1FF8, 0x1F78},
+ {0x1FF9, 0x1F79}, {0x1FFA, 0x1F7C}, {0x1FFB, 0x1F7D},
+ {0x2126, 0x3C9}, {0x212A, 0x6B}, {0x212B, 0xE5},
+ {0x2132, 0x214E}, {0x2183, 0x2184}, {0x2C00, 0x2C30},
+ {0x2C01, 0x2C31}, {0x2C02, 0x2C32}, {0x2C03, 0x2C33},
+ {0x2C04, 0x2C34}, {0x2C05, 0x2C35}, {0x2C06, 0x2C36},
+ {0x2C07, 0x2C37}, {0x2C08, 0x2C38}, {0x2C09, 0x2C39},
+ {0x2C0A, 0x2C3A}, {0x2C0B, 0x2C3B}, {0x2C0C, 0x2C3C},
+ {0x2C0D, 0x2C3D}, {0x2C0E, 0x2C3E}, {0x2C0F, 0x2C3F},
+ {0x2C10, 0x2C40}, {0x2C11, 0x2C41}, {0x2C12, 0x2C42},
+ {0x2C13, 0x2C43}, {0x2C14, 0x2C44}, {0x2C15, 0x2C45},
+ {0x2C16, 0x2C46}, {0x2C17, 0x2C47}, {0x2C18, 0x2C48},
+ {0x2C19, 0x2C49}, {0x2C1A, 0x2C4A}, {0x2C1B, 0x2C4B},
+ {0x2C1C, 0x2C4C}, {0x2C1D, 0x2C4D}, {0x2C1E, 0x2C4E},
+ {0x2C1F, 0x2C4F}, {0x2C20, 0x2C50}, {0x2C21, 0x2C51},
+ {0x2C22, 0x2C52}, {0x2C23, 0x2C53}, {0x2C24, 0x2C54},
+ {0x2C25, 0x2C55}, {0x2C26, 0x2C56}, {0x2C27, 0x2C57},
+ {0x2C28, 0x2C58}, {0x2C29, 0x2C59}, {0x2C2A, 0x2C5A},
+ {0x2C2B, 0x2C5B}, {0x2C2C, 0x2C5C}, {0x2C2D, 0x2C5D},
+ {0x2C2E, 0x2C5E}, {0x2C2F, 0x2C5F}, {0x2C60, 0x2C61},
+ {0x2C62, 0x26B}, {0x2C63, 0x1D7D}, {0x2C64, 0x27D},
+ {0x2C67, 0x2C68}, {0x2C69, 0x2C6A}, {0x2C6B, 0x2C6C},
+ {0x2C6D, 0x251}, {0x2C6E, 0x271}, {0x2C6F, 0x250},
+ {0x2C70, 0x252}, {0x2C72, 0x2C73}, {0x2C75, 0x2C76},
+ {0x2C7E, 0x23F}, {0x2C7F, 0x240}, {0x2C80, 0x2C81},
+ {0x2C82, 0x2C83}, {0x2C84, 0x2C85}, {0x2C86, 0x2C87},
+ {0x2C88, 0x2C89}, {0x2C8A, 0x2C8B}, {0x2C8C, 0x2C8D},
+ {0x2C8E, 0x2C8F}, {0x2C90, 0x2C91}, {0x2C92, 0x2C93},
+ {0x2C94, 0x2C95}, {0x2C96, 0x2C97}, {0x2C98, 0x2C99},
+ {0x2C9A, 0x2C9B}, {0x2C9C, 0x2C9D}, {0x2C9E, 0x2C9F},
+ {0x2CA0, 0x2CA1}, {0x2CA2, 0x2CA3}, {0x2CA4, 0x2CA5},
+ {0x2CA6, 0x2CA7}, {0x2CA8, 0x2CA9}, {0x2CAA, 0x2CAB},
+ {0x2CAC, 0x2CAD}, {0x2CAE, 0x2CAF}, {0x2CB0, 0x2CB1},
+ {0x2CB2, 0x2CB3}, {0x2CB4, 0x2CB5}, {0x2CB6, 0x2CB7},
+ {0x2CB8, 0x2CB9}, {0x2CBA, 0x2CBB}, {0x2CBC, 0x2CBD},
+ {0x2CBE, 0x2CBF}, {0x2CC0, 0x2CC1}, {0x2CC2, 0x2CC3},
+ {0x2CC4, 0x2CC5}, {0x2CC6, 0x2CC7}, {0x2CC8, 0x2CC9},
+ {0x2CCA, 0x2CCB}, {0x2CCC, 0x2CCD}, {0x2CCE, 0x2CCF},
+ {0x2CD0, 0x2CD1}, {0x2CD2, 0x2CD3}, {0x2CD4, 0x2CD5},
+ {0x2CD6, 0x2CD7}, {0x2CD8, 0x2CD9}, {0x2CDA, 0x2CDB},
+ {0x2CDC, 0x2CDD}, {0x2CDE, 0x2CDF}, {0x2CE0, 0x2CE1},
+ {0x2CE2, 0x2CE3}, {0x2CEB, 0x2CEC}, {0x2CED, 0x2CEE},
+ {0x2CF2, 0x2CF3}, {0xA640, 0xA641}, {0xA642, 0xA643},
+ {0xA644, 0xA645}, {0xA646, 0xA647}, {0xA648, 0xA649},
+ {0xA64A, 0xA64B}, {0xA64C, 0xA64D}, {0xA64E, 0xA64F},
+ {0xA650, 0xA651}, {0xA652, 0xA653}, {0xA654, 0xA655},
+ {0xA656, 0xA657}, {0xA658, 0xA659}, {0xA65A, 0xA65B},
+ {0xA65C, 0xA65D}, {0xA65E, 0xA65F}, {0xA660, 0xA661},
+ {0xA662, 0xA663}, {0xA664, 0xA665}, {0xA666, 0xA667},
+ {0xA668, 0xA669}, {0xA66A, 0xA66B}, {0xA66C, 0xA66D},
+ {0xA680, 0xA681}, {0xA682, 0xA683}, {0xA684, 0xA685},
+ {0xA686, 0xA687}, {0xA688, 0xA689}, {0xA68A, 0xA68B},
+ {0xA68C, 0xA68D}, {0xA68E, 0xA68F}, {0xA690, 0xA691},
+ {0xA692, 0xA693}, {0xA694, 0xA695}, {0xA696, 0xA697},
+ {0xA698, 0xA699}, {0xA69A, 0xA69B}, {0xA722, 0xA723},
+ {0xA724, 0xA725}, {0xA726, 0xA727}, {0xA728, 0xA729},
+ {0xA72A, 0xA72B}, {0xA72C, 0xA72D}, {0xA72E, 0xA72F},
+ {0xA732, 0xA733}, {0xA734, 0xA735}, {0xA736, 0xA737},
+ {0xA738, 0xA739}, {0xA73A, 0xA73B}, {0xA73C, 0xA73D},
+ {0xA73E, 0xA73F}, {0xA740, 0xA741}, {0xA742, 0xA743},
+ {0xA744, 0xA745}, {0xA746, 0xA747}, {0xA748, 0xA749},
+ {0xA74A, 0xA74B}, {0xA74C, 0xA74D}, {0xA74E, 0xA74F},
+ {0xA750, 0xA751}, {0xA752, 0xA753}, {0xA754, 0xA755},
+ {0xA756, 0xA757}, {0xA758, 0xA759}, {0xA75A, 0xA75B},
+ {0xA75C, 0xA75D}, {0xA75E, 0xA75F}, {0xA760, 0xA761},
+ {0xA762, 0xA763}, {0xA764, 0xA765}, {0xA766, 0xA767},
+ {0xA768, 0xA769}, {0xA76A, 0xA76B}, {0xA76C, 0xA76D},
+ {0xA76E, 0xA76F}, {0xA779, 0xA77A}, {0xA77B, 0xA77C},
+ {0xA77D, 0x1D79}, {0xA77E, 0xA77F}, {0xA780, 0xA781},
+ {0xA782, 0xA783}, {0xA784, 0xA785}, {0xA786, 0xA787},
+ {0xA78B, 0xA78C}, {0xA78D, 0x265}, {0xA790, 0xA791},
+ {0xA792, 0xA793}, {0xA796, 0xA797}, {0xA798, 0xA799},
+ {0xA79A, 0xA79B}, {0xA79C, 0xA79D}, {0xA79E, 0xA79F},
+ {0xA7A0, 0xA7A1}, {0xA7A2, 0xA7A3}, {0xA7A4, 0xA7A5},
+ {0xA7A6, 0xA7A7}, {0xA7A8, 0xA7A9}, {0xA7AA, 0x266},
+ {0xA7AB, 0x25C}, {0xA7AC, 0x261}, {0xA7AD, 0x26C},
+ {0xA7AE, 0x26A}, {0xA7B0, 0x29E}, {0xA7B1, 0x287},
+ {0xA7B2, 0x29D}, {0xA7B3, 0xAB53}, {0xA7B4, 0xA7B5},
+ {0xA7B6, 0xA7B7}, {0xA7B8, 0xA7B9}, {0xA7BA, 0xA7BB},
+ {0xA7BC, 0xA7BD}, {0xA7BE, 0xA7BF}, {0xA7C0, 0xA7C1},
+ {0xA7C2, 0xA7C3}, {0xA7C4, 0xA794}, {0xA7C5, 0x282},
+ {0xA7C6, 0x1D8E}, {0xA7C7, 0xA7C8}, {0xA7C9, 0xA7CA},
+ {0xA7CB, 0x264}, {0xA7CC, 0xA7CD}, {0xA7CE, 0xA7CF},
+ {0xA7D0, 0xA7D1}, {0xA7D2, 0xA7D3}, {0xA7D4, 0xA7D5},
+ {0xA7D6, 0xA7D7}, {0xA7D8, 0xA7D9}, {0xA7DA, 0xA7DB},
+ {0xA7DC, 0x19B}, {0xA7F5, 0xA7F6}, {0xFF21, 0xFF41},
+ {0xFF22, 0xFF42}, {0xFF23, 0xFF43}, {0xFF24, 0xFF44},
+ {0xFF25, 0xFF45}, {0xFF26, 0xFF46}, {0xFF27, 0xFF47},
+ {0xFF28, 0xFF48}, {0xFF29, 0xFF49}, {0xFF2A, 0xFF4A},
+ {0xFF2B, 0xFF4B}, {0xFF2C, 0xFF4C}, {0xFF2D, 0xFF4D},
+ {0xFF2E, 0xFF4E}, {0xFF2F, 0xFF4F}, {0xFF30, 0xFF50},
+ {0xFF31, 0xFF51}, {0xFF32, 0xFF52}, {0xFF33, 0xFF53},
+ {0xFF34, 0xFF54}, {0xFF35, 0xFF55}, {0xFF36, 0xFF56},
+ {0xFF37, 0xFF57}, {0xFF38, 0xFF58}, {0xFF39, 0xFF59},
+ {0xFF3A, 0xFF5A}, {0x10400, 0x10428}, {0x10401, 0x10429},
+ {0x10402, 0x1042A}, {0x10403, 0x1042B}, {0x10404, 0x1042C},
+ {0x10405, 0x1042D}, {0x10406, 0x1042E}, {0x10407, 0x1042F},
+ {0x10408, 0x10430}, {0x10409, 0x10431}, {0x1040A, 0x10432},
+ {0x1040B, 0x10433}, {0x1040C, 0x10434}, {0x1040D, 0x10435},
+ {0x1040E, 0x10436}, {0x1040F, 0x10437}, {0x10410, 0x10438},
+ {0x10411, 0x10439}, {0x10412, 0x1043A}, {0x10413, 0x1043B},
+ {0x10414, 0x1043C}, {0x10415, 0x1043D}, {0x10416, 0x1043E},
+ {0x10417, 0x1043F}, {0x10418, 0x10440}, {0x10419, 0x10441},
+ {0x1041A, 0x10442}, {0x1041B, 0x10443}, {0x1041C, 0x10444},
+ {0x1041D, 0x10445}, {0x1041E, 0x10446}, {0x1041F, 0x10447},
+ {0x10420, 0x10448}, {0x10421, 0x10449}, {0x10422, 0x1044A},
+ {0x10423, 0x1044B}, {0x10424, 0x1044C}, {0x10425, 0x1044D},
+ {0x10426, 0x1044E}, {0x10427, 0x1044F}, {0x104B0, 0x104D8},
+ {0x104B1, 0x104D9}, {0x104B2, 0x104DA}, {0x104B3, 0x104DB},
+ {0x104B4, 0x104DC}, {0x104B5, 0x104DD}, {0x104B6, 0x104DE},
+ {0x104B7, 0x104DF}, {0x104B8, 0x104E0}, {0x104B9, 0x104E1},
+ {0x104BA, 0x104E2}, {0x104BB, 0x104E3}, {0x104BC, 0x104E4},
+ {0x104BD, 0x104E5}, {0x104BE, 0x104E6}, {0x104BF, 0x104E7},
+ {0x104C0, 0x104E8}, {0x104C1, 0x104E9}, {0x104C2, 0x104EA},
+ {0x104C3, 0x104EB}, {0x104C4, 0x104EC}, {0x104C5, 0x104ED},
+ {0x104C6, 0x104EE}, {0x104C7, 0x104EF}, {0x104C8, 0x104F0},
+ {0x104C9, 0x104F1}, {0x104CA, 0x104F2}, {0x104CB, 0x104F3},
+ {0x104CC, 0x104F4}, {0x104CD, 0x104F5}, {0x104CE, 0x104F6},
+ {0x104CF, 0x104F7}, {0x104D0, 0x104F8}, {0x104D1, 0x104F9},
+ {0x104D2, 0x104FA}, {0x104D3, 0x104FB}, {0x10570, 0x10597},
+ {0x10571, 0x10598}, {0x10572, 0x10599}, {0x10573, 0x1059A},
+ {0x10574, 0x1059B}, {0x10575, 0x1059C}, {0x10576, 0x1059D},
+ {0x10577, 0x1059E}, {0x10578, 0x1059F}, {0x10579, 0x105A0},
+ {0x1057A, 0x105A1}, {0x1057C, 0x105A3}, {0x1057D, 0x105A4},
+ {0x1057E, 0x105A5}, {0x1057F, 0x105A6}, {0x10580, 0x105A7},
+ {0x10581, 0x105A8}, {0x10582, 0x105A9}, {0x10583, 0x105AA},
+ {0x10584, 0x105AB}, {0x10585, 0x105AC}, {0x10586, 0x105AD},
+ {0x10587, 0x105AE}, {0x10588, 0x105AF}, {0x10589, 0x105B0},
+ {0x1058A, 0x105B1}, {0x1058C, 0x105B3}, {0x1058D, 0x105B4},
+ {0x1058E, 0x105B5}, {0x1058F, 0x105B6}, {0x10590, 0x105B7},
+ {0x10591, 0x105B8}, {0x10592, 0x105B9}, {0x10594, 0x105BB},
+ {0x10595, 0x105BC}, {0x10C80, 0x10CC0}, {0x10C81, 0x10CC1},
+ {0x10C82, 0x10CC2}, {0x10C83, 0x10CC3}, {0x10C84, 0x10CC4},
+ {0x10C85, 0x10CC5}, {0x10C86, 0x10CC6}, {0x10C87, 0x10CC7},
+ {0x10C88, 0x10CC8}, {0x10C89, 0x10CC9}, {0x10C8A, 0x10CCA},
+ {0x10C8B, 0x10CCB}, {0x10C8C, 0x10CCC}, {0x10C8D, 0x10CCD},
+ {0x10C8E, 0x10CCE}, {0x10C8F, 0x10CCF}, {0x10C90, 0x10CD0},
+ {0x10C91, 0x10CD1}, {0x10C92, 0x10CD2}, {0x10C93, 0x10CD3},
+ {0x10C94, 0x10CD4}, {0x10C95, 0x10CD5}, {0x10C96, 0x10CD6},
+ {0x10C97, 0x10CD7}, {0x10C98, 0x10CD8}, {0x10C99, 0x10CD9},
+ {0x10C9A, 0x10CDA}, {0x10C9B, 0x10CDB}, {0x10C9C, 0x10CDC},
+ {0x10C9D, 0x10CDD}, {0x10C9E, 0x10CDE}, {0x10C9F, 0x10CDF},
+ {0x10CA0, 0x10CE0}, {0x10CA1, 0x10CE1}, {0x10CA2, 0x10CE2},
+ {0x10CA3, 0x10CE3}, {0x10CA4, 0x10CE4}, {0x10CA5, 0x10CE5},
+ {0x10CA6, 0x10CE6}, {0x10CA7, 0x10CE7}, {0x10CA8, 0x10CE8},
+ {0x10CA9, 0x10CE9}, {0x10CAA, 0x10CEA}, {0x10CAB, 0x10CEB},
+ {0x10CAC, 0x10CEC}, {0x10CAD, 0x10CED}, {0x10CAE, 0x10CEE},
+ {0x10CAF, 0x10CEF}, {0x10CB0, 0x10CF0}, {0x10CB1, 0x10CF1},
+ {0x10CB2, 0x10CF2}, {0x10D50, 0x10D70}, {0x10D51, 0x10D71},
+ {0x10D52, 0x10D72}, {0x10D53, 0x10D73}, {0x10D54, 0x10D74},
+ {0x10D55, 0x10D75}, {0x10D56, 0x10D76}, {0x10D57, 0x10D77},
+ {0x10D58, 0x10D78}, {0x10D59, 0x10D79}, {0x10D5A, 0x10D7A},
+ {0x10D5B, 0x10D7B}, {0x10D5C, 0x10D7C}, {0x10D5D, 0x10D7D},
+ {0x10D5E, 0x10D7E}, {0x10D5F, 0x10D7F}, {0x10D60, 0x10D80},
+ {0x10D61, 0x10D81}, {0x10D62, 0x10D82}, {0x10D63, 0x10D83},
+ {0x10D64, 0x10D84}, {0x10D65, 0x10D85}, {0x118A0, 0x118C0},
+ {0x118A1, 0x118C1}, {0x118A2, 0x118C2}, {0x118A3, 0x118C3},
+ {0x118A4, 0x118C4}, {0x118A5, 0x118C5}, {0x118A6, 0x118C6},
+ {0x118A7, 0x118C7}, {0x118A8, 0x118C8}, {0x118A9, 0x118C9},
+ {0x118AA, 0x118CA}, {0x118AB, 0x118CB}, {0x118AC, 0x118CC},
+ {0x118AD, 0x118CD}, {0x118AE, 0x118CE}, {0x118AF, 0x118CF},
+ {0x118B0, 0x118D0}, {0x118B1, 0x118D1}, {0x118B2, 0x118D2},
+ {0x118B3, 0x118D3}, {0x118B4, 0x118D4}, {0x118B5, 0x118D5},
+ {0x118B6, 0x118D6}, {0x118B7, 0x118D7}, {0x118B8, 0x118D8},
+ {0x118B9, 0x118D9}, {0x118BA, 0x118DA}, {0x118BB, 0x118DB},
+ {0x118BC, 0x118DC}, {0x118BD, 0x118DD}, {0x118BE, 0x118DE},
+ {0x118BF, 0x118DF}, {0x16E40, 0x16E60}, {0x16E41, 0x16E61},
+ {0x16E42, 0x16E62}, {0x16E43, 0x16E63}, {0x16E44, 0x16E64},
+ {0x16E45, 0x16E65}, {0x16E46, 0x16E66}, {0x16E47, 0x16E67},
+ {0x16E48, 0x16E68}, {0x16E49, 0x16E69}, {0x16E4A, 0x16E6A},
+ {0x16E4B, 0x16E6B}, {0x16E4C, 0x16E6C}, {0x16E4D, 0x16E6D},
+ {0x16E4E, 0x16E6E}, {0x16E4F, 0x16E6F}, {0x16E50, 0x16E70},
+ {0x16E51, 0x16E71}, {0x16E52, 0x16E72}, {0x16E53, 0x16E73},
+ {0x16E54, 0x16E74}, {0x16E55, 0x16E75}, {0x16E56, 0x16E76},
+ {0x16E57, 0x16E77}, {0x16E58, 0x16E78}, {0x16E59, 0x16E79},
+ {0x16E5A, 0x16E7A}, {0x16E5B, 0x16E7B}, {0x16E5C, 0x16E7C},
+ {0x16E5D, 0x16E7D}, {0x16E5E, 0x16E7E}, {0x16E5F, 0x16E7F},
+ {0x16EA0, 0x16EBB}, {0x16EA1, 0x16EBC}, {0x16EA2, 0x16EBD},
+ {0x16EA3, 0x16EBE}, {0x16EA4, 0x16EBF}, {0x16EA5, 0x16EC0},
+ {0x16EA6, 0x16EC1}, {0x16EA7, 0x16EC2}, {0x16EA8, 0x16EC3},
+ {0x16EA9, 0x16EC4}, {0x16EAA, 0x16EC5}, {0x16EAB, 0x16EC6},
+ {0x16EAC, 0x16EC7}, {0x16EAD, 0x16EC8}, {0x16EAE, 0x16EC9},
+ {0x16EAF, 0x16ECA}, {0x16EB0, 0x16ECB}, {0x16EB1, 0x16ECC},
+ {0x16EB2, 0x16ECD}, {0x16EB3, 0x16ECE}, {0x16EB4, 0x16ECF},
+ {0x16EB5, 0x16ED0}, {0x16EB6, 0x16ED1}, {0x16EB7, 0x16ED2},
+ {0x16EB8, 0x16ED3}, {0x1E900, 0x1E922}, {0x1E901, 0x1E923},
+ {0x1E902, 0x1E924}, {0x1E903, 0x1E925}, {0x1E904, 0x1E926},
+ {0x1E905, 0x1E927}, {0x1E906, 0x1E928}, {0x1E907, 0x1E929},
+ {0x1E908, 0x1E92A}, {0x1E909, 0x1E92B}, {0x1E90A, 0x1E92C},
+ {0x1E90B, 0x1E92D}, {0x1E90C, 0x1E92E}, {0x1E90D, 0x1E92F},
+ {0x1E90E, 0x1E930}, {0x1E90F, 0x1E931}, {0x1E910, 0x1E932},
+ {0x1E911, 0x1E933}, {0x1E912, 0x1E934}, {0x1E913, 0x1E935},
+ {0x1E914, 0x1E936}, {0x1E915, 0x1E937}, {0x1E916, 0x1E938},
+ {0x1E917, 0x1E939}, {0x1E918, 0x1E93A}, {0x1E919, 0x1E93B},
+ {0x1E91A, 0x1E93C}, {0x1E91B, 0x1E93D}, {0x1E91C, 0x1E93E},
+ {0x1E91D, 0x1E93F}, {0x1E91E, 0x1E940}, {0x1E91F, 0x1E941},
+ {0x1E920, 0x1E942}, {0x1E921, 0x1E943}}};
+
+LIBC_INLINE_VAR constexpr auto UPPER_TO_LOWER_HASHER =
+ ptrhash::init_hasher<1415>(
+ 0x1A275D28E2768536,
+ cpp::array<uint8_t, 475>{
+ 0x18, 0x4, 0x40, 0x24, 0x8, 0x2, 0x0, 0x0, 0x1, 0xA, 0x19,
+ 0x1E, 0xB, 0x0, 0xE, 0x0, 0x0, 0x6, 0x0, 0x11, 0xC, 0x2,
+ 0xA, 0x4, 0x22, 0x1, 0x5, 0xE, 0x0, 0x0, 0x8, 0x39, 0xC,
+ 0x3, 0x46, 0x0, 0x0, 0x1, 0x37, 0x3, 0x1, 0x9, 0xF, 0x7,
+ 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x60, 0x53, 0x2, 0x0, 0x34,
+ 0x3, 0x17, 0x22, 0x16, 0x2, 0x15, 0x5, 0x1D, 0x2, 0x6, 0xD,
+ 0x1, 0x1, 0x0, 0x13, 0x0, 0x1, 0x0, 0xB, 0x42, 0x1D, 0xC,
+ 0x0, 0xB, 0x2B, 0x1, 0x2, 0xA, 0x1C, 0x0, 0x0, 0x15, 0x3F,
+ 0x5, 0x6F, 0x0, 0x7, 0x8, 0x2, 0x1, 0x2, 0x0, 0xF, 0x0,
+ 0x3, 0x8, 0x27, 0x5, 0x7, 0x5, 0x2F, 0x0, 0x5, 0x0, 0x18,
+ 0xF, 0x1F, 0x4, 0x0, 0x2F, 0x21, 0x17, 0x9D, 0x0, 0x27, 0x9,
+ 0x33, 0x3D, 0x1, 0x0, 0x1D, 0x1A, 0x7, 0x2, 0x1, 0x5, 0x17,
+ 0x0, 0x4, 0x6, 0x36, 0x1, 0x6, 0xD, 0x25, 0x2, 0x4B, 0x15,
+ 0x5, 0x7, 0x0, 0xA, 0x1F, 0x5, 0xCF, 0x7, 0x3D, 0x0, 0x9,
+ 0x69, 0xB, 0x5, 0x14, 0x7, 0x40, 0x0, 0xE, 0xF, 0x12, 0x3,
+ 0x1, 0x3, 0x2, 0x1, 0x1, 0xE, 0x7, 0x16, 0x9, 0x6, 0xD,
+ 0x12, 0xC, 0x0, 0x1, 0x2, 0x33, 0x4, 0xC2, 0x6, 0x0, 0x0,
+ 0xCF, 0x0, 0x6, 0x19, 0x1, 0xC, 0x52, 0x42, 0x0, 0x0, 0xE,
+ 0x26, 0x9, 0x17, 0x0, 0x6, 0x0, 0x1, 0x0, 0x12, 0x10, 0x1A,
+ 0x1B, 0x7, 0x1B, 0x9, 0xC, 0x2, 0x58, 0x8A, 0xD, 0x0, 0x49,
+ 0x52, 0x0, 0x24, 0x7, 0x0, 0xFB, 0x12, 0x13, 0x2, 0x0, 0x0,
+ 0x3, 0x18, 0x3, 0x34, 0x3C, 0x10, 0x7, 0x4, 0x47, 0x1, 0x11,
+ 0x4F, 0x0, 0x12, 0x3, 0x6, 0x0, 0x8, 0x43, 0x6, 0x0, 0x2,
+ 0x2, 0x4, 0x11, 0x5C, 0x72, 0x0, 0x21, 0x13, 0x18, 0x0, 0x11,
+ 0x0, 0x0, 0x1, 0xB, 0xAE, 0x14, 0x12, 0x0, 0x4D, 0x4, 0xC,
+ 0x26, 0x52, 0x5, 0x0, 0x0, 0x12, 0x39, 0x26, 0x17, 0x13, 0x2A,
+ 0x8, 0x17, 0x1C, 0x0, 0x85, 0x3A, 0x0, 0x5D, 0x22, 0x66, 0x0,
+ 0x2, 0x1, 0x47, 0xBF, 0xA3, 0x2, 0xA, 0x46, 0x0, 0x1B, 0x5,
+ 0x1A, 0x3, 0x1, 0x2D, 0x0, 0x29, 0x5, 0x0, 0x2, 0x27, 0x7,
+ 0x0, 0x1D, 0x5, 0x7, 0x1A, 0x1, 0x2, 0x0, 0x3B, 0x0, 0xD,
+ 0x5F, 0x31, 0x9B, 0x19, 0x82, 0x8, 0xD, 0x36, 0x0, 0x1C, 0x38,
+ 0xDB, 0xB, 0x0, 0xB5, 0xC, 0xA, 0x2F, 0x16, 0x4B, 0x16, 0x16,
+ 0x26, 0x4, 0x1, 0x13, 0x3, 0x0, 0x12, 0x1A, 0x3, 0xE8, 0x22,
+ 0x1, 0x6B, 0x38, 0x2, 0x16, 0xC, 0x1A, 0xAB, 0x27, 0xC, 0x33,
+ 0x5C, 0x2, 0x2, 0x8, 0xFD, 0x7, 0x33, 0x38, 0x0, 0x22, 0x7F,
+ 0x45, 0xC, 0x6F, 0x3, 0x0, 0x3C, 0x13, 0x3C, 0xC6, 0x15, 0x22,
+ 0x3A, 0x8, 0x1, 0x5C, 0x3, 0x14, 0x32, 0x2, 0x0, 0x31, 0x79,
+ 0x2, 0xE9, 0x1E, 0x0, 0xB, 0x1B, 0x4D, 0x0, 0x0, 0xB3, 0x0,
+ 0x16, 0x73, 0x0, 0x0, 0x9, 0x0, 0x5, 0x9, 0xD6, 0xA6, 0x3D,
+ 0x7, 0x4, 0x27, 0xA, 0x9B, 0x57, 0xA2, 0xB, 0x2E, 0x1C, 0xE9,
+ 0x56, 0x2B, 0x8, 0x18, 0x49, 0x43, 0x48, 0x0, 0x44, 0x1B, 0x1A,
+ 0x24, 0xC, 0x20, 0x3C, 0xEC, 0x76, 0x4, 0x0, 0x2, 0xAC, 0xF,
+ 0x3, 0x2, 0x2, 0x16, 0x34, 0x2, 0x20, 0x2A, 0x44, 0x43, 0x0,
+ 0x2C, 0x1D},
+ cpp::array<uint32_t, 14>{0xC5, 0xD8, 0x115, 0x197, 0x1B9, 0x1EF, 0x214,
+ 0x226, 0x413, 0x487, 0x493, 0x4A7, 0x4AC,
+ 0x514});
+
+LIBC_INLINE_VAR constexpr PerfectHashMap<1415, decltype(UPPER_TO_LOWER_HASHER)>
+ UPPER_TO_LOWER_MAP{UPPER_TO_LOWER_DATA, UPPER_TO_LOWER_HASHER};
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_UPPER_TO_LOWER_H
diff --git a/libc/src/__support/wctype/upper_to_lower.inc b/libc/src/__support/wctype/upper_to_lower.inc
deleted file mode 100644
index 2b35b58082d1f..0000000000000
--- a/libc/src/__support/wctype/upper_to_lower.inc
+++ /dev/null
@@ -1,390 +0,0 @@
-//===-- Auto-generated upper to lower case mappings table -------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-// DO NOT EDIT MANUALLY.
-// This file is generated by libc/utils/wctype_utils scripts.
-// This file is meant to be included directly into LLVM libc code
-// Format: {from_codepoint, to_codepoint}
-// Info: 1415 entries
-
-{0x41, 0x61}, {0x42, 0x62}, {0x43, 0x63}, {0x44, 0x64}, {0x45, 0x65},
- {0x46, 0x66}, {0x47, 0x67}, {0x48, 0x68}, {0x49, 0x69}, {0x4A, 0x6A},
- {0x4B, 0x6B}, {0x4C, 0x6C}, {0x4D, 0x6D}, {0x4E, 0x6E}, {0x4F, 0x6F},
- {0x50, 0x70}, {0x51, 0x71}, {0x52, 0x72}, {0x53, 0x73}, {0x54, 0x74},
- {0x55, 0x75}, {0x56, 0x76}, {0x57, 0x77}, {0x58, 0x78}, {0x59, 0x79},
- {0x5A, 0x7A}, {0xC0, 0xE0}, {0xC1, 0xE1}, {0xC2, 0xE2}, {0xC3, 0xE3},
- {0xC4, 0xE4}, {0xC5, 0xE5}, {0xC6, 0xE6}, {0xC7, 0xE7}, {0xC8, 0xE8},
- {0xC9, 0xE9}, {0xCA, 0xEA}, {0xCB, 0xEB}, {0xCC, 0xEC}, {0xCD, 0xED},
- {0xCE, 0xEE}, {0xCF, 0xEF}, {0xD0, 0xF0}, {0xD1, 0xF1}, {0xD2, 0xF2},
- {0xD3, 0xF3}, {0xD4, 0xF4}, {0xD5, 0xF5}, {0xD6, 0xF6}, {0xD8, 0xF8},
- {0xD9, 0xF9}, {0xDA, 0xFA}, {0xDB, 0xFB}, {0xDC, 0xFC}, {0xDD, 0xFD},
- {0xDE, 0xFE}, {0x100, 0x101}, {0x102, 0x103}, {0x104, 0x105},
- {0x106, 0x107}, {0x108, 0x109}, {0x10A, 0x10B}, {0x10C, 0x10D},
- {0x10E, 0x10F}, {0x110, 0x111}, {0x112, 0x113}, {0x114, 0x115},
- {0x116, 0x117}, {0x118, 0x119}, {0x11A, 0x11B}, {0x11C, 0x11D},
- {0x11E, 0x11F}, {0x120, 0x121}, {0x122, 0x123}, {0x124, 0x125},
- {0x126, 0x127}, {0x128, 0x129}, {0x12A, 0x12B}, {0x12C, 0x12D},
- {0x12E, 0x12F}, {0x130, 0x69}, {0x132, 0x133}, {0x134, 0x135},
- {0x136, 0x137}, {0x139, 0x13A}, {0x13B, 0x13C}, {0x13D, 0x13E},
- {0x13F, 0x140}, {0x141, 0x142}, {0x143, 0x144}, {0x145, 0x146},
- {0x147, 0x148}, {0x14A, 0x14B}, {0x14C, 0x14D}, {0x14E, 0x14F},
- {0x150, 0x151}, {0x152, 0x153}, {0x154, 0x155}, {0x156, 0x157},
- {0x158, 0x159}, {0x15A, 0x15B}, {0x15C, 0x15D}, {0x15E, 0x15F},
- {0x160, 0x161}, {0x162, 0x163}, {0x164, 0x165}, {0x166, 0x167},
- {0x168, 0x169}, {0x16A, 0x16B}, {0x16C, 0x16D}, {0x16E, 0x16F},
- {0x170, 0x171}, {0x172, 0x173}, {0x174, 0x175}, {0x176, 0x177},
- {0x178, 0xFF}, {0x179, 0x17A}, {0x17B, 0x17C}, {0x17D, 0x17E},
- {0x181, 0x253}, {0x182, 0x183}, {0x184, 0x185}, {0x186, 0x254},
- {0x187, 0x188}, {0x189, 0x256}, {0x18A, 0x257}, {0x18B, 0x18C},
- {0x18E, 0x1DD}, {0x18F, 0x259}, {0x190, 0x25B}, {0x191, 0x192},
- {0x193, 0x260}, {0x194, 0x263}, {0x196, 0x269}, {0x197, 0x268},
- {0x198, 0x199}, {0x19C, 0x26F}, {0x19D, 0x272}, {0x19F, 0x275},
- {0x1A0, 0x1A1}, {0x1A2, 0x1A3}, {0x1A4, 0x1A5}, {0x1A6, 0x280},
- {0x1A7, 0x1A8}, {0x1A9, 0x283}, {0x1AC, 0x1AD}, {0x1AE, 0x288},
- {0x1AF, 0x1B0}, {0x1B1, 0x28A}, {0x1B2, 0x28B}, {0x1B3, 0x1B4},
- {0x1B5, 0x1B6}, {0x1B7, 0x292}, {0x1B8, 0x1B9}, {0x1BC, 0x1BD},
- {0x1C4, 0x1C6}, {0x1C7, 0x1C9}, {0x1CA, 0x1CC}, {0x1CD, 0x1CE},
- {0x1CF, 0x1D0}, {0x1D1, 0x1D2}, {0x1D3, 0x1D4}, {0x1D5, 0x1D6},
- {0x1D7, 0x1D8}, {0x1D9, 0x1DA}, {0x1DB, 0x1DC}, {0x1DE, 0x1DF},
- {0x1E0, 0x1E1}, {0x1E2, 0x1E3}, {0x1E4, 0x1E5}, {0x1E6, 0x1E7},
- {0x1E8, 0x1E9}, {0x1EA, 0x1EB}, {0x1EC, 0x1ED}, {0x1EE, 0x1EF},
- {0x1F1, 0x1F3}, {0x1F4, 0x1F5}, {0x1F6, 0x195}, {0x1F7, 0x1BF},
- {0x1F8, 0x1F9}, {0x1FA, 0x1FB}, {0x1FC, 0x1FD}, {0x1FE, 0x1FF},
- {0x200, 0x201}, {0x202, 0x203}, {0x204, 0x205}, {0x206, 0x207},
- {0x208, 0x209}, {0x20A, 0x20B}, {0x20C, 0x20D}, {0x20E, 0x20F},
- {0x210, 0x211}, {0x212, 0x213}, {0x214, 0x215}, {0x216, 0x217},
- {0x218, 0x219}, {0x21A, 0x21B}, {0x21C, 0x21D}, {0x21E, 0x21F},
- {0x220, 0x19E}, {0x222, 0x223}, {0x224, 0x225}, {0x226, 0x227},
- {0x228, 0x229}, {0x22A, 0x22B}, {0x22C, 0x22D}, {0x22E, 0x22F},
- {0x230, 0x231}, {0x232, 0x233}, {0x23A, 0x2C65}, {0x23B, 0x23C},
- {0x23D, 0x19A}, {0x23E, 0x2C66}, {0x241, 0x242}, {0x243, 0x180},
- {0x244, 0x289}, {0x245, 0x28C}, {0x246, 0x247}, {0x248, 0x249},
- {0x24A, 0x24B}, {0x24C, 0x24D}, {0x24E, 0x24F}, {0x370, 0x371},
- {0x372, 0x373}, {0x376, 0x377}, {0x37F, 0x3F3}, {0x386, 0x3AC},
- {0x388, 0x3AD}, {0x389, 0x3AE}, {0x38A, 0x3AF}, {0x38C, 0x3CC},
- {0x38E, 0x3CD}, {0x38F, 0x3CE}, {0x391, 0x3B1}, {0x392, 0x3B2},
- {0x393, 0x3B3}, {0x394, 0x3B4}, {0x395, 0x3B5}, {0x396, 0x3B6},
- {0x397, 0x3B7}, {0x398, 0x3B8}, {0x399, 0x3B9}, {0x39A, 0x3BA},
- {0x39B, 0x3BB}, {0x39C, 0x3BC}, {0x39D, 0x3BD}, {0x39E, 0x3BE},
- {0x39F, 0x3BF}, {0x3A0, 0x3C0}, {0x3A1, 0x3C1}, {0x3A3, 0x3C3},
- {0x3A4, 0x3C4}, {0x3A5, 0x3C5}, {0x3A6, 0x3C6}, {0x3A7, 0x3C7},
- {0x3A8, 0x3C8}, {0x3A9, 0x3C9}, {0x3AA, 0x3CA}, {0x3AB, 0x3CB},
- {0x3CF, 0x3D7}, {0x3D8, 0x3D9}, {0x3DA, 0x3DB}, {0x3DC, 0x3DD},
- {0x3DE, 0x3DF}, {0x3E0, 0x3E1}, {0x3E2, 0x3E3}, {0x3E4, 0x3E5},
- {0x3E6, 0x3E7}, {0x3E8, 0x3E9}, {0x3EA, 0x3EB}, {0x3EC, 0x3ED},
- {0x3EE, 0x3EF}, {0x3F4, 0x3B8}, {0x3F7, 0x3F8}, {0x3F9, 0x3F2},
- {0x3FA, 0x3FB}, {0x3FD, 0x37B}, {0x3FE, 0x37C}, {0x3FF, 0x37D},
- {0x400, 0x450}, {0x401, 0x451}, {0x402, 0x452}, {0x403, 0x453},
- {0x404, 0x454}, {0x405, 0x455}, {0x406, 0x456}, {0x407, 0x457},
- {0x408, 0x458}, {0x409, 0x459}, {0x40A, 0x45A}, {0x40B, 0x45B},
- {0x40C, 0x45C}, {0x40D, 0x45D}, {0x40E, 0x45E}, {0x40F, 0x45F},
- {0x410, 0x430}, {0x411, 0x431}, {0x412, 0x432}, {0x413, 0x433},
- {0x414, 0x434}, {0x415, 0x435}, {0x416, 0x436}, {0x417, 0x437},
- {0x418, 0x438}, {0x419, 0x439}, {0x41A, 0x43A}, {0x41B, 0x43B},
- {0x41C, 0x43C}, {0x41D, 0x43D}, {0x41E, 0x43E}, {0x41F, 0x43F},
- {0x420, 0x440}, {0x421, 0x441}, {0x422, 0x442}, {0x423, 0x443},
- {0x424, 0x444}, {0x425, 0x445}, {0x426, 0x446}, {0x427, 0x447},
- {0x428, 0x448}, {0x429, 0x449}, {0x42A, 0x44A}, {0x42B, 0x44B},
- {0x42C, 0x44C}, {0x42D, 0x44D}, {0x42E, 0x44E}, {0x42F, 0x44F},
- {0x460, 0x461}, {0x462, 0x463}, {0x464, 0x465}, {0x466, 0x467},
- {0x468, 0x469}, {0x46A, 0x46B}, {0x46C, 0x46D}, {0x46E, 0x46F},
- {0x470, 0x471}, {0x472, 0x473}, {0x474, 0x475}, {0x476, 0x477},
- {0x478, 0x479}, {0x47A, 0x47B}, {0x47C, 0x47D}, {0x47E, 0x47F},
- {0x480, 0x481}, {0x48A, 0x48B}, {0x48C, 0x48D}, {0x48E, 0x48F},
- {0x490, 0x491}, {0x492, 0x493}, {0x494, 0x495}, {0x496, 0x497},
- {0x498, 0x499}, {0x49A, 0x49B}, {0x49C, 0x49D}, {0x49E, 0x49F},
- {0x4A0, 0x4A1}, {0x4A2, 0x4A3}, {0x4A4, 0x4A5}, {0x4A6, 0x4A7},
- {0x4A8, 0x4A9}, {0x4AA, 0x4AB}, {0x4AC, 0x4AD}, {0x4AE, 0x4AF},
- {0x4B0, 0x4B1}, {0x4B2, 0x4B3}, {0x4B4, 0x4B5}, {0x4B6, 0x4B7},
- {0x4B8, 0x4B9}, {0x4BA, 0x4BB}, {0x4BC, 0x4BD}, {0x4BE, 0x4BF},
- {0x4C0, 0x4CF}, {0x4C1, 0x4C2}, {0x4C3, 0x4C4}, {0x4C5, 0x4C6},
- {0x4C7, 0x4C8}, {0x4C9, 0x4CA}, {0x4CB, 0x4CC}, {0x4CD, 0x4CE},
- {0x4D0, 0x4D1}, {0x4D2, 0x4D3}, {0x4D4, 0x4D5}, {0x4D6, 0x4D7},
- {0x4D8, 0x4D9}, {0x4DA, 0x4DB}, {0x4DC, 0x4DD}, {0x4DE, 0x4DF},
- {0x4E0, 0x4E1}, {0x4E2, 0x4E3}, {0x4E4, 0x4E5}, {0x4E6, 0x4E7},
- {0x4E8, 0x4E9}, {0x4EA, 0x4EB}, {0x4EC, 0x4ED}, {0x4EE, 0x4EF},
- {0x4F0, 0x4F1}, {0x4F2, 0x4F3}, {0x4F4, 0x4F5}, {0x4F6, 0x4F7},
- {0x4F8, 0x4F9}, {0x4FA, 0x4FB}, {0x4FC, 0x4FD}, {0x4FE, 0x4FF},
- {0x500, 0x501}, {0x502, 0x503}, {0x504, 0x505}, {0x506, 0x507},
- {0x508, 0x509}, {0x50A, 0x50B}, {0x50C, 0x50D}, {0x50E, 0x50F},
- {0x510, 0x511}, {0x512, 0x513}, {0x514, 0x515}, {0x516, 0x517},
- {0x518, 0x519}, {0x51A, 0x51B}, {0x51C, 0x51D}, {0x51E, 0x51F},
- {0x520, 0x521}, {0x522, 0x523}, {0x524, 0x525}, {0x526, 0x527},
- {0x528, 0x529}, {0x52A, 0x52B}, {0x52C, 0x52D}, {0x52E, 0x52F},
- {0x531, 0x561}, {0x532, 0x562}, {0x533, 0x563}, {0x534, 0x564},
- {0x535, 0x565}, {0x536, 0x566}, {0x537, 0x567}, {0x538, 0x568},
- {0x539, 0x569}, {0x53A, 0x56A}, {0x53B, 0x56B}, {0x53C, 0x56C},
- {0x53D, 0x56D}, {0x53E, 0x56E}, {0x53F, 0x56F}, {0x540, 0x570},
- {0x541, 0x571}, {0x542, 0x572}, {0x543, 0x573}, {0x544, 0x574},
- {0x545, 0x575}, {0x546, 0x576}, {0x547, 0x577}, {0x548, 0x578},
- {0x549, 0x579}, {0x54A, 0x57A}, {0x54B, 0x57B}, {0x54C, 0x57C},
- {0x54D, 0x57D}, {0x54E, 0x57E}, {0x54F, 0x57F}, {0x550, 0x580},
- {0x551, 0x581}, {0x552, 0x582}, {0x553, 0x583}, {0x554, 0x584},
- {0x555, 0x585}, {0x556, 0x586}, {0x10A0, 0x2D00}, {0x10A1, 0x2D01},
- {0x10A2, 0x2D02}, {0x10A3, 0x2D03}, {0x10A4, 0x2D04}, {0x10A5, 0x2D05},
- {0x10A6, 0x2D06}, {0x10A7, 0x2D07}, {0x10A8, 0x2D08}, {0x10A9, 0x2D09},
- {0x10AA, 0x2D0A}, {0x10AB, 0x2D0B}, {0x10AC, 0x2D0C}, {0x10AD, 0x2D0D},
- {0x10AE, 0x2D0E}, {0x10AF, 0x2D0F}, {0x10B0, 0x2D10}, {0x10B1, 0x2D11},
- {0x10B2, 0x2D12}, {0x10B3, 0x2D13}, {0x10B4, 0x2D14}, {0x10B5, 0x2D15},
- {0x10B6, 0x2D16}, {0x10B7, 0x2D17}, {0x10B8, 0x2D18}, {0x10B9, 0x2D19},
- {0x10BA, 0x2D1A}, {0x10BB, 0x2D1B}, {0x10BC, 0x2D1C}, {0x10BD, 0x2D1D},
- {0x10BE, 0x2D1E}, {0x10BF, 0x2D1F}, {0x10C0, 0x2D20}, {0x10C1, 0x2D21},
- {0x10C2, 0x2D22}, {0x10C3, 0x2D23}, {0x10C4, 0x2D24}, {0x10C5, 0x2D25},
- {0x10C7, 0x2D27}, {0x10CD, 0x2D2D}, {0x13A0, 0xAB70}, {0x13A1, 0xAB71},
- {0x13A2, 0xAB72}, {0x13A3, 0xAB73}, {0x13A4, 0xAB74}, {0x13A5, 0xAB75},
- {0x13A6, 0xAB76}, {0x13A7, 0xAB77}, {0x13A8, 0xAB78}, {0x13A9, 0xAB79},
- {0x13AA, 0xAB7A}, {0x13AB, 0xAB7B}, {0x13AC, 0xAB7C}, {0x13AD, 0xAB7D},
- {0x13AE, 0xAB7E}, {0x13AF, 0xAB7F}, {0x13B0, 0xAB80}, {0x13B1, 0xAB81},
- {0x13B2, 0xAB82}, {0x13B3, 0xAB83}, {0x13B4, 0xAB84}, {0x13B5, 0xAB85},
- {0x13B6, 0xAB86}, {0x13B7, 0xAB87}, {0x13B8, 0xAB88}, {0x13B9, 0xAB89},
- {0x13BA, 0xAB8A}, {0x13BB, 0xAB8B}, {0x13BC, 0xAB8C}, {0x13BD, 0xAB8D},
- {0x13BE, 0xAB8E}, {0x13BF, 0xAB8F}, {0x13C0, 0xAB90}, {0x13C1, 0xAB91},
- {0x13C2, 0xAB92}, {0x13C3, 0xAB93}, {0x13C4, 0xAB94}, {0x13C5, 0xAB95},
- {0x13C6, 0xAB96}, {0x13C7, 0xAB97}, {0x13C8, 0xAB98}, {0x13C9, 0xAB99},
- {0x13CA, 0xAB9A}, {0x13CB, 0xAB9B}, {0x13CC, 0xAB9C}, {0x13CD, 0xAB9D},
- {0x13CE, 0xAB9E}, {0x13CF, 0xAB9F}, {0x13D0, 0xABA0}, {0x13D1, 0xABA1},
- {0x13D2, 0xABA2}, {0x13D3, 0xABA3}, {0x13D4, 0xABA4}, {0x13D5, 0xABA5},
- {0x13D6, 0xABA6}, {0x13D7, 0xABA7}, {0x13D8, 0xABA8}, {0x13D9, 0xABA9},
- {0x13DA, 0xABAA}, {0x13DB, 0xABAB}, {0x13DC, 0xABAC}, {0x13DD, 0xABAD},
- {0x13DE, 0xABAE}, {0x13DF, 0xABAF}, {0x13E0, 0xABB0}, {0x13E1, 0xABB1},
- {0x13E2, 0xABB2}, {0x13E3, 0xABB3}, {0x13E4, 0xABB4}, {0x13E5, 0xABB5},
- {0x13E6, 0xABB6}, {0x13E7, 0xABB7}, {0x13E8, 0xABB8}, {0x13E9, 0xABB9},
- {0x13EA, 0xABBA}, {0x13EB, 0xABBB}, {0x13EC, 0xABBC}, {0x13ED, 0xABBD},
- {0x13EE, 0xABBE}, {0x13EF, 0xABBF}, {0x13F0, 0x13F8}, {0x13F1, 0x13F9},
- {0x13F2, 0x13FA}, {0x13F3, 0x13FB}, {0x13F4, 0x13FC}, {0x13F5, 0x13FD},
- {0x1C89, 0x1C8A}, {0x1C90, 0x10D0}, {0x1C91, 0x10D1}, {0x1C92, 0x10D2},
- {0x1C93, 0x10D3}, {0x1C94, 0x10D4}, {0x1C95, 0x10D5}, {0x1C96, 0x10D6},
- {0x1C97, 0x10D7}, {0x1C98, 0x10D8}, {0x1C99, 0x10D9}, {0x1C9A, 0x10DA},
- {0x1C9B, 0x10DB}, {0x1C9C, 0x10DC}, {0x1C9D, 0x10DD}, {0x1C9E, 0x10DE},
- {0x1C9F, 0x10DF}, {0x1CA0, 0x10E0}, {0x1CA1, 0x10E1}, {0x1CA2, 0x10E2},
- {0x1CA3, 0x10E3}, {0x1CA4, 0x10E4}, {0x1CA5, 0x10E5}, {0x1CA6, 0x10E6},
- {0x1CA7, 0x10E7}, {0x1CA8, 0x10E8}, {0x1CA9, 0x10E9}, {0x1CAA, 0x10EA},
- {0x1CAB, 0x10EB}, {0x1CAC, 0x10EC}, {0x1CAD, 0x10ED}, {0x1CAE, 0x10EE},
- {0x1CAF, 0x10EF}, {0x1CB0, 0x10F0}, {0x1CB1, 0x10F1}, {0x1CB2, 0x10F2},
- {0x1CB3, 0x10F3}, {0x1CB4, 0x10F4}, {0x1CB5, 0x10F5}, {0x1CB6, 0x10F6},
- {0x1CB7, 0x10F7}, {0x1CB8, 0x10F8}, {0x1CB9, 0x10F9}, {0x1CBA, 0x10FA},
- {0x1CBD, 0x10FD}, {0x1CBE, 0x10FE}, {0x1CBF, 0x10FF}, {0x1E00, 0x1E01},
- {0x1E02, 0x1E03}, {0x1E04, 0x1E05}, {0x1E06, 0x1E07}, {0x1E08, 0x1E09},
- {0x1E0A, 0x1E0B}, {0x1E0C, 0x1E0D}, {0x1E0E, 0x1E0F}, {0x1E10, 0x1E11},
- {0x1E12, 0x1E13}, {0x1E14, 0x1E15}, {0x1E16, 0x1E17}, {0x1E18, 0x1E19},
- {0x1E1A, 0x1E1B}, {0x1E1C, 0x1E1D}, {0x1E1E, 0x1E1F}, {0x1E20, 0x1E21},
- {0x1E22, 0x1E23}, {0x1E24, 0x1E25}, {0x1E26, 0x1E27}, {0x1E28, 0x1E29},
- {0x1E2A, 0x1E2B}, {0x1E2C, 0x1E2D}, {0x1E2E, 0x1E2F}, {0x1E30, 0x1E31},
- {0x1E32, 0x1E33}, {0x1E34, 0x1E35}, {0x1E36, 0x1E37}, {0x1E38, 0x1E39},
- {0x1E3A, 0x1E3B}, {0x1E3C, 0x1E3D}, {0x1E3E, 0x1E3F}, {0x1E40, 0x1E41},
- {0x1E42, 0x1E43}, {0x1E44, 0x1E45}, {0x1E46, 0x1E47}, {0x1E48, 0x1E49},
- {0x1E4A, 0x1E4B}, {0x1E4C, 0x1E4D}, {0x1E4E, 0x1E4F}, {0x1E50, 0x1E51},
- {0x1E52, 0x1E53}, {0x1E54, 0x1E55}, {0x1E56, 0x1E57}, {0x1E58, 0x1E59},
- {0x1E5A, 0x1E5B}, {0x1E5C, 0x1E5D}, {0x1E5E, 0x1E5F}, {0x1E60, 0x1E61},
- {0x1E62, 0x1E63}, {0x1E64, 0x1E65}, {0x1E66, 0x1E67}, {0x1E68, 0x1E69},
- {0x1E6A, 0x1E6B}, {0x1E6C, 0x1E6D}, {0x1E6E, 0x1E6F}, {0x1E70, 0x1E71},
- {0x1E72, 0x1E73}, {0x1E74, 0x1E75}, {0x1E76, 0x1E77}, {0x1E78, 0x1E79},
- {0x1E7A, 0x1E7B}, {0x1E7C, 0x1E7D}, {0x1E7E, 0x1E7F}, {0x1E80, 0x1E81},
- {0x1E82, 0x1E83}, {0x1E84, 0x1E85}, {0x1E86, 0x1E87}, {0x1E88, 0x1E89},
- {0x1E8A, 0x1E8B}, {0x1E8C, 0x1E8D}, {0x1E8E, 0x1E8F}, {0x1E90, 0x1E91},
- {0x1E92, 0x1E93}, {0x1E94, 0x1E95}, {0x1E9E, 0xDF}, {0x1EA0, 0x1EA1},
- {0x1EA2, 0x1EA3}, {0x1EA4, 0x1EA5}, {0x1EA6, 0x1EA7}, {0x1EA8, 0x1EA9},
- {0x1EAA, 0x1EAB}, {0x1EAC, 0x1EAD}, {0x1EAE, 0x1EAF}, {0x1EB0, 0x1EB1},
- {0x1EB2, 0x1EB3}, {0x1EB4, 0x1EB5}, {0x1EB6, 0x1EB7}, {0x1EB8, 0x1EB9},
- {0x1EBA, 0x1EBB}, {0x1EBC, 0x1EBD}, {0x1EBE, 0x1EBF}, {0x1EC0, 0x1EC1},
- {0x1EC2, 0x1EC3}, {0x1EC4, 0x1EC5}, {0x1EC6, 0x1EC7}, {0x1EC8, 0x1EC9},
- {0x1ECA, 0x1ECB}, {0x1ECC, 0x1ECD}, {0x1ECE, 0x1ECF}, {0x1ED0, 0x1ED1},
- {0x1ED2, 0x1ED3}, {0x1ED4, 0x1ED5}, {0x1ED6, 0x1ED7}, {0x1ED8, 0x1ED9},
- {0x1EDA, 0x1EDB}, {0x1EDC, 0x1EDD}, {0x1EDE, 0x1EDF}, {0x1EE0, 0x1EE1},
- {0x1EE2, 0x1EE3}, {0x1EE4, 0x1EE5}, {0x1EE6, 0x1EE7}, {0x1EE8, 0x1EE9},
- {0x1EEA, 0x1EEB}, {0x1EEC, 0x1EED}, {0x1EEE, 0x1EEF}, {0x1EF0, 0x1EF1},
- {0x1EF2, 0x1EF3}, {0x1EF4, 0x1EF5}, {0x1EF6, 0x1EF7}, {0x1EF8, 0x1EF9},
- {0x1EFA, 0x1EFB}, {0x1EFC, 0x1EFD}, {0x1EFE, 0x1EFF}, {0x1F08, 0x1F00},
- {0x1F09, 0x1F01}, {0x1F0A, 0x1F02}, {0x1F0B, 0x1F03}, {0x1F0C, 0x1F04},
- {0x1F0D, 0x1F05}, {0x1F0E, 0x1F06}, {0x1F0F, 0x1F07}, {0x1F18, 0x1F10},
- {0x1F19, 0x1F11}, {0x1F1A, 0x1F12}, {0x1F1B, 0x1F13}, {0x1F1C, 0x1F14},
- {0x1F1D, 0x1F15}, {0x1F28, 0x1F20}, {0x1F29, 0x1F21}, {0x1F2A, 0x1F22},
- {0x1F2B, 0x1F23}, {0x1F2C, 0x1F24}, {0x1F2D, 0x1F25}, {0x1F2E, 0x1F26},
- {0x1F2F, 0x1F27}, {0x1F38, 0x1F30}, {0x1F39, 0x1F31}, {0x1F3A, 0x1F32},
- {0x1F3B, 0x1F33}, {0x1F3C, 0x1F34}, {0x1F3D, 0x1F35}, {0x1F3E, 0x1F36},
- {0x1F3F, 0x1F37}, {0x1F48, 0x1F40}, {0x1F49, 0x1F41}, {0x1F4A, 0x1F42},
- {0x1F4B, 0x1F43}, {0x1F4C, 0x1F44}, {0x1F4D, 0x1F45}, {0x1F59, 0x1F51},
- {0x1F5B, 0x1F53}, {0x1F5D, 0x1F55}, {0x1F5F, 0x1F57}, {0x1F68, 0x1F60},
- {0x1F69, 0x1F61}, {0x1F6A, 0x1F62}, {0x1F6B, 0x1F63}, {0x1F6C, 0x1F64},
- {0x1F6D, 0x1F65}, {0x1F6E, 0x1F66}, {0x1F6F, 0x1F67}, {0x1FB8, 0x1FB0},
- {0x1FB9, 0x1FB1}, {0x1FBA, 0x1F70}, {0x1FBB, 0x1F71}, {0x1FC8, 0x1F72},
- {0x1FC9, 0x1F73}, {0x1FCA, 0x1F74}, {0x1FCB, 0x1F75}, {0x1FD8, 0x1FD0},
- {0x1FD9, 0x1FD1}, {0x1FDA, 0x1F76}, {0x1FDB, 0x1F77}, {0x1FE8, 0x1FE0},
- {0x1FE9, 0x1FE1}, {0x1FEA, 0x1F7A}, {0x1FEB, 0x1F7B}, {0x1FEC, 0x1FE5},
- {0x1FF8, 0x1F78}, {0x1FF9, 0x1F79}, {0x1FFA, 0x1F7C}, {0x1FFB, 0x1F7D},
- {0x2126, 0x3C9}, {0x212A, 0x6B}, {0x212B, 0xE5}, {0x2132, 0x214E},
- {0x2183, 0x2184}, {0x2C00, 0x2C30}, {0x2C01, 0x2C31}, {0x2C02, 0x2C32},
- {0x2C03, 0x2C33}, {0x2C04, 0x2C34}, {0x2C05, 0x2C35}, {0x2C06, 0x2C36},
- {0x2C07, 0x2C37}, {0x2C08, 0x2C38}, {0x2C09, 0x2C39}, {0x2C0A, 0x2C3A},
- {0x2C0B, 0x2C3B}, {0x2C0C, 0x2C3C}, {0x2C0D, 0x2C3D}, {0x2C0E, 0x2C3E},
- {0x2C0F, 0x2C3F}, {0x2C10, 0x2C40}, {0x2C11, 0x2C41}, {0x2C12, 0x2C42},
- {0x2C13, 0x2C43}, {0x2C14, 0x2C44}, {0x2C15, 0x2C45}, {0x2C16, 0x2C46},
- {0x2C17, 0x2C47}, {0x2C18, 0x2C48}, {0x2C19, 0x2C49}, {0x2C1A, 0x2C4A},
- {0x2C1B, 0x2C4B}, {0x2C1C, 0x2C4C}, {0x2C1D, 0x2C4D}, {0x2C1E, 0x2C4E},
- {0x2C1F, 0x2C4F}, {0x2C20, 0x2C50}, {0x2C21, 0x2C51}, {0x2C22, 0x2C52},
- {0x2C23, 0x2C53}, {0x2C24, 0x2C54}, {0x2C25, 0x2C55}, {0x2C26, 0x2C56},
- {0x2C27, 0x2C57}, {0x2C28, 0x2C58}, {0x2C29, 0x2C59}, {0x2C2A, 0x2C5A},
- {0x2C2B, 0x2C5B}, {0x2C2C, 0x2C5C}, {0x2C2D, 0x2C5D}, {0x2C2E, 0x2C5E},
- {0x2C2F, 0x2C5F}, {0x2C60, 0x2C61}, {0x2C62, 0x26B}, {0x2C63, 0x1D7D},
- {0x2C64, 0x27D}, {0x2C67, 0x2C68}, {0x2C69, 0x2C6A}, {0x2C6B, 0x2C6C},
- {0x2C6D, 0x251}, {0x2C6E, 0x271}, {0x2C6F, 0x250}, {0x2C70, 0x252},
- {0x2C72, 0x2C73}, {0x2C75, 0x2C76}, {0x2C7E, 0x23F}, {0x2C7F, 0x240},
- {0x2C80, 0x2C81}, {0x2C82, 0x2C83}, {0x2C84, 0x2C85}, {0x2C86, 0x2C87},
- {0x2C88, 0x2C89}, {0x2C8A, 0x2C8B}, {0x2C8C, 0x2C8D}, {0x2C8E, 0x2C8F},
- {0x2C90, 0x2C91}, {0x2C92, 0x2C93}, {0x2C94, 0x2C95}, {0x2C96, 0x2C97},
- {0x2C98, 0x2C99}, {0x2C9A, 0x2C9B}, {0x2C9C, 0x2C9D}, {0x2C9E, 0x2C9F},
- {0x2CA0, 0x2CA1}, {0x2CA2, 0x2CA3}, {0x2CA4, 0x2CA5}, {0x2CA6, 0x2CA7},
- {0x2CA8, 0x2CA9}, {0x2CAA, 0x2CAB}, {0x2CAC, 0x2CAD}, {0x2CAE, 0x2CAF},
- {0x2CB0, 0x2CB1}, {0x2CB2, 0x2CB3}, {0x2CB4, 0x2CB5}, {0x2CB6, 0x2CB7},
- {0x2CB8, 0x2CB9}, {0x2CBA, 0x2CBB}, {0x2CBC, 0x2CBD}, {0x2CBE, 0x2CBF},
- {0x2CC0, 0x2CC1}, {0x2CC2, 0x2CC3}, {0x2CC4, 0x2CC5}, {0x2CC6, 0x2CC7},
- {0x2CC8, 0x2CC9}, {0x2CCA, 0x2CCB}, {0x2CCC, 0x2CCD}, {0x2CCE, 0x2CCF},
- {0x2CD0, 0x2CD1}, {0x2CD2, 0x2CD3}, {0x2CD4, 0x2CD5}, {0x2CD6, 0x2CD7},
- {0x2CD8, 0x2CD9}, {0x2CDA, 0x2CDB}, {0x2CDC, 0x2CDD}, {0x2CDE, 0x2CDF},
- {0x2CE0, 0x2CE1}, {0x2CE2, 0x2CE3}, {0x2CEB, 0x2CEC}, {0x2CED, 0x2CEE},
- {0x2CF2, 0x2CF3}, {0xA640, 0xA641}, {0xA642, 0xA643}, {0xA644, 0xA645},
- {0xA646, 0xA647}, {0xA648, 0xA649}, {0xA64A, 0xA64B}, {0xA64C, 0xA64D},
- {0xA64E, 0xA64F}, {0xA650, 0xA651}, {0xA652, 0xA653}, {0xA654, 0xA655},
- {0xA656, 0xA657}, {0xA658, 0xA659}, {0xA65A, 0xA65B}, {0xA65C, 0xA65D},
- {0xA65E, 0xA65F}, {0xA660, 0xA661}, {0xA662, 0xA663}, {0xA664, 0xA665},
- {0xA666, 0xA667}, {0xA668, 0xA669}, {0xA66A, 0xA66B}, {0xA66C, 0xA66D},
- {0xA680, 0xA681}, {0xA682, 0xA683}, {0xA684, 0xA685}, {0xA686, 0xA687},
- {0xA688, 0xA689}, {0xA68A, 0xA68B}, {0xA68C, 0xA68D}, {0xA68E, 0xA68F},
- {0xA690, 0xA691}, {0xA692, 0xA693}, {0xA694, 0xA695}, {0xA696, 0xA697},
- {0xA698, 0xA699}, {0xA69A, 0xA69B}, {0xA722, 0xA723}, {0xA724, 0xA725},
- {0xA726, 0xA727}, {0xA728, 0xA729}, {0xA72A, 0xA72B}, {0xA72C, 0xA72D},
- {0xA72E, 0xA72F}, {0xA732, 0xA733}, {0xA734, 0xA735}, {0xA736, 0xA737},
- {0xA738, 0xA739}, {0xA73A, 0xA73B}, {0xA73C, 0xA73D}, {0xA73E, 0xA73F},
- {0xA740, 0xA741}, {0xA742, 0xA743}, {0xA744, 0xA745}, {0xA746, 0xA747},
- {0xA748, 0xA749}, {0xA74A, 0xA74B}, {0xA74C, 0xA74D}, {0xA74E, 0xA74F},
- {0xA750, 0xA751}, {0xA752, 0xA753}, {0xA754, 0xA755}, {0xA756, 0xA757},
- {0xA758, 0xA759}, {0xA75A, 0xA75B}, {0xA75C, 0xA75D}, {0xA75E, 0xA75F},
- {0xA760, 0xA761}, {0xA762, 0xA763}, {0xA764, 0xA765}, {0xA766, 0xA767},
- {0xA768, 0xA769}, {0xA76A, 0xA76B}, {0xA76C, 0xA76D}, {0xA76E, 0xA76F},
- {0xA779, 0xA77A}, {0xA77B, 0xA77C}, {0xA77D, 0x1D79}, {0xA77E, 0xA77F},
- {0xA780, 0xA781}, {0xA782, 0xA783}, {0xA784, 0xA785}, {0xA786, 0xA787},
- {0xA78B, 0xA78C}, {0xA78D, 0x265}, {0xA790, 0xA791}, {0xA792, 0xA793},
- {0xA796, 0xA797}, {0xA798, 0xA799}, {0xA79A, 0xA79B}, {0xA79C, 0xA79D},
- {0xA79E, 0xA79F}, {0xA7A0, 0xA7A1}, {0xA7A2, 0xA7A3}, {0xA7A4, 0xA7A5},
- {0xA7A6, 0xA7A7}, {0xA7A8, 0xA7A9}, {0xA7AA, 0x266}, {0xA7AB, 0x25C},
- {0xA7AC, 0x261}, {0xA7AD, 0x26C}, {0xA7AE, 0x26A}, {0xA7B0, 0x29E},
- {0xA7B1, 0x287}, {0xA7B2, 0x29D}, {0xA7B3, 0xAB53}, {0xA7B4, 0xA7B5},
- {0xA7B6, 0xA7B7}, {0xA7B8, 0xA7B9}, {0xA7BA, 0xA7BB}, {0xA7BC, 0xA7BD},
- {0xA7BE, 0xA7BF}, {0xA7C0, 0xA7C1}, {0xA7C2, 0xA7C3}, {0xA7C4, 0xA794},
- {0xA7C5, 0x282}, {0xA7C6, 0x1D8E}, {0xA7C7, 0xA7C8}, {0xA7C9, 0xA7CA},
- {0xA7CB, 0x264}, {0xA7CC, 0xA7CD}, {0xA7CE, 0xA7CF}, {0xA7D0, 0xA7D1},
- {0xA7D2, 0xA7D3}, {0xA7D4, 0xA7D5}, {0xA7D6, 0xA7D7}, {0xA7D8, 0xA7D9},
- {0xA7DA, 0xA7DB}, {0xA7DC, 0x19B}, {0xA7F5, 0xA7F6}, {0xFF21, 0xFF41},
- {0xFF22, 0xFF42}, {0xFF23, 0xFF43}, {0xFF24, 0xFF44}, {0xFF25, 0xFF45},
- {0xFF26, 0xFF46}, {0xFF27, 0xFF47}, {0xFF28, 0xFF48}, {0xFF29, 0xFF49},
- {0xFF2A, 0xFF4A}, {0xFF2B, 0xFF4B}, {0xFF2C, 0xFF4C}, {0xFF2D, 0xFF4D},
- {0xFF2E, 0xFF4E}, {0xFF2F, 0xFF4F}, {0xFF30, 0xFF50}, {0xFF31, 0xFF51},
- {0xFF32, 0xFF52}, {0xFF33, 0xFF53}, {0xFF34, 0xFF54}, {0xFF35, 0xFF55},
- {0xFF36, 0xFF56}, {0xFF37, 0xFF57}, {0xFF38, 0xFF58}, {0xFF39, 0xFF59},
- {0xFF3A, 0xFF5A}, {0x10400, 0x10428}, {0x10401, 0x10429},
- {0x10402, 0x1042A}, {0x10403, 0x1042B}, {0x10404, 0x1042C},
- {0x10405, 0x1042D}, {0x10406, 0x1042E}, {0x10407, 0x1042F},
- {0x10408, 0x10430}, {0x10409, 0x10431}, {0x1040A, 0x10432},
- {0x1040B, 0x10433}, {0x1040C, 0x10434}, {0x1040D, 0x10435},
- {0x1040E, 0x10436}, {0x1040F, 0x10437}, {0x10410, 0x10438},
- {0x10411, 0x10439}, {0x10412, 0x1043A}, {0x10413, 0x1043B},
- {0x10414, 0x1043C}, {0x10415, 0x1043D}, {0x10416, 0x1043E},
- {0x10417, 0x1043F}, {0x10418, 0x10440}, {0x10419, 0x10441},
- {0x1041A, 0x10442}, {0x1041B, 0x10443}, {0x1041C, 0x10444},
- {0x1041D, 0x10445}, {0x1041E, 0x10446}, {0x1041F, 0x10447},
- {0x10420, 0x10448}, {0x10421, 0x10449}, {0x10422, 0x1044A},
- {0x10423, 0x1044B}, {0x10424, 0x1044C}, {0x10425, 0x1044D},
- {0x10426, 0x1044E}, {0x10427, 0x1044F}, {0x104B0, 0x104D8},
- {0x104B1, 0x104D9}, {0x104B2, 0x104DA}, {0x104B3, 0x104DB},
- {0x104B4, 0x104DC}, {0x104B5, 0x104DD}, {0x104B6, 0x104DE},
- {0x104B7, 0x104DF}, {0x104B8, 0x104E0}, {0x104B9, 0x104E1},
- {0x104BA, 0x104E2}, {0x104BB, 0x104E3}, {0x104BC, 0x104E4},
- {0x104BD, 0x104E5}, {0x104BE, 0x104E6}, {0x104BF, 0x104E7},
- {0x104C0, 0x104E8}, {0x104C1, 0x104E9}, {0x104C2, 0x104EA},
- {0x104C3, 0x104EB}, {0x104C4, 0x104EC}, {0x104C5, 0x104ED},
- {0x104C6, 0x104EE}, {0x104C7, 0x104EF}, {0x104C8, 0x104F0},
- {0x104C9, 0x104F1}, {0x104CA, 0x104F2}, {0x104CB, 0x104F3},
- {0x104CC, 0x104F4}, {0x104CD, 0x104F5}, {0x104CE, 0x104F6},
- {0x104CF, 0x104F7}, {0x104D0, 0x104F8}, {0x104D1, 0x104F9},
- {0x104D2, 0x104FA}, {0x104D3, 0x104FB}, {0x10570, 0x10597},
- {0x10571, 0x10598}, {0x10572, 0x10599}, {0x10573, 0x1059A},
- {0x10574, 0x1059B}, {0x10575, 0x1059C}, {0x10576, 0x1059D},
- {0x10577, 0x1059E}, {0x10578, 0x1059F}, {0x10579, 0x105A0},
- {0x1057A, 0x105A1}, {0x1057C, 0x105A3}, {0x1057D, 0x105A4},
- {0x1057E, 0x105A5}, {0x1057F, 0x105A6}, {0x10580, 0x105A7},
- {0x10581, 0x105A8}, {0x10582, 0x105A9}, {0x10583, 0x105AA},
- {0x10584, 0x105AB}, {0x10585, 0x105AC}, {0x10586, 0x105AD},
- {0x10587, 0x105AE}, {0x10588, 0x105AF}, {0x10589, 0x105B0},
- {0x1058A, 0x105B1}, {0x1058C, 0x105B3}, {0x1058D, 0x105B4},
- {0x1058E, 0x105B5}, {0x1058F, 0x105B6}, {0x10590, 0x105B7},
- {0x10591, 0x105B8}, {0x10592, 0x105B9}, {0x10594, 0x105BB},
- {0x10595, 0x105BC}, {0x10C80, 0x10CC0}, {0x10C81, 0x10CC1},
- {0x10C82, 0x10CC2}, {0x10C83, 0x10CC3}, {0x10C84, 0x10CC4},
- {0x10C85, 0x10CC5}, {0x10C86, 0x10CC6}, {0x10C87, 0x10CC7},
- {0x10C88, 0x10CC8}, {0x10C89, 0x10CC9}, {0x10C8A, 0x10CCA},
- {0x10C8B, 0x10CCB}, {0x10C8C, 0x10CCC}, {0x10C8D, 0x10CCD},
- {0x10C8E, 0x10CCE}, {0x10C8F, 0x10CCF}, {0x10C90, 0x10CD0},
- {0x10C91, 0x10CD1}, {0x10C92, 0x10CD2}, {0x10C93, 0x10CD3},
- {0x10C94, 0x10CD4}, {0x10C95, 0x10CD5}, {0x10C96, 0x10CD6},
- {0x10C97, 0x10CD7}, {0x10C98, 0x10CD8}, {0x10C99, 0x10CD9},
- {0x10C9A, 0x10CDA}, {0x10C9B, 0x10CDB}, {0x10C9C, 0x10CDC},
- {0x10C9D, 0x10CDD}, {0x10C9E, 0x10CDE}, {0x10C9F, 0x10CDF},
- {0x10CA0, 0x10CE0}, {0x10CA1, 0x10CE1}, {0x10CA2, 0x10CE2},
- {0x10CA3, 0x10CE3}, {0x10CA4, 0x10CE4}, {0x10CA5, 0x10CE5},
- {0x10CA6, 0x10CE6}, {0x10CA7, 0x10CE7}, {0x10CA8, 0x10CE8},
- {0x10CA9, 0x10CE9}, {0x10CAA, 0x10CEA}, {0x10CAB, 0x10CEB},
- {0x10CAC, 0x10CEC}, {0x10CAD, 0x10CED}, {0x10CAE, 0x10CEE},
- {0x10CAF, 0x10CEF}, {0x10CB0, 0x10CF0}, {0x10CB1, 0x10CF1},
- {0x10CB2, 0x10CF2}, {0x10D50, 0x10D70}, {0x10D51, 0x10D71},
- {0x10D52, 0x10D72}, {0x10D53, 0x10D73}, {0x10D54, 0x10D74},
- {0x10D55, 0x10D75}, {0x10D56, 0x10D76}, {0x10D57, 0x10D77},
- {0x10D58, 0x10D78}, {0x10D59, 0x10D79}, {0x10D5A, 0x10D7A},
- {0x10D5B, 0x10D7B}, {0x10D5C, 0x10D7C}, {0x10D5D, 0x10D7D},
- {0x10D5E, 0x10D7E}, {0x10D5F, 0x10D7F}, {0x10D60, 0x10D80},
- {0x10D61, 0x10D81}, {0x10D62, 0x10D82}, {0x10D63, 0x10D83},
- {0x10D64, 0x10D84}, {0x10D65, 0x10D85}, {0x118A0, 0x118C0},
- {0x118A1, 0x118C1}, {0x118A2, 0x118C2}, {0x118A3, 0x118C3},
- {0x118A4, 0x118C4}, {0x118A5, 0x118C5}, {0x118A6, 0x118C6},
- {0x118A7, 0x118C7}, {0x118A8, 0x118C8}, {0x118A9, 0x118C9},
- {0x118AA, 0x118CA}, {0x118AB, 0x118CB}, {0x118AC, 0x118CC},
- {0x118AD, 0x118CD}, {0x118AE, 0x118CE}, {0x118AF, 0x118CF},
- {0x118B0, 0x118D0}, {0x118B1, 0x118D1}, {0x118B2, 0x118D2},
- {0x118B3, 0x118D3}, {0x118B4, 0x118D4}, {0x118B5, 0x118D5},
- {0x118B6, 0x118D6}, {0x118B7, 0x118D7}, {0x118B8, 0x118D8},
- {0x118B9, 0x118D9}, {0x118BA, 0x118DA}, {0x118BB, 0x118DB},
- {0x118BC, 0x118DC}, {0x118BD, 0x118DD}, {0x118BE, 0x118DE},
- {0x118BF, 0x118DF}, {0x16E40, 0x16E60}, {0x16E41, 0x16E61},
- {0x16E42, 0x16E62}, {0x16E43, 0x16E63}, {0x16E44, 0x16E64},
- {0x16E45, 0x16E65}, {0x16E46, 0x16E66}, {0x16E47, 0x16E67},
- {0x16E48, 0x16E68}, {0x16E49, 0x16E69}, {0x16E4A, 0x16E6A},
- {0x16E4B, 0x16E6B}, {0x16E4C, 0x16E6C}, {0x16E4D, 0x16E6D},
- {0x16E4E, 0x16E6E}, {0x16E4F, 0x16E6F}, {0x16E50, 0x16E70},
- {0x16E51, 0x16E71}, {0x16E52, 0x16E72}, {0x16E53, 0x16E73},
- {0x16E54, 0x16E74}, {0x16E55, 0x16E75}, {0x16E56, 0x16E76},
- {0x16E57, 0x16E77}, {0x16E58, 0x16E78}, {0x16E59, 0x16E79},
- {0x16E5A, 0x16E7A}, {0x16E5B, 0x16E7B}, {0x16E5C, 0x16E7C},
- {0x16E5D, 0x16E7D}, {0x16E5E, 0x16E7E}, {0x16E5F, 0x16E7F},
- {0x16EA0, 0x16EBB}, {0x16EA1, 0x16EBC}, {0x16EA2, 0x16EBD},
- {0x16EA3, 0x16EBE}, {0x16EA4, 0x16EBF}, {0x16EA5, 0x16EC0},
- {0x16EA6, 0x16EC1}, {0x16EA7, 0x16EC2}, {0x16EA8, 0x16EC3},
- {0x16EA9, 0x16EC4}, {0x16EAA, 0x16EC5}, {0x16EAB, 0x16EC6},
- {0x16EAC, 0x16EC7}, {0x16EAD, 0x16EC8}, {0x16EAE, 0x16EC9},
- {0x16EAF, 0x16ECA}, {0x16EB0, 0x16ECB}, {0x16EB1, 0x16ECC},
- {0x16EB2, 0x16ECD}, {0x16EB3, 0x16ECE}, {0x16EB4, 0x16ECF},
- {0x16EB5, 0x16ED0}, {0x16EB6, 0x16ED1}, {0x16EB7, 0x16ED2},
- {0x16EB8, 0x16ED3}, {0x1E900, 0x1E922}, {0x1E901, 0x1E923},
- {0x1E902, 0x1E924}, {0x1E903, 0x1E925}, {0x1E904, 0x1E926},
- {0x1E905, 0x1E927}, {0x1E906, 0x1E928}, {0x1E907, 0x1E929},
- {0x1E908, 0x1E92A}, {0x1E909, 0x1E92B}, {0x1E90A, 0x1E92C},
- {0x1E90B, 0x1E92D}, {0x1E90C, 0x1E92E}, {0x1E90D, 0x1E92F},
- {0x1E90E, 0x1E930}, {0x1E90F, 0x1E931}, {0x1E910, 0x1E932},
- {0x1E911, 0x1E933}, {0x1E912, 0x1E934}, {0x1E913, 0x1E935},
- {0x1E914, 0x1E936}, {0x1E915, 0x1E937}, {0x1E916, 0x1E938},
- {0x1E917, 0x1E939}, {0x1E918, 0x1E93A}, {0x1E919, 0x1E93B},
- {0x1E91A, 0x1E93C}, {0x1E91B, 0x1E93D}, {0x1E91C, 0x1E93E},
- {0x1E91D, 0x1E93F}, {0x1E91E, 0x1E940}, {0x1E91F, 0x1E941},
- {0x1E920, 0x1E942}, {0x1E921, 0x1E943}
diff --git a/libc/test/src/__support/wctype/CMakeLists.txt b/libc/test/src/__support/wctype/CMakeLists.txt
index abfdc9c4d7d11..b529bd15a1926 100644
--- a/libc/test/src/__support/wctype/CMakeLists.txt
+++ b/libc/test/src/__support/wctype/CMakeLists.txt
@@ -1,13 +1,23 @@
add_custom_target(libc-support-wctype-tests)
+add_libc_test(
+ wctype_perfect_hash_test
+ SUITE
+ libc-support-wctype-tests
+ SRCS
+ wctype_perfect_hash_test.cpp
+ DEPENDS
+ libc.src.__support.wctype.lower_to_upper
+ libc.src.__support.wctype.upper_to_lower
+)
+
add_libc_test(
wctype_classification_utils_test
SUITE
- libc-support-tests
+ libc-support-wctype-tests
SRCS
wctype_classification_utils_test.cpp
DEPENDS
libc.hdr.stdint_proxy
libc.src.__support.wctype.wctype_classification_utils
)
-
diff --git a/libc/test/src/__support/wctype/wctype_perfect_hash_test.cpp b/libc/test/src/__support/wctype/wctype_perfect_hash_test.cpp
new file mode 100644
index 0000000000000..3da3124e953a0
--- /dev/null
+++ b/libc/test/src/__support/wctype/wctype_perfect_hash_test.cpp
@@ -0,0 +1,35 @@
+//===-- Unittests for wctype perfect hash maps ----------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/wctype/lower_to_upper.h"
+#include "src/__support/wctype/upper_to_lower.h"
+#include "test/UnitTest/Test.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+TEST(LlvmLibcWctypePerfectHashTest, LowerToUpper) {
+ for (const auto entry : LOWER_TO_UPPER_DATA) {
+ const auto &lower = entry[0];
+ const auto &upper = entry[1];
+ EXPECT_EQ(true, LOWER_TO_UPPER_MAP.contains(lower)) << lower << "\n";
+ EXPECT_EQ(upper, LOWER_TO_UPPER_MAP.find(lower).value())
+ << lower << " -> " << upper << "\n";
+ }
+}
+
+TEST(LlvmLibcWctypePerfectHashTest, UpperToLower) {
+ for (const auto entry : UPPER_TO_LOWER_DATA) {
+ const auto &upper = entry[0];
+ const auto &lower = entry[1];
+ EXPECT_EQ(true, UPPER_TO_LOWER_MAP.contains(upper)) << upper << "\n";
+ EXPECT_EQ(lower, UPPER_TO_LOWER_MAP.find(upper).value())
+ << upper << " -> " << lower << "\n";
+ }
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/utils/wctype_utils/conversion/hex_writer.py b/libc/utils/wctype_utils/conversion/hex_writer.py
index 2552c8e89f139..de2817255a1fc 100644
--- a/libc/utils/wctype_utils/conversion/hex_writer.py
+++ b/libc/utils/wctype_utils/conversion/hex_writer.py
@@ -6,11 +6,47 @@
#
# ==------------------------------------------------------------------------==#
+import cppyy
+
+
+def fetch_params(file_path: str, mappings: dict):
+ file_path_list = file_path.split("/")[:-1]
+ file_path_list.append("perfect_hash_map.h")
+
+ cppyy.include("/".join(file_path_list))
+
+ LIBC_NAMESPACE = cppyy.gbl.LIBC_NAMESPACE
+
+ arr = LIBC_NAMESPACE.cpp.array[cppyy.gbl.wint_t, len(mappings)]()
+
+ for i, key in enumerate(mappings.keys()):
+ arr[i] = key
+
+ res = LIBC_NAMESPACE.ptrhash.get_params(arr)
+ pilots = LIBC_NAMESPACE.cpp.get[1](res)
+ pilots_size = pilots.size()
+ pilots = list(map(lambda x: f"0x{x:X}", map(cppyy.gbl.uint8_t, pilots)))
+ pilots = ", ".join(pilots).replace("[", "{").replace("]", "}")
+ pilots = "{" + pilots + "}"
+
+ remap = LIBC_NAMESPACE.cpp.get[2](res)
+ remap_size = remap.size()
+ remap = map(lambda x: f"0x{x:X}", map(cppyy.gbl.uint32_t, remap))
+ remap = list(remap)
+ remap = ", ".join(remap).replace("[", "{").replace("]", "}")
+ remap = "{" + remap + "}"
+ return (
+ f"0x{cppyy.gbl.uint8_t(LIBC_NAMESPACE.cpp.get[0](res)):X}",
+ (pilots, pilots_size),
+ (remap, remap_size),
+ )
+
def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
"""Writes the given mapping as hex numbers to the given file path"""
with open(file_path, "w") as file:
title = file_path.split("/")[-1].split(".")[0].replace("_", " ")
+ data_var_name = f"{title.upper().replace(' ', '_')}_DATA"
file.write(
f"""//===-- Auto-generated {title} case mappings table -------*- C++ -*-===//
//
@@ -24,8 +60,23 @@ def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
+ "// This file is generated by libc/utils/wctype_utils scripts.\n"
+ "// This file is meant to be included directly into LLVM libc code\n"
+ "// Format: {from_codepoint, to_codepoint}\n"
- + f"// Info: {len(mappings)} entries\n\n"
+ + f"// Info: {len(mappings)} entries\n"
+ )
+ file.write(
+ f"""
+#ifndef LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H
+#define LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H
+
+#include "perfect_hash_map.h"
+
+namespace LIBC_NAMESPACE_DECL {'{'}
+
+"""
+ + f"LIBC_INLINE_VAR constexpr cpp::array<cpp::array<wint_t, 2>, {len(mappings)}>"
+ + f"""
+ {data_var_name} = """
)
+ file.write("{{\n")
for i, key in enumerate(mappings):
file.write("{")
file.write(f"0x{key:X}, 0x{mappings[key]:X}")
@@ -33,3 +84,22 @@ def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
file.write("}\n")
else:
file.write("},\n")
+ file.write("}};\n\n")
+
+ seed, (pilots, pilots_size), (remap, remap_size) = fetch_params(
+ file_path, mappings
+ )
+ file.write(
+ f"LIBC_INLINE_VAR constexpr auto {data_var_name[:-5]}_HASHER = ptrhash::init_hasher<{len(mappings)}>({seed}, cpp::array<uint8_t, {pilots_size}>{pilots}, cpp::array<uint32_t, {remap_size}>{remap});\n\n"
+ )
+ file.write(
+ f"LIBC_INLINE_VAR constexpr PerfectHashMap<{len(mappings)}, decltype({data_var_name[:-5]}_HASHER)> "
+ + data_var_name[:-5]
+ + "_MAP"
+ + "{\n"
+ )
+ file.write(f"{data_var_name}, {data_var_name[:-5]}_HASHER")
+ file.write("};")
+
+ file.write("\n\n} // namespace LIBC_NAMESPACE_DECL\n\n")
+ file.write(f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
diff --git a/libc/utils/wctype_utils/gen.py b/libc/utils/wctype_utils/gen.py
index f922f90711641..e067a7a968406 100755
--- a/libc/utils/wctype_utils/gen.py
+++ b/libc/utils/wctype_utils/gen.py
@@ -8,6 +8,14 @@
#
# ==------------------------------------------------------------------------==#
+from os import environ
+from sys import argv
+
+if len(argv) > 1:
+ environ["EXTRA_CLING_ARGS"] = (
+ f"-DLIBC_NAMESPACE=LIBC_NAMESPACE -I{argv[1]}/libc -I{argv[1]}/build-libc/libc -fvisibility-inlines-hidden -fdiagnostics-color -Xclang -fno-pch-timestamp -std=gnu++17 -DLIBC_QSORT_IMPL=LIBC_QSORT_QUICK_SORT -DLIBC_COPT_STRING_LENGTH_IMPL=clang_vector -DLIBC_COPT_FIND_FIRST_CHARACTER_IMPL=word -DLIBC_ADD_NULL_CHECKS -DLIBC_ERRNO_MODE=LIBC_ERRNO_MODE_DEFAULT -DLIBC_THREAD_MODE=LIBC_THREAD_MODE_PLATFORM -DLIBC_CONF_WCTYPE_MODE=LIBC_WCTYPE_MODE_ASCII -DLIBC_COPT_RAW_MUTEX_DEFAULT_SPIN_COUNT=100 -fpie -ffreestanding -idirafter/usr/include -ffixed-point -fno-builtin -fno-lax-vector-conversions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti -ftrivial-auto-var-init=pattern -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fstack-protector-strong -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wno-pass-failed -Wmisleading-indentation -Wctad-maybe-unsupported -Wconversion -Wno-sign-conversion -Wno-c99-extensions -Wno-gnu-imaginary-constant -Wno-pedantic -Wimplicit-fallthrough -Wwrite-strings -Wextra-semi -Wnewline-eof -Wnonportable-system-include-path -Wstrict-prototypes -Wthread-safety -Wglobal-constructors"
+ )
+
from conversion.gen_conversion_data import extract_maps_from_unicode_file
from conversion.hex_writer import write_hex_conversions
from classification.gen_classification_data import (
@@ -16,7 +24,6 @@
build_lookup_tables,
generate_code,
)
-from sys import argv
from sys import exit
@@ -28,11 +35,11 @@ def write_wctype_conversion_data(
f"{unicode_data_folder_path}/UnicodeData.txt"
)
write_hex_conversions(
- file_path=f"{llvm_project_root_path}/libc/src/__support/wctype/lower_to_upper.inc",
+ file_path=f"{llvm_project_root_path}/libc/src/__support/wctype/lower_to_upper.h",
mappings=lower_to_upper,
)
write_hex_conversions(
- file_path=f"{llvm_project_root_path}/libc/src/__support/wctype/upper_to_lower.inc",
+ file_path=f"{llvm_project_root_path}/libc/src/__support/wctype/upper_to_lower.h",
mappings=upper_to_lower,
)
>From 1083efcaf1a973a1f63edfb72bb8500177766429 Mon Sep 17 00:00:00 2001
From: bassiounix <muhammad.m.bassiouni at gmail.com>
Date: Fri, 20 Mar 2026 12:19:56 +0200
Subject: [PATCH 2/3] format
---
libc/utils/wctype_utils/conversion/hex_writer.py | 3 ++-
libc/utils/wctype_utils/gen.py | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/libc/utils/wctype_utils/conversion/hex_writer.py b/libc/utils/wctype_utils/conversion/hex_writer.py
index de2817255a1fc..1dea92c5c2495 100644
--- a/libc/utils/wctype_utils/conversion/hex_writer.py
+++ b/libc/utils/wctype_utils/conversion/hex_writer.py
@@ -102,4 +102,5 @@ def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
file.write("};")
file.write("\n\n} // namespace LIBC_NAMESPACE_DECL\n\n")
- file.write(f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
+ file.write(
+ f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
diff --git a/libc/utils/wctype_utils/gen.py b/libc/utils/wctype_utils/gen.py
index e067a7a968406..6832ab22daceb 100755
--- a/libc/utils/wctype_utils/gen.py
+++ b/libc/utils/wctype_utils/gen.py
@@ -71,7 +71,8 @@ def main() -> None:
write_wctype_classification_data(
llvm_project_root_path=argv[1], unicode_data_folder_path=argv[2]
)
- print(f"wctype conversion data is written to {argv[1]}/libc/src/__support/wctype/")
+ print(
+ f"wctype conversion data is written to {argv[1]}/libc/src/__support/wctype/")
if __name__ == "__main__":
>From df3b24a9ae58ed91336c5b38c5791f8e93184973 Mon Sep 17 00:00:00 2001
From: bassiounix <muhammad.m.bassiouni at gmail.com>
Date: Fri, 20 Mar 2026 12:26:14 +0200
Subject: [PATCH 3/3] format
---
libc/utils/wctype_utils/conversion/hex_writer.py | 3 +--
libc/utils/wctype_utils/gen.py | 9 ++++-----
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/libc/utils/wctype_utils/conversion/hex_writer.py b/libc/utils/wctype_utils/conversion/hex_writer.py
index 1dea92c5c2495..de2817255a1fc 100644
--- a/libc/utils/wctype_utils/conversion/hex_writer.py
+++ b/libc/utils/wctype_utils/conversion/hex_writer.py
@@ -102,5 +102,4 @@ def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
file.write("};")
file.write("\n\n} // namespace LIBC_NAMESPACE_DECL\n\n")
- file.write(
- f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
+ file.write(f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
diff --git a/libc/utils/wctype_utils/gen.py b/libc/utils/wctype_utils/gen.py
index 6832ab22daceb..7fe83054dbe75 100755
--- a/libc/utils/wctype_utils/gen.py
+++ b/libc/utils/wctype_utils/gen.py
@@ -12,9 +12,9 @@
from sys import argv
if len(argv) > 1:
- environ["EXTRA_CLING_ARGS"] = (
- f"-DLIBC_NAMESPACE=LIBC_NAMESPACE -I{argv[1]}/libc -I{argv[1]}/build-libc/libc -fvisibility-inlines-hidden -fdiagnostics-color -Xclang -fno-pch-timestamp -std=gnu++17 -DLIBC_QSORT_IMPL=LIBC_QSORT_QUICK_SORT -DLIBC_COPT_STRING_LENGTH_IMPL=clang_vector -DLIBC_COPT_FIND_FIRST_CHARACTER_IMPL=word -DLIBC_ADD_NULL_CHECKS -DLIBC_ERRNO_MODE=LIBC_ERRNO_MODE_DEFAULT -DLIBC_THREAD_MODE=LIBC_THREAD_MODE_PLATFORM -DLIBC_CONF_WCTYPE_MODE=LIBC_WCTYPE_MODE_ASCII -DLIBC_COPT_RAW_MUTEX_DEFAULT_SPIN_COUNT=100 -fpie -ffreestanding -idirafter/usr/include -ffixed-point -fno-builtin -fno-lax-vector-conversions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti -ftrivial-auto-var-init=pattern -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fstack-protector-strong -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wno-pass-failed -Wmisleading-indentation -Wctad-maybe-unsupported -Wconversion -Wno-sign-conversion -Wno-c99-extensions -Wno-gnu-imaginary-constant -Wno-pedantic -Wimplicit-fallthrough -Wwrite-strings -Wextra-semi -Wnewline-eof -Wnonportable-system-include-path -Wstrict-prototypes -Wthread-safety -Wglobal-constructors"
- )
+ environ[
+ "EXTRA_CLING_ARGS"
+ ] = f"-DLIBC_NAMESPACE=LIBC_NAMESPACE -I{argv[1]}/libc -I{argv[1]}/build-libc/libc -fvisibility-inlines-hidden -fdiagnostics-color -Xclang -fno-pch-timestamp -std=gnu++17 -DLIBC_QSORT_IMPL=LIBC_QSORT_QUICK_SORT -DLIBC_COPT_STRING_LENGTH_IMPL=clang_vector -DLIBC_COPT_FIND_FIRST_CHARACTER_IMPL=word -DLIBC_ADD_NULL_CHECKS -DLIBC_ERRNO_MODE=LIBC_ERRNO_MODE_DEFAULT -DLIBC_THREAD_MODE=LIBC_THREAD_MODE_PLATFORM -DLIBC_CONF_WCTYPE_MODE=LIBC_WCTYPE_MODE_ASCII -DLIBC_COPT_RAW_MUTEX_DEFAULT_SPIN_COUNT=100 -fpie -ffreestanding -idirafter/usr/include -ffixed-point -fno-builtin -fno-lax-vector-conversions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti -ftrivial-auto-var-init=pattern -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fstack-protector-strong -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wno-pass-failed -Wmisleading-indentation -Wctad-maybe-unsupported -Wconversion -Wno-sign-conversion -Wno-c99-extensions -Wno-gnu-imaginary-constant -Wno-pedantic -Wimplicit-fallthrough -Wwrite-strings -Wextra-semi -Wnewline-eof -Wnonportable-system-include-path -Wstrict-prototypes -Wthread-safety -Wglobal-constructors"
from conversion.gen_conversion_data import extract_maps_from_unicode_file
from conversion.hex_writer import write_hex_conversions
@@ -71,8 +71,7 @@ def main() -> None:
write_wctype_classification_data(
llvm_project_root_path=argv[1], unicode_data_folder_path=argv[2]
)
- print(
- f"wctype conversion data is written to {argv[1]}/libc/src/__support/wctype/")
+ print(f"wctype conversion data is written to {argv[1]}/libc/src/__support/wctype/")
if __name__ == "__main__":
More information about the llvm-branch-commits
mailing list